给插插电脑(Plug Computer)重新安装操作系统

插插电脑(Plug Computer)是一个可以直接插在插座上使用的电脑,整个电脑的体积大约只有1立方分米。虽然体积小,但是硬件上一点都不差,电脑该有的东西插插电脑上都有,USB 口和 SD 卡插槽都有。有些型号的插插电脑甚至自带无线网卡,这样之需要把插插电脑往墙上一插,连网线都不用接,就可以正常使用了。


(我的插插电脑,右边蓝色的是 SD 卡)

插插电脑功耗很低,主要还是用来做服务器,或者用来下载 P2P 资源。得益于其极低的功耗,即使24小时开机,也不会使用多少电能。现在我的插插电脑已经连续运行26天了,没有关机过,一直在默默地下载和上传 PT 和 ed2k 资源。

其实我这个插插电脑出厂的时候安装的是 Ubuntu 8.10,但这是一个非长期支持版本,我拿到插插电脑的时候 Ubuntu 8.10 已经停止支持了,连软件源都已经不可用了,想升级到 11.04 都非常困难。处于这种情况,我就萌生了重装插插电脑操作系统的念头。

最好的重装说明来自于插插电脑官方网站的维基,不过内容只有英文的。另外由于插插电脑不同于普通的桌面电脑,在上面重装系统不像在桌面电脑上面那样——插入光盘,重启,一路回车——这么简单就能重装的。要在插插电脑上重装系统,还需要了解一些嵌入式系统方面的知识才行。于是我花了几天的时间来看维基页,期间顺便实践着尝试重装了几次系统,终于大概弄清楚了在插插电脑上重装的过程。那么下面就一步一步说明如何在插插电脑上重新安装操作系统。我安装的操作系统是 Debian,所以下面都会以 Debian 来做说明。要安装其他发行版的话,操作都是基本相同的,反正原理都是一样的。

所需要了解的知识

存储设备:插插电脑上的外存不是磁盘,而是一块固态存储器(也就是 SSD)。安装的时候,不需要在这个 SSD 上进行分区,只需要在启动的时候指定分块的起始地址,就可以在引导后像访问已经分区的磁盘一样来访问 SSD。
启动顺序:插插电脑启动的时候,首先会从 SSD 的 0×0 读取 u-boot 引导程序并启动到 u-boot。接下来,由 u-boot 根据保存在环境变量中的引导参数,启动 Linux。

安装前需要准备的东西

首先要准备一个网络环境,建议最好是在家庭局域网内完成。因为没有光驱,所以要从网络上加载安装程序。另外应该也可以从 SD 卡或者 U 盘启动,但是我没有尝试过。

因为要从网络上加载安装程序,所以要架好一个 TFTP 服务器,插插电脑启动到 u-boot 以后会使用 TFTP 协议来从网络上加载安装程序。

我们还需要安装程序,因为我安装的是 Debian,所以我就到 Debian 的镜像上去下载了 Deiban 的网络安装本地引导程序,也就是 uImage 和 uInitrd  两个文件。

这两个文件可以在下面的地址下载,下载回来以后把这两个文件放到 TFTP 的目录下,在安装的时候需要在插插电脑上从 TFTP 下载这两个文件并加载到内存。

http://d-i.debian.org/daily-images/armel/daily/kirkwood/netboot/marvell/sheevaplug/

如果要安装其他发行版的话,就根据相应发行版的安装说明,选择网络安装本地引导程序,并下载到本地就可以了。一般 Linux 发行版的本地安装引导文件应该都是 Image 和 Initrd 两个文件。在选择架构的时候要注意 CPU 的类型是 ARM(armel)。

由于插插电脑不同于普通电脑,所以我们需要自己设定引导系统的方法。我们需要一个引导内核,这个引导内核用于引导系统直到根文件系统挂载成功。插插电脑用的 ARM sheeva 处理器,可以在下面的网站下载到针对这个处理器编译好的引导内核:

http://sheeva.with-linux.com/sheeva

如果这个网站挂掉了,这里有一个with-linux.com 的镜像:

http://archlinuxarm.org/mirror/with-linux/

到这个网站去,选择你想使用的内核版本,去下载对应内核版本的 uImage 文件。注意这个 uImage 文件和上面使用的网络安装本地引导文件的 Image 文件是不同的,这个是引导内核而网络安装本地引导文件的 Image 只是一个安装程序用的内核。
比如想使用 2.6.38.8 内核的话,就下载 http://sheeva.with-linux.com/sheeva/2.6/2.6.38/2.6.38.8/sheeva-2.6.38.8-uImage

插插电脑的硬件架构已经被内核支持了,如果想安装的发行版没有为插插电脑编译的文件的话,可以自己下载内核回来交叉编译支持插插电脑的内核,以及自己制作网络安装本地引导程序,不过这样就比较麻烦了,这种情况还不如选择其他的发行版。

无论是想把操作系统安装到插插电脑上,还是想安装到 SD 卡或 U 盘上,都需要首先把操作系统安装到 SD 卡或 U 盘上,之后,如果想把系统安装到插插电脑上才能从 SD 卡或 U 盘上把操作系统复制到插插电脑上。所以我们需要一张 SD 卡或者一个 U 盘。

最后来复查一下安装需要的东西是不是都已经准备好了:

  1. 一个插插电脑可以访问的网络环境
  2. 一个插插电脑可以访问到的 TFTP 服务器
  3. Linux 的本地安装引导文件 uImage 和 uInitrd
  4. ARM sheeva 处理器的引导内核 sheeva-2.6.38.8-uImage
  5. 一张不是很古董的 SD 卡或着一个 U 盘

将系统安装到 SD 卡上

从 TFTP 加载安装程序

首先要配置好你的 TFTP 服务器,然后把 uImage 和 uInitrd  以及 sheeva-2.6.38.8-uImage 放到 TFTP 的根目录下。至于如何配置 TFTP 服务器,就不是本文的内容了,网上随便一搜就能找到很多的配置 TFTP 服务器的教程。

现在开始安装插插电脑。先用自带的 USB 转 COM 连接线插到插插电脑上,然后把 USB 线连接到自己的电脑上,接着启动一个串口终端,这样就能在串口上看到插插电脑的显示输出了。

插插电脑默认的串口参数是:波特率115200,无奇偶校验,1个停止位。

把插插电脑插上插座,就能从串口终端上看到插插电脑的启动了。插插电脑启动到 u-boot 后,按下一下回车,这样就进入 u-boot 的交互模式,我们从这里开始重装系统。

首先把 TFTP 上的安装文件加载到内存中,然后重内存中引导,这样我们就能启动安装程序了。

首先要设置插插电脑的 IP 地址,以便插插电脑能够访问到网络,执行下面的命令:

setenv ipaddr 192.168.0.211
setenv serverip 192.168.0.200

其中 192.168.0.211 是分配给插插电脑的 IP 地址,192.168.0.200 是 TFTP 服务器的 IP 地址。

接下来要从 TFTP 服务器下载安装程序并启动,执行下面的命令:

tftpboot 0x0400000 uImage
tftpboot 0x0800000 uInitrd
setenv bootargs console=ttyS0,115200 base-installer/initramfs-tools/driver-policy=most
bootm 0x0400000 0x0800000

前两句命令的意思是将 uImage 和 uInitrd 从 TFTP 上下载回来,并分别写入 0×0400000 和 0×0800000 的内存区域。注意,如果是自己制作uImage,则要保证 uImage 的文件大小不能超过 (0×0800000 – 0×0400000) 字节,否则加载 uInitrd 的时候会把 uImage 覆盖掉。uInitrd 也有大小限制,但具体是多少我忘记了,只要 uInitrd 不是很大都没问题。
在执行 bootm 的时候 u-boot 会检查 uImage 和 uInitrd 的哈希值,如果 uImage 或者 uInitrd 太大的话,哈希检查就会失败,于是会无法引导启动安装程序,这个时候只能重新启动插插电脑,修改 uImage 或 uInitrd 后再重新以上操作。
setenv 是设置环境变量,这里设置 u-boot 要引导的系统的引导参数,这里首先设置串口参数,接着设置启动选项。
最后的 bootm 就是告诉 u-boot 从 内存的指定位置引导系统。bootm 执行以后,如果之前的操作都没有问题,那么接下来就进入 Debian 的安装程序了。

安装操作系统

进入 Debian 的安装程序后,可以像正常安装过程一样安装 Debian。但因为我们使用的是网络安装程序,所以在安装过程中务必确保插插电脑能访问到互联网。

前面说过,即使是想把操作系统安装到插插电脑上,也要先把插插电脑安装到 SD 卡或 U 盘上,之后才能把操作系统复制到插插电脑上。所以安装到了选择安装位置的时候,都要先把根目录挂载到 SD 卡或 U 盘上。我安装的时候使用的是 SD 卡,SD 卡的设备文件名在插插电脑上比较特殊,是 /dev/mmcblk0pX。U 盘的设备名应该还是 /dev/sdaX,不过我也不确定,大家在安装的时候自己注意一下吧。这里我们假设把根目录挂载到 /dev/mmcblk0p1。

安装完成之后应该会直接进入操作系统,这时候先不要着急重启,首先要检查一下 /etc/fstab 文件是否正确。根据你自己的分区设置,自己检查一下 /etc/fstab 的设置,如果 fstab 的内的分区挂载内容不正确的话,自己修改一下,把它改为正确的内容。检查完成以后,就可以重启插插电脑了,现在执行 init 6 吧。

在 u-boot 中设置启动引导参数

插插电脑重启到 u-boot 的时候,我们还是要按一下回车,进入 u-boot 的交互模式。现在,我们要设置启动参数,让 u-boot 能从 SD 卡或者 U 盘启动操作系统。执行下面的命令:

setenv bootargs console=ttyS0,115200 mtdparts=nand_mtd:0xa0000@0x0(u-boot),0x400000@0x100000(uImage),0x1fb00000@0x500000(rootfs) root=/dev/mmcblk0p1 rootwait rw
saveenv
boot

setenv 还是设置环境变量,其实这出设置的就是 Linux 的启动选项,使用 115200 的串口波特率,后面的 root 指明根目录是挂载在哪个分区上的,接下来的 rootwait 表示要等待 /dev/mmcblk0p1 设备就绪后才尝试挂载根文件系统。需要 rootwait 的原因是,Linux 在启动的时候,可能会在存储设备还没有就绪的时候就尝试去挂载根目录,在这种情况下挂载肯定会失败,于是启动就会失败。

mtdpart 参数指定了插插电脑自带的 SSD 设备的分区,这里使用的参数的意思是,从 0×0 开始的 0xa0000 字节是第 0 分区,标签为 u-boot。后面继续定义了两个标签分别为 uImage 和 rootfs 分区。其中 uImage 分区是之前我们把启动内核烧录到 SSD 的地方。如果你不想把操作系统安装到插插电脑上,那么可以不指定 rootfs 分区。

saveenv 是保存当前环境变量,这样下次启动插插电脑的时候就不用再次设置这一串长长的启动参数了。

boot 命令执行后,u-boot 将从 SSD 的 0×0400000 位置读取引导内核,并传入启动参数进行引导系统。

如果之前执行的操作一切顺利,那么现在你就能顺利进入刚刚安装好的 Debian 并可以正常使用了。在上面装你想要的东西, Mule、Transmission,想用什么就装什么,然后就让插插电脑 7*24 小时勤奋地工作吧。

到现在,我们已经成功给插插电脑重装了系统,不过现在的系统是安装在 SD 卡上的,如果你想把系统复制到插插电脑上,不想在插插电脑运行的时候插着一张 SD 卡或 U 盘,就接着往下看。

将系统安装到插插电脑上

创建文件系统

首先我们要在插插电脑的 SSD 上创建文件系统,这里我们使用 ubifs,这是一个为固态存储设备设计的文件系统,对插插电脑上的容量很小的 SSD 来说是比较适用的。

我之前尝试过在 SSD 上创建 btrfs 文件系统,虽然创建成功了并也成功把系统复制到 SSD 上了,但是由于 btrfs 默认情况下对对数据的管理决定了其并不适合在小容量的存储设备上使用。在小容量的文件系统上,由于 btrfs 会提前分配空间,所以容易出现明明还有很多剩余空间,但却出现空间不足的情况。虽然 btrfs.mkfs 提供了一个 -M 选项,但由于 Debian 自带的 btrfs.mkfs 版本不够高,还没有 -M 选项,而我自己编译的 btrfs.mkfs 使用 -M 选项创建分区时却会报错,最后我也还是没有在插插电脑的 SSD 上使用 btrfs 文件系统,只是试用了一下便出现空间不足的情况。现在我的插插电脑的操作系统是运行在一个 7.3G 大小的 btrfs 文件系统的 SD 卡上的。

在插插电脑的 SSD 上创建 ubifs,执行下面的命令:

apt-get install mtd-utils

ubiformat /dev/mtd2 -s 512
ubiattach /dev/ubi_ctrl -m 2
ubimkvol /dev/ubi0 -N rootfs -m
mount -t ubifs ubi0:rootfs /mnt

有一点 Linux 基础的人基本上都能看到上面的命令是什么意思,这里我就不详细解释了。需要说明的只有,/dev/mtd2 是 SSD 上的第三分区,插插电脑上的 SSD 分区对应的设备文件是从 0 开始编号的。另外,这个 mtd2 是一个字符设备,而对应的块设备是 /dev/mtdblock2。

修改挂载文件点

由于我们要把系统复制到插插电脑上,所以需要修改 /etc/fstab,这样下次启动的时候才能让 Linux 从插插电脑的 SSD 上挂载根文件系统,而不要从现在使用的 SD 卡或 U 盘上挂载根文件系统。

我们可以在设置环境变量的时候利用 root 选项指定跟文件系统使用的设备,于是修改 fstab 中的根文件系统的挂载位置:将 /dev/root 设备挂载到根目录。/dev/root 设备是我们在设置环境变量的时候用 root 参数指定的设备。

修改后的 fstab 的根文件系统那一行应该像是这个样子的:

/dev/root     /     ubifs     defaults,noatime,rw

复制系统到插插电脑上

现在我们只需要把刚刚安装到 SD 卡上的操作系统复制到刚刚在 SSD 上创建的文件系统上就可以了。执行下面的命令:

mkdir /tmp/rootfs
mount -o bind / /tmp/rootfs
cd /tmp/rootfs
sync
cp -a . /mnt/

都是非常简单的 Linux 命令,这里就不解释了。如果以上命令都成功完成的话,就可以 init 6 重启插插电脑了。

修改启动引导参数

重启到 u-boot 以后,还是要按一下回车进入 u-boot 的交互模式。我们要修改启动参数,让 u-boot 从插插电脑的 SSD 上启动操作系统,而不要从 SD 卡或 U 盘上启动。执行下面的命令:

setenv bootargs 'console=ttyS0,115200 ubi.mtd=2 root=ubi0:rootfs rootfstype=ubifs'
saveenv
reset

root 指定了根文件系统对应的设备,ubi0:rootfs 指的就是第一个 ubi 设备上标签为 rootfs 的分区,就是刚才我们创建的那个分区。另外还要用 rootfstype 指定一下文件系统类型。

最后,保存环境变量,reset 命令重启插插电脑,这时可以拔出 SD 卡或 U 盘了,插插电脑将会从自带的 SSD 上启动操作系统,现在你已经可以正常地使用插插电脑,不需要再依赖 SD 卡和 U 盘了。

更新内核模块

呃……对于日常使用来说,其实不更新内核模块也不会影响使用,这一部分就等我有时间再补完吧。


全文结束,费了这么大力气终于给插插电脑重装一个操作系统了,这文写了两个晚上,我装插插电脑的时候用了几天时间研究,现在写这篇文也用了两个晚上,在插插电脑上安装操作系统就是和在桌面电脑上安装操作系统不一样啊,涉及的底层的东西太多,这么说来其实现代的桌面电脑的易用性已经是非常好了,在桌面电脑上安装操作系统应该已经是一项很简单的事情了,老年人暂不说,至少会下载安装各种奇怪的软件如 QQ 迅雷等的年轻人都应该会安装操作系统才对吧。

我在写这篇文的时候对插插电脑的启动流程实际上也并不是了解得很透彻,文中所述的内容必有错误,望发现错误的朋友能按几下键盘指出错误,吾将不胜感激。

最后来看看我的插插电脑的运行情况吧:

参考资料

插插电脑官方维基上的安装 Debian 到插插电脑的维基页:http://plugcomputer.org/plugwiki/index.php/Installing_Debian_To_Flash

This entry was posted in 技术向 and tagged , , , . Bookmark the permalink.

7 thoughts on “给插插电脑(Plug Computer)重新安装操作系统

发表评论

电子邮件地址不会被公开。

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>