iPod のマウント

はじめに

来月にも 6G が出るという噂がある中、うちにある 5G (≠ 5.5G) の iPod をちゃんと使ってあげようと環境整備をしてみる。その昔 iPod Linux を入れようと思って、でもめんどうになってほったらかしにして (Rockbox は入れてみた)、それきりになってたのだった。それからパソコンも新しくなったので一からやる。ふつうに使うだけにするつもりだけど。
参考にするのは "http://gentoo-wiki.com/HOWTO_Using_an_iPod_With_Gentoo_Linux"。Gentoo Linux Wiki には時々世話になる。
環境は Debian の Sid で、以下にパッケージのヴァージョンをリストしておく。

  • gnome-volume-manager 2.17.0-2, gnome-mount 0.6-1+b2, hal 0.5.9.1-2
  • mount 2.12r-19
  • udev 0.105-4

gnome-mount とかについて調べてみる (だけ)

ちょっとびっくりしたのは、USB ケーブルで接続するだけで自動的にマウントされ、デスクトップになんと iPod のアイコン (正確には iPod ぽいアイコン) が出たこと。最近はそうだという話を読んだ記憶はあったのだけど、アイコンにはやっぱりちょっとびっくり。

マウントは gnome-volume-manager が gnome-mount を呼んでやってるみたい。アイコンのところで右クリックして "プロパティ" を見ると、"Volume" ってタブがあって右イメージ (クリックで拡大) のようになってる (ちなみに "ラベル" が "IPOD" ってなってるのは、前回 Windows で初期化したとき、たんに "iPod" って名前にしたからと思う)。
ここでマウント・オプションが見れて、"rw nosuid nodev uid=1000 fmask=0022 dmask=0022 codepage=cp937 iocharset=iso8859-1" ってなってる。GConf ツリー (gconf-editor*1 で見れるやつ) の /system/storage/defaults/vfat/ はほとんど空なんだけど、これがディフォルトのマウント・オプションみたい。その下の "Setting" ってところで "Mount Point" や "File System"、"Mount Options" を指定すると GConf ツリーの /system/storage/drives/<ヴォリュームの UDI>/ (UDI は Unique Device Identifier の略) に書きこまれ、次回以降のマウントで有効になるぽい。ちなみに "Drive" タブでも同様の設定ができて、優先順位は "Volume" の設定 > "Drive" の設定とのこと。
というわけで GNOME の流儀にしたがってやるならここで指定なのだけど、man gnome-mount して "PRIVILEGES" のところを眺めていると、/etc/fstab に指定がある場合はそちらが優先されるとあるので、昔ながらに /etc/fstab に書くことにする。こういうのはこっちのほうがわかりやすい。

/etc/fstab に書く設定 (mount のオプション)

Gentoo Linux Wiki に書いてあるのはこういうの。

/dev/ipod /mnt/ipod vfat async,nodev,nosuid,user,rw,noauto 0 0

man mount して、オプションをアルファベット順に見ていってみる。

  • async/sync/flush: FAT ファイルシステムのリムーヴァブル・メディア・ディヴァイス用オプションである flush を指定 ("flush というマウント・オプション - だらりな。" を参照)。
  • auto/noauto: いつもつながってるわけじゃないので noauto。
  • dev/nodev: よくわからない (character or block special devices って iPod にあるもんなんだろうか) けど、Gentoo Linux Wiki にしたがって nodev にする。
  • exec/noexec: 安全第一で noexec。
  • ro/rw: 書きこむので rw。
  • suid/nosuid: 安全第一で nosuid。
  • user/nouser: root でやるのはバカげてるので user。

他に、GNOME Terminal から覗いたとき見やすいよう、一応 dmask=022 と fmask=133 も指定 (ls --color だと実行可能なファイルが緑色に光るので)。あと、日本語ファイル名とかで困らないよう、一応 codepage=932 と iocharset=utf8 も指定する。
全部あわせてこんな感じ (async と rw はディフォルトでそうだけど、一応書いてみた)。

/dev/ipod /mnt/ipod vfat flush,noauto,nodev,noexec,rw,nosuid,user,dmask=022,fmask=133,codepage=932,iocharset=utf8 0 0

udev の設定

あとは udev で /dev/ipod が常に iPod を指すようにしなければならない。
Gentoo Linux Wiki には、こういう内容のファイルを /etc/udev/rules.d/ 以下に作れとある。

BUS=="usb", SYSFS{manufacturer}=="Apple*", SYSFS{product}=="iPod*", SYMLINK+="ipod"

まず、dmesg でうちの iPod が /dev/sdb であることを確認。

usb 1-6: new high speed USB device using ehci_hcd and address 7
usb 1-6: configuration #1 chosen from 2 choices
scsi9 : SCSI emulation for USB Mass Storage devices
usb-storage: device found at 7
usb-storage: waiting for device to settle before scanning
usb-storage: device scan complete
scsi 9:0:0:0: Direct-Access     Apple    iPod             1.62 PQ: 0 ANSI: 0
SCSI device sdb: 58605120 512-byte hdwr sectors (30006 MB)
sdb: Write Protect is off
sdb: Mode Sense: 68 00 00 08
sdb: assuming drive cache: write through
SCSI device sdb: 58605120 512-byte hdwr sectors (30006 MB)
sdb: Write Protect is off
sdb: Mode Sense: 68 00 00 08
sdb: assuming drive cache: write through
 sdb: sdb1 sdb2
sd 9:0:0:0: Attached scsi removable disk sdb

"http://www.gentoo.gr.jp/transdocs/udevrules/udevrules.html" を参考に udevinfo --attribute-walk --path=`udevinfo --query=path --name=/dev/sdb` を実行 (man udevinfo して省略形のオプションが出なかったので、長いオプションで書いておく)。ずらずらと長い出力があるのだけど、空行でわかれてるいくつかのブロックのうち、"looking at parent device" につづく文字列が一番短く、かつ "Apple" とか "iPod" とかいう文字列が含まれるブロックが目当てのところだろうと見当をつける。

  looking at parent device '/devices/pci0000:00/0000:00:0b.1/usb1/1-6':
    KERNELS=="1-6"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{serial}=="000A27001590DA26"
    ATTRS{product}=="iPod"
    ATTRS{manufacturer}=="Apple"
    ATTRS{quirks}=="0x0"
    ATTRS{maxchild}=="0"
    ATTRS{version}==" 2.00"
    ATTRS{devnum}=="7"
    ATTRS{speed}=="480"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{bNumConfigurations}=="2"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceClass}=="00"
    ATTRS{bcdDevice}=="0002"
    ATTRS{idProduct}=="1209"
    ATTRS{idVendor}=="05ac"
    ATTRS{bMaxPower}=="500mA"
    ATTRS{bmAttributes}=="c0"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{configuration}==""

まず、Gentoo Linux Wiki では BUS=="usb" となってるけど、/etc/udev/rules.d/udev.rules を見ても "BUS==〜" なんて指定はなくて、みんな "SUBSYSTEMS==〜" ってなってるので、こっちにならう。あと、上の出力はそのまま udev のルールに使えるらしいし、"SYSFS{〜}==〜" ではなく "ATTRS{〜}==〜" って書きかたでいくことにする。こんな感じ。

# Apple iPod
SUBSYSTEMS=="usb", ATTRS{manufacturer}=="Apple*", ATTRS{product}=="iPod*", SYMLINK+="ipod"

iPod を複数もってて、それぞれ別の名前をわりあてたい場合は "ATTRS{serial}" とかを使えばいいぽい。しかし、Gentoo Linux Wiki で "Apple*" とか "iPod*" とかアスタリスクがついてるの、うちでは必要ないみたいだけど (一応つけたけど)、"Apple Inc." ってなるやつとか、iPod の世代とかをくわしく申告しちゃうやつとかがあるってことかな。
それはともかく、/etc/udev/local.rules ってのを作って、それに上の内容を書き、/etc/udev/rules.d/x00_local.rules からシンボリック・リンクをはることにした。"x00_" ってのをつけたのは、一応 /etc/udev/rules.d/udev.rules より後に読ませようと思ってのこと。
しかし、これ、/etc/udev/rules.d/udev.rules に最初から書いてあると楽なんだけどなぁ。'SUBSYSTEMS=="usb", KERNEL=="ttyUSB*", ATTRS{product}=="Palm Handheld*|Handspring Visor|palmOne Handheld", SYMLINK+="pilot"' なんて Palm 用のは最初からあるんだから。
最後に、Gentoo Linux Wiki には udevstart で新しい設定を反映させろってあるんだけど、うちにはそんなコマンドはないようなので sudo /etc/init.d/udev reload

最後に

うまくいったぽいけど、udev のルールなんて書くのめんどうすぎるし、やっぱり gnome-mount のほうでマウント・オプション指定するほうが楽だったような気がする……。→ 2007-07-18 追記: そんなことはなかった。今はまだ全然楽じゃない。
2007-07-18 追記: flush というマウント・オプションを知ったので、"/etc/fstab に書く設定 (mount のオプション)" で、async を flush に変更した。

*1:"アプリケーション" → "システム・ツール" → "設定エディタ"