制作debian的rootfs

使用debootstrap构建制作aarch64/arm64 Debian rootfs文件系统

1.宿主机软件安装

PC端宿主机使用的系统为Ubuntu22.04 amd64,在制作debian10系统之前,需要安装制作系统所需要的一些工具软件。

1
root@ubuntu:~# apt-get install apt-transport-https qemu qemu-user-static qemu-system-arm binfmt-support debootstrap
  • qemu-system-arm 用于模拟arm架构的设备,在此平台上进行debian系统的运行演示。

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

  • qemu-user-static 在PC端非arm架构的ubuntu系统上,需要借助于qemu-arm-static工具来模拟arm环境安才可以安装arm架构下所需要的软件。

2.使用debootstrap工具下载debian文件系统

1
root@ubuntu:~# debootstrap --arch=arm64 --variant=minbase --include=whiptail,ca-certificates,tzdata --foreign buster rootfs http://mirrors.ustc.edu.cn/debian/
  • –arch : 指定系统架构

  • –foreign :指定要下载的系统代号(debian-10 为 buster)

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

  • http://mirrors.ustc.edu.cn/debian :下载路径(此处使用的是国内中科大源)

  • –variant 说明

    • minbase: 只包含必要的包和apt;

    • buildd: 包含编译工具包

    • fakechroot: 包含不用root权限的包

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

3.复制qemu-arm-static到debian文件系统/usr/bin/目录

因为使用的宿主机是ubuntu18.04 amd64,所以需要使用qemu-arm-static来模拟arm环境,下载安装所需要的软件。

1
root@ubuntu:~# cp /usr/bin/qemu-arm-static rootfs/usr/bin/

4.执行第二阶段的下载

1
root@ubuntu:~# DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true LC_ALL=C LANG=zh_CN.UTF-8 chroot rootfs/ debootstrap/debootstrap --second-stage

设置环境变量,然后切换至文件系统存放目录,使用目录下的debootstrap/debootstrap命令,执行第二阶段的下载。等待几分钟后,命令执行完成,终端输出“I: Base system installed successfully.”即为系统下载完成。

5.换源

1
2
3
4
5
root@ubuntu:~# sed -i 's#http://deb.debian.org#http://mirrors.ustc.edu.cn#g' rootfs/etc/apt/sources.list

# 原始源

root@ubuntu:~# sed -i 's#http://ports.ubuntu.com#http://mirrors.ustc.edu.cn#g' rootfs/etc/apt/sources.list

6.配置网络信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
root@ubuntu:~# echo 'nameserver 192.168.2.1' > rootfs/etc/resolv.conf

root@ubuntu:~# mkdir rootfs/etc/netplan

root@ubuntu:~# cat > rootfs/etc/netplan/50-cloud-init.yaml <<EOF

network:

ethernets:

eth0:

dhcp4: no

addresses: [192.168.168.6/24]

gateway4: 192.168.168.1

nameservers:

addresses: [192.168.168.1]

version: 2

EOF

可选设置网络DHCP

1
2
3
4
5
6
7
cat > /etc/netplan/50-cloud-init.yaml <<EOF
network:
ethernets:
eth0:
dhcp4: yes
version: 2
EOF

7.配置系统信息

1
2
3
root@ubuntu:~# echo 'Debian10' > rootfs/etc/hostname
root@ubuntu:~# echo "127.0.0.1 localhost" > rootfs/etc/hosts
root@ubuntu:~# echo "127.0.0.1 Debian10" >> rootfs/etc/hosts

8.挂载本地设备文件到rootfs

1
2
3
4
root@ubuntu:~# mount -t proc /proc  rootfs/proc
root@ubuntu:~# mount -t sysfs /sys rootfs/sys
root@ubuntu:~# mount -o bind /dev rootfs/dev
root@ubuntu:~# mount -o bind /dev/pts rootfs/dev/pts

9.系统磁盘挂载配置

系统开机时会主动读取/etc/fstab这个文件中的内容,根据文件里面的配置挂载磁盘

1
2
3
4
5
root@ubuntu:~# vim rootfs/etc/fstab
#添加以下内容
# UNCONFIGURED FSTAB FOR BASE SYSTEM
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0

10.进入chroot rootfs 内配置

1
2
3
4
5
6
7
8
root@ubuntu:~# chroot rootfs

root@ubuntu:/# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

root@ubuntu:/# apt update && apt upgrade -y

root@ubuntu:/# apt install 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 iputils-ping htop wpasupplicant -y

需要工具链的可以执行以下命令

1
2
root@ubuntu:/# apt install gcc g++ -y #(或者选择buildd的包)
root@ubuntu:/# echo 'PermitRootLogin yes' >> /etc/ssh/sshd_config

设置swap分区

1
2
3
4
5
6
7
8
9
10
root@ubuntu:/# dd if=/dev/zero of=/swapfile bs=1M count=16384 status=progress #创建16G的交换空间 大小根据需要自定

root@ubuntu:/# chmod 600 /swapfile #设置正确的权限

root@ubuntu:/# mkswap /swapfile #格式化swap文件

root@ubuntu:/# swapon /swapfile #启用swap文件

root@ubuntu:/# echo '/swapfile none swap defaults 0 0' >> /etc/fstab #向/etc/fstab 中追加该内容

如需要关闭swap和swap文件,则可以输入以下命令

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

11.最后的准备

如果需要添加用户,使用

1
2
#创建用户debian
root@ubuntu:/# useradd -m debian -g sudo -s /bin/bash -d /home/debian

设置密码,取消挂载,退出chroot

1
2
3
4
5
root@ubuntu:/# passwd root
root@ubuntu:/# umount /dev/pts/ /dev/ /proc/ /sys
root@ubuntu:/# exit
#退出后会变回进容器之前的用户
root@ubuntu:~#

12.打包rootfs

1
2
root@ubuntu:~# cd rootfs
root@ubuntu:~# tar -czvf debian_buster_arm64.tgz ./*