- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我在带有 busybox 的嵌入式 linux 环境中。我已经通读了 several posts尝试学习如何使用 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
的基本知识?或者需要一些简单的命令行修改?
最佳答案
首先,正如它的帮助文本所说,switch_root
必须作为 PID 1 执行。因此,它需要由使用 exec
的 initscript 调用。
其次,手动移动 tmp 文件系统(如您所见)是个坏主意。您收到的错误是因为您的控制台 (/dev/ttyS0
) 已随您的 mount --move
调用移走。switch_root
会自动删除这些挂载。因此,您的第二个 init(由 switch_root
调用)需要再次安装它们。
第三,这是我在 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" "$@"
希望这对您有所帮助。
关于linux - switch_root busybox 初始化问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30813572/
我的系统 (ARM32) 正在通过 U-Boot 启动 Linux。内核从 u-boot 获取 console=ttymxc1,115200 作为参数。然后它在 initramfs 中使用带有 swi
我在带有 busybox 的嵌入式 linux 环境中。我已经通读了 several posts尝试学习如何使用 switch_root .我试过这个: exec switch_root -c /de
switch_root 和 run_init 有什么区别,除了 switch_root 是由 busybox 而 run_init 来自klibc? 非常感谢 最佳答案 它们都执行完全相同的功能,即从
我是一名优秀的程序员,十分优秀!