
[{"content":"","date":"2025-10-18","externalUrl":null,"permalink":"/tags/blog/","section":"Tags","summary":"","title":"Blog","type":"tags"},{"content":"","date":"2025-10-18","externalUrl":null,"permalink":"/posts/","section":"Posts","summary":"","title":"Posts","type":"posts"},{"content":"","date":"2025-10-18","externalUrl":null,"permalink":"/","section":"Sunong2008's Blog","summary":"","title":"Sunong2008's Blog","type":"page"},{"content":"","date":"2025-10-18","externalUrl":null,"permalink":"/tags/","section":"Tags","summary":"","title":"Tags","type":"tags"},{"content":" 内容为随笔，未仔细查证，全是个人理解，可能不够严谨 1 起因 # Waline评论系统用Vercel部署最简单，但是被墙了。所以用域名去绑定vercel.cdn.yt-blog.top。这个中转域名本身是个加速器，会选择访问速度最快的 Vercel 节点来返回评论系统内容。\n由于我只有一个域名，所以尝试了“域名分拆”，发现原来很简单。而且好处很明显：为域名下的每个分支单独指定它的访问目标，灵活地把网站拆到不同的服务器上。\n2 我的配置 # 图片下面还有一部分就不放出来了\nsun-ong.top 和 www.sun-ong.top\n都被解析到 sunong.pages.dev，也就是 Cloudflare Pages。这是我的主站和静态内容所在的地方，所以访问这两个域名时，浏览器会直接到 Cloudflare 的服务器拿内容。 comment.sun-ong.top\nWaline用Vercel部署最简单，但是被墙了。这样设置能解析到 vercel.cdn.yt-blog.top。这个中转域名本身是个加速器，它会帮我选择访问速度最快的 Vercel 节点来返回评论系统内容。 3 原理 # DNS\nDNS（Domain Name System）就像互联网的“电话簿”，它负责把我们熟悉的域名（例如 sun-ong.top）转换成电脑能理解的 IP 地址（例如 104.21.3.15），这样浏览器才能找到服务器拿内容。\n子域名\n域名可以有不同的层级，最顶层是主域名（比如 sun-ong.top），在它前面加东西就是子域名： www.sun-ong.top comment.sun-ong.top\n每个子域名可以独立配置指向不同的服务器。\nA记录和CNAME\nA记录：直接告诉浏览器“这个域名对应这个 IP 地址”。\n例如：\nsun-ong.top → 104.21.3.15 www.sun-ong.top → 104.21.3.15 CNAME记录：告诉浏览器“这个域名其实是另外一个域名的别名，让它去解析那个域名”。\n例如：\ncomment.sun-ong.top → vercel.cdn.yt-blog.top 这就意味着，浏览器访问 comment.sun-ong.top 时，会先去查 vercel.cdn.yt-blog.top 的 IP，然后再访问对应服务器。\n为什么每个子域名可以对应不同的记录\n因为 DNS 是按域名层级查找的，所以每个子域名都可以单独设置记录。\nsun-ong.top 和 www.sun-ong.top 可以指向同一个 Cloudflare Pages\ncomment.sun-ong.top 可以指向完全不同的加速器或 Vercel 节点\n这样就实现了“域名分拆”，每个部分独立托管，互不影响。\n","date":"2025-10-18","externalUrl":null,"permalink":"/posts/blogs/%E5%9F%9F%E5%90%8D%E5%88%86%E6%8B%86/","section":"Posts","summary":"","title":"域名分拆","type":"posts"},{"content":" 少数内容由AI生成 1 前言 # 使用 Hugo 的 Blowfish 主题时，我们经常需要调整一些样式、字体或配置文件，以满足个性化需求。\n然而，当主题是以 Git 子模块（submodule） 的形式存在时，直接修改主题文件会带来一个常见问题：\n这些改动无法正常推送到远程仓库，从而导致更新或协作困难。\n本文将介绍一种通用、优雅的解决方案：\n在保留自定义修改的同时，仍能轻松同步上游更新。\n本文方法不仅适用于 Blowfish，也适用于任何以 Git 子模块引入的第三方项目。\n2 问题场景 # 假设你修改了 Blowfish 主题（如调整字体），随后在推送主仓库时遇到错误：\n下列子模组路径所包含的修改在任何远程源中都找不到： themes/blowfish 请尝试 git push --recurse-submodules=on-demand 或者进入到子目录执行 git push 以推送至远程。 致命错误：正在终止。 原因很简单：\n子模块中的修改仅存在于本地，Git 无法在远程找到对应的提交。\n这通常发生在以下情况：\n你在子模块中直接修改了文件；\n子模块处于 detached HEAD 状态；\n没有将修改推送到任何可访问的远程仓库。\n3 解决方案：Fork 并建立自定义子模块 # 核心思路是：\n为主题（或子模块）创建一个属于你自己的 Fork，\n在其中保存自定义修改，\n同时保持从官方仓库获取更新的能力。\n还有个方法：删除子模块，把字体修改直接保存到主仓库中\n不在本文中介绍，请移步至《Blowfish 文档外自定义指南》-字体修改 的偏后部分\n3.1 第一步：检查当前子模块状态 # 进入主题目录，确认修改情况：\ncd themes/blowfish git status git log --oneline -5 若出现类似输出：\n头指针分离自 3e652b37 无文件要提交，干净的工作区 770a2a67 (HEAD) 自定义字体 d0db9190 (origin/main, origin/HEAD) fix user.json 分离自说明当前处于 detached HEAD 状态（即未在任何分支上）。\n我们需要将这个提交移动到自己的分支中。\n3.2 第二步：Fork 官方主题仓库 # 打开 Blowfish 官方仓库\nhttps://github.com/nunocoracao/blowfish\n点击右上角 Fork 按钮\n将仓库 Fork 到自己的 GitHub 账号\n3.3 第三步：配置子模块使用你的 Fork # 在子模块目录中执行以下命令（这里以custom-font为分支名称）：\n# 确认当前远程 git remote -v # 添加你的 Fork git remote add myfork https://github.com/你的用户名/blowfish.git # 创建分支保存自定义修改 git checkout -b custom-font 770a2a67 # 推送到你的 Fork git push myfork custom-font 3.4 第四步：让主仓库指向你的 Fork # 回到 Hugo 博客根目录：\ncd ../.. 编辑 .gitmodules 文件，将内容改为：\n[submodule \u0026#34;themes/blowfish\u0026#34;] path = themes/blowfish url = https://github.com/你的用户名/blowfish.git 同步配置：\ngit submodule sync cd themes/blowfish git remote set-url origin https://github.com/你的用户名/blowfish.git 3.5 第五步：提交并推送修改 # cd ../.. git add .gitmodules themes/blowfish git commit -m \u0026#34;Switch Blowfish submodule to personal fork\u0026#34; git push 如果子模块的修改尚未推送，补上：\ncd themes/blowfish git push --set-upstream origin custom-font cd ../.. git add themes/blowfish git commit -m \u0026#34;Update submodule reference\u0026#34; git push 4 主题更新策略 # 有了自己的 Fork 后，你可以随时同步官方更新，而不丢失自定义内容。\n4.1 推荐方法：合并上游更新 # cd themes/blowfish git remote add upstream https://github.com/nunocoracao/blowfish.git git fetch upstream git merge upstream/main git push origin custom-font 这种方式最安全，能保留你的修改记录。\n4.2 其他方法：使用变基保持线性历史 # cd themes/blowfish git fetch upstream git rebase upstream/main git push --force origin custom-font 适合对 Git 操作较熟悉的用户，能保持干净的历史，但注意变基会改写提交记录。\n5 F\u0026amp;Q # 5.1 如何查看上游更新？ # cd themes/blowfish git fetch upstream git log HEAD..upstream/main --oneline 5.2 如何测试更新是否正常？ # hugo server -D 确认主题在本地运行正常后再推送。\n5.3 如何回退到官方版本？ # cd themes/blowfish git checkout main cd ../.. git submodule sync git add .gitmodules themes/blowfish git commit -m \u0026#34;Revert to official blowfish theme\u0026#34; git push 6 最佳实践建议 # 定期同步上游：每月更新一次主题，防止版本落后。\n尽量少改主题代码：优先通过配置或自定义 CSS 实现修改。\n记录修改内容：在 Fork 的 README 中注明改动目的。\n使用语义化分支名：如 custom-font、custom-layout，方便区分用途。\n备份关键改动：重要样式或配置可单独备份，防止冲突丢失。\n7 总结 # 通过 Fork 子模块的方式，我们可以：\n保留自定义修改\n保持上游更新能力\n避免 Git 推送冲突\n这种做法不仅适用于 Hugo Blowfish 主题，也同样适用于任何以 Git 子模块引入的第三方项目。\n核心步骤回顾：\nFork 原仓库\n新建分支保存自定义修改\n修改 .gitmodules 指向你的 Fork\n定期同步 upstream 保持更新\n","date":"2025-10-16","externalUrl":null,"permalink":"/posts/blogs/%E4%BC%98%E9%9B%85%E5%9C%B0%E8%87%AA%E5%AE%9A%E4%B9%89-hugo-blowfish-%E4%B8%BB%E9%A2%98%E6%88%96%E4%BB%BB%E4%BD%95-git-%E5%AD%90%E6%A8%A1%E5%9D%97/","section":"Posts","summary":"","title":"优雅地自定义 Hugo Blowfish 主题（或任何 Git 子模块）","type":"posts"},{"content":"","date":"2025-10-14","externalUrl":null,"permalink":"/tags/%E6%90%9E%E7%AC%91/","section":"Tags","summary":"","title":"搞笑","type":"tags"},{"content":"当几位大员回到一中的时候，别的考察员也大抵陆续回来了，只有侯还在外。他们在家里休息了几天，偏科局的同事们就在局里大排筵宴，替他们接风。这一天真是车水马龙，不到黄昏时候，主客就全都到齐了，院子里却已经点起庭燎来，鼎中的牛肉香，一直透到门外虎贲的鼻子跟前，二哥就疯狂咽口水。酒过三巡，大员们就炫耀它们的谈资：200多个人格，与生物题自言自语地精彩搏斗，对羽毛球美人的疯狂暗恋史……等等。微醺之后，才取出大家采集了来的题目来，都写在细巧的纸张上，纸上写着文字，有的是语数英，有的是物化生，大家就先来赏鉴这些字，认为答案荒谬至极，争论得几乎打架了、大哥连喊“Aa” 之后，才发现原来是题干读错了。\n局外面也起了一阵喧嚷。一群家伙，有黑有白，身体细瘦，竟冲破了断绝交通的界线，闯到局里来了。卫兵们大喝一声，连忙左右交叉了明晃晃的戈，挡住他们的去路。\n“什么？——看明白！”当头是一条瘦黑的莽汉，粗手粗脚的，怔了一下，大声说。\n卫兵们在昏黄中定睛一看，就恭恭敬敬的立正，举戈，放他们进去了。\n局里的大厅上发生了扰乱。大家一望见一群莽汉们奔来，纷纷都想躲避，但看不见耀眼的兵器，就又硬着头皮，定睛去看。头一个虽然面貌黑瘦，但从神情上，也就认识他正是侯；其余的自然是他的随员。\n这一吓，把大家的酒意都吓退了，沙沙的一阵衣裳声，立刻都退在下面。侯便一径跨到席上，并不屈膝而坐，却伸开了两脚，把大脚底对着大员们，又不穿袜子，满脚底都是打球打的的老茧。随员们就分坐在他的左右。\n“大人是今天回班的？”一位大胆的属员，膝行而前了一点，恭敬的问。\n“你们坐近一点来！”侯不答他的询问，只对大家说。“查的怎么样？”\n大员们一面膝行而前，一面面面相觑，列坐在残筵的下面，看见二哥啃光的牛骨头和大哥挤扁的松果。非常不自在——却又不敢叫膳夫来收去。\n“禀大人，”一位大员终于说。“倒还像个样子——印象甚佳。羽毛球美人，偷看不少；聊天记录呢，那可丰富得很。她哥也很老实，他是欺负惯了的。”\n“卑职可是已经拟好了众筹的计划，”又一位大员说。“准备开一个个人游戏展览会，另请暴龙公司来做联动，来看的可以多一点。”\n“这很好。”侯说着，向他弯一弯腰。\n“不过第一要紧的是赶快派一批大木筏去，把数学专家接上高原来。”第三位大员说，“数学专家有一个公呈在这里，他们以为数学是全班的命脉，数学专家是文化的灵魂，只要数学专家存在，班级也就存在，别的一切，倒还在其次……”\n“全班的人口太多了，”它继续道，“减少一些倒也是致太平之道。况且那些不过是愚民，那喜怒哀乐，也决没有数学专家所推想的那么精微的。……”\n“放他妈的屁！”侯心里想，但嘴上却大声的说道：“我经过查考，知道先前的方法：‘课代表’，确是错误了。以后应该废除课代表！不知道诸位的意见怎么样？”\n静得好像坟山；大员们的脸上也显出死色，许多人还觉得自己生了病，明天恐怕要请病假了。\n“这是荒谬的法子！”一个勇敢的青年官员悄悄的愤激着。\n“卑职的愚见，窃以为大人是似乎应该收回成命的。”一位 《“白”须》《“白”发》 的大员，这时觉得天下生物兴亡，系在他的嘴上了，便把心一横，置死生于度外，坚决的抗议道：“我担任课代表是我猪大人的成法。‘三年无改于孙之道，可谓孝矣。’——我升天还不到三年。”\n侯一声也不响。\n“况且丽花化过多少心力呢。借了我的息壤，来治数学，虽然触了同学的恼怒，我的B欲可也深了一点了。这似乎还是照例的治下去。”一位叫做二哥的大员说，他是丽花的干儿子。\n侯一声也不响。\n“我看大人还不如‘干父之蛊’，”一位赵胖大官员看得侯不作声，以为他就要折服了，便带些轻薄的大声说，不过脸上还流出着一层油汗。“照着家法，挽回家声。大人大约未必知道人们在怎么讲说你罢……”\n“要而言之，‘课代表’是世界上已有定评的好法子，”二哥恐怕胖子闹出岔子来，就抢着说道。“别的种种，所谓‘摩登’者也，你就坏在这一点上。”\n侯微微一笑：“我知道的。有人说我🐴没了，也有人说我变了草酸氢，也有人说我在装B，弄势。说就是了。我要说的是我查了班级的情形，征了同学的意见，已经看透实情，打定主意，无论如何，非废除这些课代表不可！这些同事，也都和我同意的。”\n他举手向两旁一指。《白》须发的，大眼大嘴大B的，胖而流着油汗的官员们，跟着他的指头看过去，只见侯和这一排家伙，有语文第一，数学第一，英语 第一 ，物理第一，化学第一，生物第一，意志坚定，像铁铸的一样。\n","date":"2025-10-14","externalUrl":null,"permalink":"/posts/%E6%97%A5%E5%B8%B8/%E7%90%86%E6%B0%B4%E8%8A%82%E9%80%89/","section":"Posts","summary":"","title":"理水(节选)","type":"posts"},{"content":"","date":"2025-10-14","externalUrl":null,"permalink":"/tags/%E6%97%A5%E5%B8%B8/","section":"Tags","summary":"","title":"日常","type":"tags"},{"content":" 本文用于测试网站的MD渲染样式 \u0026ldquo;简洁是智慧的灵魂。\u0026rdquo; —— 莎士比亚\n1 引言 # Markdown 是一种轻量级标记语言,它允许人们使用_易读易写_的纯文本格式编写文档。本文将通过一个复杂生动的示例,展示 Markdown 的各种语法特性。\n2 第一章: 基础排版 # 2.1 标题的嵌套 # 2.1.1 markdown的标题可以 一层套一层 # 2.1.1.1 再多 # 2.1.1.1.1 就不会 # ####### 1.1.1.1.1.1 被识别啦\n2.2 文本装饰的艺术 # 在日常写作中,我们经常需要强调某些内容。比如这是粗体文本,这是 斜体文本 ,而这是 粗斜体文本 。有时我们需要标记代码片段,或者使用删除线来表示废弃内容。\n2.3 列表的魔法 # 购物清单示例:\n水果类 苹果 🍎 香蕉 🍌 橙子 🍊 蔬菜类 番茄 黄瓜 生菜 任务进度:\n完成项目规划 编写核心代码 进行单元测试 部署到生产环境 3 第二章: 代码与技术 # 3.1 内联代码示例 # 要在 Python 中打印 \u0026ldquo;Hello World\u0026rdquo;,只需使用 print(\u0026quot;Hello World\u0026quot;) 即可。\n3.2 代码块展示 # 这是一个简单的 Python 函数:\ndef fibonacci(n): \u0026#34;\u0026#34;\u0026#34;计算斐波那契数列的第 n 项\u0026#34;\u0026#34;\u0026#34; if n \u0026lt;= 1: return n return fibonacci(n-1) + fibonacci(n-2) # 测试函数 for i in range(10): print(f\u0026#34;F({i}) = {fibonacci(i)}\u0026#34;) Shell 命令示例:\n# 更新系统 sudo pacman -Syu # 安装必要软件 sudo pacman -S vim git htop 4 第三章: 数据呈现 # 4.1 表格展示 # 编程语言 类型 难度等级 流行度 Python 解释型 ⭐⭐ 🔥🔥🔥 Rust 编译型 ⭐⭐⭐⭐ 🔥🔥 Go 编译型 ⭐⭐⭐ 🔥🔥🔥 JavaScript 解释型 ⭐⭐ 🔥🔥🔥🔥 4.2 性能对比 # 测试场景 响应时间 内存占用 CPU 使用率 场景 A 120ms 256MB 45% 场景 B 89ms 312MB 67% 场景 C 201ms 198MB 38% 5 第四章: 链接与引用 # 5.1 超链接 # 访问 Markdown 官方指南 了解更多详情。\n你也可以直接访问: https://github.com\n5.2 图片引用 # 5.3 脚注使用 # Markdown 由 John Gruber 在 2004 年创建1。它的设计哲学是可读性2。\n6 第五章: 高级技巧 # 6.1 嵌套引用 # 第一层引用\n第二层引用\n第三层引用:\n\u0026ldquo;Stay hungry, stay foolish.\u0026rdquo; — Steve Jobs\n6.2 混合列表 # 第一步: 准备工作\n检查系统环境 安装依赖包 第二步: 配置项目\n# config.yaml server: host: localhost port: 8080 database: type: postgresql name: mydb 第三步: 启动服务\n运行 npm start 访问 http://localhost:8080 6.3 分隔线演示 # 内容区块一\n内容区块二\n内容区块三\n7 结语 # 通过本文档,我们展示了 Markdown 的强大功能。它支持:\n丰富的文本格式化 灵活的列表结构 代码高亮显示 表格与数据展示 链接、图片和脚注 💡 提示: 多实践才能熟练掌握 Markdown!\n文档结束\n感谢阅读!\nJohn Gruber 是著名的技术博客 Daring Fireball 的作者。\u0026#160;\u0026#x21a9;\u0026#xfe0e;\n即使不经过渲染,Markdown 文档也应该保持良好的可读性。\u0026#160;\u0026#x21a9;\u0026#xfe0e;\n","date":"2025-10-3","externalUrl":null,"permalink":"/posts/blogs/%E6%B7%B1%E5%85%A5%E6%8E%A2%E7%B4%A2-markdown-%E7%9A%84%E4%B8%96%E7%95%8C/","section":"Posts","summary":"","title":"深入探索 Markdown 的世界","type":"posts"},{"content":" 1 用Blowfish创建了博客！泰裤辣！😄 # 2 博客修改 # 所有例子中，/指主仓库根目录 我的网站目录在~/文/my-blog ，因此/themes/blowfish/指的是~/文/my-blog/themes/blowfish/ 2.1 修改侧栏(TOC)和标题颜色 # 效果： 新建 /assets/css/custom.css\n写入以下代码：\n/* 浅色模式下的彩虹色标题 */ :where(h2):not(:where([class~=\u0026#34;not-prose\u0026#34;],[class~=\u0026#34;not-prose\u0026#34;] *)) { color: #dc2626 !important; /* 红色 */ } :where(h3):not(:where([class~=\u0026#34;not-prose\u0026#34;],[class~=\u0026#34;not-prose\u0026#34;] *)) { color: #ea580c !important; /* 橙色 */ } :where(h4):not(:where([class~=\u0026#34;not-prose\u0026#34;],[class~=\u0026#34;not-prose\u0026#34;] *)) { color: #16a34a !important; /* 绿色 */ } :where(h5):not(:where([class~=\u0026#34;not-prose\u0026#34;],[class~=\u0026#34;not-prose\u0026#34;] *)) { color: #2563eb !important; /* 蓝色 */ } :where(h6):not(:where([class~=\u0026#34;not-prose\u0026#34;],[class~=\u0026#34;not-prose\u0026#34;] *)) { color: #9333ea !important; /* 紫色 */ } /* 深色模式下的彩虹色标题 */ .dark :where(h2):not(:where([class~=\u0026#34;not-prose\u0026#34;],[class~=\u0026#34;not-prose\u0026#34;] *)) { color: #f87171 !important; /* 浅红色 */ } .dark :where(h3):not(:where([class~=\u0026#34;not-prose\u0026#34;],[class~=\u0026#34;not-prose\u0026#34;] *)) { color: #fb923c !important; /* 浅橙色 */ } .dark :where(h4):not(:where([class~=\u0026#34;not-prose\u0026#34;],[class~=\u0026#34;not-prose\u0026#34;] *)) { color: #4ade80 !important; /* 浅绿色 */ } .dark :where(h5):not(:where([class~=\u0026#34;not-prose\u0026#34;],[class~=\u0026#34;not-prose\u0026#34;] *)) { color: #60a5fa !important; /* 浅蓝色 */ } .dark :where(h6):not(:where([class~=\u0026#34;not-prose\u0026#34;],[class~=\u0026#34;not-prose\u0026#34;] *)) { color: #a78bfa !important; /* 浅紫色 */ } /* 浅色模式下的TOC彩虹色 */ .toc ul ul li a { color: #dc2626 !important; } /* H2对应红色 */ .toc ul ul ul li a { color: #ea580c !important; } /* H3对应橙色 */ .toc ul ul ul ul li a { color: #16a34a !important; } /* H4对应绿色 */ .toc ul ul ul ul ul li a { color: #2563eb !important; } /* H5对应蓝色 */ .toc ul ul ul ul ul ul li a { color: #9333ea !important; } /* H6对应紫色 */ /* 深色模式下的TOC彩虹色 */ .dark .toc ul ul li a { color: #f87171 !important; } /* H2对应浅红色 */ .dark .toc ul ul ul li a { color: #fb923c !important; } /* H3对应浅橙色 */ .dark .toc ul ul ul ul li a { color: #4ade80 !important; } /* H4对应浅绿色 */ .dark .toc ul ul ul ul ul li a { color: #60a5fa !important; } /* H5对应浅蓝色 */ .dark .toc ul ul ul ul ul ul li a { color: #a78bfa !important; } /* H6对应浅紫色 */ 2.2 字体修改 # 2.2.1 优点 # 此方法和文档中的相比，能让访问者从国内第三方网站下载字体，提高字体加载速率\n2.2.2 操作方法 # 从网站找到代码，比如：https://fonts.zeoseven.com/items/442/#embed\n选中 HTML强化，用里面的代码进行导入\n在我这里，常规CSS无法使用，所以用HTML强化\n英文子集化可以让所有英文显示为指定字体\n全部版本可以展示所用可用的字型，可与选择适合的字型链接替代HTML强化中的链接\n新建 /themes/blowfish/layouts/partials/extend-head.html\n把内容放进去\n最后差不多这个样：\n\u0026lt;!--导入LXGW WenKai Mono字体--\u0026gt; \u0026lt;link rel=\u0026#34;preload\u0026#34; as=\u0026#34;style\u0026#34; crossorigin href=\u0026#34;https://fontsapi.zeoseven.com/292/medium/result.css\u0026#34; onload=\u0026#34;this.rel=\u0026#39;stylesheet\u0026#39;\u0026#34; onerror=\u0026#34;this.href=\u0026#39;https://fontsapi-storage.zeoseven.com/292/medium/result.css\u0026#39;\u0026#34; /\u0026gt; \u0026lt;noscript\u0026gt; \u0026lt;link rel=\u0026#34;stylesheet\u0026#34; href=\u0026#34;https://fontsapi.zeoseven.com/292/medium/result.css\u0026#34; /\u0026gt; \u0026lt;/noscript\u0026gt; \u0026lt;!--导入Maple Mono NF-CN字体--\u0026gt; \u0026lt;link rel=\u0026#34;preload\u0026#34; as=\u0026#34;style\u0026#34; crossorigin href=\u0026#34;https://fontsapi.zeoseven.com/442/main/result.css\u0026#34; onload=\u0026#34;this.rel=\u0026#39;stylesheet\u0026#39;\u0026#34; onerror=\u0026#34;this.href=\u0026#39;https://fontsapi-storage.zeoseven.com/442/main/result.css\u0026#39;\u0026#34; /\u0026gt; \u0026lt;noscript\u0026gt; \u0026lt;link rel=\u0026#34;stylesheet\u0026#34; href=\u0026#34;https://fontsapi.zeoseven.com/442/main/result.css\u0026#34; /\u0026gt; \u0026lt;/noscript\u0026gt; \u0026lt;style\u0026gt; /* 无需专门导入字体，让所有英文显示为Maple Mono NF-CN字体 @font-face { font-family: \u0026#34;ZSFT-ENMin-442\u0026#34;; src: url(\u0026#34;https://fontsapi.zeoseven.com/442/main.woff2\u0026#34;) format(\u0026#39;woff2\u0026#39;), url(\u0026#34;https://fontsapi-storage.zeoseven.com/442/main.woff2\u0026#34;) format(\u0026#39;woff2\u0026#39;); unicode-range: U+0061-007A, U+0041-005A, U+0030-0039, U+002E, U+002C, U+0021, U+003F, U+003A, U+003B, U+002D; } */ /* (需专门导入字体)让所有正文显示为LXGW字体 */ body { font-family: \u0026#34;LXGW WenKai\u0026#34;; font-weight: normal; } /* (需专门导入字体)让所有代码块显示为Maple Mono NF-CN字体 */ code, kbd, samp, pre { font-family: \u0026#34;Maple Mono NF CN\u0026#34;; } \u0026lt;/style\u0026gt; 2.2.3 注意事项 # 如果你用git下载/管理的blowfish主题，修改/themes/blowfish（添加了/themes/blowfish/layouts/partials/extend-head.html）会遇到子模块冲突\n下列子模组路径所包含的修改在任何远程源中都找不到： themes/blowfish 请尝试 git push --recurse-submodules=on-demand 或者进入到子目录执行 git push 以推送至远程。 致命错误：正在终止。 ~/文/my-blog (main|↑1|✔) [128]$ 你有两个选择:\n选项 A: 保留你的字体修改,推送到子模块的 fork/分支\n请见站内文章 《优雅地自定义 Hugo Blowfish 主题（或任何 Git 子模块）》\n选项 B: 删除子模块，把字体修改直接保存到主仓库中\n# 1. 回到主仓库根目录 cd ~/文/my-blog # 2. 移除子模块配置(但保留文件) git rm --cached themes/blowfish rm -rf .git/modules/themes/blowfish # 3. 编辑 .gitmodules 文件,删除 blowfish 相关配置 nano .gitmodules # 或用你喜欢的编辑器删除 blowfish 部分 # 4. 如果 .gitmodules 为空,删除它 rm .gitmodules # 如果没有其他子模块的话 # 5. 将 themes/blowfish 作为普通目录添加 git add themes/blowfish git add .gitmodules # 如果修改了的话 # 6. 提交更改 git commit -m \u0026#34;Convert blowfish theme from submodule to regular directory\u0026#34; git push 2.3 字体大小修改 # 文档 有云：\n我们也提供更改网站的字体大小的示例。 Blowfish 使这一切变得简单，因为它在整个主题中使用源自基本 HTML 语言的缩放字体大小方法。默认情况下，Tailwind 将默认大小设置为 12pt ，但您可以将其更改为喜欢的大小。\n参考上面的说明 创建一个 custom.css 文件并添加以下 CSS 声明：\n/* Increase the default font size */ html { font-size: 13pt; } 只需更改此值，您网站上的所有字体大小都将调整为此新大小。因此，要增加使用的整体字体大小，请将该值设置为大于 12pt 。同样，要减小字体大小，请将值设置为小于 12pt 。\n我尝试了发现：主页字体调整了，但是博文字体大小未改变\n我的方案是添加\n/* 只针对文章内容提高文字大小，默认1rem */ .prose { font-size: 1.1rem; } 2.4 avif支持 # 你猜我为啥用avif 因为hugo对avif图片调节不完善，所以改成true增强AVIF支持：\n#/config/_default/params.toml disableImageOptimization = true disableImageOptimizationMD = false #和上面的类似，改成AVIF增强AVIF支持 disableImageOptimization对网站有效（比如我的博客的背景图）\ndisableImageOptimizationMD只针对博文文本有效\n我true了disableImageOptimization似乎就对整个网站生效了，就这样吧。\n2.5 评论区 # 配置指南\n我修改了些许配置，见github\n还get到了网址拆分这个功能（见博客内文章）\n2.6 网站访问数统计 # 2.6.1 页头显示 # 效果如下： 这个组件的行为是由/themes/blowfish/layouts/partials/meta/views.html决定的，默认是使用Firebase的，但是Firebase国内访问不了，遂换成Vercount（这个能显示网站访问数 但是 不能显示喜欢数，但对我来说够了）\n/themes/blowfish/layouts/partials/meta/views.html复制到/layouts/partials/meta/views.html ，这样会让blowfish读取后者而不是前者，从而实现自定义\n完成复制操作以后，修改views.html内容，见 https://github.com/Sunrongguo2008/my-blog/blob/main/layouts/partials/meta/views.html 。这样会让views.html在实现原有的样式（眼睛+动画）的程度下，将Firebase替换为Vercount\n编辑/config/_default/params.toml，把你想要的部分的showViews改成true [taxonomy]管理www.example.com/tags/ 域名\n[term]管理www.example.com/tags/xxx/ 等域名\n[list]管理www.example.com/posts/ 域名 ⚠️注意： 修改views.html后，每个页面只能显示一个网站访问数，其他无法加载。而在\u0026quot;Posts\u0026quot; \u0026ldquo;最近的文章\u0026rdquo; 等页面，[article]下的showViews打开以后，会统统显示，导致异常。所以[article]下的showViews请false。否则： （😊别担心，后文有解决方法） 2.6.2 页尾显示 # 效果如下： 新建/layouts/partials/extend-footer.html并写入：\n\u0026lt;hr\u0026gt; \u0026lt;!-- Vercount浏览量组件 --\u0026gt; \u0026lt;script defer src=\u0026#34;https://events.vercount.one/js\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; \u0026lt;div class=\u0026#34;flex flex-wrap gap-4 justify-center items-center text-sm text-neutral-500 dark:text-neutral-400\u0026#34;\u0026gt; \u0026lt;span\u0026gt;📊 总访问 \u0026lt;span id=\u0026#34;busuanzi_value_site_pv\u0026#34;\u0026gt;-\u0026lt;/span\u0026gt; 次\u0026lt;/span\u0026gt; \u0026lt;span\u0026gt;•\u0026lt;/span\u0026gt; \u0026lt;span\u0026gt;👥 总访客 \u0026lt;span id=\u0026#34;busuanzi_value_site_uv\u0026#34;\u0026gt;-\u0026lt;/span\u0026gt; 人\u0026lt;/span\u0026gt; \u0026lt;span\u0026gt;•\u0026lt;/span\u0026gt; \u0026lt;/div\u0026gt; views.html定义了“本页访问量”，加上前文说过的“每个页面只能显示一个网站访问数”。所以这里的extend-footer.html没有定义“本页访问量” 2.6.3 \u0026ldquo;页头显示\u0026quot;的遗留问题解决 # 修改views.html后，每个页面只能显示一个网站访问数，其他无法加载。而在\u0026quot;Posts\u0026rdquo; \u0026ldquo;最近的文章\u0026rdquo; 等页面，[article]下的showViews打开以后，会统统显示，导致异常。所以[article]下的showViews请false。\n过来解决！\n我们不使用[article]下的showViews，而是自定义一个功能一样的模块，只在正文上出现而不在\u0026quot;Posts\u0026quot; \u0026ldquo;最近的文章\u0026quot;出现即可\n/themes/blowfish/layouts/_default/single.html复制到\n打开/layouts/_default/single.html，查找\n\u0026lt;div class=\u0026#34;mt-1 mb-6 text-base text-neutral-500 dark:text-neutral-400 print:hidden\u0026#34;\u0026gt; {{ partial \u0026#34;article-meta/basic.html\u0026#34; (dict \u0026#34;context\u0026#34; . \u0026#34;scope\u0026#34; \u0026#34;single\u0026#34;) }} \u0026lt;/div\u0026gt; 替换为以下内容即可\ndiv class=\u0026#34;flex flex-row flex-wrap items-center\u0026#34;\u0026gt; {{ partial \u0026#34;article-meta/basic.html\u0026#34; (dict \u0026#34;context\u0026#34; . \u0026#34;scope\u0026#34; \u0026#34;single\u0026#34;) }} \u0026lt;span class=\u0026#34;px-2 text-primary-500\u0026#34;\u0026gt;·\u0026lt;/span\u0026gt; {{ partial \u0026#34;/meta/views.html\u0026#34;}} \u0026lt;!-- [INFO]此处调用了views.html并模仿软主题加了蓝·--\u0026gt; \u0026lt;/div\u0026gt; ","date":"2025-10-2","externalUrl":null,"permalink":"/posts/blogs/hello-blowfish/","section":"Posts","summary":"","title":"Blowfish 文档外自定义指南","type":"posts"},{"content":"","date":"2025-8-11","externalUrl":null,"permalink":"/tags/linux/","section":"Tags","summary":"","title":"Linux","type":"tags"},{"content":"在 Arch Linux 中文论坛询问，有人说：根据ArchWiki，需要安装 libvpl 和 vpl-gpu-rt\nsudo pacman -S libvpl sudo pacman -S vpl-gpu-rt ","date":"2025-8-11","externalUrl":null,"permalink":"/posts/linux/obs-%E6%97%A0%E6%B3%95%E8%B0%83%E7%94%A8intel%E7%9A%84qsv/","section":"Posts","summary":"","title":"OBS 无法调用intel的qsv（Arch）","type":"posts"},{"content":"最近遇到了一个的 Linux 启动问题：明明设置了开机自启动的应用程序，结果每次开机后都没运行起来。手动启动是正常的，但就是自动启动失效。\n发现问题：应用程序启动不了 # 症状 # 我开机进入桌面后发现：\nABDownloadManager 没有自动启动 Notification_monitor 脚本也没运行 这些应用都放在外接的 SSD 上（路径是 /run/media/s/SSD/...） 奇怪的是，手动双击或者命令行运行都是正常的 二、分析问题 # 查看启动日志 # journalctl -b -e 这个命令会显示本次启动的日志，-e 参数直接跳到最后面，方便查看最新的信息。\n在日志中找到了这些关键信息：\n8月 09 11:54:56 s-pc systemd-xdg-autostart-generator[893]: Exec binary \u0026#39;/run/media/s/SSD/Linux_Tools/ABDownloadManager/bin/ABDownloadManager\u0026#39; does not exist: No such file or directory 8月 09 11:54:56 s-pc systemd-xdg-autostart-generator[893]: /home/s/.config/autostart/com.abdownloadmanager.desktop: not generating unit, executable specified in Exec= does not exist. 8月 09 11:54:58 s-pc udisksd[951]: **Mounted /dev/nvme0n1p4 at /run/media/s/SSD on behalf of uid 1000** 11:54:56 - 系统尝试启动应用，发现路径不存在 11:54:58 - udisksd 完成 SSD 挂载，应用启动需要的路径被创建 找到原因了 # 系统想启动应用时，SSD 还没挂载好，路径不存在，启动失败。\n解决方案 # 方法一：fstab 自动挂载 # 让 SSD 开机就挂载 # 这个 SSD 每天都要用，不如让它开机就自动挂载。这样就能提前解决挂载问题，而不是等待挂载完成。\n简单配置 # 首先获取 SSD 的 UUID：\nsudo blkid /dev/nvme0n1p4 输出类似：\n/dev/nvme0n1p4: LABEL=\u0026#34;SSD\u0026#34; BLOCK_SIZE=\u0026#34;512\u0026#34; UUID=\u0026#34;9FAB0FC4562CB861\u0026#34; TYPE=\u0026#34;ntfs\u0026#34; PARTLABEL=\u0026#34;Basic data partition\u0026#34; PARTUUID=\u0026#34;af50b57f-7ccb-42bb-a3b5-7256ef6e3933\u0026#34; 安装 ntfs-3 g：\nsudo pacman -S ntfs-3g 然后编辑 fstab：\nsudo nano /etc/fstab 在文件末尾添加：\nUUID=9FAB0FC4562CB861 /run/media/s/SSD ntfs-3g defaults,uid=1000,gid=1000,windows_names,nofail 0 0 systemctl daemon-reload 配置完成后，重启系统，SSD 就会在开机时自动挂载，autostart 也能正常工作了。\n方法二：创建 systemd 用户服务 # 这个方法有个缺点：很多应用自带的开机自启并不是创建 systemd 用户服务的方案，需要对每个应用进行修改\n而且以下内容由 AI（Claude）撰写，我也没试过，不知道是否可行\nSystemd 特点 # 传统的 autostart 机制比较\u0026quot;死板\u0026quot;：到时间就启动，不管条件是否满足。而 systemd 服务更智能，可以\u0026quot;等条件满足再启动\u0026quot;。\n关键是 ExecStartPre 指令，它让程序在启动前先执行一个预检查脚本。我们可以用它来主动等待挂载完成：\nExecStartPre=/bin/bash -c \u0026#39;while [ ! -d \u0026#34;/run/media/s/SSD\u0026#34; ]; do sleep 1; done\u0026#39; 这行代码的意思是：不断检查 SSD 挂载目录是否存在，不存在就等 1 秒再检查，直到目录存在才继续执行主程序。\n创建服务配置 # 以 ABDownloadManager 为例，创建 systemd 用户服务：\n# 创建服务目录 mkdir -p ~/.config/systemd/user # 创建服务配置文件 cat \u0026gt; ~/.config/systemd/user/abdownloadmanager.service \u0026lt;\u0026lt; EOF [Unit] Description=AB Download Manager After=graphical-session.target Wants=graphical-session.target [Service] Type=simple ExecStartPre=/bin/bash -c \u0026#39;while [ ! -d \u0026#34;/run/media/s/SSD\u0026#34; ]; do sleep 1; done\u0026#39; ExecStart=/run/media/s/SSD/Linux_Tools/ABDownloadManager/bin/ABDownloadManager Restart=on-failure RestartSec=5 [Install] WantedBy=default.target EOF 配置说明：\n​ After=graphical-session.target：确保在图形界面准备好后再启动 ​ ExecStartPre：启动前等待挂载完成 ​ Restart=on-failure：如果程序崩溃会自动重启 ​ RestartSec=5：重启前等待 5秒 同样为 notification_monitor 创建服务：\ncat \u0026gt; ~/.config/systemd/user/notification_monitor.service \u0026lt;\u0026lt; EOF [Unit] Description=Notification Monitor After=graphical-session.target Wants=graphical-session.target [Service] Type=simple ExecStartPre=/bin/bash -c \u0026#39;while [ ! -d \u0026#34;/run/media/s/SSD\u0026#34; ]; do sleep 1; done\u0026#39; ExecStart=/run/media/s/SSD/Linux_Tools/notification_monitor/notification_monitor.sh Restart=on-failure RestartSec=5 [Install] WantedBy=default.target EOF 部署步骤 # 重载 systemd 配置：\nsystemctl --user daemon-reload 启用服务：\nsystemctl --user enable abdownloadmanager.service systemctl --user enable notification_monitor.service 清理旧的 autostart 配置：\nrm ~/.config/autostart/com.abdownloadmanager.desktop rm ~/.config/autostart/notification_monitor.sh.desktop 测试效果（可选）：\n# 立即启动测试 systemctl --user start abdownloadmanager.service # 查看服务状态 systemctl --user status abdownloadmanager.service # 查看服务日志 journalctl --user -u abdownloadmanager.service -f 重启系统后，应用程序就能正常自启动了。\n","date":"2025-8-9","externalUrl":null,"permalink":"/posts/linux/linux%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E6%97%A0%E6%B3%95%E5%BC%80%E6%9C%BA%E8%87%AA%E5%90%AF%E5%8F%AF%E8%83%BD%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%E6%8C%82%E8%BD%BD%E9%97%AE%E9%A2%98/","section":"Posts","summary":"","title":"linux应用程序无法开机自启可能的解决方案","type":"posts"},{"content":"在 btrfs 下，创建 swap 文件而不是 swap 分区时：\n把 swap 文件放到​ ​ /swap ​​子卷中： 因为 timeshift 不会备份 /swap 子卷，导致恢复快照时，swap 文件 /swap/swapfile 会消失\n不把 swap 文件放到子卷中： timeshift 备份时，swapfile 被内核使用，会导致 E: ERROR: Could not create subvolume: Text file busy，导致无法创建快照，出现这个情况\n所以，最佳实践可能是创建 swap 分区而不是swap 文件 (参考来源)\n或者仍然把 swap 文件放到​ ​ /swap ​​子卷中，timeshift 恢复快照后，手动把 /swap 目录删掉、把原来的 /swap 子卷移动过来\n","date":"2025-8-9","externalUrl":null,"permalink":"/posts/linux/%E5%85%B3%E4%BA%8Etimeshift%E5%92%8Cswap%E7%9A%84%E6%81%A9%E6%80%A8%E9%97%AE%E9%A2%98/","section":"Posts","summary":"","title":"关于timeshift和swap的恩怨问题","type":"posts"},{"content":" 1. 原因 # 英雄在这里\nbtrfs 文件系统玩 swapfile，如果还想用 timeshift 或者 snapper 备份快照，就必须把 swap 文件放到不需要备份的子卷里面（比如创建 @swap 子卷）。 不然的话，如果直接放在需要快照的子卷，会在创建快照的时候会失败（提示设备正在被写入啥的/ 在 timeshift GUI 上不显示创建的快照） 要是像我一样，哪天需要恢复快照了，突然发现一个快照都没建出来就搞笑了\u0026hellip;\u0026hellip;\n所以需要把 swapfile 放到@swap 子卷里面\n2. 解决方案 # ⚠️注意：\n在 btrfs 下，创建swap 文件而不是 swap 分区时：\n把 swap 文件放到​ ​ /swap ​​子卷中： 因为 timeshift 不会备份 /swap 子卷，导致恢复快照时，swap 文件 /swap/swapfile 会消失\n不把 swap 文件放到子卷中： timeshift 备份时，swapfile 被内核使用，会导致 E: ERROR: Could not create subvolume: Text file busy，导致无法创建快照 (参考来源)\n最佳实践可能是创建 swap 分区而不是swap 文件\n或者仍然把 swap 文件放到​ ​ /swap ​​子卷中，timeshift 恢复快照后，手动把 /swap 目录删掉、把原来的 /swap 子卷移动过来\n以下是创建 swap 文件+把 swap 文件放到​ ​ /swap ​​子卷中的方案（创建 swap 分区的方法网上一搜一大把，就不写了）：\n2.1 创建交换空间（设置子卷） # # 创建交换子卷，位置是/swap（其他位置也可以，但是下面的都得换掉） sudo btrfs subvolume create /swap # 进入交换子卷目录 cd /swap # 创建一个0大小的文件 sudo truncate -s 0 /swap/swapfile # 设置No_COW属性 sudo chattr +C swapfile # 禁用压缩 sudo btrfs property set swapfile compression none ERROR: failed to set compression for swapfile: Invalid argument #不知道为什么，不过不影响 # 将文件填充、扩容 sudo dd if=/dev/zero of=/swap/swapfile bs=1G count=6 # 设置swapfile权限 sudo chmod 600 swapfile # 格式化swapfile sudo mkswap swapfile # 启用swapfile sudo swapon swapfile 2.2 验证交换空间是否启用 # # 查看交换文件是否已激活 sudo swapon --show # 查看系统内存和交换使用情况 free -h 你应该能看到类似这样的输出：\n$ sudo swapon --show NAME TYPE SIZE USED PRIO /swap/swapfile file 6G 0B -2 $ free -h 总计 已用 空闲 共享 缓冲/缓存 可用 内存： 15Gi 6.3Gi 621Mi 1.3Gi 9.5Gi 9.0Gi 交换： 6.0Gi 0B 6.0Gi 2.3 设置开机自动挂载 swapfile # # 编辑 fstab 文件 sudo nano /etc/fstab # 在文件末尾添加这一行： /swap/swapfile none swap sw 0 0 重启后验证交换文件是否自动启用：\n# 查看交换文件是否已激活 sudo swapon --show # 查看系统内存和交换使用情况 free -h 你应该能看到类似这样的输出：\n$ sudo swapon --show NAME TYPE SIZE USED PRIO /swap/swapfile file 6G 0B -2 $ free -h 总计 已用 空闲 共享 缓冲/缓存 可用 内存： 15Gi 6.3Gi 621Mi 1.3Gi 9.5Gi 9.0Gi 交换： 6.0Gi 0B 6.0Gi ‍\n","date":"2025-8-7","externalUrl":null,"permalink":"/posts/linux/btrfs%E4%B8%8B%E4%B8%8D%E6%98%BE%E7%A4%BAtimeshift%E5%88%9B%E5%BB%BA%E7%9A%84%E5%BF%AB%E7%85%A7%E5%88%9B%E5%BB%BA%E5%BF%AB%E7%85%A7%E5%A4%B1%E8%B4%A5/","section":"Posts","summary":"","title":"btrfs下不显示timeshift创建的快照／创建快照失败","type":"posts"},{"content":" 1 发现问题 # $ sudo timeshift --list #列出快照 [Warning] Deleted invalid lock Mounted \u0026#39;/dev/nvme0n1p6\u0026#39; at \u0026#39;/run/timeshift/47565/backup\u0026#39; btrfs: Quotas are not enabled Device : /dev/nvme0n1p6 UUID : da4fd0a6-78d7-464c-8e24-b38ee2d483b7 Path : /run/timeshift/47565/backup Mode : BTRFS Status : OK 3 snapshots, 9.9 GB free Num Name Tags Description ------------------------------------------------------------------------------ 0 \u0026gt; 2025-08-05_22-44-05 O Before restoring \u0026#39;2025-08-05 10:18 下午\u0026#39; 1 \u0026gt; 2025-08-07_14-31-24 B H D W M 2 \u0026gt; 2025-08-07_15-08-42 O H 我无法删除的快照是 2025-08-05_22-44-05，尝试用命令行删一下\n$ sudo timeshift --delete --snapshot 2025-08-05_22-44-05  ✔ Mounted \u0026#39;/dev/nvme0n1p6\u0026#39; at \u0026#39;/run/timeshift/46581/backup\u0026#39; btrfs: Quotas are not enabled ------------------------------------------------------------------------------ Removing snapshot: 2025-08-05_22-44-05 Deleting subvolume: @ (Id:309) E: ERROR: Could not destroy subvolume/snapshot: Directory not empty E: Failed to delete snapshot subvolume: \u0026#39;/run/timeshift/46581/backup/timeshift-btrfs/snapshots/2025-08-05_22-44-05/@\u0026#39; E: Failed to remove snapshot: 2025-08-05_22-44-05 删除失败了。观察到快照文件在 /run/timeshift/47326/backup/timeshift-btrfs/snapshots/2025-08-05_22-44-05/，咱看一下这个目录\n$ ls -la \u0026#34;/run/timeshift/47326/backup/timeshift-btrfs/snapshots/2025-08-05_22-44-05/\u0026#34; ls: 无法访问 \u0026#39;/run/timeshift/47326/backup/timeshift-btrfs/snapshots/2025-08-05_22-44-05/\u0026#39;: 没有那个文件或目录 好家伙，目录不存在\n问题发现了：快照目录在文件系统中已经不存在了，但是 Timeshift 仍然认为它存在。这是一个典型的 Timeshift 状态与实际文件系统不一致的问题。这说明 Timeshift 的内部数据库与实际文件系统状态不同步。\n2 解决问题 # 使用 sudo timeshift --list\n查看 Device 字段（每个人的都不一样）：Device : /dev/nvme0n1p6 ​\n查看想要删除的快照的 NAME 字段（每个人的都不一样）：2025-08-05_22-44-05 ​\n# 手动挂载到 /mnt $ sudo mount /dev/nvme0n1p6 /mnt # 检查实际存在的快照 $ ls -la /mnt/timeshift-btrfs/snapshots/ 总计 0 drwxr-xr-x 1 root root 114 8月 7日 16:00 . drwxr-xr-x 1 root root 210 8月 7日 16:00 .. drwxr-xr-x 1 root root 32 8月 7日 16:39 2025-08-05_22-44-05 drwxr-xr-x 1 root root 20 8月 7日 15:00 2025-08-07_14-31-24 drwxr-xr-x 1 root root 20 8月 7日 16:00 2025-08-07_15-08-42 # 删除不存在的快照条目 sudo rm -rf /mnt/timeshift-btrfs/snapshots/2025-08-05_22-44-05 2\u0026gt;/dev/null # 检查是否删除 $ ls -la /mnt/timeshift-btrfs/snapshots/ 总计 0 drwxr-xr-x 1 root root 76 8月 7日 16:45 . drwxr-xr-x 1 root root 210 8月 7日 16:00 .. drwxr-xr-x 1 root root 20 8月 7日 15:00 2025-08-07_14-31-24 drwxr-xr-x 1 root root 20 8月 7日 16:00 2025-08-07_15-08-42 # `2025-08-05_22-44-05`没有了！删了！ # 卸载 sudo umount /mnt ‍\n","date":"2025-8-7","externalUrl":null,"permalink":"/posts/linux/timeshift%E6%97%A0%E6%B3%95%E5%88%A0%E9%99%A4%E5%BF%AB%E7%85%A7/","section":"Posts","summary":"","title":"timeshift无法删除快照","type":"posts"},{"content":"都是我折腾 winapps 时遇到的问题，费了三整天才慢慢解决，故分享出来让大家少踩坑。\n1. 1. RDP 花费的连接时间太长，导致脚本超时 # 1.1 特点 # 运行 50 秒才启动\n$ xfreerdp3 /u:\u0026#34;Administrator\u0026#34; /p:\u0026#34;1\u0026#34; /v:192.168.122.122 /cert:tofu [08:48:09:871] [26120:0000660b] [WARN][com.freerdp.client.x11] - [load_map_from_xkbfile]: : keycode: 0x08 -\u0026gt; no RDP scancode found [08:48:09:871] [26120:0000660b] [WARN][com.freerdp.client.x11] - [load_map_from_xkbfile]: ZEHA: keycode: 0x5D -\u0026gt; no RDP scancode found [08:48:09:893] [26120:0000660b] [WARN][com.freerdp.crypto] - [verify_cb]: Certificate verification failure \u0026#39;self-signed certificate (18)\u0026#39; at stack position 0 [08:48:09:893] [26120:0000660b] [WARN][com.freerdp.crypto] - [verify_cb]: CN = DESKTOP-G8N9MT9 [08:48:32:930] [26120:0000660b] [ERROR][com.winpr.sspi.Kerberos] - [kerberos_AcquireCredentialsHandleA]: krb5glue_get_init_creds (Cannot contact any KDC for realm \u0026#39;ATHENA.MIT.EDU\u0026#39; [-1765328228]) [08:48:55:956] [26120:0000660b] [ERROR][com.winpr.sspi.Kerberos] - [kerberos_AcquireCredentialsHandleA]: krb5glue_get_init_creds (Cannot contact any KDC for realm \u0026#39;ATHENA.MIT.EDU\u0026#39; [-1765328228]) [08:48:55:967] [26120:0000660b] [WARN][com.freerdp.core.connection] - [rdp_client_connect_auto_detect]: expected messageChannelId=1008, got 1003 [08:48:55:967] [26120:0000660b] [WARN][com.freerdp.core.license] - [license_read_binary_blob_data]: license binary blob::type BB_ERROR_BLOB, length=0, skipping. [08:48:55:992] [26120:0000660b] [WARN][com.freerdp.core.connection] - [rdp_client_connect_auto_detect]: expected messageChannelId=1008, got 1003 [08:48:55:999] [26120:0000660b] [INFO][com.freerdp.gdi] - [gdi_init_ex]: Local framebuffer format PIXEL_FORMAT_BGRX32 [08:48:55:999] [26120:0000660b] [INFO][com.freerdp.gdi] - [gdi_init_ex]: Remote framebuffer format PIXEL_FORMAT_BGRA32 [08:48:55:000] [26120:0000660b] [INFO][com.freerdp.channels.rdpsnd.client] - [rdpsnd_load_device_plugin]: [static] Loaded fake backend for rdpsnd [08:48:55:000] [26120:0000660b] [INFO][com.freerdp.channels.drdynvc.client] - [dvcman_load_addin]: Loading Dynamic Virtual Channel ainput [08:48:55:000] [26120:0000660b] [INFO][com.freerdp.channels.drdynvc.client] - [dvcman_load_addin]: Loading Dynamic Virtual Channel rdpgfx [08:48:55:001] [26120:0000660b] [INFO][com.freerdp.channels.drdynvc.client] - [dvcman_load_addin]: Loading Dynamic Virtual Channel disp [08:48:55:001] [26120:0000660b] [INFO][com.freerdp.channels.drdynvc.client] - [dvcman_load_addin]: Loading Dynamic Virtual Channel rdpsnd [08:48:55:123] [26120:000066fe] [INFO][com.freerdp.channels.rdpsnd.client] - [rdpsnd_load_device_plugin]: [dynamic] Loaded fake backend for rdpsnd [08:48:56:947] [26120:000066fe] [WARN][com.freerdp.channels.drdynvc.client] - [check_open_close_receive]: {Microsoft::Windows::RDS::DisplayControl:9} OnOpen=(nil), OnClose=0x7f02c8b5ecc0 [08:48:56:965] [26120:000066fe] [INFO][com.freerdp.channels.rdpsnd.client] - [rdpsnd_load_device_plugin]: [dynamic] Loaded fake backend for rdpsnd [08:48:58:969] [26120:000066fe] [WARN][com.freerdp.channels.drdynvc.client] - [check_open_close_receive]: {Microsoft::Windows::RDS::DisplayControl:9} OnOpen=(nil), OnClose=0x7f02c8b5ecc0 [08:48:58:979] [26120:00006608] [ERROR][com.freerdp.core] - [freerdp_abort_connect_context]: ERRCONNECT_CONNECT_CANCELLED [0x0002000B] 1.2 问题分析 # 日志中的关键错误：\n[ERROR][com.winpr.sspi.Kerberos] - [kerberos_AcquireCredentialsHandleA]: krb5glue_get_init_creds (Cannot contact any KDC for realm \u0026#39;ATHENA.MIT.EDU\u0026#39; [-1765328228]) FreeRDP 试图使用 Kerberos 认证，但无法联系到域控制器，导致多次超时重试。\n1.3 解决方案 # 明确指定本地认证\n1.3.1 对于测试RDP 的命令 # 修改成：\nxfreerdp3 /u:\u0026#34;Administrator\u0026#34; /p:\u0026#34;1\u0026#34; /v:192.168.122.122 /cert:tofu /d:WORKGROUP 1.3.2 对于安装脚本的超时失败 # 通过阅读安装脚本，发现 /d: 参数由 RDP_DOMAIN 决定\n对应到 ~/.config/winapps/winapps.conf 上，也就是修改成：\n# [WINDOWS DOMAIN] # DEFAULT VALUE: \u0026#39;\u0026#39; (BLANK) RDP_DOMAIN=\u0026#34;WORKGROUP\u0026#34; 1.4 备注 # 1.4.1 关于 AI # 大部分 AI（DeepSeek Qwen）会给出 xfreerdp3 /u:\u0026quot;Administrator\u0026quot; /p:\u0026quot;1\u0026quot; /v:192.168.122.122 /cert:tofu /sec:rdp 或者 xfreerdp3 /u:\u0026quot;Administrator\u0026quot; /p:\u0026quot;1\u0026quot; /v:192.168.122.122 /cert:tofu /auth-only:ntlm 一个命令会报错，一个仍然需要等待大量时间\n还是 Claude 牛逼，虽然仍然给出上面的错误指令，但是也给出了正确方案 xfreerdp3 /u:\u0026quot;Administrator\u0026quot; /p:\u0026quot;1\u0026quot; /v:192.168.122.122 /cert:tofu /d:WORKGROUP ​\n1.4.2 Claude 给出的其他方案（不知道是否可行） # 在 Windows 虚拟机中：\n打开\u0026quot;组策略编辑器\u0026quot; (gpedit. Msc) 导航到：计算机配置 → 管理模板 → Windows 组件 → 远程桌面服务 → 远程桌面会话主机 → 安全 禁用\u0026quot;要求使用网络级别身份验证对远程连接的用户进行身份验证\u0026quot; 或者直接 cmd 命令：\nreg add \u0026#34;HKLM\\SYSTEM\\CurrentControlSet\\Control\\Terminal Server\\WinStations\\RDP-Tcp\u0026#34; /v UserAuthentication /t REG_DWORD /d 0 2. 中文无法输入 # 2.1 特点 # 无法显示输入法候选词窗口\n2.2 原因\u0026amp;解决方案 # Windows原生输入法兼容性不好。建议换为微信输入法，百度输入法等\nWindows 开机后在 winapps 连接前使用了其他连接（KVM 的、测试RDP 时的），导致输入法候选词窗口跑到其他连接上没回来（我是这样理解的）。一般重启可解决\n3. 中文输入乱码 # 3.1 特点 # 按键映射错误：\n类似这样\n打开记事本，输入 qw，结果记事本上的内容为​s'd​，候选词为“上的” 同理，Backspace, Delete 等按键也映射异常，导致无法退格删除等 英文就能正常输入 3.2 原因\u0026amp;解决方案 # 你被 README 的一句话骗了：\n3.2.1 Step 3: Create a WinApps Configuration File 第 3 步：创建 WinApps 配置文件 # \u0026hellip;\u0026hellip;\n3.2.1.1 Configuration Options Explained # \u0026hellip;\u0026hellip;\u0026hellip; To enable non-English input and seamless language switching, you can try adding **​/kbd:unicode​**​ to **​RDP_FLAGS​**​ . This ensures client inputs are sent as Unicode sequences. \u0026hellip;\u0026hellip; 里面的\nTo enable non-English input and seamless language switching, you can try adding ​ /kbd:unicode ​​ to ​ RDP_FLAGS ​​ . This ensures client inputs are sent as Unicode sequences.\n为了启用非英语输入并实现无缝的语言切换，您可以尝试在 /kbd:unicode 添加到 RDP_FLAGS 中。这确保客户端输入以 Unicode 序列发送。\n就是它干的！不要加 /kbd:unicode！血的教训！\n明明是\nTo enable prevent non-English input and seamless difficult language switching, you can try adding /kbd:unicode to RDP_FLAGS. This ensures client inputs are sent as Unicode sequences garbled.\n为了启用​阻止非英语输入并实现无缝​困难的语言切换，您可以尝试在 /kbd:unicode 添加到 RDP_FLAGS 中。这确保客户端输入以 Unicode 序列​乱码发送。\n可能对其他语言有用，对中文还是算了吧\n4. 已经被我修复 待官方修复 没解决 的问题 # 注：已经​**提交了PR**​ **，**​~~等待官方修复 ing\u0026hellip;~~ 已合并，BUG已修复\n4.1 发现问题 # 直接双击打开文件（文件挂载在 /run/media/s/松果U盘/DeepSeek.pptx）\n但是用①选择文件打开，正常。之后直接点②也能直接打开。\n奇了怪了\n4.2 分析问题 # 仔细观察发现：\n图一的路径是 \\\\tsclient\\media\\松果U盘\\DeepSeek.pptx ​\n图二的路径是 \\\\tsclient\\media\\s\\松果U盘\\DeepSeek.pptx ​\n也就是说，winapps 启动的时候挂载的是 \\\\tsclient\\media\\s\\松果U盘\\, 但是启动 PowerPoint 的命令行却指向了 \\\\tsclient\\media\\松果U盘\\，导致 PowerPoint 找不到文件\n花了一晚上时间，发现是 ~/.local/bin/winapps 的正则匹配有问题\n第 668 行的 -e 's|\u0026lt;sup\u0026gt;('\u0026quot;${REMOVABLE_MEDIA//|/\\|}\u0026quot;')/[\u0026lt;/sup\u0026gt;/]*|\\\\\\\\tsclient\\\\media|' \\ ​\n应该改成 -e 's|^'\u0026quot;${REMOVABLE_MEDIA}\u0026quot;'|\\\\\\\\tsclient\\\\media|' \\ ​\n已经​**提交了PR**​ **，**​~~等待官方修复 ing\u0026hellip;~~ 已合并\n4.3 解决问题 # 编辑 ~/.local/bin/winapps，把第 668 行改成：\n-e \u0026#39;s|^\u0026#39;\u0026#34;${REMOVABLE_MEDIA}\u0026#34;\u0026#39;|\\\\\\\\tsclient\\\\media|\u0026#39; \\ 大功告成！\n","date":"2025-8-6","externalUrl":null,"permalink":"/posts/linux/%E6%88%91%E9%81%87%E5%88%B0%E7%9A%84winapps%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/","section":"Posts","summary":"","title":"我遇到的winapps问题\u0026解决方案","type":"posts"},{"content":" 1. 启用 Btrfs 压缩 # 1.1 配置步骤 # 要为 Btrfs 文件系统启用透明压缩，需在 /etc/fstab 中为挂载选项添加 compress 参数。\n编辑 /etc/fstab：\nUUID=da4fd0a6-78d7-464c-8e24-b38ee2d483b7 / btrfs subvol=/@,defaults,compress=zstd:3 0 0 UUID=da4fd0a6-78d7-464c-8e24-b38ee2d483b7 /home btrfs subvol=/@home,defaults,compress=zstd:3 0 0 UUID=da4fd0a6-78d7-464c-8e24-b38ee2d483b7 /var/cache btrfs subvol=/@cache,defaults,compress=zstd:1 0 0 UUID=da4fd0a6-78d7-464c-8e24-b38ee2d483b7 /var/log btrfs subvol=/@log,defaults,compress=zstd:2 0 0 说明：zstd 压缩级别范围通常为 1–15（部分内核版本可能支持更高），级别越高压缩率越好但 CPU 开销更大。zstd:3 是兼顾性能与压缩率的常用选择。\n重新挂载文件系统以应用新选项：\n# 重新加载 systemd 配置（非必需，但推荐） sudo systemctl daemon-reload # 重新挂载各子卷 sudo mount -o remount,compress=zstd:3 / sudo mount -o remount,compress=zstd:3 /home sudo mount -o remount,compress=zstd:1 /var/cache sudo mount -o remount,compress=zstd:2 /var/log 注意：重新挂载仅对新写入的文件生效。已有文件仍为未压缩状态。\n（可选）对现有文件重新压缩：\nBtrfs 通过 defragment 操作可对已有文件应用压缩。但需注意：btrfs filesystem defragment 命令不支持指定 zstd 压缩级别，仅能指定算法。\n# 重新压缩根目录下的所有文件（递归） sudo btrfs filesystem defragment -r -v -czstd / # 对其他子卷执行相同操作 sudo btrfs filesystem defragment -r -v -czstd /home sudo btrfs filesystem defragment -r -v -czstd /var/cache sudo btrfs filesystem defragment -r -v -czstd /var/log ⚠️ 重要提示：\ndefragment 会创建文件的新副本（受 CoW 影响），短期内可能使磁盘使用量翻倍。 该操作 I/O 和 CPU 开销较大，建议在系统空闲时执行。 某些内核版本中，-czstd 实际使用默认级别（通常为 3），无法指定具体级别。 2. 为何启用压缩后空间占用反而变大？ # 2.1 问题分析 # 启用压缩并执行 defragment 后，观察到 btrfs filesystem usage / 显示 Data,single 使用量显著增加，而 Device unallocated（未分配空间）却很小，甚至系统提示磁盘空间不足。\n可能是以下原因导致：\n写时复制（CoW）机制：\nBtrfs 在修改文件时不会覆盖原数据，而是写入新位置。执行 defragment 时，每个文件都会生成一个压缩后的新副本，旧数据块不会立即释放。\n空间未回收：\n删除或覆盖文件后，Btrfs 不会立即将空间返还给文件系统，而是标记为“可回收”。只有在执行 balance 或 sync + trim 等操作后，空间才会真正释放。\n2.2 解决方案：执行 Balance 操作 # btrfs balance 可重新组织数据块，合并碎片，并释放未使用的空间。\n# 推荐：仅平衡使用率低于 50% 的数据块（更快） sudo btrfs balance start -dusage=50 / # 或执行完整平衡（耗时较长，更彻底） sudo btrfs balance start / 建议：首次可先用 -dusage=50 快速回收空间；若效果不佳，再考虑完整平衡。\n监控平衡进度：\n# 查看当前状态 sudo btrfs balance status / # 每 5 秒刷新一次 watch -n 5 \u0026#39;sudo btrfs balance status /\u0026#39; 平衡完成后，强制同步并释放空间：\nsudo btrfs filesystem sync / 此命令确保所有挂起的写操作完成，并触发空间回收。\n2.3 建议 # 定期执行 balance：对于写入频繁的系统（如日志、缓存目录），可设置定时任务每月执行一次轻量级 balance。 检查快照：Btrfs 快照会阻止空间释放。使用 btrfs subvolume list / 查看是否有冗余快照，并用 btrfs subvolume delete 清理。（或者用timeshift） 附：数据完整性检查 # 为确保压缩和平衡操作未损坏数据，可运行 scrub：\n# 启动后台校验 sudo btrfs scrub start / # 查看结果 sudo btrfs scrub status / Scrub 会读取所有数据块并验证校验和，自动修复可恢复的错误（需有冗余配置，如 RAID1）。\n","date":"2025-8-5","externalUrl":null,"permalink":"/posts/linux/btrfs%E5%8E%8B%E7%BC%A9%E7%A9%BA%E9%97%B4%E5%8D%A0%E7%94%A8%E5%8F%98%E5%A4%A7/","section":"Posts","summary":"","title":"btrfs压缩、空间占用变大","type":"posts"},{"content":" 1. 特点 # $ sudo swapon /swapfile swapon: /swapfile：swapon 失败: 无效的参数 或者 swapon: swapfile: swapon failed: Invalid argument 2. 原因 # 在Btrfs上建立交换文件需要设置 No_COW 属性 + 禁用压缩\n3. 解决方案 # ⚠️注意：\n在 btrfs 下，创建swap 文件而不是 swap 分区时：\n把 swap 文件放到​ ​ /swap ​​子卷中： 因为 timeshift 不会备份 /swap 子卷，导致恢复快照时，swap 文件 /swap/swapfile 会消失\n不把 swap 文件放到子卷中： timeshift 备份时，swapfile 被内核使用，会导致 E: ERROR: Could not create subvolume: Text file busy，导致无法创建快照 (参考来源)\n最佳实践可能是创建 swap 分区而不是swap 文件\n或者仍然把 swap 文件放到​ ​ /swap ​​子卷中，timeshift 恢复快照后，手动把 /swap 目录删掉、把原来的 /swap 子卷移动过来\n以下是创建 swap 文件+不把 swap 文件放到子卷中的方案（创建 swap 分区的方法网上一搜一大把，就不写了）：\n3.1 错误示范： # $ sudo truncate -s 6G /swapfile # 创建一个6G大小的文件 $ sudo chattr +C /swapfile # 设置No_COW属性 $ sudo btrfs property set /swapfile compression none # 禁用压缩 $ sudo chmod 600 /swapfile # 设置swapfile权限 $ sudo mkswap /swapfile # 格式化swapfile mkswap: /swapfile 包含空洞或者其它不支持的扩展。 此交换文件可能会在启用时被内核拒绝！ 使用 --verbose 显示更多细节。 正在设置交换空间版本 1，大小 = 6 GiB (6442446848 个字节) 无标签，UUID=0c11bd0e-061e-419f-88b9-b13504f612c4 $ sudo swapon /swapfile # 启用swapfile swapon: /swapfile：将跳过 - 它似乎有空洞。 $ 错误行为：先写入 6 G，再设置 No_COW 属性 + 禁用压缩\n❌这样不行，6 G 内容被压缩了\n热心网友的提醒（在评论区）：\n⚠️注意\nbtrfs 文件系统玩 swapfile，如果还想用 timeshift 或者 snapper 备份快照，就必须把 swap 文件放到不需要备份的子卷里面（比如创建 @swap 子卷）。 不然的话，如果直接放在需要快照的子卷，会在创建快照的时候会失败（提示设备正在被写入啥的/ 在 timeshift GUI 上不显示创建的快照） 要是像我一样，哪天需要恢复快照了，突然发现一个快照都没建出来就搞笑了\u0026hellip;\u0026hellip;\n设置子卷的 swap 创建我会放在另一个博客里面\n如果你要用到 timeshift 等 btrfs 快照（大概率你会用到），就去那个博客里面看！\n博客地址：https://www.cnblogs.com/sunong/p/19026935.html\n3.2 正确示范（不设置子卷） # ⚠️再次提醒：如果你要用到 timeshift 等 btrfs 快照（大概率你会用到），就去那个博客里面看！\n# 创建一个0大小的文件 sudo truncate -s 0 /swapfile # 设置No_COW属性 sudo chattr +C /swapfile # 禁用压缩 sudo btrfs property set /swapfile compression none ERROR: failed to set compression for /swapfile: Invalid argument #不知道为什么，不过不影响 # 将文件填充、扩容 sudo dd if=/dev/zero of=/swapfile bs=1G count=6 # 设置swapfile权限 sudo chmod 600 /swapfile # 格式化swapfile sudo mkswap /swapfile # 启用swapfile sudo swapon /swapfile 3.3 验证交换空间是否启用 # # 查看交换文件是否已激活 sudo swapon --show # 查看系统内存和交换使用情况 free -h 你应该能看到类似这样的输出：\n$ sudo swapon --show NAME TYPE SIZE USED PRIO /swap/swapfile file 6G 0B -2 $ free -h 总计 已用 空闲 共享 缓冲/缓存 可用 内存： 15Gi 6.3Gi 621Mi 1.3Gi 9.5Gi 9.0Gi 交换： 6.0Gi 0B 6.0Gi 3.4 设置开机自动挂载 swapfile # # 编辑 fstab 文件 sudo nano /etc/fstab # 在文件末尾添加这一行： /swapfile none swap sw 0 0 重启后验证交换文件是否自动启用：\n# 查看交换文件是否已激活 sudo swapon --show # 查看系统内存和交换使用情况 free -h 你应该能看到类似这样的输出：\n$ sudo swapon --show NAME TYPE SIZE USED PRIO /swapfile file 6G 0B -2 $ free -h 总计 已用 空闲 共享 缓冲/缓存 可用 内存： 15Gi 6.3Gi 621Mi 1.3Gi 9.5Gi 9.0Gi 交换： 6.0Gi 0B 6.0Gi ‍\n","date":"2025-8-5","externalUrl":null,"permalink":"/posts/linux/swapon-%E5%A4%B1%E8%B4%A5%E6%97%A0%E6%95%88%E7%9A%84%E5%8F%82%E6%95%B0-%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95/","section":"Posts","summary":"","title":"swapon 失败：无效的参数 的解决方法","type":"posts"},{"content":" 1. 前景提要 # 首先，KDE 有这个界面\n但是用过就会知道，即使你都勾选上了，它照样不会开机自动挂载\nforum.ubuntu.com.cn/viewtopic.php?t=50539 提及了这个问题，虽然没有提到治本的解决方法，但是一个哥们提醒了我：\n调查发现是 uudisksctl mount -b xxxx 这个命令需要 root，而 KDE 似乎没有这个权限，也不会弹窗索要，导致部分分区（可能只限不可移动硬盘上的NTFS 分区）无法开机自动挂载\n2. 解决方案 # 2.1 换一种方式挂载（省心） # 常见方法有（Deepseek 给的）：\n通过 /etc/fstab 配置 使用 systemd 自动挂载 使用 pmount 工具 2.2 让 udisksctl mount -b xxxx 这类命令无需 root 权限执行 # 2.2.1 失败的方案 # 我也不知道为啥不行，网上搜的都这样干\n将用户加入 storage 用户组 sudo usermod -aG storage $(whoami) # 将当前用户加入 storage 组 验证组是否生效：运行 groups 命令，检查输出是否包含 storage。\n注销并重新登录使组权限生效\n2.2.2 可行的方案：配置 PolicyKit 规则（推荐） # 创建 PolicyKit 规则文件： sudo nano /etc/polkit-1/rules.d/50-udisks2.rules 添加以下内容： // 允许所有用户挂载/卸载块设备 polkit.addRule(function(action, subject) { if (action.id == \u0026#34;org.freedesktop.udisks2.filesystem-mount\u0026#34; || action.id == \u0026#34;org.freedesktop.udisks2.filesystem-unmount\u0026#34;) { return polkit.Result.YES; } }); 或者下面这个（没试过）：\n// 更精细的控制，只允许特定用户组 polkit.addRule(function(action, subject) { if ((action.id == \u0026#34;org.freedesktop.udisks2.filesystem-mount\u0026#34; || action.id == \u0026#34;org.freedesktop.udisks2.filesystem-unmount\u0026#34;) \u0026amp;\u0026amp; subject.isInGroup(\u0026#34;plugdev\u0026#34;)) { return polkit.Result.YES; } }); 重启以后就能发现分区被自动挂载了！\n‍\n","date":"2025-8-4","externalUrl":null,"permalink":"/posts/linux/%E8%AE%A9kde%E8%87%AA%E5%8A%A8%E6%8C%82%E8%BD%BD%E5%90%84%E4%B8%AA%E5%88%86%E5%8C%BA/","section":"Posts","summary":"","title":"让KDE自动挂载各个分区","type":"posts"},{"content":" 1. 特点 # linuxmint (ubuntu) ：\n开机黑屏。切到高级设置进入，卡在 loading initial ramdisk 界面；但是可以进入高级设置-recovery mode，在里面选择 resume 可以进入系统。\nManjaro (arch) ：\n安装完系统开机就黑屏，recovery mode 进不去\nopensuse：\n安装完系统开机就黑屏，其他未知\n临时解决方案：\n在 grub 中，对着启动项按下 e，找到以 linux /boot/vmlinuz... 开头的行，在行尾添加 dis_ucode_ldr 可以开机\n2. 原因 # Intel 微代码（Microcode）更新与内核或硬件兼容性冲突\n3. 解决方法 # 3.1 方法 1：改 grub（治标不治本，不过所有 linux 都可以用）： # 编辑 GRUB 配置文件： sudo nano /etc/default/grub 在​​ GRUB_CMDLINE_LINUX ​​中添加禁用参数：\n找到以 GRUB_CMDLINE_LINUX= 开头的行，在引号内添加 dis_ucode_ldr 参数： GRUB_CMDLINE_LINUX=\u0026#34;...原有参数... dis_ucode_ldr\u0026#34; 示例（修改后可能类似这样）：\nGRUB_CMDLINE_LINUX=\u0026#34;quiet splash dis_ucode_ldr\u0026#34; 保存并更新 GRUB：\n按 Ctrl+X → 输入 Y → 回车保存文件，然后执行： sudo update-grub 重启系统： sudo reboot 3.2 方法 2：禁止微代码集成到 initramfs（linuxmint 可行、Manjaro 不可行） # 若降级无效，需彻底阻止微代码被加载到初始内存盘：\n编辑微代码配置文件： sudo nano /etc/default/intel-microcode 修改为以下内容： IUCODE_TOOL_INITRAMFS=no 重新生成 initramfs： sudo update-initramfs -u # Ubuntu/Debian sudo dracut -f # Fedora/openSUSE 3.3 方法 3：降级 Intel 微代码（没试过） # 进入 Recovery Mode 选择 resume 进入系统。 执行以下命令安装旧版微代码包： sudo apt install intel-microcode=3.20180312.0~ubuntu18.04.1 # Ubuntu 18.04 示例版本 3.4 试过没用的方法（别看这个，Manjaro 没用） # 在 Arch Linux 中阻止 Intel 微代码打包到 initramfs，通过配置 mkinitcpio 工具实现。\n移除 ​ microcode ​​ 钩子\n编辑 /etc/mkinitcpio.conf： sudo nano /etc/mkinitcpio.conf 在 HOOKS 行中找到 microcode 并将其删除。例如修改前： HOOKS=(base systemd autodetect microcode modconf kms keyboard sd-vconsole block filesystems fsck) 修改后：\nHOOKS=(base systemd autodetect modconf kms keyboard sd-vconsole block filesystems fsck) 保存文件（Ctrl+O → Enter → Ctrl+X）。 重新生成 initramfs\n执行以下命令应用更改：\nsudo mkinitcpio -P 此命令会为所有已安装的内核重新生成 initramfs 镜像（如 initramfs-linux.img），不再包含微代码。\n验证是否生效\n检查生成的 initramfs 内容： lsinitcpio /boot/initramfs-linux.img | grep -i microcode 若输出中无 intel-ucode.img 等微代码文件，则表示已成功移除。\n4. ⚠️不要直接删除​​ intel_ucode ​​包 # 4.1 如果已经删了 # 开机会提示缺失​​ ucode.img ​​蓝屏（Manjaro）\n4.1.1 原因 # 卸载 intel-ucode 后，/boot/intel-ucode.img 文件被删除。 但 GRUB 配置未更新，仍包含对该文件的引用，导致引导时因文件缺失而崩溃。 4.1.2 解决方案：更新 GRUB 配置（没试过，来自 DeepSeek） # 需手动移除对 intel-ucode.img 的依赖，并重新生成引导文件：\n使用 Arch Linux 安装介质启动\n从 USB 安装盘启动，选择 “Troubleshooting” → “Boot Arch Linux” 进入临时系统。 挂载原系统分区\n假设根分区为 /dev/nvme0n1p2，EFI 分区为 /dev/nvme0n1p1： mount /dev/nvme0n1p2 /mnt # 挂载根分区 mount /dev/nvme0n1p1 /mnt/boot # 挂载 EFI 分区 arch-chroot /mnt # 切换到原系统环境 修改 GRUB 配置文件\n编辑 /boot/grub/grub.cfg 或重新生成配置： 方法 1：重新生成 GRUB 配置（推荐） grub-mkconfig -o /boot/grub/grub.cfg # 自动清理无效的 ucode 引用 方法 2：手动编辑（若自动生成无效）\n找到所有包含 initrd /boot/intel-ucode.img 的行，删除该部分，仅保留对 initramfs 的引用。例如：\n原内容： initrd /boot/intel-ucode.img /boot/initramfs-linux.img 修改为：\ninitrd /boot/initramfs-linux.img 退出并重启 exit umount -R /mnt reboot 4.2 可能的正确删除方法 # 若你坚持卸载微码（一般不推荐，除非确定 CPU 无需更新），需确保彻底清理：\n卸载包并清除残留 sudo pacman -Rns intel-ucode # 卸载并删除依赖配置 sudo rm /boot/intel-ucode.img # 确保文件被删除 重建 initramfs（部分内核需此步骤） sudo mkinitcpio -P # 重新生成 initramfs，避免依赖微码 ","date":"2025-8-3","externalUrl":null,"permalink":"/posts/linux/linux%E5%BC%80%E6%9C%BA%E9%BB%91%E5%B1%8F%E7%9A%84%E4%B8%80%E7%A7%8D%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%E5%BE%AE%E4%BB%A3%E7%A0%81/","section":"Posts","summary":"","title":"linux开机黑屏的一种解决方案","type":"posts"},{"content":"","externalUrl":null,"permalink":"/authors/","section":"Authors","summary":"","title":"Authors","type":"authors"},{"content":"","externalUrl":null,"permalink":"/categories/","section":"Categories","summary":"","title":"Categories","type":"categories"},{"content":"","externalUrl":null,"permalink":"/series/","section":"Series","summary":"","title":"Series","type":"series"}]