toge's diary

コンピュータ関連の趣味をつらつらと。

自動でマウントする時にEUC-JPでマウントしたい

上の番組を見ながら七転八倒していましたが、やっと完成。以下まとめ。間違ってたら教えて下さい。
以下参考URL。

http://cclub.cc.tut.ac.jp/~pakuchan/hoge/2005/7/19
http://t-munu.phys.s.u-tokyo.ac.jp/aso/linux/CF-R3-FC3.html#hald%A4%CB%A4%E8%A4%EB%A5%AA%A1%BC%A5%C8%A5%DE%A5%A6%A5%F3%A5%C8%A4%CE%B5%F3%C6%B0%A4%F2%CA%D1%A4%A8%A4%EB
Fedoraのいくつかだったか知りませんがUSBとかCD-ROMとかそういうメディアが勝手にマウントされるようになりました。これ自体は喜ぶべきことなのですが、日本語な私達にはちょっと問題があります。日本語名のファイルが文字化けしちゃうんですよね。

で、これを改善するために昔のように/etc/fstabを弄っても意味がありません。/etc/fstabの冒頭のコメントにあるように、

This file is edited by fstab-sync - see 'man fstab-sync' for details

ということなのでfstab-syncが書きこんでしまうために毎回書き変わってしまいます。
で、どうすればいいかというと、fstab-syncのmanにもあるようにHALの設定を弄る必要があります。

By default, the /usr/share/hal/fdi/policy/10osvendor/10-storage-policy.fdi file speci-
fies the policy - this file should never be edited by the system administrator as it
might get updated by the OS vendor for security updates. Instead, system- or site-spe-
cific rules can be put in the /etc/hal/fdi/policy/ directory as separate files.

ということで、HALの設定は/usr/share/hal/fdi/policy/10osvendor/につらつらと書いてあります。
ま、ここを直接弄ってもいいんですけど、"this file should never be edited"とのことなので、/etc/hal/fdi/policyにファイルを作ることにしましょう。

今回やりたいのはとにかくなんでもいいので、vfatなファイルシステムのパーティションの文字コードeuc-jpに指定することです。こうするためには、以下のようなXMLが必要になります。

<?xml version="1.0" encoding="ISO-8859-1"?> <!-- -*- SGML -*- -->

<deviceinfo version="0.2">
  <device>
    <match key="block.is_volume" bool="true">
      <match key="volume.fsusage" string="filesystem">
          <match key="volume.fstype" exists="vfat">
              <merge key="volume.policy.mount_option.iocharset=euc-jp" type="bool">true</merge>
          </match>
        </match>
    </match>
  </device>
</deviceinfo>

最初に「blockがvolumeで、volumeがfilesystemとして利用され、valueのfilesystemがvfatの場合」をmatchエレメントを使って示しています。そして「iocharset=euc-jpをmount optionに指定する」をmergeエレメントを使って示しています。
ま、他のファイルシステムでも、エンコーディングにしたい場合には御自由にどうぞ。

でこの内容を/etc/hal/fdi/policy以下のファイルに書き込みます。
Linuxのご多分に漏れず先頭の数字に意味があるようなので、"10-storage-policy.fdi"では駄目で、"90-storage-policy.fdi"というファイル名にしたところうまくいきました。

無事書き終わったらHALのdaemonプロセスを再起動します。

> /etc/init.d/haldaemon restart

で設定ファイルが有効になります。確認してみますか。
VFATなパーティションが存在するUSBなディスクがLinuxに認識されていることが前提です。

> lshal | grep volume.policy
volume.policy.mount_option.iocharset=euc-jp = true  (bool) 

という行が出ていれば、無事設定が有効になっています。

残念ながらそのままでは現在マウントされているパーティションに設定が反映されないので、USBディスクを抜き刺ししてみて下さい。

> mount | grep sdb1
/dev/sdb1 on /media/USBDISK type vfat (rw,nosuid,nodev,_netdev,iocharset=euc-jp,user=toge)

こうなっていればうまくいった証拠です。めでたしめでたし。