CentOS 7升级内核的三种方式(yum/rpm/源码)
<div id="navContainer"><div id="mobile-nav">
<h1><span style="color: rgba(51, 153, 102, 1)">CentOS 7升级内核的三种方式(yum/rpm/源码)</span></h1>
</div>
</div>
<div class="row">
<div id="main-content" class="col s12 m12 l9">
<div id="artDetail">
<div class="card">
<div class="card-content article-info">
<div class="row tag-cate">
<div class="col s7">
<div class="article-tag">
<div class="reprint__author"><span class="reprint-meta" style="color: rgba(153, 51, 102, 1)"><span class="fas fa-user"> 原文作者: <span class="reprint-info"><span style="color: rgba(153, 51, 102, 1)">NesteaLin</span></span></span></span></div>
<div class="reprint__type"><span class="reprint-meta" style="color: rgba(153, 51, 102, 1)"><span class="fas fa-link"> 文章链接: <span class="reprint-info"><span style="color: rgba(153, 51, 102, 1)">https://nestealin.com/8bab8c2c/</span></span></span></span></div>
</div>
</div>
</div>
</div>
<hr class="clearfix">
<div class="card-content article-card-content">
<div id="articleContent">
<h2 id="toc-heading-1"><span style="color: rgba(153, 51, 102, 1)">背景</span></h2>
<p>在 CentOS 使用过程中,难免需要升级内核,但有时候因为源码编译依赖问题,不一定所有程序都支持最新内核版本,所以以下将介绍两种升级内核方式。</p>
<h3 id="toc-heading-2"><span style="color: rgba(153, 51, 102, 1)">注意事项</span></h3>
<blockquote>
<p>关于内核种类:</p>
<p><strong>kernel-ml</strong></p>
<p>kernel-ml 中的ml是英文【 mainline stable 】的缩写,elrepo-kernel中罗列出来的是最新的稳定主线版本。</p>
<p><strong>kernel-lt</strong></p>
<p>kernel-lt 中的lt是英文【 long term support 】的缩写,elrepo-kernel中罗列出来的长期支持版本。</p>
</blockquote>
<ol>
<li>ML 与 LT 两种内核类型版本可以共存</li>
<li>但每种类型内核只能存在一个版本
<ul>
<li>例如:
<ul>
<li>当系统已存在 LT 内核的 5.4.103 版本时,继续安装 LT 内核的 4.4.215 版本则会提示: <code>package kernel-lt-5.4.103-1.el7.elrepo.x86_64 (which is newer than kernel-lt-4.4.215-1.el7.elrepo.x86_64) is already installed</code></li>
</ul>
</li>
</ul>
</li>
</ol><hr>
<h1><span style="color: rgba(255, 102, 0, 1)">一、yum安装</span></h1>
<h2 id="toc-heading-3"><span style="color: rgba(51, 153, 102, 1)">升级至最新</span></h2>
<blockquote>
<p>centos7升级内核,3.1-> 4.4 (4.17.8)</p>
</blockquote>
<h3 id="toc-heading-4"><span style="color: rgba(51, 153, 102, 1)">导入仓库源</span></h3>
<div class="code-area">
<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
<span class="token function">rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm</span></span></code></pre>
</div>
<h3 id="toc-heading-5"><span style="color: rgba(51, 153, 102, 1)">查看可安装的软件包</span></h3>
<div class="code-area">
<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">yum --enablerepo<span class="token operator">=<span class="token string">"elrepo-kernel" list --showduplicates <span class="token operator">| <span class="token function">sort -r <span class="token operator">| <span class="token function">grep kernel-ml.x86_64</span></span></span></span></span></span></code></pre>
</div>
<h3 id="toc-heading-6"><span style="color: rgba(51, 153, 102, 1)">选择 ML 或 LT 版本安装</span></h3>
<div class="code-area">
<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token comment"># 安装 ML 版本
yum --enablerepo<span class="token operator">=elrepo-kernel <span class="token function">installkernel-ml-devel kernel-ml -y
<span class="token comment"># 安装 LT 版本,K8S全部选这个
yum --enablerepo<span class="token operator">=elrepo-kernel <span class="token function">install kernel-lt-devel kernel-lt -y</span></span></span></span></span></span></code></pre>
</div>
<h3 id="toc-heading-7"><span style="color: rgba(51, 153, 102, 1)">查看现有内核启动顺序</span></h3>
<div class="code-area">
<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">awk -F<span class="token punctuation">\' <span class="token string">'$1=="menuentry " {print $2}' /etc/grub2.cfg</span></span></span></code></pre>
</div>
<h3 id="toc-heading-8"><span style="color: rgba(51, 153, 102, 1)">修改默认启动项</span></h3>
<p>xxx 为序号数字,以指定启动列表中第x项为启动项,x从0开始计数</p>
<div class="code-area">
<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">grub2-set-default xxxx</code></pre>
</div>
<h4 id="toc-heading-9">例如设置以4.4内核启动</h4>
<p>则直接输入“grub2-set-default 0”,下次启动即可从4.4启动</p>
<div class="code-area">
<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token comment"># 查看内核启动序号
<span class="token punctuation"> <span class="token function">awk -F<span class="token punctuation">\' <span class="token string">'$1=="menuentry " {print $2}' /etc/grub2.cfg
CentOS Linux <span class="token punctuation">(<span class="token number">4.4.179-1.el7.elrepo.x86_64<span class="token punctuation">) <span class="token number">7 <span class="token punctuation">(Core<span class="token punctuation">)
CentOS Linux <span class="token punctuation">(<span class="token number">3.10.0-693.el7.x86_64<span class="token punctuation">) <span class="token number">7 <span class="token punctuation">(Core<span class="token punctuation">)
CentOS Linux <span class="token punctuation">(<span class="token number">0-rescue-6d4c599606814867814f1a8eec7bfd1e<span class="token punctuation">) <span class="token number">7 <span class="token punctuation">(Core<span class="token punctuation">)
<span class="token comment"># 设置启动序号
<span class="token punctuation"> grub2-set-default <span class="token number">0
<span class="token comment"># 重启
<span class="token function">reboot
<span class="token comment"># 检查内核版本
<span class="token function">uname -r</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
</div>
<hr>
<h1 id="toc-heading-10"><span style="color: rgba(255, 102, 0, 1)">二、安装指定内核版本rpm</span></h1>
<p><strong>本次以安装 LT 内核的 4.415 版本为例。</strong></p>
<h3 id="toc-heading-11"><span style="color: rgba(51, 153, 102, 1)">查找版本</span></h3>
<blockquote>
<p>因 ELRepo 源都是最新版本,所以旧版本内核只能手动下载。</p>
</blockquote>
<p><span style="color: rgba(153, 51, 102, 1)">查找 kernel rpm 历史版本:<span style="color: rgba(153, 51, 102, 1)">http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/</span></span></p>
<h3 id="toc-heading-12"><span style="color: rgba(51, 153, 102, 1)">下载内核 RPM</span></h3>
<blockquote>
<p>共需要下载三个类型 rpm</p>
</blockquote>
<div class="code-area">
<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">wget http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-devel-4.4.215-1.el7.elrepo.x86_64.rpm
<span class="token function">wget http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-headers-4.4.215-1.el7.elrepo.x86_64.rpm
<span class="token function">wget http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-4.4.215-1.el7.elrepo.x86_64.rpm</span></span></span></code></pre>
</div>
<h3 id="toc-heading-13"><span style="color: rgba(51, 153, 102, 1)">安装内核 </span></h3>
<div class="code-area">
<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">rpm -ivh kernel-lt-4.4.215-1.el7.elrepo.x86_64.rpm
<span class="token function">rpm -ivh kernel-lt-devel-4.4.215-1.el7.elrepo.x86_64.rpm</span></span></code></pre>
</div>
<h3 id="toc-heading-14"><span style="color: rgba(51, 153, 102, 1)">确认已安装内核版本</span></h3>
<div class="code-area">
<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token punctuation"><span class="token comment"># rpm -qa | grep kernel
kernel-headers-3.10.0-1160.15.2.el7.x86_64
kernel-devel-3.10.0-1160.49.1.el7.x86_64
kernel-tools-libs-3.10.0-957.el7.x86_64
kernel-3.10.0-957.el7.x86_64
kernel-ml-4.9.9-1.el7.elrepo.x86_64
kernel-lt-4.4.215-1.el7.elrepo.x86_64
kernel-tools-3.10.0-957.el7.x86_64
kernel-lt-devel-4.4.215-1.el7.elrepo.x86_64</span></span></span></code></pre>
</div>
<h3 id="toc-heading-15"><span style="color: rgba(51, 153, 102, 1)">设置启动</span></h3>
<div class="code-area">
<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token comment"># 查看启动顺序
<span class="token punctuation"><span class="token comment"># awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg
CentOS Linux <span class="token punctuation">(<span class="token number">4.4.215-1.el7.elrepo.x86_64<span class="token punctuation">) <span class="token number">7 <span class="token punctuation">(Core<span class="token punctuation">)
CentOS Linux <span class="token punctuation">(<span class="token number">4.9.9-1.el7.elrepo.x86_64<span class="token punctuation">) <span class="token number">7 <span class="token punctuation">(Core<span class="token punctuation">)
CentOS Linux <span class="token punctuation">(<span class="token number">3.10.0-957.el7.x86_64<span class="token punctuation">) <span class="token number">7 <span class="token punctuation">(Core<span class="token punctuation">)
CentOS Linux <span class="token punctuation">(<span class="token number">0-rescue-b91f945269084aa98e8257311ee713c5<span class="token punctuation">) <span class="token number">7 <span class="token punctuation">(Core<span class="token punctuation">)
<span class="token comment"># 设置启动顺序
<span class="token punctuation"><span class="token comment"># grub2-set-default 0
<span class="token comment"># 重启生效
<span class="token punctuation"><span class="token comment"># reboot</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
</div>
<hr>
<h1 id="toc-heading-16"><span style="color: rgba(255, 102, 0, 1)">三、源码安装</span></h1>
<h2 id="toc-heading-17"><span style="color: rgba(51, 153, 102, 1)">环境准备</span></h2>
<blockquote>
<p>CentOS 7 1804 最小化安装</p>
</blockquote>
<h2 id="toc-heading-18"><span style="color: rgba(51, 153, 102, 1)">安装核心软件包</span></h2>
<div class="code-area">
<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">yum <span class="token function">install -y gcc <span class="token function">make <span class="token function">git ctags ncurses-devel openssl-devel
yum <span class="token function">install -y bison flex elfutils-libelf-devel <span class="token function">bc</span></span></span></span></span></code></pre>
</div>
<h2 id="toc-heading-19"><span style="color: rgba(51, 153, 102, 1)">创建内核编译目录</span></h2>
<p>使用 <code>home</code> 下的 <code>kernelbuild</code> 目录</p>
<div class="code-area">
<div class="codecopy_notice"> </div>
<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">mkdir ~/kernelbuild</span></code></pre>
</div>
<h2 id="toc-heading-20"><span style="color: rgba(51, 153, 102, 1)">获取内核源码</span></h2>
<p><span style="color: rgba(153, 51, 102, 1)">清华大学镜像站:<span style="color: rgba(153, 51, 102, 1)">https://mirror.tuna.tsinghua.edu.cn/kernel/v4.x/?C=M&O=D</span></span></p>
<ul>
<li><code>linux-4.xx.xx.tar.xz</code></li>
<li><code>linux-4.xx.xx.tar.gz</code></li>
</ul>
<p>这两个格式都可以的,tar.xz压缩率更高,文件更小。</p>
<div class="code-area">
<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">wget https://mirror.tuna.tsinghua.edu.cn/kernel/v4.x/linux-4.17.11.tar.xz</span></code></pre>
</div>
<h2 id="toc-heading-21"><span style="color: rgba(51, 153, 102, 1)">解压内核代码</span></h2>
<p>将其解压后进入源码目录:</p>
<div class="code-area">
<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">tar -xvJf linux-4.17.11.tar.xz</span></code></pre>
</div>
<p>为确保内核树绝对干净,进入内核目录并执行 make mrproper 命令:</p>
<div class="code-area">
<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token builtin class-name">cd linux-4.17.11
<span class="token function">make clean <span class="token operator">&& <span class="token function">make mrproper</span></span></span></span></code></pre>
</div>
<h2 id="toc-heading-22"><span style="color: rgba(51, 153, 102, 1)">内核配置</span></h2>
<h4 id="toc-heading-23">复制当前的内核配置文件</h4>
<p><code>config-3.10.0-862.el7.x86_64</code>是我当前环境的内核配置文件,根据实际情况修改</p>
<div class="code-area">
<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">cp /boot/config-3.10.0-862.el7.x86_64 .config</span></code></pre>
</div>
<h4 id="toc-heading-24">高级配置</h4>
<blockquote>
<p>y 是启用, n 是禁用, m 是需要时启用.<br><code>make menuconfig</code>: 老的 ncurses 界面,被 nconfig 取代<br><code>make nconfig</code>: 新的命令行 ncurses 界面</p>
</blockquote>
<h2 id="toc-heading-25"><span style="color: rgba(51, 153, 102, 1)">编译和安装</span></h2>
<h4 id="toc-heading-26"><span style="color: rgba(51, 153, 102, 1)">编译内核</span></h4>
<div class="code-area">
<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">make -j x</span></code></pre>
</div>
<blockquote>
<p>如果你是四核的机器,x可以是8</p>
</blockquote>
<h4 id="toc-heading-27"><span style="color: rgba(51, 153, 102, 1)">安装内核</span></h4>
<blockquote>
<p><strong>Warning: 从这里开始,需要 root 权限执行命令,否则会失败.</strong></p>
</blockquote>
<p>编译完内核后安装:</p>
<div class="code-area">
<div class="codecopy_notice"> </div>
<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">make modules_install <span class="token function">install</span></span></code></pre>
</div>
<h3 id="toc-heading-28"><span style="color: rgba(51, 153, 102, 1)">设置启动</span></h3>
<div class="code-area">
<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token comment"># 查看启动顺序
<span class="token punctuation"><span class="token comment"># awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg
CentOS Linux <span class="token punctuation">(<span class="token number">4.17.11-1.el7.elrepo.x86_64<span class="token punctuation">) <span class="token number">7 <span class="token punctuation">(Core<span class="token punctuation">)
CentOS Linux <span class="token punctuation">(<span class="token number">4.9.9-1.el7.elrepo.x86_64<span class="token punctuation">) <span class="token number">7 <span class="token punctuation">(Core<span class="token punctuation">)
CentOS Linux <span class="token punctuation">(<span class="token number">3.10.0-957.el7.x86_64<span class="token punctuation">) <span class="token number">7 <span class="token punctuation">(Core<span class="token punctuation">)
CentOS Linux <span class="token punctuation">(<span class="token number">0-rescue-b91f945269084aa98e8257311ee713c5<span class="token punctuation">) <span class="token number">7 <span class="token punctuation">(Core<span class="token punctuation">)
<span class="token comment"># 设置启动顺序
<span class="token punctuation"><span class="token comment"># grub2-set-default 0
<span class="token comment"># 重启生效
<span class="token punctuation"><span class="token comment"># reboot</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
</div>
<hr>
<h1 id="toc-heading-29"><span style="color: rgba(255, 102, 0, 1)">四、卸载 / 降级 内核</span></h1>
<p>例如:</p>
<p>当系统已存在 LT 内核的 5.4.103 版本时,继续安装 LT 内核的 4.4.215 版本则会提示: <code>package kernel-lt-5.4.103-1.el7.elrepo.x86_64 (which is newer than kernel-lt-4.4.215-1.el7.elrepo.x86_64) is already installed</code></p>
<p>这时就需要进行内核降级,卸载最新版的内核。</p>
<h3 id="toc-heading-30"><span style="color: rgba(51, 153, 102, 1)">查看系统当前内核版本</span></h3>
<div class="code-area">
<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token punctuation"><span class="token comment"># uname -r
<span class="token number">5.4.103-1.el7.elrepo.x86_64</span></span></span></span></code></pre>
</div>
<h3 id="toc-heading-31"><span style="color: rgba(51, 153, 102, 1)">查看系统中全部内核</span></h3>
<div class="code-area">
<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token punctuation"><span class="token comment"># rpm -qa | grep kernel
kernel-headers-3.10.0-1160.15.2.el7.x86_64
kernel-devel-3.10.0-1160.49.1.el7.x86_64
kernel-tools-libs-3.10.0-957.el7.x86_64
kernel-3.10.0-957.el7.x86_64
kernel-ml-4.9.9-1.el7.elrepo.x86_64
kernel-lt-5.4.103-1.el7.elrepo.x86_64
kernel-tools-3.10.0-957.el7.x86_64
kernel-lt-devel-5.4.103-1.el7.elrepo.x86_64</span></span></span></code></pre>
</div>
<h3 id="toc-heading-32"><span style="color: rgba(51, 153, 102, 1)">删除指定内核</span></h3>
<blockquote>
<p>此处以删除 LT 内核的 5.4.103 版本为例</p>
<p><strong>注意:</strong>无法卸载当前在用的内核版本。</p>
</blockquote>
<div class="code-area">
<div class="codecopy_notice"> </div>
<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">yum remove -y kernel-lt-devel-5.4.103-1.el7.elrepo.x86_64
yum remove -y kernel-lt-5.4.103-1.el7.elrepo.x86_64</code></pre>
</div>
<blockquote>
<p>卸载完后不一定需要重启</p>
</blockquote>
<p>检查卸载后内核版本</p>
<div class="code-area">
<div class="codecopy_notice"> </div>
<pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token punctuation"><span class="token comment"># rpm -qa | grep kernel
kernel-headers-3.10.0-1160.15.2.el7.x86_64
kernel-devel-3.10.0-1160.49.1.el7.x86_64
kernel-tools-libs-3.10.0-957.el7.x86_64
kernel-3.10.0-957.el7.x86_64
kernel-ml-4.9.9-1.el7.elrepo.x86_64
kernel-tools-3.10.0-957.el7.x86_64</span></span></span></code></pre>
</div>
</div>
<hr>
<div id="reprint-statement" class="reprint">
<div class="reprint__author"> </div>
<div class="reprint__notice"><span class="reprint-meta"><span class="fas fa-copyright"> </span></span></div>
</div>
</div>
</div>
</div>
</div>
</div>
<div id="toast-container"> </div><br><br>
来源:https://www.cnblogs.com/haoee/p/16402200.html
頁:
[1]