Это черновой вариант моих скриптов, которые я использую для создания загрузочных BIOS/UEFI ISO-образов с линуксами, которыми я пользуюсь сам для жизни в tmpfs. Тупа рабочий код без проверок и «защит от дурака», только чтобы показать всем как создаются ISO. В следующих версиях уже будут все защиты, все проверки на установленные утилиты и прочая, а пока — просто показываю и прошу ваших советов.
И так, код включает в себя три утилиты:
- mkbootstrap — утилита аналогична debootstrap, pacstrap, создаёт рабочее окружение в chroot/ директории одной командой.
- mkinitramfs — утилита создаёт initramfs-образ из директории, подключая chroot/ директории как раздельные «слои» (overlay), используя squashfs для сжатия.
- mkbootisofs — утилита создаёт из директории загрузочный BIOS/UEFI гибридный образ, который можно записать на CD, DVD или dd'шнуть на USB-флешку.
Для работы всего это безобразия необходимы: grub2/grub2-efi, squashfs-tools, dosfstools, xorriso. В принципе, я считаю это немного, никакой экзотики, удалось обойтись малыми жертвами, ИМХО. Все утилиты надо запускать через boobstrap, т.к. они лежат в одном файле, в будущем сделаю симлинками (или разделю на отдельные файлы).
По порядку.
boobstrap mkbootstrap crux_gnulinux chroot/ --ports-dir /usr/ports/packages [--ports-dir /usr/ports/another] [package name] [...]
Утилита установит все пакеты в заданную chroot/ директорию. Можно указать несколько --ports-dir, можно указать только названия пакетов которые будут найдены в заданных директориях и установлены, например, если вам не нужен весь /usr/ports/core, а только ключевые пакеты, то можно их указать списком. Название crux_gnulinux зарезервированная переменная, в будущем я добавлю поддержку gentoo_gnulinux и других дистрибутивов.
В данный момент утилита не будет работать без pkgadd, чтобы её получить вам придётся скачать CRUX и вытащить её оттуда. Напоминаю, что всё это черновой вариант.
Если вы решились ею воспользоваться, то чтобы она заработала прежде установите pkgadd (если у вас не CRUX):
wget http://ftp.morpheus.net/pub/linux/crux/latest/iso/crux-3.5.iso
mount crux-3.5.iso /mnt/crux-media
tar -xOf /mnt/crux-media/crux/tools/pkgutils#*.pkg.tar.gz usr/bin/pkgadd > /usr/bin/pkgadd
chmod +x /usr/bin/pkgadd
Далее ставим в chroot CRUX одной командой.
mkdir chroot-crux-core/
boobstrap \
mkbootstrap crux_gnulinux chroot-crux-core/ \
\
--ports-dir /mnt/crux-media/crux/core
Если хотим минимальный CRUX, то список пакетов можно перечислить (формат перечисления не важен, я просто для красоты так сделал).
mkdir chroot-crux-core-xtreme/
boobstrap \
mkbootstrap crux_gnulinux chroot-crux-core-xtreme/ \
\
--ports-dir /mnt/crux-media/crux/core \
\
acl attr bash bzip2 coreutils dash dhcpcd e2fsprogs elfutils eudev \
file filesystem findutils gawk glibc grep gzip inetutils iproute2 \
kbd kmod less libcap libdevmapper libpcre linux-pam lzo ncurses \
openssh openssl pkgutils procps rc readline shadow start-stop-daemon \
sysfsutils sysklogd sysvinit tar util-linux wget which xz zlib \
\
--ports-dir /mnt/crux-media/crux/opt \
\
grub2 grub2-efi
Если хотим вообще всё, то перечисляем все директории без указания пакетов.
mkdir chroot-crux-maximum-edishon/
boobstrap \
mkbootstrap crux_gnulinux chroot-crux-maximum-edishon/ \
\
--ports-dir /mnt/crux-media/crux/core \
--ports-dir /mnt/crux-media/crux/opt \
--ports-dir /mnt/crux-media/crux/xorg
Далее.
boobstrap mktinitramfs initramfs/ --overlay overlay-one/ [ --overlay overlay-two/] --output $PWD/initrd
Утилита создаст из директории initramfs/ готовый к употреблению initramfs-образ, в данный момент обязательно требуется указывать --overlay, он же chroot/, в который вы будете загружаться. В будущем я расширю настройки, обязательно сделаю --standalone и другие варианты загрузки прямиком в tmpfs, даже без squashfs, просто tmpfs. Но потом.
Сейчас. В чём суть оверлеев. В chroot/ у нас установлена система, но чтобы её не засорять, мы создадим директорию settings/, куда отдельно складываем все настройки.
Например, я хочу отредактировать файл chroot/etc/rc.local, я не буду делать этого в chroot/, чтобы оставить его «ванильным», а скопирую его в директорию settings/etc/rc.local, отредактирую, и при загрузке initramfs наложит поверх слоя chroot/ ещё один слой settings/, таким образом мы сохраняем ванильную систему ИИИИИ применяем наши настройки поверх неё.
Ду ит. Джаст ду ит.
mkdir initramfs/
boobstrap mkinitramfs initramfs/ \
--overlay chroot-crux-core-xtreme/ \
--overlay settings/ \
--output $PWD/initrd
На выходе получили initrd, в котором лежат два squashfs-образа с chroot-crux-core-xtreme и нашими settings.
Другая ситуация. Мы хотим core отдельно, firefox отдельно, libreoffice отдельно, и, конечно же, наш $HOME отдельно. Только для того, чтобы создать иллюзию порядка в системе, — в конечном счёте все эти слои будут вместе друг на друге, но нам ведь не составит труда удалить или обновить один конкретный слой. Этакий flatpack / snapd на минималках. :)
mkdir initramfs/
boobstrap mkinitramfs initramfs/ \
--overlay chroot-crux-core/ \
--overlay chroot-crux-xorg/ \
--overlay firefox-bin/ \
--overlay libreoffice/ \
--overlay fvwm/ \
--overlay /home/username \
--overlay /root \
--output $PWD/initrd
На этом этапе добавив к initrd любое ядро его можно просто загрузить, например, через PXE, но наша с вами цель получить загрузочный ISO, поэтому едем дальше.
boobstrap mkbootisofs directory/ > output.iso
Вот так вот просто, да. Просто берёт просто директорию и всё что в ней есть просто упаковывает в ISO. Просто просто. Не забудьте только положить туда vmlinuz и initrd.
mkdir bootimage/
mkdir bootimage/boot
cp (возьмите где хотите)/vmlinuz bootimage/boot/vmlinuz
cp ./initrd bootimage/boot/initrd
boobstrap mkbootisofs bootimage/ > bootable.iso
Можно сразу dd:
boobstrap mkbootisofs bootimage/ | dd of=/dev/sdX status=progress
Давайте ещё один пример приведу.
Gentoo.
1. Скачиваем, распаковываем в chroot
mkdir gentoo-chroot/
wget https://bouncer.gentoo.org/fetch/root/all/releases/amd64/autobuilds/20200605T133220Z/stage3-amd64-20200605T133220Z.tar.xz
tar xf stage3-* -C gentoo-chroot/
2. Упаковываем в initramfs.
mkdir gentoo-initramfs/
boobstrap mkinitramfs gentoo-initramfs/ --overlay gentoo-chroot/ --output $PWD/gentoo-initrd
3. Упаковываем в ISO.
mkdir gentoo-bootimage/
mkdir gentoo-bootimage/boot
cp (возьмите где хотите)/vmlinuz gentoo-bootimage/boot/vmlinuz
cp ./gentoo-initrd gentoo-bootimage/boot/initrd
boobstrap mkbootisofs gentoo-bootimage > gentoo.iso
4. ?????
5. PROFIT!
Для загрузки в UEFI:
qemu-system-x86_64 \
-bios $(locate OVMF.fd) \
-enable-kvm -m 1G -boot d -cdrom gentoo.iso
Для загрузки в BIOS:
qemu-system-x86_64 \
-enable-kvm -m 1G -boot d -cdrom gentoo.iso
Скриншот: http://dl.voglea.com/boobstrap.png
Скачать: http://dl.voglea.com/boobstrap.html
Ваши пожелания и предложения, кроме как найти себе женщину, приветствуются!