1 准备工作 #
安装必要的工具
sudo apt install -y qemu-user-static
2 挂载根文件系统 #
# 指定根文件系统
ROOTFS=rootfs.img
# 指定根文件系统目录
ROOTFS_PATH=rootfs
# 创建根文件系统目录
mkdir -p $ROOTFS_PATH
# 挂载根文件系统
sudo mount $ROOTFS $ROOTFS_PATH
3 复制qemu到根文件系统 #
sudo cp /usr/bin/qemu-arm64-static $ROOTFS_PATH/usr/bin/
4 挂载必要的文件系统 #
sudo mount -t proc /proc $ROOTFS_PATH/proc
sudo mount -t sysfs /sys $ROOTFS_PATH/sys
sudo mount -o bind /dev $ROOTFS_PATH/dev
sudo mount -o bind /dev/pts $ROOTFS_PATH/dev/pts
5 配置网络 #
# 备份网络配置
sudo cp $ROOTFS_PATH/etc/resolv.conf $ROOTFS_PATH/etc/resolv.conf.bak
# 设置网络配置
sudo cp /etc/resolv.conf $ROOTFS_PATH/etc/resolv.conf
6 进入根文件系统 #
# 切换根文件系统
sudo chroot $ROOTFS_PATH
7 卸载根文件系统 #
# 还原网络配置
sudo cp $ROOTFS_PATH/etc/resolv.conf.bak $ROOTFS_PATH/etc/resolv.conf
# 清理网络配置
sudo rm $ROOTFS_PATH/etc/resolv.conf.bak
# 卸载挂载的文件系统
sudo umount $ROOTFS_PATH/dev/pts
sudo umount $ROOTFS_PATH/dev
sudo umount $ROOTFS_PATH/sys
sudo umount $ROOTFS_PATH/proc
# 删除qemu
sudo rm $ROOTFS_PATH/usr/bin/qemu-arm64-static
# 卸载根文件系统
sudo umount $ROOTFS_PATH
# 删除根文件系统目录
rm -rf $ROOTFS_PATH
8 增加根文件系统镜像大小 #
# 写入空白文件
dd if=/dev/zero bs=1M count=1024 >> rootfs.img
# 调整文件系统大小
e2fsck -f rootfs.img && resize2fs rootfs.img
9 制作快捷工具(ARM64) #
创建
qm.sh文件,内容如下:
#!/usr/bin/env bash
#@Author: 曾钦李
#@Email: iamzql@vip.qq.com
#@Date: 2025-02-12
#@Description: 利用qemu调试根文件系统
#@version: 1.0
#@PS: 请保留作者信息
# 提示信息
tip_message="Usage: $0 [-m|-c|-u] <rootfs.img|dir> -m: mount, -c: chroot, -u: umount"
# 检查参数数量
if [ $# -lt 2 ] || [ $# -gt 3 ]; then
echo $tip_message
exit 1
elif [ $# -eq 2 ] && [ "$1" != "-u" ] && [ "$1" != "-m" ] && [ "$1" != "-c" ] && [ "$1" != "-mc" ]; then
echo $tip_message
exit 1
elif [ $# -eq 3 ] && [ "$1" != "-c" ]; then
echo $tip_message
exit 1
fi
# 获取命令
CMD=$1
# 获取根文件系统
ROOTFS=$2
# 设置ROOTFS_PATH
ROOTFS_PATH=$ROOTFS
# 检查qemu-arm64-static
if [ -f /usr/bin/qemu-arm64-static ]; then
QEMU_STATIC=/usr/bin/qemu-arm64-static
fi
# 检查qemu-aarch64-static
if [ -f /usr/bin/qemu-aarch64-static ]; then
QEMU_STATIC=/usr/bin/qemu-aarch64-static
fi
# 如果QEMU_STATIC为空
if [ -z $QEMU_STATIC ]; then
echo "qemu-arm64-static or qemu-aarch64-static not found"
exit 1
fi
# 如果ROOTFS为文件
if [ -f $ROOTFS ]; then
# 设置ROOTFS_PATH
ROOTFS_PATH=$(echo "$(basename "$ROOTFS")" | sed 's/\.[^.]*$//')
fi
# 挂载根文件系统
function mount_rootfs() {
# 如果ROOTFS为文件
if [ -f $ROOTFS ]; then
# 创建根文件系统目录
mkdir -p $ROOTFS_PATH
# 挂载根文件系统
sudo mount $ROOTFS $ROOTFS_PATH
fi
# 复制qemu到根文件系统
sudo cp $QEMU_STATIC $ROOTFS_PATH/usr/bin/
# 挂载必要的文件系统
sudo mount -t proc /proc $ROOTFS_PATH/proc
sudo mount -t sysfs /sys $ROOTFS_PATH/sys
sudo mount -o bind /dev $ROOTFS_PATH/dev
sudo mount -o bind /dev/pts $ROOTFS_PATH/dev/pts
# 备份网络配置
sudo cp $ROOTFS_PATH/etc/resolv.conf $ROOTFS_PATH/etc/resolv.conf.bak
# 删除网络配置
sudo rm $ROOTFS_PATH/etc/resolv.conf
# 设置网络配置
sudo cp /etc/resolv.conf $ROOTFS_PATH/etc/resolv.conf
}
# 卸载根文件系统
function umount_rootfs() {
# 还原网络配置
sudo cp $ROOTFS_PATH/etc/resolv.conf.bak $ROOTFS_PATH/etc/resolv.conf
# 清理网络配置
sudo rm $ROOTFS_PATH/etc/resolv.conf.bak
# 卸载挂载的文件系统
sudo umount -l $ROOTFS_PATH/dev/pts
sudo umount -l $ROOTFS_PATH/dev
sudo umount -l $ROOTFS_PATH/sys
sudo umount -l $ROOTFS_PATH/proc
# 删除qemu
sudo rm $ROOTFS_PATH$QEMU_STATIC
# 如果ROOTFS为文件
if [ -f $ROOTFS ]; then
# 卸载根文件系统
sudo umount -l $ROOTFS_PATH || exit 1
# 删除根文件系统目录
rm -rf $ROOTFS_PATH
fi
}
# 检查命令
case $CMD in
-m)
mount_rootfs
;;
-c)
mount_rootfs
# 检查参数数量
if [ $# -eq 2 ]; then
# 切换根文件系统
sudo chroot $ROOTFS_PATH
else
# 切换根文件系统
sudo chroot $ROOTFS_PATH $3
fi
umount_rootfs
;;
-u)
umount_rootfs
;;
*)
echo $tip_message
exit 1
;;
esac
10 注意事项 #
- 如果在
Docker容器中运行qemu-arm64-static,需要同时在宿主机以及容器中安装qemu-user-static。
11 杂项 #
一键换源 #
bash <(curl -sSL https://linuxmirrors.cn/main.sh)