在之前的文章 为什么Google需要Fuchsia操作系统 中,对Fuchsia操作系统的背景和大体的设计做了简要的介绍。

大家可能已经蠢蠢欲动,想要赶快尝试一下这个全新的系统了。

然而很遗憾的是,Google当前开源出来的代码库支持的设备非常有限,而且大部分GUI的内容均没有包含。所以,大家能尝试的内容非常有限。主要还是针对开发者的版本,不建议尝鲜的终端用户尝试。现在GUI能看到的,大体上就只是题图的内容。

准备工作

硬体设备

工欲善其事必先利其器。

首先你需要有1台电脑(废话),它运行的操作系统可以是Ubuntu Linux或者macOS,但必须都是64位的版本。它被称为宿主机,用以下载和编译Fuchsia操作系统,也用来作为客户机的更新源,向客户机推送镜像和更新。最重要的是,由于Fuchsia的代码量巨大,编译生成的文件也非常大,建议至少准备150GB的空余磁碟空间;如果考虑到将来升级,准备300GB以上是比较合适的空间大小。

如果你想要在真机上运行Fuchsia操作系统的话,还需要一台Intel NUC(6代或者7代,集成显卡,当前来说这是最简单的在真机上运行Fuchsia的方法)。需要将NUC的UEFI固件(俗称BIOS)更新到最新的版本。这台电脑被称为是客户机,用以实际运行Fuchsia操作系统。同时,你还需要一个优盘作为下载Fuchsia操作系统的启动盘。

软体准备

建议使用Ubuntu 18.04 x64作为宿主机的操作系统,主要原因在于Fuchsia的编译脚本依赖Git输出unixtime格式的时间戳信息,而Git是从2.10才开始支持这个功能的,16.04中包含的版本并不包含该功能,需要额外安装。

由于Fuchsia会通过CIPD(Chrom Infra Package Deployment)下载和使用指定版本的编译器,所以对系统自带的包的要求比较少,只需要采用如下指令安装即可:

sudo apt install build-essential curl git python unzip -y

对于macOS来说,需要首先从AppStore安装Xcode的最新版本,然后再在命令行执行

xcode-select --install

网路准备

由于众所周知的原因,Fuchsia涉及到的绝大部分代码仓库和CIPD仓库在大陆是无法访问的,你需要确保如下域名在你的宿主机上能够正常访问:

  • fuchsia.googlesource.com
  • github.com
  • chrome-infra-packages.appspot.com

我正在准备一份包含最新Fuchsia代码的虚拟机,想要尝鲜的朋友,也可以直接下载该虚拟机映像。

下载源代码

Fuchsia与Android不同,采用了jiri而非repo作为源码的管理工具。Google为了大家能够快速搭建编译环境,准备了一份脚本来自动化的下载源码。只需在你的shell中执行如下命令即可Checkout master版本的Fuchsia源代码:

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

这段代码会在当前目录下新建一个名为fuchsia的目录,然后将预编译的jiri和fx脚本(该脚本的用途我在下文会进一步说明)放入该目录中的.jiri_root/bin目录下,并将完整的代码都签出到fuchsia目录中。

注意:由于Fuchsia本身的目录结构已经比较深,建议直接在你的HOME目录中签出fuchsia。之前我将fuchsia放在了~/projects/open_source/fuchsia中,就碰到了路径过长的问题,无法编译。

签出后,需要将fuchsia/.jiri_root/bin目录加入到你的本地PATH中。你可以修改~/.profile文件,在文件的最后增加一行:

PATH="$HOME/fuchsia/.jiri_root/bin:$PATH"

然后重启系统(或者重新连接ssh),是的jiri和fx可用。

由于网路环境的原因,我们很难一次性签出成功。只要fuchsia/.jiri_root/bin目录和里面的jiri文件已经签出成功,我们可以通过在不完整的fuchsia目录中执行jiri update来逐步补完。而通过jiri update -v参数,可以观察到整个签出过程的细节,也更容易排查到签出错误的真正原因。在我的网路环境下,我用了大约2天的时间才完成了第一次完整的签出。所以,祝大家好运。

由于失败不止一次,所以,通常我会写一个脚本来保证签出成功:

#! /bin/bash

# make_sure_update.sh

while true; do
jiri update -v && break
done

编译

产品与板子

Google在Fuchsia中引入了2个正交的概念,以提供广泛的适应性:产品和板子(board,不知道该怎么翻orz)。

产品是指你想要编译的系统的用途。比如core表示只有最核心的系统,terminal表示具有命令行的界面,workstation代表具有完整GUI的全功能系统,router代表路由器。

而对应的,板子(board)是指你的系统运行的硬体设备。比如arm64表示执行armv8-a指令集的64位ARM CPU,而kirin970表示海思的麒麟970处理器。

Google为了让Fuchsia实现完全的模块化和可定制化,在这两个正交的概念中,是允许有包含关系的。比如上文中所说的产品:

terminal的导入了core(import("//products/core.gni")),并加上了一些命令行工具。

workstation的导入了terminal,并删除了部分命令行工具,同时加上了用户体验的包。

所以,如果我想做一台自动驾驶汽车,那么也可以在terminal的基础上,加上自动驾驶的相关服务即可。

这也非常有利于向新的平台移植Fuchsia操作系统,可以逐步实现目标。

可以通过fx list-products和fx list-boards来查看所有支持的产品和板子。

编译设置

有了上面的这些先导知识,我们就可以设置Fuchsia的编译参数了,格式如下:

fx set <product>.<board> [--release]

这里product需要用上述的具体的产品代替,board需要用上述的板子代替,如果包含了--release开关,则采用Release编译,否则默认采用Debug编译。

建议大家初次尝试使用如下编译参数:

fx set terminal.x64

编译

Fuchsia整个操作系统是使用ninja作为编译系统,GN作为meta build系统(Google自家的一套体系)。编译只需要执行:

fx build

它会自动用满你所有的CPU核心,来进行编译。在我的机器上,编译通常耗时40分钟,请耐心等待。

模拟运行

作为开发和尝鲜,使用qemu是最简单的途径。无需额外的物理硬体即可进行测试。在完成编译后,只需执行:

fx run

即可自动创建qemu镜像,并运行。而带上-g参数则可以打开Fuchsia的命令行终端。更多的信息,可以参考Fuchsia的官方文档:fuchsia.dev/fuchsia-src

注意:由于Fuchsia的GUI以来Vulcan图形API,而qemu当前并没有Vulcan模拟的能力,所以使用qemu时,最多只能看到命令行界面。

你可以使用Alt+F1 ~ Alt+F5在Debug Log和0~3号Shell之间进行切换。

在真机上运行

当前的Fuchsia操作系统只支持2个指令集arm64和x86_64。

x86_64指令集只支持Broadwell(第5代酷睿i处理器)及更新的Intel处理器,而更早的CPU和全线的AMD产品均不在支持之列。

同时,如果在x86_64的平台上运行,主板必须支持UEFI引导,且UEFI必须支持网路栈功能(也就是网卡是由UEFI初始化好的)。Fuchsia当前不支持安装到虚拟机中。

准备启动U盘

注意:该启动优盘上所有的内容都会被抹除。

在宿主机上,完成Fuchsia的Build之后,可以通过

fx mkzedboot <udisk_device>

比如,如果优盘是/dev/sdb,那么就可以使用:

fx mkzedboot /dev/sdb

即可完成启动盘制作。

使用启动盘启动

将启动盘插到客户机上,并在客户机中选择从该启动盘上的EFI启动(注意,不能选择Legacy Boot)。客户机会自动启动到一个zedboot系统(zedboot其实是一个最小化的zircon内核+驱动)中。

此时需要将2台电脑接入到同一个网路中,或者使用网线直接将两台电脑连接起来。

客户机上的zedboot会通过mdns协议对外广播自己的存在。

安装Fuchsia OS

此时,只需在宿主机上执行:

fx pave

即可自动装载Fuchsia操作系统到客户机的硬碟上,并自动重启进入新的操作系统。

如果安装失败,通常是因为客户机的硬碟原本已经有分区信息,包含了数据,可以在客户机上执行:

install-disk-image wipe
dm reboot

上述命令中的第一条会清空你的磁碟,而第二条会重启客户机。更多的信息可以参考官方文档中的Troubleshooting一节:fuchsia.googlesource.com

Enjoy

至此,你亲手编译的Fuchsia操作系统已经在机器上正常运行。

相关文章:

黄珏珅:为什么Google需要Fuchsia操作系统?

zhuanlan.zhihu.com图标
推荐阅读:

相关文章