【问题标题】:What is linuxrc purpose and is it needed in the rootfs?linuxrc 的目的是什么,在 rootfs 中是否需要它?
【发布时间】:2017-07-23 18:45:06
【问题描述】:

问题

我的问题是,linuxrc 是做什么的?我的rootfs 需要它吗?这与使用systemdinitd 有什么关系吗?

背景

我目前正在尝试使用 Yocto 为 ARM 7 处理器构建rootfs。我对原始 BSP 项目所做的唯一修改是我指定我想使用 systemd 作为我的初始化管理器(在 local.conf 中完成)。 rootfs 构建 (bitbake core-image-minimal) 并使用 Mgftool2 我将其加载到板上。当我尝试启动映像时,出现以下错误:

VFS: Mounted root (ext3 filesystem) readonly on device 179:2.
devtmpfs: mounted
Freeing unused kernel memory: 272K (80816000 - 8085a000)
Kernel panic - not syncing: Requested init /linuxrc failed (error -2).
CPU: 0 PID: 1 Comm: swapper/0 Tainted: G        W       4.4.15-v4.4.15+g017b90c #1
Hardware name: Freescale i.MX6 Ultralite (Device Tree)
[<80015d9c>] (unwind_backtrace) from [<80012c14>] (show_stack+0x10/0x14)

这很有意义,因为在我检查了我生成的rootfs 之后,我发现没有名为linuxrc 的可执行文件。我将 u-boot 的 default_bootargs 更改为不包含 init=/linurc 并再次启动映像。 然后我收到此错误:(更新 #1)

更新 #1

次要错误是由 systemd 需要某些 kernel parameters enabled 引起的。使用这些参数重建内核后,linux 映像就会启动。我仍然有兴趣知道 linuxrc 到底做了什么,以及为什么它至少看起来我不需要它。

【问题讨论】:

    标签: embedded-linux yocto


    【解决方案1】:

    桌面操作系统上的 Linuxrc(/linuxrc,也通用名称 /init)位于 initramfs(ramdisk) 上。通常这在探测模块的脚本中,在 /dev 中创建临时设备节点,等待并挂载 rootfs,切换到真正的 root。如果不使用 initramfs,它可以通过符号链接到 init。

    Systemd 使用 udev 创建 /dev/ 树,因此不需要它。

    桌面 linux 在 initramfs 中使用它来挂载 root。如果 rootfs 直接挂载,它可以从 footfs 运行。

    从路由器中提取的 /init 示例。

    #!/bin/sh
    #
    
    # crucial mountpoints
    mount -t proc none /proc
    mount -t sysfs none /sys
    mount -n tmpfs /var -t tmpfs -o size=17825792
    mount -t tmpfs dev /dev
    
    mknod /dev/console c 5 1
    mknod /dev/ttyS0 c 4 64
    mknod /dev/ttyS1 c 4 65
    
    # setup console, consider using ptmx?
    CIN=/dev/console
    COUT=/dev/console
    exec <$CIN &>$COUT
    
    mknod /dev/null c 1 3
    mknod /dev/gpio c 127 0
    
    mknod /dev/zero c 1 5
    mknod /dev/tty c 5 0
    mknod /dev/tty0 c 4 0
    mknod /dev/tty1 c 4 1
    mknod /dev/random c 1 8
    mknod /dev/urandom c 1 9
    mknod /dev/ptmx c 5 2
    mknod /dev/mem c 1 1
    
    mknod /dev/watchdog c 10 130
    
    mknod /dev/mtdblock0 b 31 0
    mknod /dev/mtdblock1 b 31 1
    mknod /dev/mtdblock2 b 31 2
    mknod /dev/mtdblock3 b 31 3
    mknod /dev/mtdblock4 b 31 4
    mknod /dev/mtdblock5 b 31 5
    mknod /dev/mtdblock6 b 31 6
    mknod /dev/mtdblock7 b 31 7
    
    mknod /dev/mtd0 c 90 0
    mknod /dev/mtd1 c 90 2
    mknod /dev/mtd2 c 90 4
    mknod /dev/mtd3 c 90 6
    mknod /dev/mtd4 c 90 8
    mknod /dev/mtd5 c 90 10
    mknod /dev/mtd6 c 90 12
    mknod /dev/mtd7 c 90 14
    
    mknod /dev/ttyUSB0 c 188 0
    mknod /dev/ttyUSB1 c 188 1
    mknod /dev/ttyUSB2 c 188 2
    mknod /dev/ttyUSB3 c 188 3
    mknod /dev/ttyUSB4 c 188 4
    mknod /dev/ttyUSB5 c 188 5
    mknod /dev/ttyUSB6 c 188 6
    
    mknod /dev/ppp  c 108 0
    
    mknod /dev/i2c-0 c 89 0
    mknod /dev/i2c-1 c 89 1
    mknod /dev/i2c-2 c 89 2
    mknod /dev/i2c-3 c 89 3
    
    #
    # Create the ubnt-poll-host char dev entries
    # The major number is 189
    #
    # NOTE: wifiN's minor number = N
    #
    mknod /dev/uph_wifi0 c 189 0
    
    mkdir /dev/pts /dev/shm
    
    # rest of the mounts
    mount none /dev/pts -t devpts
    if [ -e /proc/bus/usb ]; then
        mount none /proc/bus/usb -t usbfs
    fi
    echo "...mounts done"
    
    mkdir -p /var/run /var/tmp /var/log /var/etc /var/etc/persistent /var/lock
    echo "...filesystem init done"
    
    # insert hal module
    [ ! -f /lib/modules/*/ubnthal.ko ] || insmod /lib/modules/*/ubnthal.ko
    
    # making sure that critical files are in place
    mkdir -p /etc/rc.d /etc/init.d
    # forced update
    for f in inittab rc.d/rc.sysinit rc.d/rc rc.d/rc.stop ppp; do
            cp -f -r /usr/etc/$f /etc/$f
    done
    echo "...base ok"
    
    mkdir -p /etc/udhcpc
    # do not update if exist
    for f in passwd group login.defs profile hosts host.conf \
    fstab udhcpc/udhcpc startup.list; do
        if [ -e /etc/$f ]; then
            echo -n '.'
        else
            cp -f /usr/etc/$f /etc/$f
        fi
    done
    echo "...update ok"
    
    mkdir -p /etc/sysinit
    # make symlinks if do not exist
    for f in services protocols shells mime.types ethertypes modules.d; do
        if [ -e /etc/$f ]; then
            echo -n '.'
        else
            ln -s /usr/etc/$f /etc/$f
        fi
    done
    echo "...symlinks ok"
    
    mkdir -p /etc/httpd
    # check if we have uploaded certificates
    for f in server.crt server.key; do
        if [ -e /etc/persistent/https/$f ]; then
        ln -s /etc/persistent/https/$f /etc/httpd/$f
        else
        ln -s /usr/etc/$f /etc/httpd/$f
        fi
    done
    echo "...httpd ok"
    
    CFG_SYSTEM="/tmp/system.cfg"
    CFG_RUNNING="/tmp/running.cfg"
    CFG_DEFAULT="/etc/default.cfg"
    
    #Starting watchdog manager
    /bin/watchdog -t 1 /dev/watchdog
    
    # board data symlinks + default config
    if [ -e /sbin/ubntconf ]; then
        /sbin/ubntconf -i $CFG_DEFAULT
        echo "ubntconf returned $?" >> /tmp/ubntconf.log
        echo "...detect ok"
    fi
    
    # System configuration
    mkdir -p /etc/sysinit/
    /sbin/cfgmtd -r -p /etc/ -f $CFG_RUNNING
    if [ $? -ne 0 ]; then
        /sbin/cfgmtd -r -p /etc/ -t 2 -f $CFG_RUNNING
        if [ $? -ne 0 ]; then
            cp $CFG_DEFAULT $CFG_RUNNING
        fi
    fi
    sort $CFG_RUNNING | tr -d "\r" > $CFG_SYSTEM
    cp $CFG_SYSTEM $CFG_RUNNING
    
    # But for DFS testing, it's useful to be able to overide this
    if [ -f /etc/persistent/enable_printk ]; then
        echo 9 > /proc/sys/kernel/printk
        dmesg -c
    else
        # Do not clutter serial port, normally
        echo 1 > /proc/sys/kernel/printk
    fi;
    
    # Set device date to firmware build date
    BDATE=201509091722
    if [ ! -z $BDATE ]; then
        date -s $BDATE >/dev/null 2>&1
    fi
    
    # Run configuration parser
    if [ -e /sbin/ubntconf ]; then
        /sbin/ubntconf
        echo "ubntconf returned $?" >> /tmp/ubntconf.log
    fi
    
    echo "...running /sbin/init"
    exec /sbin/init
    
    echo "INTERNAL ERROR!!! Cannot run /sbin/init."
    

    【讨论】:

    • 所以它与intrafs、busybox相关还是它自己的东西?
    • 它是预初始化脚本的特殊名称。
    猜你喜欢
    • 2019-12-23
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    • 2010-12-08
    相关资源
    最近更新 更多