一切皆有可能
               ——在iPod上安装Linux
 
 
在智能手机、掌上电脑、便携式设备、苹果机、大型机/巨型机等可见Linux的影子,而iPod具备了计算机的要素 —— 存储设备、中央处理器,她能装上Linux么?答案是肯定的。
那为什么要在iPod上安装Linux? —— DIY精神!Do it yourself!不是么,难道喜欢DIY的你,就不想尝试与众不同的个性么?
本文所用到的iPod为iPod Video 30G。
 
iPod是苹果公司(Apple)的MP3品牌,并不是一个东西。正如SONY的随身听叫Walkman一样。现在一般说MP4指的多是便携的视频播放器。而目前的iPod产品线还是以MP3为主,虽然已经有了可以播放MP4的第五代iPod Video(国外称为iPod 5G Video,5G就是指第五代,虽然苹果并没有明确指定其就是第五代),iPod Video的型号有两种:30G和60G。本文既以iPod Video 30G为例,不保证其他型号能按照本文所叙成功实现,由此发生问题杂志社及作者一概不负责。请三思而后行。
 
iPod Linux简介
iPod上运行的Linux使用的是改良过的ucLinux,这是一种在单片机上运行的LINUX系统,但功能仍很完善。
关于iPod Linux的安装方式,iPod Linux不会删除原IPOD固件,更不会删除你的IPOD上的硬件和资料,而且是双系统(IPOD原固件和IPOD LINUX)引导,非常安全,一般不可能对你的IPOD造成什么硬损伤。另外,podzilla是IPOD LINUX上的官方GUI外壳程序(即非命令行的图型化操作界面)。
podzilla有很多HACK版,即非官方版,如podzilla-ti2(可以打字并保存文本文件),viPodzilla(游戏很多),以及mikPodzilla(可以播放一些无损压缩格式的音乐)等。
iPod Linux可能会导致IPOD停止响应,即死机。这时重新启动IPOD即可(不同的IPOD方式不同,请查阅IPOD说明书)。
本文使用的软件即iPod Linux和Podzilla等来实现在iPod Video 30G安装Linux的。
 
安装前的准备
我们是在Ubuntu 5.01系统平台进行的,由于Ubuntu默认禁止root权限,故要以sudo su root切换到root权限来进行操作,否则可能出现权限不够的提示。具体情况请参考所使用的Linux的分版说明。
由于我的iPod设置为disk mode时,已经在Windows平台下格式化过。这样,iPod默认分区看起来是这样的:
Disk /dev/sda: 30.0 GB, 30005821440 bytes
255 heads, 63 sectors/track, 3648 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
   Device Boot      Start     End       Blocks    Id  System
   /dev/sda1         1         10       80293+     0  Empty
   /dev/sda2         11      3648       29222235   b  W95 FAT32
30G的硬盘共3648个cylinder,分为两个分区:
1. 前10个cylinder是第一个分区,被用来存放引导信息和Apple的IPOD操作系统,在Windows下不可见。
2. 后面的是第二个分区,也就是你在Window下看到的那个 可移动磁盘(ipod要设置在disk mode) ,是FAT32格式。
为了保持和iPod原先的系统共存,类似双系统,那么我们接下来要做的工作流程是:
将第二个分区的大小缩小并在后面开辟一个ext2格式的新分区作为Linux分区;
重写第一个分区,在Apple的OS引导代码之前加入Linux的loader(类似于lilo或者grub);
最后在我们的第三个分区上建立linux操作系统。
思路明晰后,我们就开始进行工作。
为了在从第二分区开辟ext2新分区,我们需要将第二分区中所有的文件复制到其他地方,注意,Windows下必须display hidden files才能看到其中隐藏的文件夹。然后删除此第二分区,重新开辟第二个分区和第三个分区,第二分区格式化成fat32,将此前复制到其他地方的文件副本复制回来。第三分区则格式化成ext2。
这一步骤的具体做法如下:
将iPod插在USB,ubuntu会自动将第二个分区挂载到/media/ipod,我们需要将其卸载以便继续工作:
umount /dev/sdX2
(iPod在Linux中,设备名称显示为:第一分区 —— /dev/sdX1,第二分区 —— /dev/sdX2,X为a、b、c……,X后面的数字未必相同,视你的具体情况)
现在,我们先备份第一分区的数据:
dd if=/dev/sdX1 of=ipod_boot_sector_backup bs=512 count=1
如想恢复则执行如下命令:
dd if=ipod_boot_sector_backup of=/dev/sd
 
重新分区
我们要用到Linux的分区工具fdisk来管理iPod的分区:
/sbin/fdisk /dev/sdX
fdisk 工具的使用:
p是查看分区列表,d是删除分区,n是建立分区(会寻问你新建的分区从哪里开始到哪里结束,我的第二分区是从第11个cylinder到第3000个cylinder,11是必须的,因为11=10+1。而3000可以根据你需要的第三分区大小调整,第三分区至少要100MB以上。),t是设置分区类型(b是FAT32,你不用设置第三分区类型,默认就是ext2),用a命令将第二分区设置为bootable。最后用w命令将这些设置写入分区表。(注意我们没有动第一分区 —— 为了保持原先系统共存)
The number of cylinders for this disk is set to 3648.
There is nothing wrong with that, but this is larger than 1024, and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
   (e.g., DOS FDISK, OS/2 FDISK)
Command (m for help): p
Disk /dev/sdb: 30.0 GB, 30005821440 bytes
255 heads, 63 sectors/track, 3648 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1               1          10       80293+   0  Empty
/dev/sda2              11        3648    29222235    b  W95 FAT32
 
Command (m for help):
Command (m for help): d
Partition number (1-4): 2
Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 3
First cylinder (1-3648, default 1): 11
Last cylinder or +size or +sizeM or +sizeK (11-3648, default 3648): 180
 
Command (m for help): p
 
Disk /dev/sda: 30.0 GB, 30005821440 bytes
255 heads, 63 sectors/track, 3648 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
 
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1               1          10       80293+   0  Empty
/dev/sda3              11         180     1365525   83  Linux
 
Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (1-3648, default 1): 181
Last cylinder or +size or +sizeM or +sizeK (181-3648, default 3648):
Using default value 3648
 
Command (m for help): p
 
Disk /dev/sda: 30.0 GB, 30005821440 bytes
255 heads, 63 sectors/track, 3648 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
 
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1               1          10       80293+   0  Empty
/dev/sda2             181        3648    27856710   83  Linux
/dev/sda3              11         180     1365525   83  Linux
 
Partition table entries are not in disk order
 
Command (m for help): t
Partition number (1-4): 2
Hex code (type L to list codes): b
Changed system type of partition 2 to b (W95 FAT32)
 
Command (m for help): p
 
Disk /dev/sda: 30.0 GB, 30005821440 bytes
255 heads, 63 sectors/track, 3648 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
 
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1               1          10       80293+   0  Empty
/dev/sda2             181        3648    27856710   83  Linux
/dev/sda3              11         180     1365525    b  W95 FAT32
 
Partition table entries are not in disk order
 
Command (m for help): w
The partition table has been altered!
 
Calling ioctl() to re-read partition table.
 
WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table.
The new table will be used at the next reboot.
 
WARNING: If you have created or modified any DOS 6.x
partitions, please see the fdisk manual page for additional
information.
Syncing disks.
接下来我们格式化第二分区为fat32:
mkdosfs -F 32 /dev/sdX2
将第三分区格式化成ext2:
mke2fs /dev/sdX3
将第三分区的自检次数设置为无穷:
tune2fs -c 0 /dev/sdX3
不这样做的话,每启动一定次数(我记得是30次),就会自检一次。
最后我得到的分区表是这样的:
Disk /dev/sda: 30.0 GB, 30005821440 bytes
255 heads, 63 sectors/track, 3648 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
   Device Boot      Start         End      Blocks   Id  System
   /dev/sda1        1             10       80293+   0   Empty
   /dev/sda2   *    11            3000     24017175 b   W95 FAT32
   /dev/sda3        3001          3648     5205060  83  Linux
最后将你以前备份的第二分区的数据拷贝到新的第二分区中。
到这里,如果我们将iPod同计算机断开,还是可以重新启动到apple os,因为我们没有修改第一分区的信息。
 
安装Loader2
为了达到与原先操作系统共存的目的,我们必须修改第一分区的引导信息 —— 安装Loader2。
(多重系统引导程序的简介 —— lilo、Grub、NT Loader……)
安装前的准备
Loader2的下载地址:[url]http://ipodlinux.org/p_w_picpaths/3/31/Loader-2.3.zip[/url]
make-fw程序的下载地址:[url]http://ipodlinux.org/p_w_picpaths/6/66/Make_fw-linux-i386.tgz[/url]
展开Loader-2.3.zip得到loader.bin文件。
从第一分区中得到apple的原始firmware:
dd if=/dev/sdX1 of=orig_firmware.bin
将apple的os从firmware中提取出来:
./make_fw -o apple_os.bin -e 0 orig_firmware.bin
./make_fw -o apple_sw_5g_rcsc.bin -e 1 orig_firmware.bin
当提取成功后,你会在当前目录发现apple_os.bin和apple_sw_5g_rcsc.bin in文件。
把loader.bin加在apple os前面生成一个新的引导程序:
./make_fw -g 5g -v -o my_sw.bin -i apple_os.bin loader.bin
将新的引导程序写入第一分区:
dd if=my_sw.bin of=/dev/sdX1
至此,重新启动iPod能看到如下的菜单(这时候并无iPodLinux的选项):
 
安装Linux系统
选择disk mode。mount第三分区到某个目录,比如/media/ipod-1。如果你用ubuntu,进入disk mode后会自动mount。
% mount /dev/sda3 /media/ipod-1
下载基本系统的核心 kernel nightly builds 可以在 [url]http://ipodlinux.org/builds/[/url] 下载截稿时的版本 2006-05-30-kernel.bin.gzgunzip 解压缩后放在 /media/ipod-1/ 下面 :
% gunzip 2006-05-30-kernel.bin.gz
% cp 2005-05-30-kernel.bin /media/ipod-1/vmlinux
[url]http://so2.sys-techs.com/ipod/ipod_fs_240206.tar.gz[/url] 下载 userland /media/ipod-1 tar xvzf 解压 会生成 bin, etc, var 等目录 :
% tar xvzf /media/ipod-1/ipod_fs_240206.tar.gz
如果某些文件的时间戳有问题,touch一下即可:
touch r 参照文件 时间戳有问题的文件
至此,iPod的Linux基本系统就安装好了,卸载掉:
umount /dev/sda2
重启就可以在loader中看到iPodLinux选项,进去就可以看到下面的Kernel进度条和启动字符串:
不过,为了得到的图形界面,你还需要安装podzilla 2。当然,由于iPod的硬件实在不能恭维,你不要指望它能有华丽的X-window界面。
 
安装Podzila 2
[url]http://www.josh.sys-techs.com/svnbuilds/[/url]下载最新版本的podzila2
appearance-1262.tar.gz podzilla2-1261.gz pzmodules-1261.tar.gz
解压缩这三个文件。
podzilla2-1261.gz 文件解压后改名为podzilla,设置可执行属性,复制在/media/ipod-1/bin/目录下。
pzmodules-1261.tar.gz 解压后生成一堆文件夹 放在 /media/ipod-1/usr/lib/ 目录下 不知是什么原因 我的 iPod 无法正确加载 MPDc 子文件夹 我删除了这个子文件夹 不过看起来好像没有影响。
appearance-1262.tar.gz解压后生成两个文件夹,放在/media/ipod-1/usr/share/目录下。
确定你的/media/ipod-1/etc/rc文件最后一行是podzilla。
卸载iPod,取下后重启iPod,应该可以正常进入podzilla了。下图显示了podzilla2启动时的初始化进程条和运行时的Settings菜单:
总结
至此基本的 Linux 系统安装完毕。但是,还是有很多不足:
    目前的 IPODLINUX 版本较低,还不能使用较先进的版本;
目前的适用软件较少,虽说 IPODLINUX 中游戏较多,当和原装的游戏相比,无论画面还是可玩性都相差太远;
还没有较好的适用于此机型的中文软件;
暂时来说实用性不大。
关于在 iPod Video 30G 上安装 iPod Linux ,已在本文阐述完毕,笔者将继续研究如何在 iPod 上安装 Rockbox ,研究成功后,希望能为读者介绍一点经验。