概要
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
コマンドを実行します。
$ 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コマンドを実行する方法で確かめることができます。
# 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
コマンドの実行結果を見ると、
$ 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スキームでパーティションを作るよう設定します。
# gpart create -s GPT xbd5
xbd5 created
# gpart show xbd5
=> 40 67108784 xbd5 GPT (32G)
40 67108784 - free - (32G)
#
次に、xbd5
にあるディスクの空き容量すべてをファイルシステム freebsd-ufs
とするパーティションを作成します。このパーティションには ebs32g
というラベルを付けておくことにします。
# 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
を使います。
# 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
でも良いと思います。
# 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
を作成し、パーティション情報を元にマウントします。
# 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
を書くと自動的にマウントされるようになります。
# 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からどう見えるか?
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 のハードディスクデバイスとして読み替えられていません。
$ 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
には何もないようです。
# 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 に読み替えられたはずのデバイスも見当たらないのがちょっと不思議。
$ 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
$ 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 インスタンスにアタッチする
GEOM jounral の設定: uyota 匠の一手
FreeBSD Soft Updatesの弱点を克服するジャーナル機能 - BSDCan 2010