Compare commits

...

52 Commits

Author SHA1 Message Date
6ac6b835bf Edit Diaries.
All checks were successful
部署文档 / build (push) Successful in 1m34s
Signed-off-by: SilverAg.L <caclx@outlook.com>
2026-03-10 01:18:16 +08:00
4f393245ab Edit Diary: about me
All checks were successful
部署文档 / build (push) Successful in 1m17s
Signed-off-by: SilverAg.L <caclx@outlook.com>
2026-03-06 06:17:18 +08:00
7c26278cf6 deps: update
Signed-off-by: SilverAg.L <caclx@outlook.com>
2026-03-06 06:16:25 +08:00
3715d0e67a deps: update
All checks were successful
部署文档 / build (push) Successful in 1m49s
Signed-off-by: SilverAg.L <caclx@outlook.com>
2026-03-01 20:52:32 +08:00
2b62d58c85 Edit Diary: nas media
All checks were successful
部署文档 / build (push) Successful in 3m20s
Signed-off-by: SilverAg.L <caclx@outlook.com>
2026-02-22 23:36:39 +08:00
daf60578cf deps: update
All checks were successful
部署文档 / build (push) Successful in 1m17s
Signed-off-by: SilverAg.L <caclx@outlook.com>
2026-02-22 02:17:53 +08:00
98a26a98ae 更新 README.md 2026-02-21 17:42:25 +00:00
fa16a643aa Edit Diary: nas media
All checks were successful
部署文档 / build (push) Successful in 1m3s
Signed-off-by: SilverAg.L <caclx@outlook.com>
2026-02-18 01:29:47 +08:00
7fc4da6b14 Rewrite Diary: nas media
All checks were successful
部署文档 / build (push) Successful in 1m12s
Signed-off-by: SilverAg.L <caclx@outlook.com>
2026-02-15 18:38:56 +08:00
88255d71b8 New Diary: nas media metadata
All checks were successful
部署文档 / build (push) Successful in 1m53s
Signed-off-by: SilverAg.L <caclx@outlook.com>
2026-01-30 18:19:56 +08:00
84ebc3c305 deps: update
Signed-off-by: SilverAg.L <caclx@outlook.com>
2026-01-30 17:31:00 +08:00
4c4436c6c6 New Diary: maid
All checks were successful
部署文档 / build (push) Successful in 1m41s
Signed-off-by: SilverAg.L <caclx@outlook.com>
2025-12-31 04:30:12 +08:00
3604b6e4c0 update
All checks were successful
部署文档 / build (push) Successful in 1m8s
- deps
- faster js cdn
- Diary: recents 2025
- Notes:
ArchInstall (archCN mirror, niri refs)
ArchUEFI (make `bootxxx.efi` questions more neutral)
SelfHosted (wont extend notes anymore)

Signed-off-by: SilverAg.L <caclx@outlook.com>
2025-12-26 00:40:16 +08:00
8eed3560c1 New Diary: recent maintains.
All checks were successful
部署文档 / build (push) Successful in 1m33s
2025-11-17 14:03:19 +08:00
c9b385dc0d deps: update
All checks were successful
部署文档 / build (push) Successful in 1m32s
- seems the font fetching needs optimization.
2025-11-17 11:48:38 +08:00
d04f252d68 Del Note: jellyfin repo organization
- as for now I admit the importance of maintaining medias into reasonable trees.
2025-11-17 11:47:32 +08:00
e423fa9b35 deps: update
All checks were successful
部署文档 / build (push) Successful in 1m35s
2025-11-06 19:29:44 +08:00
d0ba0f16ec Del Diaries: self blaming
All checks were successful
部署文档 / build (push) Successful in 1m29s
may move them into 'moments' in future templates or implements, or may not.

in case even I am tired to look down myself now. lazy to write more stuffs.
2025-11-02 23:45:22 +08:00
f16d4f5649 Misc: rename groups
- maybe migrate to another theme later.
2025-11-01 06:27:22 +08:00
d43864e7e8 deps: update 2025-11-01 06:19:10 +08:00
09b7d88805 deps: update
All checks were successful
部署文档 / build (push) Successful in 1m35s
2025-10-22 09:06:55 +08:00
1024113c21 [Link] Asankilp (#11)
All checks were successful
部署文档 / build (push) Successful in 3m43s
Reviewed-on: #11
2025-10-11 10:01:31 +00:00
7e0c8aa896 [Link] Asankilp (#10)
Some checks failed
部署文档 / build (push) Failing after 11m10s
Reviewed-on: #10
2025-10-10 18:28:34 +00:00
5497b204fd [Link] SD7935的友链申请 (#9)
All checks were successful
部署文档 / build (push) Successful in 1m30s
[原文地址](https://github.com/AgxCOy/AgxCOy/issues/24)

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Reviewed-on: https://git.liteyuki.org/AgxCOy/blogs/pulls/9
2025-10-03 19:42:27 +00:00
676783aa81 Edit Note: Arch UEFI
All checks were successful
部署文档 / build (push) Successful in 1m35s
- reword some repeats
2025-10-02 21:44:26 +08:00
0d1de50594 Edit Diaries - Appendix, Removal
All checks were successful
部署文档 / build (push) Successful in 1m31s
2025-10-02 21:25:21 +08:00
a111647c46 Edit Notes - Rearrange, Appendix, Bugfixes. 2025-10-02 17:23:43 +08:00
176b33ec18 Edit Category: diaries
All checks were successful
部署文档 / build (push) Successful in 1m28s
* btw Edit Diary: Cold Down.
2025-09-06 00:16:58 +08:00
c27bbe4fcf Rewrite Diary: Cold Down
All checks were successful
部署文档 / build (push) Successful in 1m31s
2025-09-06 00:04:38 +08:00
fdf210cdf1 Edit Note: Jellyfin File Organization 2025-09-05 21:53:02 +08:00
cb278764a0 Edit Diary: GuGuGu
All checks were successful
部署文档 / build (push) Successful in 1m30s
lazy to amend.

Signed-off-by: SilverAg.L <caclx@outlook.com>
2025-08-19 22:31:15 +00:00
74c474a725 Edit Diary: GuGuGu
All checks were successful
部署文档 / build (push) Successful in 1m29s
2025-08-20 06:22:33 +08:00
e1c44f841a New Diary: Cold Down
All checks were successful
部署文档 / build (push) Successful in 1m33s
2025-08-20 06:15:18 +08:00
e6eb8f8a13 New Diary: GuGuGu.
or ... cuckoo?
2025-08-20 06:14:27 +08:00
04d88e1a87 New Diary: Yume
All checks were successful
部署文档 / build (push) Successful in 2m36s
2025-07-17 09:16:46 +08:00
9338c38cb5 style: use my own build of LXGW WenKai.
All checks were successful
部署文档 / build (push) Successful in 4m29s
2025-07-16 22:26:35 +08:00
56c2eb882f Edit Note: Jellyfin File Org
All checks were successful
部署文档 / build (push) Successful in 4m22s
append notes about album\discs.
2025-07-06 22:59:38 +08:00
4ba0db9fe2 fix(css): full fonts override
All checks were successful
部署文档 / build (push) Successful in 1m11s
2025-07-02 04:47:55 +08:00
7b982a06fe fix(css): explicitly refer bold style-sheet
All checks were successful
部署文档 / build (push) Successful in 1m9s
2025-07-02 04:37:12 +08:00
8410290794 fix(css): using faster jsdelivr source
All checks were successful
部署文档 / build (push) Successful in 1m24s
2025-07-02 02:37:51 +08:00
69de54787e style: switch to LXGW Wenkai Screen
All checks were successful
部署文档 / build (push) Successful in 2m0s
Noto Serif SC by default (400 weight) is still too light in 1080p 100% scale,
which may looks unclear sometimes.
2025-07-02 01:45:47 +08:00
80c5d6c324 [Link] 律回 (#8)
All checks were successful
部署文档 / build (push) Successful in 1m9s
Reviewed-on: #8
2025-06-29 22:56:06 +00:00
8f56b2436f [Link] 神羽 (#7)
All checks were successful
部署文档 / build (push) Successful in 1m8s
Reviewed-on: #7
2025-06-29 19:32:27 +00:00
bd9c4aeec9 [Link] 岛风 (#6)
All checks were successful
部署文档 / build (push) Successful in 1m15s
Reviewed-on: #6
2025-06-29 19:30:38 +00:00
5f6e5ddb6d Edit Note: Jellyfin File Org.
Some checks failed
部署文档 / build (push) Failing after 6s
To fix shape issue on some images, when displayed in mobile devices.
2025-06-29 00:33:05 +08:00
350e1fd4c1 New Note: Jellyfin File Organization
Some checks failed
部署文档 / build (push) Failing after 4m40s
2025-06-28 23:25:25 +08:00
5cbddd7a53 Edit Note: Self Hosted 2025-06-28 15:15:29 +08:00
e2cf5cd376 deps: update
All checks were successful
部署文档 / build (push) Successful in 1m59s
2025-06-22 15:30:05 +08:00
957a8fbdab chore: re-arrange tags, categories, dairies. 2025-06-22 15:25:49 +08:00
f25a640fa5 Reword Diary: The needs, the abilities.
All checks were successful
部署文档 / build (push) Successful in 45s
note: just like verbs in git rebase, edit to change details, reword to change the title.
2025-06-20 11:46:39 +08:00
8a0b0e9a83 New Diary: The needs, the abilities.
All checks were successful
部署文档 / build (push) Successful in 41s
2025-06-20 04:29:13 +08:00
7e1fbb73a2 fix(css): center align FriendsHome hero-title
All checks were successful
部署文档 / build (push) Successful in 47s
2025-06-18 13:55:37 +08:00
48 changed files with 2898 additions and 2603 deletions

View File

@@ -1,7 +1,7 @@
{ {
"files.exclude": { "files.exclude": {
"**/*.png": true, "**/*.webp": true,
"**/*.webp": true "**/*.avif": true
}, },
"editor.tabSize": 2 "editor.tabSize": 2
} }

9
.vscode/tasks.json vendored
View File

@@ -5,13 +5,20 @@
"type": "npm", "type": "npm",
"script": "dev", "script": "dev",
"problemMatcher": [], "problemMatcher": [],
"label": "pnpm: dev", "label": "npm: dev",
"detail": "vuepress-vite dev src", "detail": "vuepress-vite dev src",
"isBackground": true, "isBackground": true,
"runOptions": { "runOptions": {
"runOn": "folderOpen", "runOn": "folderOpen",
"instanceLimit": 1 "instanceLimit": 1
} }
},
{
"type": "npm",
"script": "up-deps",
"problemMatcher": [],
"label": "npm: up-deps",
"detail": "pnpm dlx vp-update"
} }
] ]
} }

View File

@@ -1,17 +1,20 @@
## SilverAg.L 的玩具城 ## SilverAg.L 的玩具城
说人话就是咱的个人博客。不考虑英翻NO ENGLISH VERSION! 基于 [vuepress-theme-hope](https://theme-hope.vuejs.press/zh/) 滴[个人博客](https://agxcoy.shimakaze.org/)。没有英文版本。
--- ---
<p align="center"> ![MIT License](https://img.shields.io/badge/license-MIT-blue)
<img src="https://img.shields.io/badge/license-MIT-blue" alt="license - MIT"> ![CC-BY-NC-SA-4.0](https://img.shields.io/badge/license-CC--BY--NC--SA--4.0-lightgrey)
<img src="https://img.shields.io/badge/license-CC--BY--NC--SA--4.0-lightgrey" alt="license - CC-BY-NC-SA-4.0">
</p>
本博客收纳的文章统一采用 CC BY-NC-SA 4.0 协议共享。 本博客收纳的文章统一采用 CC BY-NC-SA 4.0 协议共享。
**欢迎就本博客上传的「随记」「综述」中的错误、不足之处提出 Issue 批评指正;或者看不顺眼了,丢个 Pull Request也是极好的。** 如有想法,还请移步 [GitHub 讨论区](https://github.com/AgxCOy/AgxCOy/discussions)。
如有疑问、友链需求,还请移步 [Issues](https://github.com/AgxCOy/AgxCOy/issues)。
如欲改进,也欢迎起号提 Pull Request。
「冇嘢猴肛,我係傻居居。」
### 特别鸣谢 ### 特别鸣谢
- [神羽 @SnowyKami](https://github.com/snowykami)
- [岛风 @frg2089](https://github.com/frg2089) - [岛风 @frg2089](https://github.com/frg2089)
- [神羽 @SnowyKami](https://github.com/snowykami)
- [苏阳 @Twisuki](https://github.com/Twisuki)

View File

@@ -1,3 +1,4 @@
// force Noto Serif. // force LXGW WenKai.
$vp-font: '"Noto Serif SC", serif'; $vp-font: '"LXGW WenKai", sans-serif';
$vp-font-heading: '"LXGW WenKai", sans-serif';

View File

@@ -1,12 +0,0 @@
---
title: 综述
index: false
article: false
timeline: false
icon: folder-open
category: ''
---
“综述”这边的博文通常比较正式一些,编排上会参考大学论文、实验报告,当然也经常会有迭代(综述嘛,追求严谨)。
<Catalog />

View File

Before

Width:  |  Height:  |  Size: 1.2 MiB

After

Width:  |  Height:  |  Size: 1.2 MiB

View File

@@ -13,4 +13,4 @@ article: false
拍的时候主包可能已经 85+kg 了。最近有在减肥喵,但说实话对于女装,我不抱希望。 拍的时候主包可能已经 85+kg 了。最近有在减肥喵,但说实话对于女装,我不抱希望。
![刻晴裤袜 =360x](../../public/dress/keqing-202501.webp) ![刻晴裤袜 =360x](./keqing-202501.webp)

View File

@@ -0,0 +1,25 @@
---
article: false
---
# 年将尽,随几张女仆装
如题2025 也快结束了。今年我的精神状态感觉更糟了些。但万幸,女装——或者说穿上可爱的衣服——依旧是我内心想要去做的事之一,我也依旧愿意为此付出精力。
之前总说在减肥,目前看来 XXL 已经是我的极限了,再减似乎效果也不太明显的样子。但即便如此看着我的自拍也还是觉得怪怪的。也许我的身体条件本就不适合吧。
![黑巧-1 =300x](./maid-251231-1.avif)
![黑巧-2 =300x](./maid-251231-2.avif)
![黑巧-3 =300x](./maid-251231-3.avif)
![黑巧-4 =300x](./maid-251231-4.avif)
![白巧-1 =300x](./maid-251231-5.avif)
![白巧-2 =300x](./maid-251231-6.avif)
![白巧-3 =300x](./maid-251231-7.avif)
![白巧-4 =300x](./maid-251231-8.avif)

Binary file not shown.

After

Width:  |  Height:  |  Size: 516 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 552 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 452 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 454 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 364 KiB

View File

@@ -0,0 +1,12 @@
---
title: 好耶,是女装
index: false
article: false
timeline: false
comment: false
icon: images
---
……并不好。主包太大只,太肥了,只有肥腿堪堪能看。
<Catalog />

View File

@@ -6,8 +6,8 @@ article: false
稍微减了减肥,现在拍完自我感觉不会太难看了……吧。当然由于条件有限,体毛什么的没办法除得特别利索。如有影响观感还请见谅。 稍微减了减肥,现在拍完自我感觉不会太难看了……吧。当然由于条件有限,体毛什么的没办法除得特别利索。如有影响观感还请见谅。
![白丝大 jio =300x](../../public/dress/white_250604_1.webp) ![白丝大 jio =300x](./white_250604_1.webp)
![和之前一样地凹第一视角姿势 =300x](../../public/dress/white_250604_2.webp) ![和之前一样地凹第一视角姿势 =300x](./white_250604_2.webp)
![“侧面描写” =300x](../../public/dress/white_250604_3.webp) ![“侧面描写” =300x](./white_250604_3.webp)

View File

Before

Width:  |  Height:  |  Size: 1.3 MiB

After

Width:  |  Height:  |  Size: 1.3 MiB

View File

Before

Width:  |  Height:  |  Size: 2.2 MiB

After

Width:  |  Height:  |  Size: 2.2 MiB

View File

Before

Width:  |  Height:  |  Size: 1.1 MiB

After

Width:  |  Height:  |  Size: 1.1 MiB

View File

@@ -1,12 +1,10 @@
--- ---
title: 随想 title: 记忆的质料
index: false index: false
article: false article: false
timeline: false timeline: false
comment: false
icon: paper-plane icon: paper-plane
category: ''
--- ---
可能是小作文(或者说牢骚),可能是女装(不过主包太肥了,大概只能拍些并不好看的腿子),也可能是乱七八糟。
<Catalog /> <Catalog />

View File

Before

Width:  |  Height:  |  Size: 72 KiB

After

Width:  |  Height:  |  Size: 72 KiB

View File

Before

Width:  |  Height:  |  Size: 86 KiB

After

Width:  |  Height:  |  Size: 86 KiB

View File

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 53 KiB

View File

@@ -85,8 +85,28 @@ date: 2025-05-16
银这个设定实际上直到去年才给她勾个轮廓——**白丝魅魔猫娘少女**。乍一听这四个词组合在一起很违和。说实话我也觉得( 银这个设定实际上直到去年才给她勾个轮廓——**白丝魅魔猫娘少女**。乍一听这四个词组合在一起很违和。说实话我也觉得(
首先说说“魅魔”吧。既然银这个字有着一层谐音关系(所谓“银梦”嘛),那么我就往涩涩的方向去考虑了。所以给她的定型是魅魔元素。 相比前面两个反映我不同时期的、特点鲜明的自设,“银”这一形象就相对一以贯之,同时又很随性了。大约在初中我就误入当时流传的所谓“本子库”[^benziku],所以涩涩也算是我一直以来的隐藏属性,如今启用这个自设也有种借谐音梗的题发挥的意思。
但一来我说话做不到大多数黄油的魅魔那么“诱人”,二来我养成的猫娘口癖根深蒂固,这就决定了**立绘主体仍然是猫娘**。那么怎么办呢?那就把猫尾巴替换成魅魔尾巴罢。“猫娘身上”的“魅魔尾巴”,很奇特的组合对吧(
剩下来的要素就很简单了:白丝一般显得清纯(相对地黑丝会显得诱惑一些),穿在“摇着魅魔尾巴的猫娘”身上增添些反差感;少女嘛……可以保留一些卡哇伊的感觉。(但实际想象起来好像更偏雌小鬼一点) [^benziku]: 具体的经过已经淡忘了,我的博客对涩涩的话题也比较含蓄。可以确定的是,“本子库”、“兔纱子”、“魔法少女”这些关键词是我早期的朦胧印象,后来形成的题材偏好(或者说 xp也是基于这个印象所做的建构。
至于这个轮廓为什么这么左右脑互搏,只能说是基于自身经历导致的历史惯性吧。钙设是猫少年嘛,加上我认识的老朋友们普遍爱发猫猫表情包,所以我的口癖不可避免地也倾向于喵来喵去,忽然摘掉“猫”这个元素反倒不知道怎么表达了(毕竟我做不到真像魅魔那样妩媚)。但我又希望能够突出涩涩的要素,所以最终形象就是点缀上白丝、魅魔尾巴、猫耳猫爪的少女啦。~~但自己想象的时候感觉更像雌小鬼一点()~~
设定上魅魔尾巴非常敏感,只是碰触就会浑身战栗的程度。若是摸上那么一两下说不定就开始发情了吧。 设定上魅魔尾巴非常敏感,只是碰触就会浑身战栗的程度。若是摸上那么一两下说不定就开始发情了吧。
> “诶嘿嘿…身体绵软被搂在怀里什么的……嘿嘿…
> “可是……为什么呢?光是咀嚼着文字想象,身体就酥酥麻麻的……
> “好羡慕……好烦躁……
> “你是怎么看我的呢,氯喵?你会要我吗?
> “好想再被你抱着……抱在怀里,就像…就像……”
> ::: right
> ——Ag
> :::
---
## 后记
事实上我确实没想过它们之间会有什么社会关系,毕竟本质上都是我在网络上的皮套而已,它们都是我,却又不完全是。但真的做出决定,“既然我本来就没活,索性把身为创作者的我,叫做‘氯’的我给埋葬了吧”,这么做的时候,我的内心还是会觉得痛苦,仿佛真的失去了重要的人一般。
基于这样的感情,我才决定写下这一篇随笔,完善这几个自设的形象。至于每个设定底下的自白,更多地是对[友链 PR](https://github.com/Twisuki/blog/pull/4) 里的小对话做一个扩写,很抱歉我并不擅长写一个完整的故事,只能像这样侧面地刻画 CaCl~2~ 和 AgCl 这两对之间的亲密关系。
不论钙、氯还是银,都是我精神世界的投射,也都寄托了我的愿望或是欲求。也许我就是很享受被人家说可爱、就是会为喜欢的事情不顾一切、就是会代入本子里的女孩子、就是想要“身体绵软被搂在怀里”呢?哪怕只是想象,只是在被窝里小声呢喃着“想要”,只是在博客里发癫、写一篇篇的碎碎念。

Binary file not shown.

After

Width:  |  Height:  |  Size: 184 KiB

View File

@@ -0,0 +1,164 @@
# Jellyfin 真的好用吗?
我的结论是:实则不然。但 DIY 这一块本就是矮个子拔高个,也没那么多平替可以挑。
> [!important]
> - 本文字里行间夹带着作者的私货,行文并不严谨,谨慎阅读。
> - 本文有关的折腾流程时间跨度较长,经验之谈不说没有,也只能说碎得跟渣一样。~~所以不是笔记而是大作文。~~
## 硬件加速,硬件呢
我是 Linux Docker 部署的。由于因特耳的核显驱动闭源,**官版 Docker 容器搞起来后还需要`exec -it`进去装 Intel 驱动**;即便是`nyanmisaka`版开箱即用 Jellyfin 镜像,也需要**手动映射渲染节点**[^renderD128]。
[^renderD128]: 非要映射整个`/dev/dri`也可以,那样后续仍然**可能**需要进入容器里创建`render`组。并且由于`nyanmisaka`版镜像并没有对用户组做特别设置,如需映射渲染节点做硬件解码,就**不允许指定用户(组)运行**。
::: details docker-compose.yml
以下是最简配置。如果预计暴露到公网上,建议再加上额外的安全措施,**尤其注意收紧容器的执行权限和性能分配**。
```yaml
services:
jellyfin:
image: nyanmisaka/jellyfin:latest
container_name: jellyfin
network_mode: 'host'
volumes:
- jellyfin-config:/config
- jellyfin-cache:/cache
- /home/http/media:/media:ro,nosuid,nodev # recursive 'rx'
# - /dev/dri/renderD128:/dev/dri/renderD128
- type: bind
source: /usr/share/fonts/opentype
target: /usr/local/share/fonts/custom
read_only: true
devices:
- /dev/dri/renderD128:/dev/dri/renderD128:rw
#- /dev/dri/card0:/dev/dri/card0
restart: 'unless-stopped'
# environment:
# - JELLYFIN_PublishedServerUrl=
extra_hosts:
- 'host.docker.internal:host-gateway'
volumes:
jellyfin-cache:
driver: local
jellyfin-config:
driver: local
```
:::
## 媒体库组织
我还是更习惯树形文件系统,媒体库还是太难为我了。那样的话,事情或许也很简单——许多成品 NAS 都有自带视频、相册之类的浏览功能。但很遗憾,自己装的 Ubuntu Server 自然什么都没有。
我针对的还是 Jellyfin “神奇”的资源组织方式。就像[这篇《基于 Jellyfin 和音流的 nas 影音库搭建及踩坑》](https://sspai.com/post/90896)所说,“为什么不直接读取音乐标签进行专辑聚合”呢?
### 元数据刮削:一笔糊涂账
然而事实上,即使真的能做到自动专辑聚合,元数据本身的刻录和查询也是一片混乱。上面援引的博文推荐 MusicTag 这个工具,但同是从网易云那刮削,下载下来本是《紫罗兰永恒花园 OST》的曲目能给它识别成《凹凸世界五周年》也是给我看笑了。更别说国外的 MusicBrainZ 数据库有相当一部分冷门曲目并没有收录(尽管 Spotify 等平台能够找到)。
![误刮削](./musictag-misfetch.webp)
::: tip 音乐库最简方案
文档这么说:我管你怎么整理,我只知道**是同一张专辑就该塞在同一个文件夹**。
那么事情也好办,就按专辑名来呗。好比如:`music/{album or "[standalone]"}/{artist1,artist2} - {title}`
- 为什么要`or "[standalone]"`
- 不单独收纳**没有专辑**的单曲,结果就会被淹没在大几百首、好几页的“歌曲”页面。
- 要是有专辑重名了(比如两张专都叫`Fragrance`
- 没招,默认合并(甚至可以看到重复的曲号,都是第六首)。只能手工分离(`Fragrance - SoundzImage``Fragrance - Hatsune Miku`)。
:::
但比起前面所述的国内外两桌草台班子更令我恼火的当属大把大把的、查无此人的“黑户”。怎么来的音声、网文、3D 动画。
> 我的整理方式和 acgdb 类似3D 区、音声区作者分发、油管录播、DLsite 正作)、书目区(漫画和文集)、写真区、插画区,此外新增音乐区。
3D 区无论玩恋活还是 MMD既有图集又有视频无法按媒体类型区分。即便真要分它算电视节目电影MV分不明白。
音声区大量的音频资源,摆烂一点直接用电子书库、按文件夹访查也不是不行,但显示出来反倒是专辑名(或者说 DLsite、系列作品名更显眼而非每一集的标题若要用音乐库收纳就得改造一番目录树适配它那个“一个专辑只有一个目录”的原则工作量也不小。
至于书目区,正经出版物想获取元数据并不难。相对的,“不正经”读物呢?网文可以依靠豆瓣之流;同人文只要作者有公开发布,留心寻找也是能记下元数据的(同人圈子对打 Tag 这件事很看重那么只剩下来源不正经、题材也不正经的“那种”作品了。它们流通的地方通常都是论坛这种早期网络社区只知道个标题很难说发帖人就是作者万一是二道贩子呢甚至文件名也不一定就是完整标题。What can I say?
偏偏这种不在台面上的“资源”我收纳了不少,哪怕有自动化工具,后续校对也是个体力活,何况很多资源只能一件件手工入库。饶了我吧。
### 电子书:吃力不讨好
小说漫画,或者说书籍媒体库,只能说真搭一个私人图书馆大概也和 Jellyfin 别无二致——满满的工作量。可能甚至有过之而不及。
> 不禁想到米哈游创始人蔡浩宇的“快乐守恒定律”:你做的过程中如果很轻松快乐,那么你做出来的结果未必能给人带来快乐。
> 媒体库编排是不是也要“苦其心志、劳其筋骨”,才能有好的观影体验呢?但话又说回来,这种家庭影院通常都是自己管理自己用,费那么大功夫组织这些文件,观赏的体验又能改善多少呢?
我相信大多数\*并不在乎资源来源\*的读者去找网络上流通的小说肯定优先去找 txt、doc(x) 这种容易打开的格式。但现有的私人图书馆,无论 Jellyfin 这种顺手实现的,还是 Kavita 这种专用的,**都不支持这些格式**。Calibre 也许可以,但**书目的元数据就成了另一桩麻烦事**。
::: tip 最简方案
那当然是通通转换成 pdf单纯当作文件管理器那样访问文件夹、文件最简单。**但 pdf 对移动端并不友好,文字内容并不能自适应,更多还是用于漫画**。
:::
进阶一点的方案主要围绕 epub 电子书,毕竟漫画这块 pdf、epub、`.cb*`压缩包三者的页面版式不可能差太多,翻页起来其实没什么区别。
::: info 压缩包漫画
漫画本质上就是一页页的画嘛。许多网站本就提供试阅,给这些图片打个包也就是顺手的事。像我这样存储空间拮据的(主要还是[协议不通用](recents-11172025.md#硬件购置)),只能是哪种最节省空间就选哪种咯。
Jellyfin 本身支持`.zip` `.rar` `.7z`。如果你打算另起炉灶,但选配的服务不支持这样通用的后缀名,也可以改变后缀:
`.cbz`即 zip、`.cbr`即 rar、`.cb7`即 7z、`.cbt`即 tar。
至于元数据Jellyfin 文档指出**只有 epub 书籍才允许元数据集成在文件里**,对于这种漫画压缩包,需要另写`ComicInfo.xml`。也就是说,**每一本、系列的每一话,都需要单独的文件夹放置元数据和本体**。
:::
现有的 epub 编辑器并没有像写哔哩哔哩专栏(或者像 Word 文档)那样自动编纂页面的能力,操作起来更像是手搓 Web 三剑客HTML、CSS、JavaScript。所以**图方便的话更建议在线转换**`.txt` `.doc(x)`文档。
::: details EPUB 内容物
epub 的 mimetype 通常标`application/epub+zip`,说明其本质是压缩包。解压出来通常分这么几块:
- `mimetype`:资源类型标识,内容如上。
- `META-INF/container.xml`标明电子书OEBPS 包)的根目录。
- `OEBPS/`
- `Images/cover.*`:封面
- `Styles/*.css`:网页排版
- `Text/*.*htm*`:反正必须是 HTML。
- `content.opf`:电子书的元数据、内容物信息。
- `nav.*htm*` `nav.opf`:电子书的目录。前者为 epub3 标准,后者为 epub2 标准,通常在`content.opf`里特别标注。
- `Fonts/` `Audio/` ...:其他内容。
所以我称编辑 epub 这件事为“手搓网站”,因为本来就需要按章回编排 Web 内容,这 OEBPS 的目录树也很有网站的味。
:::
::: warning 书目目录索引
和 Calibre 等阅读器不同Jellyfin 对目录的跳转**以 OEBPS 包为基准**,而不是以目录文件为基准。如果发现 Jellyfin 里**点目录里的章标题没有反应**,你需要用 Sigil 等编辑器将`nav.*`移动到`OEBPS/`目录下。
:::
::: note 文件组织
实测结论是:可以不像漫画那样遵循官方文档“一书一目录”的要求,但**应尽量避免“一目录只有一 epub”的情形**。像以下情形 Jellyfin 会误判:
- Books
- 正经的
- 《时间简史》.epub
- 毛泽东
- 《实践论》.pdf
- 《矛盾论》.pdf
- 《葬送的芙莉莲》.pdf
- 不正经的
扫描结果是:“不正经的”和《时间简史》。其余读物无法直接访问(可能仍能搜索到)。
:::
## 穿透与反向代理
如今连网易云也改得不知为何物了,于是我随身听的需求便也转向 Jellyfin。最简单的方法可以是 ZeroTier但安卓有“同一时间只允许一个 VPN”的限制所以在群友指导下搞了内网穿透FRP
此后,我遇到了子网划分的问题。起初这个问题并不起眼,直到我在户外同时尝试走 ZeroTier 和穿透,我才发现 frp 连上之后似乎更像是在本地回环,而 Jellyfin 似乎**对本地回环不设限速**。
> ~~写着写着总会变成报流水账。~~
AI 对此的解法是在 frp 这里记录下真实 IP。我选配的服务商支持 Proxy Protocol也更推荐这么实现。但在实地测试后发现 Jellyfin 并不直接支持 Proxy Protocol那么就只能在 frpc 跟 Jellyfin 之间多加一层 nginx 做反向代理了frps 显然我是动不了的)。
方法很简单frp 侧仍旧启用 Proxy Protocol在 nginx 里剥离真实 ip。参见[官方文档](https://jellyfin.org/docs/general/post-install/networking/reverse-proxy/nginx)。
后来考虑到挂 web 的静态资源安全(防止意外删改),就顺势收紧 Jellyfin 容器的权限和性能分配。其中桥接网络让我想起最初的小巧思:我把 frp 挂在中间机器上,流量物理上不走内网不就好了。最终搭起来看了一眼日志,貌似连`nginx`都不需要了:
```log
[2026-03-09 10:08:57.650 +00:00] [INF] [23] Emby.Server.Implementations.HttpServer.WebSocketManager: WS "172.17.0.1" closed
[2026-03-09 10:08:58.280 +00:00] [INF] [28] Emby.Server.Implementations.HttpServer.WebSocketManager: WS "172.17.0.1" request
[2026-03-09 10:09:00.493 +00:00] [INF] [24] Jellyfin.Api.Controllers.UniversalAudioController: ...
[2026-03-09 10:09:00.495 +00:00] [INF] [24] Jellyfin.Api.Helpers.MediaInfoHelper: ...
[2026-03-09 10:09:00.495 +00:00] [INF] [24] Jellyfin.Api.Helpers.MediaInfoHelper: RemoteClientBitrateLimit: 6000000, RemoteIP: "172.17.0.1", IsInLocalNetwork: False
```
注意到最后一句`IsInLocalNetwork: False`,它似乎并不认为 Docker 容器的桥接网段是内网网段。这样一来连 frp 隧道都不需要动,天然就完成了我的小巧思。

View File

@@ -0,0 +1,12 @@
---
title: 无病呻吟
index: false
article: false
timeline: false
comment: false
icon: message
---
小作文。自省?发泄?借用网友的一句话,梦到什么说什么。
<Catalog />

View File

@@ -0,0 +1,37 @@
# 碎碎念#1
最近折腾了不少东西,心情也起起伏伏。《如我所书》取自崩铁的同名词条,个人也倾向于记录那些“能成篇的”专栏;咱这主题又没动态功能,思来想去还是写到这充当《记忆的质料》吧。
## 可爱一点的博客主题
既然说到博客主题,就顺便唠唠好了。我个人还是觉得`vuepress-theme-hope`偏向项目文档一些,当作博客虽然也可以 !!(甚至 MarkDown 扩展相对很齐全)!!,但……怎么说呢,可爱不起来(
我个人还挺宅的,主题这方面也想稍微萌系一点。不说非得特别可爱吧,至少想一眼给人那种二次元的印象。在 GitHub 上搜了一些二次元主题,要么是 Mizuki 二创(或者说 Fuwari 三创?),要么缺胳膊少腿。像有个 BA 主题只能塞推文,要动态和友链还得另搓;另有个 Miracle 主题虽然视觉上挺优雅的,但 MarkDown 扩展支持又一言难尽。
> 好友:自己搓个吧(
> 我:呜呜,补会(
所以还是接着套这个模板吧。
## 名为无所谓,实为破罐子破摔
前一阵发现“无病呻吟”这块连续塞了四篇负能量。事实证明,写小作文并不能解我的铃[^mentalIllness],充其量延缓我的症状。当然我的症状归根结底缘于内耗,解释起来又要去讨论我的“失败史”,不妨就这么总结吧:
- 咕咕咕的怠惰:只要没有 DDL !!(骗你的,没奖惩的 DDL 也照样)!!,就能以月、年为单位地拖。
- 懒汉做学问:要用什么学什么,主打一个经验主义。
- 自以为自知之明的无知:从来就没(能够)客观评价自己,要么眼高手低,要么把自己贬得一无是处(现在也一样)。
- 在失败的斜坡上短道速滑:独立创作遇上瓶颈滑坡成“毫无创见”,考研坠机滑坡成“这辈子也就这样了”,刚干活一个月犯了事(虽然并非小事)滑坡成“千古罪人”,……
于是一面写小作文痛批自己,一面发现自己仍然每况愈下,就这样磨洋工过了半年。最后与其说是释然、“无所谓”,更像是破罐子破摔、“随便怎么样吧”。说起来这“千古罪人”的帽子也不过是前同事跟我开玩笑说说的,只是我这人容易当真,我现在的确认为自己是个罪人,值得一呜呜伯爱死的那种。
[^mentalIllness]: 我个人觉得精神困境还是“解铃还需系铃人”的处理逻辑。不过最近也见证了一些无力处理这类困境、不得不求诊的例子,还是“说起来容易做起来难”啊。
## 硬件购置
今年说实话不太适合装机()双 11 前后内存涨、硬盘涨,现在甚至 CPU 也涨。不知道各位觉得 2T 固态理想情况得是多少米,我是借着我哥的天猫超市中秋礼券、红包、优惠叠起来,咬咬牙 680 买下铠侠的 SD10 2TB。!!说实话更希望再便宜点,最好是 648!!
另一边我去年的推流姬也摇身两变先是作为我上班的消遣RDP 远程),然后又拿来当 NAS当然也不单纯为了存储。NAS=Network Attached Storage没盘怎么组 Storage所以先是搞了块 500G 2.5 寸 CMR 薄盘,到这里为止说实话还称得上好活。
本年暑期,有群友出一台 4 盘位蜗牛 C 款小闷罐,我则用《原神·空月之歌》的两个版本代肝作为交换(当事人称作“灵活的支付方式”)。等实际接盘了我才发现所谓的扩展性在我这推流姬上困难重重:我这推流姬并没有那么多 IO 接口给他扩(也就 2.5 寸 SATA、m.2 SATA、NGFF WiFi那两 SATA 实测也不支持 PM 功能),随附的 miniPCIe 转 8654 也用布上(最开始甚至尝试用 mSATA 转接板连这个转接卡)。
最终只能考虑 USB3.0 去接 SATA PM 板,一拖五。结果又发现这机箱本就是残花败柳,四盘位坏了两。属于是“前景不错,但有前景不太可能”。推流姬的板 U 太垃圾导致的。
---
虽然还有很多话题想唠,但真要写起日记吧,记忆却蒙上一层薄雾,回忆不真切。以上是记得比较清楚 ~~(或者说耿耿于怀)~~ 的几件,姑且落笔一叙。

View File

@@ -1,8 +1,8 @@
--- ---
date: 2024-06-15 date: 2024-06-15
category: category:
- 操作系统 - 批注
- Linux - 折腾流程
tag: tag:
- Arch Linux - Arch Linux
- KDE - KDE
@@ -33,42 +33,43 @@ star: true
## 参考链接 ## 参考链接
本文有参考以下两篇安装教程: 本文有参考以下安装教程:
1. [律回彼境Arch Linux 折腾指南&记录](https://www.glowmem.com/archives/archlinux-note)(以下简称“律回指南”) 1. [律回彼境Arch Linux 折腾指南&记录](https://www.glowmem.com/archives/archlinux-note)(以下简称“律回指南”)
2. [Nakano MikuArch 简明指南](https://arch.icekylin.online/guide/)以下简称“Miku 指南”) 2. [Nakano MikuArch 简明指南](https://arch.icekylin.online/guide/)以下简称“Miku 指南”)
3. [Arch WikiInstallation Guide](https://wiki.archlinux.org/title/Installation_guide)
## I. 前期准备 ## I. 前期准备
- 下载安装镜像:[清华镜像 (25.06.01)](https://mirrors.tuna.tsinghua.edu.cn/archlinux/iso/latest/archlinux-2025.06.01-x86_64.iso)、[官方下载](https://archlinux.org/download/)。 - 下载安装镜像:[清华镜像 (最新版本)](https://mirrors.tuna.tsinghua.edu.cn/archlinux/iso/latest)、[官方下载](https://archlinux.org/download/)。
> 烧录过程不再赘述,推荐用 Ventoy 统一管理安装镜像。[参见 Ventoy 中文主页](https://www.ventoy.net/cn/) > 烧录过程不再赘述,推荐用 Ventoy 统一管理安装镜像。[参见 Ventoy 中文主页](https://www.ventoy.net/cn/)
- 固件^1^:启用 UEFI、禁用安全启动Secure Boot - 固件^1^:启用 UEFI、禁用安全启动Secure Boot
> 近十几年的主板大都支持 UEFI我也懒得花篇幅去讲传统 BIOS 引导。对于 Arch Linux 的 UEFI 引导方式,我[另有一篇笔记](./ArchUEFI.md)讨论,可供安装阶段参考。 > 近十几年的主板大都支持 UEFI我也懒得花篇幅去讲传统 BIOS 引导。对于 Arch Linux 的 UEFI 引导方式,我[另有一篇笔记](./ArchUEFI.md)讨论,可供部署阶段参考。
> 至于 Secure Boot不用想了`.efi`启动文件签名着实是件麻烦事。我爱折腾,但不爱做没意义、意义不大的折腾。 > 至于 Secure Boot不用想了`.efi`启动文件签名着实是件麻烦事。~~对我而言折腾这个没有意义。~~
- 网络^2^:如需连接 WiFi提前把 WiFi 名字SSID改成英文。 - 网络^2^:如需连接 WiFi提前把 WiFi 名字SSID改成英文。
> 安装全程在命令行CLI环境进行并且 LiveCD维护环境下同的终端字体**不支持中文**。除非附近没有别的 WiFi 起中文名字,否则还是改你自己的 WiFi 比较妥 > 安装全程在命令行CLI环境进行并且 LiveCD维护环境下同**显示不出中文,也打不出中文**
> [!tip] > [!tip]
> 如果只是迁移系统,那么进入维护环境之后只需`rsync`做全盘搬运即可(当然前提是目标**盘**要比原**系统**的实际占用空间要大)。可参见 [lin.moe](https://lin.moe/tutorial/2020/04/arch_migrate/)。 > 如果只是迁移系统,那么进入维护环境之后只需`rsync`做全盘搬运即可(当然前提是目标**盘**要比原**系统**的实际占用空间要大)。可参见 [lin.moe](https://lin.moe/tutorial/2020/04/arch_migrate/)。
## II. LiveCD 基础配置 ## II. LiveCD 基础配置
与[律回指南 Ch.1](https://glowmem.com/archives/archlinux-note#%E4%B8%80%E8%BF%9E%E6%8E%A5%E7%BD%91%E7%BB%9C%E5%92%8C%E6%97%B6%E5%8C%BA%E9%85%8D%E7%BD%AE) 相同,但省略了分配固定 IP 的一步(我完全可以进路由器里猹询)。 与[律回指南 Ch.1](https://glowmem.com/archives/archlinux-note#%E4%B8%80%E8%BF%9E%E6%8E%A5%E7%BD%91%E7%BB%9C%E5%92%8C%E6%97%B6%E5%8C%BA%E9%85%8D%E7%BD%AE) 相同,但省略了分配固定 IP 的一步(我完全可以`ip addr`猹询)。
## III. 分区 ## III. 分区
对于固态硬盘,**不提倡建立过多的分区**。那么在 UEFI 启动的系统盘上,至少可以这么分: 对于固态硬盘,**不提倡建立过多的分区**。那么在 UEFI 启动、GPT 分区表的系统盘上,至少可以这么分:
- EFI 启动分区[^esp]:挂载`/efi``/boot`[^esp_mountpoint] - EFI 启动分区[^esp]:挂载`/efi``/boot`[^esp_mountpoint]
- 系统分区:挂载根目录`/` - 系统分区:挂载根目录`/`
我个人在此基础上,倾向于*在硬盘(逻辑扇区的)末端*开多一个交换分区。 我个人在此基础上,倾向于*在硬盘(逻辑扇区的)末端*开多一个交换分区。
[^esp]: 对于 GPT 分区表有专门的“EFI System”即 ESP分区类型,当然新款的主板也会*连带扫描 FAT 分区*;对于 MBR 分区表,则扫描**活动**的 FAT 分区。参见 [UEFI 启动的实际工作原理](https://www.cnblogs.com/mahocon/p/5691348.html)。 [^esp]: GPT 分区表有专门的“EFI System”分区类型(即 ESP当然新款的主板也会*连带扫描 FAT 分区*;对于 MBR 分区表,则扫描**活动**的 FAT 分区。参见 [(译)UEFI 启动的实际工作原理](https://www.cnblogs.com/mahocon/p/5691348.html)。
[^esp_mountpoint]: ESP 装载`/boot`系经典分区法。后来有说法称“直接暴露 Linux 内核并不安全”,所以又有将 ESP 装入`/boot/efi`的分法Ubuntu Server 24.04.2 即如此)。现在(至少在 Arch 里)则推荐直接挂载到`/efi` [^esp_mountpoint]: ESP 装载`/boot`系经典分区法。后来有说法称“直接暴露 Linux 内核并不安全”,所以又有将 ESP 装入`/boot/efi`的分法Ubuntu Server 24.04.2 即如此)。现在(至少在 Arch 里)则推荐直接挂载到`/efi`
@@ -77,13 +78,15 @@ star: true
- :new: [全新安装](https://arch.icekylin.online/guide/rookie/basic-install-detail#%F0%9F%86%95-%E5%85%A8%E6%96%B0%E5%AE%89%E8%A3%85) - :new: [全新安装](https://arch.icekylin.online/guide/rookie/basic-install-detail#%F0%9F%86%95-%E5%85%A8%E6%96%B0%E5%AE%89%E8%A3%85)
- [7. 分区和格式化(使用 Btrfs 文件系统)](https://arch.icekylin.online/guide/rookie/basic-install.html#_7-%E5%88%86%E5%8C%BA%E5%92%8C%E6%A0%BC%E5%BC%8F%E5%8C%96-%E4%BD%BF%E7%94%A8-btrfs-%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F) - [7. 分区和格式化(使用 Btrfs 文件系统)](https://arch.icekylin.online/guide/rookie/basic-install.html#_7-%E5%88%86%E5%8C%BA%E5%92%8C%E6%A0%BC%E5%BC%8F%E5%8C%96-%E4%BD%BF%E7%94%A8-btrfs-%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F)
然后是挂载。挂载**务必先挂载`/`**,务必先挂载`/`,务必先挂载`/`!除此之外,别忘了挂载交换分区(如果有的话) 然后是挂载。务必注意**先挂载`/`**!此外,**不要把不同分区、子卷挂到同一个挂载点上****有分交换分区的话记得`swapon`**
## IV. pacman 配置 ## IV. pacman 配置
### i. 换源 ### i. 换源
Linux 的包管理器默认用国外的软件源,`pacman`也一样。因此,非常建议先换用国内镜像,加快包下载速度。 Linux 的包管理器默认用国外的软件源,`pacman`也一样。因此,非常建议先换用国内镜像,加快包下载速度。
然鹅在更换之前可能需要等待片刻:一经联网,`reflector`会自动筛选**最新**的 20 个镜像站,然后才从快到慢排序^3^。如果换源过早,很可能会被`reflector`摘桃子。
编辑`/etc/pacman.d/mirrorlist``vim`还是`nano`请自便): 编辑`/etc/pacman.d/mirrorlist``vim`还是`nano`请自便):
```ini ```ini
@@ -118,37 +121,70 @@ ParallelDownloads = 5 # 最大并行下载数(根据你的网速自行斟酌
> 很遗憾,经实测 pacman 配置并不会复制过去。在安装完系统`arch-chroot`进去进一步配置时,你需要重复做一遍上述操作。 > 很遗憾,经实测 pacman 配置并不会复制过去。在安装完系统`arch-chroot`进去进一步配置时,你需要重复做一遍上述操作。
## V. 正式部署 ## V. 正式部署
参见 [Miku 指南—基础安装—9. 安装系统](https://arch.icekylin.online/guide/rookie/basic-install.html#_9-%E5%AE%89%E8%A3%85%E7%B3%BB%E7%BB%9F)。当然我偏向于律回指南,除此之外还会提前装些工具:
- CPU 微码:`intel-ucode``amd-ucode` 参见 [Miku 指南—基础安装—9. 安装系统](https://arch.icekylin.online/guide/rookie/basic-install.html#_9-%E5%AE%89%E8%A3%85%E7%B3%BB%E7%BB%9F)。或者像律回指南那样顺手装一些工具也无何不可:
- 基础命令行工具:`vi` `nano` `git` `wget` `tmux` `openssh` `htop`
- Windows 文件系统NTFS支持`ntfs-3g`
不过……不知道以后好不好使就是了。之前律回指南还提前装了`yay``neofetch`,但现在不行了。 ```sh
pacstrap -K /mnt base linux linux-firmware base-devel linux-headers \
vi vim nano git wget tmux openssh networkmanager htop ntfs-3g \
intel-ucode # or `amd-ucode`
```
然后`genfstab -U /mnt > /mnt/etc/fstab`生成挂载表,`arch-chroot /mnt`切换进新系统里,继续配置吧。 ::: warning “密钥环不可写”报错
之前出现过`pacman-init.service`意外暴死,导致找不到密钥环的情况:
```log
(126/126) checking keys in keyring
warning: Public keyring not found; have you run `pacman-key --init`?
downloading required keys...
error: keyring is not writable
...
error: failed to commit transaction (unexpected error)
```
对此,[这篇讨论贴](https://bbs.archlinux.org/viewtopic.php?id=283075)中有人提供了个取巧的方案:
```sh
pacman-key --init
pacman-key --populate
```
实测可用。至于成因,贴中有人指出是系统时钟未校准导致,但我当时是来不及`timedatectl`就已经暴死了,具体原因不明。
:::
接下来的配置我参考了[律回指南 Ch.4](https://glowmem.com/archives/archlinux-note#%E5%9B%9B%E7%B3%BB%E7%BB%9F%E5%9F%BA%E6%9C%AC%E9%85%8D%E7%BD%AE),不过在`visudo`处我没有取消“免密`sudo`”的注释。**免密`sudo`还不如直接`su`,干脆也不用创建非 root 用户了**。 然后`genfstab -U /mnt > /mnt/etc/fstab`生成挂载表;
`arch-chroot /mnt`切换进新系统里,继续配置吧。
---
接下来在`chroot`环境里的配置我参考了[律回指南 Ch.4](https://glowmem.com/archives/archlinux-note#%E5%9B%9B%E7%B3%BB%E7%BB%9F%E5%9F%BA%E6%9C%AC%E9%85%8D%E7%BD%AE)大体也符合官方文档的流程调整时区、系统编码、设置主机名、root 密码、新建用户、配置 EFI 引导。
不过在`visudo`那一步我没有启用“免密`sudo`”(如下),律回本人也意识到免密`sudo`并不安全。
```
## Same thing without a password
#%wheel ALL=(ALL:ALL) NOPASSWD: ALL
```
> [!note]
> 除了上述标准流程之外,后续有些步骤也可以提前在`chroot`里完成。但**如果你是初次上手,还是一步一步慢慢来吧**。
## VI. 新系统的配置 ## VI. 新系统的配置
跟着律回指南的三、四章装好系统之后,重启登入新系统的终端。 跟着律回指南的三、四章装好系统之后,重启登入新系统的终端。
首先通过`nmtui`连上 WiFi。 首先通过`nmtui`连上 WiFi。
### i. CN 源和 AUR 助手 ### i. CN 源和 AUR 助手
在**联好网的新系统**里配置`archlinuxcn`源:`sudo nano /etc/pacman.conf` 在**联好网的新系统**里配置`archlinuxcn`源:再次打开`/etc/pacman.conf`,末尾添加如下小节
```ini ```ini
# 末行添加
[archlinuxcn] [archlinuxcn]
Server = https://mirrors.tuna.tsinghua.edu.cn/archlinuxcn/$arch Server = https://mirrors.cernet.edu.cn/archlinuxcn/$arch
``` ```
并安装 CN 源的签名密钥和 AUR 助手: 并安装 CN 源的签名密钥和 AUR 助手:
```bash ```bash
sudo pacman-key --lsign-key "farseerfc@archlinux.org" # 为密钥环添加本地信任
sudo pacman -S archlinuxcn-keyring # 安装密钥环 sudo pacman -S archlinuxcn-keyring # 安装密钥环
sudo pacman -S yay paru # 安装 AUR 助手 sudo pacman -S yay paru # 安装 AUR 助手
``` ```
::: info 关于本地信任 Key ::: warning 密钥环缺少信任
简单来说就是给 CN 源密钥环签名的`farseerfc`他的 Key 掉信任了,包管理器“不敢”安装这个密钥环^2^。 若 CN 源的包安装失败,遭遇`signature ... is marginal trust`报错,可本地信任那个人的 Key。之前`farseerfc`掉过一次,以他为例:
```sh
sudo pacman-key --lsign-key "farseerfc@archlinux.org"
```
然后重试即可。不过截至 25 年国庆为止,`farseerfc`的信任已经恢复,我安装时并未遭遇类似情况。
::: :::
### ii. 硬件(一)音频安装 ### ii. 硬件(一)音频安装
@@ -160,7 +196,7 @@ sudo pacman -S sof-firmware alsa-firmware alsa-ucm-conf
# pipewire 及其音频管理套件 # pipewire 及其音频管理套件
sudo pacman -S pipewire gst-plugin-pipewire pipewire-alsa pipewire-jack pipewire-pulse wireplumber sudo pacman -S pipewire gst-plugin-pipewire pipewire-alsa pipewire-jack pipewire-pulse wireplumber
``` ```
::: tip pulseaudio ::: details pulseaudio
除了 pipewire 音频方案之外另有`pulseaudio`可供选择。但务必注意:音频管理套件**只能二选一,不可以混装**。 除了 pipewire 音频方案之外另有`pulseaudio`可供选择。但务必注意:音频管理套件**只能二选一,不可以混装**。
另外,由于 pipewire 本身不单只负责音频管理的工作,如需装 pulseaudio 仍需安装`pipewire` `gst-plugin-pipewire`两个包。 另外,由于 pipewire 本身不单只负责音频管理的工作,如需装 pulseaudio 仍需安装`pipewire` `gst-plugin-pipewire`两个包。
@@ -175,14 +211,14 @@ sudo pacman -S pipewire gst-plugin-pipewire pipewire-alsa pipewire-jack pipewire
> 但 pulseaudio 仍需要这个包。 > 但 pulseaudio 仍需要这个包。
::: :::
显卡、蓝牙等其他硬件设施需要装好桌面环境再考虑。至少**到本小节为止你的系统里并没有蓝牙服务**,无法启用 显卡驱动等其他硬件设施需要装好桌面环境再考虑,在只有字符色块滚过的纯终端环境里也没有折腾显卡驱动的必要
### iii. KDE 桌面环境 ### iii. KDE 桌面环境
跟完前面的内容之后,你便拥有了一个无 GUI 的终端 Arch 系统。但作为日常使用的话,图形桌面肯定必不可少。 跟完前面的内容之后,你便拥有了一个无 GUI 的终端 Arch 系统。但作为日常使用的话,图形桌面肯定必不可少。
本文与那两篇参考外链一样**采用 KDE 桌面环境**。当然除了 KDE 之外,你也可以考虑 GNOME 桌面环境 ~~(只是我用腻了)~~ 本文与那两篇参考外链一样**采用 KDE 桌面环境**。当然除了 KDE 之外,你也可以考虑 GNOME 桌面环境 ~~(只是我用腻了)~~
也可以考虑散装方案(比如`hyprland`~~,只是我没折腾成功~~)。 也可以考虑散装方案(比如`niri`,部分配置可参见 [aglab.dotfiles](https://git.liteyuki.org/AgxCOy/aglab.dotfiles))。
```bash ```bash
# 分别安装 xorg 套件、sddm 登录管理器、KDE 桌面环境,以及配套软件 # 分别安装 xorg 套件、sddm 登录管理器、KDE 桌面环境,以及配套软件
@@ -190,7 +226,7 @@ sudo pacman -S xorg
sudo pacman -S plasma sddm konsole dolphin kate okular spectacle partitionmanager ark filelight gwenview sudo pacman -S plasma sddm konsole dolphin kate okular spectacle partitionmanager ark filelight gwenview
# 启用 sddm 服务,重启进 SDDM 用户登录 # 启用 sddm 服务,重启进 SDDM 用户登录
sudo systemctl enable sddm sudo systemctl enable sddm
sudo reboot sudo reboot now
``` ```
::: info KDE 6 vs KDE 5 ::: info KDE 6 vs KDE 5
@@ -216,7 +252,7 @@ KDE 的图形实现默认已经是 Wayland 了。在开机后输入用户密码
AMD 或 NVIDIA 显卡可参见[律回指南 &sect;6.4](https://glowmem.com/archives/archlinux-note#4%E6%98%BE%E5%8D%A1%E9%A9%B1%E5%8A%A8%E5%AE%89%E8%A3%85) AMD 或 NVIDIA 显卡可参见[律回指南 &sect;6.4](https://glowmem.com/archives/archlinux-note#4%E6%98%BE%E5%8D%A1%E9%A9%B1%E5%8A%A8%E5%AE%89%E8%A3%85)
和 [Miku 指南—进阶安装—显卡驱动](https://arch.icekylin.online/guide/rookie/graphic-driver.html)篇。 和 [Miku 指南—进阶安装—显卡驱动](https://arch.icekylin.online/guide/rookie/graphic-driver.html)篇。
但我是锐炬核显捏,只需要在 Konsole 终端里`sudo pacman -S`安装图形 API 但我是锐炬核显捏,只需要在 Konsole 终端里`sudo pacman -S`安装英特尔的驱动
- `mesa` `lib32-mesa`OpenGL - `mesa` `lib32-mesa`OpenGL
- `vulkan-intel` `lib32-vulkan-intel`Vulkan - `vulkan-intel` `lib32-vulkan-intel`Vulkan
@@ -226,7 +262,7 @@ AMD 或 NVIDIA 显卡可参见[律回指南 &sect;6.4](https://glowmem.com/archi
```bash ```bash
sudo systemctl enable --now bluetooth sudo systemctl enable --now bluetooth
``` ```
> 之前误以为`bluetooth`是 Arch 本身就有的服务,结果发现是桌面环境依赖了蓝牙组件包。 > 之前误以为`bluetooth`是 Arch 本身就有的服务,结果发现是桌面环境依赖了蓝牙组件包`bluez`
### v. 额外中文字体和输入法 ### v. 额外中文字体和输入法
@@ -310,14 +346,23 @@ VSCode 的主侧栏“源代码管理”页提交时并不会走终端,也就
所以我选择编辑`~/.gnupg/gpg-agent.conf` 所以我选择编辑`~/.gnupg/gpg-agent.conf`
```properties ```properties
default-cache-ttl 28800 default-cache-ttl 21600
pinentry-program /usr/bin/pinentry-qt pinentry-program /usr/bin/pinentry-qt
``` ```
保存后重启`gpg-agent``gpg-connect-agent reloadagent /bye` 保存后重启`gpg-agent``gpg-connect-agent reloadagent /bye`
::: info 其他端 pinentry
理论上`pinentry`自身可以根据 XDG 后端选择适用的版本:
```sh
ls /usr/bin | grep 'pinentry'
echo GETPIN | pinentry
```
你可以用这两条命令看看都支持什么后端,以及它会自动选择哪个。像 niri 通常会装 gnome 后端,测试结果也的确会出`pinentry-gnome3`的密码框。
:::
除此之外,`pinentry`需要指定 tty否则找不到 IO 设备也会炸。解法:`export GPG_TTY=$(tty)` 除此之外,`pinentry`需要指定 tty否则找不到 IO 设备也会炸。解法:`export GPG_TTY=$(tty)`
经测试,大部分终端均能在 SSH 连接中调出 CUIVSCode Remote-SSH 打开的终端可能比较特殊,仍然无法签名。个人还是建议单独开个终端作为 workaround 经测试,大部分终端均能在 SSH 连接中调出 CUI。若 VSCode Remote-SSH 打开的终端签不了名,检查一下是不是终端分割得太小了
### II. GPG 密钥备份(导出导入) ### II. GPG 密钥备份(导出导入)
之前并没有意识到备份 key 的重要性,结果重装 Arch 重新配置提交签名时, 之前并没有意识到备份 key 的重要性,结果重装 Arch 重新配置提交签名时,

View File

@@ -1,8 +1,6 @@
--- ---
date: 2024-10-24 date: 2024-10-24
category: category: 折腾流程
- 操作系统
- Linux
tag: tag:
- Arch Linux - Arch Linux
- Grub - Grub
@@ -26,7 +24,7 @@ tag:
## UEFI 启动简述:启动项管理 ## UEFI 启动简述:启动项管理
> UEFI 规范定义了名为“UEFI 启动管理器”的一项功能 …… 是一种固件策略引擎,可通过修改固件架构中定义的全局 NVRAM 变量来进行配置。启动管理器将尝试按全局 NVRAM 变量定义的顺序依次加载 UEFI 驱动和 UEFI 应用程序(包括 UEFI 操作系统启动装载程序)。…… > UEFI 规范定义了名为“UEFI 启动管理器”的一项功能……(它)是一种固件策略引擎,可通过修改固件架构中定义的全局 NVRAM 变量来进行配置。启动管理器将尝试按全局 NVRAM 变量定义的顺序依次加载 UEFI 驱动和 UEFI 应用程序(包括 UEFI 操作系统启动装载程序)。……
> ::: right > ::: right
> ——[UEFI 启动:实际工作原理](https://www.cnblogs.com/mahocon/p/5691348.html) > ——[UEFI 启动:实际工作原理](https://www.cnblogs.com/mahocon/p/5691348.html)
> ::: > :::
@@ -38,15 +36,15 @@ tag:
事实上Windows Boot Manager 是系统安装完成后,初次加载系统时为其创建的**原生启动项**。它明确指出需要启动**指定设备中**的**指定引导文件**(即`bootmgfw.efi`)。 事实上Windows Boot Manager 是系统安装完成后,初次加载系统时为其创建的**原生启动项**。它明确指出需要启动**指定设备中**的**指定引导文件**(即`bootmgfw.efi`)。
即便 WinToGo 也是如此——在初次以 U 盘身份进入 WTG 系统时Windows 也会为该设备作配置——所谓“正在准备设备”。在此过程中,顺带把原生启动项建立好。然后重启之后再按快捷键进入启动菜单,你**可能**会在**部分主板上**发现有两个启动项,指向同一个设备: 即便 WinToGo 也是如此——在以 U 盘身份进入 WTG 系统时Windows 也会悄悄地把原生启动项建立好。然后重启之后再按快捷键进入启动菜单,你**可能**会在**部分主板上**发现有两个启动项,指向同一个设备:
``` ```
Windows Boot Manager ( Koi Series Pro ...) Windows Boot Manager ( Koi Series Pro ...)
USB HDD: Koi Series Pro ... USB HDD: Koi Series Pro ...
``` ```
需要注意的是,原生启动项是**存储在主板里的**(更准确的说,是全局 NVRAM 变量)。这多少可以解释为什么 Grub 引导那么脆弱( 需要注意的是,原生启动项是**存储在主板里的**(更准确的说,是全局 NVRAM 变量)。有些主板在检测到原生启动项失效(找不到指定引导文件)后,会自行删除该启动项。比如安装 Grub 后更换过硬盘,后来又把原盘插回去,可能仍然找不到 Grub 启动项。
### ii. 回退路径启动项 ### ii. 回退路径启动项
对于 WinPE、Windows 安装镜像而言,它们并非用于长线运行,往往没有“准备设备”的步骤,那么 UEFI 如何认出它们捏? 对于 WinPE、Windows 安装镜像而言,它们并非用于长线运行,不可能到处添加原生启动项,那么 UEFI 如何认出它们捏?
还记得上面提到的同一设备双启动项吗UEFI 固件是能够找到可启动设备,并且尝试启动的。但它是依据什么去找的捏? 还记得上面提到的同一设备双启动项吗UEFI 固件是能够找到可启动设备,并且尝试启动的。但它是依据什么去找的捏?
UEFI 固件首先会**遍历各硬盘的 ESP 分区**,并在其中查找`\EFI\BOOT\boot{cpu_arch}.efi`。前面的这一固定路径就称为**回退路径**,通过查找回退路径建立的启动项就称作**回退路径启动项**。其中,`cpu_arch`即 CPU 架构,已知的有: UEFI 固件首先会**遍历各硬盘的 ESP 分区**,并在其中查找`\EFI\BOOT\boot{cpu_arch}.efi`。前面的这一固定路径就称为**回退路径**,通过查找回退路径建立的启动项就称作**回退路径启动项**。其中,`cpu_arch`即 CPU 架构,已知的有:
@@ -66,16 +64,20 @@ UEFI 固件首先会**遍历各硬盘的 ESP 分区**,并在其中查找`\EFI\
也就是说,哪怕原生启动项意外被固件扬了,只要还有回退启动项,便仍可从同一个硬盘启动系统。 也就是说,哪怕原生启动项意外被固件扬了,只要还有回退启动项,便仍可从同一个硬盘启动系统。
> [!info] ::: info
> 实际上`bcdboot`工具会在 ESP 分区里同时写入`bootx64.efi``bootmgfw.efi`,这两个 EFI 除了文件名以外并无区别 实际上`bcdboot`工具会在 ESP 分区里同时写入`bootx64.efi``bootmgfw.efi`。前者即回退路径启动项
> 前者即回退路径启动项,作为启动 Windows 的后备方案。
有关`bootx64.efi``bootmgr(.efi)``bootmgfw.efi`的关系可能有些复杂,谷歌了一圈各种观点都有。本着实事求是的原则,我不会糅合这些观点提出假设,只附上几个问题:
- `bootx64.efi``bootmgfw.efi`(或`bootmgr`)分别在本机 Windows、WinToGo 和 WinPE 中起到什么作用?三者之间是否存在等价(即功能上可以替代,乃至文件哈希相同)?
- fwbootmgr`bootmgfw.efi`)与 bootmgr是谁“悄悄地”为 UEFI NVRAM 添加原生启动项?
:::
## 启动加载器(以 Grub 为主) ## 启动加载器(以 Grub 为主)
这也是最广泛使用的启动方式 ~~Windows 也干了~~。在 Linux 当中,最常用的加载器是 Grub。当然也有使用 rEFInd 的。 这也是最广泛使用的启动方式 ~~Windows 也干了~~。在 Linux 当中,最常用的加载器是 Grub。当然也有使用 rEFInd 的。
启动加载器bootloader本身作为跳板被 UEFI 固件加载后,需要根据配置找到真正的 Linux 内核,并经由内核引导用户硬盘上的 Arch 系统。而在 Windows 中,`bootmgfw.efi`会根据`BCD`配置文件,执行硬盘其中一个 Windows 副本中的`winload.exe`,并将该副本的其余加载流程交给它完成。 启动加载器bootloader本身作为跳板被 UEFI 固件加载后,需要根据配置找到真正的 Linux 内核,并经由内核引导用户硬盘上的 Arch 系统。而在 Windows 中,`boot[a-z]{3,4}.efi`会根据`BCD`配置文件,执行硬盘其中一个 Windows 副本中的`winload.efi`,并将该副本的其余加载流程交给它完成。
正常使用 Windows 单系统的用户可能对启动过程并无察觉,因为 Windows 为了确保能够启动,会时不时刷新启动项。但一旦与 Linux 混用,你就需要**留意 Linux 的加载器会不会被 Windows 刷下去(甚至被覆盖)**。除此之外,尽管因“机”而异,但 UEFI 固件**有可能会自动清理不再可用的启动项**。比如重新插拔固态,有可能会出现掉引导的情况。因此就个人来说,我不会再考虑 bootloader 了。 正常使用 Windows 单系统的用户可能对启动过程并无察觉,但一旦与 Linux 混用,你就需要**留意 Linux 的加载器会不会被 Windows 刷下去(甚至被覆盖)**。除此之外,固件和内核之间隔着加载器这么一块跳板,势必会拖慢引导流程。因此就个人来说,我不会再考虑 Grub 这类方案了。
### i. 修复 Grub 引导 ### i. 修复 Grub 引导
Windows 启不动我们会尝试修复引导Arch 亦然。修复 Grub 引导实际上就是**重走 Grub 安装流程** Windows 启不动我们会尝试修复引导Arch 亦然。修复 Grub 引导实际上就是**重走 Grub 安装流程**
@@ -85,17 +87,21 @@ Windows 启不动我们会尝试修复引导Arch 亦然。修复 Grub 引导
> 个人建议无论如何都重建一遍`fstab`。反正刷完绝对是最新的。 > 个人建议无论如何都重建一遍`fstab`。反正刷完绝对是最新的。
- `arch-chroot`切换进硬盘上的系统; - `arch-chroot`切换进硬盘上的系统;
- `grub-install`重建 grub 引导。 - `grub-install`重建 grub 引导。
- `grub-mkconfig`重建 grub 配置(可能不需要……?)。
### ii. 补充回退启动项 ### ii. 改用回退启动项
事实上,需要反复重建 Grub 引导的一大原因就在于Grub 只会写入它自己的`grubx64.efi`,以及原生启动项: 事实上,需要反复重建 Grub 引导的一大原因就在于Grub 只会写入它自己的`grubx64.efi`,以及原生启动项:
![群友的 ESP 分区目录树 =200x](./esp_without_bootARCH.png) ![群友的 ESP 分区目录树 =200x](./esp_without_bootARCH.webp)
那么办法也很简单:像 Windows 那样也建一个回退路径启动项。具体来说,在 ESP 分区里建立`EFI\BOOT`目录,复制`grubx64.efi`重命名成`bootx64.efi`嘛。~~Windows 不也干了(~~ 那么办法也很简单:像 Windows 那样也建一个回退路径启动项。最简单的做法当然是复制改名,若求稳妥可以考虑用`grub-install`刷:
```sh
grub-install --target=x86_64-efi --efi-directory=/efi --bootloader-id=GRUB --removable
```
当然如果是像图中那样不止一个 Grub甚至同盘 Windows 和 Arch 双系统,那我不推荐你这么做。 当然如果是像图中那样不止一个 Grub甚至同盘 Windows 和 Arch 双系统,那我不推荐你这么做。
> [!warning] > [!warning]
> 不要在这试图软链接节省空间! > 不要在这试图软链接节省空间!
## 固件直接引导EFIStub ## 固件直接引导EFIStub
Grub 本身写入 ESP 的内容不多配置啊、Linux 内核啊都在`/boot`。有人便主张把`/boot`还给`/`ESP 分区实际挂载`/efi` Grub 本身写入 ESP 的内容不多配置啊、Linux 内核啊都在`/boot`。有人便主张把`/boot`还给`/`ESP 分区实际挂载`/efi`
@@ -168,12 +174,12 @@ sudo efibootmgr --create --disk /dev/nvme0n1 --part 1 \
只要集成了 EFI 执行代码和 Linux 内核,就可以称作统一内核映像了。 只要集成了 EFI 执行代码和 Linux 内核,就可以称作统一内核映像了。
::: :::
接下来以`mkinitcpio`为例,但是不走寻常路 接下来以`mkinitcpio`为例。
### i. 内核参数 ### i. 内核参数
Wiki 中介绍了两种方法: Wiki 中介绍了两种方法:
- `/etc/cmdline.d/``.conf`配置。像`root.conf`决定`/`如何挂载,等等。 - `/etc/cmdline.d/`投喂`.conf`配置(文件名随意)。比如`root.conf`决定`/`如何挂载,等等。
- 直接把所有参数搓成一行 echo 给`/etc/kernel/cmdline`文件。 - 直接把所有参数搓成一行 echo `/etc/kernel/cmdline`文件。
于我而言,显然第二种更方便。 于我而言,显然第二种更方便。
```bash ```bash
@@ -185,47 +191,24 @@ echo 'root=UUID=... resume=UUID=... rw loglevel=3 quiet' > /etc/kernel/cmdline
> [!warning] > [!warning]
> 若启用“安全启动”,且 UKI 封装了内核参数,则 UEFI 固件会无视外部传入的其余参数。 > 若启用“安全启动”,且 UKI 封装了内核参数,则 UEFI 固件会无视外部传入的其余参数。
::: info [GPT 分区自动挂载](https://wiki.archlinuxcn.org/wiki/Systemd#GPT%E5%88%86%E5%8C%BA%E8%87%AA%E5%8A%A8%E6%8C%82%E8%BD%BD)
跟 [@Vescrity](https://github.com/Vescrity)讨论的时候我俩都觉得分区 UUID 太长了,于是他尝试省略掉`root=`参数。
就结果来看还真可行,顺带附上他的折腾记录:[《从统一内核镜像启动》](https://vescrity.github.io/post/UKI/)。
:::
### ii. 预设文件 ### ii. 预设文件
编辑`/etc/mkinitcpio.d/linux.preset`我们前面说过“不走寻常路”,关键就在这里。 编辑`/etc/mkinitcpio.d/linux.preset`
下面是我自用的`linux.preset`。~~想走寻常路的话还是抄别人的预设吧。~~
```properties ```properties
# mkinitcpio preset file for the 'linux' package #PRESETS=('default' 'fallback')
PRESETS=('default')
ALL_config="/etc/mkinitcpio.conf"
ALL_kver="/boot/vmlinuz-linux"
PRESETS=('default' 'fallback')
#default_config="/etc/mkinitcpio.conf" #default_config="/etc/mkinitcpio.conf"
#default_image="/boot/initramfs-linux.img" #default_image="/boot/initramfs-linux.img"
default_uki="/efi/EFI/BOOT/bootx64.efi"
#default_uki="/efi/EFI/Linux/arch-linux.efi" #default_uki="/efi/EFI/Linux/arch-linux.efi"
#default_options="--splash /usr/share/systemd/bootctl/splash-arch.bmp" default_uki="/efi/EFI/BOOT/bootx64.efi"
default_options="--splash /usr/share/systemd/bootctl/splash-arch.bmp"
#fallback_config="/etc/mkinitcpio.conf"
#fallback_image="/boot/initramfs-linux-fallback.img"
fallback_uki="/boot/arch-linux-fallback.efi"
#fallback_uki="/efi/EFI/Linux/arch-linux-fallback.efi"
fallback_options="-S autodetect"
``` ```
> [!warning] 本身 UKI 默认是丢到`esp\EFI\Linux\arch-linux*.efi`里的相对来说已经比较通用Grub 可以直接读,也可以用作原生启动项)。但我尝试 UKI 本就是为了摒弃前面两种方案,殊途同归反倒不值得这么整了。所以我个人选择让 UEFI 固件直接加载回退路径启动项。
> 有的教程会出现`ALL_microcode=(/boot/*-ucode.img)`这一句。
> 这种指定微码的方法已经废弃,`/etc/mkinitcpio.conf`已经有针对微码的 Hook 了,无需手动指定。
正常来说 UKI 均会输出到`/efi/EFI/Linux/arch-linux*.efi`,据称`systemd-boot`可以扫到并引导 UKI。
但生成`bootx64.efi`让固件去加载不更直接?所以我选择直接导出到回退路径,如此连`efibootmgr`都不需要了。
另一方面,`fallback`也会生成 UKI`bootx64.efi`只有一个。注意到之前 EFIStub 一节我只给`initramfs-linux`构建了原生启动项,那么`fallback`自然丢回`/boot`里不管它。
> [!note]
> 把`fallback`移回`/boot`还有一重原因:尽量缩减 ESP 分区体积——本来`/efi`设计上也有减小 ESP 分区大小的意图。
> 我试跑完发现`fallback.efi`高达 140+MB`arch-linux.efi`不过 30MB。
>
> 当然,保险起见,我并没有尝试`default`生成 UKI、`fallback`仍生成内存盘的做法,也没有试图把`fallback`预设直接干掉。
> 如有勇士试验过一切正常,欢迎 Issues 反馈(
### iii. 创建映像 ### iii. 创建映像
按需建立路径,并跑一遍生成: 按需建立路径,并跑一遍生成:
@@ -233,7 +216,7 @@ fallback_options="-S autodetect"
mkdir -p /efi/EFI/BOOT/ mkdir -p /efi/EFI/BOOT/
mkinitcpio -p linux mkinitcpio -p linux
``` ```
还是那句话,想循规蹈矩的不要学我 如有必要,清理系统中废旧的启动文件(`grubx64.efi``refind_x64.efi`等),并用`efibootmgr`手动清理遗留的原生启动项
--- ---

View File

@@ -0,0 +1,227 @@
---
category: 灵机一动
tag:
- RDP
- 串流
- SSH
---
# 自组服务:让老机器“物尽其用”
今年的 618 读者们都有过什么盘算呢?换机还是装新机?我嘛……显然是没有条件(米)去换代的,所以如何利用好现有的条件首先就是个问题。之前偶然借助 Hyper-V 得知了 RemoteApps 这项功能,但跑虚拟机[^vm]始终是我个人比较抵触的事情(问就是配置不够分),于是我将目光盯向了 17 年买的老华硕笔记本。这就是咱“自组服务”最初的尝试了。
[^vm]: 这里仅指传统意义的虚拟机,也就是 VMWare、VirtualBox 之类“模拟一套硬件”的硬件抽象层虚拟化。广义的虚拟机实际上就是虚拟化Java 语言也有我们熟悉的 JVM 虚拟机,这是编程语言层的虚拟。此外还有 QEMU、Wine、Linux Docker 等在别的层级实现的虚拟化。
## 基础设施
首先除非你想要亲自呆在老机器旁边操作,否则肯定需要远程连接到那台老机器上的,也就需要保证**别的设备能和老机器互通**。
如果两台机同在一个内网(比如以 WiFi、有线等方式设备间连接同一个路由器那么通常来说需要**固定老机器的 IP**,否则刚搭的“自组服务”可能没几天就飘不知道哪去,得登进路由器里查咯。固定 IP 可以在老机器的系统里操作,等会具体到系统上再分别讨论;一些路由器也支持用户登录进去固定主机的 IP但我家网关莫得这个功能。
若并非同一内网,则更麻烦亿些。我个人折腾过可行的最简方案是 Zerotier **虚拟组网**,毕竟当时对寄网了解有限,搜**内网穿透**也只能搜出来“喂我花生”之类的东西(我家网关也只支持某某壳子)。
:::: details 配置 Zerotier One
首先当然得有那么个内网。在 [Zerotier](https://my.zerotier.com/login) 上注册/登录账号(可能比较卡,毕竟国外平台),`Create A Network`创建虚拟内网。免费版(截至目前)至多允许同一网络 25 个设备,但对于我来说足够了。
接下来图省事的朋友点进新建的网络,记一下`Network ID`就可以直接安装 Zerotier 客户端了。
::: details 或者,进一步配置虚拟内网
主要关注以下项:
- `Basics` 网络基础设置
- `Name` 给你的内网重新起个拟人的名字。
- `Access Control`一般来说保持默认的`Private`(也就是必须你在账号上同意设备加入)即可。
- `Advanced` 高级设置
- `Manage Routes`相当于路由表了(左边是被访的内网网段,右边是 Zerotier 虚拟 IP
可以看看[这篇博客](https://stray.love/jiao-cheng/zerotier-zhong-jie-jiao-cheng)了解一下。
- `IPv4 Auto-Assign`里挑一个容易记的 IP 池。比如我就选`10.147.17.*`
- `IPv6 Auto-Assign`就随意了。说来 IPv6 现阶段不就是公网吗(
- `DNS`参见[英文文档](https://docs.zerotier.com/dns/)。
然后在设备加入虚拟内网之后,可以在`Members`里找到这个设备,手工给它分配个静态 IP。
:::
::: tabs#zerotierInstall
@tab Windows
Windows 安装之后在开始菜单找到 ZeroTier然后可以看到任务栏里出现了 ZeroTier 的图标。右键图标,在菜单里直接`Join Network`,粘贴刚刚的`Network ID`,回车即可。
顺带一提,记得在右键菜单里勾上`Start UI at Login`,也就是开机启动。
@tab Linux systemd
可以通过官网提供的[命令行](https://www.zerotier.com/download/#linux)、部分包管理器等方式安装 Zerotier One。
安装之后记得确认一下 Zerotier 服务是否开启:
```bash
sudo systemctl status zerotier-one.service
```
`systemctl`显示该服务`disabled``inactive (dead)`,说明没有启动,启用并立即启动它:
```bash
sudo systemctl enable --now zerotier-one.service
```
于是就可以使用 Zerotier CLI 了。
我的场景比较简单,不考虑自建 moon 的情况下直接加入虚拟内网:
```sh
sudo zerotier-cli join Network_ID
sudo zerotier-cli listnetworks
```
@tab Docker
[官方文档](https://docs.zerotier.com/docker/)的做法是拉一个 centos 在里面用 systemd 方式安装,属于是脱裤子放屁。
网上有一些现成的镜像,像`zerotier``zerotier-synology`(群晖用的),这里摘录一下用`zerotier/zerotier`的流程:
> [!warning]
> **此方案尚未测试,谨慎复制**!建议在其他**有测试结果的**博客、专栏中获取适合的方案!
```sh
docker pull zerotier/zerotier
# 务必注意网络通信方式!
docker run -d --name zt --network host zerotier/zerotier
docker exec -it zerotier bash
zerotier-cli join Network_ID
zerotier-cli listnetworks
```
:::
在设备加入虚拟内网之后,需要再次登上账号同意设备加入(默认建立的是私有内网,需要号主同意加入),并且给它分配固定 IP。
::::
> [!warning]
> 在配置基础设施、远程连接的时候,还请**不要**断开老机器的屏幕——至少等能连上了再拔线。
## Windows——性能分摊
相信大多数人玩电脑接触最多的还是 Windows 系统,那么对于如何使用它,想必都是很有经验的罢。根据老机器配置的不同,它承担负载的多寡也自然各有参差。
### 固定 IP
- Win11 参考[电脑屋](https://www.diannaowu.com/jc/212.html)的教程;
- Win8.1 及以下通常还是从控制面板固定,也参考[电脑屋](https://www.diannaowu.com/jc/231.html)。
- Win10 除了控制面板法,也可以直接在“设置—网络和 Internet—状态”中找到上网的网络通常标以太网或者 WiFi点进底下的属性往下划拉到 IP 设置那边手动分配 IP。
### 远程连接
白嫖国产软件的免费服务也可以,最常见的当属向日葵了吧。但我是受不了手机端向日葵广告满天飞,所以还是折腾 Windows 自带的 RDP 吧。
欲使用 RDP 连接,需要启用 Windows 的远程控制功能。据微软称家庭版只能它控别人,不能别人控它。但我都 LTSC 2021 起手了,又有何惧。
远程控制选项可在以下两个入口找到(以 Win10、11 为准,不推荐“开发人员设置”):
- 设置—系统—远程桌面,启用之(顺便根据指引把“睡眠”禁用掉、把“网络发现”打开);
- 打开“系统属性”[^sysdm]的“远程”选项卡,允许远程连接、勾上“仅允许……”选项(恕我懒得打全称)。
[^sysdm]: 通常是在“控制面板—系统”(早期 Windows或“设置—系统—关于”Win10、11里跳转。也可`Win+R`直接执行`%windir%\system32\sysdm.cpl`
然后就可以使用 RDP 连接了。控制端可以用`mstsc`Windows、Windows AppAndroid原“RD 桌面”、FreeRDP 以及 RemminaLinux等等。
::: warning
微软账号现在推行免密登录,取而代之的是用 2FA 工具验证登录码,这种方式[**不适用于**](https://support.microsoft.com/zh-cn/account-billing/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8-microsoft-%E5%B8%90%E6%88%B7%E8%BF%9B%E8%A1%8C%E6%97%A0%E5%AF%86%E7%A0%81%E8%AE%BF%E9%97%AE-674ce301-3574-4387-a93d-916751764c43) RDP 连接。
此外,实测发现,微软文档所述的“应用密码”也无法作为凭据。**推荐用本地、带密码的账户托管老机器,密码留空进行远控需要额外做组策略配置,恕不展开。**
:::
然后该干嘛干嘛。顺带一提,*远控的鼠标一般是不记录位移、只改变坐标的*,也就是说《原神》这类游戏远程玩效果并不佳;但《剑网三》重制版则更建议远程玩,因为接下来讲的 Moonlight 串流没法向它传递键盘输入。
### 串流
这里的串流主要是指类似“云原神”那样的——老机器跑游戏,其他设备接收画面、回传操作的——类似看别人直播的模式。顺带一提,自己直播也是一种串流,只不过方向相反:是你这边把音画上传[^limited_upload]到直播平台。
串流自建云游戏的主要方式是 Moonlight+Sunshine 和 Parsec其中前者结合 Zerotier 虚拟组网,甚至可以异地云玩。有关的配置方式可以参考[知乎专栏](https://zhuanlan.zhihu.com/p/718510054)或者 B 站搜索“自建云原神”之类的关键词(也可以看看“阿西西”这个 UP 主的魔改 Moonlight 客户端)。咱已经很久没搞了,讲出来也不一定对,就略过吧。
[^limited_upload]: 目前国内的 ISP又或者运营商对上传带宽限制得很死个人通常不会允许大规模的上传尤其 BT、PT、PCDN其中以 PCDN 为甚——很多软件都会在运行时偷偷跑上传),否则容易吃传单(据说可以投诉,但我这人懒得扯皮);企业商宽、专线通常会给多一点,但就极客湾的遭遇来看似乎也仅仅是“一点”,而且价格比较高昂。可能云游戏亏损就是亏损在这吧。
### 文件共享
最简单的就是 Windows 自带的 SambaSMB文件共享也就是右键文件/文件夹属性里边的“共享”选项卡。
此外还有其他参考:
- 网络文件系统 NFS参见[微软文档](https://learn.microsoft.com/zh-cn/windows-server/storage/nfs/nfs-overview)
- WebDav 服务器(需要 IIS参见[微软文档](https://learn.microsoft.com/zh-cn/iis/install/installing-publishing-technologies/installing-and-configuring-webdav-on-iis#enabling-webdav-publishing-by-using-iis-manager),或参考[《Windows 开启 WebDAV》少数派](https://sspai.com/post/78540)
### 其他服务
- 推流机(挂着直播平台的直播软件,开第三方推流接收内网 OBS 推过来的 rtmp 串流)
- 挂下载(主要是各种限速客户端的下载,或者数据量大的下载)
- 自动化脚本
- RemoteApps迫真“家庭”版 Office当然还有 Adobe 全家桶,等等)
- ……
## Linux——Web 接口
Linux 通常还是作为服务器而非日用的系统使用,所以相比费劲折腾 VNC 等远程桌面,不妨就让它挂一些长线运行的服务好了。而既然莫得远程桌面,这些长线服务很显然只剩 WebUI 这一种可视化的选择。当然如果你更偏好 CLI命令行界面那也不是不行。
### 固定 IP
不同的发行版主要用到的网络管理工具都不太一样。
- 像 Arch Linux 安装阶段会用`systemd-networkd`分配固定 IP
- 而 Ubuntu 虽然也有上述服务,但更多在用`Netplan`(参见 [FreeCodeCamp](https://www.freecodecamp.org/chinese/news/setting-a-static-ip-in-ubuntu-linux-ip-address-tutorial/)
- 还可以用`ifconfig`做**临时**配置:
```bash
ifconfig # 查看所有网卡的配置信息
ifconfig eth0 # 查看某网卡的配置信息,如 eth0
ifconfig eth0 172.16.129.108 netmask 255.255.255.0 # 配置网卡的临时生效的IP地址
route add default gw 172.16.129.254 # 配置网关
```
总之,具体问题(发行版)具体分析,像`/etc/sysconfig/network-scripts`这种上古教程还是不要无脑跟了。~~我的 Ubuntu Server 24.04.2 LTS 连`sysconfig`都莫得。~~
### SSH 远程连接
安装`openssh`包,并启用`sshd`服务。多数软件包管理器应该都支持 SSH。以咱的 Ubuntu Server 为例:
```bash
sudo apt update
sudo apt install openssh
sudo systemctl enable --now sshd
sudo systemctl status sshd
```
### 部署服务(分层讨论)
首先说一下分层怎么回事。有些服务可能是通过容器分发的,那么 Docker 就是这些服务的下层,为这些服务提供支持(有点绕口?);而 Docker、npm 之类通常又依赖国外的源(像 DockerHub、npmjs于是代理又是容器的下层。~~当然正经分类起来这些都属于应用层。只是细化一下粒度便于讨论。~~
::: details 代理层(以 Mihomo 为例)
Mihomo 可以理解为 Clash 的后继,所幸 Clash 的许多配置还是能兼容的(至少我的机场订阅可以直接覆盖使用)。但更好的办法还是编写配置文件了。
我参考了“虚空终端”[^yuanshen]文档的 GeoX [快捷配置](https://wiki.metacubex.one/example/conf/)
```yaml
geox-url:
geoip: "https://fastly.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/geoip.dat"
geosite: "https://fastly.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/geosite.dat"
mmdb: "https://fastly.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/geoip.metadb"
asn: "https://github.com/xishang0128/geoip/releases/download/latest/GeoLite2-ASN.mmdb"
```
但遗憾的是在代理尚未配置好的情况下,似乎哪怕是`jsdelivr`镜像都很难获取到 Geo 信息。那么还是手动下载吧。
实际上只需下载`geoip.dat`并更名`GeoIP.dat``geosite.dat`更名`GeoSite.dat`Linux 对文件名大小写敏感),丢进 mihomo 配置目录即可(也就是`config.yaml`所在位置)。
[^yuanshen]: 文档简介就是这么写的:“‘虚空终端’是一个基于开源项目‘原神’的二次开发版本”。或许是起名灵感,又或者是避嫌。
:::
::: note 应用支持层
主要就是 Docker。Docker 的安装参见官方文档。出于一些原因,现行很多镜像源并不可靠也并不完整,不如直接配置代理(参见[《如何配置 docker 通过代理服务器拉取镜像》(博客园)](https://www.cnblogs.com/abc1069/p/17496240.html))。
`pnpm`或者说`node`直接上官网复制 Linux 安装脚本就彳亍,但**不建议去装 Docker 镜像**[^pnpm_docker_image]
[^pnpm_docker_image]: 个人理解吧……Docker 镜像通常是部署用的,比如 CI/CD runner 跑工作流,需要拉`node`容器生成我这博客的`dist`成品。直接拿来开发个人觉得不太妥。
:::
::: details 应用层
这块不是重点,各种服务有它自己的参考文档。
- `webmin`:提供 WebUI 以配置服务器的系统,以及监测服务器的性能占用。
- `aria2``AriaNg`提供直链、BT、PT 下载支持。参见[《手把手教你使用 Docker 搭建 aria2+AriaNg打造自己的离线下载服务器》博客园](https://www.cnblogs.com/wqp001/p/14709997.html) [^ariang_baidupan]。
- `jellyfin` `emby`:影音服务器。个人觉得就*资源管理的便利性*而言Jellyfin 并不算好;但 Emby 白嫖着用也不见得操作有多舒服。
- `vscode-server`:控制端可利用 VSCode 配合 Remote-SSH 插件连上服务器,做些跨平台开发……或者 Linux Native 开发。~~真有人在 Linux 编译 MSVC x86-64 吗?有的话浇我。~~
- `ssh`Xshell 做些命令行活计Xftp 做些文件交换活计。
- `nfs`:和前面 Windows 一样,可以挂共享文件系统。
- ……
[^ariang_baidupan]: 自从 !!Pandownload!! 被赐似之后,这种套取直链的油猴插件就多半是骗钱引流的“浑水”了,**不建议尝试**!但当年这玩意能火,或许也说明有些慢速下载获取到合适的直链、搭配代理,确实能提速吧。
:::
## 后记
通篇看下来,我的服务场景都挺简单的,不是吗?说实话……我并不熟悉寄网(哪怕为了跨考自学过 408平时也没有太多 Web 编程的实践和需求。能简单搭这么一个自用的服务便已经方便我不少了。若是真正的大佬,或许还会利用反代、软路由等种种轮子实现更加 NB 的东西吧。
不过反正我这人也没什么水平,笔记也不过抛砖引玉。菜逼有菜逼的天马行空,简单点写,懂的都懂。

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

View File

@@ -1,12 +1,11 @@
--- ---
date: 2024-06-17 date: 2024-06-17
category: category: 折腾流程
- Linux
- RA2
tag: tag:
- Linux
- Wine - Wine
- Bottles - Bottles
- 虚拟环境 - RA2
--- ---
# 在 Linux 中游玩《星辰之光》 # 在 Linux 中游玩《星辰之光》
@@ -40,7 +39,7 @@ Bottles 是由 [bottlesdevs](https://github.com/bottlesdevs) 开发的可视化
[^lazy_loading]: 经实测发现,单文件 exe 才可以在这种情况下直接在 Bottles 里启动。但凡需要读同级文件、子文件夹的,都需要在 Bottle 里添加快捷方式,并在快捷方式的设置里手动指明工作目录。 [^lazy_loading]: 经实测发现,单文件 exe 才可以在这种情况下直接在 Bottles 里启动。但凡需要读同级文件、子文件夹的,都需要在 Bottle 里添加快捷方式,并在快捷方式的设置里手动指明工作目录。
首先需要引入`archlinuxcn`源。具体步骤参见[《Arch 安装流程》](../OS/ArchInstall.md#i-cn-源和-aur-助手),这里不再重复。 首先需要引入`archlinuxcn`源。具体步骤参见[《Arch 安装流程》](../Maintenance/ArchInstall.md#i-cn-源和-aur-助手),这里不再重复。
接着`sudo pacman -Sy bottles`安装。等待进度跑完,就可以从“应用程序菜单栏”运行了。 接着`sudo pacman -Sy bottles`安装。等待进度跑完,就可以从“应用程序菜单栏”运行了。
初次运行 Bottles 会弹出一个向导跟你 blabla无脑下一步即可。 初次运行 Bottles 会弹出一个向导跟你 blabla无脑下一步即可。

View File

@@ -1,9 +1,10 @@
--- ---
date: 2024-06-17 date: 2024-06-17
category: category:
- RA2 - 逻辑模型
- 地图 - 实验报告
tag: tag:
- RA2
- 地图编辑 - 地图编辑
- 触发 - 触发
- 局部变量 - 局部变量
@@ -13,7 +14,7 @@ star: true
# 浅谈红警 2 触发组件的运行逻辑 # 浅谈红警 2 触发组件的运行逻辑
::: warning 观前注意 ::: warning 观前注意
由于涉及一些编程知识点,本综述可能存在亿些阅读困难。 由于涉及一些编程知识点,本可能存在亿些阅读困难。
虽然经过与 Zero Fanker 等人的讨论后决定做些~~修缮~~重写,但难免仍有需要改进之处。 虽然经过与 Zero Fanker 等人的讨论后决定做些~~修缮~~重写,但难免仍有需要改进之处。
::: :::

View File

@@ -1,10 +1,9 @@
--- ---
date: 2024-06-17 date: 2024-06-17
category: category: 复习资料
- 逆向工程
- RA2
tag: tag:
- Syringe - RA2
- 逆向工程
- 进程注入 - 进程注入
--- ---
@@ -93,13 +92,14 @@ int example() {
又假设`example()`被 main 函数调用,那么栈帧可能会是这种分布: 又假设`example()`被 main 函数调用,那么栈帧可能会是这种分布:
|地址|...|备注| |地址|...|备注|
|-|:--:|-| |-|:--:|-|
|0x524|...||
|0x520|`main()`的 EBP|`example()`栈帧从这里开始| |0x520|`main()`的 EBP|`example()`栈帧从这里开始|
|0x51C|int a = 10| |0x51C|int a = 10|
|0x518|int b| |0x518|int b|
|0x514|(空余 8B|`gcc`编译器要求栈帧大小为 16B 的整数倍| |0x510|(空余 8B|`gcc`要求栈帧大小为 16B 的整数倍|
|0x50C|1024|参数 y| |0x50C|1024|参数 y|
|0x508|10|参数 x即复制 a 的值| |0x508|10|参数 x即复制 a 的值|
|0x504|调用`eg_sub()`时 EIP 指向的下一指令地址|亦即被`call`压栈、`ret`返回的地址<br>`example()`栈帧到此结束| |0x504|调用`eg_sub()`时 EIP 指向的下一指令地址|亦即被`call`压栈、`ret`返回的地址<br>`example()`栈帧到此结束|
|0x500|`example()`函数的 EBP|这里是`eg_sub()`的栈帧了| |0x500|`example()`函数的 EBP|这里是`eg_sub()`的栈帧了|
|...|...|| |...|...||

View File

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

View File

@@ -1,12 +1,10 @@
--- ---
title: 笔记 title: 如我所书
index: false index: false
article: false article: false
timeline: false timeline: false
comment: false
icon: book icon: book
category: ''
--- ---
笔记这边类似 B 站、知乎的“专栏”,有能成篇的发现就会考虑写写。
<Catalog /> <Catalog />

View File

@@ -1,137 +0,0 @@
---
tag:
- RDP
- 串流
- SSH
---
# 自组服务:让老机器“物尽其用”
这问题最初还真是为了分担《原神》这种重负载。毕竟 2.8 版本的海岛成功把我的轻薄本干烧了。~~虽然轻薄本拿去直播《原神》讲真也挺抽象的。~~ 然后次年下旬,我折腾 Hyper-V 时发现它似乎是通过远程提供的虚拟机界面,于是便走上了“自组服务”的不归路。
说白了,“把重负载分摊出去”的做法,某种意义上也顺应如今的各种“云”服务——把重活脏活甩给有能力负担的机器(对于绝大多数用户而言当然就是企业的云服务器),并提供轻量的终端接口给用户。何尝不是一种 C/S 模式呢?
---
话虽如此,自组服务也并非是自己买台服务器——那功耗和噪音注定不是家庭可承受的。所以让老机器“物尽其用”,也就成了我的首选。
> [!important]
> - 量力而行。这里的“力”指**老机器的配置、性能**。你毕竟不能强求赛扬 CPU 去跑《原神》PC 客户端。
> - 下面无论何种部署方式,均要求**在能够建立远程连接之前,首先有块屏幕**。
> - 本文只提供大概流程(或者说思路),**恕不详述具体操作流程**。信息检索能力很重要喔,哪怕是问 AI 呢?
## 前置准备
首先,需要固定机器在内网的 IP。你可以在路由器或是在 Windows 的控制面板或者设置里操作。具体的教程还请百度,恕不展开。
::: details Linux 如何固定
必应了一下,有介绍`/etc/sysconfig/network-scripts`的,有介绍最新版 Ubuntu 使用的`netplan`工具的,五花八门。
Arch Linux 安装时可以用`systemd-networkd`配置。
首先`ip link`(有的教程用`ip a`)查看网络设备号,然后编辑`/etc/systemd/network/网络设备号.network`,之后重启`systemd-networkd`服务。
:::
然后有条件的话可以尝试异地互联,比如出门可以用手机连回家里的老主机,用 Emby 看电影之类的。家里**有公网 IP 最好,但建议认真配置防火墙**;没有公网的也可以尝试 Zerotier 等工具**组虚拟内网**。
:::: details 配置 Zerotier One
首先当然得有那么个内网。在 [Zerotier](https://my.zerotier.com/login) 上注册/登录账号(可能比较卡,毕竟国外平台),`Create A Network`创建虚拟内网。免费版(截至目前)至多允许同一网络 25 个设备,但对于我来说足够了。
接下来图省事的朋友点进新建的网络,记一下`Network ID`就可以直接安装 Zerotier 客户端了。
Windows 有挂在任务栏里的 GUI 客户端,右键图标直接`Join Network`,粘贴刚刚的`Network ID`回车,进账号里同意加入、给它分配固定 IP 即可;
Linux 可以通过 Docker、官网提供的命令行、部分包管理器等方式安装 Zerotier One。
::: details 或者,进一步配置虚拟内网
主要关注以下项:
- `Basics` 网络基础设置
- `Name` 给你的内网重新起个拟人的名字。
- `Access Control`一般来说保持默认的`Private`(也就是必须你在账号上同意设备加入)即可。
- `Advanced` 高级设置
- `Manage Routes`相当于路由表了(左边是被访的内网网段,右边是 Zerotier 虚拟 IP
可以看看[这篇博客](https://stray.love/jiao-cheng/zerotier-zhong-jie-jiao-cheng)了解一下。
- `IPv4 Auto-Assign`里挑一个容易记的 IP 池。比如我就选`10.147.17.*`
- `IPv6 Auto-Assign`就随意了。说来 IPv6 现阶段不就是公网吗(
- `DNS`参见[英文文档](https://docs.zerotier.com/dns/)。
然后在设备加入虚拟内网之后,可以在`Members`里找到这个设备,手工给它分配个静态 IP。
:::
安装之后记得确认一下 Zerotier 服务是否开启Docker 容器还请额外注意端口映射。
```bash
sudo systemctl status zerotier-one.service
```
`systemctl`显示该服务`disabled``inactive (dead)`,说明没有启动,启用并立即启动它:
```bash
sudo systemctl enable --now zerotier-one.service
```
于是就可以使用 Zerotier CLI 了。我的场景比较简单,不考虑自建 moon 的情况下直接`sudo zerotier-cli join Network_ID`,然后也是在账号上给它放行、分配固定 IP 就可以了。
::::
## Windows——远程、串流、文件共享
Windows 想必大家都很熟。但既然把老主机当作“服务”来看待,便没有必要守在它旁边操作。也就是说,我们可以通过远程、串流等方式连上这台电脑,就好像云原神一样:游戏是在电脑上跑的,玩家是在手机上玩的。
Windows 开启 RDP 远程可以通过“高级系统设置”的“远程”选项卡Win7、8.1 可在**控制面板—系统**信息页跳转)、**设置—系统—远程桌面**Win10、11启用。
而如需像云原神般串流,则需要 Sunshine被控服务端和 Moonlight控制终端两个软件。~~当然也有别的串流方案,但 Moonlight 我折腾成了。~~ 由于间隔比较久远,相关的教程可以去 B 站搜索“自制云原神”词条,或者搜“阿西西”这个 UP 主,我也就不多展开了。
至于文件共享,最简单的方式是 Samba也就是右键文件属性里的“共享”选项卡。记得遵照指引去“网络和共享中心”先“启用文件和打印机共享”喵。
### 可部署的服务
我个人倒是有过这些实践:
- 开着 BiliBili 直播姬做推流机,从内网接收 OBS 流,并推上 B 站;
- 挂着各种网盘(尤其百度网盘)下载;
- RDP 玩剑三Moonlight 实测会屏蔽键盘输入)、串流玩崩原铁;
- 远程过去 P 图,开 After Effect 2018 做视频;
- ……
总的来说你平时怎么用那台牢机器的那就怎么对待它就是了。3 代 i3老老实实办公、文件共享玩些老游戏差不多就得了。10 代 i5那可以试试串流玩点新游戏After Effects 2020 做点视频特效,之类的。要是还有 AMD/NVIDIA 显卡,嚯,那甚至可以试试大模型。
**还是那句话,有什么样的性能办什么样的事**,不要学我一下子把负载全都倒到老 ASUS 上VSCode Remote+WSL+网易云+百度云+……,一下子给 7 代 i5、4GB 物理内存、32GB 虚拟内存(甚至才吃了 14GB整不会了。
### 常驻开机
作为自组服务器,肯定不兴像平日的 Windows 那般被自动更新、启动修复等扰得无法远程。
自动更新可以在**组策略`gpedit.msc`—计算机配置—管理模板—Windows 组件—Windows 更新—配置自动更新**一项中配置“已禁用”;若需禁止进 WinRE 启动修复,可以考虑以下两行批处理:
```batch
bcdedit /set {default} bootstatuspolicy ignoreallfailures
bcdedit /set {current} recoveryenabled No
```
当然我已经换用 Ubuntu Server 了,这两行有没有用我也没有底(
## Linux——开发、常驻服务、文件存取
不得不说Linux 能作为日用的服务确实不多(特别是无图形界面的服务器端),绝大多数部署起来可能还并不轻松。~~但部署好了之后是真好用啊(~~
那么既然不需要日用,为了节省图形资源,干脆就把老主机当作服务器,装个无图形界面的 Linux 吧。可以百度“Ubuntu Server 家庭云服务器”,有不少教程。
Linux 的主要远程手段是 SSH。在此之前需要安装`openssh`,并启用(和启动)`sshd`服务。
控制端则可以装一些便捷的工具去维护 SSH 连接,比如 [Xshell](https://www.xshell.com/zh/xshell/) 和 [Xftp](https://www.xshell.com/zh/xftp/)。
### 可部署的服务
1. 代理服务器(不光是服务器本机,在内网范围内其他电脑都可以过这台机的代理)
> 为什么是代理优先呢?因为像`docker`、`npm`等很多服务都需要代理。这或许也是一种“分层结构”吧。
2. `docker`容器服务(这种就基本上是服务器在跑,也是作为下层服务去提供别的服务)
3. `aria2`下载服务BT/PT乃至直链[^direct_http]),配合`ariaNg`等 WebUI
[^direct_http]: 有些浏览器下载比较慢的,借助`aria2`和代理或许能明显改善速度。!!比如已似的 Pandownload。!!
4. `emby` `jellyfin`影音服务(但总的来说和国内的手机 APP 一样,资源管理比较单一,莫得音、视、图同时管理,可能大多数人对这些资源分类比较门清吧)
5. 跨平台前、后端开发(`nodejs` `python` ...,搭配 VSCode Remote-SSH
6. 文件存取服务Xftp
7. 其他定时服务、脚本……
## 后记
通篇看下来,我的服务场景也挺简单的,不是吗?说实话……我并不熟悉寄网(哪怕为了跨考自学过 408平时也没有太多 Web 编程的实践和需求。能简单搭这么一个自用的服务便已经方便我不少了。若是真正的大佬,或许还会利用反代、软路由等种种轮子实现更加 NB 的东西吧。
不过反正我这人也没什么水平,笔记也不过抛砖引玉。菜逼有菜逼的天马行空,简单点写,懂的都懂。

View File

@@ -10,15 +10,15 @@
"up-deps": "pnpm dlx vp-update" "up-deps": "pnpm dlx vp-update"
}, },
"devDependencies": { "devDependencies": {
"@vuepress/bundler-vite": "2.0.0-rc.23", "@vuepress/bundler-vite": "2.0.0-rc.26",
"@vuepress/plugin-docsearch": "2.0.0-rc.108", "@vuepress/plugin-docsearch": "2.0.0-rc.124",
"@vuepress/plugin-remove-pwa": "2.0.0-rc.103", "@vuepress/plugin-remove-pwa": "2.0.0-rc.124",
"katex": "^0.16.22", "katex": "^0.16.35",
"mermaid": "^11.6.0", "mermaid": "^11.12.3",
"sass-embedded": "^1.89.2", "sass-embedded": "^1.97.3",
"vue": "^3.5.16", "vue": "^3.5.29",
"vuepress": "2.0.0-rc.23", "vuepress": "2.0.0-rc.26",
"vuepress-theme-hope": "2.0.0-rc.92" "vuepress-theme-hope": "2.0.0-rc.103"
}, },
"packageManager": "pnpm@9.15.3+sha512.1f79bc245a66eb0b07c5d4d83131240774642caaa86ef7d0434ab47c0d16f66b04e21e0c086eb61e62c77efc4d7f7ec071afad3796af64892fae66509173893a" "packageManager": "pnpm@9.15.3+sha512.1f79bc245a66eb0b07c5d4d83131240774642caaa86ef7d0434ab47c0d16f66b04e21e0c086eb61e62c77efc4d7f7ec071afad3796af64892fae66509173893a"
} }

4478
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
{ {
"#5:0": { "#5:0": {
"name": "Shimakaze 岛风", "name": "舰队的偶像-岛风酱!",
"icon": "https://blog.shimakaze.dev/avatar.webp", "icon": "https://blog.shimakaze.dev/avatar.webp",
"desc": "愿世界没有加班。", "desc": "愿世界没有加班。",
"link": "https://blog.shimakaze.dev" "link": "https://blog.shimakaze.dev"
@@ -14,13 +14,25 @@
"#7:0": { "#7:0": {
"name": "SnowyKami 神羽", "name": "SnowyKami 神羽",
"icon": "https://q.qlogo.cn/g?b=qq&nk=2751454815&s=640", "icon": "https://q.qlogo.cn/g?b=qq&nk=2751454815&s=640",
"desc": "轻雪工作室主要负责人。非常厉害。", "desc": "「神光兮天轻,羽游兮似雪。」",
"link": "https://sfkm.me" "link": "https://sfkm.me"
}, },
"#8:0": { "#8:0": {
"name": "MelodyEcho 律回", "name": "MelodyEcho 律回",
"icon": "https://github.com/AiCorein.png", "icon": "https://q.qlogo.cn/g?b=qq&nk=1574260633&s=640",
"desc": "可爱的 Python Dev 和音乐人律姐姐~", "desc": "可爱的 Python Dev 和音乐人律姐姐~",
"link": "https://glowmem.com/" "link": "https://glowmem.com/"
},
"#24:0": {
"name": "SD7935",
"icon": "https://q1.qlogo.cn/g?b=qq&s=640&nk=2691681405",
"desc": "一个CTFer、红警牢玩家、死宅、蟒蛇使用者、hentai",
"link": "https://www.sd7935.link/"
},
"#26:0": {
"name": "Asankilp",
"icon": "https://blog.erroro.moe/assets/avatar.jpg",
"desc": "半吊子写代码的,瞎折腾的。",
"link": "https://blog.erroro.moe/"
} }
} }

View File

@@ -45,6 +45,10 @@ const friends: ThemeBlogHomeProjectOptions[] = Object.values(FriendsInfo)
<style lang="scss"> <style lang="scss">
.vp-hero-info { .vp-hero-info {
flex-direction: column; flex-direction: column;
.vp-blog-hero-title {
text-align: center;
}
} }
main.friends.round-avatar { main.friends.round-avatar {

View File

@@ -2,7 +2,6 @@ import { navbar } from "vuepress-theme-hope";
export default navbar([ export default navbar([
"/", "/",
"/archives/",
"/notes/", "/notes/",
"/diaries/", "/diaries/",
{ {

View File

@@ -4,22 +4,31 @@ export default sidebar({
"/": [ "/": [
// "", // "",
{ {
text: "综述", text: "如我所书",
icon: "folder-open",
prefix: "archives/",
children: "structure",
},
{
text: "笔记",
icon: "book", icon: "book",
prefix: "notes/", prefix: "notes/",
children: "structure", children: "structure",
}, },
{ {
text: "随想", text: "记忆的质料",
icon: "paper-plane", icon: "paper-plane",
prefix: "diaries/", prefix: "diaries/",
children: "structure", children: [
{
text: "好耶,是女装",
icon: "images",
prefix: "dress/",
collapsible: true,
children: "structure"
},
{
text: "无病呻吟",
icon: "message",
prefix: "wbsy/",
collapsible: true,
children: "structure"
},
],
}, },
// "intro", // "intro",
// "friends/" // "friends/"

View File

@@ -22,29 +22,19 @@ export default defineUserConfig({
], ],
head: [ head: [
// 导入相应链接
["link", { rel: "preconnect", href: "https://fonts.googleapis.com" }],
[
"link",
{ rel: "preconnect", href: "https://fonts.gstatic.com", crossorigin: "" },
],
[ [
"link", "link",
{ {
href: "https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@400..700&display=swap", href: "https://npm.onmicrosoft.cn/",
as: "font", rel: "preconnect",
crossorigin: "", crossorigin: "",
}, },
], ],
[ [
"link", "link",
{ {
href: "https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@400..700&display=swap", href: "https://npm.onmicrosoft.cn/@agxcoy/lxgw-wenkai-vp-hope@latest/style.css",
rel: "stylesheet", rel: "stylesheet",
as: "font",
crossorigin: "",
media: "print",
onload: "this.media='all'",
}, },
], ],
], ],