diff --git a/.gitignore b/.gitignore index 007129979f..874ff2af51 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,7 @@ *.o *.patch *.swp -/cli/config/configuration.toml +/cli/config/configuration-qemu.toml /cli/config-generated.go /cli/coverage.html /containerd-shim-kata-v2 diff --git a/Makefile b/Makefile index c33cab33ff..0d4ee108ab 100644 --- a/Makefile +++ b/Makefile @@ -89,12 +89,6 @@ ifeq (,$(installing)) EXTRA_DEPS = clean endif -ifeq (uncompressed,$(KERNELTYPE)) - KERNEL_NAME = vmlinux.container -else - KERNEL_NAME = vmlinuz.container -endif - LIBEXECDIR := $(PREFIXDEPS)/libexec SHAREDIR := $(PREFIX)/share DEFAULTSDIR := $(SHAREDIR)/defaults @@ -114,11 +108,22 @@ PKGLIBDIR := $(LOCALSTATEDIR)/lib/$(PROJECT_DIR) PKGRUNDIR := $(LOCALSTATEDIR)/run/$(PROJECT_DIR) PKGLIBEXECDIR := $(LIBEXECDIR)/$(PROJECT_DIR) -KERNELPATH := $(PKGDATADIR)/$(KERNEL_NAME) +KERNELDIR := $(PKGDATADIR) + INITRDPATH := $(PKGDATADIR)/$(INITRDNAME) IMAGEPATH := $(PKGDATADIR)/$(IMAGENAME) FIRMWAREPATH := +# Name of default configuration file the runtime will use. +CONFIG_FILE = configuration.toml + +HYPERVISOR_QEMU = qemu + +# Determines which hypervisor is specified in $(CONFIG_FILE). +DEFAULT_HYPERVISOR = $(HYPERVISOR_QEMU) + +# List of hypervisors this build system can generate configuration for. +HYPERVISORS := $(HYPERVISOR_QEMU) QEMUPATH := $(QEMUBINDIR)/$(QEMUCMD) SHIMCMD := $(BIN_PREFIX)-shim @@ -154,7 +159,6 @@ DEFDISABLEGUESTSECCOMP := true DEFENTROPYSOURCE := /dev/urandom DEFDISABLEBLOCK := false -DEFBLOCKSTORAGEDRIVER := virtio-scsi DEFENABLEIOTHREADS := false DEFENABLEMEMPREALLOC := false DEFENABLEHUGEPAGES := false @@ -176,9 +180,52 @@ VERSION := ${shell cat ./VERSION} COMMIT_NO := $(shell git rev-parse HEAD 2> /dev/null || true) COMMIT := $(if $(shell git status --porcelain --untracked-files=no),${COMMIT_NO}-dirty,${COMMIT_NO}) -CONFIG_FILE = configuration.toml -CONFIG = $(CLI_DIR)/config/$(CONFIG_FILE) -CONFIG_IN = $(CONFIG).in +# List of configuration files to build and install +CONFIGS = +CONFIG_PATHS = +SYSCONFIG_PATHS = + +# List of hypervisors known for the current architecture +KNOWN_HYPERVISORS = + +ifneq (,$(QEMUCMD)) + KNOWN_HYPERVISORS += $(HYPERVISOR_QEMU) + + CONFIG_FILE_QEMU = configuration-qemu.toml + CONFIG_QEMU = $(CLI_DIR)/config/$(CONFIG_FILE_QEMU) + CONFIG_QEMU_IN = $(CONFIG_QEMU).in + + CONFIG_PATH_QEMU = $(abspath $(CONFDIR)/$(CONFIG_FILE_QEMU)) + CONFIG_PATHS += $(CONFIG_PATH_QEMU) + + SYSCONFIG_QEMU = $(abspath $(SYSCONFDIR)/$(CONFIG_FILE_QEMU)) + SYSCONFIG_PATHS += $(SYSCONFIG_QEMU) + + CONFIGS += $(CONFIG_QEMU) + + # qemu-specific options (all should be suffixed by "_QEMU") + DEFBLOCKSTORAGEDRIVER_QEMU := virtio-scsi + DEFNETWORKMODEL_QEMU := macvtap + KERNELNAME_QEMU = $(call MAKE_KERNEL_NAME,$(KERNELTYPE)) + KERNELPATH_QEMU = $(KERNELDIR)/$(KERNELNAME_QEMU) +endif + +ifeq (,$(KNOWN_HYPERVISORS)) + $(error "ERROR: No hypervisors known for architecture $(ARCH) (looked for: $(HYPERVISORS))") +endif + +ifeq (,$(findstring $(DEFAULT_HYPERVISOR),$(HYPERVISORS))) + $(error "ERROR: Invalid default hypervisor: '$(DEFAULT_HYPERVISOR)'") +endif + +ifeq (,$(findstring $(DEFAULT_HYPERVISOR),$(KNOWN_HYPERVISORS))) + $(error "ERROR: Default hypervisor '$(DEFAULT_HYPERVISOR)' not known for architecture $(ARCH)") +endif + +ifeq ($(DEFAULT_HYPERVISOR),$(HYPERVISOR_QEMU)) + DEFAULT_HYPERVISOR_CONFIG_PATH = $(CONFIG_PATH_QEMU) +endif + CONFDIR := $(DEFAULTSDIR)/$(PROJECT_DIR) SYSCONFDIR := $(SYSCONFDIR)/$(PROJECT_DIR) @@ -197,13 +244,14 @@ USER_VARS += ARCH USER_VARS += BINDIR USER_VARS += CONFIG_PATH USER_VARS += DESTDIR +USER_VARS += DEFAULT_HYPERVISOR USER_VARS += SYSCONFIG USER_VARS += IMAGENAME USER_VARS += IMAGEPATH USER_VARS += INITRDNAME USER_VARS += INITRDPATH USER_VARS += MACHINETYPE -USER_VARS += KERNELPATH +USER_VARS += KERNELDIR USER_VARS += KERNELTYPE USER_VARS += FIRMWAREPATH USER_VARS += MACHINEACCELERATORS @@ -231,10 +279,10 @@ USER_VARS += DEFMAXVCPUS USER_VARS += DEFMEMSZ USER_VARS += DEFMEMSLOTS USER_VARS += DEFBRIDGES -USER_VARS += DEFNETWORKMODEL +USER_VARS += DEFNETWORKMODEL_QEMU USER_VARS += DEFDISABLEGUESTSECCOMP USER_VARS += DEFDISABLEBLOCK -USER_VARS += DEFBLOCKSTORAGEDRIVER +USER_VARS += DEFBLOCKSTORAGEDRIVER_QEMU USER_VARS += DEFENABLEIOTHREADS USER_VARS += DEFENABLEMEMPREALLOC USER_VARS += DEFENABLEHUGEPAGES @@ -279,7 +327,7 @@ netmon: $(NETMON_TARGET_OUTPUT) $(NETMON_TARGET_OUTPUT): $(SOURCES) $(QUIET_BUILD)(cd $(NETMON_DIR) && go build $(BUILDFLAGS) -o $@ -ldflags "-X main.version=$(VERSION)") -runtime: $(TARGET_OUTPUT) $(CONFIG) +runtime: $(TARGET_OUTPUT) $(CONFIGS) .DEFAULT: default build: default @@ -341,6 +389,20 @@ define INSTALL_EXEC install -D $1 $(DESTDIR)$2/$(notdir $1); endef +# Install a configuration file +# params: +# $1 : file to install +# $2 : directory path where file will be installed +define INSTALL_CONFIG + install --mode 0644 -D $1 $(DESTDIR)$2/$(notdir $1); +endef + +# Returns the name of the kernel file to use based on the provided KERNELTYPE. +# $1 : KERNELTYPE (compressed or uncompressed) +define MAKE_KERNEL_NAME +$(if $(findstring uncompressed,$1),vmlinux.container,vmlinuz.container) +endef + GENERATED_CONFIG = $(CLI_DIR)/config-generated.go GENERATED_GO_FILES += $(GENERATED_CONFIG) @@ -368,17 +430,17 @@ $(SHIMV2_OUTPUT): $(TARGET_OUTPUT) $(TARGET).coverage: $(SOURCES) $(GENERATED_FILES) Makefile $(QUIET_TEST)go test -o $@ -covermode count -GENERATED_FILES += $(CONFIG) +GENERATED_FILES += $(CONFIGS) $(GENERATED_FILES): %: %.in Makefile VERSION $(QUIET_CONFIG)$(SED) \ -e "s|@COMMIT@|$(COMMIT)|g" \ -e "s|@VERSION@|$(VERSION)|g" \ - -e "s|@CONFIG_IN@|$(CONFIG_IN)|g" \ + -e "s|@CONFIG_QEMU_IN@|$(CONFIG_QEMU_IN)|g" \ -e "s|@CONFIG_PATH@|$(CONFIG_PATH)|g" \ -e "s|@SYSCONFIG@|$(SYSCONFIG)|g" \ -e "s|@IMAGEPATH@|$(IMAGEPATH)|g" \ - -e "s|@KERNELPATH@|$(KERNELPATH)|g" \ + -e "s|@KERNELPATH_QEMU@|$(KERNELPATH_QEMU)|g" \ -e "s|@INITRDPATH@|$(INITRDPATH)|g" \ -e "s|@FIRMWAREPATH@|$(FIRMWAREPATH)|g" \ -e "s|@MACHINEACCELERATORS@|$(MACHINEACCELERATORS)|g" \ @@ -401,10 +463,10 @@ $(GENERATED_FILES): %: %.in Makefile VERSION -e "s|@DEFMEMSZ@|$(DEFMEMSZ)|g" \ -e "s|@DEFMEMSLOTS@|$(DEFMEMSLOTS)|g" \ -e "s|@DEFBRIDGES@|$(DEFBRIDGES)|g" \ - -e "s|@DEFNETWORKMODEL@|$(DEFNETWORKMODEL)|g" \ + -e "s|@DEFNETWORKMODEL_QEMU@|$(DEFNETWORKMODEL_QEMU)|g" \ -e "s|@DEFDISABLEGUESTSECCOMP@|$(DEFDISABLEGUESTSECCOMP)|g" \ -e "s|@DEFDISABLEBLOCK@|$(DEFDISABLEBLOCK)|g" \ - -e "s|@DEFBLOCKSTORAGEDRIVER@|$(DEFBLOCKSTORAGEDRIVER)|g" \ + -e "s|@DEFBLOCKSTORAGEDRIVER_QEMU@|$(DEFBLOCKSTORAGEDRIVER_QEMU)|g" \ -e "s|@DEFENABLEIOTHREADS@|$(DEFENABLEIOTHREADS)|g" \ -e "s|@DEFENABLEMEMPREALLOC@|$(DEFENABLEMEMPREALLOC)|g" \ -e "s|@DEFENABLEHUGEPAGES@|$(DEFENABLEHUGEPAGES)|g" \ @@ -416,7 +478,7 @@ $(GENERATED_FILES): %: %.in Makefile VERSION -e "s|@DEFENTROPYSOURCE@|$(DEFENTROPYSOURCE)|g" \ $< > $@ -generate-config: $(CONFIG) +generate-config: $(CONFIGS) check: check-go-static @@ -433,7 +495,7 @@ check-go-static: coverage: $(QUIET_TEST).ci/go-test.sh html-coverage -install: default runtime install-scripts install-completions install-config install-bin install-containerd-shim-v2 install-bin-libexec +install: default runtime install-scripts install-completions install-configs install-bin install-containerd-shim-v2 install-bin-libexec install-bin: $(BINLIST) $(QUIET_INST)$(foreach f,$(BINLIST),$(call INSTALL_EXEC,$f,$(BINDIR))) @@ -444,8 +506,9 @@ install-containerd-shim-v2: $(SHIMV2) install-bin-libexec: $(BINLIBEXECLIST) $(QUIET_INST)$(foreach f,$(BINLIBEXECLIST),$(call INSTALL_EXEC,$f,$(PKGLIBEXECDIR))) -install-config: $(CONFIG) - $(QUIET_INST)install --mode 0644 -D $(CONFIG) $(DESTDIR)/$(CONFIG_PATH) +install-configs: $(CONFIGS) + $(QUIET_INST)$(foreach f,$(CONFIGS),$(call INSTALL_CONFIG,$f,$(dir $(CONFIG_PATH)))) + $(QUIET_INST)ln -sf $(DEFAULT_HYPERVISOR_CONFIG_PATH) $(CONFIG_PATH) install-scripts: $(SCRIPTS) $(QUIET_INST)$(foreach f,$(SCRIPTS),$(call INSTALL_EXEC,$f,$(SCRIPTS_DIR))) @@ -454,7 +517,7 @@ install-completions: $(QUIET_INST)install --mode 0644 -D $(BASH_COMPLETIONS) $(DESTDIR)/$(BASH_COMPLETIONSDIR)/$(notdir $(BASH_COMPLETIONS)); clean: - $(QUIET_CLEAN)rm -f $(TARGET) $(SHIMV2) $(NETMON_TARGET) $(CONFIG) $(GENERATED_GO_FILES) $(GENERATED_FILES) $(COLLECT_SCRIPT) + $(QUIET_CLEAN)rm -f $(TARGET) $(SHIMV2) $(NETMON_TARGET) $(CONFIGS) $(GENERATED_GO_FILES) $(GENERATED_FILES) $(COLLECT_SCRIPT) show-usage: show-header @printf "• Overview:\n" @@ -514,12 +577,16 @@ else @printf "• GOPATH not set:\n" @printf "\tCan only install prebuilt binaries\n" endif + @printf "\n" + @printf "• hypervisors:\n" + @printf "\tKnown: $(sort $(HYPERVISORS))\n" + @printf "\tAvailable for this architecture: $(sort $(KNOWN_HYPERVISORS))\n" @printf "\n" @printf "• Summary:\n" @printf "\n" - @printf "\tdestination install path (DESTDIR) : %s\n" $(abspath $(DESTDIR)) - @printf "\tbinary installation path (BINDIR) : %s\n" $(abspath $(BINDIR)) - @printf "\tbinaries to install :\n" + @printf "\tdestination install path (DESTDIR) : %s\n" $(abspath $(DESTDIR)) + @printf "\tbinary installation path (BINDIR) : %s\n" $(abspath $(BINDIR)) + @printf "\tbinaries to install :\n" @printf \ "$(foreach b,$(sort $(BINLIST)),$(shell printf "\\t - $(shell readlink -m $(DESTDIR)/$(BINDIR)/$(b))\\\n"))" @printf \ @@ -528,10 +595,21 @@ endif "$(foreach b,$(sort $(BINLIBEXECLIST)),$(shell printf "\\t - $(shell readlink -m $(DESTDIR)/$(PKGLIBEXECDIR)/$(b))\\\n"))" @printf \ "$(foreach s,$(sort $(SCRIPTS)),$(shell printf "\\t - $(shell readlink -m $(DESTDIR)/$(BINDIR)/$(s))\\\n"))" - @printf "\tconfig to install (CONFIG) : %s\n" $(CONFIG) - @printf "\tinstall path (CONFIG_PATH) : %s\n" $(abspath $(CONFIG_PATH)) - @printf "\talternate config path (SYSCONFIG) : %s\n" $(abspath $(SYSCONFIG)) - @printf "\thypervisor path (QEMUPATH) : %s\n" $(abspath $(QEMUPATH)) - @printf "\tassets path (PKGDATADIR) : %s\n" $(abspath $(PKGDATADIR)) - @printf "\tproxy+shim path (PKGLIBEXECDIR) : %s\n" $(abspath $(PKGLIBEXECDIR)) + @printf "\tconfigs to install (CONFIGS) :\n" + @printf \ + "$(foreach c,$(sort $(CONFIGS)),$(shell printf "\\t - $(c)\\\n"))" + @printf "\tinstall paths (CONFIG_PATHS) :\n" + @printf \ + "$(foreach c,$(sort $(CONFIG_PATHS)),$(shell printf "\\t - $(c)\\\n"))" + @printf "\talternate config paths (SYSCONFIG_PATHS) : %s\n" + @printf \ + "$(foreach c,$(sort $(SYSCONFIG_PATHS)),$(shell printf "\\t - $(c)\\\n"))" + + @printf "\tdefault install path for $(DEFAULT_HYPERVISOR) (CONFIG_PATH) : %s\n" $(abspath $(CONFIG_PATH)) + @printf "\tdefault alternate config path (SYSCONFIG) : %s\n" $(abspath $(SYSCONFIG)) +ifneq (,$(findstring $(HYPERVISOR_QEMU),$(KNOWN_HYPERVISORS))) + @printf "\t$(HYPERVISOR_QEMU) hypervisor path (QEMUPATH) : %s\n" $(abspath $(QEMUPATH)) +endif + @printf "\tassets path (PKGDATADIR) : %s\n" $(abspath $(PKGDATADIR)) + @printf "\tproxy+shim path (PKGLIBEXECDIR) : %s\n" $(abspath $(PKGLIBEXECDIR)) @printf "\n" diff --git a/cli/config/configuration.toml.in b/cli/config/configuration-qemu.toml.in similarity index 98% rename from cli/config/configuration.toml.in rename to cli/config/configuration-qemu.toml.in index 5ecedad3d6..4be52f4a94 100644 --- a/cli/config/configuration.toml.in +++ b/cli/config/configuration-qemu.toml.in @@ -1,18 +1,18 @@ -# Copyright (c) 2017-2018 Intel Corporation +# Copyright (c) 2017-2019 Intel Corporation # # SPDX-License-Identifier: Apache-2.0 # # XXX: WARNING: this file is auto-generated. # XXX: -# XXX: Source file: "@CONFIG_IN@" +# XXX: Source file: "@CONFIG_QEMU_IN@" # XXX: Project: # XXX: Name: @PROJECT_NAME@ # XXX: Type: @PROJECT_TYPE@ [hypervisor.qemu] path = "@QEMUPATH@" -kernel = "@KERNELPATH@" +kernel = "@KERNELPATH_QEMU@" initrd = "@INITRDPATH@" image = "@IMAGEPATH@" machine_type = "@MACHINETYPE@" @@ -100,7 +100,7 @@ disable_block_device_use = @DEFDISABLEBLOCK@ # Block storage driver to be used for the hypervisor in case the container # rootfs is backed by a block device. This is virtio-scsi, virtio-blk # or nvdimm. -block_device_driver = "@DEFBLOCKSTORAGEDRIVER@" +block_device_driver = "@DEFBLOCKSTORAGEDRIVER_QEMU@" # Specifies cache-related options will be set to block devices or not. # Default false @@ -289,7 +289,7 @@ path = "@NETMONPATH@" # Uses tc filter rules to redirect traffic from the network interface # provided by plugin to a tap interface connected to the VM. # -internetworking_model="@DEFNETWORKMODEL@" +internetworking_model="@DEFNETWORKMODEL_QEMU@" # disable guest seccomp # Determines whether container seccomp profiles are passed to the virtual