ファイルシステムマウントの基礎：初心者向け完全ガイド

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

## マウントとアンマウント

- **マウント**：追加のファイルシステムをルートファイルシステムの既存のディレクトリに関連付け、そのディレクトリを他のファイルへのアクセスポイントとする操作
- **アンマウント**：この関連付けを解除するプロセス
- デバイスをマウントポイントに関連付ける：マウントポイント
- マウント完了後、マウントポイント下の元のファイルは一時的に隠される。そのため、マウントポイントのディレクトリは通常空である
- 使用中のデバイスはアンマウントできない

## 1. ファイルシステムのマウント（mount）

### フォーマット：

```shell
mount [-lhV]
mount -a [options]
mount [options] [--source] <source> | [--target] <directory>
mount [options] <source> <directory>
mount <operation> <mountpoint> [<target>]
```

### デバイス：マウントするデバイスを指定

- デバイスファイル：例：`/dev/sda5`
- ボリュームラベル：`-L 'LABEL'`、例：`-L 'MYDATA'`
- UUID：`-U 'UUID'`、例：`-U '0c50523c-43f1-45e7-85c0-a126711d406e'`
- 疑似ファイルシステム名：proc, sysfs, devtmpfs, configfs

### マウントポイント

- マウントポイントディレクトリは事前に存在する必要がある
- 空のディレクトリを使用することを推奨

### マウントルール

1. 一つのマウントポイントには一度に一つのデバイスしかマウントできない
2. 一つのマウントポイントに複数のデバイスをマウントした場合、最後にマウントしたデバイスのデータのみが見える。他のデバイス上のデータは隠される
3. 一つのデバイスを同時に複数のマウントポイントにマウントすることができる
4. 通常、マウントポイントは既存の空のディレクトリである

ご提供いただいた内容を日本語に翻訳し、Markdown形式で整理しました：

### mountコマンドの一般的なオプション

```shell
-a|--all                            # /etc/fstabに定義され、autoオプションを持つすべてのデバイスを自動マウント
-B|--bind                           # ディレクトリを別のディレクトリにバインド
-c|--no-canonicalize                # パスを正規化しない
-f|--fake                           # ドライラン；mount(2)システムコールをスキップ
-F|--fork                           # 各デバイスに対してforkを無効化（-aオプションと併用）
-T|--fstab path                     # 使用するファイルを指定、デフォルトは/etc/fstab
-i|--internal-only                  # mount.<type>ヘルパープログラムを呼び出さない
-l|--show-labels                    # ファイルシステムのラベルを表示
-n|--no-mtab                        # /etc/mtabを更新せず、mountを不可視にする
-o|--options o1,o2                  # マウントオプションのリスト（カンマ区切り）
-O|--test-opts o1,o2                # ファイルシステムセットを制限（-aオプションと併用）
-r|--read-only                      # ファイルシステムを読み取り専用でマウント（-o roと同じ）
-t|--types                          # マウントするデバイス上のファイルシステムタイプを指定（例：ext4、xfs）
--source device                     # ソースを指定（パス、ラベル、UUID）
--target mountpoint                 # マウントポイントを指定
-v|--verbose                        # 詳細なプロセスを表示
-w|--rw|--read-write                # ファイルシステムを読み書き可能でマウント（デフォルト）
-L LABEL                            # ボリュームラベルでマウントするデバイスを指定
-U UUID                             # UUIDでマウントするデバイスを指定

#-oオプションの値
async                               # 非同期モード：メモリ変更時にバッファに書き込み、一定時間後にディスクに書き込む。効率的だが安全性は低い
sync                                # 同期モード：メモリ変更時に同時にディスクに書き込む。安全だが効率は低い
atime/noatime                       # ディレクトリとファイルを含む
diratime/nodiratime                 # ディレクトリのアクセス時間スタンプ
auto/noauto                         # 起動時の自動マウントをサポートするか、-aオプションをサポートするか
exec/noexec                         # ファイルシステム上でアプリケーションの実行をサポートするか
dev/nodev                           # このファイルシステム上でデバイスファイルの使用をサポートするか
suid/nosuid                         # suidとsgid権限をサポートするか
remount                             # 再マウント
ro/rw                               # 読み取り専用/読み書き可能
user/nouser                         # 一般ユーザーがこのデバイスをマウントできるか（/etc/fstabで使用）
acl/noacl                           # このファイルシステム上でACL機能を有効にするか
loop                                # loopデバイスを使用
_netdev                             # ネットワークが利用可能な時のみネットワークリソースをマウント（例：NFSファイルシステム）
defaults                            # rw, suid, dev, exec, auto, nouser, asyncと同等

#–sourceオプションの値
-L|--label label                    # LABEL=labelと同じ
-U|--uuid uuid                      # UUID=uuidと同じ
LABEL=label                         # ラベル値でデバイスを指定
UUID=uuid                           # UUID値でデバイスを指定
PARTLABEL=label                     # PARTLABEL値でデバイスを指定
PARTUUID=uuid                       # PARTUUID値でデバイスを指定
device                              # パスでデバイスを指定
directory                           # バインドマウントのマウントポイント（--bind/rbindを参照）
file                                # ループデバイスを設定するための通常ファイル
```

### マウントの例

```shell
[root@rocky86 ~]# lsblk /dev/sdc -f
NAME   FSTYPE LABEL UUID                                 MOUNTPOINT
sdc                                                      
├─sdc1 ext4         a7751b8e-da27-447e-9466-79127e0850af 
└─sdc2 xfs          205ecdf1-1f0e-495d-a1ab-2f74b6ab98a0 

[root@rocky86 ~]# mkdir /sdc{1,2}

[root@rocky86 ~]# mount /dev/sdc1 /sdc1

# 読み取り専用でマウント
[root@rocky86 ~]# mount --source /dev/sdc2 -o ro /sdc2

[root@rocky86 ~]# lsblk /dev/sdc -f
NAME   FSTYPE LABEL UUID                                 MOUNTPOINT
sdc                                                      
├─sdc1 ext4         a7751b8e-da27-447e-9466-79127e0850af /sdc1
└─sdc2 xfs          205ecdf1-1f0e-495d-a1ab-2f74b6ab98a0 /sdc2

# 書き込みテスト
[root@rocky86 ~]# cp /etc/fstab /sdc1/
[root@rocky86 ~]# cp /etc/fstab /sdc2/
cp: cannot create regular file '/sdc2/fstab': Read-only file system
```

この例では以下の操作を行っています：

1. `/dev/sdc`デバイスの情報を表示
2. マウントポイント `/sdc1` と `/sdc2` を作成
3. `/dev/sdc1` を `/sdc1` にマウント
4. `/dev/sdc2` を読み取り専用で `/sdc2` にマウント
5. マウント後のデバイス情報を確認
6. 書き込みテストを実行
   - `/sdc1` への書き込みは成功（読み書き可能でマウントされているため）
   - `/sdc2` への書き込みは失敗（読み取り専用でマウントされているため）

この例から、マウントオプションによってファイルシステムの動作が異なる


## 2. ファイルシステムのアンマウント（umount）

アンマウント時：デバイスまたはマウントポイントを使用可能

### フォーマット
```
umount [-hV]
umount -a [options]
umount [options] <source> | <directory>
```

### 例：

```shell
[root@rocky86 ~]# lsblk /dev/sdc -f
NAME   FSTYPE LABEL UUID                                 MOUNTPOINT
sdc                                                      
├─sdc1 ext4         a7751b8e-da27-447e-9466-79127e0850af /sdc1
└─sdc2 xfs          205ecdf1-1f0e-495d-a1ab-2f74b6ab98a0 /sdc2

# デバイスでアンマウント
[root@rocky86 ~]# umount /dev/sdc1

# マウントポイントでアンマウント
[root@rocky86 ~]# umount /sdc2

# マウント状況を再確認
[root@rocky86 ~]# lsblk /dev/sdc -f
NAME   FSTYPE LABEL UUID                                 MOUNTPOINT
sdc                                                      
├─sdc1 ext4         a7751b8e-da27-447e-9466-79127e0850af 
└─sdc2 xfs          205ecdf1-1f0e-495d-a1ab-2f74b6ab98a0
```

この例では、以下の操作を行っています：

1. 最初に、`/dev/sdc`デバイスのマウント状況を確認します
2. `/dev/sdc1`をデバイス名を指定してアンマウントします
3. `/sdc2`をマウントポイントを指定してアンマウントします
4. 最後に、再度マウント状況を確認し、両方のパーティションがアンマウントされたことを確認します

この例から、`umount`コマンドを使用して、デバイス名またはマウントポイントのいずれかを指定してファイルシステムをアンマウントできることがわかります。アンマウント後は、MOUNTPOINTの列が空になります。



## 3. マウント状況の確認

### マウントの確認方法

```shell
mount                    # mountコマンドによる確認
cat /etc/mtab            # /etc/mtabファイルで現在マウントされているすべてのデバイスを表示
cat /proc/mounts         # カーネルが追跡しているマウントされたすべてのデバイスを確認
```

### 例：

```shell
[root@rocky86 ~]# mount
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
devtmpfs on /dev type devtmpfs (rw,nosuid,size=883748k,nr_inodes=220937,mode=755)
......

[root@rocky86 ~]# cat /etc/mtab
sysfs /sys sysfs rw,nosuid,nodev,noexec,relatime 0 0
proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0
devtmpfs /dev devtmpfs rw,nosuid,size=883748k,nr_inodes=220937,mode=755 0 0
......

[root@rocky86 ~]# cat /proc/mounts 
sysfs /sys sysfs rw,nosuid,nodev,noexec,relatime 0 0
proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0
devtmpfs /dev devtmpfs rw,nosuid,size=883748k,nr_inodes=220937,mode=755 0 0
......
```

### マウントポイントの状況確認

```shell
findmnt [options]
findmnt [options] <device> | <mountpoint>
findmnt [options] <device> <mountpoint>
findmnt [options] [--source <device>] [--target <path> | --mountpoint <dir>]
```

この内容は、Linux システムでマウント状況を確認するための複数の方法を示しています：

1. `mount` コマンドを使用
2. `/etc/mtab` ファイルの内容を表示
3. `/proc/mounts` ファイルの内容を表示

また、`findmnt` コマンドを使用してマウントポイントの詳細情報を確認することもできます。これらの方法は、システム上のマウントされたファイルシステムに関する情報を提供し、それぞれ少し異なる形式や詳細レベルで情報を表示します。

### 例：

```shell
# デフォルトで全システムのマウントツリーを表示
[root@rocky86 ~]# findmnt
......

# 指定したデバイスまたはマウントポイントを表示
[root@rocky86 ~]# findmnt /dev/sdc1
TARGET SOURCE    FSTYPE OPTIONS
/sdc1  /dev/sdc1 ext4   rw,relatime
```

#### 指定したファイルシステムにアクセスしているプロセスの確認

```shell
lsof MOUNT_POINT
fuser -v MOUNT_POINT
```

#### 指定したファイルシステムにアクセスしているすべてのプロセスを終了

```shell
fuser -km MOUNT_POINT
```

この内容は以下のことを説明しています：

1. `findmnt` コマンドの使用方法：
   - 引数なしで実行すると、システム全体のマウントツリーを表示します。
   - デバイスまたはマウントポイントを指定すると、その特定の情報を表示します。

2. 特定のマウントポイントにアクセスしているプロセスを確認する方法：
   - `lsof` コマンドを使用
   - `fuser -v` コマンドを使用

3. 特定のマウントポイントにアクセスしているすべてのプロセスを強制終了する方法：
   - `fuser -km` コマンドを使用

## 4. 永続的なマウント

次回のブート時に自動的にマウントを有効にするため、マウント情報を `/etc/fstab` に保存します。

### `/etc/fstab` のフォーマットヘルプ
```
man 5 fstab
```

各行は1つのマウントするファイルシステムを定義し、6つの項目を含みます：

1. マウントするデバイスまたは擬似ファイルシステムデバイスファイル（LABEL=label | UUID=uuid | /dev/sda1）
2. マウントポイント：事前に存在するディレクトリである必要があります
3. ファイルシステムタイプ：ext4、xfs、iso9660、nfs、noneなど
4. マウントオプション：defaults、acl、bind、ro、rwなど
5. ダンプ頻度：0 = バックアップなし、1 = 毎日ダンプ、2 = 1日おきにダンプ
6. fsckチェックの順序：0 = チェックなし、1 = 最初にチェック（通常rootfsのみ）、2 = rootfs以外で使用

### 例：
```
[root@rocky86 ~]# cat /etc/fstab 
#
# /etc/fstab
# Created by anaconda on Sun Jul  3 12:05:30 2022
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/rl-root     /                       xfs     defaults        0 0
UUID=94a73757-555a-4d2b-8153-f54277c4c50d /boot xfs     defaults        0 0
/dev/mapper/rl-home     /home                   xfs     defaults        0 0
/dev/mapper/rl-swap     none                    swap    defaults        0 0
```

### 新しいマウントエントリの追加
新しい行の追加または削除後、有効にするには、以下のコマンドを実行します：
```
mount -a
```
注：このコマンドは新しい行の追加または削除にのみ有効です。マウントオプションを中間で変更した場合は無効です。

### ファイル変更前後の比較
```
[root@rocky86 ~]# df; mount -a; df
```

### 注意点
`/etc/fstab` 内のパーティションUUIDが間違っている場合、システムに入れなくなる可能性があります。

解決策：
- CentOS 7、CentOS 8は自動的にemergencyモードに入ります。rootパスワードを入力後、`/etc/fstab`を修正し、再起動します
- CentOS 6では、正しい値に修正するか、`/etc/fstab`ファイル内の誤った行の最後の項目を0に設定して（チェックしない）対応できます


## 5. 再マウント

`/etc/fstab` ファイル内のマウントルールを修正した後、`mount -a` で変更を反映できない場合は、以下のコマンドを実行して再マウントする必要があります：

```
mount -o remount MOUNTPOINT
```

この操作について詳しく説明します：

1. **目的**：
   - `/etc/fstab` ファイルのマウント設定を変更した後、システムを再起動せずに変更を適用するためです

2. **使用場面**：
   - マウントオプションを変更した場合（例：読み取り専用から読み書き可能に変更）
   - ファイルシステムの属性を変更した場合
   - その他のマウント関連の設定を変更した場合

3. **コマンドの詳細**：
   - `mount`: マウント操作を行うコマンド
   - `-o remount`: 再マウントのオプション
   - `MOUNTPOINT`: 再マウントするマウントポイント（ディレクトリパス）

4. **注意点**：
   - このコマンドは、既にマウントされているファイルシステムに対してのみ機能します
   - 新しいマウントポイントの追加には使用できません

5. **例**：
   ```
   mount -o remount,rw /
   ```
   この例では、ルートファイルシステム（/）を読み書き可能モードで再マウントしています。

6. **利点**：
   - システムを再起動することなく、マウント設定の変更を即時に適用できます
   - 稼働中のシステムのダウンタイムを最小限に抑えられます

このコマンドは、システム管理者がファイルシステムの設定を動的に変更する必要がある場合に非常に有用です。ただし、重要なシステムファイルに影響を与える可能性があるため、慎重に使用する必要があります。