いますぐ実践! Linuxシステム管理

[バックナンバーのトップへ] [Linux システム管理のトップへ]


いますぐ実践! Linux システム管理 / Vol.165 / 読者数:1330名

こんばんは、うすだです。

シルバーウィーク真っ盛りですが、みなさまいかがお過ごしでしょうか。

我が家では、息子が進研ゼミを消化することになっていて、少なくとも、 この土日は予定を何も入れておりません。

まあ、進研ゼミをやらずに、ためにためまくっていたため、 日曜日までに消化しないともう止めるよ、と最後通達を出したからなのですが。

止めるなら、もうやらなくてよくて楽できるじゃん、 とわたしなら思ってしまいそうですが、成績を上げたいという気持ちと最後通達が、 よい化学反応を起こしたようで、俄然やる気を出して黙々とこなし始めました。

わが子ながら、偉いなあと思います。
わたしも、息子のがんばりを脳裏に焼き付けて、 楽な方へと流されないでしっかりがんばらねばと思いました。

息子のがんばりに驚いてちゃいけないなと思いつつ、今回も、 はりきって書いてみました。

今回のお題 - LVM を導入する

前回、LVMで構成されたパーティションのサイズを増やしたり減らしたりする方法を、 ご紹介しました。

Vol.164 - LVM のパーティションを管理する
http://www.usupi.org/sysad/164.html

とはいえ、LVMで構成されたパーティションを持たない貴兄にとっては、 あまり有用な情報ではなかったように思います。

ですが、パーティションのサイズを動的に変えられると便利だなぁ、 と思う貴兄もいらっしゃったのではないかと思います。
特に、みんなで使っているサーバでは、 ホームや作業用のパーティションがみるみる使われて容量が足りなくなる、 という事態がしょっちゅう発生します。そんなとき、LVM で管理してありますと、 HDD を増設して動的に増やせますので、とても便利なのではないかと思います。

というわけで今回は、LVMのパーティションを新たに作る方法を、 ご紹介したいと思います。


まず、必要なものは、中身が失われても痛くもかゆくもない、 HDD か何かのパーティションと、LVMの管理ツールである lvm2 パッケージです。

もし、自由に使えるパーティションがないようでしたら、USBメモリでも構いません。 (あくまでもお試しになってしまいますが。)

また、which lvm を実行してないよと言われましたら、 lvm2 パッケージが入っていません。 yum や apt-get などで lvm2 パッケージを入手してくださいませ。

ちなみに、厳密には、Linuxカーネルも対応している必要がありますが、 いまどきはみんな対応しているようですので、ここでは気にしません。

そして、以降では、/dev/sda1 と /dev/sda2 を、物理ボリュームとして使用し、 論理ボリュームを構成していく手順をご紹介したいと思います。
具体的には、以下のような構成です。(実は 512MB の USBメモリです。)

  # fdisk -l /dev/sda

  Disk /dev/sda: 504 MB, 504365056 bytes
  16 heads, 32 sectors/track, 1924 cylinders
  Units = cylinders of 512 * 512 = 262144 bytes

     Device Boot     Start        End      Blocks   Id  System
  /dev/sda1              1        489      125168   8e  Linux LVM
  /dev/sda2            490        978      125184   8e  Linux LVM
  /dev/sda3            979       1924      242176   83  Linux

LVM で使用するためには、 パーティションのシステムID が 0x8e である必要があるそうです。
0x8e でなくても使えた記憶があるのですが、念のため、 fdisk コマンドで変更しておいてください。
少々長いですが、以下に例を示しておきます。

  # fdisk /dev/sda
  ...中略...

  Command (m for help): t               <== "t" でIDの変更
  Partition number (1-4): 1             <== sda1 を指定
  Hex code (type L to list codes): 8e   <== 0x8e を指定
  Changed system type of partition 1 to 8e (Linux LVM)

  Command (m for help): t               <== "t" でIDの変更
  Partition number (1-4): 2             <== sda2 を指定
  Hex code (type L to list codes): 8e   <== 0x8e を指定
  Changed system type of partition 2 to 8e (Linux LVM)

  Command (m for help): p               <== "p" で一覧表示(確認)

  Disk /dev/sda: 504 MB, 504365056 bytes
  16 heads, 32 sectors/track, 1924 cylinders
  Units = cylinders of 512 * 512 = 262144 bytes

     Device Boot     Start        End      Blocks   Id  System
  /dev/sda1              1        489      125168   8e  Linux LVM
  /dev/sda2            490        978      125184   8e  Linux LVM
  /dev/sda3            979       1924      242176   83  Linux

  Command (m for help): w               <== "w" で変更を反映し終了
  The partition table has been altered!

  Calling ioctl() to re-read partition table.
  Syncing disks.
  #

これで、スタート地点に立つことができました。


それでは、あれこれ言わず、いきなり構成していきたいと思います。

まずは、物理ボリュームの初期化を行います。
そのためには、pvcreate というコマンドを使用します。
引数に、物理ボリュームとして使用したいパーティションを指定して実行します。

  # pvcreate /dev/sda1 /dev/sda2

すると、それらが物理ボリュームに仕立てあげられます。
pvscan コマンドで確認してみましょう。

  # pvscan
    PV /dev/sda1         lvm2 [122.23 MB]
    PV /dev/sda2         lvm2 [122.25 MB]
    Total: 2 [244.48 MB] / in use: 0 [0   ] / in no VG: 2 [244.48 MB]

/dev/sda1, /dev/sda2 ともに、PV(物理ボリューム)となりました。

 

では次に、ボリュームグループを作成します。
そのためには、vgcreate というコマンドを使用します。
引数に、ボリュームグループが使用する物理ボリュームを指定します。
たとえば、/dev/sda1, /dev/sda2 の両方を使って、 Volume00 という名前のボリュームグループを作成するには、以下のように実行します。

  # vgcreate Volume00 /dev/sda1 /dev/sda2

同様に、pvscan コマンドで確認してみましょう。

  # pvscan
  PV /dev/sda1   VG Volume00   lvm2 [120.00 MB / 120.00 MB free]
  PV /dev/sda2   VG Volume00   lvm2 [120.00 MB / 120.00 MB free]
  Total: 2 [240.00 MB] / in use: 2 [240.00 MB] / in no VG: 0 [0   ]

/dev/sda1 と /dev/sda2 がともに、 Volume00 という名の VG(ボリュームグループ)に属したことがわかります。

ちなみに、ボリュームグループから物理ボリュームを外したくなったときには、 vgreduce というコマンドを使用します。
引数に、ボリュームグループ名と、削除したいデバイスを指定します。
(以下では、Volume00 から /dev/sda2 を外して、/dev/sda1 だけにしています。 また、pvscan は確認のために実行しているだけです。)

  # vgreduce Volume00 /dev/sda2
    Removed "/dev/sda2" from volume group "Volume00"
  # pvscan
    PV /dev/sda1   VG Volume00   lvm2 [120.00 MB / 120.00 MB free]
    PV /dev/sda2                 lvm2 [122.25 MB]
    Total: 2 [242.25 MB] / in use: 1 [120.00 MB] / in no VG: 1 [122.25 MB]

逆に、増やしたいときは、vgextend というコマンドを使用します。
同様に、ボリュームグループ名と追加するデバイスを引数に指定します。

  # vgextend Volume00 /dev/sda2
    Volume group "Volume00" successfully extended

 

さあ、いよいよ、論理ボリュームを作成したいと思います。
そのためには、lvcreate コマンドを使用します。
-n オプションで論理ボリュームの名前を、-L オプションで必要なサイズを指定します。 使用するボリュームグループは必ず指定してください。

たとえば、128MBの論理ボリューム LogVol00 を、Volume00 から構成する場合、 以下のように実行します。

  # lvcreate -L 128M -n LogVol00 Volume00

念のため、lvscan コマンドで確認してみましょう。

  # lvscan
    ACTIVE           '/dev/Volume00/LogVol00' [128.00 MB] inherit

無事に作成されました。
ちなみに、/dev/Volume00/LogVol00 というのはシンボリックリンクで、 実際は /dev/mapper/Volume00-LogVol00 になるようです。

  # ls -l /dev/Volume00/LogVol00
  lrwxrwxrwx 1 root root 29 Sep 15 01:42 /dev/Volume00/LogVol00 \
  -> /dev/mapper/Volume00-LogVol00
  # ls -lL /dev/Volume00/LogVol00
  brw-rw---- 1 root disk 253, 0 Sep 15 01:42 /dev/Volume00/LogVol00

さて、それでは、作成した論理ボリュームを使ってみましょう。
以下では、mkfs.ext3 コマンドで ext3 ファイルシステムに仕立て上げ、 それを /test に mount しています。

  # mkfs.ext3 /dev/mapper/Volume00-LogVol00
  # mount /dev/mapper/Volume00-LogVol00 /test
  # ls /mnt
  lost+found/

あとは、/etc/fstab に書いておけば、再起動後には、 めでたく自動的に mount されるようになります。
たとえば、/dev/mapper/Volume00-LogVol00 を /test に mount するためには、 /etc/fstab に以下の一行を追加します。

  /dev/mapper/Volume00-LogVol00  /test  ext3  defaults 1 3

ちなみに、上記の5番目の 1 は、 dump コマンドの対象とするかどうかの指定になります。 通常は 1 を指定しておけばよいと思います。
また、上記の6番目の 3 は、fsck コマンドでチェックを行う順番を指定する数値です。 他のエントリの一番大きい数値+1 を指定しておけばよいと思います。

 

ところで、通常は、initrd に lvm コマンドが組み込まれているため、 / を mount する前に論理ボリュームをアクティブにしてくださいます。

しかし、自作の lvm なしの initrd などを使用していますと、 起動時にアクティブになっていないため、/etc/fstab に書いていても、 mount をしてくださいません。

  # lvscan
    inactive         '/dev/Volume00/LogVol00' [128.00 MB] inherit
  # mount -t ext3 /dev/mapper/Volume00-LogVol00 /test
  mount: special device /dev/mapper/Volume00-LogVol00 does not exist

そもそも、mount したくてもデバイスファイルがないようです。
そんなときは、vgchange コマンドでアクティブにします。
-a オプションで y と指定しますと、アクティブになってくれます。

  # vgchange -a y Volume00
    1 logical volume(s) in volume group "Volume00" now active
  # lvscan
    ACTIVE           '/dev/Volume00/LogVol00' [128.00 MB] inherit
  # mount /dev/mapper/Volume00-LogVol00 /test
  # df /test
  Filesystem         1K-blocks     Used Available Use% Mounted on
  /dev/mapper/Volume00-LogVol00
                        126931     5664    114714   5% /test

無事、mount もできました。


以上、LVM を導入して、パーティションを一から生成する方法を、ご紹介しました。

説明が長ったらしくなってしまいましたが、物理ボリュームとボリュームグループ、 論理ボリュームの関係がイメージできれば、それほど難しくはないと思います。

LVM はとても便利だと思います。もし、今まで使ったことがなかったり、 LVM で作られているけど構成を変更したことがないという貴兄は、ぜひ、 導入を検討していただければと思います。

宿題の答え

前回の宿題は、

  LVM で構成された / のパーティションサイズを減らしてみましょう。

でした。

ファイルシステムが ext3(ext2 もです)の場合、サイズを減らす際には、 一旦 umount する必要がありました。

しかし、/ など、Linuxの走行中に umount できないファイルシステムもありますよね。 そんなときはどうしましょう? …というのが宿題でした。

はい、お察しの通り、CD-ROMやUSBメモリなど、HDD 以外から立ち上げ、 サイズを減らせばよい、ということですね。

ここでは、だれもがご存知な、KNOPPIX を使用してみたいと思います。
最新版は、以下などから入手できると思いますが、わたしは、 手元にある KNOPPIX 5.3.1 + Xen 3.2.1 の CD-ROM 版を使用しました。
(とにかく、lvm2 パッケージが入っていれば問題ないと思います。)

KNOPPIX Japanese edition
http://www.rcis.aist.go.jp/project/knoppix/

KNOPPIX を立ち上げたら、まずは一連のコマンドを実行してみましょう。

  # pvscan
    PV /dev/hda3  VG VolGroup00  lvm2 [100.00 GB / 384.00 MB free]
    Total: 1 [100.00 GB] / in use: 1 [100.00 GB] / in no VG: 0 [0]
  # vgscan
    Reading all physical volumes.  This may take a while...
    Found volume group "VolGroup00" using metadata type lvm2
  # lvscan
    inactive        '/dev/VolGroup00/LogVol01' [99.09 GB] inherit
    inactive        '/dev/VolGroup00/LogVol00' [512.00 MB] inherit
    inactive        '/dev/VolGroup00/LogVol02' [32.00 MB] inherit

このように、一通り認識してくださっています。
ちなみに、/ は /dev/VolGroup00/LogVol01 です。

ただ、論理ボリュームがみな "inactive" になっていますね。
ですので、vgchange コマンドを使って、アクティブにしましょう。

  # vgchange -a y VolGroup00
    3 logical volume(s) in volume group "VolGroup00" now active
  # lvscan
    ACTIVE          '/dev/VolGroup00/LogVol01' [99.09 GB] inherit
    ACTIVE          '/dev/VolGroup00/LogVol00' [512.00 MB] inherit
    ACTIVE          '/dev/VolGroup00/LogVol02' [32.00 MB] inherit

みんなめでたく "ACTIVE" になりました。
では次に、tune2fs コマンドを実行して、 /dev/VolGroup00/LogVol01 のサイズを確認します。

  # tune2fs -l /dev/VolGroup00/LogVol01
  ...
  Block count:              25976832
  ...
  Block size:               4096
  ...

/dev/VolGroup00/LogVol01 のサイズは、 ブロックサイズが 4096バイトでそれが 25,976,832個ありますので、 以下のように求められます。

  25,976,832*4096/1024/1024/1024 = 99.09375 GB

これは、lvscan の出力結果 "[99.09 GB]" と一致します。

さて、ここで、99.09 GB から 96 GB にしたいとしましょう。
MB に換算しますと、99.09 GB は 101,472 MB になります。

  25,976,832*4096/1024/1024 = 101,472 MB

かたや、96 GB は 98,304 MB になります。

  96*1024 = 98,304 MB

ですので、前回と同様に、e2fsck を通してから、 resize2fs でファイルシステムのサイズを 96 GB に変更し、 lvreduce で論理ボリューム自体のサイズを減らします。

  # e2fsck -f /dev/VolGroup00/LogVol01
  # resize2fs /dev/VolGroup00/LogVol01 98304M
  # lvreduce -L -3168M /dev/VolGroup00/LogVol01

念のため、mount して確認してみましょう。

  # mount /dev/VolGroup00/LogVol01 /media/hda3
  # df /media/hda3
  Filesystem        1K-blocks      Used Available Use% Mounted on
  /dev/mapper/VolGroup00-LogVol01
                     99083868  12363176  82694164  14% /media/hda3

あとは、KNOPPIX を終了させて、Linux を起動すればよいですね。

ちなみに、initrdでやってしまえば CD-ROM が要らないのでは、と思い、 ちょっと試してみたのですが、一筋縄ではいきませんでした。
具体的には、resize2fs まではできたのですが、 lvreduce がうまく動作してくれません。
原理的には、Linux 起動後に lvreduce しても問題ないはずなのですが、 何かまずいことが起こると恐いですし、手順も明確ではありませんので、 ご紹介するのは止めておこうと思います。(スミマセン…)

今回の宿題

今回の宿題は、

  物理ボリュームとボリュームグループ、論理ボリュームの関係をわかり
  やすく出力するコマンドを作ってみましょう。

です。

あ、いえ、別に、今のコマンド群でもわかるのですが。
ふと、ボリュームグループがどんな物理ボリュームから構成されていて、 どんな論理ボリュームに使われているのかを、 単純明解に出力してくれるコマンド(スクリプト)があればよいなあと思ったのです。

もし共感していただけましたら、そのようなものを作ってみてください。

あとがき

ちまたでは、日々さまざまな言語が生まれておりますが、 あれもこれもと手を出しすぎるのも無節操だと思い、Perl を再勉強しています。

プログラミングPerl<VOLUME1>
http://www.amazon.co.jp/exec/obidos/ASIN/4873110963/usupiorg06-22

20世紀のころから、フィルタ的な処理や CGI などに Perl を使ってきたのですが、 きちんと一から勉強したことがありませんでした。

で、最初から読んでみているのですが、奥が深すぎて、 Perl ってこんなすごい言語だったのかと、いまさらながら驚愕しております。
Perlをそこそこ使ったことのある方は、上記の本を会社の経費などで購入して、 勉強されてみてはいかがでしょうか。

 

ところで、冒頭で無節操とか言いながら、実は、Python や Ruby など、 他のスクリプト言語に浮気をしかけたことが、過去に何度もあります。

ですが、結局、それらを使いこなすには至っていません。

どうしてなんだろう…と、たまに漠然と疑問に思っていたのですが、つい先日、 その答えらしきものを発見しました。
それは、

  行末が ; で終わってないと、しっくりこない

からではないかという、身も蓋もない理由でした。

べつにいいじゃん、と言われればそれまでなのですが、最後に ; がないと、 終わりがはっきりしないような気がしてしまうのです。

…と考えてみますと、確かに、Java や JavaScript, ActionScript などは、 普段から使っているというほどではないにしても、 なにか作るくらいのところには到達しました。

となると、微妙なのが、いま、勉強しようとしている Erlang です。
一応、途中に ; が入ったり、最後に . をつけたりしますが、 感覚的には C や Perl などのような、 単純なルールではないように感じています。
(というよりも、Erlang 自体が、今までの言語とかなり違うようです。)

しかしながら、今後、並行処理に強い言語が必須になる可能性を考えますと、 自分の好嫌いで判断していてはいけないよな…と、思うのでした。

 

あ、ところで、息子の進研ゼミですが、時間をオーバーしたものの、 なんとか最後までやりぬいたようです。
最後の最後までハラハラさせられました。詰めが甘いのは父親譲りのようです。 (そんなとこ似なくていいのに…。)

 

今回も、ここまで読んでいただき、誠にありがとうございました。
次回は、10月4日(日) の未明にお会いしましょう!

 

「いますぐ実践! Linux システム管理」の解除は、以下からできます。
http://www.usupi.org/sysad/ (まぐまぐ ID:149633)

バックナンバーは、こちらにほぼ全部そろっています。
http://www.usupi.org/sysad/backno.html

「栗日記」- 栗モノがあちこちで販売されていますね!
http://www.usupi.org/kuri/ (まぐまぐ ID:126454)
http://usupi.seesaa.net/ (栗日記ブログ)
http://usupi.org/k/ (モバイル栗日記)


[バックナンバーのトップへ] [Linux システム管理のトップへ]

トップ

バックナンバー
    [日付順] [目的別]

プロフィール

▼ リンク

独学Linux
Linuxデスクトップ環境に関する情報が満載です。 メルマガもありますよ。
Server World
CentOS 6をサーバとしたときの設定例が、これでもかというくらいたくさん載っています。 CentOS以外のディストリビューション(Fedora, Ubuntu)も充実しています。
LINUXで自宅サーバーを構築・導入(Fedora9)
Fedora9のインストールの仕方から管理方法まで、詳しく載っています。 SearchManには情報がもりだくさんです。
マロンくん.NET
〜サーバ管理者への道〜
Linuxをサーバとして使用するための、いろいろな設定方法が載っています。 マロンくんもかわいいです。 なんといっても、マロンくんという名前がいいですね!!
日経Linux
今や数少なくなってしまったLinuxの雑誌。ニュースやガイドもあります。
Linux Square − @IT
@ITが提供する、Linux の情報が満載。 載っていない設定方法はないんじゃないでしょうか。
gihyo.jp…技術評論社
Linuxに限らず様々な技術情報が満載のサイト。 SoftwareDesign誌も、 ソフトウェア技術者は必見です。
SourceForge.JP Magazine
Linux に限らず、オープンソース関連の記事が網羅されています。
ITmediaエンタープライズ:Linux Tips 一覧
Tips というより FAQ 集でしょうか。わからないことがあれば覗きましょう。
IBM developerWorks : Linux
開発者向けですが、勉強になりますよ。
Yahoo!ニュース - Linux
Yahoo!のLinuxに関するニュース一覧です。
栗日記
システム管理とかと全然関係ありませんが、毎日栗の絵を描いています。
システム管理につかれちゃったとき、癒されたいときに、ご覧ください。:-)
WEB RANKING - PC関連
ランキングに参加してみました。押してやってください。

▼ 作ってみました

Add to Google

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本