Kobo WiFi 破解入门
本文译自 MobileRead Wiki 的《Kobo WiFi Hacking》页面,原文最后修订于 2018-11-26。 本文针对的是初代 Kobo WiFi 机型(Kobo Wireless eReader),内容较为久远,仅作历史参考;Kobo Touch 及之后的较新机型请看姊妹篇《Kobo Touch 破解》。 原文中的论坛帖链接与文件下载链接按原样保留,仅作为出处与下载入口引用,本站不镜像论坛内容。 破解需要修改系统文件,操作失误可能导致设备变砖——动手前请务必按本文方法先备份内部 SD 卡。
本文的大量信息整理自 Craig Ringer 的博客。原文页顶部配了一张 Kobo WiFi 显示天气预报的截图,出处见文末"资源链接"一节。
Kobo WiFi 的固件更新机制
Kobo WiFi(即 Kobo Wireless eReader)的固件更新方式非常简单:公共分区(用 USB 线把 Kobo 连到电脑时看到的那个分区)的 .kobo 目录里如果有一个名为 KoboRoot.tgz 的文件,机器就会把 KoboRoot.tgz 中的全部内容解压到根目录,然后重启。
这意味着我们可以非常容易地为 Kobo WiFi 制作自己的更新包。Aura HD 的机制与之类似。
拆开 Kobo WiFi
Kobo WiFi 的外壳靠机身四周一圈塑料卡扣固定,用塑料撬棒就能比较轻松地撬开。
撬开外壳后,拧下四颗螺丝,就能把主板从机壳里取出来。内部 micro SD 卡位于主板背面、右下角的位置。
备份内部 SD 卡
Kobo WiFi 从机身内部的一张 2GB micro SD 卡启动。如果你打算做任何破解操作,强烈建议先给这张内部 SD 卡做一份完整备份——这样一旦出了问题、Kobo 无法启动,只需取出 micro SD 卡、用备份恢复即可。
如果手头还有一张富余的 2GB micro SD 卡,可以更进一步、更加保险:把 Kobo WiFi 里的内部 micro SD 卡取出来,给它做一份完整备份,再把这份备份写到备用卡上。然后就可以把原装内部 micro SD 卡收进安全的地方,用备用卡开机。
在 Linux 上复制 micro SD 卡
如果你的 Kobo 已经开通了 telnet 访问,可以完全不开外壳就做出完整备份(不过一旦真出了问题,还是得拆机)。具体做法见 Craig Ringer 的博客。
从 Kobo 里取出内部 micro SD 卡之后,做完整备份很简单。把卡插进电脑的读卡器,运行命令:
sudo fdisk -l
你会看到类似这样的输出:
...
Disk /dev/sdc: 1977 MB, 1977614336 bytes
31 heads, 61 sectors/track, 2042 cylinders, total 3862528 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Device Boot Start End Blocks Id System
/dev/sdc1 7564 535152 263794+ 83 Linux
/dev/sdc2 535153 1586548 525698 83 Linux
/dev/sdc3 1586549 3861421 1137436+ b W95 FAT32
我们要找的是显示容量约为 2GB 的那一行(准确说是 1977 MB):
Disk /dev/sdc: 1977 MB, 1977614336 bytes
所以,我这张 micro SD 卡位于 /dev/sdc(你的卡所在位置可能不同)。要创建备份,只需运行:
sudo dd if=YOUR_CARD_LOCATION of=kobo_internal_microsd.img
这一步要花上一阵子,等着的时候可以去找点别的事做。完成后你就可以安心了:就算 Kobo 挂掉,你手里也有一份完整备份。
启用 Telnet 与 FTP
要让 Kobo 获得 telnet 和 FTP 访问,有两条路可走。
简单方法
- 下载这个 KoboRoot.tgz 文件
- 把 Kobo WiFi 连到电脑,选择"管理图书馆"(Manage Library)
- 把下载好的
KoboRoot.tgz文件复制到 Kobo 上的.kobo目录 - 弹出 Kobo,等待它重启
- 主界面启动后再等约 20 秒,直到你看到蓝色 LED 闪烁几次。(确保已连上 WiFi。如果没连,现在连接,然后重启设备。)
- 再次把 Kobo 连到电脑,在
.kobo目录里找到一个名为ip.txt的文件,里面就是你这台 Kobo 的 IP 地址 - 现在你拥有 telnet 和 FTP 访问了!
telnet YOUR_KOBO_IP_ADDRESS
以 root 登录,无需密码。
手把手方法
外部用户备注:此方法已在 Kobo Glo(固件 2.6.1 - 06/17/13)上测试成功,但我按照 Kobo Touch 破解页面中的建议,去掉了
inetd.conf第一行末尾的正斜杠;不过也许不去掉也能用。
要启用 telnet/FTP,需要编辑两个文件。你可以从 Kobo 内部的 micro SD 卡上拿到它们,分别是:
/etc/inetd.conf/etc/inittab
在电脑上建一个名为 etc 的目录,把 inetd.conf 和 inittab 放进去。
编辑 etc/inittab,加入以下几行:
::sysinit:/etc/init.d/rcS2
::respawn:/usr/sbin/inetd -f /etc/inetd.conf.en
编辑 etc/inetd.conf,加入:
21 stream tcp nowait root /bin/busybox ftpd -w -S /
23 stream tcp nowait root /bin/busybox telnetd -i
你还需要创建 etc/init.d/rcS2,内容如下:
#!/bin/sh
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
/usr/sbin/inetd /etc/inetd.conf
然后运行
chmod a+x etc/init.d/rcS2
把它标记为可执行。现在把你的 etc 目录打成 KoboRoot.tgz 文件:
tar czf KoboRoot.tgz etc
并把它复制到 Kobo 上的 .kobo 目录。
Kobo 重启并连上 WiFi 之后,在同一网络的电脑上可以用下面的命令查到它的 IP 地址:
sudo nmap -sP 192.168.1.1-254
找到你 Kobo 的 MAC 地址,然后 telnet 上去即可!以 root 登录,无需密码。
向 WiFi 的 framebuffer 绘图
Kobo WiFi 使用 Linux 帧缓冲区(framebuffer)在屏幕上显示图形。但电子墨水屏(e-ink)的特性决定了:向 framebuffer 绘制完成后,还需要一次特定的调用才能刷新显示。而试图用 Pygame(一个封装 SDL 的 Python 库)打开 framebuffer,会输出错误 Unsupported console hardware(不支持的控制台硬件)。
目前已发现 Kobo WiFi 存在 4、8、16、32 位色深的 framebuffer 机型。你可以用 fbset 命令查出自己的机器是哪一种。色深就是"geometry"行的最后一个数字:
[root@(none) /]# fbset
mode "600x800-0"
# D: 0.038 MHz, H: 0.063 kHz, V: 0.079 Hz
geometry 600 800 600 800 8
timings 26400000 0 0 0 0 0 0
accel false
rgba 8/0,8/0,8/0,0/0
endmode
如果你的 WiFi 是 8 位色深,向屏幕绘图的解决办法是修改文件 /sys/class/graphics/fb0/rotate。我不知道这为什么有效,但运行命令:
echo 1 > /sys/class/graphics/fb0/rotate
之后 framebuffer 就变得可读可写了。你不一定非得 echo 1,echo 2 或 0 也行,甚至不带参数的 echo > /sys/class/graphics/fb0/rotate 同样有效!
在 4 位屏上绘图
人们还没有搞清楚如何向 4 位屏 Kobo 的 framebuffer 直接绘制图形。目前的解决办法是制作一个 raw 图像文件,再用下面的命令显示:
cat image.raw | /usr/local/Kobo/pickel showpic
如何为 Kobo 制作 raw 图像,见这个帖子。
在 8 位屏上刷新电子墨水屏
在 8 位屏上,我们已经能向 framebuffer 绘制了。但如果无法刷新电子墨水屏、看到绘制的结果,那也没什么用。
Kobo 在 WiFi 上预装了一个名为"Pickel"的程序,位于 /usr/local/Kobo。/etc/init.d/rcS 里有一个使用这个程序的好例子,我们可以在其中找到下面这一行:
zcat /etc/images/reboot.raw.gz | /usr/local/Kobo/pickel showpic
我们可以用"showpic"选项把图像 cat 进 pickel,pickel 就会刷新电子墨水屏。但让 pygame/SDL 向 framebuffer 绘制完之后,怎么通知 pickel 刷新屏幕呢?cat /dev/fb0 | /usr/local/Kobo/pickel showpic 只对屏幕顶部约 100 个像素有效,其余 700 个像素是纯黑的。要解决这个问题,先把 /dev/fb0 cat 到一个文件,再把这个文件 cat 进 pickel:
cat /dev/fb0 > /tmp/fb
cat /tmp/fb | /usr/local/Kobo/pickel showpic
零散笔记
-
WiFi 上的蓝色 LED 可以用这些命令做一定程度的控制:
/usr/local/Kobo/pickel blinkon/usr/local/Kobo/pickel blinkoff -
你可以用这个脚本重启 nickel(Kobo 的 GUI 应用程序):
#!/bin/sh # Kill off the old nickel pkill nickel # Clear plugin cache rm -f /mnt/onboard/.kobo/Trolltech.conf # Restart nickel export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/lib: export NICKEL_HOME=/mnt/onboard/.kobo export LD_LIBRARY_PATH=/usr/local/Kobo export QWS_KEYBOARD=netronix export INTERFACE=eth0 export LANG=en_US.UTF-8 /usr/local/Kobo/nickel -qws -display broadsheet_ioctl >/mnt/onboard/.kobo/nickel.log & -
WiFi 可以用下面的命令关闭:
/usr/local/Kobo/pickel wifioff据说也能用下面的命令重新打开(不过我一直没能让它生效):
/usr/local/Kobo/pickel wifion -
你可以模拟插拔 USB 线:
echo usb plug add >> /tmp/nickel-hardware-statusecho usb plug remove >> /tmp/nickel-hardware-status -
伪造注册:
echo "insert into user values('foo', 'foo', 'foo', 'foo', 'foo');" | sqlite3 /path/to/kobo/.kobo/KoboReader.sqlite
资源链接
- MobileRead 论坛帖:给 Kobo Wireless 机型加装内部存储。
- Kobo WiFi 天气预报显示(原文页顶部截图即出自此帖)。
- Kobo 的 Linux 内核源码与开源代码见 GitHub。
- Kobo 开发与破解有一个 IRC 频道:freenode 上的 #kobodev。
- Craig Ringer 的博客有不少关于 Kobo 破解的文章。
站内延伸:较新机型的破解思路见《Kobo Touch 破解》;想在 Kobo 上跑第三方阅读软件,参见《KOReader 简介》。