Fuchsia上头指南

本文不保证完全正确,希望对本文有意见的朋友通过写在关于界面的联系方式联系我。

如果有任何问题可以直接通过评论讲述你的问题。

本教程适用于2020年3月的源码版本。

Google在2016年做出了初始版本的Fuchsia系统,这是一个基于全新Zircon内核的操作系统,主要适用于嵌入式系统。我们可以看到项目使用了C、C++、Dart、Go、Python等多种语言,从Google Git中的commit log可以看到项目目前仍然在积极开发,官方也放出了开发者网站Fuchsia.dev

同时允许我们自己编译这个系统进行尝试,下面我们来探索一下。

编译环境

目前并不支持在Windows下面编译,而且我认为在虚拟机和WSL里面进行并不明智,你需要的是运行在物理机上面的Linux发行版或者Mac OS。因为体验并不佳,所以也不建议在VPS上面进行。

我的编译环境是:

  • Ubuntu 18.04
  • Linux Kernel 5.3(请不要选用版本过高的内核,否则Dart会出现Broken Pipe错误,这也会影响到你开发Flutter应用,5.5.9版本内核测试失败。)

在编译的时候请退出你的conda环境:conda deactivate,否则Python会出现错误。

这里我们安装必要的依赖,并给予ccache加速支持:

1
$ sudo apt-get install build-essential curl git python unzip ccache

拉取源码

源码托管在Google Git上面,大小约有10G以上,所以首先我们需要搭建一个能连上Google的稳定网络环境,并在shell中启用支持:

1
2
$ export ALL_PROXY=socks5h://127.0.0.1:1080 #Socks支持
$ export http_proxy=http://127.0.0.1:8123 #HTTP支持

切换到你想要的目录,执行官方的bootstrap脚本:

1
$ curl -s "https://fuchsia.googlesource.com/fuchsia/+/master/scripts/bootstrap?format=TEXT" | base64 --decode | bash

这会在当前目录下面创建一个Fuchsia文件夹,并且下载版本管理工具jiri,以后每次使用的时候需要按照提示把jiri加入PATH变量之中。有几个需要注意的点:

  • 你并不能使用git去更新,因为jiri下载下来的不属于任何一个分支,你需要用jiri update进行整体更新。
  • 中途出现网络错误的话会自动重试,如果仍然不行就手动执行jiri update,不需要重新直接引导脚本。
  • 如果提示缺少权限,那就点开给你的Google登录地址,输入得到的access code,执行jiri update即可。

本节可以参考Download Fuchsia source

配置编译内容

一个设置的样例如下:

1
$ fx set workstation.x64 --with //bundles:tests --ccache

这里我们设置了编译的产品为workstation,不同的版本区别如下:

  • bringup是最简洁的版本,非常适用于底层开发和调试,并不支持实时获取软件。
  • core是一个支持安装额外软件的版本,适用于更高一层的配置。
  • workstation是一个基础的常用的开发环境,适用于开发UI、媒体等,是最适合爱好者进行探索的版本。

x64表明了我们需要的是x64架构。

捆绑包:

  • tests会编译所有tests程序。
  • tools包含了一些开发调试工具,比如发起http请求、调整音量等等。
  • kitchen_sink会编译全部程序,会产生20G以上的编译结果,

同时你可以发现我们开启了ccache加速编译,当然你也可以使用--no-ccache来禁用。

进行编译

1
$ fx build

这条命令通常可以解决问题,如果你有任何问题,请添加参数--log build.log进行记录,并且在寻求帮助的时候附上你的log。

运行Fuchsia并启用网络支持

这里你可以选择安装Fuchsia或者直接在虚拟机上面运行,我们选择QEMU来跑,如果你有条件的话,可以pave到实体机上面:Install Fuchsia on a Device

似乎jiri会下载prebuild的qemu,最后也会去调用,所以不用本地安装。

为了让虚拟机能访问互联网,我们新建一个interface:

1
$ sudo ip tuntap add dev qemu mode tap user $USER

这时候先不要激活,我们需要配置IPv4支持、包转发和DNS支持。

下面的方法已被Google暂时禁用,请自行选择是否采用,原因为:

This script sets configurations that are not safe for many common environments and users have a tendency to run it blindly without understanding of the consequences. Much of the unwanted behavior of the script is unnecessary and should one day be replaced by a script that is more fit for purpose and does not introduce these problems.

如果你已经了解风险,请保存脚本:start-dhcp-server.sh,并按照下面的方式执行:

1
2
$ chmod +x ./start-dhcp-server.sh
$ ./start-dhcp-server.sh qemu

如果你的系统是中文,并且nmcli d status的结果显示qemu确实处于未托管状态,那么你可以修改L 66的unmanaged"未托管"

完成之后我们再激活qemu并启动虚拟机:

1
2
$ sudo ip link set qemu up
$ fx qemu -N

如果这时候出现ERROR: Could not extend fvm, unable to stat fvm image的话需要去除本地化设置,export LC_ALL=C

因为QEMU不支持Vulkan,所以你不能在上面运行图形程序,-g选项也只是创建一个图形缓冲区。但是我们在一个2018年的新闻中发现Google正在使Android Studio中的安卓模拟器支持Zirzon,并支持Vulkan。所以我们现在还需要等待官方更新。

运行命令

这里我们打开了三个窗口分别为:

1
2
3
$ fx serve -v
$ fx qemu -N
$ fx shell

第一个提供了一个pave server,因为很多编译时候的配置包括软件并没有包含在镜像里面,我们需要启动一个服务器来按需提供软件,比如执行curl的时候就会从这个服务器中获取。

第二个我们启动了一个虚拟机,同时会启动一个SSH服务器,fx shell就会去连接。

我们在这里执行一下常见的ls和curl命令:

编译软件

比较遗憾的是,Fuchsia里面没有带有开发工具,所以不能在系统里面编译东西。所以我们从外部编译之后在通过pave server传入。这也能理解,我们需要的是编译好的软件包,而不是编译一个软件。

首选我们查看在fx set的时候GN发现的包(GN相关概念:Using GN build):fx list-packages

对任意一个包进行编译,然后push到服务器:fx build-push echo_test

在shell里面执行:run echo_test,如果提示这个名字对应多个组建的话,那我们需要指定组件:fuchsia-pkg://fuchsia.com/echo_test#meta/echo_integration_test.cmx

从输出来看已经执行成功:

1
2
3
4
5
6
7
8
9
10
Found fuchsia-pkg://fuchsia.com/hello_world_cpp_tests#meta/hello_world_cpp_unittests.cmx, executing.
[==========] Running 1 test from 1 test suite.
[----------] Global test environment set-up.
[----------] 1 test from HelloWorldTest
[ RUN ] HelloWorldTest.True
[ OK ] HelloWorldTest.True (1 ms)
[----------] 1 test from HelloWorldTest (6 ms total)
[----------] Global test environment tear-down
[==========] 1 test from 1 test suite ran. (29 ms total)
[ PASSED ] 1 test.

写在最后

初步地测试了一下Fuchsia,我们可以看到这个系统已经完成了一些基础命令的实现,甚至从9to5Google发布的消息来看,已经成功跑起来Chrome。Google自研的Zircon内核在子进程的处理某些方面上比Linux更加安全,有更严格的权限管理。而新的网络安装系统方式和网络获取组件方式似乎也能看出以后全新的软件OTA更新。

有人喜欢讨论这个系统能不能战胜Android和iOS,这个还不好下定论,而且既然这个系统也能在嵌入式设备里面跑起来,目标是全平台,那也不是很好做。一个系统的成败也要靠开发者的活跃性和门槛,否则会落到以前诺基亚一样的结局。

让我们拭目以待吧!

参考链接

  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-SA 许可协议。转载需要标明作者,并以超链接的方式指向原文。
  • Copyrights © 2020 Kevin Li
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~