温馨提示×

怎样调试ubuntu fromscratch

小樊
55
2026-09-04 14:15:38
栏目: 智能运维

“Ubuntu From Scratch”(UFS)通常指从零开始构建自己的 Ubuntu 风格系统(类似 LFS,但面向 Ubuntu/Debian 生态),或者是某些教程/项目中“从空根文件系统开始定制 Ubuntu”。调试这类系统比普通 Ubuntu 复杂,因为没有现成环境可依赖。

下面按阶段给你一套实用的调试思路和方法。


一、构建阶段常见调试方法

1. 开启详细日志

在脚本中加入:

set -x

或在运行构建脚本时:

bash -x build.sh

可看到每一步执行的命令。

2. 分步骤执行,不要一次性跑完

把流程拆成:

  • 准备工具链
  • 构建根文件系统
  • 安装内核
  • 配置 bootloader

每步结束后检查:

echo $?
ls -l /mnt/rootfs

3. 使用 chroot 提前验证

构建根文件系统后,尽早测试:

mount --bind /dev /mnt/rootfs/dev
chroot /mnt/rootfs /bin/bash

如果 chroot 失败,说明:

  • 动态链接器不对
  • 架构不匹配
  • 关键库缺失

二、启动失败时的调试

1. 使用串口调试(强烈推荐)

在 GRUB 中启用串口:

serial --unit=0 --speed=115200
terminal_input serial
terminal_output serial

内核参数加:

console=ttyS0,115200

可以看到最早的内核日志。


2. 使用 QEMU 调试(不用真实机)

qemu-system-x86_64 \
  -m 2048 \
  -kernel /boot/vmlinuz \
  -initrd /boot/initrd.img \
  -append "root=/dev/sda1 console=ttyS0"

可快速验证系统是否能启动。


3. Init 阶段崩溃

常见原因:

  • /sbin/init 不存在或不可执行
  • libc 不匹配
  • /etc/inittab 或 systemd 配置错误

调试方法:

  • 临时使用 init=/bin/bash
init=/bin/bash

若能进 shell,说明内核 OK,问题在 init 系统。


三、根文件系统调试技巧

1. 检查依赖库

ldd /mnt/rootfs/bin/bash

缺哪一个就补哪一个。

2. 使用 busybox 做最小救援系统

在根文件系统中放:

/bin/busybox

并创建软链接:

ln -s busybox sh

即使 systemd 挂了也能进系统。


四、内核与模块调试

1. 查看内核是否支持必要特性

zcat /proc/config.gz | grep CONFIG_*

或:

grep CONFIG_DEVTMPFS /boot/config-$(uname -r)

2. 模块未加载

手动测试:

modprobe ext4

如果失败,说明:

  • 模块未放入 rootfs
  • initrd 未包含模块

五、调试工具推荐

工具 用途
strace 看系统调用卡在哪
lsof 看文件/设备占用
dmesg 内核日志
journalctl systemd 日志
busybox 最小救援
qemu 快速验证

六、常见坑总结

  • 架构不一致(x86_64 vs aarch64)
  • 忘了 ld-linux 动态链接器
  • initrd 没包含根文件系统驱动
  • /etc/fstab 写错
  • systemd 版本与 glibc 不兼容
  • 忘了 passwd root

七、如果你愿意,我可以进一步帮你

你可以告诉我:

  1. 你是 UFS / LFS / 自定义 Ubuntu rootfs 哪一种?
  2. 卡在 构建 / 启动 / 登录 哪个阶段?
  3. 是否有 报错信息或截图?

我可以直接帮你定位问题。

0 踩