Ох... В общем, у меня задача сделать Live систему Debian полностью размещенную в initramfs.
Что я делаю:
1. Создаю виртуальную машину в VirtualBox, устанавливаю туда Debian и ряд пользовательских приложений - тут все стандартно и ничего интересного.
2. Далее из виртуального диска .vdi выделяю образ .img:
vboxmanage clonemedia --format RAW mydisk.vdi mydisk.img
Утилитой fdisk выявляю стартовый сектор и размер сектора:
умножаю стартовый сектор на размер сектора и полученное {ЗНАЧЕНИЕ} использую при монтировании:
mount -o loop,offset={ЗНАЧЕНИЕ} /mydisk.img /mnt
Ну, соответственно, в mnt лежит содержимое жесткого диска виртуалки с Debian'ом - все тоже стандартно.
3. Дальше я все из mnt (не знаю зачем, от греха подальше) копирую во временную директорию, в которой буду создавать initramfs (пускай это будет /ird), и удаляю оттуда ядро(-а) и initrd, а также всю директорию boot (там лежит GRUB2 установленного Debian'а - он, как я понимаю, нафиг не нужен).
4. Ну и пакую все в cpio+gzip:
find . | cpio -H newc -o | gzip > initramfs.gz
5. Делаю директорию для создания Live-CD (допустим /livecd) и помещаю туда директорию isolinux, в которой лежат: boot.cat hdt.c32 isolinux.bin isolinux.cfg ldlinux.c32 libcom32.c32 libgpl.c32 libmenu.c32 libutil.c32 memdisk vesamenu.c32 ну и, естественно initramfs.gz (initrd, который сделал в п. 4) и vmlinuz-5.10.0-9-amd64 (ядро).
boot.cat делаю просто утилитой dd (заполняю нулями до 2 кБ).
isolinux.cfg имеет следующее содержание:
DEFAULT MyLive
LABEL MyLive
linux /isolinux/vmlinuz-5.10.0-9-amd64
APPEND initrd=/isolinux/initramfs.gz rw
Писал его сам, не судите строго. Не хотел бездумно переписывать чужие.
Остальные файлы тупо взял из существующего isolinux'а от Live-Debian с официального сайта, каюсь.
6. Создаю образ:
genisoimage -o disk.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -J -R /{полный путь к директории livecd}
Образ создается без ошибок, я даже потом проверяю что на .iso все внутри лежит как надо (путем подмонтирования его в loop-режиме).
7. Самое интересное. Создаю в VirtualBox виртуалку БЕЗ жесткого диска, в виртуальный CD «сую» свой disk.iso и запускаю машину. Дальше происходит следующее:
ISOLINUX 6.03 20171018 ETCD Copyright (C) 1994-2014 H. Peter Anvin et al
То есть как минимум ISOLINUX цепляется успешно!
Loading /isolinux/vmlinuz-5.10.0-9-amd64...ok
Раз «ok» - значит, надо понимать, загрузка ядра произошла успешно?...
Loading /isolinux/initramfs.gz...ok
Опять же - говорит «ok»!
А потом вот такая шляпа:
Booting kernel failed: Invalid argument
boot:
*********************************** ***
Я голову сломал, что он от меня хочет - я никаких аргументов не передавал в ядро... Очень прошу помочь - в каком направлении думать, где я ошибся.
Ну или, как вариант, с удовольствием приму помощь по созданию подобного Live-дистрибутива на коммерческой основе (формат взаимодействия и стоимость оговорим в личке)!