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
# <file system>                 <mount pt>              <type>          <options>               <dump>  <pass>
/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

五、裁剪根文件系统的建议

在裁剪根文件系统时,必须保留以下软件包,以确保系统能够正常运行和配置网络、管理设备、进行基本的命令行操作:

  1. 网络管理工具
    • iproute2(替代 ifupdown)
    • udev(设备管理)
  2. 核心系统管理工具
    • bash(命令行解释器)
    • coreutils(基本工具集,如 ls、cp、mv 等)
    • dpkg(包管理工具)
  3. 远程访问工具(可选)
    • ssh(远程登录)
  4. 日志管理工具
    • rsyslog(如果需要日志功能)
  5. 磁盘管理工具
    • 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 窗口大小


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值