mirror of
				https://github.com/kata-containers/kata-containers.git
				synced 2025-10-31 09:26:52 +00:00 
			
		
		
		
	osbuilder: Set up libseccomp library
The osbuilder needs to set up libseccomp library to build the kata-agent because the kata-agent supports seccomp currently. The library is built from the sources to create a static library for musl libc. In addition, environment variables for the libseccomp crate are set to link the library statically. Fixes: #1476 Signed-off-by: Manabu Sugimoto <Manabu.Sugimoto@sony.com>
This commit is contained in:
		
							
								
								
									
										101
									
								
								ci/install_libseccomp.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										101
									
								
								ci/install_libseccomp.sh
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,101 @@ | |||||||
|  | #!/bin/bash | ||||||
|  | # | ||||||
|  | # Copyright 2021 Sony Group Corporation | ||||||
|  | # | ||||||
|  | # SPDX-License-Identifier: Apache-2.0 | ||||||
|  | # | ||||||
|  |  | ||||||
|  | set -o errexit | ||||||
|  |  | ||||||
|  | cidir=$(dirname "$0") | ||||||
|  | source "${cidir}/lib.sh" | ||||||
|  |  | ||||||
|  | clone_tests_repo | ||||||
|  |  | ||||||
|  | source "${tests_repo_dir}/.ci/lib.sh" | ||||||
|  |  | ||||||
|  | arch=$(uname -m) | ||||||
|  |  | ||||||
|  | # Variables for libseccomp | ||||||
|  | # Currently, specify the libseccomp version directly without using `versions.yaml` | ||||||
|  | # because the current Snap workflow is incomplete. | ||||||
|  | # After solving the issue, replace this code by using the `versions.yaml`. | ||||||
|  | # libseccomp_version=$(get_version "externals.libseccomp.version") | ||||||
|  | # libseccomp_url=$(get_version "externals.libseccomp.url") | ||||||
|  | libseccomp_version="2.5.1" | ||||||
|  | libseccomp_url="https://github.com/seccomp/libseccomp" | ||||||
|  | libseccomp_tarball="libseccomp-${libseccomp_version}.tar.gz" | ||||||
|  | libseccomp_tarball_url="${libseccomp_url}/releases/download/v${libseccomp_version}/${libseccomp_tarball}" | ||||||
|  | cflags="-O2" | ||||||
|  |  | ||||||
|  | # Variables for gperf | ||||||
|  | # Currently, specify the gperf version directly without using `versions.yaml` | ||||||
|  | # because the current Snap workflow is incomplete. | ||||||
|  | # After solving the issue, replace this code by using the `versions.yaml`. | ||||||
|  | # gperf_version=$(get_version "externals.gperf.version") | ||||||
|  | # gperf_url=$(get_version "externals.gperf.url") | ||||||
|  | gperf_version="3.1" | ||||||
|  | gperf_url="https://ftp.gnu.org/gnu/gperf" | ||||||
|  | gperf_tarball="gperf-${gperf_version}.tar.gz" | ||||||
|  | gperf_tarball_url="${gperf_url}/${gperf_tarball}" | ||||||
|  |  | ||||||
|  | # We need to build the libseccomp library from sources to create a static library for the musl libc. | ||||||
|  | # However, ppc64le and s390x have no musl targets in Rust. Hence, we do not set cflags for the musl libc. | ||||||
|  | if ([ "${arch}" != "ppc64le" ] && [ "${arch}" != "s390x" ]); then | ||||||
|  |     # Set FORTIFY_SOURCE=1 because the musl-libc does not have some functions about FORTIFY_SOURCE=2 | ||||||
|  |     cflags="-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 -O2" | ||||||
|  | fi | ||||||
|  |  | ||||||
|  | die() { | ||||||
|  |     msg="$*" | ||||||
|  |     echo "[Error] ${msg}" >&2 | ||||||
|  |     exit 1 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | finish() { | ||||||
|  |     rm -rf "${libseccomp_tarball}" "libseccomp-${libseccomp_version}" "${gperf_tarball}" "gperf-${gperf_version}" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | trap finish EXIT | ||||||
|  |  | ||||||
|  | build_and_install_gperf() { | ||||||
|  |     echo "Build and install gperf version ${gperf_version}" | ||||||
|  |     mkdir -p "${gperf_install_dir}" | ||||||
|  |     curl -sLO "${gperf_tarball_url}" | ||||||
|  |     tar -xf "${gperf_tarball}" | ||||||
|  |     pushd "gperf-${gperf_version}" | ||||||
|  |     ./configure --prefix="${gperf_install_dir}" | ||||||
|  |     make | ||||||
|  |     make install | ||||||
|  |     export PATH=$PATH:"${gperf_install_dir}"/bin | ||||||
|  |     popd | ||||||
|  |     echo "Gperf installed successfully" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | build_and_install_libseccomp() { | ||||||
|  |     echo "Build and install libseccomp version ${libseccomp_version}" | ||||||
|  |     mkdir -p "${libseccomp_install_dir}" | ||||||
|  |     curl -sLO "${libseccomp_tarball_url}" | ||||||
|  |     tar -xf "${libseccomp_tarball}" | ||||||
|  |     pushd "libseccomp-${libseccomp_version}" | ||||||
|  |     ./configure --prefix="${libseccomp_install_dir}" CFLAGS="${cflags}" --enable-static | ||||||
|  |     make | ||||||
|  |     make install | ||||||
|  |     popd | ||||||
|  |     echo "Libseccomp installed successfully" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | main() { | ||||||
|  |     local libseccomp_install_dir="${1:-}" | ||||||
|  |     local gperf_install_dir="${2:-}" | ||||||
|  |  | ||||||
|  |     if [ -z "${libseccomp_install_dir}" ] || [ -z "${gperf_install_dir}" ]; then | ||||||
|  |         die "Usage: ${0} <libseccomp-install-dir> <gperf-install-dir>" | ||||||
|  |     fi | ||||||
|  |  | ||||||
|  |     # gperf is required for building the libseccomp. | ||||||
|  |     build_and_install_gperf | ||||||
|  |     build_and_install_libseccomp | ||||||
|  | } | ||||||
|  |  | ||||||
|  | main "$@" | ||||||
| @@ -23,6 +23,9 @@ DOCKER_RUNTIME=${DOCKER_RUNTIME:-runc} | |||||||
| # this GOPATH is for installing yq from install_yq.sh | # this GOPATH is for installing yq from install_yq.sh | ||||||
| export GOPATH=${GOPATH:-${HOME}/go} | export GOPATH=${GOPATH:-${HOME}/go} | ||||||
| LIBC=${LIBC:-musl} | LIBC=${LIBC:-musl} | ||||||
|  | # The kata agent enables seccomp feature. | ||||||
|  | # However, it is not enforced by default: you need to enable that in the main configuration file. | ||||||
|  | SECCOMP=${SECCOMP:-"yes"} | ||||||
|  |  | ||||||
| lib_file="${script_dir}/../scripts/lib.sh" | lib_file="${script_dir}/../scripts/lib.sh" | ||||||
| source "$lib_file" | source "$lib_file" | ||||||
| @@ -128,6 +131,9 @@ KERNEL_MODULES_DIR  Path to a directory containing kernel modules to include in | |||||||
| ROOTFS_DIR          Path to the directory that is populated with the rootfs. | ROOTFS_DIR          Path to the directory that is populated with the rootfs. | ||||||
|                     Default value: <${script_name} path>/rootfs-<DISTRO-name> |                     Default value: <${script_name} path>/rootfs-<DISTRO-name> | ||||||
|  |  | ||||||
|  | SECCOMP             When set to "no", the kata-agent is built without seccomp capability. | ||||||
|  |                     Default value: "yes" | ||||||
|  |  | ||||||
| USE_DOCKER          If set, build the rootfs inside a container (requires | USE_DOCKER          If set, build the rootfs inside a container (requires | ||||||
|                     Docker). |                     Docker). | ||||||
|                     Default value: <not set> |                     Default value: <not set> | ||||||
| @@ -563,8 +569,16 @@ EOT | |||||||
| 		[ "$ARCH" == "aarch64" ] && OLD_PATH=$PATH && export PATH=$PATH:/usr/local/musl/bin | 		[ "$ARCH" == "aarch64" ] && OLD_PATH=$PATH && export PATH=$PATH:/usr/local/musl/bin | ||||||
|  |  | ||||||
| 		agent_dir="${script_dir}/../../../src/agent/" | 		agent_dir="${script_dir}/../../../src/agent/" | ||||||
| 		# For now, rust-agent doesn't support seccomp yet. |  | ||||||
| 		SECCOMP="no" | 		if [ "${SECCOMP}" == "yes" ]; then | ||||||
|  | 			info "Set up libseccomp" | ||||||
|  | 			libseccomp_install_dir=$(mktemp -d -t libseccomp.XXXXXXXXXX) | ||||||
|  | 			gperf_install_dir=$(mktemp -d -t gperf.XXXXXXXXXX) | ||||||
|  | 			bash ${script_dir}/../../../ci/install_libseccomp.sh "${libseccomp_install_dir}" "${gperf_install_dir}" | ||||||
|  | 			echo "Set environment variables for the libseccomp crate to link the libseccomp library statically" | ||||||
|  | 			export LIBSECCOMP_LINK_TYPE=static | ||||||
|  | 			export LIBSECCOMP_LIB_PATH="${libseccomp_install_dir}/lib" | ||||||
|  | 		fi | ||||||
|  |  | ||||||
| 		info "Build agent" | 		info "Build agent" | ||||||
| 		pushd "${agent_dir}" | 		pushd "${agent_dir}" | ||||||
| @@ -572,9 +586,12 @@ EOT | |||||||
| 			git checkout "${AGENT_VERSION}" && OK "git checkout successful" || die "checkout agent ${AGENT_VERSION} failed!" | 			git checkout "${AGENT_VERSION}" && OK "git checkout successful" || die "checkout agent ${AGENT_VERSION} failed!" | ||||||
| 		fi | 		fi | ||||||
| 		make clean | 		make clean | ||||||
| 		make LIBC=${LIBC} INIT=${AGENT_INIT} | 		make LIBC=${LIBC} INIT=${AGENT_INIT} SECCOMP=${SECCOMP} | ||||||
| 		make install DESTDIR="${ROOTFS_DIR}" LIBC=${LIBC} INIT=${AGENT_INIT} SECCOMP=${SECCOMP} | 		make install DESTDIR="${ROOTFS_DIR}" LIBC=${LIBC} INIT=${AGENT_INIT} | ||||||
| 		[ "$ARCH" == "aarch64" ] && export PATH=$OLD_PATH && rm -rf /usr/local/musl | 		[ "$ARCH" == "aarch64" ] && export PATH=$OLD_PATH && rm -rf /usr/local/musl | ||||||
|  | 		if [ "${SECCOMP}" == "yes" ]; then | ||||||
|  | 			rm -rf "${libseccomp_install_dir}" "${gperf_install_dir}" | ||||||
|  | 		fi | ||||||
| 		popd | 		popd | ||||||
| 	else | 	else | ||||||
| 		mkdir -p ${AGENT_DIR} | 		mkdir -p ${AGENT_DIR} | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user