Chienomi

マルチプラットフォーム環境でのファイルシステム選択

Live With Linux::tips

Windowsを軸としてNASがLinuxというマルチプラットフォーム環境で、ファイルシステムに悩んでいるという話を聞いたので、軽く解説しようと思う。

ただ、これに対しては実のところ大した話はなく、結構単純な答になる。

ついでなので、(USBメモリのような)ポータブルストレージでのファイルシステムについても言及する。

先に結論

  • ストレージサーバーのネイティブで高機能なファイルシステムを使うのが良い
  • ただし、Windows系ファイルシステムは避けたほうが良い

LinuxであればBtrfsもしくはExt4、FreeBSDあるいはIllumos (Openindiana)ならZFS、DragonflyBSDであればHAMMER2といった具合だ。

解説

Windows系のファイルシステムを避ける理由は、Unix系ファイルシステムとの非互換により情報落ちが発生することと、より制約が多いためファイル名非互換などそのままファイルが持ち込めないことが増えるからだ。 逆にUnix系ファイルシステムにWindows上のファイルをコピーして使う場合には問題ない(というより、問題が生じないように情報を提供できる)ため、その方が良い。

特にNTFSはWindowsシステムと一体で運用する前提の作りになっているため、Windows同士で共有する場合でも(ディスクの直読みを想定するなら)おすすめできない。

WindowsとMacのホストがあり、どちらかにファイルを集約しようと考えるのであれば、Mac側に集約した方が良い。 この構成が変わらないのであれば、追加ストレージをMacに接続し、APFSを使用しても問題ない。

OSを含めて選択の余地があるのであれば、Linuxを選択すると良い。 これは、読み書きできるファイルシステムが多く、ディスクの直読みが必要になった場合も対応しやすいからだ。

ただ、実際はストレージサーバーがディスクを読み書きし、他のホストに対してはネットワークごしに提供することになるため、いうほどファイルシステムが重要になるケースは少ない。 比較的重要な要素としては、ディスクの追加や交換が容易なほうが良いということだが、(Linuxなら)dm-raidやLVMを使うなど他のレイヤーでカバーすることも可能だ。

ストレージサーバーのバックアップを取る場合はスナップショット機能が重要となり、Btrfs, ZFS, HAMMER2など選択肢は限られる。

ポータブルディスク

ファイルサーバーの場合はマルチプラットフォームのデータをサーバーに持ち込むことになるため、機能が多く情報をすべて内包できるようなファイルシステムを選択したいものである。

ところが、ポータブルディスクの場合は、このファイルシステムを複数のホストで直接読み書きすることになる。 こうなると、保有している多くの情報が、ホスト同士の差異を問題にしてしまうことがある。

USBメモリのようなストレージの場合、必要なのは「ファイルのデータ」に限ることがほとんど(かつ、そのようにすべきである)ため、そのような使い方に適したexFATが使いやすい。

USBエンクロージャを用いたSSDなどの場合はexFATでは心許ないこともある。 それでも、Windowsで読み書きしたいのであればexFATを使ったほうが良い。

ただし、「ポータブルSSDをWindowsだけで読み書きする」のであれば、NTFSを使った方が良い。 大容量のディスクにジャーナリングのないファイルシステムを使うのは、結構リスクが高いから、NTFSで困らないのならNTFSの方が良い。

Windowsを重視する必要がなく、Unix系マルチプラットフォームの環境であり、なおかつディスクの暗号化などが必要ないのであれば、比較的無難な選択肢はExt4である。 Ext4をちゃんと扱えるのはLinuxとFreeBSDだけだが、Ext4Fuseがあるため、最低限読める環境は多い。1 ちょっと面倒な話にはなるが、Windowsでも読み書きができる。

もしかしたらUFS2のほうが良いということがあるかもしれないが、私には運用経験がない。

ディスク暗号化のような処理が必要なのであれば、それはもうマルチプラットフォームで共有しようという考えを捨てたほうが良い。 が、LUKS+Ext4などにしておけば、仮想マシン経由で読んだりするのが難しくないため、比較的柔軟に扱えると思われる。

基本的には「読み書きできるマシンでマウントし、ネットワーク経由で共有」のほうが良い。 Unix系プラットフォームであればSFTPで簡単に共有できる。

F2FSは、私が試している限り書き込み量が増えてくると書き込みスタックする現象が確実に発生しているため、私はおすすめできない。 これについてはもうちょっと詳しく追求したいところだが、検証機材を揃えるのにかなりコストがかかるため難しいだろう。

WindowsでLinuxファイルシステムの読み書き

これも私は実際にやっていないところだが、WSL2を用いてできるらしい。

Powershellで

wsl --mount <DEVICE_ID> --bare

でWSL環境内にブロックデバイスを見せる、らしい。 LUKSも扱えるとか。

ただ、読もうとしているのがNASの(特に複数ディスクからなる)ストレージである場合は、もっと複雑な構成になっている場合があり、基本的にはNASで読ませる方向で考えたほうが良い。 それができない場合は、結構大変である。


  1. これは私自身は動作を確認していない。↩︎