2 giờ sáng, điện thoại mình rung bần bật. Hệ thống giám sát Zabbix báo động đỏ rực: LUN lưu trữ 10TB trên hệ thống SAN của công ty chỉ còn chưa đầy 150GB trống. Đây là tình huống cực kỳ báo động. Nếu ổ cứng vật lý đầy, toàn bộ các máy ảo (VM) sẽ bị treo (suspend) ngay lập tức, gây gián đoạn dịch vụ toàn hệ thống.
Sau khi kiểm tra nhanh, mình phát hiện một máy chủ Windows Server 2019 đang chiếm tới 500GB dung lượng thực tế trên SAN. Oái oăm thay, dữ liệu bên trong Windows báo cáo chỉ đang dùng 120GB. Tại sao lại có sự chênh lệch hơn 300GB vô lý như vậy? Làm sao để lấy lại không gian lưu trữ này mà không phải cài lại máy? Với kinh nghiệm quản lý cluster 8 host ESXi, mình sẽ hướng dẫn bạn cách xử lý triệt để vấn đề này.
Tại sao file VMDK phình to nhưng không bao giờ tự co lại?
Thủ phạm chính là cơ chế Thin Provisioning. Hãy tưởng tượng nó như một chiếc bong bóng: thổi hơi vào thì dễ, nhưng khi bạn xả hơi (xóa dữ liệu), cái vỏ bong bóng (file VMDK) vẫn giữ nguyên kích thước đã giãn. Khi bạn xóa file trong Windows hay Linux, hệ điều hành chỉ đánh dấu các block đó là “trống” ở tầng phần mềm. VMware ở tầng dưới (Hypervisor) vẫn thấy các block đó chứa dữ liệu cũ nên không chịu nhả dung lượng ra.
Để giải quyết, chúng ta cần thực hiện quy trình hai bước. Đầu tiên là Zero-out (ghi đè số 0 vào vùng trống). Sau đó là Shrink (cắt bỏ những vùng chứa số 0 đó để thu hồi dung lượng).
Cách 1: Thu nhỏ VMDK trên VMware Workstation (Dành cho máy cá nhân)
Nếu bạn đang chạy máy ảo trên laptop hoặc PC, VMware Workstation đã tích hợp sẵn công cụ đồ họa để làm việc này khá nhanh chóng.
Đầu tiên, hãy dọn dẹp nội bộ máy ảo. Bạn vào Windows, xóa các file tạm, dọn thùng rác hoặc chạy Disk Cleanup. Việc này đảm bảo các block dữ liệu cũ được giải phóng tối đa trước khi thực hiện thu nhỏ.
Tiếp theo, sử dụng tính năng Clean Up Disks:
- Tắt hoàn toàn máy ảo (Power Off).
- Chuột phải vào tên máy ảo, chọn Settings.
- Chọn mục Hard Disk, nhìn sang bên phải tìm nút Utilities và chọn Clean Up Disks.
Hệ thống sẽ quét và thu hồi các block trống. Tuy nhiên, nếu đĩa bị phân mảnh nặng, công cụ này đôi khi không đạt hiệu quả như kỳ vọng.
Cách 2: Thu nhỏ VMDK cho Windows (Hiệu quả 100% trên cả ESXi và Workstation)
Đây là phương pháp “vũ lực” nhưng cực kỳ hiệu quả mà mình thường xuyên áp dụng. Chúng ta sẽ dùng công cụ SDelete từ bộ Sysinternals của Microsoft.
Bước 1: Lấp đầy vùng trống bằng số 0. Bạn tải SDelete về máy ảo, mở CMD với quyền Administrator và chạy lệnh:
sdelete.exe -z c:
Lệnh này sẽ ghi số 0 vào toàn bộ phần dung lượng đang trống trên ổ C. Đừng hoảng hốt nếu thấy file .vmdk lúc này phình to lên mức tối đa. Chúng ta đang chủ động lấp đầy nó để chuẩn bị cho bước “cắt tỉa” ngay sau đây.
Bước 2: Thực hiện co rút file (Shrink). Sau khi SDelete chạy xong, hãy tắt máy ảo. Nếu dùng Workstation, bạn mở CMD trên máy thật và chạy lệnh:
"C:\Program Files (x86)\VMware\VMware Workstation\vmware-vdiskmanager.exe" -k "duong-dan-den-file.vmdk"
Đối với môi trường ESXi: Bạn cần SSH vào host, di chuyển đến thư mục chứa máy ảo và sử dụng lệnh vmkfstools với tùy chọn -K (Punching holes):
cd /vmfs/volumes/datastore-cua-ban/thu-muc-vm/
vmkfstools -K disk-cua-ban.vmdk
Lệnh -K sẽ tìm các block chứa số 0 và giải phóng chúng về Storage pool. Trong đêm trực đó, lệnh này đã giúp mình lấy lại hơn 300GB chỉ trong vòng 20 phút.
Cách 3: Xử lý máy ảo Linux bằng lệnh dd
Với các bản phân phối Linux như Ubuntu hay CentOS, chúng ta không dùng SDelete mà sử dụng lệnh dd thần thánh để tạo file rác chứa số 0.
Thực hiện bên trong máy ảo Linux:
dd if=/dev/zero of=/wipefile bs=1M
rm /wipefile
Lệnh trên tạo ra một file tên wipefile chiếm hết chỗ trống còn lại trên đĩa, sau đó xóa nó đi. Lúc này, các block trống đã được lấp đầy bởi số 0. Cuối cùng, bạn chỉ cần tắt máy ảo và thực hiện lệnh vmkfstools -K trên host ESXi như hướng dẫn ở phần trên.
Kinh nghiệm thực chiến: Những lưu ý không thể bỏ qua
Việc can thiệp vào cấu trúc file đĩa ảo luôn tiềm ẩn rủi ro. Dưới đây là 3 quy tắc mình luôn tuân thủ:
- Bắt buộc phải Backup: Hãy clone máy ảo hoặc backup bằng Veeam trước khi làm. Nếu mất điện hoặc treo host khi đang shrink, file .vmdk rất dễ bị hỏng cấu trúc.
- Xóa sạch Snapshot: Bạn không thể thu nhỏ đĩa nếu máy ảo vẫn còn Snapshot. Hãy thực hiện Consolidate toàn bộ Snapshot trước khi bắt đầu quy trình.
- Kiểm tra dung lượng vật lý: Khi chạy SDelete, file vmdk sẽ tạm thời phình to ra mức tối đa (Maximum Provisioned). Hãy chắc chắn ổ cứng vật lý của bạn còn đủ chỗ cho sự gia tăng tạm thời này.
Nếu bạn đang dùng ESXi 6.7 trở lên và SAN hỗ trợ VAAI, hãy tìm hiểu thêm về lệnh UNMAP. Nó cho phép Windows tự động thu hồi dung lượng mà không cần làm thủ công. Tuy nhiên, với các hệ thống cũ hoặc cấu hình phức tạp, những kỹ thuật thủ công bên trên vẫn là phương án đáng tin cậy nhất.
Hy vọng bài viết này giúp bạn giải cứu thành công những ổ cứng đang kêu cứu vì cạn kiệt dung lượng. Nếu gặp lỗi “Failed to open the disk”, hãy để lại comment phía dưới để mình hỗ trợ nhé!
