2015年4月28日火曜日

FreeBSDでconvmvを使ってファイルシステムのファイル名をEUCからUTF-8へ変換する

会社ではFreeBSD 9.1を利用したファイルサーバーで利用しています。
長年の経緯からファイルシステム上のファイル名はEUCを使っていました。
そのため、デフォルトのLANG環境変数もja_JP.eucJPとしてきましたが、
2013年ぐらいから
  • 漢字コードとしてEUCは使えずUTF-8だけというアプリケーションが増えてきた
  • UTF-8な文字列をEUCなファイルにコピーペーストできない(EUCで表現できない文字が使われているためのようです)
といった問題がでるようになり、不便を感じていました。
そこで、今年(2015年)になり、
ファイルシステムの名前とLANG環境変数をUTF-8に変更することを決断しました。
決断が遅れたのは
ファイルシステム全体の変更になりそれなりの危険性があると考えたためです。
そこで、まず自宅で同様な構成を取っていてるファイルサーバーで変更し、
2ヶ月程度使用して問題ないことを確認し、やっと実行に移すことにしました。

手順は簡単です。
  1. ファイルシステムとしてZFSを利用していたので、実行前にスナップショットを取得
  2. zfs snapshot zfsファイルシステム@タグ(私は日時にしています)。
  3. ファイル名が変更されるものの一覧を確認する
  4. convmv -r --nfc -f euc-jp -t utf8 /ディレクトリ
    ファイル名一覧…
  5. 255文字以上のファイル名については警告が表示されるので、 これらは事前に255文字以内になるようにファイル名を変更する
  6. 変更
  7. convmv --notest -r nfc -f euc-jp -t utf8 /ディレクトリ
約2TBのファイルシステムで、一度に変換せず、主要ディレクトリごとに2.と3.を繰り返えしたため、全体で6時間ほどかかりました。

--nfcオプションと255文字問題については、以下のblogで解説があります。
ドラえもん問題
http://key2.jp/~yskhashi/wordpress/?p=427
主要部分を引用します。
  • 古いファイルシステムの制約に合わせているのか、ファイル名の長さが255byteに制限されていた。convmv の中の $maxfilenamelength1024にしとけばいいだろう。
  • でも、たまにファイルが開けなくなって、規則性を見ようとしたら、あんがい簡単に判明した。ファイル名に濁点、半濁点がある時で、これが原因となるNo.1といえば、そう、Unicode Normalization!(シラネーよ)
    • 正規化形式 D (Normalization Form D, NFD)
    • 正規化形式 C (Normalization Form C, NFC)
    OS XはNFDを使う。Windowsやその他はNFCを使う。