调试阿尔派的启动过程

正如我在 上一篇文章, 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 sysinit

rc_add hwclock boot
rc_add modules boot
rc_add sysctl boot
rc_add hostname boot
rc_add bootmisc boot
rc_add syslog boot

rc_add mount-ro shutdown
rc_add killprocs shutdown
rc_add savecache shutdown

rc_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文件以了解更多细节。

 

参考文献。

 

我们是被雇佣的

如果你想解决你的Alpine Linux问题,并希望咨询 我们是被雇佣的.