今回のお題は、パーティションです。WindowsとLinuxではパーティションに対する考え方もちょっと違います。私自身、初めてSlackwareをインストールするときにずいぶん悩んだものです。
Windowsでは、原則として分割されたパーティションには独立したドライブ名が割り当てられます(図1)。これはHDDが普及し始めたころのMS-DOS Ver.3.xに由来すると思われます。当時、PC/AT互換機用のMS-DOS Ver.3.xはファイルシステムの制限で32Mbytesまでしか扱えませんでした。そこでHDDを複数の区画に分けて、各区画を32Mbytes以下とすることですべての領域を使おう、というのがパーティションの始まりではないかと想像しています。さらにさかのぼれば、ドライブ名という発想はインテルの8080という8bits CPU用OSであるCP/Mにまでたどれるでしょう。それ以前にはマイコン用のメジャーなOSは存在しませんでした。
余談ながら、同じMS-DOS Ver.3.xでもPC-9800シリーズ用では32Mbytesの制限を受けた記憶がありません。改良したのか、そもそもPC/ATとPC-9800シリーズのアーキテクチャ上の違いだったのかは判然としませんが……。また、PC-9800シリーズ用のMS-DOSではformat.exeが領域管理とフォーマットの両方を行っていました。対してPC/AT互換機用ではfdisk.exeで領域を操作し、format.exeでフォーマットを行うようになっていました。PC-9800シリーズからPC/AT互換機に乗り換えた当初はこれが分からず、苦労したものです。
また、原則としてPC/AT互換機では1つのHDDに確保できるパーティションは4つまでです。これには回避策があって、拡張パーティションを使えばさらに増やせます(編注)。
Linuxのファイル名空間は1つです。つまり、HDDはすべて「/」(ルート)から順にたどっていけます。ハードウェア的には完全に独立したHDDであっても、これは変わりません(図2)。というよりも、Linuxの先輩であるUNIXが開発されたころはそれほど容量の大きなHDDがなく、複数のHDDを1つにまとめざるを得なかったということでしょう。
ちょっと実例を挙げてみましょう。話を簡単にするため、4GbytesのHDDを2Gbytesの基本パーティションと2Gbytesの拡張パーティションに分けているとします。Windowsでは基本パーティションがCドライブ、拡張パーティションがDドライブとなり、それぞれが独立したディレクトリ構造を持ちます。
対してLinuxでは、もう少し融通が利きます。とりあえず、基本パーティションを/ファイルシステムとして使うことにしましょう。あとは、
$ mount /dev/hda5 /home
とすることで、拡張パーティションを/home以下に割り当てられます。こうすると、2つのパーティションは見かけ上1つのディレクトリ構造になるわけです。実際には、/ファイルシステムにいくら空きがあっても、/homeファイルシステムがいっぱいになるとそれ以上/home以下にはファイルを追加できなくなるのですが。
実は、MS-DOSにもかつてこれと同じ働きをするjoinコマンドが用意されていました。が、MS-DOS Ver.5のころにはなくなっています。これは優劣の問題ではなく、文化的なバックグラウンドが違っていたためでしょう。
逆に、/dev/hda5を/ファイルシステムにして、/homeに/dev/hda1を割り当てることもできます。実際にはいちいち手でコマンドを打ち込むのではなく、/etc/fstabの記述に従ってファイルシステムがマウントされます。HDDを増設した場合も、/etc/fstabの記述を変更することでファイルシステムに追加します。
なお、Linuxでは最初に見つかったIDE HDDから順にhda、hdb、hdcと名前を付けていきます。パーティションを表すときは、その後に数字を付けます。hda1は最初の基本パーティションで、hda2は2番目の基本パーティションです。拡張パーティションは5から始まります。Windowsのfdisk.exeに慣れていると複数の基本パーティションを作れるのが不思議に思えますが、Linuxのfdiskでは可能なのです(編注)。
Magicなどのツールを使えば、Windows環境でも複数の基本パーティションを作成可能。
さて、現在のLinuxで標準的に使われているext2というファイルシステムでは、理論的に4Tbytesのパーティションまで扱えます。これだけを見れば、当分の間1台のHDDを1つのパーティションで使えそうです。ただし、現実問題としては4Gbytes、8Gbytes、34Gbytesあたりにさまざまな規格上の制約があります。IDEやBIOSの規格を決めたときには、まさかこれほど大容量のHDDが使えるようになるとは予想していなかったためです。
実際、私が使っていたマザーボードでは、10GbytesのHDDを認識しないどころか、ブートシーケンスがそこで止まってしまうというありさまでした。ただこれはBIOSの問題だったようです。ブート用に小さなHDDを用意して、10Gbytes HDDの認識をスキップすることで無事使えました。こうした制限に関しては、http://www.linux.or.jp/JF/JFdocs/Large-Disk-HOWTO.htmlに解説されています。
一般的に、新しいマザーボードほど制約が少なくなっています。しかし、中にはHDDの全容量を認識できないまでもマシン自体の起動が可能で、しかしながら巨大なパーティションからはOSをブートできない、という場合もあり得ます。こうしたときは、カーネルを収めるための領域を100Mbytesくらい確保する必要があるかもしれません。いったんブートしてカーネルがHDDの容量を正しく認識すれば、BIOSがどうであろうと関係ないので、カーネルを収めたパーティション以外は自由に配置できます。
BIOSはBasic Input Output Subsystemの頭文字で、これまたCP/Mが採用して一般化したものです。いまでいうデバイスドライバのようなもので、機種依存部分をここに集めておき、移植の際にはここを書き換えるだけですむようにするのが目的でした。
PC/AT互換機のBIOSはシングルタスクのMS-DOSを前提とした設計で、マルチユーザー/マルチタスクのOSでは使えないのです。BIOSを使うのはブート時だけで、カーネルが動き出した時点ではまったく使わなくなり、BIOSの制限は問題にならなくなります。これはWindowsでも同様で、カーネルをメモリに読み込んで制御を移すカーネルローダさえBIOSで読み込めれば何とかなります。
Copyright © ITmedia, Inc. All Rights Reserved.