Linux initramfs switch_root无法找到哪个内核使用

时间:2016-08-18 09:33:44

标签: linux linux-kernel init yocto busybox

我的系统(ARM32)正在通过U-Boot启动Linux。 内核从u-boot获取console=ttymxc1,115200作为参数。 然后它在initramfs中使用带有switch_root(由busybox解释)的shell脚本来初始化根文件系统。 此外,此initramfs脚本解析内核命令行以获取正确的console

问题是switch_root正在打印到tty1。尽管如此,内核使用其参数中指定的正确控制台。 如果我没有将-c参数传递给switch_root,它也会使用/dev/tty1,这就是我的情况。

你是否有人知道如何让init(sysvinit)使用内核参数中指定的控制台?

这是initramfs脚本源:

#!/bin/sh

echo "init: rootfs setup"

# 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

read -r cmdline < /proc/cmdline

# define filesystems
ROOT_DEV="/dev/mydev"
ROOT="/newroot"

# mount rootfs
mkdir -p ${ROOT}
mount ${ROOT_DEV} ${ROOT}

# get & create console
CONSOLE=$(echo $cmdline) | sed 's/.*console=\(.*\),.*/\1/'
mknod -m 644 ${ROOT}/dev/${CONSOLE} c 5 1

# switch to new rootfs and exec init
echo "init: rootfs successful mounted (${ROOT})"
cd ${ROOT}
exec switch_root -c /dev/${CONSOLE} . "/sbin/init" "$@"

这里是initramfs config.cfg

dir /bin 755 1000 1000
dir /dev 755 0 0
dir /mnt 755 0 0
dir /proc 755 0 0
dir /run 755 0 0
dir /sys 755 0 0
file /bin/busybox initramfs/busybox 755 0 0
file /init initramfs/init 755 0 0
nod /dev/console 644 0 0 c 5 1
nod /dev/ttymxc1 644 0 0 c 5 1
slink /bin/chroot busybox 777 0 0
slink /bin/find busybox 777 0 0
slink /bin/grep busybox 777 0 0
slink /bin/mkdir busybox 777 0 0
slink /bin/mknod busybox 777 0 0
slink /bin/mount busybox 777 0 0
slink /bin/sed busybox 777 0 0
slink /bin/sh busybox 777 0 0

1 个答案:

答案 0 :(得分:0)

最后我找到了解决方案(以及我犯的错误)!

控制台设备是使用错误的主要/次要编号创建的。 使用与内核相同的方式创建它分配给ttymxc *它可以工作:

mknod -m 644 ${ROOT}/dev/${CONSOLE} c 207 17