Raspberry Pi 5でNAS転送を高速化する方法(SMB署名を維持したまま2.5GbEを活かす)

以前、自宅にて旧NAS(4TBが満杯)から新NAS(LS720D0802)へ全ファイルを転送しました。結果、4TBを転送するのに4日間かかるというおそろしい遅さを体験しました。

なぜ2.5GbEなのに遅いのだろうと疑問に感じました。そこで色々と公式ドキュメントやBuffaloのLS720D0802の製品ページを参照したところ、わかってきたことがありました。CPUです。

  • SMB署名あり:約80MB/s
  • SMB署名なし:400MB/以上

この差の原因は明確で、SMB署名によるCPU負荷です。

結論からいうと、SMB署名をWindowsで切ってしまえば、200MB/sを超える速度がだせます。

自宅でNASを運用する際はSMB署名を切ったとしても、セキュリティ上ほとんどリスクがないと思います。しかし中小企業でSMB署名を切った場合、なりすまし等危険性が跳ね上がります。

そこで、「SMB署名を切らずにLS720Dは速度を出せるか」ということを考えてみました。

SMB署名あり(2.5GbE環境)
SMB署名なし(2.5GbE環境)

本記事では、Raspberry Pi 5を終端ノードとして活用し、SMB署名を維持したまま2.5GbEに迫る転送速度を実現する方法を解説します。

結論(最短手順)

  • Raspberry Pi 5にSSDキャッシュを構築
  • PCからRaspberry Pi 5はSMB(署名あり)
  • Raspberry Pi 5からNASはrsync(署名なし)
  • USB 2.5GbE NIC+cat6a+2.5GbE対応スイッチングハブを使用

この構成により、SMB署名ありでも約1.5〜2倍の速度(200MB/s台)改善を実現しました。

注意(免責事項)

  • NASに関わる以上、本設定によるデータ消失の責任は負いかねます。必ずバックアップをしてください。
Raspberry Pi 5、アクティブファン、電源、cat6aケーブル、NICは写っていません。

本構成はLinux、ネットワーク、ファイル共有の基本知識を前提としています。また、環境により性能は変動します。

なぜ低スペックNASは遅いのか?

SMB署名はセキュリティ強化のための機能です。
安全のためには必要ですが、次のような特性も持ち合わせています。

  • CPU依存処理
  • NAS側での計算負荷増大

家庭用NASではCPU性能が低く、ネットワーク帯域よりもCPUが先に限界になります。

低スペックNASではこれが致命的なボトルネックになります。特にNASのCPUが貧弱だと「2.5GbE対応」と書かれていても、対応はしているけれども速度はでないという状態にもなります。

代表的なNASについて、それぞれのスペックを見てみます。

項目Buffalo LS720DQNAP TS-264UGREEN DXP2800
CPU構成6コア (ARM系)4コア (Intel Celeron)4コア (Intel N100)
アーキテクチャ非公開 (組込用)Jasper LakeAlder Lake-N
メモリ非公開 (少なめ)8GB (固定)8GB (DDR5/拡張可)
LANポート2.5GbE x12.5GbE x22.5GbE x1
性格外付けHDDに近い高機能なサーバーメディアセンター
価格(2026.4.5時点)50,000円(HDD付き)95,000円(HDD別)60,000円(HDD別)

QNAPとUGREENはIntel搭載であるためAES-NI(暗号化加速)が効きます。SMB署名ありでも力業で200MB/s以上は見込めます。値段が安い代わりにLS720DのCPUは貧弱です。

全体の設計

PC–(SMB署名あり)–>Raspberry Pi 5 [SSD キャッシュ]–(rsync)–>NAS(LS720D)

これは「計算」と「保存」を分離するイメージで設計しました。全て2.5GbE対応スイッチにcat6aケーブルで接続されており、環境だけは完璧に2.5GbEになっています。

この記事で解決すること

  • SMB署名による速度低下の回避
  • 2.5GbE環境の性能最大化
  • Raspberry Pi 5による中継構成の構築

用意するもの

低スペックのNASはすでにあるものとして、次のものを用意してください。

  • Raspberry Pi 5(8GB推奨)
  • 公式電源・アクティブファン
  • microSDカード(16GB以上)
  • Raspberry Pi OS Lite(64bit)Bookworm
  • USB 2.5GbE NIC
  • SSD(500GB以上)
  • cat6aケーブル
  • 2.5GbE対応スイッチ
2個あるUSB3ポート。上段にSSD+type-c to USB-A変換器、下段にNIC+cat6a

実際に行ったNAS速度アップの方法

NASの速度を上げるために様々な方法を試しました。速度が変わらなかったり、設定ではなくハードの問題や電源の問題も考えました。

順番通りにコマンドを打っていけば、うまくいくと思います。ただし、いわゆる「おま環」ということもあるので、100%の保証はできません。

Raspberry Pi 5のアップデート

まずはRaspberry PiにOSを入れた後に行うお決まりのアップデートをします。

sudo apt update
sudo apt full-upgrade -y
sudo reboot

sudo rebootはしない人もいますが、一応更新のつもりで毎回行っています。

必要パッケージのインストール

sudo apt install -y samba cifs-utils rsync

これらは今回のコマンド群の中でも大事な3つのパッケージです。

  • samba:WindowsやMacからラズパイのフォルダを見えるようにするサーバーソフト。
  • cifs-utils:Raspberry Piから他のPCやNASの共有フォルダに繋ぐためのクライアントツール。
  • rsync:データの同期と高速バックアップに必要です。

Network Interface Card (NIC)の確認

ネットワークインターフェイスカードというよりも、ネットワークアダプターと言った方がしっくりくる人がいるかもしれません。この記事ではNICということにします。

ip a

NICがどこで認識されているのかを確認します。

  • eth0…未使用
  • eth1…192.168.x.x

仕様をしていないEthernet0(eth0)は誤作動防止のために無効化してしまってもいいかもしれません。

sudo ip link set eth0 down

ユーザーの作成

ここからは順番が大事になってきます。まず初めに行うことはユーザーの作成です。

sudo adduser naspi
sudo passwd -a naspi

今回はnaspiというユーザーを追加し、naspiのパスワードを設定します。

この記事内ではRaspberry Piへssh接続するときの名前をpinasとホスト名をpinasに、ユーザー名をnaspiとして加えます。

SSDのセットアップ

ここからは少しずつ複雑になってきます。

lsblk

これを実行すると、USBに接続しているSSDの名前がわかります。多くの場合はsda1ですが、環境によってはsdb1であったり、単にsdaだったりします。
SSDがどのように認識されているかを確認してください。今回はsdaにしたいと思います。

sudo mkfs.ext4 -F /dev/sda
sudo mkdir -p /srv/cache
sudo blkid /dev/sda
  • 1行目は/dev/sda(SSD)を強制的(-F)にext4というlinuxの標準的な形式にフォーマットしています。もちろん全データは消去されます。
  • 2行目はディレクトリを作成します。-p は親ディレクトリがなければそれも一緒に作る、という意味があります。/srv/cacheは作成する場所を指示しています。/srvはサービス用のデータを置く場所として使われます。今回はここをNASのキャッシュや保存先として使うための接続先として用意しました。
  • 3行目はドライブのUUID(固有識別番号)を調べるためです。sdaは環境の変化によってsdbなど色々変わってしまうことがあります。その点UUIDは変わることがないので安定します。

このタームで一番大事なものはblkidで調べたUUIDです。これをfstabの編集で使います。

sudo nano /etc/fstab

# fstabに書き込む
UUID=XXXX-XXXX /srv/cache ext4 defaults,notime,nodiratime 0 2

defaults.noatime,nodiratime、これらマウントオプションについて補足します。

  • defaults:標準的な設定(読み書き可能、起動時マウントなど)を一括適用します。
  • noatime:最終アクセス時刻を更新しないことで、動作を速くし、ディスクの寿命も守ります。
  • nodiratime:フォルダを開いただけでアクセス時刻を更新しないようにしています。
  • 0:dumpによるバックアップが必要か否か。今は使われないので普通は0です。
  • 2:起動時のディスクチェックの順番です。1はOSの領域、2はそれ以外の領域です。

fstabを更新した場合は、その内容を反映させる必要があります。特にsudo systemctl daemon-reloadは忘れやすいので気を付けてください。

sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo mount -a
df -h
  • 1行目はシステムの管理者systemdを再実行しています。念には念をという意味合いが強いです。
  • 2行目は設定ファイルの変更をシステムに通知します。「設定変わったから見てください」と言っています。
  • 3行目は/etc/fstab に書かれた設定を今すぐ実行しますという意味です。-aはallです。
  • 4行目は現在のディスク使用量と接続状況を人が見やすい形で表示します。Disk Free -Humanです。

NASマウント

NASをマウントする上でもfstabに書き込みます。

sudo mkdir -p /mnt/nas
sudo nano /etc/fstab

# fstab、先ほど書いたものの下の行に書きます
//192.168.0.x/share /mnt/nas cifs username=USER,password=PASS,vers=3.0,iocharset=utf8,_netdev,nofail 0 0
  • username=USERにはNASのユーザー名を入れてください。
  • password=PASSも同じくNASのパスワードを入れます。
  • vers=3.0はSMBプロトコルのバージョンです。Buffalo製品は2.1を推奨しているものもあるので、仕様を確認してください。
  • _netdev:ネットワークが繋がってからマウントするという命令です。起動時、ネットが繋がる前にマウントしようとしてエラーになることを防ぎます。
  • nofail: もしNASやPCが電源OFFでも、エラーを無視してラズパイの起動を続行させる設定です。

fstabの設定を変更したので、システムに変更した旨を伝えます。

sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo mount -a
ls /mnt/nas

Samba設定

ここで【ユーザーの作成】で作ったnaspiというユーザーを使うことになります。

sudo nano /etc/samba/smb.conf

#最下段に書き込んでも構わないと思っています。
[global]
workgroup = WORKGROUP
security = user
server signing = mandatory
server min protocol = SMB2
server max protocol = SMB3

[cache]
path = /srv/cache
browseable = yes
read only = no
valid users = naspi
create mask = 0775
directory mask = 0775

色々書いていますが要は次のようなことについて書かれています。

  • Linuxユーザーがいなければ作成します。(既にある)
  • Windowsから接続する時びのSamba用パスワードを設定します。
  • 所有者を naspi に変更します。
  • /srv/cache というフォルダに対して、naspiとnaspiグループは自由にファイルを読み書きできるけれど、部外者には勝手に消されない。775と権限を付与します。

結論として、ボトルネックは「SMB署名処理の計算」です。

この/srv/cacheフォルダの持ち主をnaspiとグループnaspiにするために、次のコマンドを書きます。

sudo chown -R naspi:naspi /srv/cache
sudo systemctl restart smbd

systemctl restart smbdでSambaサーバーを再起動して、[cache]を読み込ませる。

動作確認

Windowsのエクスプローラーから\\192.168.0.x\cache(もしくは\\pinas\cache)にアクセスできるかを確認します。

ユーザー名naspi、設定したパスワードが通れば完成です。
アクセスできたら、D:\testに置いてある32GBのダミーファイルを送りPC-Raspberry Pi 5までの速度をみます。

robocopy "D:\test" "\\pinas\cache" "dummy_32GB.bin" /J /R:0 /W:0 /MT:8 /V /TS /FP

同期スクリプトの作成と実行

まずはnas_sync.shを作り、中身を書き込みます。.

sudo nano /usr/local/bin/nas_sync.sh

# /srv/cacheにあるファイルを/mnt/nas/へrsyncでバックアップする
#!/bin/bash
SRC="/srv/cache/"
DST="/mnt/nas/"

echo "==== SYNC START ===="

if ! mountpoint -q /mnt/nas; then
echo "ERROR: NAS not mounted"
exit 1
fi

rsync -av --inplace --size-only "$SRC" "$DST"
echo "==== DONE ===="

nas_sync.shに実行権限を与えます。

sudo chmod +x /usr/local/bin/nas_sync.sh

テストを行います。

sudo /usr/local/bin/nas_sync.sh

実測:結果から見えること

これで一応の設定は終わりました。最終的にNASへファイルが転送される速度を実測します。
送るファイルは32GBのダミーファイル「dummy_32GB.bin」です。
D:\から\\pinas\cacheに送ります。

まずはRaspberry Pi 5側へrobocopyで速度を計算するとともにファイルを1つ送ります。

robocopy "D:\test" "\\pinas\cache" "dummy_32GB.bin" /J /R:0 /W:0 /MT:8 /V /TS /FP

(SMB署名ありPC→Pi)
423,410,207 B/s = だいたい404MB/sという速度がでました。ほぼ25.5GbEの上限といっていいのではないでしょうか。

PCからRaspberry Pi 5の\\pinas\cacheにダミーファイルを送る

PCからRaspberry Pi 5までの速度は上々でした。本命はRaspberry Pi 5からNASのLS720Dへ送る速度です。
ただ、robocopyではなくrsyncでRaspberry Pi 5からLS720Dへdummy_32GB.binを送ります。

sudo /usr/local/bin/nas_sync.sh
rsyncでRaspberry Pi 5からNAS(LS720D)へダミーファイルを送る
経路と手法速度 (Bytes/sec)速度 (MB/s)備考
PCからLS720D(SMB署名)78,258,213約78MB/s1GbE環境の標準的〜やや控えめな速度
PCからRaspberry Pi 5 (Robocopy)422,629,008約422MB/s2.5GbE以上の速度が出てしまった。
RPi 5からLS720D (rsync)231,435,199約231MB/sいい結果。 2.5GbEに迫る速度。

Raspberry Pi 5のSSDと2.5GbE LANの組み合わせがうまくかみ合った結果、一時的に速度が出たのだと思います。おそらく180MBから230MBが妥当だと思います。
今回の設定でRaspberry Pi 5が高速キャッシュサーバーみたいになっています。

PCからNASは手軽ですが、PCからRaspberry Pi 5を通してNASへファイルを送った方が速いようです。

再起動後も設定を保持する

このままだと電源が落ちたり再起動した場合、変わるものや残るものがあります。
RAM上の設定は再起動で色々消えてしまいます。残る方について触れたいです。

  • aptで入れたものは完全に残ります
  • 設定ファイルも残ります。/etc/smb.conf、/etc/fstab、/etc/sysctl.fonfなど。
  • 自作のスクリプト。/home/pinas/nas_sync.sh

おそらく、今の状態で再起動するとSamba設定やrsyncスクリプトは残ります。ip routeなどはRAMなので揮発してしまうと思います。

systemdで設定を永続

まずはサービスファイルを作成します。

sudo nano /etc/systemd/system/static-route.service

# 
[Unit]
Description=Static Route Setup
After=network-online.target
Wants=network-online.target

[Service]
Type=oneshot
ExecStart=/sbin/ip route replace 192.168.0.0/24 dev eth1 metric 100
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
  • 先走りエラーを防ぐためネットワークが完全に準備できてから実行するようにします。
  • replaceを使い、既にルートが存在していても、エラーにならずに上書き更新をします。
  • RemainAfterExit=yesで終了後にsystemdが「終了、後片付け開始」と判断して挙動が不安定になるのを防ぎます。
  • WantedBy=multi-user.target: 通常の起動プロセスの過程で自動起動するように設定します。

systemdに新しいファイルを認識、起動時に自動実行、すぐ実行、状態を確認をします。

sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl enable static-route.service
sudo systemctl start static-route.service

バッチファイルを使って簡単に使う

いちいち、ssh接続をしてパスワードを入力し、/usr/local/bin/nas_sync.shを行うのは面倒です。

手動で試しに動かす

Windows PowerShellで動くか動かないかを見極めます。

ssh pinas@192.168.0.x "/usr/local/bin/nas_sync.sh"

これが動けば次の段階に進めます。

ダブルクリック用バッチファイル(パスワード入力有り)

バッチファイルを作成します。仮に名前をsync.batとします。

@echo off
echo ==== NAS SYNC START ====
ssh pi@192.168.0.X "/usr/local/bin/nas_sync.sh"
pause

これでダブルクリックで実行できます。ただ、このままではパスワードを入力する必要があります。

パスワードなしバッチファイルの作成

まずWindowsで鍵作成を行います。

ssh-keygen

これで~/.sshに鍵が作られます。拡張子が.pubの方を使います。もう一つの方は絶対に公開してはいけません。

鍵の情報をRaspberry Pi 5に渡す方法①:無理やり方式

次にRaspberry Pi 5に送るのですが、手動で送る方法とtypeとsshを組み合わせて無理やりPiに送り込む方法があります。
今回は無理やり送り込む方法を採用しました。

仮に鍵の名前がkey.pub、ユーザー名がpinas、IPが192.168.0.x、とします。

type $env:USERPROFILE\.ssh\key.pub | ssh pinas@192.168.0.x "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"

数行にわたって表示されると思いますが、これは一行です。Windows PowerShellで一行として実行してください。

  • type:Windows側の公開鍵の中身を読み出します。
  • | ssh:Raspberry Pi 5にログインし、読み出した中身を渡します。
  • mkdir -p ~/.ssh:Raspberry Pi 5側に保存用フォルダを作ります。
  • cat >>:渡された鍵の中身をauthorized_keysに追記します。
  • chmod:セキュリティのために権限を正しく設定します。

ながいコマンドの連続ですが、やっていることは単純です。
Windowsで作った鍵の内容を読んで、それをRaspberry Pi 5に渡してauthorized_keyに書き込む、という内容です。

鍵の情報をRaspberry Pi 5に渡す方法②:アナログ手堅い方式

無理やり方式でエラーが出る場合はこちらの手順で成功すると思います。

  • Windows側でkey.pub(公開鍵)をメモ帳などで開き、中身を丸ごとコピーします。
  • sshでRaspberry Pi 5にログインします。
  • Raspberry Pi 5で次のコマンドを順に実行します。
mkdir -p ~/.ssh
nano ~/.ssh/authorized_keys
  • 開いたテキストエディタに、メモ帳でコピーした鍵の文字列を貼り付けて、保存終了します。
  • 最後に権限を設定します。これをしないと鍵が無視されてパスフレーズを要求されます。
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

設定が終われば、次回からはパスワードを聞かれずにログインできるようになります。

公開鍵があるのにパスフレーズを求められる場合

鍵を置いたのにパスワードを聞かれる場合は、別の原因が考えられます。

  • 公開鍵とフィンガープリントの間違い
    SHA256から始まる英数字の文字列は公開鍵ではありません。公開鍵はssh-rsaやssh-ed25519などから始まるとても長い一行の文字列です。こちらをauthorized_keysに写しましょう。
  • 権限の修正
    Raspberry Pi 5にログインし、以下のコマンドを順番に実行してください。
# .sshフォルダは本人だけが読み、書き、移動できる設定 (700)
chmod 700 ~/.ssh

# authorized_keysファイルは本人だけが読み、書き、できる設定 (600)
chmod 600 ~/.ssh/authorized_keys

# 所有者を念のため自分(pinas)に固定
chown pinas:pinas ~/.ssh ~/.ssh/authorized_keys
  • 公開鍵が正しいか確認
    一行になっているか、変な空白やゴミが混じっていないかを確認します。
# Raspberry Pi 5側で2行に分かれていたり、変な空白が入っていたら
# nanoで開き、バックスペースで繋げます。

cat ~/.ssh/authorized_keys
  • Windows側の秘密鍵の場所
    デフォルト(C:\Users\ユーザー名.ssh\)と違うところに置いた場合は、ログイン時に鍵を指定する必要があります。
ssh -i "鍵のフルパス" pinas@192.168.0.x
  • デバッグで原因を考える
    この状態にまでくると沼にはまったような気持ちになります。Windows PowerShellでなぜ拒否されているのかを特定してください。しかし、情報量がとても多いのでがんばりましょう。
ssh -v pinas@192.168.0.20

send_pubkey: test pk algの後にAuthentications that can continue: passwordと続いた場合は、Raspberry Pi 5は鍵を受け取ったけれども拒否したという意味になります。
前述のchmodで権限を修正すると通る場合があります。

  • Windows側にssh-agentで覚えさせる
    Windowsにパスフレーズを一時的に記憶させることができます。PCを再起動すると忘れてしまいます。条件はわかりませんが再起動後もパスフレーズを聞かれなくなる場合もあります。

    Windows PowerShellを管理者として実行し、順番に打ち込んでください。
# ssh-agentを起動する
Start-Service ssh-agent

# 自動起動に設定する
Set-Service -Name ssh-agent -StartupType Automatic

# 鍵を登録(ここだけパスフレーズを求められれます)
ssh-add $env:USERPROFILE\.ssh\id_ed25519

究極パスフレーズ設定(自宅のみ使用可)

  • パスフレーズを空に作り直す、または変更する
    もし、自宅で自分しかPCを使わないという環境であった場合、パスフレーズ自体いらいないのではないかと疑問に思う人もいると思います。
    その場合は次のコマンドで、鍵を作り直さなくても、パスフレーズだけを削除することができます。
ssh-keygen -p -f $env:USERPROFILE\.ssh\id_ed25519
  • Enter old passphrase: 今のパスフレーズを入力します。
  • Enter new passphrase (empty for no passphrase): ただEnterキーを押します。
  • Enter same passphrase again: ただEnterキーを押します。

おそらくこれで公開鍵がうまく通るようになります。

ダブルクリック用バッチファイル(パスフレーズ入力なし)

公開鍵でのログインが可能になったことで、ダブルクリックのみのRaspberry Pi 5からNASへファイルを転送するバッチファイルを作ることができます。

@echo off
echo ==== NAS SYNC START ====
echo Connecting to Raspberry Pi 5 and starting rsync...

ssh pi@192.168.0.x "/usr/local/bin/nas_sync.sh"

echo ==== DONE ====
pause

これをsync.batとして保存してください。ダブルクリックするだけで、Raspberry Pi 5の\\pinas\cacheに送ったデータがNASへ送られます。

これで終わりです。お疲れさまでした。

失敗ポイントと対処

  • /etc/fstabの記述ミスが原因
  • 変更時のsudo systemctl daemon-reloadを行っていない
  • mount -aでエラー確認

小ネタ: アクティブファンを回す

作業中、Raspberry Pi 5のヒートシンクがかなり熱くなりました。

アクティブファンが回っていないということは、50〜60℃まではいってはいなさそうです。

常時回転にはなるでしょうが、30℃から回してみます。回転数の調節は簡単なので、後々調整します。

sudo nano /boot/firmware/config.txt

Raspberry Pi OS (Bookworm)のconfig.txtの末尾に次の設定を追加してください。

# ファンの温度はミリ単位
dtparam=fan_temp0=30000
dtparam=fan_temp0_hyst=5000

この記述だと30℃でファンが回転して、30,000-5,000=25,000なので、25℃でファンが止まります。

小ネタでした。色々良い塩梅を探します。

よくある質問(FAQ)

Q
Raspberry Pi 4でも可能ですか?
A

可能です。Raspberry Pi 5の方がCPU性能が高く安定して高速です。

Q
SMB署名を無効にすればよくないですか?
A

一番簡単な解決策です。しかし今回の記事の趣旨と異なるため、あえてSMB署名ありで速度を出す方法を考えました。
SMB署名を無効にした際の記事があるのでそちらも見てください。

Q
rsyncではなくrobocopyではダメですか?
A

Raspberry Pi 5からNASへはLinux間通信のため、rsyncの方が親和性や効率の面から速さが出ると思います。

まとめ

LS720DのCPUは非力です。それ故にCPUがSMB署名のボトルネックとなって速度がでませんでした。そこで、「計算」と「ストレージ」に分けることで速度を出すことができました。

計算担当にはRaspberry Pi 5がちょうど良かったです。CPU(Cortex-A76)が、PCとの高速なやり取りや複雑な計算をすべて引き受けてくれました。

倉庫担当のLS720Dは難しい計算をせず、Raspberry Pi 5から送られてきたデータをただ保存するだけのストレージに徹することができました。

低スペックNASでも設計次第で高速化できるという例になれば良いと思います。

リファレンス

コメント