跳过正文

利用 qemu 调试根文件系统

·508 字·3 分钟
Qemu Rootfs Linux
1ZQL1
作者
1ZQL1
一个有趣的灵魂
目录

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 注意事项
#

  1. 如果在Docker容器中运行qemu-arm64-static,需要同时在宿主机以及容器中安装qemu-user-static

11 杂项
#

一键换源
#

bash <(curl -sSL https://linuxmirrors.cn/main.sh)

相关文章

为 APT 换源
·83 字·1 分钟
Apt Linux
winget 切换国内源
·26 字·1 分钟
Winget Powershell Windows