Linux の 101 試験対策: ファイルシステムの整合性の維持

ディスク・スペースの使用状況を追跡する

Linux® ファイルシステムの整合性をチェックする方法、空きスペースを監視する方法、そしてファイルシステムでの単純な問題を修復する方法を学んでください。この記事の内容は、Linux のシステム管理者として認定するための LPI (Linux Professional Institute) 101 試験に備えるために役立ちます。さらに、システムが損傷した後や電源断が発生した後は言うまでもなく、ファイルシステムをチェックして、良好な状態に保つ上でも役立ちます。

Ian Shields, Senior Programmer, IBM

Ian ShieldsIan Shields は、developerWorks Linux ゾーンの様々な Linux プロジェクトに関わっています。彼はノースキャロライナ州 Research Triangle Park にある IBM のシニア・プログラマーです。1973年にオーストラリアのキャンベラでシステム・エンジニアとして IBM に入社して以来、カナダのモントリオールやノースキャロライナ州 Research Triangle Park で、コミュニケーション・システムやパーベイシブ・コンピューティングに携わってきました。彼はいくつかの特許を保持しています。Australian National University にて純粋数学および哲学で学位を取得し、また North Carolina State University にてコンピューター・サイエンスで修士号と博士号を取得しています。Ian について詳しく知るには、My developerWorks で彼のプロフィールを見てください。


developerWorks 貢献著者レベル

2010年 8月 24日

この連載について

この連載は Linux システム管理タスクの学習に役立つだけでなく、LPIC-1 (Linux Professional Institute Certification レベル 1) 試験に備えるための教材にもなります。

連載の各記事についての説明とリンクについては、developerWorks の LPIC-1 ロードマップを参照してください。現在進行中のこのロードマップは、LPIC-1 試験の現在の目標 (2009年 4月) を反映しています。完成した記事はその都度ロードマップに追加されていきますが、当面は developerWorks の LPI 認定試験対策チュートリアルで同様の教材の以前のバージョンを調べてください。これらのバージョンは、2009年 4月より前の LPIC-1 目標に対応しています。

概要

この記事で説明する内容は以下のとおりです。

  • ファイルシステムの整合性を確認する方法
  • 空きスペースと i ノードを監視する方法
  • ファイルシステムでの単純な問題を修復する方法

この記事では標準ファイルシステムおよびジャーナリング・システムのうち、ext2 (標準ファイルシステム) と ext3 (ジャーナリング・ファイルシステム) に重点を置きますが、これ以外のファイルシステムのツールについても言及します。記事の内容の大部分は、カーネル 2.4 とカーネル 2.6 の両方に当てはまります。記事に記載する例のほとんどで使用しているのは、カーネル 2.6.32 を搭載した Fedora 12 です。他のシステムでは、結果が異なる場合もあります。

この記事は、LPIC-1 (Linux Professional Institute Certification level 1) 試験の主題 104 の 104.2 の試験対策に役立ちます。この目標の重要度は 2 です。

前提条件

この連載の記事を最大限に活用するには、Linux の基礎知識と、記事に記載されたコマンドを演習できる実際の Linux システムが必要です。プログラムのバージョンによって出力のフォーマットに違いが出てくる場合もあるため、コマンドの実行結果は必ずしもここに記載するリストや図とまったく同じであるとは限りません。

また、記事「Linux の 101 試験対策: パーティションおよびファイルシステムの作成」で説明している内容についても十分に理解している必要があります。


ファイルシステムのチェック

Ian とつながるには

Ian は developerWorks で人気の高いお馴染みの著者の 1 人です。Ian が書いたすべての developerWorks 記事を閲覧してみてください。また、My developerWorks では、Ian のプロフィールを調べることや、彼やその他の著者、そして他の読者とつながることができます。

システムが損傷したり、電源断が発生したりすると、Linux では正常にファイルシステムをアンマウントできなくなることがあります。その場合、ファイルシステムの一部では変更が完了し、他の部分では変更が完了していないという、一貫性のない状態になる可能性があります。損傷したファイルシステムをそのまま操作するのは、既存のエラーをさらに悪化させることになるため、良い考えとは言えません。

ファイルシステムをチェックするための主要なツールは fsck です。fsckmkfs と同じく、さまざまなタイプのファイルシステムに対応する各種ファイルシステム・チェック・ルーチンのまさにフロントエンドとなります。リスト 1 に、これらのチェック・ルーチンのいくつかを記載します。

リスト 1. fsck プログラムの抜粋
[ian@echidna ~]$ ls /sbin/*fsck*
/sbin/btrfsck  /sbin/fsck         /sbin/fsck.ext3     /sbin/fsck.msdos
/sbin/dosfsck  /sbin/fsck.cramfs  /sbin/fsck.ext4     /sbin/fsck.vfat
/sbin/e2fsck   /sbin/fsck.ext2    /sbin/fsck.ext4dev  /sbin/fsck.xfs

意外に思えるかもしれませんが、これらのファイルのうちのいくつかは、たった 1 つのファイルに対して張られたハード・リンクです (リスト 2 を参照)。これらのプログラムは、ブート・プロセスが開始されて早々に使用される場合があるため、ファイルシステムがマウントされていなかったり、シンボリック・リンクがサポートされていなかったりする可能性があります。ハード・リンクとシンボリック・リンクについての詳細は、「Linux の 101 試験対策: ハード・リンクとシンボリック・リンクの作成および変更」で説明しています。

リスト 2. 1 つの fsck プログラムが持つさまざまな顔
[ian@echidna ~]$ find /sbin -samefile /sbin/e2fsck
/sbin/fsck.ext4dev
/sbin/e2fsck
/sbin/fsck.ext3
/sbin/fsck.ext4
/sbin/fsck.ext2

システム・ブート・プロセスでは -A オプションを指定した fsck を使用して、ルート・ファイルシステムと、/etc/fstab 制御ファイルの中でチェック対象として指定された他のすべてのファイルシステムをチェックします。ファイルシステムが正常にアンマウントされなかった場合には整合性チェックが行われ、安全に修復できる場合には修復措置が採られます。この整合性チェックを制御するのは、/etc/fstab エントリーの pass (または passno) フィールド (6 番目のフィールド) です。pass フィールドがゼロに設定されたファイルシステムは、ブート時のチェック対象となりません。ルート・ファイルシステムの pass フィールドの値は 1 なので、ルート・ファイルシステムが最初にチェックされます。ルート以外のファイルシステムについては、一般に pass フィールドの値が 2 (またはそれよりも高い値) に設定されます。この値が、チェックの順番を指定します。

複数の fsck 操作を並列に実行することにはメリットがあるという判断をシステムが下した場合、そうすることができます。そのため、リスト 3 に示す /grubfile ファイルシステムと /mnt/ext3test ファイルシステムのように、異なるファイルシステムに同じ pass 値を設定することができます。ただし、fsck は同じ物理ディスク上で複数のファイルシステム・チェックを実行することはしません。/etc/fstab のレイアウトに付いての詳細は、fstab の man ページを参照してください。

リスト 3. /etc/fstab のエントリーで指定されたブート時のファイルシステム・チェック
filesystem                           mount point  type   options    dump pass
UUID=a18492c0-7ee2-4339-9010-3a15ec0079bb /              ext3    defaults        1   1
UUID=488edd62-6614-4127-812d-cbf58eca85e9 /grubfile      ext3    defaults        1   2
UUID=2d4f10a6-be57-4e1d-92ef-424355bd4b39 swap           swap    defaults        0   0
UUID=ba38c08d-a9e7-46b2-8890-0acda004c510 swap           swap    defaults        0   0
LABEL=EXT3TEST                            /mnt/ext3test  ext3    defaults        0   2
/dev/sda8                                 /mnt/xfstest   xfs     defaults        0   0
LABEL=DOS                                 /dos           vfat    defaults        0   0
tmpfs                   /dev/shm                         tmpfs   defaults        0   0
devpts                  /dev/pts                         devpts  gid=5,mode=620  0   0
sysfs                   /sys                             sysfs   defaults        0   0
proc                    /proc                            proc    defaults        0   0

一部のジャーナリング・ファイルシステム (ReiserFS、XFS など) では、pass の値が 0 に設定されることもあります。これらのジャーナリング・システムでは、fsck ではなく、ジャーナリング・コードがファイルシステムの整合性チェックと修復を行うためです。その一方、/proc などのファイルシステムは初期化時に作成されるため、必ずチェックを実行する必要があります。

ファイルシステムのチェックは、システムがブートした後に行うことができます。ファイルシステムをチェックするには、ルート権限を持っていること、そしてチェック対象のファイルシステムをまずアンマウントすることが必要となります。リスト 4 に、ファイルシステムのうちの 2 つを、デバイス名、ラベル、または UUID を使用してチェックする方法を示します。blkid コマンドを使用して、ラベルまたは UUID を指定してデバイスを検索することも、デバイスを指定してラベルと UUID を検索することもできます。

リスト 4. fsck を使用したファイルシステムのチェック
[root@echidna ~]# # find the device for LABEL=EXT3TEST
[root@echidna ~]# blkid -L EXT3TEST
/dev/sda7
[root@echidna ~]# # Find label and UUID for /dev/sda7
[root@echidna ~]# blkid /dev/sda7
/dev/sda7: LABEL="EXT3TEST" UUID="7803f979-ffde-4e7f-891c-b633eff981f0" SEC_TYPE="ext2" 
 TYPE="ext3" 
[root@echidna ~]# # Check /dev/sda7
[root@echidna ~]# fsck /dev/sda7
fsck from util-linux-ng 2.16.2
e2fsck 1.41.9 (22-Aug-2009)
EXT3TEST: clean, 11/7159808 files, 497418/28637862 blocks
[root@echidna ~]# # Check it by label using fsck.ext3
[root@echidna ~]# fsck.ext3 LABEL=EXT3TEST
e2fsck 1.41.9 (22-Aug-2009)
EXT3TEST: clean, 11/7159808 files, 497418/28637862 blocks
[root@echidna ~]# # Check it by UUID using e2fsck
[root@echidna ~]# e2fsck UUID=7803f979-ffde-4e7f-891c-b633eff981f0
e2fsck 1.41.9 (22-Aug-2009)
EXT3TEST: clean, 11/7159808 files, 497418/28637862 blocks
[root@echidna ~]# # Finally check the vfat partition
[root@echidna ~]# fsck LABEL=DOS
fsck from util-linux-ng 2.16.2
dosfsck 3.0.9, 31 Jan 2010, FAT32, LFN
/dev/sda9: 1 files, 1/513064 clusters

マウントされた状態のファイルシステムをチェックしようとすると、リスト 5 に記載するような警告が出されることになります (リスト 5 では、ルート・ファイルシステムをチェックしようとしています)。この警告に従うようにして、マウントされた状態のファイルシステムはチェックしないでください。

リスト 5. マウントされたファイルシステムをチェックしようとしないこと
[root@echidna ~]# fsck UUID=a18492c0-7ee2-4339-9010-3a15ec0079bb 
fsck from util-linux-ng 2.16.2
e2fsck 1.41.9 (22-Aug-2009)
/dev/sdb9 is mounted.  

WARNING!!!  Running e2fsck on a mounted filesystem may cause
SEVERE filesystem damage.

Do you really want to continue (y/n)? no

check aborted.

ファイルシステムで実行するチェックを fsck に判断させるのも賢明な方法です。誤ったチェックを実行すると、ファイルシステムが壊れることになりかねません。fsck が特定のファイルシステム、またはファイルシステム一式で実行するチェック内容を表示するには、リスト 6 に示すように -N オプションを使用します。

リスト 6. fsck による /dev/sda7、/dev/sda8、/dev/sda9 のチェック内容の表示
[root@echidna ~]# fsck -N /dev/sda7 /dev/sda[89]
fsck from util-linux-ng 2.16.2
[/sbin/fsck.ext3 (1) -- /mnt/ext3test] fsck.ext3 /dev/sda7 
[/sbin/fsck.xfs (2) -- /mnt/xfstest] fsck.xfs /dev/sda8 
[/sbin/fsck.vfat (3) -- /dos] fsck.vfat /dev/sda9

ここまでは、ext および vfat ファイルシステムをチェックしてきましたが、今度は /dev/sda8 のXFS ファイルシステムをチェックしてみましょう。リスト 7 を見るとわかるように、この場合、fsck コマンドは xfs_check コマンドを使用するように指示するだけです。エラーが発生しなければ、xfs_check は何の出力も表示しません。詳細を出力するための -v オプションもありますが、このオプションを指定した場合の出力は、単純なチェックには詳細すぎます。

リスト 7. fsck を XFS で使用する場合
[root@echidna ~]# fsck /dev/sda8
fsck from util-linux-ng 2.16.2
If you wish to check the consistency of an XFS filesystem or
repair a damaged filesystem, see xfs_check(8) and xfs_repair(8).
[root@echidna ~]# xfs_check /dev/sda8

空きスペースの監視

ストレージ・デバイスでは、ファイルまたはディレクトリーは一連のブロックのなかに格納されます。ファイルに関する情報が格納されるのは i ノードです。ここには、所有者、ファイルの最終アクセス時刻、ファイルのサイズ、ファイルがディレクトリーであるかどうか、ファイルの読み取りまたは書き込みが許可されているユーザーなどの情報が記録されます。i ノード番号はファイル・シリアル番号としても知られており、個々のファイルシステム内でそれぞれに固有です。ファイルとディレクトリーについての詳細は、「Linux の 101 試験対策: ファイルとディレクトリーの管理」を参照してください。

ファイルシステムではデータ・ブロックと i ノードのそれぞれがスペースを占めます。そのため、スペースの使用状況を監視して、ファイルシステムを拡大するだけのスペースが確実に残されているようにする必要があります。

df コマンド

df コマンドは、マウントされているファイルシステムに関する情報を表示します。このコマンドに -T オプションを指定すればファイルシステムのタイプも表示されますが、このオプションを追加しない限り、ファイルシステムのタイプは表示されません。上記で使用した Fedora 12 システムの場合、df コマンドによる出力はリスト 8 のようになります。

リスト 8. ファイルシステムの使用状況の表示
[ian@echidna ~]$ df -T
Filesystem    Type   1K-blocks      Used Available Use% Mounted on
/dev/sdb9     ext3    45358500  24670140  18384240  58% /
tmpfs        tmpfs     1927044       808   1926236   1% /dev/shm
/dev/sda2     ext3      772976     17760    716260   3% /grubfile
/dev/sda8      xfs    41933232      4272  41928960   1% /mnt/xfstest
/dev/sda7     ext3   112754024    192248 106834204   1% /mnt/ext3test
/dev/sda9     vfat     2052256         4   2052252   1% /dos

出力にはブロックの合計数と、使用中のブロックの数、空きブロックの数が示されます。また、ファイルシステムとそのマウント・ポイントにも注目してください (/dev/sdb9 の場合には、/)。tmpfs は、仮想メモリーのファイルシステムのエントリーです。これらの仮想ファイルシステムは RAM またはスワップ・スペースのなかだけに存在し、mkfs コマンドを実行しなくても、マウントするだけで作成されます。tmpfs については、「アドバンスト・ファイルシステム・インプリメンター・ガイド: 第 3 回」に詳しく説明されています。

i ノードの使用状況に関する具体的な情報を表示するには、df コマンドに -i オプションを指定します。さらに -x オプションを使って特定のファイルシステム・タイプを除外することも、-t を使って特定のファイルシステム・タイプだけに情報を絞り込むこともできます。これらのオプションは指定するファイルシステム・タイプごとに繰り返して使用します。リスト 9 の例を見てください。

リスト 9. i ノードの使用状況の表示
[ian@echidna ~]$ df -i -x tmpfs
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/sdb9            2883584  308920 2574664   11% /
/dev/sda2              48768      41   48727    1% /grubfile
/dev/sda8            20976832       3 20976829    1% /mnt/xfstest
/dev/sda7            7159808      11 7159797    1% /mnt/ext3test
/dev/sda9                  0       0       0    -  /dos
[ian@echidna ~]$ df -iT -t vfat -t ext3
Filesystem    Type    Inodes   IUsed   IFree IUse% Mounted on
/dev/sdb9     ext3   2883584  308920 2574664   11% /
/dev/sda2     ext3     48768      41   48727    1% /grubfile
/dev/sda7     ext3   7159808      11 7159797    1% /mnt/ext3test
/dev/sda9     vfat         0       0       0    -  /dos

驚くことではないかもしれませんが、FAT32 ファイルシステムには i ノードがありません。ReiserFS ファイルシステムを使用しているとしたら、このファイルシステムに関する情報にも i ノードは示されないはずです。ReiserFS はファイルとディレクトリーのメタデータを stat 項目に保持します。さらに ReiserFS は平衡木構造を使用することから、例えば ext2、ext3、xfs などのファイルシステムとは違って、i ノードの数は事前には決定されません。

df コマンドにはこの他にも、表示をローカル・ファイルシステムに制限したり、出力フォーマットを制御したりするためのオプションがあります。例えば、ファイル・サイズを人間にとってわかりやすい単位 (1024 を 1K で表現するなど) で表示する -H オプション、サイズを 10 の累乗 (1K=1000) にする -h (または --si) オプションなどです。

ディレクトリー・ツリーの特定の部分がどのファイルシステムにあるのか確信が持てない場合には、df コマンドにディレクトリー名のパラメーター、あるいはファイル名自体を指定することができます (リスト 10 を参照)。

リスト 10. df の読みやすい出力
[ian@echidna ~]$ df --si ~ian/index.html
Filesystem             Size   Used  Avail Use% Mounted on
/dev/sdb9               47G    26G    19G  58% /

tune2fs コマンド

ext 系列のファイルシステムには、ブロック数に関する情報の他に、ファイルシステムにジャーナル機能があるか (ext3 または ext4)、ジャーナル機能がないか (ext2) を調べるために使える tune2fs というユーティリティーもあります。このコマンドではまた、多数のパラメーターを設定したり、ジャーナルを追加して ext2 ファイルシステムを ext3 に変換したりすることもできます。リスト 11 に、ほとんど空の ext3 ファイルシステムに関する出力を記載します。ここでは -l オプションを使用して、既存の情報だけを表示しています。

リスト 11. tune2fs による ext3 ファイルシステムに関する情報の表示
[root@echidna ~]# tune2fs -l /dev/sda7
tune2fs 1.41.9 (22-Aug-2009)
Filesystem volume name:   EXT3TEST
Last mounted on:          <not available>
Filesystem UUID:          7803f979-ffde-4e7f-891c-b633eff981f0
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype 
 needs_recovery sparse_super large_file
Filesystem flags:         signed_directory_hash 
Default mount options:    (none)
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              7159808
Block count:              28637862
Reserved block count:     1431893
Free blocks:              28140444
Free inodes:              7159797
First block:              0
Block size:               4096
Fragment size:            4096
Reserved GDT blocks:      1017
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8192
Inode blocks per group:   512
Filesystem created:       Mon Aug  2 15:23:34 2010
Last mount time:          Tue Aug 10 14:17:53 2010
Last write time:          Tue Aug 10 14:17:53 2010
Mount count:              3
Maximum mount count:      30
Last checked:             Mon Aug  2 15:23:34 2010
Check interval:           15552000 (6 months)
Next check after:         Sat Jan 29 14:23:34 2011
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:	          256
Required extra isize:     28
Desired extra isize:      28
Journal inode:            8
Default directory hash:   half_md4
Directory Hash Seed:      2438df0d-fa91-4a3a-ba88-c07b2012f86a
Journal backup:           inode blocks

xfs_info

XFS ファイルシステムの場合には、xfs_info を使用して、mkfs.xfs がファイルシステムの作成時に表示する情報と同じ情報を表示することができます (リスト 12 を参照)。xfs_info は、マウントされているファイルシステムで使用する必要があります。

リスト 12. xfs_info による XFS ファイルシステムに関する情報の表示
[root@echidna ~]# xfs_info /dev/sda8
meta-data=/dev/sda8              isize=256    agcount=4, agsize=2622108 blks
         =                       sectsz=512   attr=2
data     =                       bsize=4096   blocks=10488429, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0
log      =internal               bsize=4096   blocks=5121, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

du コマンド

df コマンドは、ファイルシステム全体に関する情報を表示しますが、ホーム・ディレクトリーが使用しているスペースの量や、/usr を専用のファイルシステムに移した場合に使用できるパーティションの大きさを知りたいという場合もあります。そのような場合には、du コマンドを使用すると、それらの情報を得ることができます。

du コマンドにファイル名 (複数可) をパラメーターとして指定すると、そのファイルに関する情報が表示されます。ディレクトリー名を指定すると、du は再帰処理を行い、指定されたディレクトリーに含まれるすべてのファイルとサブディレクトリーのサイズを計算します。したがって、出力が膨大な量になる可能性がありますが、幸い -s オプションを使用することで、ディレクトリーの合計サイズだけを計算するように指定することができます。du を使用して複数のディレクトリーの情報を取得する場合には、-c オプションを追加して総計を取得してください。出力フォーマットについても、df で使用するサイズ関連のオプションと同じ一式 (-h-H--si など) を使って制御することができます。リスト 13 は、新しく作成したユーザーのホーム・ディレクトリーに関する 2 通りの情報を表示したものです。このユーザーはいったんログインして index.html ファイルを作成しました。

リスト 13. du の使用
[testuser1@echidna ~]$ du -hc *
4.0K	Desktop
4.0K	Documents
4.0K	Downloads
16K	index.html
4.0K	Music
4.0K	Pictures
4.0K	Public
4.0K	Templates
4.0K	Videos
48K	total
[testuser1@echidna ~]$ du -hs .
1.1M	.

du -c * で取得した総計 48K と、du -s で取得した集計 1.1M が異なる理由は、後者にはドットで始まるエントリー (.bashrc など) が含まれる一方、前者にはこれらのエントリーが含まれないためです。

du に関してもう 1 つ注意すべき点は、コマンドを実行する対象ディレクトリーの読み取り権限を持っていなければならないことです。

ここで du を使用して、/usr ツリーが使用しているスペースの合計量と、その第 1 レベルのサブディレクトリーのそれぞれが使用しているスペースの量を表示してみましょう。その結果は、リスト 14 に記載するとおりです。その際、root 権限を使用して適切なアクセス権があるようにしてください。

リスト 14. /usr で du を使用する例
[root@echidna ~]# du -shc /usr/*
394M	/usr/bin
4.0K	/usr/etc
4.0K	/usr/games
156M	/usr/include
628K	/usr/kerberos
310M	/usr/lib
1.7G	/usr/lib64
110M	/usr/libexec
136K	/usr/local
30M	/usr/sbin
2.9G	/usr/share
135M	/usr/src
0	/usr/tmp
5.7G	total

ファイルシステムの修復

時として (頻繁でないことを祈ります)、ファイルシステムが損傷したり正常にアンマウントできなかったりするなどの理由によって最悪の事態が発生し、ファイルシステムを修復しなければならないことがあります。上記で説明した fsck コマンドは、ファイルシステムをチェックするだけでなく、ファイルシステムを修復することも可能です。大抵はブート時の自動チェックによって問題が修復されるので、ファイルシステムをそのまま使い続けられます。

ブート時のファイルシステムの自動チェックで整合性を取り戻せない場合には、シングル・ユーザー・モードのシェルが起動され、fsck を手動で実行するように何らかの指示が出されます。ジャーナリング・ファイルシステムではない ext2 の場合、ファイルシステム上の特定のブロックを修復するために提案されるアクションを実行してもよいかどうかを尋ねる一連の確認リクエストが表示されることになるでしょう。一般に、これらのリクエストには y (はい) と応答して、fsck に問題の修復を任せるべきです。その場合、システムがリブートしてから、欠落しているデータやファイルがないかどうかを調べてください。

ファイルシステムの損傷が疑われる場合、あるいは手動でチェックを実行したい場合、大抵のチェック・プログラムではファイルシステムをアンマウントするか、少なくとも読み取り専用でマウントすることが必要となります。けれども実行中のシステムではルート・ファイルシステムをアンマウントすることができません。そのため最善の策となるのは、シングル・ユーザー・モードに移行して (telinit 1を使用)、ルート・ファイルシステムを読み取り専用で再マウントすることです。これで、整合性チェックを実行できるようになります。さらに望ましいファイルシステムのチェック方法は、ライブ CD や USB メモリー・キーなどのリカバリー・システムをブートし、リカバリー・システムから、アンマウントされたファイルシステムのチェックを実行することです。

fsck で問題を修復できなくても、他に使用できるツールはあります。けれどもファイルシステムを正常に修復するためには、ファイルシステムのレイアウトに関する高度な知識が必要になるのが通常です。

なぜジャーナルなのか

ext2 ディスクの fsck スキャンは、完了するまでに相当な時間がかかることがあります。これは、ファイルシステムの内部データ構造 (またはメタデータ) を完全にスキャンしなければならないためです。ファイルシステムが大きくなるにつれ、スキャンにかかる時間は長くなります。これはディスクの速度が速くなったとしても変わらないので、完全なチェックに 1 時間以上かかってしまう可能性もあります。

この問題がきっかけとなって生まれたのが、ジャーナル機能を持つファイルシステム、つまりジャーナリング・ファイルシステムです。ジャーナリング・ファイルシステムは、最近行われた変更のログをファイルシステム・メタデータに保持します。ファイルシステムが損傷した後、ファイルシステムのドライバーはログを調べ、ファイルシステムの最近の変更箇所のうち、エラーのある可能性がある箇所を判断します。この設計変更により、ジャーナリング・ファイルシステムの整合性チェックは、ファイルシステムのサイズとは関係なく、ものの数秒で行われるようになります。さらに、ファイルシステムのドライバーはマウントされたファイルシステムをチェックするのが通常なので、外部 fsck チェックは一般に不要となります。実際、xfs ファイルシステムにとって fsck は何の意味も持ちません!

ファイルシステムの手動チェックを実行する場合は、該当する fsck コマンド (fsck.ext3e2fsckreiserfsck など) の man ページを調べて、適切なパラメーターを判断してください。-p オプションを ext2、ext3、または ext4 ファイルシステムで使用すると、安全に修復できる問題であれば、fsck が自動的にすべての問題を修復します。実際、これがブート時に行われることです。

この後 e2fsckxfs_check の使用方法を説明するため、空の XFS ファイルシステムで e2fsck を実行した後、これを修復するためにxfs_check を使用します。前に、適切なチェッカーを使用していることを確実にするためには、fsck フロントエンドを使用するように提案したこと、そしてその提案の通りにしないとファイルシステムが壊れる可能性があると警告したことを思い出してください。

リスト 15 ではまず、XFS ファイルシステムが含まれる /dev/sda8 に対して e2fsck を実行しています。少しやりとりをした後、ctrl-Break を使って中断しようとしていますが、これでは遅すぎます。警告: ファイルシステムを壊そうとするのでない限り、この操作は決して行わないでください。

リスト 15. XFS ファイルシステムで e2fsck を意図的に手動で実行する例
[root@echidna ~]# e2fsck /dev/sda8
e2fsck 1.41.9 (22-Aug-2009)
/dev/sda8 was not cleanly unmounted, check forced.
Resize inode not valid.  Recreate<y>? yes

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
Free blocks count wrong for group #0 (31223, counted=31224).
Fix<y>? ctrl-Break

/dev/sda8: e2fsck canceled.

/dev/sda8: ***** FILE SYSTEM WAS MODIFIED *****

最初のプロンプトで中断したとしても、XFS ファイルシステムが損傷することに変わりはありません。私に続いて声に出して言ってください。「ファイルシステムを壊そうとするのでない限り、この操作は決して行わないでください。」

今度は xfs_check を使って XFS ファイルシステムを修復します。xfs_check コマンドはかなり冗長ですが、このコマンドには、重大なエラーだけを報告する -s オプションがあります。このオプションを指定した場合の出力をリスト 16 に記載します。

リスト 16. xfs_check による XFS ファイルシステムの修復
[root@echidna ~]# xfs_check -s /dev/sda8
cache_node_purge: refcount was 1, not zero (node=0x1cf3ee0)
xfs_check: cannot read root inode (117)
cache_node_purge: refcount was 1, not zero (node=0x1cf7400)
xfs_check: cannot read realtime bitmap inode (117)
bad magic # 0x1040000 in btbno block 0/1
bad magic # 0x4000 in btcnt block 0/2
bad magic # 0x58465342 in inobt block 0/0

XFS ファイルシステムを修復するには、xfs_repair コマンドを使用することもできます。これも xfs_check と同じくかなり冗長なコマンドですが、このコマンドには -s オプションがありません。実際に修復するのではなく、何を修復しなければならないかを調べるだけの場合には、xfs_repair -n を使用してください。

スーパーブロック

これまで説明したチェック・ツールと修復ツールが作業に取り掛かる場所をどうやって知るのか、不思議に思っている方もいることでしょう。通常、Linux と UNIX のファイルシステムにはスーパーブロックがあり、このスーパーブロックにファイルシステムのメタデータが記述されます。メタデータとは、つまりファイルシステムそのものの情報を表すデータのことです。メタデータは一般に既知の場所 (大抵はファイルシステムの先頭かその近く) に保管され、他の周知の場所に複製されます。既存のファイルシステムの場合、mke2fs-n オプションを指定して実行すると、スーパーブロックの場所が表示されます。ファイルシステムを作成する際に、i ノードあたりのバイト数の値などをパラメーターとして指定した場合には、-n オプションを使用するときにも同じパラメーターを指定して mke2fs を呼び出してください。リスト 17 に、/dev/sda7 でスーパーブロックが置かれている場所を示します。

リスト 17. スーパーブロックの場所の検索
[root@echidna ~]# mke2fs -n /dev/sda7
mke2fs 1.41.9 (22-Aug-2009)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
7159808 inodes, 28637862 blocks
1431893 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
874 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
	4096000, 7962624, 11239424, 20480000, 23887872

高度なツール

ファイルシステムの検査または修復には、さらに高度なツールをいくつか使用することができます。正しい使い方については man ページを、ハウツー情報については Linux Documentation Project (「参考文献」を参照) を調べてください。これらのコマンドでは必ずと言ってよいほど、ファイルシステムをアンマウントする必要がありますが、関数によっては読み取り専用でマウントされているファイルシステムで使用できるものもあります。以下に、高度なコマンドをいくつか抜粋して説明します。

修復を試みる前に、必ずファイルシステムをバックアップしてください。

ext2 および ext3 ファイルシステム用のツール

tune2fs
ext2 および ext3 ファイルシステムのパラメーターを調整するためのツールです。このツールを使用して、ext2 ファイルシステムにジャーナルを追加して ext3 ファイルシステムに変換したり、強制チェックが行われる前にマウントの最大数を表示、または設定したりすることができます。さらに、各種のオプション機能にラベルを割り当て、それぞれの機能を設定したり無効にしたりすることもできます。
dumpe2fs
ext2 または ext3 ファイルシステムのスーパーブロックおよびブロック・グループ記述子情報を出力します。
debugfs
対話型ファイルシステム・デバッガーです。このツールを使用して、ext2 または ext3 ファイルシステムの状態を確認、または変更することができます。

Reiserfs ファイルシステム用のツール

reiserfstune
ReiserFS ファイルシステムのパラメーターを表示、調整するためのツールです。
debugreiserfs
ReiserFS ファイルシステムに対し、dumpe2fs および debugfs と同様の関数を実行します。

XFS ファイルシステム用のツール

xfs_info
XFS ファイルシステムに関する情報を表示します。
xfs_growfs
XFS ファイルシステムを拡張します (別のパーティションが使用可能であることが前提)。
xfs_admin
XFS ファイルシステムのパラメーターを変更します。
xfs_repair
マウント・チェックではシステムを修復しきれない場合に、XFS ファイルシステムを修復します。
xfs_db
XFS ファイルシステムを検査、またはデバッグします。

ツールの説明の締めくくりとして、ext 系列のファイルシステムの内部動作を調べるために使用する debugfs コマンドについて説明します。デフォルトでは、このコマンドはファイルシステムを読み取り専用モードで開きます。debugfs には多くのコマンドが用意されており、ファイルやディレクトリーのアンデリートを試行するためのコマンドや、書き込みアクセスが必要なその他の操作を行うコマンドなどがあります。したがって、-w オプションを使用して明示的に書き込みアクセスを可能にしなければならないため、このコマンドは慎重に使用する必要があります。リスト 18 では私のシステムを例に、ルート・ファイルシステムを開き、ホーム・ディレクトリーにナビゲートし、index.html という名前のファイルに関する情報 (i ノード番号を含む) を表示し、最後に i ノード番号をファイルのパス名にマッピングする方法を示しています。

リスト 18. debugfs を使用する
[root@echidna ~]# debugfs /dev/sdb9
debugfs 1.41.9 (22-Aug-2009)
debugfs:  cd home/ian
debugfs:  pwd
[pwd]   INODE: 165127  PATH: /home/ian
[root]  INODE:      2  PATH: /
debugfs:  stat index.html
Inode: 164815   Type: regular    Mode:  0644   Flags: 0x0
Generation: 2621469650    Version: 0x00000000
User:  1000   Group:  1000   Size: 14713
File ACL: 0    Directory ACL: 0
Links: 1   Blockcount: 32
Fragment:  Address: 0    Number: 0    Size: 0
ctime: 0x4bf1a3e9 -- Mon May 17 16:15:37 2010
atime: 0x4c619cf0 -- Tue Aug 10 14:39:44 2010
mtime: 0x4bf1a3e9 -- Mon May 17 16:15:37 2010
Size of extra inode fields: 4
Extended attributes stored in inode body: 
  selinux = "unconfined_u:object_r:user_home_t:s0\000" (37)
BLOCKS:
(0-2):675945-675947, (3):1314836
TOTAL: 4

debugfs:  ncheck 164815
Inode	Pathname
164815	/home/ian/index.html
debugfs:  q

まとめ

この記事では、ファイルシステムのチェック、変更、修正に使用できるさまざまなツールについて説明しました。この記事で説明したツールだけでなく、どのツールを使用する場合でも、常に十分な注意が必要であることを忘れないでください。たった 1 つのキーを間違えただけで、データが失われる可能性があるのです。

参考文献

学ぶために

製品や技術を入手するために

  • ご自分に最適な方法で IBM 製品を評価してください。評価の方法としては、製品の試用版をダウンロードすることも、オンラインで製品を試してみることも、クラウド環境で製品を使用することもできます。また、SOA Sandbox では、数時間でサービス指向アーキテクチャーの実装方法を効率的に学ぶことができます。

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux
ArticleID=548820
ArticleTitle=Linux の 101 試験対策: ファイルシステムの整合性の維持
publish-date=08242010