ubuntu base 镜像制作根文件系统
一、笔者的开发环境
1、Ubuntu 22.04的虚拟机
2、瑞芯微原厂开发板rk_evb1_rk3528a_ddr4_v10
二、准备工具
1、官网下载最基础的Ubuntu根文件系统
Ubuntu Base 20.04.5 LTS (Focal Fossa)选择对于版本和架构(20.04和22.04我都做了),最后选择20.04,因为内核选择了5.10的
2、串口调试工具
MobaXterm_22.1
三、具体裁剪步骤
1.1 将下载的根文件系统,创建自己的工作目录
mkdir -p /home/ubuntu_rootfs
1.2 解压
sudo tar -xvpf /path/to/ubuntu-base-20.04-base-arm64.tar.gz -C /home/ubuntu_rootfs
1.3 配置根文件环境。拷贝本机的resolv.conf文件
cp /etc/resolv.conf /home/ubuntu_rootfs/etc/resolv.conf
1.4 安装qemu-user-static仿真器
sudo apt install qemu-user-static
#拷贝 qemu-aarch64-static 到 /home/Linux/ubuntu_rootfs/usr/bin/ 目录下。
sudo cp /usr/bin/qemu-aarch64-static ubuntu_rootfs/usr/bin/
1.5 挂载必要的伪文件系统
sudo mount -o bind /dev /home/ubuntu_rootfs/dev
sudo mount -o bind /proc /home/ubuntu_rootfs/proc
sudo mount -o bind /sys /home/ubuntu_rootfs/sys
sudo mount -o bind /run /home/ubuntu_rootfs/run
#多次操作,建议创建自动化脚本,会更简便
1.6 进入 chroot 环境
sudo chroot /home/ubuntu_rootfs /bin/bash
#注意查看你的命令行变化,现在已经进入Ubuntu_rootfs文件目录里,ls 可以查看文件
1.7 配置 DNS(若是1.3步骤本机resolv.conf里面有,就不需要做这一步)
echo "nameserver 8.8.8.8" > /etc/resolv.conf
1,8 安装软件
#先配置软件源,换成国内的的镜像
vim /etc/apt/sources.list
#注释完之前的,或者删除掉,添加以下的内容
deb http://mirrors.aliyun.com/ubuntu-ports/ focal main restricted
deb http://mirrors.aliyun.com/ubuntu-ports/ focal-updates main restricted
deb http://mirrors.aliyun.com/ubuntu-ports/ focal universe
deb http://mirrors.aliyun.com/ubuntu-ports/ focal-updates universe
deb http://mirrors.aliyun.com/ubuntu-ports/ focal multiverse
deb http://mirrors.aliyun.com/ubuntu-ports/ focal-updates multiverse
deb http://mirrors.aliyun.com/ubuntu-ports/ focal-backports main restricted uni>
deb http://mirrors.aliyun.com/ubuntu-ports/ focal-security main restricted
deb http://mirrors.aliyun.com/ubuntu-ports/ focal-security universe
deb http://mirrors.aliyun.com/ubuntu-ports/ focal-security multiverse
#更新软件包
apt update && apt upgrade -y
#添加必要的软件包,Ubuntu Base 仅包含最小化系统,需要手动安装一些基础工具:
apt install -y sudo vim net-tools iproute2 systemd-sysv bash-completion ssh ifupdown netplan
#如果需要支持 WiFi / 蓝牙:
apt install -y wireless-tools wpasupplicant bluez
1.9 配置 fstab
#/etc/fstab 文件在 Linux 系统中用于定义磁盘分区和文件系统的挂载点。
#它的作用是告知系统在启动时如何挂载存储设备(如硬盘、SSD、U盘等)
#以及它们的文件系统类型和挂载选项。
#使用 cat 将内容重定向到 /etc/fstab 文件:
sudo cat > /etc/fstab << EOF
#
/dev/root / ext4 rw,noauto 0 1
proc /proc proc defaults 0 0
devpts /dev/pts devpts defaults,gid=5,mode=620 0 0
tmpfs /dev/shm tmpfs mode=0777 0 0
tmpfs /tmp tmpfs mode=1777 0 0
tmpfs /run tmpfs mode=0755,nosuid,nodev 0 0
sysfs /sys sysfs defaults 0 0
debug /sys/kernel/debug debugfs defaults 0 0
pstore /sys/fs/pstore pstore defaults 0 0
EOF
1.10 创建默认用户 (非必要不创建用户)
adduser rkuser
usermod -aG sudo rkuser
#密码可设置为 rkuser,后续可修改
#配置主机名
echo "rk3528" > /etc/hostname
# 主机 IP
echo "127.0.0.1 localhost" >> /etc/hosts
1.11 退出 chroot
exit
1.12解除挂载
sudo umount /ubuntu_rootfs/{dev,proc,sys,run}
四、制作 rootfs.img
1.首先,你需要确定你的文件夹的实际大小。使用 du 命令可以查看文件夹的大小。
du -sh /home/ubuntu_rootfs
2.创建一个空的 IMG 文件
#我们需要创建一个包含 ext4 文件系统的 rootfs.img:
dd if=/dev/zero of=rootfs.img bs=1M count=2048
#count大小看硬件需要和上一步,你的文件大小决定
mkfs.ext4 rootfs.img
3.挂载 IMG 并拷贝 rootfs
mkdir -p /mnt/rootfs
chmod 777 /mnt/rootfs
sudo mount -o loop rootfs.img /mnt/rootfs
sudo cp -a /home/ubuntu_rootfs/* /mnt/rootfs/
sudo umount /mnt/rootfs
#复制完以后用e2fsck修复及检测镜像文件系统,resize2fs减小镜像文件的大小
e2fsck -p -f rootfs.img
resize2fs -M rootfs.img
五、裁剪根文件系统的建议
在裁剪根文件系统时,必须保留以下软件包,以确保系统能够正常运行和配置网络、管理设备、进行基本的命令行操作:
- 网络管理工具:
- iproute2(替代 ifupdown)
- udev(设备管理)
- 核心系统管理工具:
- bash(命令行解释器)
- coreutils(基本工具集,如 ls、cp、mv 等)
- dpkg(包管理工具)
- 远程访问工具(可选):
- ssh(远程登录)
- 日志管理工具:
- rsyslog(如果需要日志功能)
- 磁盘管理工具:
- ethtool(网络接口工具,可根据需要选择)
对于 开发板,通常不需要安装完整的图形界面或非核心工具,如 vim、htop、rsync、psmisc 和 nfs-common,除非它们在特定的使用场景下有实际需求。
裁剪建议:
- 保留系统必需的命令行工具,如 bash、coreutils、iproute2、iputils-ping、udev 等。
- 如果不进行远程管理,可以去除 ssh。
- 对于开发板而言,可以去除一些较重的工具,如 htop、vim 等。
- 移除所有不需要的服务和工具,以节省空间和资源,避免不必要的依赖。
六 遇到的问题。
1.用户首次登录密码不正确
我也不知道为什么密码登录不上,后来干脆不设置用户密码了,
参考了这个博主的文章 。直接串口调试设置root登录,构建Ubuntu20.04根文件系统并移植到RK3568_rk3568 ubuntu-CSDN博客
2.网络没有自动获取IP,
#运行
ip link set eth0 up
ip link set eth1 up
#方法 (systemd-networkd) 如果你的系统使用 systemd,你需要创建一个 .network 配置:
sudo nano /etc/systemd/network/eth0.network
#添加:
[Match]
Name=eth0
[Network]
DHCP=yes
#然后重启 systemd-networkd:
sudo systemctl restart systemd-networkd
#要是你下载的ifupdown这个软件。可以这样
#修改网络配置文件
vim /etc/network/interfaces
#以下是该文件具体内容
# interfaces(5) file used by ifup(8) and ifdown(8)
# Include files from /etc/network/interfaces.d:
auto eth0
iface eth0 inet dhcp
auto eth1
iface eth1 inet dhcp
source-directory /etc/network/interfaces.d
3.就是文件系统大小问题了。参考
构建Ubuntu20.04根文件系统并移植到RK3568_rk3568 ubuntu-CSDN博客
感谢这位博主的分享,他的技术细节很有用,
我的是 resize2fs /dev/mmcblk2p6 resize2fs /dev/mmcblk2p8
mount -o remount /dev/mmcblk2p6 /
mount -o remount /dev/mmcblk2p8 /userdata
20250418后续添加的
制作启动脚本 使用 resize2fs
扩展文件系统并重新挂载分区
#!/bin/bash
# 期望的分区大小(单位:GB)
EXPECTED_ROOT_SIZE=6
EXPECTED_USERDATA_SIZE=8
# 获取当前根分区(/)的实际大小
ROOT_SIZE=$(df -BG / | grep -v Filesystem | awk '{print $2}' | sed 's/G//')
USERDATA_SIZE=$(df -BG /userdata | grep -v Filesystem | awk '{print $2}' | sed 's/G//')
# 检查根分区的大小是否符合预期
if [ "$ROOT_SIZE" -ne "$EXPECTED_ROOT_SIZE" ]; then
echo "根分区大小不正确,执行resize2fs /dev/mmcblk2p6"
sudo resize2fs /dev/mmcblk2p6
sudo mount -o remount /dev/mmcblk2p6 /
else
echo "根分区大小正确:$ROOT_SIZE GB"
fi
# 检查用户数据分区的大小是否符合预期
if [ "$USERDATA_SIZE" -ne "$EXPECTED_USERDATA_SIZE" ]; then
echo "用户数据分区大小不正确,执行resize2fs /dev/mmcblk2p8"
sudo resize2fs /dev/mmcblk2p8
sudo mount -o remount /dev/mmcblk2p8 /userdata
else
echo "用户数据分区大小正确:$USERDATA_SIZE GB"
fi
exit 0
保存为 /usr/local/bin/resize_partition.sh
并给权限
sudo chmod +x /usr/local/bin/resize_partition.sh
创建一个新的服务文件,例如 /etc/systemd/system/resize-partition.service
:
在文件中添加以下内容:
[Unit]
Description=Resize Partitions and Filesystem
After=multi-user.target
[Service]
ExecStart=/usr/local/bin/resize_partition.sh
Type=oneshot
[Install]
WantedBy=multi-user.target
重新加载 systemd
配置并启用服务:
sudo systemctl daemon-reload
sudo systemctl enable resize-partition.service
sudo systemctl start resize-partition.service
4.串口窗口大小固定
# 安装 resize 命令工具
sudo apt-get install xterm
# 查看终端大小
stty size
# 设置终端大小
resize
# 输入命令之后,会默认配置成 MobaXterm 窗口大小