ChromeOS 体验

简介: ChromeOS 是后发的桌面级操作系统,它的 UI 是现代化的。在诞生之处,ChromeOS 目标是可以在廉价的设备上流畅运行,因此流畅度没有问题。最后,ChromeOS 内核基于 Linux,且系统相对封闭,在专用设备上稳定性应该有所保证(FydeOS for PC 这种无法面向一大类机器的发行版,无法保证稳定性)。ChromeOS 系统层面,通过虚拟机技术,提供了具有独立内核的 Linux 子系统。ChromeOS 就是对 Chrome 浏览器的操作系统化的产品,浏览器的体验毋庸置疑。

概述
作为一名开发人员,一直关注各种桌面级/移动级操作系统的进展,其中就包含 ChromeOS。
对于一个开发者(客户端、嵌入式、硬件开发者除外)而言,对于操作系统的要求如下:

流畅、稳定而现代化的系统 UI。
完整的 Linux 环境。
好用的浏览器。
丰富的开发者和娱乐软件生态。

对于这三个要求,ChromeOS,都可以比较完美的支持:

ChromeOS 是后发的桌面级操作系统,它的 UI 是现代化的。在诞生之处,ChromeOS 目标是可以在廉价的设备上流畅运行,因此流畅度没有问题。最后,ChromeOS 内核基于 Linux,且系统相对封闭,在专用设备上稳定性应该有所保证(FydeOS for PC 这种无法面向一大类机器的发行版,无法保证稳定性)。
ChromeOS 系统层面,通过虚拟机技术,提供了具有独立内核的 Linux 子系统。
ChromeOS 就是对 Chrome 浏览器的操作系统化的产品,浏览器的体验毋庸置疑。
ChromeOS 可以在 Linux 子系统中安装 Linux GUI 程序,因此可以直接安装如 VSCode、Jetbrains 等 IDE,开发者软件生态丰富。
ChromeOS 系统层面,通过 Linux 容器化技术,提供了 Android 运行环境,可以安装和运行安卓 App,具有了 Android 应用生态。

在国内,有一家厂商燧炻创新发行的 ChromeOS 的国内适配版: FydeOS。
在过去的几年中,也曾经尝试几次在一台闲置的 x86 设备上,安装过几次 FydeOS,但是总是有一些严重的问题,比如:wifi 连不上,安卓运行时初始化失败、Linux 子系统初始化失败等。
这两天,又一次尝试安装 FydeOS,发现这个版本,可以完美的支持这台设备。于是,探索了下 ChromeOS 提供的核心能力的技术原理,就有了这篇文章。
注:本文的的内容和结论,基于在一台古早的 x86 设备上安装的 FydeOS 系统上进行的探索和实验,并结合网络上 Chrome OS 的相关技术文档而得到。
设备信息
这台是一个台 15.6 寸的笔记本电脑(海尔 s500),购置于 2015 年 9 月左右,当时京东购机价为 3599 元左右,基本参数如下:

内存: 8G DDR3L 内存(原机 4G、后扩展到 8G)
CPU: 英特尔 酷睿i5 4代系列, i5-4210M
磁盘: 1TB 5400 转 SATA 机械硬盘
WIFI: 802.11bgn (仅支持 2.4 Ghz)
蓝牙: 本机无,后购置了一个外置 USB 免驱蓝牙 (jd)

系统版本和安装
本次安装 ChromeOS 版本为,燧炻创新发布的 FydeOS for PC - Intel 酷睿系列第三代至第八代处理器及 Intel HD 系列核心显卡,具体版本信息为:

版本号: 14.2-SP1 (更新日志)
发布日期: 2022-05-31
HASH(sha256): 8066c8e08129bd85838c00b5c96fb12a192b87e668657ca73634ecbf763ee8d2

安装方式基本上是傻瓜式的,非常简单,参见:首次运行 FydeOS for PC 文档。
Chromium 版本为(进入系统后查看): 96.0.4664.208
开发环境搭建
本小结,介绍如何使用 ChromeOS 的 Linux 子系统,搭建一个可用的软件开发环境。
首先,在设置 -> 高级 -> 开发者 -> Linux 开发环境 中启用 Linux 开发环境。
安装 IDE (以 VSCode 为例)

打开 VSCode 下载页面,下载 .deb 包。
打开 ChromeOS 自带额文件 App,我的文件 -> 下载内容,右击 通过 Linux 安装。

稍等片刻,即可安装完成。安装完成后可以直接在启动器 Linux 应用中看到图标。点击即可打开。
配置中文和字体

参考:安装 Android 应用、配置 Linux 环境:FydeOS 进阶使用教程

首先是设置时区,在终端中输入:
sudo dpkg-reconfigure tzdata

选择亚洲 (Asia), 上海 (Shanghai)

复制代码
安装中文字体:
sudo apt install fonts-wqy-microhei fonts-wqy-zenhei
复制代码
配置字符集为 zh_CN.uft8:
sudo dpkg-reconfigure locales
复制代码
字符集配置完成完成后需重启生效:
sudo reboot
复制代码
安装可视化包管理器

参考:ChromeOS Linux setup

sudo apt install -y gnome-software gnome-packagekit && \
sudo apt update
复制代码
安装中文输入法
Linux 子系统中是无法使用 ChromeOS 的输入法的,因此需要在 Linux 子系统中安装中文输入法。
具体步骤参见:FydeOS 知识库 。
注意:

上文做 3.1 之前,需要先执行 fcitx 命令。
可以选择安装搜狗输入法:shurufa.sogou.com/linux 下载下来,然后在 Linux 子系统中通过 sudo dpkg -i xxx.deb 来安装
可以选择安装 Google 拼音输入法,在 Linux 子系统中通过 sudo apt install fcitx-googlepinyin 来安装(需重启才能配置)。

VPN 和 网络代理
ChromeOS 和 Android 是深度集成的。ChromeOS 可以使用 Android 代理 App 提供的代理作为整个系统的全局 VPN。也就是说 ChromeOS 的浏览器、Android App、Linux 子系统都会走 Android App 的代理。
打开一个 Android 代理 App 后,在 ChromeOS 的网络设置里面,可以看到该 VPN 已经生效了。
小提示
至此,即可在 Linux 子系统中开发应用程序了,此外还有一些小提示:

Linux 子系统的文件共享和 ChromeOS 的文件共享,参见下文:Linux 子系统分析
开发调试 Android App,参见 FydeOS 官方文档: 在 FydeOS 下开发调试安卓程序指北

Chrome OS 浅析
crosh
通过 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。
init 进程选型
执行 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 的所在的内核,开机自动运行一些进程/服务(下文有介绍)。
libc 库选型
执行 /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 子系统分析

首先在 设置 -> 高级 -> 开发者 中开启 Linux 开发环境。

经过检索,可以发现 ChromeOS 开发了一个半虚拟化的软件 crosvm 来运行 Linux 子系统内核。
通过 ps aux | grep crosvm 可以看出运行了很多 crosvm 相关的进程。
下面介绍一下 Linux 子系统和 ChromeOS 文件共享的机制。
将 Chrome OS 的文件共享到 Linux 子系统中

在 ChromeOS 的文件 APP 中,右击 我的文件 ,选择 与 Linux 共享。
此时即可在 Linux 子系统中,在 /mnt/chromeos/MyFiles 目录中看到,Downloads 等目录。该目录是有读写权限的。

读取 Linux 子系统 $HOME 目录

在 ChromeOS 的文件 APP 中,可以看到:我的文件 > Linux 文件,通过这个目录可以访问 Linux 子系统中的 $HOME 目录。
在 ChromeOS 的 shell 中,如何访问该目录呢?

通过 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)
复制代码

输出的第二行,可以该目录是通过 sshfs 的方式挂载到的了 ChromeOS 的 /media/fuse/crostini_ba1970ad840cb1d1a3344784b0d0cc65044919aa_termina_penguin 路径下。

该目录是有完整的读写权限的。也就是说,也可以通过该目录来实现共享。

相关文章
|
编解码 芯片 UED
高性能SoC FPGA原型验证系列——综述
本系列博文将结合自己在FPGA原型验证方面的工作经验,先从总体上探讨FPGA原型验证的优势和挑战,然后介绍市面常见的FPGA原型平台并分析各自的优缺点,随后重点介绍平头哥高性能SoC使用的FPGA原型平台,后续还会就FPGA原型中的关键技术进一步展开讨论,并给出自己的一些经验和技巧总结,希望通过系列博文能带给读者关于FPGA原型验证一个系统的认识。当然,我更希望参与FPGA原型平台工作的同学能够一起切磋技艺,为平台建设出谋划策,快速迭代我们的平台,让我们一起打造更加Smart的FPGA原型平台.
高性能SoC FPGA原型验证系列——综述
|
3月前
|
SQL 分布式计算 关系型数据库
Hadoop-21 Sqoop 数据迁移工具 简介与环境配置 云服务器 ETL工具 MySQL与Hive数据互相迁移 导入导出
Hadoop-21 Sqoop 数据迁移工具 简介与环境配置 云服务器 ETL工具 MySQL与Hive数据互相迁移 导入导出
121 3
|
5月前
|
关系型数据库 MySQL 数据安全/隐私保护
使用 Docker 部署一个文档管理系统,让宝贵文档不在丢失!
使用 Docker 部署一个文档管理系统,让宝贵文档不在丢失!
|
8月前
|
监控 安全 API
如何防止短信盗刷产生资损
日常使用的云资源中,如果由于客户API对外设计不合理、AK/SK暴露等原因,可能导致资源出现被盗刷的情况并导致资损,本文梳理针对短信服务的防盗刷的能力,以及配套的安全管理策略。短信计费模式:可参考https://help.aliyun.com/document_detail/44340.htmlht...
216 0
如何防止短信盗刷产生资损
|
弹性计算 运维 容灾
阿里云使用体验
经过进一步的体验云服务器我感受到阿里云提供的性能卓越、稳定可靠、弹性扩展的IaaS(Infrastructure as a Service)级别云计算服务。云服务器ECS免去了采购IT硬件的前期准备,就像是使用水、电、天然气等公共资源一样便捷、高效地使用服务器,实现计算资源的即开即用和弹性伸缩,在使用期间给阿里云我最大的印象就是方便,快捷。使用界面简单明了,通过不断地尝试,我了解到了更多的特殊概念,专业名词,也了解到了如快照等容灾备份能力的实际用途,现实生活中,如果我们的电脑磁盘出现了故障,数据出现了损坏就无能为力了,或者只能够找专业的人把数据能够找回来,但是不能够保证说所有的数据都能找回来。
|
弹性计算 开发者 Windows
关于阿里云使用体验的一些心得
总体的交互模式还不错,具有便利的使用策略,以及利于开发者使用的编辑器。易于上手,开发环境集成了较多熟悉的知识,且具有与本地编辑器相似的开发环境。开发者可以直接上手,新手也可以按照开发文档快速上手。
|
编解码 物联网
【BLE】蓝牙5.2 新特性 - LE Audio
连接同步通道是基于蓝牙连接的,首先要先建立ble连接基于时间同步的音频传输机制,可以实现多个设备的数据同步一个master可以建立多个CIG每个CIG可以最多31个CIS每个CIS里面最多有31个subevent链路层有LL_CIS_REQ 和 LL_CIS_RSP来创建CIS无连接的单向的,无应答机制广播通道,对接收者的数量没有限制不仅可以广播数据包还可以广播控制包每个big里面最多可以包含31个bis。
2034 0
【BLE】蓝牙5.2 新特性 - LE Audio
|
弹性计算 固态存储 架构师
阿里云使用体验心得
阿里云使用心得体会,阿里云得优势在哪里?
|
Web App开发 存储 数据可视化
Linux内存管理神器:smem工具
Linux内存管理神器:smem工具
950 0
Linux内存管理神器:smem工具
|
Java Android开发 Windows
成功解决eclipse启动报错 Error:Could not create the Java Virtual Machine Error:A fatal exception has occurred
成功解决eclipse启动报错 Error:Could not create the Java Virtual Machine Error:A fatal exception has occurred