2

私は、ビジーボックスを備えた組み込み Linux 環境にいます。switch_rootの使用方法を学ぼうとするいくつかの 投稿を読みました。私はこれを試しました:

exec switch_root -c /dev/console /mnt/newroot /bin/busybox init

switch_rootヘルプが表示され、新しいログインが表示されます。

[root@buildroot ~]# exec switch_root -c /dev/console /mnt/newroot /bin/busybox init
BusyBox v1.21.0 (2015-04-24 18:14:40 MDT) multi-call binary.
busybox init
Usage: switch_root [-c /dev/console] NEW_ROOT NEW_INIT [ARGS]root /bin/busybox in

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.

        -c DEV  Reopen stdio to DEV after switch


Welcome to Buildroot
buildroot login:

ログインすると、newrootが読み込まれておらず、古いものがまだ残っています。これは、ある種の init スクリプトからではなく、コマンド ラインから直接このコマンドを実行しているためですか?

この記事を読んだところ、実行する前に他の手順を実行していることがわかりましたswitch_root

mount --move /sys /newroot/sys
mount --move /proc /newroot/proc
mount --move /dev /newroot/dev

まず、これは私を混乱させます。を実行する前にこれらのコマンドを実行する必要があるのはなぜswitch_rootですか? 私のためにこれをしませswitch_rootんか?

とにかく、先に進んで、最初にそれらを実行してから、switch_rootコマンドを実行してみました。ただし、これは物事を完全にホースでつなぎます。

[root@buildroot /]# switch_root -c /dev/console /mnt/newroot /bin/busybox init
BusyBox v1.21.0 (2015-04-24 18:14:40 MDT) 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.

        -c DEV  Reopen stdio to DEV after switch

can't open /dev/ttyS0: No such file or directoryole /mnt/newroot /bin/busybox init
can't open /dev/ttyS0: No such file or directory
can't open /dev/ttyS0: No such file or directory
can't open /dev/ttyS0: No such file or directory
can't open /dev/ttyS0: No such file or directory
can't open /dev/ttyS0: No such file or directory
can't open /dev/ttyS0: No such file or directory
... message continues to repeat ...

dev のマウントを移動したため、init が実行され、シリアル ポートに getty を配置しようとすると、見つからないように見えますか? 錯乱........

ここで何か基本的なことが欠けていswitch_rootますか? または、単にコマンドラインの変更が必要ですか?

4

1 に答える 1

5

まず、ヘルプテキストswitch_rootにあるように、PID 1 として実行する必要があります。したがって、initscript を使用して呼び出す必要がありますexec

次に、tmpfilesystems を手動で移動するのは (ご覧のとおり) 悪い考えです。表示されるエラーは、コンソール ( ) が呼び出し /dev/ttyS0で移動されたためです。これらのマウントは自動的に削除されます。したがって、2 番目の init (によって呼び出されます) は、それらを再度マウントする必要があります。mount --moveswitch_rootswitch_root

3 番目に、initramfs 内で使用している init スクリプトの短いバージョンを次に示します。

#!/bin/sh

ROOT="/mnt/.root"
ROOT_DEV="/dev/sdb2"

echo "init from initramfs"

# mount temporary filesystems
mount -n -t devtmpfs devtmpfs /dev
mount -n -t proc     proc     /proc
mount -n -t sysfs    sysfs    /sys
mount -n -t tmpfs    tmpfs    /run

# mount new root
[ -d ${ROOT} ] || mkdir -p ${ROOT}
mount ${ROOT_DEV} ${ROOT}

# switch to new rootfs and exec init
cd ${ROOT}
exec switch_root . "/sbin/init" "$@"

お役に立てれば。

于 2016-07-13T10:58:40.123 に答える