RHEL 7 では、ディスクパーティションのオンラインサイズ変更がサポートされますか?
Environment
- Red Hat Enterprise Linux 7
Issue
- Xen および KVM の両方で、仮想マシンの使用する仮想ブロックデバイスのオンラインサイズ変更がサポートされています。
- しかしながら、起動用仮想ブロックデバイスのパーティションはすでに使用されているので、それらをオンラインで変更することはできず、再起動しない限り、起動用仮想ブロックデバイスに加えた変更は仮想マシンに反映されません。
- パーティションが設定されたボリュームを動的に増やす機能が望まれますが、RHEL 7 では、ディスクパーティションのサイズをオンラインで変更することはできますか。
- SAN にアタッチしたボリュームをオフラインにせずに動的に増やすことができません。ディスクパーティションのオンラインサイズ変更をサポートするこの機能は、いつごろ利用可能になりますか?
Resolution
論理ボリュームおよびファイルシステムのサイズを変更する機能は、長い間 Logical Volume Manager (LVM) により提供されてきました。この場合、単にブロックデバイス全体 (例: /dev/sdx
) を LVM ボリュームグループの物理ボリュームとして使用しています。 古いスタイルのパーティションでは、パーティションのサイズ変更は必要ありません。 このため、論理ボリュームおよびファイルシステムを簡単に拡張することができました。
より古いスタイルのパーティションに関しては、この機能は RHEL 7 の現在のリリースに機能要求として追加されています (ディスクパーティションのオンラインサイズ変更のサポートを RHEL 7 に追加するために、RHBZ#853105 として REF が起草されています)。この機能により、RHEL 7 でディスクパーティションのサイズをオンラインで変更することができます。
免責事項: Red Hat により提供される以下の情報は、公開されている サービスレベルアグリーメント およびサポートプログラム (製品サポート (Red Hat カスタマーポータル)) の対象ではありません。情報はそのままの状態で提供され、本アーティクルの情報から作成された構成設定またはアプリケーションのインストールにより、オペレーティングシステムが Red Hat Global Support Services のサポートを受けられなくなる場合があります。本アーティクルの目的は、システムのニーズを満たす情報を提供することです。本アーティクルの情報は、ユーザー自身の責任において使用してください。
技術的な観点からは、ファイルシステムおよびそのベースとなるパーティションのサイズ変更 (既存のパーティションテーブルの変更) は、非常に 危険な操作と言えます。また、ディスク上の終了位置からしかパーティションのサイズを変更することはできません。ディスク上でパーティションを移動したり、開始位置からサイズを変更したりすることはできません。このような操作を行うとパーティションテーブルが破損し、ディスクデバイス上の全データがアクセス不能になり、結果としてデータの損失を招きます。パーティションのオンラインサイズ変更を実施することは可能ですが、推奨はされません。これは、データの完全性に対する懸念が唯一の理由であり、技術的に不可能なためではありません。
補足情報については、「How can I extend an existing file-system partition without destroying data?」のアーティクルも参照してください。
- 使用中のパーティションのサイズをオンラインで変更するには、以下の手順を実施します。
# fdisk -l /dev/vda
Disk /dev/vda: 32.2 GB, 32212254720 bytes, 62914560 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000db7e6
Device Boot Start End Blocks Id System
/dev/vda1 * 2048 1026047 512000 83 Linux
/dev/vda2 1026048 28289023 13631488 8e Linux LVM
# cat /proc/partitions
major minor #blocks name
252 0 31457280 vda
252 1 512000 vda1
252 2 13631488 vda2
11 0 1048575 sr0
253 0 10240000 dm-0
253 1 2129920 dm-1
# pvs
PV VG Fmt Attr PSize PFree
/dev/vda2 rhel_vm-205 lvm2 a-- 13.00g 1.20g
-
ディスク上のパーティションテーブルを通常の手順で変更します (
fdisk
コマンドの使用)。-
パーティションを削除します。
Command (m for help): d Partition number (1,2, default 2): 2 Partition 2 is deleted
-
新しいサイズでパーティションを作成し直します。
Command (m for help): n Partition type: p primary (1 primary, 0 extended, 3 free) e extended Select (default p): p Partition number (2-4, default 2): 2 First sector (1026048-62914559, default 1026048): Using default value 1026048 Last sector, +sectors or +size{K,M,G} (1026048-62914559, default 62914559): +18G Partition 2 of type Linux and of size 18 GiB is set Command (m for help): t Partition number (1,2, default 2): 2 Hex code (type L to list all codes): 8e Changed type of partition 'Linux' to 'Linux LVM' Command (m for help): p Disk /dev/vda: 32.2 GB, 32212254720 bytes, 62914560 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk label type: dos Disk identifier: 0x000db7e6 Device Boot Start End Blocks Id System /dev/vda1 * 2048 1026047 512000 83 Linux /dev/vda2 1026048 38774783 18874368 8e Linux LVM
-
ディスク上のパーティションテーブルに加えた変更をコミットします。
Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. WARNING: Re-reading the partition table failed with error 16: Device or resource busy. The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8) Syncing disks.
-
ディスク上のパーティションテーブルは更新されても、メモリー上のカーネルパーティションテーブルは更新されていない点に注意してください。
# partprobe Error: Partition(s) 2 on /dev/vda have been written, but we have been unable to inform the kernel of the change, probably because it/they are in use. As a result, the old partition(s) will remain in use. You should reboot now before making further changes. # cat /proc/partitions | grep vd 252 0 31457280 vda 252 1 512000 vda1 252 2 13631488 vda2
-
-
--update
オプションでブロックデバイスを指定してpartx
(util-linux
パッケージにより提供される) を実行し、メモリー内のカーネルパーティションテーブルをディスク上のパーティションテーブルのサイズで更新します。# partx -u /dev/vda
-
メモリー内のカーネルパーティションテーブルが新しいサイズで更新されていることを確認します。
# cat /proc/partitions | grep vd 252 0 31457280 vda 252 1 512000 vda1 252 2 18874368 vda2
-
必要に応じてその他の手順を実施します (以下の例では、パーティション上の PV を拡張しています)。
# pvresize /dev/vda2 Physical volume "/dev/vda2" changed 1 physical volume(s) resized / 0 physical volume(s) not resized # pvs PV VG Fmt Attr PSize PFree /dev/vda2 rhel_vm-205 lvm2 a-- 18.00g 6.20g
Root Cause
-
使用中のパーティションのオンラインサイズ変更を許可するためには、カーネルおよびユーザーランドの両方に変更を加える必要があります。
- RHEL 7 カーネルには、BLKPG_RESIZE_PARTITION 操作をサポートするのに必要な BLKPG ioctl に対する変更 (block: add partition resize function to blkpg ioctl) が含まれています。
- RHEL 7
util-linux
パッケージに含まれるpartx
およびresizepart
バイナリーは、現在 BLKPG ioctl の BLKPG_RESIZE_PARTITION 操作をサポートする唯一のユーザーランドコマンドです。
Diagnostic Steps
http://lwn.net/Articles/506063/ を参照してください。
This solution is part of Red Hat’s fast-track publication program, providing a huge library of solutions that Red Hat engineers have created while supporting our customers. To give you the knowledge you need the instant it becomes available, these articles may be presented in a raw and unedited form.
Comments