为开发板定制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
介绍
Debian – 选择 Debian 的理由
Debootstrap - Debian Wiki,补充阅读:Multistrap - Debian Wiki
可以基于第三方制作好的基础镜像进行定制,如:Linaro Releases - Debian
本文记录了基于debootstrap工具进行Debian基础系统的定制和验证过程。
定制过程
提取基础包:
#!/bin/bash
mkdir -p rootfs
rm -rf rootfs/*
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
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
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
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
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
echo -e "imx6ull\nimx6ull" | adduser --gecos "" admin
usermod -aG sudo admin
Ubuntu
介绍
详见:Base - Ubuntu Wiki
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
apt update
apt install -y sudo vim kmod rsyslog htop net-tools ethtool ifupdown iputils-ping language-pack-en-base ssh
apt clean
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
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
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
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
sudo rm -f $1/usr/bin/qemu-arm-static
在开发板上验证
在PC上基本能验证大部分问题,但一些验证工作必须要到开发板上才能进行验证,第二阶段的验证工作,可参考另一篇博客 通过NFS调试Linux系统 进行。
验证完成后再制作SD/MMC或Flash的安装镜像。
|