From 5347278136d65648ad026c340ea9f5ddf0c09ee6 Mon Sep 17 00:00:00 2001 From: Norman Feske Date: Wed, 25 Mar 2020 17:08:36 +0100 Subject: [PATCH] sculpt: perform prepare step without noux Issue #3696 --- repos/gems/recipes/pkg/sculpt/archives | 1 + .../src/app/sculpt_manager/runtime/prepare.cc | 156 +++++++++++++++--- 2 files changed, 131 insertions(+), 26 deletions(-) diff --git a/repos/gems/recipes/pkg/sculpt/archives b/repos/gems/recipes/pkg/sculpt/archives index ef3c6a2bba..e56698c0a0 100644 --- a/repos/gems/recipes/pkg/sculpt/archives +++ b/repos/gems/recipes/pkg/sculpt/archives @@ -28,6 +28,7 @@ _/src/coreutils-minimal _/src/vfs _/src/vfs_import _/src/vfs_lxip +_/src/vfs_pipe _/src/rump _/src/ipxe_nic_drv _/src/chroot diff --git a/repos/gems/src/app/sculpt_manager/runtime/prepare.cc b/repos/gems/src/app/sculpt_manager/runtime/prepare.cc index 861292e741..003d0f86d8 100644 --- a/repos/gems/src/app/sculpt_manager/runtime/prepare.cc +++ b/repos/gems/src/app/sculpt_manager/runtime/prepare.cc @@ -13,27 +13,30 @@ #include -void Sculpt::gen_prepare_start_content(Xml_generator &xml, Prepare_version version) +namespace Sculpt { + + static void gen_prepare_vfs_start (Xml_generator &); + static void gen_prepare_fs_rom_start(Xml_generator &); + static void gen_prepare_bash_start (Xml_generator &); +} + + +void Sculpt::gen_prepare_vfs_start(Xml_generator &xml) { - xml.attribute("version", version.value); - - gen_common_start_content(xml, "prepare", Cap_quota{500}, Ram_quota{100*1024*1024}); - - gen_named_node(xml, "binary", "noux"); + gen_common_start_content(xml, "vfs", Cap_quota{200}, Ram_quota{5*1024*1024}); char const * const script = "export VERSION=`cat /VERSION`\n" "cp -r /rw/config/$VERSION/* /config/\n" "mkdir -p /rw/depot\n" - "cp -r depot/* /rw/depot\n"; + "cp -r depot/* /rw/depot\n" + "exit\n"; + + gen_provides<::File_system::Session>(xml); xml.node("config", [&] () { - xml.attribute("stdout", "/dev/null"); - xml.attribute("stderr", "/dev/null"); - xml.attribute("stdin", "/dev/null"); - - xml.node("fstab", [&] () { + xml.node("vfs", [&] () { gen_named_node(xml, "tar", "bash-minimal.tar"); gen_named_node(xml, "tar", "coreutils-minimal.tar"); gen_named_node(xml, "tar", "depot_users.tar"); @@ -44,7 +47,14 @@ void Sculpt::gen_prepare_start_content(Xml_generator &xml, Prepare_version versi gen_named_node(xml, "dir", "dev", [&] () { xml.node("null", [&] () {}); xml.node("log", [&] () {}); - xml.node("zero", [&] () {}); }); + xml.node("zero", [&] () {}); + gen_named_node(xml, "inline", "rtc", [&] () { + xml.append("2018-01-01 00:01"); + }); + gen_named_node(xml, "dir", "pipe", [&] () { + xml.node("pipe", [&] () { }); + }); + }); gen_named_node(xml, "dir", "rw", [&] () { xml.node("fs", [&] () { xml.attribute("label", "target"); }); }); @@ -55,32 +65,126 @@ void Sculpt::gen_prepare_start_content(Xml_generator &xml, Prepare_version versi gen_named_node(xml, "rom", "VERSION"); }); - gen_named_node(xml, "start", "/bin/bash", [&] () { - - gen_named_node(xml, "env", "HOME", [&] () { - xml.attribute("value", "/"); }); - - gen_named_node(xml, "env", "TERM", [&] () { - xml.attribute("value", "screen"); }); - - xml.node("arg", [&] () { xml.attribute("value", "--login"); }); + xml.node("default-policy", [&] () { + xml.attribute("root", "/"); + xml.attribute("writeable", "yes"); }); }); + xml.node("route", [&] () { + xml.node("any-service", [&] () { + xml.node("parent", [&] () { }); }); }); +} + + +void Sculpt::gen_prepare_fs_rom_start(Xml_generator &xml) +{ + gen_common_start_content(xml, "vfs_rom", Cap_quota{100}, Ram_quota{15*1024*1024}); + + gen_named_node(xml, "binary", "fs_rom", [&] () { }); + + gen_provides(xml); + + xml.node("config", [&] () { }); + + xml.node("route", [&] () { + gen_service_node<::File_system::Session>(xml, [&] () { + gen_named_node(xml, "child", "vfs"); }); + + xml.node("any-service", [&] () { xml.node("parent", [&] () { }); }); + }); +} + + +void Sculpt::gen_prepare_bash_start(Xml_generator &xml) +{ + gen_common_start_content(xml, "bash", Cap_quota{400}, Ram_quota{15*1024*1024}); + + gen_named_node(xml, "binary", "/bin/bash", [&] () { }); + + xml.node("exit", [&] () { xml.attribute("propagate", "yes"); }); + + xml.node("config", [&] () { + + xml.node("libc", [&] () { + xml.attribute("stdout", "/dev/null"); + xml.attribute("stderr", "/dev/null"); + xml.attribute("stdin", "/dev/null"); + xml.attribute("pipe", "/dev/pipe"); + xml.attribute("rtc", "/dev/rtc"); + }); + + xml.node("vfs", [&] () { xml.node("fs", [&] () { }); }); + + auto gen_env = [&] (auto key, auto value) { + xml.node("env", [&] () { + xml.attribute("key", key); + xml.attribute("value", value); }); }; + + gen_env("HOME", "/"); + gen_env("TERM", "screen"); + gen_env("PATH", "/bin"); + + xml.node("arg", [&] () { xml.attribute("value", "bash"); }); + xml.node("arg", [&] () { xml.attribute("value", "--login"); }); + }); + + xml.node("route", [&] () { + gen_service_node<::File_system::Session>(xml, [&] () { + gen_named_node(xml, "child", "vfs"); }); + + gen_service_node(xml, [&] () { + xml.attribute("label_last", "/bin/bash"); + gen_named_node(xml, "child", "vfs_rom"); + }); + + gen_service_node(xml, [&] () { + xml.attribute("label_prefix", "/bin"); + gen_named_node(xml, "child", "vfs_rom"); + }); + + xml.node("any-service", [&] () { xml.node("parent", [&] () { }); }); + }); +} + + +void Sculpt::gen_prepare_start_content(Xml_generator &xml, Prepare_version version) +{ + xml.attribute("version", version.value); + + gen_common_start_content(xml, "prepare", Cap_quota{800}, Ram_quota{100*1024*1024}); + + gen_named_node(xml, "binary", "init"); + + xml.node("config", [&] () { + + xml.node("parent-provides", [&] () { + gen_parent_service(xml); + gen_parent_service(xml); + gen_parent_service(xml); + gen_parent_service(xml); + gen_parent_service(xml); + gen_parent_service<::File_system::Session>(xml); + }); + + xml.node("start", [&] () { gen_prepare_vfs_start (xml); }); + xml.node("start", [&] () { gen_prepare_fs_rom_start(xml); }); + xml.node("start", [&] () { gen_prepare_bash_start (xml); }); + }); + xml.node("route", [&] () { gen_service_node<::File_system::Session>(xml, [&] () { - xml.attribute("label", "target"); + xml.attribute("label", "vfs -> target"); gen_named_node(xml, "child", "default_fs_rw"); }); - gen_parent_rom_route(xml, "noux"); gen_parent_rom_route(xml, "ld.lib.so"); gen_parent_rom_route(xml, "bash-minimal.tar"); gen_parent_rom_route(xml, "coreutils-minimal.tar"); gen_parent_rom_route(xml, "depot_users.tar"); gen_parent_rom_route(xml, "vfs.lib.so"); + gen_parent_rom_route(xml, "vfs_pipe.lib.so"); gen_parent_rom_route(xml, "libc.lib.so"); - gen_parent_rom_route(xml, "libc_noux.lib.so"); gen_parent_rom_route(xml, "libm.lib.so"); gen_parent_rom_route(xml, "posix.lib.so"); gen_parent_route (xml); @@ -90,7 +194,7 @@ void Sculpt::gen_prepare_start_content(Xml_generator &xml, Prepare_version versi gen_parent_route (xml); gen_service_node<::File_system::Session>(xml, [&] () { - xml.attribute("label", "config"); + xml.attribute("label", "vfs -> config"); xml.node("parent", [&] () { xml.attribute("label", "config"); }); }); }); }