简体   繁体   中英

Linux initramfs switch_root unable to find console which kernel uses

My system (ARM32) is booting Linux via U-Boot. The kernel gets console=ttymxc1,115200 as an argument from u-boot. Then it uses a shell script with switch_root (interpreted by busybox ) inside a initramfs for initializing the root filesystem. Furthermore this initramfs script parses the kernel commandline to get the correct console .

The problem is that switch_root is printing to tty1 . Nonetheless the kernel uses the correct console, specified in its arguments. If I pass no -c argument to switch_root it also uses /dev/tty1 , which is the display in my case.

Does anybody of you have an idea how I could get init (sysvinit) to use the console specified in the kernel arguments?

Here's the initramfs script source:

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

And here's the 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

Finally I found the solution (and the mistake I made)!

The console device was created with the wrong major/minor numbers. Creating it with the same as the kernel assigns to ttymxc* it works:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM