Initramfs intégré au kernel Linux personnalisé ne fonctionne pas

Je construis une image initramfs personnalisée que je construis en tant qu’archive CPIO dans le kernel Linux (3.2).

Le problème que je me pose est que peu importe ce que je tente, le kernel ne semble même pas tenter de s’exécuter depuis les initramfs.

Les fichiers que j’ai dans mon archive CPIO:

cpio -it < initramfs.cpio . init usr usr/sbin lib lib/libcrypt.so.1 lib/libm.so lib/libc.so.6 lib/libgcc_s.so lib/libcrypt-2.12.2.so lib/libgcc_s.so.1 lib/libm-2.12.2.so lib/libc.so lib/libc-2.12.2.so lib/ld-linux.so.3 lib/ld-2.12.2.so lib/libm.so.6 proc sbin mnt mnt/root root etc bin bin/sh bin/mknod bin/mount bin/busybox sys dev 4468 blocks 

Init est très simple, et devrait juste lancer des périphériques et générer un shell (pour le moment):

 #!/bin/sh mount -t devtmpfs none /dev mount -t proc none /proc mount -t sysfs none /sys /bin/busybox --install -s exec /bin/sh 

Dans le kernel .config j’ai:

 CONFIG_INITRAMFS_SOURCE="../initramfs.cpio" CONFIG_INITRAMFS_ROOT_UID=0 CONFIG_INITRAMFS_ROOT_GID=0 CONFIG_BLK_DEV_INITRD=y CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM_COUNT=1 CONFIG_BLK_DEV_RAM_SIZE=32768 

Les versions du kernel et la taille de uImage sont plus grandes en fonction de la taille de l’initramfs, donc je sais que l’image est en train d’être compressée. Cependant, j’obtiens cette sortie lorsque je démarre:

 console [netcon0] enabled netconsole: network logging started omap_rtc omap_rtc: setting system clock to 2000-01-02 00:48:38 UTC (946774118) Warning: unable to open an initial console. Freeing init memory: 1252K mmc0: host does not support reading read-only switch. assuming write-enable. mmc0: new high speed SDHC card at address e624 mmcblk0: mmc0:e624 SU08G 7.40 GiB mmcblk0: p1 Kernel panic - not syncing: Attempted to kill init! [] (unwind_backtrace+0x0/0xe0) from [] (panic+0x58/0x188) [] (panic+0x58/0x188) from [] (do_exit+0x98/0x6c0) [] (do_exit+0x98/0x6c0) from [] (do_group_exit+0xb0/0xdc) [] (do_group_exit+0xb0/0xdc) from [] (sys_exit_group+0x10/0x18) [] (sys_exit_group+0x10/0x18) from [] (ret_fast_syscall+0x0/0x2c) 

À partir de cette sortie, il ne semble pas qu’il essaie même d’extraire l’archive CPIO en tant qu’initramfs. Je m’attends à voir cette sortie printk, qui est présente dans le code linux init / initramfs.c:

 printk(KERN_INFO "Trying to unpack rootfs image as initramfs...\n"); 

J’ai essayé le système de fichiers une fois le démarrage terminé (en utilisant chroot) et cela fonctionne très bien … donc je pense que le système de fichiers / les bibliothèques sont sains.

Quelqu’un pourrait-il me donner des indications quant à ce que je peux avoir incorrect? Merci d’avance pour toute aide!

Je l’ai compris. Je posterai la réponse au cas où quelqu’un d’autre aurait ce problème.

Il me manquait un périphérique de console, cette ligne était l’indice:

 Warning: unable to open an initial console. 

Après avoir ajouté les printk afin de mieux comprendre la séquence de démarrage, j’ai réalisé que le périphérique de la console était ouvert avant d’exécuter le script init. Par conséquent, le périphérique de console doit se trouver directement dans le système de fichiers initramfs, et nous ne pouvons pas compter sur le assembly devtmpfs pour le créer.

Je pense que lorsque le script init a été exécuté, le shell essayait d’ouvrir la console et a échoué, c’est pourquoi le kernel produisait:

 Kernel panic - not syncing: Attempted to kill init! 

L’exécution des commandes suivantes à partir du répertoire / dev de initramfs sur la machine de compilation du kernel générera les nœuds de périphérique requirejs:

 mknod -m 622 console c 5 1 mknod -m 622 tty0 c 4 0 

Après avoir re-archivé CPIO le système de fichiers et reconstruit le kernel, j’ai enfin un système de fichiers opérationnel dans initramfs que le kernel démarrera.