Skip to the content.

initramfs

Создадим файл hello.c:

#include <stdio.h>

void main() {
    printf("Hello World!\n");
    while (1);
}

Произведем статическую (чтобы не зависеть от динамических библиотек) кросс-компиляцию под 32-битный ARM:

arm-linux-gnueabi-gcc -static hello.c -o hello

Создадим CPIO-архив rootfs.img с файлом hello внутри:

echo hello | cpio -o --format=newc > rootfs.img

Формат newc - это формат архива с initramfs, который распознает ядро Linux.

Содержимое CPIO можно проверить следующим образом:

cpio -t < rootfs.img

Архив rootfs.img содержит файл hello:

rootfs.img
hello
1019 blocks

Запустим QEMU с ядром Linux и rootfs.img в качестве initramfs и с помощью ключа -append передадим опцию загрузки ядра rdinit.

qemu-system-arm -M virt -cpu cortex-a15 -kernel zImage -nographic -initrd rootfs.img -append "rdinit=/hello"

После зарузки ядра Linux и монтирования initramfs в /, управление будет передано программе hello:

[    8.397420] Run /hello as init process
Hello World!