busybox switch_rootの動作に問題があります。

busybox switch_rootの動作に問題があります。

私はinitramfsを使用して起動する組み込みARM Linuxシステムを開発しています。 (ここにはいくつかの背景があります。より早い 質問、興味があれば。 )これまでは、ここで受けた助けのおかげで、initramfsが組み込まれたTFTPを通じてカーネルを起動することができました。 MMCドライバは、新しいルートファイルシステムを含むSDカードを検出してマウントすることができます。ただし、busybox switch_rootを使用してSDカードのファイルシステムに切り替える最後の手順を完了することはできません。

initramfsシェルプロンプトで、カーネルを新しいファイルシステムに切り替える必要があると思います。

switch_root -c /dev/console /mnt/root /sbin/init.sysvinit 

ただし、これはbusybox(switch_rootのエイリアス)に次のマニュアルページを印刷させます。

/ # 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

-c オプションは例に含まれているものと同じで、/dev/console が存在するため、正しいオプションだと思います。

/ # 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も存在します。

/ # ls /mnt/root
bin         etc         linuxrc     mnt         sys         var
boot        home        lost+found  proc        tmp
dev         lib         media       sbin        usr

init実行可能ファイルが存在します。

/ # 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

ところで、奇妙な点があります。

/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

本当に謎です。私がどこで間違っているのかわかりません。ソースを確認してみると、http://git.busybox.net/busybox/tree/util-linux/switch_root.c?id=1_17_4

これは init.sysvinit 実行可能ファイルではありません。 SDカードでは何もできません。たとえば、

/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

ここで何が起こっているのか知っている人はいますか?私はnoexecでカードをマウントするのに問題があるのではないかと思いました。

ベストアンサー1

switch_rootコマンドラインで機能しない理由は、busyboxの次のコードによるものです。

    if (st.st_dev == rootdev || getpid() != 1) {
        // Show usage, it says new root must be a mountpoint
        // and we must be PID 1
        bb_show_usage();
    }

あなたはPID 1ではないので、このジレンマに陥りましたbb_show_usage。これはswitch_root、initramfs initスクリプトのコマンドが.ieswitch_rootで終わる必要があることを意味します。exec

exec switch_root ...

「見つかりません」エラーのもう1つの問題は、initramfsルートファイルシステムに共有ライブラリがないため、実行可能ファイルに必要な共有ライブラリが見つからないことです。これswitch_rootが利用可能な場合、exec「見つかりません」エラーが消える可能性があります。

おすすめ記事