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" "$@"
Надеюсь это поможет.