作为一名开发人员,一直关注各种桌面级/移动级操作系统的进展,其中就包含 ChromeOS。
对于一个开发者(客户端、嵌入式、硬件开发者除外)而言,对于操作系统的要求如下:
对于这三个要求,ChromeOS,都可以比较完美的支持:
在国内,有一家厂商燧炻创新发行的 ChromeOS 的国内适配版: FydeOS。
在过去的几年中,也曾经尝试几次在一台闲置的 x86 设备上,安装过几次 FydeOS,但是总是有一些严重的问题,比如:wifi 连不上,安卓运行时初始化失败、Linux 子系统初始化失败等。
这两天,又一次尝试安装 FydeOS,发现这个版本,可以完美的支持这台设备。于是,探索了下 ChromeOS 提供的核心能力的技术原理,就有了这篇文章。
注:本文的的内容和结论,基于在一台古早的 x86 设备上安装的 FydeOS 系统上进行的探索和实验,并结合网络上 Chrome OS 的相关技术文档而得到。
这台是一个台 15.6 寸的笔记本电脑(海尔 s500),购置于 2015 年 9 月左右,当时京东购机价为 3599 元左右,基本参数如下:
本次安装 ChromeOS 版本为,燧炻创新发布的 FydeOS for PC - Intel 酷睿系列第三代至第八代处理器及 Intel HD 系列核心显卡,具体版本信息为:
安装方式基本上是傻瓜式的,非常简单,参见:首次运行 FydeOS for PC 文档。
Chromium 版本为(进入系统后查看): 96.0.4664.208
本小结,介绍如何使用 ChromeOS 的 Linux 子系统,搭建一个可用的软件开发环境。
首先,在设置 -> 高级 -> 开发者 -> Linux 开发环境 中启用 Linux 开发环境。
稍等片刻,即可安装完成。安装完成后可以直接在启动器 Linux 应用中看到图标。点击即可打开。
首先是设置时区,在终端中输入:
sudo dpkg-reconfigure tzdata
# 选择亚洲 (Asia), 上海 (Shanghai)
复制代码
安装中文字体:
sudo apt install fonts-wqy-microhei fonts-wqy-zenhei
复制代码
配置字符集为 zh_CN.uft8
:
sudo dpkg-reconfigure locales
复制代码
字符集配置完成完成后需重启生效:
sudo reboot
复制代码
sudo apt install -y gnome-software gnome-packagekit && \
sudo apt update
复制代码
Linux 子系统中是无法使用 ChromeOS 的输入法的,因此需要在 Linux 子系统中安装中文输入法。
具体步骤参见:FydeOS 知识库 。
注意:
sudo dpkg -i xxx.deb
来安装sudo apt install fcitx-googlepinyin
来安装(需重启才能配置)。ChromeOS 和 Android 是深度集成的。ChromeOS 可以使用 Android 代理 App 提供的代理作为整个系统的全局 V**。也就是说 ChromeOS 的浏览器、Android App、Linux 子系统都会走 Android App 的代理。
打开一个 Android 代理 App 后,在 ChromeOS 的网络设置里面,可以看到该 V** 已经生效了。
至此,即可在 Linux 子系统中开发应用程序了,此外还有一些小提示:
通过 ctrl + shift + t 可以进入 crosh (The Chromium OS shell) 终端,详细手册参见: Chromium crosh README。
通过 help
和 help_advanced
命令可以查看 crosh 支持的命令列表(如 free
查看内存)。
这里通过 shell
命令,可以打开一个 bash 终端,这个终端运行在 ChromeOS 所在 Linux 内核中,用户为 chronos。
chronos 用户就是 ChromeOS 运行 Chrome 的用户。在 FydeOS 中,chronos 用户没有设置密码,而且可拥有 sudo root 的权限(相当于 Android 系统 root 了),这给我们很大的自定义空间,后文将介绍这一点。
相关命令如下(下文命令均在该 shell 中执行):
# ctrl + shift + t
shell
su su root
复制代码
执行 uname -a
输出如下:
Linux localhost 5.4.188-16917-g3358c5a3654f-dirty #2 SMP PREEMPT Thu May 26 15:47:47 CST 2022 x86_64 Intel(R) Core(TM) i5-4210M CPU @ 2.60GHz GenuineIntel GNU/Linux
复制代码
可以看出 Linux 内核版本为 5.4。
执行 stat /proc/1/exe
输出如下:
File: /proc/1/exe -> /sbin/init
Size: 0 Blocks: 0 IO Block: 1024 symbolic link
Device: 5h/5d Inode: 783097 Links: 1
Access: (0777/lrwxrwxrwx) Uid: ( 0/ root) Gid: ( 0/ root)
Context: u:r:cros_init:s0
Access: 2022-07-10 01:21:29.404407129 -0700
Modify: 2022-07-10 01:21:19.401406853 -0700
Change: 2022-07-10 01:21:19.401406853 -0700
Birth: -
复制代码
执行 /sbin/init
输出如下:
Usage: init [OPTION]...
Process management daemon.
Options:
-q, --quiet reduce output to errors only
-v, --verbose increase output to include informational messages
--help display this help and exit
--version output version information and exit
This daemon is normally executed by the kernel and given process id 1 to denote its special status. When executed by a user process, it
will actually run /sbin/telinit.
Report bugs to <upstart-devel@lists.ubuntu.com>
复制代码
可以看出 ChromeOS 的 init 进程为: upstart。经过搜索,可以找到:ChromeOS 的 boot 设计文档,该文档中确定了 ChromeOS 的 init 进程为 upstart。
知道了 init 是 upstart,我们就可以通过在 /etc/init
目录里面添加自定义的开启自启配置文件,即可做到在 ChromeOS 的所在的内核,开机自动运行一些进程/服务(下文有介绍)。
执行 /lib64/libc.so.6
输出如下:
GNU C Library (Gentoo 2.32-r17 p8) stable release version 2.32.
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 10.2.0.
libc ABIs: UNIQUE IFUNC ABSOLUTE
For bug reporting instructions, please see:
<http://crbug.com/new>.
复制代码
可以看出 ChromeOS 采用的 libc 为 Linux 标准的 glibc,版本为 2.32。这篇文档介绍了 ChromeOS 编译 glibc 的 FAQ,印证了 ChromeOS 使用 libc 版本为 glibc。
不同的 libc 可能是相互不兼容,确认 ChromeOS 使用的是标准的 glibc,那么直接在 ChromeOS 所在内核运行程序的难度将会大大降低,因为 Linux 上主流的 C/C++ 编写的程序多数是首选兼容 glibc 的。
在 ChromeOS 文件 APP 只能看到有限的一些目录,主要是我的文件目录。该目录 ChromeOS 所在内核文件系统的哪里呢?经过查找,发现位于 /home/chronos/user/MyFiles
路径下。
首先在 设置 -> 高级 -> 开发者 中开启 Linux 开发环境。
经过检索,可以发现 ChromeOS 开发了一个半虚拟化的软件 crosvm 来运行 Linux 子系统内核。
通过 ps aux | grep crosvm
可以看出运行了很多 crosvm 相关的进程。
下面介绍一下 Linux 子系统和 ChromeOS 文件共享的机制。
将 Chrome OS 的文件共享到 Linux 子系统中
与 Linux 共享
。/mnt/chromeos/MyFiles
目录中看到,Downloads 等目录。该目录是有读写权限的。读取 Linux 子系统 $HOME
目录
我的文件 > Linux 文件
,通过这个目录可以访问 Linux 子系统中的 $HOME
目录。mount | grep linux
查看,输出如下
fuse:sshfs://rectcircle@penguin.termina.linux.test: on /media/fuse/crostini_ba1970ad840cb1d1a3344784b0d0cc65044919aa_termina_penguin type fuse.sshfs (rw,nosuid,nodev,noexec,relatime,nosymfollow,dirsync,user_id=1000,group_id=1001,default_permissions,allow_other) 复制代码
/media/fuse/crostini_ba1970ad840cb1d1a3344784b0d0cc65044919aa_termina_penguin
路径下。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。