GNU/Linux - 如何编译kernel

使用 make 命令构建 Linux 内核涉及多个步骤。下面是整个过程的基本概述:

  1. 获取内核源代码

* 从 kernel.org 或你的发行版软件仓库下载内核源代码。

* 将源代码解压缩到一个目录中。

  1. 配置内核

* 切换到内核源代码目录。

* 可选择清理源代码树:make clean。

* 使用以下方法之一配置内核:

* 使用默认配置:make defconfig 或 make oldconfig。

* 自定义配置:make menuconfig(基于文本)、make xconfig(基于 Qt)或 make gconfig(基于 GTK)。

  1. 构建内核

* 运行 make 来构建内核。可选择使用 -j 标志指定并行编译的线程数,后跟线程数(例如,make -j4 表示 4 个线程。)

* 此步骤可能需要一些时间,具体取决于硬件和所选配置选项。

确保在开始编译前安装了必要的开发工具和依赖项(gcc、make、用于 menuconfig/xconfig/gconfig 的 libncurses-dev 等)。


Building the Linux kernel using the make command involves several steps. Here's a basic overview of the process:

  1. Get the Kernel Source:

    • Download the kernel source code from kernel.org or your distribution's repositories.

    • Extract the source code to a directory.

  2. Configure the Kernel:

    • Change to the kernel source directory.

    • Optionally, clean the source tree: make clean.

    • Configure the kernel using one of the following methods:

      • Use the default configuration: make defconfig or make oldconfig.

      • Customize the configuration: make menuconfig (text-based), make xconfig (Qt-based), or make gconfig (GTK-based).

  3. Build the Kernel:

    • Run make to build the kernel. Optionally, you can specify the number of threads for parallel compilation using -j flag followed by the number of threads (e.g., make -j4 for 4 threads. j means job).

    • This step might take some time depending on your hardware and the configuration options chosen.

Ensure you have the necessary development tools and dependencies installed (gcc, make, libncurses-dev for menuconfig/xconfig/gconfig, etc.) before starting the build process.


补充说明:

1,执行make defconfig,会将当前默认的配置写入.config文件,如果没有就创建。

2,make menuconfig,退出时提示是否保存,会保存到.config文件,如果没有就创建。

3,make时使用的就是.config配置文件,如果此文件发生变化,旧内容保存到.config.old,新内容保存到.config

4, make oldconfig会载入.config.old的内容到.config文件。


在Kernel源码根目录下运行make help:

$ make help

Cleaning targets:

  clean           - Remove most generated files but keep the config and

                    enough build support to build external modules

  mrproper        - Remove all generated files + config + various backup files

  distclean       - mrproper + remove editor backup and patch files



Configuration targets:

  config          - Update current config utilising a line-oriented program

  nconfig         - Update current config utilising a ncurses menu based program

  menuconfig      - Update current config utilising a menu based program

  xconfig         - Update current config utilising a Qt based front-end

  gconfig         - Update current config utilising a GTK+ based front-end

  oldconfig       - Update current config utilising a provided .config as base

  localmodconfig  - Update current config disabling modules not loaded

                    except those preserved by LMC_KEEP environment variable

  localyesconfig  - Update current config converting local mods to core

                    except those preserved by LMC_KEEP environment variable

  defconfig       - New config with default from ARCH supplied defconfig

  savedefconfig   - Save current config as ./defconfig (minimal config)

  allnoconfig     - New config where all options are answered with no

  allyesconfig    - New config where all options are accepted with yes

  allmodconfig    - New config selecting modules when possible

  alldefconfig    - New config with all symbols set to default

  randconfig      - New config with random answer to all options

  yes2modconfig   - Change answers from yes to mod if possible

  mod2yesconfig   - Change answers from mod to yes if possible

  mod2noconfig    - Change answers from mod to no if possible

  listnewconfig   - List new options

  helpnewconfig   - List new options and help text

  olddefconfig    - Same as oldconfig but sets new symbols to their

                    default value without prompting

  tinyconfig      - Configure the tiniest possible kernel

  testconfig      - Run Kconfig unit tests (requires python3 and pytest)



Other generic targets:

  all             - Build all targets marked with [*]

* vmlinux         - Build the bare kernel

* modules         - Build all modules

  modules_install - Install all modules to INSTALL_MOD_PATH (default: /)

  dir/            - Build all files in dir and below

  dir/file.[ois]  - Build specified target only

  dir/file.ll     - Build the LLVM assembly file

                    (requires compiler support for LLVM assembly generation)

  dir/file.lst    - Build specified mixed source/assembly target only

                    (requires a recent binutils and recent build (System.map))

  dir/file.ko     - Build module including final link

  modules_prepare - Set up for building external modules

  tags/TAGS       - Generate tags file for editors

  cscope          - Generate cscope index

  gtags           - Generate GNU GLOBAL index

  kernelrelease   - Output the release version string (use with make -s)

  kernelversion   - Output the version stored in Makefile (use with make -s)

  image_name      - Output the image name (use with make -s)

  headers_install - Install sanitised kernel headers to INSTALL_HDR_PATH

                    (default: ./usr)



Static analysers:

  checkstack      - Generate a list of stack hogs

  versioncheck    - Sanity check on version.h usage

  includecheck    - Check for duplicate included header files

  export_report   - List the usages of all exported symbols

  headerdep       - Detect inclusion cycles in headers

  coccicheck      - Check with Coccinelle

  clang-analyzer  - Check with clang static analyzer

  clang-tidy      - Check with clang-tidy



Tools:

  nsdeps          - Generate missing symbol namespace dependencies



Kernel selftest:

  kselftest         - Build and run kernel selftest

                      Build, install, and boot kernel before

                      running kselftest on it

                      Run as root for full coverage

  kselftest-all     - Build kernel selftest

  kselftest-install - Build and install kernel selftest

  kselftest-clean   - Remove all generated kselftest files

  kselftest-merge   - Merge all the config dependencies of

                      kselftest to existing .config.



Rust targets:

  rustavailable   - Checks whether the Rust toolchain is

                    available and, if not, explains why.

  rustfmt         - Reformat all the Rust code in the kernel

  rustfmtcheck    - Checks if all the Rust code in the kernel

                    is formatted, printing a diff otherwise.

  rustdoc         - Generate Rust documentation

                    (requires kernel .config)

  rusttest        - Runs the Rust tests

                    (requires kernel .config; downloads external repos)

  rust-analyzer   - Generate rust-project.json rust-analyzer support file

                    (requires kernel .config)

  dir/file.[os]   - Build specified target only

  dir/file.rsi    - Build macro expanded source, similar to C preprocessing.

                    Run with RUSTFMT=n to skip reformatting if needed.

                    The output is not intended to be compilable.

  dir/file.ll     - Build the LLVM assembly file



Userspace tools targets:

  use "make tools/help"

  or  "cd tools; make help"



Kernel packaging:

  rpm-pkg             - Build both source and binary RPM kernel packages

  binrpm-pkg          - Build only the binary kernel RPM package

  deb-pkg             - Build both source and binary deb kernel packages

  bindeb-pkg          - Build only the binary kernel deb package

  snap-pkg            - Build only the binary kernel snap package

                        (will connect to external hosts)

  dir-pkg             - Build the kernel as a plain directory structure

  tar-pkg             - Build the kernel as an uncompressed tarball

  targz-pkg           - Build the kernel as a gzip compressed tarball

  tarbz2-pkg          - Build the kernel as a bzip2 compressed tarball

  tarxz-pkg           - Build the kernel as a xz compressed tarball

  tarzst-pkg          - Build the kernel as a zstd compressed tarball

  perf-tar-src-pkg    - Build perf-6.1.55.tar source tarball

  perf-targz-src-pkg  - Build perf-6.1.55.tar.gz source tarball

  perf-tarbz2-src-pkg - Build perf-6.1.55.tar.bz2 source tarball

  perf-tarxz-src-pkg  - Build perf-6.1.55.tar.xz source tarball

  perf-tarzst-src-pkg - Build perf-6.1.55.tar.zst source tarball



Documentation targets:

Linux kernel internal documentation in different formats from ReST:

  htmldocs        - HTML

  latexdocs       - LaTeX

  pdfdocs         - PDF

  epubdocs        - EPUB

  xmldocs         - XML

  linkcheckdocs   - check for broken external links

                    (will connect to external hosts)

  refcheckdocs    - check for references to non-existing files under

                    Documentation

  cleandocs       - clean all generated files



  make SPHINXDIRS="s1 s2" [target] Generate only docs of folder s1, s2

  valid values for SPHINXDIRS are: PCI RCU accounting admin-guide arc arm arm64 block bpf cdrom core-api cpu-freq crypto dev-tools devicetree doc-guide driver-api fault-injection fb filesystems firmware-guide fpga gpu hid hwmon i2c ia64 iio infiniband input isdn kbuild kernel-hacking leds livepatch locking loongarch m68k maintainer mhi mips misc-devices mm netlabel networking nios2 openrisc parisc pcmcia peci power powerpc process riscv rust s390 scheduler scsi security sh sound sparc spi staging target timers tools trace translations usb userspace-api virt w1 watchdog x86 xtensa



  make SPHINX_CONF={conf-file} [target] use *additional* sphinx-build

  configuration. This is e.g. useful to build with nit-picking config.



  make DOCS_THEME={sphinx-theme} selects a different Sphinx theme.



  make DOCS_CSS={a .css file} adds a DOCS_CSS override file for html/epub output.



  Default location for the generated documents is Documentation/output



Architecture specific targets (x86):

* bzImage               - Compressed kernel image (arch/x86/boot/bzImage)

  install               - Install kernel using (your) ~/bin/installkernel or

                          (distribution) /sbin/installkernel or install to

                          $(INSTALL_PATH) and run lilo



  fdimage               - Create 1.4MB boot floppy image (arch/x86/boot/fdimage)

  fdimage144            - Create 1.4MB boot floppy image (arch/x86/boot/fdimage)

  fdimage288            - Create 2.8MB boot floppy image (arch/x86/boot/fdimage)

  hdimage               - Create a BIOS/EFI hard disk image (arch/x86/boot/hdimage)

  isoimage              - Create a boot CD-ROM image (arch/x86/boot/image.iso)

                          bzdisk/fdimage*/hdimage/isoimage also accept:

                          FDARGS="..."  arguments for the booted kernel

                          FDINITRD=file initrd for the booted kernel



  kvm_guest.config      - Enable Kconfig items for running this kernel as a KVM guest

  xen.config            - Enable Kconfig items for running this kernel as a Xen guest

  x86_debug.config      - Enable tip tree debugging options for testing



  i386_defconfig              - Build for i386

  x86_64_defconfig            - Build for x86_64



  make V=0|1 [targets] 0 => quiet build (default), 1 => verbose build

  make V=2   [targets] 2 => give reason for rebuild of target

  make O=dir [targets] Locate all output files in "dir", including .config

  make C=1   [targets] Check re-compiled c source with $CHECK

                       (sparse by default)

  make C=2   [targets] Force check of all c source with $CHECK

  make RECORDMCOUNT_WARN=1 [targets] Warn about ignored mcount sections

  make W=n   [targets] Enable extra build checks, n=1,2,3 where

                1: warnings which may be relevant and do not occur too often

                2: warnings which occur quite often but may still be relevant

                3: more obscure warnings, can most likely be ignored

                e: warnings are being treated as errors

                Multiple levels can be combined with W=12 or W=123



Execute "make" or "make all" to build all targets marked with [*]

For further info see the ./README file
相关推荐
魏 无羡1 分钟前
linux CentOS系统上卸载docker
linux·kubernetes·centos
CircleMouse5 分钟前
Centos7, 使用yum工具,出现 Could not resolve host: mirrorlist.centos.org
linux·运维·服务器·centos
木子Linux1 小时前
【Linux打怪升级记 | 问题01】安装Linux系统忘记设置时区怎么办?3个方法教你回到东八区
linux·运维·服务器·centos·云计算
mit6.8241 小时前
Ubuntu 系统下性能剖析工具: perf
linux·运维·ubuntu
鹏大师运维1 小时前
聊聊开源的虚拟化平台--PVE
linux·开源·虚拟化·虚拟机·pve·存储·nfs
watermelonoops1 小时前
Windows安装Ubuntu,Deepin三系统启动问题(XXX has invalid signature 您需要先加载内核)
linux·运维·ubuntu·deepin
滴水之功2 小时前
VMware OpenWrt怎么桥接模式联网
linux·openwrt
ldinvicible2 小时前
How to run Flutter on an Embedded Device
linux
YRr YRr3 小时前
解决Ubuntu 20.04上编译OpenCV 3.2时遇到的stdlib.h缺失错误
linux·opencv·ubuntu
认真学习的小雅兰.3 小时前
如何在Ubuntu上利用Docker和Cpolar实现Excalidraw公网访问高效绘图——“cpolar内网穿透”
linux·ubuntu·docker