MirageOS - 无法为 XEN 构建 unikernel
MirageOS - Unable to build unikernel for XEN
我编写了一个简单的基于 MirageOS 的 Unikernel 来执行基本的 HTTP GET 调用。虽然当我 运行 它作为 Unix 二进制文件时它工作没有任何问题,但当我为 XEN (mirage configure --xen
) 配置它并启动 make
命令时,我收到以下错误:
ocamlbuild -use-ocamlfind -pkgs lwt.syntax,cohttp.lwt,cohttp.lwt-core,mirage-console.xen,mirage-http,mirage-types.lwt -tags "syntax(camlp4o),annot,bin_annot,strict_sequence,principal" -tag-line "<static*.*>: -syntax(camlp4o)" -cflag -g -lflags -g,-linkpkg,-dontlink,unix main.native.o
+ ocamlfind ocamlopt -g -linkpkg -dontlink unix -output-obj -package mirage-types.lwt -package mirage-http -package mirage-console.xen -package cohttp.lwt-core -package cohttp.lwt -package lwt.syntax -syntax camlp4o unikernel.cmx main.cmx -o main.native.o
File "_none_", line 1:
Error: No implementations provided for the following modules:
Unix referenced from /home/mirage/.opam/system/lib/lwt/lwt-unix.cmxa(Lwt_engine),
/home/mirage/.opam/system/lib/lwt/lwt-unix.cmxa(Lwt_unix),
/home/mirage/.opam/system/lib/lwt/lwt-unix.cmxa(Lwt_io),
/home/mirage/.opam/system/lib/lwt/lwt-unix.cmxa(Lwt_log),
/home/mirage/.opam/system/lib/ipaddr/ipaddr_unix.cmxa(Ipaddr_unix),
/home/mirage/.opam/system/lib/xenstore_transport/xenstore_transport_lwt_unix.cmxa(Xs_transport_lwt_unix_client),
/home/mirage/.opam/system/lib/conduit/conduit-lwt-unix.cmxa(Conduit_lwt_unix),
/home/mirage/.opam/system/lib/cohttp/cohttp_lwt_unix.cmxa(Cohttp_lwt_unix_debug),
/home/mirage/.opam/system/lib/cohttp/cohttp_lwt_unix.cmxa(Cohttp_lwt_unix)
Command exited with code 2.
Compilation unsuccessful after building 7 targets (0 cached) in 00:00:03.
make: *** [main.native.o] Error 10
我刚开始使用 MirageOS 和 OCaml,所以这可能是一个愚蠢的问题,但现在我真的不知道该怎么做。
你不应该使用 Cohttp_lwt_unix
。顾名思义,它运行在 unix 上,而不是 xen 上。如果你想要一个 xen-proof 的网络服务器的例子,你可以看看 this skeleton or at the code used by mirage-seal.
正如@Drup 所说,如果你想便携,你需要避免任何 "unix" 包。相反,为 cohttp 使用 Mirage 适配器。这个应该有效:
我编写了一个简单的基于 MirageOS 的 Unikernel 来执行基本的 HTTP GET 调用。虽然当我 运行 它作为 Unix 二进制文件时它工作没有任何问题,但当我为 XEN (mirage configure --xen
) 配置它并启动 make
命令时,我收到以下错误:
ocamlbuild -use-ocamlfind -pkgs lwt.syntax,cohttp.lwt,cohttp.lwt-core,mirage-console.xen,mirage-http,mirage-types.lwt -tags "syntax(camlp4o),annot,bin_annot,strict_sequence,principal" -tag-line "<static*.*>: -syntax(camlp4o)" -cflag -g -lflags -g,-linkpkg,-dontlink,unix main.native.o
+ ocamlfind ocamlopt -g -linkpkg -dontlink unix -output-obj -package mirage-types.lwt -package mirage-http -package mirage-console.xen -package cohttp.lwt-core -package cohttp.lwt -package lwt.syntax -syntax camlp4o unikernel.cmx main.cmx -o main.native.o
File "_none_", line 1:
Error: No implementations provided for the following modules:
Unix referenced from /home/mirage/.opam/system/lib/lwt/lwt-unix.cmxa(Lwt_engine),
/home/mirage/.opam/system/lib/lwt/lwt-unix.cmxa(Lwt_unix),
/home/mirage/.opam/system/lib/lwt/lwt-unix.cmxa(Lwt_io),
/home/mirage/.opam/system/lib/lwt/lwt-unix.cmxa(Lwt_log),
/home/mirage/.opam/system/lib/ipaddr/ipaddr_unix.cmxa(Ipaddr_unix),
/home/mirage/.opam/system/lib/xenstore_transport/xenstore_transport_lwt_unix.cmxa(Xs_transport_lwt_unix_client),
/home/mirage/.opam/system/lib/conduit/conduit-lwt-unix.cmxa(Conduit_lwt_unix),
/home/mirage/.opam/system/lib/cohttp/cohttp_lwt_unix.cmxa(Cohttp_lwt_unix_debug),
/home/mirage/.opam/system/lib/cohttp/cohttp_lwt_unix.cmxa(Cohttp_lwt_unix)
Command exited with code 2.
Compilation unsuccessful after building 7 targets (0 cached) in 00:00:03.
make: *** [main.native.o] Error 10
我刚开始使用 MirageOS 和 OCaml,所以这可能是一个愚蠢的问题,但现在我真的不知道该怎么做。
你不应该使用 Cohttp_lwt_unix
。顾名思义,它运行在 unix 上,而不是 xen 上。如果你想要一个 xen-proof 的网络服务器的例子,你可以看看 this skeleton or at the code used by mirage-seal.
正如@Drup 所说,如果你想便携,你需要避免任何 "unix" 包。相反,为 cohttp 使用 Mirage 适配器。这个应该有效: