人気ブログランキング | 話題のタグを見る
(Linux)LVMパーティションを縮小する方法
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操作 応用編
by Jehoshaphat | 2011-10-27 23:48 | Linux


<< (Linux)故障したバッファ... (VBA)Excelでシートを... >>