Linuxのブートとファイルシステムについて

Linuxではハードディスクをパーティションに分割して利用します。それぞれのパーティションにはアクセスするためのデバイスファイルが割り当てられ、各パーティションはそれぞれ独立したファイルシステムを持ちます。ファイルシステムには ext2、ext3、ext4、XFS などがあります。

第一パーティションは bootファイルシステムです。Linuxを起動すると(電源を入れると)ROM内のBIOSがPOST(Power On Self Test:ハードウェアの種々のチェックや初期化を行うこと)をし、ディスクの先頭にあるブートローダーと呼ばれるプログラムを実行します。この領域はMBR(Master Boot Record)と呼ばれ、bootファイルシステムに属しています。MBRにはブートローダーの他に各パーティションの情報を保持したテーブル(パーティションテーブル)が格納されています。

起動されたブートローダーはパーティションテーブルからOSが置かれているパーティションを検索します。そしてそのパーティションの先頭(ブートブロック)にあるプログラムを実行します。この領域はPBR(Partition Boot Record)と呼ばれます。このプログラムがOSを起動させています。

ただ、BIOSによる起動(MBR方式)では以下の問題があります。

  1. パーティションテーブルに格納できるエントリは4個まで
  2. MBRで扱えるハードディスクの容量は2TBまで

これらを解消するためにUEFI(GPT方式)が導入されました。GPT(GUID Partition Table)では2TBの制限はなくなりパーティションテーブルのエントリも128個まで拡張されています。UEFIでは「EFI System Partition」と呼ばれるパーティション領域を作成し、そこにブートローダーやパーティションテーブルを格納します。マザーボードに組み込まれたファームウェアがEFIシステムパーティションの内容を読み込み、ブートローダーがOSの起動まで行っています。EFIシステムパーティションはFATベースのファイルシステムでフォーマットされています。

LinuxのブートローダーにはGRUBがあります。GRUBはいくつかのコンポーネントで出来ており、bootファイルシステム(EFIシステムパーティション)、および、ブートブロックに格納されています。

ここからはファイルシステムについて書いてみます。

ファイルシステムはブートブロック、スーパーブロック、iノードリスト、データブロックで構成されています。各パーティションのファイルシステムを確認するには「df -T」コマンドで確認できます。ブートブロックにはOSを起動するプログラムが入っています。

スーパーブロックですが、この領域にはファイルシステムを管理する以下のような情報が格納されています。

  • ファイルシステムの大きさ
  • 空きブロックに関する情報
  • iノードに関する情報
  • スーパーブロックが修正されたことを示すフラグなど

2点目の空きブロックに関する情報ですが「空きブロック数」、「使用可能な空きブロックのリスト」、「空きブロックリスト内における次の空きブロックへのポインタ」などがあります。スーパーブロックの詳細を確認したい場合は「dumpe2fs -h デバイスファイル名」のコマンドで確認できます(ただし、root権限が必要)。

3点目のiノードに関する情報ですが、そもそもiノードとは「1つのファイルを管理するのに必要な情報の入れ物」です。この入れ物に関する情報をスーパーブロックで保持しています。具体的には「iノードリストの大きさ(入れ物がいくつあるか)」、「使用可能な空きiノードの数」、「空きiノードのリスト」、「空きiノードリスト内における次の空きiノードへのポインタ」などです。iノードを区別するためにiノードにはiノード番号と呼ばれる番号が割り当てられています。iノードが枯渇するとディスク容量に空きがあったとしてもファイルを作成することはできません。ディスクに空き容量があるのに「空き容量が足りない」旨のメッセージが出た場合は空きiノード数を確認してみてください。iノードに関する情報は「df -i」コマンドで確認できます。ちなみにiノードは「index node」を短縮したものです。

最後のスーパーブロックが修正されたことを示すフラグですが、スーパーブロックの情報はメモリ上で管理されていて定期的にディスクに書き込まれています。システムが正常な手段で停止しなかった場合、スーパーブロックのフラグが立ったままになるので次のシステム起動時にシステムがそのフラグをチェックして不整合を修復するのに使われます。

スーパーブロックの次の領域には、iノードリストがあります。先に説明したようにファイルを管理する入れ物がリスト形式でここに格納されています。この入れ物の中身(すなわち、ファイルを管理するための情報)ですが、以下のものがあります。

  • ファイルの種類(一般ファイル、ディレクトリファイル、デバイスファイル)
  • ファイルへのリンク数
  • ファイルの所有権
  • ファイルのアクセス権
  • 時間(最終アクセス時刻、最終変更時刻、ステータス変更時刻(iノード自体が最後に変更された時刻))
  • バイト単位でのファイルサイズ
  • データブロックへのポインタなど

iノードの中身には「ファイル名」も「ファイルのデータ自体」も含まれていません。ファイル名はディレクトリファイルに格納されており、この仕組みは次回書こうと思います。ファイルのデータはiノードリストの次の領域にあるデータブロックに格納されています。

最後に、、この記事を書くにあたり以下の書籍を参考にさせていただきました。僕がずいぶん前に読んだ本ですが読み返してみました。

IPv4のアドレス範囲表と、そのアドレスの説明

IPv4アドレスは 0.0.0.0 〜 255.255.255.255 までの範囲となるのですが、アドレスの特徴によって範囲が決められています。以下にIPv4のアドレスマップを書いてみます。

クラスアドレス

IPアドレスはクラスA、B、C、D、Eのアドレスクラスにわけられます。これはIPアドレスの先頭4ビットの値によって決まります。各クラスは以下のルールによって定義されています。

●クラスA
IPアドレスの第一オクテットの先頭1ビットが「0」となるアドレスです。つまり、第一オクテットが 00000000 〜 01111111 となる範囲です。10進数に直すと 0 〜 127 です。ただし、00000000(10進数で 0 ) と 01111111(10進数で 127 )は別の用途で使われるためクラスAでは利用できません。そのためクラスAのIPアドレスの範囲は 1.0.0.0 〜 126.255.255.255 となります。

●クラスB
IPアドレスの第一オクテットの先頭2ビットが「10」となるアドレスです。第一オクテットが 10000000 〜 10111111 となる範囲です。10進数に直すと 128 〜 191 です。クラスBのIPアドレスの範囲は 128.0.0.0 〜 191.255.255.255 となります。

●クラスC
IPアドレスの第一オクテットの先頭3ビットが「110」となるアドレスです。第一オクテットが 11000000 〜 11011111 となる範囲です。10進数に直すと 192 〜 223 です。クラスCのIPアドレスの範囲は 192.0.0.0 〜 223.255.255.255 となります。

●クラスD
IPアドレスの第一オクテットの先頭4ビットが「1110」となるアドレスです。第一オクテットが 11100000 〜 11101111 となる範囲です。10進数に直すと 224 〜 239 です。クラスDのIPアドレスの範囲は 224.0.0.0 〜 239.255.255.255 となります。この範囲のアドレスはマルチキャストアドレスと呼ばれ 1対N(グループ宛て)の通信に利用されます。なお、224.0.0.0 〜 224.0.0.255 の範囲のアドレスは同一ネットワーク上でのみ送信されルーターによる転送はありません。

●クラスE
クラスA〜D以外の残りの範囲のアドレスです。これは実験用のアドレスで通常は利用されません。

グローバルアドレスとプライベートアドレス

●グローバルアドレス
インターネットで利用できるIPアドレスです。グローバルアドレスはIANA(ICANN)によって管理されています。

●プライベートアドレス
インターネットでは利用できず組織(または家庭)の内部ネットワークでのみ利用可能なIPアドレスです。インターネット上のルーターはプライベートアドレスを転送しないためプライベートアドレスがインターネット上に出ていくことはありません。プライベートアドレスはクラスA、B、Cで、それぞれ範囲が決められています。

クラスA
10.0.0.0 〜 10.255.255.255

クラスB
172.16.0.0 〜 172.31.255.255

クラスC
192.168.0.0 〜 192.168.255.255

ネットワークアドレスとブロードキャストアドレス

●ネットワークアドレス
IPアドレスはネットワーク部とホスト部にわかれていますが、ホスト部のビットがすべて 0 の場合のアドレスがネットワークアドレスです。ネットワークアドレスはそのネットワーク自体を表し、ルーターがルーティングするときに利用します。

●ブロードキャストアドレス
ブロードキャストアドレスはホスト部のビットがすべて 1 の場合のアドレスです。ネットワーク内のすべての端末にデータを送信する際に利用されます。32ビットをすべて 1 にした 255.255.255.255 のアドレスはルーティングが許可されていないためローカルネットワークより外には転送されません。ARPやDHCPの際に利用されます。

その他、特別なアドレス

●ループバックアドレス
ループバックアドレスは第一オクテットが 127 で始まるアドレスです。自分自身を表す仮想的なアドレスでTCP/IPが有効であれば利用可能です。利用可能なIPアドレスの範囲は 127.0.0.1 〜 127.255.255.254 となります。

●リンクローカルアドレス
DHCPのなんらかの障害によりIPアドレスの取得が出来なかった場合、APIPA(Automatic Private IP Addressing)という機能にって自動的に端末に割り当てられるIPアドレスです。この宛先アドレスへはルーターの転送はできません(ローカルネットワークのみで有効)。割当可能なIPアドレスの範囲は 169.254.0.1 〜 169.254.255.254 となります。

●シェアードアドレス
シェアードアドレスはプロバイダーがCGN(キャリアグレードNAT)行うために設けられたIPアドレスです。CGNはプロバイダー網内でNATを実施して一つのグローバルアドレスを複数のユーザーで共用する技術です。IPv4アドレスの延命策の一つとして検討されました。IPアドレスの範囲は 100.64.0.0/10 とされています。