Compare commits
54 Commits
caf493a233
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
6ac6b835bf
|
|||
|
4f393245ab
|
|||
|
7c26278cf6
|
|||
|
3715d0e67a
|
|||
|
2b62d58c85
|
|||
|
daf60578cf
|
|||
| 98a26a98ae | |||
|
fa16a643aa
|
|||
|
7fc4da6b14
|
|||
|
88255d71b8
|
|||
|
84ebc3c305
|
|||
|
4c4436c6c6
|
|||
|
3604b6e4c0
|
|||
|
8eed3560c1
|
|||
|
c9b385dc0d
|
|||
|
d04f252d68
|
|||
|
e423fa9b35
|
|||
|
d0ba0f16ec
|
|||
|
f16d4f5649
|
|||
|
d43864e7e8
|
|||
|
09b7d88805
|
|||
| 1024113c21 | |||
| 7e0c8aa896 | |||
| 5497b204fd | |||
|
676783aa81
|
|||
|
0d1de50594
|
|||
|
a111647c46
|
|||
|
176b33ec18
|
|||
|
c27bbe4fcf
|
|||
|
fdf210cdf1
|
|||
| cb278764a0 | |||
|
74c474a725
|
|||
|
e1c44f841a
|
|||
|
e6eb8f8a13
|
|||
|
04d88e1a87
|
|||
|
9338c38cb5
|
|||
|
56c2eb882f
|
|||
|
4ba0db9fe2
|
|||
|
7b982a06fe
|
|||
|
8410290794
|
|||
|
69de54787e
|
|||
| 80c5d6c324 | |||
| 8f56b2436f | |||
| bd9c4aeec9 | |||
|
5f6e5ddb6d
|
|||
|
350e1fd4c1
|
|||
|
5cbddd7a53
|
|||
|
e2cf5cd376
|
|||
|
957a8fbdab
|
|||
|
f25a640fa5
|
|||
|
8a0b0e9a83
|
|||
|
7e1fbb73a2
|
|||
|
87ae91d0a1
|
|||
|
e7d787d84e
|
4
.vscode/settings.json
vendored
@@ -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
@@ -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"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
17
README.md
@@ -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">
|

|
||||||
<img src="https://img.shields.io/badge/license-MIT-blue" alt="license - MIT">
|

|
||||||
<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)
|
||||||
|
|||||||
@@ -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';
|
||||||
|
|||||||
@@ -1,12 +0,0 @@
|
|||||||
---
|
|
||||||
title: 综述
|
|
||||||
index: false
|
|
||||||
article: false
|
|
||||||
timeline: false
|
|
||||||
icon: folder-open
|
|
||||||
category: ''
|
|
||||||
---
|
|
||||||
|
|
||||||
“综述”这边的博文通常比较正式一些,编排上会参考大学论文、实验报告,当然也经常会有迭代(综述嘛,追求严谨)。
|
|
||||||
|
|
||||||
<Catalog />
|
|
||||||
|
Before Width: | Height: | Size: 1.2 MiB After Width: | Height: | Size: 1.2 MiB |
@@ -13,4 +13,4 @@ article: false
|
|||||||
|
|
||||||
拍的时候主包可能已经 85+kg 了。最近有在减肥喵,但说实话对于女装,我不抱希望。
|
拍的时候主包可能已经 85+kg 了。最近有在减肥喵,但说实话对于女装,我不抱希望。
|
||||||
|
|
||||||

|

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

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
BIN
docs/diaries/dress/maid-251231-1.avif
Normal file
|
After Width: | Height: | Size: 516 KiB |
BIN
docs/diaries/dress/maid-251231-2.avif
Normal file
|
After Width: | Height: | Size: 82 KiB |
BIN
docs/diaries/dress/maid-251231-3.avif
Normal file
|
After Width: | Height: | Size: 1.4 MiB |
BIN
docs/diaries/dress/maid-251231-4.avif
Normal file
|
After Width: | Height: | Size: 552 KiB |
BIN
docs/diaries/dress/maid-251231-5.avif
Normal file
|
After Width: | Height: | Size: 1.0 MiB |
BIN
docs/diaries/dress/maid-251231-6.avif
Normal file
|
After Width: | Height: | Size: 452 KiB |
BIN
docs/diaries/dress/maid-251231-7.avif
Normal file
|
After Width: | Height: | Size: 454 KiB |
BIN
docs/diaries/dress/maid-251231-8.avif
Normal file
|
After Width: | Height: | Size: 364 KiB |
12
docs/diaries/dress/readme.md
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
---
|
||||||
|
title: 好耶,是女装
|
||||||
|
index: false
|
||||||
|
article: false
|
||||||
|
timeline: false
|
||||||
|
comment: false
|
||||||
|
icon: images
|
||||||
|
---
|
||||||
|
|
||||||
|
……并不好。主包太大只,太肥了,只有肥腿堪堪能看。
|
||||||
|
|
||||||
|
<Catalog />
|
||||||
@@ -6,8 +6,8 @@ article: false
|
|||||||
|
|
||||||
稍微减了减肥,现在拍完自我感觉不会太难看了……吧。当然由于条件有限,体毛什么的没办法除得特别利索。如有影响观感还请见谅。
|
稍微减了减肥,现在拍完自我感觉不会太难看了……吧。当然由于条件有限,体毛什么的没办法除得特别利索。如有影响观感还请见谅。
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||

|

|
||||||
|
|
||||||

|

|
||||||
|
Before Width: | Height: | Size: 1.3 MiB After Width: | Height: | Size: 1.3 MiB |
|
Before Width: | Height: | Size: 2.2 MiB After Width: | Height: | Size: 2.2 MiB |
|
Before Width: | Height: | Size: 1.1 MiB After Width: | Height: | Size: 1.1 MiB |
@@ -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 />
|
||||||
|
Before Width: | Height: | Size: 72 KiB After Width: | Height: | Size: 72 KiB |
|
Before Width: | Height: | Size: 86 KiB After Width: | Height: | Size: 86 KiB |
|
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 53 KiB |
@@ -24,7 +24,7 @@ date: 2025-05-16
|
|||||||
|
|
||||||
[^moewiki_catboy]: 这种分类取自[萌娘百科](https://zh.moegirl.org.cn/%E7%8C%AB%E9%83%8E)。简而言之就是“猫少年”,或者说“具有猫部分特征的男孩子”。
|
[^moewiki_catboy]: 这种分类取自[萌娘百科](https://zh.moegirl.org.cn/%E7%8C%AB%E9%83%8E)。简而言之就是“猫少年”,或者说“具有猫部分特征的男孩子”。
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
最早启用的设定。虽然理论上任何钙离子组成的盐都可以指代我,但中学阶段最常见的沉淀果然还是 CaCO~3~ 吧。然后“碳酸钙摘掉两个氧”,最初的名字——Caco 就确定下来了。后来又衍生出音译“卡扣”、Casheen 和相应音译“卡伸”。
|
最早启用的设定。虽然理论上任何钙离子组成的盐都可以指代我,但中学阶段最常见的沉淀果然还是 CaCO~3~ 吧。然后“碳酸钙摘掉两个氧”,最初的名字——Caco 就确定下来了。后来又衍生出音译“卡扣”、Casheen 和相应音译“卡伸”。
|
||||||
老朋友们大抵还是愿意叫我“卡”这组名字,特别是接触过的红警 2 modder 和地图师。
|
老朋友们大抵还是愿意叫我“卡”这组名字,特别是接触过的红警 2 modder 和地图师。
|
||||||
@@ -51,7 +51,7 @@ date: 2025-05-16
|
|||||||
- 喜欢的:听故事和讲故事
|
- 喜欢的:听故事和讲故事
|
||||||
- 讨厌的:毫无营养的信源
|
- 讨厌的:毫无营养的信源
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
在 Caco 因故被一撮原神同人女攻击之后不久,钙的形象弃用,咱也随即改名为 Chloride Pussemi,即 ChlorideP 了。而后有人因为末尾这个 P 以为我是 VOCALOID 曲师(P 主),加上这个昵称全小写起来并不方便手写,遂又更名为 NyaCl.
|
在 Caco 因故被一撮原神同人女攻击之后不久,钙的形象弃用,咱也随即改名为 Chloride Pussemi,即 ChlorideP 了。而后有人因为末尾这个 P 以为我是 VOCALOID 曲师(P 主),加上这个昵称全小写起来并不方便手写,遂又更名为 NyaCl.
|
||||||
|
|
||||||
@@ -78,15 +78,35 @@ date: 2025-05-16
|
|||||||
- 喜欢的:涩涩(无论主动被动)
|
- 喜欢的:涩涩(无论主动被动)
|
||||||
- 讨厌的:烦心事
|
- 讨厌的:烦心事
|
||||||
|
|
||||||

|

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

|
||||||
|
|
||||||
|
::: 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 隧道都不需要动,天然就完成了我的小巧思。
|
||||||
12
docs/diaries/wbsy/readme.md
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
---
|
||||||
|
title: 无病呻吟
|
||||||
|
index: false
|
||||||
|
article: false
|
||||||
|
timeline: false
|
||||||
|
comment: false
|
||||||
|
icon: message
|
||||||
|
---
|
||||||
|
|
||||||
|
小作文。自省?发泄?借用网友的一句话,梦到什么说什么。
|
||||||
|
|
||||||
|
<Catalog />
|
||||||
37
docs/diaries/wbsy/recents-11172025.md
Normal 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 太垃圾导致的。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
虽然还有很多话题想唠,但真要写起日记吧,记忆却蒙上一层薄雾,回忆不真切。以上是记得比较清楚 ~~(或者说耿耿于怀)~~ 的几件,姑且落笔一叙。
|
||||||
@@ -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 Miku:Arch 简明指南](https://arch.icekylin.online/guide/)(以下简称“Miku 指南”)
|
2. [Nakano Miku:Arch 简明指南](https://arch.icekylin.online/guide/)(以下简称“Miku 指南”)
|
||||||
|
3. [Arch Wiki:Installation 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 显卡可参见[律回指南 §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 显卡可参见[律回指南 §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 显卡可参见[律回指南 §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 连接中调出 CUI;VSCode Remote-SSH 打开的终端可能比较特殊,仍然无法签名。个人还是建议单独开个终端作为 workaround。
|
经测试,大部分终端均能在 SSH 连接中调出 CUI。若 VSCode Remote-SSH 打开的终端签不了名,检查一下是不是终端分割得太小了。
|
||||||
|
|
||||||
### II. GPG 密钥备份(导出导入)
|
### II. GPG 密钥备份(导出导入)
|
||||||
之前并没有意识到备份 key 的重要性,结果重装 Arch 重新配置提交签名时,
|
之前并没有意识到备份 key 的重要性,结果重装 Arch 重新配置提交签名时,
|
||||||
@@ -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`,以及原生启动项:
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
那么办法也很简单:像 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`手动清理遗留的原生启动项。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
227
docs/notes/Maintenance/SelfHosted.md
Normal 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 App(Android,原“RD 桌面”)、FreeRDP 以及 Remmina(Linux),等等。
|
||||||
|
|
||||||
|
::: 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 自带的 Samba(SMB)文件共享,也就是右键文件/文件夹属性里边的“共享”选项卡。
|
||||||
|
|
||||||
|
此外还有其他参考:
|
||||||
|
|
||||||
|
- 网络文件系统 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 的东西吧。
|
||||||
|
|
||||||
|
不过反正我这人也没什么水平,笔记也不过抛砖引玉。菜逼有菜逼的天马行空,简单点写,懂的都懂。
|
||||||
BIN
docs/notes/Maintenance/esp_without_bootARCH.webp
Normal file
|
After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 68 KiB |
@@ -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,13 +39,13 @@ 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,无脑下一步即可。
|
||||||
到最后一步时 Bottles 会下载一些组件包。由于众所周知的原因,可能会花费比较长的时间。
|
到最后一步时 Bottles 会下载一些组件包。由于众所周知的原因,可能会花费比较长的时间。
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
## 二、部署 Bottle
|
## 二、部署 Bottle
|
||||||
|
|
||||||
@@ -76,7 +75,7 @@ Bottles 是由 [bottlesdevs](https://github.com/bottlesdevs) 开发的可视化
|
|||||||
> [!warning]
|
> [!warning]
|
||||||
> 如果你在全局设置里改过默认目录,千万不要在新建这里又改到同一个位置,否则会报**符号占用,创建失败**。
|
> 如果你在全局设置里改过默认目录,千万不要在新建这里又改到同一个位置,否则会报**符号占用,创建失败**。
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
然后在右上角点击“创建”即可。
|
然后在右上角点击“创建”即可。
|
||||||
|
|
||||||
@@ -138,7 +137,7 @@ unzip -O GBK -o '~/Documents/0.6.2 离线更新包.zip' -d '~/Documents/Extreme
|
|||||||
|
|
||||||
然后点开你的 Bottle 进入详情页,为客户端`Extreme Starry.exe`添加快捷方式,这样就不需要每次都点“运行可执行程序”找半天了。
|
然后点开你的 Bottle 进入详情页,为客户端`Extreme Starry.exe`添加快捷方式,这样就不需要每次都点“运行可执行程序”找半天了。
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
> [!tip]
|
> [!tip]
|
||||||
> 在“选择可执行文件”对话框中,若找不到 exe,请在“过滤”那里改为`Supported Executables`。
|
> 在“选择可执行文件”对话框中,若找不到 exe,请在“过滤”那里改为`Supported Executables`。
|
||||||
@@ -189,7 +188,7 @@ unzip -O GBK -o '~/Documents/0.6.2 离线更新包.zip' -d '~/Documents/Extreme
|
|||||||
::: info 再次启动客户端没有反应
|
::: info 再次启动客户端没有反应
|
||||||
可能是因为进程还驻留在 Wine 环境当中,需要“强制停止所有进程”手动干掉:
|
可能是因为进程还驻留在 Wine 环境当中,需要“强制停止所有进程”手动干掉:
|
||||||
|
|
||||||

|

|
||||||
:::
|
:::
|
||||||
|
|
||||||
## 附录:关于 Syringe 命令行
|
## 附录:关于 Syringe 命令行
|
||||||
|
|||||||
@@ -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 等人的讨论后决定做些~~修缮~~重写,但难免仍有需要改进之处。
|
||||||
:::
|
:::
|
||||||
|
|
||||||
@@ -94,7 +95,7 @@ star: true
|
|||||||
|
|
||||||
这种“等待条件”的现象与高中数学讨论的“若 p 则 q”命题(即条件命题)非常类似。一个条件命题要能判断其真伪,条件就必不可少;同样的,一个触发要能执行,首先要等待前置事件完成。在程序框图中,像这种具有前置条件的语义用**条件分支**表示(如下图),又称**选择结构**。
|
这种“等待条件”的现象与高中数学讨论的“若 p 则 q”命题(即条件命题)非常类似。一个条件命题要能判断其真伪,条件就必不可少;同样的,一个触发要能执行,首先要等待前置事件完成。在程序框图中,像这种具有前置条件的语义用**条件分支**表示(如下图),又称**选择结构**。
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
从游戏实际运行的现象来看,触发会在条件满足(为真)后执行相应的“处理程序”(也就是行为),这一点符合基本印象。而当条件**尚未满足**时,触发则阻塞等待。
|
从游戏实际运行的现象来看,触发会在条件满足(为真)后执行相应的“处理程序”(也就是行为),这一点符合基本印象。而当条件**尚未满足**时,触发则阻塞等待。
|
||||||
假如**逻辑上**就是希望判断条件不满足(为假),由于触发一直等不到条件满足,则直到游戏结束为止这个条件都得不到任何处理。如此看来,触发的逻辑本质就是如上左图的**条件单分支结构**。
|
假如**逻辑上**就是希望判断条件不满足(为假),由于触发一直等不到条件满足,则直到游戏结束为止这个条件都得不到任何处理。如此看来,触发的逻辑本质就是如上左图的**条件单分支结构**。
|
||||||
@@ -227,7 +228,7 @@ if anyEvent: # P8 任何事件(当*单独使用*时,它会令触发*立即
|
|||||||
|
|
||||||
对于循环结构,[已知的触发教程](https://www.bilibili.com/video/BV1Zw411y7DZ?spm_id_from=333.1387.collection.video_card.click)大概会让你关注触发的「重复类型」:
|
对于循环结构,[已知的触发教程](https://www.bilibili.com/video/BV1Zw411y7DZ?spm_id_from=333.1387.collection.video_card.click)大概会让你关注触发的「重复类型」:
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
通常来说,选择 *2 - Repeating OR* 那一项便足以满足很多简单的重复需求。
|
通常来说,选择 *2 - Repeating OR* 那一项便足以满足很多简单的重复需求。
|
||||||
|
|
||||||
@@ -244,7 +245,7 @@ while True:
|
|||||||
|
|
||||||
分析这个运行表现不难发现,它是类似下图图二的流程:首先它走到`while`处执行判断,由于条件恒满足,往下执行`print`;然后循环并没有结束,它重新回到`while`重复执行前面说的流程,将坏掉的乐土打字机事业推进下去~~爱莉希雅死辣~~。
|
分析这个运行表现不难发现,它是类似下图图二的流程:首先它走到`while`处执行判断,由于条件恒满足,往下执行`print`;然后循环并没有结束,它重新回到`while`重复执行前面说的流程,将坏掉的乐土打字机事业推进下去~~爱莉希雅死辣~~。
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
上面的`Hello World`案例也是类似图二的流程。于是,重复触发可以用`while`循环表示:
|
上面的`Hello World`案例也是类似图二的流程。于是,重复触发可以用`while`循环表示:
|
||||||
```python
|
```python
|
||||||
@@ -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()`的栈帧了|
|
||||||
|...|...||
|
|...|...||
|
||||||
|
|
||||||
@@ -260,7 +260,7 @@ EXPORT_FUNC(funcname)
|
|||||||
浓缩版就是,向`hook`的地址那里写入`jmp`无条件跳转指令。由于`jmp`指令码本身占 1B,后面跟的虚拟地址总是占 4B,故`size`至少得是 5。
|
浓缩版就是,向`hook`的地址那里写入`jmp`无条件跳转指令。由于`jmp`指令码本身占 1B,后面跟的虚拟地址总是占 4B,故`size`至少得是 5。
|
||||||
那倘若要覆盖超过 5B 的机器代码呢?答案是多余部分用`nop`(空指令,什么也不做)填充。
|
那倘若要覆盖超过 5B 的机器代码呢?答案是多余部分用`nop`(空指令,什么也不做)填充。
|
||||||
|
|
||||||

|

|
||||||
:::
|
:::
|
||||||
|
|
||||||
### 注意事项
|
### 注意事项
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
@@ -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 />
|
||||||
|
|||||||
18
package.json
@@ -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
@@ -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/"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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 {
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ import { navbar } from "vuepress-theme-hope";
|
|||||||
|
|
||||||
export default navbar([
|
export default navbar([
|
||||||
"/",
|
"/",
|
||||||
"/archives/",
|
|
||||||
"/notes/",
|
"/notes/",
|
||||||
"/diaries/",
|
"/diaries/",
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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/"
|
||||||
|
|||||||
@@ -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'",
|
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
|
|||||||