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

ストレージとはストレージとは、電源を切ってもデータが残るデバイス (SSD, HDD 等) です。
実際にデータを CPU で処理する場合、メモリにロードします
ファイルとはファイルとは、「名前」で「ストレージのデータ/プロセスなど」にアクセスする機能です
Linux カーネルの機能
スポンサーリンク

ファイルの基本

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

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 ファイルシステムにはブートブロックが存在しません。

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

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

一般に、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

スーパーブロック

スーパーブロックとは、パーティションを管理するメタデータ (ファイルシステムの種類/inodeの数等) を格納するブロックです

スーパーブロックの確認方法は、ファイルシステムが 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 とは、ファイルやディレクトリを管理するメタデータ (ファイルタイプ・サイズ等) を格納するブロックです

POSIX 標準で規定されている inode のメタデータの一覧は、以下の通りです。

  • ファイルサイズ
  • ファイルタイプ
  • inode 番号(ファイルシステム内でユニークな ID 。ファイルを識別)
  • 当該 inode を指すハードリンクの数
  • デバイス ID(ファイルを格納しているデバイスを識別)
  • ファイルパーミッション
  • ファイル所有者のユーザー ID
  • ファイルのグループ ID
  • 最終 inode 更新時(ctime)、最終ファイル更新時(mtime)、最終参照時(atime) を示すタイムスタンプ群

ファイルの 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: -

データブロック

データブロックとは、ファイルの内容を格納するブロックです。
cat test.txt
aa

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

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

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

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

手動マウント方法 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 カーネルの機能

参考サイト

OS Exams Questions with Answers
OS Exams Questions with Answers - This tutorial covers concepts like overview of Operating System, Types, Services, Properties, Process Scheduling, CPU Scheduli...