Создание кастомного iso образа на ubuntu
Всем привет! В общем ситуация такая, необходимо создать iso образ который будет после прожигаться на CD/DVD или флэшку. Но загвоздка в следующем, что нужно создать в этом образе кастомную систему, то есть со своими утилитами(желательно через apt), ядром и модулями, и при загрузке системы должен автоматом запускаться мой скрипт установки с диалоговыми меню whiptail. я пробовал использовать buildroot, но он не очень гибкий в этом плане, и если самому доставлять пакеты через dpkg -i, то после распаковки initrd ядро крешится, и то есть я получается использую initrd как основную файловую систему, что бы не монтировать CD-диск на самого себя. использую как загрузчик isolinux.
Если кто подскажет идеи как можно реализовать, может другими методами или утилитами, буду очень благодарен!
lignumq
03.02.22 15:13:39 MSK
Создаем свой загрузочный диск Linux
В статье описывается, как создать собственный загрузочный диск Linux (оптический диск или флешку), добавить в него только нужные программы и убрать все лишнее. Полученный образ в экспериментах занял менее 25 Мб. Он позволяет быстро загружаться, работать в текстовом режиме, создавать, редактировать, удалять файлы на разных файловых системах, имеет поддержку русского языка. За основу взят Debian.
Для того, чтобы создать загрузочный диск, необходимо создать его образ, iso-файл, который затем можно записать на оптический диск или флешку. В общем случае порядок загрузки выглядит следующим образом:
Подготовка
Для начала необходимо создать пустой каталог livecd, в котором будет проводиться дальнейшая работа. В нем необходимо создать подкаталог iso, в котором будет формироваться образ диска. Используемые в статье названия файлов и каталогов не являются обязательными. Если какое-то название является обязательным, об этом будет указано.
Добавление загрузчика UEFI
Для добавления загрузчика UEFI понадобятся файлы, которые могут отсутствовать на компьютере. Чтобы их получить, необходимо установить ряд пакетов:
apt install grub-efi-amd64-bin dosfstools mtools
Далее в каталоге livecd необходимо создать вспомогательные файлы:
set timeout=1 menuentry 'Live CD' < linux /linux >
search --file --set=root /grub.cfg if [ -e ($root)/grub.cfg ]; then set prefix=($root) configure $prefix/grub.cfg else echo can't find grub.cfg fi
Загрузчик добавляется командой:
cp grub.cfg iso/grub.cfg mkdir -p EFI/BOOT grub-mkimage --prefix '' --config "grub-inst.cfg" -O x86_64-efi -o 'EFI/BOOT/bootx64.efi' acpi appleldr boot configfile efi_gop efi_uga elf fat fixvideo font gettext gfxmenu gfxterm gfxterm_background gfxterm_menu iso9660 linux memdisk minicmd normal part_gpt part_msdos search sleep usb video video_bochs video_cirrus video_fb videotest mkdosfs -F12 -n "EFI" -C iso/efiboot.img 2048 mcopy -s -i iso/efiboot.img EFI :: rm -r EFI
В результате в каталоге iso появятся два файла: grub.cfg и efiboot.img.
Добавление загрузчика BIOS
На древних компьютерах UEFI отсутствует. Вместо этого там используется BIOS. Чтобы создаваемый диск мог загружаться на таких компьютерах тоже, необходимо добавить загрузчик BIOS. Для получения файлов необходимо установить ряд пакетов:
apt install isolinux syslinux-common
Далее в каталоге livecd необходимо создать вспомогательный файл (отступ не обязателен):
UI menu.c32 PROMPT 0 TIMEOUT 1 MENU TITLE Boot Menu LABEL default MENU LABEL Live CD linux linux initrd init.ram
После этого нужно выполнить команды:
cp syslinux.cfg iso cp /usr/lib/ISOLINUX/isolinux.bin iso cp /usr/lib/syslinux/modules/bios/ iso
В результате в каталоге iso появится еще ряд файлов.
Создание образа и диска
Образ (файл livecd.iso) создается командой:
xorriso -as mkisofs -r -o livecd.iso -isohybrid-mbr /usr/lib/ISOLINUX/isohdpfx.bin -partition_offset 16 -J -l -joliet-long -c boot.cat -b isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table -eltorito-alt-boot -e efiboot.img -no-emul-boot -isohybrid-gpt-basdat iso
Далее эта команда будет называться (1). Образ записывается на оптический диск командой:
wodim livecd.iso
Образ записывается на флешку командой (будем считать, флешка является устройством /dev/sdz):
dd if=livecd.iso of=/dev/sdz
Указывать нужно саму флешку, а не раздел на ней, то есть /dev/sdz , но не /dev/sdz1 .
Удалить linux с флешки и отформатировать ее обратно можно командой:
wipefs -a /dev/sdz mkfs.exfat /dev/sdz
Проверка работоспособности созданного образа
Проверить созданный образ можно как на настоящем компьютере, так и с помощью виртуальной машины. Например, в VMware можно создать новую виртуальную машину без жесткого диска, но с CD-приводом, в качестве образа указать файл livecd.iso. Переключение между UEFI и BIOS осуществляется в настройках этой виртуальной машины в разделе Options – Advanced – Firmware type.
При загрузке в режиме UEFI отобразится меню загрузчика:
Загрузчик попытается загрузить Linux, но поскольку он еще не добавлен, отобразится сообщение об ошибке «file /linux not found».
При загрузке в режиме BIOS отобразится меню загрузчика:
Поскольку Linux еще не добавлен, это меню уйдет в бесконечный цикл.
Добавление ядра Linux
Ядро Linux обычно хранится в каталоге /boot и представляет собой файл с названием «vmlinuz-XXX», где XXX — версия ядра. Добавить текущее ядро в создаваемый образ можно командой:
cp $(ls -t /boot/vmlinuz-$(uname -r) | head -n 1) iso/linux
После этого в каталоге iso появится файл linux. Далее необходимо пересобрать образ командой (1), указанной выше в разделе «Создание образа и диска».
Чтобы не зависеть от версии ядра, указанной здесь командой « cp $(ls -t … » ядро не просто копируется, а переименовывается в linux без указания версии. Именно это имя файла указано вторым элементом в файлах grub.cfg и syslinux.cfg в строке « linux linux ». Если в каталоге /boot имеется несколько ядер, можно использовать любое, главное, запомнить его версию. Далее в статье будет рассматриваться использование текущего ядра.
После добавления ядра загрузчики UEFI и BIOS перестанут ругаться на его отсутствие и запустят его выполнение. В свою очередь ядро успешно запустится и, в условиях отсутствия файловой системы, выдаст сообщение об ошибке «Kernel Panic. Unable to mount root fs».
Добавление файловой системы
В данной статье в качестве корневой файловой системы рассматривается использование временной файловой системы, которая размещается в оперативной памяти (initramfs). Для ее создания необходимо создать в каталоге livecd подкаталог initramfs, в нем пустой файл с названием init. Файл с таким названием почему-то обязательно должен быть и находиться в корне файловой системы, иначе ядро проигнорирует такую initramfs. Далее необходимо выполнить команды:
cd initramfs find . | cpio -o -H newc --owner=root.root | gzip -9 > ../iso/init.ram cd ..
В результате в подкаталоге iso появится файл init.ram. Его необходимо указать в файле grub.cfg, добавив перед закрывающей фигурной скобкой строку « initrd /init.ram ».
set timeout=1 menuentry 'Live CD' < linux /linux initrd /init.ram >
В конец файла syslinux.cfg нужно добавить строку « initrd init.ram» .
UI menu.c32 PROMPT 0 TIMEOUT 1 MENU TITLE Boot Menu LABEL default MENU LABEL LiveCD linux linux initrd init.ram
После этого необходимо пересобрать образ командой (1), указанной выше в разделе «Создание образа и диска». Теперь при загрузке Linux будет сообщать об ошибке «Kernel Panic. No working init found». В данном случае это сообщение означает, что ядро успешно запустилось и даже признало файловую систему initramfs, нашло в нем файл init и попыталось его запустить, но не получилось, потому что этой пустой файл.
Минимальный работающий init
В каталоге initramfs нужно создать следующую структуру файлов:
├─lib (каталог с двумя файлами) │ ├─ ld-linux-x86-64.so.2 (из /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2) │ └─ libc.so.6 (из /lib/x86_64-linux-gnu/libc.so.6) ├─lib64 (символическая ссылка на lib) └─init (из /bin/dash)
В initramfs должен получиться один подкаталог lib с двумя файлами в нем, одна символическая ссылка lib64 и один файл init. В скобках указано, какие файлы нужно взять из текущего работающего компьютера. Файлы должны быть исполняемыми. Далее необходимо пересобрать образ командами:
cd initramfs find . | cpio -o -H newc --owner=root.root | gzip -9 > ../iso/init.ram cd .. xorriso -as mkisofs -r -o livecd.iso -isohybrid-mbr /usr/lib/ISOLINUX/isohdpfx.bin -partition_offset 16 -J -l -joliet-long -c boot.cat -b isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table -eltorito-alt-boot -e efiboot.img -no-emul-boot -isohybrid-gpt-basdat iso
Далее эти команды будут называться командой (2).
Если все сделать правильно, получится минимальный работающий образ с командной строкой. В моем случае его размер составил чуть более 12 Мб. В командной строке не работают никакие команды, они будут добавлены позже. Если по-прежнему отображается сообщение об ошибке «No working init found», необходимо проверить:
- Названия файлов, каталога и символической ссылки.
- Права доступа: в каталог можно зайти, файлы должны быть исполняемыми.
- Файлы предназначены для одной архитектуры x86_64. На некоторых компьютерах могут одновременно быть установлены 32 и 64 битные версии программ и библиотек. Узнать архитектуру файла можно командой objdump -p . В начале вывода должна быть строка типа «формат файла elf64-x86-64».
Если завершить работу командной строки командой exit , ядро выдаст ошибку «Kernel Panic. Attempted to kill init». Командная строка была первым и единственным процессом (PID=1) и после его завершения ядро не знает, что делать дальше.
Наполнение initfamfs простыми программами
Простой программой здесь называется программа, состоящая из одного исполняемого файла, например dash, mkdir, mount. В противоположность сложные программы содержат большое количество обязательных дополнительных файлов, например: текстовые, аудио и видеоредакторы, браузеры и т.п.
По сложившейся традиции программы размещаются в каталоге bin. В каталоге initramfs нужно создать подкаталог bin и скопировать туда файл ls из одноименного каталога работающей системы.
Многие программы в своей работе используют вспомогательные so-файлы (программные библиотеки), без которых они не запустятся. Узнать, какие so-файлы нужны программе, можно с помощью уже упоминавшейся команды objdump -p .
Вывод команды « objdump -p ls »:
… Динамический раздел: NEEDED libselinux.so.1 NEEDED libc.so.6 …
Файл libc.so.6 в initfamfs уже есть, а вот файл libselinux.so.1 нужно найти на работающем компьютере и скопировать в каталог initramfs/lib к другим so-файлам. Список каталогов, в которых нужно искать требуемый so-файл, можно взять из файлов /etc/ld.so.conf и /etc/ ld.so.conf.d/*. Библиотека libselinux.so.1 в свою очередь также зависит от других библиотек. С помощью команды objdump -p libselinux.so.1 можно узнать, что кроме уже имеющихся файлов libc.so.6 и ld-linux-x86-64.so.2 дополнительно требуется libpcre2-8.so.0. На работающей системе этот файл представляет собой символическую ссылку на файл libpcre2-8.so.0.11.0. При копировании в initramfs можно оставить имеющуюся структуру, т.е. скопировать libpcre2-8.so.0 как символическую ссылку и далее скопировать файл libpcre2-8.so.0.11.0. Можно поступить по-другому и скопировать файл libpcre2-8.so.0.11.0, переименовав его в libpcre2-8.so.0. Команда objdump -p libpcre2-8.so.0 показывает, что каких-либо других so-файлов, отсутствующих в initramfs, больше не требуется. В результате должна получиться следующая структура каталога initramfs:
├─bin │ └─ ls ├─lib │ ├─ ld-linux-x86-64.so.2 │ ├─ libc.so.6 │ ├─ libpcre2-8.so.0 │ └─ libselinux.so.1 ├─lib64 (=> lib) └─init
В скобках указана символьная ссылка.
При копировании so-файлов нужно не забывать проверять их архитектуру, если на компьютере есть файлы разных архитектур.
С помощью команды (2) из раздела «Минимальный работающий init» можно пересоздать образ, запустить и убедиться, что команда ls работает.
Автоматизация наполнения initfamfs простыми программами
В предыдущем разделе показано, что добавление простых программ требует рекурсивного поиска и копирования дополнительных so-файлов. Эту задачу можно автоматизировать, написав свой скрипт, либо используя программу copyso. При ее использовании достаточно указать требуемые для копирования программы, после чего выполнить еще несколько команд, чтобы сформировать оставшуюся часть структуры каталогов. В каталоге livecd необходимо заново создать пустой подкаталог initramfs и выполнить следующие команды:
copyso -p dash ls ln mkdir cat mount initramfs ln -s lib initramfs/lib64 ln -s x86_64-linux-gnu/ld-linux-x86-64.so.2 initramfs/lib64/ld-linux-x86-64.so.2 ln -s usr/bin/dash initramfs/init
Первая команда копирует программы dash, ls, ln, mkdir, cat, mount. Остальные нужны, чтобы правильно сформировать структуру каталогов.
Получившаяся структура каталогов
├─lib │ ├─x86_64-linux-gnu │ │ ├─ ld-linux-x86-64.so.2 │ │ ├─ libblkid.so.1 (=> libblkid.so.1.1.0) │ │ ├─ libblkid.so.1.1.0 │ │ ├─ libc.so.6 │ │ ├─ libmount.so.1 (=> libmount.so.1.1.0) │ │ ├─ libmount.so.1.1.0 │ │ ├─ libpcre2-8.so.0 (=> libpcre2-8.so.0.11.0) │ │ ├─ libpcre2-8.so.0.11.0 │ │ └─ libselinux.so.1 │ └─ ld-linux-x86-64.so.2 (=> x86_64-linux-gnu/ld-linux-x86-64.so.2) ├─ lib64 (=> lib) ├─usr │ └─bin │ ├─ cat │ ├─ dash │ ├─ ln │ ├─ ls │ ├─ mkdir │ └─ mount └─ init (=> usr/bin/dash)
В скобках указаны символьные ссылки.
После этого можно командой (2) из раздела «Минимальный работающий init» пересоздать образ, запустить и убедиться, что добавленные команды работают.
Добавление программ посложнее
Универсальный способ копирования сложных программ в initramfs предложить сложно. В самый неожиданный момент времени такая программа может обратиться к какому-нибудь файлу, который нигде не указан, но подразумевается автором программы и даже создается при штатной установке. Описываемый в статье способ подразумевает копирование существующих программ, а не их полноценную установку. Однако можно предложить способ, основанный на особенностях deb-пакетов в операционной системе Debian. В каталоге /var/lib/dpkg/info есть list-файлы для каждого установленного пакета. В этих list-файлах содержится перечень файлов, созданных при установке пакета. Не все из них являются обязательными, но, как сказано выше, с каждым нужно разбираться индивидуально либо копировать все, что есть. Для копирования всего пакета можно использовать следующий скрипт:
DEBS="e2fsprogs mc" copy_deb() < for F in $(cat /var/lib/dpkg/info/$1.list); do if [ -d $F ]; then mkdir -p initramfs$F elif [ -f $F ]; then copyso $copy_params /$F initramfs fi done >for DEB in $DEBS; do copy_deb $DEB done rm -rf initramfs/usr/share/
В первой строке перечисляются нужные пакеты (в примере их два), дальнейшие команды копируют файлы. Последняя команда удаляет файлы, которые скорее всего не понадобятся.
Если добавить таким образом Midnight Commander (команда mc ), можно убедиться, что он запустится (условно). Скорее всего, таким вы его еще не видели.
Добавление модулей ядра
Модули ядра это файлы с расширением «ko», которые расположены в подкаталогах каталога /lib/modules//. Есть модули для работы с жесткими дисками, с разными файловыми системами, с устройствами USB и т.д. Составление перечня модулей, необходимых для каждого конкретного устройства, в данной статье не рассматривается. Предполагается, читатель знает, какие именно модули ему нужны.
Доя добавления нужных модулей в initramfs нужно скопировать их в формируемую файловую структуру с сохранением пути. Например, модуль для работы с жесткими дисками /lib/modules/6.0.0-6-amd64/kernel/drivers/scsi/sd_mod.ko нужно скопировать в initramfs/lib/modules/6.0.0-6-amd64/kernel/drivers/scsi/sd_mod.ko, создав недостающие каталоги (на момент написания статьи использовалось ядро версии 6.0.0-6-amd64).
Как и so-файлы, ko-файлы могут требовать для своей работы наличия других ko-файлов. Эти зависимости указаны в файле /lib/modules//modules.dep. В частности, sd_mod.ko зависит от scsi_mod.ko, scsi_common.ko, crc64.ko и других. Их также необходимо скопировать с сохранением пути и учетом того, что они, в свою очередь, могут зависеть от других модулей и так далее рекурсивно.
Эту задачу, как и предыдущую, можно автоматизировать, написав свой скрипт, либо используя программу copyko. При ее использовании для добавления модулей ядра необходимо выполнить команды:
copyko ahci sd_mod initramfs/lib/modules/$(uname -r) cp /lib/modules/$(uname -r)/modules.builtin* initramfs/lib/modules/$(uname -r) depmod -b initramfs
Первая команда копирует модули ahci и sd_mod в initramfs. Вторая копирует информацию о модулях (функционале ядра), которые уже встроены в ядро. Последняя команда создает информацию о зависимостях модулей друг от друга. Стоит отметить, что речь идет только о дисках SATA. При работе в VMware, если жесткий диск представлен как SCSI, дополнительно необходим модуль mptspi. При работе с другими дисками, например NVMe, нужны свои модули. Также понадобится программа modprobe:
copyso -p modprobe initramfs
После обновления образа командой (2) можно загрузиться с него и проверить, что появился доступ к жесткому диску компьютера. Для этого в командной строке созданного образа необходимо выполнить команды:
mount -nt devtmpfs none /dev modprobe ahci modprobe sd_mod
При использовании других типов дисков, отличных от SATA, необходимо загрузить соответствующие им модули. После выполнения указанных команд в каталоге /dev/ появятся устройства типа sda, sda1, sda2, обозначающие найденные жесткие диски и разделы на них. Для автоматической загрузки всех имеющихся модулей можно использовать команду:
for m in $(find /lib/modules -name '*.ko'); do modprobe $(basename -s .ko $m); done
Использующиеся здесь программы find и basename нужно заранее добавить в образ. Чтобы эта команда выполнялась автоматически, нужно создать загрузочный скрипт:
#!/usr/bin/dash mount -nt devtmpfs none /dev for m in $(find /lib/modules -name '*.ko'); do modprobe $(basename -s .ko $m); done /usr/bin/dash
Этот скрипт нужно сохранить в файл initramfs/init вместо созданной ранее символической ссылки, и сделать его исполняемым.
Помимо указанных двух модулей скорее всего понадобится множество других. Для автоматизации их добавления можно предложить скрипт:
Скрипт добавления популярных модулей
KERVER=$(uname -r) MODS="sr_mod sd_mod ahci mptspi" # Для оптических и жестких дисков: MODS="$MODS sg evdev ata_generic ata_piix libsas uas mptsas" for m in $(find /lib/modules/$KERVER/kernel/drivers/ata/ -name 'sata*.ko'); do MODS="$MODS $(basename -s .ko $m)"; done # Для SSD дисков: for m in $(find /lib/modules/$KERVER/kernel/drivers/nvme/ -name '*.ko'); do MODS="$MODS $(basename -s .ko $m)"; done # Файловые системы: MODS="$MODS squashfs overlay ext4 vfat exfat fuse udf isofs loop hfsplus libcrc32c crc32c-intel crc32c_generic" # Языковые кодировки файловых систем: for m in $(find /lib/modules/$KERVER/kernel/fs/nls/ -name '*.ko'); do MODS="$MODS $(basename -s .ko $m)"; done # USB: MODS="$MODS ehci-pci ohci-pci uhci-hcd xhci-pci usbhid i2c-hid psmouse hid-generic" # EFI: MODS="$MODS efivarfs" copyko $MODS initramfs/lib/modules/$KERVER cp -uf /lib/modules/$KERVER/modules.builtin* initramfs/lib/modules/$KERVER depmod -b initramfs
Если при загрузке отображаются такие сообщения:
Run /init as init process Failed to execute init (error -13) Run /sbin/init as init process Run /etc/init as init process Run /bin/init as init process Run /bin/sh as init process
- Файл init действительно лежит в корне формируемой файловой системы и он исполняемый (chmod +x init);
- Если это бинарный файл, то для него есть необходимые so-файлы;
- Если это скрипт, то для него есть интерпретатор, указанный в первой строке и размещенный именно по указанному пути (напр. #!/usr/bin/dash);
- Для интерпретатора есть необходимые so-файлы.
Настройка консоли
Далее приводится несколько рекомендаций, как настроить консоль образа, сделать ее более удобной. Для этого требуется программа настройки консоли:
apt install console-setup
Чтобы в Midnight Commander заработали клавиши со стрелками, необходимо добавить в образ нужный файл командами:
mkdir -p initramfs/lib/terminfo cp -r /lib/terminfo/l initramfs/lib/terminfo
Чтобы Midnight Commander стал цветным, необходимо добавить цвета в образ:
cp -r /usr/share/mc/ initramfs/usr/share/mc
Чтобы Midnight Commander не выдавал сообщение «Pipe failed» при попытке редактирования файлов:
mkdir initramfs/bin ln -s /usr/bin/dash initramfs/bin/sh
Чтобы отображался текст на русском языке, нужно добавить русский шрифт:
cp $(find /etc/console-setup -name '*.psf.gz' | head -n 1) initramfs/etc/font.psf.gz gunzip initramfs/etc/font.psf.gz
а в скрипт «init» добавить команду загрузки шрифта:
setfont /etc/font.psf
Чтобы можно было вводить с клавиатуры текст на русском языке, нужно добавить русскую раскладку клавиатуры:
cp $(find /etc/console-setup -name '*.kmap.gz' | head -n 1) initramfs/etc/keys.kmap.gz gunzip initramfs/etc/keys.kmap.gz
а в скрипт «init» добавить команду загрузки этой раскладки:
loadkeys /etc/keys.kmap
Чтобы в командной строке работали клавиши со стрелками, нужно вместо dash использовать bash.
Чтобы отображались имена файлов на русском языке, нужно добавить в образ локаль:
mkdir -p initramfs/usr/lib/locale cp /usr/lib/locale/locale-archive initramfs/usr/lib/locale
а в скрипт «init» добавить команду загрузки локали:
export LANG=ru_RU.UTF-8
Итого
На основе представленной информации создан небольшой набор скриптов (2 шт.) для создания загрузочного диска. Для работы с ними необходимо:
1. Установить требуемые deb пакеты
apt install grub-efi-amd64-bin dosfstools mtools isolinux syslinux-common console-setup
2. Установить программы copyso и copyko.
4. Запустить скрипт 1.mkinitramfs.sh. В результате создастся подкаталог initramfs.
5. Изменить содержимое initramfs по своему желанию.
6. Запустить скрипт 2.mkiso.sh. В результате создастся файл-образ livecd.iso.
7. Записать образ на флешку или диск.
Чтобы вернуть initramfs в исходное состояние, необходимо заново запустить 1.mkinitramfs.sh.
Надеюсь, эта статья будет полезной тем, кто изучает основы Linux.
Создание iso со своим образом Ubuntu и набором программ
Я собирал собственный образ ISO Ubuntu 18.04 по инструкции LiveCDCustomization на системе Ubuntu 14.04.
Мне необходимо было поставить некоторые программы, чтобы они были доступны сразу с LiveCD, без установки. Это удобно, особенно без наличия интернета.
В конце я получил свою персональную загрузочную флешку, кастомизированную под себя.
В оригинальной инструкции LiveCDCustomization есть некоторые неясные моменты и неточности. Сама инструкция устарела, и частично не работала.
Поэтому я делал по шагам и записывал выполняемые действия.
Осторожно! Почти все команды выполняются под root .
Важно понимать, что вы делаете: вся кастомизация LiveCD проходит под chroot, и на рабочую систему (ту, где вы сейчас работаете) влияния не оказывает.
Но если выйти из chroot, все введенные команды применяются к рабочей системе. Это требуется в некоторых местах инструкции: при первичной подготовке, и в конце, при сборке. Смотри не перепутай
Подготовка
Устанавливаем зависимости на хост-систему
Потребуется 2 пакета, один занимается работой со сжатой файловой системой squashfs, другой для создания ISO-образа CDROM (ISO-9660):
sudo apt install squashfs-tools genisoimage
Странно, но у меня уже были установлены эти пакеты. Ради интереса найдем, когда эти пакеты были установлены, для чего поищем в истории apt:
cd /var/log/apt # ищем в history.log grep -r squashfs --color=always # если прошло много времени, история упаковывается в .gz, ищем в ней: find -name \*.gz -print0 | xargs -0 zgrep squashfs --color=always # --color=always добавляет подсветку найденных слов
Также потребуется виртуальная машина для быстрого тестирования. Я использовал Virtualbox
Монтируем оригинальный образ ISO в mnt
Скачиваем оригинальный ISO образ Ubuntu, который будем модифицировать под свои нужны. Допустим, образ скачан и находится в ~/downloads/ubuntu-18.04-desktop-amd64.iso .
Подмонтируем этот ISO образ в каталог ~/livecdtmp/mnt для дальнейшей работы:
# создаем сразу два вложенных каталога mkdir -p ~/livecdtmp/mnt # копируем ISO образ диска cp ~/downloads/ubuntu-18.04-desktop-amd64.iso ~/livecdtmp # входим в каталог, где будет проводиться основная работа cd ~/livecdtmp # монтируем CD-диск sudo mount -o loop ubuntu-18.04-desktop-amd64.iso mnt
Копируем содержимого mnt в extract-cd
mkdir extract-cd rsync --exclude=/casper/filesystem.squashfs -a mnt/ extract-cd
Расжимаем файловую систему squashfs и перемещаем содержимое в edit
sudo unsquashfs mnt/casper/filesystem.squashfs sudo mv squashfs-root edit
Подготавливаем рабочую среду
Копируем resolv.conf с рабочей системы, чтобы было сетевое соединение внутри чрута, также делаем это для сети::
sudo cp /etc/resolv.conf edit/etc/ sudo mount -o bind /run/ edit/run sudo mount --bind /dev/ edit/dev
resolv.conf в следующих шагах оказался пустым, надо понять почему, и исправить
Чрутимся, и начинаем работать со своим кастомизированным образом.
# chroot выполняется только от суперпользователя sudo su # чрутимся: chroot edit # < зачрутились# важно! чтобы не перепутать, где мы работаем, сразу сменим вид приглашения командной строки: PS1="(CHROOT) $PS1"
mount -t proc none /proc mount -t sysfs none /sys mount -t devpts none /dev/pts export HOME=/root export LC_ALL=C
dbus-uuidgen из оригинальной инструкции я пропустил
Файл /etc/resolv.conv оказался пустым, значит что-то я сделал не так. Отредактируем его вручную, скопировав содержимое /etc/resolv.conv из рабочей системы:
vi /etc/resolv.conv # это не команды, а содержимое файла, которое следует внести. Не копировать слепо! Подставить из своей рабочей системы, файл /etc/resolv.conv! У меня оно такое: nameserver 127.0.1.1
Теперь сеть у нас доступна внутри чрута, проверим
ping ya.ru
Кастомизация своего образа Ubuntu
Напомню, сейчас мы находимся под чрутом ( chroot edit ), и у нас работает сеть. Все что написано ниже, является делом вкуса.
Ставим необходимые пакеты
Смотрим установленные пакеты:
dpkg-query -W --showformat='$\t$\n' | sort -nr | less
Если хотим, обновляем пакеты:
apt update apt upgrade
Устанавливаем свои пакеты:
# программы для работы с сетью apt install curl net-tools whois nmap # остальные - также по желанию apt install vim git htop zsh tmux
Следующие пакеты поставить не удалось, так как их нет в /etc/apt/ :
shutter krusader filezilla lynx
узнать, какие репо следует добавить для установки
Установить программы можно и из deb-пакетов, на примере Atom:
Скачиваем Atom через консоль или браузер
Если скачано из браузера, то: sudo mv ~/downloads/atom-amd64.deb ~/livecdtmp/edit/tmp
Устанавливаем: dpkg -i /tmp/atom-amd64.deb
У меня установка не удалась, так как этот пакет зависит от gconf2 и gconf-service . Эти зависимости apt не сумел разрешить. Чтобы это исправить, требуется добавить в /etc/apt/ дополнительные репо. какие?
dpkg: dependency problems prevent configuration of atom: atom depends on gconf2; however: Package gconf2 is not installed. atom depends on gconf-service; however: Package gconf-service is not installed.
Кастомизация
Это по-желанию: читаем оригинальную инструкцию LiveCDCustomization, раздел Customizations и настраиваем фон рабочего стола, шрифты, региональные настройки и прочее. Первый шаг dbus-uuidgen и dpkg-divert можно пропустить, для Ubuntu 18.04 они не повлияли на работу apt .
Проверка и сборка ISO образа
Мы все еще находимся в чруте chroot edit
Проверяем, что нет пользователя UID=999
В оригинальной мане указано, что если существует пользователь с UID 999, с LiveCD невозможно будет загрузиться. Такой пользователь может возникнуть при установке Virtualbox.
awk -F: '$3 == 999' /etc/passwd
есть есть, то выполнить usermod -u 500 $hit , где $hit — имя проблемного пользователя
Пересобираем initrd
После модификации ядра, скриптов загрузки или добавления модулей ядра, нужно пересобрать initrd.gz и переместить его в каталог casper
mkinitramfs -o /initrd.gz 4.15.0-23-generic # выходим из чрута и перемещаем собранный образ exit mv edit/initrd.gz extract-cd/casper/
chroot edit PS1="(CHROOT) $PS1"
Очищаем образ
Удаляем все, что не установилось и чистим систему:
apt --fix-broken install apt autoremove rm -rf /tmp/* rm /etc/resolv.conf rm /var/lib/dbus/machine-id # у меня файла не было
Размонтируем
umount /proc || umount -lf /proc umount /sys umount /dev/pts exit # выходим из chroot umount edit/dev
Собираем ISO образ
Манифест
# делаем манифест записываемым chmod +w extract-cd/casper/filesystem.manifest # обновляем манифест chroot edit dpkg-query -W --showformat='$ $\n' > extract-cd/casper/filesystem.manifest # пишем установленные пакеты cp extract-cd/casper/filesystem.manifest extract-cd/casper/filesystem.manifest-desktop # удаляем упоминания пакетов sed -i '/ubiquity/d' extract-cd/casper/filesystem.manifest-desktop sed -i '/casper/d' extract-cd/casper/filesystem.manifest-desktop
Сжимаем файловую систему
rm extract-cd/casper/filesystem.squashfs ## у меня не было этого файла mksquashfs edit extract-cd/casper/filesystem.squashfs -b 1048576
Пишем размер файловой системы и md5 хеши файлов
printf $(du -sx --block-size=1 edit | cut -f1) > extract-cd/casper/filesystem.size cd extract-cd rm md5sum.txt find -type f -print0 | xargs -0 md5sum | grep -v isolinux/boot.cat | tee md5sum.txt
Создаем готовый ISO
mkisofs -D -r -V "My Ubuntu custom image" -cache-inodes -J -l -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -o ../my-ubuntu.iso .
Итоговый образ my-ubuntu.iso проверяем в Virtualbox.
Записываем ISO на флешку
Для записи я использовал unetbootin , который доступен из центра приложений Ubuntu.
Как создать ISO файл в Linux
Сегодня в статье поговорим о том, как создать iso файл в linux. Рассмотрим несколько примеров по формированию образов iso с CD-диcка, с USB флеш диска, и из файлов и директорий расположенных на вашем ПК.
Содержание
- 1. Как создать ISO-файл из файлов на ПК
- 2. Как создать ISO-файл из компакт-диска
- 3. Советы
iso файл – это своего рода архив, который целиком сохраняет структуру файловой системы носителя, указанного при его копировании/создании.
Как создать ISO-файл из файлов на ПК
Скопируйте нужные файлы, из которых будет создан ISO-файл, в какой-нибудь каталог .
Откройте терминал. В Desktop Ubuntu/Debian нажмите ctrl+shift+T
Введите следующую команду, которая создаст из файлов ISO-образ.
mkisofs -o my_files.iso /home/username/iso-directory
- iso-directory – название директории, в которой хранятся файлы, на основе которых будет создан ISO-файл.
- my_files.iso – название вашего будущего ISO-файла
Имена файлов и директорий чувствительны к регистру, поэтому не забудьте про прописные буквы (если они есть).
Как создать ISO-файл из компакт-диска
Вставьте компакт-диск, который нужно скопировать на компьютер. Имейте в виду, что нельзя создать ISO-файл из компакт-диска с защитой от копирования (например, из аудио-компакт-диска или DVD-диска с фильмами).
Для создания iso-образа воспользуемся командой dd. Создание ISO образов, это лишь малая часть возможностей этой утилиты. Итак, чтобы создать ISO образ диска в Linux выполните команду:
dd if=/dev/cdrom of=/home/username/my_cd.iso
- /dev/cdrom – стандартный путь в Linux к компакт-диску. Если у вас путь отличается, то вводим свой.
- my_cd.iso – имя будущего ISO-файла.
Если на компьютере есть несколько оптических приводов, они будут помечены цифрами, например, первый привод будет называться «cd0», второй – «cd1» и так далее.
Возможно, система предложит вам ввести пароль, перед тем как создать ISO-файл. В этом случае введите пароль и нажмите ↵ Enter .
Советы
- В большинстве дистрибутивов Linux есть файловый менеджер, с помощью которого можно создать ISO-файл, используя контекстное меню (открывается щелчком правой кнопки мыши).
- Для того чтобы примонтировать созданный Вами ISO образ, достаточно использовать команду:
mount -o loop /home/username/my_cd.iso /mnt/myiso
- /home/username/my_cd.iso – путь до iso-файла.
- /mnt/myiso – путь куда монтируем наш iso-образ.
Если есть вопросы, то пишем в комментариях в Телеграмм и ВК.
Ссылки в шапке страницы.
Заранее всем спасибо.
RSS
Добавление RSS-ленты на главную страницу этого сайта не поддерживается, так как это может привести к зацикливанию, замедляющему работу вашего сайта. Попробуйте использовать другой блок, например блок Последние записи, для отображения записей сайта.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Сегодня в статье настроим и русифицируем Ubuntu Server 16.04/18.04/20.04. Чтобы поддерживался русский язык, и перевод системы стал русским
Начиная с сентября 2017 года удостоверяющим центрам предписано обязательно проверять CAA-записи в DNS перед генерацией сертификата
В этой статье рассмотрим пример обновления Ubuntu Server 16.04 до Ubuntu Server 18.04 Все наши действия нам придется выполнять из Читать
В связи с последними блокировками IP-адресов Роскомнадзором, встала необходимость завести свой собственный VPN сервер. Если VPN у вас ещё не Читать