LINUX.ORG.RU
ФорумTalks

Комплекс загрузочных скриптов boobstrap

 , ,


1

2

Это черновой вариант моих скриптов, которые я использую для создания загрузочных 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

Ваши пожелания и предложения, кроме как найти себе женщину, приветствуются!

★★★★★

Прекрасно. ЛОР силён, как никогда.

boobstrap

Ожидаем волну SJW, недовольных сиськами.

Ваши пожелания и предложения, кроме как найти себе женщину, приветствуются!

С «арчем» можно? Из базового не особо удобно разворачивать бэкапы, сделанные rsync, т.к. нужно сразу же fstab сгенерировать и grub переустановить.

Korchevatel ★★★★ ()

boobstrap
Ваши пожелания и предложения, кроме как найти себе женщину

Найди себе бабу уже. Или хоть забухай.

K50 ()

Ваши пожелания и предложения, кроме как найти себе женщину, приветствуются!

Черновой вариант: boobstrap Spoofing -enable woman-chroot | –money/ –cinema/ –restaurant/ > Spoofing.iso :)

quickquest ★★★★★ ()

кроме как найти себе женщину, приветствуются!

А с той ты уже расстался?

goingUp ★★★★★ ()
Ответ на: комментарий от Korchevatel

http://dl.voglea.com/archlinux.png

В теории любой дистрибутив должен работать. Арч работает.

В арчевском ядре отключен overlay, поэтому пришлось грузиться со своим ядром. А так всё работает.

cкачал с сайта арча их образ, через виртуалку установил

qemu-img create /mnt/crux/archlinux.img 4G

qemu-system-x86_64 -boot d -cdrom /home/spoofing/Downloads/archlinux-2020.06.01-x86_64.iso -hda /mnt/crux/archlinux.img

в виртуалке сделал

mke2fs -t ext4 /dev/sda

mount /dev/sda /mnt

pacstrap /mnt base linux

umount /mnt

poweroff

далее собрал образ

mkdir archlinux-chroot

mkdir archlinux-initramfs

mkdir archlinux-bootimage{,/boot}

mount /mnt/crux/archlinux.img archlinux-chroot

boobstrap mkinitramfs archlinux-initramfs --overlay archlinux-chroot --output $PWD/archlinux-initrd

cp /lib/modules/*/vmlinuz archlinux-bootimage/boot/vmlinuz

mv archlinux-initrd archlinux-bootimage/boot/initrd

boobstrap mkbootisofs archlinux-bootimage > archlinux.iso

загрузился

qemu-system-x86_64 -m 2G -boot d -cdrom /mnt/crux/archlinux.iso

результат на скриншоте.

Spoofing ★★★★★ ()

Вопрос к модераторам: в насколько прилизанном состоянии должен быть проект, чтобы если я напишу полноценную новость/руководство, то её пропустили?

Spoofing ★★★★★ ()

boobstrap v1.0-rc2

Скрипт обновлён.

Теперь вы можете создать симлинки:

boobstrap

ln -s /usr/bin/boobstrap /usr/bin/mkbootstrap
ln -s /usr/bin/boobstrap /usr/bin/mkinitramfs
ln -s /usr/bin/boobstrap /usr/bin/mkbootisofs

И использовать команды скрипта напрямую.

mkinitramfs

Добавлен вывод в stdout сгенерированого initramfs-образа, это поведение по-умолчанию, если --output явно не указан. Теперь необходимо либо указывать --output, либо перенаправлять вывод в файл.

mkinitramfs chroot/ > initrd.img

Добавлен режим работы --standalone, при котором с chroot-директорией не делается ничего, а она прямиком упаковывается в initramfs-образ «как есть» без какой-либо редакции со стороны скрипта. Это так же теперь режим работы по-умолчанию.

При неуказании директории chroot/ скрипт упакует текущую директорию.

cd chroot/
mkinitramfs > /boot/initrd.img

Таким образом стало возможным упаковать в initramfs весь дистрибутив целиком. И это уже будет не initramfs, а...??? не знаю что это будет, но это работает. :)

На примере Gentoo:

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/
ln -sf /sbin/init gentoo-chroot/init
mkinitramfs gentoo-chroot/ > gentoo-initrd.img
qemu-system-x86_64 \
  -enable-kvm -m 1G \
  -kernel /boot/vmlinuz -initrd gentoo-initrd.img
Spoofing ★★★★★ ()

Спуф, ты про гитхаб слышал?

Begemoth ★★★★★ ()
Ответ на: комментарий от Begemoth

в одного, конечно, трудно заниматься разработкой. когда по-уму нужно и документацию на каждый пук писать, и тесты писать, и всё это в автоматизированном режиме делать.

не тяп-ляп и скрипт готов, пользуйтесь как хотите.

кто бы мне Makefile написал для грамотной установки скрипта )) вот приходится теперь отвлекаться на всякую дичь.

вы правы, по уму я должен всё это дело оформить на гитхабе, вечером потрачу время и займусь

Spoofing ★★★★★ ()

Проект переехал с треда ЛОРа на Github.

Новое зеркало проекта: https://github.com/sp00f1ng/boobstrap

Ключевое слово зеркало. Надо поднимать локальный cgit хотя бы.

Из ключевых изменений: теперь установка скрипта осуществляется через make install.

Spoofing ★★★★★ ()

SquashFS deprecated. '--overlay' is legacy now.

Шутка. На самом деле не SquashFS единым.

mkinitramfs

Было изменено поведение по-умолчанию опции --overlay. «Слои» всё так же создаются, но теперь они проходят не через mksquashfs как некий фильтр, а этот самый фильтр вы задаёте сами, пока что нужно делать это обязательно.

Фильтр по-умолчанию cp -a, и теперь, когда вы задаёте --overlay, без дополнительных параметров директория будет просто скопирована «как есть» в будущий initramfs-образ командой cp -a.

Добавлена опция --command, в которой задаётся команда (фильтр), выполняемая для каждого заданного --overlay, перед помещением его initramfs-образ.

Допустим, я хочу вернуть SquashFS. Теперь команда должна выглядить так:

mkinitramfs initramfs/ \
  --overlay chroot/ \
  --command "mksquashfs {source} {destination} -b 1048576 -comp xz -Xdict-size 100%" \
  --output $PWD/initrd.img

Как вы можете заметить, {source} и {destination} это внутренние переменные для параметра --command, которые устанавливают «источник» и «назначение» сооветственно. Просто используйте их для удобства.

Специально для того, чтобы не исползовать команду mksquashfs целиком, была создана удобная система шаблонов, а именно, вместо того, чтобы писать команду целиком, вы можете просто указать --command {template:squashfs:xz}, и будет запущена сооветствующая этому шаблону команда mksquashfs с примением сжатия xz.

mkinitramfs initramfs/ \
  --overlay chroot/ \
  --command {template:squashfs:xz} \
  --output $PWD/initrd.img

В будущем будут добавлены новые шаблоны, например {template:squashfs:zstd}, {template:gnutar:bzip2} и многие другие! Please stand by. =)

*** Скачать: https://github.com/sp00f1ng/boobstrap

Spoofing ★★★★★ ()

Новая версия скрипта! Из ключевых изменений:

  • Изменился номер версии.

Скрипт переписан для соответствия POSIX-shell стандартам, теперь он прекрасно себя чувствует работая через /bin/sh. Проверено на dash. УМВР. Должен работать на любых системах.

Добавлена начальная реализация pkgadd, если у вас дистрибутив отличный от CRUX, вам нет нужды скачивать pkgutils и доставать оттуда pkgadd, теперь для развёртывания chroot'ов вам хватит нативной версии, доступной из коробки. Однако, если вы после сборки chroot/ не удаляете его, а продолжаете поддерживать, то тогда вам следует использовать эталонную реализацию pkgadd из CRUX.

Добавлена команда mktest для проведения тестов. Поскольку название слишком обобщённое, это останется внутренней командой, доступной только через запуск boobstrap mktest.

Скачайте CRUX ISO с официального сайта, после чего запустите выполнение теста:

# wget http://ftp.morpheus.net/pub/linux/crux/latest/iso/crux-3.5.iso
# mkdir test/
# boobstrap mktest crux-3.5.iso test/

Команда проведёт на вашей системе все этапы, от развёртывания chroot, до создания загрузочного ISO образа.

В случае успеха вы получите ISO образ содержащий CRUX. Чтобы считать тест успешно пройденным, вы должны запустить этот тест ещё раз, но уже на созданном ISO.

# mkdir another_test/
# boobstrap mktest test/bootimage.iso another_test/

В случае успешной загрузки второго another_test/bootimage.iso можете считать что тест пройден. =)

Spoofing ★★★★★ ()

Проведеная большая зачистка кодовой базы, немного навёл порядок в коде.

Теперь в mkbootstrap можно указывать файл (полный путь) в качестве имени пакета для установки, до этого команда воспринимала только имена пакетов и искала их в указанных --ports-dir.

--overlay теперь может работать как обычная директория, без сжатия squashfs. Не знаю зачем это надо, просто пусть будет.

Spoofing ★★★★★ ()

Теперь если вы используете --overlay без сжатия (--squashfs-xz), все директории оверлеев будут скопированы в одну /merged, которая в свою очередь смонтирована в tmpfs, и вы переключитесь в tmpfs без использования overlay вообще.

По итогу, squashfs больше не является обязательным к использованию, overlay как опция ядра так же больше не является обязательной, а значит, можно спокойно использовать ванильное ядро с kernel.org без какой-либо настройки. Главное чтобы памяти хватило на весь корень целиком в tmpfs. Всё как я люблю, «завёл и поехал». =)

-- https://github.com/sp00f1ng/boobstrap

Spoofing ★★★★★ ()

mkbootstrap

TL;DR я сделал функцию аналогичную FROM в Dockerfile'ах, которая использует готовые образы.

--

Добавлены возможности сохрания (export) и загрузки (import) созданных чрутов.

Например, мы создаём чрут устанавливая все пакеты и производя настройку системы.

mkbootstrap crux_gnulinux CHROOT/ --ports-dir=/mnt/cruxmedia/crux/core

Выполняем настройку.

# chroot CHROOT/ /bin/bash
# echo -e "toor\ntoor" | (passwd)
# sed -i "s/SERVICES=.*/SERVICES=(lo net crond sshd)/g" $DIR/etc/rc.conf
# cp $HOME/.ssh/id_rsa.pub $DIR/root/.ssh/authorized_keys
# cp $PWD/autorun.sh $DIR/etc/rc.local

И теперь появилась возможность эту настройку сохранить!

# mkbootstrap export CHROOT/ > core.rootplug

Образ с этой системой вы можете сжать в архив, чтобы уменьшить его размер, сделать что угодно, куда-то передать, сохранить, затем в другом месте систему из этого образа восстановить командой import и на базе этого чрута продолжить создание системы.

# mkbootstrap import CHROOT/ < core.rootplug

В качестве наглядного примера вы можете посмотреть на шаблон default.

https://github.com/sp00f1ng/boobstrap/blob/332adccc6ee633e6fc877f8e895319b414...

После установки базовой системы выполненяется её сохрание в образ default.rootplug, и далее уже в другом шаблоне default-p2p происходит восстановление системы из образа и доустановка необходимых пакетов.

https://github.com/sp00f1ng/boobstrap/blob/d6494f009877f5d64c9197192ab54c91dd...

То есть, создавая свой шаблон, за основу мы можем брать уже какой-то имеющийся и на его основе производить дальнейшую сборку системы.

mkbootstrap build --template default

Мы создадим шаблон default и получим образ default.rootplug, а далее пишем свой шаблон, на основе default.rootplug, после чего строим уже наш шаблон.

mkbootstrap build --template default-p2p
mkbootstrap build --template my-custom-settings
Spoofing ★★★★★ ()
Последнее исправление: Spoofing (всего исправлений: 3)

Добавлены информационные сообщения.

Добавлено цветовое оформление.

http://dl.voglea.com/colours.png

Добавлен комплексный тест, чтобы одной командой запустил и проверил работу скрипта.

# git clone https://github.com/sp00f1ng/boobstrap.git
# boobstrap/tests/crux-download-and-build

В связи с чем прошу о помощи, скачать и запустить, проверить работу моего пет-проекта. :)

Spoofing ★★★★★ ()

Обновлён README файл, куда была записана вся документация по фреймворку. Да, теперь это так называется. :)

Большое обновление получил init-скрипт.

Теперь шаблоны (bootstrap-templates/) генерируют только начальные конфигурации систем, а вся настройка до production-ready состояния осуществляется через системные конфигурации (bootstrap-systems/).

В качестве примеров добавил свои личные юзкейсы, как я использую систему в tmpfs на своих VDS и домашнем ПК-роутере.

Spoofing ★★★★★ ()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)