Linuxファイルシステムのサイズ変更とデフラグ

前回は、Linuxファイルシステムを最適化する方法をいくつか紹介した。今回は、サイズ変更とデフラグという、ファイルシステムに対する2つの操作を取り上げる。
本稿は、先日刊行された英書『Linux Power Tools』からの抜粋である。

ファイルシステムのサイズ変更

Linuxをインストールした後になってパーティションが最適なサイズではなかったと気付くことは多い。たとえば、/usrは大きすぎ、/homeは小さすぎたという場合だ。これまで、この問題を解決するには、シンボリックリンクを利用して、特定パーティションにある一部のディレクトリが別のパーティションにあるように見せかけるか、バックアップしてからパーティションを作り直し、データをリストアしていた。しかし、パーティションサイズの動的変更ツールを利用する方がたいていは簡単だ。幸い、主要なLinuxファイルシステムのほとんどには利用可能なパーティションサイズ変更ツールが存在しているので、そのようなツールを利用すればLinuxインストールを管理することができる。

パーティションサイズの動的変更ツールは、その性格上、危険なツールだ。停電、システムクラッシュ、バグなどのせいで、パーティションに深刻な損傷が及ぶおそれがある。サイズを変更したいパーティションにあるデータは必ずバックアップしておくべきだろう。また、マウント中のパーティションに対してパーティションサイズの動的変更ツールを実行してはならない。必要なら、Linuxレスキューディスクからシステムを起動して、パーティションのサイズを変更しよう。

ext2fsとext3fsのサイズ変更

ext2とext3のファイルシステムをサイズ変更するためのツールはいくつかある。

resize2fs ほとんどのディストリビューションに含まれているe2fsprogsパッケージ内にある。resize2fsプログラムは、オプションの点から見るとごく普通だ。最も簡単に使いたい場合は、resize2fs /dev/hda4のように、対象パーティションに関連付けられたデバイスファイルをこのツールに渡す。/dev/hda4のファイルシステムのサイズが対象パーティションのサイズに合わせて変更される。また、resize2fs /dev/hda4 256000のように、アロケーションブロック単位のパーティションサイズをこのツールに渡して、ファイルシステムのサイズを256,000ブロックに変更することもできる。resize2fsプログラムが変更するのは、パーティションのサイズではなく、そのパーティションに入っているファイルシステムのサイズだ。したがって、パーティションとそのファイルシステムのサイズを変更するためには、resize2fsをfdiskと併用しなければならない。ファイルシステムを縮小したい場合は、まずファイルシステムを縮小してから、それに合わせてfdiskでパーティションを縮小することになる。一方、パーティションを拡大したいなら、先にfdiskを使用してから、resize2fsを使用する。ファイルシステムとパーティションのサイズを一致させるのはミスを招きやすい作業なので、一般的にはresize2fsよりもGNU PartedやPartitionMagicを使用するのがベストだ。

GNU Parted ファイルシステムとパーティションのサイズを同時に変更できるので、resize2fsよりも使いやすい。このプログラムについては「GNU Partedの使い方」で詳しく説明する。

PartitionMagic PowerQuestが販売しているこのプログラムでは、FAT、NTFS、ext2fs、ext3fs、Linuxスワップパーティションに対するファイルシステムとパーティションのサイズ変更操作が統合されている。ext2fsやext3fsを対象にしたその他のパーティションサイズ変更ツールよりも使いやすいが、DOSかWindowsからしか実行できない(パッケージにはDOSブートフロッピーイメージとブート可能CD ROMが同梱されているので、Linuxのみのシステムでも使用できる)。

ReiserFSのサイズ変更

ReiserFSのサイズ変更が可能なツールは2つある。

resize_reiserfs resize2fsプログラムのReiserFS版である。resize2fsと同様、パーティションではなく、その中のファイルシステムのサイズを変更するツールなので、fdiskと併用しなければならない。このプログラムにパーティション識別子だけを渡した場合は、そのパーティションに合わせてファイルシステムのサイズが変更される。-sオプション付きでファイルシステムのサイズを渡した場合は、パーティションがそのサイズに変更される。ファイルシステムのサイズは、バイト、キロバイト、メガバイト、ギガバイト単位で指定できる(最後の3つのオプションにはそれぞれK、M、Gの接尾辞が必要)。また、サイズの前にマイナス(-)やプラス(+)の記号を付けると、パーティションサイズの変更量を指定することができる。たとえば、resize_reiserfs -s -500M /dev/sda5では、/dev/sda5にあるファイルシステムのサイズが500MB小さくなる。

GNU Parted このツールのWebページによれば、ほかのファイルシステムに加えてReiserFSもサポートしている。残念ながら、バージョン1.6.4の時点では、大半のディストリビューションには存在しないライブラリや、指示どおりにすべてをインストールしたときのまったくの新規ビルドでも見つけられないライブラリに依存しているため、ReiserFSのサポートは現実ではなく理論にすぎない。運がよければ、そのうちに改善されるだろう。

ReiserFS用のサイズ変更ツールは、ext2やext3ファイルシステム用のサイズ変更ツールほど成熟していない。実際、resize_reiserfsではこのソフトウェアがベータ版であるという警告が表示される。

XFSのサイズ変更

XFSにはかなり前からxfs_growfsというパーティションサイズ変更ツールが付属している。名前でわかるとおり、ファイルシステムのサイズを減らすのではなく、増やすように設計されている。また、大半のパーティションサイズ変更ツールとは異なり、マウント済みのファイルシステムに対してしか機能しない。対象ファイルシステムをアンマウントし、fdiskでそのパーティションを削除して、そこに新しいパーティションを作成してからファイルシステムをマウントし、次のようにしてxfs_growfsを呼び出すのが最も安全な使い方だ。

# xfs_growfs /mount/point

想像がつくだろうが、/mount/pointはパーティションのマウントポイントだ。また、-D sizeオプションを付け加えて、アロケーションブロック単位でファイルシステムのサイズを指定することもできる。xfs_growfsのマニュアルページに記載されているとおり、ほかにもさまざまなオプションがある。

GNU PartedのWebページではXFSのサポートについて触れられていないが、ソースコードにはXFSサブディレクトリが含まれている。実際にもXFSパーティションに対しては機能しなかったが、将来は変わるかもしれない。

JFSのサイズ変更

JFSにはあまり見かけないパーティションサイズ変更機能があり、カーネルのJFSドライバに組み込まれている。この機能を使用すると、減らすことはできないが、ファイルシステムのサイズを増やすことができる。大半のほかのパーティションサイズ変更ツールの場合と同様、fdiskでパーティションを削除してから大きなサイズで作り直すという方法で、パーティションサイズを先に修正しなければならない。それが終わったら、そのパーティションを通常どおりにマウントして、次のコマンドを実行する。

# mount -o remount,resize /mount/point

/mount/pointでマウントされたファイルシステムのサイズがパーティションの空き領域全体を占めるように変更される。JFSに使用できるパーティションサイズ変更ツールはほかにないが、GNU PartedのソースコードにはJFSサブディレクトリがあるので、将来はJFSをサポートするようになるかもしれない。

GNU Partedの使い方

Partedは最も先進的なオープンソースのパーティションサイズ変更ツールなので、もっと注目されるべきだろう。このツールは、一連のコマンドを直接渡すという使い方以外に、対話形式で使用することもできる。よくある一度限りの使用なら対話形式の方が望ましいだろう。ただし、Partedにコマンドを渡すという使い方では、スクリプトを作成してパーティションのサイズ変更を自動化することができる。一般的には、プログラム名に続けて操作対象のデバイスを入力して、対話モードで起動する。その後、コマンドを入力すれば、パーティションに対してサイズ変更、作成、削除などの操作を行うことができる。

# parted /dev/sda
(parted) print
Disk geometry for /dev/scsi/host0/bus0/target5/lun0/disc: 0.000-96.000 megabytes
Disk label type: msdos
Minor    Start       End     Type      Filesystem  Flags
1          0.023     48.000  primary   ext2       
2         48.000     96.000  primary   ext2
(parted) rm 2
(parted) resize 1 0.00 96.00
(parted) quit

この例では、ディスクの2つ目のパーティションが削除され、それで空いた領域がすべて埋まるように最初のパーティションのサイズが変更される。大半のLinuxパーティション管理ツールとは異なり、Partedはメガバイト単位でしか機能しない。そのため、Partedのパーティション開始点と終了点を、fdiskなどのツールが機能するシリンダ境界との間で変換しにくい場合がある。

パーティションのサイズ変更

大半のファイルシステムサイズ変更ツールでは、fdiskを使用してパーティションを修正する必要がある(GNU PartedとPartitionMagicは例外)。正確に言えば、ファイルシステムが入っているパーティションを修正する方法は、縮小と拡大のどちらを行うのかによって異なる。拡大する場合は簡単だ。次の手順に従えばよい。

1. 対象ディスクに対してfdiskを起動する。

2. 拡大したいパーティションを削除するので、fdiskにdと入力する。パーティション番号を指定するように求められる。

3. 削除したパーティションの代わりに新しいパーティションを作成するので、fdiskにnと入力する。パーティション番号のほか、開始シリンダと終了シリンダを指定するように求められる。開始シリンダはパーティションの削除前と同じでなければならない。終了シリンダは当然、削除前より大きくなるはずだ。

4. wと入力して変更内容をディスクに書き込み、fdiskを終了する。

5. ファイルサイズ変更ツールの手順に従ってファイルシステムのサイズを大きくする。

もちろん、パーティションを拡大するためには、それができるだけの空き領域がディスクになければならない。一般的には、拡大対象パーティションの後ろにあるパーティションを事前に削除か縮小しておくことになる。拡大対象パーティションをディスク上で前の方に拡大したい場合は、かなり面倒な作業になる。まず、前の方の開始点を指定する点を除いて、前述のようにして対象パーティションを拡大する。次に、ddと入力して、ファイルシステムを新しいパーティション内の後の方から前の方にコピーする。ただし、既存のファイルシステムが拡大後のパーティション内でどこから始まっているのかを正確に計算しなければならないので、ミスを犯しやすい作業を強いられる。1つのミスでデータが簡単に消えてしまうおそれがある。そのため、このやり方はお勧めしない。代わりに、前の方にある領域に新しいファイルシステムを作成して、ディレクトリツリー内の都合のよい場所にマウントしよう。移動したいパーティションよりも空き領域の方が大きい場合は、新しいパーティションを作成し、元のパーティションを移し替えて、コピー後のパーティションが無傷なのを確認したら、元のパーティションを削除し、コピー後のパーティションとその中のファイルシステムを拡大すればよい。

ファイルシステムのサイズを縮小したい場合は、パーティションのサイズをファイルシステムに一致させなければならない。これもミスを犯しやすい作業だ。幸い、ミスを犯す可能性が小さくなる手順がある。

1. ファイルシステムサイズ変更ツールを使用して、希望より小さな値までファイルシステムを縮小する。たとえば、700MBのパーティションを500MBに縮小したい場合は、400MBに縮小する。

2. fdiskを使用して、パーティションのサイズを500MBなどの目的のサイズに変更する。目的のサイズはファイルシステムより大きくなければならないが、その際、十分な余裕を見込んでほしい。

3. パーティションサイズ変更ツールを使用して、パーティション内の余分な領域がすべて埋まるようにファイルシステムを拡大する。

ファイルシステムのサイズを増やす場合と同様、ファイルシステムの開始点は元のままでなければならない。ファイルシステム間で領域を移動すると、この条件のせいで不都合な状況になるおそれがある。前の方にあるパーティションを縮小することはできるが、直後のパーティションを空き領域まで拡大するのは面倒な作業だ。

ディスクのデフラグ

File Allocation Table(FAT)ファイルシステムやNew Technology File System(NTFS)など、Microsoftのファイルシステムにはディスク分断化が発生しやすい。つまり、ファイルが多数の非連続セグメントに分断される傾向がある。ディスク分断化が発生すると、分断化されていないファイルを読み取る場合に比べて、OSがディスクヘッドを移動する頻度が高くなり、ヘッドが移動する距離も大きくなるので、パフォーマンスが低下する。

幸い、LinuxのネイティブファイルシステムはWindowsのファイルシステムよりもはるかに分断化に強い。そのため、ほとんどのLinuxユーザはディスクのデフラグに気を使わない。実際、Linux用のデフラグツールは手に入れにくい。defragというツールはあるが、ほとんどのディストリビューションには付属していない。また、古いツールなので、最近のext2fsパーティションに対しては機能しない。ジャーナリングファイルシステムではなおさらだ。

システムで分断化による障害が発生しているかもしれないと感じた場合は、fsckを実行すれば、少なくともext2やext3ファイルシステムがどの程度分断化されているのかはわかる。-fパラメータを使ってチェックを強制する必要があるかもしれないが、ディスクの分断化に関するレポートを始めとする情報が表示される。

/dev/hda5: 45/8032 files (2.2% non-contiguous), 4170/32098 blocks

このレポートでは、ファイルの2.2パーセントが非連続になっている(分断化されている)。分断化の割合がこの程度なら問題はない。残念ながら、これ以外のジャーナリングファイルシステム用のfsckツールではこの情報は表示されないので、このようなファイルシステムでは分断化の兆候がわからない。分断化で問題が生じているという確信がある場合は、該当パーティションをバックアップし、まっさらなファイルシステムを作成してからファイルをリストアすれば、状況が改善される可能性がある。ただし、この作業で節約できるその後の数か月から数年分のディスクアクセス時間よりも、作業に要する時間の方がおそらく長くなるので、ファイルシステムの種類を変えたいとかハードディスクを交換したいなどの理由がある場合に限るのが賢明だろう。

一般的に言って、分断化が問題になるのは、ディスクがほぼ一杯になっている場合のみだ。ディスクがほぼ一杯になっていると、1つのファイルを分断化せずに収容できるだけの空き領域があるブロックをLinuxが見つけられなくなるおそれがある。ディスクがほぼ一杯になったからといってファイルを削除しても、削除したファイルによっては残りのファイルが分断化されたままになりかねない。そのため、パーティションが一杯にならないようにするのがベストだ。分断化の観点から見ると、一般的に使用量が80〜90パーセント未満なのがよい。

次回は、このシリーズの最終回として、削除したファイルやファイルシステムの損傷のせいで消失したファイルを対象にして、ファイルの復元方法を取り上げる。