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

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


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

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

先日、Thinkpad のとてもよい中古を偶然見つけたのですが、 半日迷っている間に売り切れてしまいまして、たいへん落ち込んでおります。
(あ、先日、と書きましたが、実は昨日のことです。)

以前にも、Lenovo のサイトでたたき売りをしている際、 やっぱり迷っているうちに売り切れてしまい、 地面をのたうちまわりたくなるくらい残念な思いをしたことがありました。
こういうのが2回も続きますと、本当にのたうちまわりそうです。

よめは、「欲しいと思ったときに買わないと手に入らない」と言います。 かたや、「欲しいと思ってもすぐ買わず、一晩考えてから決めなさい」 と言われて育ちました。

幸運の女神は後ろ髪がないとも言いますし、 慌てる乞食はもらいが少ないとも言います。 …ええ、どちらも一理あるとは思うのです。
ですが、肝心なときに、両者が主張しあってしまい、 優柔不断なわたしは結局決められなくなってしまいます。キング・オブ・優柔不断です。

次こそは、これだと思う Thinkpad に出会った時点で、即決します!!
…いえ、またうだうだと迷ってしまう気もします。

ウジウジした気持ちを極力抑え、今回も、はりきってまいりましょう。

今回のお題 - LVM のスナップショット機能を使ってみる

前回、前々回と、LVM に関することをご紹介させていただきました。

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

これでもう LVM は十分じゃね? という気になっていましたが、 無視するには惜しい便利な機能が、LVM 様にはございました。

…もうタイトルに書いてしまっていますので、隠す必要はありませんね。
はい、それは、スナップショット機能のことです。

LVM を使用しているのに、スナップショットを知らず利用していない、 という貴兄がいらっしゃいますと、非常にもったいないことだと思います。

ですので、今回は、LVM のスナップショット機能について、 使い方などをご紹介したいと思います。

スナップショットってなんでしたっけ?

スナップショットとは、ファイルシステムのある瞬間の状態を、 そのまま抜き出したものです。(あ、ファイルシステムの場合は、ですね。)

もとのファイルシステムは、その後も更新可能ですが、スナップショットは、 作成したときの状態をそのまま保持しつづけてくれます。
ですので、ファイルシステムを使用しながら、 スナップショットを用いてバックアップをとったり、ヤバい操作を試す直前に、 スナップショットを作成しておいて、案の定失敗したときに状態を戻したり、 といったことができます。おお、便利そうですね。

LVM のスナップショット機能は、論理ボリュームで実現されています。
スナップショットを作成してから、もとのファイルシステムが更新されたときに、 更新される前のデータを保持することで、 スナップショット作成時のイメージを保持するようになっています。
(未変更部分は、もとのファイルシステムのデータを参照すれば済みますので、 スナップショット側ではデータを保持しません。)

早速使ってみますよ

では、早速、スナップショットを作成してみましょう。
もとのファイルシステムは、ボリュームグループが Volume00 という名前で、 論理ボリュームが LogVol00 という名前だとしましょう。
そして、以下のように /mnt/test に mount されているとします。

  # df /mnt/test
  Filesystem         1K-blocks     Used Available Use% Mounted on
  /dev/mapper/Volume00-LogVol00
                        142799   107433     29471  79% /mnt/test

スナップショットを作成するには、いつものように、 lvcreate コマンドを使用します。簡単な書式は、以下の通りです。

  # lvcreate -s -L サイズ -n 論理ボリューム名 もとのデバイス

スナップショットの論理ボリューム名を -n オプションで指定します。
「もとのデバイス」には、 もとのファイルシステムのデバイスファイルを指定します。
-L オプションで指定するサイズは、もとのデータを保持するための領域です。 もとのファイルシステムと同じサイズである必要はありません。

というわけで、 ここでは LogVol00_snap という名前のスナップショットを作成してみました。 サイズは、もとが 144MB ですので、32MB くらいにしてみました。 (使用頻度などによりますので、えいやーで決めました。)

  # lvcreate -s -L 32M -n LogVol00_snap /dev/Volume00/LogVol00

lvscan や lvdisplay で確認しますと、 以下のようにスナップショットであることがわかります。

  # lvscan
    ACTIVE   Original '/dev/Volume00/LogVol00' [144.00 MB] inherit
    ACTIVE   Snapshot '/dev/Volume00/LogVol00_snap' [32.00 MB] inherit
  # lvdisplay /dev/Volume00/LogVol00_snap
    --- Logical volume ---
    LV Name                /dev/Volume00/LogVol00_snap
    ...中略...
    LV Size                144.00 MB
    Current LE             36
    COW-table size         32.00 MB
    COW-table LE           8
    Allocated to snapshot  0.07%
    Snapshot chunk size    8.00 KB
    ...後略...

では、mount してみましょう。
もちろん、通常の論理ボリュームとして使用できます。
ここでは、/mnt/snap に mount してみました。

  # mount -o ro /dev/mapper/Volume00-LogVol00_snap /mnt/snap
  # df /mnt/test /mnt/snap
  Filesystem         1K-blocks     Used Available Use% Mounted on
  /dev/mapper/Volume00-LogVol00
                        142799   107433     29471  79% /mnt/test
  /dev/mapper/Volume00-LogVol00_snap
                        142799   107433     29471  79% /mnt/snap

当り前ですが、もとのファイルシステムとまったく同じですね。

さて、ここで、もとのファイルシステムを更新してみましょう。
以下では、適当なファイルを追加してみました。

  # cp -p G /mnt/test
  # df /mnt/test /mnt/snap
  Filesystem         1K-blocks     Used Available Use% Mounted on
  /dev/mapper/Volume00-LogVol00
                        142799   108239     28665  80% /mnt/test
  /dev/mapper/Volume00-LogVol00_snap
                        142799   107433     29471  79% /mnt/snap
  # ls /mnt/test
  A  B  C  D  E  F  G
  # ls /mnt/snap
  A  B  C  D  E  F

すると、当然、もとのファイルシステムの状態は変わりますが、 スナップショットの方はまったく変わりません。
lvdisplay コマンドの出力を見てみましょう。
先ほどは、Allocated to snapshot が 0.07% でしたが、2.81% に増えています。 書き換わる前のデータの保持に費されたようです。

  # lvdisplay /dev/Volume00/LogVol00_snap
    ...前略...
    Allocated to snapshot  2.81%
    ...後略...

ちなみに、ファイルを削除しても、 ファイルの中身すべてが書き換わるというわけではありません。
ですので、たとえば、以下のように、約 15MB のサイズのファイルを削除しても、 ちょびっとしか消費されません。

  # ls -l /mnt/test/F
  -rw-r--r-- 1 usu adm  16041973 Sep 24 23:27 /mnt/test/F
  # rm /mnt/test/F
  # lvdisplay /dev/Volume00/LogVol00_snap
    ...前略...
    Allocated to snapshot  3.18%
    ...後略...

書き換わりすぎると覚えられません

もとのファイルシステムが書き換わるたびに、保持するデータが増えますので、 書き換わりすぎると、スナップショットを維持できなくなります。

少々乱暴ですが、実際に溢れさせてみました。
具体的には、dd コマンドで、32MB のダミーデータを作成してみました。
すると、lvdisplay コマンドで確認しても、 費された割合が出力されなくなってしまいました。 Input/output error というのも気になります。

  # dd if=/dev/zero of=/mnt/test/dummy.img bs=1M count=32
  # lvdisplay /dev/Volume00/LogVol00_snap
    /dev/dm-1: read failed after 0 of 2048 at 0: Input/output error
    ...中略...
    LV Size                144.00 MB
    Current LE             36
    COW-table size         32.00 MB
    COW-table LE           8
    Snapshot chunk size    8.00 KB
    ...後略...

lvscan コマンドで確認してみますと、もとのファイルシステムと共に、 inactive にされてしまったようです。

  # lvscan
    /dev/dm-1: read failed after 0 of 2048 at 0: Input/output error
    inactive Original '/dev/Volume00/LogVol00' [144.00 MB] inherit
    inactive Snapshot '/dev/Volume00/LogVol00_snap' [32.00 MB] inherit

こうなると、もう失われた情報は戻ってきません。覆水盆に返らずです。
lvremove コマンドで、スナップショットを削除しましょう。
すると、もとのファイルシステムが、ACTIVE に復帰してくれました。

  # umount /mnt/snap
  # lvremove /dev/Volume00/LogVol00_snap
  # lvscan
    ACTIVE            '/dev/Volume00/LogVol00' [144.00 MB] inherit

どんなときに使えばよいですか?

さて、スナップショットの簡単な使い方はわかりました。
では、どんなときにスナップショットを使えばよいのでしょうか。

最初の説明にも書きましたが、一番使われそうなのが、 バックアップではないかと思います。

たとえば、dump コマンドでバックアップファイルを作成する際、 対象のファイルシステムが頻繁に書き換わりますと、 正しいバックアップを行うことができません。

ですが、スナップショットを一時的に作成して、 そのスナップショットに対して dump コマンドを実行すれば、 問題なくバックアップを行うことができます。

  # lvcreate -s -L 256M -n LogVol00_snap /dev/Volume00/LogVol00
  # dump -0 -f /backup/LogVol00.dump /dev/Volume00/LogVol00_snap
  # lvremove -f /dev/Volume00/LogVol00_snap

あるいは、こちらも最初に書きましたが、何か危険なことを試す直前に、 スナップショットを作成しておいて、失敗したらスナップショットの状態に戻す、 という使い方も考えられます。

ただし、残念ながら、ファイルシステムをスナップショットの状態に戻すという機能は、 LVM 自体には存在しないようです。
ですので、一旦スナップショットのイメージをどこかに退避させて、 失敗して戻したいときに、そのイメージを書き戻す、 という手順をふむ必要があるように思われます。
(…って、これは普通にバックアップ/リストアを行うだけですね。)

おわりに

以上、LVM のスナップショットの使い方などを、簡単にご紹介しました。

文章で書くとまわりくどくなってしまいましたが、実際にやってみると、 さほどややこしくはないと思います。
スナップショットの作成や削除によって、 もとのファイルシステムが破壊される…ということはありませんので、 まずは気軽に試していただければと思います。

ちなみに、dump/restore コマンドによるバックアップに関しましては、 過去にご紹介したことがあります。
時間と興味のある貴兄は、以下をちらっとご覧くださいませ。

Vol.122 - 正統派なバックアップを行う
http://www.usupi.org/sysad/122.html
Vol.123 - 正統派なバックアップを行う / 二つの塔
http://www.usupi.org/sysad/123.html
Vol.124 - 正統派なバックアップを行う / 王の生還
http://www.usupi.org/sysad/124.html

宿題の答え

前回の宿題は、

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

でした。

pvscan や lvscan の出力でも十分わかるのですが、 もう少しシンプルに教えてくれるといいなあ、という個人的な思いつきの宿題でした。

たとえば、既存のコマンド pvscan や lvscan の出力結果は、 以下のようになると思います。

  # pvscan
    PV /dev/sda3   VG Volume01   lvm2 [236.00 MB / 44.00 MB free]
    PV /dev/sda1   VG Volume00   lvm2 [120.00 MB / 0    free]
    PV /dev/sda2   VG Volume00   lvm2 [120.00 MB / 112.00 MB free]
    Total: 3 [476.00 MB] / in use: 3 [476.00 MB] / in no VG: 0 [0   ]
  # lvscan
    ACTIVE            '/dev/Volume01/LogVol10' [96.00 MB] inherit
    ACTIVE            '/dev/Volume01/LogVol11' [96.00 MB] inherit
    ACTIVE            '/dev/Volume00/LogVol00' [128.00 MB] inherit

あれ、そんなに複雑でもないんじゃ…と、万が一でも、一瞬でも思われた場合は、 その記憶を消し去ってください。
で、上記が以下のようになればわかりやすいのでは、と思ったのです。

  # ./lvmscan.pl
  [Volume00]
    /dev/sda1 [120.00 MB / 0    free]
    /dev/sda2 [120.00 MB / 112.00 MB free]
    LogVol00: [128.00 MB] (ACTIVE)
  [Volume01]
    /dev/sda3 [236.00 MB / 44.00 MB free]
    LogVol10: [96.00 MB] (ACTIVE)
    LogVol11: [96.00 MB] (ACTIVE)

ボリュームグループそれぞれの、物理ボリュームと論理ボリュームが一目瞭然に! これは便利! と思い込んでください。お願いします。

…と、というわけで、上記を出力する Perl スクリプトを書きました。

  #!/usr/bin/perl
  use strict;
  use warnings;
  my %vg;

  ## read pvscan
  open(PV, "/sbin/pvscan|") || die "cannot open.";
  while(<PV>) {
      chomp;
      if(/^\s*PV\s+(\S+)\s+VG\s+(\S+)\s+\S+\s+(\[[^\]]+\])/) {
          $vg{$2} .= "  $1 $3\n";
      } elsif(/^\s*PV\s+(\S+)\s+\S+\s+(\[[^\]]+\])/) {
          $vg{free} .= "  $1 $2\n";
      }
  }
  close(PV);

  ## read lvscan
  open(LV, "/usr/sbin/lvscan|") || die "cannot open.";
  while(<LV>) {
      chomp;
      if(/^\s*(\S+)\s+\'\/dev\/([^\'^\/]+)\/([^\'^\/]+)\'\s+(\[[^\]]+\])/) {
          $vg{$2} .= "  $3: $4 ($1)\n";
      }
  }
  close(LV);

  ## show
  foreach my $key (sort keys %vg) {
      print "[$key]\n$vg{$key}";
  }

最初の read pvscan あたりで、pvscan から読み込んだ情報のうち、 必要なものを %vg に格納しています。
同様に、read lvscan あたりで、lvscan からの情報を処理しています。
そして最後に、%vg の中身を出力している…だけです。

これを、たとえば lvmscan.pl という名前で保存し、実行しますと、 先の出力結果が得られます。
(lvscan や pvscan は root で実行する必要がありますので、 残念ですが root の権限をお持ちでない貴兄は、動作確認することができません。)

  # chmod +x lvmscan.pl
  # ./lvmscan.pl
  ...先ほどと同じですので省略...

ちなみに、ボリュームグループに割り当てられていない物理ボリュームがありますと、 その旨を出力します。
たとえば、先ほどの状態から、 物理ボリューム /dev/sda2 をボリュームグループ Volume00 から取り除いてみましょう。
手順の例を、念のため以下に示します。(112MB というのは適当です。)

  # e2fsck -f /dev/Volume00/LogVol00
  # resize2fs /dev/Volume00/LogVol00 112M
  # lvreduce -L 112M /dev/Volume00/LogVol00
  # vgreduce Volume00 /dev/sda2

すると、pvscan の出力結果は以下のようになります。
/dev/sda2 のボリュームグループがなにもない状態になります。

  # pvscan
    PV /dev/sda3   VG Volume01   lvm2 [236.00 MB / 44.00 MB free]
    PV /dev/sda1   VG Volume00   lvm2 [120.00 MB / 8.00 MB free]
    PV /dev/sda2                 lvm2 [122.25 MB]
    Total: 3 [478.25 MB] / in use: 2 [356.00 MB] / in no VG: 1 [122.25 MB]

この状態で、先の lvmscan.pl を実行しますと、以下のようになります。

  # ./lvmscan.pl
  [Volume00]
    /dev/sda1 [120.00 MB / 8.00 MB free]
    LogVol00: [112.00 MB] (ACTIVE)
  [Volume01]
    /dev/sda3 [236.00 MB / 44.00 MB free]
    LogVol10: [96.00 MB] (ACTIVE)
    LogVol11: [96.00 MB] (ACTIVE)
  [free]
    /dev/sda2 [122.25 MB]

/dev/sda2 がどこにも属さないことが一目瞭然です。ね! ね!!

ただし、free という名のボリュームグループがあると、間違ってしまいますが…。 (これはバグではなく、仕様です!)

今回の宿題

今回の宿題は、

  スナップショットの余裕がなくなってきたらサイズを増やすスクリプト
  を作ってみましょう。

です。

スナップショットを利用していて困るのは、 元のデータを記憶するための領域を使いきってしまうことですよね。
では、空きが少なくなってきたらサイズを増やすスクリプトを作成して、 それを定期的に実行してしまえばよいのでは? と思い立ちました。

まあ、スナップショットを長時間使用することがないかもしれませんが、 来るべき危機(?)に備えて、スクリプトを作成してみてください。

あとがき

先日、@IT に、Unicode の制御文字によるファイル名の偽装に関する記事が、 掲載されていました。

ファイル名は「左から右に読む」とは限らない?! - @IT
http://www.atmarkit.co.jp/fsecurity/rensai/tipstoday08/tips01.html

RLO(Right-to-Left Override)という、Unicode の制御文字を使用しますと、 それより後の文字が逆順になり、ファイル名を偽造できてしまいますので、 危ないから気をつけましょう、というわかりやすい記事でした。

ふと、Linux でも同様の問題が起こるのかな(たぶん起こるんだろうな) という疑問が頭をよぎりましたので、確認してみることにしました。
と言っても、ファイル名に RLO を挿入するだけですので、さほど難しくはなさそうです。

下記のサイトによりますと、RLO は、 UTF-8 では 0xe2 0x80 0xae という3バイトになる、ということがわかりました。

Unicode Character 'RIGHT-TO-LEFT OVERRIDE' (U+202E)
http://www.fileformat.info/info/unicode/char/202e/index.htm

ですので、先の@ITの記事の例のように、 move_vmw.exe という名前の実行ファイルを偽装するには、たとえば、 以下のように実行すればよいということになります。

  $ mv move_vmw.exe `perl -e 'print "move_\xe2\x80\xaevmw.exe"'`

Nautilusなどのファイルマネージャで確認してみますと、お察しの通り、

  move_exe.wmv

というファイル名に見えました。ばっちり成功(?)です。
(わたしが普段使っている Vine Linux 4.2 では再現しませんでしたが。
5.0 にアップデートしなさいというお告げなのかもしれませんね。)

Linux を使っていますと、 Windows のセキュリティ問題とは無縁だと思いがちなのですが、 こういうこともありますので、Linux だから大丈夫だと思い込まず、 常に細心の注意を払うべきだと思いました。

あ、ちなみに、先ほどご紹介したサイトには、Unicode 関連の情報だけでなく、 ファイルフォーマットや拡張子、文字コードなどの情報がわんさか載っています。
それらに関して、なにかわからないことがありましたら、 一度見てみるとよいと思います。

FileFormat.info The Digital Rosetta Stone
http://www.fileformat.info/

 

…あら、とうとう500行を超えてしまいました…。
ここまでたどり着かれた貴兄は、すばらしい! ありがとうございます!
(じ、次回は、もう少し減らす努力をいたします。)

 

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

 

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

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本