万字详文干货:从无盘启动volumio看Linux启动原理( 五 )
- 加载网卡内核驱动
- 启动网络
- 启动 iscsi 客户端挂载网络磁盘 。
mount -o loop,offset=1048576 ./wrt/Build/Volumio2.799-2020-09-29-x86.img ./vboot/ //挂载img镜像的boot分区到目录
cp ../vboot/volumio.initrd volumio.initrd.gz //拷贝initrd文件 , 重命名一下
gunzip ./volumio.initrd.gz //解压gz文件
cpio -ivmd < volumio.initrd //展开initrd文件 , 在当前目录就可以看到整个rom disk的内容了
vim init //编辑init shell
find . | cpio -c -o > ../volumio.initrd.img //重新打包成新的initrd
gzip volumio.initrd.img
mv volumio.initrd.img.gz volumio.initrd
还有另外一种方案 , 由于 volumio 是开源项目 , 编译 volumio 的脚本在 github 开源 。 我可以编辑编译脚本 , 直接修改 init 之后编译成新的 initrd 文件 。
git clone
ls -la scripts/initramfs/init-x86
ls -la scripts/x86config.sh
- x86config.sh 这是编译生成 x86 版本 volumio 镜像的脚本 , 在这个文件中 , 我们需要添加命令 , 使得生成的 initrd 文件中包含 iscsi 客户端
- init-x86 这个文件是 initrd 文件在系统启动后 , 需要执行的 init shell 脚本 。 这里我们需要添加 网卡驱动、初始化 iscsi 客户端 。
文章插图
之后处理 init-x86 , 在 118 行左右的位置 , 脚本读取了配置在/proc/cmdline 中的根目录 uuid 并在之后挂载磁盘 。 这里的 cmdline 就是之前说到的在 syslinux 阶段向内核传递的参数 。 所以我们要在挂载磁盘前加载网卡驱动、启动网络、启动 iscsi 客户端、挂载 iscsi 磁盘 。
文章插图
修改如下图:
- 103 行 加载网卡驱动
- 104 行 加载 iscsi 内核模块
- 105 行 加载 iscsi ibft 模块
- 107-108 行 通过 ibft 配置网络
- 114-116 行 使用 ibft 配置连接 iscsi 服务器并挂载磁盘
文章插图
这里要说一下 ibft 这是一种将 iscsi 配置信息传递到系统的方式 , 我们在 iPxe 阶段已经配置网络信息、iscsi 服务器地址、iscsi target 等信息了 , 这里可以使用 ibft 直接读取并使用 。 当然你也可以在这里再次手动启用 DHCP , 手动初始化 iscsi 客户端 。
修改完成后 , iscsi 磁盘就可以像正常本地磁盘一样被挂载 , 之后的操作就和正常硬盘安装一样了 , 正常启动进入 volumio 系统 。
6. init 进程内核引导阶段完成以后 , 系统会挂载真实的 root 分区 , 执行/sbin/init 程序初始化系统环境 。 这一阶段已经和是否网络启动没有关系了 , 不过启动原理都研究到现在了就顺便一起看一下吧 。
/sbin/init 会首先确定运行级别 , 这个配置在/etc/inittab 中 , 一般 Linux 有 7 种运行级别(0-6) 。 一般来说 , 0 是关机 , 1 是单用户模式(也就是维护模式) , 6 是重启 。 运行级别 2-5 , 各个发行版不太一样 , 对于 Debian 来说 , 都是同样的多用户模式(也就是正常模式) 。 确定运行级别后会访问/etc/rcN.d(这里的 N 就是运行级别) 。
文章插图
这里的文件都采用“字母 S 或 K+两位数字+程序名”的命名方式 。 其中 S 开头的表示在这个级别需要执行 start 命令 , K 开头需要执行 Stop 命令 , 数字越小越优先执行 。 系统会依次执行相应的软件和服务 , 负责用户界面的程序也被启动你就有了 X11 界面 , 然后是 SSH 服务你就可以使用 ssh 登录 。 这样系统就完成了启动 。
当然啦现在这种方式已经过时了 , 目前基本使用 systemd 方式用 systemctl 命令管理 。 篇幅已经很长了 , 这块有兴趣的同学自己搜索一下 。
7. 尾巴7.1 其他遇到的问题syslinux 卡死这个问题前面说到了 , 挂载 iscsi 磁盘后 ipxe 交棒磁盘引导 , 但是就卡死了 。
经过很多的 google 和尝试之后最终发现 , 我使用了 64 位的 iPxe 引导固件 , 但是 syslinux 只有 32 位版本导致卡死 , 更换了 32 位的 iPxe 固件后解决 。
可以启动无法关闭这个问题困扰了我很久 , 系统可以正常启动 , 但是在关机或者重启时会死机 , 按键没有任何反应但是系统应该还是活的(大小写灯正常切换)只能强制关机退出 。 经过排查原因可能是:关机时网络服务会关闭导致网卡关闭 , 进而导致 iscsi 网盘断开 。 但是此时系统根分区还没有 umount 导致系统无响应 。
- AI芯片“点燃”北京!GTIC 2020 AI芯片创新峰会大咖演讲全干货
- 小店|抖音小店无货源模式,干货来了,抖音小店店群怎么做?
- GPU|干货|基于 CPU 的深度学习推理部署优化实践
- 干货:阿里巴巴提升组织能力的5大经典管理工具
- 搞定2020年路由器选购,家庭组网干货攻略
- 互联网创业思维:什么是真正的干货?你是怎么给“干货”下定义的
- 直播链接激情预告!GTIC 2020 AI芯片创新峰会明日见,18位产学研大牛干货满满
- 吸引流量模型分解|干货| 以对应亲密关系中
- 裂变活动|微信群裂变实操指南,史上最全干货
- 六大|B站六大能学到知识的UP主!纯干货分享,B站真的能用来学习!