2024年7月8日 追記
2024年2月22日 追記
2024年1月25日 記
2024/7/8日 追記分
ここではラズパイ5+USB SSD×2個を使ったRAID0 ドライブの作成の仕方をご紹介していますが、 実は改めてラズパイ5+SATA HDD (6TB)×2台を使ったRAID0 ドライブを作成してみました。 で、下記の内容にはいくつかの【正しくない情報】や【不足している情報】が含まれていると判断し、 記事を書き直しました。ですので、このページの記事の内容は【参考】程度にして、 新しく書き直した方のページをご参照頂けますようよろしくお願い致します。
ラズパイ5を購入して手持ちであったUSB3.2Gen2(10Gbpsなので3.1Gen2が正しいのかもしれませんが、
製品にそのように表示されているのでそのように記述することにします)のSSDを取り付けたのですが、
容量が250GBしかないのでもう少し増やしたい・・・、
更に出来ればもっと高速アクセスできるようにしたい・・・、
と思いました。でも手持ちのお金も沢山は無いので・・・というわけで妥協したところが、
USB3.2Gen2 1TB × 2 でRAID0を構成し、2TBのストレージを作ろう!ということになりました。
ちなみにUSB3.0や3.1ではなくてUSB3.2Gen2のSSDを選択した理由ですが、
価格的にUSB3.0とかのものと大差ないので、今後の事も考えてより高速転送が期待できるものとして選びました。
・・・というわけで、ここではラズパイ5とUSB SSDを2つを使用してRAID0のストレージを作ります。
なお、RAID0を構成するためのUSB SSDは同じメーカーの同じ型番の製品を新品で購入した物を用意しました。
目次
追記です
(1)ハードウェア構成
(2)デバイスファイル
(3)パーティション解放
(4)パーティション作成
(5)RAID0作成
(6)ファイルシステムを構築する
(7)SSDのデバイス名を固定する
(8)RAID0ストレージを確認
(9)RAIDデバイスのマウント
(10)最後に
2024年2月22日 追記分
追記です
何の追記かと申しますと、USBハブとRAID0を構成しているUSB SSDの取り付け方を変えたらRAID0を構成する前に期待していたような結果を得られました。 ...ということです。 ラズパイ5のUSB3.0ポートはそれぞれ(同時に)5Gbpsの転送速度があることを「ふっと」思い出しまして 「パラに接続すれば速くなるんじゃね!?」とか思ってしまい、やってみたところ上手くいった感じです。
ラズパイ5のUSB3.0は仕様通りMAX 5Gbpsですが、同じUSBハブと同じケーブルを2セット用意してラズパイ5に繋ぎ、 それぞれのUSBハブの同じ位置にRAID0を構成するUSB SSDを取り付けたところ、 シーケンシャルアクセスに関しては最大1.8倍くらいのアクセス速度に達しました。
つい嬉しくなってしまい、本ページを更新することにしました。 使用したUSBハブはAmazonで購入しました。 ORICO USBハブ USB3.2 4ポート 10Gbps高速転送 セルフパワー/バスパワー両対応 50cmケーブルと変換アダプタ付き という物です。ちなみにこのUSBハブの耐久性がどれくらいかはまだ分かりません(使い始めたばかりなので...)。
もし試してみる場合には、USB3.2 Gen2 (10Gbps以上)と表示されているものをご使用ください。 また、使用するUSBハブ、USB SSD、ラズパイ5までのケーブル(とケーブル長)は同じものをご用意ください。 でないと酷い結果になるかと思います(実際、私はなりました)。 それと【しつこい】ですが、ご自身の責任で試してみてくださいね。 私は一切の責任を負いません(負えません)。
では、実行したベンチマークテストの結果です。
ご参考までに起動用SSD(仕様的にはRAID0構成しているUSB SSDと同等のもの)の結果も掲載しておきます。
旧・構成のベンチマークテスト結果
□hdparmコマンド
◆起動用ssd
root@raspi5:/home/muroi/benchmark/diskspd-for-linux# hdparm -tT /dev/sdb2
/dev/sdb2:
Timing cached reads: 4470 MB in 2.00 seconds = 2235.29 MB/sec
Timing buffered disk reads: 864 MB in 3.00 seconds = 287.87 MB/sec
root@raspi5:/home/muroi/benchmark/diskspd-for-linux#
◆raid0 ssd
root@raspi5:/home/muroi/benchmark/diskspd-for-linux# hdparm -tT /dev/md0
/dev/md0:
Timing cached reads: 4044 MB in 2.00 seconds = 2021.90 MB/sec
Timing buffered disk reads: 1020 MB in 3.00 seconds = 339.61 MB/sec
root@raspi5:/home/muroi/benchmark/diskspd-for-linux#
□diskspd
◆起動用ssd
root@raspi5:/home/muroi/benchmark/diskspd-for-linux# ./DiskMark-linux_local.sh ./testdata 2>&1 > ./diskspd_SG.log
root@raspi5:/home/muroi/benchmark/diskspd-for-linux# cat ./diskspd_SG.log | awk '/^Executing/ {printf "%s%s%s\t",$3,$4,$5} /^Total IO$/ {getline;getline;getline; print $7 }'
Read(SEQ1MQ8T1)... 357.40
Read(SEQ1MQ1T1)... 342.40
Read(RND4KQ32T1)... 58.31
Read(RND4KQ1T1)... 15.25
Write(SEQ1MQ8T1)... 237.20
Write(SEQ1MQ1T1)... 231.00
Write(RND4KQ32T1)... 26.97
Write(RND4KQ1T1)... 26.86
root@raspi5:/home/muroi/benchmark/diskspd-for-linux#
◆raid0 ssd
root@raspi5:/home/muroi/benchmark/diskspd-for-linux# ./DiskMark-linux_local.sh /media/ssd/pict/testdata 2>&1 > ./diskspd_SG.log
root@raspi5:/home/muroi/benchmark/diskspd-for-linux# cat ./diskspd_SG.log | awk '/^Executing/ {printf "%s%s%s\t",$3,$4,$5} /^Total IO$/ {getline;getline;getline; print $7 }'
Read(SEQ1MQ8T1)... 340.60
Read(SEQ1MQ1T1)... 322.00
Read(RND4KQ32T1)... 192.55
Read(RND4KQ1T1)... 21.55
Write(SEQ1MQ8T1)... 344.60
Write(SEQ1MQ1T1)... 350.00
Write(RND4KQ32T1)... 35.64
Write(RND4KQ1T1)... 40.91
root@raspi5:/home/muroi/benchmark/diskspd-for-linux#
新・構成のベンチマークテスト結果
□hdparm
◆起動用ssd
root@raspi5:/home/muroi/benchmark/diskspd-for-linux# hdparm -tT /dev/sdb2
/dev/sdb2:
Timing cached reads: 4042 MB in 2.00 seconds = 2021.05 MB/sec
Timing buffered disk reads: 902 MB in 3.00 seconds = 300.28 MB/sec
root@raspi5:/home/muroi/benchmark/diskspd-for-linux#
◆raid0 ssd
root@raspi5:/home/muroi/benchmark/diskspd-for-linux# hdparm -tT /dev/md0
/dev/md0:
Timing cached reads: 3798 MB in 2.00 seconds = 1899.03 MB/sec
Timing buffered disk reads: 1878 MB in 3.00 seconds = 625.43 MB/sec
root@raspi5:/home/muroi/benchmark/diskspd-for-linux#
□diskspd
◆起動用ssd
root@raspi5:/home/muroi/benchmark/diskspd-for-linux# ./DiskMark-linux_local.sh ./testdata 2>&1 > ./diskspd_SG.log
root@raspi5:/home/muroi/benchmark/diskspd-for-linux# cat ./diskspd_SG.log | awk '/^Executing/ {printf "%s%s%s\t",$3,$4,$5} /^Total IO$/ {getline;getline;getline; print $7 }'
Read(SEQ1MQ8T1)... 357.00
Read(SEQ1MQ1T1)... 342.80
Read(RND4KQ32T1)... 57.82
Read(RND4KQ1T1)... 15.25
Write(SEQ1MQ8T1)... 237.60
Write(SEQ1MQ1T1)... 232.00
Write(RND4KQ32T1)... 26.95
Write(RND4KQ1T1)... 26.63
root@raspi5:/home/muroi/benchmark/diskspd-for-linux#
◆raid0 ssd
root@raspi5:/home/muroi/benchmark/diskspd-for-linux# ./DiskMark-linux_local.sh /media/ssd/pict/testdata 2>&1 > ./diskspd_SG.log
root@raspi5:/home/muroi/benchmark/diskspd-for-linux# cat ./diskspd_SG.log | awk '/^Executing/ {printf "%s%s%s\t",$3,$4,$5} /^Total IO$/ {getline;getline;getline; print $7 }'
Read(SEQ1MQ8T1)... 628.60
Read(SEQ1MQ1T1)... 569.80
Read(RND4KQ32T1)... 169.22
Read(RND4KQ1T1)... 21.82
Write(SEQ1MQ8T1)... 472.00
Write(SEQ1MQ1T1)... 477.80
Write(RND4KQ32T1)... 34.28
Write(RND4KQ1T1)... 42.81
root@raspi5:/home/muroi/benchmark/diskspd-for-linux#
□fioコマンド (別のコマンドでは「どうか?」と思い、やってみました)
◆起動用ssd
root@raspi5:/home/muroi/benchmark/fio# fio --directory=./ fio_setting.txt --output-format=terse | awk -F ';' '{print $3, ($7+$48) / 1000 }'
SEQ1M_Q8T1_READ 367.405
SEQ1M_Q8T1_WRITE 249.72
SEQ1M_Q1T1_READ 349.758
SEQ1M_Q1T1_WRITE 236.859
RND4K_Q32T1_READ 60.224
RND4K_Q32T1_WRITE 36.434
RND4K_Q1T1_READ 16.385
RND4K_Q1T1_WRITE 25.57
root@raspi5:/home/muroi/benchmark/fio#
◆raid0 ssd
root@raspi5:/home/muroi/benchmark/fio# fio --directory=/media/ssd/pict/ fio_setting.txt --output-format=terse | awk -F ';' '{print $3, ($7+$48) / 1000 }'
SEQ1M_Q8T1_READ 643.298
SEQ1M_Q8T1_WRITE 537.455
SEQ1M_Q1T1_READ 586.78
SEQ1M_Q1T1_WRITE 497.899
RND4K_Q32T1_READ 284.552
RND4K_Q32T1_WRITE 138.682
RND4K_Q1T1_READ 17.177
RND4K_Q1T1_WRITE 41.822
root@raspi5:/home/muroi/benchmark/fio#
上記コマンドで使用したスクリプトと設定ファイルも掲載しておきます。
DiskMark-linux_local.sh
#! /bin/bash # This script is derived from CrystalDiskMark # (https://crystalmark.info/ja/software/crystaldiskmark/) DISKSPD="diskspd" TEST_FILE=$1 INTERVAL_TIME=5 dm_interval() { echo "Wait for the next test for $INTERVAL_TIME seconds..." sleep $INTERVAL_TIME } echo "Executing Sequential Read (SEQ1M Q8T1)..." # TODO: Create test file manually for better randomization and less effect on the performance. ${DISKSPD} -c1G -Zr -b1M -d5 -o8 -t1 -W0 -Sd -w0 -L $1 dm_interval echo "Executing Sequential Read (SEQ1M Q1T1)..." ${DISKSPD} -Zr -b1M -d5 -o1 -t1 -W0 -Sd -w0 -L $1 dm_interval echo "Executing Random Read (RND4K Q32T1)..." ${DISKSPD} -Zr -b4K -d5 -o32 -t1 -W0 -Sd -w0 -L -r $1 dm_interval echo "Executing Random Read (RND4K Q1T1)..." ${DISKSPD} -Zr -b4K -d5 -o1 -t1 -W0 -Sd -w0 -L -r $1 dm_interval echo "Executing Sequential Write (SEQ1M Q8T1)..." ${DISKSPD} -Zr -b1M -d5 -o8 -t1 -W0 -Sd -w100 -L $1 dm_interval echo "Executing Sequential Write (SEQ1M Q1T1)..." ${DISKSPD} -Zr -b1M -d5 -o1 -t1 -W0 -Sd -w100 -L $1 dm_interval echo "Executing Random Write (RND4K Q32T1)..." ${DISKSPD} -Zr -b4K -d5 -o32 -t1 -W0 -Sd -w100 -L -r $1 dm_interval echo "Executing Random Write (RND4K Q1T1)..." ${DISKSPD} -Zr -b4K -d5 -o1 -t1 -W0 -Sd -w100 -L -r $1 dm_interval rm -f $TEST_FILE echo "DiskMark is completed!"
fio_setting.txt
[global] ioengine=libaio size=1g direct=1 runtime=60 stonewall [SEQ1M_Q8T1_READ] rw=read bs=1m iodepth=8 numjobs=1 [SEQ1M_Q8T1_WRITE] rw=write bs=1m iodepth=8 numjobs=1 [SEQ1M_Q1T1_READ] rw=read bs=1m iodepth=1 numjobs=1 [SEQ1M_Q1T1_WRITE] rw=write bs=1m iodepth=1 numjobs=1 [RND4K_Q32T1_READ] rw=randread bs=4k iodepth=32 numjobs=1 [RND4K_Q32T1_WRITE] rw=randwrite bs=4k iodepth=32 numjobs=1 [RND4K_Q1T1_READ] rw=randread bs=4k iodepth=1 numjobs=1 [RND4K_Q1T1_WRITE] rw=randwrite bs=4k iodepth=1 numjobs=1
私の感想としては、結果的にはソフトウェアRAID0構成にして良かったと思います。
ハードウェアでRAID0を構成した場合だと(少なくともラズパイ5のUSB3.0ポート接続では)このような結果は期待できないと思います。
ソフトウェアRAIDなので少しCPUに負荷を掛けることになりますが、それ以上のパフォーマンスを得ることができたのではないかと思います。
なおDiskMark-linux_local.shとfio_setting.txtは、
どこかのサイトに掲載されていたものを参考にさせて頂きました(いや、そのままコピーしたかもしれません)。
利用させて頂いた上に(勝手に)掲載させて頂きました。
大変助かっております。
ありがとうございました。
(1)ハードウェア構成
最初のハードウェア構成として、
ラズパイ5のUSB3.0ポートにUSB3.0ハブ(セルフパワー)を付けてそこへ起動用SSD、
WiFi6 子機、RAID0用SSD 2個を取り付けました。
最初に結論を簡単に申し上げておきます。
上記構成だとパフォーマンスは起動用SSDに敵いませんでした。
ソフトウェアRAIDだと余計な処理が入るためです。
更にたちが悪いことに「プチフリ」も発生してしまい、とても使う気にはなれないような代物になってしまいました。
で、どうしたかと言いますととりあえずUSB3.0(バスパワー)のハブをもう1つあるポートへ接続し、
そこにRAID用のSSDだけを取り付けてみました。
すると「プチフリ」はおさまりましたがパフォーマンスは悪いままでした。
そこで次は【USB3.2Gen2のハブに取り換えれば少しは改善するかもしれない】と思いまして
ダメ元でUSB3.2Gen2のハブを購入して取り付けてみました。
するとランダムアクセスのパフォーマンスが大きく向上しました(「起動用SSDと比較しても」です)。
シーケンシャルアクセスは起動用SSDより若干悪い(1割くらい)程度に収まりました。
現実的にはランダムアクセス(サイズの小さなファイルへのアクセス)の方が頻繁に発生すると思いますし、
シーケンシャルアクセスも1割程度ダウンする程度なので、
起動用SSDよりもソフトウェアRAID0構成のSSDの方が良いのでは!?と思います。
・・・というわけで、とりあえず使い物になる状態にはなりましたので
使っていこうと思います。
ちなみに・・・ですが、安いものであれば(販売価格が)1万円前後程度でハードウェアRAIDを構成できるものが売っているようですので
「ソフトウェアRAIDに興味がある」とか
「できるだけ安くRAIDを構成したい」とかいうのでなければそちらを導入した方が賢明だと思います。
※打ち消し線を引いた理由については、追記ですをご参照ください。
(2)デバイスファイル
※始めに(重要です)
これからの作業をする前にRAID0を構成するSSDに番号を振るなどしてどっちのSSDかが分かるようにしておいてください。
最初はRAIDを構成するSSDを外した状態でラズパイを起動します。
起動したらデバイスファイルの情報を取得します。
$ sudo su # ls /dev/sd*上記 ls コマンドを実行した結果、私の環境では下記のようになりました。
# ls /dev/sd* /dev/sda /dev/sda1 /dev/sda2/dev/sdaというのが起動用SSDのデバイスファイルです。 /dev/sda1と/dev/sda2 というのが起動用SSDのパーティションのようです(ごめんなさい、私まだLinux詳しくないので・・・)。
次にRAID用のSSDを1つだけ取り付けて同コマンドを実行してみました。
# ls /dev/sd* /dev/sda /dev/sda1 /dev/sda2 /dev/sdb /dev/sdb1 /dev/sdb2/dev/sdbというデバイスファイルが増えました。
更に続けてRAID用のSSDをもう1つ取り付けて同コマンドを実行してみました。
# ls /dev/sd* /dev/sda /dev/sda1 /dev/sda2 /dev/sdb /dev/sdb1 /dev/sdb2 /dev/sdc /dev/sdc1 /dev/sdc2/dev/sdcというデバイスファイルが増えました。 Linuxの場合、ストレージのデバイスファイルは/dev/sd?の ?は、 aから認識した順にb,c,・・・となるようです。
ただ注意しなければならないことが1つあります。 それはハードウェア構成が変わらなくてもLinuxは【起動するたびにデバイスを認識する順番が異なることがある】ということです。 つまり今回は/dev/sdbが(仮に)1番のSSDだったとしても、 次回起動したときには/dev/sdbが2番のSSDになっていることがある、ということです。
(3)パーティション解放
私が購入したSSDはパーティションが2つありまして、最初に解放する必要がありました。
(すでにパーティションを解放してあるSSDをご使用の場合には、この項目を読み飛ばしてください。)
パーティションの解放(フォーマットも)は fdisk コマンドで行います。
fdisk コマンドに対象となるデバイスのデバイスファイルを指定します。
# fdisk /dev/sdb Welcome to fdisk (util-linux 2.38.1). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. This disk is currently in use - repartitioning is probably a bad idea. It's recommended to umount all file systems, and swapoff all swap partitions on this disk.続いて【p】コマンドを実行して現在のパーティションを確認します。
Command (m for help): p Disk /dev/sdb: 931.51 GiB, 1000204886016 bytes, 1953525168 sectors Disk model: SSPS-US Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 4096 bytes / 4096 bytes Disklabel type: gpt Disk identifier: D6F632E7-C388-4F75-A02B-06C1E1ACE28E Device Start End Sectors Size Type /dev/sdb1 34 32767 32734 16M Microsoft reserved /dev/sdb2 32768 1953523711 1953490944 931.5G Microsoft basic data Partition 1 does not start on physical sector boundary.
(下記のように) パーティションを解放するため【d】コマンドを入力します。
(パーティションが2つあるので)2番(defaultとなっている方)を指定して(defaultが2番となっているので単にEnterキーを押すだけでも大丈夫だと思います)解放します。
続けてもう1度【d】コマンドを実行しました。
Command (m for help): d Partition number (1,2, default 2): 2 Partition 2 has been deleted. Command (m for help): d Selected partition 1 Partition 1 has been deleted. Command (m for help):上記の操作をもう1つあるSSD(/dev/sdc)にも行います。
パーティションを解放したらシャットダウンして電源をOFFにした後、
RAID0を構成するSSDを一旦外してから 起動(電源ON)してください。
# shutdown now
再起動後、
SSDを1つずつ取り付けて対応するデバイスファイルを確認してください。
(4)パーティション作成
(3)でパーティションを解放したら、改めてパーティションを確保&フォーマットを行います。 流れとしては下記のようになります。
- 【n】コマンドでパーティションを確保します。
- 【t】コマンドでパーティションタイプを設定します。
- 【w】コマンドでパーティションテーブルを書き込みます。
では、パーティション確保&フォーマットをしましょう。
※ここでは2つあるSSDのうち(仮に)1番のSSDを /dev/sdb、2番のSSDを /dev/sdc として話を進めます。
ご自身の環境に合わせて適切に変えてください。
sudo su と fdisk /dev/sdb を実行して、続けて fdisk の【n】コマンドを実行します。
パーティション番号を聞かれるので、デフォルトの 1 を入力します。
以降、2つ 質問されますがデフォルトで大丈夫(赤色の部分の数値が両方のSSDで同じ値であることを確認してください)ですので Enter キーを押しましょう。
上手くいけば(下記のように)新しいパーティションが作成されます。
# sudo su # fdisk /dev/sdb Welcome to fdisk (util-linux 2.38.1). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. This disk is currently in use - repartitioning is probably a bad idea. It's recommended to umount all file systems, and swapoff all swap partitions on this disk. Command (m for help): n Partition number (1-128, default 1): 1 First sector (34-1953525134, default 2048): ← コレ! Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-1953525134, default 1953523711): ← コレ! Created a new partition 1 of type 'Linux filesystem' and of size 931.5 GiB. Command (m for help):
(下の t コマンドを実行している様子の部分を参照しながらご覧ください)。
続いて【t】コマンドを実行してパーティションタイプをRAIDに設定します。
とりあえず(下のように)【t】コマンドを実行してみてください。
すると「パーティションタイプ」の一覧が表示されます。
42番にRAIDのパーティションタイプがありました。
(下には42番は含まれていません。ごめんなさい、飛ばしてしまいました)。
で、入力する必要があるのは【42番】という番号ではなくて、右側に表示されている【記号】です。
Partition type or alias (type L to list all):
のところに(下記のように)【記号】を入力(コピペ)してEnterキーを押してください。
Command (m for help):t ・・・・ 167 Solaris reserved 5 6A8D2AC7-1DD2-11B2-99A6-080020736631 168 NetBSD swap 49F48D32-B10E-11DC-B99B-0019D1879648 169 NetBSD FFS 49F48D5A-B10E-11DC-B99B-0019D1879648 170 NetBSD LFS 49F48D82-B10E-11DC-B99B-0019D1879648 171 NetBSD concatenated 2DB519C4-B10F-11DC-B99B-0019D1879648 172 NetBSD encrypted 2DB519EC-B10F-11DC-B99B-0019D1879648 173 NetBSD RAID 49F48DAA-B10E-11DC-B99B-0019D1879648 174 ChromeOS kernel FE3A2A5D-4F32-41A7-B725-ACCC3285A309 175 ChromeOS root fs 3CB8E202-3B7E-47DD-8A3C-7FF2A13CFCEC 176 ChromeOS reserved 2E0A753D-9E48-43B0-8337-B15192CB1B5E 177 MidnightBSD data 85D5E45A-237C-11E1-B4B3-E89A8F7FC3A7 178 MidnightBSD boot 85D5E45E-237C-11E1-B4B3-E89A8F7FC3A7 179 MidnightBSD swap 85D5E45B-237C-11E1-B4B3-E89A8F7FC3A7 180 MidnightBSD UFS 0394EF8B-237E-11E1-B4B3-E89A8F7FC3A7 181 MidnightBSD ZFS 85D5E45D-237C-11E1-B4B3-E89A8F7FC3A7 182 MidnightBSD Vinum 85D5E45C-237C-11E1-B4B3-E89A8F7FC3A7 183 Ceph Journal 45B0969E-9B03-4F30-B4C6-B4B80CEFF106 184 Ceph Encrypted Journal 45B0969E-9B03-4F30-B4C6-5EC00CEFF106 185 Ceph OSD 4FBD7E29-9D25-41B8-AFD0-062C0CEFF05D 186 Ceph crypt OSD 4FBD7E29-9D25-41B8-AFD0-5EC00CEFF05D 187 Ceph disk in creation 89C57F98-2FE5-4DC0-89C1-F3AD0CEFF2BE 188 Ceph crypt disk in creation 89C57F98-2FE5-4DC0-89C1-5EC00CEFF2BE 189 VMware VMFS AA31E02A-400F-11DB-9590-000C2911D1B8 190 VMware Diagnostic 9D275380-40AD-11DB-BF97-000C2911D1B8 191 VMware Virtual SAN 381CFCCC-7288-11E0-92EE-000C2911D0B2 192 VMware Virsto 77719A0C-A4A0-11E3-A47E-000C29745A24 193 VMware Reserved 9198EFFC-31C0-11DB-8F78-000C2911D1B8 194 OpenBSD data 824CC7A0-36A8-11E3-890A-952519AD3F61 195 QNX6 file system CEF5A9AD-73BC-4601-89F3-CDEEEEE321A1 196 Plan 9 partition C91818F9-8025-47AF-89D2-F030D7000C2C 197 HiFive FSBL 5B193300-FC78-40CD-8002-E86C45580B47 198 HiFive BBL 2E54B353-1271-4842-806F-E436D6AF6985 199 Haiku BFS 42465331-3BA3-10F1-802A-4861696B7521 200 Marvell Armada 3700 Boot partition 6828311A-BA55-42A4-BCDE-A89BB5EDECAE Aliases: linux - 0FC63DAF-8483-4772-8E79-3D69D8477DE4 swap - 0657FD6D-A4AB-43C4-84E5-0933C84B4F4F home - 933AC7E1-2EB4-4F13-B844-0E14E2AEF915 uefi - C12A7328-F81F-11D2-BA4B-00A0C93EC93B raid - A19D880F-05FC-4D3B-A006-743F0F84911E ← 42番のLinux RAIDと同じ! lvm - E6D6D379-F507-44C2-A23C-238F2A3DF928 Partition type or alias (type L to list all):A19D880F-05FC-4D3B-A006-743F0F84911E ← RAIDの【記号】を入力! Changed type of partition 'Linux RAID' to 'Linux RAID'. ← (私が)2度実行してしまったので 'Linux RAID' to 'Linux RAID' になっています! Command (m for help):
【w】コマンドを実行してパーティションタイプテーブルを書き込みます。
Command (m for help): w The partition table has been altered. Calling ioctl() to re-read partition table. Syncing disks.
上記のようになればOKです。
これをもうひとつのSSDにも同様に実行してパーティションを作成します。
(5))RAID0作成
※以下の作業を始める前に、一度シャットダウンして/dev/sdbが1番のSSD、/dev/sdcが2番のSSDになるようにしました。 ちなみに/dev/sdaは(無関係の)起動用SSD(256GB)です。また、以下の作業をする前に【再起動】する必要があるようです!
・・・というわけで、一旦シャットダウン(電源OFF)してSSDを外し、起動(電源ON)してください。
# shutdown now
デバイスファイルは下のようになっているものとして以降、話を進めます。
ご自身の環境に合わせて適切に読み替えてください。
$ sudo su # ls /dev/sd* /dev/sda /dev/sda1 /dev/sda2 /dev/sdb /dev/sdb1 /dev/sdc /dev/sdc1 ・・・ /dev/sda ← 起動用SSD /dev/sdb ← 1番のSSD /dev/sdc ← 2番のSSD
ソフトウェアRAIDの mdadm をインストールします。
# apt install mdadm
続けて下記コマンドを実行して RAID0 ストレージを作成します。
# mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sdb1 /dev/sdc1
ちなみに RAID1 を作成したいときは --level=1 にすればOKです。
コマンドを実行した結果は下記のようになります。
# mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sdb1 /dev/sdc1 mdadm: Defaulting to version 1.2 metadata mdadm: array /dev/md0 started.
RAIDストレージが作られたかを確認します。
# cat /proc/mdstat
上記コマンドを実行して下記のような感じになっていればOKです。
# cat /proc/mdstat Personalities : [raid0] md0 : active raid0 sdc1[1] sdb1[0] 1953257472 blocks super 1.2 512k chunks unused devices:
md0 が作成されているのを確認した後に、/etc/mdadm/mdadm.conf に設定情報を書き込みます。
(mdadm --create で作成された情報は再起動すると消えてしまいます。)
# mdadm --detail --scan >> /etc/mdadm/mdadm.conf
上記コマンドの実行結果を確認します。
# cat /etc/mdadm/mdadm.conf
上記コマンドを実行して、(ファイルの)最後に下記のような1行があれば大丈夫のようです。
なお、【ホスト名(ここではraspi5)】が入っているので、今後【ホスト名】は変更しない方が良いのかもしれません。
ARRAY /dev/md0 metadata=1.2 name=raspi5:0 UUID=978e955f:72133f5f:fd8ef3d4:659de231
(6)ファイルシステムを構築する
作成したRAIDデバイス /dev/md0 に対してLinuxファイルシステムを構築します。
下記コマンドを実行して ext4 フォーマットを施します。
# mkfs -t ext4 /dev/md0
上記コマンドを実行した結果です。
# mkfs -t ext4 /dev/md0 mke2fs 1.47.0 (5-Feb-2023) Creating filesystem with 488314368 4k blocks and 122085376 inodes Filesystem UUID: 6cadc340-5d5f-4134-a726-7dc60a292256 Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 102400000, 214990848 Allocating group tables: done Writing inode tables: done Creating journal (262144 blocks): done Writing superblocks and filesystem accounting information: done
(7)USB SSDのデバイス名を固定する
USB SSDのデバイス名は認識された順に /dev/sda, /dev/sdb と自動で割り当てられてしまうため、
Raspberry Piを再起動した後に RAID が崩れる危険性があります。
そのため、各SSDデバイス名を固定するようにします。
USB SSDのデバイス情報を取得します。
udevadmコマンドでUSB SSDのデバイス情報を取得します。
まずは1番のUSB SSD情報を取得します。
# udevadm info -a -n /dev/sdb Udevadm info starts with the device specified by the devpath and then walks up the chain of parent devices. It prints for every device found, all possible attributes in the udev rules key format. A rule to match, can be composed by the attributes of the device and the attributes from one single parent device. looking at parent device '/devices/platform/axi/1000120000.pcie/1f00300000.usb/xhci-hcd.1/usb4/4-1/4-1.3': KERNELS=="4-1.3" SUBSYSTEMS=="usb" ← "usb"のところをご覧ください。 DRIVERS=="usb" ATTRS{authorized}=="1" ~~ 省略 ~~ ATTRS{product}=="I-O DATA SSPS-US" ATTRS{quirks}=="0x0" ATTRS{removable}=="unknown" ATTRS{remove}=="(not readable)" ATTRS{rx_lanes}=="1" ATTRS{serial}=="234120019532" ~~ 省略 ~~
●1番のUSB SSDの情報
ATTRS{product}=="I-O DATA SSPS-US"
ATTRS{serial}=="234120019532"
同様にして、2番のUSB SSDの情報も取得してください。
●2番のUSB SSDの情報
ATTRS{product}=="I-O DATA SSPS-US"
ATTRS{serial}=="234120009786"
シリアル番号 ATTRS{serial} と製品名 ATTRS{product} を組み合わせれば、
それぞれのUSB SSDを一意に特定できそうです。
・・・というわけで、
USB SSDのデバイス名の割り当てですが、
1番のUSB SSD → /dev/raid_01_001
2番のUSB SSD → /dev/raid_01_002
に割り当てるように、ファイル
/etc/udev/rules.d/mdadmcheck.sh と、
/etc/udev/rules.d/10-local.rules を作成します。
# vi /etc/udev/rules.d/mdadmcheck.sh
mdadmcheck.sh
#!/bin/bash if [ $# -ne 2 ]; then echo "Argument Error $#" 1&2 exit 1 fi DEVICE_COUNT=`ls $(echo $1) | wc -l` echo $DEVICE_COUNT if [[ ${DEVICE_COUNT} -eq $2 ]]; then echo 'OK' mdadm --assemble --scan fi exit 0
下記コマンドを実行して作成したファイル(スクリプト)に実行権限を付けます。
# chmod a+x /etc/udev/rules.d/mdadmcheck.sh
続いて /etc/udev/rules.d/10-local.rules を作成します。
# vi /etc/udev/rules.d/10-local.rules
/etc/udev/rules.d/10-local.rules
ACTION=="add" SUBSYSTEMS=="usb", ATTRS{product}=="I-O DATA SSPS-US", ATTRS{serial}=="234120019532", SYMLINK="raid_01_001%n" RUN+="/etc/udev/rules.d/mdadmcheck.sh '/dev/raid_01_00[1234]1' 4" ACTION=="add" SUBSYSTEMS=="usb", ATTRS{product}=="I-O DATA SSPS-US", ATTRS{serial}=="234120009786", SYMLINK="raid_01_002%n" RUN+="/etc/udev/rules.d/mdadmcheck.sh '/dev/raid_01_00[1234]1' 4"
ファイルを作成し終わったら再起動します。
# reboot
(8)RAID0ストレージを確認
下記コマンドを事項して確認します。
$ ls -l /dev/raid*
実際に実行した結果が下記です。
$ ls -l /dev/raid* lrwxrwxrwx 1 root root 3 1月 17 20:23 /dev/raid_01_001 -> sda lrwxrwxrwx 1 root root 3 1月 17 20:23 /dev/raid_01_0010 -> sg0 lrwxrwxrwx 1 root root 4 1月 17 20:23 /dev/raid_01_0011 -> sda1 lrwxrwxrwx 1 root root 3 1月 17 20:23 /dev/raid_01_002 -> sdb lrwxrwxrwx 1 root root 11 1月 17 20:23 /dev/raid_01_0020 -> bsg/1:0:0:0 lrwxrwxrwx 1 root root 4 1月 17 20:23 /dev/raid_01_0021 -> sdb1 lrwxrwxrwx 1 root root 15 1月 17 20:23 /dev/raid_01_0022 -> bus/usb/002/004
下記コマンドで、もう一度確認します。
$ sudo su # cat /proc/mdstat
# cat /proc/mdstat Personalities : [linear] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] md127 : active raid0 sdb1[1] sda1[0] 1953257472 blocks super 1.2 512k chunks unused devices:
ここで注意が必要です。
md0 としていたデバイスファイルが md127 に変わってしまいました!!!
次の作業で md? (md127) を使いますので、ご自分の環境のものを確認しておいてください!
(9)RAIDデバイスのマウント
下記コマンドを実行して uuid を確認します。(md127 は実際にいくつになったかは cat /proc/mdstat を実行して確認してください。)
# ls -l /dev/disk/by-uuid/* | grep md127
実行結果です。
【赤い部分】が uuid (環境等により変わります)です。
# ls -l /dev/disk/by-uuid/* | grep md127
lrwxrwxrwx 1 root root 11 1月 17 20:23 /dev/disk/by-uuid/6cadc340-5d5f-4134-a726-7dc60a292256 -> ../../md127
RAIDデバイスをマウントするために、md127 が割り当てられている uuid を
/etc/fstab に追記します。
なお、ここでマウントポイントは /media/ssd としますが、任意に変更して頂いて大丈夫です。
変更した場合には以降のマウントポイントは変更したものに置き換えてください。
# echo 'UUID=********-****-****-****-************ /media/ssd ext4 nofail 0 2' >> /etc/fstab
/etc/fstab に下記のような行が追加されていればOKです。
UUID=********-****-****-****-************ /media/ssd ext4 nofail 0 2
マウントポイント(ここでは /media/ssd ディレクトリ)を作ります。
# cd /media # mkdir ssd # chmod 777 ssd
マウントしてみます。
# mount /media/ssd
エラーが無ければマウントされていると思いますが、
私の環境で実行したら下記のように表示されてしまいました。
そのため表示の通り systemctl daemon-reload を実行したところ、
問題なく終了しました。
(続けて) df コマンドでマウントされているかを確認してみましょう。
# mount /media/ssd mount: (hint) your fstab has been modified, but systemd still uses the old version; use 'systemctl daemon-reload' to reload. # systemctl daemon-reload # df -h
下記のような感じで /dev/md127 が /media/ssd にマウントされていれば完了です。
# df -h ファイルシス サイズ 使用 残り 使用% マウント位置 udev 3.8G 0 3.8G 0% /dev tmpfs 805M 8.3M 797M 2% /run /dev/sdc2 235G 65G 159G 29% / tmpfs 4.0G 560K 4.0G 1% /dev/shm tmpfs 5.0M 48K 5.0M 1% /run/lock /dev/sdc1 510M 74M 437M 15% /boot/firmware tmpfs 805M 208K 805M 1% /run/user/1000 /dev/md127 1.8T 28K 1.7T 1% /media/ssd
(10)最後に
考えていた通りのパフォーマンスが出ているか、きちんと確認することをお勧めします。
環境により単体のUSB SSDよりパフォーマンスが悪いこともありえますので・・・。
いくつかのベンチマークソフトの名前を列挙しておきます。
使い方は・・・ググってみてくださいね。
- hdparm
- diskspd
- dd
- fio
以上です。