想法, 折騰

土製雙系統 Chromebook 使用體驗與踩坑

Project Croissant, Formerly Chromefy

網路上已經有不少 Chromium OS 的版本,更有諸如 CloudReady、Neverware 等有商業支持的版本。不過在功能性和體驗上,自然還是 Google 的原味胖次 Chrome OS 為佳,正如 Pixel OS 是許多人對於 Android 的追求一樣。Croissant 這個項目的出現,正是為了解決「從 Chromium 到 Chrome」的需求。它提供了一些指令稿,可以從受支持的 Chrome OS recovery image 中提取相關的檔案並與 Chromium OS image 結合,生成偽 Chrome OS 檔案。具體的做法,項目的「讀我」檔案寫得很清楚了。淺羽選擇了方案一,即直接生成 Chrome OS image 並製作映像檔案,透過 Live USB 安裝到 SD 卡上。

首先準備好相關的檔案。Croissant 需要 3 個檔案完成動作:

  • Chromium OS image, 淺羽使用 ArnoldTheBats Build
  • 官方 Chrome OS recovery image,可以從 CrOS Updates Serving 下載;
  • TPM 模擬器
    • 淺羽使用的是來自 caroline 的 recovery image,其他具有 TPM 1.2 的能力裝置映像檔也可以;
    • 你也可以選擇使用 TPM2 emulator 替代。

官方 Chrome OS 恢復映像檔案中包含了很多硬體相關的部分,所以最好選擇與目標電腦硬體相近的型號;不過如果對此沒有想法的話,官方推介 eve(也就是 Pixelbook)功能會相對完整。做完這些準備後,下載 Croissant 項目本身,然後把所有的檔案全部喂給它。

$ chmod +x ./croissant.sh
$ sudo ./croissant.sh chromium_os.img recovery.bin caroline.bin

等待指令稿跑完,這時候 chromium_os.img 已經不是原來的 Chromium OS 而是經過改造的偽 Chrome OS 了。隨手改名為 chromefy_os.img 以示區分,將它燒錄到隨身碟上開機即可。在 UEFI 中選擇 Chrome OS 啟動後,按 Control – Alt – F2 進入 Developer Console 並以 chronos 登入,安裝 Chrome OS 到硬碟。在淺羽的裝置上,安裝目的地為 /dev/sda

$ sudo /usr/sbin/chromeos-install --dst /dev/sda --skip_postinstall

等待指令完成,就可重新開機,進入 Chrome OS 了。淺羽本想安裝到 SD 卡上,從 SD 卡開機,這樣可以完全不用碰到原先硬碟上的作業系統;並且 ThinkPad X1 Carbon 4th Gen / 6th Gen 有內藏式的 SD 卡槽,對外觀和可攜性也完全不影響。然而 ThinkPad 不知道出於什麼考量,禁止從 SD 卡啟動,無奈只好作罷。另外在 DELL XPS 13 9370 上嘗試從 SD 卡啟動 Chrome OS,雖然成功引導進入 GRUB,但選擇啟動項之後卻無法進入 Chrome OS,也只好放棄。

一法不成,也不能這樣就全盤放棄,乾脆直接手工安裝到硬碟上,並且與 Fedora 做雙重開機。

雙啓動安裝

確認 UEFI 啓動和 GPT 分區表

由於官方的 Chrome OS 目前只支援 UEFI + GPT 環境,因此需要確認電腦正在使用 GPT 分區表。按照各色 Chromebook 的硬體情況,淺羽選擇空出 64G 的空間給 Chrome OS。使用 LVM 的話大致就是三條命令。

$ sudo lvreduce --resize-fs -L -64G /dev/mapper/fedora-home
$ sudo pvmove --alloc anywhere /dev/fedora/root:startExtent-endExtent
$ sudo pvresize --setphysicalvolumesize

不過因為淺羽設定了 LUKS,所以需要先解鎖 LUKS 並且計算 sectors 以調整加密磁碟分割的大小。這裡面的坑也不小,淺羽第一次做的時候就因為不識數算錯了,導致 fedora-root 分割區損壞,好在 fedora-home 保存完好……

接下來用 GParted 或者任何好用的磁碟工具,為 Chrome OS 準備分割區。

  • EFI,不需要額外操作,使用已有的分區即可;
  • ROOT-A,需要 4096MB 左右的 ext2 分割區,FS Label 和 Name 都是命名為 ROOT-A
  • STATE,這是 Chrome OS 內用戶可用的存儲空間,剩下的空間全部分給它是最簡單的方案;需要 ext4 分割區,FS Label 和 Name 都是命名為 STATE

安裝 Chrome OS

首先把本地的磁碟分割都掛載好。

$ cd /mnt
$ sudo mkdir localroot localstate
$ sudo mount /dev/nvmen1p4 localroot
$ sudo mount /dev/nvmen1p5 localstate

然後把之前準備做好的映像檔 chromefy_os.img 也掛載出來。

$ sudo losetup -fP /path/to/chromefy_os.img # assume we're on loop0
$ sudo mkdir efi root state
/* Establish ROOT-A */
$ sudo mount /dev/loop0p3 root/
$ sudo cp -av root/* localroot/
/* Establish STATE */
$ sudo mount /dev/loop0p1 state/
$ sudo cp -av state/* localstate/

對於 EFI,由於淺羽需要做多重開機,所以直接把啟動相關的檔案拷貝過來。

$ sudo mount /dev/loop0p12 efi/
$ sudo cp -av /mnt/efi/BOOT /boot/efi/EFI/cros
$ sudo cp -av /mnt/efi/syslinux /boot/efi/
$ sudo cp -v /boot/efi/EFI/cros/grub.cfg /boot/efi/EFI/BOOT/grub.cfg

現在 Chrome OS 所需要的檔案已經準備好了。接下來需要修改一些檔案讓 Chrome OS 可以開機。首先修改剛才拷貝的 grub.cfg,透過 blkid 查看 EFI 分割區的 PARTUUID 並更改 UUID= 後的參數。

接下來處理 write_gpt.sh,把目前的分割區設定套用進去。分割區設定集中在 load_base_varsload_partition_vars 兩個函式內。設定主要記錄了分割區的序號、大小等資料,由於淺羽的安裝內分割區數量和順序都不一樣,因此去掉其他的分割區內容,只留下 EFIROOT_ASTATE 相關的內容,並且填寫相應的序號。以淺羽的狀況來說,EFI 分割區是第一個,ROOT-A 是第 4 個,STATE 是第 5 個,因此對應地需要修改檔案。具體的情況可以參考第二頁的附錄。

最後更新 UEFI 啓動項,把 Chrome OS 加進去。

$ sudo efibootmgr -c -w -L "Chrome OS" -d /dev/nvme0n1 -p 1 -l \EFI\cros\bootx64.efi

別忘記解除所有用到的掛載。

$ sudo umount efi/ root/ state/ localroot/ localstate/

更新 Chrome OS

由於是土製 Chrome OS,所以當官方推出更新的時候它自然是不能參加 OTA 的。不過,由於 Chrome OS 的所有用戶資料基本都保存在 STATE 分割區內,所以基本上在不動 STATE 的前提下重新安裝 Chrome OS(重新設定和複製 ROOT-A)就可以了。

詳細的步驟可以參考前面,同時在 Croissant 項目內也有說明,因此淺羽就不再贅述了。

高整合度的 Android Apps

順暢的 Android 平板體驗

大部份機種的 Chrome OS 都內建了 Android Apps 支援,打開之後就可以直接從 Play Store 安裝應用程式了。淺羽目前測試了十個左右比較常用的 Android Apps 都可以流暢使用,沒有遇到功能性問題。

目前淺羽還不太清楚 x86_64 上能否直接運行 ARM 平臺的 Android Apps,抑或是只能下載安裝爲 x86_64 最佳化的應用程式。不過,Play Store 裏的大部份程式都可以下載安裝,而以效能上來說也完全沒有問題,甚至比使用手機更順暢。具體的測試使用的 Android Apps 可以參考第二頁的附錄。

同時運行多個 Android Apps 也不會有問題

Android Apps 打開之後是以視窗的形式展現的,並且大小可以自由調整。應用程式預設是手機佈局,但如果有做相應的適配,那麼隨着視窗大小的變化,應用程式會調整相應的佈局,充分利用空間展示更多資訊;當然,少數非要限定死佈局的應用程式就沒辦法了Android Apps 的通知也與 Chrome OS的通知系統高度整合,風格統一、功能齊全。如果筆電支援觸摸,那麼配合觸摸功能使用 Android Apps、用 Shelf 在多個 Apps 之前切換,體驗甚至比真正的 Android 平板還要好,更何況至少還有一個全功能的桌面版 Chrome。難怪說「Chrome OS 是 Android 平板的未來」。

網路、網路、還是網路

淺羽有使用 OpenVPN 的需要,而 Chrome OS 就內建了 OpenVPN 支援。可惜的是,系統內建的支援並不完整,甚至還不能匯入 .ovpn 檔案。但有了良好的 Android Apps 支援,下載 Android 版本的 OpenVPN Connect,直接雙擊 .ovpn 設定檔匯入連結,整個系統都可以使用 VPN 連線了。

另外,對於需要使用工具訪問互連網的情況,直接使用 Android 版本的工具也是完全可行的。Chrome OS 的 VPN 設定內會出現 Android VPN 的項目所有登錄了 Android 的程式都會出現在其中連接上 VPN 後,不止對 Android Apps 生效,同時對 Chrome OS 也會生效,整合程度不可謂不高。可惜的是在 Crostini 內並不能使用 Chrome OS 的 VPN,需要在 Linux 容器中進行額外的手工設定。

Linux Apps 和 Crostini

更換預設發行版爲 Fedora

Crostini 本質上是一個運行在虛擬機器中的 LXC 容器,而此虛擬機器中運行了客製化的作業系統,Google 稱之為 Termina。Termina 雖然為了效能及其精簡,但是還是保留了完整的 LXC 相關程式集。首先依靠 vsh 指令連結 Termina 的 Shell。

crosh> vsh termina

直接列出預設狀態下的所有容器查看。

$ lxc list
+---------+---------+-----------------------+------+------------+-----------+
|  NAME   |  STATE  |         IPV4          | IPV6 |    TYPE    | SNAPSHOTS |
+---------+---------+-----------------------+------+------------+-----------+
| penguin | RUNNING | 100.115.92.200 (eth0) |      | PERSISTENT | 0         |
+---------+---------+-----------------------+------+------------+-----------+

可以看到預設的容器名為 penguin。事實上,只要存在名為 penguin 的容器,Chrome OS 都會將它作為 Linux Apps(測試版)所使用的容器。因此淺羽需要刪除舊容器,並換用 Fedora 30 的 image 啟動新的 penguin 容器。

$ lxc delete penguin --force
$ lxc launch images:fedora/30 penguin

這樣就很簡單地完成了發行版替換。現在查看 local image 應該可以看到到原裝的 Debian 和剛添加的 Fedora。

$ lxc image list
+-------+--------------+--------+---------------------------------------+--------+----------+-------------------------------+
| ALIAS | FINGERPRINT  | PUBLIC |              DESCRIPTION              |  ARCH  |   SIZE   |          UPLOAD DATE          |
+-------+--------------+--------+---------------------------------------+--------+----------+-------------------------------+
|       | 18259187900a | no     | Debian stretch amd64 (20190214_07:10) | x86_64 | 313.78MB | May 28, 2019 at 10:51am (UTC) |
+-------+--------------+--------+---------------------------------------+--------+----------+-------------------------------+
|       | 864824f62fbf | no     | Fedora 30 amd64 (20190528_20:33)      | x86_64 | 112.68MB | May 29, 2019 at 4:20am (UTC)  |
+-------+--------------+--------+---------------------------------------+--------+----------+-------------------------------+

安裝 Crostini Guest Tools

首先在 Chrome OS 中打開 Developer Shell 並進入 LXC 容器操作。

crosh> vsh termina
(termina) chronos@localhost ~ $ lxc exec penguin -- bash

隨後添加一個一般用戶給 Crostini 使用,用戶名可以是任意的。同時還要順便裝一個 sudo 方便日後的使用維護。

[root@penguin ~]# dnf install -y sudo
[root@penguin ~]# USERNAME=SakuragawaAsaba
[root@penguin ~]# useradd $USERNAME -G wheel

接下來還需要安裝和設定 CrOS Guest Tools 以開啟 Linux Apps 整合和檔案共享。

# dnf install -y cros-guest-tools
# systemctl enable dbus-daemon && systemctl start dbus-daemon # Enable and start dbus-daemon
# systemctl unmask systemd-logind
# loginctl enable-linger $USERNAME # Enable linger for your user
# systemctl enable cros-sftp # Enable integration services

然後需要關閉 Linux Apps(測試版)再打開以期生效。現在打開 Linux Apps Terminal,應該就會自動以前面新增的一般用戶登入了。接下來爲用戶啓動 CrOS Guest Tools 的相關工具。

$ systemctl --user enable sommelier@0 sommelier-x@0 sommelier@1 sommelier-x@1 cros-garcon cros-pulse-config

另外,如果遇到了新版 xkeyboard-config 的問題,可以再做一個 workaround。

$ sudo sed -i '/I37/d' /usr/share/X11/xkb/keycodes/evdev

設定中文環境與中文輸入法

淺羽比較愛用 ibus-rime 輸入法,Fedora 下直接 dnf 安裝即可。

$ sudo dnf install -y ibus-rime

由於沒有桌面環境,這裡需要手工運行 ibus-setup 設定輸入法。首先在 GeneralKeyboard Shortcuts 中更改預設的 <Meta>space 快速鍵,否則由於 Chromebook 沒有 <Meta> 按鍵會影響切換;隨後在 Input Method 標籤頁中添加 Chinese - Rime 輸入法。然後編輯 /usr/lib/systemd/user/cros-garcon.service.d/cros-garcon-override.conf 並在最末尾添加 IME 相關的環境變數。

....
Environment="GTK_IM_MODULE=ibus"
Environment="XMODIFIERS=@im=ibus"
Environment="QT_IM_MODULE=ibus"

接下來打開 Firefox 或者其他 Linux Apps 並切換輸入法,就可以看到 RIME 在部署,稍候就可以用 RIME 打字了。

之後每次重新啓動 Linux 容器,都需要手動啓動一下 ibus-daemon。或者你也可以把它添加到系統的自動啓動指令稿中。

$ echo "ibus-daemon -drx" >> ~/.sommelierrc || echo "ibus-daemon -drx" > ~/.sommelierrc
冷啓動 Linux 容器運行 Firefox 時 ibus-daemon 已經會完成自啓動

如果在 Firefox 或者其他程式中使用中文,還需要安裝一些中文字形。

$ sudo dnf install gnu-free-sans-fonts gnu-free-serif-fonts gnu-free-mono-fonts dejavu-sans-fonts- dejavu-sans-mono-fonts # English Fonts
$ sudo dnf install -y google-noto-sans-cjk-ttc-fonts google-roboto-fonts # CJKV fonts

雖然看起來滿滿一片,但是安裝起來也沒有佔用特別大的空間。現在打開 Firefox,中文字形顯示已經沒有問題了。

轉換到 Chromebook?

土製系統的一些小問題

淺羽在使用土製 Chrome OS 的過程中也遇到了一些小問題。 首先是匯入 CA 證書的時候整個 Chrome 會 Crash 掉。在 Neverware 的支持中心裏也有類似的情況,但是並不能在所有電腦上穩定復現,Chromium OS 的 bug tracker 上也還沒有類似的案例。

另外一個方面是淺羽使用土製 Chrome OS 時,如果外接熒幕並使用 1920*1080@60Hz,那麼外接熒幕的顯示顏色就會有問題,感覺像是對比度過高的過曝光效果。有意思的是如果讓內建熒幕鏡射外接顯示器,那麼兩塊熒幕都會顯示同樣不正確的效果,因此應該是軟體問題。但內建熒幕也是 1920*1080 的物理解析度就不會有問題,大概是因爲 Chrome OS 會自動縮放到 1536*864 來使用吧。Chromium bug tracker 上也有 848540920623 兩個 Issue 反應這個問題,不過目前還未能修復。

輸入法

Chrome OS 內建的中文輸入法有支援粵拼、倉頡、注音、五筆和拼音,不過並不能在簡體繁體中自由切換。目前 Chrome OS R74.0.3729.125 拼音輸入法分為「拼音」和「傳統拼音」,其實區別在於前者是簡體中文而後者是繁體中文,其實應該是在地化的小小失誤。

輸入法可以打單字和詞組,但根據淺羽目測,並沒有智慧聯想和自動結果排序。另外,即使是「傳統拼音」輸入法,依然無法好好地打出直角引號,同時輸入 Emoji 也比較麻煩。

生產力

生產力是一個很模糊的定義,傳統的「生產力」也許是指文檔、表單和投影片。在這方面,雖然還有很多人離不開 Microsoft Office,但對於淺羽來說,Docs / Sheets / Slides 三件套已經能完成大多數任務了,再不濟還能在 Linux Apps 裏開 LibreOffice。

在 iPad Pro 已經能運行桌面級 Photoshop 的今天,筆電和平板之間的界線已經漸漸模糊。淺羽最常用平板電腦做什麼?瀏覽網頁、看視訊、聊天和寫文和查看照片。現在一臺 iPad Air 2 就能大體上滿足淺羽的需求,那麼有完整的桌面版 Chrome 本身就解決了瀏覽網路的最大需求,而 Linux Apps 與 Android Apps 又豐富和完善了生態。加之 Chrome OS 本身對鍵盤滑鼠的良好支援,一臺可以拆卸鍵盤的 Chromebook 可能是淺羽用來替換掉 iPad 的最好選擇。沒錯 HP Chromebook x2,淺羽就是在說你。

Linux Apps、Android Apps 和 Chrome Apps 齊聚一堂

Chromebook 和 Chrome OS 裝置也許並不是在這個需求下最廉價的解決方案,但或許是最具有生產力的解決方案。千萬別忘記,其實體驗也是算作生產力的一個部分的。在 iPad 價格日益高企、Windows 裝置移動體驗不足的當下,Chrome OS 綜合了兩家半三家生態,使得它無論作爲平板電腦還是作爲文書機使用,都有相對較好的效果


(附錄在第二頁噢)


發表回覆

你的電郵地址並不會被公開。 必要欄位標記為 *

This site uses Akismet to reduce spam. Learn how your comment data is processed.