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

ストレージとはストレージとは、電源を切ってもデータが残るデバイス (SSD, HDD 等) です。
実際にデータを CPU で処理する場合、メモリにロードします
ファイルとはファイルとは、「名前」で「ストレージのデータ/プロセスなど」にアクセスする機能です
各アドレスにどんなデータが入っているのか覚える必要がある
どんなデータが入っているかはファイル名を見ればいい

なお、本記事は Linux カーネル第4回「ストレージ管理、ファイル」に関する記事です。

スポンサーリンク

ファイルの基本

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

Linux では、ディレクトリやデバイス (ストレージ/マウス等) もファイルとして扱います。

ファイルの種類は以下のとおりです。

シンボルファイルの種類説明用途
-レギュラーファイルデータを読み書き可能な普通のファイルいわゆるファイル
dディレクトリファイルのリストを持つファイルディレクトリ
lシンボリックリンクこのファイルへの読み書きは、参照先のファイルに反映別名ファイル、ショートカット
cキャラクタデバイスこのファイルへの読み書きは、対応するデバイスと1バイト単位でデータをやりとり(つまりストリーム処理)マウスやキーボード等への読み書き
bブロックデバイスこのファイルへの読み書きは、対応するデバイスとブロック単位でデータをやりとり(つまりバッファにバイトを貯める)SSD 等への読み書き
p名前付きパイプ
(FIFOスペシャル)
このファイルへ書き込まれたデータは同じ OS の他のプロセスで読み出すことが可能プロセス間通信
sソケットこのファイルは別の OS のプロセスから読み書き可能別のOSのプロセスと通信
キャラクタデバイスとブロックデバイスは、デバイスを接続した際に udev によって自動でデバイスファイルが作成されます。

ファイルの種類の確認には 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

Test.java はレギュラーファイル、test はディレクトリであることがわかります。

ファイルを作成する手順

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

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

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

スポンサーリンク

パーティションとは

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

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

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

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

パーティションテーブルとは

パーティションテーブルとは、パーティションの数や位置を管理するテーブルです。

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

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

近年では、ストレージ容量が 2TiB を超えるものが出てきたため、MBR を置き換える目的で GPT が導入されました。

MBR (Master Boot Record) 形式とは

MBR 形式とは、MBR を使ってパーティションテーブルを管理する形式です。
MBR (Master Boot Record) とはMBR とは、コンピュータの電源を入れた時に最初に読み込まれるレコードです。
主に「OS のブートローダー」と「各パーティションの開始位置が」含まれます。

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

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

  • MBR 領域
  • プライマーパーティション領域
  • 拡張パーティション領域
Master Boot Code の内容
Master Boot Code の中身
テーブルエントリーの内容
テーブルエントリーの中身

パーティションの内容

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

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

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

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

拡張パーティション領域は、上記のように複数の論理パーティションに分けられます。

GPT (GUID Partition Table) 形式とは

GPT 形式とは、GPT を使ってパーティションテーブルを管理する形式です。

GPT 形式における、ストレージの構造は以下のとおりです。

  • MBR 形式と互換性を保つために、先頭に MBR が存在
  • 冗長化のために、GPT ヘッダーとエントリが2箇所に存在
GPT ヘッダーの内容
GPTヘッダの内容
エントリーの内容
エントリーの内容

パーティションテーブルの作成方法 gdisk

ストレージにパーティションテーブルを作成するには、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分の領域を確保します。

以下に gdisk を利用した方法を紹介します。

lsblk
NAME      MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
xvda      202:0    0   8G  0 disk 
├─xvda1   202:1    0   8G  0 part /
├─xvda127 259:0    0   1M  0 part 
└─xvda128 259:1    0  10M  0 part 
xvdb      202:16   0   8G  0 disk
ls /dev/xvd*
/dev/xvda  /dev/xvda1  /dev/xvda127  /dev/xvda128  /dev/xvdb
sudo gdisk /dev/xvdb
Command (? for help): n
Partition number (1-128, default 1): 1
First sector (34-16777182, default = 2048) or {+-}size{KMGTP}: 1M

First セクターが 34 から指定可能な理由は、GPT では 33 までがパーティションエントリのため

Last sector (2048-16777182, default = 16777182) or {+-}size{KMGTP}: 4G
Hex code or GUID (L to show codes, Enter = 8300): 8300

パーティションタイプの一覧はこちら

パーティションタイプマウントポイントgdisk の
コード
パーティションタイプ GUID
Linux ファイルシステム任意83000FC63DAF-8483-4772-8E79-3D69D8477DE4
EFI システムパーティション任意1ef00C12A7328-F81F-11D2-BA4B-00A0C93EC93B
BIOS ブートパーティションなしef0221686148-6449-6E6F-744E-656564454649
Linux x86-64 root (/)/83044F68BCE3-E8CD-4DB1-96E7-FBCAF984B709
Linux swap[SWAP]82000657FD6D-A4AB-43C4-84E5-0933C84B4F4F
Linux /home/home8302933AC7E1-2EB4-4F13-B844-0E14E2AEF915
Linux /srv/srv83063B8F8425-20E0-4F3B-907F-1A25A76F98E8
Linux /var/var183104D21B016-B534-45C2-A9FB-5C16E091FD2D
Linux /var/tmp/var/tmp183117EC6F557-3BC5-4ACA-B293-16EF5DF639D1
Linux LVM任意8e00E6D6D379-F507-44C2-A23C-238F2A3DF928
Linux RAID任意fd00A19D880F-05FC-4D3B-A006-743F0F84911E
Linux LUKS任意8309CA7D7CCB-63ED-4C53-861C-1742536059CC
Linux dm-crypt任意83087FFEC5C9-2D00-49B7-8941-3EA10A5586B7
https://wiki.archlinux.jp/index.php/GPT_fdisk#.E3.83.91.E3.83.BC.E3.83.86.E3.82.A3.E3.82.B7.E3.83.A7.E3.83.B3.E3.82.BF.E3.82.A4.E3.83.97
Command (? for help): p
Disk /dev/xvdb: 16777216 sectors, 8.0 GiB
Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048         8388608   4.0 GiB     8300  Linux filesystem
Command (? for help): w
Do you want to proceed? (Y/N): y
lsblk
NAME      MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
xvda      202:0    0   8G  0 disk 
├─xvda1   202:1    0   8G  0 part /
├─xvda127 259:0    0   1M  0 part 
└─xvda128 259:1    0  10M  0 part 
xvdb      202:16   0   8G  0 disk 
└─xvdb1   202:17   0   4G  0 part
スポンサーリンク

ファイルシステムとは

ファイルシステムとはファイルシステムとは、ストレージ等を「ファイル」単位で管理するカーネルの機能です。
これにより、ファイルを経由してストレージ上のデータへアクセスできるようになります。

なお、ファイルシステムはパーティションごとに設定します。

ファイルシステムの詳細な機能は、以下の記事で紹介します。

ファイルシステムの一覧

Linux の主なファイルシステムは、以下のとおりです。

ファイルにアクセスする基本的な機能は同じですが、特定のファイルシステムにしか無い機能も存在します。

ファイルシステムの種類説明
ext4RHEL6/CentOS6 のデフォルト。安定してる
XFSRHEL7,8/CentOS7,8 のデフォルト。断片化に対する影響がない
NFS同じネットワーク間でファイル共有に使用
SMBWindows とのファイル共有に使用
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html-single/managing_file_systems/index#types-of-file-systems_overview-of-available-file-systems

ファイルシステムの作成・確認コマンド

今回は /dev/xvdb1 パーティションに、xfs ファイルシステムを作成してみます。

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

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

sudo mkfs -t xfs /dev/xvdb1
sudo file -s /dev/xvdb1
/dev/xvdb1: SGI XFS filesystem data (blksz 4096, inosz 512, v2 dirs)

ファイルシステムの構造

ファイルシステムは、主に以下の4種類のブロックから構成されます。

ブロック格納するデータ
ブートブロック
(ブートセクタ)
OSをブートするためのデータ (XFS には存在しない)
スーパーブロックパーティションを管理するメタデータ (ファイルシステムの種類/inodeの数等)
Inodeファイルやディレクトリを管理するメタデータ (ファイルタイプ・サイズ等)
データブロックファイルの内容
https://web.stanford.edu/class/archive/cs/cs111/cs111.1234/lectures/2/Lecture2.pdf#page=37

XFSはファイルシステムの先頭ブロックをスーパーブロックとして使っておりブートローダーを先頭ブロックにインストールすることはできない

https://ja.wikipedia.org/wiki/XFS

スーパーブロックの内容を確認

ファイルシステム xfs のスーパーブロックの一部は以下で確認できます。
(全ての内容を確認する場合は、xfs_db を使用。参考1参考2参考3)

sudo xfs_info /dev/xvdb1
meta-data=/dev/xvdb1             isize=512    agcount=4, agsize=524223 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1    bigtime=1 inobtcount=1

ファイルシステムが ext4 の場合のスーパーブロックの確認方法

sudo dumpe2fs -h /dev/xvdb1
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
(中略)

Inode の内容を確認

ファイルの Inode の内容を確認します。

echo aa > test.txt
stat test.txt
  File: `test.txt'
  Size: 3         	Blocks: 8          IO Block: 4096   通常ファイル
Device: ****h/*****d	Inode: 4006    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) を示すタイムスタンプ群

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

マウントとはマウントとは、ファイルシステムをディレクトリに紐付けることです。

これにより、ファイルシステムを経由して、ディレクトリ名でストレージにアクセスできるようになります。

なお、紐付けたディレクトリをマウントポイントと言います。

手動マウント方法 mount

sudo mount /dev/xvdb1 /mnt
lsblk
NAME      MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
xvda      202:0    0   8G  0 disk 
├─xvda1   202:1    0   8G  0 part /
├─xvda127 259:0    0   1M  0 part 
└─xvda128 259:1    0  10M  0 part 
xvdb      202:16   0   8G  0 disk 
└─xvdb1   202:17   0   4G  0 part /mnt

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

mount コマンドだけでは、再起動するとマウントの設定が消えます。

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

/dev/xvdb1パーティションを /mnt にマウントする方法は以下のとおりです。

sudo blkid /dev/xvdb1
/dev/xvdb1: UUID="1234abcd-1234-as12-234s-123456789abc"  BLOCK_SIZE="512" TYPE="xfs"
sudo vim /etc/fstab
UUID=1234abcd-1234-as12-234s-123456789abc       /test   xfs    defaults        1       1

UUID の値は、先ほど調べた値に置き換えます。

なお、/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 カーネル入門記事の続きは、以下をご覧ください。


参考サイト

OS Exams Questions with Answers
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...