「ファイルシステムのマウント」とは何なのか

# はじめに
今までマウントは「ハードディスクのようなストレージデバイスをシステムが利用できるようにすること」といった理解だったので、「ファイルシステムのマウント」と言われて「ファイルシステムってソフトウェアじゃないの？それをマウントってどう言うこと？」ってなりました。手持ちのラズパイで実験しつつ、調べてわかったことを書いて見ます。

# 環境
- raspberry pi3 model B
- Raspbian GNU/Linux 8.0 (jessie)

# 先に結論 「ファイルシステムのマウント」とは
新たにストレージデバイスを増設する際には以下のような操作をします。
1.　ストレージデバイスをシステムに接続します。
2.　ストレージデバイスに対してパーティションを作成します。
3.　各パーティションにファイルシステムを作成します。
4.　作成したパーティションをマウントします。

この一連の流れのうち、4を「ファイルシステムのマウント」と言います。ファイルシステムのマウントというのはつまり、「ファイルシステムが存在しているパーティションをマウントする」ということみたいです。

# 軽く前提知識
### ファイルシステム
実態はバイナリシーケンスであるデータを、ファイルという一塊のオブジェクトとしてユーザーに提供するシステムのこと。たくさんの種類があり、それぞれ内部構造やアルゴリズムが異なる。
### パーティション
ストレージデバイス内の区切られた領域のこと。パーティションに分割することでシステム領域とデータ領域を分離するなどといった管理上の利点がある。
### マウント
OSがファイルシステムを介してストレージデバイス上のファイルやディレクトリを利用できるようにすること。
# 実際にファイルシステムをマウントする
### 1）ハードディスクを接続
今回はUSBメモリを使用します。実験をやる際は万が一データを吹っ飛ばしても大丈夫なデバイスを接続しましょう。

```
 # fdisk -l 
(略）...

Device     Boot Start     End Sectors  Size Id Type
/dev/sda1          24 7913471 7913448  3.8G  c W95 FAT32 (LBA)
```

`fdisk`で接続したストレージデバイスを確認します。ラズパイではUSBメモリはsdaというデバイスファイル名で認識されるようです。

### 2）ストレージデバイスにパーティションを作成する
fdiskで対話モードに入り、pを選択してパーティションテーブルを表示して見ます。

```
# fdisk /dev/sda

Welcome to 
...

Command (m for help):p

Disk /dev/sda: 3.8 GiB, 4051697664 bytes, 7913472 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xc3072e18

Device     Boot Start     End Sectors  Size Id Type
/dev/sda1          24 7913471 7913448  3.8G  c W95 FAT32 (LBA)
```

sda1というパーティションがすでに作成されているのがわかります。SizeがUSBメモリの容量と同じなので、このままでは新しくパーティションを作成できません。（No free sectors available.と怒られる。）実験のために一度sda1を削除します。dコマンドで削除、wで変更をパーティションテーブルに書き込みます。

```
Command (m for help): d
Selected partition 1
Partition 1 has been deleted.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
```

パーティションが削除されたか確認します。

```
# fdisk /dev/sda

Welcome to fdisk (util-linux 2.25.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): p
Disk /dev/sda: 3.8 GiB, 4051697664 bytes, 7913472 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xc3072e18
```

OKですね。sda1が表示されなくなりました。それではパーティションを作成します。

```
Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1):
First sector (2048-7913471, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-7913471, default 7913471): +1G

Created a new partition 1 of type 'Linux' and of size 1 GiB.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
```

基本パーティションを作成します。パーティション番号と開始セクタはデフォルト、サイズは1GBとしました。作成できたらwコマンドで変更を書き込み、リブートします。
リブートしたら、パーティションが作成できているか確認します。

```
# fdisk -l /dev/sda
Disk /dev/sda: 3.8 GiB, 4051697664 bytes, 7913472 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xc3072e18

Device     Boot Start     End Sectors Size Id Type
/dev/sda1        2048 2099199 2097152   1G 83 Linux
```

/dev/sda1ができてますね。

### 3)　パーティションにファイルシステムを作成する
linuxで標準的に使われているファイルシステムであるext4を、先ほど作った/dev/sda1上に作成します。

```
# mkfs -t ext4 /dev/sda1
mke2fs 1.43.3 (04-Sep-2016)
Creating filesystem with 262144 4k blocks and 65536 inodes
Filesystem UUID: ace81421-7083-4924-8bf8-1ddd51dffab1
Superblock backups stored on blocks:
	32768, 98304, 163840, 229376

Allocating group tables: done
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
```

### 4) パーティションをマウントする
さて、パーティションにファイルシステムを作成したので、それを/mediaにマウントしましょう。

```
# mount /dev/sda1 /media
```

これで、/mediaからUSBメモリを操作できるようになりました。再起動してもマウントされた状態にするには/etc/fstabに以下のように書き込みます。

```
/dev/sda1       /media          ext4    defaults          0       0
```
左から、パーティション名、マウントポイント、ファイルシステム、マウントオプション、dumpによりバックアップ対象にするか否か（0で無効）、ブート時にfsckでチェックする優先度（0でチェックしない）を表しています。
これでリブートした際は自動的に/dev/sda1が/mediaにマウントされた状態になっています。


マウントしたUSBメモリを刺さないままラズパイを起動すると、デフォルトで1分半ほどログイン前にデバイスの接続待ちが生じます。その間はSSHログインができなくなるので気をつけましょう。

## 参考
http://www.infraeye.com/study/linuxz21.html