Lightsail の FreeBSD インスタンスにストレージを接続する方法 

# 概要
AWS lightsail の FreeBSD インスタンスでは、lightsail のストレージ画面に表示されるディスクのパス `/dev/xvdf` が当てにならないのと、ドキュメントに出てくるコマンド `lsblk` も存在しないので、FreeBSD流の方法でやりなおしてみました。 `camcontrol` ではなく `geom` を使うのがポイントです。

https://lightsail.aws.amazon.com/ls/docs/ja_jp/articles/create-and-attach-additional-block-storage-disks-linux-unix
この記事のステップ1までは同じ操作で、ステップ2をどうするか、という話です。
ステップ1で32GBのディスクを作成し、backupstorage という名前でアタッチしています。ディスクのパスは `/dev/xvdf` となっています。

# FreeBSD版のステップ2
## 1. ディスクを見つける
`geom disk list` コマンドを実行します。

```text:geom
$ geom disk list
Geom name: ada0
Providers:
1. Name: ada0
   Mediasize: 21474836480 (20G)
   Sectorsize: 512
   Mode: r1w1e3
   descr: (null)
   ident: (null)
   rotationrate: unknown
   fwsectors: 0
   fwheads: 0

Geom name: xbd5
Providers:
1. Name: xbd5
   Mediasize: 34359738368 (32G)
   Sectorsize: 512
   Mode: r0w0e0
   descr: (null)
   ident: (null)
   rotationrate: unknown
   fwsectors: 0
   fwheads: 0
```

ストレージの容量から、デバイス名(geomでいうところのprovider)は `xbd5` であることが分かります。

### ファイルシステムの有無を確認する
AWSのドキュメントと同様に、fileコマンドを実行する方法で確かめることができます。

```text:file命令をrootで実行する
# file -s /dev/xbd5 
/dev/xbd5: data
# file -s /dev/ada0
/dev/ada0: DOS/MBR boot sector; partition 1 : ID=0xee, start-CHS (0x0,0,2), end-CHS (0x3ff,255,63), startsector 1, 41943039 sectors
```

今回の場合、`xbd5` にファイルシステムはありません。`ada0` のようにパーティションが存在する場合の表示と比較してみてください。

あるいは、`geom -t` コマンドの実行結果を見ると、

```text:geomの確認
$ geom -t
Geom                                             Class      Provider
ada0                                             DISK       ada0
  ada0                                           PART       ada0p1
    ada0p1                                       LABEL      gpt/bootfs
      gpt/bootfs                                 DEV       
    ada0p1                                       LABEL      gptid/97f64d0b-fc77-11e9-90a5-0cc47ad8b808
      gptid/97f64d0b-fc77-11e9-90a5-0cc47ad8b808 DEV       
    ada0p1                                       DEV       
  ada0                                           PART       ada0p2
    ada0p2                                       LABEL      gpt/rootfs
      ffs.gpt/rootfs                             VFS       
      gpt/rootfs                                 DEV       
    ada0p2                                       DEV       
  ada0                                           DEV       
xbd5                                             DISK       xbd5
  xbd5                                           DEV       
```
であるので、`xbd5` にはそもそもパーティションすら存在しないことが分かります。

## 2. GPTパーティションを作成する
まず、ディスクにGPTスキームでパーティションを作るよう設定します。

```text:gpartでパーティションスキームを設定する
# gpart create -s GPT xbd5
xbd5 created
# gpart show xbd5
=>      40  67108784  xbd5  GPT  (32G)
        40  67108784        - free -  (32G)
# 
```

次に、`xbd5` にあるディスクの空き容量すべてをファイルシステム `freebsd-ufs` とするパーティションを作成します。このパーティションには `ebs32g` というラベルを付けておくことにします。

```text:gpartでパーティションを作成する
# gpart add -t freebsd-ufs -l ebs32g xbd5
xbd5p1 added
# gpart show xbd5
=>      40  67108784  xbd5  GPT  (32G)
        40  67108784     1  freebsd-ufs  (32G)
# geom -t
Geom                                             Class      Provider
(中略)
xbd5                                             DISK       xbd5
  xbd5                                           PART       xbd5p1
    xbd5p1                                       LABEL      gpt/ebs32g
      gpt/ebs32g                                 DEV       
    xbd5p1                                       LABEL      gptid/c07635f0-265d-11eb-831e-5dad1bdd57fb
      gptid/c07635f0-265d-11eb-831e-5dad1bdd57fb DEV       
    xbd5p1                                       DEV       
  xbd5                                           DEV       
```

`xbd5p1` というパーティションが出来ており、ラベルとして `ebs32g` という文字列が設定されていることが分かります。このラベルは`/dev/gpt/`以下に現れ、パーティションをマウントするときに使えます。

## 3. パーティションをフォーマットする
freebsd-ufsとして確保したパーティションをフォーマットするには `newfs` を使います。

```text:newfs
# file -s /dev/xbd5p1 
/dev/xbd5p1: data
# newfs -j /dev/xbd5p1
/dev/xbd5p1: 32768.0MB (67108784 sectors) block size 32768, fragment size 4096
using 53 cylinder groups of 626.09MB, 20035 blks, 80256 inodes.
with soft updates
super-block backups (for fsck_ffs -b #) at:
 192, 1282432, 2564672, 3846912, 5129152, 6411392, 7693632, 8975872, 10258112, 11540352, 12822592, 14104832, 15387072, 16669312, 17951552, 19233792,
 20516032, 21798272, 23080512, 24362752, 25644992, 26927232, 28209472, 29491712, 30773952, 32056192, 33338432, 34620672, 35902912, 37185152,
 38467392, 39749632, 41031872, 42314112, 43596352, 44878592, 46160832, 47443072, 48725312, 50007552, 51289792, 52572032, 53854272, 55136512,
 56418752, 57700992, 58983232, 60265472, 61547712, 62829952, 64112192, 65394432, 66676672
Using inode 4 in cg 0 for 33554432 byte journal
newfs: soft updates journaling set
```
`-j` オプションは soft-updates journaling (SUJ) と呼ばれるオプションです。journaling を使わない `-U` とするものもよく見かけます。GEOM journaling (gjournal)を設定する `-J` とは別の仕組みです。今回は特に理由なく設定してみましたが、journalingに伴うファイルシステムの性能の低下を嫌うのであれば、`-U` でも良いと思います。

```text:作成したファイルシステムの情報を表示
# file -s /dev/xbd5p1
/dev/xbd5p1: Unix Fast File system [v2] (little-endian) last mounted on , last written at Sat Nov 14 10:24:42 2020, clean flag 1, readonly flag 0, nu
mber of blocks 8388598, number of data blocks 8121877, number of cylinder groups 53, block size 32768, fragment size 4096, average file size 16384, a
verage number of files in dir 64, pending blocks to free 0, pending inodes to free 0, system-wide uuid 0, minimum percentage of free blocks 8, TIME o
ptimization
# tunefs -p /dev/xbd5p1
tunefs: POSIX.1e ACLs: (-a)                                disabled
tunefs: NFSv4 ACLs: (-N)                                   disabled
tunefs: MAC multilabel: (-l)                               disabled
tunefs: soft updates: (-n)                                 enabled
tunefs: soft update journaling: (-j)                       enabled
tunefs: gjournal: (-J)                                     disabled
tunefs: trim: (-t)                                         disabled
tunefs: maximum blocks per file in a cylinder group: (-e)  4096
tunefs: average file size: (-f)                            16384
tunefs: average number of files in a directory: (-s)       64
tunefs: minimum percentage of free space: (-m)             8%
tunefs: space to hold for metadata blocks: (-k)            6408
tunefs: optimization preference: (-o)                      time
tunefs: volume label: (-L)                                 
```
いくつかの設定がenabledになっていることがわかります。

## 4. パーティションをマウントする
マウントポイント `/backupfs` を作成し、パーティション情報を元にマウントします。

```text:パーティション情報を元にマウントする
# gpart show -p xbd5 
=>      40  67108784    xbd5  GPT  (32G)
        40  67108784  xbd5p1  freebsd-ufs  (32G)
# mkdir /backupfs
# mount /dev/xbd5p1 /backupfs
# cd /backupfs/
# ls -la
total 32840
drwxr-xr-x   3 root  wheel        32768 Nov 14 10:24 .
drwxr-xr-x  20 root  wheel          512 Nov 14 10:46 ..
drwxrwxr-x   2 root  operator       512 Nov 14 10:24 .snap
-r--------   1 root  wheel     33554432 Nov 14 10:24 .sujournal
```
SUJを有効にしたので、いくつか隠しファイルが存在しています。

## 5. fstabに記述する
FreeBSDにおいても`/etc/fstab` を書くと自動的にマウントされるようになります。

```text:/etc/fstab
# Device        Mountpoint      FStype  Options   Dump    Pass#
/dev/gpt/rootfs   /             ufs     rw        1       1
/deb/gpt/ebs32g   /backupfs     ufs     rw        0       2
```

rootfs は参考のために記載しています。`Pass#` を `2` にしているのは、journaling を行うファイルシステムを選んだので fsck をかけてから mount したほうが良いだろうと思ったためです。

# アタッチ直後のディスクはFreeBSDからどう見えるか？
```text:dmesgのログ
xbd0: 20480MB <Virtual Block Device> at device/vbd/768 on xenbusb_front0
xbd0: attaching as ada0
xbd5: 32768MB <Virtual Block Device> at device/vbd/51792 on xenbusb_front0
Trying to mount root from ufs:/dev/gpt/rootfs [rw]...
```
FreeBSD のハードディスクデバイスとして読み替えられていません。

```text:/dev/の下
$ ls -lad /dev/ada* /dev/x* 
crw-r-----  1 root  operator  0x54 Nov 14 07:56 /dev/ada0
crw-r-----  1 root  operator  0x55 Nov 14 07:56 /dev/ada0p1
crw-r-----  1 root  operator  0x56 Nov 14 07:56 /dev/ada0p2
crw-r-----  1 root  operator  0x57 Nov 14 07:56 /dev/xbd5
dr-xr-xr-x  2 root  wheel      512 Nov 14 07:56 /dev/xen
crw-------  1 root  operator  0x3f Nov 14 07:56 /dev/xpt0
```
`xbd0` から読み替えられた `ada0` にはパーティションがあるようですが、`xbd5` には何もないようです。

```text:camcontrolの実行結果
# camcontrol devlist -v
scbus0 on ata0 bus 0:
<>                                 at scbus0 target -1 lun ffffffff ()
scbus1 on ata1 bus 0:
<>                                 at scbus1 target -1 lun ffffffff ()
scbus-1 on xpt0 bus 0:
<>                                 at scbus-1 target -1 lun ffffffff (xpt0)
```

見えていません。ada0 に読み替えられたはずのデバイスも見当たらないのがちょっと不思議。

```text:geomの表示
$ geom -t
Geom                                             Class      Provider
ada0                                             DISK       ada0
  ada0                                           PART       ada0p1
    ada0p1                                       LABEL      gpt/bootfs
      gpt/bootfs                                 DEV       
    ada0p1                                       LABEL      gptid/87a6c21c-2650-11eb-831e-5dad1bdd57fb
      gptid/87a6c21c-2650-11eb-831e-5dad1bdd57fb DEV       
    ada0p1                                       DEV       
  ada0                                           PART       ada0p2
    ada0p2                                       LABEL      gpt/rootfs
      ffs.gpt/rootfs                             VFS       
      gpt/rootfs                                 DEV       
    ada0p2                                       DEV       
  ada0                                           DEV       
xbd5                                             DISK       xbd5
  xbd5                                           DEV       
```

```text:gpart
$ gpart show
=>       3  41943029  ada0  GPT  (20G)
         3       116     1  freebsd-boot  (58K)
       119  41942913     2  freebsd-ufs  (20G)
```
MBRもGPTも切ってないので見えるのは既存のストレージだけです。/dev/gpt 以下にも新しいストレージの情報は当然ありません。



# 参考記事
[追加のブロックストレージディスクを作成して Linux ベースの Lightsail インスタンスにアタッチする]
(https://lightsail.aws.amazon.com/ls/docs/ja_jp/articles/create-and-attach-additional-blockstorage-disks-linux-unix)
[GEOM jounral の設定: uyota 匠の一手](http://uyota.asablo.jp/blog/2009/02/19/4129461)
[FreeBSD Soft Updatesの弱点を克服するジャーナル機能 - BSDCan 2010](https://news.mynavi.jp/article/20100526-bsdcan02/)