用Golang完全重写Linux用户空间,从init开始全部重写一遍
我尝试过了gokrazy。
gokrazy是什么
“gokrazy 是专为树莓派3设备设计的纯Go用户环境。”
只需一个选项,用中文将以下内容重新表达:
这是一个使用golang编写的系统,将Linux用户空间从init开始完全重写,并且可以通过一条命令为Raspberry Pi 3构建并创建启动SD卡。
我按照快速启动的步骤制作了SD卡并确认它可以运行。
(然而,由于无法解析主机名gokrazy,我通过另一种方法来确定树莓派的IP地址,并直接指定了IP地址,然后连接到运行在那里的Web服务器。)
惊讶的小巧
我查看了SD卡上创建的根文件系统。
$ df -h .
Filesystem Size Used Avail Use% Mounted on
/dev/sdc2 11M 11M 0 100% /media/koba/gokrazy1
文件大小只有11MB,文件系统为FAT16。据说是根据内容精确创建的,使用率达到了100%。
$ find .
.
./perm
./gokrazy
./gokrazy/dhcp
./gokrazy/ntp
./gokrazy/init
./cacerts
./dev
./etc
./tmp
./user
./user/hello
./localtim
./gokr-pw.txt
./proc
./sys
./hostname
只有这一个文件。
观察具体文件的大小。
$ ls -lh `find . -type f`
-r--r--r-- 1 koba koba 228K Oct 11 01:16 ./cacerts
-r--r--r-- 1 koba koba 1.7M Mar 29 07:01 ./gokrazy/dhcp
-r--r--r-- 1 koba koba 5.4M Mar 29 07:01 ./gokrazy/init
-r--r--r-- 1 koba koba 2.0M Mar 29 07:01 ./gokrazy/ntp
-r--r--r-- 1 koba koba 21 Mar 27 08:24 ./gokr-pw.txt
-r--r--r-- 1 koba koba 7 Mar 29 07:01 ./hostname
-r--r--r-- 1 koba koba 292 Feb 2 03:49 ./localtim
-r--r--r-- 1 koba koba 1.2M Mar 29 07:01 ./user/hello
有4个由Golang编写的命令执行文件,它们占据了大部分的空间。
实际上,最初这些Golang执行文件没有经过strip处理,因此它们的大小更大,但我自己进行了修正,使它们经过strip处理后的大小变小了。
我已经在GitHub上提交了这个修正的Pull Request。
https://github.com/gokrazy/tools/pull/8
限制
-
- libc や busybox のコマンドを含んでいない。sshでログインして対話的に何かをすることはできません。
- カーネルモジュールを含んでいない。必要なカーネルモジュールはスタティックに組み込んでおくことを想定していると思います。
理解最基本的系统是有助于学习的。
通过查看这个,我们可以得出结论,只需增加10MB的大小到希望运行的golang可执行文件即可。不仅嵌入式Linux用户,还有希望创建最小化的用于运行golang应用程序的服务器端容器的人也可能会感兴趣。
因为对在里面做什么非常感兴趣,所以我打算稍后调查并再次写下来。
关于尺寸,我认为如果将init、dhcp和ntp这三个合并为一个二进制文件,可以使其更小。
我写了一个只需最少初始化处理就能在Linux上运行一个golang执行文件的golang包。
开放会议
我在2018年春季Go Conference上用这个话题进行了演讲。
那时的演讲资料。
相关
从golang的runtime访问/etc文件
minimumgo:在Linux上只运行一个golang可执行文件时,提供最小化初始化处理的golang包
将多个golang可执行文件合并以减少总文件大小的技巧(类似busybox方式)
嵌入式Linux中使用Golang的建议