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
相关推荐
内核程序员kevin3 小时前
TCP Listen 队列详解与优化指南
linux·网络·tcp/ip
朝九晚五ฺ7 小时前
【Linux探索学习】第十四弹——进程优先级:深入理解操作系统中的进程优先级
linux·运维·学习
自由的dream7 小时前
Linux的桌面
linux
xiaozhiwise8 小时前
Makefile 之 自动化变量
linux
意疏10 小时前
【Linux 篇】Docker 的容器之海与镜像之岛:于 Linux 系统内探索容器化的奇妙航行
linux·docker
BLEACH-heiqiyihu10 小时前
RedHat7—Linux中kickstart自动安装脚本制作
linux·运维·服务器
一只爱撸猫的程序猿10 小时前
一个简单的Linux 服务器性能优化案例
linux·mysql·nginx
我的K840911 小时前
Flink整合Hudi及使用
linux·服务器·flink
19004311 小时前
linux6:常见命令介绍
linux·运维·服务器