前言

FydeOS是一个国产的ChromiumOS发行版,是目前唯一像ChromeOS一样支持安装Android应用的ChromiumOS发行版.FydeOS像ChromeOS一样也支持运行Linux程序,但是默认的发行版是Debian,包又老又少,因此决定换Archlinux.

-1.Crostini结构

ChromiumOS运行Linux的项目叫Crostini.ChromiumOS的文档详细的介绍了其架构.

ChromiumOS
    Chrome浏览器

    Android运行环境
        Android应用

    crosvm虚拟机
        Termina
            Linux容器
                penguin
                archlinux
                其他Linux容器实例

        其他虚拟机实例

这里(机器)翻译/修改一下官方文档,以便理解其中的法文命名的专业名词.

Crostini是使Linux应用程序支持易于使用并与Chrome OS完美集成的总称。它侧重于为您提供一个容器的终端,可以轻松访问以开发人员为中心的工具。与此对比,Crouton提供了非官方的Linux支持,不是很安全,也不是很方便,但特权更大。

crosh是Chrome OS上使用前端技术构建的一个终端模拟器,使用CTRL-ALT-T可以打开它。

终端应用是该环境的第一个入口。它基本上只是crosh的快捷方式。

crosvm是一个虚拟机监视器,负责管理KVM,guest VM以及进行低级(基于Linux virtio驱动)的通信。

Termina是一个虚拟机映像,带有精简的Chrome OS linux内核和用户态工具。它的唯一目标是尽快启动并开始运行容器。许多程序/工具都是自定义的。其名字是“终端terminal”缺少一个字母,但并非有意如此。

Concierge(礼宾部门)是一个在Chrome OS中运行的守护进程,它处理VM和容器的生命周期管理,并使用gRPC over vsock与Maitred进行通信。

Maitred(侍者总管)是VM内部的init和服务/容器管理器,负责与Concierge(在VM外部运行)进行通信。Concierge发出请求,Maitred负责执行这些请求。

Tremplin(法国著名酒店)是一个在VM中运行的守护进程,为LXD提供gRPC的包装。这包括一些基本功能,如创建和启动容器,还提供其他Crostini特定的集成,例如设置容器的主用户,以及在guest虚拟机中设置匹配Chrome OS版本的apt存储库。

Cicerone(侍酒师认证)是一个在Chrome OS中运行的守护程序,它在容器开始运行后直接处理与VM和容器的所有通信。具体来说,它与Tremplin(在VM内部运行)和Garcon(在VM内部的容器中运行)进行通信。

Garcon(侍者)在容器内部运行,并提供与Cicerone/Chrome的集成,以实现更方便/自然的行为。例如,如果容器想要打开URL,Garcon会负责管理该请求。

9P协议是Plan 9(贝尔实验室九号计划)的遗产,一种优秀的网络协议,能远程的访问文件,就像访问本地文件一样。贝尔实验室解散后,大多数科学家都来到了Google,并将9P移植到Linux.

Seneschal(总管)是一个在Chrome OS中运行的守护进程,用于处理9P服务器的生命周期管理。当Concierge启动VM时,它会向Seneschal发送一条消息,以便为该VM启动9s实例。然后,在配置VM时,Concierge会向Maitred发送一条消息,指示它连接到9s实例并将其挂载到VM中。

9s是9P文件系统协议的服务器。每个VM都有一个9s的实例,它使VM可以访问存储在VM外部的用户数据。其中包括“下载”文件夹,Google云端硬盘和可移动媒体等内容。每个9s实例的生命周期由Seneschal管理。每个9s实例启动时无法访问任何文件。通过向Seneschal发送消息来授予对特定路径的访问权限,这使得所请求的路径可用于指定的9s实例。共享路径的请求只能由某些用户操作触发。

Sommelier(侍酒师)是Wayland代理合成器,在容器内运行。Sommelier可以在容器内的Wayland应用程序和Chrome之间无缝转发内容,输入事件,剪贴板数据等。Chrome OS不支持X协议,因此,Sommelier还负责启动XWayland(以rootless模式),充当客户端的X窗口管理器,并将容器内的X协议转换为Chrome OS的Wayland协议。

penguin(企鹅)是默认的容器。

0.已知问题

Linux支持处于测试版阶段,有一定概率启动失败,终端应用无限转圈,尤其是执行sudo reboot后.正常的启动时间为10秒,如果一分钟之后启动不了,可以重启系统重试.

1.进入Termina,安装容器

使用CTRL-ALT-T可以打开打开crosh.在其中输入vmc start termina以启动Termina虚拟机.

crosh> vmc start termina
(termina) chronos@localhost ~ $

lxc list列出已经安装的容器.

(termina) chronos@localhost ~ $ lxc list
+---------+---------+-----------------------+------+------------+-----------+
| NAME    | STATE   | IPV4                  | IPV6 | TYPE       | SNAPSHOTS |
+---------+---------+-----------------------+------+------------+-----------+
| penguin | RUNNING | 100.115.92.202 (eth0) |      | PERSISTENT | 0         |
+---------+---------+-----------------------+------+------------+-----------+

使用run_container.sh命令可以下载并安装Archlinux容器.由于FydeOS相对于ChromiumOS对此命令进行了修改,编辑这个sh脚本撤销更改.由于termina是只读的,将脚本复制到临时目录/tmp

cp /usr/bin/run_container.sh /tmp
cd /tmp
vim run_container.sh

找到以下片段

# lxc init "google:${FLAGS_lxd_image}" "${FLAGS_container_name}" || \
#   die "Unable to create container from image '${FLAGS_lxd_image}'"
local container_root="/usr/share/intergrade_container"
local lxd_info="${container_root}/lxd.tar.xz"
local root_file="${container_root}/rootfs.squashfs"
local container_alias="intergrade_fydemina"
lxc image import $lxd_info $root_file --alias $container_alias || \
    die "Unable to import image from $root_file"
lxc init $container_alias ${FLAGS_container_name} || \
    die "Unable to create container from image $container_alias"

修改为

lxc init "google:${FLAGS_lxd_image}" "${FLAGS_container_name}" || \
    die "Unable to create container from image '${FLAGS_lxd_image}'"

运行以下命令.请确保用户名是设置应用里显示的用户名.你可以自行选择container_name指定的容器名,lxd_image指定的linux镜像,或者lxd_remote指定的镜像源.

bash ./run_container.sh --container_name arch --user 你的用户名 --lxd_image archlinux/current --lxd_remote https://mirrors.tuna.tsinghua.edu.cn/lxc-images/

确保下载成功并且创建用户成功(忽略那几个无法加入用户组的错误).

2.进入容器的shell

执行lxc exec arch -- bash以执行容器的shell

(termina) chronos@localhost /tmp $ lxc exec arch -- bash
[root@arch ~]#

在容器中执行以下命令

#设置密码.千万不要给root设置密码,否则ChromiumOS集成服务将无法运行
passwd 你的用户名
#把用户加入wheel组
usermod -aG wheel 你的用户名

设置源,把tuna ustc 163等中国的源剪切粘贴到前面.vi中dd剪切整行,p粘贴,/搜索

vi /etc/pacman.d/mirrorlist

设置archlinuxcn源

vi /etc/pacman.conf

在最后插入

[archlinuxcn]
Server = https://mirrors.tuna.tsinghua.edu.cn/archlinuxcn/$arch

安装依赖

pacman -Syu archlinuxcn-keyring base-devel git gtk3 openssh xdg-utils xkeyboard-config

启用sudo无密码,执行visudo

删除以下行前的注释

%wheel   ALL=(ALL:ALL) NOPASSWD: ALL

退出到termina exit

3.登录到容器

登录到你创建的用户(之前执行bash的方法不是登录,无法加载服务).

运行lxc console arch,然后直接输入用户名.

(termina) chronos@localhost /tmp $ lxc console arch
To detach from the console, press: <ctrl>+a q
你的用户名
Password:
[你的用户名@arch ~]$

登录成功后安装aur上的cros-container-guest-tools-git.由于需要从chromium.googlesource.com下载文件,因此请自行解决网络问题.注意,Android或者Chromium OS里的代理设置不会应用到虚拟机.

git clone https://aur.archlinux.org/cros-container-guest-tools-git.git
cd cros-container-guest-tools-git
makepkg -i
#解决.config不存在导致没有设置默认浏览器的问题
mkdir ~/.config
xdg-settings set default-web-browser garcon_host_browser.desktop

解决Archlinux里xkeyboard-config更新导致Sommelier不支持两个键码的问题 打开/usr/share/X11/xkb/keycodes/evdev,注释或者删除<i372><i374>开头的两行.

cros-container-guest-tools-git应用于ChromiumOS的最新版本,FydeOS暂时没有更新到R71,不支持x-auth功能,因此需要修改文件(更新后就不用改了).

打开/usr/lib/systemd/user/sommelier-x@.service,把

ExecStart=/opt/google/cros-containers/bin/sommelier \
              -X \
              --x-display=%i \
              --sd-notify="READY=1" \
              --no-exit-with-child \
              --x-auth=${HOME}/.Xauthority \
              /bin/sh -c \
                  "systemctl --user set-environment ${DISPLAY_VAR}=$${DISPLAY}; \
                   systemctl --user set-environment ${XCURSOR_SIZE_VAR}=$${XCURSOR_SIZE}; \
                   systemctl --user import-environment SOMMELIER_VERSION; \
                   touch ${HOME}/.Xauthority; \
                   xauth -f ${HOME}/.Xauthority add ${HOST}:%i . $(xxd -l 16 -p /dev/urandom); \
                   . /etc/sommelierrc"

改为

ExecStart=/opt/google/cros-containers/bin/sommelier \
              -X \
              --x-display=%i \
              --sd-notify="READY=1" \
              --no-exit-with-child \
              /bin/sh -c \
                  "systemctl --user set-environment ${DISPLAY_VAR}=$${DISPLAY}; \
                   systemctl --user set-environment ${XCURSOR_SIZE_VAR}=$${XCURSOR_SIZE}; \
                   systemctl --user import-environment SOMMELIER_VERSION; \
                   . /etc/sommelierrc"

启用cros-container-guest-tools-git附带的所有systemd服务

sudo systemctl enable cros-sftp
systemctl --user enable sommelier@0.service
systemctl --user enable sommelier@1.service
systemctl --user enable sommelier-x@0.service
systemctl --user enable sommelier-x@1.service
systemctl --user enable cros-garcon.service

4.重命名容器

由于一些限制,目前Crostini的Chromium OS集成仅名为penguin的容器可以启用,因此需要重命名容器.(不要删除自带的Debian容器)

[你的用户名@arch ~]$ exit
按下ctrl-A Q
(termina) chronos@localhost /tmp $ lxc stop arch
(termina) chronos@localhost /tmp $ lxc stop penguin
(termina) chronos@localhost /tmp $ lxc rename penguin debian
(termina) chronos@localhost /tmp $ lxc rename arch penguin

重启虚拟机

sudo reboot

5.本地化

打开终端应用,等待几秒,archlinux就启动了,随后做一些本地化

设置时区sudo timedatectl set-timezone Asia/Shanghai

设置中文语言

编辑/etc/locale.gen,删除zh_CN.UTF-8前的注释,然后执行sudo locale-gen

修改/etc/locale.conf

LANG="zh_CN.UTF-8"
LANGUAGE="zh_CN.UTF-8"
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"

安装字体,输入法.这里还安装了搜狗输入法,可能会出现bug,请酌情选择.

sudo pacman -S fcitx-im fcitx-configtool fcitx-sogoupinyin wqy-microhei

打开/usr/lib/systemd/user/cros-garcon.service.d/cros-garcon-override.conf

插入

Environment="GTK_IM_MODULE=fcitx"
Environment="QT_IM_MODULE=fcitx"
Environment="XMODIFIERS=@im=fcitx"

执行

echo /usr/bin/fcitx-autostart > $HOME/.sommelierrc

重启容器

sudo reboot

运行fcitx-config-gtk3配置输入法.

参考

https://www.reddit.com/r/Crostini/wiki/howto/run-arch-linux