2008年2月12日火曜日

FreeBSD 6.3-RELEASEとiPod nano 8GB (第三世代)

iPod nonoをひょんなことから手に入れましたが、Windows 2000では使えないということが判明。

iPod nano 8GB

しかたないので、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がブートしなくなる可能性があります)。



  1. bootonlyという小さいCDイメージファイルをダウンロードして、


  2. そこから/boot以下を抜き出して、今使っている/bootと置き換え、


  3. ブート時に、「boot -a」でブートさせて、


  4. ルートパーティションを聞かれたらufs:md0a


  5. これで、インストーラが起動するので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://nhh.mo-blog.jp/ttt/2006/06/vmwarefreebsd_6_e894.html
(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を使いますか。



2 件のコメント:

  1. Win2000の場合RealPlayerGoldなどでいけるみたいすよ
    iTunesMusicStoreは使えませんが、旧版のiTunesで落としてという手段が使えると思います

    返信削除
  2. そうなんですか。でもRealPlayerですか…
    ただ、あえて今インストールしたいとは思わないソフトな気もする…(苦笑)
    Windows XPは、実家にはないですけど、自宅にはあるので、iTunesで使えてます。
    なぜか最近、PodcastがiTunesで同期されてるのに、「Podcastがありません」と表示されて再生できない、という変な状況に陥ってますけど。またリセットかな。

    返信削除