ハウツー:LVMで楽々ディスク管理
LVM入門
LVMの使い方の説明に入る前に、LVMの用語を知っておこう。LVMでは、一般的なパーティションのことを「PV(Physical Volume、物理ボリューム)」と呼ぶ。そして一つ以上のPVが集まって、「VG(Volume Group、ボリューム・グループ)」を構成する。そして各VGは「LV(Logical Volumes、論理ボリューム)」に分割される。
LVは通常のパーティションと同じように機能し、Ext3などのファイルシステムを入れて、マウントポイントにマウントして使うことができる。VGのことを仮想的なハードディスクだと考え、LVのことを仮想的なハードディスク上の仮想的なパーティションだと考えても差し支えないだろう。
LVMを始める
LVMを始めるにはまず、lvm2パッケージをインストールする必要がある。DebianユーザとFedoraユーザは、それぞれapt-getやyumを使用してlvm2をインストールすることができる。
LVMは、2.4.xシリーズでLinuxカーネルに統合されたので、今ではほぼすべてのLinuxディストリビューションでサポートされている。FedoraやDebianなどのいくつかのディストリビューションでは、ディストリビューションのインストール時のパーティション分割の際にLVMを使用することができるようになっている。またFedoraやSUSEなどの一部のディストリビューションでは、LVMのボリュームを管理するためのグラフィカルなツールも提供されている。
この記事では、LVMのボリュームを作成して、/homeディレクトリの中にマウントして使用する方法を説明する。なお私のルートパーティション(/)はsda1で、sda2はスワップ領域となっている。またディスク上に未使用領域が多少残っているので、そこにパーティションを作成することにする。なおすでに空きパーティションがある場合には、fdisk(やその他のパーティション分割用ツール)を使用してそのパーティションのシステムIDをLVMに変更するだけで、VGの作成に進むことができる。
パーティションを分割するには、目的のディスク――私の場合/dev/sda――に対してfdiskを実行する。あるいはグラフィカルなツールの方が使いやすいという場合にはGPartedを使用すると良いだろう。
fdisk /dev/sda
上記のコマンドを実行すると、以下のようなメッセージとコマンドを入力するためのプロンプトが表示される(なお、シリンダの数はあなたの場合には異なる数字が表示されるだろう)。
The number of cylinders for this disk is set to 1958. There is nothing wrong with that, but this is larger than 1024, and could in certain setups cause problems with: 1) software that runs at boot time (e.g., old versions of LILO) 2) booting and partitioning software from other OSs (e.g., DOS FDISK, OS/2 FDISK) Command (m for help):
まず、新しいパーティションを作成するために n
というコマンドを入力する。続いて p
を入力してプライマリパーティションを作成する。続いて作成したプライマリパーティションのパーティション番号を指定する。続いて入力する最初と最後のシリンダの番号については、デフォルトのままにしておくのがおそらく良いだろう。
以上でプライマリパーティションを作成することができた。次のステップとして、パーティションのタイプをLVMに変更しよう。具体的に言うと、パーティションのシステムIDの値を、新しいパーティションに対してデフォルトで割り振られる「83」ではなく、「8e」に変更する必要がある。
システムIDの値を変更するためには、fdiskの t
コマンドを使用する。目的のパーティションの番号を選択して、パーティションのタイプとして「8e
」を入力する。最後にEnterを入力すると、fdiskが変更後のパーティションタイプ(Linux LVM)を表示する。
システムIDが変更されたことを確かめるには、パーティションテーブルを確認すれば良い。 p
を入力して、パーティションテーブルを表示しよう。
Disk /dev/sda: 16.1 GB, 16106127360 bytes 255 heads, 63 sectors/track, 1958 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sda1 * 1 1020 8193118+ 83 Linux /dev/sda2 1021 1173 1228972+ 82 Linux swap / Solaris /dev/sda3 1174 1958 3092512+ 8e Linux LVM
当然ながら上記の情報はあなたの場合には異なるものになるだろう。パーティションテーブルを保存するためには、 w
に続けてEnterを入力する。新しいパーティションテーブルは、コンピュータの再起動後に使用されるようになる。
VGの作成
ここで、PVとVGについて前述したことを思い出そう。VGは、一つ以上のPVから構成されているということだった。したがってVGを作成する前にPVを初期化する必要がある。そのためにはまず、新しいパーティションテーブルが使用されることを確実にするために、リブートする必要がある。その後、端末ウィンドウを開いてrootユーザとして、あるいはsudoを使用して以下のようなコマンドを実行しよう。
pvcreate /dev/sda3
これでPVを初期化することができた。そこで次に、このPVを使用するVGを作成しよう。VGには、一意の名前を与える必要がある。「 vgcreate home2 /dev/sda3
」というコマンドを実行すれば、/dev/sda3から成るhome2という名前のVGが作成される。
あるいは、複数のPVから構成されるVGを作成することもできる。例えば「vgcreate home3 /dev/sda3 /dev/sda5
」とすれば、sda3とsda5という2つのPVから構成されるVGが作成される。VGはまた、複数のハードディスクにまたがることもでき、例えば「vgcreate home4 /dev/sda /dev/sdb
」とすれば、2つのハードディスクにまたがったVGが作成される。vgscan
コマンドを使用すれば、全VGを表示することができる。
以上でVGが作成できたので、次にVGをLVに分割しよう。VG内には複数のLVを作成することもできるし、VGの全領域を使用する単一のLVを作成することもできる。「 lvcreate -n downloads --size 1G home2
」というコマンドを実行すれば、home2という名前のVGの中に、downloadsという名前の1GBのLVが作成される。LVの名前は-n
オプションで指定している。
なお以下で述べるようにLVをマウントする際にはLVの名前とVGの名前が両方とも必要になるが、lvdisplay
コマンドを使用すればLVの属性を見ることができる。
新しいLVを使い始めるには、まずそのLVのフォーマットとマウントを行なう必要がある。LVは/dev/VG名/LV名(ここでは/dev/home2/downloads)として利用可能になっているはずなので、rootユーザになって「 mkfs.ext3 /dev/home2/downloads
」というコマンドを実行すれば、LVをExt3ファイルシステムとしてフォーマットすることができる。
次に、「 mkdir /home/downloads
」というコマンドを実行して/homeディレクトリの中にディレクトリを作成する。その後、「 mount -t ext3 /dev/home2/downloads /home/downloads
」というコマンドを実行して、作成したディレクトリにLVをマウントする。マウントポイントの名前は必ずしもLVの名前と同じでなくても良いが、混乱を避けるために同じ名前を用いた方が良いだろう。なお/etc/fstabに以下のような行を追加しておくと、ブートの際にdownloadsというLVを毎回自動的にマウントさせることができる。
/dev/home2/downloads /home/downloads ext3 defaults 1 2
これでdownloadsというLVにデータを保存することができるようになった。
LVの大きさを変更する
新しく作成したLVだが、将来的にはやがてその領域も足りなくなると考えておいて間違いはないだろう。そのような場合には、lvextend
コマンドを使用してLVを大きくすることができる。
ただしこれを行なうにはVGに空き領域がなければならない。とは言えVGに空き領域がないという場合でもあきらめる必要はなく、その場合には次節で紹介する、VGにPVを追加するための作業を先に行なえば良い。
上記の例では、2GBの領域を持つVGの中に1GBのLVを作成したので、LVの大きさをもう1GB分大きくすることが可能だ。ただしLVを大きくする前にLVをアンマウントする必要がある。Ext3ファイルシステムはアンマウントしなくても大きさを変更することが可能なのだが、念のために無難な方法で行なっておこう。それではまず「 umount /home/downloads
」というコマンドを実行してハードディスクをアンマウントしよう。これにより、/etc/fstabにエントリを追加しておいた場合にはLVをアンマウントすることができる。そうでない場合には、「 umount /dev/home2/downloads
」を実行すればアンマウントすることができる。
次に、「 lvextend -L +1G /dev/home2/downloads
」というコマンドを実行する。成功した場合、LVの大きさが1GB分増えて、以下のようなメッセージが表示されるはずだ。
Extending logical volume downloads to 2.00 GB Logical volume downloads successfully resized
LVを大きくすることができたことを確認するには、lvdisplay
コマンドを実行すれば良い。次に、大きくなったLVに合わせてファイルシステムの大きさを変更しよう。「 resize2fs /dev/home2/downloads
」を実行すれば、LV上のext3ファイルシステムの大きさを変更することができるので、あとは再びマウントするだけだ。
lvextend
コマンドに似たコマンドに、lvreduce
コマンドがある。lvreduce
コマンドを使えば、LVの大きさを小さくすることができる。ただしこれを行なうことは、LV上のデータが失われる恐れがあるため、リスクが高いと考えられている。lvreduceコマンドを使用するには、あらかじめresize2fsコマンドを使用してLV上のファイルシステムの大きさを変更しておく必要がある。
「 lvreduce -L -500M /dev/home2/downloads
」を実行すれば、LVの大きさを500MB分小さくすることができる。しかしlvreduceは危険を伴うコマンドであるため、全データのバックアップを取らずにLVの大きさを劇的に小さくするようなことはやめておいた方が良いだろう。
VGを変更する
LVが、VG内のすべての領域を使い尽くしてしまったという場合にはどうすれば良いだろうか?その場合には、既存のVGにさらにPVを追加したうえで、前述したようにLVを大きくすれば良い。
まず始めに、VG内のLVをアンマウントしよう。その後「 vgextend home2 /dev/sda5 /dev/sda7
」というコマンドを実行すれば、home2という名前の既存のVGにsda5とsda7という2つのPVを追加することができる(もちろんsda5とsda7はあらかじめ利用可能にしておく必要がある)。上記のコマンドを実行するとhome2というVGはsda3、sda5、sda7から構成されることになる。
VGを削除するためは、VGに含まれているすべてのLVを先に削除しておく必要がある。LVをアンマウントして、「 lvremove /dev/home2/downloads
」というコマンドを実行すれば、LVとそれに含まれている全データが削除される。その後、vgremoveコマンドを「 vgremove home2
」のようにして実行すれば、VGを削除することができる。
まとめ
LVMを使用するようになって以来、万が一ディスク空間が足りなくなったとしてもVGにパーティションを新たに追加しさえすればLVを大きくすることができると分かっているので、私は毎晩よく眠れるようになった。
既存のVGに追加するパーティションは必ずしも物理的に同じハードディスク上になくても良いということも、さらなる利点だ。前述したように、LVMではLVを大きくすることができるだけではなく、VGを大きくすることもできる。ただし当然ながら、LVを大きくするためにはVG内に空き領域がなければならず、VGを大きくするためには未使用のPVがなければならない。
Shashank Sharmaは、コンピュータサイエンスの学位を目指す学生。フリー/オープンソースソフトウェアの初心者向けの記事の執筆を専門的に行なっている。Apress社刊「Beginning Fedora」の共著者。