27
2025
02
21:00:36

一键将目录变成虚拟磁盘!神器脚本 dir2qcow2.sh 详解

?一键将目录变成虚拟磁盘!神器脚本 dir2qcow2.sh 详解

你是否遇到过这样的需求:将一个包含大量文件的目录快速打包成一个虚拟磁盘文件,方便迁移或备份?今天给大家推荐一个超实用的脚本——**dir2qcow2.sh**,它可以将任意目录一键转换成 QEMU 虚拟磁盘镜像(qcow2 格式),操作简单,功能强大!

接下来,我将为大家详细解析这个脚本的每一部分功能,让你不仅会用,还能懂它的原理!


?️ 脚本功能一览

dir2qcow2.sh 的核心功能是将一个目录转换成 qcow2 格式的虚拟磁盘文件。它的主要特点包括:

  • 自动安装依赖:无需手动安装工具,脚本会自动检测并安装所需软件包。
  • 智能计算磁盘大小:根据目录大小自动计算虚拟磁盘的容量,并预留安全空间。
  • 支持多种操作:包括创建虚拟磁盘、分区、格式化、挂载、数据复制等。
  • 异常处理:脚本具备完善的清理机制,即使中途出错也能安全退出。

? 脚本逐行解析

1️⃣ 依赖检查与安装

脚本首先会检查系统是否安装了所需的工具,比如 qemu-nbdmkfs.ext4 等。如果发现缺失,它会自动调用 apt-get 安装这些工具。

check_and_install_dependencies() {
    local missing_packages=()
    for entry in "${REQUIRED_COMMANDS[@]}"do
        IFS=':' read -r cmd pkg <<< "$entry"
        if ! command -v "$cmd" &>/dev/null; then
            missing_packages+=("$pkg")
        fi
    done
    if (( ${#missing_packages[@]} > 0 )); then
        sudo apt-get update
        sudo apt-get install -y "${missing_packages[@]}"
    fi
}

亮点

  • 支持批量安装缺失的软件包,避免多次调用 apt-get,提升效率。
  • 如果系统不支持 apt-get,脚本会提示用户手动安装。

2️⃣ 计算虚拟磁盘大小

脚本会计算目标目录的大小,并额外预留 1GB 的安全空间,确保磁盘容量足够。

calculate_disk_size() {
    local dir="$1"
    local dir_size=$(sudo du -sb "$dir" | awk '{print $1}')
    local safety_bytes=$(numfmt --from=iec "$SAFETY_SIZE")
    echo $((dir_size + safety_bytes))
}

亮点

  • 使用 du 命令精确计算目录大小。
  • 支持人类可读的容量单位(如 1G),并通过 numfmt 转换为字节。

3️⃣ 创建虚拟磁盘

脚本会调用 qemu-img 创建一个 qcow2 格式的虚拟磁盘文件。

create_virtual_disk() {
    local disk_path="$1" size="$2"
    qemu-img create -f qcow2 "$disk_path" "$size"
}

亮点

  • qcow2 格式支持动态扩容,节省磁盘空间。
  • 磁盘大小根据目录内容动态调整,避免浪费。

4️⃣ 分区与格式化

脚本会通过 qemu-nbd 将虚拟磁盘挂载为块设备,然后使用 parted 创建分区,并用 mkfs.ext4 格式化。

prepare_block_device() {
    sudo qemu-nbd -c "$NBD_DEVICE" "$1"
    sudo parted "$NBD_DEVICE" mklabel msdos
    sudo parted -a opt "$NBD_DEVICE" mkpart primary ext4 0% 100%
    sudo mkfs.ext4 "${NBD_DEVICE}p1"
}

亮点

  • 自动创建 MBR 分区表和一个主分区。
  • 使用 ext4 文件系统,兼容性更好。

5️⃣ 数据复制与清理

脚本会将目标目录的内容复制到虚拟磁盘中,并在完成后自动卸载设备、清理临时文件。

copy_data() {
    local src="$1"
    sudo mkdir -p "$MOUNT_POINT"
    sudo mount "${NBD_DEVICE}p1" "$MOUNT_POINT"
    sudo cp -a "$src/." "$MOUNT_POINT/"
}

亮点

  • 使用 cp -a 保留文件属性和权限。
  • 通过 trap 实现异常退出时的自动清理,避免资源泄露。

6️⃣ 主流程控制

脚本的主函数负责串联整个流程,包括参数检查、依赖安装、磁盘创建、数据复制等。

main() {
    trap cleanup EXIT TERM INT
    check_and_install_dependencies
    local disk_size=$(calculate_disk_size "$src_dir")
    create_virtual_disk "$disk_path" "$disk_size"
    prepare_block_device "$disk_path"
    copy_data "$src_dir"
    echo "=== 转换完成 ==="
}

亮点

  • 使用 trap 确保脚本在任何情况下都能安全退出。
  • 提供清晰的日志输出,方便用户了解执行进度。

? 使用示例

假设你有一个目录 /data/my_files,想把它转换成虚拟磁盘文件 my_disk.qcow2,只需运行以下命令:

sudo ./dir2qcow2.sh /data/my_files ./my_disk.qcow2

脚本会自动完成以下操作:

  1. 检查并安装依赖。
  2. 计算目录大小并创建虚拟磁盘。
  3. 分区、格式化并挂载虚拟磁盘。
  4. 将目录内容复制到虚拟磁盘中。
  5. 卸载设备并输出完成信息。

? 适用场景

  • 数据备份:将重要目录打包成虚拟磁盘,方便迁移或备份。
  • 虚拟机镜像制作:快速创建包含特定数据的虚拟机镜像。
  • 文件分发:将大量文件打包成一个镜像文件,便于传输。



https://gitee.com/lynyujiang/labhub






推荐本站淘宝优惠价购买喜欢的宝贝:

image.png

本文链接:https://hqyman.cn/post/9299.html 非本站原创文章欢迎转载,原创文章需保留本站地址!

分享到:
打赏





休息一下~~


« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

请先 登录 再评论,若不是会员请先 注册

您的IP地址是: