SynologyのNASを使っていて、「FileStationでは見えているのに、MacのFinderからSMBで接続するとフォルダが見えない」という経験はありませんか?
実はこれ、パーミッションでもネットワークの問題でもありません。macOSとLinux(Synology)のUnicode処理の違いが原因です。僕はこれで半日、いや丸一日ハマりにハマってようやく解決したところでこれを書いています。同じような状況でハマっている方のために、原因の調査から解決策まで備忘録を残しておきます。
症状:FileStationとFinderで見えるフォルダ数が違う
こんな状況を経験したことがある方は多いのではないでしょうか。
SynologyのFileStationを開くと、共有フォルダの中にサブフォルダが12個ある。ところがMacのFinderからSMBでマウントして同じ場所を開くと、5個しか表示されない。削除した覚えもないし、パーミッションを変えた記憶もない。
さらに不思議なのが、同じフォルダに同じ方法でアップロードしたのに、見えるフォルダと見えないフォルダがある点です。「旅行」フォルダは見える。「ガジェット」フォルダは見えない。一体何が違うのか。
まず疑うべき定番ポイントをすべて確認した
こういったトラブルを調べると、よくある原因としてパーミッションやACL(アクセス制御リスト)の問題が挙げられます。順番に確認していきました。
SMBの再マウント・キャッシュクリア
まず手軽なところから試しました。
- FinderからNASを切断して再接続
- Macのターミナルで
sudo dscacheutil -flushcacheを実行 - SMB設定ファイル
/etc/nsmb.confでキャッシュ無効化
いずれも効果なし。
パーミッション・ACLの確認
SynologyにSSHで接続して ls -la を実行してみると、全フォルダが drwxrwxrwx+ で所有者も user: users に統一されていました。パーミッション的には問題なさそうです。
次に末尾の + が気になりました。これはACLが設定されていることを示すサインです。synoacltool -get で全フォルダのACLを確認してみると……全部まったく同じ内容でした。
ACL version: 1
Archive: is_inherit,is_support_ACL
Owner: [user(user)]
[0] group:administrators:allow:rwxpdDaARWc--:fd--ACLも問題なし。詰まってきました。
Macのターミナルから直接確認
SMBでマウントしたドライブをターミナルから ls -la してみると、Finderと同じく5個しか表示されません。
でもこれは重要な手がかりです。Finderの表示バグではなく、SMB越しに見えていないということが確定。
真犯人を特定したコマンド
ここで試したのが cat -v オプションです。これはファイル名に含まれる制御文字や特殊バイトを可視化してくれます。
ls /volumes/nas-drive/photos | cat -v出力を見て、すぐに異変に気づきました。
旅行
M-^CM-^FかM-^B゛M-^CM-^H
画像素材
壁紙
M-^WM-^EM-^LM-^L...見えているフォルダ(「旅行」「画像素材」「壁紙」など)は普通に日本語で表示されています。ところが見えないフォルダの名前は M-^C のような謎のバイト列になっています。
これがUnicode NFD/NCFの問題です。
原因:macOSのUnicode NFD問題
NFCとNFDとは何か
Unicodeには同じ文字を異なるバイト列で表現する方法が複数あります。日本語の「が」を例に取ると:
| 形式 | 表現 | 内部構造 |
|---|---|---|
| NFC(合成形) | が | 1文字(U+304C) |
| NFD(分解形) | が | か(U+304B)+ ゛(U+3099)の2文字 |
どちらも画面上は同じ「が」に見えますが、コンピュータの内部ではまったく別のバイト列として扱われます。
macOSはNFDを使う
AppleはHFS+(旧来のmacOSファイルシステム)の設計時に、ファイル名の比較処理を単純化するためにNFDを採用しました。APFSに移行した現在も、後方互換のためにこの挙動が残っています。
そのため、Mac上で動くツール(rclone、rsync、Finderのコピー機能など)でファイルをアップロードすると、日本語を含むファイル名がNFD形式でNASに書き込まれます。
SynologyのSMBはNFC前提
SynologyはLinuxベースで動いており、ファイルシステムはBtrfsやext4です。これらはNFCを前提としています。
DSMのFileStationはOS内部から直接ファイルシステムにアクセスするので、NFDで書かれたファイル名もそのまま表示できます。しかしSMBプロトコル経由でアクセスする場合、NFDのファイル名はNFCとして正しくマッピングされず、クライアント(Mac)から「存在しないもの」として扱われてしまいます。
なぜ一部のフォルダだけ見えていたのか
見えていたフォルダの名前を改めて確認すると、「旅行」「壁紙」「画像素材」など、濁点・半濁点を必要としない文字だけで構成されていました。
これらはNFCとNFDで表現が変わらないため、SMB越しでも正常に見えていたわけです。一方「ガジェット」「_ブログ」「風景など」のように濁点や半濁点を含む文字が使われているフォルダは、NFDで書かれていたために見えなくなっていました。
解決方法:PythonでNFD→NFC一括変換
原因がわかれば解決は簡単です。SSHでSynologyにログインして、Python3のスクリプトでNFDのファイル名をNFCに変換します。
まず確認だけ実行する(ドライラン)
実際に変換する前に、どのフォルダ・ファイルが対象になるかを確認します。
python3 -c "
import os, unicodedata
base = '/volume2/homes/user/photos'
for name in os.listdir(base):
nfc = unicodedata.normalize('NFC', name)
if name != nfc:
print(f'要修正: {nfc}')
"見えていなかったフォルダ名が一覧で出てくれば、スクリプトが正しく動いています。
全体を再帰的に変換する
確認できたら、以下のスクリプトで全体を変換します。topdown=False(深い階層から処理)にすることで、親フォルダをリネームした後に子フォルダが消えるという事故を防げます。
また、まれにNFC版のフォルダがすでに存在している場合(NFDとNFCの両方が混在しているケース)は、中身をマージしてNFD版を削除します。
import os, unicodedata, shutil
for root, dirs, files in os.walk('/volume2/homes/user/photos', topdown=False):
# ごみ箱フォルダはスキップ
if '#recycle' in root:
continue
for name in dirs + files:
nfc = unicodedata.normalize('NFC', name)
if name != nfc:
src = os.path.join(root, name)
dst = os.path.join(root, nfc)
if os.path.exists(dst):
# NFC版がすでに存在する場合はマージ
for item in os.listdir(src):
shutil.move(os.path.join(src, item), os.path.join(dst, item))
os.rmdir(src)
print(f'マージ完了: {dst}')
else:
os.rename(src, dst)
print(f'修正完了: {dst}')これをSSH上で実行した後、MacのFinderでNASを再マウントすると、見えていなかったフォルダがすべて表示されるようになります。
注意点として、フォルダだけでなくファイル名も同じ問題が起きます。 上記のスクリプトは dirs + files で両方を処理しているので、ファイルも含めて一括で修正されます。
再発防止策
一度修正しても、またMac上からアップロードすれば同じ問題が再発します。根本的に解決するには2つのアプローチがあります。
アップロードツールの設定を変更する
rcloneを使っている場合は、コマンドラインオプションまたは設定ファイルで対応できます。
# コマンドラインで指定する場合
rclone copy /local/path remote:path --local-unicode-normalizationrclone.confに書く場合:
[mynas]
type = smb
unicode_normalization = trueタスクスケジューラで定期的に修正する
rclone以外のツールも使う場合や、設定変更が難しい環境では、SynologyのタスクスケジューラでNFC変換スクリプトを定期実行する方法が確実です。
DSMの コントロールパネル → タスクスケジューラ → 作成 → スケジュールされたタスク → ユーザー定義スクリプト から設定できます。
定期実行用のスクリプト(毎日深夜に実行する想定):
#!/usr/bin/env python3
import os, unicodedata
for root, dirs, files in os.walk('/volume2/homes/user', topdown=False):
if '#recycle' in root:
continue
for name in dirs + files:
nfc = unicodedata.normalize('NFC', name)
if name != nfc:
src = os.path.join(root, name)
dst = os.path.join(root, nfc)
if not os.path.exists(dst):
os.rename(src, dst)まとめ
今回の問題を整理するとこうなります。
- 症状:SynologyのFileStationでは見えるのに、MacのFinder(SMB接続)から見えないフォルダがある
- 原因:macOSがNFD形式でファイル名を書き込むため、SynologyのSMBがNFCとして認識できない
- 見分け方:
ls /volumes/NAS名/フォルダ名 | cat -vで文字化けしているかどうかで判断できる - 解決策:SSHからPython3スクリプトでNFD→NFC変換する
- 再発防止:rcloneのオプション設定 or タスクスケジューラで定期変換
SynologyとmacOSを組み合わせて使っている方にはかなりよくある問題のようで、同じ症状で悩んでいる方の参考になれば幸いです。
特に日本語ファイル名を多用している環境では発生しやすいので、「なんか一部のフォルダが見えない気がする」という違和感を感じたら、まず cat -v で確認してみてください。
