今回は GEOM によるディスクの連結 (コンカチ・コンカチネーション) について纏めてみたいと思います.以降,コンカチの略称で統一します.
コンカチは「複数のディスクを連結して単一の大きなディスクとして扱う」技術です.RAID0 と違い先頭のディスクから順番に利用されていきます.
RAID0 は分散で書き込まれますが,コンカチは分散されないのが大きな違いです.
- GEOM に関するお話
- FreeBSD GEOM 再々学習
- GEOM CONCAT (ディスクの連結) を使ってみる
- GEOM STRIPE (ストライプ/RAID0) を使ってみる
- GEOM MIRROR (ミラーリング/RAID1) を使ってみる (1)
- GEOM MIRROR (ミラーリング/RAID1) を使ってみる (2)
- GEOM STRIPE + MIRROR で RAID10 を構成してみる
- GEOM RAID3を使ってみる
- GEOM CACHE を使ってみる
- GEOM GVIRSTORを使ってみる
- GEOM GATE を使ってみる
- GEOM LABEL で名前による管理を行う
- GEOM PART でディスクパーティションの管理を行う
- GEOM MULTIPATH でマルチパスを構成する (1)
- GEOM MULTIPATH でマルチパスを構成する (2)
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 以外にも基本的には create と label の両方があり分かりづらいのですが,create は一時的,label は恒久的と覚えるのがよいです.
create で作った場合はどうなるのか?
create で作成してマウント,再起動を行うとどのようになるのかを以下に一連の流れを記載します.
gconcat create コマンドで ディスク da1 と da2 をコンカチして concat0 を作成します.
# gconcat create concat0 da1 da2
gconcat create や label コマンドを実行するとカーネルモジュールが自動的にロードされます.
# 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
ですので,create と label を間違った… という場合でも正しくコマンドを発行してあげる事で今までの状態を復元できますので,データがなくなってしまった.という事は起きませんので安心してください.
いずれにせよ,基本的には普段から 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 によるコンカチの方法についての解説を終了します.
コメント