<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>教程 on 美味芝士</title>
        <link>https://www.whysoso.com/categories/%E6%95%99%E7%A8%8B/</link>
        <description>Recent content in 教程 on 美味芝士</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language><atom:link href="https://www.whysoso.com/categories/%E6%95%99%E7%A8%8B/index.xml" rel="self" type="application/rss+xml" />
        <image>
            <url>https://www.whysoso.com/img/avatar.png</url>
            <title>美味芝士</title>
            <link>https://www.whysoso.com/</link>
        </image><item>
        <title>给 GitHub Pages 绑定自己的子域名：从仓库设置到 DNS 解析、HTTPS 全记录</title>
        <link>https://www.whysoso.com/post/tutorial/github-pages-custom-domain/</link>
        <pubDate>Mon, 26 Oct 2026 00:00:00 +0000</pubDate>
        
        <guid>https://www.whysoso.com/post/tutorial/github-pages-custom-domain/</guid>
        <description>&lt;p&gt;GitHub Pages 默认给 &lt;code&gt;*.github.io&lt;/code&gt; 地址，想换成自己的子域名（如 &lt;code&gt;www.whysoso.com&lt;/code&gt;）只需两步：&lt;strong&gt;GitHub 仓库里声明自定义域名&lt;/strong&gt; + &lt;strong&gt;注册商加 DNS 解析&lt;/strong&gt;。本文用 &lt;code&gt;www.whysoso.com → whyboystudy.github.io&lt;/code&gt; 实操为例，记录完整流程与踩坑。&lt;/p&gt;
&lt;h2 id=&#34;第一步github-仓库里填自定义域名&#34;&gt;第一步：GitHub 仓库里填自定义域名
&lt;/h2&gt;&lt;p&gt;进 Pages 仓库（用户页即 &lt;code&gt;&amp;lt;用户名&amp;gt;.github.io&lt;/code&gt;）→ &lt;strong&gt;Settings → Pages → Custom domain&lt;/strong&gt;，输入子域名（如 &lt;code&gt;www.whysoso.com&lt;/code&gt;），点 Save。&lt;/p&gt;
&lt;p&gt;GitHub 会自动在发布分支根目录生成 &lt;strong&gt;CNAME 文件&lt;/strong&gt;（内容即你的域名），这是它识别自定义域的依据，别手删。&lt;/p&gt;
&lt;p&gt;此时先别勾 &lt;strong&gt;Enforce HTTPS&lt;/strong&gt;——证书未签发前强制会陷入重定向循环。&lt;/p&gt;
&lt;h2 id=&#34;第二步注册商加-dns-记录&#34;&gt;第二步：注册商加 DNS 记录
&lt;/h2&gt;&lt;p&gt;子域名只需加 &lt;strong&gt;1 条 CNAME 记录&lt;/strong&gt;，指向 &lt;code&gt;&amp;lt;用户名&amp;gt;.github.io&lt;/code&gt;（本文即 &lt;code&gt;whyboystudy.github.io&lt;/code&gt;）。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;记录要加在真正托管 DNS 的那家：看域名的 NS 指向谁。本文 &lt;code&gt;whysoso.com&lt;/code&gt; 注册在 Spaceship，但 NS 已指向 Cloudflare，所以记录在 Cloudflare 加。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;方案-a域名在-spaceship自托管-dns&#34;&gt;方案 A：域名在 Spaceship（自托管 DNS）
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Domains → 域名 → Manage → Advanced DNS&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;加 1 条 CNAME：Type &lt;code&gt;CNAME&lt;/code&gt;，Host &lt;code&gt;www&lt;/code&gt;，Value &lt;code&gt;whyboystudy.github.io&lt;/code&gt;，TTL &lt;code&gt;Automatic&lt;/code&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;方案-b域名在-cloudflare或-ns-已指向-cloudflare&#34;&gt;方案 B：域名在 Cloudflare（或 NS 已指向 Cloudflare）
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;选域名 → 左侧 &lt;strong&gt;DNS → Records → Add record&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;加 1 条 CNAME：Type &lt;code&gt;CNAME&lt;/code&gt;，Name &lt;code&gt;www&lt;/code&gt;，Target &lt;code&gt;whyboystudy.github.io&lt;/code&gt;，TTL &lt;code&gt;Auto&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Proxy status 先设 DNS only（灰云）&lt;/strong&gt;，原因见常见坑。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;照抄填的记录表（Cloudflare 版，本文实际用的）：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Type&lt;/th&gt;
					&lt;th&gt;Name&lt;/th&gt;
					&lt;th&gt;目标&lt;/th&gt;
					&lt;th&gt;Proxy&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;CNAME&lt;/td&gt;
					&lt;td&gt;www&lt;/td&gt;
					&lt;td&gt;whyboystudy.github.io&lt;/td&gt;
					&lt;td&gt;DNS only（灰云）&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;第三步验证生效--开启-https&#34;&gt;第三步：验证生效 + 开启 HTTPS
&lt;/h2&gt;&lt;p&gt;DNS 全球生效需几分钟到几小时。验证：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nslookup -type&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;CNAME www.whysoso.com  &lt;span class=&#34;c1&#34;&gt;# 应链到 whyboystudy.github.io&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;dig +short www.whysoso.com            &lt;span class=&#34;c1&#34;&gt;# macOS / Linux 也可用&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;本文实测 www 的 CNAME 链为 &lt;code&gt;whyboystudy.github.io → 185.199.108~111.153&lt;/code&gt;，即生效。&lt;/p&gt;
&lt;p&gt;回到 GitHub &lt;strong&gt;Settings → Pages&lt;/strong&gt;：等 DNS check 变绿勾 → GitHub 自动签发免费证书 → 证书就绪后勾 &lt;strong&gt;Enforce HTTPS&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id=&#34;第四步hugo-改-baseurl-并重新部署&#34;&gt;第四步：Hugo 改 baseURL 并重新部署
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;hugo.yaml&lt;/code&gt; / &lt;code&gt;config.toml&lt;/code&gt; 里的 &lt;code&gt;baseURL&lt;/code&gt; 必须同步，否则站内链接、RSS、sitemap 仍是 &lt;code&gt;.github.io&lt;/code&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;baseURL&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://www.whysoso.com/&amp;#34;&lt;/span&gt;   &lt;span class=&#34;c&#34;&gt;# 本文实际用&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;改完重新生成并推送（push 触发 Actions 自动部署）。&lt;/p&gt;
&lt;h2 id=&#34;第五步防止部署清空自定义域名cname&#34;&gt;第五步：防止部署清空自定义域名（CNAME）
&lt;/h2&gt;&lt;p&gt;如果你用 GitHub Actions 部署（如 &lt;code&gt;peaceiris/actions-gh-pages&lt;/code&gt;），会出现「每次 Action 跑完 Custom domain 变成空、跳回 &lt;code&gt;*.github.io&lt;/code&gt;」——这是最高频的坑，本文 &lt;code&gt;www.whysoso.com&lt;/code&gt; 就栽在这。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;原因&lt;/strong&gt;：在 Settings → Pages 填域名后，GitHub 把域名写进&lt;strong&gt;发布分支根目录的 &lt;code&gt;CNAME&lt;/code&gt; 文件&lt;/strong&gt;来记住它。但这类 Action 是「用 &lt;code&gt;PUBLISH_DIR&lt;/code&gt;（如 &lt;code&gt;./public&lt;/code&gt;）强制覆盖发布分支、清掉其他文件」，而你的 &lt;code&gt;public/&lt;/code&gt; 里&lt;strong&gt;没有 CNAME&lt;/strong&gt; → 每次部署把 GitHub 写好的 CNAME 冲掉 → 域名被清空。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;修法&lt;/strong&gt;：在 Hugo 源码的 &lt;strong&gt;&lt;code&gt;static/CNAME&lt;/code&gt;&lt;/strong&gt; 写一行域名（如 &lt;code&gt;www.whysoso.com&lt;/code&gt;，不要多余空格或空行）。Hugo 构建时把 &lt;code&gt;static/&lt;/code&gt; 原样拷到 &lt;code&gt;public/&lt;/code&gt;，于是 &lt;code&gt;public/CNAME&lt;/code&gt; 每次都进发布分支，域名就稳了。&lt;/p&gt;
&lt;p&gt;注意：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;若工作流 &lt;code&gt;EXTERNAL_REPOSITORY&lt;/code&gt; 指向另一个仓库（本仓库只放源码、部署到 &lt;code&gt;用户名.github.io&lt;/code&gt;），CNAME 落到那个仓库的发布分支——正是 Pages 读取的地方，无需在本仓库根放 CNAME。&lt;/li&gt;
&lt;li&gt;带 CNAME 的部署跑完后，回 Settings → Pages 把自定义域&lt;strong&gt;重填一次&lt;/strong&gt;；之后分支里一直有 CNAME，再也不会被冲掉。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;常见坑&#34;&gt;常见坑
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Cloudflare 代理（橙云）导致证书签发失败&lt;/strong&gt;
加记录时先 &lt;strong&gt;DNS only（灰云）&lt;/strong&gt;，等证书签发、站点正常后再按需开橙云（CDN 加速）。Cloudflare 的 &lt;strong&gt;SSL/TLS 模式设 Full（非 Flexible）&lt;/strong&gt;，否则与 GitHub 的 HTTPS 互重定向成死循环。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;域名未注册就加解析&lt;/strong&gt;
记录只对已注册、NS 已委派的域名生效。先确认 RDAP / whois 域名已存在（本文 &lt;code&gt;whysoso.com&lt;/code&gt; 是当天在 Spaceship 注册、NS 指向 Cloudflare 后才配的）。&lt;/p&gt;
&lt;h2 id=&#34;实战小结&#34;&gt;实战小结
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;whysoso.com&lt;/code&gt; 注册于 Spaceship → NS 指向 Cloudflare → Cloudflare 加 1 条 CNAME（www → &lt;code&gt;whyboystudy.github.io&lt;/code&gt;）→ GitHub Pages 填 &lt;code&gt;www.whysoso.com&lt;/code&gt; → 证书签发后 Enforce HTTPS → Hugo &lt;code&gt;baseURL&lt;/code&gt; 改 &lt;code&gt;https://www.whysoso.com/&lt;/code&gt; 并重部署 → &lt;code&gt;static/CNAME&lt;/code&gt; 锁定域名不被部署清空。核心三句：&lt;strong&gt;GitHub 声明域名、注册商 DNS 加 CNAME 指到 &lt;code&gt;&amp;lt;用户名&amp;gt;.github.io&lt;/code&gt;、证书出来再强制 HTTPS&lt;/strong&gt;。Cloudflare 用户记「先灰云后橙云、SSL 用 Full」即可。&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Ubuntu VPS 搭建 XFCE 远程桌面：从 xrdp 安装到秒断修复、中文输入与 WorkBuddy 实战</title>
        <link>https://www.whysoso.com/post/tutorial/xfce-rdp-ubuntu/</link>
        <pubDate>Sun, 25 Oct 2026 00:00:00 +0000</pubDate>
        
        <guid>https://www.whysoso.com/post/tutorial/xfce-rdp-ubuntu/</guid>
        <description>&lt;p&gt;在一台只有 2~4G 内存的 Ubuntu VPS 上想要图形界面，GNOME/KDE 太重、跑起来又卡又容易崩。XFCE 是更现实的选择：轻量、稳定、依赖少。本文记录一套能长期稳定跑起来的组合 &lt;strong&gt;xrdp + XFCE&lt;/strong&gt;，以及我在真机上踩过的每一个坑——尤其是「连上秒断」「中文输入法不生效」「snap 版浏览器起不来」「WorkBuddy 闪退」这几类。所有命令都来自实际操作，可直接照抄。&lt;/p&gt;
&lt;p&gt;环境假设：Ubuntu 22.04/24.04，全新 VPS，已能 SSH 登录，root 权限。&lt;/p&gt;
&lt;h2 id=&#34;先想清楚为什么是-xrdp--xfce&#34;&gt;先想清楚：为什么是 xrdp + XFCE
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;XFCE 轻量&lt;/strong&gt;：空闲内存占用几百 MB 量级，在低配 VPS 上能留足余量给浏览器和应用。GNOME 在最小安装服务器上经常直接弹出 &amp;ldquo;Oh no! Something has gone wrong&amp;rdquo; 崩溃。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;xrdp 原生 RDP&lt;/strong&gt;：Windows / macOS / 手机都有现成的远程桌面客户端，不用额外装 VNC viewer。默认端口 3389。&lt;/li&gt;
&lt;li&gt;关键结论：&lt;strong&gt;xrdp 默认会去调 GNOME，而最小安装里没有完整的 GNOME，所以必须显式强制 XFCE&lt;/strong&gt;，否则一定崩。这是后面所有配置的前提。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;第一步创建专用登录用户&#34;&gt;第一步：创建专用登录用户
&lt;/h2&gt;&lt;p&gt;不要直接用 root 登录远程桌面，单独建一个普通用户（本文用 &lt;code&gt;napnap&lt;/code&gt;，uid 1001）。很多桌面组件在 root 下行为异常，且安全风险大。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 交互式创建（会提示设密码）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo adduser napnap
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 给 sudo 权限（方便后面装软件）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo usermod -aG sudo napnap
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果用非交互方式：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo useradd -m -s /bin/bash napnap
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo passwd napnap
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo usermod -aG sudo napnap
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;记一下 uid，后面排查会用到：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;id napnap
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# uid=1001(napnap) gid=1001(napnap) ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;第二步安装-xfce&#34;&gt;第二步：安装 XFCE
&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt install -y xfce4 xfce4-goodies
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;xfce4-goodies&lt;/code&gt; 是可选组件包（终端、电源管理、截图等小工具），建议装上，体验完整很多。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;必装的配套：dbus-x11。&lt;/strong&gt; 这一步很多人漏掉，后果就是后面「秒断」。XFCE 启动依赖 D-Bus 会话总线，&lt;code&gt;dbus-x11&lt;/code&gt; 提供 &lt;code&gt;dbus-launch&lt;/code&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt install -y dbus-x11
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;第三步安装-xrdp&#34;&gt;第三步：安装 xrdp
&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt install -y xrdp
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl &lt;span class=&#34;nb&#34;&gt;enable&lt;/span&gt; --now xrdp
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl status xrdp --no-pager
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;装完确认两点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;服务 &lt;code&gt;active (running)&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;3389 在监听：&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo ss -tlnp &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep &lt;span class=&#34;m&#34;&gt;3389&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# LISTEN 0 2 *:3389 *:* users:((&amp;#34;xrdp&amp;#34;,pid=...,fd=11))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果开了防火墙（ufw），放行端口：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo ufw allow 3389/tcp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;云厂商侧（AWS 安全组 / 腾讯云安全组等）也要放行 3389 入站，否则客户端会一直「无法连接」。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;登录用户的会话文件&lt;/strong&gt;：在 &lt;code&gt;napnap&lt;/code&gt; 家目录放一个 &lt;code&gt;.xsession&lt;/code&gt;，告诉 xrdp 用 XFCE 会话：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;xfce4-session&amp;#34;&lt;/span&gt; &amp;gt; /home/napnap/.xsession
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chown napnap:napnap /home/napnap/.xsession
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;即使后面用 &lt;code&gt;startwm.sh&lt;/code&gt; 直接 &lt;code&gt;exec startxfce4&lt;/code&gt;，这个文件也建议保留，能避免 xrdp 找不到会话类型时回退到 GNOME。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;第四步改-startwmsh解决连上秒断&#34;&gt;第四步：改 startwm.sh——解决「连上秒断」
&lt;/h2&gt;&lt;p&gt;这是整篇文章最关键的坑。&lt;strong&gt;不改这里，连上去会黑屏一下立刻回到登录界面&lt;/strong&gt;，日志里写着 &lt;code&gt;Window manager exited quickly (0 secs)&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;xrdp 真正执行的是 &lt;code&gt;/etc/xrdp/startwm.sh&lt;/code&gt;。默认脚本在最小安装下起不来 XFCE。把整文件替换成下面这个经过验证可用的版本：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#!/bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 1. 补回 Xsession 会做的基础环境（语言、编码）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; -r /etc/default/locale &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  . /etc/default/locale
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; LANG LANGUAGE
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 2. XFCE / D-Bus 用户总线依赖 XDG_RUNTIME_DIR，没有就建&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; -z &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$XDG_RUNTIME_DIR&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nv&#34;&gt;XDG_RUNTIME_DIR&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/run/user/&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;id -u&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; XDG_RUNTIME_DIR
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; -d &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$XDG_RUNTIME_DIR&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt; mkdir -p &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$XDG_RUNTIME_DIR&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 3. 阻止 systemd 误判窗管退出、清掉可能失效的旧 dbus 地址&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;unset&lt;/span&gt; SESSION_MANAGER
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;unset&lt;/span&gt; DBUS_SESSION_BUS_ADDRESS
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 4. 强制用 XFCE，并把所有输出重定向到日志方便排查&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; startxfce4 &amp;gt; /home/napnap/startxfce4.log 2&amp;gt;&lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;写入方式（root）：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo cp /etc/xrdp/startwm.sh /etc/xrdp/startwm.sh.bak   &lt;span class=&#34;c1&#34;&gt;# 先备份&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo tee /etc/xrdp/startwm.sh &amp;gt; /dev/null &lt;span class=&#34;s&#34;&gt;&amp;lt;&amp;lt;&amp;#39;EOF&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;#!/bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;if [ -r /etc/default/locale ]; then
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;  . /etc/default/locale
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;  export LANG LANGUAGE
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;fi
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;if [ -z &amp;#34;$XDG_RUNTIME_DIR&amp;#34; ]; then
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;  XDG_RUNTIME_DIR=/run/user/$(id -u)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;  export XDG_RUNTIME_DIR
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;  [ -d &amp;#34;$XDG_RUNTIME_DIR&amp;#34; ] || mkdir -p &amp;#34;$XDG_RUNTIME_DIR&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;fi
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;unset SESSION_MANAGER
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;unset DBUS_SESSION_BUS_ADDRESS
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;exec startxfce4 &amp;gt; /home/napnap/startxfce4.log 2&amp;gt;&amp;amp;1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo chmod +x /etc/xrdp/startwm.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;为什么这样写能防秒断&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;exec startxfce4&lt;/code&gt; 替代默认的 &lt;code&gt;startwm&lt;/code&gt; 调用链，直接把 XFCE 顶上来，不让 xrdp 去碰 GNOME。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;XDG_RUNTIME_DIR&lt;/code&gt; 不设置的话，XFCE 的很多组件（通知、电源、面板插件）找不到用户运行时目录，瞬间退出。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;unset DBUS_SESSION_BUS_ADDRESS&lt;/code&gt; 之后，XFCE 会用第二步装的 &lt;code&gt;dbus-x11&lt;/code&gt; 重新拉起一条干净的会话总线；&lt;strong&gt;前提是 &lt;code&gt;dbus-x11&lt;/code&gt; 已装&lt;/strong&gt;，否则又会 0 秒退。&lt;/li&gt;
&lt;li&gt;把所有输出重定向到 &lt;code&gt;/home/napnap/startxfce4.log&lt;/code&gt; 是排错神器：一旦桌面起不来，SSH 里 &lt;code&gt;tail /home/napnap/startxfce4.log&lt;/code&gt; 看真实报错，比猜快十倍。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;另一种写法是用 &lt;code&gt;exec dbus-launch --exit-with-session startxfce4&lt;/code&gt;，显式由 dbus-launch 托管会话。本文的 &lt;code&gt;unset + exec startxfce4&lt;/code&gt; 在装了 &lt;code&gt;dbus-x11&lt;/code&gt; 时同样稳定，且日志更干净，故采用它。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;改完重启 xrdp 让配置生效：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl restart xrdp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;第五步用客户端连上去&#34;&gt;第五步：用客户端连上去
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Windows：自带「远程桌面连接」（mstsc），计算机填 &lt;code&gt;VPS_IP:3389&lt;/code&gt;，用户名 &lt;code&gt;napnap&lt;/code&gt;，输密码。&lt;/li&gt;
&lt;li&gt;首次连接如果秒断，等几秒重连一次——xrdp 重启后首连偶尔会瞬时抖动。&lt;/li&gt;
&lt;li&gt;连上后如果桌面能停留，说明核心配置已通，下面都是体验优化。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;第六步性能优化降分辨率关合成特效&#34;&gt;第六步：性能优化——降分辨率、关合成特效
&lt;/h2&gt;&lt;p&gt;低配 VPS 上远程桌面最容易卡。两招见效最快：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. 降分辨率&lt;/strong&gt;。云桌面里同时跑 XFCE + 浏览器 + 应用，1080p 很吃带宽和内存。Windows 远程桌面客户端里「显示」选项把分辨率调到 1366×768 或 1280×720，颜色深度 16/24 位即可。也可以在 xrdp 登录界面前的高级选项里设。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. 关掉窗口合成特效（Compositor）&lt;/strong&gt;。XFCE 的窗口半透明、阴影、动画依赖合成器，在虚拟 X 会话里既卡又容易花屏。关掉：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;图形操作：菜单 → 设置 → 窗口管理器微调（Window Manager Tweaks）→ 「合成器」标签页 → 取消勾选「启用显示合成」（Enable display compositing）。&lt;/li&gt;
&lt;li&gt;命令行（需当前已登录桌面会话）：&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;xfconf-query -c xfwm4 -p /general/use_compositing -s &lt;span class=&#34;nb&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;注意：&lt;code&gt;xfconf-query&lt;/code&gt; 依赖当前会话的 D-Bus，必须在一个已经起来的 XFCE 会话里跑；纯 SSH 下会报 D-Bus 错误，那是正常的，去桌面里点界面关即可。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;第七步浏览器用-chrome-deb-替代-snap-版-firefox&#34;&gt;第七步：浏览器——用 Chrome deb 替代 snap 版 Firefox
&lt;/h2&gt;&lt;p&gt;Ubuntu 24.04 的 &lt;code&gt;apt install firefox&lt;/code&gt; 实际装的是 &lt;strong&gt;snap 版&lt;/strong&gt;，而 xrdp 会话不在 snap 的 cgroup 里，启动会直接报错：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;session-*.scope is not a snap cgroup
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;所以别用 snap 版 Firefox。先卸干净，再装 Chrome 的 deb 包：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 卸掉 snap firefox（如果装过）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo snap remove --purge firefox 2&amp;gt;/dev/null
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt remove --purge -y firefox 2&amp;gt;/dev/null
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 装 Chrome 稳定版 deb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt install -y ./google-chrome-stable_current_amd64.deb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;装完在 XFCE 菜单 → 互联网 里就能打开 Chrome。deb 版不受 snap cgroup 限制，远程桌面里正常起。&lt;/p&gt;
&lt;h2 id=&#34;第八步在云桌面里装-workbuddy&#34;&gt;第八步：在云桌面里装 WorkBuddy
&lt;/h2&gt;&lt;p&gt;WorkBuddy 是 Electron 应用。官网下载页没给 Ubuntu/Fedora 的入口（只写了「到系统应用商店下载」），但官方其实构建了 deb/rpm，就挂在自家 CDN 上，通过更新接口就能拿到最新下载地址。先确认架构：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;uname -m   &lt;span class=&#34;c1&#34;&gt;# x86_64 → 用 x64；aarch64 → 用 arm64&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Ubuntu / Debian 系（deb）&lt;/strong&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 从官方更新接口取最新 deb 下载地址（需要 jq；没有就浏览器打开该 URL 复制 url 字段）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;curl -s &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://copilot.tencent.com/v2/update?platform=workbuddy-linux-x64-deb&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; jq -r &lt;span class=&#34;s1&#34;&gt;&amp;#39;.url&amp;#39;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -L -O &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$url&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sha256sum WorkBuddy-linux-x64-deb-*.deb   &lt;span class=&#34;c1&#34;&gt;# 见下方「哈希对不上的提醒」&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt install ./WorkBuddy-linux-x64-deb-*.deb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;apt install&lt;/code&gt; 会自动解析标准库依赖（libgtk-3-0、libnss3、libsecret-1-0 等），装到 &lt;code&gt;/opt/WorkBuddy&lt;/code&gt;，二进制在 &lt;code&gt;/opt/WorkBuddy/workbuddy&lt;/code&gt;，并自动注册 &lt;code&gt;/usr/bin/workbuddy&lt;/code&gt;、把 &lt;code&gt;chrome-sandbox&lt;/code&gt; 设为 4755（setuid）。装完从菜单或终端敲 &lt;code&gt;workbuddy&lt;/code&gt; 即可启动。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fedora / RHEL 系（rpm）&lt;/strong&gt;：换 rpm 通道，其余同理：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;curl -s &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://copilot.tencent.com/v2/update?platform=workbuddy-linux-x64-rpm&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; jq -r &lt;span class=&#34;s1&#34;&gt;&amp;#39;.url&amp;#39;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -L -O &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$url&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo dnf install ./WorkBuddy-linux-x64-rpm-*.rpm
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;ARM 机器把 platform 里的 &lt;code&gt;x64&lt;/code&gt; 换成 &lt;code&gt;arm64&lt;/code&gt; 即可（通道：&lt;code&gt;workbuddy-linux-arm64-deb&lt;/code&gt; / &lt;code&gt;workbuddy-linux-arm64-rpm&lt;/code&gt;）。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;关于「第三方镜像失效」&lt;/strong&gt;：之前 &lt;code&gt;mirror.workbuddy.cn&lt;/code&gt; 这类博客里的地址是假的。正道是用上面的官方更新接口&lt;strong&gt;动态取地址，不要硬编码 URL&lt;/strong&gt;（链接里的构建号每次发版都变）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;哈希对不上的提醒&lt;/strong&gt;：接口 JSON 里的 &lt;code&gt;sha256hash&lt;/code&gt; 字段实测和下载文件对不上（疑似算的不是这个文件），下载后自己 &lt;code&gt;sha256sum&lt;/code&gt; 留档即可，别拿接口的值当校验标准。另外应用内更新在 Linux 上是死循环（提示去官网下、官网又没 Linux 入口），所以升级就重跑一遍上面的接口取新包。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;启动与「闪退」处理&lt;/strong&gt;。在虚拟 X 会话里，Electron/Chromium 常栽在两处：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;chrome-sandbox&lt;/code&gt; 权限不对 → FATAL sandbox 错误。修复：&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo chown root:root /opt/WorkBuddy/chrome-sandbox
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo chmod &lt;span class=&#34;m&#34;&gt;4755&lt;/span&gt; /opt/WorkBuddy/chrome-sandbox   &lt;span class=&#34;c1&#34;&gt;# 即 -rwsr-xr-x&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;官方 deb 的 postinst 安装时会把 &lt;code&gt;chrome-sandbox&lt;/code&gt; 设成 4755，干净安装一般能直接启动；若某次安装/升级后权限不对、或你是手动解包的方式装的，闪退复发时按上面重设一次即可。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;没有 GPU / &lt;code&gt;/dev/shm&lt;/code&gt; 太小 → 渲染进程崩。启动参数加上：&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/opt/WorkBuddy/workbuddy --no-sandbox --disable-gpu --disable-dev-shm-usage
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;为了方便，做一个包装脚本放进 PATH，以后终端敲 &lt;code&gt;workbuddy&lt;/code&gt; 就带参数：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo tee /usr/local/bin/workbuddy &amp;gt; /dev/null &lt;span class=&#34;s&#34;&gt;&amp;lt;&amp;lt;&amp;#39;EOF&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;#!/bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;exec /opt/WorkBuddy/workbuddy --no-sandbox --disable-gpu --disable-dev-shm-usage &amp;#34;$@&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo chmod +x /usr/local/bin/workbuddy
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;桌面菜单的 &lt;code&gt;.desktop&lt;/code&gt; 里 &lt;code&gt;Exec=&lt;/code&gt; 也要指向带参数的命令，否则双击图标仍可能闪退。&lt;/p&gt;
&lt;h2 id=&#34;第九步中文输入法-fcitx5&#34;&gt;第九步：中文输入法 fcitx5
&lt;/h2&gt;&lt;p&gt;XFCE 默认没有中文输入。装 fcitx5：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 先确认没装旧的 / 冲突的，避免环境变量打架&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# （如已装 ibus，可保留，但本文统一用 fcitx5）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt install -y fcitx5 fcitx5-chinese-addons fcitx5-frontend-all im-config
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;im-config -n fcitx5
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;关键坑：xrdp 的 startwm.sh 不会读 &lt;code&gt;~/.profile&lt;/code&gt;&lt;/strong&gt;，所以平时写在 &lt;code&gt;~/.profile&lt;/code&gt; / &lt;code&gt;~/.xinitrc&lt;/code&gt; 里的输入法环境变量在远程桌面里根本不生效。必须把这几行&lt;strong&gt;写进 &lt;code&gt;/etc/xrdp/startwm.sh&lt;/code&gt;&lt;/strong&gt;，放在 &lt;code&gt;exec startxfce4&lt;/code&gt; 之前（见第四步）：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;GTK_IM_MODULE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;fcitx
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;QT_IM_MODULE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;fcitx
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;XMODIFIERS&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;@im&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;fcitx
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;SDL_IM_MODULE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;fcitx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;改完 &lt;code&gt;startwm.sh&lt;/code&gt; 再 &lt;code&gt;sudo systemctl restart xrdp&lt;/code&gt;，重连后：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;桌面右上角托盘出现 fcitx 图标；&lt;/li&gt;
&lt;li&gt;右键图标 → 配置（Configure）→ 加「拼音」或「双拼」输入法；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Ctrl + 空格&lt;/code&gt; 切换中英文。托盘里也能手动点选输入法。&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;WorkBuddy 能帮忙修&lt;/strong&gt;：如果在云桌面里怎么都切不出中文，WorkBuddy 会弹提示「可以让 WorkBuddy 修复输入法问题」，直接让它跑一遍修复即可，省得自己逐个排查环境变量。本质就是确保 fcitx5 的 &lt;code&gt;GTK_IM_MODULE / QT_IM_MODULE / XMODIFIERS&lt;/code&gt; 在远程会话里真正生效——所以前面才强调要把这几行写进 &lt;code&gt;startwm.sh&lt;/code&gt;，而不是只留在 &lt;code&gt;~/.profile&lt;/code&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;第十步会话管理与排错避免logout-后登不上&#34;&gt;第十步：会话管理与排错——避免「logout 后登不上」
&lt;/h2&gt;&lt;p&gt;xrdp 默认「断线不杀会话」。如果反复重启 xrdp，旧 &lt;code&gt;xrdp-sesman&lt;/code&gt; 进程不一定被杀干净，会留下&lt;strong&gt;多个 sesman 实例和孤儿 Xorg 会话&lt;/strong&gt;（&lt;code&gt;:10&lt;/code&gt;、&lt;code&gt;:11&lt;/code&gt; 之类），多个 sesman 抢同一个会话 socket，结果就是 logout 后再也登不上、卡在登录界面。&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;/etc/xrdp/sesman.ini&lt;/code&gt; 打开「断开即杀」，让每次登录都是干净新会话：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo sed -i -E &lt;span class=&#34;s1&#34;&gt;&amp;#39;s/^(KillDisconnected=).*/\1true/; s/^(DisconnectedTimeLimit=).*/\10/&amp;#39;&lt;/span&gt; /etc/xrdp/sesman.ini
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo grep -iE &lt;span class=&#34;s2&#34;&gt;&amp;#34;KillDisconnected|DisconnectedTimeLimit&amp;#34;&lt;/span&gt; /etc/xrdp/sesman.ini
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 应输出 KillDisconnected=true 和 DisconnectedTimeLimit=0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl restart xrdp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;万一已经出现「登不上」，SSH 里清一遍残留再重启：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl stop xrdp
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo pkill -9 -f xrdp
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sleep &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo rm -f /var/run/xrdp/sesman.sock /tmp/.X11-unix/X10 /tmp/.X11-unix/X11
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl start xrdp
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 验证：应只剩 1 个 xrdp + 1 个 xrdp-sesman，没有孤儿 Xorg :10/:11&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ps aux &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep -E &lt;span class=&#34;s2&#34;&gt;&amp;#34;xrdp|Xorg&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep -v grep
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;常见问题排查&#34;&gt;常见问题排查
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;客户端一直「无法连接 / 连不上」&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;3389 没监听：&lt;code&gt;sudo ss -tlnp | grep 3389&lt;/code&gt;；服务没起就 &lt;code&gt;sudo systemctl restart xrdp&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;防火墙/安全组没放行 3389 入站（最常见）。&lt;/li&gt;
&lt;li&gt;VPS 是内网 IP，没绑公网弹性 IP 或没做端口映射。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;连上后秒断（黑屏一下回登录界面）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;看日志：&lt;code&gt;sudo tail -n 30 /var/log/xrdp-sesman.log&lt;/code&gt; 若有 &lt;code&gt;exited quickly (0 secs)&lt;/code&gt;，就是 startwm.sh 问题。&lt;/li&gt;
&lt;li&gt;看 &lt;code&gt;tail -n 50 /home/napnap/startxfce4.log&lt;/code&gt; 的真实报错。&lt;/li&gt;
&lt;li&gt;确认 &lt;code&gt;dbus-x11&lt;/code&gt; 已装、&lt;code&gt;XDG_RUNTIME_DIR&lt;/code&gt; 那段已写进 startwm.sh。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;桌面能进但很卡&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;降分辨率到 1280×720 / 1366×768。&lt;/li&gt;
&lt;li&gt;关掉窗口合成特效（见第六步）。&lt;/li&gt;
&lt;li&gt;内存紧张就加 swap 兜底：&lt;code&gt;sudo fallocate -l 2G /swapfile &amp;amp;&amp;amp; sudo chmod 600 /swapfile &amp;amp;&amp;amp; sudo mkswap /swapfile &amp;amp;&amp;amp; sudo swapon /swapfile &amp;amp;&amp;amp; echo &#39;/swapfile none swap sw 0 0&#39; | sudo tee -a /etc/fstab&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;中文输入法切不出来&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;确认 &lt;code&gt;GTK_IM_MODULE/QT_IM_MODULE/XMODIFIERS&lt;/code&gt; 已写进 &lt;code&gt;startwm.sh&lt;/code&gt;（不是 &lt;code&gt;~/.profile&lt;/code&gt;），并重连。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;im-config -n fcitx5&lt;/code&gt; 后重启会话；托盘里确认输入法已添加。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;浏览器起不来（snap cgroup 报错）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;卸 snap 版 Firefox，改装 Chrome deb（见第七步）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;WorkBuddy 闪退&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;重设 &lt;code&gt;chrome-sandbox&lt;/code&gt; 为 4755，或用 &lt;code&gt;--no-sandbox --disable-gpu --disable-dev-shm-usage&lt;/code&gt; 启动（见第八步）。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;整套下来，一台 2~4G 的 Ubuntu VPS 就能当一个长期稳定、带中文输入、能开浏览器和 WorkBuddy 的云桌面用。核心就三句话：&lt;strong&gt;强制 XFCE 别让 xrdp 碰 GNOME、startwm.sh 把 dbus 和 XDG_RUNTIME_DIR 补好防秒断、snap 类应用换成 deb 版&lt;/strong&gt;。剩下的都是性能与体验的微调。&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Ubuntu 下 Google Chrome 的安装、卸载与验证</title>
        <link>https://www.whysoso.com/post/tutorial/ubuntu-chrome/</link>
        <pubDate>Sun, 25 Oct 2026 00:00:00 +0000</pubDate>
        
        <guid>https://www.whysoso.com/post/tutorial/ubuntu-chrome/</guid>
        <description>&lt;p&gt;Chrome 在 Ubuntu 上的官方包名叫 &lt;code&gt;google-chrome-stable&lt;/code&gt;。它不在 Ubuntu 默认软件源里，所以得从 Google 自己的源或 deb 包安装。下面按「先装对 → 再验证 → 最后能干净卸载」的顺序写，照着做即可。&lt;/p&gt;
&lt;p&gt;文中命令以 &lt;strong&gt;Ubuntu 20.04 / 22.04 / 24.04（amd64）&lt;/strong&gt; 为准，需要 &lt;code&gt;sudo&lt;/code&gt; 权限。其他 Debian 系发行版（如 Linux Mint、Pop!_OS）步骤基本一致。&lt;/p&gt;
&lt;h2 id=&#34;一安装前准备&#34;&gt;一、安装前准备
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;确认系统是 64 位：
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;uname -m
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 输出 x86_64 即可，Chrome 仅提供 64 位 Linux 版&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;能访问外网（deb 与密钥都从 &lt;code&gt;dl.google.com&lt;/code&gt; 下载）。国内网络若慢，可换镜像或挂代理，但&lt;strong&gt;不要&lt;/strong&gt;从第三方站下载 deb，避免被植入篡改包。&lt;/li&gt;
&lt;li&gt;更新一下本地包索引（可选，但能减少依赖冲突）：
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;二方法一通过官方仓库安装推荐&#34;&gt;二、方法一：通过官方仓库安装（推荐）
&lt;/h2&gt;&lt;p&gt;仓库方式会把 Google 的签名密钥和源加入系统，之后 &lt;code&gt;sudo apt upgrade&lt;/code&gt; 就能跟着一起升级 Chrome，省去手动重装。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 1. 创建存放密钥的目录（/etc/apt/keyrings 是推荐位置）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo install -m &lt;span class=&#34;m&#34;&gt;0755&lt;/span&gt; -d /etc/apt/keyrings
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 2. 下载 Google 签名公钥并转成 gpg 二进制格式&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo wget -q -O - https://dl.google.com/linux/linux_signing_key.pub &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sudo gpg --dearmor -o /etc/apt/keyrings/google-chrome.gpg
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo chmod a+r /etc/apt/keyrings/google-chrome.gpg
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 3. 写入软件源（stable 通道）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;deb [arch=amd64 signed-by=/etc/apt/keyrings/google-chrome.gpg] \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;  http://dl.google.com/linux/chrome/deb/ stable main&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sudo tee /etc/apt/sources.list.d/google-chrome.list &amp;gt; /dev/null
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 4. 更新索引并安装&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt install -y google-chrome-stable
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果第 2 步 &lt;code&gt;gpg --dearmor&lt;/code&gt; 提示找不到 &lt;code&gt;gpg&lt;/code&gt;，先装一下：&lt;code&gt;sudo apt install -y gnupg&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id=&#34;三方法二直接下载-deb-包安装&#34;&gt;三、方法二：直接下载 deb 包安装
&lt;/h2&gt;&lt;p&gt;不想加源、只想一次性装好，用这个方法最快。缺点是不能随系统自动更新，升级得重新下载。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 1. 下载最新稳定版 deb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 2. 安装（apt 会自动处理依赖，包括拉取 libnss3 等）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt install -y ./google-chrome-stable_current_amd64.deb
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 3. 装完可删除下载的 deb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rm -f google-chrome-stable_current_amd64.deb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;注意 &lt;code&gt;./&lt;/code&gt; 不能省：直接 &lt;code&gt;apt install 文件名.deb&lt;/code&gt; 会被当成「从源里找叫这个名字的包」而报错，加上 &lt;code&gt;./&lt;/code&gt; 才表示「本地文件路径」。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;四验证安装是否正确&#34;&gt;四、验证安装是否正确
&lt;/h2&gt;&lt;p&gt;装完后别急着用，先确认装的是 Google 官方版本、路径也在预期位置。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 1. 看版本号（能正常输出版本即安装成功）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;google-chrome-stable --version
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 例：Google Chrome 130.0.6723.58&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 2. 看可执行文件装到哪了&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;which google-chrome-stable
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 正常返回：/usr/bin/google-chrome-stable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 3. 校验签名来源（确认是 Google 的包，而非第三方）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;apt-cache policy google-chrome-stable
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 输出里应有 *** 标记来自 dl.google.com/linux/chrome/deb 的行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;有图形界面时，直接按 &lt;code&gt;Super&lt;/code&gt; 键搜 &amp;ldquo;Chrome&amp;rdquo; 或在终端运行 &lt;code&gt;google-chrome-stable &amp;amp;&lt;/code&gt; 即可启动。&lt;/p&gt;
&lt;h3 id=&#34;无图形界面的服务器验证headless&#34;&gt;无图形界面的服务器验证（headless）
&lt;/h3&gt;&lt;p&gt;服务器通常没桌面，无法开窗口，用无头模式跑一个最小验证：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 连 GPU / 沙箱都不需要，能正常拉回页面 DOM 即代表可用&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;google-chrome-stable --headless --no-sandbox --disable-gpu &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  --dump-dom https://www.google.com &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; head -n &lt;span class=&#34;m&#34;&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;--no-sandbox&lt;/code&gt; 在 root 用户或受限容器里常是必需的；正常桌面用户不必加。如果报错 &lt;code&gt;error while loading shared libraries&lt;/code&gt;，多半缺依赖，执行 &lt;code&gt;sudo apt install -y libnss3 libatk-bridge2.0-0 libgtk-3-0&lt;/code&gt; 补齐即可。&lt;/p&gt;
&lt;h2 id=&#34;五卸载与彻底清理&#34;&gt;五、卸载与彻底清理
&lt;/h2&gt;&lt;h3 id=&#34;1-卸载主程序&#34;&gt;1. 卸载主程序
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 仅移除程序，保留个人配置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt remove google-chrome-stable
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 连配置文件一起删（purge）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt purge google-chrome-stable
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 清理因依赖它而装、现已无用的包&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt autoremove
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;2-清理仓库方式留下的源与密钥&#34;&gt;2. 清理仓库方式留下的源与密钥
&lt;/h3&gt;&lt;p&gt;如果你用的是「方法一」，卸载后最好把源和密钥一并删掉，否则 &lt;code&gt;apt update&lt;/code&gt; 仍会去连 Google 的源：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo rm -f /etc/apt/sources.list.d/google-chrome.list
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo rm -f /etc/apt/keyrings/google-chrome.gpg
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt update   &lt;span class=&#34;c1&#34;&gt;# 确认不再报 Google 源相关错误&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;3-删除用户个人数据可选&#34;&gt;3. 删除用户个人数据（可选）
&lt;/h3&gt;&lt;p&gt;浏览器缓存、登录态等存在用户目录，上面步骤不会动它。需要彻底清空：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rm -rf ~/.config/google-chrome
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;六常见问题&#34;&gt;六、常见问题
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Q：安装时提示 &lt;code&gt;N: Download is performed unsandboxed as root&lt;/code&gt;？&lt;/strong&gt;
只是 apt 的提示信息，不是错误，deb 已正常装好，可忽略。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q：启动时报 &lt;code&gt;Failed to move to new namespace&lt;/code&gt;？&lt;/strong&gt;
沙箱在容器 / 某些内核配置下会失败，加 &lt;code&gt;--no-sandbox&lt;/code&gt; 启动，或在服务器场景直接用上面的 headless 命令。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q：想装测试版 / 开发版？&lt;/strong&gt;
包名分别是 &lt;code&gt;google-chrome-beta&lt;/code&gt; 和 &lt;code&gt;google-chrome-unstable&lt;/code&gt;，用同样的方式把 &lt;code&gt;google-chrome-stable&lt;/code&gt; 换成对应名字即可。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q：怎么确认没装成第三方改包？&lt;/strong&gt;
用 &lt;code&gt;apt-cache policy google-chrome-stable&lt;/code&gt; 看版本来源是否来自 &lt;code&gt;dl.google.com/linux/chrome/deb&lt;/code&gt;，再核对 &lt;code&gt;apt-key list&lt;/code&gt; 或 &lt;code&gt;/etc/apt/keyrings/google-chrome.gpg&lt;/code&gt; 的指纹是否与 Google 官方公布一致。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;按上面的顺序，安装、验证、卸载都能干净走通。日常使用推荐「方法一」的仓库方式，升级省心；一次性临时用选「方法二」更快。&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Cloudflare R2 实战指南：建桶、上传、缓存与防盗链</title>
        <link>https://www.whysoso.com/post/tutorial/cloudflare-r2/</link>
        <pubDate>Wed, 21 Oct 2026 00:00:00 +0000</pubDate>
        
        <guid>https://www.whysoso.com/post/tutorial/cloudflare-r2/</guid>
        <description>&lt;p&gt;R2 是 Cloudflare 的对象存储，兼容 S3 接口，最大的卖点是没有出网流量费。很多人第一次用它，是因为把图片、视频放在别处被流量费咬了一口，换过来之后发现账单只剩存储和请求两项。&lt;/p&gt;
&lt;p&gt;这篇文章按实际操作顺序写：建桶、传文件、绑域名、配缓存、加防盗链，最后是日常运维和排错。文中价格与免费额度以 Cloudflare 官方文档为准，具体以控制台显示为实。&lt;/p&gt;
&lt;h2 id=&#34;先搞清楚-r2-的计费模型&#34;&gt;先搞清楚 R2 的计费模型
&lt;/h2&gt;&lt;p&gt;R2 只收三样东西的钱：存储量、Class A 操作、Class B 操作。出网流量（Egress）对所有存储类型都是零费用，这是它和 S3 最本质的区别。&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;项目&lt;/th&gt;
					&lt;th&gt;Standard&lt;/th&gt;
					&lt;th&gt;Infrequent Access&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;存储&lt;/td&gt;
					&lt;td&gt;$0.015 / GB-月&lt;/td&gt;
					&lt;td&gt;$0.01 / GB-月&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Class A 操作&lt;/td&gt;
					&lt;td&gt;$4.50 / 百万次&lt;/td&gt;
					&lt;td&gt;$9.00 / 百万次&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Class B 操作&lt;/td&gt;
					&lt;td&gt;$0.36 / 百万次&lt;/td&gt;
					&lt;td&gt;$0.90 / 百万次&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;数据取回费&lt;/td&gt;
					&lt;td&gt;无&lt;/td&gt;
					&lt;td&gt;$0.01 / GB&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;最短存储期&lt;/td&gt;
					&lt;td&gt;无&lt;/td&gt;
					&lt;td&gt;30 天&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;出网流量&lt;/td&gt;
					&lt;td&gt;免费&lt;/td&gt;
					&lt;td&gt;免费&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;免费额度只对 Standard 生效，每月 10 GB 存储、100 万次 Class A、1000 万次 Class B。个人博客、小站点的图片和附件基本用不到付费区间。&lt;/p&gt;
&lt;p&gt;理解 Class A 和 Class B 的区别，是省钱的关键：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Class A（贵，写类）&lt;/strong&gt;：PutObject、CopyObject、ListObjects、CreateMultipartUpload、UploadPart 等，凡是&amp;quot;改动状态&amp;quot;的算这里。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Class B（便宜，读类）&lt;/strong&gt;：GetObject、HeadObject 等读取操作。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;免费&lt;/strong&gt;：DeleteObject、DeleteBucket、AbortMultipartUpload。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;有一个容易被忽略的细节：&lt;strong&gt;计费单位向上取整&lt;/strong&gt;。做了 100 万零 1 次 Class A，按 200 万次计费；存了 1.1 GB-月，按 2 GB-月计费。所以别写出&amp;quot;每秒 List 一次目录&amp;quot;这种代码，List 属于 Class A，会把免费额度吃得很快。&lt;/p&gt;
&lt;h2 id=&#34;建桶与控制台操作&#34;&gt;建桶与控制台操作
&lt;/h2&gt;&lt;p&gt;登录 Cloudflare 控制台，左侧菜单进 R2，首次使用需要绑定支付方式（即使只用免费额度）。&lt;/p&gt;
&lt;p&gt;建桶时注意两点：桶名全局唯一、创建后&lt;strong&gt;不能改名&lt;/strong&gt;；存储位置（Location）选自动或就近区域即可，R2 会自动做全球分布，位置主要影响写入延迟和数据驻留合规。&lt;/p&gt;
&lt;p&gt;建好之后，桶的 Settings 页面有几个开关值得先说清楚：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Public access → R2.dev subdomain&lt;/strong&gt;：打开后会给你一个 &lt;code&gt;pub-xxxxxxxx.r2.dev&lt;/code&gt; 的地址，能直接公网访问。&lt;strong&gt;这个域名只适合测试&lt;/strong&gt;，Cloudflare 明确说明它有速率限制、不保证性能，不要拿它上生产。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Public access → Custom Domains&lt;/strong&gt;：绑定自己的域名，这才是生产用法，下一节细说。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CORS Policy&lt;/strong&gt;：前端直传或跨域读取时需要配，否则浏览器会拦。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;用-api-token-和命令行传文件&#34;&gt;用 API Token 和命令行传文件
&lt;/h2&gt;&lt;p&gt;控制台能拖拽上传，但批量操作还是要靠命令行。先在 R2 页面右侧的 &amp;ldquo;Manage R2 API Tokens&amp;rdquo; 创建一个 Token，权限选 &lt;strong&gt;Object Read &amp;amp; Write&lt;/strong&gt;，可以限定到某个桶。记下三样东西：Access Key ID、Secret Access Key、以及账户的 S3 端点：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;https://&amp;lt;ACCOUNT_ID&amp;gt;.r2.cloudflarestorage.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;方式一：rclone&lt;/strong&gt;（适合同步目录、断点续传）&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;[r2]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;type&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;s3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;provider&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;Cloudflare&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;access_key_id&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;lt;ACCESS_KEY_ID&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;secret_access_key&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;lt;SECRET_ACCESS_KEY&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;endpoint&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;https://&amp;lt;ACCOUNT_ID&amp;gt;.r2.cloudflarestorage.com&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;acl&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;private&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 上传整个目录，并带上缓存头&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rclone copy ./images r2:my-bucket/images &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  --header-upload &lt;span class=&#34;s2&#34;&gt;&amp;#34;Cache-Control: public, max-age=31536000, immutable&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  --progress
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;方式二：AWS CLI&lt;/strong&gt;（R2 兼容 S3，换个 endpoint 就能用）&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;aws configure &lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; aws_access_key_id &amp;lt;ACCESS_KEY_ID&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;aws configure &lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; aws_secret_access_key &amp;lt;SECRET_ACCESS_KEY&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;aws configure &lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; region auto
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;aws --endpoint-url https://&amp;lt;ACCOUNT_ID&amp;gt;.r2.cloudflarestorage.com &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  s3 cp ./dist s3://my-bucket/assets --recursive &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  --cache-control &lt;span class=&#34;s2&#34;&gt;&amp;#34;public, max-age=31536000, immutable&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;上传时顺手把 &lt;code&gt;Cache-Control&lt;/code&gt; 写进对象元数据，是后面缓存能生效的前提。带内容哈希的静态资源（&lt;code&gt;app.a1b2c3.js&lt;/code&gt; 这种）可以放心用一年；会变的文件用 &lt;code&gt;max-age=86400&lt;/code&gt; 更稳。&lt;/p&gt;
&lt;h2 id=&#34;绑定自定义域名缓存才有可能生效&#34;&gt;绑定自定义域名，缓存才有可能生效
&lt;/h2&gt;&lt;p&gt;这一步是整个教程的分水岭。&lt;strong&gt;用 r2.dev 域名访问，请求根本不经过 Cloudflare 的 CDN 缓存&lt;/strong&gt;，也就谈不上缓存命中、WAF 和速率限制；只有绑定自定义域名并开启橙色云代理，这些能力才会挂上去。&lt;/p&gt;
&lt;p&gt;操作路径：桶 → Settings → Public access → Custom Domains → Connect Domain，填一个子域名，例如 &lt;code&gt;cdn.example.com&lt;/code&gt;。前提是这个域名已经托管在同一个 Cloudflare 账户下，系统会自动写入一条 CNAME 记录，&lt;strong&gt;代理状态必须是橙色云（Proxied）&lt;/strong&gt;，灰色云等于直连，缓存和防护全部失效。&lt;/p&gt;
&lt;p&gt;绑定完成后验证两件事：访问 &lt;code&gt;https://cdn.example.com/你的文件名&lt;/code&gt; 能拿到内容；响应头里出现 &lt;code&gt;cf-cache-status&lt;/code&gt;，初始一般为 &lt;code&gt;MISS&lt;/code&gt; 或 &lt;code&gt;DYNAMIC&lt;/code&gt;，配好缓存规则后应该变成 &lt;code&gt;HIT&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id=&#34;缓存两层配置缺一不可&#34;&gt;缓存：两层配置，缺一不可
&lt;/h2&gt;&lt;p&gt;R2 前面这层缓存由 Cloudflare 负责，效果取决于两处配置：对象自带的 &lt;code&gt;Cache-Control&lt;/code&gt; 头，和域名上的 Cache Rules。前者是&amp;quot;源站怎么说&amp;quot;，后者是&amp;quot;CDN 怎么执行&amp;quot;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一层：对象元数据。&lt;/strong&gt; 上传时设置 &lt;code&gt;Cache-Control: public, max-age=31536000, immutable&lt;/code&gt;，告诉 CDN 和浏览器这个文件可以长期缓存。已经上传的文件可以改元数据，或干脆重传。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第二层：Cache Rules。&lt;/strong&gt; 路径是域名 → Caching → Cache Rules → Create rule。一条够用的规则长这样：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;规则名：&lt;code&gt;r2-cdn-cache&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;匹配条件：&lt;code&gt;Hostname equals cdn.example.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;缓存资格：Eligible for cache&lt;/li&gt;
&lt;li&gt;Edge TTL：Ignore cache-control header and use this TTL → 30 天（或 7 天）&lt;/li&gt;
&lt;li&gt;Browser TTL：Respect origin（沿用源站）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;为什么不直接沿用源站的 &lt;code&gt;Cache-Control&lt;/code&gt;？因为 Cloudflare 的默认行为只缓存常见静态扩展名，HTML 之类默认不缓存。用 Cache Rules 显式声明 TTL，能让&amp;quot;边缘缓存多久&amp;quot;脱离源站头的限制，特别是当对象上传时压根没设头的情况下。&lt;/p&gt;
&lt;p&gt;不同内容的 TTL 可以参考这个思路：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;内容&lt;/th&gt;
					&lt;th&gt;Edge TTL&lt;/th&gt;
					&lt;th&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;图片、字体&lt;/td&gt;
					&lt;td&gt;30 天&lt;/td&gt;
					&lt;td&gt;基本不改，缓存收益最高&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;带哈希的 JS/CSS&lt;/td&gt;
					&lt;td&gt;1 年&lt;/td&gt;
					&lt;td&gt;文件名变即内容变，可 immutable&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;视频、压缩包&lt;/td&gt;
					&lt;td&gt;30 天&lt;/td&gt;
					&lt;td&gt;体积大，命中一次省一次 Class B&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;PDF、文档&lt;/td&gt;
					&lt;td&gt;7 天&lt;/td&gt;
					&lt;td&gt;偶尔更新，留一点回旋余地&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;JSON、接口响应&lt;/td&gt;
					&lt;td&gt;不缓存&lt;/td&gt;
					&lt;td&gt;动态内容，缓存会读到脏数据&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;缓存配好之后，收益是双重叠加的：&lt;strong&gt;命中边缘缓存的请求不会打到 R2，既不消耗 Class B 操作，也不产生任何存储读取&lt;/strong&gt;。一个日访问几万次的图片站，缓存命中率从 40% 提到 95%，账单差距可能是一个数量级。&lt;/p&gt;
&lt;p&gt;改完规则记得刷缓存：Caching → Purge Cache，可以按 URL 刷，也可以整站刷。否则旧的边缘副本会一直按老 TTL 活着。&lt;/p&gt;
&lt;h2 id=&#34;防盗链先认清它能防到什么程度&#34;&gt;防盗链：先认清它能防到什么程度
&lt;/h2&gt;&lt;p&gt;防盗链的本质是&amp;quot;判断请求是不是从我的页面发起的&amp;quot;。绕不过去的前提是：&lt;strong&gt;Referer 可以由客户端随意伪造&lt;/strong&gt;，所以它只能挡住直接引用你链接的一般站点，挡不住有心人。真正要保护付费资源，得用签名 URL 或鉴权代理。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;方案一：WAF 自定义规则校验 Referer（最常用）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;路径：域名 → Security → WAF → Custom rules → Create rule。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;(http.host eq &amp;#34;cdn.example.com&amp;#34; and http.referer ne &amp;#34;&amp;#34; and not http.referer contains &amp;#34;example.com&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;动作选 Block。这条规则的意思是：访问 CDN 域名、带了 Referer、但 Referer 不是自己站点的，一律拦截。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;http.referer ne &amp;quot;&amp;quot;&lt;/code&gt; 这个条件很重要——浏览器直接打开图片、或者从微信/QQ 里点开时，Referer 往往是空的。加了这一句表示&amp;quot;放行空 Referer&amp;quot;，体验更好；如果资源敏感，就去掉它，让空 Referer 也被挡。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;方案二：签名 URL（适合私有资源）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;公开资源用 Referer 够了，付费下载、限时链接这种就要签名。R2 支持 S3 预签名，生成的是带时效的临时地址：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;aws --endpoint-url https://&amp;lt;ACCOUNT_ID&amp;gt;.r2.cloudflarestorage.com &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  s3 presign s3://my-bucket/private/report.pdf --expires-in &lt;span class=&#34;m&#34;&gt;3600&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;链接一小时后失效，转发出去也没用。缺点是每个文件都要单独生成，适合后端按需签发，不适合海量静态资源。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;方案三：Worker 做鉴权代理&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;把域名指向 Worker，在 Worker 里校验 token、Cookie、UA 或调用频率，通过后再用 &lt;code&gt;env.MY_BUCKET.get(key)&lt;/code&gt; 从 R2 取对象返回。灵活度最高，可以加黑白名单、限速、按用户计次，代价是要写代码，且 Worker 请求本身有免费额度限制。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;方案四：速率限制兜底&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;防盗链防的是&amp;quot;别人引用&amp;quot;，防不住&amp;quot;有人拿脚本刷你的公开链接&amp;quot;。域名 → Security → WAF → Rate limiting rules，对同一 IP 设阈值，比如 10 秒内超过 100 次请求就 Block 或 Managed Challenge。免费计划也提供少量规则额度，配一条针对大文件路径的规则很划算。&lt;/p&gt;
&lt;p&gt;组合起来用：&lt;strong&gt;WAF 挡盗链、Rate Limiting 挡刷量、签名 URL 保敏感资源&lt;/strong&gt;，三层各管一段。&lt;/p&gt;
&lt;h2 id=&#34;日常运维迁移清理与成本&#34;&gt;日常运维：迁移、清理与成本
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;从 S3 搬数据&lt;/strong&gt;有两种官方工具：Super Slurper 适合一次性批量迁移，会自动分片、重试；Sippy 适合渐进式迁移，请求命中 R2 就直接返回，没有就从源桶拉过来并回填，业务可以先切流量再慢慢搬。两者工具本身免费，只算 R2 的 Class A 操作费。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;对象生命周期&lt;/strong&gt;：桶的 Settings 里可以配生命周期规则，比如把 90 天未访问的对象转到 Infrequent Access，或直接删除临时文件。注意 IA 有 30 天最短存储期，删早了照样按 30 天收钱，别拿它存短期文件。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;成本自查清单&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;缓存命中率是否够高（&lt;code&gt;cf-cache-status: HIT&lt;/code&gt; 的占比）&lt;/li&gt;
&lt;li&gt;有没有代码在频繁 &lt;code&gt;ListObjects&lt;/code&gt;（这是 Class A，很贵）&lt;/li&gt;
&lt;li&gt;大文件是否走了分片上传并正常完成（残留的分片会占存储）&lt;/li&gt;
&lt;li&gt;免费额度是否已经贴近上限（10 GB / 100 万 Class A / 1000 万 Class B）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;常见问题排查&#34;&gt;常见问题排查
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;访问返回 403&lt;/strong&gt;：先看对象是不是私有、域名有没有绑对；如果是刚配的 WAF 规则，去 Security Events 里看是不是被自己拦了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;cf-cache-status&lt;/code&gt; 一直是 DYNAMIC&lt;/strong&gt;：说明请求没被当作可缓存内容。检查域名是否橙色云、Cache Rule 是否真的命中、文件扩展名是否在缓存范围内。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;改了文件但访问还是旧内容&lt;/strong&gt;：边缘缓存没过期。要么 Purge 缓存，要么用带哈希的文件名做版本控制，后者才是长久做法。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;前端直传报 CORS 错误&lt;/strong&gt;：桶的 Settings 里配 CORS Policy，把允许的 Origin 写清楚，&lt;code&gt;AllowedMethods&lt;/code&gt; 至少包含 &lt;code&gt;PUT&lt;/code&gt;，需要读取再加 &lt;code&gt;GET&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;上传大文件失败&lt;/strong&gt;：超过 5 GB 的对象必须走分片上传（Multipart Upload），普通 &lt;code&gt;PutObject&lt;/code&gt; 单次上限是 5 GB，用 rclone 或 SDK 会自动处理。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;怀疑被刷&lt;/strong&gt;：看 R2 的请求量图表和域名的流量分析，对照 Class A/B 操作数。异常增长通常来自某个公开链接被批量请求，先上 Rate Limiting，再考虑给该路径加签名。&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>