GEOM CONCAT (ディスクの連結) を使ってみる

GEOM

今回は GEOM によるディスクの連結 (コンカチ・コンカチネーション) について纏めてみたいと思います.以降,コンカチの略称で統一します.
コンカチは「複数のディスクを連結して単一の大きなディスクとして扱う」技術です.RAID0 と違い先頭のディスクから順番に利用されていきます.
RAID0 は分散で書き込まれますが,コンカチは分散されないのが大きな違いです.

GEOM CONCAT のイメージ

コンカチのイメージはこのような形です.ディスクが2本の場合,3本の場合を表しています.

GEOM CONCAT の利用・管理

GEOM CONCAT は gconcat というコマンドを通じて利用・管理を行います.簡単に触れますが,詳細はコマンドのオプションの詳細は FreeBSD の マニュアル「gconcat」を見てください.

# gconcat
usage: gconcat clear [-v] prov ...
       gconcat create [-v] name prov ...
       gconcat destroy [-fv] name ...
       gconcat dump prov ...
       gconcat label [-hv] name prov ...
       gconcat stop [-fv] name ...
       gconcat help
       gconcat list [-a] [name ...]
       gconcat status [-ags] [name ...]
       gconcat load [-v]
       gconcat unload [-v]

GEOM 関連のコマンドは gconcat 以外にも基本的には createlabel の両方があり分かりづらいのですが,create は一時的label は恒久的と覚えるのがよいです.

create で作った場合はどうなるのか?


create で作成してマウント,再起動を行うとどのようになるのかを以下に一連の流れを記載します.

gconcat create コマンドで ディスク da1 と da2 をコンカチして concat0 を作成します.

# gconcat create concat0 da1 da2

gconcat createlabel コマンドを実行するとカーネルモジュールが自動的にロードされます.

# kldstat
Id Refs Address                Size Name
 1   10 0xffffffff80200000  1f3e2d0 kernel
 2    1 0xffffffff82319000     3218 intpm.ko
 3    1 0xffffffff8231d000     2180 smbus.ko
 4    1 0xffffffff82320000     7490 vmci.ko
 6    1 0xffffffff82328000     334c geom_concat.ko

ですが,再起動時に必ず有効になるように明示的にロードさせる事をお勧めします.

# cat /boot/loader.conf
geom_concat_load="YES"

gconcat status コマンドでステータスを表示できます.
以下は concat0 のステータスです.da1, da2 がコンポーネントとして含まれており,ステータスがアップの状態です.

# gconcat status concat0
          Name  Status  Components
concat/concat0      UP  da1
                        da2

gconcat list コマンドで詳細を表示する事ができます.
da1, da2 が 100GB のディスクになっており,これをコンカチしている為,concat0 は 200G となっています.
da1, da2 の Start: と End: を見て頂くと da1 -> da2 の順に連結されている事がわかります.

# gconcat list concat0
Geom name: concat0
State: UP
Status: Total=2, Online=2
Type: MANUAL
ID: 3180595206
Providers:
1. Name: concat/concat0
   Mediasize: 214748364800 (200G)
   Sectorsize: 512
   Mode: r0w0e0
Consumers:
1. Name: da1
   Mediasize: 107374182400 (100G)
   Sectorsize: 512
   Mode: r0w0e0
   Start: 0
   End: 107374182400
2. Name: da2
   Mediasize: 107374182400 (100G)
   Sectorsize: 512
   Mode: r0w0e0
   Start: 107374182400
   End: 214748364800

newfs でファイルシステムを作成します.指定するデバイスは GEOM CONCAT の場合は /dev/concat 以下に指定した名前のデバイスファイルが作成されますので,これを指定します.
今回は create の際に concat0 を名前としたため,/dev/concat/concat0 がデバイスファイルとなります.

# newfs /dev/concat/concat0
/dev/concat/concat0: 204800.0MB (419430400 sectors) block size 32768, fragment size 4096
        using 328 cylinder groups of 625.22MB, 20007 blks, 80128 inodes.
super-block backups (for fsck_ffs -b #) at:
 192, 1280640, 2561088, 3841536, 5121984, 6402432, 7682880, 8963328, 10243776, 11524224, 12804672, 14085120, 15365568,
 16646016, 17926464, 19206912, 20487360, 21767808, 23048256, 24328704, 25609152, 26889600, 28170048, 29450496, 30730944,
 32011392, 33291840, 34572288, 35852736, 37133184, 38413632, 39694080, 40974528, 42254976, 43535424, 44815872, 46096320,
....

マウントおよびマウントの結果です./mnt にマウントをしています.
これを /etc/fstab に記載した状態で再起動を行ってみます.

# mount /dev/concat/concat0 /mnt
# df
Filesystem          1K-blocks    Used     Avail Capacity  Mounted on
/dev/da0p2           19279260 2449220  15287700    14%    /
devfs                       1       1         0   100%    /dev
/dev/concat/concat0 203123608       8 186873712     0%    /mnt

# cat /etc/fstab
# Device        Mountpoint      FStype  Options Dump    Pass#
/dev/da0p2      /               ufs     rw      1       1
/dev/da0p3      none            swap    sw      0       0
/dev/concat/concat0     /mnt    ufs     rw      1       1

残念な事に (ですがこれは想定どおりです),デバイスが無く起動途中に失敗してしまっています.
これは create で作成した為,ディスクに GEOM CONCAT の情報が記録されていない為,作成したデバイスが存在しておらず,この状態となります.

恒久的に使う場合は label を利用しよう

先ほどと変わって create ではなく label で concat0 を作成しました.

# gconcat label concat0 da1 da2

同じディスクを同じように指定している為,status および list の結果は先ほどと変わりません.
また,create で作成した際に newfs を行っていますが,今回 label で再度作成をした際にコンカチのディスク連結順番に変更を入れていませんので元の状態が復元されており,ファイルシステムとしては正しく生成された状態となっています.
ですのでこのままマウントさせる事も可能です.

# gconcat status concat0
          Name  Status  Components
concat/concat0      UP  da1
                        da2

# gconcat list concat0
Geom name: concat0
State: UP
Status: Total=2, Online=2
Type: AUTOMATIC
ID: 1576629670
Providers:
1. Name: concat/concat0
   Mediasize: 214748363776 (200G)
   Sectorsize: 512
   Mode: r0w0e0
Consumers:
1. Name: da1
   Mediasize: 107374182400 (100G)
   Sectorsize: 512
   Mode: r0w0e0
   Start: 0
   End: 107374181888
2. Name: da2
   Mediasize: 107374182400 (100G)
   Sectorsize: 512
   Mode: r0w0e0
   Start: 107374181888
   End: 214748363776

ですので,createlabel を間違った… という場合でも正しくコマンドを発行してあげる事で今までの状態を復元できますので,データがなくなってしまった.という事は起きませんので安心してください.
いずれにせよ,基本的には普段から label で作成しましょう.が教訓となります.

# mount /dev/concat/concat0 /mnt
# df
Filesystem          1K-blocks    Used     Avail Capacity  Mounted on
/dev/da0p2           19279260 2449268  15287652    14%    /
devfs                       1       1         0   100%    /dev
/dev/concat/concat0 203123608       8 186873712     0%    /mnt

IOについて確認してみる

上述で RAID0 と違って分散されませんと記載していますが実際そのように動作しているのか.を確認してみます.

dd でランダムデータを生成,random.img としてファイル書き込みの IO を発生させました.
見て頂くと分かる通り da1 にのみ IO がかかっており,da2 には全くかかっていない事が分かります.
このことから,ただの連結で先頭から順次利用されていくという事が分かります.

# dd if=/dev/random of=/mnt/random.img

# iostat 2
       tty             da0              da1              da2             cpu
 tin  tout KB/t  tps  MB/s  KB/t  tps  MB/s  KB/t  tps  MB/s  us ni sy in id
   0    48 68.0    5   0.3   240    3   0.7   2.1    0   0.0   0  0  0  0 99
   0   229 11.0    2   0.0   255  362  90.0   0.0    0   0.0   2  0 24  0 74
   0   166  0.0    0   0.0   255  442 110.4   0.0    0   0.0   2  0 29  0 69
   0    78 32.0    7   0.2   255  429 106.7   0.0    0   0.0   1  0 31  0 68
   0    74  0.0    0   0.0   255  197  49.1   0.0    0   0.0   0  0 14  0 86

# ls /mnt
.snap           random.img

イメージとしてはこのような形ですね.

ディスクを拡張する

GEOM CONCAT によるディスクの拡張は可能です.ただし,オンラインで行う事は出来ません.
オンラインのまま拡張しようとするとこのとおりエラーが表示されます.

# gconcat label concat0 da1 da2 da3
gconcat: Can't store metadata on da1: Operation not permitted.

一度ファイルシステムのアンマウントを行う必要があります.

# umount /mnt

再度 label コマンドを利用してディスクを追加します.この際元々指定していたディスクは順番通りに指定する必要がありますので注意してください.

# gconcat label concat0 da1 da2 da3

list コマンドで da1, da2 の Start, End が元と一致しているかも確認しましょう.この段階でのミスは再度やり直すことが収束させる事が可能です.

# gconcat list concat0
Geom name: concat0
State: UP
Status: Total=3, Online=3
Type: AUTOMATIC
ID: 1553558810
Providers:
1. Name: concat/concat0
   Mediasize: 322122545664 (300G)
   Sectorsize: 512
   Mode: r1w1e1
Consumers:
1. Name: da1
   Mediasize: 107374182400 (100G)
   Sectorsize: 512
   Mode: r1w1e2
   Start: 0
   End: 107374181888
2. Name: da2
   Mediasize: 107374182400 (100G)
   Sectorsize: 512
   Mode: r1w1e2
   Start: 107374181888
   End: 214748363776
3. Name: da3
   Mediasize: 107374182400 (100G)
   Sectorsize: 512
   Mode: r1w1e2
   Start: 214748363776
   End: 322122545664

list の結果問題がなかったら growfs でファイルシステムを拡張します.
拡張が完了したらマウントし,今までのデータが存在している事を確認してください.

# growfs /dev/concat/concat0
It's strongly recommended to make a backup before growing the file system.
OK to grow filesystem on /dev/concat/concat0 from 200GB to 300GB? [yes/no] yes
super-block backups (for fsck_ffs -b #) at:
 419987136, 421267584, 422548032, 423828480, 425108928, 426389376, 427669824, 428950272, 430230720, 431511168, 432791616,
 434072064, 435352512, 436632960, 437913408, 439193856, 440474304, 441754752, 443035200, 444315648, 445596096, 446876544,
 448156992, 449437440, 450717888, 451998336, 453278784, 454559232, 455839680, 457120128, 458400576, 459681024, 460961472,
 462241920, 463522368, 464802816, 466083264, 467363712, 468644160, 469924608, 471205056, 472485504, 473765952, 475046400,
....

# mount /dev/concat/concat0 /mnt
# ls /mnt
.snap           random.img

GEOM CONCAT デバイスを終了 (破壊) する

ファイルシステムとして用済みになった.であったり,別用途に転用する為に初期化したい場合を説明します.

当然ながら,ファイルシステムはアンマウントする必要があります.
また,完全に終了 (停止・破壊) する場合は stop ではなく destroy を利用します.

# umount /mnt
# gconcat destroy concat0
# gconcat list

もし間違って destory を実行してしまった場合ですが,まだこの段階だとラベル情報がなくなっただけですので,再度 label で同じ引数を渡すことで復活させる事が可能です.
やらかしてしまった… という事案の場合は慌てずにそっと元に戻しましょう.

# gconcat label concat0 da1 da2 da3
# mount /dev/concat/concat0 /mnt

# df
Filesystem          1K-blocks    Used     Avail Capacity  Mounted on
/dev/da0p2           19279260 2582396  15154524    15%    /
devfs                       1       1         0   100%    /dev
/dev/concat/concat0 305047412 1990952 278652668     1%    /mnt

# ls /mnt
.snap           random.img

以上で GEOM CONCAT によるコンカチの方法についての解説を終了します.

コメント

タイトルとURLをコピーしました