GEOM GVIRSTORを使ってみる

GEOM

今回は GEOM GVIRSTOR によるシンプロビジョニングボリュームの提供について纏めてみます.
実ディスクより大きいサイズのディスクを提供する事ができ,利用状況に合わせて拡張していくという使い方が可能になります.

GEOM VIRSTOR のイメージ

GEOM VIRSTORのイメージはこのようになります.
VIRSTOR としてのディスク容量は 100GB ですが,実際の容量は 10GB のディスクを用います.
今回は物理側ディスク溢れの状況を作りたいので小さいディスクを使用します.

GEOM VIRSTOR の利用・管理

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

# gvirstor
usage: gvirstor clear [-v] prov ...
       gvirstor dump prov ...
       gvirstor label [-h] [-v] [-m chunk_size] [-s vir_size] name provider0 [provider1 ...]
       gvirstor destroy [-fv] name ...
       gvirstor stop [-fv] name ... (alias for "destroy")
       gvirstor add [-vh] name prov [prov ...]
       gvirstor remove [-v] name ...
       gvirstor help
       gvirstor list [-a] [name ...]
       gvirstor status [-ags] [name ...]
       gvirstor load [-v]
       gvirstor unload [-v]

GEOM VIRSTOR は create サブコマンドがないので,再起動したらどうなるのか.というのはスキップします.

シンプロビジョニングディスクを作成する

gvirstor label コマンドで仮想的なシンプロビジョニングを作成し,配下に RAID3 ボリュームの raid3-0 に紐づけます.
-s 1000G のオプションはプロビジョニングサイズで,OS から見たらこのサイズのディスクに見える形となります.

GEOM VIRSTOR は実行した段階で自動的にロードされますが,明示的に読み込みさせる事をお勧めします.

# kldload geom_virstor
# gvirstor label -s 100G vstor0 da1

再起動時に必ず有効になるように /boot/loader.conf に明示的に記述する事をお勧めします.

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

gvirstor status コマンドでステータスを表示できます.
以下は vstor0 のステータスです.da1 に紐づけられている事が確認できます.

# gvirstor status
          Name              Status  Components
virstor/vstor0  100% physical free  da1

gvirstor list コマンドで詳細を表示する事ができます.
VirtualSize や Provider の Mediasize が OS から見えるディスクサイズになります.

# gvirstor list
Geom name: vstor0
VirtualSize: 107374182400
PhysicalBackingSize: 10737418240
PhysicalBacking: 10%
ChunkVirtualCount: 25600
ChunkPhysicalCount: 2560
PhysicalFree: 100%
ChunkSize: 4194304
State: 100% physical free
Status: Components=1, Online=1
Providers:
1. Name: virstor/vstor0
   Mediasize: 107374182400 (100G)
   Sectorsize: 512
   Mode: r0w0e0
Consumers:
1. Name: da1
   Mediasize: 10737418240 (10G)
   Sectorsize: 512
   Mode: r0w0e0
   StorageFree: 100%
   ChunksReserved: 2
   ChunksUsed: 2
   ChunkCount: 2560
   ComponentIndex: 0

newfs でフォーマットを行います.データがあるディスクを組み込んでも利用できないので注意してください.その後,マウント,マウントの結果を確認します./mnt にマウントをしています.
これを /etc/fstab に記載した状態で再起動を行ってみます.

# newfs /dev/virstor/vstor0
/dev/virstor/vstor0: 102400.0MB (209715200 sectors) block size 32768, fragment size 4096
        using 164 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,

# mount /dev/virstor/vstor0 /mnt

# df
Filesystem          1K-blocks    Used    Avail Capacity  Mounted on
/dev/da0p2           19279260 2774064 14962856    16%    /
devfs                       1       1        0   100%    /dev
/dev/virstor/vstor0 101561756       8 93436808     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/virstor/vstor0     /mnt    ufs     rw      1       1

実際に利用した場合の状態を確認してみる

このディスクを利用した際,どのように扱われるのか.を確認してみます.
ファイルを dd を用いて作成して実ボリュームの 10GB を埋めてみます.

# dd if=/dev/zero of=/mnt/1G_0.img bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes transferred in 9.385553 secs (114403677 bytes/sec)

# ls /mnt
.snap           1G_0.img

# df
Filesystem          1K-blocks    Used    Avail Capacity  Mounted on
/dev/da0p2           19279260 2774064 14962856    16%    /
devfs                       1       1        0   100%    /dev
/dev/virstor/vstor0 101561756 1048872 92387944     1%    /mnt

これを淡々と続けていき,10GB まで埋めていきます.8回実施 (計9回) の状況です.

# dd if=/dev/zero of=/mnt/1G_1.img bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes transferred in 9.142144 secs (117449678 bytes/sec)
root@bsd13:/ # dd if=/dev/zero of=/mnt/1G_2.img bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes transferred in 9.359638 secs (114720447 bytes/sec)
root@bsd13:/ # dd if=/dev/zero of=/mnt/1G_3.img bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes transferred in 9.166272 secs (117140514 bytes/sec)
root@bsd13:/ # dd if=/dev/zero of=/mnt/1G_4.img bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes transferred in 9.156702 secs (117262948 bytes/sec)
root@bsd13:/ # dd if=/dev/zero of=/mnt/1G_5.img bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes transferred in 9.147463 secs (117381383 bytes/sec)
root@bsd13:/ # dd if=/dev/zero of=/mnt/1G_6.img bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes transferred in 9.175452 secs (117023315 bytes/sec)
root@bsd13:/ # dd if=/dev/zero of=/mnt/1G_7.img bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes transferred in 9.151995 secs (117323258 bytes/sec)
root@bsd13:/ # dd if=/dev/zero of=/mnt/1G_8.img bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes transferred in 9.159731 secs (117224170 bytes/sec)

# gvirstor list
Geom name: vstor0
VirtualSize: 107374182400
PhysicalBackingSize: 10737418240
PhysicalBacking: 10%
ChunkVirtualCount: 25600
ChunkPhysicalCount: 2560
PhysicalFree: 1%
ChunkSize: 4194304
State: 1% physical free
Status: Components=1, Online=1
Providers:
1. Name: virstor/vstor0
   Mediasize: 107374182400 (100G)
   Sectorsize: 512
   Mode: r1w1e1
Consumers:
1. Name: da1
   Mediasize: 10737418240 (10G)
   Sectorsize: 512
   Mode: r1w1e2
   StorageFree: 1%
   ChunksReserved: 2
   ChunksUsed: 2540
   ChunkCount: 2560
   ComponentIndex: 0

次実行で実ボリュームはすべて使い切る形になりますので,この際にどのような挙動になるのか確認します.

# dd if=/dev/zero of=/mnt/1G_9.img bs=1M count=1024

コマンドが完了せず,この状態のまま待ちとなります.gvirstor のステータスを見ると次のようになります.

# gvirstor list
Geom name: vstor0
VirtualSize: 107374182400
PhysicalBackingSize: 10737418240
PhysicalBacking: 10%
ChunkVirtualCount: 25600
ChunkPhysicalCount: 2560
PhysicalFree: 0%
ChunkSize: 4194304
State: 0% physical free
Status: Components=1, Online=1
Providers:
1. Name: virstor/vstor0
   Mediasize: 107374182400 (100G)
   Sectorsize: 512
   Mode: r1w1e1
Consumers:
1. Name: da1
   Mediasize: 10737418240 (10G)
   Sectorsize: 512
   Mode: r1w1e2
   StorageFree: 0%
   ChunksReserved: 2
   ChunksUsed: 2560
   ChunkCount: 2560
   ComponentIndex: 0

PhysicalFree や State をみると完全に使い切っている状態ですので,このまま IO 完了待ちの状態が継続するようです.

したがって,ディスクを追加して実容量を増やしていきます.

GEOM VIRSTOR にディスクを追加する

gvirstor add コマンドを使用して新しいディスクを追加できます.ここでは vstor0 に da2 を追加しています.

# gvirstor add vstor0 da2

追加が完了すると,先の IO 待ちの状態が解消して書き込みが再開します.

# dd if=/dev/zero of=/mnt/1G_9.img bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes transferred in 233.283381 secs (4602736 bytes/sec)

さて,gvirstor list で状況をみようかと思った所で kernel panic で再起動が走りました…

ここで明示的にマウントを行うと残念なことに再度 kernel panic が発生しました

実ボリュームを溢れさせた為こうなったのかもしれません.これでは何も進まないので最初からやり直してみます.

# gvirstor label -s 100G vstor0 da1

# newfs /dev/virstor/vstor0
/dev/virstor/vstor0: 102400.0MB (209715200 sectors) block size 32768, fragment size 4096
        using 164 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,

# mount /dev/virstor/vstor0 /mnt

# df
Filesystem          1K-blocks    Used    Avail Capacity  Mounted on
/dev/da0p2           19279260 2957100 14779820    17%    /
devfs                       1       1        0   100%    /dev
/dev/virstor/vstor0 101561756       8 93436808     0%    /mnt

ここから,使い切らない範囲で dd を実施します.1GB x 8 個.

# dd if=/dev/zero of=/mnt/1G_0.img bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes transferred in 9.157406 secs (117253932 bytes/sec)

# dd if=/dev/zero of=/mnt/1G_1.img bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes transferred in 9.182170 secs (116937698 bytes/sec)

# dd if=/dev/zero of=/mnt/1G_2.img bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes transferred in 9.118827 secs (117749999 bytes/sec)

# dd if=/dev/zero of=/mnt/1G_3.img bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes transferred in 9.147965 secs (117374943 bytes/sec)

# dd if=/dev/zero of=/mnt/1G_4.img bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes transferred in 9.157894 secs (117247682 bytes/sec)

# dd if=/dev/zero of=/mnt/1G_5.img bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes transferred in 9.156020 secs (117271684 bytes/sec)

# dd if=/dev/zero of=/mnt/1G_6.img bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes transferred in 9.352406 secs (114809150 bytes/sec)

# dd if=/dev/zero of=/mnt/1G_7.img bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes transferred in 9.381967 secs (114447411 bytes/sec)

この時点で gvirstor list の結果の残量が 10% でした.ですので,ここでディスクを追加します.

# gvirstor list
Geom name: vstor0
VirtualSize: 107374182400
PhysicalBackingSize: 10737418240
PhysicalBacking: 10%
ChunkVirtualCount: 25600
ChunkPhysicalCount: 2560
PhysicalFree: 10%
ChunkSize: 4194304
State: 10% physical free
Status: Components=1, Online=1
Providers:
1. Name: virstor/vstor0
   Mediasize: 107374182400 (100G)
   Sectorsize: 512
   Mode: r1w1e1
Consumers:
1. Name: da1
   Mediasize: 10737418240 (10G)
   Sectorsize: 512
   Mode: r1w1e2
   StorageFree: 10%
   ChunksReserved: 2
   ChunksUsed: 2308
   ChunkCount: 2560
   ComponentIndex: 0

da2 を追加,状態はこのようになりました.55% が空いているという状況ですね.

# gvirstor add vstor0 da2

# gvirstor list
Geom name: vstor0
VirtualSize: 107374182400
PhysicalBackingSize: 21474836480
PhysicalBacking: 20%
ChunkVirtualCount: 25600
ChunkPhysicalCount: 5120
PhysicalFree: 55%
ChunkSize: 4194304
State: 55% physical free
Status: Components=2, Online=2
Providers:
1. Name: virstor/vstor0
   Mediasize: 107374182400 (100G)
   Sectorsize: 512
   Mode: r1w1e1
Consumers:
1. Name: da1
   Mediasize: 10737418240 (10G)
   Sectorsize: 512
   Mode: r1w1e2
   StorageFree: 10%
   ChunksReserved: 2
   ChunksUsed: 2308
   ChunkCount: 2560
   ComponentIndex: 0
2. Name: da2
   Mediasize: 10737418240 (10G)
   Sectorsize: 512
   Mode: r1w1e2

先ほど,10回目で kernel panic になったので,まずはここから2回 dd を打ってみます.

# dd if=/dev/zero of=/mnt/1G_8.img bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes transferred in 9.160023 secs (117220424 bytes/sec)

# dd if=/dev/zero of=/mnt/1G_9.img bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes transferred in 9.154714 secs (117288402 bytes/sec)

今度は問題なく完了しました.gvirstor list で結果を見てみます.

# gvirstor list
Geom name: vstor0
VirtualSize: 107374182400
PhysicalBackingSize: 21474836480
PhysicalBacking: 20%
ChunkVirtualCount: 25600
ChunkPhysicalCount: 5120
PhysicalFree: 46%
ChunkSize: 4194304
State: 46% physical free
Status: Components=2, Online=2
Providers:
1. Name: virstor/vstor0
   Mediasize: 107374182400 (100G)
   Sectorsize: 512
   Mode: r1w1e1
Consumers:
1. Name: da1
   Mediasize: 10737418240 (10G)
   Sectorsize: 512
   Mode: r1w1e2
   StorageFree: 100%
   ChunksReserved: 0
   ChunksUsed: 0
   ChunkCount: 4294965248
   ComponentIndex: 77234808
2. Name: da2
   Mediasize: 10737418240 (10G)
   Sectorsize: 512
   Mode: r1w1e2

2本目のディスクに書かれているのか全く分かりません… もう一度 dd を実行すると必ず2本目を使用しますので実行してみます.

 # dd if=/dev/zero of=/mnt/1G_10.img bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes transferred in 9.155170 secs (117282570 bytes/sec)

# gvirstor list

gvirstor list を実行したとたん kernel panic になり再起動を繰り返しました…

このバージョン特有の問題なのか分かりませんが,使えないですね…

残念ですが,GEOM VIRTSTOR の紹介をこれにて終わります.




seichan

ご連絡は X (twitter) の DM へお願いします.

seichanをフォローする
GEOM

seichanをフォローする




コメント

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