本記事は以下の書籍を参考にしています。
また、本記事は Linux カーネル第4回「ストレージ管理・ファイルシステム」に関する記事です。
その他の Linux カーネルの解説については以下の記事をご覧ください。
- 【Linux カーネル: OS 入門1】OS、カーネルとは
- 【Linux カーネル: OS 入門2】CPU・プロセス管理
- 【Linux カーネル: OS 入門3】メモリ管理
- 【Linux カーネル: OS 入門4】ストレージ管理・ファイルシステム ←イマココ
- 【Linux カーネル: OS 入門5】ファイルシステムの機能一覧
- 【Linux カーネル: OS 入門6】I/O デバイス管理
- 【Linux カーネル: OS 入門7】IPC (プロセス間通信)
ストレージ・ファイルとは
ストレージとは、電源を切ってもデータが残り続ける記憶デバイスです。(SSD, HDD 等)
CPU から直接アクセスできず、データを読み出すには一度メモリに書き出す必要があります。
ファイルとは、データを1つにまとめて名前と関連情報を付与したものです。
ファイルは「デバイス(ストレージ・マウスなど)」や「他のプロセス」とデータをやりとりするために利用します。
プロセスについて詳細を知りたい方は、以下の記事をご覧ください。
ファイルの利点
ファイルの利点は、アドレスの代わりにファイル名を指定することでストレージに保存されたデータにアクセス可能なことです。


そのため、Linux カーネルはファイルという仕組みを利用してストレージへのアクセスを管理します。
ファイルの種類と確認方法
Linux では通常のファイルとは別に、ディレクトリやデバイス (マウス・ストレージ・モニタ等) を含む様々なものをファイルとして扱います。
ファイルの種類は ls -l コマンドの各行の最初の1文字目のシンボルで確認できます。
total 80 -rw-r--r-- 1 hoge staff 149 3 20 13:27 Test.java drwxr-xr-x 5 hoge staff 160 1 15 23:17 test
ファイルには以下の種類があります。
シンボル | ファイルの種類 | 説明 | 用途 |
---|---|---|---|
- | レギュラーファイル | 単にデータを読み書き可能な普通のファイル | いわゆるファイル |
d | ディレクトリ | ファイルのリストを持つファイル | ディレクトリ |
l | シンボリックリンク | このファイルへの読み書きは参照先のファイルに反映 | 別名ファイル、ショートカット |
c | キャラクタデバイス | このファイルへの読み書きは、対応するデバイスと1バイト単位でデータをやりとり(つまりストリーム処理) | マウスやキーボード等への読み書き |
b | ブロックデバイス | このファイルへの読み書きは、対応するデバイスとブロック単位でデータをやりとり(つまりバッファにバイトを貯める) | SSD 等への読み書き |
p | 名前付きパイプ (FIFOスペシャル) | このファイルへ書き込まれたデータは同じ OS の他のプロセスで読み出すことが可能 | プロセス間通信 |
s | ソケット | このファイルは別の OS のプロセスから読み書き可能 | 別のOSのプロセスと通信 |
なお、ストレージ(デバイス)を接続した際に対応するデバイスファイルが自動的に作成されるのは udev という機能によるものです。udev の詳細は以下の記事をご覧ください
ストレージのデータへのアクセスはブロックデバイスファイルを経由してアクセスします。
ストレージにファイルを作成
ストレージにファイルを作成する手順は以下のとおりです。(各用語は後述します)
- ストレージにパーティションを作成 (fdisk コマンド)
- パーティションにファイルシステムを作成 (mkfs コマンド)
- ファイルシステムをマウント (mount コマンド)
- ファイルシステムにファイルを作成
以降では、「パーティション・ファイルシステム・マウント」についてそれぞれ解説します。
パーティションとは
パーティションとは、ストレージを分割した領域のことです。

ストレージのパーティションを分割する利点は以下の2つです。
利点 | 例 |
---|---|
障害の局所化 (別のパーティションに影響を与えない) | OS の再インストールする場合に、アプリケーションのパーティションに影響を与えない |
空き容量不足の局所化 (パーティションごとに別々に空き容量を確保) | ログファイルのパーティションが肥大化しても、OS のパーティションが上書きされない |
パーティションテーブルの形式
パーティションテーブルの形式は、次の2つがあります。
MBR | GPT | |
---|---|---|
対応するストレージ容量 | 2TiB | 8ZiB |
プライマリーパーティションの数 | 4 | 128 |
拡張パーティション | あり | なし |
故障耐性 | なし | あり |
不正書き込み防止(チェックサム) | なし | あり |
ストレージアクセス方式 | CHS | CHS,LBA |
ブートセクタ | MBR | GPTヘッダー |
ブートセクタ呼び出し元ファームウェア | BIOS | UEFI |
MBR (Master Boot Record) 形式とは
MBR とは OS をブートするローダーと、各パーティションの開始位置が記録されたレコードです。
MBR 形式における、ストレージのパーティション構造は以下のとおりです。

MBR 形式のパーティション構造は、以下の3種類の領域が存在します。
- MBR 領域
- プライマーパーティション領域
- 拡張パーティション領域
MBR 領域の詳細は以下のとおりです。


プライマリーパーティション領域の詳細は以下のとおりです。

拡張パーティション領域の詳細は以下のとおりです。


拡張パーティション領域は、上記のように複数の論理パーティションに分けることが可能です。
GPT (GUID Partition Table) 形式とは
GPT とは MBR の置き換えを目的としたパーティションテーブルです。
パーティションを設定可能なストレージの容量が「MBR では 2TiB」ですが、 「GTP では 8ZiB」に増加しています。
GPT における、ストレージのパーティション構造は以下のとおりです。
なお、GPT エントリは冗長化のために、ストレージの先頭と最後部の両方に書き込まれています。


MBR が存在することからわかるように、MBR 形式と互換性があります。
パーティションの作成方法 fdisk
ストレージにパーティションを作成するには、fdisk コマンド (MBR) もしくは gdisk (GPT) を利用します。
以下に fdisk を利用した方法を紹介します。
$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT xvda 202:0 0 8G 0 disk └─xvda1 202:1 0 8G 0 part / xvdf 202:80 0 10G 0 disk # ブロックデバイスファイル(ファイルとして表現されたストレージ)の一覧を表示 # xvdf ストレージのパーティションを分けることにします。 $ ls /dev/xvd* /dev/xvda /dev/xvda1 /dev/xvdf /dev/xvdf1 # デバイスファイルは "/dev/" 配下に存在します。 $ sudo fdisk /dev/xvdf #/dev/xvdf ブロックデバイスファイル(ファイルとして表現されたストレージ)のパーティションを操作 コマンド (m でヘルプ): n # n はnew パーティションを作成という意味です。 パーティションタイプ p 基本パーティション (0 プライマリ, 0 拡張, 4 空き) e 拡張領域 (論理パーティションが入ります) 選択 (既定値 p): p #基本(プライマリー)パーティションと拡張領域があります。基本パーティション選択 #基本パーティションはOSを起動できるパーティションで4つまで作成できます。論理パーティションは5つ目以降のパーティションを作成する際に基本パーティションの番号(1-4)のどれか1つを拡張パーティションとして定義し、その中に論理パーティションを作成します。 パーティション番号 (1-4, 既定値 1): 1 #4つまで作れます。今回は1つ目なので 1 最初のセクタ (2048-20971519, 既定値 2048): 2048 #管理情報に2048セクタ使用されているので、それ以降を指定します。 最終セクタ, +セクタ番号 または +サイズ{K,M,G,T,P}(2048-20971519, 既定値 20971519):+4G #4G分の領域を確保します。
実行結果は以下のとおりです。
コマンド (m でヘルプ): p # pはパーティションの情報を確認します。 (中略) デバイス 起動 開始位置 最後から セクタ サイズ Id タイプ /dev/xvdf1 2048 8390655 8388608 4G 83 Linux コマンド (m でヘルプ): w #fdiskコマンドを終了します。 $ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT xvda 202:0 0 8G 0 disk └─xvda1 202:1 0 8G 0 part / xvdf 202:80 0 10G 0 disk └─xvdf1 202:81 0 4G 0 part #xvdf ブロックデバイスファイル(ストレージ)10Gのうち 4Gのパーティションに区切られていることがわかる。
ファイルシステムとは
ファイルシステムとは、「ファイルを利用したデータの管理・アクセス」をするためのカーネルの機能です。
1つのストレージでも、パーティションごとに異なるファイルシステムが作成可能です。
ファイルシステムの主な機能
ファイルシステムの主な機能は以下の5つです。
- ファイルアクセスメカニズム:ファイルを利用してストレージにアクセス
- パーミッション:ファイルのアクセス許可
- シンボリックリンク:ファイルのショートカット
- スナップショット:任意の時点でのストレージのデータを記録
- ジャーナリング:ファイルとストレージのデータの整合性を保つ
ファイルシステムの一覧
Linux で主に利用するファイルシステムは、RHEL の公式ドキュメントに記載されています。ファイルにアクセスするという基本機能は同じですが、特定のファイルシステムにしか無い機能も存在します。

ファイルシステムの構造
最初に、ファイルシステムはパーティションごとに設定可能です。


ブートブロック(Boot block)とも。一般に、PC/AT互換機ではブートセクタと呼び、他のコンピュータではブートブロックと呼ぶことが多い。
https://ja.wikipedia.org/wiki/%E3%83%96%E3%83%BC%E3%83%88%E3%82%BB%E3%82%AF%E3%82%BF
ファイルシステムは以下の4つのブロックから構成されます。

ブロック | 説明 |
---|---|
ブートブロック | OSをブートするためのファイルが格納 |
スーパーブロック | ファイルシステムのメタデータ(種類・サイズ・inodeの数等)を格納 |
i-node テーブル | ファイルのメタデータ(ファイルタイプ・サイズ等)の一覧を格納 |
データブロック | ファイルを格納 |
スーパーブロックの確認
スーパーブロックはファイルシステムのメタデータのことです。
利用中のファイルシステムのスーパーブロックは、dump2fs コマンドにオプション -h を付与することで確認可能です。
Filesystem UUID: ????????-????-????-*** ##ファイルシステムのUUID Filesystem magic number: 0xEF53 Inode count: 524288 ##inodeの数 Block count: 2096635 ##ブロックの数 Block size: 4096 ##ブロックのサイズ(Byte) Fragment size: 4096 Group descriptor size: 64 Reserved GDT blocks: 1023 Blocks per group: 32768 Fragments per group: 32768 Inodes per group: 8192 Inode blocks per group: 512 Filesystem created: Sat Oct 5 09:13:12 2019 ##ファイルシステム作成日 Last mount time: Sat Oct 5 09:14:29 2019 ##マウントした日 Last write time: Sat Oct 5 09:14:29 2019 ##最終書き込みを行った日 Inode size: 256 (中略)
i-node の確認
i-node はファイルのメタデータのことです。
ファイルの i-node は stat <ファイル名>コマンドで確認可能です。
File: `test.txt' Size: 4 Blocks: 8 IO Block: 4096 通常ファイル Device: 10302h/66306d Inode: 12960620 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 1000/ec2-user) Gid: ( 1000/ec2-user) Access: 2021-04-12 13:04:55.867584473 +0000 Modify: 2021-04-12 13:04:55.867584473 +0000 Change: 2021-04-12 13:04:55.867584473 +0000 Birth: -
POSIX 標準で規定されている inode のメタデータの一覧は以下のとおりです。
- ファイルサイズ
- ファイルタイプ
- inode 番号(ファイルシステム内でユニークな ID 。ファイルを識別)
- 当該 inode を指すハードリンクの数
- デバイス ID(ファイルを格納しているデバイスを識別)
- ファイルパーミッション
- ファイル所有者のユーザー ID
- ファイルのグループ ID
- 最終 inode 更新時(ctime)、最終ファイル更新時(mtime)、最終参照時(atime) を示すタイムスタンプ群
ファイルシステムの作成・確認コマンド
ファイルシステムは mkfs.<ファイルシステム名>で作成できます。上述したファイルシステムの一覧を確認した上で任意のファイルシステムを作成します。今回は ext4 ファイルシステムを例に説明します。
/dev/xvdf1: data
"data" はファイルシステムが無いことを表します。
次に /dev/xvdf1 パーティションに ext4 ファイルシステムを作成します。
mke2fs 1.42.9 (28-Dec-2013) (中略) Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done
/dev/xvdf1 パーティションに ext4 ファイルシステムが作成できていることを確認します。
/dev/xvdf1: Linux rev 1.0 ext4 filesystem data
ファイルシステムのマウントとは
マウントとは、ファイルシステムを設定したパーティションにディレクトリを登録することです。このディレクトリをマウントポイントと言います。
ファイルシステムを設定したパーティションを持つブロックデバイスファイルをマウントすることで、ディレクトリを指定してストレージにアクセスできます。
手動マウント方法 mount
ファイルシス タイプ 1K-ブロック 使用 使用可 使用% マウント位置
/dev/xvdf1 がマウントされていないことがわかったので、マウントポイント(/test ディレクトリ)にマウントする。
ファイルシス タイプ 1K-ブロック 使用 使用可 使用% マウント位置 /dev/xvdf1 ext4 3997376 16376 3754904 1% /test
自動マウント方法 /etc/fstab
ファイルシステムの種類によりますが mount コマンドだけでは、再起動するとマウントの設定が消えます。
そこで、再起動後もマウントの設定を反映させるためには、/etc/fstab ファイルを利用します。
/dev/xvdf1(UUID=1234abcd-1234-as12-234s-123456789abc)パーティションを /test マウントポイントにマウントする設定は以下のとおりです。
/dev/xvdf1: UUID="1234abcd-1234-as12-234s-123456789abc" TYPE="ext4" PARTUUID="1234abcd-11"
UUID=1234abcd-1234-as12-234s-123456789abc /test ext4 defaults 1 1
/etc/fstab の各フィールドの意味は以下のとおりです。
フィールド | 説明 |
---|---|
第1フィールド | デバイス名(UUID もしくはデバイスファイルパス) |
第2フィールド | マウントポイント |
第3フィールド | ファイルシステムの種類 |
第4フィールド | オプション。defaults はブート時にマウント |
第5フィールド | 1でダンププログラムがファイルシステムをバックアップする |
第6フィールド | 2でOS起動後にfsckチェックを行う 0 - do not check 1 - check immediately during boot 2 - check after boot |
Linux カーネルの関連記事
Linux カーネル「ストレージ管理・ファイルシステム」に関する説明は以上となります。
その他の Linux カーネルの機能について知りたい場合は以下の記事をどうぞ。
- 【Linux カーネル: OS 入門1】OS、カーネルとは
- 【Linux カーネル: OS 入門2】CPU・プロセス管理
- 【Linux カーネル: OS 入門3】メモリ管理
- 【Linux カーネル: OS 入門4】ストレージ管理・ファイルシステム ←イマココ
- 【Linux カーネル: OS 入門5】ファイルシステムの機能一覧
- 【Linux カーネル: OS 入門6】I/O デバイス管理
- 【Linux カーネル: OS 入門7】IPC (プロセス間通信)