WD My Book Live から NEC Aterm WR9500N の共有USBディスクへrsyncする方法

WD My Book Live 2.0TBからNEC Aterm WR9500Nの共有USBディスクへrsyncする方法です。
NEC Aterm WR9500Nには背面のUSBポートに接続したUSBフラッシュメモリやUSBハードディスクを簡易NASとして使える機能が実装されています。

接続できるUSBフラッシュメモリおよびUSBハードディスクはフォーマット形式がFAT16またはFAT32のみです。
簡易NASはそのFAT16またはFAT32のあらゆる制限を受けるのです(特にrsyncでは影響が大きい)。
これはルーターから外してWindowsパソコンに接続すれば読み書き可能なメリットを優先した結果なのだと推測しています。

前に投稿しましたが、WD My Book Live 2.0TBのセーフポイント機能はNEC Aterm WR9500Nの共有USBディスクへは正常に機能しません。
データは転送されますが異常終了してしまうので、セーフポイントが完了しない=復元可能なバックアップデータと見なされないのです。
実際に転送されたデータを見ると日本語(ファイル名・ディレクトリ名)が文字化けしていますから使えません…。

セーフポイントを使うのを諦めて、rsyncを使ってデータ転送を行います。
以下はとりあえず作ってみたシェルスクリプトです。
使うなら適宜編集してください。

#!/bin/sh

User="admin"
Pass="パスワード"
Cp="cp932"
Ic="utf8"
Cifs="//<-AtermWR9500NのIPアドレス->/<-共有名->/Backup"
Source="/shares/Public/"
Target="/media/WDSAFE/Backup"
Op1="-rlptDvh"
Op2="--modify-window=2"
Op3="--delete"
Op4="--progress"
Op5="--stats"
Op6="--exclude-from=/etc/nas/NSPT/exclude.txt"
Op7="--delete-excluded"
Log="/var/log/rsync.log"
cmd1="mkdir -p ${Target}"
cmd2="mount -t cifs -o user=${User},password=${Pass},codepage=${Cp},iocharset=${Ic} ${Cifs} ${Target}"
cmd3="rsync ${Op1} ${Op2} ${Op3} ${Op4} ${Op5} ${Op6} ${Op7} ${Source} ${Target}"
cmd4="umount ${Cifs}"
cmd5="rmdir ${Target}"

echo -n "exec \"${cmd1}\" " && ${cmd1}
if [ $? -eq 0 ]; then
  echo "Success!!"
else
  echo "faild..."
  exit 1
fi

echo -n "exec \"${cmd2}\" " && ${cmd2}
if [ $? -eq 0 ]; then
  echo "Success!!"
else
  echo "faild..."
  ${cmd5}
  exit 1
fi

echo -n "exec \"${cmd3}\" " && ${cmd3} >${Log} 2>&1
if [ $? -eq 0 ]; then
  echo "Success!!"
else
  echo "faild..."
fi

sync; sync; sync
sleep 180

echo -n "exec \"${cmd4}\" " && ${cmd4}
if [ $? -eq 0 ]; then
  echo "Success!!"
else
  echo "faild..."
fi

echo -n "exec \"${cmd5}\" " && ${cmd5}
if [ $? -eq 0 ]; then
  echo "Success!!"
else
  echo "faild..."
  exit 1
fi

= シェルスクリプトの解説 =

3: User=”admin”
Atermの共有ファイルをCIFSマウントする際に必要なユーザID

4: Pass=”パスワード”
Atermの共有USBディスクをCIFSマウントする際に必要なユーザIDのパスワード(平文で記述)

5: Cp=”cp932″
AtermWR9500Nの共有USBディスクの漢字コード。cp932はShift_JISを独自に拡張した文字コードです。
mountオプションとしてcodepage=cp932を指定しないと日本語(ファイル名・ディレクトリ名)が文字化けします。

6: Ic=”utf8″
WD My Book Liveの漢字コードです。

7: Cifs=”//<-AtermWR9500NのIPアドレス->/<-共有名->/Backup”
WD My Book LiveにリモートマウントするAtermWR9500Nの共有アドレスを設定します。
<-共有名->は搭載しているHDDのメーカーによって変わる可能性がある。
<-共有名->/Backup と”/Backup”を足しているのは<-共有名->だけをリモートマウントすると”-t”オプション付きのrsyncでエラーが出るため。

8: Source=”/shares/Public/”
バックアップ元となるディレクトリを設定します。
末尾の”/”が有りと無しでは動作が変わるので要注意。

9: Target=”/media/WDSAFE/Backup”
バックアップ先となるディレクトリを設定します。
このディレクトリにAtermWR9500Nの共有USBディスクをリモートマウントします。

10から16:
rsyncのオプションです。

11: Op2=”–modify-window=2″
AtermWR9500Nの共有USBディスクを使うときには必須のオプションです。
FAT32のファイルシステムに対してrsyncを行うとFAT32ファイルシステム側の時刻精度がゆるいので、毎回全てのデータが変更されていると判断され、全てのデータが転送されるというrsyncのメリットが全く生かされないので、2秒までの時刻の誤差を許容させます。

17: Log=”/var/log/rsync.log”
rsyncコマンドの実行結果を保存するファイル名を指定します。
何も保存したくなければ Log=”/dev/null” とします。

18から22:
実行するコマンドを変数に代入しています。

参考までに130GBを転送完了するまで7時間15分前後掛かりました。
ネットワークの状況や1ファイルあたりのサイズによって時間は前後します。
WD My Book Live と AtermWR9500N が1Gbpsでリンクアップしていてもスループットは5MByte/sec出れば良い方でした。