为开发板定制Debian或Ubuntu系统
前言
当前开发板的内存和存储介质(板载NandFlash/EMMC等)容量一般都很大,可用来运行相对复杂的系统和程序,为了保证开发板的可玩性(可以直接从deb源安装开源软件包,不需要重复造轮子),可以定制安装Debian或Ubuntu系统(实质是定制根文件系统)。本文尝试定制Debian和Ubuntu系统,记录定制过程,以便后续必要时回顾和查看。
本次实验的开发板,CPU为 imx6ull(ARM Cortex-A7,arch:armhf),更换为 Rock PI4 时,将qemu工具替换为qemu-aarch64-static
,相应的arch替换为aarch64(arm64)。
经过初步验证,根文件系统大小(未压缩):Ubuntu18.04-base(>400M
) > Debian-Bullseye-base(>300M
) ,比用于嵌入式系统的BusyBox-1.33.2(<30M
,制作过程见另一篇博客 使用BusyBox制作Linux根文件系统 )大了一个数量级(无意义的对比 ^_^)。
Debian
介绍
Debootstrap - Debian Wiki,补充阅读:Multistrap - Debian Wiki
可以基于第三方制作好的基础镜像进行定制,如:Linaro Releases - Debian
本文记录了基于debootstrap工具进行Debian基础系统的定制和验证过程。
定制过程
提取基础包:
#!/bin/bash
mkdir -p rootfs
rm -rf rootfs/*
# 如果已经抽取过 Debian 基础包, 则复用产物
if [ -f debian-bullseye-base-armhf.tar.gz ]; then
tar xzf debian-bullseye-base-armhf.tar.gz -C rootfs/
exit
fi
# 安装依赖工具
apt install -y binfmt-support debootstrap
# 系统自带的 qemu-user-static 版本过低, chroot 时会报系统调用错误
if [ ! -f qemu-arm-static ]; then
if [ ! -f qemu-arm-static.tar.gz ]; then
wget https://github.com/multiarch/qemu-user-static/releases/download/v7.0.0-7/qemu-arm-static.tar.gz
tar xzf qemu-arm-static.tar.gz
fi
fi
# 抽取 Debian 基础包
debootstrap --arch=armhf --foreign bullseye rootfs https://mirrors.tuna.tsinghua.edu.cn/debian/
cp -f qemu-arm-static rootfs/usr/bin
DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true chroot rootfs debootstrap/debootstrap --second-stage
# 备份
cd rootfs
rm -f usr/bin/qemu-arm-static
tar czf ../debian-bullseye-base-armhf.tar.gz *
定制(需要先chroot,见 验证 - 在PC上验证 ):
#!/bin/bash
export LC_ALL=C
if [ ! -f /etc/apt/sources.list.backup ]; then
# 替换为清华大学源
cp -af /etc/apt/sources.list /etc/apt/sources.list.backup
cat > /etc/apt/sources.list << EOF
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bullseye-security main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian-security bullseye-security main contrib non-free
EOF
fi
# 安装必要的工具, 为减小镜像大小, 安装完成后删除deb缓存
apt update
apt install -y sudo htop net-tools ethtool ssh
apt clean
echo "proc /proc proc defaults 0 0" >> /etc/fstab
sed -i '/ PATH=/c PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"' /etc/profile
# A stop job is running for ... 解决网络引起的启动, 关机/重启慢的问题
sed -i '/Before=/s/shutdown.target //' /etc/systemd/system/network-online.target.wants/networking.service
sed -i '/TimeoutStartSec=/cTimeoutStartSec=5sec' /etc/systemd/system/network-online.target.wants/networking.service
echo "imx6ull" > /etc/hostname
cat > /etc/hosts << EOF
127.0.0.1 localhost
127.0.1.1 imx6ull
EOF
# 添加用户和密码: 用户名admin, 密码imxull, 授予sudo权限
echo -e "imx6ull\nimx6ull" | adduser --gecos "" admin
usermod -aG sudo admin
Ubuntu
介绍
Ubuntu Base是一个最小的rootfs,用于创建满足特定需求的自定义映像。它致力于创建一个合适的,用于板级支持包,受限或集成环境,作为应用程序演示映像或Linux容器(如LXC或Docker)的基础的最小环境,适用于 i386、amd64、armhf、arm64等架构。
Ubuntu Base提供了一个功能强大的用户空间环境,通过使用apt-get命令,完全支持从Ubuntu存储库安装其他软件。
下载路径:http://cdimage.ubuntu.com/ubuntu-base/releases/,可以在此处选择合适的基础镜像,本文基于ubuntu-base-18.04.5
进行验证。
定制过程
下载和解压基础包:
#!/bin/bash
mkdir -p rootfs
rm -rf rootfs/*
if [ ! -f ubuntu-base-18.04.5-base-armhf.tar.gz ]; then
wget http://cdimage.ubuntu.com/ubuntu-base/releases/18.04.5/release/ubuntu-base-18.04.5-base-armhf.tar.gz
fi
tar -xzf ubuntu-base-18.04.5-base-armhf.tar.gz -C rootfs
定制(需要先chroot,见 验证 - 在PC上验证 ):
#!/bin/bash
if [ ! -f /etc/apt/sources.list.backup ]; then
# 替换为清华大学源
cp -af /etc/apt/sources.list /etc/apt/sources.list.backup
sed -i 's/http:\/\/ports.ubuntu.com/https:\/\/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list
fi
# 安装必要的工具, 为减小镜像大小, 安装完成后删除deb缓存
apt update
apt install -y sudo vim kmod rsyslog htop net-tools ethtool ifupdown iputils-ping language-pack-en-base ssh
apt clean
# A start job is running for dev-ttymxc0.device
ln -s /lib/systemd/system/getty@.service /etc/systemd/system/getty.target.wants/getty@ttymxc0.service
echo "imx6ull" > /etc/hostname
cat > /etc/hosts << EOF
127.0.0.1 localhost
127.0.1.1 imx6ull
EOF
# 添加用户和密码: 用户名admin, 密码imxull, 授予sudo权限
echo -e "imx6ull\nimx6ull" | adduser --gecos "" admin
usermod -aG sudo admin
验证
在PC上验证
在PC上可以安装必要的软件包,修改配置文件等。
运行时基于qemu-user-static
:GitHub - multiarch/qemu-user-static: /usr/bin/qemu-*-static
),它是一个用于利用当前系统来运行其它指令集架构程序的仿真器,通过x86主机运行其它架构的用户态应用程序,减小了程序验证工作的复杂度。
chroot之前:
#!/bin/bash
if [ ! -d $1 ]; then
echo "invalid rootfs: $1"
exit
fi
echo "pre-chroot($1), mount ..."
sudo cp -af /run/systemd/resolve/resolv.conf $1/etc/resolv.conf
# 系统自带的 qemu-user-static 版本过低, chroot 时会报系统调用错误
if [ ! -f qemu-arm-static ]; then
if [ ! -f qemu-arm-static.tar.gz ]; then
wget https://github.com/multiarch/qemu-user-static/releases/download/v7.0.0-7/qemu-arm-static.tar.gz
tar xzf qemu-arm-static.tar.gz
fi
fi
# chroot 时需要用到 qemu-arm-static
sudo cp -f qemu-arm-static $1/usr/bin/
# 挂载必要的文件系统
sudo mount -t proc /proc $1/proc
sudo mount -t sysfs /sys $1/sys
sudo mount -o bind /dev $1/dev
sudo mount -o bind /dev/pts $1/dev/pts
sudo chmod 777 $1/tmp
sudo chroot $1
推出之后(exit
退回到当前系统):
#!/bin/bash
if [ ! -d $1 ]; then
echo "invalid rootfs: $1"
exit
fi
echo "post-chroot($1), umount ..."
# 文件系统卸载
sudo umount $1/dev/pts
sudo umount $1/dev
sudo umount $1/sys
sudo umount $1/proc
# 制作安装镜像之前删除 qemu 程序
sudo rm -f $1/usr/bin/qemu-arm-static
在开发板上验证
在PC上基本能验证大部分问题,但一些验证工作必须要到开发板上才能进行验证,第二阶段的验证工作,可参考另一篇博客 通过NFS调试Linux系统 进行。
验证完成后再制作SD/MMC或Flash的安装镜像。