?一键将目录变成虚拟磁盘!神器脚本 dir2qcow2.sh
详解
你是否遇到过这样的需求:将一个包含大量文件的目录快速打包成一个虚拟磁盘文件,方便迁移或备份?今天给大家推荐一个超实用的脚本——**dir2qcow2.sh
**,它可以将任意目录一键转换成 QEMU 虚拟磁盘镜像(qcow2 格式),操作简单,功能强大!
接下来,我将为大家详细解析这个脚本的每一部分功能,让你不仅会用,还能懂它的原理!
?️ 脚本功能一览
dir2qcow2.sh
的核心功能是将一个目录转换成 qcow2 格式的虚拟磁盘文件。它的主要特点包括:
自动安装依赖:无需手动安装工具,脚本会自动检测并安装所需软件包。 智能计算磁盘大小:根据目录大小自动计算虚拟磁盘的容量,并预留安全空间。 支持多种操作:包括创建虚拟磁盘、分区、格式化、挂载、数据复制等。 异常处理:脚本具备完善的清理机制,即使中途出错也能安全退出。
? 脚本逐行解析
1️⃣ 依赖检查与安装
脚本首先会检查系统是否安装了所需的工具,比如 qemu-nbd
、mkfs.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
脚本会自动完成以下操作:
检查并安装依赖。 计算目录大小并创建虚拟磁盘。 分区、格式化并挂载虚拟磁盘。 将目录内容复制到虚拟磁盘中。 卸载设备并输出完成信息。
? 适用场景
数据备份:将重要目录打包成虚拟磁盘,方便迁移或备份。 虚拟机镜像制作:快速创建包含特定数据的虚拟机镜像。 文件分发:将大量文件打包成一个镜像文件,便于传输。
https://gitee.com/lynyujiang/labhub
推荐本站淘宝优惠价购买喜欢的宝贝:
本文链接:https://hqyman.cn/post/9299.html 非本站原创文章欢迎转载,原创文章需保留本站地址!
休息一下~~