From d248e4144c70cf45dc991de49ba139d48c5d0f2e Mon Sep 17 00:00:00 2001 From: Jimmy Xu Date: Fri, 20 Mar 2020 01:48:43 +0800 Subject: [PATCH 1/4] kernel: support build guest kernel for gpu Add option '-g' in build-kernel.sh to build a guest kernel that supports Intel/Nvidia GPU Fixes: #979 Signed-off-by: Jimmy Xu --- kernel/build-kernel.sh | 62 ++++++++++++++++-------- kernel/configs/fragments/gpu/intel.conf | 7 +++ kernel/configs/fragments/gpu/nvidia.conf | 14 ++++++ 3 files changed, 63 insertions(+), 20 deletions(-) create mode 100644 kernel/configs/fragments/gpu/intel.conf create mode 100644 kernel/configs/fragments/gpu/nvidia.conf diff --git a/kernel/build-kernel.sh b/kernel/build-kernel.sh index 86000fb0ef..9f46758e3f 100755 --- a/kernel/build-kernel.sh +++ b/kernel/build-kernel.sh @@ -39,10 +39,16 @@ readonly default_kernel_config_dir="${GOPATH}/src/${kernel_config_repo}/kernel/c # Default path to search for kernel config fragments readonly default_config_frags_dir="${GOPATH}/src/${kernel_config_repo}/kernel/configs/fragments" readonly default_config_whitelist="${GOPATH}/src/${kernel_config_repo}/kernel/configs/fragments/whitelist.conf" +# GPU vendor +readonly GV_INTEL="intel" +readonly GV_NVIDIA="nvidia" + #Path to kernel directory kernel_path="" #Experimental kernel support. Pull from virtio-fs GitLab instead of kernel.org experimental_kernel="false" +#GPU kernel support +gpu_vendor="" # patches_path="" # @@ -80,13 +86,14 @@ Commands: Options: - -c : Path to config file to build a the kernel. - -e : Enable experimental kernel. - -h : Display this help. - -k : Path to kernel to build. - -p : Path to a directory with patches to apply to kernel. - -t : Hypervisor_target. - -v : Kernel version to use if kernel path not provided. + -c : Path to config file to build a the kernel. + -e : Enable experimental kernel. + -g : GPU vendor, intel or nvidia. + -h : Display this help. + -k : Path to kernel to build. + -p : Path to a directory with patches to apply to kernel. + -t : Hypervisor_target. + -v : Kernel version to use if kernel path not provided. EOT exit "$exit_code" } @@ -167,6 +174,8 @@ get_major_kernel_version() { get_kernel_frag_path() { local arch_path="$1" local common_path="${arch_path}/../common" + local gpu_path="${arch_path}/../gpu" + local kernel_path="$2" local cmdpath="${kernel_path}/scripts/kconfig/merge_config.sh" local config_path="${arch_path}/.config" @@ -190,6 +199,12 @@ get_kernel_frag_path() { all_configs="${all_configs} ${experimental_configs}" fi + if [[ "${gpu_vendor}" != "" ]];then + info "Add kernel config for GPU due to '-g ${gpu_vendor}'" + local gpu_configs="$(ls ${gpu_path}/${gpu_vendor}.conf)" + all_configs="${all_configs} ${gpu_configs}" + fi + info "Constructing config from fragments: ${config_path}" @@ -365,8 +380,17 @@ install_kata() { config_version=$(get_config_version) [ -n "${config_version}" ] || die "failed to get config version" install_path=$(readlink -m "${DESTDIR}/${PREFIX}/share/${project_name}") - vmlinuz="vmlinuz-${kernel_version}-${config_version}" - vmlinux="vmlinux-${kernel_version}-${config_version}" + + suffix="" + if [[ ${experimental_kernel} == "true" ]]; then + suffix="-virtiofs" + fi + if [[ ${gpu_vendor} != "" ]];then + suffix="-${gpu_vendor}-gpu${suffix}" + fi + + vmlinuz="vmlinuz-${kernel_version}-${config_version}${suffix}" + vmlinux="vmlinux-${kernel_version}-${config_version}${suffix}" if [ -e "arch/${arch_target}/boot/bzImage" ]; then bzImage="arch/${arch_target}/boot/bzImage" @@ -392,21 +416,15 @@ install_kata() { install --mode 0644 -D ./.config "${install_path}/config-${kernel_version}" - if [[ ${experimental_kernel} == "true" ]]; then - sufix="-virtiofs.container" - else - sufix=".container" - fi - - ln -sf "${vmlinuz}" "${install_path}/vmlinuz${sufix}" - ln -sf "${vmlinux}" "${install_path}/vmlinux${sufix}" - ls -la "${install_path}/vmlinux${sufix}" - ls -la "${install_path}/vmlinuz${sufix}" + ln -sf "${vmlinuz}" "${install_path}/vmlinuz${suffix}.container" + ln -sf "${vmlinux}" "${install_path}/vmlinux${suffix}.container" + ls -la "${install_path}/vmlinux${suffix}.container" + ls -la "${install_path}/vmlinuz${suffix}.container" popd >>/dev/null } main() { - while getopts "a:c:hk:p:t:v:e" opt; do + while getopts "a:c:eg:hk:p:t:v:" opt; do case "$opt" in a) arch_target="${OPTARG}" @@ -417,6 +435,10 @@ main() { e) experimental_kernel="true" ;; + g) + gpu_vendor="${OPTARG}" + [[ "${gpu_vendor}" == "${GV_INTEL}" || "${gpu_vendor}" == "${GV_NVIDIA}" ]] || die "GPU vendor only support intel and nvidia" + ;; h) usage 0 ;; diff --git a/kernel/configs/fragments/gpu/intel.conf b/kernel/configs/fragments/gpu/intel.conf new file mode 100644 index 0000000000..d5054767a4 --- /dev/null +++ b/kernel/configs/fragments/gpu/intel.conf @@ -0,0 +1,7 @@ +# The following i915 kernel config options need to be enabled +CONFIG_DRM=y +CONFIG_DRM_I915=y +CONFIG_DRM_I915_USERPTR=y + +# Linux kernel version suffix +CONFIG_LOCALVERSION="-intel-gpu" diff --git a/kernel/configs/fragments/gpu/nvidia.conf b/kernel/configs/fragments/gpu/nvidia.conf new file mode 100644 index 0000000000..883c0f3af9 --- /dev/null +++ b/kernel/configs/fragments/gpu/nvidia.conf @@ -0,0 +1,14 @@ +# Support mmconfig PCI config space access. +# It's used to enable the MMIO access method for PCIe devices. +CONFIG_PCI_MMCONFIG=y + +# Support for loading modules. +# It is used to support loading GPU drivers. +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y + +# CRYPTO_FIPS requires this config when loading modules is enabled. +CONFIG_MODULE_SIG=y + +# Linux kernel version suffix +CONFIG_LOCALVERSION="-nvidia-gpu" From 7a17b505361b797f5c1764ab5be4cc8239932231 Mon Sep 17 00:00:00 2001 From: Jimmy Xu Date: Fri, 20 Mar 2020 02:00:44 +0800 Subject: [PATCH 2/4] kernel: support bash debug Add option '-d' in build-kernel.sh to enable bash debug. Signed-off-by: Jimmy Xu --- kernel/build-kernel.sh | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/kernel/build-kernel.sh b/kernel/build-kernel.sh index 9f46758e3f..d470e40124 100755 --- a/kernel/build-kernel.sh +++ b/kernel/build-kernel.sh @@ -87,6 +87,7 @@ Commands: Options: -c : Path to config file to build a the kernel. + -d : Enable bash debug. -e : Enable experimental kernel. -g : GPU vendor, intel or nvidia. -h : Display this help. @@ -424,7 +425,7 @@ install_kata() { } main() { - while getopts "a:c:eg:hk:p:t:v:" opt; do + while getopts "a:c:deg:hk:p:t:v:" opt; do case "$opt" in a) arch_target="${OPTARG}" @@ -432,6 +433,10 @@ main() { c) kernel_config_path="${OPTARG}" ;; + d) + PS4=' Line ${LINENO}: ' + set -x + ;; e) experimental_kernel="true" ;; From 13895000711c40809e66c070bfe1e5ff8008b808 Mon Sep 17 00:00:00 2001 From: Jimmy Xu Date: Fri, 20 Mar 2020 02:10:18 +0800 Subject: [PATCH 3/4] kernel: support force setup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add option '-f' in build-kernel.sh to force the generation of .config Signed-off-by: Jimmy Xu n 请为您的变更输入提交说明。以 '#' 开始的行将被忽略,而一个空的提交 --- kernel/build-kernel.sh | 42 ++++++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/kernel/build-kernel.sh b/kernel/build-kernel.sh index d470e40124..16d5316827 100755 --- a/kernel/build-kernel.sh +++ b/kernel/build-kernel.sh @@ -47,6 +47,8 @@ readonly GV_NVIDIA="nvidia" kernel_path="" #Experimental kernel support. Pull from virtio-fs GitLab instead of kernel.org experimental_kernel="false" +#Force generate config when setup +force_setup_generate_config="false" #GPU kernel support gpu_vendor="" # @@ -89,6 +91,7 @@ Options: -c : Path to config file to build a the kernel. -d : Enable bash debug. -e : Enable experimental kernel. + -f : Enable force generate config when setup. -g : GPU vendor, intel or nvidia. -h : Display this help. -k : Path to kernel to build. @@ -314,23 +317,27 @@ setup_kernel() { if [ -d "$kernel_path" ]; then info "${kernel_path} already exist" - return + if [[ "${force_setup_generate_config}" != "true" ]];then + return + else + info "Force generate config due to '-f'" + fi + else + info "kernel path does not exist, will download kernel" + download_kernel="true" + [ -n "$kernel_version" ] || die "failed to get kernel version: Kernel version is emtpy" + + if [[ ${download_kernel} == "true" ]]; then + get_kernel "${kernel_version}" "${kernel_path}" + fi + + [ -n "$kernel_path" ] || die "failed to find kernel source path" + + get_config_and_patches + + [ -d "${patches_path}" ] || die " patches path '${patches_path}' does not exist" fi - info "kernel path does not exist, will download kernel" - download_kernel="true" - [ -n "$kernel_version" ] || die "failed to get kernel version: Kernel version is emtpy" - - if [[ ${download_kernel} == "true" ]]; then - get_kernel "${kernel_version}" "${kernel_path}" - fi - - [ -n "$kernel_path" ] || die "failed to find kernel source path" - - get_config_and_patches - - [ -d "${patches_path}" ] || die " patches path '${patches_path}' does not exist" - local major_kernel major_kernel=$(get_major_kernel_version "${kernel_version}") local patches_dir_for_version="${patches_path}/${major_kernel}.x" @@ -425,7 +432,7 @@ install_kata() { } main() { - while getopts "a:c:deg:hk:p:t:v:" opt; do + while getopts "a:c:defg:hk:p:t:v:" opt; do case "$opt" in a) arch_target="${OPTARG}" @@ -440,6 +447,9 @@ main() { e) experimental_kernel="true" ;; + f) + force_setup_generate_config="true" + ;; g) gpu_vendor="${OPTARG}" [[ "${gpu_vendor}" == "${GV_INTEL}" || "${gpu_vendor}" == "${GV_NVIDIA}" ]] || die "GPU vendor only support intel and nvidia" From 12d351d6fb14fbdc3cf7b7aa761745b69382bd47 Mon Sep 17 00:00:00 2001 From: Jimmy Xu Date: Fri, 20 Mar 2020 02:47:21 +0800 Subject: [PATCH 4/4] kernel: add usage in readme Add usage of build-kernel.sh to the readme Signed-off-by: Jimmy Xu --- kernel/README.md | 49 ++++++++++++++++++++++++++++++++++++++ kernel/kata_config_version | 2 +- 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/kernel/README.md b/kernel/README.md index f3e8a7f716..cf55801555 100644 --- a/kernel/README.md +++ b/kernel/README.md @@ -1,6 +1,7 @@ # Build Kata Containers Kernel * [Requirements](#requirements) +* [Usage](#usage) * [Setup kernel source code](#setup-kernel-source-code) * [Build the kernel](#build-the-kernel) * [Install the Kernel in the default path for Kata](#install-the-kernel-in-the-default-path-for-kata) @@ -17,6 +18,54 @@ automates the process to build a kernel for Kata Containers. The `build-kernel.sh` script requires an installed Golang version matching the [component build requirements](https://github.com/kata-containers/documentation/blob/master/Developer-Guide.md#requirements-to-build-individual-components). +## Usage + +``` +$ ./build-kernel.sh -h +Overview: + + Build a kernel for Kata Containers + +Description: This script is the *ONLY* to build a kernel for development. + + +Usage: + + build-kernel.sh [options] + +Commands: + +- setup + +- build + +- install + +Options: + + -c : Path to config file to build a the kernel. + -d : Enable bash debug. + -e : Enable experimental kernel. + -f : Enable force generate config when setup. + -g : GPU vendor, intel or nvidia. + -h : Display this help. + -k : Path to kernel to build. + -p : Path to a directory with patches to apply to kernel. + -t : Hypervisor_target. + -v : Kernel version to use if kernel path not provided. +``` + +Example: +``` +$ ./build-kernel.sh -v 4.19.86 -g nvidia -f -d setup +``` +> **Note** +> - `-v 4.19.86`: Specify the guest kernel version. +> - `-g nvidia`: To build a guest kernel supporting Nvidia GPU. +> - `-f`: The .config file is forced to be generated even if the kernel directory already exists. +> - `-d`: Enable bash debug mode. + + ## Setup kernel source code ```bash diff --git a/kernel/kata_config_version b/kernel/kata_config_version index b5489e5e51..2bbd69c2e5 100644 --- a/kernel/kata_config_version +++ b/kernel/kata_config_version @@ -1 +1 @@ -69 +70