调试阿尔派的启动过程
正如我在 上一篇文章, Alpine Linux在启动时要经过几个阶段。
在挂载启动媒体并扫描apkovl后(用nlplug-findfs),有一个选项让你获得一个控制台,将$SINGLEMODE设置为yes。
将SINGLEMODE设置为是很容易。 你只需添加""字样。单"到cmdline.txt中 (如果在Raspberry Pi上)/你的内核参数(如果不在Raspberry Pi上)。
模块=loop,squashfs,sd-mod,usb-storage 单 noquiet dwc_otg.lpm_enable=0 console=tty1
注意,我还在quiet这个词前加上了no,以有效地禁用它--在启动时你会得到更多的输出。(注:这实际上是在init脚本中定义的方式。)
一旦你启动,这将使你进入一个shell会话(使用ash,busybox的内置shell)。
注意:如果你设置了root kernel参数,以指定一个根文件系统来启动,你的控制台就会被挂载到 之前 根分区被挂载 - 可能是为了让你自己能更好地调试它。
这种单一模式对于尝试启动配置和调试启动问题非常有用,并且可以试验系统和它的功能(这些功能来自于 完全是 从initramfs和kernel)。
不能访问tty的错误
启用单人模式时,会出现以下错误。
sh: 不能访问tty: 工作控制已关闭
这似乎与sh的能力有关,以及如何执行--没有必要惊慌。
USB键盘不工作
起初,USB键盘对我来说不起作用;我不确定这是什么原因。经过几次电源循环,它开始工作。也许它不能通过KVM切换进来。
无论如何,继续尝试,应该可以成功。试着在sh警告出现时立即打字 ...
在Pi 3B+上,键盘不起作用;它只在Pi 3A+上起作用。我怀疑这是因为Pi 3B+上有额外的内部USB Hub - 请尝试使用Pi 3A+在单一模式下进行调试。(我知道,对于网络设置来说并不理想)。
有没有一种更短的方法来激活单人模式?我很懒
这些是你的选择。
s|single|1
所以你应该能够通过在cmdline.txt中添加 "s "或"1 "来进入单人模式。我没有测试过。
我怎样才能退出单模?
类型
退出
单一模式检查后会发生什么?
我们的答案是指 只有 到Alpine Linux的RAM("无盘")启动模式。
以下操作只在单模式检查后进行,所以如果你想的话,你必须手动运行它们。
- 一个临时文件被挂载到/sysroot($sysroot)。
- apkovl的位置已经设置好了--默认情况下,如果你没有指定apkovl的内核参数,nlplug-findfs会尝试在你的启动媒体上为你找到它。
- 正如前面所讨论的,你也可以选择通过http等方式获得它。
- pkgs内核参数被解析 - 你可以在这里指定额外的软件包,系统应该安装这些软件包。
- 这个参数在与alpine_repo的合作中非常有用--允许你向Alpine注入额外的软件包。
- apkovl已被解包
- 如果文件/sysroot/etc/.default_boot_services存在,或者apkovl的位置不是文件,那么默认的启动服务将被设置,并且该文件将被删除(所以当你做lbu提交时,它将不会被持续保存在apkovl中)。
if [ -f "$sysroot/etc/.default_boot_services" -o ! -f "$ovl"]; then
#默认添加一些启动服务
rc_add devfs sysinit
rc_add dmesg sysinit
rc_add mdev sysinit
rc_add hwdrivers sysinit
rc_add modloop sysinitrc_add hwclock boot
rc_add modules boot
rc_add sysctl boot
rc_add hostname boot
rc_add bootmisc boot
rc_add syslog bootrc_add mount-ro shutdown
rc_add killprocs shutdown
rc_add savecache shutdownrc_add firstboot default
rm -f "$sysroot/etc/.default_boot_services"
斐济
- 运行用于执行闪屏的代码
- 检查/sysroot/etc/fstab是否存在,并有条件地执行relocate_mount。
- alpine-base总是包含在将要安装的软件包中。
- apk已准备好
- 可选择配置网络,以便apk能够通过网络拉动软件包。
- 它也被告知软件包正在以-initramfs-diskless-boot模式安装,并被告知显示-progress
- 如果设置了安静,则告诉apk要保持-安静
- 包被安装到根文件系统
- 如果给出了内核选项ssh_key,openssh将被添加到软件包中,并作为一项服务。
- 请注意,你仍然需要传递密钥--这将通过apkovl中的一个文件或其他方法实现。
- 因此,如果你关闭了ssh,又想恢复它的话,ssh_key这个选项可能是一种退路。
- 最后,root被切换到新的系统中,该系统是由软件包和apkovl构建的。
注意,如果有人想知道keep_apk_new这个内核参数应该做什么。
如果 [ "$KOPT_keep_apk_new" != yes ]; 则
apkflags="$apkflags -clean-protected"
[-n "$ovlfiles" ] && apkflags="$apkflags -overlay-from-stdin"
斐济
请参考initramfs中的init文件以了解更多细节。
参考文献。
- https://ss64.com/bash/test.html 更好地理解init文件的有用页面(用ash/bash编写脚本)。
我们是被雇佣的
如果你想解决你的Alpine Linux问题,并希望咨询 我们是被雇佣的.