【AWS】EBSのマウント手順（EC2にアタッチしただけでは使えません）

# はじめに
EBSはEC2にアタッチするだけでは使用できません。
アタッチしただけではOS側から"ただのディスク"としか見られていないため、
使用するにはEBSを`フォーマット`した上で`マウント`する必要があります。

ここではマウントまでの手順を解説します。

※AWS, Linuxの初学者を対象にしています。

>【フォーマット】
記憶装置の内部を小さな区画に分割し、管理用のデータ保管領域などを確保することにより、特定の箇所へのデータの読み書きができるよう準備する操作
[IT用語事典 e-words](https://e-words.jp/w/%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88.html "フォーマットとは")


>【マウント】
周辺機器をOSなどのソフトウェアに認識させ、操作・利用可能な状態にすること
[IT用語事典 e-words](https://e-words.jp/w/%E3%83%9E%E3%82%A6%E3%83%B3%E3%83%88.html "マウントとは")

# 環境

- パソコン：Mac
- AMI：Amazon Linux 2

# 前提

- EC2インスタンスを作成していること。
- EBSを作成しEC2にアタッチしていること。
- ターミナルからEC2にSSH接続済みであること。

# 手順

## ①EC2のコンソールからアタッチしたEBSのデバイス名を確認
![スクリーンショット 2021-01-26 7.44.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631600/1044931f-95fe-7709-8523-2e75acb85b51.png)
ここですね。`/dev/sdf` となっていることを確認できます。

## ②root権限に切り替える
ここから先はroot権限が必要な操作ばかりなので切り替えます。

```
[ec2-user@ip-123-45-67-89 ~]$ sudo su -
```

または

```
[ec2-user@ip-123-45-67-89 ~]$ sudo -i
```

▪️参考：[sudo -i と sudo su- のどちらを使うべきか？](https://win2012r2.com/2020/05/04/%E3%80%8Csudo-i%E3%80%8D-%E3%81%A8-%E3%80%8Csudo-su-%E3%80%8D%E3%81%AE%E3%81%A9%E3%81%A1%E3%82%89%E3%82%92%E4%BD%BF%E3%81%86%E3%81%B9%E3%81%8D%E3%81%8B%EF%BC%9F/ "sudo -i と sudo su- のどちらを使うべきか？")
▪️参考：[AWS公式ドキュメント（公式では権限を切り替えずに以降の手順をすべて sudo で実行しています）](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ebs-using-volumes.html "Linux で Amazon EBS ボリュームを使用できるようにする")

## ③デバイス上にファイルシステムを作成する
<details><summary>ファイルシステムとは？</summary>
`NTFS`や`FAT32`など聞いたことありませんか？
`「Windowsで使ってた外付けHDDをMacに接続しても認識しない！」`等の経験ありませんか？
今回はその話です。
ファイルシステムとは**記憶装置に保存されたデータを管理し操作するために必要な機能**です。
ファイルシステムがないとEBSも外付けHDDもただの箱です。
ファイルシステムは様々な種類がありますがLinuxでは主に`XFS`や`ext4`が使われているようです。
▪️参考：[ファイルシステムとは？](https://hnavi.co.jp/knowledge/blog/filesystem/ "ファイルシステムとは？今さら聞けない基礎知識とOSごとの種類")
</details>

まず現在のデバイスのファイルシステムを`file`コマンドを使って確認します。
対象が今回のようなデバイスファイルの場合は`-s`オプションを付ける必要があるようです。
▪️参考：[wikipedia: file (UNIX)](https://ja.wikipedia.org/wiki/File_(UNIX) "file (UNIX)")

```
[root@ip-123-45-67-89 ~]$ file -s /dev/sdf
/dev/sdf: symbolic link to `xvdf'
```
よくわからないですが`/dev/sdf`は`xvdf`へのシンボリックリンクですよーと出てきます。
（シンボリックリンクとはショートカットのようなものです）

本体が`xvdf`であるならばなぜ`sdf`というショートカットを挟まなければいけないのか、
このあたりの理由は調べてもわかりませんでした。「こういうものだ」と処理します。
▪️参考：[EC2：EBSデバイスIDの混乱（/ dev / sdfと/ dev / xvdf）](https://intellipaat.com/community/5322/ec2-ebs-device-id-confusion-dev-sdf-vs-dev-xvdf "EC2: EBS device id confusion")

実際に`lsblk`コマンド（ブロックデバイスを一覧表示するコマンド）を実行してみても
接続されているデバイスは`xvdf`であることが確認できます。

```
[root@ip-123-45-67-89 ~]# 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  500G  0 disk
```

気を取り直して、改めて現在のファイルシステムを確認します。

```
[root@ip-123-45-67-89 ~]# file -s /dev/xvdf
/dev/xvdf: data
```

`data`とだけ表示される場合、ファイルシステムが作られていないことを意味します。

では`mkfs`コマンド（ファイルシステムを作成するコマンド）でファイルシステムを作成します。
今回は`ext4`にしたいと思いますので`-t`オプションで指定します。
▪️参考：[【 mkfs 】コマンド――HDDなどをフォーマットする](https://www.atmarkit.co.jp/ait/articles/1803/09/news034.html "【 mkfs 】コマンド――HDDなどをフォーマットする")

```
[root@ip-123-45-67-89 ~]# mkfs -t ext4 /dev/xvdf
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
32768000 inodes, 131072000 blocks
6553600 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2279604224
4000 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
	4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
	102400000

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

長々と出てきましたが、これでファイルシステムの作成は完了です。
`file`コマンドでファイルシステムを確認してみます。

```
[root@ip-123-45-67-89 ~]# file -s /dev/xvdf
/dev/xvdf: Linux rev 1.0 ext4 filesystem data, UUID=2c3d4ee5-d35f-4344-993f-9fe4303899d5 (extents) (64bit) (large files) (huge files)
```

`ext4 filesystem data`と表示されており、
無事`ext4`でファイルシステムの作成ができたことを確認できます。

ちなみにここで表示されている`UUID`は後ほど使いますのでどこかに控えておいてください。

## ④マウントするディレクトリを作成する

まず`マウント`の概念を理解する必要があります。
この2つの記事を読めば大まかには理解できるはずです。
▪️参考：[この１ページで一通りわかる！Linuxのマウント(mount)について](https://eng-entrance.com/linux-mount "この１ページで一通りわかる！Linuxのマウント(mount)について")
▪️参考：[「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典：マウント (mount)](https://wa3.i-3-i.info/word13188.html "マウント (mount)")

では`mkdir`コマンド（ディレクトリを作成するコマンド）でマウントするディレクトリを作成します。
ディレクトリ名は自由です。今回はAWS公式ドキュメントに倣って`data`とします。

```
[root@ip-123-45-67-89 ~]# mkdir /data
```

`ls`コマンド（ファイルやディレクトリを一覧確認するコマンド）で確認してみます。

```
[root@ip-123-45-67-89 ~]# ls /
bin  boot  data  dev  etc ...
```

無事`data`が作成されていることを確認できます。

## ⑤マウントする
俺お前より詳しいぜ
失礼しました。作成した`data`ディレクトリに`/dev/xvdf`をマウントします。

マウントするには`mount`コマンドを使います。
▪️参考：[【 mount 】コマンド――ファイルシステムをマウントする](https://www.atmarkit.co.jp/ait/articles/1802/15/news035.html "【 mount 】コマンド――ファイルシステムをマウントする")

```
[root@ip-123-45-67-89 ~]# mount /dev/xvdf /data
```

特に何も表示されることなくしれっと完了します。

では`df`コマンド（ディスクの空き領域を調べるコマンド）を使って`/dev/xvdf`が表示されるかどうかを確認します。
空き領域が表示される＝マウントされている を意味します。

`-h`オプションを付けることでギガバイトは`G`やメガバイトは`M`など、わかりやすい単位で表示してくれます。
▪️参考：[【 df 】コマンド――ディスクの空き領域を表示する](https://www.atmarkit.co.jp/ait/articles/1610/24/news017.html "【 df 】コマンド――ディスクの空き領域を表示する")

```
[root@ip-123-45-67-89 ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        482M     0  482M   0% /dev
tmpfs           492M     0  492M   0% /dev/shm
tmpfs           492M  532K  492M   1% /run
tmpfs           492M     0  492M   0% /sys/fs/cgroup
/dev/xvda1      8.0G  1.4G  6.7G  18% /
tmpfs            99M     0   99M   0% /run/user/1000
/dev/xvdf       493G   73M  467G   1% /data
```

`/dev/xvdf`が表示されており、問題なくマウントできていることを確認できます。
これでアタッチされたEBSが使用可能ということになります。

## ⑥再起動後も自動でマウントされるように設定する
実はマウントをしてもEC2インスタンスの停止や再起動のタイミングで外れてしまいます。
停止や再起動をしても自動で再マウントされるように設定を追加したいと思います。

`/etc/fstab`というファイルシステムの情報を記述するファイルを編集していきます。
OS起動時にシステムがデバイスをディレクトリにマウントしますが、
どのデバイスにどのディレクトリをマウントするかの処理は`/etc/fstab`ファイルの記述に従って進行されます。
▪️参考：[Linux豆知識 175「/etc/fstab」ファイル](https://linuc.org/study/knowledge/505/ "Linux豆知識 175「/etc/fstab」ファイル")

手順③のファイルシステム作成時に表示された`UUID`が必要になります。
メモに控えていなかった場合は再度`file`コマンドで確認するか、または`blkid`コマンド（ブロックデバイスの属性を表示させるコマンド）でも確認できます。

```
[root@ip-123-45-67-89 ~]# blkid
/dev/xvda1: LABEL="/" UUID="90e29211-2de8-4967-b0fb-16f51a6e464c" TYPE="xfs" PARTLABEL="Linux" PARTUUID="2c7bff30-ed75-4ab8-999f-02e40450fd0f"
/dev/xvdf: UUID="2c3d4ee5-d35f-4344-993f-9fe4303899d5" TYPE="ext4"
```

...

では`vi`コマンド（エディタを起動するコマンド）で`/etc/fstab`の編集画面を出します。
▪️参考：[viコマンドについて詳しくまとめました 【Linuxコマンド集】](https://eng-entrance.com/linux-command-vi "viコマンドについて詳しくまとめました 【Linuxコマンド集】")

```
[root@ip-123-45-67-89 ~]# vi /etc/fstab
```

以下のような編集画面が表示されます。

```
#
UUID=90e29211-2de8-4967-b0fb-16f51a6e464c     /           xfs    defaults,noatime  1   1
~
~
~
~
~
"/etc/fstab" 2L, 91C
```

キーボードの`iキー`で`INSERTモード（編集モード）`にし、
2行目以降に今回追加するデバイスの情報を入力します。

```
#
UUID=90e29211-2de8-4967-b0fb-16f51a6e464c     /           xfs    defaults,noatime  1   1
UUID=2c3d4ee5-d35f-4344-993f-9fe4303899d5     /data       ext4   defaults          1   1
~
~
~
~
~
"/etc/fstab" 2L, 91C
```

>
第1フィールド：デバイス名
第2フィールド：マウントポイント
第3フィールド：ファイルシステムの種類
第4フィールド：各種オプション
第5フィールド：ファイルシステムをdumpするか否かの指定
第6フィールド：OS起動時にfsckチェックを行うか否かの指定を行う
▪️参考：[Linux豆知識 175「/etc/fstab」ファイル](https://linuc.org/study/knowledge/505/ "Linux豆知識 175「/etc/fstab」ファイル")

入力後は`escキーで`コマンドモードに戻り、`:wq`と打ち`returnキー`を押して上書き保存します。

以上で設定は完了です。
これでEC2が再起動をしても指定したデバイスが自動でマウントされます。


#終わりに

しゃーしゃーと解説しましたが私自身がAWSの初学者です。
途中でも書きましたが、本体が`xvdf`であるならば何故`sdf`と名乗る必要があるのか、
ここだけはどんなに調べてもわからず、ずっとモヤモヤしています。
詳しい方は私にマウントしてください。

### 追記：
利用するAMIなどによってマウント対象のドライブの命名規則が変動するようです。
これは仕様ということで理解します。
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/device_naming.html