记录下rootfs制作、x86下定制arm镜像的大体流程
mkdir rootfs
cd rootfs
wget "http://cdimage.ubuntu.com/ubuntu-base/releases/18.04/release/ubuntu-base-18.04.5-base-arm64.tar.gz"
mkdir ubuntu
sudo tar -xpf ubuntu-base-18.04.5-base-arm64.tar.gz -C ubuntu
解压后,可以ls看看,这就是最小化的ubuntu根文件系统,可以直接用来生成镜像,但里面基本是要啥没啥。可以在PC里模拟运行这个根文件系统,运行后安装配置一些需要预置的程序,再把此根文件系统打包成固件。
在PC上模拟运行根文件系统,需要安装qemu-user-static
sudo apt-get install qemu-user-static
cd ubuntu
sudo cp /usr/bin/qemu-arm-static usr/bin/
cd rootfs
chmod +x ch-mount.sh
./ch-mount.sh -m ubuntu/
#!/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
./ch-mount.sh -u ubuntu/
dd if=/dev/zero of=ubuntu.img bs=1M count=3000
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
e2fsck -p -f ubuntu.img
resize2fs -M ubuntu.img
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
mkdir /rootfs
mount /dev/mapper/loop1n1 /rootfs
cd /rootfs
rsync -r /* /rootfs --exclude="/rootfs"
cd
umount /dev/mapper/loop1n1
kpartx -d ubuntu.img
e2fsck -p -f ubuntu.img
resize2fs -M ubuntu.img
apt-get install qemu
#获取源码
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等命令。
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-img create -f raw ubuntu.img 6G
mkdir ubuntu
mount ubuntu.img ubuntu
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/
cd ubuntu
vim etc/fstab
#fstab内容
/dev/vda / ext4 defaults 0 0
umount /dev/mapper/loop1n1
kpartx -d ubuntu.img
umount ubuntu.img
e2fsck ubuntu.img
resize2fs ubuntu.img
需拷贝对应的boot/下的内核文件到当前qemu文件夹下
vim start-qemu-ubuntu.sh
chmod u+x start-qemu-ubuntu.sh
./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
Crtl+A X