Debian 沒有像 Ubuntu 提供 Ubuntu-Base 那樣提供打包好的 rootfs, 但是 Debian 提供了一個製作 rootfs 的工具 debootstrap. 以下介紹使用 debootstrap 製作 Debian rootfs 的過程. ...
目錄
- Hi3798MV200 恩兔N2 NS-1 (一): 設備介紹和刷機說明
- Hi3798MV200 恩兔N2 NS-1 (二): HiNAS海納思使用和修改
- Hi3798MV200 恩兔N2 NS-1 (三): 製作 Ubuntu rootfs
- Hi3798MV200 恩兔N2 NS-1 (四): 製作 Debian rootfs
關於 Debian rootfs
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/[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 '\<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