Microsoft Azure 仮想マシンで追加ドライブの認識

# はじめに
　研究室の計算機リソースは何かとあらゆるサービスが稼働しているため，簡易に実験環境を構築するのであればクラウドコンピューティングサービス （以下，CCS）の仮想マシン（以下，VM）を利用する流れになっている．今回は [Microsoft Azure](https://azure.microsoft.com/ja-jp/) の仮想マシンを利用してみることにした．
　どの CCS においても VM を作成するとストレージがある程度準備されているように見えるが，基本的に一時的なストレージ (Temporary Storage) となっている．文字通り，永続的にデータを格納しておくことができず，課金が生じない停止状態（以下，非課金シャットダウン）にすると同時にデータが失われる．~~私もこれを把握しておらず 1 度だけ転送したデータが消去されたことがある．．．~~データを保持しながら非課金シャットダウンを行うためには，ストレージを追加する必要がある．その追加方法について簡単であるが忘備録として残しておく．

# VM 前提条件
| VM 情報 | 値 |
|:-------:|:--|
|OS|Ubuntsu 18.04（バージョンは基本的に関係ない）|
|VM ボリューム|D64s_v3（関係ないが，一応載せておく）|
|追加ストレージ|2048 GiB（追加ボリュームは Azure ポータルサイトで追加しておく）

# ストレージ追加の作業内容
では，ストレージの追加作業について述べていく．

　まず，ポータルサイトでディスクを追加すると次の画像のように，OS ディスクだけではなくデータディスク項目にエントリがある状態にしておく必要がある．
![Microsoft Azure 仮想マシンで追加ドライブの認識-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/36125/b48a0f42-989d-55e9-71b8-fcfa76255890.jpeg)
　次に，仮想マシンに接続し，ディスクの空き状況を確認する．下記のようにコマンドを実行すると，VM の初期状態は以下のようなディスク状況になっているはずである．

```sh
~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            126G     0  126G   0% /dev
tmpfs            26G  936K   26G   1% /run
/dev/sda1        29G  1.3G   28G   5% /
tmpfs           126G     0  126G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           126G     0  126G   0% /sys/fs/cgroup
/dev/sda15      105M  3.6M  101M   4% /boot/efi
/dev/sdb1       503G   73M  478G   1% /mnt
tmpfs            26G     0   26G   0% /run/user/1000
```
見ての通り，接続はされているが認識されていないため，自分で認識させる必要がある．そのため，`dmsg` コマンドにより，接続されている Small Computer System Interface (SCSI) ディスクを探し出すため，以下のコマンドを実行する．

```sh
~$ dmesg | grep SCSI
[    0.608591] SCSI subsystem initialized
[    1.440296] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 244)
[    3.817171] sd 1:0:1:0: [sdb] Attached SCSI disk
[    3.843656] sd 0:0:0:0: [sda] Attached SCSI disk
[    4.023173] sd 3:0:0:0: [sdc] Attached SCSI disk
[    8.647579] Loading iSCSI transport class v2.0-870.
```
/dev/sd{a,b,c} が検出されていることが分かり，`df` コマンドでは sdc のディスクが認識されていないことが分かった．したがって，/dev/sdc のディスクを `fdisk` コマンドによりパーティション分割する．

```sh
~$ sudo fdisk /dev/sdc
Welcome to fdisk (util-linux 2.31.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table.The size of this disk is 2 TiB (2199023255552 bytes). DOS partition table format cannot be used on drives for volumes larger than 2199023255040 bytes for 512-byte sectors. Use GUID partition table format (GPT).

Created a new DOS disklabel with disk identifier 0xf7a72ba7.

Command (m for help): 
```
このような出力が得られ，コマンドを要求されるため，新しいパーティションを追加するために `n` を入力する．

```sh
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` を設定する．このとき，拡張パーティションとして設定したいのであれば，ここタイプ `e` を入力する必要がある．デフォルトではタイプ `p` が設定されているため，入力せず次に進んでも問題はない．

```sh
Select (default p): 

Using default response p.
```
ここからは，引数を入力後の出力はないため，パーティション番号，セクタ開始位置，セクタ終了位置を続けてそれぞれ指定していく必要がある．今回はデータディスク全体を利用したいため，パーティションは一つで最大限利用できるように設定する．その場合は，デフォルト値がそのような設定になっているため，各質問ではエンターを入力するだけで問題ない．ここでいくつかに分けたいのであれば，各自で調整する必要がある．

```sh
Partition number (1-4, default 1): 
```
```sh
First sector (2048-4294967295, default 2048): 
```
```sh
Last sector, +sectors or +size{K,M,G,T,P} (2048-4294967294, default 4294967294): 

Created a new partition 1 of type 'Linux' and of size 2 TiB.
```
最終的に，新しく 2TiB のパーティションが作成されたメッセージが得られるはずである．パーティションテーブルを出力できる `p` コマンドで確認してみる．

```sh
Command (m for help): p
Disk /dev/sdc: 2 TiB, 2199023255552 bytes, 4294967296 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0xf7a72ba7

Device     Boot Start        End    Sectors Size Id Type
/dev/sdc1        2048 4294967294 4294965247   2T 83 Linux
```
最終行でうまく作成されていることが確認できれば，最後に `w` コマンドを実行し，`fdisk` コマンドを終了する．

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

次に，パーティションを作成しただけであるため，そのパーティションにファイルシステムを書き込む必要がある．この作業は `mkfs` コマンドにより行い，このコマンドの引数としてファイルシステムの種類とパーティションを指定する必要がある．したがって，下記のようなコマンドを実行する．

```sh
~$ sudo mkfs -t ext4 /dev/sdc1
mke2fs 1.44.1 (24-Mar-2018)
Discarding device blocks: done                            
Creating filesystem with 536870655 4k blocks and 134217728 inodes
Filesystem UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
        4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 
        102400000, 214990848, 512000000

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (262144 blocks): done
Writing superblocks and filesystem accounting information: done 
```
このようなメッセージが得られれば，ファイルシステムの書き込みが完了している．**※ Filesystem UUID: の値はコピーしておくとあとの作業で便利**

 ここまで完了すれば作業は大詰めで，残すところデータディスクのマウント，起動時の自動マウントの設定のみである．データディスクをマウントするためには，マウントポイントを指定する作成する必要があるため，ここでは /datadrive という名前のディレクトリを作成し，このディレクトリに作成した /dev/sdc1 パーティションをマウントする．

```sh
~$ sudo mkdir /datadrive
~$ sudo mount /dev/sdc1 /datadrive
```
以上で，マウントが完了したため，`df` コマンドでディスク情報が出力されるようになる．

```sh
~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            126G     0  126G   0% /dev
tmpfs            26G  940K   26G   1% /run
/dev/sda1        29G  1.3G   28G   5% /
tmpfs           126G     0  126G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           126G     0  126G   0% /sys/fs/cgroup
/dev/sda15      105M  3.6M  101M   4% /boot/efi
/dev/sdb1       503G   73M  478G   1% /mnt
tmpfs            26G     0   26G   0% /run/user/1000
/dev/sdc1       2.0T   81M  1.9T   1% /datadrive1
```

　最後に，起動時の自動マウントを設定する．設定にはそのドライブの Universally Unique Identifier（以下，UUID）が必要になる．ここまでの作業で得た UUID をコピーしている場合はそれを利用すればよいが，知りたい場合は `blkid` コマンドを実行する．

```sh
~$ sudo -i blkid
/dev/sda1: LABEL="cloudimg-rootfs" UUID="zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz" ...
/dev/sda15: LABEL="UEFI" UUID="wwww-wwww" TYPE="vfat" ...
/dev/sdb1: UUID="yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy" TYPE="ext4" ...
/dev/sdc1: UUID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" TYPE="ext4" ...
/dev/sda14: PARTUUID="vvvvvvvv-vvvv-vvvv-vvvv-vvvvvvvvvvvv"
```
こうして得た UUID を持つドライブに対するマウント設定を /etc/fstab ファイルに追加する必要がある．

```sh
~$ sudo vim /etc/fstab
:
:
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx   /datadrive   ext4   defaults,nofail   1   2
```
この `nofail` オプションを付けることで /etc/fstab の編集にミスが有ったとしても，VM が起動されるようになるため必ず追加しておく必要がある．

　以上で，データディスク追加作業は終了であるため，**VM を再起動後**に，自動マウントの確認のため`df` コマンドでディスク情報を表示させる．

```sh
~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            126G     0  126G   0% /dev
tmpfs            26G  936K   26G   1% /run
/dev/sda1        29G  1.3G   28G   5% /
tmpfs           126G     0  126G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           126G     0  126G   0% /sys/fs/cgroup
/dev/sda15      105M  3.6M  101M   4% /boot/efi
/dev/sdc1       2.0T   81M  1.9T   1% /datadrive1
/dev/sdb1       503G   73M  478G   1% /mnt
tmpfs            26G     0   26G   0% /run/user/1000
```
以上のように，再起動後に自動でマウントされるように設定ができた．

# おわりに
　この記事での作業は，基本的に [Microsoft Azure](https://azure.microsoft.com/ja-jp/) の[ハウツーガイド](https://docs.microsoft.com/ja-jp/azure/virtual-machines/linux/attach-disk-portal)に記載されているため新しい情報は無いが，必要な作業をピックアップして Tips 的な内容は省略してすぐ読めるようにしている．そのため，より詳細な情報が必要な場合は[ハウツーガイド](https://docs.microsoft.com/ja-jp/azure/virtual-machines/linux/attach-disk-portal)を一読するべきである．