[Amazon FSx for NetApp ONTAP] 文字マッピングをして本来ファイル名に使えない文字をWindowsで表示できるようにした

マルチプロトコルだからこそ互いのプロトコルに思いやりを持って接しよう
2022.12.16

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

~1 って名前のファイルがあるけどなんだ

こんにちは、のんピ(@non____97)です。

皆さんはAmazon FSx for NetApp ONTAP(以降FSx for ONTAP)を使用していて「~1」という名前のファイルに遭遇したいこと思ったことはありますか? それはもしかしたらWindowsで使用できない文字がファイル名に含まれるファイルかもしれません。

Windowsの場合、ファイル名、フォルダ名に以下の文字を含めることはできません。

  • \ : バックスラッシュ
  • / : スラッシュ
  • : : コロン
  • * : アスタリスク
  • ? : 疑問符
  • : ダブルクォーテーション
  • < : 小なり
  • > : 大なり
  • | : パイプ

Linuxクライアントであれば上述の文字を含む名前のファイル、ディレクトリを作成することが可能です。

FSx for ONTAPはNFS/SMBどちらのプロトコルも使用可能です。ONTAPがマルチプロトコルが故に気にしなければならないポイントですね。

マルチプロトコルのファイルサーバーを使っている以上、上述の文字をファイル名を使わないに越したことはないですが、のっぴきならない事情で使う場面もあると思います。

そのような場合は、ボリュームの文字マッピング機能で対応可能です。文字マッピング機能とはその名の通り、上述のようなWindows(正しくはSMBクライアント)で扱えない文字を別の文字に変換する機能です。

試してみたので紹介します。

いきなりまとめ

  • 文字マッピングをすることで本来ファイル名に使えない文字をWindowsで表示できるようになる
  • 文字マッピングはボリュームごと設定する必要がある
    • 下位のジャンクションパスに継承はされない
  • 文字マッピング先の文字は普段使用しない文字が良い
    • 重複してしまうと区別ができず、意図しない挙動をする可能性がある

文字マッピングの仕組み

文字マッピングの仕組みを確認します。

文字マッピングはSMBで接続した場合に動作するようです。NFSクライアントによって作成されたファイルを参照しようとするとONTAPがファイル名をチェックし、SMBクライアントで有効でない文字を含む場合は事前に定義したマッピング情報に基づいて変換します。

SMB クライアントが NFS クライアントによって作成されたファイルにアクセスすると、 ONTAP はファイル名を調べます。ファイル名が有効な SMB ファイル名でない場合は(たとえば、コロンが含まれている場合)、 ONTAP は各ファイルに対して保持されている 8.3 形式のファイル名を返します。ただし、これにより、長いファイル名に重要な情報をエンコードするアプリケーションで問題が発生します。

したがって、異なるオペレーティングシステムを使用するクライアント間でファイルを共有する場合は、両方のオペレーティングシステムで有効な文字をファイル名に使用する必要があります。

ただし、 SMB クライアントで有効でない文字を含む NFS クライアントが作成したファイル名がある場合は、無効な NFS の文字を、 SMB と特定の Windows アプリケーションの両方で有効な Unicode 文字に変換するマッピングを定義できます。たとえば、この機能は CATIAR MCAD および Mathematica アプリケーションをサポートしていますが、同じ要件を持つほかのアプリケーションでも使用できます。

ボリュームでの SMB ファイル名の変換のための文字マッピングを設定します

注意事項は以下の通りです。

  • 文字マッピングは、ジャンクションポイントをまたいで適用されません。
  • 文字マッピングは、各ジャンクションボリュームに対して明示的に設定する必要があります。
  • 無効な文字を表す Unicode 文字が、通常はファイル名に使用されないようにする必要があります。これらの文字が使用されていた場合、不要なマッピングが発生します。
  • たとえば ' コロン (:) をハイフン (-) にマップしようとした場合 ' ファイル名にハイフン (-) が正しく使用されていれば 'Windows クライアントが "a-b" という名前のファイルにアクセスしようとすると ' その要求は NFS 名 "a:b" にマップされます ( 望ましい結果ではありません )
  • 文字マッピングを適用してもまだマッピングに無効な Windows 文字が含まれている場合、 ONTAP は Windows 8.3 ファイル名にフォールバックします。
  • FPolicy 通知、 NAS 監査ログ、セキュリティトレースメッセージでは、マッピングされたファイル名が表示されます。
  • タイプが DP である SnapMirror 関係が作成されても、ソースボリュームの文字マッピングはデスティネーション DP ボリュームにレプリケートされません。
  • 大文字と小文字の区別:マッピングされた Windows 名は NFS 名に変換されるため、名前の検索は NFS のセマンティクスに従います。NFS ルックアップでは大文字と小文字が区別されるという事実も含まれます。つまり、マッピングされた共有にアクセスするアプリケーションは、 Windows の大文字と小文字を区別しない動作に依存しません。ただし、 8.3 形式の名前は大文字と小文字が区別されません。
  • 部分マッピングまたは無効なマッピング:ディレクトリ列挙(「 dir 」)を実行しているクライアントに返すように名前をマッピングしたあと、結果の Unicode 名について Windows の有効性がチェックされます。その名前にまだ無効な文字が含まれている場合、または Windows で無効な文字が含まれている場合(「 . 」または空白で終わる場合など)は、無効な名前の代わりに 8.3 形式の名前が返されます。

ボリュームでの SMB ファイル名の変換のための文字マッピングを設定します

マッピングできる文字は以下の通りです。

Unicode 文字 説明
0x01-0x19 Not applicable 表示されない制御文字
0x5C \ バックスラッシュ
0x3A : コロン
0x2A * アスタリスク
0x3F ? 疑問符
0x22 " ダブルクォーテーション
0x3C < 小なり
0x3E > 大なり
0x7C | パイプ
0xB1 ± プラスマイナス

検証環境

検証環境は以下の通りです。

ファイル名がUTF-8の4バイト文字に対応するよう設定してみたの検証環境構成図

AD DCは以下記事の検証をしたときの環境をそのまま使用します。

Windows上で使用できない文字を含むファイル名のファイルをNFSクライアントから作成し、AD DCから表示しようとするとどのような挙動をするのか確認します。

やってみた

それでは、やってみます。

NFSクライアントからFSx for ONTAP上のジャンクションパスが/vol1のボリュームをマウントし、<コロン>:です.txtというファイルを作成します。

# /vol1 をマウント
$ sudo mount -t nfs svm-07a067590e6c8fb2b.fs-0ca3d1e244ed3089b.fsx.us-east-1.amazonaws.com:/vol1 /mnt/fsxn/

# NFSで /vol1 をマウントできたことを確認
$ df -hT -t nfs4
Filesystem                                                                   Type  Size  Used Avail Use% Mounted on
svm-07a067590e6c8fb2b.fs-0ca3d1e244ed3089b.fsx.us-east-1.amazonaws.com:/vol1 nfs4  973M  448K  973M   1% /mnt/fsxn

# <コロン>:です.txt という名前のテキストファイルを作成
$ echo コロン | sudo tee /mnt/fsxn/\<コロン\>:です.txt > /dev/null

# ファイルが作成されたことを確認
$ ls -l /mnt/fsxn/
total 0
-rw-r--r-- 1 root root   10 Dec 13 05:50 <コロン>:です.txt

# ファイルの内容を表示できるか確認
$ cat /mnt/fsxn/\<コロン\>\:です.txt
コロン

作成できました。

次にAD DCのZドライブにルートボリュームのファイル共有c$をマウントし、/vol1のフォルダ配下に<コロン>:です.txtがあるか確認します。

# Zドライブにマウントされていることを確認
> Get-PSDrive

Name           Used (GB)     Free (GB) Provider      Root                                              CurrentLocation
----           ---------     --------- --------      ----                                              ---------------
Alias                                  Alias
C                  15.94         14.06 FileSystem    C:\                                           Users\Administrator
Cert                                   Certificate   \
Env                                    Environment
Function                               Function
HKCU                                   Registry      HKEY_CURRENT_USER
HKLM                                   Registry      HKEY_LOCAL_MACHINE
Variable                               Variable
WSMan                                  WSMan
Z                   0.00          0.95 FileSystem    \\SVM.CORP.NON-97.NET\c$

# /vol1 配下に <コロン>:です.txt という名前のテキストファイルがあるか確認
> ls -l Z:\vol1\


    Directory: Z:\vol1


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        12/12/2022   7:50 PM             10 ~1.TXT

そこにあるのは~1.TXTでした。拡張子が.TXTと大文字になっていることから8.3形式に変換されていそうです。

エクスプローラーから確認しても~1となっています。

謎のファイルを確認

ファイルの内容は特に文字化けはしていません。

コロンの確認

それでは文字マッピングを行います。今回は以下のようにマッピングします。

マッピング元 マッピング先
: (0x3A) α (03B1)
< (0x3C) β (03B2)
> (0x3E) γ (03BC)

文字マッピングの作成はcifs character-mapping createで行います。

# デフォルトでは文字マッピングが存在しないことを確認
FsxId0ca3d1e244ed3089b::> cifs character-mapping show
This table is currently empty.

# 文字マッピングの作成
FsxId0ca3d1e244ed3089b::> cifs character-mapping create -vserver SVM -volume vol1 -mapping 3a:03b1, 3c:03b2, 3e:03b3

# 文字マッピングの設定確認
FsxId0ca3d1e244ed3089b::> cifs character-mapping show
Vserver         Volume Name  Character Mapping
--------------  -----------  ------------------------------------------
SVM             vol1         3a:03b1, 3c:03b2, 3e:03b3

文字マッピング後のファイル名を確認します。

> ls Z:\vol1\


    Directory: Z:\vol1


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        12/12/2022   7:50 PM             10 βコロンγαです.txt

設定した通りに文字マッピングされ、βコロンγαです.txtと表示されるようになりました。

エクスプローラーから見た時もβコロンγαです.txtと表示されますね。

マッピング後

おしまい。

と思いましたが、文字マッピングした結果同じファイル名になるとどうなるのか気になりました。試してみましょう。

NFSクライアントからβコロンγαです.txtというファイルを作成します。

# NFSクライアントから見た時は文字マッピングされていないことを確認
$ ls -l /mnt/fsxn/
total 0
-rw-r--r-- 1 root root 10 Dec 13 05:50 <コロン>:です.txt

$ cat /mnt/fsxn/\<コロン\>\:です.txt
コロン

# SMBクライアントから見たときに文字マッピングされたファイル名と同じ名前になるようなファイルを作成
$ echo マッピングしていないファイルだよ | sudo tee /mnt/fsxn/βコロンγαです.txt > /dev/null

# ファイルが作成されたことを確認
$ ls -l /mnt/fsxn/
total 0
-rw-r--r-- 1 root root 10 Dec 13 05:50 <コロン>:です.txt
-rw-r--r-- 1 root root 49 Dec 13 08:41 βコロンγαです.txt

$ cat /mnt/fsxn/βコロンγαです.txt
マッピングしていないファイルだよ

それではAD DCから確認してみます。

> ls Z:\vol1\


    Directory: Z:\vol1


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        12/12/2022   7:50 PM             10 βコロンγαです.txt                                                    
-a----        12/12/2022  10:41 PM             49 βコロンγαです.txt

βコロンγαです.txtというファイルが2つありますね。これは見分けがつきません。

エクスプローラーから両方のファイルを開いてみます。すると、どちらも文字マッピングがされていないβコロンγαです.txtになってしまいました。

普段使う文字でマッピングすると判断が付かない

先述した注意事項にあった以下記載の通り、文字マッピング先の文字は普段使用しない文字にするのが良さそうです。

無効な文字を表す Unicode 文字が、通常はファイル名に使用されないようにする必要があります。これらの文字が使用されていた場合、不要なマッピングが発生します。

マルチプロトコルだからこそ互いのプロトコルに思いやりを持って接しよう

Amazon FSx for Net App ONTAPの文字マッピング機能を使用して、本来ファイル名に使えない文字をWindowsで表示できるようにしました。

文字マッピングすることでSMBで接続した時も文字化けせずにファイルを認識できます。

ただし、普段使用しない文字がマッピング先に推奨されるため、そのような文字をマッピング先に指定すると文字化けしているように見えてしまいます。そのため、NFSクライアントからファイル名を編集するときはSMBクライアントが扱えない文字を使用しないように気をつけると良いでしょう。

この記事が誰かの助けになれば幸いです。

以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!