394 lines
453 KiB
HTML
394 lines
453 KiB
HTML
|
<!DOCTYPE html>
|
|||
|
<html><head><title>Linux 内核管理</title><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><meta property="og:title" content="Linux 内核管理"/><meta property="og:description" content="Linux 内核作为操作系统的核心,负责管理硬件与软件资源,提供系统服务接口。其发展历程体现了开源社区的合作精神,不断进行技术创新和突破。Linux 内核版本管理遵循特定的格式,支持广泛的硬件平台,并通过模块化设计提供灵活性和高效性。内核编译与安装、模块管理、调试技术、性能调优以及安全管理是内核管理的关键方面,涉及从源码编译到错误处理和性能优化的全过程。通过这些管理策略和技术,可以确保系统的稳定性、安全性和高效运行。."/><meta property="og:image" content="https://wiki.7wate.com/static/og-image.png"/><meta property="og:width" content="1200"/><meta property="og:height" content="675"/><link rel="icon" href="../../../../static/icon.png"/><meta name="description" content="Linux 内核作为操作系统的核心,负责管理硬件与软件资源,提供系统服务接口。其发展历程体现了开源社区的合作精神,不断进行技术创新和突破。Linux 内核版本管理遵循特定的格式,支持广泛的硬件平台,并通过模块化设计提供灵活性和高效性。内核编译与安装、模块管理、调试技术、性能调优以及安全管理是内核管理的关键方面,涉及从源码编译到错误处理和性能优化的全过程。通过这些管理策略和技术,可以确保系统的稳定性、安全性和高效运行。."/><meta name="generator" content="Quartz"/><link rel="preconnect" href="https://fonts.googleapis.com"/><link rel="preconnect" href="https://fonts.gstatic.com"/><script async src="https://umami.7wate.com/script.js" data-website-id="c061efdc-95dd-4d21-9d04-a1ffda0a85b9"></script><script>
|
|||
|
var _hmt = _hmt || [];
|
|||
|
(function() {
|
|||
|
var hm = document.createElement("script");
|
|||
|
hm.src = "https://hm.baidu.com/hm.js?94d8ccb156eb7c65abf317e6e01cdba9";
|
|||
|
var s = document.getElementsByTagName("script")[0];
|
|||
|
s.parentNode.insertBefore(hm, s);
|
|||
|
})();
|
|||
|
</script><script async src="https://www.googletagmanager.com/gtag/js?id=G-MHMEL0F832"></script><script>
|
|||
|
(function() {
|
|||
|
window.dataLayer = window.dataLayer || [];
|
|||
|
function gtag() {
|
|||
|
window.dataLayer.push(arguments);
|
|||
|
}
|
|||
|
gtag('js', new Date());
|
|||
|
gtag('config', 'G-MHMEL0F832');
|
|||
|
})();
|
|||
|
</script><link href="../../../../index.css" rel="stylesheet" type="text/css" spa-preserve/><link href="https://cdn.jsdelivr.net/npm/katex@0.16.0/dist/katex.min.css" rel="stylesheet" type="text/css" spa-preserve/><link href="https://fonts.googleapis.com/css2?family=IBM Plex Mono&family=Schibsted Grotesk:wght@400;700&family=Source Sans Pro:ital,wght@0,400;0,600;1,400;1,600&display=swap" rel="stylesheet" type="text/css" spa-preserve/><script src="../../../../prescript.js" type="application/javascript" spa-preserve></script><script type="application/javascript" spa-preserve>const fetchData = fetch(`../../../../static/contentIndex.json`).then(data => data.json())</script></head><body data-slug="Tech/operating-system/Linux/3.系统管理/Linux-内核管理"><div id="quartz-root" class="page"><div id="quartz-body"><div class="left sidebar"><h1 class="page-title "><a href="../../../..">📚 X·Eden</a></h1><div class="spacer mobile-only"></div><div class="search "><div id="search-icon"><p>Search</p><div></div><svg tabIndex="0" aria-labelledby="title desc" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 19.9 19.7"><title id="title">Search</title><desc id="desc">Search</desc><g class="search-path" fill="none"><path stroke-linecap="square" d="M18.5 18.3l-5.4-5.4"></path><circle cx="8" cy="8" r="7"></circle></g></svg></div><div id="search-container"><div id="search-space"><input autocomplete="off" id="search-bar" name="search" type="text" aria-label="Search for something" placeholder="Search for something"/><div id="results-container"></div></div></div></div><div class="darkmode "><input class="toggle" id="darkmode-toggle" type="checkbox" tabIndex="-1"/><label id="toggle-label-light" for="darkmode-toggle" tabIndex="-1"><svg xmlns="http://www.w3.org/2000/svg" xmlnsXlink="http://www.w3.org/1999/xlink" version="1.1" id="dayIcon" x="0px" y="0px" viewBox="0 0 35 35" style="enable-background:new 0 0 35 35;" xmlSpace="preserve"><title>Light mode</title><path d="M6,17.5C6,16.672,5.328,16,4.5,16h-3C0.672,16,0,16.672,0,17.5 S0.672,19,1.5,19h3C5.328,19,6,18.328,6,17.5z M7.5,26c-0.414,0-0.789,0.168-1.061,0.439l-2,2C4.168,28.711,4,29.086,4,29.5 C4,30.328,4.671,31,5.5,31c0.414,0,0.789-0.168,1.06-0.44l2-2C8.832,28.289,9,27.914,9,27.5C9,26.672,8.329,26,7.5,26z M17.5,6 C18.329,6,19,5.328,19,4.5v-3C19,0.672,18.329,0,17.5,0S16,0.672,16,1.5v3C16,5.328,16.671,6,17.5,6z M27.5,9 c0.414,0,0.789-0.168,1.06-0.439l2-2C30.832,6.289,31,5.914,31,5.5C31,4.672,30.329,4,29.5,4c-0.414,0-0.789,0.168-1.061,0.44 l-2,2C26.168,6.711,26,7.086,26,7.5C26,8.328,26.671,9,27.5,9z M6.439,8.561C6.711,8.832,7.086,9,7.5,9C8.328,9,9,8.328,9,7.5 c0-0.414-0.168-0.789-0.439-1.061l-2-2C6.289,4.168,5.914,4,5.5,4C4.672,4,4,4.672,4,5.5c0,0.414,0.168,0.789,0.439,1.06 L6.439,8.561z M33.5,16h-3c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5h3c0.828,0,1.5-0.672,1.5-1.5S34.328,16,33.5,16z M28.561,26.439C28.289,26.168,27.914,26,27.5,26c-0.828,0-1.5,0.672-1.5,1.5c0,0.414,0.168,0.789,0.439,1.06l2,2 C28.711,30.832,29.086,31,29.5,31c0.828,0,1.5-0.672,1.5-1.5c0-0.414-0.168-0.789-0.439-1.061L28.561,26.439z M17.5,29 c-0.829,0-1.5,0.672-1.5,1.5v3c0,0.828,0.671,1.5,1.5,1.5s1.5-0.672,1.5-1.5v-3C19,29.672,18.329,29,17.5,29z M17.5,7 C11.71,7,7,11.71,7,17.5S11.71,28,17.5,28S28,23.29,28,17.5S23.29,7,17.5,7z M17.5,25c-4.136,0-7.5-3.364-7.5-7.5 c0-4.136,3.364-7.5,7.5-7.5c4.136,0,7.5,3.364,7.5,7.5C25,21.636,21.636,25,17.5,25z"></path></svg></label><label id="toggle-label-dark" for="darkmode-toggle" tabIndex="-1"><svg xmlns="http://www.w3.org/2000/svg" xmlnsXlink="http://www.w3.org/1999/xlink" version="1.1" id="nightIcon" x="0px" y="0px" viewBox="0 0 100 100" style="enable-background='new 0 0 100 100'" xmlSpace="preserve"><title>Dark mode</title><path d="M96.76,66.458c-0.853-0.852-2.15-1.064-3.23-0.534c-6.063,2.991-12.858,4.571-19.655,4.571 C62.022,70.495,50.88,65.88,42.5,57.5C29.043,44.043,25.658,23.536,34.076,6.47c0.532-1.08,0.318-2.379-0.534-3.23 c-0.851-0.852-2.15-1.064-3.23-0.534c-4.918,2.427-9.375,5.619-13.246,9.491c-9.447,9.447-14.65,22.
|
|||
|
<h3 id="linux-内核">Linux 内核<a aria-hidden="true" tabindex="-1" href="#linux-内核" class="internal"> §</a></h3>
|
|||
|
<p>Linux 内核是一个操作系统(OS)内核,由林纳斯·托瓦兹(Linus Torvalds)在 1991 年首次发布。作为操作系统最核心的部分,Linux 内核负责处理计算机硬件与软件资源的管理、提供系统服务的接口。它是一个中介,位于用户应用程序与计算机硬件之间,使应用程序在不直接操作硬件的情况下运行,同时保证了系统的稳定性和安全性。</p>
|
|||
|
<h3 id="linux-内核发展历史">Linux 内核发展历史<a aria-hidden="true" tabindex="-1" href="#linux-内核发展历史" class="internal"> §</a></h3>
|
|||
|
<p>Linux 内核的发展是开源社区合作精神的典范。自 1991 年林纳斯·托瓦兹在赫尔辛基大学开始其开发项目以来,经过三十多年的迅速发展,Linux 内核已经成长为最为广泛使用的操作系统之一。它的发展历程标志着许多技术的创新与突破,比如对多处理器的支持、对不同硬件架构的兼容性以及对虚拟化的原生支持等。</p>
|
|||
|
<h3 id="linux-内核版本管理">Linux 内核版本管理<a aria-hidden="true" tabindex="-1" href="#linux-内核版本管理" class="internal"> §</a></h3>
|
|||
|
<p>Linux 内核的版本管理体现了其开发过程的开放性和社区驱动的特点。内核版本号遵循“主版本号.次版本号.修订号.额外信息”的格式。其中,偶数的次版本号代表稳定版本,奇数的次版本号则用于开发中的版本。Linux 内核项目采用 Git 作为版本控制系统,林纳斯·托瓦兹本人负责主线(mainline)内核的发布。</p>
|
|||
|
<h3 id="linux-内核架构">Linux 内核架构<a aria-hidden="true" tabindex="-1" href="#linux-内核架构" class="internal"> §</a></h3>
|
|||
|
<p>Linux 内核的架构设计兼顾了灵活性与高效性,支持广泛的硬件平台。它主要包括以下几个部分:**进程管理、内存管理、文件系统、网络系统、设备驱动程序以及安全模块。**内核架构将这些功能模块化,不仅促进了开发和维护的便捷,也使得内核能够在不牺牲性能的情况下,提供丰富的功能和强大的扩展性。</p>
|
|||
|
<h2 id="linux-内核编译与安装">Linux 内核编译与安装<a aria-hidden="true" tabindex="-1" href="#linux-内核编译与安装" class="internal"> §</a></h2>
|
|||
|
<h3 id="准备工作">准备工作<a aria-hidden="true" tabindex="-1" href="#准备工作" class="internal"> §</a></h3>
|
|||
|
<ol>
|
|||
|
<li><strong>明确目标</strong>:首先,你需要确定为什么要编译 Linux 内核。可能是为了获取新功能、支持新硬件、提高系统安全性或是出于学习目的。明确目标将帮助你选择合适的内核版本。</li>
|
|||
|
<li><strong>选择合适的环境</strong>:推荐在一个不是日常使用的系统上进行编译,比如虚拟机,这样可以避免潜在的风险对你的主系统产生影响。</li>
|
|||
|
<li><strong>下载源码</strong>:访问 <a href="https://www.kernel.org/" class="external">The Linux Kernel Archives</a>,根据你的需求下载对应版本的内核源码。同时下载源码的 PGP 签名文件,以便进行安全验证。</li>
|
|||
|
<li><strong>安装依赖</strong>:编译内核需要 GCC 编译器、make 工具等。你可以通过 Linux 发行版的包管理器来安装这些工具及其他依赖。</li>
|
|||
|
</ol>
|
|||
|
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-comment);"># Debian 以及其衍生版本</span></span>
|
|||
|
<span data-line><span style="color:var(--shiki-token-function);">sudo</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">apt</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">install</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">bc</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">binutils</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">bison</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">dwarves</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">flex</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">gcc</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">git</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">gnupg2</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">gzip</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">libelf-dev</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">libncurses5-dev</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">libssl-dev</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">make</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">openssl</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">pahole</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">perl-base</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">rsync</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">tar</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">xz-utils</span></span>
|
|||
|
<span data-line> </span>
|
|||
|
<span data-line><span style="color:var(--shiki-token-comment);"># Fedora 以及其衍生版本</span></span>
|
|||
|
<span data-line><span style="color:var(--shiki-token-function);">sudo</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">dnf</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">install</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">binutils</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">ncurses-devel</span><span style="color:var(--shiki-color-text);"> \</span></span>
|
|||
|
<span data-line><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">/usr/include/{libelf.h,openssl/pkcs7.h}</span><span style="color:var(--shiki-color-text);"> \</span></span>
|
|||
|
<span data-line><span style="color:var(--shiki-color-text);">/usr/bin/{</span><span style="color:var(--shiki-token-function);">bc,bison,flex,gcc,git,gpg2,gzip,make,openssl,pahole,perl,rsync,tar,xz,zstd}</span></span></code></pre></div>
|
|||
|
<h3 id="选择内核版本">选择内核版本<a aria-hidden="true" tabindex="-1" href="#选择内核版本" class="internal"> §</a></h3>
|
|||
|
<ol>
|
|||
|
<li><strong>理解版本</strong>:内核版本有稳定版、长期支持(LTS)版和开发版等。选择适合你目标的版本。稳定版和 LTS 版更适合需要稳定性的环境,而开发版则包含最新的功能和修复。</li>
|
|||
|
<li><strong>下载并验证</strong>:下载所选版本的内核源码和 PGP 签名,使用 GPG 验证下载文件的真实性和完整性,确保源码未被篡改。</li>
|
|||
|
</ol>
|
|||
|
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-comment);"># 安装 Linus Torvalds 和 Greg KH 使用的 GPG 公开密钥</span></span>
|
|||
|
<span data-line><span style="color:var(--shiki-token-function);">gpg2</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">--locate-keys</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">torvalds@kernel.org</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">gregkh@kernel.org</span></span>
|
|||
|
<span data-line> </span>
|
|||
|
<span data-line><span style="color:var(--shiki-token-comment);"># 验证 Tar 的完整性</span></span>
|
|||
|
<span data-line><span style="color:var(--shiki-token-function);">gpg2</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">--verify</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">linux-*.tar.sign</span></span></code></pre></div>
|
|||
|
<h3 id="解压和配置内核">解压和配置内核<a aria-hidden="true" tabindex="-1" href="#解压和配置内核" class="internal"> §</a></h3>
|
|||
|
<ol>
|
|||
|
<li><strong>解压源码</strong>:使用 <code>tar</code> 命令解压内核源码包到一个工作目录中。</li>
|
|||
|
<li><strong>配置内核</strong>:
|
|||
|
<ul>
|
|||
|
<li><strong>基础配置</strong>:可以使用发行版的配置作为起点。复制系统的当前内核配置文件(通常位于 <code>/boot/config-$(uname -r)</code>)到源码目录,并重命名为 <code>.config</code>。</li>
|
|||
|
<li><strong>更新配置</strong>:运行 <code>make olddefconfig</code> 自动更新配置,使之适应新版本内核。</li>
|
|||
|
<li><strong>定制配置</strong>:通过 <code>make menuconfig</code> 启动基于文本的配置界面,此处可以启用或禁用特定的内核功能。这一步需要基于你的具体需求来进行选择。</li>
|
|||
|
</ul>
|
|||
|
</li>
|
|||
|
</ol>
|
|||
|
<h3 id="编译内核">编译内核<a aria-hidden="true" tabindex="-1" href="#编译内核" class="internal"> §</a></h3>
|
|||
|
<ol>
|
|||
|
<li>
|
|||
|
<p><strong>编译命令</strong>:在源码目录下执行 <code>make -j$(nproc)</code> 来编译内核。这里的 <code>-j$(nproc)</code> 参数让编译过程并行进行,加快编译速度。</p>
|
|||
|
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-function);">make</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-j</span><span style="color:var(--shiki-token-string-expression);">$(</span><span style="color:var(--shiki-token-function);">nproc</span><span style="color:var(--shiki-token-string-expression);">)</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-keyword);">2>&1</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-keyword);">|</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-function);">tee</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">log</span></span></code></pre></div>
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
<p><strong>标签添加</strong>:如果需要,可以在编译时通过 <code>LOCALVERSION</code> 选项添加自定义标签,以区分这个内核版本。</p>
|
|||
|
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-function);">./scripts/config</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">--file</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">.config</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">--set-str</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">LOCALVERSION</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string-expression);">"-7wate"</span></span></code></pre></div>
|
|||
|
</li>
|
|||
|
</ol>
|
|||
|
<h3 id="安装内核">安装内核<a aria-hidden="true" tabindex="-1" href="#安装内核" class="internal"> §</a></h3>
|
|||
|
<ol>
|
|||
|
<li>
|
|||
|
<p><strong>安装模块</strong>:编译完成后,使用 <code>sudo make modules_install</code> 命令安装内核模块。</p>
|
|||
|
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-function);">sudo</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">make</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">modules_install</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">-j</span><span style="color:var(--shiki-token-string-expression);">$(</span><span style="color:var(--shiki-token-function);">nproc</span><span style="color:var(--shiki-token-string-expression);">)</span></span></code></pre></div>
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
<p><strong>安装内核</strong>:执行 <code>sudo make install</code> 命令,这将自动将内核安装到 <code>/boot</code> 目录,并更新引导加载器,比如 GRUB。</p>
|
|||
|
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-function);">sudo</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">make</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">install</span></span></code></pre></div>
|
|||
|
</li>
|
|||
|
</ol>
|
|||
|
<h3 id="更新引导加载器">更新引导加载器<a aria-hidden="true" tabindex="-1" href="#更新引导加载器" class="internal"> §</a></h3>
|
|||
|
<ol>
|
|||
|
<li><strong>GRUB 更新</strong>:大多数 Linux 发行版会在执行 <code>sudo make install</code> 时自动更新 GRUB 配置。如果没有,你可能需要手动运行 <code>sudo update-grub</code> 或相应的命令来更新启动菜单。</li>
|
|||
|
</ol>
|
|||
|
<h3 id="重启并验证">重启并验证<a aria-hidden="true" tabindex="-1" href="#重启并验证" class="internal"> §</a></h3>
|
|||
|
<ol>
|
|||
|
<li><strong>重启电脑</strong>:完成安装后,重启电脑。</li>
|
|||
|
<li><strong>选择内核</strong>:在引导菜单中选择新编译的内核启动。</li>
|
|||
|
<li><strong>验证安装</strong>:系统启动后,使用 <code>uname -r</code> 命令验证当前运行的内核版本,确认是否与你安装的版本相匹配。</li>
|
|||
|
</ol>
|
|||
|
<h2 id="linux-内核模块管理">Linux 内核模块管理<a aria-hidden="true" tabindex="-1" href="#linux-内核模块管理" class="internal"> §</a></h2>
|
|||
|
<h3 id="内核模块概述">内核模块概述<a aria-hidden="true" tabindex="-1" href="#内核模块概述" class="internal"> §</a></h3>
|
|||
|
<p>Linux 内核模块(LKM)使得内核具备了极高的灵活性和可扩展性。<strong>模块允许在不重启系统的情况下添加或删除功能</strong>,这对于需要动态管理硬件驱动和系统服务的情况非常有用。这些模块通常用于添加设备驱动、文件系统支持或其他内核级功能。内核模块的使用不仅减少了内核的静态大小,还提高了系统的灵活性和模块的可重用性。</p>
|
|||
|
<h3 id="模块的加载和卸载">模块的加载和卸载<a aria-hidden="true" tabindex="-1" href="#模块的加载和卸载" class="internal"> §</a></h3>
|
|||
|
<p>Linux 提供了 <code>insmod</code>、<code>modprobe</code>、<code>rmmod</code> 等工具来管理内核模块的加载和卸载。</p>
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
<table><thead><tr><th>命令</th><th>描述</th><th>依赖处理</th></tr></thead><tbody><tr><td><code>insmod</code></td><td>将模块插入内核</td><td>不解决依赖问题</td></tr><tr><td><code>modprobe</code></td><td>加载模块并自动处理依赖</td><td>自动处理依赖</td></tr><tr><td><code>rmmod</code></td><td>从内核中移除模块</td><td>不解决依赖问题</td></tr><tr><td><code>modprobe -r</code></td><td>移除模块并解决依赖问题</td><td>自动处理依赖</td></tr></tbody></table>
|
|||
|
<h3 id="模块参数管理">模块参数管理<a aria-hidden="true" tabindex="-1" href="#模块参数管理" class="internal"> §</a></h3>
|
|||
|
<p>操作系统的模块化设计不仅提高了系统的可扩展性和灵活性,而且通过参数管理,允许用户或管理员定制化模块的行为。在 Linux 系统中,当加载内核模块(kernel modules)时,管理员可以通过命令行向模块传递参数,这些参数能够影响模块的运行配置和提供的功能。</p>
|
|||
|
<p>例如,网络设备驱动模块可能允许用户通过参数设置 IP 地址、子网掩码或是开启/关闭特定的功能等。通过这种方式,即使是相同的模块,在不同的参数配置下也能够提供不同的功能或表现出不同的性能。</p>
|
|||
|
<p>使用 <code>modinfo</code> 命令,用户可以查询特定模块可接受的参数及其说明。这个命令显示的信息对于理解如何正确配置模块至关重要。例如,运行 <code>modinfo your_module_name</code> 将展示该模块的所有可配置参数及简要描述,帮助用户做出合适的配置决策。</p>
|
|||
|
<h3 id="模块依赖解决">模块依赖解决<a aria-hidden="true" tabindex="-1" href="#模块依赖解决" class="internal"> §</a></h3>
|
|||
|
<p>在复杂的系统中,模块之间往往存在依赖关系。一个模块的正常运作可能依赖于一个或多个其他模块的功能。Linux 系统中的 <code>depmod</code> 命令会分析并生成所有模块之间的依赖关系列表。这个列表被存储在系统的特定目录下,供其他工具如 <code>modprobe</code> 使用。</p>
|
|||
|
<p><code>modprobe</code> 命令在加载一个模块时,会自动查询这个依赖关系列表,并且自动加载该模块所依赖的其他模块。这种自动解决依赖的机制极大地简化了模块管理的复杂度。例如,如果一个网络协议栈模块依赖于特定的硬件驱动模块,当管理员请求加载该网络协议栈模块时,<code>modprobe</code> 会首先确保所有必要的硬件驱动模块也被加载。</p>
|
|||
|
<p>这一机制不仅保证了模块之间的兼容性和稳定性,也让系统管理员能够更加方便地管理系统,因为它减少了手动解决模块依赖所需的工作量。通过这种方式,系统的维护者可以更加专注于系统的配置和优化,而不是被复杂的依赖关系所困扰。</p>
|
|||
|
<h2 id="linux-内核调试技术">Linux 内核调试技术<a aria-hidden="true" tabindex="-1" href="#linux-内核调试技术" class="internal"> §</a></h2>
|
|||
|
<h3 id="内核调试工具介绍">内核调试工具介绍<a aria-hidden="true" tabindex="-1" href="#内核调试工具介绍" class="internal"> §</a></h3>
|
|||
|
<p>Linux 提供了一系列强大的内核调试工具,这些工具为开发者和系统管理员在诊断问题、分析性能瓶颈时提供了极大的便利。</p>
|
|||
|
<ul>
|
|||
|
<li><strong>GDB(GNU Debugger)</strong>:GDB 是最广泛使用的调试工具之一,它不仅可以用于用户空间程序的调试,也可以用来调试内核本身及其模块。GDB 的强大之处在于它支持单步执行、断点设置、变量检查和内存状态分析等功能,极大地方便了内核开发和调试过程。</li>
|
|||
|
<li><strong>Kdump 和 Crash</strong>:在遇到内核崩溃的情况下,Kdump 和 Crash 的组合使用尤为重要。Kdump 利用 kexec 技术,在系统崩溃时迅速启动一个新内核并抓取崩溃时的内存转储,而 Crash 工具则用于分析这些转储文件,帮助开发者快速定位问题原因。</li>
|
|||
|
<li><strong>perf</strong>:perf 是 Linux 下的性能分析工具,它能够提供丰富的性能数据,包括 CPU 使用率、缓存命中情况、上下文切换次数等,对于性能优化具有重要意义。</li>
|
|||
|
<li><strong>Ftrace</strong>:Ftrace 是一个功能强大的内核跟踪工具,通过在内核中插入跟踪点来监视和记录函数调用过程和时序信息,对于理解内核行为和性能分析非常有用。</li>
|
|||
|
</ul>
|
|||
|
<h3 id="内核调试方法">内核调试方法<a aria-hidden="true" tabindex="-1" href="#内核调试方法" class="internal"> §</a></h3>
|
|||
|
<p>根据不同的需求和调试环境,开发者和系统管理员可以选择最合适的内核调试方法。</p>
|
|||
|
<ul>
|
|||
|
<li><strong>日志分析</strong>:通过分析内核日志(例如 <code>dmesg</code> 命令的输出),可以获得系统错误、警告信息和其他关键诊断信息,这是最基本也是最直接的调试方法。</li>
|
|||
|
<li><strong>动态调试</strong>:工具如 perf 和 Ftrace 允许在系统运行时进行动态调试和性能分析,这对于定位运行时问题和性能瓶颈特别有效。</li>
|
|||
|
<li><strong>静态分析</strong>:在代码运行之前,通过阅读源码和使用静态代码分析工具(如 Sparse)来检测潜在错误,这可以在早期阶段发现并修复问题。</li>
|
|||
|
</ul>
|
|||
|
<h3 id="常见内核调试问题">常见内核调试问题<a aria-hidden="true" tabindex="-1" href="#常见内核调试问题" class="internal"> §</a></h3>
|
|||
|
<p>在 Linux 内核调试过程中,可能会遇到各种复杂的问题,如死锁、内存泄漏和性能瓶颈等。</p>
|
|||
|
<ul>
|
|||
|
<li>对于<strong>内存泄漏</strong>问题,可以使用 Valgrind 等工具进行分析和定位。</li>
|
|||
|
<li>针对<strong>死锁</strong>问题,可以通过分析锁依赖图来识别死锁的根源。</li>
|
|||
|
<li>而对于<strong>性能瓶颈</strong>,则可以通过 perf 等性能分析工具来定位问题,例如 CPU 使用率过高、I/O 延迟等。</li>
|
|||
|
</ul>
|
|||
|
<h3 id="内核性能调优">内核性能调优<a aria-hidden="true" tabindex="-1" href="#内核性能调优" class="internal"> §</a></h3>
|
|||
|
<p>为了优化系统的整体性能,内核性能调优是一个不可或缺的步骤。这包括但不限于调整内核参数、优化调度策略、调整文件系统和网络配置等。</p>
|
|||
|
<ul>
|
|||
|
<li>使用 <code>sysctl</code> 工具可以动态地调整内核参数,无需重启系统。</li>
|
|||
|
<li><code>tuned</code> 工具提供了一套预定义的性能调优方案,适用于不同的使用场景。</li>
|
|||
|
<li>对于 NUMA(非一致性内存访问)系统,<code>numactl</code> 工具可以帮助优化内存使用,提高系统性能。</li>
|
|||
|
</ul>
|
|||
|
<h2 id="linux-内核错误处理与日志分析">Linux 内核错误处理与日志分析<a aria-hidden="true" tabindex="-1" href="#linux-内核错误处理与日志分析" class="internal"> §</a></h2>
|
|||
|
<h3 id="内核错误类型">内核错误类型<a aria-hidden="true" tabindex="-1" href="#内核错误类型" class="internal"> §</a></h3>
|
|||
|
<p>Linux 内核在运行时可能会遭遇多种类型的错误,这些错误可能由不同的因素引起,具体包括:</p>
|
|||
|
<ul>
|
|||
|
<li><strong>硬件错误</strong>:这类错误通常由硬件故障引起,如内存条损坏、硬盘故障或其他 I/O 设备问题。硬件错误往往需要通过更换损坏的硬件部件来解决。</li>
|
|||
|
<li><strong>软件错误</strong>:涵盖了程序逻辑错误、内存泄露、竞态条件等软件缺陷。这些错误通常需要通过分析日志、使用调试工具或静态代码分析来定位和修复。</li>
|
|||
|
<li><strong>配置错误</strong>:错误的系统配置或参数设置可能导致服务不可用或系统行为异常。解决这类问题通常需要检查和调整配置文件或系统设置。</li>
|
|||
|
<li><strong>安全相关错误</strong>:这类错误可能由安全漏洞引起,或是系统遭受恶意攻击的结果。处理方法包括应用安全补丁、增强系统安全设置等。</li>
|
|||
|
</ul>
|
|||
|
<h3 id="内核错误处理方法">内核错误处理方法<a aria-hidden="true" tabindex="-1" href="#内核错误处理方法" class="internal"> §</a></h3>
|
|||
|
<p>针对不同类型的内核错误,可以采用以下方法进行处理:</p>
|
|||
|
<ul>
|
|||
|
<li><strong>系统日志分析</strong>:系统日志文件是诊断问题的宝贵资源。分析日志文件,如 <code>/var/log/messages</code> 和 <code>/var/log/syslog</code>,可以帮助定位错误原因。</li>
|
|||
|
<li><strong>使用内核崩溃转储工具</strong>:kdump 等工具在系统崩溃时捕获内核的内存映像,这对后续的问题分析非常有用。</li>
|
|||
|
<li><strong>利用调试器</strong>:对于软件开发者来说,GDB 等调试器是查找软件错误的有力工具,能够逐步跟踪程序执行过程,定位问题代码。</li>
|
|||
|
<li><strong>更新和修补</strong>:定期更新系统和应用程序,及时应用安全补丁,是预防软件缺陷和安全漏洞的有效方法。</li>
|
|||
|
</ul>
|
|||
|
<h3 id="linux-内核日志系统">Linux 内核日志系统<a aria-hidden="true" tabindex="-1" href="#linux-内核日志系统" class="internal"> §</a></h3>
|
|||
|
<p>Linux 拥有一个全面的日志系统,能够记录系统的运行状况和各种事件,对于错误诊断和性能分析至关重要。</p>
|
|||
|
<ul>
|
|||
|
<li>主要的日志文件存放在 <code>/var/log/</code> 目录下,如 <code>/var/log/messages</code> 用于记录系统消息,<code>/var/log/syslog</code> 记录广泛的系统信息。</li>
|
|||
|
<li><code>dmesg</code> 命令显示内核环形缓冲区的消息,特别适用于分析启动问题和设备驱动错误。</li>
|
|||
|
</ul>
|
|||
|
<h3 id="日志分析工具介绍">日志分析工具介绍<a aria-hidden="true" tabindex="-1" href="#日志分析工具介绍" class="internal"> §</a></h3>
|
|||
|
<p>有效的日志管理和分析对于快速定位和解决问题非常重要。以下工具可以帮助简化这一过程:</p>
|
|||
|
<ul>
|
|||
|
<li><strong>logwatch</strong>:它自动解析 <code>/var/log/</code> 目录下的日志文件,并生成易于阅读的摘要报告,帮助快速识别常见问题。</li>
|
|||
|
<li><strong>rsyslog</strong>:这是一个高性能的日志处理系统,支持日志的收集、过滤、解析和转发。它可以配置为处理大量日志数据,非常适合大型系统环境。</li>
|
|||
|
<li><strong>journalctl</strong>:作为 systemd 的一部分,journalctl 允许用户查询和显示 systemd 日志消息。它提供了灵活的查询选项,如按时间、服务或优先级过滤日志。</li>
|
|||
|
</ul>
|
|||
|
<h2 id="linux-内核更新与升级">Linux 内核更新与升级<a aria-hidden="true" tabindex="-1" href="#linux-内核更新与升级" class="internal"> §</a></h2>
|
|||
|
<h3 id="linux-内核更新方式">Linux 内核更新方式<a aria-hidden="true" tabindex="-1" href="#linux-内核更新方式" class="internal"> §</a></h3>
|
|||
|
<p>Linux 内核的更新可以通过多种方式进行,每种方式各有利弊,适用于不同的场景和需求。</p>
|
|||
|
<ul>
|
|||
|
<li><strong>包管理器</strong>:这是最常见且推荐的更新方式,因为它简单易行,且能够自动处理依赖关系和配置。不同的 Linux 发行版使用不同的包管理器,如 Debian 及其衍生版使用 <code>apt</code>,Red Hat 及其衍生版使用 <code>yum</code> 或 <code>dnf</code>。</li>
|
|||
|
<li><strong>手动编译安装</strong>:对于需要特殊配置或想要使用最新内核的用户,手动编译安装是一种可行的选择。这种方式允许用户自定义配置,优化内核以适应特定的需求或硬件。然而,这也要求用户具备一定的技术知识。</li>
|
|||
|
<li><strong>发行版升级</strong>:当新的 Linux 发行版发布时,它通常会包含更新的内核版本。通过升级到最新的发行版,用户不仅能够更新内核,还能享受到最新的系统功能和应用更新。</li>
|
|||
|
</ul>
|
|||
|
<h3 id="内核更新的风险和注意事项">内核更新的风险和注意事项<a aria-hidden="true" tabindex="-1" href="#内核更新的风险和注意事项" class="internal"> §</a></h3>
|
|||
|
<p>更新 Linux 内核时,需要注意以下几个方面,以避免可能出现的问题:</p>
|
|||
|
<ul>
|
|||
|
<li><strong>兼容性问题</strong>:新版本的内核可能会引入与现有硬件或软件配置不兼容的变更,因此在更新前应该仔细检查兼容性。</li>
|
|||
|
<li><strong>配置更新</strong>:新内核可能需要更新或调整配置文件,特别是当添加新功能或废弃旧功能时。</li>
|
|||
|
<li><strong>备份</strong>:更新前应该备份重要数据和系统配置,以便在更新失败或出现问题时能够快速恢复。</li>
|
|||
|
</ul>
|
|||
|
<h3 id="linux-内核版本迁移">Linux 内核版本迁移<a aria-hidden="true" tabindex="-1" href="#linux-内核版本迁移" class="internal"> §</a></h3>
|
|||
|
<p>内核版本迁移是一个复杂但必要的过程,尤其当新版本提供了重要的性能改进、安全补丁或新功能时。迁移过程需要细致的规划和执行,以确保系统的平稳过渡。</p>
|
|||
|
<ol>
|
|||
|
<li><strong>评估和计划</strong>:首先需要评估新内核版本的特性、改进点及其对现有系统的潜在影响。这包括兼容性测试、性能预期以及新功能的适用性评估。基于这些信息,制定详细的迁移计划,包括回滚策略以应对可能的故障。</li>
|
|||
|
<li><strong>测试</strong>:在更新生产系统之前,应在测试环境中进行充分的测试。这包括安装新内核、运行系统和应用程序的基准测试、验证硬件兼容性以及测试新功能。测试应尽可能覆盖所有使用场景,确保新内核不会引入新的问题。</li>
|
|||
|
<li><strong>实施</strong>:在测试确保新内核稳定运行后,可以开始在生产环境中实施升级。建议在系统负载较低的时段进行升级,并确保有充分的时间监控系统运行状态,以便及时发现并解决可能出现的问题。</li>
|
|||
|
<li><strong>监控</strong>:内核升级后,需要密切监控系统的性能和稳定性,包括但不限于系统日志、性能指标和用户反馈。任何异常都应立即分析和处理。此外,也应该评估新内核带来的改进是否符合预期,以及是否有必要进行进一步的优化。</li>
|
|||
|
</ol>
|
|||
|
<h3 id="内核升级实例解析">内核升级实例解析<a aria-hidden="true" tabindex="-1" href="#内核升级实例解析" class="internal"> §</a></h3>
|
|||
|
<p>以下是一个假设场景,展示了在一台运行老版本 Linux 内核的服务器上进行内核升级的过程:</p>
|
|||
|
<ol>
|
|||
|
<li><strong>准备阶段</strong>:确保已经对系统进行了全面备份,包括重要数据和配置文件。检查新内核版本的发布说明,了解新特性和已知问题,评估这些变更对现有系统的影响。</li>
|
|||
|
<li><strong>下载新内核</strong>:可以通过官方网站下载最新的内核源代码,或者通过系统的包管理器查找可用的内核更新包。</li>
|
|||
|
<li><strong>安装新内核</strong>:
|
|||
|
<ul>
|
|||
|
<li><strong>通过包管理器</strong>:使用命令(如 <code>apt-get install linux-image-x.x.x</code>)安装新的内核包,这通常是最简单且风险最低的方法。</li>
|
|||
|
<li><strong>手动编译安装</strong>:如果从源代码安装,需要解压下载的内核源码,然后使用 <code>make menuconfig</code> 配置内核选项,接着编译和安装内核。</li>
|
|||
|
</ul>
|
|||
|
</li>
|
|||
|
<li><strong>更新引导加载器</strong>:安装完新内核后,需要确保引导加载器(如 GRUB)已更新,以包含新内核的启动项。这通常在安装过程中自动完成,但有时可能需要手动配置。</li>
|
|||
|
<li><strong>重启并测试</strong>:重启服务器,并在启动时选择新内核。系统启动后,进行详尽的测试,验证系统和应用的稳定性与性能。测试应包括常规操作和压力测试,以确保新内核的可靠性。</li>
|
|||
|
<li><strong>监控和调整</strong>:在接下来的日子里,继续监控系统日志和性能指标。根据需要调整系统配置,优化性能。如果遇到任何问题,根据事先制定的回滚计划进行处理,必要时恢复到旧版本的内核。</li>
|
|||
|
</ol>
|
|||
|
<h3 id="对于基于-debian-的系统如-ubuntu">对于基于 Debian 的系统(如 Ubuntu)<a aria-hidden="true" tabindex="-1" href="#对于基于-debian-的系统如-ubuntu" class="internal"> §</a></h3>
|
|||
|
<p>Debian 及其衍生系统使用 APT 作为包管理器。你可以按照以下步骤来检索和安装指定的内核版本:</p>
|
|||
|
<ol>
|
|||
|
<li>
|
|||
|
<p><strong>更新包索引</strong>:</p>
|
|||
|
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-function);">sudo</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">apt</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">update</span></span></code></pre></div>
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
<p><strong>搜索可用的内核版本</strong>:</p>
|
|||
|
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-function);">apt</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">search</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">linux-image</span></span></code></pre></div>
|
|||
|
<p>这将列出所有可用的 Linux 内核包。你可以通过更精确的关键词(例如,<code>linux-image-5</code>)来缩小搜索范围。</p>
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
<p><strong>安装指定的内核版本</strong>: 找到你想要安装的内核版本后,使用以下命令进行安装:</p>
|
|||
|
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-function);">sudo</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">apt</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">install</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">linux-image-your-version-here</span></span></code></pre></div>
|
|||
|
<p>请将 <code>linux-image-your-version-here</code> 替换为你选择的内核版本,例如 <code>linux-image-5.4.0-42-generic</code>。</p>
|
|||
|
</li>
|
|||
|
</ol>
|
|||
|
<h3 id="对于基于-rpm-的系统如-fedoracentos">对于基于 RPM 的系统(如 Fedora、CentOS)<a aria-hidden="true" tabindex="-1" href="#对于基于-rpm-的系统如-fedoracentos" class="internal"> §</a></h3>
|
|||
|
<p>Fedora、CentOS 及其衍生系统通常使用 <code>yum</code>(CentOS 7 及之前版本)或 <code>dnf</code>(Fedora 和 CentOS 8 及之后版本)作为包管理器。</p>
|
|||
|
<ol>
|
|||
|
<li>
|
|||
|
<p><strong>更新包索引</strong>(对于使用 dnf 的系统):</p>
|
|||
|
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-function);">sudo</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">dnf</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">check-update</span></span></code></pre></div>
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
<p><strong>搜索可用的内核版本</strong>(以 dnf 为例):</p>
|
|||
|
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-function);">dnf</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">search</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">kernel</span></span></code></pre></div>
|
|||
|
<p>这将列出所有可用的内核包。类似地,你可以使用更具体的搜索词来过滤结果。</p>
|
|||
|
</li>
|
|||
|
<li>
|
|||
|
<p><strong>安装指定的内核版本</strong>: 找到想要安装的内核版本后,使用以下命令进行安装(以 dnf 为例):</p>
|
|||
|
<div data-rehype-pretty-code-fragment><pre style="background-color:var(--shiki-color-background);" tabindex="0" data-language="shell" data-theme="default"><code data-language="shell" data-theme="default"><span data-line><span style="color:var(--shiki-token-function);">sudo</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">dnf</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">install</span><span style="color:var(--shiki-color-text);"> </span><span style="color:var(--shiki-token-string);">kernel-your-version-here</span></span></code></pre></div>
|
|||
|
<p>将 <code>kernel-your-version-here</code> 替换为你的目标内核版本,例如 <code>kernel-5.8.15-301.fc33</code>。</p>
|
|||
|
</li>
|
|||
|
</ol>
|
|||
|
<h3 id="注意事项">注意事项<a aria-hidden="true" tabindex="-1" href="#注意事项" class="internal"> §</a></h3>
|
|||
|
<ul>
|
|||
|
<li><strong>依赖性</strong>:安装新内核时,包管理器会自动处理所有必要的依赖性。</li>
|
|||
|
<li><strong>引导加载器</strong>:安装新内核后,大多数 Linux 发行版会自动更新引导加载器(如 GRUB)。重启系统后,你可能需要在启动菜单中选择新安装的内核版本。</li>
|
|||
|
<li><strong>备份</strong>:在进行任何重要系统更改之前,包括内核更新,强烈建议备份重要数据和系统配置。</li>
|
|||
|
</ul>
|
|||
|
<h2 id="linux-内核安全管理">Linux 内核安全管理<a aria-hidden="true" tabindex="-1" href="#linux-内核安全管理" class="internal"> §</a></h2>
|
|||
|
<h3 id="内核漏洞概述">内核漏洞概述<a aria-hidden="true" tabindex="-1" href="#内核漏洞概述" class="internal"> §</a></h3>
|
|||
|
<p>内核漏洞通常是由于内核开发和维护过程中的错误或疏忽造成的。这些漏洞可能存在于内核的任何组件中,包括网络堆栈、文件系统、设备驱动程序等。一旦被发现和利用,它们就可能成为系统安全的致命弱点。</p>
|
|||
|
<h3 id="内核安全补丁管理">内核安全补丁管理<a aria-hidden="true" tabindex="-1" href="#内核安全补丁管理" class="internal"> §</a></h3>
|
|||
|
<p>有效的安全补丁管理策略对于防御已知的内核漏洞至关重要:</p>
|
|||
|
<ul>
|
|||
|
<li><strong>订阅安全通知</strong>:关注和订阅 Linux 内核和所使用发行版的安全通知服务,是及时了解和响应新发现漏洞的前提。</li>
|
|||
|
<li><strong>定期更新内核</strong>:利用包管理器定期更新内核,以确保所有已知的安全漏洞都被及时修补。大多数 Linux 发行版都提供了方便的更新机制,自动化这一过程。</li>
|
|||
|
<li><strong>自定义补丁</strong>:在一些特殊场景下,可能需要根据具体的需求和环境开发自定义的安全补丁。这通常需要较高的专业知识和充分的安全评估。</li>
|
|||
|
</ul>
|
|||
|
<h3 id="内核安全加固方式">内核安全加固方式<a aria-hidden="true" tabindex="-1" href="#内核安全加固方式" class="internal"> §</a></h3>
|
|||
|
<p>加固 Linux 内核是通过一系列措施提高系统抵御未知攻击的能力。这些措施包括但不限于:</p>
|
|||
|
<ul>
|
|||
|
<li><strong>配置安全模块</strong>:启用并配置 SELinux、AppArmor 等安全模块,以实现强制访问控制(MAC),限制应用程序和服务的权限,从而减少潜在的攻击面。</li>
|
|||
|
<li><strong>最小化内核</strong>:通过移除不必要的内核模块和服务,可以显著减少系统的攻击面。这要求管理员根据系统的实际用途进行精细化配置。</li>
|
|||
|
<li><strong>使用命名空间和 cgroups</strong>:利用 Linux 的命名空间和控制组(cgroups)功能,可以有效隔离不同进程的资源和视图,增强系统的安全隔离性。</li>
|
|||
|
</ul>
|
|||
|
<h3 id="内核安全监控技术">内核安全监控技术<a aria-hidden="true" tabindex="-1" href="#内核安全监控技术" class="internal"> §</a></h3>
|
|||
|
<p>持续的安全监控是及时发现并应对安全威胁的关键:</p>
|
|||
|
<ul>
|
|||
|
<li><strong>审计日志</strong>:配置 Linux 审计框架(auditd),监控关键文件、系统调用等敏感活动。审计日志是事后分析和取证的重要资料。</li>
|
|||
|
<li><strong>实时监控</strong>:工具如 Sysdig 和 Falco 能够提供实时的系统监控能力,检测异常行为和潜在的安全威胁。这些工具通过分析系统调用和网络活动来实现。</li>
|
|||
|
<li><strong>漏洞扫描和评估</strong>:定期使用漏洞扫描工具,如 OpenVAS、Nessus 等,对系统进行安全评估。这有助于识别系统中仍未修补的漏洞,并促进及时的漏洞修复。</li>
|
|||
|
</ul>
|
|||
|
<h2 id="linux-内核性能优化">Linux 内核性能优化<a aria-hidden="true" tabindex="-1" href="#linux-内核性能优化" class="internal"> §</a></h2>
|
|||
|
<h3 id="性能优化概述">性能优化概述<a aria-hidden="true" tabindex="-1" href="#性能优化概述" class="internal"> §</a></h3>
|
|||
|
<p>性能优化的主要目标是减少系统的响应时间,提高处理速度和吞吐量,并确保资源被高效利用。这意味着需要在多个层面进行考虑和调整,包括但不限于 CPU 利用率的优化、内存管理的改进、文件系统性能的提升以及网络传输效率的增加。</p>
|
|||
|
<h3 id="内核性能分析工具">内核性能分析工具<a aria-hidden="true" tabindex="-1" href="#内核性能分析工具" class="internal"> §</a></h3>
|
|||
|
<p>要有效地进行性能优化,首先需要准确地诊断和分析当前的性能状况。这里介绍的工具是这一过程中的关键:</p>
|
|||
|
<ul>
|
|||
|
<li><strong>perf</strong>:提供了丰富的性能分析功能,包括 CPU 使用情况、系统调用追踪等,是 Linux 性能分析的主力工具。</li>
|
|||
|
<li><strong>vmstat</strong>、<strong>iostat</strong>、<strong>mpstat</strong>:这些工具可以提供实时的系统性能数据,帮助识别内存、I/O 和 CPU 性能瓶颈。</li>
|
|||
|
<li><strong>sysctl</strong>:通过动态调整内核参数,管理员可以根据实际的性能分析结果,对系统进行实时优化。</li>
|
|||
|
<li><strong>htop</strong>:相比于传统的 top 工具,htop 提供了更为直观的界面和更多的信息,帮助快速定位性能问题。</li>
|
|||
|
</ul>
|
|||
|
<h3 id="内核性能调优方法">内核性能调优方法<a aria-hidden="true" tabindex="-1" href="#内核性能调优方法" class="internal"> §</a></h3>
|
|||
|
<p>根据性能分析的结果,可以采取以下一些常见的调优方法来提升系统性能:</p>
|
|||
|
<ul>
|
|||
|
<li><strong>调整内核参数</strong>:修改 <code>/etc/sysctl.conf</code> 文件中的参数,如网络堆栈的大小、文件系统的缓冲区大小等,以满足特定应用的需求。</li>
|
|||
|
<li><strong>优化调度策略</strong>:根据系统的负载特性选择合适的 CPU 调度策略,比如对于 I/O 密集型的应用,选择 Deadline 调度器可能更合适。</li>
|
|||
|
<li><strong>内存管理优化</strong>:通过优化内存分配策略和回收机制,减少内存的碎片和泄漏,提高内存使用效率。</li>
|
|||
|
<li><strong>文件系统选择和调整</strong>:根据应用特性选择最合适的文件系统,并通过调整挂载选项来优化性能。</li>
|
|||
|
</ul>
|
|||
|
<h3 id="linux-内核性能优化实例">Linux 内核性能优化实例<a aria-hidden="true" tabindex="-1" href="#linux-内核性能优化实例" class="internal"> §</a></h3>
|
|||
|
<p>假设我们要优化一个高负载的 Web 服务器,首先使用 <code>perf</code> 和 <code>iostat</code> 工具来分析 CPU 和 I/O 性能瓶颈。根据分析结果,发现 I/O 等待时间较长,可能是磁盘操作造成的性能瓶颈。</p>
|
|||
|
<p>为了解决这个问题,我们可以:</p>
|
|||
|
<ol>
|
|||
|
<li><strong>使用 perf 和 iostat 分析性能</strong>:首先识别出性能瓶颈,比如 CPU 使用率过高或磁盘 I/O 等待时间过长。</li>
|
|||
|
<li><strong>调整 I/O 调度器</strong>:如果发现磁盘 I/O 是性能瓶颈,可以考虑将 I/O 调度器从默认的 CFQ(完全公平队列)更改为 Deadline 或 Noop。这两种调度器可以减少请求的延迟,特别适用于 SSD 或高性能存储系统。</li>
|
|||
|
<li><strong>增加内存缓存</strong>:对于频繁访问的数据,增加内存缓存可以减少对物理磁盘的访问次数,从而降低 I/O 等待时间。可以通过调整 <code>vm.dirty_ratio</code> 和 <code>vm.dirty_background_ratio</code> 这类 sysctl 参数来优化内存中的写缓存行为。</li>
|
|||
|
<li><strong>优化数据库查询</strong>:在高负载的 Web 服务器中,数据库查询往往是性能瓶颈之一。优化查询语句,减少不必要的数据访问,使用索引来加快查询速度,都是提升数据库性能的有效方法。</li>
|
|||
|
<li><strong>采用 SSD</strong>:如果预算允许,使用 SSD 替换传统的机械硬盘是提高 I/O 性能的直接方法。SSD 提供了更低的读写延迟和更高的吞吐量,尤其对于 I/O 密集型的应用来说,性能提升显著。</li>
|
|||
|
<li><strong>网络性能调优</strong>:对于 Web 服务器而言,网络带宽和延迟同样关键。可以通过调整 TCP 堆栈的相关参数(如增大 TCP 窗口大小、启用 TCP 快速打开等)来优化网络传输效率。</li>
|
|||
|
<li><strong>监控和迭代</strong>:优化是一个持续的过程,通过监控工具(如 Nagios、Prometheus 等)持续跟踪系统的性能指标,根据实时数据进一步调整和优化。</li>
|
|||
|
</ol></article></div><div class="right sidebar"><div class="graph "><h3>Graph View</h3><div class="graph-outer"><div id="graph-container" data-cfg="{"drag":true,"zoom":true,"depth":1,"scale":1.1,"repelForce":0.5,"centerForce":0.3,"linkDistance":30,"fontSize":0.6,"opacityScale":1,"showTags":true,"removeTags":[]}"></div><svg version="1.1" id="global-graph-icon" xmlns="http://www.w3.org/2000/svg" xmlnsXlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 55 55" fill="currentColor" xmlSpace="preserve"><path d="M49,0c-3.309,0-6,2.691-6,6c0,1.035,0.263,2.009,0.726,2.86l-9.829,9.829C32.542,17.634,30.846,17,29,17
|
|||
|
s-3.542,0.634-4.898,1.688l-7.669-7.669C16.785,10.424,17,9.74,17,9c0-2.206-1.794-4-4-4S9,6.794,9,9s1.794,4,4,4
|
|||
|
c0.74,0,1.424-0.215,2.019-0.567l7.669,7.669C21.634,21.458,21,23.154,21,25s0.634,3.542,1.688,4.897L10.024,42.562
|
|||
|
C8.958,41.595,7.549,41,6,41c-3.309,0-6,2.691-6,6s2.691,6,6,6s6-2.691,6-6c0-1.035-0.263-2.009-0.726-2.86l12.829-12.829
|
|||
|
c1.106,0.86,2.44,1.436,3.898,1.619v10.16c-2.833,0.478-5,2.942-5,5.91c0,3.309,2.691,6,6,6s6-2.691,6-6c0-2.967-2.167-5.431-5-5.91
|
|||
|
v-10.16c1.458-0.183,2.792-0.759,3.898-1.619l7.669,7.669C41.215,39.576,41,40.26,41,41c0,2.206,1.794,4,4,4s4-1.794,4-4
|
|||
|
s-1.794-4-4-4c-0.74,0-1.424,0.215-2.019,0.567l-7.669-7.669C36.366,28.542,37,26.846,37,25s-0.634-3.542-1.688-4.897l9.665-9.665
|
|||
|
C46.042,11.405,47.451,12,49,12c3.309,0,6-2.691,6-6S52.309,0,49,0z M11,9c0-1.103,0.897-2,2-2s2,0.897,2,2s-0.897,2-2,2
|
|||
|
S11,10.103,11,9z M6,51c-2.206,0-4-1.794-4-4s1.794-4,4-4s4,1.794,4,4S8.206,51,6,51z M33,49c0,2.206-1.794,4-4,4s-4-1.794-4-4
|
|||
|
s1.794-4,4-4S33,46.794,33,49z M29,31c-3.309,0-6-2.691-6-6s2.691-6,6-6s6,2.691,6,6S32.309,31,29,31z M47,41c0,1.103-0.897,2-2,2
|
|||
|
s-2-0.897-2-2s0.897-2,2-2S47,39.897,47,41z M49,10c-2.206,0-4-1.794-4-4s1.794-4,4-4s4,1.794,4,4S51.206,10,49,10z"></path></svg></div><div id="global-graph-outer"><div id="global-graph-container" data-cfg="{"drag":true,"zoom":true,"depth":-1,"scale":0.9,"repelForce":0.5,"centerForce":0.3,"linkDistance":30,"fontSize":0.6,"opacityScale":1,"showTags":true,"removeTags":[]}"></div></div></div><div class="toc desktop-only"><button type="button" id="toc" class><h3>Table of Contents</h3><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="fold"><polyline points="6 9 12 15 18 9"></polyline></svg></button><div id="toc-content"><ul class="overflow"><li class="depth-0"><a href="#概述" data-for="概述">概述</a></li><li class="depth-1"><a href="#linux-内核" data-for="linux-内核">Linux 内核</a></li><li class="depth-1"><a href="#linux-内核发展历史" data-for="linux-内核发展历史">Linux 内核发展历史</a></li><li class="depth-1"><a href="#linux-内核版本管理" data-for="linux-内核版本管理">Linux 内核版本管理</a></li><li class="depth-1"><a href="#linux-内核架构" data-for="linux-内核架构">Linux 内核架构</a></li><li class="depth-0"><a href="#linux-内核编译与安装" data-for="linux-内核编译与安装">Linux 内核编译与安装</a></li><li class="depth-1"><a href="#准备工作" data-for="准备工作">准备工作</a></li><li class="depth-1"><a href="#选择内核版本" data-for="选择内核版本">选择内核版本</a></li><li class="depth-1"><a href="#解压和配置内核" data-for="解压和配置内核">解压和配置内核</a></li><li class="depth-1"><a href="#编译内核" data-for="编译内核">编译内核</a></li><li class="depth-1"><a href="#安装内核" data-for="安装内核">安装内核</a></li><li class="depth-1"><a href="#更新引导加载器" data-for="更新引导加载器">更新引导加载器</a></li><li class="depth-1"><a href="#重启并验证" data-for="重启并验证">重启并验证</a></li><li class="depth-0"><a href="#linux-内核模块管理" data-for="linux-内核模块管理">Linux 内核模块管理</a></li><li class="depth-1"><a href="#内核模块概述" data-for="内核模块概述">内核模块概述</a></li><li class="depth-1"><a href="#模块的加载和卸载" data-for="模块的加载和卸载">模块的加载和卸载</a></li><li class="depth-1"><a href="#模块参数管理" data-for="模块参数管理">模块参数管理</a></li><li class="depth-1"><a href="#模块依赖解决" data-for="模块依赖解决">模块依赖解决</a></li><li class="depth-0"><a href="#linux-内核调试技术" data-for="linux-内核调试技术">Linux 内核调试技术</a></li><li class="depth-1"><a href="#内核调试工具介绍" data-for="内核调试工具介绍">内核调试工具介绍</a></li><li class="depth-1"><a href="#内核调试方法" data-for="内核调试方法">内核调试方法</a></li><li class="depth-1"><a href="#常见内核调试问题" data-for="常见内核调试问题">常见内核调试问题</a></li><li class="depth-1"><a href="#内核性能调优" data-for="内核性能调优">内核性能调优</a></li><li class="depth-0"><a href="#linux-内核错误处理与日志分析" data-for="linux-内核错误处理与日志分析">Linux 内核错误处理与日志分析</a></li><li class="depth-1"><a href="#内核错误类型" data-for="内核错误类型">内核错误类型</a></li><li class="depth-1"><a href="#内核错误处理方法" data-for="内核错误处理方法">内核错误处理方法</a></li><li class="depth-1"><a href="#linux-内核日志系统" data-for="linux-内核日志系统">Linux 内核日志系统</a></li><li class="depth-1"><a href="#日志分析工具介绍" data-for="日志分析工具介绍">日志分析工具介绍</a></li><li class="depth-0"><a href="#linux-<2D><>
|
|||
|
function toggleCallout() {
|
|||
|
const outerBlock = this.parentElement;
|
|||
|
outerBlock.classList.toggle(`is-collapsed`);
|
|||
|
const collapsed = outerBlock.classList.contains(`is-collapsed`);
|
|||
|
const height = collapsed ? this.scrollHeight : outerBlock.scrollHeight;
|
|||
|
outerBlock.style.maxHeight = height + `px`;
|
|||
|
let current = outerBlock;
|
|||
|
let parent = outerBlock.parentElement;
|
|||
|
while (parent) {
|
|||
|
if (!parent.classList.contains(`callout`)) {
|
|||
|
return;
|
|||
|
}
|
|||
|
const collapsed2 = parent.classList.contains(`is-collapsed`);
|
|||
|
const height2 = collapsed2 ? parent.scrollHeight : parent.scrollHeight + current.scrollHeight;
|
|||
|
parent.style.maxHeight = height2 + `px`;
|
|||
|
current = parent;
|
|||
|
parent = parent.parentElement;
|
|||
|
}
|
|||
|
}
|
|||
|
function setupCallout() {
|
|||
|
const collapsible = document.getElementsByClassName(
|
|||
|
`callout is-collapsible`
|
|||
|
);
|
|||
|
for (const div of collapsible) {
|
|||
|
const title = div.firstElementChild;
|
|||
|
if (title) {
|
|||
|
title.removeEventListener(`click`, toggleCallout);
|
|||
|
title.addEventListener(`click`, toggleCallout);
|
|||
|
const collapsed = div.classList.contains(`is-collapsed`);
|
|||
|
const height = collapsed ? title.scrollHeight : div.scrollHeight;
|
|||
|
div.style.maxHeight = height + `px`;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
document.addEventListener(`nav`, setupCallout);
|
|||
|
window.addEventListener(`resize`, setupCallout);
|
|||
|
</script><script type="module">
|
|||
|
import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.esm.min.mjs';
|
|||
|
const darkMode = document.documentElement.getAttribute('saved-theme') === 'dark'
|
|||
|
mermaid.initialize({
|
|||
|
startOnLoad: false,
|
|||
|
securityLevel: 'loose',
|
|||
|
theme: darkMode ? 'dark' : 'default'
|
|||
|
});
|
|||
|
document.addEventListener('nav', async () => {
|
|||
|
await mermaid.run({
|
|||
|
querySelector: '.mermaid'
|
|||
|
})
|
|||
|
});
|
|||
|
</script><script src="https://cdn.jsdelivr.net/npm/katex@0.16.7/dist/contrib/copy-tex.min.js" type="application/javascript"></script><script src="../../../../postscript.js" type="module"></script></html>
|