“Ubuntu From Scratch”(UFS)通常指从零开始构建自己的 Ubuntu 风格系统(类似 LFS,但面向 Ubuntu/Debian 生态),或者是某些教程/项目中“从空根文件系统开始定制 Ubuntu”。调试这类系统比普通 Ubuntu 复杂,因为没有现成环境可依赖。
下面按阶段给你一套实用的调试思路和方法。
在脚本中加入:
set -x
或在运行构建脚本时:
bash -x build.sh
可看到每一步执行的命令。
把流程拆成:
每步结束后检查:
echo $?
ls -l /mnt/rootfs
构建根文件系统后,尽早测试:
mount --bind /dev /mnt/rootfs/dev
chroot /mnt/rootfs /bin/bash
如果 chroot 失败,说明:
在 GRUB 中启用串口:
serial --unit=0 --speed=115200
terminal_input serial
terminal_output serial
内核参数加:
console=ttyS0,115200
可以看到最早的内核日志。
qemu-system-x86_64 \
-m 2048 \
-kernel /boot/vmlinuz \
-initrd /boot/initrd.img \
-append "root=/dev/sda1 console=ttyS0"
可快速验证系统是否能启动。
常见原因:
/sbin/init 不存在或不可执行libc 不匹配/etc/inittab 或 systemd 配置错误调试方法:
init=/bin/bashinit=/bin/bash
若能进 shell,说明内核 OK,问题在 init 系统。
ldd /mnt/rootfs/bin/bash
缺哪一个就补哪一个。
在根文件系统中放:
/bin/busybox
并创建软链接:
ln -s busybox sh
即使 systemd 挂了也能进系统。
zcat /proc/config.gz | grep CONFIG_*
或:
grep CONFIG_DEVTMPFS /boot/config-$(uname -r)
手动测试:
modprobe ext4
如果失败,说明:
| 工具 | 用途 |
|---|---|
strace |
看系统调用卡在哪 |
lsof |
看文件/设备占用 |
dmesg |
内核日志 |
journalctl |
systemd 日志 |
busybox |
最小救援 |
qemu |
快速验证 |
ld-linux 动态链接器/etc/fstab 写错passwd root你可以告诉我:
我可以直接帮你定位问题。