今回は GEOM によるディスクのストライピング (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 STRIPE のイメージ
ストライピングのイメージはこのような形です.ディスクが2本の場合,3本の場合を表しています.
![](https://www.seichan.org/blog/wp-content/uploads/2023/12/image-3-546x258.png)
GEOM STRIPE の利用・管理
GEOM STRIPE は gstripe というコマンドを通じて利用・管理を行います.簡単に触れますが,詳細はコマンドのオプションの詳細は FreeBSD の マニュアル「gstripe」を見てください.
# gstripe usage: gstripe clear [-v] prov ... gstripe create [-v] [-s stripesize] name prov prov ... gstripe destroy [-fv] name ... gstripe dump prov ... gstripe label [-hv] [-s stripesize] name prov prov ... gstripe stop [-fv] name ... gstripe help gstripe list [-a] [name ...] gstripe status [-ags] [name ...] gstripe load [-v] gstripe unload [-v]
GEOM 関連のコマンドは gconcat の際にも触れましたが create と label の両方があり分かりづらいのですが,create は一時的,label は恒久的と覚えるのがよいです.
create で作った場合はどうなるのか?
create で作成してマウント,再起動を行うとどのようになるのかを以下に一連の流れを記載します.
gstripe create コマンドで ディスク da1 と da2 をストライピングして stripe0 を作成します.
# gstripe create stripe0 da1 da2
gstripe create や label コマンドを実行するとカーネルモジュールが自動的にロードされます.
root@bsd13:/ # kldstat Id Refs Address Size Name 1 10 0xffffffff80200000 1f3e2d0 kernel 3 1 0xffffffff82319000 3218 intpm.ko 4 1 0xffffffff8231d000 2180 smbus.ko 5 1 0xffffffff82320000 7490 vmci.ko 6 1 0xffffffff82328000 44a0 geom_stripe.ko
ですが,再起動時に必ず有効になるように明示的にロードさせる事をお勧めします.
# cat /boot/loader.conf geom_stripe_load="YES"
gstripe status コマンドでステータスを表示できます.
以下は stripe0 のステータスです.da1, da2 がコンポーネントとして含まれており,ステータスがアップの状態です.
# gstripe status Name Status Components stripe/stripe0 UP da1 da2
gstripe list コマンドで詳細を表示する事ができます.
da1, da2 が 100GB のディスクでこれを RAID0 でストライピングしている為,stripe0 は 200G となっています.
# gstripe list Geom name: stripe0 State: UP Status: Total=2, Online=2 Type: MANUAL Stripesize: 65536 ID: 2870193427 Providers: 1. Name: stripe/stripe0 Mediasize: 214748364800 (200G) Sectorsize: 512 Stripesize: 65536 Stripeoffset: 0 Mode: r0w0e0 Consumers: 1. Name: da1 Mediasize: 107374182400 (100G) Sectorsize: 512 Mode: r0w0e0 Number: 0 2. Name: da2 Mediasize: 107374182400 (100G) Sectorsize: 512 Mode: r0w0e0 Number: 1
newfs でファイルシステムを作成します.指定するデバイスは GEOM STRIPE の場合は /dev/stripe 以下に指定した名前のデバイスファイルが作成されますので,これを指定します.
今回は create の際に stripe0 を名前としたため,/dev/stripe/stripe0 がデバイスファイルとなります.
# newfs /dev/stripe/stripe0 /dev/stripe/stripe0: 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/stripe/stripe0 /mnt # df Filesystem 1K-blocks Used Avail Capacity Mounted on /dev/da0p2 19279260 2582452 15154468 15% / devfs 1 1 0 100% /dev /dev/stripe/stripe0 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/stripe/stripe0 /mnt ufs rw 1 1
残念な事に (想定どおりです),デバイスが無く起動途中に失敗してしまっています.
これは create で作成した為,ディスクに GEOM STRIPE の情報が記録されてい為作成したデバイスが存在しておらず,この状態となります.
![](https://www.seichan.org/blog/wp-content/uploads/2023/12/SnapCrab_bsd13seichanlocal-VMware-Workstation_2023-12-1_19-0-52_No-00.png)
恒久的に使う場合は label を利用しよう
先ほどと変わって create ではなく label で stripe0 を作成しました.
# gstripe label stripe0 da1 da2
同じディスクを同じように指定している為,status および list の結果は先ほどと変わりません.
また,create で作成した際に newfs していますが,再作成の際にディスク連結順番に変更を入れていませんのでファイルシステムとしては正しく生成された状態となっていますのでこのままマウントさせる事も可能です.
# gstripe status stripe0 Name Status Components stripe/stripe0 UP da1 da2 # gstripe list stripe0 Geom name: stripe0 State: UP Status: Total=2, Online=2 Type: AUTOMATIC Stripesize: 65536 ID: 2858675290 Providers: 1. Name: stripe/stripe0 Mediasize: 214748233728 (200G) Sectorsize: 512 Stripesize: 65536 Stripeoffset: 0 Mode: r1w1e1 Consumers: 1. Name: da1 Mediasize: 107374182400 (100G) Sectorsize: 512 Mode: r1w1e2 Number: 0 2. Name: da2 Mediasize: 107374182400 (100G) Sectorsize: 512 Mode: r1w1e2 Number: 1
ですので,create と label を間違った… という場合でも正しくコマンドを発行してあげる事で今までの状態を復元できますので,データがなくなってしまった.という事は起きませんので安心してください.
いずれにせよ… label で作成しましょう.が教訓となりますが…
# mount /dev/stripe/stripe0 /mnt # df Filesystem 1K-blocks Used Avail Capacity Mounted on /dev/da0p2 19279260 2582484 15154436 15% / devfs 1 1 0 100% /dev /dev/stripe/stripe0 203123608 8 186873712 0% /mnt
IOについて確認してみる
コンカチと違い RAID0 でのストライピングですので分散して書き込みが行われます.実際にどの様な IO が発生しているのかを確認してみます.
dd でランダムデータを生成,random.img としてファイル書き込みの IO を発生させました.
見て頂くと分かる通り da1 と da2 の両方に IO がかかっています.
このことから,分散してのディスクの読み書きが行われる事が分かります.
# 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 1 89 18.3 5 0.1 60.0 10 0.6 61.6 10 0.6 0 0 1 0 99 0 228 13.3 1 0.0 62.7 832 50.9 62.1 863 52.4 2 0 38 2 59 0 163 0.0 0 0.0 64.0 77 4.8 56.9 90 5.0 0 0 4 0 96 0 80 0.0 0 0.0 64.0 422 26.4 59.6 425 24.7 1 0 21 1 78 0 73 0.0 0 0.0 61.1 549 32.8 64.0 552 34.5 1 0 25 2 72 0 83 0.0 0 0.0 60.9 852 50.7 64.0 793 49.5 4 0 37 1 58 # ls /mnt .snap random.img
イメージとしてはこのような形ですね.
![](https://www.seichan.org/blog/wp-content/uploads/2023/12/image-4.png)
ディスクを拡張する
結論から先に.GEOM STRIPE によるディスクの拡張(追加)は不可能です.
GEOM CONCAT と同様のオペレーションは完了するのですが,growfs した後におかしくなります.
当然ですが,再作成であれば問題ありません.
GEOM STRIPE デバイスを終了 (破壊) する
ファイルシステムとして用済みになった.であったり,別用途に転用する為に初期化したい場合を説明します.
当然ながら,ファイルシステムはアンマウントする必要があります.
また,完全に終了 (停止・破壊) する場合は stop ではなく destroy を利用します.
# umount /mnt # gstripe destroy stripe0 # gstripe list
もし間違って destory を実行してしまった場合ですが,これだけのオペレーションの場合だとラベル情報がなくなっただけなので,再度 label を同じ引数で渡すことで復活させる事が可能です.
やらかしてしまった… という事案の場合は慌てずにそっと元に戻しましょう.
# gstripe label stripe0 da1 da2 # mount /dev/stripe/stripe0 /mnt # df Filesystem 1K-blocks Used Avail Capacity Mounted on /dev/da0p2 19279260 2582504 15154416 15% / devfs 1 1 0 100% /dev /dev/stripe/stripe0 203123480 139048 186734556 0% /mnt # ls /mnt .snap random.img
以上で GEOM STRIPE によるストライピング (RAID0) のやり方についての解説を終了します.
コメント