基于Ubuntu-base构建根文件系统

Ubuntu是一个非常常见的发行版系统,具有丰富的软件功能,可以方便的进行各类开发,系统的apt工具更是搭建各种开发环境的神器。当我们在基于X86的电脑Ubuntu完成功能开发后,想要将功能移植到arm板上,使用Ubuntu可以大大节省时间。

Ubuntu-Base 是Ubuntu官方构建的ubuntu最小系统,一般只有几十兆大小,我们可以在此基础上增加自己需要的组件,或预装自己的软件等。

首先我们需要下载Ubuntu-base,下面是网址Index of /ubuntu-base/releaseshttps://cdimage.ubuntu.com/ubuntu-base/releases/ 我下载的是基于ARM64的Ubuntu20.04.5,文件名称是ubuntu-base-20.04.5-base-arm64.tar.gz,只有25MB。

我们新建两个文件夹,一个叫ubuntu_rootfs,一个叫rootfs_maker。我们把刚下载的Ubuntu20.04.5解压到ubuntu_rootfs中。

sudo tar -xvf ubuntu-base-20.04.5-base-arm64.tar.gz -C ubuntu_rootfs/

因为我们使用的电脑是X86的,不支持ARM架构,所以需要安装qemu-user-static来进行仿真运行,先本机安装再拷贝到Ubuntu文件系统的文件夹中。

sudo apt install qemu-user-static
sudo cp /usr/bin/qemu-aarch64-static ubuntu_rootfs/usr/bin/

然后我们需要挂载根文件系统,下面是挂载脚本https://download.csdn.net/download/u011436603/89227108?spm=1001.2014.3001.5503,也可以参考下面的博客构建Ubuntu20.04根文件系统并移植到RK3568_rk3568 ubuntu-CSDN博客去复制。

有了挂载脚本后我们就可以对文件系统进行定制了,下面是挂载和卸载指令,在此之前需要确保脚本是具备执行权限的。

sudo chmod +x mount.sh
./mount.sh -m ubuntu_rootfs/
./mount.sh -u ubuntu_rootfs/

执行./mount.sh -m ubuntu_rootfs/指令后我们会发现终端字体变白了,而且是以root身份执行的,这表明我们已经进入了Ubuntu-base的文件系统了,可以用cat /etc/issue查看下系统版本,会发现跟你本机使用的Ubuntu是有差别的。

接下来就是定制了,你可以安装你喜欢的各种软件。

apt update
apt install vim bash-completion net-tools iputils-ping ifupdown ethtool ssh rsync udev htop rsyslog nfs-common language-pack-en-base sudo psmisc 

这时候发现报错了,因为此时的根文件系统没有网络功能,需要拷贝本机的resolv.conf文件到文件夹中。

cp /etc/resolv.conf  ubuntu_roofs/etc/resolv.conf	

现在再去使用apt安装软件就正常了。

接下来我们来进行一些配置,比如修改root密码,修改hostname等,综合参考

基于 RK3588 构建 Ubuntu 22.04 根文件系统_rk3588 ubuntu-CSDN博客构建Ubuntu20.04根文件系统并移植到RK3568_rk3568 ubuntu-CSDN博客两篇博客内容,我修改的内容有:

开机等待网络超时时间

vim /lib/systemd/system/networking.service
//将里面的TimeoutStartSec=5min修改为
TimeoutStartSec=5sec

串口调试root登录

vi /lib/systemd/system/serial-getty\@.service
ExecStart=-/sbin/agetty --autologin root --noclear %I $TERM

配置检查终端是否可用

vim /root/.profile
# 添加下面的内容,替换掉 mesg n || true 这一行
tty -s && mesg n || true

双网口DHCP

vim /etc/network/interfaces

auto eth0
iface eth0 inet dhcp
auto eth1
iface eth1 inet dhcp
source-directory /etc/network/interfaces.d

重启默认等待时间

vim /etc/systemd/system.conf

 //解除注释
 DefaultTimeoutStartSec=90s
 DefaultTimeoutStopSec=1s
 DefaultTRestartSec=100ms

后续我在使用ssh连接时老是提示Access denied,发现还得改一个地方,这里一并改掉

vi  /etc/ssh/sshd_config

//找到并改成这样
PermitRootLogin yes

以上就是全部针对Ubuntu-base的定制,本次没有安装gnome桌面,当然后续也可以通过终端自行安装。

接下来是根文件系统打包,先创建一个镜像。

//首先创建一个空镜像文件,大小参考ubuntu_rootfs那个文件夹,可以略大一些
dd if=/dev/zero of=ubuntu_rootfs.img bs=1M count=4096

//将该文件格式化为ext4文件系统
mkfs.ext4 ubuntu_rootfs.img

将该镜像挂载到一个空文件夹里,然后把ubuntu_rootfs文件夹里的东西拷过去。

//将镜像文件挂载到一个空文件中,并将ubuntu_roofs中的文件拷贝到该空文件中
chmod 777 rootfs_maker
sudo mount ubuntu_rootfs.img rootfs_maker/
sudo cp -rfp ubuntu_rootfs/* rootfs_maker/

复制完后再卸载,此时ubuntu_rootfs.img就已经有数据了,但是比较大,是我们之前创建的4096M,因此可以减小下。

//复制完以后用e2fsck修复及检测镜像文件系统,resize2fs减小镜像文件的大小
umount rootfs_maker/
e2fsck -p -f ubuntu_rootfs.img
resize2fs -M ubuntu_rootfs.img

现在我们就得到一个可用的Ubuntu根文件系统了。

相关推荐
QMCY_jason8 分钟前
Ubuntu 安装RUST
linux·ubuntu·rust
慕雪华年12 分钟前
【WSL】wsl中ubuntu无法通过useradd添加用户
linux·ubuntu·elasticsearch
苦逼IT运维28 分钟前
YUM 源与 APT 源的详解及使用指南
linux·运维·ubuntu·centos·devops
第六五37 分钟前
ubuntu命令行连接wifi
服务器·ubuntu
仍有未知等待探索1 小时前
Linux 传输层UDP
linux·运维·udp
没有余地 EliasJie1 小时前
Windows Ubuntu下搭建深度学习Pytorch训练框架与转换环境TensorRT
pytorch·windows·深度学习·ubuntu·pycharm·conda·tensorflow
zeruns8021 小时前
如何搭建自己的域名邮箱服务器?Poste.io邮箱服务器搭建教程,Linux+Docker搭建邮件服务器的教程
linux·运维·服务器·docker·网站
卑微求AC1 小时前
(C语言贪吃蛇)16.贪吃蛇食物位置随机(完结撒花)
linux·c语言·开发语言·嵌入式·c语言贪吃蛇
Hugo_McQueen1 小时前
pWnos1.0 靶机渗透 (Perl CGI 的反弹 shell 利用)
linux·服务器·网络安全
XY.散人2 小时前
初识Linux · 文件(1)
linux·运维·服务器