【Linux カーネル: OS 入門4】ストレージ管理・ファイルシステム

本記事は Linux カーネル解説の第4回「ストレージ管理・ファイルシステム」に関する記事です。

なお、本記事は以下の書籍を参考にしています。

その他の Linux カーネルの解説については以下の記事をご覧ください。

スポンサーリンク

ストレージ・ファイルとは

ストレージとは、電源を切ってもデータが残り続ける記憶デバイスです。(SSD, HDD 等)
CPU から直接アクセスできず、データを読み出すには一度メモリに書き出す必要があります。

ファイルとは、データを1つにまとめて名前と関連情報を付与したものです。
ファイルは「デバイス(ストレージ・マウスなど)」や「他のプロセス」とデータをやりとりするために利用します。

プロセスについて詳細を知りたい方は、以下の記事をご覧ください。

ファイルの利点

ファイルの利点は、アドレスの代わりにファイル名を指定することでストレージに保存されたデータにアクセス可能なことです。

各アドレスにどんなデータが入っているのか覚える必要がある
どんなデータが入っているかはファイル名を見ればいい

そのため、Linux カーネルはファイルという仕組みを利用してストレージへのアクセスを管理します。

ファイルの種類と確認方法

Linux では通常のファイルとは別に、ディレクトリやデバイス (マウス・ストレージ・モニタ等) を含む様々なものをファイルとして扱います。

ファイルの種類は ls -l コマンドの各行の最初の1文字目のシンボルで確認できます。

ls -l
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 の詳細は以下の記事をご覧ください

ストレージのデータへのアクセスはブロックデバイスファイルを経由してアクセスします。

ストレージにファイルを作成

ストレージにファイルを作成する手順は以下のとおりです。(各用語は後述します)

  1. ストレージにパーティションを作成 (fdisk コマンド)
  2. パーティションファイルシステムを作成 (mkfs コマンド)
  3. ファイルシステムマウント (mount コマンド)
  4. ファイルシステムファイルを作成

以降では、「パーティションファイルシステムマウント」についてそれぞれ解説します。

スポンサーリンク

パーティションとは

パーティションとは、ストレージを分割した領域のことです。

/dev/sdaを「未割り当て」・「/dev/sda1」・「未割り当て」・「/dev/sda2」・「/dev/sda3」の5つのパーティションに分ける例

ストレージのパーティションを分割する利点は以下の2つです。

利点
障害の局所化
(別のパーティションに影響を与えない)
OS の再インストールする場合に、アプリケーションのパーティションに影響を与えない
空き容量不足の局所化
(パーティションごとに別々に空き容量を確保)
ログファイルのパーティションが肥大化しても、OS のパーティションが上書きされない

パーティションテーブルの形式

パーティションテーブルの形式は、次の2つがあります。

MBRGPT
対応するストレージ容量2TiB8ZiB
プライマリーパーティションの数4128
拡張パーティションありなし
故障耐性なしあり
不正書き込み防止(チェックサム)なしあり
ストレージアクセス方式CHSCHS,LBA
ブートセクタMBRGPTヘッダー
ブートセクタ呼び出し元ファームウェアBIOSUEFI

MBR (Master Boot Record) 形式とは

MBR とは OS をブートするローダーと、各パーティションの開始位置が記録されたレコードです。

MBR 形式における、ストレージのパーティション構造は以下のとおりです。

MBR 形式のパーティション構造は、以下の3種類の領域が存在します。

  • MBR 領域
  • プライマーパーティション領域
  • 拡張パーティション領域

MBR 領域の詳細は以下のとおりです。

Master Boot Code の中身
テーブルエントリーの中身

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

プライマーパーティションの中身

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

拡張パーティションの中身
拡張パーティションテーブルの中身

拡張パーティション領域は、上記のように複数の論理パーティションに分けることが可能です。

GPT (GUID Partition Table) 形式とは

GPT とは MBR の置き換えを目的としたパーティションテーブルです。
パーティションを設定可能なストレージの容量が「MBR では 2TiB」ですが、 「GTP では 8ZiB」に増加しています。

GPT における、ストレージのパーティション構造は以下のとおりです。

なお、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 の公式ドキュメントに記載されています。ファイルにアクセスするという基本機能は同じですが、特定のファイルシステムにしか無い機能も存在します。

ファイルシステムの管理 Red Hat Enterprise Linux 8 | Red Hat Customer Portal
本書は、Red Hat Enterprise Linux 8 でファイルシステムを効果的に管理する方法を説明します。

ファイルシステムの構造

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

MBR
GPT

ブートブロック(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 を付与することで確認可能です。

sudo dumpe2fs -h /dev/xvdf1
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 <ファイル名>コマンドで確認可能です。

stat test.txt
  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 ファイルシステムを例に説明します。

sudo file -s /dev/xvdf1
/dev/xvdf1: data

"data" はファイルシステムが無いことを表します。

次に /dev/xvdf1 パーティションに ext4 ファイルシステムを作成します。

sudo mkfs.ext4 /dev/xvdf1
mke2fs 1.42.9 (28-Dec-2013)
(中略)                         
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

/dev/xvdf1 パーティションに ext4 ファイルシステムが作成できていることを確認します。

sudo file -s /dev/xvdf1
/dev/xvdf1: Linux rev 1.0 ext4 filesystem data

ファイルシステムのマウントとは

マウントとは、ファイルシステムを設定したパーティションにディレクトリを登録することです。このディレクトリをマウントポイントと言います。

ファイルシステムを設定したパーティションを持つブロックデバイスファイルをマウントすることで、ディレクトリを指定してストレージにアクセスできます。

手動マウント方法 mount

df -T|grep -e xvdf1 -e ファイル
ファイルシス   タイプ   1K-ブロック    使用  使用可 使用% マウント位置

/dev/xvdf1 がマウントされていないことがわかったので、マウントポイント(/test ディレクトリ)にマウントする。

sudo mkdir /test
sudo mount /dev/xvdf1 /test
df -T|grep -e xvdf1 -e ファイル
ファイルシス   タイプ   1K-ブロック    使用  使用可 使用% マウント位置
/dev/xvdf1     ext4         3997376   16376 3754904    1% /test

自動マウント方法 /etc/fstab

ファイルシステムの種類によりますが mount コマンドだけでは、再起動するとマウントの設定が消えます。

そこで、再起動後もマウントの設定を反映させるためには、/etc/fstab ファイルを利用します。

/dev/xvdf1(UUID=1234abcd-1234-as12-234s-123456789abc)パーティションを /test マウントポイントにマウントする設定は以下のとおりです。

sudo blkid /dev/xvdf1
/dev/xvdf1: UUID="1234abcd-1234-as12-234s-123456789abc" TYPE="ext4" PARTUUID="1234abcd-11"
sudo vim /etc/fstab
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 カーネルの機能について知りたい場合は以下の記事をどうぞ。

参考書籍

以下の書籍を参考にしました。

参考サイト

OS Exams Questions with Answers - Tutorialspoint
OS Exams Questions with Answers - These selected questions and answers are prepared from Operating Systems Exam point of view and will also help in quick revisi...