Étape par étape du programme minimal initrd CPIO hello world

Compilez un monde bonjour sans aucune dépendance qui se termine par une boucle infinie. init.S:
.global _start
_start:
mov $1, %rax
mov $1, %rdi
mov $message, %rsi
mov $message_len, %rdx
syscall
jmp .
message: .ascii "FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR\n"
.equ message_len, . - message
On ne peut pas utiliser sys_exit, sinon la panique du noyau.
Alors:
mkdir d
as --64 -o init.o init.S
ld -o init d/init.o
cd d
find . | cpio -o -H newc | gzip > ../rootfs.cpio.gz
ROOTFS_PATH="$(pwd)/../rootfs.cpio.gz"
Cela crée un système de fichiers avec notre monde bonjour /init, qui est le premier programme de l'espace utilisateur sur lequel le noyau s'exécutera. Nous aurions également pu ajouter plus de fichiers d/et ils seraient accessibles depuis le /initprogramme lors de l'exécution du noyau.
Ensuite, cddans l'arborescence du noyau Linux, la construction est comme d'habitude et exécutez-la dans QEMU:
git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
cd linux
git checkout v4.9
make mrproper
make defconfig
make -j"$(nproc)"
qemu-system-x86_64 -kernel arch/x86/boot/bzImage -initrd "$ROOTFS_PATH"
Et vous devriez voir une ligne:
FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR
sur l'écran de l'émulateur! Notez que ce n'est pas la dernière ligne, vous devez donc regarder un peu plus haut.
Vous pouvez également utiliser des programmes C si vous les liez statiquement:
#include <stdio.h>
#include <unistd.h>
int main() {
printf("FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR\n");
sleep(0xFFFFFFFF);
return 0;
}
avec:
gcc -static init.c -o init
Vous pouvez exécuter sur du vrai matériel avec une clé USB /dev/sdXet:
make isoimage FDINITRD="$ROOTFS_PATH"
sudo dd if=arch/x86/boot/image.iso of=/dev/sdX
Excellente source sur ce sujet: http://landley.net/writing/rootfs-howto.html Il explique également comment utiliser gen_initramfs_list.sh, qui est un script de l'arborescence des sources du noyau Linux pour aider à automatiser le processus.
Étape suivante: configurez BusyBox pour pouvoir interagir avec le système: /unix/2692/what-is-the-smallest-possible-linux-implementation/203902#203902
Testé sur Ubuntu 16.10, QEMU 2.6.1.