iPod NanoにLinuxをインストールする

最近、贈り物にiPod Nanoをもらった。1GBモデルの驚くほど小さなボディーからヘッドホンを通してすばらしい音が聞こえてくる。ほどなく、iPodにLinuxを入れている仲間のことを知った。iPodLinux Projectのおかげで、2年前からこうした動きが続いているようだ。とはいえ、Nanoおよび第4、第5世代iPodのためのソフトウェアはまだ実験段階のもので、本稿の内容は執筆時点の最新情報に基づいている。また、ご存知ないだろうが、私の環境では、デスクトップPCからワークステーション、ノートPC、Tivo、ルータにまでLinuxが入っている。だから、iPod NanoにもLinuxを載せなければならなかったのだ。以下では、私のiPod NanoがどのようにしてMP3再生とiDoomプレイの偉大なデュアルブート仕様に生まれ変わったかを報告する。

現在iPod Nanoに入っている音楽は、この変更が終わる頃にはすっかり消えているので、始める前にバックアップをとっておこう。実際、何か失敗をやらかしてiPod NanoをiPod Updaterで元の状態に戻さざるを得なくなる場合に備えて、Apple iPodインストールCDを用意してMacかWindows PCにすぐアクセスできるようにしておくことをお勧めする。私の場合は、うまく行くまでに何度かスクラッチからやり直した。なお、以降の手順はiPod Nano用のものであって、ほかのiPod機種ではうまく行かないことに注意してほしい。iPodの全機種についてのインストール手順はiPodLinuxプロジェクトWikiにあるので、必要ならそちらを参照すること。

最後に、大事な注意点を1つ。本稿に書かれたすべてのコマンドは、私と同じPC環境を想定して書かれている。システムによっては、デバイスやマウントポイント、ディレクトリを変える必要があるかもしれない。決して「本稿に載せてあるコマンドを単純にコピーペーストして使わないように」お願いしておく。

準備

iPod Nanoへの作業を始める前に、インストール元のLinux PCで少し準備をしておこう。手際よく進めるために、インストール作業中はスーパーユーザモードにしておく。まずは、# mkdir iplinstallを実行して作業用のディレクトリを作る。

次に、iPodLinux Projectのサイトに行き、nightly buildからカーネルと、iPodLinux用のユーザインターフェイスであるpodzillaをダウンロードする。さらに、SourceForgeのiPodLinuxのプロジェクトページからiPod Boot LoaderとiPod Linux Userlandもダウンロードして、先に作成したiplinstallディレクトリに保存する。iPod Boot LoaderはiPodLinuxをiPod Nanoにインストールして起動するために必要で、iPod Linux UserlandはiPodLinuxの実行に必要なすべての実行ファイルが置かれたLinuxファイルシステムを提供するものだ。

必要なファイルのダウンロードが終わったら、nightly buildのカーネルとpodzillaを展開する。ただし、ファイルシステムのtarball(iPod Linux Userland)だけはそのままにしておく。このtarballを展開するのは、iPod側の準備ができてからだ。次に、iPod Nanoの現在のマスターブートレコード(MBR)とブートパーティションのバックアップを取ろう。iPod Nanoをディスクモードで起動した後、USBケーブルでPCと接続する。iPod Nanoが私の場合と同じデバイス(/dev/sda、/dev/sdb、/deb/sdc)で認識される保証はないので、どのデバイスになっているかをマウントの度に必ず確認すること。それには、次のように、オプションを指定せずにmountコマンドを実行すればよい。

# mount
/dev/hda1 on / type ext3 (rw,errors=remount-ro)
proc on /proc type proc (rw)
/sys on /sys type sysfs (rw)
varrun on /var/run type tmpfs (rw)
varlock on /var/lock type tmpfs (rw)
udev on /dev type tmpfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
devshm on /dev/shm type tmpfs (rw)
/dev/sda1 on /backup type ext2 (rw)
/dev/hdb1 on /home type ext3 (rw)
tmpfs on /lib/modules/2.6.15-19-386/volatile type tmpfs (rw,mode=0755)
/dev/sdb2 on /media/ipod type vfat (rw,nosuid,nodev,quiet,shortname=mixed,uid=1000,gid=1000,umask=077,iocharset=utf8)

ご覧のように、これでiPod Nanoが/deb/sdb2として認識され、Ubuntuによって/media/ipodにマウントされた。こうした作業ではディストリビューションが独自のパスを選ぶので、環境によってマウントの形式が変わるかもしれない。

MBRとブートパーティションのコピーを作るのは簡単で、次の2つのコマンドを入力するだけだ。

# dd if=/dev/sdb of=ipod_boot_sector_backup bs=512 count=1
# dd if=/dev/sdb1 of=ipod_os_partition_backup
確認事項

先へと進む前に、準備が整っているかどうか確認しておこう。インストールディレクトリの中身は次のようになっているはずだ。

# ls -al
total 84364
drwxr-xr-x  2 warthawg warthawg     4096 2006-03-23 14:08 .
drwxr-xr-x 57 warthawg warthawg     4096 2006-03-23 13:51 ..
-rw-r--r--  1 warthawg warthawg  1650596 2006-03-23 13:14 2006-03-22-kernel.bin
-rw-r--r--  1 warthawg warthawg   821824 2006-03-23 13:14 2006-03-22-podzilla
-rw-r--r--  1 root     root          512 2006-03-23 14:07 ipod_boot_sector_backup
-rw-r--r--  1 warthawg warthawg  1578270 2006-03-23 13:17 ipod_fs_240206.tar.gz
-rw-r--r--  1 root     root     82220544 2006-03-23 14:08 ipod_os_partition_backup

カーネル、podzilla、ファイルシステム、そして2つのiPodバックアップファイルが入っている。これで準備は整った。

iPod Nanoのパーティションを切り直す

工場出荷時の状態ではiPod Nanoにパーティションが2つ存在する。それぞれのパーティションのシリンダ数は10と114だ。iPod Nanoがまだマウントされている状態なら、umountコマンドを使ってアンマウントしておこう。私の環境であれば、次のようになる。

umount /media/ipod

詳細を調べるためにfdiskを立ち上げ、pコマンドを使って既存のパーティションテーブルを表示させてみよう。

# fdisk /dev/sdb

Command (m for help): p

Disk /dev/sdb: 1023 MB, 1023933952 bytes 255 heads, 63 sectors/track, 124 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System /dev/sdb1 1 10 80293+ 0 Empty /dev/sdb2 11 124 915705 b W95 FAT32

予想どおりの結果だ。続いてdコマンドを実行し、パーティションを訊かれたら2を指定して、2番目のパーティションを削除する。それが終わったら、先ほどよりシリンダ数の減らしてパーティションを作り直すとしよう。以下に示すのは、私がパーティションを再作成した際のfdisk実行の様子だ。

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (1-124, default 1): 11
Last cylinder or +size or +sizeM or +sizeK (11-124, default 124): 104

Command (m for help): p

Disk /dev/sdb: 1023 MB, 1023933952 bytes 255 heads, 63 sectors/track, 124 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System /dev/sdb1 1 10 80293+ 0 Empty /dev/sdb2 11 104 755055 83 Linux

パーティションどうしが重複しないように注意すること。fdiskは重複を避けてくれたり、適切な開始位置を教えてくれるほど賢くはない。2番目のパーティションの開始シリンダは、最初のシリンダの終了シリンダに1を加えた値にする。上記のように、最初のパーティションはシリンダ番号10で終わり、2番目のパーティションは11から始まっている。この部分は変更前と同じだ。しかし、2番目のパーティションの終了位置は124ではなく104に変わっている。その分、これから作るLinuxパーティションには多くの領域が使えるわけだ。

Linuxパーティションを作成する前に、やっておくことが2つある。2番目のパーティションをFAT形式に変更するのと、パーティションを2つともブート可能にすることだ。形式を変更するには、fdiskのtコマンドを実行してパーティション2を指定し、新しい形式としてbを入力する。両方のパーティションをブート可能にするには、aコマンドを実行して、パーティション1を指定する。続いて、パーティション2についても同じことを行う。すると、パーティションテーブルは次のようになるはずだ。

Command (m for help): p

Disk /dev/sdb: 1023 MB, 1023933952 bytes 255 heads, 63 sectors/track, 124 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System /dev/sdb1 * 1 10 80293+ 0 Empty /dev/sdb2 * 11 104 755055 b W95 FAT32

パーティションテーブルが上記のようになっていれば、次の作業に進むことができる。このようになっていない場合は、2番目のパーティションの削除および作成をやり直してからFAT形式に変更し、両パーティションをブート可能にする。

では、Linuxパーティションの作成に入ろう。nコマンドを実行し、プライマリパーティション(基本区画)のpと、パーティション番号の3を指定する。開始シリンダは105にするが、終了シリンダはデフォルトの124で構わない。うまく行っていれば、次のようになるはずだ。

Command (m for help): p

Disk /dev/sdb: 1023 MB, 1023933952 bytes 255 heads, 63 sectors/track, 124 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System /dev/sdb1 * 1 10 80293+ 0 Empty /dev/sdb2 * 11 104 755055 b W95 FAT32 /dev/sdb3 105 124 160650 83 Linux

2番目のパーティションと重複していないか、もう一度確認する。問題がなければ、wコマンドを使って新しいパーティションテーブルをディスクに書き込む。書き込みが終わったらfdiskは自動的に終了する。ここで、次のようにしてiPod Nanoのアンマウントと取り外しを行う。

# umount /media/ipod
# eject /dev/sdb

すると、iPod Nanoが再起動される。この再起動によってiPod Nanoはマウントし直されることになる。iPod Nanoがマウントされた状態になっていることを再度確認したら、どのデバイスで認識されたか調べておこう。

私の環境でmountコマンドを実行すると、次のように/deb/sdbに2つのパーティションの存在が確認できる。sdb2がFATパーティション、sdb3がLinux(ext2)パーティションになっているのがわかる。

# mount
/dev/hda1 on / type ext3 (rw,errors=remount-ro)
proc on /proc type proc (rw)
/sys on /sys type sysfs (rw)
varrun on /var/run type tmpfs (rw)
varlock on /var/lock type tmpfs (rw)
udev on /dev type tmpfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
devshm on /dev/shm type tmpfs (rw)
/dev/sda1 on /backup type ext2 (rw)
/dev/hdb1 on /home type ext3 (rw)
tmpfs on /lib/modules/2.6.15-19-386/volatile type tmpfs (rw,mode=0755)
/dev/sdb3 on /media/ipod type ext2 (rw,nosuid,nodev)
/dev/sdb2 on /media/ipod-1 type vfat (rw,nosuid,nodev,quiet,shortname=mixed,uid=1000,gid=1000,umask=077,iocharset=utf8)

今度は、これらのパーティションにファイルシステムを作成しよう。sdb2をアンマウントし、そこにFATのファイルシステムを作成するには、次のようにすればよい。

# umount /media/ipod-1
# mkdosfs -F 32 /dev/sdb2

続いて、次のように実行して、sdb3をアンマウントし、そこにext2ファイルシステムを作成する。

# umount /media/ipod
# mke2fs /dev/sdb3

最後に、次のようにしてLinuxパーティションの自動チェックをオフにする。

# tune2fs -c 0 /dev/sdb3
tune2fs 1.38 (30-Jun-2005)
Setting maximal mount count to -1

これでパーティションの設定作業は完了だ。

新しいルートイメージの作成とインストール

ここからは、デフォルトでLinuxをロードしてくれる新しいルートイメージの作成を行う。ただし、ブート中に巻き戻し(REVERSE)ボタンを押し続けた場合は、元々インストールされていたApple OSが起動する。既に、iPodLinuxプロジェクトのWebサイトからダウンロードしたiPod Boot Loaderがインストールディレクトリに置いてあるので、次のように入力して展開する。

# tar xzf Ipodloader-20060114.tar.gz

続いて、次の各コマンドを実行する。これらを実行すると、tarによって作成されたばかりの新しいサブディレクトリに移り、その中のファイル2つを親ディレクトリにコピーした後、再びインストールディレクトリに戻ってくることになる。

# cd iploader-20060114
# cp loader.bin ../
# cp make_fw ../
# cd ..

いつものインストールディレクトリに戻ったら、先に作っておいたルートパーティションのバックアップからApple OSを取り出すとしよう。次のコマンドを入力すればよい。

# ./make_fw -o apple_os.bin -e 0 ipod_os_partition_backup

次に行う手順では、Apple OSのバイナリ(今取り出したもの)とLinuxカーネルのバイナリ(以前ダウンロードしたもの)、それに先ほどインストールディレクトリにコピーしたローダのバイナリが必要になる。これら3つを使えば、次のようにして新しいイメージが作成できる。

# ./make_fw -g nano -o my_sw.bin -l 2006-03-22-kernel.bin -i apple_os.bin loader.bin
Generating firmware image compatible with iPod mini, 4g and iPod photo...

新しいイメージができたら、ddコマンドを使ってiPod Nanoにコピーする。

# dd if=my_sw.bin of=/dev/sdb1
13180+1 records in
13180+1 records out
6748508 bytes (6.7 MB) copied, 0.802989 seconds, 8.4 MB/s

Linuxパーティションがマウントされていることを確認する。もしマウントされていなければ、次のようにしてマウントする。

mount -t ext2 /dev/sdb3 /media/ipod

次に、そのパーティションに入り、以前ダウンロードしたファイルシステムの設定を行う。以下は、そのときの様子だ。

# cd /media/ipod
root@desktop:/media/ipod# tar zxpf /home/warthawg/iplinstall/ipod_fs_240206.tar.gz
tar: dev: implausibly old time stamp 1903-12-31 18:00:00
tar: home: implausibly old time stamp 1903-12-31 18:00:00
tar: lib/modules/2.4.20-uc0/kernel/drivers/ieee1394: implausibly old time stamp 1903-12-31 18:00:00
tar: lib/modules/2.4.20-uc0/kernel/drivers: implausibly old time stamp 1903-12-31 18:00:00
tar: lib/modules/2.4.20-uc0/kernel: implausibly old time stamp 1903-12-31 18:00:00
tar: lib/modules/2.4.20-uc0/pcmcia: implausibly old time stamp 1903-12-31 18:00:00
tar: lib/modules/2.4.20-uc0: implausibly old time stamp 1903-12-31 18:00:00
tar: lib/modules: implausibly old time stamp 1903-12-31 18:00:00
tar: lib: implausibly old time stamp 1903-12-31 18:00:00
tar: mnt: implausibly old time stamp 1903-12-31 18:00:00
tar: proc: implausibly old time stamp 1903-12-31 18:00:00
tar: var/log: implausibly old time stamp 1903-12-31 18:00:00
tar: var/run: implausibly old time stamp 1903-12-31 18:00:00
tar: var/tmp: implausibly old time stamp 1903-12-31 18:00:00
tar: var/lock: implausibly old time stamp 1903-12-31 18:00:00
tar: var: implausibly old time stamp 1903-12-31 18:00:00

Linuxパーティションでもう1つやることがある。ダウンロードしたファイルシステムに入っていたpodzillaのバージョンを先ほどダウンロードした最新のビルドで置き換え、実行ファイルを作ることだ。

# cd /media/ipod/bin
# mv podzilla podzilla.old
# cp ~/iplinstall/2006-03-22-podzilla podzilla
# chmod +x podzilla

さあ、もう一息だ。何はともあれLinuxパーティションから抜け出して、このパーティションをアンマウントして、iPod Nanoの取り外しを行う。

# cd ~/iplinstall
# umount /media/ipod
# eject /dev/sdb

iPod NanoをUSBケーブルから外したら再起動させてみてほしい。万事うまく行っていれば、そのままLinuxが立ち上がり、podzillaを実行できるはずだ。代わりにApple OSを起動させるには、ブートの間、巻き戻し(REVERSE)ボタンを押していればよい。

これで君も、昨晩の私と同じく、LUGミーティングで注目を集めることができる。何といっても、栄えあるデュアルブート仕様のiPod Nanoを手に入れたのだから。

原文