110G RAMキャッシュと10G LANで超高速NASを作る

投稿者: | 5月 17, 2025

目次

はじめに

こんなPCが手元にあります…

SATAポートもオンボードに10個あります。10G nicもAliExpressで安く手に入れました。1TBのHDDが大量に手元にあります。余っているデカめのUPSもあります。家にあるNASが非常に遅いです。

さあ、やることは決まりました。NASの作成しかありません。RAMが大量にあるので多少のデータ消失リスクは承知でWrite Backなキャッシュな超高速NASを作成します。

使用機材・OS

CPU : intel Xeon E5-2695 v2 12コア24スレッド ベースクロック2.4GHz ターボブースト時3.2GHz
チップセット : intel C602
メモリ : 16GBx8 128GB
ストレージ : OS用128GB SSD + NAS用1TBx6枚

ディスク構成

1TB6枚にRAID5で5TBとします。1つ壊れた時に交換するまでに他のディスクが壊れそうで怖いですが故障時は手動でディスクを交換することにします。

マザーボードにIntel Rapid Storage Technologyが搭載されているのでRAIDを組めますが、Fake Raidで性能がいまいちなうえに、家にあるNASで懲りたので使いません。Linux上のソフトウェアRaidとします。

キャッシュの割り当て方法

RAMをWrite Backなキャッシュとして割り当てる方法は複数あります。

・bcacheとRAMdiskの組み合わせ
多分もっとも推奨される方法です。HDD側がmdadmのフォーマット+bcacheのフォーマット+ext4やZFSとなるので再構築時やリカバリー時に難易度が上がりそうです。

・ZFSのキャッシュ機能
ZFSはARCやZIL等のキャッシュ機能を備えています。詳しくはZFSのキャッシュについて勉強を見てください。

概ねこんな感じだと思います。ZFSのキャッシュについて勉強でわかりましたが、ZFSがかなり優れていそうだったので、ZFSを使用することにします。

ZFSのセットアップ

OSはUbuntu 24.04です。

1. ZFSのインストール[1]
sudo apt install zfsutils-linux

2. WWNを把握[1]
ls /dev/disk/by-id/ | grep wwn
UUIDはフォーマットのたびに代わってしまいますが、wwnは製造番号なので変わることがないようです。

3. zpoolを作成[1][2]
sudo zpool create -f -m <mountポイント> <pool名> raidz <ids>
なので自分の場合は
sudo zpool create -f nas raidz /dev/disk/by-id/wwn-0x5000xxxxxxxxxxxx /dev/disk/by-id/wwn-0x5000xxxxxxxxxxxx ….
こんな感じにしました。マウントポイントを何も指定しないと/pool名にマウントされます。

4. atimeをオフ[1]
アクセスされた時刻を記録するものです。いらないので切ります。
sudo zfs set atime=off nas

5. データセットの作成[1]
サブフォルダ的なものらしいです。XとYが欲しいので作ります。
sudo zfs create nas/x
sudo zfs create nas/y

ここまでが基本的なZFSの設定だと思います。ここら先は自部好みの設定に変えてきます。

6. 同期書き込みの無効化
すべての要求を非同期書き込みとして処理することで書き込みの高速化を図ります。
sudo zfs set sync=disabled nas

7. ARCのサイズの確認[3]
arc_summary | grep size
62.9GiBでした。

8. 設定ファイルの生成[4]
ZFSの共通設定は、/etc/modprobe.d/zfs.confに記述することにします。/sys/module/zfs/parametersに書き込んでもいいのですが、再起動するたびにリセットされるので、modprobe.dで指定することにします。
vim /etc/modprobe.d/zfs.conf

9. ARCの拡大[4]
最大120GBくらいにしたいです。cat /proc/meminfoでメモリサイズ(MemTotal: 131868248 kB)を把握できるので、それをもとにbyteで指定しました。93%まで割り当てることにしました。7で開いた設定ファイルに以下を書き込みました。
options zfs zfs_arc_max=122637470640

10. 設定の反映
initramfsからZFSのモジュールがロードされている場合はinitramfsの再生成が必要ですが、今回は違うので単純に再起動を行います。多分lsinitramfs /boot/initrd.img | grep zfsとかで確認できると思います。
sudo reboot

11. ARCのサイズの確認[3]
7を使って再度確認して9で指定した値と同じになっていることを確認します。
114.2GiBとなっていました。

とりあえずはこんなものとします。いずれはスナップショットの設定をしたり、さらなる速度向上のためにtxgの書き込みタイミング等もいじろうと考えてます。

共有のセットアップ

ZFSにはsharesmbというプロパティが存在し、これをONにしてやれば比較的簡単に共有できるようです[4][6]。しかしながら、Solarisとの互換性のためにあるっぽく、SAMBAをラッパーしているだけで特にメリットがあるわけではないっぽい[7]ので使わないことにします。

1. Sambaのインストール[1]
sudo apt install samba

2. Sambaログイン用専用ユーザーを作成する
普段のログインで使う(今作業している)ユーザとsambaでログインするユーザを分けたいのでUbuntuに新たにログイン不許可のユーザを追加します。
sudo adduser –shell /bin/false <新しいユーザ名>

3. 所有権と権限の変更[1][8]
ZFSのパーティション内を先ほど作成したユーザの物にします。ローカルのアカウントから中身が見えなくなるのも不便なので、usersグループ所属なら見れるように設定しました。
権限の変更
sudo chmod -R 770 /nas/x/
sudo chmod -R 770 /nas/y/
所有権の変更
sudo chown -R <新しいユーザ名>:users /nas/x/
sudo chown -R <新しいユーザ名>:users /nas/y/
権限を引き継ぐ(SGIDの設定)
sudo chmod 2770 /nas/x
sudo chmod 2770 /nas/y

4. Sambaユーザの追加[1]
sudo pdbedit -a <ユーザ名>

5. ディフォルトの設定ファイルのコピー
sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.default

6. smb.confの設定[9]
ディフォルトとのdiffの結果は以下の通りです。

25c25,26
<

> dos charset = CP932
> unix charset = UTF-8
39c40,41
< ; interfaces = 127.0.0.0/8 eth0

> interfaces = <IPアドレス>/24 <インターフェイス名>
> interfaces = <IPアドレス>/24 <インターフェース名>
219,226c221,228
< [printers]
< comment = All Printers
< browseable = no
< path = /var/tmp
< printable = yes
< guest ok = no
< read only = yes
< create mask = 0700

> ;[printers]
> ; comment = All Printers
> ; browseable = no
> ; path = /var/tmp
> ; printable = yes
> ; guest ok = no
> ; read only = yes
> ; create mask = 0700
230,235c232,237
< [print$]
< comment = Printer Drivers
< path = /var/lib/samba/printers
< browseable = yes
< read only = yes
< guest ok = no

> ;[print$]
> ; comment = Printer Drivers
> ; path = /var/lib/samba/printers
> ; browseable = yes
> ; read only = yes
> ; guest ok = no
242a245,261
> [x]
> security = user
> path = /nas/x
> writable = yes
> guest ok = no
> force create mode = 770
> force directory mode = 770
> inherit permissions = yes
>
> [y]
> security = user
> path = /nas/y
> writable = yes
> guest ok = no
> force create mode = 770
> force directory mode = 770
> inherit permissions = yes

7. sambaの起動
sudo systemctl restart smbd

ディスクの監視

ディスクに不良セクタが発生したときとかに通知が来ないと困ります。WindowsならCrystalDiskInfoですべてできるので非常に便利ですが、Linuxの場合だともう少し面倒です。

これは別の記事で書こうと思います。

動作確認

Windows側からアクセスして、速度を図ってみました。1G LANだと125MB/s

同期

これが迷いどころです。今回作ったNASは研究室にあって、以前のNASは自宅にあります。自宅のNASをたたむつもりはないので同期を行う必要があります。シェルスクリプトで簡単な同期を行うか、適当なフリーソフトを使うか、競合した時の処理はどうするか…などなど悩んでいるのでこれも違う記事に書こうと思います。

参考文献

[1] CGBeginner「UbuntuにZFSを導入しSambaファイルサーバにする」
ZFS の初期セットアップ(1~5)を参考にしました。

[2] ArchWiki「ZFS」
zpool周りを参考にしました。

[3] CGBeginner「ZFSのARCサイズを変更する」
ARCのサイズの確認(7)を参考にしました。

[4] Digital Huge Technology「UbuntuでZFSを使ってみよう 第12回 ARCとZILについて知ろう」
ARCのサイズ変更の方法(9)で参考にしました。

[5] Digital Huge Technology「UbuntuでZFSを使ってみよう 第18回 zfs でファイル共有してみよう」
sharenfsやsharesmbについて書かれています。

[6] Riaan’s SysAdmin Blog「ZFS on Linux SMB Sharing」
sharesmbを試しに使ってみたけど、ZFSとSambaを別々にしたほうがいい、だそうです。sharesmbの設定方法について書かれています。

[7] reddit「Creating a SMB share with my ZFS pool」
普通にSambaをつかったほうがいろいろ設定できるし、性能も同じ、だそうな。

[8] SOFTELメモ「【Linux】グループでディレクトリを共有して利用するとき」
SGIDビットの立て方を参考にしました。

[9] Server World「Ubuntu 24.04 Samba : アクセス権付の共有フォルダー作成」
smb.confの例を各行の説明とともに書いてくれています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)