Debian 没有像 Ubuntu 提供 Ubuntu-Base 那样提供打包好的 rootfs, 但是 Debian 提供了一个制作 rootfs 的工具 debootstrap. 以下介绍使用 debootstrap 制作 Debian rootfs 的过程.
安装 debootstrap
sudo apt install debootstrap
准备一个工作目录, 例如 workroot, 初始化. 注意一定要加 mirror, 否则会非常慢
sudo debootstrap --arch=arm64 --foreign buster workroot/ http://mirrors.ustc.edu.cn/debian/
复制 qemu-aarch64-static 到目标系统, 如果没有的话要先安装一下sudo apt install qemu-user-static
sudo cp /usr/bin/qemu-aarch64-static workroot/usr/bin/
检查一下是否能正常执行
sudo chroot workroot/ /usr/bin/qemu-aarch64-static /bin/ls
准备 resolv.conf
echo "nameserver 127.0.0.53" | sudo tee workroot/etc/resolv.conf
chroot 到目标系统下
sudo chroot workroot/
第二阶段的初始化
/debootstrap/debootstrap --second-stage http://mirrors.ustc.edu.cn/debian/
初始化成功的话, 能看到I: Base system installed successfully
添加 Debian apt source
cat < /etc/apt/sources.list
# 依次输入以下内容
deb http://mirrors.ustc.edu.cn/debian buster main contrib non-free
deb-src http://mirrors.ustc.edu.cn/debian buster main contrib non-free
deb http://mirrors.ustc.edu.cn/debian-security/ buster/updates main contrib non-free
deb-src http://mirrors.ustc.edu.cn/debian-security/ buster/updates main contrib non-free
deb http://mirrors.ustc.edu.cn/debian buster-updates main contrib non-free
deb-src http://mirrors.ustc.edu.cn/debian buster-updates main contrib non-free
EOT
检查是否正确
cat /etc/apt/sources.list
最后执行 apt update
更新, apt upgrade
升级
安装一些基础软件, 这一步之后系统大小为 434M
apt install locales dialog
配置 locales, 选择 en_US.UTF-8 UTF-8, en_US.UTF-8
dpkg-reconfigure locales
继续安装一些软件
apt install vim-tiny openssh-server sudo ifupdown net-tools udev iputils-ping sysstat smartmontools
仅使用kernel自带的驱动可以启动rootfs, 但是一些板载的外设, 例如SATA硬盘和USB, 会因为没有驱动而无法识别. 需要手动将这些驱动放到rootfs中.
通过uname -r
可以看到目标系统的架构为4.4.35-hi3798mv2x
, 由此可以确定驱动的路径为
/lib/modules/4.4.35-hi3798mv2x/
将系统中这部分文件提取后放到rootfs的对应目录下, 结构类似于
modules
└── 4.4.35-hi3798mv2x
├── kernel
│ ├── crypto
│ ├── drivers
│ ├── fs
│ ├── lib
│ └── net
├── modules.alias
├── modules.alias.bin
├── modules.builtin
├── modules.builtin.alias.bin
├── modules.builtin.bin
├── modules.dep
├── modules.dep.bin
├── modules.devname
├── modules.order
├── modules.softdep
├── modules.symbols
└── modules.symbols.bin
设置主机名
echo n2ns1 > /etc/hostname
设置网络
cat << EOT > /etc/network/interfaces.d/10-eth0
# 依次输入
auto eth0
iface eth0 inet dhcp
EOT
设置 vim
nano /etc/vim/vimrc.tiny
# 修改compatible为nocompatible
set nocompatible
# 增加这行修复backspace键
set backspace=2
重要 给 root 用户设置密码, 否则刷完没法登录
passwd
开启 root 用户 ssh 访问, 编辑 /etc/ssh/sshd_config, 找到
#PermitRootLogin prohibit-password
替换为
PermitRootLogin yes
配置登录的串口, 修改文件 /etc/systemd/system/getty.target.wants/[email protected]
vi /etc/systemd/system/getty.target.wants/getty\@tty1.service
将
ConditionPathExists=/dev/tty0
修改为实际的名称
ConditionPathExists=/dev/ttyAMA0
添加欢迎界面, 新建 /etc/update-motd.d/60-welcome, 内容如下, 属性设为可执行
#!/bin/sh
#
IP=$(ifconfig eth0 | grep '\' | grep -v '127.0.0.1' | awk '{print $2}' | awk 'NR==1')
DEVICE=$(dmesg 2> /dev/null | grep "CPU: hi3798" | awk -F ':[ ]' '/CPU/{printf ($2)}')
[ ! "$DEVICE" ] && DEVICE=$(head -n 1 /etc/regname 2> /null)
echo "
Board : ${DEVICE}
Module : $(egrep -oa "hi3798.+reg" /dev/mmcblk0p1| cut -d '_' -f1 | sort | uniq | tr "\\n" ",")
CPU : $(cat -v /proc/device-tree/compatible |sed 's/\^@//g') @ $(cat /proc/cpuinfo | grep "processor" | sort | uniq | wc -l) cores
Version : $(awk -F '[= "]' '/PRETTY_NAME/{print $3,$4,$5}' /etc/os-release) | $(uname -r)-$(getconf LONG_BIT)bit
Storage : $(df -m / | grep -v File | awk '{a=$4*100.0/$2;b=$4;c=$2} {printf("%.1f%% free, %.1fMiB of %.1fMiB\n",a,b,c)}')
Memory : $(free -m | grep Mem | awk '{a=$7*100.0/$2;b=$2} {printf("%.1f%% free, %.1fMiB total\n",a,b)}') | Swap:$(free -m | grep Swap | awk '{a=$4*100/$2;b=$4} {printf("%.1f%% %.1fMiB\n",a,b)}')
Up Time : $(awk '{a=$1/86400;b=($1%86400)/3600;c=($1%3600)/60;d=($1%60)} {printf("%d days %02d:%02d:%02d\n",a,b,c,d)}' /proc/uptime)
IP Addr : $IP
Temp : $(grep Tsensor /proc/msp/pm_cpu | awk '{print $4}')°C
MAC : $(ifconfig eth0 |grep "ether"| awk '{print $2}')
"
安装完成后, 清理apt
apt autoremove
apt autoclean
apt clean
最后exit
退出
# 生成一个适当大小的空镜像,这个大小参考du -h workroot/ -d1
dd if=/dev/zero of=rootfs.img bs=1M count=1024
# 格式化
mkfs.ext4 rootfs.img
# or
mkfs -t ext4 rootfs.img
# 挂载空镜像
mkdir rootfs
sudo mount rootfs.img rootfs/
# 写入文件, 保留权限
sudo cp -rfp workroot/* rootfs/
# 取消挂载
sudo umount rootfs/
# 检查文件系统并自动修复
e2fsck -p -f rootfs.img
# 使镜像紧凑
resize2fs -M rootfs.img