• Indonesian
  • English
  • Migrasi VPS KVM Storage agar Server Production Tidak Penuh

    Kecepatan:
    ⏱ 12 min read
    Difficulty: Intermediate
    Last Updated: Juli 2026
    Tested On: Ubuntu 22.04 LTS, CentOS 7/8, Debian 11/12, KVM/QEMU, libvirt, LVM, ext4, XFS, ZFS

    Pernah nggak kamu lagi enak-enak ngopi di pagi hari, tiba-tiba monitoring server nyala terus—bunyi alarm kenceng banget, notification WhatsApp masuk bertubi-tubi. Kamu cek Grafana, disk usage server production sudah 97%. “Kok bisa ya?” Gumam kamu sambil buru-buru login SSH. Padahal kemarin masih aman di 72%. Ternyata, ada satu VPS client yang disk-nya naik dari 40GB jadi 200GB dalam semalam gara-gara mereka deploy Elasticsearch tanpa quota. Dan boom—storage server production kamu penuh. Semua VPS lain juga ikut kena imbasnya. Ibarat satu tenant di apartemen tiba-tiba isi kamarnya sampai ke langit-langit, pintu koridor jadi tersumbat, tetangga nggak bisa lewat.

    Situasi kayak gini bukan cerita fiksi. Saya pernah handle kasus di mana satu production server nge-host 28 VPS KVM, dan tiba-tiba 6 di antaranya mengalami I/O error karena underlying storage sudah penuh. Yang bikin parah? Beberapa VPS itu bahkan nggak dipakai aktif lagi—client sudah lama nggak bayar, tapi masih hidup dan terus consume disk space. Nah, di artikel ini kita akan bahas tuntas cara sortir (identifikasi) VPS mana yang bikin storage penuh, dan bagaimana cara migrasi disk-nya tanpa downtime yang signifikan. Ini bukan teori—ini langkah-langkah yang sudah saya pakai berkali-kali di production.

    Sebelum kita masuk ke perintah-perintah teknis, penting untuk kamu pahami dulu kenapa masalah ini bisa terjadi. Di infrastructure KVM, setiap VPS punya disk image file (biasanya format .qcow2 atau .raw) yang tersimpan di storage server. File-file ini bisa tumbuh secara dinamis—artinya walaupun kamu allocate 100GB untuk sebuah VPS, file disk-nya nggak langsung 100GB di awal. Tapi begitu data di dalam VPS nambah, file disk ini juga ikut membesar. Kalau nggak ada monitoring dan housekeeping yang proper, lama-kelamaan storage server kamu akan penuh tanpa kamu sadari. Ini masalah klasik di managed VPS hosting yang banyak dihadapi NOC engineer di seluruh dunia.

    Kenapa Storage Server Production Bisa Penuh?

    Sebelum kita sortir dan migrasi, ada baiknya kamu pahami dulu akar masalahnya. Storage server production bisa penuh karena beberapa alasan utama:

    • Disk VPS yang tumbuh tanpa batas — Client aplikasi yang generate data terus-misern (logs, database, cache). Tanpa quota, disk terus membesar sampai makan semua space server.
    • VPS tidur yang masih consume space — VPS yang sudah tidak dipakai client, tapi belum di-destruct. Disk image-nya masih ada di storage.
    • Snapshot accumulation — Kalau kamu pakai snapshot untuk backup, setiap snapshot consume space tambahan. Banyak NOC engineer lupa bersihin snapshot lama.
    • Log files yang tidak dirotate — VPS yang menjalankan aplikasi dengan logging tinggi (Elasticsearch, Apache, Nginx access log) bisa generate puluhan GB log per hari.
    • Temporary files dan cache — /tmp, /var/cache, dan direktori cache aplikasi yang tidak pernah dibersihkan.

    Symptoms yang Kamu Perlu Waspadai

    Biasanya masalah storage penuh ini tidak muncul tiba-tiba tanpa gejala. Ada beberapa tanda yang perlu kamu perhatikan sebelum server benar-benar crash:

    • I/O wait naik drastis di monitoring (CPU steal time juga bisa naik kalau storage sudah bottleneck)
    • VPS tertentu mulai slow response, padahal bandwidth dan CPU normal
    • Error message “No space left on device” di sistem operasi host
    • Kesalahan write ke disk di beberapa VPS secara bersamaan
    • Proses backup gagal karena tidak ada cukup space untuk menulis file backup

    Monitoring Grafana menunjukkan disk usage server production mendekati 100%

    Langkah 1: Identifikasi dan Sortir VPS Berdasarkan Disk Usage

    Oke, sekarang kita mulai dari langkah paling fundamental: identifikasi VPS mana yang paling banyak consume storage. Kalau kamu host banyak VPS di satu server, kamu nggak mungkin cek satu-satunya kan? Kamu butuh cara yang cepat dan efisien.

    Pertama, login ke production server sebagai root:

    ssh root@203.0.113.10

    Kemudian, jalankan perintah berikut untuk melihat semua VPS yang berjalan beserta disk usage-nya:

    for vm in $(virsh list --name); do echo "=== $vm ==="; virsh domblklist $vm 2>/dev/null | grep -E '.(qcow2|raw|img)$' | while read dev disk; do if [ -f "$disk" ]; then echo "  Disk: $disk"; echo "  Size: $(du -h $disk | awk '{print $1}')"; echo "  Alloc: $(qemu-img info $disk 2>/dev/null | grep 'disk size' | awk '{print $3, $4}')"; fi; done; done

    Perintah di atas akan loop semua VPS, cek file disk image-nya, dan tampilkan ukuran aktual. Hasilnya kurang lebih seperti ini:

    === vps-client-a ===
      Disk: /var/lib/libvirt/images/vps-client-a.qcow2
      Size: 45G
      Alloc: 42.3 GB
    
    === vps-client-b ===
      Disk: /var/lib/libvirt/images/vps-client-b.qcow2
      Size: 200G
      Alloc: 187.6 GB
    
    === vps-client-c ===
      Disk: /var/lib/libvirt/images/vps-client-c.qcow2
      Size: 10G
      Alloc: 3.2 GB
    
    === vps-client-d ===
      Disk: /var/lib/libvirt/images/vps-client-d.qcow2
      Size: 80G
      Alloc: 76.1 GB

    Nah, dari situ langsung keliatan kan? VPS client-b consume hampir 188GB. Kalau server kamu cuma punya 1TB total storage dan sudah host 28 VPS, satu VPS yang makan 188GB itu sudah hampir 20% dari total. Belum lagi VPS lain yang juga consume space cukup besar.

    Untuk sorting yang lebih cepat, kamu bisa pakai satu-liner ini:

    for vm in $(virsh list --name); do disk=$(virsh domblklist $vm 2>/dev/null | grep -E '.(qcow2|raw|img)$' | awk '{print $2}'); if [ -f "$disk" ]; then size=$(du -b "$disk" | awk '{print $1}'); echo "$size $vm $disk"; fi; done | sort -rn | head -20

    Perintah ini akan mengurutkan VPS dari yang paling besar sampai yang paling kecil. Sangat praktikal kalau kamu punya banyak VPS di satu server.

    Perintah Fungsi Contoh Output
    virsh list --name List semua nama VPS yang running vps-client-a, vps-client-b
    virsh domblklist $vm Tampilkan block device (disk) milik VPS vda /var/lib/libvirt/images/vps.qcow2
    du -h $disk Tampilkan ukuran aktual file disk image 45G
    qemu-img info $disk Tampilkan info detail termasuk allocated space disk size: 42.3 GB
    qemu-img resize $disk +10G Tambah capacity virtual disk (perlu reboot VPS)
    qemu-img resize $disk -10G Kurangi capacity (HANYA untuk qcow2, non-extending)

    Langkah 2: Analisis Lebih Dalam — Apa yang Bikin Disk VPS Besar?

    Setelah kamu tahu VPS mana yang paling besar, langkah selanjutnya adalah masuk ke dalam VPS itu dan cari tahu apa yang bikin disk-nya membengkak. Login ke VPS yang bermasalah:

    virsh console vps-client-b

    Atau kalau kamu pakai SSH, langsung aja ssh ke IP VPS tersebut. Kemudian jalankan analisis disk:

    df -h
    du -sh /* 2>/dev/null | sort -rh | head -15

    Dari situ kamu bisa lihat direktori mana yang consume paling banyak space. Biasanya yang sering jadi masalah:

    /var/log         45G
    /var/lib/mysql   38G
    /home/user       67G
    /tmp             12G

    Kalau /var/log yang besar, kemungkinan besar log rotation tidak jalan. Kamu bisa cek:

    ls -lah /var/log/*.log* | head -20
    ls -lah /var/log/syslog* | head -10

    Atau kalau /var/lib/mysql yang besar, itu berarti database-nya sudah cukup besar dan mungkin perlu optimization atau dump ke storage lain.

    Peringatan: Jangan pernah hapus file di dalam VPS production tanpa backup. Selalu dump database dulu, backup file penting ke storage external, baru kemudian bersihkan. Satu kesalahan rm -rf bisa bikin client marah besar.

    Langkah 3: Membuat Rencana Migrasi

    Oke, sekarang kamu sudah tahu VPS mana yang bermasalah dan apa penyebabnya. Ada beberapa opsi yang bisa kamu ambil:

    1. Cleanup di tempat — Bersihkan log, cache, dan file tidak perlu di dalam VPS tanpa migrasi.
    2. Shrink disk image — Kalau kamu sudah bersihkan file di dalam VPS, kamu bisa shrink disk image-nya agar space terpakai berkurang.
    3. Migrate ke storage lain — Pindahkan disk image VPS ke storage server tambahan (NAS, SAN, atau server lain).
    4. Migrate VPS ke server lain — Pindahkan seluruh VPS ke production server yang punya lebih banyak storage.

    Untuk artikel ini, kita fokus ke opsi 3 dan 4 — migrasi. Kenapa? Karena kadang cleanup aja nggak cukup. VPS-nya memang butuh storage yang lebih banyak, atau server production kamu memang sudah waktunya di-offload beberapa VPS-nya.

    Langkah 4: Persiapan Migrasi

    Sebelum mulai migrasi, pastikan beberapa hal ini sudah siap:

    • Storage destination sudah siap — Baik itu NAS (NFS mount), storage server lain, atau LVM volume baru. Pastikan space-nya cukup.
    • Network bandwidth cukup — Migrasi disk image berukuran besar butuh bandwidth yang memadai. Kalau bisa, pakai dedicated network (management VLAN).
    • Backup sudah dilakukan — SELALU backup dulu. Ini bukan opsional.
    • Jadwalkan maintenance window — Beritahu client kalau ada downtime. Jangan migrasi diam-diam—itu unprofessional dan bisa bikin trust hilang.
    • Dokumentasikan semua langkah — Tulis di ticketing system. Kamu nggak mau lupa langkah yang sudah dilakukan saat ada masalah.
    du -sh /var/lib/libvirt/images/vps-client-b.qcow2
    # Output: 200G
    
    # Cek space di destination
    df -h /mnt/nas-storage/
    # Filesystem      Size  Used Avail Use% Mounted on
    # /dev/nfs-share  2.0T  800G  1.2T  40% /mnt/nas-storage

    Langkah 5: Migrasi Disk VPS dengan virsh

    Ada beberapa cara migrasi yang bisa kamu pilih tergantung situasi:

    Metode A: Offline Migration (Blockcopy via SCP/rsync)

    Cara ini paling straightforward. Matikan VPS, copy file disk image, jalankan ulang VPS di lokasi baru.

    # 1. Matikan VPS
    virsh shutdown vps-client-b
    # Tunggu sampai VPS benar-benar mati
    virsh list --name | grep vps-client-b
    # Kalau tidak ada output, berarti sudah mati
    
    # 2. Verifikasi file disk
    ls -lah /var/lib/libvirt/images/vps-client-b.qcow2
    # -rw------- 1 root root 200G Jul 15 10:30 /var/lib/libvirt/images/vps-client-b.qcow2
    
    # 3. Copy ke storage destination
    rsync -avP --progress /var/lib/libvirt/images/vps-client-b.qcow2 /mnt/nas-storage/vps-client-b.qcow2
    
    # 4. Verifikasi integritas file di destination
    md5sum /var/lib/libvirt/images/vps-client-b.qcow2
    md5sum /mnt/nas-storage/vps-client-b.qcow2
    # Pastikan MD5 hash kedua file IDENTIK
    
    # 5. Update XML config VPS untuk pointing ke lokasi baru
    virsh dumpxml vps-client-b > /tmp/vps-client-b.xml
    # Edit path di dalam XML:
    # Ganti /var/lib/libvirt/images/vps-client-b.qcow2
    # Menjadi /mnt/nas-storage/vps-client-b.qcow2
    
    # 6. Define ulang VPS dengan config baru
    virsh undefine vps-client-b --nvram
    virsh define /tmp/vps-client-b.xml
    
    # 7. Jalankan VPS
    virsh start vps-client-b
    ⚠️ PERINGATAN KEAMANAN: Backup Sebelum Melanjutkan

    Sebelum menjalankan perintah undefine, pastikan kamu sudah:

    1. Backup file XML config VPS (virsh dumpxml > backup.xml)
    2. Backup disk image ke storage external
    3. Verifikasi MD5 hash backup sama dengan original
    4. Dokumentasikan semua langkah di ticketing system

    Perintah undefine tanpa backup bisa menyebabkan VPS hilang dari daftar dan tidak bisa di-recover.

    Metode B: Live Migration (virsh migrate)

    Kalau kamu tidak bisa toleransi downtime sama sekali, live migration adalah pilihannya. Tapi perlu diingat—live migration biasanya untuk migrate antar server, bukan antar storage di server yang sama.

    # Live migration ke server lain
    virsh migrate --live vps-client-b qemu+ssh://server-dest/system
    
    # Cek status migrasi
    virsh domjobinfo vps-client-b

    Live migration cocok kalau kamu mau pindahkan VPS dari server yang storage-nya penuh ke server baru yang punya lebih banyak space. Tapi pastikan network antar server cukup cepat—minimal 1Gbps dedicated, lebih bagus kalau 10Gbps.

    Metode C: Block Copy (virsh blockcopy)

    Ini cara yang lebih advanced, cocok untuk migrasi block device secara live:

    # Mulai block copy ke file baru
    virsh blockcopy vps-client-b vda /mnt/nas-storage/vps-client-b-copy.qcow2 --wait --verbose
    
    # Setelah selesai, switch block device
    virsh blockjob vps-client-b vda --pivot
    
    # Cek status
    virsh domblkinfo vps-client-b vda

    Troubleshooting: Masalah yang Sering Muncul Saat Migrasi

    Masalah Kemungkinan Penyebab Solusi
    rsync error / timeout Network timeout, disk I/O lambat Pakai rsync --bwlimit untuk throttle, atau pakai screen/tmux supaya tidak putus
    MD5 hash tidak cocok File corrupt saat transfer, atau VPS masih menulis ke disk Pastikan VPS sudah benar-benar mati sebelum rsync. Transfer ulang
    VPS tidak bisa start setelah migrate Path di XML config salah, atau permission file disk salah Periksa virsh dumpxml, pastikan path benar dan chown libvirt-qemu:kvm file disk
    Live migration gagal di 99% Memory dirty rate terlalu tinggi, atau network bandwidth tidak cukup Stop aplikasi yang generate banyak memory write, atau lakukan offline migration
    Permission denied saat akses disk image SELinux/AppArmor blocking akses ke lokasi baru restorecon -Rv /mnt/nas-storage/ atau tambahkan rule di AppArmor
    qemu-img: error while creating image Destination filesystem tidak support extended attributes, atau space tidak cukup Cek df -h di destination, pastikan filesystem mendukung qcow2
    VPS performance menurun setelah migrate ke NFS NFS latency lebih tinggi dari local disk Pakai NFS v4 dengan hard mount, atau pertimbangkan iSCSI sebagai alternatif

    Pro Tips dari Lapangan

    Tip #1: Kalau kamu migrasi banyak VPS sekaligus, jangan lakukan semuanya dalam satu malam. Lakukan bertahap, mulai dari VPS yang paling kecil. Ini memberimu waktu untuk observe apakah ada masalah setelah migrasi.
    Tip #2: Setelah migrasi selesai, tetap jaga file disk image lama selama minimal 7 hari. Jangan langsung hapus. Kadang ada masalah yang baru muncul beberapa hari setelah migrasi. Better safe than sorry.
    Tip #3: Setup monitoring untuk storage usage. Kamu bisa pakai Prometheus + Grafana untuk alert otomatis saat disk usage melebihi threshold tertentu (misal 80%). Ini jauh lebih baik daripada menunggu sampai server penuh dan baru panik.
    # Quick alert script - tambahkan ke crontab
    #!/bin/bash
    USAGE=$(df /var/lib/libvirt/images | tail -1 | awk '{print $5}' | sed 's/%//')
    if [ $USAGE -gt 80 ]; then
        echo "WARNING: Storage usage at ${USAGE}% on $(hostname)" | mail -s "Storage Alert" noc@company.com
    fi
    Tip #4: Pertimbangkan pakai thin provisioning dengan quotas. Di LVM, kamu bisa set volume group quotas supaya satu VPS nggak bisa consume semua space. Ini preventif yang sangat baik untuk production environment.

    Related Issues

    Masalah storage di production server seringkali berkaitan erat dengan beberapa issue lain yang perlu kamu pahami juga. Misalnya, kalau kamu mengalami cara mengecek disk full di VPS, itu bisa jadi early warning sebelum masalah jadi lebih parah. Selain itu, memahami optimasi storage di VPS Linux bisa membantu kamu mencegah masalah serupa terjadi di kemudian hari. Dan kalau kamu memang sudah harus upgrade infrastruktur, baca juga tentang migrasi VPS ke server baru untuk panduan yang lebih komprehensif.

    Kesimpulan

    Masalah storage penuh di production server itu serius, tapi bukan akhir dari segalanya. Dengan pendekatan yang terstruktur—identifikasi, analisis, perencanaan, dan eksekusi migrasi yang proper—kamu bisa resolve masalah ini tanpa harus kehilangan data atau trust dari client. Intinya: jangan tunggu sampai server penuh baru bertindak. Setup monitoring, buat housekeeping routine, dan selalu punya rencana backup untuk setiap VPS yang kamu manage. Kalau kamu butuh bantuan lebih lanjut soal infrastructure VPS management, jangan ragu untuk konsultasi dengan tim NOC yang berpengalaman.

    Q: Apakah aman melakukan live migration VPS yang sedang handles transaksi database production?

    Secara teknis live migration aman karena prosesnya transparan bagi OS di dalam VPS. Tapi dalam praktiknya, saya lebih rekomendasikan offline migration untuk VPS yang handles transaksi penting. Live migration bisa menyebabkan micro-interruption (hitungan milidetik) yang bisa mengganggu transaksi database yang sensitif. Lebih baik schedule maintenance window kecil daripada ambil risiko data corruption.

    Q: Berapa lama waktu yang dibutuhkan untuk migrasi VPS berukuran 100GB?

    Tergantung bandwidth network dan kecepatan disk I/O. Dalam pengalaman saya: di jaringan 1Gbps, migrasi 100GB biasanya sekitar 15-25 menit (tergantung disk type—qcow2 bisa lebih lambat dari raw). Di 10Gbps, bisa selesai dalam 2-3 menit. Tapi kalau kamu migrasi via NFS dan ada aktivitas I/O tinggi di source server, waktu bisa naik signifikan. Selalu test dulu dengan satu VPS sebelum migrasi massal.

    Q: Apakah saya bisa langsung hapus disk image lama setelah migrasi selesai?

    Jangan langsung hapus. Tunggu minimal 7 hari dan pastikan VPS di lokasi baru sudah berjalan normal tanpa masalah. Selama masa tunggu ini, kamu juga harus memastikan backup VPS sudah tersimpan di tempat yang aman. Setelah yakin semuanya stable, baru kamu bisa hapus file lama untuk membebaskan storage. Kalau storage masih kritis, setidaknya tunggu 48 jam sebelum delete.

    Author: Syslog Solutions — NOC & Server Management Team. We handle 500+ servers daily, from shared hosting to enterprise dedicated infrastructure.