分类 crostini 下的文章

前置条件:

已开启Linux (Beta)
可能需要开启梯子,本教程不考虑一切网络问题

如果你没有梯子,在某些步骤需要换成国内源

教程所使用的系统版本:

Version 80.0.3987.137 (Official Build) (64-bit)

步骤

进入 termina

使用Ctrl+alt+t开启系统自带的命令行
输入vmc start termina进入vm:

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

使用 lxc 创造并进入容器

输入lxc launch ubuntu:18.04 desktop 创建容器
输入lxc exec desktop bash 进入容器
输入su ubuntu 登入ubuntu用户
输入cd ~ 进入用户目录

(termina) chronos@localhost ~ $ lxc launch ubuntu:18.04 desktop
Creating desktop
Starting desktop
(termina) chronos@localhost ~ $ lxc exec desktop bash
root@desktop:~# su ubuntu
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

ubuntu@desktop:/root$ cd ~
ubuntu@desktop:~$ 

注意:如果你清楚你正在做什么,可以尝试以下操作:

  • 输入lxc remote list查看镜像资源并访问相应网站以更改在这一步建立的镜像
  • 输入lxc remote add以增加新的镜像资源
  • 输入lxc image list以查看或管理本地镜像
  • 修改desktop为其他名字对容器进行命名。
  • 使用root或其他用户进行后续操作

安装相关依赖

依次输入以下命令:
更新源:

sudo apt update

更新软件:

sudo apt upgrade

安装桌面环境(这一步所需的时间比较长,可能需要几十分钟):

sudo apt install ubuntu-gnome-desktop
注意:如果你清楚自己正在做什么,可以替换为其他桌面环境(如kde,xfce等)。
但是可能面临无法连接,无法启动,登录后无内容等信息。本文中所使用的配置与命令是我亲测可用的。

安装VNC相关程序:

sudo apt install xserver-xorg-core tigervnc-standalone-server tigervnc-xorg-extension tigervnc-viewer

配置VNC程序

输入vncserver启动vnc服务器,由于是首次启动,你将看到以下信息:

You will require a password to access your desktops.

Password:
Verify:
Would you like to enter a view-only password (y/n)? n
/usr/bin/xauth:  file /home/ubuntu/.Xauthority does not exist

New 'BaseBionicDesktop.lxd:1 (ubuntu)' desktop at :1 on machine BaseBionicDesktop.lxd

Starting applications specified in /etc/X11/Xvnc-session
Log file is /home/ubuntu/.vnc/BaseBionicDesktop.lxd:1.log

Use xtigervncviewer -SecurityTypes VncAuth -passwd /home/ubuntu/.vnc/passwd :1 to connect to the VNC server.

键入两次访问密码,之后键入n(这一步是询问是否增加一个只读密码,由于我们是在本机使用,不需要这个功能)

输入vncserver -kill :*关闭vnc服务器,你将看到以下信息:

Killing Xtigervnc process ID 1080... success!

输入vi ~/.vnc/xstartup(其中vi可以替换成nano)修改xstartup文件,替换成以下信息并保存退出:

#!/bin/sh
# Start Gnome 3 Desktop 
[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
vncconfig -iconic &
dbus-launch --exit-with-session gnome-session &

依次输入以下两个命令开启桌面服务:

sudo systemctl start gdm
sudo systemctl enable gdm

在输入第二个命令的时候可能出现以下信息:

The unit files have no installation config (WantedBy, RequiredBy, Also, Alias
settings in the [Install] section, and DefaultInstance for template units).
This means they are not meant to be enabled using systemctl.
Possible reasons for having this kind of units are:
1) A unit may be statically enabled by being symlinked from another unit's
   .wants/ or .requires/ directory.
2) A unit's purpose may be to act as a helper for some other unit which has
   a requirement dependency on it.
3) A unit may be started when needed via activation (socket, path, timer,
   D-Bus, udev, scripted systemctl call, ...).
4) In case of template units, the unit is meant to be enabled with some
   instance name specified.

如果出现此类信息,输入sudo vi /lib/systemd/system/gdm.service修改配置文件,并将以下内容添加到文件末尾:

[Install]
WantedBy=multi-user.target

再输入一次sudo systemctl enable gdm,出现以下信息则说明开启启动设置成功

Created symlink /etc/systemd/system/multi-user.target.wants/gdm.service → /lib/systemd/system/gdm.service.

启动vnc服务器并连接

输入以下命令启动vnc服务器

tigervncserver -localhost no -geometry 1200x900 -depth 24
使用1200x900分辨率是因为pixelbook默认的虚拟分辨率是1200x900,你可以根据需要替换成其它值
进入应用商店下载VNC® Viewer for Google Chrome™插件

新启动一个termina页面或返回至termina页,输入lxc list,可以看到类似以下的信息:

+-------------------+---------+-----------------------+------+------------+-----------+
|       NAME        |  STATE  |         IPV4          | IPV6 |    TYPE    | SNAPSHOTS |
+-------------------+---------+-----------------------+------+------------+-----------+
| desktop           | RUNNING | 100.115.92.197 (eth0) |      | PERSISTENT | 0         |
+-------------------+---------+-----------------------+------+------------+-----------+
| penguin           | STOPPED |                       |      | PERSISTENT | 1         |
+-------------------+---------+-----------------------+------+------------+-----------+

desktop后面的ip地址即为该linux容器的ip地址,打开VNC插件后输入

100.115.92.197::5901

进行连接即可(ip请替换为你自己界面中的ip)

其他可选项

参考网络上的资料,有使用系统服务来在容器启动时自动开启vnc服务的方法,但是我尝试了好久,以服务方式启动连接上之后无法显示桌面环境,暂未找到解决方法。

使用别名来令启动更加简单:
在系统内输入vi ~/.bash_aliases
加入以下内容:

alias runvnc='tigervncserver -kill :* && tigervncserver -localhost no -geometry 1200x800 -depth 24'
alias stopvnc='tigervncserver -kill :*'

之后即可使用runvnc来启动vnc服务,使用stopvnc来关闭vnc服务。

20/05/10 更新:在最近的某次更新之后,ubuntu源( https://cloud-images.ubuntu.com/releases )的镜像都不能使用了,建议改成images源( https://images.linuxcontainers.org )

参考资料:

Install VNC Server with Gnome display on Ubuntu 18.04

How to debug a failed systemctl service (code=exited, status=217/USER)?

linux中如何让命令的别名重启后还生效

备份

  • 使用 Ctrl+shift+t 打开命令行窗口
  • 使用 vmc start termina 进入虚拟容器
  • 使用 lxc list 查看容器名字及备份数量(某些重大更新后可能会有自动备份,否则需要手动备份)
  • 使用 lxc snapshot penguin <备份编号>进行备份

恢复

  • 使用 Ctrl+shift+t 打开命令行窗口
  • 使用 vmc start termina 进入虚拟容器
  • 使用 lxc list 查看备份数量(某些重大更新后可能会有自动备份,否则需要手动备份)
  • 使用 lxc info penguin 查看备份的编号
  • 使用 lxc restore penguin <编号> 进行恢复

某些更新后(之所以用某些是因为有的时候备份会出现有的时候又会消失)在设置中自带备份与恢复选项,但是那种方式的备份与恢复效率过低,相比此种方式的优势在于可以导出一个单独的文件,可以复制到其他设备上。具体使用哪种方式请读者自行权衡

20/03/17更新

lxc容器的管理非常方便,你可以简单的使用

  • lxc copy <容器名字> <副本名字>
  • lxc delete <容器名字>
  • lxc rename <容器名字> <新名字>

等命令来轻松的进行备份,复制,重命名,删除等操作。
不过在只用copy命令复制时会连快照snapshot一起复制,注意可能会因此占用较多的磁盘空间。

20/07/15更新

除了以上两种方式,实际上还有通过发布容器的方式进行备份,将发布后的容器备份挂载到某个容器中,并通过ssh或者其他方式拷贝出来,也可以得到单独的备份文件,效率比设置中的备份与恢复高,也可以导出单独的文件存储至可移动设备上,不过缺点是需要比较多的步骤,输入较多的命令。感兴趣的可以上网搜索相关教程。

更改系统默认语言

安装语言包

  • 修改locale.gen文件

    sudo vim /etc/locale.gen

    去掉zh_CN.GBK GBK,zh_CN.UTF8 UTF8的注释,或者直接添加这两行内容。

  • 使用sudo locale-gen下载语言。

修改默认语言编码

sudo dpkg-reconfigure locales

选择系统的默认语言,推荐选择zh_CN.UTF8 UTF8

如果系统语言未改变尝试重启

修复中文乱码

安装中文字体

sudo apt-get install xfonts-wqy ttf-wqy-zenhei ttf-wqy-microhei

如果中文依然乱码尝试重启

安装中文输入法

安装 Fcitx

虽然一般 debian 都有装 fcitx 但还是确保一下

sudo apt install fcitx

配置 Fcitx

im-config

点击确定->点击Yes->选择fcitx->确定->确定

重启使配置生效

安装谷歌拼音输入法

sudo apt install fcitx-googlepinyin

移除Module避免冲突(不确定是否必须)

sudo apt remove fcitx-module-kimpanel

添加输入法

fcitx-config-gtk3

在界面中添加谷歌拼音输入法,如果没有看到尝试重启。

修改环境变量以支持某些软件(如Clion等)

sudo vi /etc/systemd/user/cros-garcon.service.d/cros-garcon-override.conf

在文件末尾添加以下内容

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

这些环境变量可能会因为未来Chrome的更新而被取代。

设置开机自启动

sudo vim ~/.sommelierrc

在其中输入

/usr/bin/fcitx-autostart

/usr/share/applications路径下添加应用名.desktop文件。

应用名必须为英文,其中首字母应该要大写(暂未确定是否一定要大写)。
实际上该文件名可以是任意字符串,不一定需要是应用名,但是为了便于管理建议以应用名命名。

以下为我自己创建的Studio.desktop文件内容示例:

[Desktop Entry]
Name =AndroidStudio
Comment =android studio
Exec =/home/oopsvpwowlq/bin/android-studio/bin/studio.sh
Icon =/home/oopsvpwowlq/bin/android-studio/bin/studio.png
Terminal =false
Type =Application

其中
Name字段为在Launcher中显示的应用名
Comment在传统Linux桌面环境中似乎应该是鼠标长时间停留后给出的提示,但 Chrome OS 并无此功能,故似乎无用
Exec为你的应用程序的可执行文件的路径
Icon为你的应用程序的路径
最后两个字段通常情况下照搬即可,如果有特殊要求请自行上网查找 Linux桌面图标相关内容。


常见问题:

  • 为什么在打开后在任务栏中应用的图标变成了默认的小企鹅图标?
    目前来看出现这种问题的程序会首先有一个启动界面,之后启动界面消失产生应用主窗口,图标变为默认。
    本人暂未找到解决方案,一个未经实践的可能的解决方案是使用.svg格式的图片作为图标,如果该方案有效欢迎在评论区指出。
  • 为什么我在修改.desktop文件后Launcher中的图标没有变化?
    系统似乎并不会检测.desktop文件内容的变更。
    解决方案将你的.desktop文件更名,例如将Studio.desktop文件更名为Studio2.desktop文件,以此方式来使系统更新图标。当然图标变更后你也可以将文件名改回去。

有的时候在重启之后会出现点击termina等其他linux应用点击之后一直无法打开的情况。可以尝试使用以下解决方案:

  • ctrl+alt+t 打开命令行界面
  • 输入 vmc list 如果没有 termina 说明虚拟机完全损坏,需要重新安装Linux on ChromeOS
  • 如果存在 termina 输入 `vmc start termina' 进入vm环境
  • 输入 lxc list 查看是否存在 penguin 的项,如果不存在则需要重新安装Linux on ChromeOS
  • 如果存在 penguin 项尝试输入 lxc start termina 如果没有任何提示,输入 lxc list 后发现是 RUNNING 状态说明可以成功运行。
  • 如果出现诸如 error: Missing source '/run/sshd/penguin/authorized_keys' for disk 'ssh_authorized_keys' 的错误则存在以下两种解决方案

    • 发布(备份)并删除原虚拟机后重新安装(速度较慢,取决于虚拟机大小):

      • 依次输入如下命令
      • lxc publish penguin --alias backup
      • lxc delete penguin
      • lxc init backup penguin
      • lxc start penguin
      • 其中第一步运行速度较慢,请耐心等待,如果不确定程序是否正常进行可以另外开一个终端进入 termina ,输入 top 观察是否存在 gziplxc 命令占据大量CPU或内存资源。
    • 尝试创建需要的文件令它再次工作:

      • 输入 ls /run/sshd/ 观察是否存在文件夹(通常情况下没有,如果有 penguin 文件夹则无需再次建立)
      • 输入 mkdir /run/sshd/penguin 建立文件夹
      • 输入 touch /run/sshd/penguin/authorized_keys 创建文件
      • 输入 lxc start penguin 观察是否有新错误发生
      • 如果有新错误重复上述 touch 命令,将 authorized_keys 替换成新错误缺失的文件,直到不再发生错误为止
      • 19-3-11更新

        • 对于 error: Missing source '/run/tokens/penguin_token' for disk 'container_token'问题,以上方法无效,使用这个命令echo hello-world > /run/tokens/penguin_token之后即可解决
  • 输入 lxc list ,此时状态是 RUNNING 说明可以成功运行。
  • 输入 run_container.sh --container_name penguin --user [你的用户名] --shell 将其中的[你的用户名](不含中括号)替换成你创建的crostini的用户名(通常是你的谷歌账号)

之后可以在这个界面中正常运行GUI程序,原来的termina将不可使用,files应用中也不可以打开linux文件,暂未找到解决方案。此时可以考虑暂用使用单独的窗口打开命令行避免与浏览器热键冲突来实现与termina相同的效果。

参考资料


19-3-11更新

不知道什么原因,每次重启之后很可能termina就不能直接使用了,但是使用一段时间(不关机,不使用的时候仅合上盖子)后就可以正常使用。

19-6-29更新

随着系统版本的更新与系统稳定性的增强,我已经很久没有出现termina出问题的情况了,这篇文章也许不再那么有用了。