<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>编译 on Tuan's Blog</title><link>https://blog.cloudorz.com/tags/%E7%BC%96%E8%AF%91/</link><description>Recent content in 编译 on Tuan's Blog</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><copyright>mt</copyright><lastBuildDate>Sun, 01 Nov 2026 10:00:00 +0800</lastBuildDate><atom:link href="https://blog.cloudorz.com/tags/%E7%BC%96%E8%AF%91/index.xml" rel="self" type="application/rss+xml"/><item><title>编译安装 GCC 13.2</title><link>https://blog.cloudorz.com/p/compile-and-install-gcc-13/</link><pubDate>Fri, 29 Mar 2024 18:45:24 +0800</pubDate><guid>https://blog.cloudorz.com/p/compile-and-install-gcc-13/</guid><description>&lt;img src="https://blog.cloudorz.com/p/compile-and-install-gcc-13/cover.svg" alt="Featured image of post 编译安装 GCC 13.2" /&gt;&lt;h2 id="前言"&gt;前言&#10;&lt;/h2&gt;&lt;p&gt;前段时间一直利用课余时间在协助一家公司做一些产品的测试工作。由于项目的特殊性，需要用到一些最新的特性，而现有 &lt;code&gt;apt&lt;/code&gt; 源中的 GCC 版本过低；即便添加 &lt;code&gt;apt&lt;/code&gt; PPA 源可以解决一部分问题，还要折腾网络环境（众所周知的一些问题）。所以我决定自己编译安装一个最新的 GCC 版本，方便以后直接复用。&lt;/p&gt;&#10;&lt;h2 id="概述"&gt;概述&#10;&lt;/h2&gt;&lt;p&gt;本文介绍如何在 Debian/Ubuntu 系统上编译安装 GCC 13.2.0，整体流程如下：&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="编译安装 GCC 的整体流程" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.cloudorz.com/p/compile-and-install-gcc-13/build-flow.svg"&gt;&lt;/p&gt;&#10;&lt;h3 id="什么是-gcc"&gt;什么是 GCC？&#10;&lt;/h3&gt;&lt;p&gt;GCC 是 GNU Compiler Collection 的缩写，是由 GNU 开发的编译器集合，支持 C、C++、Objective-C、Fortran、Go 等多种编程语言。&lt;/p&gt;&#10;&lt;p&gt;说白了，GCC 就是一个编译器，它可以把源代码编译成可执行文件，然后直接在目标系统上运行。&lt;/p&gt;&#10;&lt;h2 id="准备工作"&gt;准备工作&#10;&lt;/h2&gt;&lt;h3 id="环境需求"&gt;环境需求&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;Debian 12 或 Ubuntu 22.04 LTS 系统（强烈推荐这两个版本），或者其他基于 Debian 的系统，甚至 Alpine（也许？）。&lt;/li&gt;&#10;&lt;li&gt;一个可以访问外网的网络环境。如果你不理解我在说什么，可以用任意方法，只要能顺利且快速地用 Git 获取 GCC 源码即可，这里推荐 &lt;a class="link" href="https://mirrors.tuna.tsinghua.edu.cn/help/gcc.git/" target="_blank" rel="noopener"&#10; &gt;清华大学 TUNA 镜像站&lt;/a&gt;。&lt;/li&gt;&#10;&lt;li&gt;已有 gcc/g++（编译 GCC 本身需要一个现成的 C/C++ 编译器），没有的话先安装：&lt;code&gt;sudo apt install build-essential&lt;/code&gt;。&lt;/li&gt;&#10;&lt;li&gt;预留足够的磁盘空间（源码加编译产物大约需要 10 GB 以上）和时间。&lt;/li&gt;&#10;&lt;li&gt;&lt;del&gt;智慧或灵活的&lt;/del&gt;脑子。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="安装编译依赖"&gt;安装编译依赖&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install -y build-essential flex bison&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install -y libgmp-dev libmpfr-dev libmpc-dev&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install -y libisl-dev&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install -y libssl-dev&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;原文这里还装了 &lt;code&gt;libcloog-isl-dev&lt;/code&gt;，这个包在较新的 Debian/Ubuntu 中已经不存在了，GCC 5 之后也不再需要 CLooG，直接去掉即可。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="下载克隆-gcc-源码"&gt;下载/克隆 GCC 源码&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone -b releases/gcc-13.2.0 --depth&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; https://gcc.gnu.org/git/gcc.git gcc-src&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;对于中国大陆用户，可以使用 &lt;a class="link" href="https://mirrors.tuna.tsinghua.edu.cn/help/gcc.git/" target="_blank" rel="noopener"&#10; &gt;清华大学开源软件镜像站&lt;/a&gt; 下载 GCC 源码：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone -b releases/gcc-13.2.0 --depth&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; https://mirrors.tuna.tsinghua.edu.cn/git/gcc.git gcc-src&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h2 id="编译安装"&gt;编译安装&#10;&lt;/h2&gt;&lt;h3 id="下载依赖"&gt;下载依赖&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; gcc-src&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./contrib/download_prerequisites&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;这个脚本会下载 GMP、MPFR、MPC、ISL 的源码，并在 &lt;code&gt;gcc-src&lt;/code&gt; 下建好软链接，之后会和 GCC 一起编译。&lt;/p&gt;&#10;&lt;p&gt;如果你在中国大陆，执行 &lt;code&gt;./contrib/download_prerequisites&lt;/code&gt; 时可能会遇到下载不了的问题。这时可以手动下载对应的压缩包放到 &lt;code&gt;gcc-src&lt;/code&gt; 目录下，再执行一次这个脚本，它会自动检测并跳过已下载的文件。或者像我一样，用 &lt;code&gt;proxychains&lt;/code&gt; 这个工具代理下载（强烈推荐）。&lt;/p&gt;&#10;&lt;p&gt;像我这样就是下载成功的：&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="下载依赖完毕" class="gallery-image" data-flex-basis="1613px" data-flex-grow="672" height="280" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.cloudorz.com/p/compile-and-install-gcc-13/success-download-prerequisites.png" srcset="https://blog.cloudorz.com/p/compile-and-install-gcc-13/success-download-prerequisites_hu_9a87df105d791803.png 800w, https://blog.cloudorz.com/p/compile-and-install-gcc-13/success-download-prerequisites_hu_a08c5f790957ea2d.png 1600w, https://blog.cloudorz.com/p/compile-and-install-gcc-13/success-download-prerequisites.png 1882w" width="1882"&gt;&lt;/p&gt;&#10;&lt;h3 id="配置"&gt;配置&#10;&lt;/h3&gt;&lt;p&gt;GCC 官方文档强烈建议在源码目录&lt;strong&gt;之外&lt;/strong&gt;单独建一个构建目录，不要直接在源码目录里 &lt;code&gt;./configure&lt;/code&gt;，否则可能遇到各种奇怪的问题：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir ../gcc-build &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; ../gcc-build&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;../gcc-src/configure --prefix&lt;span class="o"&gt;=&lt;/span&gt;/usr/local/gcc-13.2.0 --enable-languages&lt;span class="o"&gt;=&lt;/span&gt;c,c++ --disable-multilib&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;--prefix&lt;/code&gt;：安装到独立目录，不会覆盖系统自带的 GCC，想卸载直接删掉这个目录即可；&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;--enable-languages=c,c++&lt;/code&gt;：只编译 C 和 C++，能省下不少时间；&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;--disable-multilib&lt;/code&gt;：不编译 32 位支持库，省得再去装 32 位的依赖。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="编译"&gt;编译&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make -j&lt;span class="k"&gt;$(&lt;/span&gt;nproc&lt;span class="k"&gt;)&lt;/span&gt; 2&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; tee build.log&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;&lt;code&gt;2&amp;gt;&amp;amp;1&lt;/code&gt; 把错误输出也一起记进 &lt;code&gt;build.log&lt;/code&gt;，出错时方便翻日志。完整编译耗时较长（视机器性能从几十分钟到几个小时不等），耐心等待即可。&lt;/p&gt;&#10;&lt;h3 id="安装"&gt;安装&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo make install&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h3 id="验证"&gt;验证&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/usr/local/gcc-13.2.0/bin/gcc --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h3 id="可选打包成-deb"&gt;（可选）打包成 deb&#10;&lt;/h3&gt;&lt;p&gt;如果想把编好的 GCC 复制到其他机器上，或者想让 &lt;code&gt;apt&lt;/code&gt;/&lt;code&gt;dpkg&lt;/code&gt; 来管理卸载，可以先安装到一个临时目录，再用 &lt;code&gt;dpkg-deb&lt;/code&gt; 打包。在 &lt;code&gt;gcc-build&lt;/code&gt; 目录中执行：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt;10&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make install &lt;span class="nv"&gt;DESTDIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;/gcc-pkg&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p &lt;span class="nv"&gt;$HOME&lt;/span&gt;/gcc-pkg/DEBIAN&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &amp;gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;/gcc-pkg/DEBIAN/control &lt;span class="s"&gt;&amp;lt;&amp;lt;&amp;#39;EOF&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Package: gcc-13.2.0-local&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Version: 13.2.0-1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Architecture: amd64&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Maintainer: yourname &amp;lt;you@example.com&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Description: GCC 13.2.0 installed in /usr/local/gcc-13.2.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dpkg-deb --build --root-owner-group &lt;span class="nv"&gt;$HOME&lt;/span&gt;/gcc-pkg gcc-13.2.0-local_amd64.deb&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;DESTDIR&lt;/code&gt; 会让所有文件装到 &lt;code&gt;$HOME/gcc-pkg/usr/local/gcc-13.2.0/&lt;/code&gt; 下，不需要 &lt;code&gt;sudo&lt;/code&gt;；&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;Architecture&lt;/code&gt; 按实际情况填写，可以用 &lt;code&gt;dpkg --print-architecture&lt;/code&gt; 查看；&lt;/li&gt;&#10;&lt;li&gt;在其他机器上用 &lt;code&gt;sudo apt install ./gcc-13.2.0-local_amd64.deb&lt;/code&gt; 安装（目标机器需要是相同架构、相近版本的系统），卸载用 &lt;code&gt;sudo apt remove gcc-13.2.0-local&lt;/code&gt;。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="配置环境变量"&gt;配置环境变量&#10;&lt;/h3&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;我使用 &lt;code&gt;zsh&lt;/code&gt; 作为我的 shell，所以在 &lt;code&gt;~/.zshrc&lt;/code&gt; 中添加环境变量。如果你使用的是 &lt;code&gt;bash&lt;/code&gt; 或者其他 shell，请自行修改对应的配置文件。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;export PATH=&amp;#34;/usr/local/gcc-13.2.0/bin:$PATH&amp;#34;&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; ~/.zshrc&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;export LD_LIBRARY_PATH=&amp;#34;/usr/local/gcc-13.2.0/lib64${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}&amp;#34;&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; ~/.zshrc&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;source&lt;/span&gt; ~/.zshrc&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;注意新路径要放在 &lt;code&gt;$PATH&lt;/code&gt; 的&lt;strong&gt;前面&lt;/strong&gt;。shell 是按 &lt;code&gt;PATH&lt;/code&gt; 从左到右查找命令的，如果写成 &lt;code&gt;$PATH:/usr/local/gcc-13.2.0/bin&lt;/code&gt;，会先找到系统自带的 &lt;code&gt;/usr/bin/gcc&lt;/code&gt;，新装的 GCC 根本用不上：&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="PATH 顺序决定用的是哪个 gcc" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.cloudorz.com/p/compile-and-install-gcc-13/path-order.svg"&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;LD_LIBRARY_PATH&lt;/code&gt; 那一行是为了让用新 GCC 编译出来的 C++ 程序在运行时能找到新版的 &lt;code&gt;libstdc++.so&lt;/code&gt;，否则可能报 &lt;code&gt;version `GLIBCXX_3.4.32' not found&lt;/code&gt; 之类的错误。&lt;/p&gt;&#10;&lt;h3 id="验证环境变量"&gt;验证环境变量&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;which gcc&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gcc --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;&lt;code&gt;which gcc&lt;/code&gt; 输出 &lt;code&gt;/usr/local/gcc-13.2.0/bin/gcc&lt;/code&gt;，并且版本号是 13.2.0，就说明大功告成了。&lt;/p&gt;&#10;&lt;h2 id="参考"&gt;参考&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://gcc.gnu.org/install/" target="_blank" rel="noopener"&#10; &gt;Installing GCC&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://mirrors.tuna.tsinghua.edu.cn/help/gcc.git/" target="_blank" rel="noopener"&#10; &gt;GCC 源码镜像使用帮助（清华大学 TUNA）&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item><item><title>[小白篇] 编译 Linux 内核完整笔记</title><link>https://blog.cloudorz.com/p/compile-linux-kernel-tourial/</link><pubDate>Sun, 24 Mar 2024 01:12:28 +0800</pubDate><guid>https://blog.cloudorz.com/p/compile-linux-kernel-tourial/</guid><description>&lt;img src="https://blog.cloudorz.com/p/compile-linux-kernel-tourial/cover.svg" alt="Featured image of post [小白篇] 编译 Linux 内核完整笔记" /&gt;&lt;h2 id="前言"&gt;前言&#10;&lt;/h2&gt;&lt;p&gt;自己编译内核听起来很硬核，其实流程很固定：&lt;strong&gt;拿源码 → 准备配置 → 编译 → 安装 → 重启验证&lt;/strong&gt;。只要留好退路（旧内核一直都在），基本不会把系统搞坏。&lt;/p&gt;&#10;&lt;p&gt;本文以 Debian 12 / Ubuntu 22.04 及更新版本、x86_64 架构为例，面向第一次编译内核的同学，尽量把每一步为什么这么做讲清楚。&lt;/p&gt;&#10;&lt;p&gt;整体流程如下：&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="编译 Linux 内核的整体流程" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.cloudorz.com/p/compile-linux-kernel-tourial/build-flow.svg"&gt;&lt;/p&gt;&#10;&lt;h2 id="准备工作"&gt;准备工作&#10;&lt;/h2&gt;&lt;h3 id="环境需求"&gt;环境需求&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;一台 Debian/Ubuntu 机器，&lt;strong&gt;强烈建议先在虚拟机里练手&lt;/strong&gt;，熟悉之后再上物理机；&lt;/li&gt;&#10;&lt;li&gt;磁盘空间至少预留 &lt;strong&gt;30 GB&lt;/strong&gt;（发行版的配置默认开启了调试信息，编译产物会非常大）；&lt;/li&gt;&#10;&lt;li&gt;内存 4 GB 以上，CPU 核心越多越快。编译时间从十几分钟到几个小时不等；&lt;/li&gt;&#10;&lt;li&gt;有 &lt;code&gt;sudo&lt;/code&gt; 权限。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="安装编译依赖"&gt;安装编译依赖&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install -y build-essential bc bison flex libssl-dev libelf-dev &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; libncurses-dev dwarves rsync cpio xz-utils zstd kmod wget&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;这些包分别是干什么的：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;软件包&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;用途&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;build-essential&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;gcc、make 等基础编译工具&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;bison&lt;/code&gt;、&lt;code&gt;flex&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;解析内核配置系统（Kconfig）需要&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;libssl-dev&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;模块签名、证书处理需要&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;libelf-dev&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;objtool 等工具需要&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;libncurses-dev&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;make menuconfig&lt;/code&gt; 的终端界面&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;dwarves&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;提供 &lt;code&gt;pahole&lt;/code&gt;，发行版配置开启了 BTF，没有它会编译失败&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;bc&lt;/code&gt;、&lt;code&gt;rsync&lt;/code&gt;、&lt;code&gt;cpio&lt;/code&gt;、&lt;code&gt;zstd&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;编译和安装过程中的各种辅助工具&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="获取内核源码"&gt;获取内核源码&#10;&lt;/h2&gt;&lt;p&gt;打开 &lt;a class="link" href="https://www.kernel.org/" target="_blank" rel="noopener"&#10; &gt;kernel.org&lt;/a&gt;，首页列出了 mainline、stable 和 longterm 几类版本。新手建议选 &lt;strong&gt;stable&lt;/strong&gt; 或 &lt;strong&gt;longterm（LTS）&lt;/strong&gt; 版本。&lt;/p&gt;&#10;&lt;p&gt;下面以 6.12 系列为例，&lt;strong&gt;版本号请换成你在 kernel.org 上看到的实际版本&lt;/strong&gt;：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p ~/kernel &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; ~/kernel&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;KVER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;6.12.10&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;KVER&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;.tar.xz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tar -xf linux-&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;KVER&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;.tar.xz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; linux-&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;KVER&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;如果想校验源码完整性，可以同时下载同目录下的 &lt;code&gt;linux-${KVER}.tar.sign&lt;/code&gt;。注意签名针对的是&lt;strong&gt;解压后的 &lt;code&gt;.tar&lt;/code&gt;&lt;/strong&gt;，校验方法见 kernel.org 的 &lt;a class="link" href="https://www.kernel.org/signature.html" target="_blank" rel="noopener"&#10; &gt;Using GnuPG to verify kernel signatures&lt;/a&gt;。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h2 id="准备内核配置"&gt;准备内核配置&#10;&lt;/h2&gt;&lt;p&gt;内核有上万个配置项，从零开始一个个选不现实。对小白来说，最稳妥的做法是&lt;strong&gt;复用当前系统正在使用的配置&lt;/strong&gt;——它肯定能在你的机器上正常启动。&lt;/p&gt;&#10;&lt;h3 id="复用当前系统的配置推荐"&gt;复用当前系统的配置（推荐）&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cp /boot/config-&lt;span class="k"&gt;$(&lt;/span&gt;uname -r&lt;span class="k"&gt;)&lt;/span&gt; .config&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make olddefconfig&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;/boot/config-$(uname -r)&lt;/code&gt; 是发行版编译当前内核时用的配置；&lt;/li&gt;&#10;&lt;li&gt;新内核会多出一些旧配置里没有的选项，&lt;code&gt;make olddefconfig&lt;/code&gt; 会把这些新选项&lt;strong&gt;全部设为默认值&lt;/strong&gt;，不会一个个问你。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="用-menuconfig-调整配置可选"&gt;用 menuconfig 调整配置（可选）&#10;&lt;/h3&gt;&lt;p&gt;想开关某个功能，或者只是好奇内核里都有什么，可以打开图形化的配置菜单：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make menuconfig&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;方向键移动，空格切换 &lt;code&gt;[*]&lt;/code&gt;（编进内核）/ &lt;code&gt;[M]&lt;/code&gt;（编成模块）/ &lt;code&gt;[ ]&lt;/code&gt;（不编译），&lt;code&gt;/&lt;/code&gt; 搜索配置项，&lt;code&gt;?&lt;/code&gt; 查看帮助，最后选 &lt;strong&gt;Save&lt;/strong&gt; 保存到 &lt;code&gt;.config&lt;/code&gt;。&lt;/p&gt;&#10;&lt;h3 id="给新内核加个后缀"&gt;给新内核加个后缀&#10;&lt;/h3&gt;&lt;p&gt;建议给自己编的内核加一个版本后缀，方便在 GRUB 菜单和 &lt;code&gt;uname -r&lt;/code&gt; 里一眼认出来：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;scripts/config --set-str LOCALVERSION &lt;span class="s2"&gt;&amp;#34;-mybuild&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h3 id="缩小编译范围可选"&gt;缩小编译范围（可选）&#10;&lt;/h3&gt;&lt;p&gt;发行版配置会把几千个驱动都编成模块，编译很慢。如果只是想在&lt;strong&gt;当前这台机器&lt;/strong&gt;上用，可以只保留当前已加载的模块：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make localmodconfig&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;它会根据 &lt;code&gt;lsmod&lt;/code&gt; 的结果裁剪配置，编译时间能缩短很多。代价是&lt;strong&gt;当前没插的设备&lt;/strong&gt;（比如某个 U 盘的文件系统、某块网卡）的驱动也会被裁掉，之后可能用不了。第一次编译不确定的话，跳过这一步。&lt;/p&gt;&#10;&lt;h2 id="debianubuntu-上的常见坑"&gt;Debian/Ubuntu 上的常见坑&#10;&lt;/h2&gt;&lt;h3 id="system_trusted_keys-报错"&gt;SYSTEM_TRUSTED_KEYS 报错&#10;&lt;/h3&gt;&lt;p&gt;直接复用 Debian/Ubuntu 的配置编译，大概率会遇到类似下面的错误：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make[3]: *** No rule to make target &amp;#39;debian/canonical-certs.pem&amp;#39;, needed by &amp;#39;certs/x509_certificate_list&amp;#39;. Stop.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;部分 Debian 版本上则是 &lt;code&gt;debian/certs/debian-uefi-certs.pem&lt;/code&gt;。原因是发行版配置里写死了只存在于发行版打包环境中的证书路径。把这两个选项清空即可：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;scripts/config --set-str SYSTEM_TRUSTED_KEYS &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;scripts/config --set-str SYSTEM_REVOCATION_KEYS &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make olddefconfig&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;清空后，内核会在编译时自动生成一把模块签名密钥（&lt;code&gt;certs/signing_key.pem&lt;/code&gt;），不影响使用。&lt;/p&gt;&#10;&lt;h3 id="secure-boot-启动失败"&gt;Secure Boot 启动失败&#10;&lt;/h3&gt;&lt;p&gt;自己编译的内核&lt;strong&gt;没有经过发行版的签名&lt;/strong&gt;。如果机器开启了 UEFI Secure Boot，新内核可能启动不了或拒绝加载模块。最简单的办法是在 BIOS/UEFI 里关闭 Secure Boot；想保留 Secure Boot 的话，需要自己生成密钥并通过 MOK 登记，这超出了本文范围。&lt;/p&gt;&#10;&lt;h3 id="磁盘被撑爆"&gt;磁盘被撑爆&#10;&lt;/h3&gt;&lt;p&gt;发行版配置默认开启了调试信息，模块文件会非常大，装到 &lt;code&gt;/lib/modules&lt;/code&gt; 后可能占好几个 GB。后面安装模块时加上 &lt;code&gt;INSTALL_MOD_STRIP=1&lt;/code&gt; 可以去掉调试符号，体积会小很多。&lt;/p&gt;&#10;&lt;h2 id="编译"&gt;编译&#10;&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make -j&lt;span class="k"&gt;$(&lt;/span&gt;nproc&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;-j$(nproc)&lt;/code&gt; 表示用全部 CPU 核心并行编译；&lt;/li&gt;&#10;&lt;li&gt;编译完成后，内核镜像在 &lt;code&gt;arch/x86/boot/bzImage&lt;/code&gt;，模块散落在源码树各处；&lt;/li&gt;&#10;&lt;li&gt;中途报错时，往上翻找到&lt;strong&gt;第一个&lt;/strong&gt; &lt;code&gt;error:&lt;/code&gt;，后面的错误通常都是它引起的。可以用 &lt;code&gt;make -j$(nproc) 2&amp;gt;&amp;amp;1 | tee build.log&lt;/code&gt; 把日志保存下来慢慢看。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;可以随时用下面的命令看看即将生成的内核版本号：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make kernelrelease&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h2 id="安装"&gt;安装&#10;&lt;/h2&gt;&lt;h3 id="安装模块和内核"&gt;安装模块和内核&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo make &lt;span class="nv"&gt;INSTALL_MOD_STRIP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; modules_install&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo make install&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;modules_install&lt;/code&gt;：把模块安装到 &lt;code&gt;/lib/modules/&amp;lt;版本号&amp;gt;/&lt;/code&gt;；&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;install&lt;/code&gt;：把 &lt;code&gt;vmlinuz&lt;/code&gt;、&lt;code&gt;System.map&lt;/code&gt;、&lt;code&gt;config&lt;/code&gt; 复制到 &lt;code&gt;/boot&lt;/code&gt;。在 Debian/Ubuntu 上，它会调用 &lt;code&gt;installkernel&lt;/code&gt;，顺带触发 &lt;code&gt;/etc/kernel/postinst.d/&lt;/code&gt; 里的钩子，&lt;strong&gt;自动生成 initramfs 并更新 GRUB&lt;/strong&gt;。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;保险起见，确认一下 initramfs 已经生成，再手动更新一次 GRUB：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls /boot &lt;span class="p"&gt;|&lt;/span&gt; grep &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;make -s kernelrelease&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 如果没有 initrd.img-&amp;lt;版本号&amp;gt;，手动生成：&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# sudo update-initramfs -c -k &amp;#34;$(make -s kernelrelease)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo update-grub&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h3 id="另一种方式打包成-deb可选"&gt;另一种方式：打包成 deb（可选）&#10;&lt;/h3&gt;&lt;p&gt;内核源码自带打包成 deb 的目标，装卸都交给 &lt;code&gt;apt&lt;/code&gt;，管理起来更清爽：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make -j&lt;span class="k"&gt;$(&lt;/span&gt;nproc&lt;span class="k"&gt;)&lt;/span&gt; bindeb-pkg&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls ../*.deb&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install ../linux-image-6.12.10-mybuild_*.deb ../linux-headers-6.12.10-mybuild_*.deb&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;生成的 deb 包在源码目录的&lt;strong&gt;上一级&lt;/strong&gt;，文件名里的版本号以 &lt;code&gt;ls&lt;/code&gt; 看到的为准；带 &lt;code&gt;-dbg&lt;/code&gt; 的是调试符号包，体积很大，一般不用装。如果打包时提示缺少依赖，按提示安装对应的软件包即可。用这种方式安装的话，就不需要再执行上面的 &lt;code&gt;modules_install&lt;/code&gt; 和 &lt;code&gt;install&lt;/code&gt; 了。&lt;/p&gt;&#10;&lt;h2 id="重启并验证"&gt;重启并验证&#10;&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo reboot&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;GRUB 默认会启动版本号最高的内核。重新登录后检查：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uname -r&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;输出带有 &lt;code&gt;-mybuild&lt;/code&gt; 后缀的新版本号，就说明成功启动了自己编译的内核：&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="重启后验证内核版本" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.cloudorz.com/p/compile-linux-kernel-tourial/verify-terminal.svg"&gt;&lt;/p&gt;&#10;&lt;p&gt;还可以顺便看看有没有明显的报错：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo dmesg --level&lt;span class="o"&gt;=&lt;/span&gt;err,warn &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;30&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h2 id="回退方法"&gt;回退方法&#10;&lt;/h2&gt;&lt;h3 id="新内核启动不了怎么办"&gt;新内核启动不了怎么办&#10;&lt;/h3&gt;&lt;p&gt;旧内核一直都在 &lt;code&gt;/boot&lt;/code&gt; 里，GRUB 菜单可以选：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;开机时调出 GRUB 菜单。Ubuntu 默认隐藏菜单，BIOS 启动时按住 &lt;code&gt;Shift&lt;/code&gt;，UEFI 启动时按 &lt;code&gt;Esc&lt;/code&gt;；&lt;/li&gt;&#10;&lt;li&gt;进入 &lt;strong&gt;Advanced options for Ubuntu&lt;/strong&gt;（Debian 上是 &lt;strong&gt;Advanced options for Debian GNU/Linux&lt;/strong&gt;）；&lt;/li&gt;&#10;&lt;li&gt;选择原来的内核版本启动。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="卸载自己编译的内核"&gt;卸载自己编译的内核&#10;&lt;/h3&gt;&lt;p&gt;先确认当前运行的&lt;strong&gt;不是&lt;/strong&gt;要删除的内核（&lt;code&gt;uname -r&lt;/code&gt;），再执行：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;KREL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;6.12.10-mybuild &lt;span class="c1"&gt;# 换成你要删除的版本号&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo rm -f /boot/vmlinuz-&lt;span class="nv"&gt;$KREL&lt;/span&gt; /boot/initrd.img-&lt;span class="nv"&gt;$KREL&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; /boot/System.map-&lt;span class="nv"&gt;$KREL&lt;/span&gt; /boot/config-&lt;span class="nv"&gt;$KREL&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo rm -rf /lib/modules/&lt;span class="nv"&gt;$KREL&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo update-grub&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;如果是用 deb 包安装的，直接卸载即可：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt remove linux-image-6.12.10-mybuild linux-headers-6.12.10-mybuild&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;删除之前务必再核对一次版本号，千万别把当前发行版的内核删了。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h2 id="总结"&gt;总结&#10;&lt;/h2&gt;&lt;p&gt;整个过程可以浓缩成下面几条命令：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt;10&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cp /boot/config-&lt;span class="k"&gt;$(&lt;/span&gt;uname -r&lt;span class="k"&gt;)&lt;/span&gt; .config&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;scripts/config --set-str SYSTEM_TRUSTED_KEYS &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;scripts/config --set-str SYSTEM_REVOCATION_KEYS &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;scripts/config --set-str LOCALVERSION &lt;span class="s2"&gt;&amp;#34;-mybuild&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make olddefconfig&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make -j&lt;span class="k"&gt;$(&lt;/span&gt;nproc&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo make &lt;span class="nv"&gt;INSTALL_MOD_STRIP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; modules_install&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo make install&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo update-grub&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo reboot&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;第一次跑通之后，就可以尝试用 &lt;code&gt;make menuconfig&lt;/code&gt; 精简配置、打补丁、调试驱动了。&lt;/p&gt;&#10;&lt;h2 id="参考"&gt;参考&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://www.kernel.org/" target="_blank" rel="noopener"&#10; &gt;The Linux Kernel Archives&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://docs.kernel.org/admin-guide/README.html" target="_blank" rel="noopener"&#10; &gt;Linux kernel documentation: Installing the kernel&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://kernel-team.pages.debian.net/kernel-handbook/" target="_blank" rel="noopener"&#10; &gt;Debian Linux Kernel Handbook&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item></channel></rss>