これまで、OpenMediaVault 5 (以後 OMV5) 、OpenMediaVault 6 (以後 OMV6) を使って RAID Z 、RAID Z2 を実現し、使ってまいりましたが、ディスクの使用容量が増えるにしたがって、動作に問題が生じて来ました。読み出し時に一瞬止まるのです。主に動画で再生時に詰まった様な動作になるのです。一時間の再生動画で 1-2 回以上は一瞬止まります。RAID Z, RAID Z2 はメモリー食いなのでメモリー不足なのかも知れません。それに、大容量のディスク装置も結局は殆ど NAS として使っているだけなので、今一 RAID Z, RAID Z2 の機能が生かしきれていません。・・で、ディスクの容量増大に伴って、軽いシステムである RAID5, RAID6 を OpenMedia 7 (以後 OMV7) で実現、全面的に移行します。後々出てきますが、OMVのダッシュボードで比べて見ると RAID5, RAID6 は RAID Z, RAID Z2 に比べて CPU、メモリーの負担が 数分の一 (1/2 〜 1/4) です。
システム作成の方針
蓄積容量が大きくなってもスムーズに読み出せる為には、同じ CPU・メモリーならば出来るだけ軽いシステムである必要があります。RAID Z, RAID Z2 → RAID 5, RAID 6 でシステムとして軽くなります、使用しない機能は、操作方法すら忘れてしまい、後々トラブルの原因になったりします。動作を軽くする為にも、出来るだけシンプルなシステムが望ましいのですが、必要な機能は入れたいので、ゆる~く、方針を決めて置きます。
使用ハードウェアは HP ProLiant MicroServer Gen8
まず、使用ハードウェアは当然ながら HP ProLiant MicroServer Gen8(以降 HP Gen8)を使用します。CUP は Intel Xeon E3-1220Lv2 2.3GHz(2コア / 4スレッド)Memory は 8GB を使用しましたが、後々の評価から Celeron G1610T 2.3GHz(1コア / 2スレッド)Memory 2GB 程度でも実用になりそうです。
基本は Openmediavault 7 + プラグインで…
色々な機能はWeb画面から管理したいので、可能な限り OMV7 + プラグイン(但し必要な機能のみとする)を使います。プラグインでは実現できない或いは使いにくい所 ( あくまで私見ですが…) や、システム全体連携が必要な所は Linux スクリプトを追加する事で実現します。
最終的にはシンプルシステムを目指しますが、実験時には プラグインカーネル入れ替え機能を、多用して RAIDに最適なカーネルを考えます。( カーネル入れ替え機能自体が update や upgrade 時にトラブルになったりするので、最終的にはアンインストールして置くのがお勧めです、必要ならば再インストールも可能です )
mdadm で 色々実験 ・・最終的には 54TB (RAID 5) を作成
mdadm ( Linux の RAID 5, 6 は大抵このソフトを使っており、もちろん OMV7も使っています。) を使った、RAID 操作に慣れる為に小さめのディスクで ( 大きいディスクだと単に時間が掛かりすぎるので…) 、ソフト的に色々組み換えて評価します。ディスクデータをキープしたまま、RAID 5 → RAID 6 或いは RAID 6 → RAID 5 とか ディスク 3台で RAID 5 → ディスク4台 で RAID 5 とか 幾つか操作してみて、必要な時間を評価します。最終的には、この記事内で RAID 5 (ディスク4台 18TB x 3 台 = 54TB + エラー訂正ディスク 1台) を作成します。また、次の記事では 2台連動で RAID 6 (ディスク8台 18TB x 6 台 = 108TB + エラー訂正ディスク 2台) を作成します。
運用時に役に立つツールを作成
私は NAS として使う場合に “日本語タイトル” や “日本語フォルダ” を多用しますので “ファイルやフォルダはスペースを含む日本語が自由に使える事” は重要な事です。日本語を使う事自体はさほど問題ないですが、ファイルの copy や move を rsyncで効率良く確実に行いたいのですが、 日本語フォルダやファイルも含めて、コマンドを打っていては面倒な事この上ないです。なので、( スペースも含んだ ) 日本語フォルダ多用システムの運用時に役に立つ、rsync ツールなども作ります。
必要なUSBメモリーは
ここで、実験も含めて必要な USBメリーについて書いておきます。
・インストーラー用 4GB 以上必要 最初のインストール時に使う ・鈴木のOMV7ベースセット用 32GB 以上が必要 backup 含めて複数作成しておくと良い ・実験用 OMV7 ←→ WindowsPC 間でデータの移動に使う。数百Kbyte以上 32GB以下
鈴木のOMV7 ベースセット
相変わらず変な章名ですが “鈴木のOMV7 ベースセット” をOMV7 で展開する NAS のベースとします。これから少し変形したり、付け足したりしてシステムを展開致します。BBルータの都合で、IPアドレスは 192.168.11.xx を ベースに展開致します。既にOMV6 で運用中なので、iLOアドレス 192.168.11.20~30 と 192.168.11.120~130 は使用中です。そこで、この記事の iLOの IPアドレスは 192.168.11.40 にします。まずは、 “鈴木のOMV7 ベースセット” を作って行きましょう。
OMV7 インストール
HP Gen8自体の説明 や OMV のインストールの仕方を詳しく説明しても従来記事の繰り返しになるので詳しくは OpenMediaVault6 (OMV6) で作る PC1台 24TB RAID Z システム【Part 1】から【Part 3】を参考にして頂くとして、ここでは、必要な情報を列挙する感じで説明して行きます。
OpenMediaVault ホームページから OMV7のインストーラーをダウンしましょう。 Home/iso から 7.x-xx.iso (2024_05_15 時点では 7.0-32 が最新) を選びます。ダウンロードしたら、Rufus を使って ISOイメージモードでインストラーUSBを作成します。インストーラーUSB は4GB以上あれば良いでしょう。
HP Gen 8 の バグ修正
ここで、HP Gen 8 特有の修正をします。他のPCでは必要ないかもしれません。このバグ自体が、色々 Keyを打つと、Remote Console 画面が使えなくなる白物なので、とっとと修正します。バグのせいで、カーソル応答が悪く、頼りないかもしれませんが、root で loginして
# nano /etc/default/grub
で、grub の内容を編集します。
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=off intremap=off"
# update-grub
OMV7 最初の設定
システム → ワークベンチ → 自動的にログアウトを無効
ネットワーク → 一般 → ホスト名をopenmediavault → openmedia-41 に変更
ネットワークインターフェースを設定してない場合は、以下。
ネットワーク → インターフェース eno1を以下の様に編集して保存 IPV4 メソッド : スタティック アドレス : 192.168.11.41 ネットマスク : 255.255.255.0 ゲートウェイ : 192.168.11.1 高度な設定 DNSサーバー : 192.168.11.1
一旦 ログオフして 192.168.11.41 で ログインする。以降、192.168.11.41 でログインします。
SSH端末の日本語モード設定
SSH端末を開いて下さい。SSH で入るとまず、自分のディレクトリ (= /root/ 下) に入ります。OMV7のSSH端末は最初は英語モードになっているらしく、ディレクトリにある .profile を編集して日本語モードで入れるよう変えます。
root@openmedia-41:~# nano .profile
LANG=C を LANG=ja_JP.UTF-8 に変更します。
LANGUAGE=C を LANGUAGE="ja_JP:ja" に変更します。
これで次回から日本語モードで開けます。
ついでに、英語と日本語のコマンドマニュアルを導入します。
# apt-get install man
# apt-get install manpages-ja
OMV7 外部プラグイン追加 & RAMディスク導入
ここで少し休憩して、プラグインを眺めて見て下さい。RAID 5, RAID 6 用の md 7.x-x は見つかりますが、フラッシュメモリー(USBメモリー)に関連してRAMディスク、PC2台連携の時に必要な iSCCI ディスク、その他 カーネルの入れ替え機能 などが、みつかりません。実はこれらの機能は外部プラグインなのです。(外部 / 通常の違いが良く分かりませんが) 外部プラグインを追加 致します。
https://github.com/OpenMediaVault-Plugin-Developers/packages から導入しますので、SSH 端末を開いて、README.md の指示に従って
# wget -O - https://github.com/OpenMediaVault-Plugin-Developers/packages/raw/master/install | bash
再度 Web管理画面にログインして、プラグインを眺めると、欲しい物が増えていますね。早速、RAMディスクを導入します。SSH 端末で # df を見て置きます。導入後に再確認します。管理画面で
システム → プラグイン → openmediavault-flashmemory 7.x を選んでインストール
インストール済み になりましたね。# df を見ると、folder2ram の項目が見えます。ダッシュボードのサービス項目にも FlashMemory が追加されています。この表示が緑になっていると正常に FlashMemory使用時 ( =USBメモリーで動作する事) のデータ退避用RAMディスクが動作しています。再起動すれは 緑になりますが、導入直後は赤かもしれません。OMV5 時に比べて導入が簡単になりました。
この RAM ディスクは Shutdown手続き時にフラッシュメモリー( =USBメモリー ) に書き込まれ、起動時に フラッシュメモリーからRAM に読み込まれます。従って、Shutdown は Web管理画面から行い、書き込み動作をして下さい。いきなり電源を切ると起動時からその時点までの運転経歴等の管理情報データが失われます。(まあ、ディスクに書き込むデータ等は読み書き時点で記録されるので、普段は関係ありませんが、トラブル時、メンテナンス時に頼るべき管理情報がないとトラブルシューティングがやりにくいです。)
Kernel 操作 プラグイン 導入
Kernel を操作する(入れ替える) プラグインを導入します。
システム → プラグイン → openmediavault-kernel 7.x.x をインストール
システム → カーネル → Proxmox(画像) → Install Proxmox kernel x.x
Debian GNU/Linux, with Linux 6.8.4-3-pve (以降 pve 6.8) Debian GNU/Linux, with Linux 6.5.13-5-pve (以降 Pve 6.5) Debian GNU/Linux, with Linux 6.2.16-20-pve (以降 pve 6.2) Debian GNU/Linux, with Linux 6.1.0-21-amd64 (以降 amd64-21) Debian GNU/Linux, with Linux 6.1.0-18-amd64 (以降 amd64-18)
この時点で5 つのkernel が選べます。
update & upgrade
# apt-get update
# apt-get upgrade
StartUptime.service 導入
システムスタート時に実行する StartUptime.service を作成。以下の内容を /etc/systemed/system/の下に置きます。このサービスはスタートアップ時 ( = network.target が実行された直後) に StartUptime.sh を実行します。
[Unit]
Description=電源 on 時処理
After=network.target
[Service]
Type=oneshot
ExecStart=/sbin/StartUptime.sh
[install]
WantedBy=graphical.target
StartUptime.sh を以下の内容で作成。 /sbin/ の下に置きます。実行フラグを忘れずに付けます。今はスタート時間を StartUptime_log に記録するだけです。これにスタート時に実行したいコマンドを追加できます。
#!/bin/bash PATH=/usr/sbin:/usr/bin:/sbin:/bin LOG_SAVE=/var/log/installer/StartUptime_log date > $LOG_SAVE
StartUptime.service をテストしておきましょう。SSH 端末で StartUptime.service を enable にして置きます。
# systemctl enable StartUptime.service
/var/log/installer/StartUptime_log が有れば削除して再起動します。再起動後 StartUptime_log を確認して下さい。起動日・時間が書き込まれていれば OK です。
ついでに StartUptime.service、StartUptime.sh の実行タイミングも見ておきましょう。用意した実験用USB を挿入して ( /dev/sdb になるはず)、/mnt 下にマウントして
# systemd-analyze plot > /mnt/plot_01.svg
これを WinPC の Webブラウザで確認してみましょう。StartUptime.service を探してみて下さい。一通りみておくと今後に参考になるはずです。
これで、“鈴木のOMV7 ベースセット” 作成完了。以降、これを色々展開します。
鈴木のOMV7 ベースセットをコピーする
鈴木のOMV7ベースセットができまたので、バックアップ、予備、など幾つかコピーしておきましょう。従来はdd コマンドを直接、書いてコピーしていましたが、今回は dd コマンドをベースに コピーコマンド UsbCopy.sh を作りました。/sbin/ 下に置きます。実行フラグを忘れずに付けて下さい。
#!/bin/bash # UsbCopy.sh ( Usb memory Copy program ) PATH=/usr/sbin:/usr/bin:/sbin:/bin if [ $# != 2 ]; then echo "" echo " (例) UsbCopy.sh <From device> <To device> " echo " (例) UsbCopy.sh sdb sdc " echo "" fi if [ $# = 2 ]; then dd if=/dev/$1 of=/dev/$2 bs=1024k status=progress fi
dd コマンドに一寸、手を加えた程度で、個人的に使う為のみに作ったもので、エラー検出もいい加減です。一応パラメータは sdb sdc などのブロックデバイスを直接書く事を想定しています。使い方ですが、必ず コピー元、コピー先の順でUSB をシステムに挿入します。そうする事でデバイス名が順に振られます。例えば コピー元 = sdb, コピー先 = sdc てな具合です。それぞれのデバイス名を確認、バイト単位でコピー元、コピー先の容量確認するために最初にUSBメモリを調べます。
# lsblk -d -b
結果、コピー元 = sdb, コピー先 = sdc の場合は
# UsbCopy.sh sdb sdc
で、コピーが始まります。1024kのバッファのおかげで、従来の2.5倍以上の速さでコピーできます。具体的には 32GBで、従来は 2.5時間 、この例では 1時間弱 となります。また status=progress で途中経過も表示されます。パラメータ数を間違ったり、なしにすると help 的な説明がでます。以下の例では 3231秒でコピーできています。
OMV7を使用して RAID 5 を構成する
“鈴木のOMV7ベースセット” を使って RAID 5を構成していきます。
事前準備
RAID 5 の構成を始める事前準備をします。”事前準備” にも拘わらず、ハードディスクを装着しての検討も有ります。・・なので、事前準備というよりはRAID 5 作成中・作成後に必要になる事、前提条件、必要なツール、の準備と言った方が適当かもしれません。
対象ディスクの指定方法検討
リナックスでは対象のディスクを指定するのに よくカーネルが指定するブロックデバイスを使います。良く知られた /dev/sda, /dev/sdb ・・とかです。( ここでは確実に指定する為にフルパスで書いています。) このブロックデバイスは物理デバイスに対して、カーネルの認識順に a, b, .. と打たれて行くので、認識順が異なると実際の物理デバイスが異なったり、入れ替わったりします。RAID5,6 ディスクが構成時と再構成時で入れ替わったりするとRAID崩壊もあり得ます。RAID5,6 ディスクは常に物理的に同じ物を指定する必要があります。ディスク指定にUUIDを使ったりする方法もありますが、私はディスクのシリアル番号を使う /dev/disk/by-id/ata-MB2000xxxxx_xxxxxxxx と表す by-id を使っています。なんせディスクに打たれているシリアルをつかうのですからいつも、同じディスクは保証されています。但し、この方法は表示が長いので、扱いずらさを解消するスクリプトを作成します。
検討の為、HP Gen8 に 2TBのディスクを4台装着し、正面から見て左から 0, 1, 2, 3 と番号を振りそれぞれを DISK0, DISK1, DISK2, DISK3 とします。リストで並べた時にも順になるよう、ディスクはシリアル番号の若い順に左から装着します。リストの例では DISK0 〜 DISK3 つまりシリアル番号に対応する sda ~ sdd ブロックデバイスは( 偶然にも ) DISK0 → sda, DISK1→sdb, DISK2→sdc, DISK3→sdd に対応しています。
番号を与えると /dev/disk/by-id/ata-MB2000xxxxx_xxxxxxxx ( =by-id ) を返す 番号 – by-id 変換スクリプト _DiskId.sh を作成しました。これは各スクリプトから内部関数的に呼ばれるスクリプトでディスク番号 0 ~ 3 を与えて呼ばれると その番号に対応して by-id 文字列 を返します。なお、このスクリプトは他のスクリプトから正しいパラメータ ( =0~3 ) 付きで呼ばれる以外を想定していません。 ( つまり、内部関数的に使われる以外のエラー処理等は無い。 )
#!/bin/bash
# _DiskId.sh ( Disk by-Id return program )
DISK0=/dev/disk/by-id/ata-MB2000GCWDA_S1X0LRA7
DISK1=/dev/disk/by-id/ata-MB2000GCWLT_P2GYRK0J
DISK2=/dev/disk/by-id/ata-MB2000GCWLT_P6J99KUX
DISK3=/dev/disk/by-id/ata-MB2000GFEMH_N4G26G7Y
PATH=/usr/sbin:/usr/bin:/sbin:/bin
if [ $1 = 0 ]; then
echo $DISK0
fi
if [ $1 = 1 ]; then
echo $DISK1
fi
if [ $1 = 2 ]; then
echo $DISK2
fi
if [ $1 = 3 ]; then
echo $DISK3
fi
例えば echo 関数に使うとディスク番号に対応した by-id を表示できます。( 使い方の例 参照 )
つぎは、DISK0~3 と by-id , sdx の関係の一覧を提示する DiskInfo.sh です。_DiskId.sh を参照しています。
#!/bin/bash
# DiskInfo.sh ( Disk-Information program )
PATH=/usr/sbin:/usr/bin:/sbin:/bin
DISK0=$(_DiskId.sh 0)
DISK1=$(_DiskId.sh 1)
DISK2=$(_DiskId.sh 2)
DISK3=$(_DiskId.sh 3)
echo -n "DISK0 : "; echo -n $DISK0; echo -n " → "; readlink $DISK0
echo -n "DISK1 : "; echo -n $DISK1; echo -n " → "; readlink $DISK1
echo -n "DISK2 : "; echo -n $DISK2; echo -n " → "; readlink $DISK2
echo -n "DISK3 : "; echo -n $DISK3; echo -n " → "; readlink $DISK3
_DiskId.sh 以外では、スクリプト内でディスクの “なまシリアル番号” を直接記入しません。 必ず、_DiskId.sh を参照する形で by-id を取得するのでディスク交換時にも_DiskId.sh の なまシリアル番号の書き換え のみでシリアル番号を含めた by-id を 一元管理できます。使い方の例を示します
RAID を初めて作成する際には ディスク順は 0, 1, 2, 3 と構成します。構成時に DISK0 〜 DISK3 を使って構成するか、もしくはOMV7のプラグイン使用の時は sda 〜 sdd or sde がDISK0 〜 DISK3 の並び順である事を確認して構成します。再起動後のRAID 再構成時は DISK0 〜 DISK3 を使って再構成します。
この並び順の話は今後でも出てきますので、必要に応じてその都度説明 致します。
カーネルプラグイン削除
MD (Multiple Device) プラグインインストール
RAID用に MDプラグインをインストールします。
システム → プラグイン → openmediavault-md 7.x-x をインストール
ストレージ
準備も整いましたので、ここから RAID 5 を構築していきます。 ハードディスク( 2TB x 4 ) を装着して再起動します。再起動後にまず、各ハードディスクをスワイプします。
ストレージ → Multiple Device ( md0 作成 )
ストレージ → ファイルシステム
# mkfs -t ext4 /dev/md0
ストレージ → 共有フォルダ
サービス
SMB( サンバプロトコル ) でWindows からの共有設定をします。
サービス → SMB/CIFS → 設定
サービス → SMB/CIFS → 共有
ユーザー
他の Linux System との共有も便利に・・
# mkdir /array-0 # mount /dev/md0 /array-0
再起動時のRAID環境の再構築
#!/bin/bash # StartUptime.sh ( StartUp timing program ) PATH=/usr/sbin:/usr/bin:/sbin:/bin DISK0=$(_DiskId.sh 0) DISK1=$(_DiskId.sh 1) DISK2=$(_DiskId.sh 2) DISK3=$(_DiskId.sh 3) LOG_SAVE=/var/log/installer/StartUptime_log LOG_DUST=/var/log/installer/StartUptime_dst date > $LOG_SAVE mdadm -As /dev/md0 $DISK0 $DISK1 $DISK2 $DISK3 mount /dev/md0 /srv/dev-disk-by-uuid-6ef464aa-d2e4-424a-9267-736ddd521b69 mount /dev/md0 /array-0