记录下rootfs制作、x86下定制arm镜像的大体流程
1 rootfs制作
1.1 方式一:ubuntu base
1.1.1 准备工作
下载base镜像
mkdir rootfs
cd rootfs
wget "http://cdimage.ubuntu.com/ubuntu-base/releases/18.04/release/ubuntu-base-18.04.5-base-arm64.tar.gz"
解压到ubuntu目录
mkdir ubuntu
sudo tar -xpf ubuntu-base-18.04.5-base-arm64.tar.gz -C ubuntu
1.1.2 预置配置
解压后,可以ls看看,这就是最小化的ubuntu根文件系统,可以直接用来生成镜像,但里面基本是要啥没啥。可以在PC里模拟运行这个根文件系统,运行后安装配置一些需要预置的程序,再把此根文件系统打包成固件。
在PC上模拟运行根文件系统,需要安装qemu-user-static
安装qemu
sudo apt-get install qemu-user-static
修改配置
cd ubuntu
sudo cp /usr/bin/qemu-arm-static usr/bin/
使用脚本切换根文件系统(chroot)
cd rootfs
chmod +x ch-mount.sh
./ch-mount.sh -m ubuntu/
ch-mount.sh脚本内容
#!/bin/bash
function mnt() {
echo "MOUNTING"
sudo mount -t proc /proc ${2}proc
sudo mount -t sysfs /sys ${2}sys
sudo mount -o bind /dev ${2}dev
sudo chroot ${2}
}
function umnt() {
echo "UNMOUNTING"
sudo umount ${2}proc
sudo umount ${2}sys
sudo umount ${2}dev
}
if [ "$1" == "-m" ] && [ -n "$2" ] ;
then
mnt $1 $2
elif [ "$1" == "-u" ] && [ -n "$2" ];
then
umnt $1 $2
else
echo ""
echo "Either 1'st, 2'nd or both parameters were missing"
echo ""
echo "1'st parameter can be one of these: -m(mount) OR -u(umount)"
echo "2'nd parameter is the full path of rootfs directory(with trailing '/')"
echo ""
echo "For example: ch-mount -m /media/sdcard/"
echo ""
echo 1st parameter : ${1}
echo 2nd parameter : ${2}
fi
1.1.3 打包镜像
卸载根文件系统
./ch-mount.sh -u ubuntu/
dd制作空镜像
dd if=/dev/zero of=ubuntu.img bs=1M count=3000
格式化镜像文件,并加入linuxroot卷标
sudo mkfs.ext4 -F -L linuxroot ubuntu.img
挂载镜像并往里面拷入修改后的文件系统
mkdir ubuntu-mount
sudo mount ubuntu.img ubuntu-mount
sudo cp -rfp ubuntu/* ubuntu-mount
缷载镜像
sudo umount ubuntu-mount
检查修复ubuntu.img镜像的文件系统
e2fsck -p -f ubuntu.img
减小ubuntu.img镜像文件的大小
resize2fs -M ubuntu.img
1.2 方式二:拷贝已安装ubuntu根文件
1.2.1 创建镜像
创建空镜像
dd if=/dev/zero of=ubuntu.img bs=1M count=6144
创建分区
parted ubuntu.img --script -- mklabel msdos
parted ubuntu.img --script -- mkpart primary ext4 0% 100%
挂载镜像并格式化
losetup -f 查看可用的loop
losetup /dev/loop1 ubuntu.img
kpartx -av /dev/loop1
mkfs.ext4 /dev/mapper/loop1n1
1.2.2 拷贝内容
mkdir /rootfs
mount /dev/mapper/loop1n1 /rootfs
cd /rootfs
rsync -r /* /rootfs --exclude="/rootfs"
1.2.3 卸载瘦身
cd
umount /dev/mapper/loop1n1
kpartx -d ubuntu.img
e2fsck -p -f ubuntu.img
resize2fs -M ubuntu.img
2 x86环境定制arm rootfs
1、准备工作
1.1 安装qemu
在x86环境下安装qemu模拟器
(1)ubuntu x86
apt-get install qemu
(2)centos x86
#获取源码
wget https://download.qemu.org/qemu-4.1.0.tar.xz
tar xvJf qemu-4.1.0.tar.xz
cd qemu-4.1.0
./configure
make
#安装编译工具
yum install gcc
yum install autoconf automake libtoo
#编译源码
cd qemu
./configure --target-list=x86_64-softmmu --enable-debug
make -j4
若编译过程报错,根据错误找到未安装的依赖包,通过yum进行安装
make install
#验证
qemu 进行补全操作,看是否有qemu-system-x86等命令。
1.2 制作无分区的空镜像
qemu模拟启动arm系统,启动的rootfs镜像不可以有分区,img格式如下
file ubuntu.img
ubuntu-test.img: Linux rev 1.0 ext4 filesystem data, UUID=24253956-6034-4972-b52d-1663006e89ce (needs journal recovery) (extents) (64bit) (large files) (huge files)
qemu创建空镜像
qemu-img create -f raw ubuntu.img 6G
挂载镜像
mkdir ubuntu
mount ubuntu.img ubuntu
2、制作rootfs
2.1 拷贝内容
准备一个第一步制作完成的rootfs
losetup /dev/loop1 ubuntu-18.04.img
kpartx -av /dev/loop1
mkdir ubuntu18.04
mount /dev/mapper/loop1n1 ubuntu18.04
cp -rpf ubuntu18.04/* ubuntu/
2.2 修改fstab
cd ubuntu
vim etc/fstab
#fstab内容
/dev/vda / ext4 defaults 0 0
2.3 卸载瘦身
umount /dev/mapper/loop1n1
kpartx -d ubuntu.img
umount ubuntu.img
e2fsck ubuntu.img
resize2fs ubuntu.img
2.4 qemu启动arm系统
需拷贝对应的boot/下的内核文件到当前qemu文件夹下
vim start-qemu-ubuntu.sh
chmod u+x start-qemu-ubuntu.sh
./start-qemu-ubuntu.sh
脚本中指定的内核版本修改为boot/中对应的版本
start-qemu-ubuntu.sh脚本内容
qemu-system-aarch64 \
-m 1024 \
-cpu cortex-a57 -M virt \
-nographic \
-smp 4 \
-kernel boot/vmlinuz-5.15.0-46-generic \
-initrd boot/initrd.img-5.15.0-46-generic \
-append "root=/dev/vda" \
-drive if=none,file=ubuntu-test.img,format=raw,id=hd0 \
-device virtio-blk-device,drive=hd0
关闭qemu模拟器
Crtl+A X