在IPOD Video 30G上安装Linux

本文已经转移到了ipodlinux wiki的5g Chinese Tutorial页面。你可以随意修改它。

昨天闲着没事,在我的IPOD Video(5g)上装上了Linux(可以和IPOD原来的系统共存),还是满好玩的。下面是how-to。

注意,本文仅仅适用于5g 30G。如果你需要我告诉你怎么在其他model上装linux,你可以送我一个那种型号的ipod,我安装成功后告诉你。如果你用下面的方法把你的ipod搞爆炸了,请先打911然后联系apple,不要把医药费的帐单寄给我 :)

先show几张图(感谢snoopy一家借我充电电池和充电器)

IMG_1163.JPG

IMG_1167.JPG

IMG_1171.JPG

IMG_1180.JPG

IMG_1181.JPG

IMG_1174.JPG

IMG_1176.JPG

IMG_1178.JPG

IMG_1179.JPG

原理

ipodlinux.org网站和其他地方有一些现成的installer等东西进行傻瓜安装,但我不推荐,因为:

    1. 那些方法不一定适用于30G video,我试过几个installer就没有成功。

    2. 下文的方法还是比较傻瓜的,更重要的是你会一步步知道具体对你的ipod都做了什么,这比较符合DIY的精神。DIY=Destroy It Yourself。

我使用的是30G的IPOD Video,第一次使用前默认在windows下格式化过,ipod设置为disk mode。本文的安装平台是Ubuntu 5.10。在运行下面的步骤时可能需要你有系统的root权限。如果你在Windows下用ipod,那么你的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格式,如果你用的是Mac机器则是另一种格式。

我们要做的是:

    1. 将第二个分区的大小缩小并在后面开辟一个ext2格式的新分区作为Linux分区。具体过程大致是先把它delete掉(注意删除第二个分区前请将其中所有文件复制到其他地方,等格式完毕再复制回来,注意windows下必须display hidden files才能看到其中隐藏的文件夹),然后重新开辟第二个分区和第三个分区。

    2. 重写第一个分区,在Apple的OS引导代码之前加入Linux的loader(类似于lilo或者grub)。

    3. 最后在我们的第三个分区上建立linux操作系统。

调整分区

当ipod插在usb上时ubuntu会自动mount第二个分区到/media/ipod。把它umount掉。注意你的ipod硬盘的设备名称是:

第一分区 /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

然后进入fdisk工具:

/sbin/fdisk /dev/sdX

p是查看分区列表,d是删除分区,n是建立分区(会寻问你新建的分区从哪里开始到哪里结束,我的第二分区是从第11个cylinder到第3000个cylinder,11是必须的,因为11=10+1 :) 而3000可以根据你需要的第三分区大小调整),t是设置分区类型(b是FAT32,你不用设置第三分区类型,默认就是ext2),用a命令将第二分区设置为bootable。最后用w命令将这些设置写入分区表。(注意我们没有动第一分区)

然后,

mkdosfs -F 32 /dev/sdX2
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

断开usb联接,ipod应该还是可以自己启动(按住中间的按钮和menu不放就可以重启)到apple的os里面,因为我们还没有修改第一分区的启动信息。你的音乐,视频,图片和播放列表还在那里,但菜单的设置可能恢复到默认了,关系不大。

在第一分区中添加Loader 2

下载Loader2,展开后得到loader.bin。另外,你需要make_fw程序,在这里下载预编译的for x86的二进制代码。然后,执行下面的代码:

dd if=/dev/sdX1 of=orig_firmware.bin
从第一分区中得到apple的原始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从firmware中提取出来。

./make_fw -g 5g -v -o my_sw.bin -i apple_os.bin loader.bin
把loader.bin加在apple os前面生成一个新的引导程序。

dd if=my_sw.bin of=/dev/sdX1
将新的引导程序写入第一分区。

安装Linux的基本系统

IMG_1163.JPG

重启ipod后你可以看到上图的菜单(不过还没有iPodLinux那个选项),选择disk mode。mount第三分区到某个目录,比如/media/ipod-1。如果你用ubuntu,进入disk mode后会自动mount。

这个网页下载kernel的nightly builds,比如我用的2006-05-17-kernel.bin.gz,解压缩后更名为kernel.bin,放在/media/ipod-1/下面。

下载userland到/media/ipod-1,tar -xvf 解压,会生成bin, etc, var等目录。如果某些文件的timestamp有问题,touch一下即可。

你的Linux基本系统就安装好了,umount掉重启就可以在loader中看到iPodLinux选项,进去就可以看到下面的启动字符串:

IMG_1167.JPG

不过,为了得到pp的图形界面,你还需要安装podzilla 2 too :)

安装podzilla2

建议你从nightly builds下载最新版本。比如我下载的是:

appearance-1223.tar.gz
podzilla2-1223.gz
pzmodules-1223.tar.gz

解压缩这三个文件:

    1. podzilla2-NNN.gz 文件解压后改名为podzilla,设置可执行属性,放在 /media/ipod-1/bin/目录下。

    2. pzmodules-NNN.tar.gz 解压后生成一堆文件夹,放在 /media/ipod-1/usr/lib/ 目录下,我把那个MPDc子文件夹给删除了,因为在我的机器上无法正确加载。

    3. appearance-NNN.tar.gz 解压后生成两个文件夹,放在/media/ipod-1/usr/share/ 目录下。

make sure你的/media/ipod-1/etc/rc文件最后一行是podzilla。

还没有爆炸?good!umount,重启你的机器,应该可以正常进入podzilla看到我抓的那些图片了。

一点点进阶的东东

装好基本系统和podzilla,你可以玩你的ipodlinux了(或者说它玩你)。

下面教你怎么给你的ipod写hello world的c程序。你需要下载toolchain,这是一个后缀为.sh的脚本。su到root帐号后运行这个程序,会在你的本地PC上的/usr/local目录下生成arm-uclinux-tools2目录,你需要的编译器,库文件,头文件等等都在里面了。

设置PATH(比如放在.bashrc中):
export PATH=/usr/local/arm-uclinux-tools2/bin:$PATH

下面是测试的hello.c代码:

#include <stdio.h>
int main(int argc, char **argv)
{
   printf( "Hello World!" );
   return 0;
}

用下面的命令编译链接:

arm-elf-gcc hello.c -o helloworld -elf2flt

将生成的helloworld复制到你的ipod即可。

我不打算继续hack下去了,因为:

    1. Ipod 5g本身的硬件不怎么吸引人,CPU主频太低,无法上网,而且那个滚轮的input实在太不好用了。这个东东基本上只是用来给懒人听音乐的,从这一点看apple已经做的很好了。

    2. 过一段时间会有一个更好玩的东东寄到家里,那是真的为3D图形处理设计的,而且有无线网络和红外驱动,在上面hack linux,装上OpenGL,SDL什么的肯定要爽很多。

关于iPodLinux的所有信息都可以从下面的网站找到,尽管这个网站的内容组织的不太好。

http://ipodlinux.org

Your rating: None

评论

真是酷啊~~~

真是酷啊~~~

[...] 陈辉在他的 IPOD

[...] 陈辉在他的 IPOD Video(5g)上装上了Linux(可以和IPOD原来的系统共存),写了个 howto。 [...]

nano

nano 2gb,ipodlinux介绍不是很完整,有什么建议么,谢谢

好文章要顶.希望有空

好文章要顶.希望有空认真学习之.

链接叉烧包

链接叉烧包 2006.5.18...

flickr昨天去掉beta,变成GAMMA版了.
新的导航栏,新的搜索方式,新的经过改进的照片组织方式,还有个人菜单.所有这些改进都是为了让你更有效地使用Flickr组织分享你的照片.
这里是关于新特性的具...

牛比!!向hui致敬 我

牛比!!向hui致敬
我以后有钱了也要去买一个这个东西装上linux,这个东西多少钱一个阿?

第七张图是什么 ,是不是黑客帝国里面那个很酷的屏幕,上面有字母留下来?

流下来

流下来

jy, 这个方法是否适用

jy,

这个方法是否适用其他型号的ipod主要取决于两点
1. 调整分区的过程不一样,毕竟硬盘不同
2. 向第一分区添加loader 2的过程不一样,可能需要把下面一句去掉
./make_fw -o apple_sw_5g_rcsc.bin -e 1 orig_firmware.bin
另外把下一句
./make_fw -g 5g -v -o my_sw.bin -i apple_os.bin loader.bin
中的5g换成你需要型号名称(用./make_fw 查看支持哪些型号名称)

我没有试过其他型号的iPOD所以不保证一定可行,所以你尝试前一定要备份好你的第一和第二分区。

biantaishabi, 那个是podzil

biantaishabi,
那个是podzilla2中的一个小程序,叫Matrix :)

[...] 【格志】 在IPOD

[...] 【格志】 在IPOD Video 30G上安装Linux 昨天闲着没事,在我的IPOD Video(5g)上装上了Linux(可以和IPOD原来的系统共存),还是满好玩的。下面是how-to。 [...]

LeptonYu 的头像

牛X

牛X

HUI,你好。 我和你用

HUI,你好。
我和你用同样型号的IPOD,5代,30G。
但是我按照你的顺利进行安装,确不能正常启动。
LOADER这一关就没有过。
我感觉与你的不同是cylinders的大小,我的cylinder是2048
这是与你的不同。
请问如何解决?
[root@localhost ~]# fdisk /dev/sda
Note: sector size is 2048 (not 512)

Disk /dev/sda: 30.0 GB, 30020272128 bytes
255 heads, 63 sectors/track, 912 cylinders
Units = cylinders of 16065 * 2048 = 32901120 bytes

Device Boot Start End Blocks Id System
/dev/sda1 * 1 3 96264 0 Empty
/dev/sda2 * 101 912 26089560 b W95 FAT32
/dev/sda3 4 100 3116610 83 Linux

回复六月雪, 最终要

回复六月雪,

最终要的一步是给你的第一分区中的apple原有的loader patch一个dual boot的新loader,这篇文章用的loader2已经不是最新版本,你应该试试最新的版本并阅读它的安装说明。

这篇文章很久没有更新了,已经不能反映硬件的变化。你可以试试ipodlinux.org的linux安装程序。

http://ipodlinux.org/Installer_2

评论查看选项

选择您喜欢的显示评论的模式,并点击"保存设置"来激活您所做的改变。

发表新评论

此内容将保密,不会被其他人看见。