不再尴尬的ChromeOS

ChromeOS曾经是一个非常尴尬的存在。

最早发布于2009年7月,在相当长的一段时间内,ChromeOS的功能几乎与Chrome浏览器可以划上完全的等号。以ChromeOS为载体的硬件产品也几乎全部针对的是中低端市场以及教育业。从一方面来说,廉价的ChromeOS硬件设备对于在第三世界国家中计算机的普及起到了积极的作用。也有报道曾说,在美国,ChromeOS在教育市场也占有不小的份额。

但也有许多人认为ChromeOS是一个非常失败的产品,当Google推出第一代Chromebook Pixel时,很多人不理解为什么Google会做一款对于ChromeOS来说硬件配置完全过剩的产品。在2014年底参加杭州GDG(Google Developer Group)的线下活动时,我第一次见到了Chromebook Pixel。

毫无疑问当年的ChromeOS生态非常匮乏。用户花费了与Macbook Pro接近的价格,购买到的产品的主要功能却不过是一个Chrome浏览器罢了。除了浏览网页之外,Chrome App Store里的应用生态……(或者说真的有这所谓的生态吗?)大部分的应用不过只是打开一个网页版罢了。当年我对于第一代Chromebook Pixel留下的最深刻的印象是,它的触控板的灵敏度非常高,甚至可以和Macbook Pro的触控板媲美。仅此而已。

在此之后的很长一段时间内都不曾再继续关注ChromeOS的发展。直到Google宣布ChromeOS可以运行Android应用,也仅仅是这两年的事情。但仅仅是Android+ChromeOS,似乎依然不能成为许多人的生产力工具。但一切在2018年发生了巨大的变化。

一个叫做Crostini的项目的诞生完完全全改变了ChromeOS的未来。何为Crostini?Crostini其实可以算是一种Linux容器技术,与Docker类似,由LXC发展而来。Crostini最早在2018年1月出现在了Chromium的源代码中。在2月份的时候,Pixelbook在Dev Channel的ChromeOS 66版本上最早体验到了该功能。在2018年Google I/O大会前夕,已经有相当一部分Linux应用可以在Pixelbook上运行。如今,这项功能已经随着ChromeOS 69的发布进入了Stable Channel,虽然在功能介绍中依然打着Beta的字样。

我没有ChromeOS的硬件设备,但是这半年多来一直在关注这项功能的进展。随着时间的推移,如今Crostini已不再是Pixelbook专属的功能。甚至在ChromeOS的第三方版本Cloudready中也已支持该功能。本文的写作就是在安装了Cloudready的虚拟机中完成的。

本文的主要目的就是为了简要介绍使用Cloudready体验Crostini这个功能时会遇到的坑以及解决方案。

Cloudready是一家根据Chromium源代码,提供ChromeOS解决方案的商业公司。除了付费版本之外,也有提供家庭版,可以直接安装在实体机上,特别适合一些配置比较弱,年代比较久远的硬件设备,且有一个制作好的虚拟机OVA镜像,可以在VMware,VirtualBox等虚拟化软件中直接运行。

  1. 下载Cloudready的虚拟化镜像。

2. 使用VMware或VirtualBox等虚拟化软件导入下载下来的OVA镜像。

3. 对于预设的硬件配置做一些调整。

1) 以VMware为例,建议在CPU配置中开启“虚拟化Intel VT-x/EPT或AMD-V/RVI”以及“虚拟化CPU性能计数器”以及“虚拟化IOMMU(IO内存管理单元)”三个选项。

2) OVA包中默认配置的磁盘大小只有10GB。开启Crostini功能后10GB的空间几乎不能做任何事。因此首先在VMware的硬件配置中将硬盘的容量扩大到一个合理的水平。建议至少30GB以上。

但是做完了这一步仅仅是扩大的硬盘的大小,我们还需要调整ChromeOS的分区来利用新增加的空间。起初我一直在尝试直接在ChromeOS内部直接调整分区。但是多次尝试后发现,ChromeOS的Shell自带的诸如fdisk, parted等工具都是阉割版,并不能直接调整分区的大小。后来终于找到的解决方案是:

  • 下载GParted的Live ISO(https://gparted.org/download.php)。在虚拟化软件中设置以GParted的Live ISO作为引导启动。然后直接在GParted的GUI界面中调整分区大小即可。
  • ChromeOS的分区结构如下:
Disk /dev/sda: 50 GiB, 53687091200 bytes, 104857600 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
Disklabel type: gpt
Disk identifier: 5EA16EDE-F568-6C47-87F6-6B4E0E687B8F

Device Start End Sectors Size Type
/dev/sda1 64 64 1 512B ChromeOS reserved
/dev/sda2 65 65 1 512B ChromeOS reserved
/dev/sda3 66 66 1 512B ChromeOS reserved
/dev/sda4 67 67 1 512B ChromeOS reserved
/dev/sda5 68 68 1 512B ChromeOS reserved
/dev/sda6 69 69 1 512B ChromeOS reserved
/dev/sda7 70 70 1 512B ChromeOS reserved
/dev/sda8 71 71 1 512B ChromeOS reserved
/dev/sda9 72 72 1 512B ChromeOS reserved
/dev/sda10 73 73 1 512B ChromeOS reserved
/dev/sda11 74 74 1 512B ChromeOS reserved
/dev/sda12 75 75 1 512B ChromeOS reserved
/dev/sda13 76 76 1 512B ChromeOS reserved
/dev/sda14 77 77 1 512B ChromeOS reserved
/dev/sda15 78 78 1 512B ChromeOS reserved
/dev/sda16 14864450 104855551 89991102 42.9G Microsoft basic data
/dev/sda17 20546 53313 32768 16M ChromeOS kernel
/dev/sda18 8622146 14864449 6242304 3G ChromeOS root fs
/dev/sda19 53314 86081 32768 16M ChromeOS kernel
/dev/sda20 2379842 8622145 6242304 3G ChromeOS root fs
/dev/sda21 16514 16514 1 512B ChromeOS kernel
/dev/sda22 16515 16515 1 512B ChromeOS root fs
/dev/sda23 86082 2183233 2097152 1G Microsoft basic data
/dev/sda24 16516 16516 1 512B ChromeOS reserved
/dev/sda25 16517 16517 1 512B ChromeOS reserved
/dev/sda26 130 16513 16384 8M unknown
/dev/sda27 2183234 2314305 131072 64M EFI System
/dev/sda28 2183234 2314305 131072 64M unknown

Partition table entries are not in disk order.

注意,这里有句话:“Partition table entries are not in disk order”。当你使用GParted引导启动之后,实际看到的分区结构是这样的

/dev/sda16实际上位于最末端。所以只要把/dev/sda16扩容至你想要的大小即可。

另外需要注意的有:

  1. 建议在VMware中导入了OVA镜像后,进入一次ChromeOS系统,确保能正常工作。然后先不要升级ChromeOS的版本。
  2. 使用GParted调整完分区后,再进入ChromeOS,然后再对ChromeOS进行升级。

因为在使用中发现,如果先升级然后再调整分区,系统版本会回滚到OVA镜像最原始的系统版本。

4. 所以目前Linux App能运行的到底有哪些?

先开启Linux的功能。

目前Crostini安装的Linux发行版是Debian Stretch。仅凭我目前十分有限的测试来看,VSCode运行非常平稳,命令行程序中,比如Rust的自动安装程序也把Rust正确装上了。Docker官网提供的一键安装脚本也能用,但是目前装上的Docker版本(Docker-ce 18.06)存在一个bug,导致在启动容器的时候会失败,根据社区的反馈来看,这个bug已经被Docker上游的runc修复,预计在下一次更新中就能正常使用了:

PyCharm看起来似乎能用,但是在启动的过程中导致ChromeOS黑屏重启了。不知道是因为虚拟机的内存太小(4GB)还是其他原因。因为据Google的说法,Android Studio都能正常用了,那Intellij的那一套全家桶离正常使用也不远了。除此之外,能用的还有1Password(使用1Password X)等。

存在的问题包括:

  1. 当Cloudready版本的ChromeOS装在VMware等虚拟机上时,显示分辨率无法调整,只有640x480,但是安装在实体机上时应该没有这个问题。正常的Chromebook设备就更加不会有这个问题了。
  2. 根据这半年来的报道来看,ChromeOS对于GPU的支持还比较不完善,更别提通过Crostini项目来运行的Linux App了。因此想要进行GPU密集型的任务,或是通过Crostini安装Steam来玩游戏的话,目前恐怕还不是一个最好的时间。(话说回来,Windows 10上的WSL发展了这么多年了,如今也依然还不支持GPU……)
  3. 在VMware里面使用Cloudready时,每次开机都有大概率黑屏,进入不了ChromeOS,经常需要多尝试几次才行。
  4. 在使用Linux应用的过程中,黑屏崩溃然后重启的现象发生了多次,不仅局限在使用PyCharm的时候,在安装Steam的过程中也发生了。

总之,我觉得在经过了这么多年的发展之后,ChromeOS在我看来终于走出了一条正确的道路。今后,一个ChromeOS设备集ChromeOS+Android+Linux桌面应用于一身,而且是在同一个操作系统下可以同时使用这三者,可以预见的是,Chromebook已经完全可以作为许多程序员的专业生产力工具了。我不好说目前我碰到的这些bug是Cloudready版本在VMware里面的bug,还是Crostini这个项目本身的bug,但是至少这条发展的道路是非常正确的。

那么问题来了,Google,何时更新Pixelbook的配置呢?

Update:

  1. Steam on ChromeOS works

前段时间推出的基于Proton的Steam Play也能启用。尝试安装了四个游戏,分别是TIS-100, Limbo,BattleBlock Theater和Replica. 前两个似乎都是原生Linux版本,Replica在启动的时候提示基于Proton启动。

TIS-100完全正常使用。

Limbo卡在了启动界面,按键没有任何反应(

BattleBlock Theater和Replica都崩溃了。根本无法启动。