<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>GRUB on 老刘博客</title>
    <link>https://www.iliu.org/tags/grub/</link>
    <description>Recent content in GRUB on 老刘博客</description>
    <image>
      <title>老刘博客</title>
      <url>https://www.iliu.org/img/liujinsuiyue.jpg</url>
      <link>https://www.iliu.org/img/liujinsuiyue.jpg</link>
    </image>
    <generator>Hugo -- 0.147.5</generator>
    <language>zh-cn</language>
    <lastBuildDate>Sun, 30 Nov 2025 10:00:00 +0800</lastBuildDate>
    <atom:link href="https://www.iliu.org/tags/grub/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>EndeavourOS &#43; Btrfs &#43; Snapper &#43; GRUB：完整的快照回滚系统配置指南</title>
      <link>https://www.iliu.org/endeavouros-snapper-grub-snapshot-rollback-guide/</link>
      <pubDate>Sun, 30 Nov 2025 10:00:00 +0800</pubDate>
      <guid>https://www.iliu.org/endeavouros-snapper-grub-snapshot-rollback-guide/</guid>
      <description>&lt;p&gt;EndeavourOS由于使用的是滚动更新，系统存在着滚挂的可能性（尽管我已经使用了1个多月也没有问题），所以快照回滚是一个必须的选项。本文将详细介绍如何在 EndeavourOS 系统中配置完整的快照回滚系统，让您在系统出现问题时能够轻松恢复到之前的状态。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>EndeavourOS由于使用的是滚动更新，系统存在着滚挂的可能性（尽管我已经使用了1个多月也没有问题），所以快照回滚是一个必须的选项。本文将详细介绍如何在 EndeavourOS 系统中配置完整的快照回滚系统，让您在系统出现问题时能够轻松恢复到之前的状态。</p>
<p><img loading="lazy" src="https://s2.l22.org/images/1764499404_endeavour-os-logo-on-a-purple-background-1.jpg"></p>
<h2 id="前言">前言</h2>
<p>为什么需要快照回滚系统？在日常使用中，我们难免会遇到以下情况：</p>
<ul>
<li>系统更新后出现兼容性问题</li>
<li>安装某个软件导致系统不稳定</li>
<li>配置文件修改错误导致系统无法启动</li>
<li>恶意软件或误操作破坏系统</li>
</ul>
<p>有了快照回滚功能，这些问题都可以通过简单的重启和菜单选择来解决。</p>
<h2 id="系统要求">系统要求</h2>
<p>在开始之前，请确保您的系统满足以下条件：</p>
<ol>
<li><strong>已安装 EndeavourOS</strong>（或基于 Arch 的其他发行版）</li>
<li><strong>使用 Btrfs 文件系统</strong>作为根分区</li>
<li><strong>安装时选择 GRUB 作为引导加载程序</strong></li>
</ol>
<h2 id="核心组件介绍">核心组件介绍</h2>
<p>我们的快照回滚系统将由以下几个核心组件构成：</p>
<table>
  <thead>
      <tr>
          <th>组件</th>
          <th>作用</th>
          <th>必要性</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>Snapper</strong></td>
          <td>快照管理核心程序，负责创建、删除和管理快照</td>
          <td>必需</td>
      </tr>
      <tr>
          <td><strong>snap-pac</strong></td>
          <td>在 pacman 操作时自动创建 pre/post 快照</td>
          <td>强烈推荐</td>
      </tr>
      <tr>
          <td><strong>grub-btrfs</strong></td>
          <td>将 Snapper 快照集成到 GRUB 启动菜单</td>
          <td>必需</td>
      </tr>
      <tr>
          <td><strong>inotify-tools</strong></td>
          <td>文件系统监控工具，确保 GRUB 菜单及时更新</td>
          <td>可选但推荐</td>
      </tr>
  </tbody>
</table>
<h2 id="安装步骤">安装步骤</h2>
<h3 id="步骤-1安装核心软件包">步骤 1：安装核心软件包</h3>
<p>打开终端，执行以下命令安装所需的软件包：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 安装 snapper, snap-pac 和 grub-btrfs</span>
</span></span><span class="line"><span class="cl">sudo pacman -S snapper snap-pac grub-btrfs
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>软件包说明：</strong></p>
<ul>
<li><code>snapper</code>：快照管理的核心程序，提供快照创建、删除、比较等功能</li>
<li><code>snap-pac</code>：自动化工具，在每次 pacman 操作时自动创建&quot;操作前&quot;和&quot;操作后&quot;快照</li>
<li><code>grub-btrfs</code>：GRUB 扩展模块，自动扫描 Snapper 快照并将其添加到启动菜单</li>
</ul>
<h3 id="步骤-2配置-snapper">步骤 2：配置 Snapper</h3>
<p>安装完成后，我们需要创建 Snapper 配置：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 创建根分区的 Snapper 配置</span>
</span></span><span class="line"><span class="cl">sudo snapper -c root create-config /
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 创建第一个手动快照作为基准</span>
</span></span><span class="line"><span class="cl">sudo snapper create --description <span class="s2">&#34;初始系统快照&#34;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="步骤-3启用-grub-集成服务">步骤 3：启用 GRUB 集成服务</h3>
<p><code>grub-btrfsd</code> 服务会监控快照变化并自动更新 GRUB 配置：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 启用并启动 grub-btrfs 守护进程</span>
</span></span><span class="line"><span class="cl">sudo systemctl <span class="nb">enable</span> --now grub-btrfsd.service
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="步骤-4生成初始-grub-配置">步骤 4：生成初始 GRUB 配置</h3>
<p>手动生成一次 GRUB 配置，确保现有快照出现在启动菜单中：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 重新生成 GRUB 配置文件</span>
</span></span><span class="line"><span class="cl">sudo grub-mkconfig -o /boot/grub/grub.cfg
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="验证配置">验证配置</h2>
<h3 id="检查服务状态">检查服务状态</h3>
<p>确认 <code>grub-btrfsd</code> 服务正常运行：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 查看服务状态</span>
</span></span><span class="line"><span class="cl">sudo systemctl status grub-btrfsd
</span></span></code></pre></td></tr></table>
</div>
</div><p>正常情况下，您应该看到类似以下的输出：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-gdscript3" data-lang="gdscript3"><span class="line"><span class="cl"><span class="err">●</span> <span class="n">grub</span><span class="o">-</span><span class="n">btrfsd</span><span class="o">.</span><span class="n">service</span> <span class="o">-</span> <span class="n">GRUB</span> <span class="n">Btrfs</span> <span class="n">snapshot</span> <span class="n">detection</span> <span class="n">daemon</span>
</span></span><span class="line"><span class="cl">   <span class="n">Loaded</span><span class="p">:</span> <span class="n">loaded</span> <span class="p">(</span><span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">systemd</span><span class="o">/</span><span class="n">system</span><span class="o">/</span><span class="n">grub</span><span class="o">-</span><span class="n">btrfsd</span><span class="o">.</span><span class="n">service</span><span class="p">;</span> <span class="n">enabled</span><span class="p">;</span> <span class="n">vendor</span> <span class="n">preset</span><span class="p">:</span> <span class="n">disabled</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">   <span class="n">Active</span><span class="p">:</span> <span class="n">active</span> <span class="p">(</span><span class="n">running</span><span class="p">)</span> <span class="n">since</span> <span class="o">...</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="查看快照列表">查看快照列表</h3>
<p>检查 Snapper 是否正常工作：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 列出所有快照</span>
</span></span><span class="line"><span class="cl">sudo snapper list
</span></span></code></pre></td></tr></table>
</div>
</div><p>您应该能看到包含刚才创建的&quot;初始系统快照&quot;的列表。</p>
<h3 id="测试自动快照功能">测试自动快照功能</h3>
<p>安装一个简单的软件包来测试自动快照功能：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 安装测试软件包</span>
</span></span><span class="line"><span class="cl">sudo pacman -S neofetch
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 查看是否自动创建了快照</span>
</span></span><span class="line"><span class="cl">sudo snapper list
</span></span></code></pre></td></tr></table>
</div>
</div><p>您应该能看到两个新的快照：一个在安装前（pre），一个在安装后（post）。</p>
<h2 id="故障排除">故障排除</h2>
<h3 id="问题-1grub-菜单中没有显示快照">问题 1：GRUB 菜单中没有显示快照</h3>
<p>如果重启后 GRUB 菜单中没有显示快照选项，可能是因为缺少 <code>inotify-tools</code>：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 安装 inotify-tools</span>
</span></span><span class="line"><span class="cl">sudo pacman -S inotify-tools
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 重启 grub-btrfsd 服务</span>
</span></span><span class="line"><span class="cl">sudo systemctl restart grub-btrfsd.service
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 重新生成 GRUB 配置</span>
</span></span><span class="line"><span class="cl">sudo grub-mkconfig -o /boot/grub/grub.cfg
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="问题-2服务启动失败">问题 2：服务启动失败</h3>
<p>如果 <code>grub-btrfsd</code> 服务启动失败，检查以下内容：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 检查服务日志</span>
</span></span><span class="line"><span class="cl">sudo journalctl -u grub-btrfsd.service -f
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 检查 Btrfs 子卷挂载情况</span>
</span></span><span class="line"><span class="cl">mount <span class="p">|</span> grep btrfs
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="问题-3快照无法启动">问题 3：快照无法启动</h3>
<p>如果快照在 GRUB 菜单中显示但无法启动，可能是由于以下原因：</p>
<ol>
<li><strong>内核版本不匹配</strong>：确保快照中的内核版本与当前系统兼容</li>
<li><strong>initramfs 问题</strong>：重新生成 initramfs 镜像</li>
<li><strong>子卷挂载问题</strong>：检查 <code>/etc/fstab</code> 配置</li>
</ol>
<h2 id="高级配置">高级配置</h2>
<h3 id="自定义快照保留策略">自定义快照保留策略</h3>
<p>编辑 Snapper 配置文件来自定义快照保留策略：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 编辑配置文件</span>
</span></span><span class="line"><span class="cl">sudo nano /etc/snapper/configs/root
</span></span></code></pre></td></tr></table>
</div>
</div><p>在文件中找到以下部分并根据自己的需求调整：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-ini" data-lang="ini"><span class="line"><span class="cl"><span class="c1"># 数量限制</span>
</span></span><span class="line"><span class="cl"><span class="na">TIMELINE_LIMIT_HOURLY</span><span class="o">=</span><span class="s">&#34;10&#34;</span>
</span></span><span class="line"><span class="cl"><span class="na">TIMELINE_LIMIT_DAILY</span><span class="o">=</span><span class="s">&#34;7&#34;</span>
</span></span><span class="line"><span class="cl"><span class="na">TIMELINE_LIMIT_WEEKLY</span><span class="o">=</span><span class="s">&#34;4&#34;</span>
</span></span><span class="line"><span class="cl"><span class="na">TIMELINE_LIMIT_MONTHLY</span><span class="o">=</span><span class="s">&#34;12&#34;</span>
</span></span><span class="line"><span class="cl"><span class="na">TIMELINE_LIMIT_YEARLY</span><span class="o">=</span><span class="s">&#34;0&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 清理算法</span>
</span></span><span class="line"><span class="cl"><span class="na">TIMELINE_CLEANUP</span><span class="o">=</span><span class="s">&#34;true&#34;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="配置定时快照">配置定时快照</h3>
<p>启用定时快照功能，系统会定期自动创建快照：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 启用 snapper-timeline.timer</span>
</span></span><span class="line"><span class="cl">sudo systemctl <span class="nb">enable</span> --now snapper-timeline.timer
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 启用 snapper-cleanup.timer</span>
</span></span><span class="line"><span class="cl">sudo systemctl <span class="nb">enable</span> --now snapper-cleanup.timer
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="使用指南">使用指南</h2>
<h3 id="创建手动快照">创建手动快照</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 创建描述性快照</span>
</span></span><span class="line"><span class="cl">sudo snapper create --description <span class="s2">&#34;安装显卡驱动前&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 创建带类型和描述的快照</span>
</span></span><span class="line"><span class="cl">sudo snapper create --type single --description <span class="s2">&#34;系统优化完成&#34;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="删除快照">删除快照</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 删除指定快照（替换 &lt;ID&gt; 为实际的快照编号）</span>
</span></span><span class="line"><span class="cl">sudo snapper delete &lt;ID&gt;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 删除多个快照</span>
</span></span><span class="line"><span class="cl">sudo snapper delete &lt;ID1&gt; &lt;ID2&gt; &lt;ID3&gt;
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="比较快照">比较快照</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 比较两个快照之间的差异</span>
</span></span><span class="line"><span class="cl">sudo snapper diff &lt;ID1&gt; &lt;ID2&gt;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 比较特定文件的变化</span>
</span></span><span class="line"><span class="cl">sudo snapper diff &lt;ID1&gt; &lt;ID2&gt; /etc/fstab
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="回滚到快照">回滚到快照</h3>
<ol>
<li>重启系统</li>
<li>在 GRUB 菜单中选择&quot;Snapper snapshots&quot;</li>
<li>选择要回滚的快照</li>
<li>按照屏幕提示完成回滚</li>
</ol>
]]></content:encoded>
    </item>
  </channel>
</rss>
