备案 控制台
开发者社区 开发与运维 文章 正文

Linux initrd 学习笔记

简介: [上回](https://www.atatech.org/articles/101496) 提到可使用 initrd 实现两阶段启动,有啥好处呢? * 访问根文件系统需要的附加驱动、内核模块和软件包等可以放到 initrd 中,基础内核保持小而精。 * 内核 + initrd 即可启动计算机基础环境,可实现不依赖目标系统环境的“独立应用”,如 ubuntu 网络安装程序,系统维护(恢复)环境等

上回 提到可使用 initrd 实现两阶段启动,有啥好处呢?

  • 访问根文件系统需要的附加驱动、内核模块和软件包等可以放到 initrd 中,基础内核保持小而精。
  • 内核 + initrd 即可启动计算机基础环境,可实现不依赖目标系统环境的“独立应用”,如 ubuntu 网络安装程序,系统维护(恢复)环境等。

initrd 全称 "initial RAM disk",详情参考 man initrd(更详细?)或
Linux initrd 文档。Linux 文档摘录如下:

initrd is mainly designed to allow system startup to occur in two phases,

where the kernel comes up with a minimum set of compiled-in drivers, and where additional modules are loaded from initrd.

加载 initrd 文件

可使用内核启动参数 initrd= 指定 initrd 文件路径(未测试)。
通常应使用引导器(如 GRUB)加载 initrd 并提供给内核 ,这样加载内核时不依赖文件系统,更清晰易用。
同样,qemu 虚拟机支持直接加载宿主机上的 initrd 文件。

执行 initrd

内核加载 initrd 为最初的根文件系统。
经测试加载 initrd 后会执行其 /init 文件,可以是脚本或二进制文件。
注意内核启动参数 init= 是设置系统 init 入口(默认 /sbin/init),不会影响 initrd init 入口(默认 /init)。
随后 initrd 可使用 pivot_root 切换到新的系统根目录。

initrd 的 init 脚本关键逻辑是挂载好 /proc 等关键系统目录和目标系统根目录,
如本机 initrd 的 init 脚本包含如下内容:

export PATH=/sbin:/usr/sbin:/bin:/usr/bin

[ -d /dev ] || mkdir -m 0755 /dev
[ -d /root ] || mkdir -m 0700 /root
[ -d /sys ] || mkdir /sys
[ -d /proc ] || mkdir /proc
[ -d /tmp ] || mkdir /tmp
mkdir -p /var/lock
mount -t sysfs -o nodev,noexec,nosuid sysfs /sys
mount -t proc -o nodev,noexec,nosuid proc /proc
# Some things don't work properly without /etc/mtab.
ln -sf /proc/mounts /etc/mtab

# ... ...
mountroot
# ... ...

# Move virtual filesystems over to the real filesystem
mount -n -o move /sys ${rootmnt}/sys
mount -n -o move /proc ${rootmnt}/proc

# Chain to real filesystem
exec run-init ${drop_caps} ${rootmnt} ${init} "$@" ${recovery:+--startup-event=recovery} <${rootmnt}/dev/console >${rootmnt}/dev/console 2>&1
  • mountroot 是相关脚本中定义的一个 shell 函数。
  • run-init 是 initrd 上的一个二进制文件,其主要功能是执行 pivot_root 切换到目标系统根目录,并执行目标系统 init 。(?)

ubuntu 网络安装程序 initrd 则是挂载相关系统目录后直接执行系统 init(默认为 busybox init),其 initrd init 脚本内容如下:

#!/bin/sh -e
# used for initramfs
export PATH
. /lib/debian-installer/init-debug
debugshell "just booted"

mount /run
mkdir -p /run/lock
mount /proc
mount /sys
/lib/debian-installer/start-udev

init='/bin/busybox init'
for i in $(cat /proc/cmdline); do
    case $i in
        init=/init|init=init)
            # Avoid endless loop
            : ;;
        init=*)
            init=${i#init=} ;;
        noshell)
            sed -i '/^tty[23]/s/^/#/' /etc/inittab ;;
    esac
done
debugshell "before init"
exec $init

其中 /etc/inittab 启动安装程序配置如下:

# main setup program
::respawn:/sbin/reopen-console /sbin/debian-installer
  • reopen-console 是一个脚本。尝试获取控制台并运行安装程序。

initrd 文档上提到,引入 pivot_root 之前的老内核上使用 change_root 机制,
即先执行 initrd 上的 /linuxrc,linuxrc 退出后自动挂载系统根目录(/proc/sys/kernel/real-root-dev 指定)并执行系统 init。
新内核启动参数 root= 不为 /dev/ram0 时可能兼容此行为。
新内核启动参数 root=/dev/ram0 时,直接执行 initrd 上的 /sbin/init,可使用 pivot_root 切换新系统目录。
以上两种方式均未测试成功,即无论 root= 如何设置,initrd 上的 /linuxrc/sbin/init 都未被执行。
解开本机系统 initrd 文件看了下,只找一个 /init 文件。

$ find -name linuxrc -o -name init
./init

可见 上面提到的 initrd 相关描述已过时。

后来了解到 现代内核支持使用 cpio 文件 ,加载后即执行 /init,与 root= 设置无关。
cpio 文件实际上直接挂载为文件系统,所以又叫做 initramfs
这是一种技术革新,从挂载块设备变成直接挂载文件系统,同时去掉了 /dev/ram0
很多时候依然统称为 initrd 。

手动制作 initrd 文件

initrd 既然是内存盘,可直接制作磁盘镜像(如之前使用的 sda.raw)作为 initrd 文件(未测试)。
现代内核还支持使用 cpio 文件(initramfs),这样制作更简便,将所有文件拷贝到一个目录下,打包 cpio 文件即可。

mkdir initrd
rsync -rtpLOi /bin/busybox -R initrd/
ln -sf /bin/busybox -T initrd/bin/sh
echo $'#!/bin/sh\n/bin/sh' > initrd/init
chmod +x initrd/init
( cd initrd && find . | cpio -o -H newc --file ../initrd.cpio )
  • 注意:上述示例特意编写 /init 脚本执行 sh,避免 busybox 直接作为 init 执行,便于检查执行 initrd 时的原始状态。

同时清空 sda 系统盘,避免干扰:

mkfs.ext4 sda.raw -F

启动虚拟机:

qemu-system-x86_64 -enable-kvm -cpu host -smp 1 -m 1G -drive file=sda.raw,format=raw \
-kernel ./vmlinuz -initrd ./initrd.cpio -append "root=/dev/sda

结果如下:

20-qemu-initrd-sh.png

  • initrd 被挂载为 rootfs,这是一个可读写的内存盘。
  • busybox sh 报 tty 无法访问,应该是因为 dev 未正确挂载(自动产生了一个 /dev/console 文件)(?)。

手动制作简单系统维护环境,只需要挂载好相关目录,使用 busybox 作为 init 即可。

使用 initramfs-tools

ubuntu 下使用 initramfs-tools 维护系统 initrd (initramfs) 文件,也可以制作自定义 initrd 文件。
参考 man initramfs-tools

  • mkinitramfs,制作 initrd 文件。
  • lsinitramfs,查看 initrd 文件内容。
  • update-initramfs,更新系统 initrd 文件。

拷贝系统 initramfs 配置,可修改制作自定义 initrd 文件而不影响系统配置。

rsync -ai /etc/initramfs-tools/ initramfs/
mkinitramfs -d initramfs/ -o initrd.img

制作的 initrd 文件默认逻辑为挂载根文件系统并启动系统(即执行根文件系统上的 init)。
可配置包含的内核模块和网络启动参数等,详情参考 man initramfs.conf 和默认 initramfs.conf 文件内容。

使用 initrd 启动目标系统

准备一个空根文件系统,创建相关系统目录,同样拷贝 busybox 测试:

mkfs.xfs -f sda.raw
sudo mount -o loop sda.raw /mnt/
( cd /mnt/ && sudo mkdir dev/ proc/ sys/ etc/ tmp/ var/ run/ -p && sudo chmod 1777 tmp/ )
sudo rsync -rtpLOi /bin/busybox -R /mnt/
sudo ln -s /bin/busybox /mnt/bin/sh
sudo umount /mnt/

尝试启动虚拟机:

qemu-system-x86_64 -enable-kvm -cpu host -smp 1 -m 1G -drive file=sda.raw,format=raw \
-kernel ./vmlinuz -initrd ./initrd.img -append "root=/dev/sda init=/bin/sh console=ttyS0" -nographic
  • qemu 参数 -nographic, 不使用图形界面,这时虚拟机串口重定向到控制台。
    这非常方便我们在纯命令行下使用虚拟机,非常方便在控制台查看内核启动时的输出。
>-nographic

>Normally, QEMU uses SDL to display the VGA output. 

With this option, you can totally disable graphical output so that QEMU is a simple command line application.
The emulated serial port is redirected on the console and muxed with the monitor (unless redirected elsewhere explicitly).
Therefore, you can still use QEMU to debug a Linux kernel with a serial console.
Use C-a h for help on switching between the console and monitor.

  • 内核参数 console=ttyS0 设置使用串口作为控制台,最终输出到执行 qemu 命令的控制台。

运行结果如下:

BusyBox v1.22.1 (Ubuntu 1:1.22.0-15ubuntu1) built-in shell (ash)
Enter 'help' for a list of built-in commands.

/bin/sh: can't access tty; job control turned off
/ # tty
/dev/console
/ # ls -l /dev/console /dev/ttyS0
crw-------    1 0        0           5,   1 Mar 21 16:14 /dev/console
crw-------    1 0        0           4,  64 Mar 21 16:13 /dev/ttyS0
/ # ls -l /proc/$$/fd/
total 0
lrwx------    1 0        0               64 Mar 21 16:14 0 -> /dev/console
lrwx------    1 0        0               64 Mar 21 16:14 1 -> /dev/console
lrwx------    1 0        0               64 Mar 21 16:14 2 -> /dev/console

/ # mount
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
udev on /dev type devtmpfs (rw,nosuid,relatime,size=487028k,nr_inodes=121757,mode=755)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,noexec,relatime,size=101596k,mode=755)
/dev/sda on / type xfs (ro,relatime,attr2,inode64,noquota)
  • 相关系统目录都已经正确挂载了,busybox sh 依然报 can't access tty,相关命令可以正常使用。
  • 默认支持 xfs 文件系统(因为本机安装了 xfs 软件包?),根文件系统默认挂载为只读 (ro) 模式(?),添加内核参数 rw 可指定为可写模式。

initramfs-tools 可以非常简便的定制和创建可以启动系统的 initrd 文件,其自动处理了挂载系统目录,pivot_root 等相关事宜。

如何方便的创建可以独立运行的 initrd 文件(如 ubuntu 网络安装程序)呢?

友好排版可 阅读原文

阿泉别冲动
目录
相关文章
菊头蝙蝠
|
23天前
|
缓存 网络协议 Linux
Linux C/C++ 开发(学习笔记十三):百万并发的服务器实现
Linux C/C++ 开发(学习笔记十三):百万并发的服务器实现
菊头蝙蝠
70 0
菊头蝙蝠
|
23天前
|
网络协议 Linux C++
Linux C/C++ 开发(学习笔记十二 ):TCP服务器(并发网络编程io多路复用epoll)
Linux C/C++ 开发(学习笔记十二 ):TCP服务器(并发网络编程io多路复用epoll)
菊头蝙蝠
70 0
菊头蝙蝠
|
23天前
|
网络协议 Linux C++
Linux C/C++ 开发(学习笔记十一 ):TCP服务器(并发网络网络编程 一请求一线程)
Linux C/C++ 开发(学习笔记十一 ):TCP服务器(并发网络网络编程 一请求一线程)
菊头蝙蝠
49 0
懒时小窝
|
23天前
|
缓存 Unix Linux
Linux学习笔记
Linux学习笔记
懒时小窝
258 0
阿萨聊测试
|
23天前
|
缓存 监控 Linux
Linux 学习笔记十九:常见监控工具
Linux 学习笔记十九:常见监控工具
阿萨聊测试
36 0
Linux 学习笔记十九:常见监控工具
阿萨聊测试
|
23天前
|
安全 Linux 数据安全/隐私保护
Linux 学习笔记十八:SELinux 相关概念
Linux 学习笔记十八:SELinux 相关概念
阿萨聊测试
34 0
阿萨聊测试
|
23天前
|
Linux 开发工具 索引
Linux 学习笔记索引
Linux 学习笔记索引
阿萨聊测试
39 0
阿萨聊测试
|
23天前
|
小程序 Linux 数据安全/隐私保护
Linux学习笔记十六:日志管理
Linux学习笔记十六:日志管理
阿萨聊测试
31 0
阿萨聊测试
|
23天前
|
存储 Linux 数据库
Linux学习笔记十三: 数据备份与恢复
Linux学习笔记十三: 数据备份与恢复
阿萨聊测试
37 0
阿萨聊测试
|
23天前
|
监控 Linux
Linux学习笔记十二:Linux 工作管理
Linux学习笔记十二:Linux 工作管理
阿萨聊测试
31 0
Linux学习笔记十二:Linux 工作管理

热门文章

最新文章

  • 1
    Linux块层技术全面剖析-v0.1
  • 2
    Linux系统下安装jdk17&jdk8安装
  • 3
    linux根目录下的文件解析
  • 4
    配置Linux—LVS (DR)
  • 5
    企业生产环境下不同业务的linux分区建议
  • 6
    linux命令——mv
  • 7
    两大物联网标准组织殊途同归:依赖Linux基金会
  • 8
    Linux shell中的I/O重定向相关(转)
  • 9
    TCP/TP编程 - 一个简单的Linux下C写的socket服务器客户端程序
  • 10
    unix/linux "数据的对齐" "指针的对齐" .
  • 1
    Linux中认识路径的概念
    12
  • 2
    Linux创建空白文件
    11
  • 3
    通过Linux挂载Windows端NFS服务实现板端Linux传输文件到PC
    166
  • 4
    Linux实现socket网络通信
    21
  • 5
    Linux安装HBase的详细教程及常用方法
    199
  • 6
    Linux系统之rename命令的基本使用
    154
  • 7
    Linux系统之file命令的基本使用
    49
  • 8
    Linux 常用命令汇总(四):信息显示 & 用户管理
    35
  • 9
    【Linux】—— 信号的基本介绍(一)
    40
  • 10
    【Linux】—— 详解动态库和静态库
    130
  • 相关课程

    更多
  • Linux高级网络应用 - 网络管理与配置实战
  • 计算机基础与Linux入门
  • Linux基本命令
  • Linux企业运维实战 - 入门及常用命令
  • Linux Shell 编程入门与实战
  • Linux网络进阶 - TCP/IP协议及OSI七层模型
  • 相关电子书

    更多
  • Alibaba Cloud Linux 3 发布
  • ECS系统指南之Linux系统诊断
  • ECS运维指南 之 Linux系统诊断
  • 相关实验场景

    更多
  • 使用计算巢企业应用,一键获取专属的Linux服务器管理软件
  • Alibaba Cloud Linux操作系统的安装及使用
  • Alibaba Cloud Linux操作系统Shell程序
  • 手动部署MySQL数据库(Alibaba Cloud Linux 2)
  • 部署并使用Docker(Alibaba Cloud Linux 3)
  • 部署并使用Docker(Alibaba Cloud Linux 2)
  • 推荐镜像

    更多
  • mxlinux-iso
  • archlinuxarm
  • archlinuxcn
  • 下一篇
    2024年阿里云免费云服务器及学生云服务器申请教程参考

    深圳SEO优化公司东莞外贸网站设计哪家好拉萨百度关键词包年推广报价宿迁关键词排名包年推广价格许昌设计公司网站哪家好株洲关键词按天收费公司泉州优化价格泰州百度竞价包年推广价格阜新百姓网标王推荐郑州SEO按天计费报价济宁网站制作设计报价新余网站优化按天收费价格雅安百搜标王价格龙华网站设计模板推荐中卫网站搭建哪家好和县网站优化软件推荐和县网站搜索优化公司九江网站优化推广报价果洛网站建设设计价格四平推广网站多少钱永新网站优化推荐长治网站优化按天收费林芝网站优化推广推荐铜陵网站推广推荐安顺网页制作哪家好赤峰营销型网站建设公司新余百姓网标王推广报价南山百度seo报价武汉网站推广方案哪家好无锡网络广告推广哪家好横岗网站设计哪家好歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

    深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化