試行錯誤: KerlaでGoのhello worldを動かす
やりたいこと: Linux互換なのでGOOS=linux GOARCH=amd64が動くか検証。
以下が動かしたいプログラム。
code:main.go
package main
import "fmt"
func main() {
fmt.Println("hello, world from Go")
}
上記のビルド。go-helloという実行ファイルを作成する。
code:bash
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o go-hello main.go
以下でDockerイメージを作成して、kerlaのトップレベルで make IMAGE=hello_image runのように実行することでファイルシステムにマウントさせる。(正確にはマウントされたKerlaイメージを作成してQEMUで動かしているのでないかと理解している。)
code:Dockerfile
FROM ubuntu:latest as ubuntu
# RUN apt update -y && apt install -y musl-tools
# ADD hello.c /hello.c
# RUN musl-gcc -static hello.c -o /hello
RUN mkdir /empty_dir
# FROM scratch
# WORKDIR /
# COPY --from=0 /hello /hello
# COPY --from=0 /empty_dir /tmp
FROM nuta/helloworld as nuta_hello_world
# ベースイメージはscratchにしないと1層目だけ利用されている雰囲気があった。
FROM scratch
WORKDIR /
# COPY --from=nuta_hello_world /hello /hello
ADD go-hello /go-hello
COPY --from=ubuntu /empty_dir /tmp
COPY --from=nuta_hello_world /bin/sh /bin/sh
詳細:
busyboxなどがREADMEからたどれるGistで公開されていないためnuta/helloworldからCOPY --fromしている。
以下で上記のDockerイメージを作成する。_5のようについているのはこれから行うmake runを一度実行すると内容がキャッシュされていそうな動きがあったため、make runして試すごとにイメージ名を変えている。
code:bash
docker build -t hello_5 .
kerlaをcloneしたトップレベルのディレクトリで以下を実行する。
code:bash
make IMAGE=hello_5 run
(kerlaのrevisionは0967a2fc2f61770ecb642b3c29733dcef5cd27b1)
上記のmake runで以下の出力を得た。
code:出力
...
Booting from ROM..
cmdline: /var/folders/gy/x23480_j2q3dyrzhgwy9kjmh0000gn/T/tmpm61zyryx
available RAM: base=890000, size=1015MiB
Booting Kerla...
initramfs: loaded 16 files and directories (2MiB)
kext: Loading virtio_net...
virtio-net: MAC address is 52:54:00:12:34:56
running init script: "/go-hello"
DHCP: got a IPv4 address: 10.0.2.15/24
WARN: unimplemented system call: sched_getaffinity (n=204)
WARN: sched_getaffinity: error: ENOSYS: This error originates from:
WARN: unimplemented system call: openat (n=257)
WARN: openat: error: ENOSYS: This error originates from:
WARN: mmap: error: EINVAL: This error originates from:
fatal error: runtime: cannot map pages in arena address space
WARN: unimplemented system call: nanosleep (n=35)
WARN: nanosleep: error: ENOSYS: This error originates from:
WARN: unimplemented system call: nanosleep (n=35)
WARN: nanosleep: error: ENOSYS: This error originates from:
runtime stack:
runtime.throw(0x4c3dc8, 0x30)
/usr/local/Cellar/go/1.15.6/libexec/src/runtime/panic.go:1116 +0x72 fp=0x9ffffe9d0 sp=0x9ffffe9a0 pc=0x432292
runtime.sysMap(0xc000000000, 0x4000000, 0x5859b8)
/usr/local/Cellar/go/1.15.6/libexec/src/runtime/mem_linux.go:172 +0xad fp=0x9ffffea10 sp=0x9ffffe9d0 pc=0x415f8d
runtime.(*mheap).sysAlloc(0x56b620, 0x400000, 0x0, 0x4)
/usr/local/Cellar/go/1.15.6/libexec/src/runtime/malloc.go:727 +0x1e5 fp=0x9ffffeab8 sp=0x9ffffea10 pc=0x40b685
runtime.(*mheap).grow(0x56b620, 0x1, 0x0)
/usr/local/Cellar/go/1.15.6/libexec/src/runtime/mheap.go:1344 +0x85 fp=0x9ffffeb20 sp=0x9ffffeab8 pc=0x425365
...
Goのスタックトレースが表示できているだけでも出力が出来たといえそう(?)
make runすると以下のようになりCtrl-Cでも止めれれなくなり、
https://gyazo.com/1566a7915e2dd40c3083877157bd5b52
以下のコマンドでPIDを調べてkillしている。
code:bash
lsof -i:20080
(QEMUに詳しいと何らか上手く終わらせられそう。)