Estou trabalhando em um sistema ARM Linux integrado que inicializa usando o initramfs. (Veja alguns antecedentes de algumas anteriores perguntas , se você estiver interessado.) Até agora, obrigado em parte à ajuda recebida aqui, eu posso inicializar o kernel via TFTP com um initramfs embutido. O driver MMC detecta um cartão SD contendo um novo sistema de arquivos raiz, que eu posso montar. No entanto, não consigo dar o passo final, usando o busybox switch_root para mudar para o sistema de arquivos no cartão SD, para trabalhar.
No prompt do initramfs, acho que isso deve fazer o kernel mudar para o novo sistema de arquivos:
switch_root -c /dev/console /mnt/root /sbin/init.sysvinit
No entanto, isso só faz o busybox (para o qual switch_root é aliado) imprimir sua página de manual, assim:
/ # switch_root -c /dev/console /mnt/root /sbin/init.sysvinit
BusyBox v1.17.4 (2010-12-08 17:01:07 EST) multi-call binary.
Usage: switch_root [-c /dev/console] NEW_ROOT NEW_INIT [ARGS]
Free initramfs and switch to another root fs:
chroot to NEW_ROOT, delete all in /, move NEW_ROOT to /,
execute NEW_INIT. PID must be 1. NEW_ROOT must be a mountpoint.
Options:
-c DEV Reopen stdio to DEV after switch
Eu acho que a opção -c está correta, já que é a mesma que está contida no exemplo, e / dev / console existe.
/ # ls -l /dev
total 0
crw-r--r-- 1 0 0 5, 1 Jan 1 00:28 console
brw-r--r-- 1 0 0 7, 0 Dec 21 2010 loop0
brw-r--r-- 1 0 0 179, 0 Dec 21 2010 mmcblk0
brw-r--r-- 1 0 0 179, 1 Dec 21 2010 mmcblk0p1
brw-r--r-- 1 0 0 179, 2 Dec 21 2010 mmcblk0p2
brw-r--r-- 1 0 0 179, 3 Dec 21 2010 mmcblk0p3
brw-r--r-- 1 0 0 179, 4 Dec 21 2010 mmcblk0p4
/ mnt / root também existe.
/ # ls /mnt/root
bin etc linuxrc mnt sys var
boot home lost+found proc tmp
dev lib media sbin usr
O executável do init existe:
/ # ls -lh /mnt/root/sbin/
<snip>
lrwxrwxrwx 1 0 0 19 Dec 21 2010 init -> /sbin/init.sysvinit
-rwxr-xr-x 1 0 0 22.8K Dec 21 2010 init.sysvinit
Mas aqui está algo estranho:
/mnt/root/sbin # pwd
/mnt/root/sbin
/mnt/root/sbin # ls -l | grep init.sysvinit
lrwxrwxrwx 1 0 0 19 Dec 21 2010 init -> /sbin/init.sysvinit
-rwxr-xr-x 1 0 0 23364 Dec 21 2010 init.sysvinit
/mnt/root/sbin # ./init.sysvinit
/bin/sh: ./init.sysvinit: not found
/mnt/root/sbin # /mnt/root/sbin/init.sysvinit
/bin/sh: /mnt/root/sbin/init.sysvinit: not found
Isso é totalmente mistificador. Não tenho certeza de onde estou indo errado. Eu olhei para a fonte, que está em link
Não é apenas o executável init.sysvinit. Não consigo executar nada do cartão SD. Por exemplo:
/mnt/root/bin # ./busybox
/bin/sh: ./busybox: not found
/mnt/root/bin # /mnt/root/busybox
/bin/sh: /mnt/root/busybox: not found
/mnt/root/bin # ls -l | grep "2010 busybox"
-rwxr-xr-x 1 0 0 462028 Dec 21 2010 busybox
Alguém tem uma pista do que está errado aqui? Eu pensei que poderia ser algum problema com a montagem da placa noexec, mas acredito exec é o padrão, e eu tentei passar a opção exec explicitamente na montagem sem sucesso.