🫠

TeraStation共有フォルダ内でのrsyncでハマったこと

2025/01/03に公開

みなさま良いお正月をお過ごしでしょうか。

新年3日目にして、rsyncにハマり出社しました。
オフィスは冷蔵庫なみに冷えててサーバルームにいるようです。

いろいろ試して解消にこぎつけたのでメモ代わりにこの記事を残します。
なおこの記事にTypoがあったら、それはきっと指がかじかんだ所為です。

はまったタスク

さて、昨年12月より休日を利用して、社内のNAS1(Synology 2818RP)からNAS2(TeraStation TS5810DN)へデータ移行するするタスクをこなしてきました。

昨日移行・移行中に更新のあった移行元との同期が完了し、今朝から最後のタスクに取り掛かりました。

データ移行中、オーダー元の部署との相談の中で、追加オーダーとして移行先でのファイル整理が上がってきました。

もともとの計画

移行元)NAS1
 ┗ source
  ┣ A
  ┗ B

➔ rsyncを利用して移行 ➔

移行先)NAS2
 ┗ dist
  ┣ A
  ┃┣ a
  ┃┗ b...
  ┗ B

変更後
NAS2
 ┗ dist
  ┣ a
  ┣ b...
  ┗ B

すでにA、Bの初回同期済だったので、差分同期も考えてもともとの計画どおり差分同期まで完了させ、その後 /NAS2/dist/A から /NAS2/dist 以下へ再びrsyncでデータを転送、検証後Aを消去することにしました。

エラー発生

今朝、以下のようにデータを流し始めました(Zenn公開上ディレクトリ名などは適宜変更してます)。

% rsync -avh --checksum --log-file=略.txt /Volumes/dist/A/ /Volumes/dist/ | tee Stdout-略.txt

流し始めてすぐエラーが出ました。
*エラーのスクショ&ターミナル保存を忘れていて以下ネット調べでの同様案件からおおよそ再現。

rsync: [receiver] close failed on "/Volumes/dist/A/dir_hoge/.file_fuga-2.pdf.mHUk2c": Input/output error
rsync error: error in file IO at receiver.c [receiver=v3.3.0]
rsync: [sender] write error: Broken pipe (32)

初期対応

開いたファイルを閉じられずエラーを起こしたことは分かりましたが、ファイル名に特殊文字も無いのでそこでコケてる風でもない(フラグ)、また元のファイルは問題無く開くのでファイル破損というわけでもないと想像しました。

とりあえずエラーの出たファイルの手動コピーをしてみてエラー無く完了、そのままもう一度コマンドを流しましたが、同ファイルと連番で名前を持つ別ファイルでまた引っかかります。

今度は移行先から同フォルダを削除、フォルダ単体で試行しましたがやはりエラー。

実行元Macは、自宅からTeamViewerでアクセスしていましたが、操作が非常にもっさりしてきており、Macのシステムレベルでもなんかあるのだろうか、はたまたNASかと悩みつつ出社を決めます。

二次対応

出社後念のためTeraStationとMacを再起動し、もう一度同様のコマンドを流してみましたがやはり同じエラーが出ます。TeraStationのログ(細部割愛)を見てみると以下のような状態でした。

Jan  3 16:00:54 TS5810DDCD file_smb[10293]: [User:〓〓] File Open(Read/Write) /mnt/array1/dist/a/dir_hoge/.file_fuga-2.pdf.mHUk2c  
Jan  3 16:00:54 TS5810DDCD file_smb[10293]: [User:〓〓] File Open(Read) /mnt/array1/dist/A/a/dir_hoge/file_fuga-2.pdf  
Jan  3 16:00:56 TS5810DDCD file_smb[10293]: [User:〓〓] File Open(Read) /mnt/array1/dist/A/a/dir_hoge  
Jan  3 16:00:56 TS5810DDCD file_smb[10293]: [User:〓〓] File Open(Read) /mnt/array1/dist/A/a/dir_hoge/file_fuga-1.pdf  
Jan  3 16:00:56 TS5810DDCD file_smb[10293]: [User:〓〓] File Open(Read) /mnt/array1/dist/a/dir_hoge  
Jan  3 16:00:56 TS5810DDCD file_smb[10293]: [User:〓〓] File Open(Read) /mnt/array1/dist/a  
Jan  3 16:00:56 TS5810DDCD file_smb[10293]: [User:〓〓] Remove File /mnt/array1/dist/a/dir_hoge/.file_fuga-2.pdf.mHUk2c  
Jan

ログを見ると、ファイル転送される前に、移行先に一次ファイルを作成しています(rsyncの仕様でした)。エラーログで引っかかっているのもこれです。一次ファイルを作成➔閉じようとして失敗➔エラーという流れは分かりました。

The receiver will read from the sender data for each file identified by the file index number. It will open the local file (called the basis) and will create a temporary file.
How Rsync Works A Practical Overview

とはいえ、昨日までは、Synology NAS ➔ Mac ➔ TeraStationという流れで問題無く稼動していたのに、なぜTeraStation ➔ Mac ➔ TeraStationという流れでは駄目なのか。

ひらめき

TeraStationのログを見ていて、そういえばMacからTeraStationへはsmb接続していたことに思い当たりました。一旦MacからTeraStationをマウント解除し、afpで再マウント、再び同じコマンドを流してみました。

するとなんということでしょう。問題なく処理が進みます。

なんだったのか

バンザイしたい場面ですが、理由がわかりません。こういう時に自分のスキル不足を呪います。
内容からして文字コード絡みでなにか起きているのだと推測はしてますが、エラーを起こしたファイルでは次に挙げられた文字は使用していません。じゃあ何やねん!

使用できる文字に制限はありますか(LinkStation/TeraStation)

TeraStation TS5810のファームウェアは管理画面調べで4.00−0.36。最新は5.92。まずはファームウェアをアップして比較もしてみたいのですが、利用現場の制約が明確でなく着手出来ない、という状態です。インターネットとの接続はさせていないのでギリギリ許容していますが…、なんとかしたいものです。

ということでスッキリしませんが今回はここまでにて。
とりあえず解消だけは出来ました。

それでは引き続き、みなさま良いお正月を。

Discussion