成信 發表於 2020-9-22 19:48:00

记录一次编译Fedora 32内核的过程

<h3 id="背景">背景</h3>
<p>安装了Fedora 32,但是对发行版自带的内核不太满意,因为我想将vfio-pci驱动编译到内核里面(builtin),而不是以module的方式加载(将config里面涉及到vfio的CONFIG项目都设置为<code>y</code>)。<br>
然后就从 https://mirrors.aliyun.com/fedora/releases/32/Everything/source/tree/Packages/k/kernel-5.6.6-300.fc32.src.rpm下载了source rpm包。<br>
但是参考 https://fedoraproject.org/wiki/Building_a_custom_kernel/Source_RPM这里的方法始终不能将想要的vfio-pci built-in 到kernel中。</p>
<p>在这里需要对kernel.spec文件做一点小改动,其他操作流程可以参考:https://fedoraproject.org/wiki/Building_a_custom_kernel/Source_RPM</p>
<h3 id="解决办法">解决办法</h3>
<p>通过<code>make defconfig</code>或者直接在安装好的fedora32系统的<code>/boot/config-xxxx</code>拷贝一份config文件,到<code>/root</code>目录下<br>
然后编辑SPECS/kernel.spec文件,修改为如下:</p>
<pre><code># and now to start the build process

    %{make} %{?_smp_mflags} mrproper
    cp /root/kernel-5.6.6-x86_64.config .config
</code></pre>
<p>原理很简单,不需要rpmbuild过程中自动生成的config文件,而是使用我们自定义的config文件就可以了。<br>
同时还需要将:</p>
<pre><code>%{make} ARCH=$Arch olddefconfig
</code></pre>
<p>改为</p>
<pre><code>%{make} ARCH=$Arch oldconfig
</code></pre>
<p>即就是不使用默认的config。<br>
最后就可以执行rpmbuild了。其他部分的操作是可以参考:https://fedoraproject.org/wiki/Building_a_custom_kernel/Source_RPM。</p>
<p>以下步骤是参考自:https://www.zhangfangzhou.cn/how-to-compile-linux-kernel-make-rpm.html,仅供参考:</p>
<ol>
<li>下载内核src rpm</li>
</ol>
<pre><code>https://mirrors.aliyun.com/fedora/releases/32/Everything/source/tree/Packages/k/
</code></pre>
<ol start="2">
<li>步骤:<br>
建议在docker中建立编译环境:<br>
安装一些依赖:</li>
</ol>
<pre><code>dnf install fedpkg fedora-packager rpmdevtools ncurses-devel pesign grubby
</code></pre>
<p>下载kernel src rpm:</p>
<pre><code>yum install wget -y &amp;&amp; wget https://mirrors.aliyun.com/fedora/releases/32/Everything/source/tree/Packages/k/kernel-5.6.6-300.fc32.src.rpm
</code></pre>
<ol>
<li>首先建立 RPM 的打包环境目录,运行下列命令:</li>
</ol>
<pre><code>rpmdev-setuptree
</code></pre>
<p>该命令会在用户的 HOME 目录下建立 rpmbuild/{SOURCES,SPECS,BUILD,RPMS,SRPMS} 这5个目录,以及一个 .rpmmacros 文件,该文件定义了一些 rpm 打包的环境变量。</p>
<p>安装编译内核所需要的包,运行下列命令:</p>
<pre><code>su -c 'yum-builddep kernel-&lt;version&gt;.src.rpm'
</code></pre>
<p>安装 kernel source src.rpm 包,运行下列命令:</p>
<pre><code>rpm -Uvh kernel-&lt;version&gt;.src.rpm
</code></pre>
<p>准备内核源代码树</p>
<ol>
<li>运行下列命令来建立内核源代码树:</li>
</ol>
<pre><code>cd ~/rpmbuild/SPECS
rpmbuild -bp --target=`uname -m` kernel.spec
</code></pre>
<p>现在内核源代码树位于 ~/rpmbuild/BUILD/kernel-<version>/linux-<version>. 目录。</arch></version></version></p>
<ol start="2">
<li>如果还需要修改内核源代码的话(可选),可按如下步骤操作:</li>
</ol>
<pre><code>cp -a ~/rpmbuild/BUILD/kernel-2.6.$ver/linux-2.6.$ver.$arch ~/rpmbuild/BUILD/kernel-2.6.$ver.orig
cp -a ~/rpmbuild/BUILD/kernel-2.6.$ver.orig ~/rpmbuild/BUILD/kernel-2.6.$ver.new
在 ~/rpmbuild/BUILD/kernel-2.6.$ver.new 中对 source 作修改,然后作成 patch:
cd ~/rpmbuild/BUILD
diff -uNrp kernel-2.6.x.orig kernel-2.6.x.new &gt; ../SOURCES/linux-2.6-my-new-patch.patch
</code></pre>
<p>配置内核选项(可选)<br>
如果需要修改内核的编译选项的话,按如下操作:</p>
<ol>
<li>进入内核源代码树</li>
</ol>
<pre><code>cd ~/rpmbuild/BUILD/kernel-&lt;version&gt;/linux-&lt;version&gt;.&lt;arch&gt;/
</code></pre>
<ol start="2">
<li>从 configs 目录中挑选一个基于其修改的 config 文件,把它复制成内核源代码树中的 .config 文件</li>
</ol>
<pre><code>cp configs/&lt;desired-config-file&gt; .config
</code></pre>
<ol start="3">
<li>配置内核编译选项</li>
</ol>
<pre><code>make oldconfig
</code></pre>
<p>可选:</p>
<pre><code>make menuconfig
</code></pre>
<ol start="4">
<li>在新生成的 .config 文件的第一行添加一行指定硬件平台的标识(uname -i 的输出),以 # 号开头,例如:</li>
</ol>
<pre><code># x86_64
</code></pre>
<ol start="5">
<li>把<code> .config</code> 文件复制到<code>~/rpmbuild/SOURCES/</code>目录下,并命名成<code> config-&lt;arch&gt;</code>,例如<code> config-i686</code></li>
</ol>
<pre><code>cp .config ~/rpmbuild/SOURCES/config-&lt;arch&gt;
</code></pre>
<p>准备 spec 文件<br>
(需要修改spec文件,将config文件的路径修改下,否则重新rpmbuild会覆盖修改后的config文件。)<br>
进入 ~/rpmbuild/SPECS 目录,编辑 kernel.spec 文件:</p>
<ol>
<li>定义 buildid 为一个唯一的标识,以区别不同的 kernel rpm 包。把</li>
</ol>
<pre><code>#% define buildid .local
</code></pre>
<p>改成</p>
<pre><code>%define buildid .&lt;custom_text&gt;
</code></pre>
<p>注意去掉 % 和 define 之间的空格</p>
<ol start="2">
<li>如果之前有生成 patch ,把 patch 加到 kernel.spec 文件中。一般放在所有已有的 patch 最后,并注明注释。例如:</li>
</ol>
<pre><code># cputime accounting is broken, revert to 2.6.22 version
Patch2220: linux-2.6-cputime-fix-accounting.patch
Patch9999: linux-2.6-samfw-test.patch
</code></pre>
<p>另外在打 patch 那一段也要补上:</p>
<pre><code>ApplyPatch linux-2.6-cputime-fix-accounting.patch
ApplyPatch linux-2.6-samfw-test.patch
</code></pre>
<p>编译新的内核<br>
用 rpmbuild 命令来编译 kernel rpm 包,默认的命令为:</p>
<pre><code>rpmbuild -bb --target=`uname -m` kernel.spec
</code></pre>
<p>这个命令可能会编译好几遍 kernel,生成不同类型的内核镜像,例如支持 xen、smp 等的 kernel。可以通过添加 --without <option> 选项来去除一些,可选的 option 有 xen、smp、up、pae、kdump、debug 和 debuginfo 等。要指明编译某一种 kernel 的话,可以通过添加 --with </option><option> 选项,可选的 option 有 baseonly、smponly 和 xenonly 等。这些 option 都可以在 spec 文件中查到。<br>
例如要编译一个最基本的 kernel, 可使用下面的命令:</option></p>
<pre><code>rpmbuild -bb --with baseonly --without debug --without debuginfo --target=`uname -m` kernel.spec
</code></pre>
<p>编译结束后,新的 rpm 包在 ~rpmbuild/RPMS 目录下。</p><br><br>
来源:https://www.cnblogs.com/powerrailgun/p/13714429.html
頁: [1]
查看完整版本: 记录一次编译Fedora 32内核的过程