切换root的正确方式



我在为嵌入式目标设置引导时遇到了很多问题;情况是:

我有一个嵌入式目标,有一个相当小但可靠的Flash(16M字节(和一个可能很大(目前为8GB(但相当不可靠的SD卡。

SD卡的不可靠性主要是由于硬件设置(直接连接到电源,所以如果它"严重"醒来,没有办法重置硬件(我无法更改。这主要影响u-boot(Linux处理似乎更稳定(。

由于我需要相对较高的可靠性,即使在软件更新期间/之后,我也选择了一个拨号系统(更新休眠的拨号系统,然后重新启动(;恢复";后退。

不幸的是,我在Flash中没有足够的空间来安装一个合适的initramfs和一个完整的恢复系统,所以我试图将启动系统和恢复结合起来。

因此,我有一个完整的闪存系统,带有一个选择启动模式的小型/init脚本。

/init脚本类似于:

#!/bin/ash
set -x
export PATH=/bin:/sbin:/usr/bin:/usr/sbin
boot_prod() {
mount -t proc none /proc
mount -t sysfs none /sys
mount $1 /mnt && [ -x /mnt/sbin/init ] || return 1
echo "switching to $1"
cd /mnt
mount --move /sys sys
umount /proc # /proc is remounted by BusyBox /dev/inittab
mount --move /dev dev
config_set sys $2
pivot_root . mnt
umount mnt
exec chroot . sbin/init <dev/console >dev/console 2>&1
}
case $tryboot; in
A)
boot_prod /dev/mmcblk0p6 A
;;
B)
boot_prod /dev/mmcblk0p7 B
;;
R)
[ -x /mnt/sbin/init ] && exec /mnt/sbin/init
;;
*)
;;
esac
echo "Could not boot cleanly; running a shell"
mount -t proc none /proc
mount -t sysfs none /sys
exec setsid cttyhack sh

这显然是从包含tryboot=A/B/Rbootargs开始的。

我没有使用Busyboxswitch_root,因为这不是一个真正的initramfs,而是一个生活在Flash上的SquashFS;我当前的u-Boot环境包括:

BOOT_A_GOOD=y
BOOT_CURRENT=B
SYSTEM_R=/dev/mtdblock5
boot_a=echo "Loading System A";part=A;run boot_x
boot_b=echo "Loading System B";part=B;run boot_x
boot_now=if test "${BOOT_CURRENT}" = A; then run boot_a; elif test "${BOOT_CURRENT}" = B; then run boot_b; fi; if env exists BOOT_A_GOOD; then run boot_a; fi; if env exists BOOT_B_GOOD; then run boot_b; fi; run boot_r
boot_r=echo "Loading Recovery";part=R;run boot_x
boot_x=setenv bootargs "${default_bootargs} mtdparts=${mtdparts} root=${part}" && bootm bc050000
bootcmd=rub boot_now
bootdelay=2
default_bootargs=earlyprintk rootwait console=ttyS2,115200
mtdids=nor0=spi0.0
mtdparts=spi0.0:312k(u-boot),4k(env),4k(factory),2368k(kernel),-(filesystem)

当前的问题是系统在CCD_ 6处死亡;内核死机-未同步:试图终止init"错误而不打印";罪犯;+ exec chroot . sbin/init <dev/console >dev/console 2>&1线。

注1:我确保sbin/init存在于新的根fs上(它是bin/busybox的符号链接

注2:即使我注释掉以前的umount mnt,错误仍然存在。

我做错了什么?

我对switch_root比pivot_root更有经验。

试图杀死init!

这意味着PID为1的进程退出或终止。(PID 1被称为"init",因为它通常是初始值中的/initRAM磁盘。(

/mnt/sbin/init是否结束或退出?

最新更新