Skip to main content

VM Gagal Booting karena RBD Lock Error di Ceph: "Invalid Argument"

ChatGPT Image Aug 2, 2025, 10_43_35 PM.png

Dalam arsitektur virtualisasi berbasis Ceph RBD, fitur exclusive locking digunakan untuk memastikan hanya satu host yang bisa menulis ke disk image pada satu waktu. Namun, dalam kondisi tertentu — terutama saat host VM mengalami crash atau restart — image RBD bisa terkunci, dan host baru gagal mengambil lock.

Masalah ini menyebabkan VM tidak bisa booting, bahkan ketika tidak ada proses lain yang sedang mengakses image. Error ini berasal dari bug pada Ceph, khususnya saat mencoba melakukan blocklist terhadap pemilik lock sebelumnya.

image.png

https://tracker.ceph.com/issues/54613 


Use Case: High Availability VM Gagal Recovery

Lingkungan:
  • Storage backend: Ceph RBD

  • Hypervisor: Proxmox, KVM/libvirt, OpenStack

  • VM HA aktif (auto-restart saat crash)

Alur Kejadian:
  1. Host A (pemilik lock sebelumnya) crash atau shutdown paksa.

  2. Host B mencoba menjalankan ulang VM dari image RBD yang sama.

  3. Ceph mencoba memutus lock yang lama, tapi gagal.

  4. VM gagal booting dengan error Read-only file system.

Cuplikan Log:
librbd::managed_lock::BreakRequest: failed to blocklist lock owner: (22) Invalid argument  
librbd::ManagedLock: failed to acquire exclusive lock: (22) Invalid argument  
qemu-kvm: Could not open image: Read-only file system

Penyebab : Salah Format Parameter expire

Untuk memutus lock, Ceph mengirim perintah ke monitor (MON) untuk melakukan blocklist terhadap alamat host sebelumnya. Parameter expire digunakan untuk menentukan durasi blocklist.

Namun, jika konfigurasi rbd_blocklist_expire_seconds diset selain 0 (misalnya 3600), Ceph (melalui librados) mengirim nilai expire sebagai string, seperti ini:

"expire": "3600.0"  // ❌ Salah - string

Seharusnya:

"expire": 3600.0  // ✅ Benar - float

Kesalahan format ini membuat monitor Ceph menolak command tersebut:

(22) Invalid argument

Karena proses blocklist gagal, Ceph tidak bisa memutus lock, dan image tetap dalam keadaan terkunci (read-only), meskipun tidak lagi diakses.


Workaround:

Power Off → Map/Unmap → Power On

Untuk mengatasi image yang terkunci tanpa menghapus lock secara paksa, langkah paling aman dan efektif:

Langkah Recovery
  1. Power off VM

  2. Map image RBD:

    rbd map <pool>/<image>
  3. Unmap image RBD:
    rbd unmap /dev/rbd/<pool>/<image>

  4. Power on kembali VM

Langkah ini akan memaksa Ceph untuk mengambil ulang lock dengan cara bersih, asalkan memang tidak ada host lain yang masih aktif menggunakan image tersebut.


Fix Permanen

Untuk menghindari kegagalan lock seperti ini secara jangka panjang, tersedia dua pendekatan fix permanen yang dapat diterapkan:

Opsi 1 — Gunakan Nilai Default: rbd_blocklist_expire_seconds = 0

Cara termudah dan langsung adalah tidak menyetel nilai rbd_blocklist_expire_seconds secara manual, atau pastikan nilainya tetap 0 (default).

  • Ketika disetel 0, Ceph tidak akan mengirim field expire dalam perintah blocklist.

  • Ini menghindari bug serialisasi karena tidak ada parameter bermasalah yang dikirim.

Implementasi:

# Di konfigurasi ceph [global] rbd_blocklist_expire_seconds = 0 # atau hapus baris ini sama sekali

Aman digunakan di production, tanpa perlu rebuild atau patching.


Opsi 2 — Patch Source Code librados

Jika Anda memang membutuhkan fitur pengaturan expire secara fleksibel (misalnya untuk compliance), Anda bisa melakukan patch langsung di Ceph source:

  • Pastikan nilai expire dikirim sebagai float dalam struktur JSON, bukan string.

  • Bug ini biasanya berasal dari serialisasi Python, C++, atau binding CLI yang tidak memaksa format numerik murni.

Contoh pseudo-fix di patch C++:

cmd["expire"] = static_cast<double>(expire_secs); // pastikan bukan string

Langkah ini:

  1. Clone source Ceph

  2. Ubah bagian kode yang membentuk JSON untuk command osd blocklist

  3. Rebuild dan deploy binary yang sudah diperbaiki

Opsi ini lebih teknikal, cocok jika Anda menjalankan Ceph dengan kustomisasi berat atau ingin menyumbang upstream.


Dengan kedua opsi ini, Anda bisa memilih pendekatan yang paling sesuai antara stabilitas konfigurasi default (Opsi 1) atau fleksibilitas fungsional penuh (Opsi 2). Jika ingin menyumbang fix upstream, Opsi 2 juga bisa dikemas dalam PR resmi ke repositori Ceph.


Kesimpulan

Meskipun tampak sepele — hanya salah format angka — bug ini berdampak besar: VM tidak bisa di-recover secara otomatis, HA menjadi tidak efektif, dan downtime meningkat. Dengan memahami akar masalah dan menerapkan workaround yang tepat, Anda bisa menghindari intervensi manual yang lebih invasif seperti penghapusan paksa lock.