ttt

getttyent

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

2008-02-11 21:09:52 | デジタル・インターネット

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://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を使いますか。


2 コメント

コメント日が  古い順  |   新しい順
Win2000の場合RealPlayerGoldなどでいけるみたいすよ (山田)
2008-03-09 18:43:49
Win2000の場合RealPlayerGoldなどでいけるみたいすよ
iTunesMusicStoreは使えませんが、旧版のiTunesで落としてという手段が使えると思います
返信する
そうなんですか。でもRealPlayerですか… (本人)
2008-03-12 00:21:33
そうなんですか。でもRealPlayerですか…
ただ、あえて今インストールしたいとは思わないソフトな気もする…(苦笑)

Windows XPは、実家にはないですけど、自宅にはあるので、iTunesで使えてます。
なぜか最近、PodcastがiTunesで同期されてるのに、「Podcastがありません」と表示されて再生できない、という変な状況に陥ってますけど。またリセットかな。
返信する

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。