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

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


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

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

突然で申し訳ありませんが、いきなりクイズです。

とあるディレクトリに重要なファイルを置かなければならないのに、 そのディレクトリのパーティションの空き容量が 0% で置けないとき、 あなたならどうしますか?

たとえば、こういう状態、/export に置きたいけど…というやつです。

  $ df /export
  Filesystem         1K-blocks      Used Available Use% Mounted on
  /dev/hda2          76095208K 72229780K        0K 100% /export

周りのひとに、いらないファイルなどを消してもらうよう頼んでみましたが、 不要なものがなく、早急に空きができそうにもない、と仮定します。
あ、それから、root の権限も得られないとしましょう。

ある程度ご存じのかたなら、あまり途方に暮れないかもしれませんね。
気になる(かもしれない)答えは、あとがきでご紹介します。

こういう形式にすれば読んでもらえるかも、という試行錯誤的邪念を交えつつ、 今回もはりきってまいりまっす。

今回のお題 - LVM のパーティションを管理する

RHEL(Redhat Enterprise Linux) や Fedora, CentOS など、 RedHat 系のディストリビューションをインストールしますと、 デフォルトでは、LVM(論理ボリュームマネージャ:Logical Volume Manager) というものを使用して、パーティションが作成されると思います。

LVM を使用しない場合は、インストールの際にパーティションのサイズを決めますと、 以降はずっとそのサイズのままで使用することになります。

ですが、LVM を使用しますと、パーティションのサイズを動的に変更することができます。

たとえば、/home が手狭になってきたときに、 HDD を増設して /home のサイズを動的に大きくする、という芸当が、 LVM では可能になります。

そんな素敵な LVM を、われわれシステム管理者は、 もっともっと有効に活用すべきなのではないでしょうか。
というわけで、今回は、LVM を使用して構成されたパーティションを扱う方法について、 簡単にご紹介したいと思います。


まず、LVM の構成に不可欠なものから、ご紹介したいと思います。
それは、PV、VG と LV です。さらりと説明すると、以下の通りです。

PV (物理ボリューム:Phisical Volume)
LVMで管理する物理的な記憶媒体、たとえば HDD そのものや、 HDD 内のパーティションを指します。
VG (ボリュームグループ:Volume Group)
複数の PV をまとめたもので、1つの論理的な記憶媒体として使用することができます。
LV (論理ボリューム:Logical Volume)
VG 上に設定された論理的なパーティションです。

大雑把に言いますと、VG が論理的な HDD で、LV がそのパーティションに相当します。

そして、それぞれ、pvscan、vgscan および lvscan というコマンドで、 概要を確認することができます。
(pvdisplay、vgdisplay および lvdisplay でも確認できますが、 出力がやや冗長ですので、ここでは割愛させていただきます。)

まずは、pvscan を実行してみましょう。

  # pvscan
    PV /dev/hda3   VG VolGroup00  lvm2 [100.00 GB / 32.00 MB free]
    Total: 1 [100.00 GB] / in use: 1 [100.00 GB] / in no VG: 0 [0]

物理媒体が /dev/hda3 の PV が1つある、ということがわかります。
そして、それを VolGroup00 という名前の VG が使用しています。

次に、vgscan を実行してみましょう。

  # vgscan
    Reading all physical volumes.  This may take a while...
    Found volume group "VolGroup00" using metadata type lvm2

あ、これでわかるのは、VolGroup00 という VG がある、ということだけっぽいです。

そして、lvscan を実行した結果が、以下の通りです。

  # lvscan
    ACTIVE          '/dev/VolGroup00/LogVol01' [98.97 GB] inherit
    ACTIVE          '/dev/VolGroup00/LogVol00' [1.00 GB] inherit

VolGroup00 には、LogVol00 と LogVol01 という2つの LV があることがわかります。

ちなみに、LogVol00 はスワップ、LogVol01 は / に使用しています。

  # df /
  Filesystem         1K-blocks      Used Available Use% Mounted on
  /dev/mapper/VolGroup00-LogVol01
                     102147424  12363420  84595192  13% /
  # swapon -s
  Filename                         Type      Size   Used   Priority
  /dev/mapper/VolGroup00-LogVol00  partition 1048568 592  -1

さて、それでは、パーティションのサイズを変更してみましょう。

以降では、構成が、上記の実行例と同じだという前提で、 話を進めさせていただきます。
つまり、100GB の /dev/hda3 という PV があり、 これを全部 VolGroup00 という VG が使用します。
VolGroup00 のうち、1GB を LogVol00 という LV がスワップに使用し、 残りを LogVol01 として / に割り当てます。

そして、諸般の事情により、以降では、 / のファイルシステムが ext3 だと仮定して、説明をさせていただきます。

以降では、スワップを 128MB 減らし、/ を 128MB 増やす手順について、 ご説明していこうと思っております。

まず、スワップである LogVol00 のサイズを 128MB 減らします。
ただ、スワップを使用したまま減らすわけにはいきません。
ですので、swapoff コマンドで一旦外します。
(swapon -s を実行しているのは、使用中でないことの確認のためです。)

  # swapoff /dev/mapper/VolGroup00-LogVol00
  # swapon -s
  # 

そして、スワップとして使用している LogVol00 のサイズを減らします。
LV のサイズを減らすには、lvreduce コマンドを使用します。

  # lvreduce -L 896M /dev/mapper/VolGroup00-LogVol00

-L オプションでサイズを指定しますが、上記の場合、 絶対的なサイズを指定しています。(1024-128 = 896 ですね。)
あるいは、以下のように、+ か - をつけて増減量を指定します。

  # lvreduce -L -128M /dev/mapper/VolGroup00-LogVol00

lvreduce を実行しますと、ほんとにいいのか? と聞かれますので、 躊躇したのち y と答えて、処理してもらいます。

特にエラーが発生しなかった場合は、mkswap コマンドでスワップを作成しなおして、 swapon コマンドで有効にします。

  # mkswap /dev/mapper/VolGroup00-LogVol00
  # swapon /dev/mapper/VolGroup00-LogVol00
  # swapon -s
  Filename                         Type      Size   Used   Priority
  /dev/mapper/VolGroup00-LogVol00  partition 917504 0      -3

念のため pvscan を実行して確認しますと…。

  # pvscan
    PV /dev/hda3  VG VolGroup00  lvm2 [100.00 GB / 160.00 MB free]
    Total: 1 [100.00 GB] / in use: 1 [100.00 GB] / in no VG: 0 [0]

空きが 128MB 増えていますので、よさそうです。

 

次に、/ である LogVol01 のサイズを 128MB 増やします。
LV のサイズを増やすには、lvextend コマンドを使用します。
lvreduce コマンドのときと同様、-L オプションには、絶対量か、 + か - をつけた増減量を指定します。

  # lvextend -L +128M /dev/mapper/VolGroup00-LogVol01
    Extending logical volume LogVol01 to 99.09 GB
    Logical volume LogVol01 successfully resized

成功したようですね。
次に、ext2online コマンドを使用して、サイズの変更を知らせます。

  # ext2online /dev/mapper/VolGroup00-LogVol01

そして、df コマンドで確認しますと…。

  # df /
  Filesystem         1K-blocks      Used Available Use% Mounted on
  /dev/mapper/VolGroup00-LogVol01
                     102276440  12363440  84719276  13% /

最初の df コマンドの実行結果と比較しますと、129016ブロックの増加… まあ、だいたい 128MB 増えたようです。


ちなみに、ext3 ファイルシステムのパーティションのサイズを減らす方の手順も、 簡単にご説明しておきます。
気を付けるべき点は、先にファイルシステムのサイズを減らしてから、 LV のサイズを減らす、ということです。
(細かい説明は、くどいと思いますので、すっとばします。)

まず最初に、一旦 umount します。

  # df /mnt
  Filesystem         1K-blocks      Used Available Use% Mounted on
  /dev/mapper/VolGroup00-LogVol02
                         63461      5403     54782   9% /mnt
  # umount /mnt

次に、e2fsck コマンドを実行してから、resize2fs コマンドでサイズを減らします。 (以下では 32MB に設定しています。)

  # e2fsck -f /dev/mapper/VolGroup00-LogVol02
  e2fsck 1.35 (28-Feb-2004)
  Pass 1: Checking inodes, blocks, and sizes
  Pass 2: Checking directory structure
  Pass 3: Checking directory connectivity
  Pass 4: Checking reference counts
  Pass 5: Checking group summary information
  /dev/mapper/VolGroup00-LogVol02: 12/16384 files (8.3% non-contiguous), \
  7559/65536 blocks
  # resize2fs /dev/mapper/VolGroup00-LogVol02 32M
  resize2fs 1.35 (28-Feb-2004)
  Resizing the filesystem on /dev/mapper/VolGroup00-LogVol02 to 32768 \
  (1k) blocks.The filesystem on /dev/mapper/VolGroup00-LogVol02 is now \
  32768 blocks long.

そして、ファイルシステムのサイズを減らした後に、LV のサイズを変更します。

  # lvreduce -L -32M /dev/mapper/VolGroup00-LogVol02
    WARNING: Reducing active logical volume to 32.00 MB
    THIS MAY DESTROY YOUR DATA (filesystem etc.)
  Do you really want to reduce LogVol02? [y/n]: y
    Reducing logical volume LogVol02 to 32.00 MB
    Logical volume LogVol02 successfully resized

あとは、再度 mount して、確認するだけです。

  # mount /dev/mapper/VolGroup00-LogVol02 /mnt
  # df /mnt
  Filesystem         1K-blocks      Used Available Use% Mounted on
  /dev/mapper/VolGroup00-LogVol02
                         31729      4974     25445  17% /mnt

以上、LVM で構成されたパーティションのサイズを動的に変更する方法について、 ご紹介しました。

いままで、LVM で構成されていることは知っていたけど、 どうしていいかわからなかったという貴兄は、これを機会に、ぜひ、 あれこれいじくってみてください。

そうでないかたは…次回、LVM を一から使用する方法をご紹介したい、 と思っておりますので、それまで気長にお待ちいただけますと幸いです。

宿題の答え

前回の宿題は、

  Amazon S3 上のファイルをローカルマシンにバックアップしましょう。

でした。

…よく考えますと、前回のお題の逆方向なだけですね。

しかし、Amazon S3 上にバックアップしているファイルを、別の場所のPCに、 念のためバックアップしておきたいな、というニーズは、 少なからずあるような気がいたします。

というわけで、正解のひとつと思われるスクリプトは、以下の通りです。
(S3Sync のありかは、前回と同様 ~/s3sync/ と仮定しています。)

  #!/bin/sh
  DSTDIR=$HOME/pgbackup/
  S3SYNCPATH=$HOME/work/s3sync/
  S3SRC=usupiorg-archive:pgbackup/
  (cd $S3SYNCPATH; ./s3sync.rb -r --delete $S3SRC $DSTDIR; \
      /bin/ls -l $DSTDIR) 2>&1 | \
      /usr/bin/Mail -s "[pgbackup] `/bin/hostname`" root

バケット usupiorg-archive にある pgbackup/ 以下(というか名前の最初が pgbackup/)のファイルを、~/pgbackup/ にごっそりコピーします。
そして、~/pgbackup/ 直下の内容を root にメールします。

貴兄が使用されている環境は、上記とは異なると思いますので、ご使用の際には、 適時変更していただければと思います。

 

そういえば、9月になり、Amazon から請求メールが送信されてきました。
結局、8月中にかかった費用は、

$0.06

でした。…クレジットカード会社の手数料の方が高そうですね。
こんなに安いなら、もっとふんだんに使ってもいいかなと思っています。

今回の宿題

今回の宿題は、

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

です。

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

しかし、/ の場合、umount して lvreduce して resize2fs して…なんていう芸当は、 普通はできないですよね。

というわけで、そこをなんとかする方法を、考えてみてくださいませ。

あとがき

最近、煮詰まったりすると、各所を巡回して暇をつぶしております。
そんなわたしに喝を入れるかのような文章を、某所経由で見つけました。

暇つぶしに何をやっているかがその人の本性。
http://d.hatena.ne.jp/si-no/20090823/1251020194

そういえば、昔は、逃避行動の一環として、何かをインストールして設定したり、 会社の本を隅から隅まで読んだりしていました。
(あ、逃避≠暇 のはずですが、そのあたりは軽くスルーしてください。)

あのころに行った逃避行動が、今の自分を支えてくれているかもしれないと思うと、 今行っている暇つぶしの結果が、未来の自分を形作る、 ということになるかもしれませんね。

…うわあぁ、暇をつぶさないで、有効に過ごしたいと思います。
そういえば、子どもには、暇はつぶすものじゃなく有効に使うもんだよ、 なんてエラソーなことを常々申しておりました。
今、この瞬間から、自分の脳に刻みこみたいと思います。

 

さて、まえふりで出したクイズの答え、は以下の通りでございます。

別のパーティションに置き、シンボリックリンクを作成する。

でした。(なーんだ、と思われたかた、すみません…。)

たとえば、/export/work に foo.tar.bz2 というファイルを置きたいけど置けないとき、 別の場所(以下の場合 /home/usu)に置いて、シンボリックリンクを作成すれば、 特に問題なく参照することができます。
(Apache で FollowSymLinks が無効になっているとか、 chroot していて元のファイルにアクセスできないなどの場合は、参照できませんが。)

  $ ln -s /home/usu/foo.tar.bz2 /export/work/
  $ ls -l /export/work/foo.tar.bz2
  lrwxrwxrwx 1 usu adm 21 Sep  5 01:23 /export/work/foo.tar.bz2 -> \
  /home/usu/foo.tar.bz2

まず、ディレクトリにファイルを作成できるかどうかは、 新たにエントリを作成する空きがあるかどうか、にかかってきます。
ディレクトリ・エントリの長さは可変長ですので、 運がかなり悪いほう…というわけでないなら、 新たにデータブロックを確保することなく、作成できると思います。
(すでにそのディレクトリのデータブロックがいっぱいいっぱい… という運の悪いかたは、残念ですが諦めてください。)

次に、シンボリックリンクですが、リンク先のパスが60文字以内 (終端の null も含みますので厳密には59文字以内)であれば、 その情報はiノードの中(具体的には i_data というメンバ)に押し込められます。
iノードは、データブロックとは別の、iノードテーブルというところから確保されます。 ですので、iノードテーブルに空きがあればよいです。

たとえば、まえふりでご紹介した満杯の /export ですが、iノードの空きは、 まだまだいっぱいあります。

  $ df -i /export
  Filesystem          Inodes   IUsed   IFree IUse% Mounted on
  /dev/hda2          9666560 1914901 7751659   20% /export

ですので、リンク先のパスが59文字までなら、シンボリックリンクは作成できます。

  $ ln -s 01234567890123456789012345678901234567890123456789012345678 \
  /export/tmp/59
  $ ls -l /export/tmp/59
  lrwxrwxrwx 1 usu adm 59 Sep  5 01:31 /export/tmp/59 -> \
  01234567890123456789012345678901234567890123456789012345678

しかし、60文字以上だと、データブロックが必要になるので失敗します。

  $ ln -s 012345678901234567890123456789012345678901234567890123456789 \
  /export/tmp/60
  ln: creating symbolic link `/export/tmp/60' to \
  `012345678901234567890123456789012345678901234567890123456789': \
  No space left on device

あ、ちなみに、60文字というのは、ext2/ext3 の場合です。 他のファイルシステムをご使用の場合は、違ってくるかもしれません。

 

…と、ここまで書いたところで、ふと気づきました。
LVM を使用していれば、動的に増やせばいいだけだな、ということに…。

おっと、最初に root 権限を得られないと書いてありましたので、 これは一応答えにならないってことで、ご了承いただければと思います。ふぅ。

 

今回も、ここまで読んでいただき、誠にありがとうございました。
次回は、9月20日(日)…って超連休中ですが…の未明にお会いしましょう!

 

「いますぐ実践! 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

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本