2024年7月10日 追記
2024年7月8日 記
はじめに
今、私が使っているNAS(2TB)より大きめの自作NAS(12TB)を作ろうと思い、その制作過程の記録兼備忘録になります。 以前ラズパイ5+USB SSD 1TB×2個を使ってRAID 0構成のストレージを作ったのですが、それのSATA HDD版になります。 以前作ったRAID 0 SSDストレージですが、HDD版を構成しているうちにいくつかの問題(不具合?)などに気付いたこともありますので、少し異なるところもあります。 なので、是非ご覧くださいね。
目次
(1)ハードウェア構成
(2)パーティション解放&確保
(3)RAID 0作成
(4)ファイルシステムを構築(フォーマット)する
(5)HDD デバイス名を固定する
(6)RAID 0デバイスをマウント
(7)キャッシュ設定
(8)RAID 0デバイスでI/Oエラーが発生したときの対処方法
(9)自分のホームディレクトリへシンボリックリンク
(10)最後に
(1)ハードウェア構成
ハードウェア構成として、
ラズパイ5のUSB3.0ポートにUSB3.2Gen2ハブ(セルフパワー)を2個付けて、そこへ起動用SSD、
RAID 0用HDD(6TB)を2個を取り付けました。
[ラズパイ5] -+- [USB3.2Gen2 Hub] -+- [起動用SSD(USB3.2Gen2 512KB)] | | | +- [USB3.0 - SATA(12V電源ポート付き)変換アダプタ] --- [SATA 6TB HDD] | +- [USB3.2Gen2 Hub] --- [USB3.0 - SATA(12V電源ポート付き)変換アダプタ] --- [SATA 6TB HDD]
ハードウェアの注意点としては、USBハブは【高速動作するもの】を選択しましょう。
これはカタログスペックからだと分からないかもしれません。
【実際に取り付けてベンチマークテストしてみたら遅かった】などということもありますので。
それとパーツ類(HDD、USBハブ、USB-SATA変換アダプタ、接続ケーブルとケーブル長など)は、できるだけ同じもを使うようにしましょう。
それぞれが異なってしまうと信号の伝達時間が異なってしまって結果的に思ったほどのパフォーマンスが出なかった・・・、
などということになってしまうかもしれませんので。
自作の場合には、結果として自分がその動作速度に満足できればいいわけですけどね。
それと関係ないですが、ラズパイ5にサウンドカードを載せています。
サウンドプレーヤーとして別個にラズパイ5を用意する予定なのですが、
そのバックアップ用として余っていたサウンドカードを取り付けることにしました(本当に関係ないですね)。
(2)パーティション解放&確保
今回は6TBのHDDを2台用います。
6TBだとパーディション解放&確保にfdiskコマンドを使うことはできませんのでgdiskコマンドを用いることにします。
まずは、fdiskコマンドで6TB HDDのデバイスファイルを確認します。
※以下はfdisk -lを実行した結果のHDDに関する部分を抜粋したものです。 $ sudo su スーパーユーザー(root)へ移行 # fdisk -l ・・・・・・ Disk /dev/sda: 5.46 TiB, 6001175126016 bytes, 11721045168 sectors Disk model: 003-2U9186 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: 90F86802-68C1-42DA-93E6-90B396D738EC Device Start End Sectors Size Type /dev/sda1 2048 11721043967 11721041920 5.5T Linux RAID Disk /dev/sdb: 5.46 TiB, 6001175126016 bytes, 11721045168 sectors Disk model: 003-2U9186 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: 4A868FD2-29BD-4390-8DEC-21E0EE0987FF Device Start End Sectors Size Type /dev/sdb1 2048 11721043967 11721041920 5.5T Linux RAID ・・・・・・
続いてパーディションの解放と確保です。
ひとつめのHDD /dev/sda に対して行います。
# gdisk /dev/sda GPT fdisk (gdisk) version 1.0.9 Partition table scan: MBR: not present BSD: not present APM: not present GPT: not present Creating new GPT entries in memory. Command (? for help): p 【p】コマンドで情報取得 Disk /dev/sda: 11721045168 sectors, 5.5 TiB Model: 003-2U9186 Sector size (logical/physical): 512/4096 bytes Disk identifier (GUID): 2ABC2CF4-9105-4FBD-B6F5-E99C2B315761 Partition table holds up to 128 entries Main partition table begins at sector 2 and ends at sector 33 First usable sector is 34, last usable sector is 11721045134 Partitions will be aligned on 2048-sector boundaries Total free space is 11721045101 sectors (5.5 TiB) Number Start (sector) End (sector) Size Code Name Command (? for help):d 【d】コマンドでパーティション削除 No partitions [No partitions]が表示されるまで【d】コマンドを繰り返し実行します。 Command (? for help): n 【n】コマンドで(Linux RAID)パーティションを作成 Partition number (1-128, default 1): 1 【1】を入力 First sector (34-11721045134, default = 2048) or {+-}size{KMGTP}: 【Enter】キーを押す Last sector (2048-11721045134, default = 11721043967) or {+-}size{KMGTP}: 【Enter】キーを押す Current type is 8300 (Linux filesystem) Hex code or GUID (L to show codes, Enter = 8300): Hex code or GUID (L to show codes, Enter = 8300): L Type search string, orto show all codes: raid 8503 Container Linux root on RAID a505 FreeBSD Vinum/RAID a906 NetBSD RAID af01 Apple RAID af02 Apple RAID offline af06 Apple SoftRAID Status af07 Apple SoftRAID Scratch af08 Apple SoftRAID Volume af09 Apple SoftRAID Cache fd00 Linux RAID Hex code or GUID (L to show codes, Enter = 8300): fd00 【fd00】を入力し、'Linux RAID'を選択 Changed type of partition to 'Linux RAID' Command (? for help): Command (? for help): p 【p】コマンドでパーティションの状態を再確認! Disk /dev/sda: 11721045168 sectors, 5.5 TiB Model: 003-2U9186 Sector size (logical/physical): 512/4096 bytes Disk identifier (GUID): 2ABC2CF4-9105-4FBD-B6F5-E99C2B315761 Partition table holds up to 128 entries Main partition table begins at sector 2 and ends at sector 33 First usable sector is 34, last usable sector is 11721045134 Partitions will be aligned on 2048-sector boundaries Total free space is 3181 sectors (1.6 MiB) Number Start (sector) End (sector) Size Code Name 1 2048 11721043967 5.5 TiB FD00 Linux RAID Command (? for help): Command (? for help): w 【w】で保存(コマンド実行) Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING PARTITIONS!! Do you want to proceed? (Y/N): y 【y】を入力してパーディション処理を実行します。 OK; writing new GUID partition table (GPT) to /dev/sda. The operation has completed successfully. root@raspi5-2:/home/muroi#
同じことをもうひとつのHDD /dev/sdb にも実行してください。
続いて下記コマンドを実行して mdadm をインストールします。
# apt install mdadm
気になるようでしたら、ここで再起動しましょう。
これ以降はRAID 0ドライブをマウントするまで一気に行きます。
再起動する場合には下記コマンドを実行しましょう。 # reboot
ちなみにですが、RAID 0ドライブを構成するのに失敗したりして再度実行する場合には、ここで再起動することをお勧めします。
再起動後に /dev/md0 が出来上がってしまっているような場合には、HDDを完全消去する必要があると思われます。
【完全消去】といっても、前のRAID 0を構成するために必要だった情報が消去されればよいわけなので、その辺の判断はご自身で行ってください。
ちなみにですが、私はターミナルを2つ開いて下記コマンドをHDD2台に対して同時に実行し、1日半くらい待ったのですが6TB分を消去できませんでした。
ただ1日半くらいで強制停止(CTRL+C)してみたら停止したので、その状態で再構成してみたら以前のデータは消えていたようでした。
■ターミナル1で実行したHDD(/dev/sda)消去コマンド
# dd if=/dev/zero of=/dev/sda
■ターミナル2で実行したHDD(/dev/sdb)消去コマンド
# dd if=/dev/zero of=/dev/sdb
(3)RAID 0作成
ではRAID 0を作成します。
下記コマンドを実行します。
# mdadm --create /dev/md0 --level=0 --raid-devices=2 --chunk=32 /dev/sda1 /dev/sdb1 mdadm: Defaulting to version 1.2 metadata mdadm: array /dev/md0 started. root@raspi5-2:/home/muroi#
mdadm(上記コマンド)のオプションスイッチは以下のような意味になります。 --level=0 RAID 0を作成します。 --raid-devices=2 2台のHDD(device)を使用することを指示します。 --chunk=32 普通のHDDの「セクタ」や「クラスタ」となどと同様の、RAID 0保存領域の最小単位のようです。 32を指定していますので、書き込み最小単位は32(KB)になります。 /dev/sda1, /dev/sdb1 RAID 0を構成するデバイス
上記コマンドを実行してRAID 0を作成できたら下記コマンドで確認してみましょう。
下のような感じになっていれば成功です。
# cat /proc/mdstat Personalities : [linear] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] md0 : active raid0 sdb1[1] sda1[0] 11720777728 blocks super 1.2 32k chunks
次に、再起動したときにも常にRAID 0ドライブが構成されるように、
またRAID 0ドライブの構成が壊れてしまったときでも比較的簡単に再構成できるように設定します。
まずは下記コマンドを実行してください。
/etc/mdadm/mdadm.conf ファイルに情報を書き込むコマンドです。
# mdadm --detail --scan >> /etc/mdadm/mdadm.conf
次に /etc/mdadm/mdadm.conf を開くなどして最下部が下のような感じになっているのを確認しましょう。
# cat /etc/mdadm/mdadm.conf
・・・・・ (省略) ・・・・・ # definitions of existing MD arrays # This configuration was auto-generated on Fri, 05 Jul 2024 22:05:54 +0900 by mkconf ARRAY /dev/md0 metadata=1.2 name=raspi5-2:0 UUID=12f6624c:b3564e19:25d2eb52:10b7f7e8
下をご覧ください。
もし下記の2行目のように【最下行と同じような内容の行】があるときには
以前構成したRAIDドライブの情報がHDDに残っているときなので、HDDを完全消去して更にmdadmをアンインストールしたのち、
最初(HDDドライブのパーティション解放&確保)から始めましょう。
古い情報がHDD上に残っているままで以降の作業を行っても不具合が出る可能性が高いです。
失敗したくなければHDDを完全消去しましょう。
# definitions of existing MD arrays ARRAY /dev/md/0 metadata=1.2 UUID=23265c18:38bcb155:f5cf6995:a5bbffc3 name=raspi5-2:0 ← 2行目(古い情報) # This configuration was auto-generated on Thu, 04 Jul 2024 02:31:46 +0900 by mkconf ARRAY /dev/md0 metadata=1.2 name=raspi5-2:0 UUID=1a0dc147:ff8921dd:bae6b820:0c0d45f6
更にもう1行(コメント行を含めると2行) /etc/mdadm/mdadm.conf ファイルの最後尾に追加します。
# 下の行はRAID 0ドライブが壊れたときに、自動で再構成させるためのものです。 POLICY action=re-add
下記コマンドを実行すると再起動したときに /dev/md0 が常に構成したRAID 0ドライブになります。
逆に下記コマンドを実行しないまま再起動してしまうと /dev/md127 などに割り当てられてしまい、
そのままの状態で使用していると不具合(エラーなど)が発生するとこがあります。
/etc/mdadm/mdadm.conf を編集したら、シャットダウンや再起動をする前に必ず実行するようにしてください。
# update-initramfs -u
(4)ファイルシステムを構築(フォーマット)する
作成した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 2930194432 4k blocks and 366276608 inodes Filesystem UUID: 817c6a96-1018-4c1f-aa8b-264bee4df686 Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 102400000, 214990848, 512000000, 550731776, 644972544, 1934917632, 2560000000 Allocating group tables: done Writing inode tables: done Creating journal (262144 blocks): done Writing superblocks and filesystem accounting information: done root@raspi5-2:/home/muroi#
以上でフォーマット完了です。
(5)HDD デバイス名を固定する
USB接続されたHDD デバイスは認識された順に /dev/sda, /dev/sdb などと自動で割り当てられてしまうため、
Raspberry Piを再起動した後に RAID が崩れる危険性があります。 そのため、各HDD デバイス名を固定するようにします。
HDD(正確にはUSB-SATA変換アダプタ)のデバイス情報を取得します。
udevadmコマンドを実行します。
まずは /dev/sda の情報を取得します。
# udevadm info -a -n /dev/sda 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 device '/devices/platform/axi/1000120000.pcie/1f00200000.usb/xhci-hcd.0/usb1/1-1/1-1.4/1-1.4:1.0/host1/tar> KERNEL=="sda" SUBSYSTEM=="block" DRIVER=="" ~~ 省略 ~~ looking at parent device '/devices/platform/axi/1000120000.pcie/1f00200000.usb/xhci-hcd.0/usb1/1-1/1-1.4': KERNELS=="1-1.4" SUBSYSTEMS=="usb" DRIVERS=="usb" ATTRS{authorized}=="1" ~~ 省略 ~~ ATTRS{product}=="Ugreen Storage Device" ATTRS{quirks}=="0x0" ATTRS{removable}=="unknown" ATTRS{remove}=="(not readable)" ATTRS{rx_lanes}=="1" ATTRS{serial}=="20D11E800153" ATTRS{speed}=="480" ATTRS{tx_lanes}=="1" ATTRS{urbnum}=="2435578" ATTRS{version}==" 2.10" ~~ 省略 ~~
次に /dev/sdb の情報を取得します。
# 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 device '/devices/platform/axi/1000120000.pcie/1f00300000.usb/xhci-hcd.1/usb3/3-1/3-1.4/3-1.4:1.0/host2/tar> KERNEL=="sdb" SUBSYSTEM=="block" DRIVER=="" ~~ 省略 ~~ looking at parent device '/devices/platform/axi/1000120000.pcie/1f00300000.usb/xhci-hcd.1/usb3/3-1/3-1.4': KERNELS=="3-1.4" SUBSYSTEMS=="usb" DRIVERS=="usb" ATTRS{authorized}=="1" ~~ 省略 ~~ ATTRS{product}=="Ugreen Storage Device" ATTRS{quirks}=="0x0" ATTRS{removable}=="unknown" ATTRS{remove}=="(not readable)" ATTRS{rx_lanes}=="1" ATTRS{serial}=="20D11E80005A" ATTRS{speed}=="480" ATTRS{tx_lanes}=="1" ATTRS{urbnum}=="2425026" ATTRS{version}==" 2.10" ~~ 省略 ~~
ここで欲しい情報は、以下の通りです。
/dev/sda に関する情報 SUBSYSTEMS=="usb" ATTRS{product}=="Ugreen Storage Device" ATTRS{serial}=="20D11E800153" /dev/sdb に関する情報 SUBSYSTEMS=="usb" ATTRS{product}=="Ugreen Storage Device" ATTRS{serial}=="20D11E80005A"
シリアル番号 ATTRS{serial} と製品名 ATTRS{product} を組み合わせれば、 それぞれのHDD(正確にはUSB-SATAアダプタ)を一意に特定できそうです。
・・・というわけで、 USB SSDのデバイス名の割り当てですが、
/dev/sda のHDD(正確にはUSB-SATAアダプタ) → /dev/raid_01_001
/dev/sdb のHDD(正確にはUSB-SATAアダプタ) → /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}=="Ugreen Storage Device", ATTRS{serial}=="20D11E800153", 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}=="Ugreen Storage Device", ATTRS{serial}=="20D11E80005A", SYMLINK="raid_01_002%n" RUN+="/etc/udev/rules.d/mdadmcheck.sh '/dev/raid_01_00[1234]1' 4"
(6)RAID 0デバイスをマウント
RAID 0デバイス(/dev/md0)をマウントします。
マウントする前に対象となるデバイスを確認しましょう。
# fdisk -l ・・・・・・ Disk /dev/sda: 5.46 TiB, 6001175126016 bytes, 11721045168 sectors Disk model: 003-2U9186 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: 90F86802-68C1-42DA-93E6-90B396D738EC Device Start End Sectors Size Type /dev/sda1 2048 11721043967 11721041920 5.5T Linux RAID Disk /dev/sdb: 5.46 TiB, 6001175126016 bytes, 11721045168 sectors Disk model: 003-2U9186 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: 4A868FD2-29BD-4390-8DEC-21E0EE0987FF Device Start End Sectors Size Type /dev/sdb1 2048 11721043967 11721041920 5.5T Linux RAID Disk /dev/md0: 10.92 TiB, 12002076393472 bytes, 23441555456 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 4096 bytes I/O size (minimum/optimal): 32768 bytes / 65536 bytes Disk /dev/sdc: 476.94 GiB, 512110190592 bytes, 1000215216 sectors Disk model: DataTraveler Max Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0xbf83121c Device Boot Start End Sectors Size Id Type /dev/sdc1 8192 1056767 1048576 512M c W95 FAT32 (LBA) /dev/sdc2 1056768 1000215215 999158448 476.4G 83 Linux root@raspi5-2:/home/muroi#
/dev/md0 (10.92TiB) が表示されましたので大丈夫です。
続けてファイルシステムへマウントするために、まず既存のファイルシステムへマウントポイントを作ります。
ここでは /nas/hdd というマウントポイント(フォルダ)を作ることにします。
# cd / # mkdir nas # chmod 777 nas ※パーミッションは問題が出ない範囲で適当に変えてもらっても大丈夫です。 # cd nas # mkdir hdd # chmod 777 hdd ※パーミッションは問題が出ない範囲で適当に変えてもらっても大丈夫です。
続いて /etc/fstab ファイルへ下記の行を追加します。
/dev/md0 /nas/hdd ext4 nofail 0 2
完了したら、次のコマンドを実行してマウントしてみましょう。
# mount /dev/hdd
もし "systemctl daemon-reload" みたいなメッセージが表示されたようでしたら、
更に次のコマンドを実行してください。
# systemctl daemon-reload
完了したら、df -h コマンドを実行してマウントできたか確認してみましょう。
# df -h ファイルシス サイズ 使用 残り 使用% マウント位置 udev 3.8G 0 3.8G 0% /dev tmpfs 805M 8.9M 797M 2% /run /dev/sdc2 469G 5.4G 440G 2% / tmpfs 4.0G 688K 4.0G 1% /dev/shm tmpfs 5.0M 64K 5.0M 2% /run/lock /dev/sdc1 510M 76M 435M 15% /boot/firmware /dev/md0 11T 645G 9.7T 7% /nas/hdd ← これ! //192.168.11.2/disk1 1.9T 1.4T 442G 77% /nas/disk1 //192.168.11.2/disk1/music 1.9T 1.4T 442G 77% /nas/music //192.168.11.2/disk1/画像 1.9T 1.4T 442G 77% /nas/picture/画像 tmpfs 805M 176K 805M 1% /run/user/1000 root@raspi5-2:/home/muroi#
/dev/md0 が /nas/hdd にマウント(表示)されていれば一通り完了です。
最後に再起動して、RAID 0ドライブ(/dev/md0)が構成されてマウントされているかを確認しましょう。
df -h コマンドを実行して、上の結果と同じようにマウントされていれば成功です。
また下記のように ls -l /dev/raid* コマンドを実行して、
スクリプトなどで対策したファイルが作成されているかもチェックしておきましょう。
# ls -l /dev/raid* lrwxrwxrwx 1 root root 3 7月 7 01:45 /dev/raid_01_001 -> sda lrwxrwxrwx 1 root root 3 7月 7 01:45 /dev/raid_01_0010 -> sg0 lrwxrwxrwx 1 root root 4 7月 7 01:45 /dev/raid_01_0011 -> sda1 lrwxrwxrwx 1 root root 15 7月 7 01:45 /dev/raid_01_0014 -> bus/usb/001/003 lrwxrwxrwx 1 root root 3 7月 7 01:45 /dev/raid_01_002 -> sdb lrwxrwxrwx 1 root root 11 7月 7 01:45 /dev/raid_01_0020 -> bsg/2:0:0:0 lrwxrwxrwx 1 root root 4 7月 7 01:45 /dev/raid_01_0021 -> sdb1 lrwxrwxrwx 1 root root 15 7月 7 01:45 /dev/raid_01_0024 -> bus/usb/003/006 root@raspi5-2:/home/muroi#
上のような感じになっていれば大丈夫です。
(7)キャッシュ設定
ラズパイに接続されているストレージデバイスすべてに影響するようですが、キャッシュ設定を適切に設定しないとI/Oエラーが発生することがあるようです。
もしI/Oエラーが発生したときには、キャッシュ設定も疑ってみましょう。
参考までに、現時点で私が使用しているキャッシュ設定を掲載しておきます。
下記の内容を /etc/sysctl.conf ファイルの最後に追加しています。
# NAS専用のため、メモリキャッシュ設定を適切にする vm.dirty_background_ratio=4 # 10 (%) # バックグラウンドでフラッシュを開始する割合を指定 vm.dirty_ratio=12 # 20 (%) # キャッシュに使用する最大メモリの割合を指定 vm.dirty_writeback_centisecs=20 # 500 (×10ms) vm.dirty_expire_centisecs=60 # 3000 (×10ms)
もし /etc/sysctl.conf ファイルでキャッシュ設定をするときには、
変更後(ファイルに追加・編集後)に下記コマンドを実行して設定を反映させましょう。
# sysctl -p
これでキャッシュ設定が反映されました。
2024/07/10 追記分
I/Oエラーが発生するのは250GB以上くらいの量のファイルを一括転送したときだけで、 それよりもずっと少ない量のファイル転送程度では今のところI/Oエラーが発生したことはありません。
2024/07/10 追記分
色々とキャッシュを変えて大量のファイル(総容量約1.4TB)のファイル転送を試みていたのですが、 どのようにキャッシュ設定を変えてもI/Oエラーは発生するようです。 過去に2回だけこのファイル転送に成功したことがあるのですが、おそらく【たまたま上手くいっただけ】のように思います。
色々キャッシュ設定を変えて実行してみて思ったことは、おそらくバッファオーバーフロー時の処理とバックグラウンドプロセスと フォアグラウンドプロセスの競合なんかが原因のように思いました。
そこで・・・というわけでもないのですが、これ(RAID)とは本来無関係なのですが、実は「ファイル転送プログラム」を作ろうと考えていました。 もし原因が「そう」であるなら、良いタイミングでキャッシュバッファのフラッシュ処理を入れてやれば良いように思います。 「キャッシュバッファのフラッシュ」とは具体的にどのような処理になるかはわかりませんが、上手く入れられれば問題は発生しないように思います。
・・・というわけで、ファイル転送プログラムを作って良い結果が得られたらホームページに掲載しようと思います。
(8)RAID 0デバイスでI/Oエラーが発生したときの対処方法
私がこのデバイスを構成するにあたり、I/Oエラーが発生した原因はおそらく2つありまして、
- HDDに古い構成データが残っていて、不具合を引き起こしていたようなとき
- キャッシュ設定が良くなかったとき
です。 ただし、このページに記載してある手順通りにRAID 0ドライブを構成したのであれば、再構成させることは比較的簡単なはずです。 それは再起動を何回か繰り返すことです。 おそらく3~4回程度、再起動を繰り返すだけで復帰すると思います。 もし3~4回程度以上、再起動を繰り返しても復帰しないときは、
# systemctl daemon-reload
を、実行してみましょう。
これで復帰すると思います。
df -h コマンドでマウントされたかを確認してみましょう。
無事にマウントされたときは、一応再起動して復帰するかも確認しましょう。
万が一、再構成されないときは何かほかに重大な問題が発生している可能性があるかもしれません。
dmesgコマンドを実行して、エラーなどが発生していないか確認してみましょう。
(9)自分のホームディレクトリへシンボリックリンク
RAID 0構成したデバイスを自分のホームディレクトリへシンボリックリンクする方法です。
RAID 0ドライブをマウントしたポイントは /nas/hdd でした。
ホームディレクトリは /home/muroi とします。
このとき、下記コマンドを実行するとホームディレクトリ (/home/muroi/) へシンボリックリンクできます。
$ sudo ln -s /nas/hdd /home/muroi
ただそれだけだとmuroiユーザーのままではアクセスできませんでした。
更に(下記の)chownコマンドを実行する必要がありました。
$ sudo chown muroi:muroi /home/muroi/hdd
ちなみにchownコマンドを実行後に ls -la コマンドを実行しても表示の上では
/home/muroi/hdd フォルダはrootのままでmuroiには変わりませんでした。
しかし、ユーザーmuroiのままでも /home/muroi/hdd フォルダよりRAID 0デバイスへアクセスできるようになりました。
更にちなみにですが、シンボリックリンクを解除したいときには下記の unlink コマンドを実行してください。
$ unlink /home/muroi/hdd
(10)最後に
ラズパイ5とHDDドライブ2台でRAID 0構成のNASを作ることができました。
今まで使用していた(これからもまだしばらくは使いますが)NASよりもずっと大容量で高速なものを作り上げることができました。
あとはどれくらい持つか・・・ですが、今回使ったHDDドライブは、すでに3年くらい経つでしょうか、
普通のHDDドライブとして使用していて何の不具合もまだ発生していないものと同じものを新品で2台用意したものなので、
おそらく悪くはない・・・といいますか、大丈夫だろう(数年くらいは持つだろう)と考えています。
現時点(2024/7/8現在)では、まだラズパイのGUIで【大量のファイルのコピー】を実行するとI/Oエラーが発生することがあります。
250GB以下くらいならI/Oエラーが発生したことは無いですが、それを超えると(280GBを超えてくると)エラーが発生することがありました。
現在コマンドライン(smbclientコマンド)で、大量のファイルのコピーができないか検証中です。
この辺については何か分かったら追記しようと思っています。
以上です。