Rút Gọn File QCOW2 An Toàn Trên KVM/Proxmox: Tối Ưu Dung Lượng Ảo Hóa
7 Tháng 6, 2025
Bạn đang quản lý hệ thống máy ảo bằng KVM hoặc Proxmox và gặp tình trạng file ổ đĩa ảo .qcow2
quá lớn, gây tốn tài nguyên lưu trữ? Script dưới đây giúp bạn rút gọn file QCOW2 an toàn, thu nhỏ phân vùng và hệ thống tập tin bên trong, đồng thời tạo lại file nhẹ hơn — hoàn toàn tự động chỉ với vài bước.
Script thực hiện quy trình sau:
/dev/nbd0
)e2fsck
resize2fs
parted
qemu-img convert
INPUT_FILE="vm-100-disk-0.qcow2"
OUTPUT_FILE="vm-small.qcow2"
FS_SHRINK_SIZE="120G"
PARTITION_SIZE="150GB"
Để chạy script này, bạn cần đảm bảo máy chủ có sẵn các công cụ sau:
sudo apt update
sudo apt install -y qemu-utils qemu-kvm libguestfs-tools parted e2fsprogs
sudo yum install -y qemu-img qemu-kvm libguestfs-tools parted e2fsprogs
sudo modprobe nbd max_part=8
Script cần chạy với quyền root
hoặc sudo
.
Sau khi chạy xong, bạn sẽ có file mới vm-small.qcow2
với dung lượng đã tối ưu.
#!/bin/bash
# === CẤU HÌNH ===
INPUT_FILE="vm-100-disk-0.qcow2" # File gốc cần rút gọn
OUTPUT_FILE="vm-small.qcow2" # File đích sau khi resize
MOUNT_DEV="/dev/nbd0" # Thiết bị nbd
FS_SHRINK_SIZE="120G" # Dung lượng hệ thống tập tin bên trong
PARTITION_SIZE="150GB" # Dung lượng phân vùng thực tế
# === BẮT ĐẦU ===
echo "[1] 🧩 Tải kernel module nbd..."
modprobe nbd max_part=8 || { echo "❌ Không thể load nbd"; exit 1; }
echo "[2] 🔗 Gắn file QCOW2: $INPUT_FILE..."
qemu-nbd --connect=$MOUNT_DEV "$INPUT_FILE" || { echo "❌ Gắn thất bại"; exit 1; }
sleep 2
partprobe $MOUNT_DEV
echo "[3] 🧹 Kiểm tra lỗi hệ thống tập tin..."
e2fsck -f ${MOUNT_DEV}p1 || { echo "❌ Lỗi khi kiểm tra hệ thống tập tin"; qemu-nbd --disconnect $MOUNT_DEV; exit 1; }
echo "[4] ✂️ Thu nhỏ filesystem về $FS_SHRINK_SIZE..."
resize2fs ${MOUNT_DEV}p1 $FS_SHRINK_SIZE || { echo "❌ Thu nhỏ filesystem thất bại"; qemu-nbd --disconnect $MOUNT_DEV; exit 1; }
echo "[5] 📐 Resize phân vùng về $PARTITION_SIZE..."
parted $MOUNT_DEV ---pretend-input-tty <<EOF
resizepart 1 $PARTITION_SIZE
Yes
quit
EOF
echo "[6] 🔌 Ngắt kết nối NBD..."
qemu-nbd --disconnect $MOUNT_DEV
echo "[7] 📦 Tạo lại file QCOW2 mới: $OUTPUT_FILE..."
qemu-img convert -O qcow2 "$INPUT_FILE" "$OUTPUT_FILE" || { echo "❌ Convert thất bại"; exit 1; }
echo "[✅] Đã tạo file: $OUTPUT_FILE với partition $PARTITION_SIZE và filesystem $FS_SHRINK_SIZE"
dịch vụ chất lượng khách hàng tin tưởng