3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(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操作 応用編