embedded-linux - linuxrc 的目的是什么,在 rootfs 中是否需要它?

标签 embedded-linux yocto

问题

我的问题是,linuxrc 是什么意思?做?我需要它在我的rootfs 中吗? ?和使用systemd有什么关系吗?对比 initd ?

背景

我目前正在尝试构建 rootfs对于使用 Yocto 的 ARM 7 处理器。我对原始 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确实以及为什么它至少看起来我不需要它。

最佳答案

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

关于embedded-linux - linuxrc 的目的是什么,在 rootfs 中是否需要它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45268712/

相关文章:

c++ - 如何使用x11窗口背景加载bmp文件

linux - Buildroot 不会在 am335x 自定义板上为 emmc 创建/开发条目

yocto - bitbake 中的继承澄清

c++ - 执行 populate_sdk 时如何使用 yocto 在 native sysroot 中安装文件?

c - 如何包含 pulseaudio 核心 header ?

embedded-linux - 为 Raspberry Pi 构建一个最小的 Linux

embedded-linux - i2c md 命令语法

Yocto sdcard 图像类

python - yocto linux 上基于 python 脚本的性能评估

linux - 什么时候在内核中创建 kallsyms?