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

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


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

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

お盆休み最後の日曜日ですが、みなさん、いかがお過ごしでしょうか。

わたしは、お盆休みをとっていませんので、サザエさん症候群になることもなく、 淡々とコレを書いております。

ところで、Radium Software というブログに、よいお話が載っていましたので、 ご紹介したいと思います。

質より量を学ぶ - Radium Software
http://d.hatena.ne.jp/KZR/20080808/p1

とある陶芸クラスで、作品の「量」が多いとよい評価が得られるグループと、 作品の「質」だけで評価が得られるグループに分けたとき、 それぞれの作品の出来がどうなったか、という実験のお話です。

で、結論を先に書いてしまいますと、よい作品はみな、 「量」のグループから提出されたものだったそうです。

それは、おそらく、「量」のグループの方が、たくさんの作品を作り出すことで、 より多くの失敗を経験し、よい作品を生み出す技術を習得できたため、と考えられます。

困ったことが起こりますと、つい否定的で消極的な感情が先走ってしまいますが、 それらに負けないで、とにかく行動してみよう、と思いました。
もんもんと考えているだけでは、困った状態から抜け出せないですしね。

というわけで、みなさんも、読むだけでなく行動して、 失敗という経験を積み重ねていただけますと、幸いです。(^ε^)

経験者の場合はどうなんだ? …という疑問はひとまず置いておきまして、 今回も、はりきってまいりたいと思います。

今回のお題 - ファイルの時刻情報を知る

何かトラブルが起こりますと、どんなささいなことでもよいので、 できる限り情報を集めたいと思うのが、当事者の心境ではないかと思います。

そんなさまざまな情報の中で、重要となる情報のひとつだと言えるのが、 ファイルの時刻情報ではないかと思います。

そのファイルが最後に更新された時期がわかりますと、 トラブルとの関連などを推測することができます。

しかし、ファイルの時刻情報は、実はそれだけではありません。
他にも、いくつかの時刻情報が、ファイルにはあります。せっかくの情報ですので、 これらを利用しない手はありませんよね。

というわけで今回は、ファイルの時刻情報を調べる方法について、 ご紹介したいと思います。


最初に、ファイルの各時刻情報を、ご紹介しましょう。
ファイルには、以下の3つの時刻情報が含まれます。

  mtime - ファイルの中身を最後に修正した時刻
  ctime - ファイルの属性を最後に変更した時刻
  atime - ファイルを最後にアクセスした時刻

mtime は、ファイルに書き込んだりなどして、最後に中身を変更した時刻を表します。 みなさんよくご存じの、ls -l などで出力される情報です。

ctime は、ファイルのパーミッションや所有者など、 属性を変更した最後の時刻を表します。

そして、atime は、ファイルの中身を最後に参照したときの時刻です。


さて、これらの時刻情報は、以下の方法で得ることができます。

まずは、みなさんよくご存じの、ls コマンドです。
普通に -l オプションをつけて実行しますと、mtime が出力されます。

  % ls -l foo
  -rw-r--r-- 1 usu adm 0  8月10日 11:43 foo

これに、-c オプションをつけますと、 mtime の代わりに ctime の情報を出力してくれます。

  % ls -lc foo
  -rw-r--r-- 1 usu adm 0  8月10日 11:44 foo

また、-u オプションをつけますと、atime の情報を出力してくれます。

  % ls -lu foo
  -rw-r--r-- 1 usu adm 0  8月10日 11:44 foo

 

もうひとつ、時刻情報を知るコマンドに、stat コマンドがあります。
こちらは、すべての時刻情報を、一気に確認できます。

  % stat foo
    File: `foo'
    Size: 0           Blocks: 0       IO Block: 4096 通常の空ファイル
  Device: 302h/770d   Inode: 4721380  Links: 1
  Access: (0644/-rw-r--r--)  Uid: ( 628/  usu)   Gid: (  4/   adm)
  Access: 2008-08-10 11:44:45.000000000 +0900
  Modify: 2008-08-10 11:43:58.000000000 +0900
  Change: 2008-08-10 11:44:45.000000000 +0900

言うまでもないと思いますが、Access: が atime を、Modify: が mtime を、 そして Change: が ctime を表しています。
関係のない情報もありますが、いっぺんにわかるので、便利ですね。

 

ちなみに、上記コマンドたちは、stat システムコールを使用して、 時刻情報を得ていると思われます。
ちょっと変化球ですが、Perl スクリプトでも取得してみました。

  #!/usr/bin/perl
  while($ARGV[0]) {
      my $file = shift;
      my @st = stat($file);
      print "[$file]\n  atime: " . localtime($st[8]) .
          "\n  mtime: " . localtime($st[9]) .
          "\n  ctime: " . localtime($st[10]) . "\n";
  }

stat の戻り値は配列で、atime, mtime および ctime の情報は、 配列の 8〜10番目に格納されています。

これらを、localtime で見やすい形式に変換して、出力しています。

さて、上記を、showtimestat.pl という名前で保存して、実行可能に設定したら、 以下のように実行してみてください。

  % ./showtimestat.pl foo
  [foo]
    atime: Sun Aug 10 11:44:45 2008
    mtime: Sun Aug 10 11:43:58 2008
    ctime: Sun Aug 10 11:44:45 2008

ls や stat コマンドと同様に、各時刻情報が得られています。


それでは、実際に確認してみましょう。

まずは、touch コマンドで、ファイルを作成してみます。

  % touch foo
  % stat foo
  ...前略...
  Access: 2008-08-10 00:10:19.000000000 +0900
  Modify: 2008-08-10 00:10:19.000000000 +0900
  Change: 2008-08-10 00:10:19.000000000 +0900

atime, mtime および ctime ともに、同じ時刻になっています。
ここで、ファイルのパーミッションを変更してみましょう。

  % chmod g+w foo
  % stat foo
  ...前略...
  Access: 2008-08-10 00:10:19.000000000 +0900
  Modify: 2008-08-10 00:10:19.000000000 +0900
  Change: 2008-08-10 00:11:57.000000000 +0900

ファイルの属性が変更されましたので、ctime が更新されました。
次に、ファイルの中身を変更してみましょう。

  % echo test >> foo
  % stat foo
  ...前略...
  Access: 2008-08-10 00:10:19.000000000 +0900
  Modify: 2008-08-10 00:13:08.000000000 +0900
  Change: 2008-08-10 00:13:08.000000000 +0900

ファイルの中身を変更しましたので、mtime が更新されました。
また、ctime も変更されています。これは、 サイズという属性が変化したからだと思われます。
とはいえ、ファイルサイズが変わらないように中身を書き換えても、

  % echo TEST > foo
  % stat foo
  ...前略...
  Access: 2008-08-10 00:10:19.000000000 +0900
  Modify: 2008-08-10 00:17:50.000000000 +0900
  Change: 2008-08-10 00:17:50.000000000 +0900

上記のように、ctime が更新されてしまうのですが…。

…ええっと、気をとり直しまして、今度は、中身を参照してみます。

  % cat foo
  TEST
  % stat foo
  ...前略...
  Access: 2008-08-10 00:20:19.000000000 +0900
  Modify: 2008-08-10 00:17:50.000000000 +0900
  Change: 2008-08-10 00:17:50.000000000 +0900

すると、ご想像通り、atime が更新されました。

 

ちなみに、mount の際に -o noatime を指定しますと、ファイルの中身を参照しても、 atime が更新されなくなります。

  # mount -o noatime,loop tameshi.img /mnt/tmp
  # stat /mnt/tmp/foo
  ...前略...
  Access: 2008-08-10 00:20:19.000000000 +0900
  Modify: 2008-08-10 00:17:50.000000000 +0900
  Change: 2008-08-10 00:17:50.000000000 +0900
  # cat /mnt/tmp/foo
  TEST
  # stat /mnt/tmp/foo
  ...前略...
  Access: 2008-08-10 00:20:19.000000000 +0900
  Modify: 2008-08-10 00:17:50.000000000 +0900
  Change: 2008-08-10 00:17:50.000000000 +0900

以上、ファイルの時刻情報の参照方法や変更方法を、ご紹介しました。

これらの情報がいつ役に立つのかわかりませんが、上記を実際に確認する手間は、 微々たるものではないかと思います。
ですので、来るべきときのために、自分の手を実際に動かして確かめて、 糧にしておいてくださいまし。

宿題の答え

前回の宿題は、

  削除したファイルを復元しようとしたところ、データブロックがすでに
  再利用されていて途方に暮れる、という経験をしてみましょう。

でした。

まずは、いつものように、偽のファイルシステムを作ります。

  # dd if=/dev/zero of=tameshi.img bs=1M count=1
  # mkfs.ext2 -m 0 -F tameshi.img

そして、やっぱりいつものように、マウントします。

  # mount -o loop tameshi.img /mnt/tmp

消した後復元したいファイルと、データブロック再利用のために使用するファイルを、 作成します。(前者が hosts で、後者が foo です。)

  # cp -p /etc/hosts /mnt/tmp
  # touch /mnt/tmp/foo
  # ls -1i /mnt/tmp
  13 foo
  12 hosts
  11 lost+found/

念のため、マウントし直してから、/mnt/tmp/hosts を削除します。

  # umount /mnt/tmp
  # mount -o loop tameshi.img /mnt/tmp
  # rm /mnt/tmp/hosts

この時点では復元可能であることを、debugfs コマンドで確認します。

  # umount /mnt/tmp
  # debugfs tameshi.img
  ...中略...
  debugfs:  stat <12>
  ...中略...
  BLOCKS:
  (0-6):38-44
  TOTAL: 7

  debugfs:  dump <12> /tmp/hosts
  debugfs:  quit
  # diff /tmp/hosts /etc/hosts
  #

データブロックは、38〜44 を使用しています。
この 38〜44 は再利用が可能ですが、まだ再利用されておらず、 元データが残っていますので、dump コマンドで復元することができます。
(元の /etc/hosts と diff コマンドで比較すると、一致します。)

さて、ここで、データブロック 38〜44 が再利用されるようにします。
具体的には、先ほど作成した /mnt/tmp/foo に、 "test" という文字列をめいいっぱい書き込みます。

  # mount -o loop tameshi.img /mnt/tmp
  # perl -e 'print "test"x262144' >> /mnt/tmp/foo
  # umount /mnt/tmp

そして、再度 debugfs コマンドで、復元を試みます。

  # umount /mnt/tmp
  # debugfs tameshi.img
  ...中略...
  debugfs:  dump <12> /tmp/hosts
  debugfs:  quit
  # cat /tmp/hosts
  testtesttesttesttesttesttesttesttesttesttesttesttesttesttesttest
  testtesttesttesttesttesttesttesttesttesttesttesttesttesttesttest
  ...後略...

…復元したファイルの中身が、test だらけになってしまいました。
先ほど、foo に "test" と書き込んだ際に、データブロック 38〜44 が、 foo に使われてしまったようです。

というわけで、復元が必要な際には、いち早くアンマウントして、 再利用を防ぐことが必要ではないかと思います。

Vol.142 - 削除したファイルを復元する
http://www.usupi.org/sysad/142.html

今回の宿題

今回の宿題は、

  ディレクトリやシンボリックリンクの時刻情報を調べてみましょう。

です。

通常のファイルの場合の例は、本題でいくつかご紹介しました。
ディレクトリやシンボリックリンクの場合は、どうなるのでしょうか。
これは、実際に試すだけだと思いますので、是非やってみてください。

あとがき

よく、「わたしも〜してみようと思います」と書いて、 なにかの話の締めにすることが、われながら多いように思います。
(冒頭でも、さっそく使っていますね。われながらびっくりです。)

でも、その後実際に行ったかどうか、うやむやにしてしまっていました。
いますぐ実践! とか言っておきながら、これではいかんですよね。

ですので、とりあえずは、前々回の宿題でちらっと触れました、 プロセスアカウンティングの状態が proc_fs で参照できるものを、 ちょちょいと作ってみました。

プロセスアカウンティングの状態を知るためのパッチ
http://www.usupi.org/sysad/143_acct_diff.txt

このパッチを、カーネル・ソースのトップディレクトリ上で、以下のように適用し、 カーネルを再構築してください。

  # cd /usr/src/linux
  # patch -p0 < ~/143_acct_diff.txt
  # make bzImage
  ...

そして、再構築したカーネルで立ち上げ直しますと、 /proc/acct というファイルができます。これを参照することで、 いまの状態がわかるという寸法です。

  # cat /proc/acct
  off

この場合は、プロセスアカウンティングが無効です。
有効の場合は、以下のようになります。

  # cat /proc/acct
  on active pacct

まんなかに active とありますが、これは通常の状態を表しています。
ディスクの残り容量が少なくなりますと、paused に変化します。
そして、pacct は、アカウント情報を記録している、ログのファイル名を表します。 (絶対パス名でないところが、手抜きですね。ごめんなさい。)

こんな感じで、現在の状態がじかに見られますので、あると便利かも、 と思われた貴兄は、パッチを当ててみてくださいませ。

ちなみに、前々回の宿題の答えでの発言は、以下にあります。

Vol.141 - データをしっかり消去する (…の宿題の答え)
http://www.usupi.org/sysad/141.html

 

…はい、こう書いても、実際に試していただけるとは思っておりません。
あまりにも、唐突過ぎますよね。
いちおう、書きっぱなしでその後なにもしていない、 というわけではないということを表明したいがために、書いているような気がします。

ただ、どうせなら、なるべくみなさんのお役に立てることのほうが、 建設的だと思います。ですので、次回からは、簡単に導入できて、 しかも役に立つモノを目指したいと思います。(…あ、また書いてしまいました…。)

 

今回も、ここまで読んでいただき、ありがとうございました。
それでは、次回は 9月7日(日) 頃に、お会いしましょう!

 

「いますぐ実践! 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/ (栗日記ブログ)


[バックナンバーのトップへ] [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

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本