По мотивам предыдущей темы, дошли руки до бузибоха.
Pkgfile для busybox, собираем и ставим fakeroot -- pkgmk -d && pkgadd busybox#*
Подготавливаем ручками initramfs образ, устанавливаем туда busybox:
# mkdir /tmp/initramfs
# cp /usr/bin/busybox /tmp/initramfs/busybox
# chroot /tmp/initramfs /busybox --install -s
Пилим init скрипт, который будет запускаться самым первым, когда загружено ядро:
#!/bin/sh
install -d /proc
mount -t proc proc /proc -o nosuid,noexec,nodev
install -d /sys
mount -t sysfs sys /sys -o nosuid,noexec,nodev
install -d /dev
mount -t devtmpfs dev /dev -o mode=0755,nosuid
install -d /dev/pts /dev/shm
mount -t devpts devpts /dev/pts -o mode=0620,nosuid,noexec
mount -t tmpfs shm /dev/shm -o mode=1777,nosuid,nodev
install -d /run
mount -t tmpfs run /run -o mode=0755,nosuid,nodev
install -d /tmp
mount -t tmpfs tmp /tmp -o mode=1777
echo "/sbin/mdev" > /proc/sys/kernel/hotplug
mdev -s
exec ash
Сохранить в /tmp/initramfs/init, сделать chmod +x init
# efibootmgr -c -L Linux -l \\bzImage -u "initrd=/initrfs.img"
Обновить загрузчик, root нам больше не нужен, будем грузить свой образ initramfs, указанный в опции initrd к ядру
# cd /tmp/initramfs
# find . -print0 | cpio --null -ov --format=newc | gzip -9 > /boot/initrfs.img
Создаём этот самый initrd образ, кладём рядом с ядром в /boot.
После чего перезагружаемся, ядро после загрузки сразу же загружает initrfs.img образ, выполняет наш /init скрипт (в корне! да), и показывает нам ash оболочку.
Уже здесь происходит вся магия, где мы можем подготовить систему для дальнейшей загрузки в неё. Например, предварительно скопировать содержимое жестокого диска в RAM (tmpfs), а затем загрузиться, чтобы экономить ресурс.
Теперь вопрос. Где удобнее хранить основную систему для загрузки?
Пробовал подмонтировать mount /dev/sda3 /mnt, скопировать в /tmpfs содержимое диска cp -a и ждал около 5 минут... это не годится.
Может хранить всё в исходных файлах пакетов? Т.е. у CRUX пакет это обычный tar-архив, и допустим, положить рядом с ядром директорию ports, в которой будут лежать тупо пакеты. bash#4.2.pkg.tar.xz и тому подобное. Затем каждый такой пакет в процессе загрузки будет «устанавливаться» в tmpfs стандартным пакетным менеджером, после чего уже происходить switch_root /tmpfs /sbin/init
и вуаля...
Если допустим, потребуется обновить систему, то сделать это можно весьма прикольно: заменить пакет на диске, после чего просто перезагрузиться, и система загрузившись в tmpfs установит уже новый пакет. Норм?
Нас взломали? А мы просто перезагрузились, предварительно исправив какой-то там бажный пакет! Норм?
Подскажите пожалуйста, откуда лучше копировать данные в tmpfs, чтобы загрузка происходила как можно быстрее.
Пока остановился на варианте с установкой пакетов по отдельности в процессе загрузки, — распаковка .pkg.tar.xz архивов.