我的Chromebook折腾血泪史

自上周收到海淘来的Chromebook之后, 我就走上了一条折腾Chromebook的不归之路, 这将近一周的折腾下来, 感觉小有收获, 便在此做出记录, 也许能节省后人的一些时间.

我当时折腾的中心思想是, 把 Chromebook的Chrome OS充分利用起来, 不搞什么歪门邪道的给Chromebook换系统, 因为这个是很奇怪的一件事情, 你买了Chromebook, 结果给装上一个Windows, 或者装上一个Ubuntu, 那都是违背使用Chromebook的初衷的, 我要的就是全Web App情况下的体验(超酷), 在上网之余顺便还能当作简单的开发机来使用.

最开始遇到的问题是带有中国特色的上网问题, 不过这个问题很容易解决, 由于我的Chromebook是没有网线口的, 所以只能用WIFI, 由路由器或是电脑上的无线网卡作为AP, 连上热点就能使用中国的局域网了, 接着在在局域网里弄个能上互联网的代理, 然后在Chrome OS里设置代理即可连上互联网. 具体我是通过shadowsocks-csharp搞定的. 如果当前的DNS不好用, 还可以在网络设置里将DNS设置为Google DNS. 连上互联网后, 登录自己的Google帐户, 然后进入Chrome OS的设置项, 勾选”允许共享网络使用代理”即可开始同步你的Chrome信息. 也可能Chrome OS会把系统更新一下, 需要进行一次重启.

然后因为我要把机器当开发机用, 顺便还要能用Shadowsocks配合SwitchOmega来科学上网, 不得不装一个shadowsocks-chromeapp, 可这个东西在Chrome Store里是没有的, 需要自己从github上clone然后cake出来, 那么就不得不用到命令行, 也就是shell, 毕竟Chrome OS是基于Linux开发的, 也自带了shell.

在Chrome OS上有两个进入shell的方法, 一个是Ctrl+Alt+T开启的crosh shell, 一个是Ctrl+Alt+Forward开启的VT-2终端, 然后问题就来了, 想在Chrome OS上使用命令行, 是必须要切换到Developer Mode才行的. 这个Dev Mode怎么切换呢? 你得用Esc+Refresh+Power组合键进入Recovery, 通过Ctrl+D关闭系统的安全验证, 然后重启机器, 会提示验证关闭, 不理它, 数秒之后机器会发出两声蜂鸣声, 然后以Dev Mode进入系统. 自从知道这样开机会发出两声蜂鸣后, 我再也不想关机了(后来我才知道可以用Ctrl+D跳过蜂鸣直接启动).

关键其实不在蜂鸣声上, 而是切换到Dev Mode会抹除之前系统上的数据, 这迫使我在现在这个连接国外线路特别垃圾的电信网上翻墙以一个惊人得慢的速度又把Google帐户同步了一遍, 真是日了狗了.

不过现在好歹是能用命令行了, 也算是件好事, 打开crosh后, 输入shell就能进入一个标准的bash shell, 万事俱备只欠git. 问题来了, git怎么安装呢? Chrome OS显然是不会给你准备包管理器的, 所以剩下的安装手段只有下载带有完整依赖的二进制包, 或者手动从源码编译安装, 显然哪一种方法都比直接用包管理器麻烦, 当时我也没想那么多, 在Google上找了一下, 还真的找到一个Chrome OS的第三方包管理器——Chromebrew. 当时我就像是看到了救星一样, 没想太多开始照着README开始安装.

安装Chromebrew的路途是坎坷的, 最大的问题还是网络问题, 通过作者提供的shell脚本竟然无法直接安装, 由于网络不稳, 几个从作者提供的dropbox等数个迷之站点上龟速下载的文件会在中途断开, 然后脚本又不会自动进行重试, 我试了好多遍都没能安装成功, 最终还是靠手动下载需要的文件并修改了sh脚本才安装成功, 这其中费的功夫就不提了, 都是泪.

安装完之后, 用Chromebrew顺利的安装了git和node.js, 顺利的搞定了shadowsocks-chromeapp, 现在终于不用依赖局域网内的代理上网了. 这之后我又试着安装了一些别的东西, 当时好像是遇上了权限问题吧, 我开始对Chromebrew的能力产生怀疑, 后来想想这不是一个真正一劳永逸的方法, 整个软件提供的方式太简单粗暴, 更新方面也没有什么保障, 提供的软件包数量也十分有限, 觉得Chromebrew提出的替代Crouton免去安装一个系统的麻烦的说法简直就是放屁, 于是想着换别的替代方案. 这之间我还用Crouton弄了一个Ubuntu 12.04 LTS的CLI, 真心觉得这个方法不错, 但感觉离我愿望的使用方式还有一些距离.

这之后我发现了Nix包管理器, 看完介绍, 心中莫名的响起了那句歌词”这就是我要的滑板鞋”, 于是开始尝试着把Nix装到Chrome OS上, Google了一下没有先例, 那么只能自己摸索. 最初尝试的方法是很简单的, 就是官网给出的那个最容易的安装方法, 通过shell脚本下载对应环境的二进制包, 然后解压到指定目录完成安装就行, 可没想到在Chrome OS的诸多限制之下, 这并不容易完成. 起初的问题还是网络问题, 有了安装Chromebrew时的宝贵经验, 我再次手动下载安装包并修改sh文件搞定了网络部分, 然后安装就出问题了, sh脚本是想把文件都安装进/nix目录的, 可Chrome OS的/是被锁定为read-only的, 我需要把/改成可读写的才能写入/nix. 好在Chrome OS的开发人员是想到了用户的这个需求的, 在命令行中执行sudo /usr/share/vboot/bin/makedevssd.sh –removerootfsverification就可以在重启Chromebook后通过重新挂载/达到解锁rw的效果(通常需要你手动指定解锁的内核分区, 一般是partition 4, 在我的机器上解锁partition 2后重启会显示系统损坏, 只能通过Chromebook Recovery Utility应用重装系统). 在.bashrc里调用这个名为rw-rootfs的脚本则会更方便.

解锁之后我发现挂载/的分区容量太小, 于是做了一个symbol link, 接着安装Nix. 发现Nix总是提示权限不足, 我检查了文件的权限, 没有发现问题, 最后查出来问题还是在挂载上. 由于Chrome OS使用了非常严格的安全策略, 导致几乎所有的分区都是以noexec的option进行挂载的, 所以当你想在Chrome OS里执行程序的时候, 还得用mount -i -o remount,exec /home修改option重新挂载一遍. 挂载完了, Nix终于能够执行, 结果提示我Nix不能安装到symbol link的/nix目录里. 当时我心一横, 看了看/etc/fstab是空的, 也不知道Chrome OS自动挂载是在哪里实现, 还是不要轻易修改的好, 所以放弃了挂载文件到/nix的想法. 在Nix的官方wiki上, 有一个用PRoot实现的方法, 可惜最后还是以PRoot程序中execvp调用bash权限不足而告终, 这个权限不足我一直想不明白. 于是Nix的安装计划终于被我放弃.

现在, 我仍然在使用Crouton里的Ubuntu Trusty LTS的CLI, 通过sh crouton -r trusty -t cli-extra即可安装成功, 这个方法比起折腾让Chrome OS自己有一个包管理器要靠谱得多, 我也终于死了心, 也许这是最不让Ubuntu喧宾夺主而又能用Chrome OS进行开发的办法了.

在折腾的途中, 我发现很多Editor的字符宽度被错误计算了, 导致光标总是比实际文字要宽出很多, 后来发现是不知为何Chrome OS给我默认配的等宽字体是不等宽的思源黑体, 手动换成等宽字体比如Monospace就可以解决问题.

另外, Keep Awake扩展可以在一定程度上更改Chromebook的电源管理选项, 有时候也会用得上.

现在, 打算开发一个之前就想着要开发却中途放弃了的Chrome扩展, 来替代虾米音乐Web版的Flash播放器, 计划使用Polymer+Traceur完成. 不过老实说, Chrome OS里用Flash产生的耗电并不明显, 1080P的视频通过Flash的硬件加速也能流畅播放, 真是谷人希.