switch_root initbox проблемы с инициализацией?

Я нахожусь во встроенной среде Linux с busybox. Я прочитал несколько постов, пытаясь узнать, как использовать 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 не был загружен, старый все еще там. Это потому, что я запускаю эту команду прямо из командной строки, а не из какого-то сценария инициализации?

Я прочитал в этой статье и обнаружил, что они выполняют другие шаги перед запуском 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 Вот? Или просто необходимы какие-то модификации командной строки?

1 ответ

Во-первых, как говорится в его справочном тексте switch_root должен быть выполнен как PID 1. Поэтому он должен вызываться initscript, используя exec,

Во-вторых, перемещение tmpfilesystems вручную - это (как вы видели) плохая идея. Вы получаете ошибку, потому что ваша консоль (/dev/ttyS0отправилась с твоим mount --move вызов.switch_root удалит эти горы автоматически. Поэтому ваш второй init (который называется switch_root) нужно снова их смонтировать.

В-третьих, вот короткая версия сценария инициализации, который я использую в моих initramfs, который должен вам помочь:

#!/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" "$@"

Надеюсь это поможет.

Другие вопросы по тегам