Debian系统需要使用提供的debootstrap工具进行下载解压,然后通过chroot切换到交叉编译环境完成构建。ubuntu则直接提供了具有系统核心功能的镜像包,不需要专用的工具,使用通用的curl,wget或者手动网页下载解压后,进入chroot沙箱环境配置即可。
Ubuntu的地址: http://cdimage.ubuntu.com/ubuntu-base/releases/22.04/release/
本节目录如下。
下载Ubuntu Core源码。
#安装qemu虚拟机
sudo apt-get install qemu-user-static
## 需要桌面端版本和arm端系统等同或者更高,否则可能无法执行
# 下载Ubuntu-Base,因为芯片为I.MX6ULL,这里以arm为准
对于arm下载:
wget https://mirrors.tuna.tsinghua.edu.cn/ubuntu-cdimage/ubuntu-base/releases/22.04.2/release/ubuntu-base-22.04.2-base-armhf.tar.gz
对于aarch64下载:
wget https://mirrors.tuna.tsinghua.edu.cn/ubuntu-cdimage/ubuntu-base/releases/22.04.2/release/ubuntu-base-22.04.2-base-arm64.tar.gz
# 解压软件包
tar -xvf ubuntu-base-22.04.2-base-armhf.tar.gz
cd ubuntu-base-22.04.2-base-armhf/
修改系统源为清华源,更新dns服务器用于后续软件包更新。
# 修改镜像源和dns服务器,地址
vim etc/apt/sources.list
# 更新内容见网址: https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu-ports/
################# etc/apt/sources.list #################
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-backports main restricted universe multiverse
# 以下安全更新软件源包含了官方源与镜像站配置,如有需要可自行修改注释切换
deb http://ports.ubuntu.com/ubuntu-ports/ jammy-security main restricted universe multiverse
# deb-src http://ports.ubuntu.com/ubuntu-ports/ jammy-security main restricted universe multiverse
# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-proposed main restricted universe multiverse
# # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-proposed main restricted universe multiverse
##########################################################
# 修改dns服务器(必须删除后添加,原为链接,修改无效)
rm -rf etc/resolv.conf
# 写入命令
cat << EOF > etc/resolv.conf
nameserver 223.5.5.5
nameserver 8.8.8.8
nameserver 8.8.4.4
EOF
进入沙箱模式,进行系统更新。
# 安装qemu静态环境
sudo apt-get install qemu-user-static -y
# 通过chroot进入配置模式, 进行源更新
workdir=$(pwd)
sudo mount -t proc chproc "${workdir}"/proc
sudo mount -t sysfs chsys "${workdir}"/sys
sudo mount -t devtmpfs chdev "${workdir}"/dev || sudo mount --bind /dev "${workdir}"/dev
sudo mount -t devpts chpts "${workdir}"/dev/pts
LC_ALL=C LANGUAGE=C LANG=C sudo chroot "${workdir}"
#######################################################
#此步骤后进入沙盒模式(root权限),执行环境配置
#######################################################
# 进行系统更新支持
chmod 777 /tmp
unminimize
apt-get update
apt-get install ca-certificates --reinstall -y
apt-get update
apt-get install libterm-readkey-perl -y
apt-get upgrade
# 安装ubuntu的必要软件
apt-get install sudo vim systemd kmod -y
ln -sf /usr/bin/systemd /sbin/init
ln -sf /usr/bin/systemd /init
apt-get install dialog apt-utils
apt-get install net-tools
# 增加用户,并添加到sudo中
adduser freedom
...
# freedom用户支持sudo命令
visudo
# +
freedom ALL=(ALL:ALL) ALL
# 更新密码
passwd root
......
接下来就是管理Ubuntu启动时的服务,Ubuntu服务默认使用systemctrl命令管理,包含如下。
# ubuntu默认只支持tty1输出,也就是屏幕,如果希望串口输出,增加相应服务
# 复制串口ttymxc0启动服务,所有步骤完成
cd /etc/systemd/system/getty.target.wants
#[ TIME ] Timed out waiting for device dev-ttymxc0.device.
# 对于其它SOC芯片,需要将ttymxc0更新为相应的串口
cp -d getty@tty1.service getty@ttymxc0.service
#创建个人服务,用于启动网络
cat << EOF > /etc/systemd/system/startservice.service
[Unit]
Description=My Service
After=network.target
[Service]
ExecStart=/etc/init.d/start.sh
WorkingDirectory=/tmp/
[Install]
WantedBy=default.target
EOF
#创建启动脚本, 起始第一行必须指定执行环境
cat << EOF > /etc/init.d/start.sh
#!/bin/bash
echo "start network service"
ifconfig eth0 192.168.2.99 netmask 255.255.255.0
route add default gw 192.168.2.1
ifconfig eth0 up
EOF
#开启服务
systemctl enable startservice.service
接下来可以移除环境,打包即可。
#11.移除连接,进行打包
exit
sudo umount -l --recursive "${workdir}"/dev >/dev/null 2>&1
sudo umount -l "${workdir}"/proc >/dev/null 2>&1
sudo umount -l "${workdir}"/sys >/dev/null 2>&1
tar -vcjf rootfs.tar.bz2 *
此时打包的rootfs.tar.bz2就是基于Ubuntu Core构建的系统,当然也可以打包成img或者其它格式,支持不同soc的格式需求。
直接开始下一章节说明: 支持QT的Linux文件系统构建