[KVM] Restored backup volume not attached to running VM via libvirt - only database updated
- 主要言語
- Java
- スター
- 3.1k
- フォーク
- 1.4k
- 平均マージ
- 6日 19時間
- マージ済み PR(30日)
- 32
説明
### problem
## Description
When restoring a volume from backup and attaching it to a **running** KVM VM, the volume is only attached at the **database level** but not actually hot-attached to the running VM via libvirt. This means:
1. The volume appears in CloudStack UI as "attached"
2. The volume does NOT appear in `virsh domblklist `
3. The volume is NOT visible inside the guest OS
4. User must reboot(forced) the VM to see the restored volume
## Root Cause
In `KVMGuru.attachRestoredVolumeToVirtualMachine()` (line 380-400), the method only:
- Updates the volume state in the database via `_volumeDao.attachVolume()`
- Sets volume state to `Ready`
It does **NOT**:
- Check if VM is running
- Send an `AttachCommand` to the KVM agent to hot-attach the disk via libvirt
## Expected Behavior
When attaching a restored volume to a **running** VM:
1. CloudStack should detect the VM state
2. If VM is [Running](cci:1://file:///root/new_merge/olympos-cloud-platform/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java:5982:4-5991:5), send a libvirt attach command to hot-attach the disk
3. Volume should immediately appear in `virsh domblklist` and inside guest OS
4. No reboot should be required
### versions
CloudStack: 4.21.0
Hypervisor: KVM
Host OS: Rocky Linux 9
Guest OS: Rocky Linux 9 / Windows 10 - 2022 Server
### The steps to reproduce the bug
## Steps to Reproduce
1. Create a VM with a data disk
2. Create a backup of the VM
3. Start the VM (ensure it's running)
4. Restore the backed-up volume and attach to the running VM via API:
`restoreVolumeFromBackupAndAttachToVM`
5. Check `virsh domblklist ` on the KVM host
6. **Observe:** The restored volume is NOT listed
7. Check inside guest OS
8. **Observe:** The disk is NOT visible
9. Reboot(forced) the VM
10. **Observe:** After reboot(forced), the disk appears
### What to do about it?
Either:
A) Add hot-attach logic to `KVMGuru.attachRestoredVolumeToVirtualMachine()` to send `AttachCommand` when VM is running
B) Or document this as expected behavior and require users to stop VM before restoring volumes
Option A is preferred as it aligns with how regular [attachVolume](cci:1://file:///root/new_merge/olympos-cloud-platform/server/src/main/java/com/cloud/storage/VolumeApiServiceImpl.java:2479:4-2483:5) API works for running VMs.
コントリビューションガイド
調査の方向性
KVMGuru.attachRestoredVolumeToVirtualMachine()、特に引用されている行から始め、データベースへのアタッチ処理を通常の attachVolume API パスと比較してください。LibvirtComputingResource の実行中状態の処理と、AttachCommand のフローを確認してください。実行中の VM で restoreVolumeFromBackupAndAttachToVM を再現し、再起動せずに復元されたディスクが virsh domblklist とゲストに表示されることを確認してください。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- java
- 領域
- backend, infrastructure
- issue の種類
- バグ
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 活発さ
- 停滞
- 明瞭さ
- 明確に書かれている
- 初心者へのやさしさ
- 45/100