CentOS(RedHat系)ではデフォルトでインストールを行うとパーティションにLVMが用いられます。
LVMを使うと複数のディスクにまたがってボリュームを作成できたり、ボリュームのスナップショットも簡単にとれたり便利なんですが、いざ障害がおきたり今回のようにLVMパーティションを縮小しようとすると面倒です。
(LVMについての基本的なことは下記参照)
ITmedia エンタープライズ:特集:LVMによるディスクパーティションの動的化(後編)
LVM とは - Linuxキーワード:ITpro
エンタープライズ:特集:LVMによるディスクパーティションの動的化(前編)
3. LVM(Logical Volume Manager)(第2章ディスク管理~上級:基本管理コースII)
LVM - IT Systemの作り方
さて、今回パーティションは下記のようになっていました。
(HDDがcciss/c0doってなっているのは今回試したのがUrtra-SCSIのサーバだからです。)
/dev/cciss/c0d0p1(ntfs windows用 64GB)
/dev/cciss/c0d0p2(ntfs windows用 21GB)
/dev/cciss/c0d0p3(ext3 centos /boot用 100MB)
/dev/cciss/c0d0p4(拡張領域 55GB)
/dev/cciss/c0d0p5(LVM用 VolGroup00 55G)
LVM(VolGroup00)の中身は下記のようになっています。
LogVol00 (ext3 centos /用 53GB)
LogVol01 (swap用 2GB)
もともとWindowsサーバを入れてて、後からCentOSをLVMで入れました。
今回、Fedoraを入れたいということで、CentOSで使っているパーティションを縮小してそこに、Fedoraを入れるという要件です。
CentOSで作ったLVMの中身は / 用の ext3 ファイルシステムと、SWAP用ボリュームです。
Pantora Networks ≫ 3章 LVM操作 応用編によると、ext3ファイルシステムの縮小はオフラインでないとできないようです。(全般的にファイルシステムの拡大はオンラインでサポートしている場合が多いようです)
オフラインでやらないといけないということで、CentOSのLiveCDで起動試みたんですがエラーとなったんで、手元にあったUbuntu10.10でCDブートしました。
Ubuntuの場合、デフォルトではLVMにアクセス出来ないのでlvm2パッケージをインストールします。
apt-get install lvm2
lvm vgchange -a y
pvscan や lvscan コマンドでLVMの状態が確認できるので、作業途中随時叩いてみるといいかと思います。
縮小の方法は
CentOS で LVM 物理/論理ボリュームサイズを縮小する - maruko2 Noteを参考にさせてもらいました。
ファイルシステムサイズの縮小
まず、ファイルシステムを縮小する必要があるのですが、ファイルシステムをチェックしないと縮小できないので、チェックを行います。
umount /dev/VolGroup00/LogVol00
e2fsck -f /dev/VolGroup00/LogVol00
※CentOSだとLVへのパスは /dev/mapper/VolGroup00-LogVol00 となりますが、Ubuntuだと /dev/VolGroup00/LogVol00 になるようです。
そしてファイルシステムのリサイズを行います。
resize2fs /dev/VolGroup00/LogVol00 43G
論理ボリューム(LV)のサイズ縮小
下記コマンドでLVボリュームを縮小し、確認します。。
lvreduce -L 43G /dev/VolGroup00/LogVol00
lvdisplay /dev/VolGroup00/LogVol00
物理ボリューム(PV)のサイズ縮小
CentOSだと、system-config-lvm コマンドを実行すると、グラフィカルな LVM ツールが起動し論理ボリュームが分かるようですが、Ubuntuの場合はパッケージを入れないと見れないようです。
LogVol00を縮小したので、ボリューム配置的には下記のようになっています。
LogVol00 (ext3 centos /用 43GB)
空き (10GB)
LogVol01 (swap用 2GB)
SWAP用にしている LogVol01 を前方に移動させないといけません。
が、簡単には移動できないようなので一旦このSWAP用LVボリュームを削除して新たに作成するという方法を取ります。
swapoff /dev/VolGroup00/LogVol00 ←SWAPをOFFに
lvremove /dev/VolGroup00/LogVol00 ←LV削除
lvcreate -L 5G -n LogVol01 VolGroup00 ←LV新規作成
mkswap /dev/VolGroup00/LogVol00 ←スワップ作成
swapon /dev/VolGroup00/LogVol00 ←SWAP領域として割り当てる
これでPVの縮小の準備ができました。
下記コマンドでPVの縮小ができます。
pvresize --setphysicalvolumesize 45.1G /dev/cciss/c0d0p5
下記のようなエラーがでたら、指定サイズが小さすぎることになるので、サイズの指定を大きくしてみてください。(メガ単位の指定も可能なようです。45100MB 等)
0 physical volume(s) resized / 1 physical volumes(s) not resized
パーティションの縮小
この段階ではまだパーティション(/dev/VolGroup00)はもとのサイズを保っています。
最後にこれを fdisk を使って縮小します。
fdsik
コマンド (m でヘルプ): p ←パーティション確認
Disk /dev/cciss/c0d0: 145.6 GB, 145667358720 bytes
255 heads, 32 sectors/track, 34866 cylinders
Units = シリンダ数 of 8160 * 512 = 4177920 bytes
デバイス Boot Start End Blocks Id System
/dev/cciss/c0d0p1 * 1 15855 64688384 7 HPFS/NTFS
/dev/cciss/c0d0p2 15856 21179 21721920 7 HPFS/NTFS
/dev/cciss/c0d0p3 21180 21204 102000 83 Linux
/dev/cciss/c0d0p4 21205 34866 55740960 5 拡張領域
/dev/cciss/c0d0p5 21205 34866 55740928 8e Linux LVM
fdisk /dev/cciss/c0d0
コマンド (m でヘルプ): d ←パーティションを削除
領域番号 (1-5): 5 ←5番目を削除
コマンド (m でヘルプ): n ←新規パーティション作成
l 論理(5 以上)
p 基本区画(1-4)
コマンド(mでヘルプ): e ←論理パーティション
最初 シリンダ (21205-34866, 初期値 21205): ←そのままEnter
初期値 21205 を使います
Last シリンダ, +シリンダ数 or +size{K,M,G} (14-7296, 初期値 7296):+45.1G ←PVよりちょっと大きぐらいにしておく
コマンド (m でヘルプ): p
Disk /dev/cciss/c0d0: 145.6 GB, 145667358720 bytes
255 heads, 32 sectors/track, 34866 cylinders
Units = シリンダ数 of 8160 * 512 = 4177920 bytes
デバイス Boot Start End Blocks Id System
/dev/cciss/c0d0p1 * 1 15855 64688384 7 HPFS/NTFS
/dev/cciss/c0d0p2 15856 21179 21721920 7 HPFS/NTFS
/dev/cciss/c0d0p3 21180 21204 102000 83 Linux
/dev/cciss/c0d0p4 21205 34866 55740960 5 拡張領域
/dev/cciss/c0d0p5 21205 32256 45092144 8e Linux LVM
コマンド (m でヘルプ): w
どうやら、パーティションを縮小するには一旦削除し、再度テーブルを定義するという荒業が必要なようですね。
これで、拡張領域に完全な空きができました。
いや、なかなかこれだけするのに苦労しましたよ。。
参考:
LVM領域の縮小 - 間違いだらけの備忘録
Pantora Networks 3章 LVM操作 応用編