iPod nonoをひょんなことから手に入れましたが、Windows 2000では使えないということが判明。
しかたないので、FreeBSDで使ってみよう!(無謀ですね)
いい機会なので、6.3-RELEASEにアップデートしておきました。
% uname -a
FreeBSD ふがふが 6.3-RELEASE FreeBSD 6.3-RELEASE #0: Wed Jan 16 04:18:52 UTC 2008 root@dessler.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC i386
私は、いつものように、むちゃくちゃな方法で、バージョンアップしました(注意:失敗すると、FreeBSDがブートしなくなる可能性があります)。
- bootonlyという小さいCDイメージファイルをダウンロードして、
- そこから/boot以下を抜き出して、今使っている/bootと置き換え、
- ブート時に、「boot -a」でブートさせて、
- ルートパーティションを聞かれたらufs:md0a
- これで、インストーラが起動するのでupgrade installを行います。
☆
USBケーブルでパソコンに接続。dmesgコマンドで見ると、こんな具合に認識されています。
umass0: Apple Inc. iPod, rev 2.00/0.01, addr 3
da0 at umass-sim0 bus 0 target 0 lun 0
da0: <Apple iPod 1.62> Removable Direct Access SCSI-0 device
da0: 1.000MB/s transfers
da0: 7583MB (1941441 4096 byte sectors: 255H 63S/T 120C)
ごく普通の、USB接続のフラッシュメモリと同じ感じ。このパソコン側がUSB1.1なので、少々低すぎな転送速度になってますが、別のUSB2.0のあるパソコンでは、もっとましな感じになってました。
fdiskでパーティションを確認すると、1つ、VFATパーティションがあるだけのようです。
# fdisk da0
******* Working on device /dev/da0 *******
parameters extracted from in-core disklabel are:
cylinders=120 heads=255 sectors/track=63 (16065 blks/cyl)
parameters to be used for BIOS calculations are:
cylinders=120 heads=255 sectors/track=63 (16065 blks/cyl)
Media sector size is 4096
Warning: BIOS sector numbering starts with sector 1
Information from DOS bootblock is:
The data for partition 1 is:
sysid 11 (0x0b),(DOS or Windows 95 with 32 bit FAT)
start 63, size 1941377 (7583 Meg), flag 0
beg: cyl 0/ head 1/ sector 1;
end: cyl 120/ head 216/ sector 32
The data for partition 2 is:
<UNUSED>
The data for partition 3 is:
<UNUSED>
The data for partition 4 is:
<UNUSED>
デバイスファイルも確認。
# ls -l /dev/da0*
crw-r----- 1 root operator 0, 102 2 11 13:36 /dev/da0
crw-r----- 1 root operator 0, 103 2 11 13:36 /dev/da0s1
というわけで、mount_msdosfs -o ro /dev/da0s1 /mnt でいいはずなんですが、やってみると、エラーになります。
# mount_msdosfs -o ro /dev/da0s1 /mnt
mount_msdosfs: /dev/da0s1: Invalid argument
こんな、カーネルのエラーメッセージもでてます。
g_vfs_done():da0s1[READ(offset=0, length=2048)]error = 22
ネット検索してみたら、こういう情報を発見しました。
http://www.bsdforums.org/forums/archive/index.php/t-52624.html
ここの下のほうに書いてありましたが、超・要約すると
- iPodによっては、ブロックサイズ(blocksize)が4096になっているものがあり、FreeBSDは最大2048までになってる。
- カーネルのソースコードを書き換えたら、マウントできるようになった
ということだそうです。
たまたま手に入れたiPodは、「iPod nano 第三世代 (the 3rd generation)」というものだそうで、Windows 2000では(iTunesのせいで)使えないし、FreeBSDでも使えないし、ケチがつきまくりです。やれやれ。
☆
カーネルに変更を加える前に、mtoolsというツールで動作確認してみました。
mtoolsは、MS-DOS形式のディスクをマウントせずに読み書きするツールで、昔はそこそこ使われていましたが、最近はほとんど使われていないみたいです。
portsになっていて、ports/japanese/mtools/ にあります。パッケージ名は、今のところ、ja-mtools-3.9.6_1 です。
make installしたあと、/usr/local/etc/mtools.confに
drive i: file="/dev/da0s1" exclusive blocksize=4096
を書き足して、「mdir i:」を実行。mtoolsのコマンドは、だいたい、MS-DOSのコマンド名(cd, dirなど)の頭に「m」をつけたもの(mcd, mdir)になっています。
# mdir i:
Volume in drive I is IPOD
Directory for I:/
metada~1 0 01-06-2000 14:22 .metadata_never_index
calend~1 <DIR> 01-06-2000 14:22 Calendars
contacts <DIR> 01-06-2000 14:22 Contacts
notes <DIR> 01-06-2000 14:22 Notes
record~1 <DIR> 01-06-2000 14:22 Recordings
5 files 0 bytes
7 947 239 424 bytes free
読めていますね。また、blocksize=4096ってのを指定しないと、mdirでエラーになります。
☆
さて、というわけで、カーネルのソースコードを変更してみます。
書き換えるファイルは
/usr/src/sys/fs/msdosfs/msdosfs_vfsops.c
です。このファイルの、以下の部分、「2048」だったのを、「4096」にします。そんなことしていいのか、よくわかりませんが・・・
/*
* Read the boot sector of the filesystem, and then check the
* boot signature. If not a dos boot sector then error out.
*
* NOTE: 2048 is a maximum sector size in current...
*/
error = bread(devvp, 0, 4096, NOCRED, &bp);
diff形式で示すとこんな感じ。
# diff -u msdosfs_vfsops.c.ORIG msdosfs_vfsops.c
--- msdosfs_vfsops.c.ORIG 2008-02-11 14:11:50.000000000 +0900
+++ msdosfs_vfsops.c 2008-02-11 14:12:25.000000000 +0900
@@ -438,7 +438,7 @@
*
* NOTE: 2048 is a maximum sector size in current...
*/
- error = bread(devvp, 0, 2048, NOCRED, &bp);
+ error = bread(devvp, 0, 4096, NOCRED, &bp);
if (error)
goto error_exit;
bp->b_flags |= B_AGE;
これでカーネル再構築して、カーネルを置き換えて、再起動・・・でも、まあいいんですが、この手の変更は、カーネル・モジュールにしておくと便利なことがあります。
たびたびソースコードを書き換えて、動作テストをしたい場合、書き換える度にOSを再起動させるのでは、時間がかかって大変です。
カーネル・モジュールにしておけば、kldunloadでモジュールを外してから、モジュールを再コンパイル、モジュールをkldloadすればいい、というわけです。
そのためには、カーネルのconfigファイルで、以下の部分をコメントアウトします。
options MSDOSFS # MSDOS Filesystem
カーネル再構築にかかる時間を短縮するために、MODULES_OVERRIDEなどを使って、一部のモジュールしかコンパイルしないようにしているときは、忘れずに、msdosfsを加えます。たとえば、こんな感じです。
makeoptions MODULES_OVERRIDE="linux acpi/acpi msdosfs msdosfs_iconv"
ちなみに、msdosfs_iconvは、たしかこれを使うと、日本語のファイル名も使えるようになるってやつです。
(参考) カーネル再構築について
http://blog.goo.ne.jp/nhh0/d/20060614
(VMware)FreeBSD 6.1Rのカーネル再構築(2) 不要なモジュールをビルドしないようにする
☆
新しいカーネルで再起動後、動作確認
# mount_msdosfs -o ro /dev/da0s1 /mnt
できました。
# ls -l /mnt
total 80
-rwxr-xr-x 1 root wheel 0 1 6 2000 .metadata_never_index
drwxr-xr-x 1 root wheel 16384 1 6 2000 Calendars
drwxr-xr-x 1 root wheel 16384 1 6 2000 Contacts
drwxr-xr-x 1 root wheel 16384 1 6 2000 Notes
drwxr-xr-x 1 root wheel 16384 1 6 2000 Recordings
drwxr-xr-x 1 root wheel 16384 1 6 2000 iPod_Control
読めてます。
# kldstat
Id Refs Address Size Name
1 12 0xc0400000 408178 kernel
2 1 0xc0809000 5004 snd_via82c686.ko
3 2 0xc080f000 26818 sound.ko
4 1 0xc0836000 68ee4 acpi.ko
5 1 0xc359e000 f000 msdosfs.ko
6 1 0xc37b4000 1e000 linux.ko
7 1 0xc38a1000 2000 blank_saver.ko
camcontrolコマンドで、見てみます。
# camcontrol devlist -v
scbus0 on umass-sim0 bus 0:
<Apple iPod 1.62> at scbus0 target 0 lun 0 (da0,pass0)
scbus-1 on xpt0 bus 0:
< > at scbus-1 target -1 lun -1 (xpt0)
# camcontrol inquiry da0
pass0: <Apple iPod 1.62> Removable Direct Access SCSI-0 device
pass0: Serial Number ふがふがふが
pass0: 1.000MB/s transfers
iPodを外すときは、ejectすればいいみたいです。
# camcontrol eject da0
Unit stopped successfully, Media ejected
「接続を解除できます」とiPodに表示されます。
iPodを接続するときは、ejectの反対で、loadみたいです。
# camcontrol load da0
Unit started successfully, Media loaded
「接続されています」と表示されます。
☆
LinuxやFreeBSDでiPodが使えるようになるという、「gtkpod」というソフトウェアを使ってみました。
いろいろわけのわかんないことだらけでしたが、なんとかgtkpodでiPodが認識されるようになって、曲や写真を転送してみたのですが・・・
転送したはずの曲はiPod側で認識されないし、写真は、サムネイル表示はされるけど、拡大する?と真っ黒になってしまいます。
まずは、素直に、Windows XPなパソコンで、iTunes7.4を使いますか。