Созданиe initramfs

Initramfs, сокращенно от “initial RAM file system”, является приемником initrd (initial ramdisk). Это cpio (copy in and out) архив исходной файловой системы, который загружается в память во время процесса запуска Linux. Linux копирует содержимое архива в rootfs (которая может быть основана на ramfs либо на tmpfs), а затем запускает init. Init предназначен для выполнения определенных задач до того, как реальная или финальная файловая система будет установлена поверх rootfs. Таким образом, initramfs должен содержать все драйвера устройств и инструменты, необходимые для установки конечной корневой файловой системы.

Скачиваем busybox (вы можете скачать более новую версию):

wget https://busybox.net/downloads/busybox-1.26.2.tar.bz2
tar -xvf busybox-1.26.2.tar.bz2

Собираем busybox из исходников:

cd busybox-1.26.2
make defconfig
make menuconfig

В меню Busybox Settings выбираем Build Options, и ставим галочку напротив Build BusyBox as a static binary (no shared libs). Далее указываем выходную папку для бинарников и собираем busybox.

make
make CONFIG_PREFIX=./../busybox_rootfs install

Создаем иерархию каталогов для initramfs:

mkdir -p initramfs/{bin,dev,etc,home,mnt,proc,sys,usr}
cd initramfs/dev
sudo mknod sda b 8 0
sudo mknod console c 5 1

Так же копируем все из папки busyboxrootfs в папку initramfs. Дальше создаем в корне initramfs файл init, и пишем в него следующее:

#!/bin/sh
mount -t proc none /proc
mount -t sysfs none /sys
exec /bin/sh

И даем ему права на исполнение:

chmod +x init

Создаем сам initramfs:

find . -print0 | cpio --null -ov --format=newc > initramfs.cpio
gzip ./initramfs.cpio

Скачиваем и собираем ядро (вы можете скачать более новую версию):

wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.11.6.tar.xz
tar -xvf linux-4.11.6.tar.xz
make x86_64_defconfig
make kvmconfig
make -j2

Образ ядра будет лежать в /arch/x8664/boot/bzImage.

Дальше копируем куда-то наш initramfs и ядро, заходим в эту директорию и запускаем qemu:

qemu-system-x86_64 -kernel ./bzImage -initrd ./initramfs.cpio.gz -nographic -append "console=ttyS0"

Если все было выполнено правильно, то загрузится ядро и запустится shell.

Made with Emacs 28.2 (Org mode 9.5.5)