Debian构建根文件系统
Debian 没有像 Ubuntu 提供 Ubuntu-Base 那样提供打包好的 rootfs, 但是 Debian 提供了一个制作 rootfs 的工具 debootstrap. 以下介绍使用 debootstrap 制作 Debian rootfs 的过程.
debootstrap 初始化一阶段
安装 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
debootstrap 初始化二阶段
chroot 到目标系统下
sudo chroot workroot/
第二阶段的初始化
/debootstrap/debootstrap --second-stage http://mirrors.ustc.edu.cn/debian/
初始化成功的话, 能看到I: Base system installed successfully
安装设置
安装基础软件
添加 Debian apt source
cat <<EOT > /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/getty@tty1.service
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 '\<inet\>'| 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
退出
制作 rootfs 镜像文件
# 生成一个适当大小的空镜像,这个大小参考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
参考
- Detailed process https://akhileshmoghe.github.io/_post/linux/debian_minimal_rootfs
Comments
Leave a comment