源碼獲取
Pink + Purple == Fuchsia (a new Operating System)
Fuchsia 是谷歌新推出的一款OS。其內核爲 Zircon
。
因爲衆所周知的原因,需要翻出去才能下載源碼,怎麼翻這裏就不詳述了。
Fuchsia 的源代碼有多個 git 倉庫,使用 Jiri 進行管理,因此下載 Fuchsia 的源代碼也需要安裝 Jiri。
Fuchsia 倉庫地址是 https://fuchsia.googlesource.com,相應的文檔也在這裏,也可參考 https://fuchsia.dev/。
下載、構建、運行
下載
Debian 類的 Linux
sudo apt-get install build-essential curl git python unzip
The bootstrap procedure requires that you have Go 1.6 or newer and Git installed and on your PATH.
This script will bootstrap a development environment for by first creating directories fuchsia.
curl -s "https://fuchsia.googlesource.com/fuchsia/+/master/scripts/bootstrap?format=TEXT" | base64 --decode | bash
詳情請參閱
按照提示將 $FUCHSIA_DIR/.jiri_root/bin
添加到環境變量裏。
ln -s `pwd`/scripts/fx ~/bin
構建
fx set core.x64 --with //bundles:kitchen_sink
fx build
構建選項命令格式如下,這個命令指定了構建的選項並且在 out/xxx
裏生成構建系統本身。
fx set [product].[board] --with //bundles:[name]
product
指產品配置,我們可以通過 fx list-products
來查看所有的產品配置列表。
介紹最基本三個:
- bringup,最小的系統功能集,沒有網絡支持等,我猜可能僅是個能運行起來的內核和驅動程序等
- core,安裝了基本程序的最小功能集,例如網絡能力等,比 bringup 高級一點
- workstation,通用開發環境的基礎,包含了例如 UI、媒體和我們想折騰的一些東西
board
指芯片架構,我們同樣可以通過 fx list-boards
來查看支持的板子、芯片架構。
name
指額外的模塊,比如測試程序等,文檔提到三個選擇,分別是 tools
、tests
以及 kitchen_sink
。
它們的含義分別是:
- tools,包含了大量的開發人員工具,例如 shell 組件,ls、vim、cat、curl 等
- tests,包含所有的測試程序,這個選項編譯完成後佔用空間較大
- kitchen_sink,包含所有其他構建目標,編譯完成後佔用空間超級大
編譯輸出目錄默認爲 out/default
,也可以指定。
這裏貼上完整的編譯命令,fx --dir out/aarch64 set core.arm64 --with //bundles:tests
之後運行 fx build
就可以編譯 Fuchsia 系統了,目前編譯完成後大小 70G+
。
運行
構建完成後在 buildtools/qemu
中就已經有了 qemu
。
fx run
就可以讓 fuchsia 跑起來了。
fx run -h
可以查看支持的命令。
- exit qemu,ctrl + a then x
- ctrl+a ? or ctrl+a h prints all supported commands. 這裏指 qemu 本身支持的命令。
關閉 fuchsia 系統也很簡單,運行 dm shutdown
即可。
進一步探索
使能網絡功能
官方文檔中告訴我們,需要設置本地 DHCP 服務器和 NAT 爲 Fuchsia 配置 IPv4 接口和路由,因此我們啓動 Fuchsia 時用一個配置 DHCP 的腳本啓動。退出之前的系統,重新啓動一個帶網絡功能的 fuchsia。
fx run -N -u scripts/start-dhcp-server.sh
啓動 fuchsia 的開發更新服務器,用來上傳一些應用程序和文件到 fuchsia 上。這裏另起一個 shell,進入 $FUCHSIA_DIR
運行fx serve -v
。啓動成功後,我們再打開一個 shell 終端,運行 fx shell
,噠噠,現在我們通過登錄到 Fuchsia 中了~
接下來我們可以測試一下內置的一些程序,比如 fortune
, cowsay Hi!
。
實際運行發現如果不打開 fx serve -v
會報錯。
Cannot create child process: -1 (ZX_ERR_INTERNAL): failed to resolve fuchsia-pkg://fuchsia.com/fortune#bin/fortune
運行 fx serve -v
開啓開發更新服務後就能運行了。fortune
會返回一句名人名言,很有意思。
cowsay Hi!
是一頭牛說 Hi。
______
| Hi! |
------
\ ^__^
\ (oo)\_____
(__)\ )\/\
||----w |
|| ||
更新 package
Almost everything that exists on a Fuchsia system is stored in a Fuchsia package.
可以運行其他程序麼?當然是可以的。fx list-packages
查看構建的包。
如果代碼有更改,我們可以使用如下命令編譯該代碼並推送到 Fuchsia 上。
fx build-push hello_world_cpp_tests
然後在 fuchsia 的 shell 上運行即可,run hello_world_cpp_tests
。
比如我們修改 garnet/bin/rolldice/src/main.rs
的代碼,增加一句輸出。
運行 fx build-push rolldice
,然後再次運行 rolldice
則可以得到如下的輸出,第一句話就是增加的語句了,可見代碼已更新到 packages。