am-utilsを使ったUDF形式のDVDのマウント

今日はFreeBSDでUDF形式のDVDをマウントする際,どのような設定をするのが便利かと言うことについて考えてみます.ここでの論点は以下です.

  1. root権限を用いないマウント操作は可能か
  2. DVDをマウントする際にudfcd9660のいずれを用いるか
  3. 日本語ファイル名を文字化けさせずにマウントするにはどのようにするか

このようなことを考えるのは,先頃,日本語のファイル名を含むディスクからのコピーで幾らかの問題に遭遇したためです.二三の方法を試した限りでの結論を述べれば,以下の方法が良さそうです.

  1. Auto Mount Daemonを使う
  2. udfバイスを使う
  3. Kernel iconvを使う

まず,root権限の必要性ですが,FreeBSDにはam-utilsがamd,Auto Mount Daemonとして添付されていますので,これを使えば良さそうです.二番目のデバイスの選択ですが,UDF Bridgeによる互換性機能を使えば9660バイスでもマウントは可能ですが,三番目の日本語ファイル名との兼ね合いからするとudfバイスが良さそうです.要するに最も面倒なのは日本語ファイル名を文字化けさせない,という要請につきるようです.

なお,本記事の内容はFreeBSD 9.1-RC1 (amd64)で行い,端末のロケールUTF-8の設定になっています.

まず,日本語のファイル名を含むUDF形式のDVDを用意し,マウント時に用いるデバイスとKernel iconv使用の違いで文字化けの有無を調べます.

kldload udf
kldload libiconv
kldload udf_iconv
kldload cd9660_iconv

mount -t udf /dev/cd0 /cdrom/ && ls -lat /cdrom && umount /cdrom
mount -t cd9660 /dev/cd0 /cdrom/ && ls -lat /cdrom && umount /cdrom
mount -t udf -o -C=UTF-8 /dev/cd0 /cdrom/ && ls -lat /cdrom && umount /cdrom
mount -t cd9660 -o -C=UTF-8 /dev/cd0 /cdrom/ && ls -lat /cdrom && umount /cdrom

結果は以下です.

device kiconv 日本語ファイル名の表示
udf - ×
cd9660 - ×
udf
cd9660 ×

UDF形式のファイル名の文字コードはそもそもUTFなのですから,Kernel iconvの設定は不要になるように思うのですが,最上段を見る限りそうでもないようです.したがって,udfとKernel iconvの設定でam-utilsを使うのが良さそうです.

さて,実際の設定方法です.まず,起動時にUDFやKernel iconvのモジュールを読み込むために/boot/loader.confに以下を追記します.

udf_load="YES"
libiconv_load="YES"
udf_iconv_load="YES"

次に以下の内容を/etc/amd.mapに追記します.

udf             type:=program;\
                fs:=/cdrom;\
                mount:="/sbin/mount mount -t udf -o -C=UTF-8 /dev/cd0 ${fs}";\
                unmount:="/sbin/umount umount ${fs}";

ただし,空白は適切な数のtabspaceに置き換えます.最後に/etc/rc.confに以下を追記します.

amd_enable="YES"
amd_flags="-a /.amd_mnt -l syslog /am-utils /etc/amd.map"

以下のようにしてamdを起動します.

/etc/rc.d amd restart

ユーザー権限でマウントを行うには以下のようにします.

cd /am-utils/udf # 自動的にマウントが行われる

マウントを解除するには以下のようにします.

cd                   # 別のディレクトリに移動する
amq -u /am-utils/udf # アンマウント操作
df                   # 確認する

以上がam-utilsを使って日本語ファイル名を含むUDF形式のディスクを文字化けさせずにマウントするための手順です.

最後になりますが,-C=UTF-8の部分を-C=EUCJPにしたところ,lsの出力をlvに渡すことで正常な表示が行われました.したがって,端末のロケールEUC-JPならばKernel iconvを使いさえすればudfcd9660いずれのデバイスを使っても日本語の表示は問題ないと思われます.