Debian构建根文件系统


Debian 不像 Ubuntu 提供 Ubuntu-Base 那样提供打包好的 rootfs, 而是提供了一个制作 rootfs 的工具 debootstrap. 下面介绍使用在 amd64 环境中使用 debootstrap 制作 aarch64/arm64 Debian rootfs 的过程.

环境:

Distributor ID: Debian
Description:    Debian GNU/Linux 12 (bookworm)
Release:        12
Codename:       bookworm

工具:

sudo apt update
sudo apt install apt-transport-https qemu qemu-user-static qemu-system-arm binfmt-support debootstrap qemu-user-static debootstrap 

qemu-system-arm 用于模拟arm架构的设备,在此平台上进行debian系统的运行演示

debootstrap 构建debian基本文件子系统的工具

qemu-user-static 用于模拟arm运行环境

创建目标文件系统目录或镜像文件

根据需求选择以下两种方式之一:

方式 1:直接使用目录

sudo mkdir -p /mnt/rootfs

方式 2:创建镜像文件并挂载

dd if=/dev/zero of=debian-rootfs.img bs=1M count=2048 status=progress
mkfs.ext4 debian-rootfs.img
sudo mkdir -p /mnt/rootfs
sudo mount -o loop debian-rootfs.img /mnt/rootfs

使用 debootstrap 创建基础系统

运行 qemu-debootstrap ,生成最小化的 Debian ARM64 系统:

sudo qemu-debootstrap --arch=arm64 --variant=minbase --foreign bullseye /mnt/rootfs https://mirrors.ustc.edu.cn/debian

-–arch:指定目标架构为 arm64

-–foreign :用于第一阶段的引导,构建基本文件系统

—bullseye:Debian 11 的代号。如果需要其他版本,可以替换为 bookworm(Debian 12)或其他版本。

/mnt/rootfs:指定存放下载内容的目录

http://mirrors.ustc.edu.cn/debian :使用中科大镜像源加速下载

-–variant 说明: minbase: 只包含必要的包和apt

buildd: 包含编译工具包

fakechroot: 包含不用root权限的包

scratchbox: 包含scratchbox(交叉编译工具链)相关包

注意:这里一定要使用qemu-debootstrap构建,使用debootstrap指定arm64架构仍会构建amd64架构的文件系统。

完成后,复制 QEMU 静态二进制文件到目标文件系统中:

sudo cp /usr/bin/qemu-aarch64-static /mnt/rootfs/usr/bin/

进入 chroot 环境并完成第二阶段

挂载本地设备文件到rootfs

sudo mount --bind /dev /mnt/rootfs/dev
sudo mount --bind /proc /mnt/rootfs/proc
sudo mount --bind /sys /mnt/rootfs/sys
sudo mount -t devpts devpts /mnt/rootfs/dev/pts

进入 chroot 环境:

sudo chroot /mnt/rootfs /bin/bash

运行以下命令以确认当前环境是 ARM64 架构:

dpkg --print-architecture

如果输出不是 arm64,说明之前的步骤可能有问题,请检查是否正确指定了架构(--arch=arm64)以及是否复制了正确的 QEMU 静态二进制文件。

执行二阶段下载:

/debootstrap/debootstrap --second-stage

等待几分钟后,终端输出“I: Base system installed successfully.”即为系统下载完成。

配置环境

设置语言和时区

chroot 环境中,设置语言和时区:

echo "en_US.UTF-8 UTF-8" > /etc/locale.gen
locale-gen
update-locale LANG=en_US.UTF-8

ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
dpkg-reconfigure --frontend noninteractive tzdata

换源

默认的 Debian 源可能较慢,建议切换为国内镜像源(如中科大源):

sed -i 's#http://deb.debian.org#http://mirrors.ustc.edu.cn#g' /etc/apt/sources.list
sed -i 's#http://security.debian.org#http://mirrors.ustc.edu.cn/debian-security#g' /etc/apt/sources.list

更新软件包列表:

apt update && apt upgrade -y

安装必要工具

安装常用的工具和组件:

apt install -y rsyslog udev dbus kmod openssh-server openssh-client netplan.io man vim wget net-tools sysstat tmux less wireless-regdb wireless-tools ethtool crda dosfstools parted sudo git iputils-ping systemd ifupdown htop wpasupplicant

如果需要编译工具链,可以安装 GCC 和 G++:

apt install -y gcc g++

配置 SSH 允许 root 登录:

echo 'PermitRootLogin yes' >> /etc/ssh/sshd_config

配置网络信息

静态 IP 配置

创建 Netplan 配置文件 /etc/netplan/50-cloud-init.yaml

cat > /etc/netplan/50-cloud-init.yaml <<EOF
network:
ethernets:
eth0:
dhcp4: no
addresses: [192.168.1.6/24]
gateway4: 192.168.168.1
nameservers:
addresses: [192.168.168.1]
version: 2
EOF

应用配置:

netplan apply

DHCP 配置

如果需要动态获取 IP 地址,可以使用以下配置:

cat > /etc/netplan/50-cloud-init.yaml <<EOF
network:
ethernets:
eth0:
dhcp4: yes
version: 2
EOF

同样应用配置:

netplan apply

配置系统信息

设置主机名和 hosts 文件:

echo 'Debian10' > /etc/hostname
echo "127.0.0.1 localhost" > /etc/hosts
echo "127.0.0.1 Debian10" >> /etc/hosts

配置系统挂载磁盘

编辑 /etc/fstab 文件,添加以下内容:

vim /etc/fstab  
#添加以下内容  
# UNCONFIGURED FSTAB FOR BASE SYSTEM  
proc  /proc proc defaults 0 0  
sysfs /sys sysfs defaults 0 0

配置 Swap 分区(可选)

如果需要启用 Swap 分区,可以按照以下步骤操作:

dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progress # 创建 2GB 的交换空间
chmod 600 /swapfile # 设置正确的权限
mkswap /swapfile # 格式化 swap 文件
swapon /swapfile # 启用 swap 文件
echo '/swapfile none swap defaults 0 0' >> /etc/fstab # 添加到 fstab

如果需要关闭 Swap 分区,可以执行以下命令:

swapoff /swapfile
rm /swapfile
sed -i '/\/swapfile none swap defaults 0 0/d' /etc/fstab

添加用户

创建普通用户并设置密码:

useradd -m yourusername -g sudo -s /bin/bash -d /home/yourusername
# 设置密码,取消挂载,退出chroot
passwd yourusername

设置 root 用户密码:

passwd root

优化空间

删除不必要的文件以节省空间:

rm -rf /usr/share/doc/*
rm -rf /usr/share/man/*
rm -rf /usr/share/locale/*

测试镜像文件

退出 chroot 环境并卸载所有挂载点:

exit
sudo umount /mnt/rootfs/dev/pts
sudo umount /mnt/rootfs/dev
sudo umount /mnt/rootfs/proc
sudo umount /mnt/rootfs/sys
sudo umount /mnt/rootfs

使用 QEMU 测试镜像文件是否正常工作:

qemu-system-aarch64 \
    -M virt \
    -cpu cortex-a57 \
    -m 1024 \
    -kernel /path/to/vmlinuz \
    -initrd /path/to/initrd.img \
    -drive file=rootfs_raw.ext4,format=raw \
    -append "root=/dev/vda console=ttyAMA0" \
    -nographic

-M virt:指定虚拟机类型为 virt。 -cpu cortex-a57:模拟 ARM Cortex-A57 CPU。 -m 1024:分配 1GB 内存。 -kernel 和 -initrd:指定内核和 initrd 文件路径。 -drive:指定根文件系统镜像。 -append:传递内核参数。

Comments

Leave a comment