Debian From Scratch 文件系统配置全流程
一 目标与总体思路
- 在宿主机上用 debootstrap 拉取并初始化一个最小 Debian 根文件系统,跨架构时使用 qemu-user-static 在 chroot 中完成配置,最后按用途导出为 rootfs.tar 或 rootfs.img 镜像。
- 关键关注点:目录结构遵循 FHS,根分区必须包含 /etc、/bin、/sbin、/lib、/dev;合理规划 /usr、/var、/home 等目录的容量与挂载方式。
二 环境与工具准备
- 安装构建工具与 binfmt 支持(跨架构必需):
- sudo apt update && sudo apt install -y debootstrap qemu-user-static binfmt-support
- 选择发行版与架构(示例):
- 发行版代号:bookworm(12)、bullseye(11)、buster(10)
- 架构:amd64、arm64、armhf、armel、riscv64 等
- 可用脚本查看:ls /usr/share/debootstrap/scripts;镜像源可替换为国内镜像(如 mirrors.tuna.tsinghua.edu.cn、mirrors.ustc.edu.cn)。
三 构建与初始化根文件系统
-
- 拉取基础系统(二阶段)
- 示例(amd64):sudo debootstrap --foreign --verbose --arch=amd64 bookworm rootfs http://mirrors.tuna.tsinghua.edu.cn/debian/
- 示例(arm64):sudo debootstrap --foreign --verbose --arch=arm64 bookworm rootfs http://mirrors.tuna.tsinghua.edu.cn/debian/
-
- 拷贝 qemu 静态二进制以在 chroot 中运行目标架构
- amd64 主机构建 arm64:sudo cp /usr/bin/qemu-aarch64-static rootfs/usr/bin/
- amd64 主机构建 armhf:sudo cp /usr/bin/qemu-arm-static rootfs/usr/bin/
-
- 二阶段完成初始化
- sudo chroot rootfs /debootstrap/debootstrap --second-stage
-
- chroot 内基础配置
- 设置密码与用户:passwd root;useradd -m -G sudo -s /bin/bash user;passwd user
- 主机名与 hosts:echo debian12 > /etc/hostname;sed -i ‘s/localhost/\0\tdebian12/g’ /etc/hosts
- 时区:ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
- 源列表:编辑 /etc/apt/sources.list(使用国内镜像),执行 apt update
- 常用包:apt install -y vim curl wget openssh-server locales sudo
- 可选图形:tasksel 选择桌面环境(如 xfce、gnome 等)
-
- 清理与退出
- apt clean;history -c;exit
- 删除 qemu 静态二进制:rm rootfs/usr/bin/qemu-*-static
- 注:若构建 riscv64 等非官方主分支,可能需要 debian-ports-archive-keyring 并配置 sid/ports 源后再 apt update。
四 文件系统关键配置
-
- 目录结构与 FHS
- 必须位于根分区的关键目录:/etc、/bin、/sbin、/lib、/dev
- 常用目录用途:/usr(用户程序与库)、/var(日志与缓存)、/home(用户数据)、/tmp(临时文件)、/proc、/sys(虚拟文件系统)、/media、/mnt(挂载点)
-
- 挂载与 fstab
- 在 chroot 内准备基本挂载:
- mount -t proc proc /proc
- mount -t sysfs sys /sys
- mount -o bind /dev /dev
- mount -o bind /dev/pts /dev/pts
- 示例 /etc/fstab(按实际分区调整):
- proc /proc proc defaults 0 0
- sysfs /sys sysfs defaults 0 0
- /dev/mmcblk0p2 / ext4 defaults,noatime 0 1
- /dev/mmcblk0p1 /boot vfat defaults 0 2
-
- 网络配置
- 有线 DHCP(/etc/network/interfaces.d/eth0):
- auto eth0
- iface eth0 inet dhcp
- Wi‑Fi(示例,使用 wpa_supplicant 与 udhcpc):
- 安装:apt install -y wpasupplicant wireless-tools udhcpc
- /etc/wpa_supplicant/wpa_supplicant.conf(示例):
- ctrl_interface=/var/run/wpa_supplicant
- network={
- ssid=“YOUR_SSID”
- psk=“YOUR_PASS”
- }
- 连接与取址:wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf && udhcpc -i wlan0
-
- SSH 服务
- 安装:apt install -y openssh-server
- 允许 root 登录(可选):编辑 /etc/ssh/sshd_config,设置 PermitRootLogin yes,并 systemctl enable --now ssh。
五 导出镜像与烧录验证
-
- 导出为 tar 包(便于移植与解压到分区)
- 退出 chroot 后清理挂载:umount -R rootfs/dev/pts rootfs/dev rootfs/sys rootfs/proc
- 打包:cd rootfs && sudo tar cvf …/rootfs.tar .(或 tar czf …/rootfs.tar.gz .)
-
- 导出为 ext4 镜像(便于烧录到整盘或分区)
- 创建镜像:dd if=/dev/zero of=rootfs.img bs=1M count=1024(示例 1GB)
- 格式化:mkfs.ext4 rootfs.img
- 挂载并拷贝:mkdir tmp && sudo mount rootfs.img tmp && sudo cp -a rootfs/* tmp/ && sudo umount tmp
- 检查与收缩:e2fsck -p -f rootfs.img;resize2fs -M rootfs.img
-
- 烧录与启动
- SD/EMMC:使用 dd 将 rootfs.img 写入目标分区(如 /dev/mmcblk0pX),或解压 rootfs.tar 到已挂载的根分区
- QEMU 测试:qemu-system-架构 -kernel vmlinuz -initrd initrd.img -append “root=/dev/sda2 rootfstype=ext4” -nographic
- 启动后验证:ls /, mount, systemctl status ssh, ip a。