<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="/feeds/rss-style.xsl" type="text/xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>皮皮的皮</title>
        <link>https://blog.ppixiu.com/</link>
        <description></description>
        <lastBuildDate>Wed, 04 Feb 2026 08:39:22 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>Astro-Theme-Retypeset with Feed for Node.js</generator>
        <language>zh</language>
        <copyright>Copyright © 2026 皮皮</copyright>
        <atom:link href="https://blog.ppixiu.com/rss.xml" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[服务器安全指南]]></title>
            <link>https://blog.ppixiu.com/posts/fuwuqi-anquan-zhinan/</link>
            <guid isPermaLink="false">https://blog.ppixiu.com/posts/fuwuqi-anquan-zhinan/</guid>
            <pubDate>Wed, 04 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Linux 服务器安全配置全攻略：详解 SSH 安全策略（公钥认证、Endlessh、Fwknop）、Iptables 防火墙高级应用（自定义链、DOCKER-USER 链配置、ipset 黑名单）及 Web 防火墙（WAF）选型。适合 VPS 运维与开发人员参考的实战安全指南。]]></description>
            <content:encoded><![CDATA[<p>最近飞牛 OS 跟群晖 NAS 都爆出了很严重的安全漏洞，虽然我的服务器没用这两个系统并且配置了防火墙只开启必要的端口访问没有受到波及，但有台处于公网下的 VPS 服务器的安全问题还是需要重视，整理了一下服务器的一些安全配置。</p>
<h2>SSH 登录防护</h2>
<p>鉴于当下网络扫描及其严重的情况，”仅密钥验证登录 + 改用非默认端口“是必须的，我之前在腾讯云、阿里云服务器上做过测试，开放默认 22 端口，开放当天就有差不多 2 万次 ssh 用户名 + 密码暴力登录！</p>
<p>生成密钥对方法很简单，服务器一般都带了这个工具：</p>
<pre><code>ssh-keygen -t ed25519 -C "备注" -f xxx/key_ed25519_xxx

# 会在 xxx目录下生成两个文件：key_ed25519_xxx(私钥)和key_ed25519_xxx.pub(公钥)
</code></pre>
<p>生成后将公钥内容复制粘贴到需要 ssh 密钥登录用户的 <code>~/.ssh/authorized_keys</code>​ 文件中，一行一个公钥。将私钥复制内容粘贴到本地用户目录 <code>~/.ssh/key_ed25519_xxx</code>​ 文件中。然后编辑或新建本地用户 <code>~/.ssh/config</code> 文件，写入如下内容：</p>
<pre><code>Host server-xxx # host别名自己编一个别重复，登录时使用 ssh server-xxx 即可登录对应服务器
    HostName xxx # 服务器ip/域名
    User xxx # 登录用户名
    Port 2222 # 登录端口
    IdentityFile xxx # 私钥认证文件路径，比如 C:\Users\xxx\.ssh\key_ed25519_xxx
    ServerAliveInterval 30 # 保活周期 30s
    ServerAliveCountMax 30 # 心跳包发送30次服务端没回应则断开连接
</code></pre>
<p>ssh 服务器配置文件路径是 <code>/etc/ssh/ssd_config</code>​ 文件和 <code>/etc/ssh/sshd_config.d/</code>​ 目录下 <code>.conf</code>​ 后缀文件。修改配置推荐在 <code>/etc/ssh/sshd_config.d/</code> 目录下新建配置文件进行覆写，这样在 ssh 服务器升级后不用担心配置文件在更新时被强制覆盖。</p>
<p>修改默认端口 + 禁止密码登录 + 启用密钥登录的配置：</p>
<pre><code>## /etc/ssh/sshd_config.d/99-custom.conf

# 修改默认端口
Port 2222
# 启用公钥验证
PubkeyAuthentication yes
# 禁止密码登录
PasswordAuthentication no
#（可选）禁止空密码
# PermitEmptyPasswords no
# 禁止root用户密码登录，如果不希望root用户直接登录ssh，推荐直接设置为 no
PermitRootLogin prohibit-password
</code></pre>
<p>要想更安全，可以启用“白名单用户或者组”，只有特定用户或组可以登录 ssh。先创建一个普通用户，启用该用户的 <code>sudo</code>​ 权限（<code>EDITOR=nvim visudo</code>​）或者 <code>su root --login</code> 登录 root 后使用。启用 ssh 的白名单用户或者组可以在配置文件中添加下面字段：</p>
<pre><code># 使用白名单用户，指定的用户可以使用ssh登录
AllowUsers youruser1 youruser2
# 使用白名单组，在这个组的用户可以使用ssh登录
# AllowGroup sshlogin
</code></pre>
<p>修改后使用 <code>systemctl restart ssh</code> 重启 ssh 服务。如果配置了防火墙记得开启新端口防火墙并关闭默认 ssh 端口。</p>
<blockquote>
<p>修改 ssh 配置并重启服务后不要急着关闭当前 ssh 连接，应该新开一个终端使用新配置验证 ssh 能正常登录后才能安全关闭当前 ssh 连接，否则可能没法登录服务器。</p>
</blockquote>
<p>修改默认端口和禁止密码登录之后已经可以缓解很大一部分脚本暴力撞库了，如果还想要进一步防御可以考虑安装  <code>fail2ban</code>​ ，不过这种基于日志的防护具有滞后性，我不用这个，我更倾向于使用 <code>endlessh</code>​ 、<code>fwknop</code> 这些工具。</p>
<p>​<code>endlessh</code> 防护思路不是传统的封堵，而是拖延。首先将 ssh 端口修改到到非标准端口比如某个高位端口，然后在标准 ssh 端口上运行 endlessh，攻击者连接 22 端口时，endlessh 会极度缓慢的发送随机 SSH 协议头信息，这样会卡住攻击者连接，无法完成握手也无法报错退出，浪费攻击者带宽和连接池。</p>
<p>​<code>fwknop</code> 则是让 ssh 端口隐身，服务器默认丢弃所有 ssh 端口包，当需要连接时，客户端先发送一个经过加密和签名的 SPA 包，fwknop 解密验证后临时修改 iptables 或者其他系统防火墙仅对来源 ip 开放。优势是实现了 0 攻击面，缺点是客户端也需要安装对应工具使用。这个我没有使用，防护级别过于高了使用太麻烦。</p>
<h2>系统级防火墙</h2>
<p>这一层防火墙主要控制整个服务器的端口开放、端口转发规则，比如只开放 ssh 登录端口、http/https 端口。如果服务器厂商有完善的防火墙配置，优先使用厂商自带的防火墙，这级防火墙优先级最高，默认禁止全部入站，允许出站，然后针对性开放特定端口。如果不使用厂商自带的，就必须使用系统内的 <code>iptables</code>​ （控制 ipv4）和 <code>ip6tables</code>​（控制 ipv6），也可以用 <code>ufw</code>  这种更方便的前端，不过我一般使用 iptables ，更加灵活。</p>
<p>iptables 最核心的就是 <strong>四表五链</strong> ，iptables 是位于用户空间的 Linux 防火墙管理工具，真正实现防火墙的是 Linux 内核中实现包过滤的 <code>netfilter</code> ，iptables 工作流程用下面这个图可以很清楚的展示：</p>
<p><img src="https://img.ppixiu.com/i/iGSJcXQgnx.webp" alt="iptables 工作流程" title="取自 tinychen 的博客" /></p>
<p>日常使用防火墙主要配置 filter 表中的 INPUT 链内规则，链中规则从上往下匹配，匹配到某条规则后之后的规则就不会生效了。如果使用 docker 部署服务并进行 <code>8080:80</code>​ 这种端口映射，你就会发现配置 filter 表中 INPUT 链没有任何效果！那是因为 docker 容器都是运行在虚拟机中，拥有自己的 ip，docker 为了保证端口映射后流量能正确到达容器，利用 iptables 自定义链功能，在 nat 表中的 PREROUTING 链阶段便进行了劫持，发往 8080 端口流量被修改到了 docker 内部 ip 的特定端口，iptables 判断不是本机流量，直接走了 FORWARD 不经过 INPUT 链，INPUT 链内规则也就不会生效了。也不用担心，docker 官方预留了一个 <code>DOCKER-USER</code> 链，这个链位于 docker 自定义链最前面，确保这个链的规则最先执行，docker 默认不会修改这个链，用户可以操作这个链来对 docker 服务流量进行控制。</p>
<p>使用 iptables 时如果规则较多也推荐使用自定义链，保持 iptables 默认链整洁，便于维护。自定义链类似于定义了一个函数，这个函数包含多个规则，在需要用到的地方进行调用，比如创建一个白名单链（WHITELIST），针对某些 ip 可以进入就可以这样操作：</p>
<ol>
<li>创建自定义链：<code>iptables -t filter -N WHITELIST</code> ，这会在 filter 表中创建新的链。</li>
<li>添加规则到自定义链：<code>iptables -A WHITELIST -s 110.110.110.110 -j ACCEPT</code> ，添加特定 ip 直接丢弃的规则。</li>
<li>在特定地方调用自定义链，比如在 INPUT 链阶段调用：<code>iptables -I INPUT -j WHITELIST</code> ，-I 指定插入到 INPUT 链最前面，-j 指定跳转到 WHITELIST 链（类似函数调用）。此时数据包到达 INPUT 链就会跳转到 WHITELIST 链进行规则匹配。</li>
</ol>
<p>针对黑名单这种 IP 量级较大情况下直接使用 iptables 会验证影响性能（iptables 匹配规则从上到下一条一条的，性能是 O(n) ），使用 ipset 扩展配合 iptables 更好，ipset 内部使用哈希表匹配，占用空间相对会大一点，但是现在硬件水平几千万量级还是很轻松的。使用方式如下：</p>
<pre><code># 创建一个ip集合，最大数量100万，hash:net指定可以存储单个ip 1.1.1.1 或者一个网段 1.1.1.0/24
ipset create blacklist hash:net maxelem 1000000
# 添加单个ip
ipset add blacklist 1.2.3.4
# 添加网段
ipset add blacklist 1.2.3.0/24
# 在iptables中引用集合
iptables -I BLACKLIST -m set --match-set blacklist src -j DROP
</code></pre>
<p>iptables 修改后立即生效，但是默认不会持久化，重启后规则就重置了，需要使用 <code>iptables-persistent</code> 来持久化：</p>
<pre><code># 安装
apt install iptables-persistent
# 启用服务
systemctl enable --now iptables-persistent
# 持久化当前配置
netfilter-persistent save
</code></pre>
<h2>Web 防火墙</h2>
<p>Web 防火墙主要针对 <code>http/https</code> 服务器进行防护，通常配合 Nginx 这类反代工具使用，这类防火墙我之前没有用过，了解了下感觉 ModSecurity、雷池社区版、coraza 比较流行，其中雷池使用起来比较方便，规则引擎基于语义分析而不是正则，有 Web 后台可以管理，也支持在线订阅，缺点是社区版功能较少，https 证书只支持 http01 形式自动申请，不支持 dns 形式，但个人使用对 web 服务进行简单防御是够的。</p>
<p>雷池安装方法可以直接看<a href="https://help.waf-ce.chaitin.cn/node/01973fc6-df0f-7650-bafa-8ed8d2fc2bc1">官方文档</a>，写得很详细，通过 docker 进行部署。需要注意的是不要将管理后台端口开放到公网，使用 ssh 转发进行访问，开放到公网则必须配置 2FA。</p>
<p>‍</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Windows重装后配置]]></title>
            <link>https://blog.ppixiu.com/posts/windows-chong-zhuang-pei-zhi/</link>
            <guid isPermaLink="false">https://blog.ppixiu.com/posts/windows-chong-zhuang-pei-zhi/</guid>
            <pubDate>Mon, 19 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[一份保姆级的 Windows 重装后配置指南。涵盖从纯净镜像下载、Win11 跳过联网安装、系统激活、离线驱动解决，到关闭自动更新与 Defender 等系统优化技巧，并附带了一份清单详尽的高效必备软件推荐，助你打造清爽好用的 Windows 系统。]]></description>
            <content:encoded><![CDATA[<p>经常重装 Windows ，整理下重装系统会用到的资源和工具。</p>
<h2>系统镜像</h2>
<p>推荐使用官方纯净镜像，我不推荐用任何第三方“精简”系统，用官方镜像配合一些小工具也能让系统更好用，还不用担心出一些莫名其妙的问题。一些镜像获取地址：</p>
<ul>
<li><a href="https://www.microsoft.com/zh-cn/software-download/windows11">Windows 官方镜像下载</a> ：官方下载地址，推荐使用，国内下载较慢。</li>
<li><a href="https://next.itellyou.cn/">i tell you</a> ：原 MSDN ，现在需要登录才能下载，提供磁力链接，下载速度更快。</li>
<li><a href="https://hellowindows.cn/">hello windows</a> ：很纯粹的一个网站，不需要登录即可下载，提供磁力链接。</li>
<li><a href="https://massgrave.dev/windows_11_links">Windows 11 Download | MAS</a> ：免费激活 Windows 的网站，没错，它也提供 Windows 镜像下载。</li>
</ul>
<p>下载镜像后可以直接烧录到 U 盘 ，也可以通过 <strong>微 PE</strong> 启动使用 Windows 安装器进行安装，推荐使用 <a href="https://www.ventoy.net/cn/download.html">ventoy</a> 启动工具，不需要每个镜像都烧录到 U 盘，巨方便！我个人更倾向于使用 Ventoy 以及 微 PE 安装 Windows，灵活性更高。</p>
<p>Windows 安装镜像只推荐 <strong>专业版</strong> 及以上的版本，不推荐使用家庭版，家庭版缺少了很多功能，使用体验很糟糕。</p>
<h2>驱动</h2>
<p>重装系统后很可能很可能缺少网卡驱动导致没法在线安装驱动，会非常麻烦。一般电脑出厂会自带一些离线驱动文件，记得备份好，每次重装就可以直接离线安装不怕没有网卡驱动。</p>
<p>如果事先没有驱动文件，可以提前下载 <a href="https://sdi-tool.org/download/">Snappy Driver Installer</a> 的 <code>SDI FULL</code> 文件，这个是完全离线的驱动包集合，包含了非常多驱动，能一键下载缺失的驱动。缺点是文件比较大，截至写这篇文章时有接近 48G ，下载之后保存到移动磁盘可以一劳永逸。必备驱动主要是 CPU 驱动、显卡驱动、网卡驱动、声卡驱动、蓝牙驱动。</p>
<p>有网络的情况下重装完系统后马上进行一次全面系统更新即可，大多数驱动都能通过 Windows 更新获取到。</p>
<h2>安装注意事项</h2>
<p>如果是直接启动 Windows 镜像进行安装，最新的 Windows11 安装过程中默认情况下没有本地账号选项，也就是没法连接到网络时是安装不了的，需要在连接网络界面时进行如下操作：</p>
<ol>
<li>键盘输入 <code>Shift + F10</code> 打开一个终端界面</li>
<li>输入 <code>oobe\bypassnro</code> 然后回车</li>
</ol>
<p>之后会重新进入安装界面一次，此时就会出现 ”我没有网络连接“ 选项，使用这个选项就可以使用本地账号以及在没有网络的情况下进行安装。</p>
<p>如果使用的时 微 PE 的 Windows 安装器进行安装，可以在调整选项中进行配置，更加方便。</p>
<h2>激活 Windows</h2>
<p>安装是选择了专业版或者专业工作站版本就需要进行系统激活，不然有些功能是锁定的。目前的话激活工具只推荐一个，那就是 <a href="https://massgrave.dev/index.html">massgrave</a> ，激活起来也是非常方便，管理员权限打开终端管理器，然后输入下面命令回车后根据提示进行激活：</p>
<pre><code>irm https://get.activated.win | iex
</code></pre>
<h2>系统优化</h2>
<p>Windows 我感觉能优化的地方不多，美化不包含在这里面，毕竟美化的尽头是默认，主要就下面这几个吧。</p>
<h3>1. 关闭更新</h3>
<p>重装系统后先进行一次全面系统更新，之后再关闭更新，不然会出现莫名其妙的问题。禁用更新最简单的方式是使用组策略编辑器（需要专业版以上才有这功能）：</p>
<ol>
<li>在搜索栏输入：“编辑组策略” 然后打开</li>
<li>左侧依次展开： 计算机配置 &gt; 管理模板 &gt;Windows 组件 &gt;Windows 更新 &gt; 管理最终用户体验</li>
<li>将<strong>配置自动更新</strong>设置为<strong>已禁用</strong></li>
<li>将<strong>删除使用所有 Windows 更新功能的访问权限</strong>设置为<strong>已启用</strong></li>
</ol>
<h3>2. 关闭安全中心</h3>
<p>众所周知，Windows 自带的安全中心非常鸡肋，经常误删软件，推荐直接关闭。设置里面没法直接关闭，需要配合第三方软件，禁用之前需要到安全中心把实时保护和防篡改功能关闭。第三方软件推荐下面这两个：</p>
<ul>
<li><a href="https://github.com/ZyperWave/ZyperWinOptimize">github.com/ZyperWave/ZyperWinOptimize</a> ：一个轻量级 Windows 系统优化工具，附带了安全中心管理可以一键禁用。</li>
<li><a href="https://www.sordum.org/9480/defender-control-v2-1/">defender control</a> ：一个小工具，专门管理安全中心启用的，大概率报毒，记得提前将这个软件目录加入排除项，不然会被安全中心先删掉。</li>
</ul>
<p>关闭安全中心之后最好是安装一个专业的杀毒软件，比如<a href="https://www.huorong.cn/person">火绒安全</a>、<a href="https://www.kaspersky.com/">卡巴斯基</a>等。最好的安全软件是自己，保持良好的使用习惯比任何杀毒软件都有用！</p>
<h3>3. 轻度美化</h3>
<p>Windows 美化换个壁纸，改下任务栏就够了，默认的其实最耐看。</p>
<p>壁纸我一般用 <a href="https://wallhaven.cc">wallhaven.cc</a> ，steam 上的 wallpaper engine 也很不错，但是我觉得简单一点比较好。</p>
<p>任务栏也可以美化一下，删除小组件，搜索栏改成小图标或者直接隐藏，自动隐藏任务栏，Win11 程序图标默认居中了，如果想要 Win10 的效果也可以调整到左边。任务栏透明可以使用 <a href="https://github.com/TranslucentTB/TranslucentTB">TranslucentTB</a> （微软商店可以直接下载）。</p>
<h3>4. 文件夹组织</h3>
<p>我看到过周围很多人桌面都是一堆乱七八糟的文件，喜欢什么都放在桌面，软件安装也是直接默认 C 盘或者随便选个其他盘的目录，导致 C 盘很容易爆满，程序也到处都是，而且文件找起来也很困难，我觉得好好组织下文件夹是可以延长 Windows 使用寿命的。每次打开看到一个清爽的桌面和有序的文件夹，不管是心情还是效率都会得到提高。</p>
<p>我目前的 D 盘目录组织结构：</p>
<pre><code>D:
├── Programs # 存放常用软件，大部分软件都在这个目录下
│   ├── Normal # 常规软件
│   │   ├── QQ # 腾讯QQ
│   │   ├── BaiduNDisk # 百度网盘
│   │   └── ...
│   ├── Tools # 一些工具类软件
│   ├── Scoop # Scoop 软件
│   ├── Portable # 一些不用安装直接双击运行的软件
│   └── ...
├── DevKit # 一些开发环境
│   ├── Mingw # Gcc
│   ├── Rust # Rust
│   └── ...
├── UserData # 用户目录，比如下载、文档、桌面等
│   ├── Downloads # 下面目录
│   ├── Pictures # 图片目录
│   └── ...
├── Games # 游戏目录
├── Work # 工作文件目录
├── Cache # 一些缓存或者临时目录
├── Projects # 项目目录
└── Backup # 备份目录
</code></pre>
<p>默认软件都装在 D 盘 Programs 目录下，软件内部一些缓存临时文件则选择到 Cache 目录下，资源管理器默认的下载、桌面、文档、图片、音乐、视频这几个文件夹均可以通过 右键 &gt; 属性 &gt; 位置 &gt; 移动 操作调整到 UserData 目录下，避免直接占用大量 C 盘空间。</p>
<h3>5. 其他优化</h3>
<p>其他的比如右键菜单和各种细节优化使用第三方软件更方便，比如：</p>
<ul>
<li><a href="https://github.com/ZyperWave/ZyperWinOptimize">github.com/ZyperWave/ZyperWinOptimize</a></li>
<li><a href="https://github.com/Chuyu-Team/Dism-Multi-language">github.com/Chuyu-Team/Dism-Multi-language</a></li>
</ul>
<h2>常用软件</h2>
<p>整理了一些经常会用到的软件，大多数小工具我每次重装都是必装的，有些是重复的，多提供一种选择。</p>
<p>科学工具：</p>
<p>我偶尔敲敲代码，需要上 github 还有看论文啥的都需要访问国际互联网，这个是必备的，目前用下来就一个我觉得比较舒服。</p>
<ul>
<li><a href="https://github.com/chen08209/FlClash/releases">Releases · chen08209/FlClash · GitHub</a> ：全平台支持，最喜欢它的 webdav 备份恢复，不用每次修改订阅啥的每个客户端都去改一次，备份恢复一下就行。</li>
</ul>
<p>解压缩软件：</p>
<ul>
<li><a href="https://www.7-zip.org/">7-Zip</a> ：开源轻量级解压缩软件，集成到右键菜单，使用方便。</li>
<li><a href="https://www.bandisoft.com/bandizip/">Bandizip</a> ：支持格式更全，免费版本解压或者压缩后可能会弹窗提示，不影响正常功能使用。</li>
</ul>
<p>清理工具：</p>
<p>软件自带的卸载软件基本卸载不干净而且卸载藏得还很深，windows 卸载软件必须用专门的工具，我用过的：</p>
<ul>
<li><a href="https://www.majorgeeks.com/files/details/hibit_uninstaller.html">Hibit Uninstaller</a> ：免费、纯粹、软件体积小、功能全面，使用体验不比付费的差。</li>
<li><a href="https://crystalidea.com/uninstall-tool">Uninstall Tool</a> ：这个只用过学习版，正版需要购买授权，纯粹的卸载软件，功能没有 Hibit Uninstaller 多，界面更现代一点。</li>
<li><a href="https://geekuninstaller.com/">Geek Uninstaller</a> ：看这名字就知道这个软件比较极客风格，只用于卸载安装软件和微软商店软件，界面很简洁清爽，体积小。</li>
<li><a href="https://www.duplicatecleaner.com/">Duplicate Cleaner</a> ：重复文件清理工具，点名批评微信！</li>
</ul>
<p>文件工具：</p>
<ul>
<li><a href="https://file-converter.io/">File Converter</a> ：集成到文件管理器右键，选中文件两步即可转换格式，支持音频、视频、图片、其他文档转换为 pdf 。</li>
<li><a href="https://github.com/namazso/OpenHashTab/releases">Releases · namazso/OpenHashTab</a> ：集成到文件管理器右键菜单，支持快速查看文件 hash 信息，比如 md5、sha256 等。</li>
<li><a href="https://www.listary.net/download">Listary - 文件搜索工具 &amp; 启动器</a> ：提供 everything 类似体验，快速搜索电脑中文件，兼顾程序启动器功能，双击 <code>ctrl</code> 即可使用。windows 自带搜索真的很难用。</li>
<li><a href="https://localsend.org/zh-CN/download">LocalSend</a> ：开源的局域网文件传输工具，跨平台，只要在一个局域网就能互相传文件，比如手机-电脑，电脑-pad，电脑-电脑 。</li>
<li><a href="https://pixpin.cn/">PixPin</a> ：截图、贴图、ocr 工具，比 windows 自带截图好用很多，而且支持长截图、简单录屏、截图标注、截图后贴图（固定图片到顶部）、截图后 OCR 等，会员功能支持翻译。</li>
<li><a href="https://www.bandicam.cn/">Bandicam（班迪录屏）</a>：一个录屏工具，如果是单纯录屏不需要直播个人感觉比 <code>OBS</code> 更好用，录制后文件体积也比较小。</li>
</ul>
<p>下载软件：</p>
<ul>
<li><a href="https://www.internetdownloadmanager.com/download.html">IDM</a> ：多线程下载工具，不支持 BT 下载，配合浏览器插件实现网页资源嗅探，默认需要正版激活，需配合 <a href="https://idm.ckk.ir/">破解工具</a> 破解后使用，每次升级软件后重新破解即可。</li>
<li><a href="https://motrix.app/">Motrix</a> ：支持 HTTP、FTP、BitTorrent、Magnet 下载，功能全面，缺点是很久没有更新了，最近一次更新还是 2023 年，暂时不影响正常使用。</li>
<li><a href="https://github.com/c0re100/qBittorrent-Enhanced-Edition/releases">Releases · c0re100/qBittorrent-Enhanced-Edition</a> ：开源的 BT 下载工具。</li>
</ul>
<p>系统安全：</p>
<ul>
<li><a href="https://www.huorong.cn/person">火绒安全</a> ：免费弹窗少，几乎不打扰，防护能力中规中矩。</li>
<li><a href="https://www.kaspersky.com.cn/">卡巴斯基</a> ：需要付费使用，用过一段时间，跟火绒体验差不多，防护能力强不强不清楚，使用习惯好一点一般也遇不到什么病毒。</li>
<li><s><a href="https://www.360.com/">360 安全卫士</a></s>  <s>：流氓软件，普通用户不会设置就别用了，说不定啥时候就给你来个全家桶。但是不可否认它是最强梯队的安全软件。</s></li>
</ul>
<p>办公软件：</p>
<ul>
<li><a href="https://massgrave.dev/office_c2r_links#chinese-simplified-zh-cn">Office C2R Installers | MAS</a> ：微软的全家桶，这个 Windows 下办公几乎必备了，可以使用上文提到的 Windows 激活软件进行激活。</li>
<li><a href="https://www.wps.cn/">WPS</a> ：国产最好的办公软件，会员比较贵而且吃相越来越难看，已经走上 VIP-SVIP-SSVIP 道路了。不过他家会员功能主要是方便操作以及 AI 功能，基础功能不影响使用，但是操作界面各种会员功能都放在显眼的地方，没有会员使用体验就很差了。</li>
</ul>
<p>视频软件：</p>
<ul>
<li><a href="https://potplayer.tv/">Global Potplayer</a> ：视频播放器，支持本地和在线的，界面简约，配置并且美化一下使用体验很棒。</li>
</ul>
<p>Emby 客户端：</p>
<p>我现在看电视剧、电影、动漫这些基本都用付费加免费的 emby 了，各种视频会员根本开不完，甚至有些开了还要看广告，吃相太难看。Windwos 目前我用过的就下面这两个：</p>
<ul>
<li><a href="https://github.com/tsukinaha/tsukimi/releases">Releases · tsukinaha/tsukimi · GitHub</a> ：支持外部播放器。</li>
<li><a href="https://apps.microsoft.com/detail/9nxnzfrllwzx?hl=zh-CN&amp;gl=CN">Hills Lite - Windows 官方下载 | 微软应用商店 | Microsoft Store</a> ：微软商店下载，也支持外部播放器。</li>
<li><a href="https://github.com/Terminus-Media/jellyfin-media-player/releases">Releases · Terminus-Media/jellyfin-media-player</a> ：终点站开发的播放器，没更新了但是还能用。</li>
</ul>
<p>LLM 客户端：</p>
<p>现在大模型 AI 基本必备了，但是各家 AI 客户端使用体验并不好，而且需要购买多个会员不划算，LLM 客户端使用 API 方式访问 AI ，更适合中转用户，下面是我用过的一些客户端：</p>
<ul>
<li><a href="https://chatwise.app/">ChatWise</a> ：LLM 客户端，API 方式使用大模型 AI ，比各家官方客户端要灵活一些，适合中转用户。MCP 功能需要付费，免费版能使用基础聊天功能。使用 tauri 开发的，我主要看重他的轻量、简洁 UI 。</li>
<li><a href="https://www.cherry-ai.com/">Cherry Studio</a> ：开源免费的 LLM 客户端，同样 API 方式使用，功能更加全面，但是有点重。</li>
<li><a href="https://docs.openwebui.com/">Open WebUI</a> ：网页版的，一般服务器自托管用法比较多，由于跑在浏览器，多端同步以及多平台支持不在话下。</li>
</ul>
<p>其他：</p>
<ul>
<li>
<p><a href="https://gen.paramore.su/#downloads">GenP</a> ：Adobe 全家桶破解机。使用破解机破解，不需要下载特定的压缩包，下载安装 Adobe 的 <a href="https://www.adobe.com/download/creative-cloud/?locale=zh-Hans">Creative Cloud</a> 软件登陆后退出软件，再使用这个工具破解即可。记得在设置里面关闭自动更新和后台运行。</p>
</li>
<li>
<p><a href="https://scoop.sh/">Scoop</a> ：一个软件包管理器，可以下载和管理软件，大多数都是 Portable 类型的，我喜欢用来安装一些命令行类型工具。缺点是需要连接 github ，没有科学工具用不了。</p>
</li>
<li>
<p><a href="https://www.zotero.org/">Zotero</a> ：开源的文献/pdf 阅读软件，全平台客户端支持，方便做笔记以及查找参考文献，看论文必备！</p>
</li>
<li>
<p><a href="https://siyuannote.com/">思源笔记</a> ：开源的双联笔记软件，开通永久功能会员后支持数据同步到 webdav （解决多端同步问题），有很多可用插件。我用来管理日常笔记，文章通过插件一键发布到博客。缺点是使用的块级格式，不方便迁移，不过支持导出 markdown 就算自定义格式也不影响迁移。</p>
</li>
<li>
<p><a href="https://foldersync.io/">FolderSync</a> ：文件夹同步软件，支持非常多同步目标，比如常见的 webdav、ftp、谷歌网盘、onedrive 等，免费版本支持同步 2 个文件夹，付费后无限制。同步也可以用 <code>rclone</code>，但是需要配置，不适合懒人。</p>
</li>
<li>
<p><a href="https://github.com/fatedier/frp">frp</a> ：远程管理家里的电脑会用上，办公的话用 Windows 自带的远程是最舒服的，打游戏用专门的远程比较好。</p>
</li>
</ul>
<p>‍</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Xray 搭建内网穿透]]></title>
            <link>https://blog.ppixiu.com/posts/xray-da-jian-nei-wang-chuan-tou/</link>
            <guid isPermaLink="false">https://blog.ppixiu.com/posts/xray-da-jian-nei-wang-chuan-tou/</guid>
            <pubDate>Sat, 27 Dec 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[谁说 Xray 只能用来科学？拿来做内网穿透简直降维打击。本文记录了我如何用 Xray (VLESS+Reality) 替代 FRP，并利用 nftables 的流量转发实现“配置解耦”。服务端和 NAS 端配置写死后不用动，新增穿透端口只需一条命令，既安全又抗干扰，强推给有 VPS 的 NAS 玩家。]]></description>
            <content:encoded><![CDATA[<h1>Xray 搭建内网穿透</h1>
<p>家里 NAS 没有公网 IP ，因为部署了一些在外面也需要访问的服务，最近一直在研究怎么实现内网穿透。前后尝试过 tailscale、frp、lucky、cloudflare tunnel，但是使用起来感觉都不太符合我的要求，主要问题就是：</p>
<ul>
<li>
<p>tailscale：</p>
<ul>
<li>虚拟局域网方式使用，与本地 VPN 没法共存，这是我最不能接受的。</li>
<li>默认的中继服务器在国内使用并不稳定，对于同步场景影响较大。</li>
<li>考虑过自建中继，但是我的 VPS 在香港，tailscale 默认的隧道协议很容易被 GFW 识别。</li>
</ul>
</li>
<li>
<p>frp：</p>
<ul>
<li>没有公网 IP ，只能 VPS 中转，这样就需要在 NAS 和 VPS 两端配置，如果 NAS 端需要新增一个穿透服务就需要两边都进行配置，比较繁琐。</li>
<li>整体体验不错，但是默认加密传输过 GFW 还是不够保险，很容易被识别在跑 FRP 。</li>
</ul>
</li>
<li>
<p>lucky：</p>
<ul>
<li>内网穿透需要 NAT1 网络，现在基本都是 NAT2 或者 NAT3 ，基本没法满足。</li>
<li>附带的 WEB 服务、证书管理这些对小白来说还是不错的，可以很方便的提供 https 外网服务，当然前提是有公网 IP 。</li>
<li>WEB 服务自定义程度较低，反代某些服务没法进行优化。</li>
</ul>
</li>
<li>
<p>cloudflare tunnel：</p>
<ul>
<li>各方面使用体验都很棒，配置简单，依托 cloudflare 平台有保障，唯一的缺点就是在国内环境下速度真的堪忧，应急可以。</li>
</ul>
</li>
</ul>
<p>‍</p>
<p>Xray 作为一款高性能网络代理工具，很多人都是用来进行科学的，我想到用它来搭建内网穿透也是最近看文档突然发现这款工具支持了 <a href="https://xtls.github.io/config/reverse.html">反向代理</a> 。配合现在主流的 Vless + Reality 就能构建一个隐蔽性强、安全性高的隧道，刚好可以利用上香港 VPS 进行中转。</p>
<p>Xray 的反向代理是一个通用反向代理，不限制协议类型，也就是说你可以用 Xray 支持的任何协议，如果在国内服务器上搭建就不需要使用 vless 这种较重的协议了。反向代理流程如下图所示：</p>
<p><img src="https://img.ppixiu.com/i/gON0wVSsx_.webp" alt="xray 反向代理.webp" title="xray反向代理流程" /></p>
<p>配置分为 <code>portal</code>​ 端和 <code>bridge</code> 端，如果用于内网穿透则 bridge 端部署在本地服务器上，portal 端部署到 VPS 服务器上。portal 端至少提供两个入站和一个出站，其中 vless 入站用于建立隧道与 bridge 端通信，一个 tunnel 入站用于端口转发，一个默认 direct 出站避免某个反向代理成为默认出站流量都通过隧道发往 bridge 端，通过路由模块配置流量流转方向。bridge 端提供两个出站，不需要入站，一个 vless 出站用于连接 portal 端 vless 隧道，一个默认 diretc 出站与内网服务进行通信，避免回环。</p>
<p>在反向代理过程中，bridge 端反向代理首先通过特定的 domian 或者特定标志发出连接建立请求，路由模块判断是反向代理发出的请求，如果 domain 或者特殊标志匹配则转发到 vless 隧道向 portal 端发送，否则说明是公网端向内网服务发出的请求，则通过 direct 出站发往内网服务。</p>
<p>portal 端隧道收到请求，路由模块将其转发到 reverse 模块判断是否是反向代理建立的请求，如果是则建立长期连接，不主动关闭这条连接，并且会定期进行保活，如果不是说明是内网服务的响应，路由模块会根据情况转发到 direct 出站并最终返回外网用户设备。portal 端 tunnel 隧道收到请求，路由模块判断这是公网用户的请求，将其转发到 reverse 进行处理，最终会发送到 bridge 端。</p>
<p>一个极简配置的内网穿透配置：</p>
<p>Portal 端：</p>
<pre><code>{
	"inbounds": [
		{
			"tag": "vless_tunnel"
			"listen": "0.0.0.0",
			"port": 8443,
			"protocol": "vless",
			"settings": {
				"description": "none",
				"clients": [{"id": "&lt;UUID&gt;", "flow": "xtls-rprx-vision"}]
			},
			"streamSettings": {
				// 此处省略 reality 配置
			}
		},
		{
			"tag": "external",
			"listen": "127.0.0.1",
			"port": 10086,
			"protocol": "dokodemo-door",
			"settings": {
				"address": "127.0.0.1",
				"network": "tcp"
			}
		}
	],
	"outbounds": [
		{ "tag": "direct", "protocol": "freedom" },
		{ "tag": "block", "protocol": "blackhole" }
	],
	// 配置反向代理模块
	"reverse": {
		"portals": [
			{
				"tag": "portal",
				// 这里 domain 随便填写，不需要是真实域名，仅用作 xray 内部识别
				"domain": "nas-tunnel" 
			}
		]
	},
	// 重要！路由配置，决定流量如何处理和流动
	"routing": {
		"rules": [
			// 外部流量以及隧道流量都交由反向代理模块处理
			{ "type": "field", "inboundTag": "external", "outboundTag": "portal" },
			{ "type": "field", "inboundTag": "vless_tunnel", "outboundTag": "portal" },
		]
	}
}
</code></pre>
<p>Bridge 端：</p>
<pre><code>{
	"inbounds": [],
	"outbounds": [
		{
			"tag": "to_local",
			"protocol": "freedom",
			"settings": {
				// 转发到本地服务
				"redirect": "http://127.0.0.1:xxx"
			}
		},
		{
			"tag": "vless_tunnel"
			"protocol": "vless",
			"settings": {
				"vnext": [
					{
						"address": "&lt;VPS IP&gt;",
						"port": 8443,
						"users": [ {"id": "&lt;UUID&gt;", "flow": "xtls-rprx-vision", "encryption": "none"} ]
					}
				]
			},
			"streamSettings": {
				// 此处省略 reality 配置
			}
		}
	],
	// 配置反向代理模块
	"reverse": {
		"bridges": [
			{
				"tag": "bridge",
				// 这里 domain 随便填写，不需要是真实域名，仅用作 xray 内部识别
				"domain": "nas-tunnel" 
			}
		]
	},
	// 重要！路由配置，决定流量如何处理和流动
	"routing": {
		"rules": [
			{ "type": "field", "inboundTag": "bridge", "outboundTag": "vless_tunnel", "domain": ["full:nas-tunnel"] },
			{ "type": "field", "inboundTag": "bridge", "outboundTag": "to_local" },
		]
	}
}
</code></pre>
<p>这套配置虽然能工作，但是并不方便，每次新增或者修改服务都需要在 portal 和 bridge 端进行修改然后重启，跟 frp 相比也就多了个能自定义隧道协议的优势，关键还很绕难以理解。我希望的效果是服务端跟客户端配置运行后就不用动它，即使需要修改内网穿透服务端口也不用动它。</p>
<p>xray 的任意门（现在应该叫 tunnel ）入站给了我启发，既然都是端口转发为何不用更方便的 <code>iptables</code>​ 或者 <code>nftables</code>​ 呢？通过 nftables 对端口流量进行转发，对于需要内网穿透的服务，都将其转发到 xray tunnel 监听的端口，同时配置 <code>followRedirect</code> 识别出 nftables 转发的原始端口，这样 bridge 端也能识别到对应端口，只要保持 NAS 本地服务端口跟 VPS 端 nftables 配置的端口一致即可。nftables 还可以批量转发某一段端口（比如 10000-12000 范围所有端口），也能控制端口是否对公网开放，这样能让 VPS 端 Nginx 安全反代，不用担心暴露多余的端口。</p>
<p>xray 在 vless 部分新增了 reverse 字段，可以实现通用反向代理，配置反向代理更加方便，优化后的配置：</p>
<p>NAS 端 xray 配置：</p>
<pre><code>{
  "log": { "loglevel": "info" },
  "inbounds": [],
  "outbounds": [
    {
      "protocol": "direct"
    },
    {
      "protocol": "vless",
      "settings": {
        "vnext": [
          {
            "address": "&lt;公网VPS IP&gt;",
            "port": 8443,
            "users": [
              {
                 "id": "&lt;xray uuid生成，与服务端保持一致&gt;",
                 "encryption": "none",
                 "flow": "xtls-rprx-vision",
                 "email": "与服务端一致",
                 "reverse": { "tag": "tunnel-in" }
               }
            ]
          }
        ]
      },
      "streamSettings": {
        "network": "tcp",
        "security": "reality",
        "realitySettings": {
           "serverName": "firefox.org",
           "publicKey": "&lt;xray x25519 -i 服务端私钥生成&gt;",
           "shortId": "&lt;16进制随便写几个，与服务端保持一致&gt;",
           "spiderX": "/"
        }
      }
    }
  ],
  "routing": {
    "rules": []
  }
}

</code></pre>
<p>VPS 端 xray 配置：</p>
<pre><code>{
  "log": {
    "access": "/var/log/xray/access.log",
    "dnsLog": false,
    "error": "/var/log/xray/error.log",
    "loglevel": "info"
  },
  "inbounds": [
	  {
		  "listen": "0.0.0.0",
		  "port": 8443,
		  "protocol": "vless",
		  "settings": {
			  "clients": [
				  {
					  "id": "&lt;xray uuid生成&gt;",
					  "flow": "xtls-rprx-vision",
					  "email": "邮箱，其标记作用，与客户端保持一致",
					  "reverse": {
						  "tag": "tunnel-out"
					  }
				  }
			  ],
			  "decryption": "none"
		  },
		  "streamSettings": {
			  "network": "tcp",
			  "security": "reality",
			  "realitySettings": {
				  "show": false,
				  "dest": "firefox.org:443",
				  "serverNames": ["firefox.org"],
				  "privateKey": "&lt;xray x25519生成&gt;",
				  "shortIds": ["与客户端保持一致"]
			  }
		  },
		  "sniffing": {
			  "enabled": true,
			  "destOverride": ["http", "tls"]
		  }
	  },
	  {
		  "listen": "127.0.0.1",
		  "port": 10086,
		  "protocol": "tunnel",
		  "settings": {
			  "address": "127.0.0.1",
			  "network": "tcp,udp",
			  "followRedirect": true
		  },
		  "tag": "tunnel-in"
	  }
  ],
  "outbounds": [
	  {
		  "protocol": "direct",
		  "tag": "direct"
	  },
	  {
		  "protocol": "blackhole",
		  "tag": "block"
	  }
  ],
  "routing": {
	  "rules": [
		{
			"type": "field",
			"user": [ "与上面邮箱保持一致" ],
			"outboundTag": "tunnel-out"
		},
		{
			"type": "field",
			"inboundTag": ["tunnel-in"],
			"outboundTag": "tunnel-out"
	  	}
	  ]
  }
}

</code></pre>
<p>VPS 端 nftables 配置：</p>
<pre><code>#!/usr/sbin/nft -f

flush ruleset

table inet inet_firewall {
	## 这个控制穿透并且开放给公网访问的端口
	set tunnel_ports_public {
		type inet_service
		flags interval
        ## 开放并穿透 NAS 10010 端口
		elements = { 10010 }
	}
    ## 这个控制穿透端口，给 VPS 本地用，比如 Nginx 反向代理
	set tunnel_ports_local {
		type inet_service
		flags interval
        ## 我直接开放这么多端口哟
		elements = { 10000-20000 }
	}

	chain prerouting {
		type nat hook prerouting priority -100; policy accept;

        ## 10086 端口是 xray 服务端隧道监听端口，会转发给隧道
		iifname != "lo" tcp dport @tunnel_ports_public redirect to :10086
		iifname != "lo" udp dport @tunnel_ports_public redirect to :10086
	}

	chain input {
		type filter hook input priority 0;

		policy drop;

		ct state established,related accept
		iif lo accept
		ct state invalid drop

        ## tunnel port
		tcp dport { 8443,10086 } accept
		udp dport {8443, 10086 } accept

        ## 这里就当日常防火墙用就行
		## 开放常用端口
		tcp dport { ssh,http,https,9000,9001,81 } accept

        ## 有点多余了，前面已经转发了
		# tcp dport @tunnel_ports_public accept
		# udp dport @tunnel_ports_public accept

	}
	chain output {
		type nat hook output priority -100; policy accept;

		ip daddr 127.0.0.1 tcp dport @tunnel_ports_local redirect to :10086
		ip daddr 127.0.0.1 udp dport @tunnel_ports_local redirect to :10086
	}
}
</code></pre>
<p>优化后的配置 xray 运行后不需要再动，只需要在 nftables 配置文件中指定内网穿透需要的端口（你要是懒得一个个添加可以直接转发一段端口，但是我不推荐这样搞），然后使用 <code>systemctl restart nftables</code>​ 重启即可生效。推荐使用 Nginx 进行反代，不要直接开放端口，nginx 反代部分填写 <code>127.0.0.1:&lt;NAS端某个服务端口&gt;</code> 即可。</p>
<p>‍</p>
]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Gentoo安装记录]]></title>
            <link>https://blog.ppixiu.com/posts/gentoo-an-zhuang-ji-lu/</link>
            <guid isPermaLink="false">https://blog.ppixiu.com/posts/gentoo-an-zhuang-ji-lu/</guid>
            <pubDate>Thu, 25 Dec 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[这篇文章详细记录了最小化安装 'Gentoo 系统的全流程。涵盖安装盘制作、Btrfs分区、Portage 与 USE 标志优化以及内核引导配置。]]></description>
            <content:encoded><![CDATA[<h2>前言</h2>
<p>从 <code>ArchLinux</code> 切换到 <code>Gentoo</code> 也有一段时间了，感觉 Gentoo 系统稳定性还是非常棒的，至少在我看来比 Arch 要好很多，比如在 Arch 下 KDE 6 经常崩溃，但是在 Gentoo 下我用了大半个月也就在切换外接显示器的时候崩溃过一次。不过后面我切换到了 <code>niri</code> 桌面，一直使用到现在。</p>
<p>Gentoo 整体安装过程还是比较繁琐的，最小化系统安装还好，主要是系统安装后的各种优化调整以及桌面环境的搭建。回头看看，真的已经忘记怎么一步步优化的了，本文主要记录下最小化系统安装步骤，下一篇文章会以配置 <code>niri</code> 桌面为例详细介绍如何优化 Gentoo 日常桌面使用。</p>
<p>Gentoo 安装步骤大致可以分为以下阶段，一步步的进行即可，其他 Linux 系统安装过程跟这个也是类似的，只是有些发行版为我们准备了图形化安装界面。</p>
<ol>
<li>准备安装盘并进入安装系统</li>
<li>连接好网络并准备就绪</li>
<li>初始化磁盘，决定使用的文件系统，并进行挂载准备安装系统</li>
<li>下载 <code>Stage3</code> 文件（Gentoo系统特有）并解压到目标目录</li>
<li>基础系统就绪，<code>chroot</code> 进入安装的基础系统</li>
<li>配置Gentoo系统和最小化安装</li>
<li>安装操作系统内核</li>
<li>系统其他必要设置以及安装必要软件</li>
<li>安装和配置引导（用于发现和启动操作系统）</li>
<li>取消挂载并重启进入新系统，进行后续配置</li>
</ol>
<p>参考：<a href="https://wiki.gentoo.org/wiki/Handbook:AMD64">Gentoo官方安装文档</a> ，真的非常详细！</p>
<h2>准备安装盘</h2>
<p>Gentoo 官方有自己的最小化安装 ISO 镜像，但是也可以使用其他发行版比如 Arch 的安装镜像，只要能正常格式化磁盘、挂载磁盘、连接网络、访问终端即可，但是还是推荐使用 Gentoo 官方的镜像，其他发行版镜像不一定包含 Gentoo 需要的一些组件，有官方的为啥不用呢？</p>
<p>官方安装镜像包含纯终端版本和带 GUI 版本两种，推荐使用带 GUI 版本的，方便复制命令，还能在安装过程中查看文档，不用费劲扒拉的去看手机和费眼睛的 tty 。镜像可以直接到官网 <a href="https://www.gentoo.org/downloads/">download页面</a> 下载，记得选择 <code>Boot Media</code> 部分的 <code>LiveGUI USB Image</code> ，不要下载成 Stage 区域的了。</p>
<p>下载好镜像后准备一个 8G 以上 U 盘进行刻录，这里推荐使用 <a href="https://ventoy.net/cn/">Ventoy</a> ，这是一个多系统启动 U 盘工具，只需要安装的时候格式化一次 U 盘，之后直接拷贝 ISO 镜像进去即可，不用每次启动一个镜像都要重新格式化一次，还能当正常的 U 盘存放文件。新版本现在支持了无损安装，甚至不需要格式化 U 盘，天才的设计。</p>
<p>启动前还需要对电脑 BIOS 进行配置，进入 BIOS 的方法不同型号主板有区别，自行搜索。进入 BIOS 后主要进行两处配置：<strong>关闭安全启动</strong> 和 <strong>设置USB为第一启动项</strong> ，不进行配置开机还是默认进入原来的系统而不是U盘上的系统。</p>
<p>配置好后保存退出，插上 U 盘再开机就会进入安装系统了。</p>
<h2>配置网络</h2>
<p>如果使用网线连接的有线连接，进入系统后就会自动启用并连接，不需要额外的配置。如果需要连接 wifi ，使用 GUI 版本的安装镜像默认桌面环境是 KDE ，进入设置连接 wifi 即可，这里主要介绍下命令行连接 wifi 。</p>
<p>运行 <code>ip link</code> 查看网络接口信息，运行后可能输出如下：</p>
<pre><code>1: lo: &lt;LOOPBACK,UP,LOWER_UP&gt; mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
4: enp1s0: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether e8:40:f2:ac:25:7a brd ff:ff:ff:ff:ff:ff
6: wlan0: ...
</code></pre>
<p>如果除了 lo 外没有其他项，那估计内核是不支持当前电脑网卡，这种情况很少发生，如果有那就放弃安装吧哈哈～ 一般 <code>en</code> 开头的属于有线网卡（比如 enp1s0、ens1），<code>wl</code> 开头的是无线网卡（比如 wlan0）。</p>
<p>连接 wifi 时推荐使用手机开热点，然后设置成无密码（开放网络），这样用 <code>iw</code> 直接连接就行了，不用折腾。如果配置了密码，通常都是 WPA、WPA2 或 WPA3 协议，这就需要使用 <code>wpa_supplicant</code>、<code>iwd</code> 这类软件连接。</p>
<p><code>iw</code> 连接 wifi：</p>
<pre><code>## 激活接口，假设为 wlan0
ip link set dev wlan0 up
## 连接到手机热点（无密码），假设 wifi 名称为 mywifi
iw dev wlan0 connect -w mywifi
## 测试网络连接
ping www.bilibili.com
</code></pre>
<h2>准备磁盘</h2>
<p>安装 Linux 至少需要两个磁盘分区，一个是用于引导的引导分区，固定 <code>vfat</code> 格式，一个用于系统安装，可选多个文件系统，比如 <code>ext4</code>、<code>btrfs</code>、<code>xfs</code>、<code>zfs</code>。需要注意 <code>ntfs</code> 是 windows 系统使用的文件系统，由于缺少 Linux 系统运行所需的 UNIX 权限和扩展属性，不能用来安装 Linux ，仅作为与 Windows 系统交换文件时推荐使用。</p>
<p>个人桌面使用我推荐 <code>ext4</code> 和 <code>btrfs</code> 两种文件系统。ext4 是 Unix 下老牌文件系统，开箱即用，稳定可靠，但是缺少一些现代化功能。btrfs 也是开箱即用，相比 ext4 多了很多现代化功能比如快照、校验、透明压缩、子卷、组 RAID 等，配置要比 ext4 麻烦一些。zfs、xfs 这些我没用过，这里就不做介绍了。</p>
<p>参考：<a href="https://wiki.gentoo.org/wiki/Filesystem">Gentoo Wiki - 文件系统</a></p>
<h3>分区与格式化</h3>
<p>我使用 btrfs 较多，因为 ext4 每次分区都必须指定大小，给根目录和 home 目录分多大很是纠结，后期扩容麻烦，而且快照也没 btrfs 方便，下面以 btrfs 为例进行配置。</p>
<p>首先使用 <code>fdisk -l</code> 查看有那些磁盘，比如我的：</p>
<pre><code>Disk /dev/nvme0n1：953.87 GiB，1024209543168 字节，2000409264 个扇区
磁盘型号：YMTC PC41Q-1TB-B
单元：扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理)：512 字节 / 512 字节
I/O 大小(最小/最佳)：4096 字节 / 4096 字节
磁盘标签类型：gpt
磁盘标识符：F87EDD9B-91D8-47CC-97B7-BD6B562C2685

设备                起点       末尾       扇区   大小 类型
/dev/nvme0n1p1        40     614439     614400   300M EFI 系统
/dev/nvme0n1p2    614440     647207      32768    16M Microsoft 保留
/dev/nvme0n1p3    649216  419428351  418779136 199.7G Microsoft 基本数据
/dev/nvme0n1p4 419429256 2000409230 1580979975 753.9G Microsoft 基本数据


Disk /dev/nvme1n1：931.51 GiB，1000204886016 字节，1953525168 个扇区
磁盘型号：Samsung SSD 980 1TB
单元：扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理)：512 字节 / 512 字节
I/O 大小(最小/最佳)：16384 字节 / 131072 字节
磁盘标签类型：gpt
磁盘标识符：D3AAFC77-755D-45DE-8677-C1829F22E3E2

设备              起点       末尾       扇区   大小 类型
/dev/nvme1n1p1    2048    2099199    2097152     1G EFI 系统
/dev/nvme1n1p2 2099200 1953523711 1951424512 930.5G Linux 文件系统
</code></pre>
<ul>
<li><code>/dev/nvme1n1p1</code> 用作引导分区，如果有 Windows 系统的话就不需要格式化引导分区，后面直接挂载即可，我这里有两个磁盘，直接一个 Windows ，一个 Gentoo 了，使用 nvme1n1 磁盘进行安装。</li>
<li><code>/dev/nvme1n1p2</code> 用作系统安装，格式化为 btrfs 文件系统。</li>
</ul>
<p>使用 <code>cfdisk /dev/nvme1n1</code> 对磁盘进行分区，我这里分了两个，一个用作 EFI （1G大小），剩余空间全部用作系统安装。</p>
<ul>
<li>使用 <code>mkfs.vfat -F 32 -n EFI /dev/nvme1n1p1</code> 格式化 EFI 分区为 FAT32 格式，并且指定一个卷标 ”EFI“ 。</li>
<li>使用 <code>mkfs.btrfs -f -L Gentoo /dev/nvme1n1p2</code> 格式化为 btrfs 文件系统，并指定一个卷标 ”Gentoo“ 。</li>
</ul>
<h3>挂载分区</h3>
<p>挂载顺序：先挂载根目录，然后挂载子目录。</p>
<p>为方便后面使用 <code>snapper</code> 进行系统快照需要为系统分区配置扁平化子卷，我习惯分下面这些子卷：</p>
<ol>
<li>@：根子卷，用于挂载根目录，快照整个系统。</li>
<li>@home：用户目录子卷，用于挂载用户数据目录，日常使用主要是这个，单独快照用户数据。</li>
<li>@swap：交换文件子卷，用于存储内存交换文件，用于系统休眠。</li>
<li>@gentoo_tmp：用于 Gentoo 构建时的临时文件</li>
</ol>
<pre><code>mkdir -pv /mnt/gentoo
mount -t btrfs /dev/nvme1n1p2 /mnt/gentoo
btrfs subvolume create /mnt/gentoo/@
btrfs subvolume create /mnt/gentoo/@home
btrfs subvolume create /mnt/gentoo/@swap
btrfs subvolume create /mnt/gentoo/@gentoo_tmp
umount /mnt/gentoo
</code></pre>
<p>正式挂载分区：</p>
<pre><code>## 挂载 btrfs 文件系统
## subvol指定子卷，compress指定压缩算法，ssd针对ssd磁盘优化
## noatime 禁止系统在读取文件后更新文件最后访问时间，避免不必要的写入
mount -t btrfs -o subvol=@,noatime,compress=zstd,ssd /dev/nvme1n1p2 /mnt/gentoo
mount --mkdir -t btrfs subvol=@home,noatime,compress=zstd,ssd /dev/nvme1n1p2 /mnt/gentoo/home
## swap文件必须关闭写时复制和压缩
mount --mkdir -t btrfs subvol=@swap,noatime,ssd /dev/nvme1n1p2 /mnt/gentoo/swap
mount --mkdir -t btrfs subvol=@gentoo_tmp,noatime,compress=zstd,ssd /dev/nvme1n1p2 /mnt/gentoo/var/tmp
## 挂载 EFI 分区
mount --mkdir /dev/nvme1n1p1 /mnt/gentoo/efi
</code></pre>
<p>挂载swap分区，swap文件大小推荐设置为内存大小的 1.5 倍左右，我内存是 32GB ，我分配了 44G 容量给 swap 文件。如果内存小于 16 G 可以设置为内存的 2 倍。</p>
<pre><code>## 取消 swap 目录的写时复制特性，只针对新文件有效
chattr +C /mnt/gentoo/swap
## 使用 btrfs 工具直接创建 swap 文件
btrfs filesystem mkswapfile --size 44G /mnt/gentoo/swap/swapfile
## 启用
swapon /mnt/gentoo/swap/swapfile
</code></pre>
<p>全部挂载完成后可以使用 <code>lsblk</code> 查看挂载路径以及磁盘是否正确。</p>
<h2>下载 Stage3 文件并解压</h2>
<blockquote>
<p>Stage3 文件内容是一个最小化 Gentoo 基础系统，包含了必要的文件目录，相当于整个系统的地基，需要解压到安装路径下，然后使用 <code>chroot</code> 工具进入这个基础系统，再进行后续安装配置。</p>
</blockquote>
<p>Gentoo 提供了两套初始化系统可供选择，一个是 <a href="https://wiki.gentoo.org/wiki/OpenRC">OpenRC</a> ，一个是 <a href="https://wiki.gentoo.org/wiki/Systemd">Systemd</a> 。OpenRC 是 Gentoo 的原生初始化系统，相对简洁，而 Systemd 目前是大多数 Linux 系统默认初始化环境，相对臃肿，但是功能更丰富。新手的话无脑 Systemd 就行了，出问题解决方案多而且使用起来比较省事。</p>
<p><strong>！！！需要注意 Gentoo 系统切换初始化系统非常麻烦，请在安装系统时就决定好使用哪一套初始化系统。</strong></p>
<p>Gentoo 在初始化系统之上还提供了基础 Stage3 系统与带 Desktop（桌面）的 Stage3 系统可供选择，这两者主要区别就是 Desktop 版本提前帮你配置了一些桌面友好的设置，如果是使用窗口管理器比如 <code>hyprland</code>、<code>sway</code>、<code>niri</code> 这种的话选择基础的即可，如果使用 <code>KDE</code>、<code>Gnome</code> 等桌面就选 Desktop 版本就行。不过都无所谓了，后期都能切换的～</p>
<p>嗯，还有一个，Gentoo 还提供了“纯64位库（<code>no-multilib</code>）”版本跟“32+64位库（<code>multilib</code>）”版本，除非必要，一定不要选择 <code>no-multilib</code> 版本，会导致一些需要 32 位库的软件没法使用，比如 <code>Steam</code> ，后期更换起来也是非常困难的。</p>
<p>选择一个镜像站，常用的：</p>
<ol>
<li><a href="https://mirrors.tuna.tsinghua.edu.cn/gentoo/">清华大学镜像源</a></li>
<li><a href="https://mirrors.ustc.edu.cn/gentoo/">中国科技大学镜像源</a></li>
<li><a href="https://mirrors.aliyun.com/gentoo/">阿里云镜像站</a></li>
</ol>
<pre><code>cd /mnt/gentoo
## 使用links浏览器下载文件，这里链接替换为实际的
links https://mirrors.aliyun.com/gentoo/releases/amd64/autobuilds/
## 解压 Stage3 压缩包到当前文件夹
tar xpvf stage3-*.tar.xz --xattrs-include='*.*' --numeric-owner -C /mnt/gentoo
</code></pre>
<h2>进入最小化系统</h2>
<p>按照官方教程，需要先挂载一些目录并且复制 DNS 信息：</p>
<pre><code>## 复制 DNS 信息，确保进入新环境网络能正常使用
cp --dereference /etc/resolv.conf /mnt/gentoo/etc/
</code></pre>
<p>然后挂载一些伪文件系统：</p>
<pre><code>mount --types proc /proc /mnt/gentoo/proc
mount --rbind /sys /mnt/gentoo/sys
mount --make-rslave /mnt/gentoo/sys
mount --rbind /dev /mnt/gentoo/dev
mount --make-rslave /mnt/gentoo/dev
mount --bind /run /mnt/gentoo/run
mount --make-slave /mnt/gentoo/run
</code></pre>
<blockquote>
<p>如果使用的非 Gentoo 官方启动镜像，还需要做下面的挂载，使用官方镜像可忽略。</p>
</blockquote>
<pre><code>test -L /dev/shm &amp;&amp; rm /dev/shm &amp;&amp; mkdir /dev/shm
mount --types tmpfs --options nosuid,nodev,noexec shm /dev/shm
chmod 1777 /dev/shm /run/shm
</code></pre>
<p>使用 <code>chroot</code> 进入新环境：</p>
<pre><code>chroot /mnt/gentoo /bin/bash
# 加载环境变量并设置 PS1 区分 chroot 环境
source /etc/profile
export PS1="(chroot) ${PS1}"
</code></pre>
<h2>初始化 Portage 与 USE 标志</h2>
<blockquote>
<p><a href="https://wiki.gentoo.org/wiki/Portage">Portage</a> 是 Gentoo 的包管理系统，基于系统核心提供高级依赖关系解析以及各种包的分发、灵活构建、安装等。而 USE 标志（<code>USE flags</code>）是 Gentoo 系统的核心特性，是控制软件特性以及依赖信息的关键字，通过 USE 变量，可以做到一个软件只安装需要的功能，一些多余的选项完全可以规避。</p>
</blockquote>
<p>首先需要对 <code>make.conf</code> 和 portage 选项、仓库等进行配置，Portage 相关配置都位于 <code>/etc/portage/</code> 目录下，常见的目录结构如下：</p>
<pre><code>ls -al /etc/portage
总计 20
drwxr-xr-x 1 root root  246 Nov 23 00:26 .
drwxr-xr-x 1 root root 2954 Dec 11 17:46 ..
drwxr-xr-x 1 root root   36 Nov 30 20:52 binrepos.conf
drwxr-xr-x 1 root root  274 Dec 10 18:32 gnupg
-rw-r--r-- 1 root root  915 Nov 23 00:26 make.conf
lrwxrwxrwx 1 root root   75 Nov 22 00:54 make.profile -&gt; ../../var/db/repos/gentoo/profiles/default/linux/amd64/23.0/desktop/systemd
drwxr-xr-x 1 root root   96 Dec 10 19:05 package.accept_keywords
drwxr-xr-x 1 root root    0 Nov 17 14:27 package.mask
drwxr-xr-x 1 root root  150 Dec 10 20:11 package.use
drwxr-xr-x 1 root root   30 Nov 20 22:58 postsync.d
drwxr-xr-x 1 root root   34 Feb  4  2024 profile
drwxr-xr-x 1 root root   56 Nov 23 00:48 repos.conf
drwxr-xr-x 1 root root   44 Nov 25 18:50 savedconfig
</code></pre>
<p>一些常用目录和文件介绍：</p>
<ul>
<li><code>binrepos.conf/</code>：Gentoo 二进制仓库配置，通过二进制包，Gentoo 现在可以做到大多数软件不用编译了，使用更加丝滑。</li>
<li><code>gunpg/</code>：存储密钥的，自动生成，一般不需要碰。</li>
<li><code>make.conf</code>：主要的配置文件，大多数配置都会在这个文件中完成。</li>
<li><code>package.accept_keywords/</code>：目录下每个 <code>conf</code> 后缀文件用作控制一些包使用稳定版还是测试版，后续日常使用会经常用到。</li>
<li><code>package.mask/</code>：也是 conf 后缀文件，对包进行 mask ，可以做到屏蔽特定包更新、切换包的不同版本等。</li>
<li><code>package.use/</code>：同上，控制特定包的 USE 标志，是控制软件开启关闭某些功能特性的关键，经常会用到。</li>
<li><code>repos.conf/</code>：用于控制软件包仓库，可以扩展一些 <code>overlay</code> 仓库比如 <code>gentoo-zh</code>，大大提升了 Gentoo 下可用的软件包数量。</li>
</ul>
<h3>配置 make.conf</h3>
<p>一个配置示例：</p>
<pre><code>## Gentoo make.conf

########### 控制编译参数，源码编译会用到 ####################
COMMON_FLAGS="-march=native -O2 -pipe"
CFLAGS="${COMMON_FLAGS}"
CXXFLAGS="${COMMON_FLAGS}"
FCFLAGS="${COMMON_FLAGS}"
FFLAGS="${COMMON_FLAGS}"
## 制定编译线程数量，不要超过cpu最大线程数
MAKEOPT="-j6"

######## 控制系统级别 Use 标志，对所有软件包生效 #############
## 启用 systemd、vulkan、btrfs 支持
USE_SYSTEM="systemd vulkan egl dbus dist-kernel btrfs"
## wayland 环境
USE_WAYLAND="wayland pipewire qt5 qt6"
## 音频、录屏、蓝牙等支持
USE_MEDIA="screencast gles2 alsa pulseaudio bluetooth"
## 不想要的特性
USE_NO="-gnome -consolekit -gnome-keyring -qt4"
USE="${USE_SYSTEM} ${USE_WAYLAND} ${USE_MEDIA} ${USE_NO}"

################# Emerge &amp; Portage Config ########################
## emerge 启用的功能：二进制包支持、多线程下载支持、美化输出、ccache编译加速支持
## ccache 可以先不启用，这个需要额外安装 ccache 软件，可以系统安装完成后再配置
FEATURES="${FEATURES} getbinpkg binpkg-request-signature parallel-fetch candy ccache"
## emerge 命令默认参数：操作执行前询问用户、显示详细信息
EMERGE_DEFAULT_OPTS="--ask --verbose --complete-graph=y"
## 配置 gentoo 仓库镜像源，启用官方仓库以及 gentoo-zh 仓库镜像
GENTOO_MIRRORS="https://mirrors.ustc.edu.cn/gentoo/ https://mirrors.cqu.edu.cn/gentoo-zh"
## 允许的许可类型：开源不开源的我都要使用
ACCEPT_LICENSE="*"

## 配置 portage 使用的根目录
PORTAGE_DIR="/var/portage"
DISTDIR="${PORTAGE_DIR}/dist"
PKGDIR="${PORTAGE_DIR}/pkgs"
## 配置 portage 使用的临时目录
PORTAGE_TMPDIR="/var/tmp"

## ccache 目录
CCACHE_DIR="/var/tmp/ccache"

################# Other ######################
## 语言配置
L10N="en-US zh-CN"
LC_MESSAGES=en_US.UTF-8
</code></pre>
<p>接下来按照镜像站教程在 <code>/etc/portage/repos.conf/gentoo.conf</code> 文件中设定默认仓库：</p>
<pre><code>[DEFAULT]
main-repo = gentoo

[gentoo]
location = /var/db/repos/gentoo
## 使用 Git 同步，不容易失败
sync-type = git
sync-depth = 1
sync-uri = https://mirrors.ustc.edu.cn/gentoo.git
sync-git-clone-extra-opts = -b stable
auto-sync = yes
sync-rsync-verify-jobs = 1
sync-rsync-verify-metamanifest = yes
sync-rsync-verify-max-age = 24
sync-openpgp-key-path = /usr/share/openpgp-keys/gentoo-release.asc
sync-openpgp-keyserver = hkps://keys.gentoo.org
sync-openpgp-key-refresh-retry-count = 40
sync-openpgp-key-refresh-retry-overall-timeout = 1200
sync-openpgp-key-refresh-retry-delay-exp-base = 2
sync-openpgp-key-refresh-retry-delay-max = 60
sync-openpgp-key-refresh-retry-delay-mult = 4
sync-webrsync-verify-signature = yes
</code></pre>
<p>接下来设置二进制包仓库，避免每个包都源码编译，文件在 <code>/etc/portage/binrepos.conf/gentoobinhost.conf</code>：</p>
<pre><code># These settings were set by the catalyst build script that automatically
# built this stage.
# Please consider using a local mirror.

[binhost]
priority = 99
sync-uri = https://mirrors.ustc.edu.cn/gentoo/releases/amd64/binpackages/23.0/x86-64

[gentoobinhost]
priority = 1
sync-uri = https://distfiles.gentoo.org/releases/amd64/binpackages/23.0/x86-64
</code></pre>
<p><code>nano /etc/portage/package.use/00video_cards</code> 新建 package use 文件配置系统显卡，会为支持的软件开启特定USE，我的显卡是 AMD核显加英伟达独立显卡，我的配置如下（intel 显卡添加 <code>intel</code> 即可）：</p>
<pre><code>*/* VIDEO_CARDS: amdgpu radeonsi nvidia
</code></pre>
<h3>更新仓库和系统</h3>
<p>目前系统软件仓库并没有进行初始化，需要先使用 <code>emerge-webrsync</code> 从远程仓库获取最新的快照，这个会从配置的远程仓库下载最新的每日快照并同步到本地数据库，第一次初始化会自动创建本地仓库目录。</p>
<p>之后使用 <code>eselect profile list</code> 列出系统预设的一些 profile ，这个包含了预设环境必要的 USE 标记和环境变量，如果列表太长可以使用 <code>eselect profile list | less</code> 分页。</p>
<p>可能会输出这样的内容：</p>
<pre><code>Available profile symlink targets:
  [1]   default/linux/amd64/23.0 (stable)
  [2]   default/linux/amd64/23.0/systemd (stable)
  [3]   default/linux/amd64/23.0/desktop (stable)
  [4]   default/linux/amd64/23.0/desktop/systemd (stable) *
  [5]   default/linux/amd64/23.0/desktop/gnome (stable)
</code></pre>
<p>如果使用的 systemd 和桌面环境，使用 <code>eselect profile set 4</code> 选择列出预设前面的数字来选择预设，这会在 <code>/etc/portage/</code> 目录下创建一个指向特定 profile 的目录链接（<code>make.profile</code>）。</p>
<p>使用 <code>emerge --sync</code> 同步软件仓库到最新版本，这会使用 <code>rsync</code> 或者 <code>git</code> 协议来同步更新的软件仓库，取决于之前配置文件中具体配置。</p>
<p>要为特定 CPU 优化编译代码可以配置 <code>CPU_FLAGS_*</code>。首先使用 <code>emerge --ask --oneshot app-portage/cpuid2cpuflags</code> 安装 cpuid2cpuflags 软件获取 CPU_FLAGS 信息，等待安装完成后使用 <code>echo "*/* $(cpuid2cpuflags)" &gt; /etc/portage/package.use/00cpu_flags</code> 将变量写入 package use,这样软件就会在安装时自动使用这些 USE 。</p>
<p>到现在为止基本配置已经完成，可以使用 <code>emerge --ask --verbose --update --deep --newuse @world</code> 来更新整个系统软件包，这会下载最新软件并且安装之前选择的 profile 中必要的软件。这个过程会比较久，取决于选择的 profile ，带 desktop 的会更久。</p>
<p>等待安装完成没报错后使用 <code>emerge --ask --depclean</code> 清理系统中残留的无用包以及过时的包。</p>
<h2>系统设置与本地化</h2>
<h3>配置时区与区域</h3>
<p>创建一个指向目标时区的符号链接：<code>ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime</code></p>
<p>Gentoo 提供了很多支持的语言环境，默认是注释掉的，可以编辑 <code>/etc/locale.gen</code> 文件，取消注释需要的语言环境，比如想要美国区域和中文区域，就可以注释掉 <code>en_US.UTF-8 UTF-8</code>、<code>zh_CN.UTF-8 UTF-8</code> 两行。然后使用 <code>locale-gen</code> 编译语言环境。</p>
<p>安装完成后使用 <code>eselect locale list</code> 列出所有可用的系统级语言环境，使用 <code>eselect locale set xxx</code> 选择列表前数字来选择正确的语言环境。</p>
<p>也可以手动操作，使用 <code>nano /etc/locale.conf</code> 编辑文件，写入如下内容：</p>
<pre><code>LANG="en_US.UTF-8"
LC_MESSAGE="en_US.UTF-8"
LC_COLLATE="C.UTF-8"
</code></pre>
<p>然后重新加载环境变量：<code>env-update &amp;&amp; source /etc/profile &amp;&amp; export PS1="(chroot) ${PS1}"</code></p>
<h3>配置主机名和网络</h3>
<p>使用 <code>echo "你的主机名" &gt; /etc/hostname</code> 设置系统主机名。</p>
<p>桌面环境下配置网络推荐安装 <code>NetworkManager</code> ，使用 <code>emerge --ask net-misc/networkmanager</code> 安装软件，然后使用 <code>systemctl enable NetworkManager</code> 设置开机启动服务。安装 <code>net-wireless/wpa_supplicant</code> 进行 wifi 连接，如果安装后发现某些wifi搜索不到可以考虑启用 wpa_supplicant 软件包的 <code>tkip</code> USE 标记，默认是不启用的。</p>
<p>使用 <code>nano /etc/hosts</code> 编辑系统 hosts 文件，确保有类似下面的记录，确保本机 IP 配置正确：</p>
<pre><code>127.0.0.1  localhost
::1        localhost
</code></pre>
<h3>fstab 配置</h3>
<p>在传统 Linux 系统中，系统启动自动挂载的分区都需要在 <code>/etc/fstab</code> 文件中进行配置，否则启动后系统无法正确挂载。fstab 文件每行指定一个分区，每行包含 6 个字段，由空格分隔：</p>
<ol>
<li><strong>字段1</strong>：需要挂载的块特殊设备或者远程文件系统，通常使用本地磁盘分区的标签或者UUID</li>
<li><strong>字段2</strong>：分区挂载点，即需要挂载到文件系统哪个目录</li>
<li><strong>字段3</strong>：分区的文件系统类型</li>
<li><strong>字段4</strong>：mount 命令挂载分区时的挂载选项，不同文件系统所需挂载选项不同</li>
<li><strong>字段5</strong>：判断是否需要转储分区，一般设置为 0</li>
<li><strong>字段6</strong>：由 fsck 用于确定文件系统检查的顺序，0 为不需要检查，1 用于根文件系统，2用于其余文件系统</li>
</ol>
<p>使用 <code>blkid</code> 可以方便的查看磁盘每个分区的 UUID ，我的 fstab 文件配置：</p>
<pre><code>UUID=75128735-80a5-471c-8ef1-eca9e8ac4835  /         btrfs  defaults,subvol=@,noatime,compress=zstd,ssd,discard=async,space_cache=v2  0  1
UUID=75128735-80a5-471c-8ef1-eca9e8ac4835  /home     btrfs  defaults,subvol=@home,noatime,compress=zstd,ssd,discard=async,space_cache=v2  0  0
UUID=75128735-80a5-471c-8ef1-eca9e8ac4835  /swap     btrfs  subvol=@swap,noatime,ssd  0  0
UUID=75128735-80a5-471c-8ef1-eca9e8ac4835  /var/tmp  btrfs  subvol=@gentoo_tmp,noatime,compress=zstd,ssd,discard=async,space_cache=v2  0  0
UUID=68FA-E8DB    /efi    vfat    umask=0077    0  2

/swap/swapfile    none    swap    defaults    0  0
</code></pre>
<h2>配置内核与固件</h2>
<h3>安装固件和微码</h3>
<p>Linux 系统中一些硬件需要非开源固件才能工作，linux-firmware 包包含了绝大部分的固件，sof固件可以用作补充。微码（微代码）主要用于修复CPU硬件中不稳定、安全问题或其他各种漏洞。</p>
<pre><code>emerge --ask sys-kernel/linux-firmware
emerge --ask sys-firmware/sof-firmware
## Intel CPU 需要安装，AMD CPU已包含在 linux-firmware 包中
emerge --ask sys-firmware/intel-microcode
</code></pre>
<h3>安装引导与内核</h3>
<p>Gentoo 系统可以用 <code>sys-kernel/installkernel</code> 完成自动安装内核、initramfs生成、统一内核映像等。首先编辑特定包 USE 为 installkernel 启用某些功能：<code>nano /etc/portage/package.use/installkernel</code>：</p>
<pre><code>sys-kernel/installkernel dracut grub
</code></pre>
<p>这会为 grub 引导和 initramfs 提供支持，安装内核时会自动运行 <code>grub-mkconfig</code> 生成新配置，自动生成 <code>initramfs</code> 文件。</p>
<p>安装 installkernel 工具和 grub：</p>
<pre><code>emerge --ask sys-boot/grub
emerge --ask sys-kernel/installkernel
## 创建EFI目录
mkdir -pv /efi/EFI/Gentoo
## 安装 grub
grub-install --target=x86_64-efi --efi-directory=/efi --bootloader-id=Gentoo 
</code></pre>
<p>为了尽快启动系统，可以先安装 Gentoo 的预编译内核，进入系统后再安装自编译内核进行特定优化：</p>
<pre><code>emerge --ask sys-kernel/gentoo-kernel-bin

## 运行 grub-mkconfig 确保有grub配置
grub-mkconfig -o /boot/grub/grub.cfg
</code></pre>
<h2>安装工具与启动前检查</h2>
<h3>新建用户</h3>
<p>Linux 一般不直接使用 root 用户，可以新建一个普通用户，然后将这个用户加入到必要的组中，并为 sudo 启用支持。</p>
<pre><code>## 首先重置 root 用户密码
passwd root
## 新建用户并加入必要的组
useradd -m -G wheel,users,video,audio,plugdev,network yourusername
## 设置用户密码
passwd yourusername
## 安装sudo 
emerge --ask app-admin/sudo
## 允许 wheel 组使用sudo
mkdir -pv /etc/sudoers.d
echo "%wheel ALL=(ALL) ALL" &gt; /etc/sudoers.d/wheel
</code></pre>
<h3>安装必要软件</h3>
<pre><code>## 文件系统工具
emerge --ask sys-fs/e2fsprogs # ext4
emerge --ask sys-fs/btrfs-progs # btrfs
emerge --ask sys-fs/dosfstools # mkfs.vfat
emerge --ask sys-fs/ntfs3g # ntfs (windows分区)
## 挂载移动磁盘
emerge --ask udiskie
## 终端文件编辑器
emerge --ask app-editors/neovim
## portage 工具包
emerge --ask app-portage/portage-utils app-portage/gentoolkit app-portage/eix
</code></pre>
<h3>启动前检查</h3>
<ol>
<li>确保 <code>/etc/fstab</code> 文件配置正确</li>
<li>确保 <code>/efi/EFI/Gentoo</code>、<code>/boot/</code> 目录下有文件</li>
<li>确保执行了 grub 安装以及 <code>grub-mkconfig</code> 生成配置文件</li>
<li>设定了 root 密码和普通用户密码，否则重启登陆不了系统</li>
</ol>
<p>检查完成后可以退出 chroot 环境，取消挂载磁盘并重启：</p>
<pre><code>exit
## 如果启用了swap文件
swapoff /swap/swapfile
umount -R /mnt/gentoo
reboot
</code></pre>
]]></content:encoded>
        </item>
    </channel>
</rss>