StorPool: resize of an encrypted volume does not account for the LUKS header (live resize fails with "Cannot grow device files", guest ends up 2 MiB short)
メンテナーはふだん 1 日以内に返信
まだ誰も着手していません。
評価
この issue はまだ評価されていません。
説明
problem
When a LUKS-encrypted volume on StorPool primary storage is resized, the
plugin resizes the StorPool volume to exactly the requested size. At creation
the plugin adds 2 MiB (2097152 bytes) for the LUKS header, but the resize path
does not.
Effects:
-
Live resize fails inside QEMU. The agent runs
virsh blockresizewith the
new size; QEMU needs new size + LUKS payload offset on the underlying block
device, which is larger than the device, and returns:internal error: unable to execute QEMU command 'block_resize': Cannot grow device filesThe failure is not surfaced.
notifyqemu()inresizevolume.shonly logs
"failed to live resize", the script exits 0, the agent returns success and
the resizeVolume job succeeds. The guest keeps seeing the old size. -
Size mismatch. CloudStack records the requested size, but once QEMU
re-reads the device (VM stop/start, or a manual blockresize) the guest sees
the requested size minus the LUKS header. The same shortfall applies to
offline resize, without any error (from code reading, not tested). -
Rollback uses the same unadjusted size (from code reading, not tested).
If the StorPool API call or the agent command fails,resizeVolume()calls
StorPoolUtil.volumeUpdate(name, oldSize, true, ...), i.e. shrinkOk=true
with the CloudStack size. For an encrypted volume that has never been
resized the device is oldSize + 2097152, so this requests a 2 MiB shrink of
a LUKS device.
Code references (main at cc30155defc89bce24a253df892a0494ae8bba1e):
- Create adds the allowance:
https://github.com/apache/cloudstack/blob/cc30155defc89bce24a253df892a0494ae8bba1e/plugins/storage/volume/storpool/src/main/java/org/apache/cloudstack/storage/datastore/driver/StorPoolPrimaryDataStoreDriver.java#L302
(also L876 and L879 for volumes created from a template/snapshot) - Resize does not (
updateVolumeByStorPoolQoS,updateVolumeByOffering):
https://github.com/apache/cloudstack/blob/cc30155defc89bce24a253df892a0494ae8bba1e/plugins/storage/volume/storpool/src/main/java/org/apache/cloudstack/storage/datastore/driver/StorPoolPrimaryDataStoreDriver.java#L495-L512 - Rollback with oldSize and shrinkOk=true:
https://github.com/apache/cloudstack/blob/cc30155defc89bce24a253df892a0494ae8bba1e/plugins/storage/volume/storpool/src/main/java/org/apache/cloudstack/storage/datastore/driver/StorPoolPrimaryDataStoreDriver.java#L420-L436 - QEMU side:
block_crypto_co_truncateadds the payload offset, and
raw_co_truncaterejects growth of a block device:
https://github.com/qemu/qemu/blob/v9.0.0/block/crypto.c#L433-L449
https://github.com/qemu/qemu/blob/v9.0.0/block/file-posix.c#L2670-L2678
The header allowance was introduced with StorPool encryption support in #7539.
versions
on all versions
The steps to reproduce the bug
- KVM zone with StorPool primary storage and a host that supports volume
encryption. Create a custom-size disk offering with encrypt=true, tagged
to the StorPool pool. - Create a 10 GiB data volume from that offering and attach it to a running
VM. On the host,blockdev --getsize64on the StorPool device shows
10739515392 (10 GiB + 2097152); the guest sees 10737418240. - Resize the volume while the VM is running:
cmk resize volume id= size=20 - Observe:
- the resizeVolume job succeeds and CloudStack reports 20 GiB
blockdev --getsize64shows 21474836480 (exactly 20 GiB, no allowance)- libvirtd logs the block_resize "Cannot grow device files" error
- the guest still sees 10 GiB
Expected: the StorPool volume is resized to 20 GiB + 2097152, blockresize
succeeds, and the guest sees 20 GiB, matching what CloudStack reports.
What to do about it?
Apply the same allowance on resize as on create, for encrypted volumes only:
- In
updateVolumeByOfferingandupdateVolumeByStorPoolQoS, send
payload.newSize + 2097152to the StorPool API when the volume has a
passphrase (or KMS key on main).updateVolumeByStorPoolQoSneeds the
volume passed in. - Use the same adjusted size for the rollback in
resizeVolume(). - Keep
payload.newSizefor the agent command and for the size stored in
the database.
Sketch:
private static long getStorPoolVolumeSize(VolumeObject vol, long size) {
boolean encrypted = vol.getPassphraseId() != null || vol.getKmsKeyId() != null;
return encrypted ? size + 2097152 : size;
}
Volumes already resized under this bug have no allowance; the next resize
after the fix would correct them.
Separately, it may be worth surfacing the blockresize failure instead of
returning success, so a failed live resize is visible in the job result.
- 主要言語
- Java
- スター
- 3.1k
- フォーク
- 1.4k
- 平均マージ
- 7日 16時間
- マージ済み PR(30日)
- 15
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートあり
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
apache/cloudstack のほかの issue
-
resizeVolume of a running system VM's volume is accepted but the VM never sees the new size対応中かも @bhouse-nexthop が 3 日前に担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
apache/cloudstack#14645 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
VR reports a load balancer change as applied when haproxy.cfg cannot be replaced対応中かも @bhouse-nexthop が 3 日前に担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
apache/cloudstack#14633 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
restartNetwork reports a ResourceUnavailableException as an unexpected error (530), unlike restartVPC (534)対応中かも @bhouse-nexthop が 3 日前に担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
apache/cloudstack#14631 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
apache/cloudstack#14625 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
Remote access VPN users are disconnected on every LB, ACL, port forward or firewall change (xl2tpd restarted on every iptables pass)対応中かも @willbennett-devops が 12 日前に担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
apache/cloudstack#14545 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
apache/cloudstack の issue をすべて見る
似ている issue
-
bug emitter:client:csharp
難易度 2/5 1〜3時間 初心者へのやさしさ 84/100
microsoft/typespec#12572 · コメント 1 件 · リアクション 1 件 ·
メンテナーはふだん 1 日以内に返信
-
[BUG]: Java SDK MountRequest always sends update-optional fields, resetting stored mount settingsオープンbug
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
メンテナーはふだん 1 日以内に返信
-
GCC 15.2: -Wcast-qual warning - cast discards const qualifier from pointer target type (H5trace.c)オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 73/100
メンテナーはふだん 1 日以内に返信
-
[Bug] RemotingHelper.connect swaps the socket send and receive buffer configuration対応中かも @amalsaidov が今日担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 82/100
メンテナーはふだん 1 日以内に返信
-
needs-area-label
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
メンテナーはふだん 2 日以内に返信