Cấu hình TRIM/UNMAP cho KVM/Proxmox: Đòi lại dung lượng ổ cứng bị ‘chiếm dụng’

Virtualization tutorial - IT technology blog
Virtualization tutorial - IT technology blog

Tại sao ổ cứng máy ảo cứ dùng là phình to?

Nếu bạn dùng KVM hoặc Proxmox với ổ đĩa Thin Provisioning (như .qcow2 hoặc LVM-thin), kịch bản sau chắc chắn rất quen thuộc. Bạn vào máy ảo xóa một file 20GB, dung lượng trong máy ảo báo trống ngay lập tức. Thế nhưng, kiểm tra ở máy chủ vật lý (Host), file ổ đĩa ảo vẫn chiếm nguyên dung lượng cũ. Nó không hề nhỏ đi dù chỉ 1 byte.

Nguyên nhân rất đơn giản: Khi xóa file, Guest OS chỉ đánh dấu các block đó là “trống” trên bảng chỉ mục của nó. Lớp ảo hóa (KVM/QEMU) bên dưới không hề hay biết sự thay đổi này. Nó vẫn đinh ninh các block đó chứa dữ liệu quan trọng nên tiếp tục giữ chỗ trên ổ cứng vật lý.

Mình từng quản lý một cụm Homelab chạy 12 VM trên con Intel NUC với ổ NVMe 500GB. Có đợt mình test Docker, kéo rồi xóa liên tục các Image nặng. Dù bên trong VM báo trống 150GB, ổ NVMe của mình vẫn báo đỏ lừ vì hết chỗ. Lúc đó, mình mới nhận ra mình đã quên chưa bật TRIM/UNMAP.

TRIM (cho SSD) hoặc UNMAP (cho SCSI) là “tiếng nói chung” giữa máy ảo và máy vật lý. Nó giúp Guest OS nhắn nhủ tới Host: “Này, mấy block này tôi bỏ rồi, ông thu hồi lại đi!”. Kết quả? Dung lượng ổ đĩa vật lý sẽ tự động co lại.

Bước 1: Thiết lập phần cứng ảo (Virtual Hardware)

Lệnh TRIM không thể truyền qua các loại controller cũ kỹ. Bạn cần chọn đúng driver hỗ trợ giao thức này.

Cấu hình trên Proxmox VE

Trong giao diện Web của Proxmox, hãy truy cập phần Hardware của VM và kiểm tra hai mục:

  • SCSI Controller: Chuyển sang VirtIO SCSI hoặc VirtIO SCSI single. Đây là lựa chọn tối ưu nhất hiện nay.
  • Hard Disk: Đảm bảo Bus/Device đang để là SCSI.

Quan trọng nhất: Khi chỉnh sửa ổ đĩa, bạn phải tick vào ô Discard. Đây chính là cái gạt công tắc cho phép lệnh UNMAP đi xuyên qua lớp ảo hóa.

Kích hoạt Discard trên Proxmox

Cấu hình KVM/QEMU thuần (dùng virsh)

Nếu bạn thuộc team dòng lệnh, hãy sửa file XML của máy ảo bằng lệnh virsh edit <vm_name>. Hãy tìm tag <driver> trong phần <disk> và thêm thuộc tính discard='unmap'.

<disk type='file' device='disk'>
  <driver name='qemu' type='qcow2' discard='unmap'/>
  <source file='/var/lib/libvirt/images/ubuntu-server.qcow2'/>
  <target dev='sda' bus='scsi'/>
</disk>

Lưu ý nhỏ: Bạn cần tắt hẳn máy ảo (Shutdown) và bật lại để thay đổi phần cứng này có hiệu lực.

Bước 2: Kích hoạt bên trong Guest OS

Sau khi mở đường từ phía Host, giờ là lúc hướng dẫn hệ điều hành bên trong máy ảo cách “dọn nhà”.

Dành cho Linux Guest

Bạn có hai lựa chọn: TRIM liên tục (xóa đến đâu dọn đến đó) hoặc TRIM định kỳ. Mình khuyên dùng TRIM định kỳ để không làm giảm hiệu năng I/O đột ngột khi bạn xóa file lớn.

Hầu hết distro hiện nay như Ubuntu hay Debian đều dùng fstrim.timer. Hãy kiểm tra bằng lệnh:

# Xem timer đã hoạt động chưa
systemctl status fstrim.timer

# Nếu chưa, hãy bật nó lên
sudo systemctl enable --now fstrim.timer

Để thấy hiệu quả ngay lập tức, bạn có thể ép hệ thống dọn dẹp bằng lệnh sudo fstrim -av. Nếu màn hình hiện /: 15 GiB... trimmed, chúc mừng, bạn đã lấy lại được 15GB dung lượng thực cho Host.

Dành cho Windows Guest

Windows thường tự nhận diện ổ VirtIO SCSI là SSD. Bạn hãy kiểm tra trạng thái TRIM bằng Command Prompt (Admin):

fsutil behavior query DisableDeleteNotify

Nếu kết quả là 0, mọi thứ đã sẵn sàng. Nếu là 1, hãy dùng lệnh fsutil behavior set DisableDeleteNotify 0 để kích hoạt.

Bước 3: Kiểm chứng kết quả

Đừng chỉ tin vào những gì máy ảo báo, hãy nhìn vào con số thực tế trên Host. Trên máy chủ vật lý, bạn hãy dùng lệnh du để kiểm tra dung lượng thực tế của file .qcow2:

# Dung lượng thực tế chiếm trên disk
du -sh /var/lib/libvirt/images/my-vm.qcow2

# Dung lượng ảo định nghĩa ban đầu
ls -lh /var/lib/libvirt/images/my-vm.qcow2

Nếu cấu hình đúng, con số từ lệnh du sẽ nhỏ hơn đáng kể so với dung lượng ảo ban đầu. Ngoài ra, lệnh lsblk -D bên trong máy ảo Linux sẽ hiển thị giá trị ở cột DISC-MAX. Nếu nó khác 0, nghĩa là hạ tầng của bạn đã hỗ trợ TRIM chuẩn chỉ.

Kinh nghiệm thực tế từ hiện trường

  • SSD Emulation: Trong Proxmox, hãy bật tùy chọn này cho VM Windows. Nó giúp Windows hiểu đây là SSD và tự tối ưu việc chống phân mảnh, thay vì đối xử với nó như một ổ HDD cơ học chậm chạp.
  • ZFS Storage: Nếu dùng ZFS, việc giải phóng dung lượng có thể trễ vài giây đến vài phút. Đây là đặc tính của cơ chế Copy-on-Write, bạn không cần quá lo lắng.
  • Lợi ích khi Backup: Đây là điểm cộng cực lớn. File backup sẽ nhẹ hơn và quá trình nén dữ liệu diễn ra nhanh hơn vì không phải xử lý các block dữ liệu rác.

Chỉ với vài thao tác cấu hình, bạn đã có thể tận dụng tối đa từng GB trên ổ SSD đắt đỏ của mình. Chúc các bạn tối ưu hệ thống thành công!

Share: