康乐好玩美 發表於 2024-3-10 23:59:00

Ubuntu 22.04内核代码下载、编译、调试

<h1>1 下载Ubuntu&nbsp; Kernel</h1>
<p>参考《Kernel/Dev/KernelGitGuide - Ubuntu Wiki》,下载Ubuntu 22.04代码。</p>
<p>优先使用:</p>
<div class="cnblogs_code">
<pre>apt source linux-image-unsigned-$(uname -r)</pre>
</div>
<p>或者:</p>
<div class="cnblogs_code">
<pre>git clonehttps:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">git.launchpad.net/~ubuntu-kernel/ubuntu/+source/linux/+git/jammy</span></pre>
</div>
<h1>2 修改、编译、安装Ubuntu Kernel</h1>
<p>参考《Kernel/BuildYourOwnKernel - Ubuntu Wiki》 。</p>
<h2>2.1 修改Ubuntu Kernel配置</h2>
<p>修改Ubuntu Kernel配置选项:&nbsp;</p>
<div class="cnblogs_code">
<pre>    chmod a+x debian/<span>rules
    chmod a+x debian/scripts/*
    chmod a+x debian/scripts/misc/*
    fakeroot debian/rules clean
    fakeroot debian/rules <span style="color: rgba(255, 0, 0, 1)">editconfigs</span> # you need to go through each (Y, Exit, Y, Exit..) or get a complaint about config later</span></pre>
</div>
<h2>2.2 编译Ubuntu Kernel</h2>
<p>&nbsp;安装Ubuntu kernel编译所需工具:</p>
<div class="cnblogs_code">
<pre>sudo apt build-dep linux linux-image-unsigned-$(uname -r)</pre>
</div>
<p>&nbsp;补充安装如下工具:</p>
<div class="cnblogs_code">
<pre>sudo apt install libncurses-dev gawk flex bison openssl libssl-dev dkms libelf-dev libudev-dev libpci-dev libiberty-dev autoconf llvm</pre>
</div>
<p>&nbsp;进行编译:</p>
<div class="cnblogs_code">
<pre>fakeroot debian/<span style="color: rgba(0, 0, 0, 1)">rules clean

# quicker build:
fakeroot debian</span>/rules <span style="color: rgba(255, 0, 0, 1)">binary-headers binary-generic binary-</span><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(255, 0, 0, 1)">perarch</span>

# </span><span style="color: rgba(0, 0, 255, 1)">if</span> you need linux-<span style="color: rgba(0, 0, 0, 1)">tools or lowlatency kernel, run instead:
fakeroot debian</span>/rules <span style="color: rgba(255, 0, 0, 1)">binary</span></pre>
</div>
<h3>2.2.1 错误:FAILED: load BTF from vmlinux: Invalid argument</h3>
<p>&nbsp;编译过程中出现如下错误:</p>
<div class="cnblogs_code">
<pre>FAILED: load BTF <span style="color: rgba(0, 0, 255, 1)">from</span> vmlinux: Invalid argument</pre>
</div>
<p>参考《kbuild: Add skip_encoding_btf_enum64 option to pahole · intel/linux-intel-lts@b775fbf · GitHub》,在scripts/pahole-flags.sh添加如下修改:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">if</span> [ <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">${pahole_ver}</span><span style="color: rgba(128, 0, 0, 1)">"</span> -ge <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">124</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> ]; then
    extra_paholeopt</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">${extra_paholeopt} --skip_encoding_btf_enum64</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
fi</span></pre>
</div>
<h2>2.3 安装Ubuntu Kernel</h2>
<p>在上一层目录查看编译结果:</p>
<div class="cnblogs_code">
<pre>ls linux*<span style="color: rgba(128, 0, 128, 1)">5.15</span>.<span style="color: rgba(128, 0, 128, 1)">0</span>-<span style="color: rgba(128, 0, 128, 1)">52.58</span>*.deb</pre>
</div>
<p>安装Ubuntu Kernel,然后重启生效:</p>
<div class="cnblogs_code">
<pre>sudo dpkg -i linux*5<span style="color: rgba(128, 0, 128, 1)">.15</span>.<span style="color: rgba(128, 0, 128, 1)">0</span>-52<span style="color: rgba(128, 0, 128, 1)">.58</span>*<span style="color: rgba(0, 0, 0, 1)">.deb
sudo reboot</span></pre>
</div>
<h2>2.4 查看当前内核</h2>
<p>通过uname查看当前内核版本号:</p>
<div class="cnblogs_code">
<pre>uname -a</pre>
</div>
<p>&nbsp;查看内核中已安装的内核版本:</p>
<div class="cnblogs_code">
<pre>dpkg --<span style="color: rgba(0, 0, 255, 1)">get</span>-selections |grep linux-image</pre>
</div>
<p>删除某个已安装内核版本:</p>
<div class="cnblogs_code">
<pre>sudo apt-<span style="color: rgba(0, 0, 255, 1)">get</span> purge linux-image-<span style="color: rgba(128, 0, 128, 1)">6.5</span>.<span style="color: rgba(128, 0, 128, 1)">0</span>-<span style="color: rgba(128, 0, 128, 1)">25</span>-generic linux-image-unsigned-<span style="color: rgba(128, 0, 128, 1)">6.5</span>.<span style="color: rgba(128, 0, 128, 1)">0</span>-<span style="color: rgba(128, 0, 128, 1)">25</span>-generic</pre>
</div>
<h2>2.5 更换默认内核</h2>
<p>当Ubuntu kernel存在多个内核时,可以选择默认的启动内核。一是在启动时手动选择内核版本,另一是修改/boot/grub/grub.cfg和/etc/default/grub来选择内核版本。</p>
<p>打开/boot/grub/brub.cfg文件,在submenu 'Advanced options for Ubuntu'菜单中找到对应的menuentry,序号从0开始。</p>
<div class="cnblogs_code">
<pre>submenu <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Advanced options for Ubuntu</span><span style="color: rgba(128, 0, 0, 1)">'</span> $menuentry_id_option <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">gnulinux-advanced-85d24705-70b3-43c7-8af6-cd9524790ecd</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)"> {
    menuentry </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Ubuntu, with Linux 6.5.0-18-generic</span><span style="color: rgba(128, 0, 0, 1)">'</span> --<span style="color: rgba(0, 0, 255, 1)">class</span> ubuntu --<span style="color: rgba(0, 0, 255, 1)">class</span> gnu-linux --<span style="color: rgba(0, 0, 255, 1)">class</span> gnu --<span style="color: rgba(0, 0, 255, 1)">class</span> os $menuentry_id_option <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">gnulinux-6.5.0-18-generic-advanced-85d24705-70b3-43c7-8af6-cd9524790ecd</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)"> {--<span style="color: rgba(255, 0, 0, 1)"><strong>0
</strong></span></span><span style="color: rgba(0, 0, 0, 1)">...
    }
    menuentry </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Ubuntu, with Linux 6.5.0-18-generic (recovery mode)</span><span style="color: rgba(128, 0, 0, 1)">'</span> --<span style="color: rgba(0, 0, 255, 1)">class</span> ubuntu --<span style="color: rgba(0, 0, 255, 1)">class</span> gnu-linux --<span style="color: rgba(0, 0, 255, 1)">class</span> gnu --<span style="color: rgba(0, 0, 255, 1)">class</span> os $menuentry_id_option <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">gnulinux-6.5.0-18-generic-recovery-85d24705-70b3-43c7-8af6-cd9524790ecd</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)"> {--<strong><span style="color: rgba(255, 0, 0, 1)">1
</span></strong></span><span style="color: rgba(0, 0, 0, 1)">...
    }
    menuentry </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Ubuntu, with Linux 5.15.0-52-generic</span><span style="color: rgba(128, 0, 0, 1)">'</span> --<span style="color: rgba(0, 0, 255, 1)">class</span> ubuntu --<span style="color: rgba(0, 0, 255, 1)">class</span> gnu-linux --<span style="color: rgba(0, 0, 255, 1)">class</span> gnu --<span style="color: rgba(0, 0, 255, 1)">class</span> os $menuentry_id_option <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">gnulinux-5.15.0-52-generic-advanced-85d24705-70b3-43c7-8af6-cd9524790ecd</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)"> {--<span style="color: rgba(255, 0, 0, 1)"><strong>2,对应GRUB_DEFAULT中序号。</strong></span>
      recordfail
      load_video
      gfxmode $linux_gfx_mode
      insmod gzio
      </span><span style="color: rgba(0, 0, 255, 1)">if</span> [ x$grub_platform =<span style="color: rgba(0, 0, 0, 1)"> xxen ]; then insmod xzio; insmod lzopio; fi
      insmod part_gpt
      insmod ext2
      </span><span style="color: rgba(0, 0, 255, 1)">set</span> root=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">hd0,gpt3</span><span style="color: rgba(128, 0, 0, 1)">'</span>
      <span style="color: rgba(0, 0, 255, 1)">if</span> [ x$feature_platform_search_hint =<span style="color: rgba(0, 0, 0, 1)"> xy ]; then
          search </span>--no-floppy --fs-uuid --<span style="color: rgba(0, 0, 255, 1)">set</span>=root --hint-bios=hd0,gpt3 --hint-efi=hd0,gpt3 --hint-baremetal=ahci0,gpt385d24705-70b3-43c7-8af6-<span style="color: rgba(0, 0, 0, 1)">cd9524790ecd
      </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">
          search </span>--no-floppy --fs-uuid --<span style="color: rgba(0, 0, 255, 1)">set</span>=root 85d24705-70b3-43c7-8af6-<span style="color: rgba(0, 0, 0, 1)">cd9524790ecd
      fi
      echo    </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Loading Linux 5.15.0-52-generic ...</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
      linux    </span>/boot/vmlinuz-<span style="color: rgba(128, 0, 128, 1)">5.15</span>.<span style="color: rgba(128, 0, 128, 1)">0</span>-<span style="color: rgba(128, 0, 128, 1)">52</span>-generic root=UUID=85d24705-70b3-43c7-8af6-cd9524790ecd ro find_preseed=/preseed.cfg auto noprompt priority=critical locale=<span style="color: rgba(0, 0, 0, 1)">en_US quiet splash $vt_handoff
      echo    </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Loading initial ramdisk ...</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
      initrd    </span>/boot/initrd.img-<span style="color: rgba(128, 0, 128, 1)">5.15</span>.<span style="color: rgba(128, 0, 128, 1)">0</span>-<span style="color: rgba(128, 0, 128, 1)">52</span>-<span style="color: rgba(0, 0, 0, 1)">generic
    }
    menuentry </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Ubuntu, with Linux 5.15.0-52-generic (recovery mode)</span><span style="color: rgba(128, 0, 0, 1)">'</span> --<span style="color: rgba(0, 0, 255, 1)">class</span> ubuntu --<span style="color: rgba(0, 0, 255, 1)">class</span> gnu-linux --<span style="color: rgba(0, 0, 255, 1)">class</span> gnu --<span style="color: rgba(0, 0, 255, 1)">class</span> os $menuentry_id_option <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">gnulinux-5.15.0-52-generic-recovery-85d24705-70b3-43c7-8af6-cd9524790ecd</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)"> {--<span style="color: rgba(255, 0, 0, 1)"><strong>3
</strong></span></span><span style="color: rgba(0, 0, 0, 1)">...
    }
}</span></pre>
</div>
<p>修改/etc/default/grub:</p>
<div class="cnblogs_code">
<pre>GRUB_DEFAULT=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">1&gt;<span style="color: rgba(255, 0, 0, 1)"><strong><span style="background-color: rgba(255, 255, 0, 1)"> 2</span></strong></span></span><span style="color: rgba(128, 0, 0, 1)">"--<span style="color: rgba(255, 0, 0, 1)">后面的序号0表示使用menuentry作为默认启动选项。<strong><span style="background-color: rgba(255, 255, 0, 1)">2</span><span style="background-color: rgba(255, 255, 0, 1)">前必须要有空格。</span></strong></span></span></pre>
</div>
<p>在修改完后,一定要执行<span style="background-color: rgba(255, 255, 0, 1); color: rgba(255, 0, 0, 1)"><strong>sudo update-grub</strong></span>,上述修改才会生效。</p>
<h1>3 调试</h1>
<p>&nbsp;编译带调试符号表的内核版本:</p>
<div class="cnblogs_code">
<pre>sudo apt install pkg-config-<span style="color: rgba(0, 0, 0, 1)">dbgsym
fakeroot debian</span>/<span style="color: rgba(0, 0, 0, 1)">rules clean
fakeroot debian</span>/rules binary-headers binary-generic binary-perarch skipdbg=<span style="color: rgba(0, 0, 255, 1)">false</span></pre>
</div>
<p>&nbsp;</p>

</div>
<div id="MySignature" role="contentinfo">
    联系方式:arnoldlu@qq.com<br><br>
来源:https://www.cnblogs.com/arnoldlu/p/18064348
頁: [1]
查看完整版本: Ubuntu 22.04内核代码下载、编译、调试