Compare commits

...

69 Commits

Author SHA1 Message Date
dichgrem
3074cce943 update:win_py 2025-12-02 16:43:52 +08:00
dichgrem
7a2a62ca81 update:git 2025-11-30 16:37:39 +08:00
dichgrem
fc214b99ea update:openwrt 2025-11-30 15:19:56 +08:00
dichgrem
a14f07559d update:actions 2025-11-26 16:40:43 +08:00
dichgrem
885e428b34 update:android-dev 2025-11-25 13:09:40 +08:00
dichgrem
784cceb48a feat:zola_actions 2025-11-23 19:32:02 +08:00
dichgrem
8adb0f14ef update:cslearning 2025-11-23 13:46:29 +08:00
dichgrem
845850871a style:add_highlight 2025-11-21 18:49:55 +08:00
dichgrem
f59ce84988 clean:backup 2025-11-21 14:05:49 +08:00
dichgrem
d80a243878 add:linux_android 2025-11-20 14:18:37 +08:00
dichgrem
9d0fc8768a update:lazyvim 2025-11-20 12:01:52 +08:00
dichgrem
08cebea624 update:stm32 2025-11-20 11:57:24 +08:00
dichgrem
171d867f21 add:linux_0 2025-11-17 18:51:43 +08:00
dichgrem
1f325ce9a3 update:stm32 2025-11-17 16:30:44 +08:00
dichgrem
c5ff247d7e update:stm32 2025-11-15 19:33:11 +08:00
dichgrem
7ba1088bc2 update:py 2025-11-13 14:37:35 +08:00
dichgrem
0fe644e4b7 update:git 2025-11-10 10:37:22 +08:00
dichgrem
faf43c3e1c update:git 2025-11-06 20:24:00 +08:00
dichgrem
4f48f01b73 chore:backup 2025-11-02 16:09:14 +08:00
dichgrem
d532bb0513 update:openwrt 2025-11-01 10:42:24 +08:00
dichgrem
f8247b7b65 add:mirror_workflow 2025-10-31 10:48:44 +08:00
dichgrem
b8bc69f0cb add:stm32 2025-10-29 15:20:26 +08:00
dichgrem
1be2f70fd6 update:win_auto 2025-10-29 14:57:32 +08:00
dichgrem
22e848ef8b update:docker 2025-10-24 21:53:06 +08:00
dichgrem
01cbcbf9ee update:win_4 2025-10-16 12:30:13 +08:00
dichgrem
63ea6e613b remove:gpg_key 2025-10-15 20:19:15 +08:00
dichgrem
290570c778 add:linux_1 2025-10-15 20:08:49 +08:00
dichgrem
5899eff867 update:op 2025-10-05 19:30:56 +08:00
dichgrem
8e2f579ed7 update:win_5_py 2025-09-27 14:40:07 +08:00
dichgrem
b88b56879d update:virtual 2025-09-16 20:21:11 +08:00
dichgrem
981ac7358a add:virtual 2025-09-11 14:40:02 +08:00
dichgrem
fa8f570549 update:windows-4-auto 2025-09-10 11:48:56 +08:00
dichgrem
baeda9f1f2 update:windows-1 2025-09-02 11:51:37 +08:00
dichgrem
9fad7502a3 update:android-tv 2025-08-29 21:18:45 +08:00
dichgrem
b407b86945 update:android-root 2025-08-29 11:09:02 +08:00
dichgrem
d7d9103e4d fix:cumulative_layout_shift 2025-08-28 16:00:12 +08:00
dichgrem
98728f35b2 style:color&&font 2025-08-28 15:30:48 +08:00
dichgrem
fd06c5a402 fix:index_html 2025-08-28 15:08:34 +08:00
dichgrem
a33789bb25 fix:all_tags 2025-08-28 14:51:28 +08:00
dichgrem
a49713d90f fix:scale 2025-08-28 10:48:12 +08:00
dichgrem
8147523c19 fix:page.html 2025-08-28 10:09:59 +08:00
dichgrem
a8a1f8e1a9 fix:justfile 2025-08-28 10:05:30 +08:00
dichgrem
bebfe13851 style:tabs 2025-08-28 09:58:50 +08:00
dichgrem
a910695a09 feat:add_ssh 2025-08-27 20:54:59 +08:00
dichgrem
d217308abc update:atv 2025-08-27 15:39:51 +08:00
dichgrem
f1659ca18a update:yt-dlp 2025-08-27 14:04:53 +08:00
dichgrem
dd808adc38 update:aria2 2025-08-27 10:51:04 +08:00
dichgrem
f0cbca1045 add:yt-dlp 2025-08-25 13:03:43 +08:00
dichgrem
f6543a51df update:sports 2025-08-05 21:41:34 +08:00
dichgrem
b0c2825c6b feat:add_flake 2025-08-04 19:10:59 +08:00
dichgrem
ca222a05e8 update:ventoy 2025-08-02 21:59:55 +08:00
dichgrem
e9b3d1407b update:openwrt 2025-07-26 11:29:30 +08:00
dichgrem
39282f6184 update:linux 2025-07-21 09:54:11 +08:00
dichgrem
69d74d0de3 update:openwrt 2025-07-20 14:35:09 +08:00
dichgrem
2818f64dd3 update:openwrt 2025-07-15 15:48:52 +08:00
dichgrem
19fa0be7d6 update:openwrt 2025-07-15 09:57:46 +08:00
dichgrem
534104b60c update:openwrt 2025-07-14 22:58:19 +08:00
dichgrem
ca0c9fc210 update:arch 2025-07-14 19:28:09 +08:00
dichgrem
2f77984240 update:openwrt 2025-07-14 19:12:53 +08:00
dichgrem
e1fb8ecee6 update:openwrt 2025-07-14 14:34:19 +08:00
dichgrem
3e03623d57 update:win-all 2025-07-13 20:30:53 +08:00
dichgrem
d25fc202b4 update:arch 2025-07-11 10:10:24 +08:00
dichgrem
d11e75dd3e update:links 2025-07-10 19:43:21 +08:00
dichgrem
fe9343dea7 update:arch 2025-07-10 12:07:30 +08:00
dichgrem
f75b90ee08 update:arch 2025-07-10 10:47:08 +08:00
dichgrem
6fc01e7a9d update:arch 2025-07-08 18:51:47 +08:00
Dich
3866b3b27c update:all 2025-07-05 15:03:43 +08:00
Dich
c74cf1bb3f update:android 2025-07-04 20:36:12 +08:00
Dich
51998fa861 update:blog 2025-06-18 21:26:58 +08:00
86 changed files with 4911 additions and 3246 deletions

42
.github/workflows/build.yml vendored Normal file
View File

@@ -0,0 +1,42 @@
name: Blog CI (Zola)
on:
push:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install Zola
uses: taiki-e/install-action@v2
with:
tool: zola
- name: Install Pagefind
run: |
wget https://github.com/Pagefind/pagefind/releases/download/v1.4.0/pagefind-v1.4.0-x86_64-unknown-linux-musl.tar.gz
tar xvf pagefind-v1.4.0-x86_64-unknown-linux-musl.tar.gz
sudo mv pagefind /usr/local/bin/
- name: Build Zola
run: zola build
- name: Build Pagefind
run: pagefind --site public --root-selector body
- name: Push public to dist
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./public
publish_branch: dist
force_orphan: true

View File

@@ -1,6 +1,6 @@
# Be sure to change these! # Be sure to change these!
base_url = "https://blog.dich.bid" base_url = "https://blog.dich.bid"
title = "Dich'blog" title = "Dich's Blog"
description = "用电子罗盘,转赛博核桃,勘电磁风水,寻网络龙脉" description = "用电子罗盘,转赛博核桃,勘电磁风水,寻网络龙脉"
# Sass compilation is required # Sass compilation is required
@@ -34,10 +34,10 @@ accent_color = "blue"
# One of: blue, dark, green, orange, pink, red, light, auto # One of: blue, dark, green, orange, pink, red, light, auto
# Enabling dark background will also modify primary font color to be darker. # Enabling dark background will also modify primary font color to be darker.
# Defaults to accent color (or, if not accent color specified, to blue). # Defaults to accent color (or, if not accent color specified, to blue).
background_color = "dark" background_color = "blue"
# The logo text - defaults to "Terminimal theme" # The logo text - defaults to "Terminimal theme"
logo_text = "Dich'blog" logo_text = "Dich's Blog"
# The logo link - defaults to base_url. # The logo link - defaults to base_url.
#logo_home_link = "/take/me/away!" #logo_home_link = "/take/me/away!"
@@ -55,21 +55,23 @@ author = "Dichgrem"
menu_items = [ menu_items = [
# each of these is optional, name and url are required # each of these is optional, name and url are required
# $BASE_URL is going to be substituted by base_url from configuration # $BASE_URL is going to be substituted by base_url from configuration
{name = "blog", url = "$BASE_URL"}, {name = "Blog", url = "$BASE_URL"},
# tags should only be enabled if you have "tags" taxonomy # tags should only be enabled if you have "tags" taxonomy
# see documentation below for more details # see documentation below for more details
{name = "archive", url = "$BASE_URL/archive"}, {name = "Archive", url = "$BASE_URL/archive"},
{name = "tags", url = "$BASE_URL/tags"}, {name = "Weekly", url = "$BASE_URL/weekly"},
{name = "weekly", url = "$BASE_URL/weekly"},
{name = "search", url = "$BASE_URL/search"},
{name = "about me", url = "$BASE_URL/about"},
{name = "links", url = "$BASE_URL/links"},
{name = "rss", url = "$BASE_URL/atom.xml"},
{name = "Tags", url = "$BASE_URL/tags"},
{name = "Search", url = "$BASE_URL/search"},
{name = "Links", url = "$BASE_URL/links"},
{name = "Rss", url = "$BASE_URL/atom.xml"},
{name = "About me", url = "$BASE_URL/about"},
# set newtab to true to make the link open in new tab # set newtab to true to make the link open in new tab
{name = "github", url = "https://github.com/Dichgrem", newtab = true}, {name = "My github", url = "https://github.com/Dichgrem", newtab = true},
{name = "Zola frame", url = "https://github.com/getzola/zola", newtab = true},
] ]
# Whether to show links to earlier and later (aka. higher/lower) posts # Whether to show links to earlier and later (aka. higher/lower) posts

View File

@@ -1,9 +1,9 @@
+++ +++
title = "电子邮件是如何工作的:SPF/DKIM/DMARC" title = "网络艺术:电子邮件的工作原理"
date = 2024-02-20 date = 2024-02-20
[taxonomies] [taxonomies]
tags = ["网络艺术"] tags = ["Network"]
+++ +++
前言 在互联网的日常使用中,电子邮件作为一项基础服务扮演着重要的角色。尽管在过去几十年里出现了各种新型的通讯方式,但电子邮件仍然保持着其不可替代的地位。了解电子邮件的工作原理,有助于更好地理解这一基础服务是如何运作的。 前言 在互联网的日常使用中,电子邮件作为一项基础服务扮演着重要的角色。尽管在过去几十年里出现了各种新型的通讯方式,但电子邮件仍然保持着其不可替代的地位。了解电子邮件的工作原理,有助于更好地理解这一基础服务是如何运作的。
@@ -120,7 +120,7 @@ DKIM (DomainKeys Identified Mail) 的缩写,允许发送者通过在邮件的
经过了 SPF 和 DKIM 的保证,是不是就可以完美的发送接收邮件了?其实并不能,我们通过邮件后台来看一下邮件的原始文本。 经过了 SPF 和 DKIM 的保证,是不是就可以完美的发送接收邮件了?其实并不能,我们通过邮件后台来看一下邮件的原始文本。
```` ````bash
MIME-Version: 1.0 MIME-Version: 1.0
Return-Path: xxx@fake.com Return-Path: xxx@fake.com
DKIM-Signature: d=fake.com,b=adceabkekd12 DKIM-Signature: d=fake.com,b=adceabkekd12
@@ -167,5 +167,111 @@ SPF 解决了接收方验证发件人域名 SPF 记录内 IP 地址从而验证
当邮件服务器接收到邮件时,先验证 DKIMSPF然后再根据 DMARC 的配置检查。这样就能确保最终用户看到的 `From` 字段和 SPF、DKIM 认证的发件人一致了。 当邮件服务器接收到邮件时,先验证 DKIMSPF然后再根据 DMARC 的配置检查。这样就能确保最终用户看到的 `From` 字段和 SPF、DKIM 认证的发件人一致了。
## 四.其他协议
POP3、IMAP 和 SMTP 是用于电子邮件传输的常见协议和服务,这些协议共同构成了电子邮件系统的基础,允许用户接收、发送和管理电子邮件。
1. **POP3邮局协议版本3**POP3 是一种用于接收电子邮件的协议。当你使用 POP3 时电子邮件会从服务器下载到你的设备上并且通常会从服务器上删除。这意味着邮件只存在于你的设备上而不再保留在服务器上。POP3 通常用于单一设备或者设备上少量的邮件存储需求。
2. **IMAP互联网邮件访问协议**IMAP 也是一种用于接收电子邮件的协议,但它与 POP3 不同的是IMAP 允许邮件保留在服务器上并且同步到多个设备上。这意味着无论你使用哪个设备访问邮件都能看到同样的邮件状态包括已读、未读、已删除等。IMAP 适用于需要在多个设备之间同步邮件的情况,例如在手机、平板电脑和台式电脑之间。
3. **SMTP简单邮件传输协议**SMTP 是用于发送电子邮件的协议。当你发送一封电子邮件时,你的邮件客户端会使用 SMTP 协议将邮件发送到电子邮件服务器。SMTP 负责将邮件从发送者的电子邮件客户端传送到接收者的邮件服务器。SMTP 是一个推送协议,它将邮件推送给服务器,而不是拉取邮件。
这是每个协议的简要技术原理:
### **POP3邮局协议版本3**
- 客户端连接到邮件服务器上的 POP3 端口(通常是 110 端口)。
- 客户端发送身份验证信息(通常是用户名和密码)以登录到邮箱。
- 一旦登录成功,客户端可以请求收件箱中的邮件列表。
- 客户端可以选择下载邮件到本地设备。
- 下载的邮件通常从服务器上删除,但可以根据设置保留一份副本。
- 客户端可以选择在下载后删除邮件,或者在稍后删除它们。
### **IMAP互联网邮件访问协议**
- 客户端连接到邮件服务器上的 IMAP 端口(通常是 143 端口)。
- 客户端发送身份验证信息(通常是用户名和密码)以登录到邮箱。
- 一旦登录成功,客户端可以请求收件箱中的邮件列表,以及邮件的状态信息(如已读、未读、已删除等)。
- 客户端可以选择下载完整的邮件或邮件的部分内容到本地设备,同时保留邮件在服务器上的副本。
- 客户端对邮件的操作(如标记为已读、移动到文件夹等)将反映在服务器上,从而在其他设备上同步。
### **SMTP简单邮件传输协议**
- 客户端连接到邮件服务器上的 SMTP 端口(通常是 25 端口)。
- 客户端发送邮件内容和邮件头信息(如发件人、收件人、主题等)给服务器。
- 服务器接受邮件,并将其转发到接收者的邮件服务器。
- 接收者的邮件服务器接收邮件,并将其存储在相应的收件人邮箱中。
- SMTP 是一个简单的推送协议,它负责将邮件从发送方传送到接收方,但不涉及接收方对邮件的确认或响应。
### **它们的区别和共同点:**
**区别:**
**功能:**
- POP3 主要用于从邮件服务器上下载邮件到本地设备,通常会将邮件从服务器上删除。
- IMAP 允许用户在多个设备之间同步邮件状态,并且邮件保留在服务器上。
- SMTP 用于发送电子邮件。
**邮件管理:**
- POP3 在客户端下载邮件后通常会将邮件从服务器上删除,因此邮件只存在于本地设备上。
- IMAP 允许邮件在多个设备之间同步,因为邮件保留在服务器上。
- SMTP 不管理邮件存储,它只是负责将邮件从发送方传送到接收方。
**端口号:**
- POP3 默认端口号是 110。
- IMAP 默认端口号是 143。
- SMTP 默认端口号是 25。
**操作方式:**
- POP3 是拉取协议,客户端需要主动连接到服务器并拉取邮件。
- IMAP 是双向同步协议,客户端与服务器之间进行交互,可以同步邮件状态。
- SMTP 是推送协议,用于将邮件从发送方传送到接收方。
**共同点:**
- **用途:**:它们都是用于电子邮件传输的标准协议。
- **与邮件服务器的通信:**:它们都涉及客户端与邮件服务器之间的通信。
- **身份验证:**:它们都需要用户身份验证来访问邮箱。
### **一次完整的邮件通信过程**
**发送方(发件人):**
- **撰写邮件:** 发件人使用邮件客户端如Outlook、Gmail等撰写邮件并填写收件人的电子邮件地址、主题和邮件内容。
- **SPF 检查:** 发送邮件服务器可能会执行 SPFSender Policy Framework检查。它查询发件人域名的 DNS 记录,以确认发送邮件的服务器是否被授权发送邮件。
- **DKIM 签名:** 发送邮件服务器对邮件进行 DKIMDomainKeys Identified Mail签名。它使用发件人域名的私钥对邮件进行加密签名以确保邮件内容在传输过程中不被篡改。
- **SMTP 发送邮件:** 发送邮件服务器使用 SMTP简单邮件传输协议将邮件发送到接收邮件服务器。SMTP 服务器与接收邮件服务器之间建立连接,并通过指定的端口(通常是 25 端口)传输邮件。
**接收方(收件人):**
- **SMTP 接收邮件:** 接收邮件服务器接收到发送方发送的邮件。SMTP 协议负责将邮件从发送方传输到接收方。
- **SPF 验证:** 接收邮件服务器执行 SPF 验证,检查发送方服务器的 IP 地址是否在发件人域名的 SPF 记录中被授权发送邮件。
- **DKIM 验证:** 接收邮件服务器对收到的邮件执行 DKIM 验证。它使用发件人域名的公钥来验证邮件的 DKIM 签名,以确保邮件内容的完整性和真实性。
- **DMARC 检查:** 如果接收邮件服务器支持 DMARCDomain-based Message Authentication, Reporting, and Conformance它会执行 DMARC 检查。DMARC 结合了 SPF 和 DKIM允许域名所有者指定如何处理未通过验证的邮件。
- **投递邮件到邮箱:** 如果邮件通过了所有的验证步骤,并且没有被识别为垃圾邮件,接收邮件服务器将把邮件投递到收件人的邮箱中。
**邮件获取(收件人):**
- **POP3 获取邮件(可选):** 收件人可以使用 POP3邮局协议版本3从邮件服务器上下载邮件到本地设备。POP3 客户端通过指定的端口(通常是 110 端口)连接到邮件服务器,并下载邮件到本地设备上。根据设置,邮件可能会从服务器上删除。
- **IMAP 获取邮件(可选):** 收件人可以使用 IMAP互联网邮件访问协议从邮件服务器上获取邮件。IMAP 允许邮件保留在服务器上并且在多个设备之间同步邮件状态。IMAP 客户端通过指定的端口(通常是 143 端口)连接到邮件服务器,并获取邮件列表和邮件内容。
---
**Done.**

View File

@@ -1,114 +1,100 @@
+++ +++
title = "电子邮件是如何工作的:POP3/IMAP/SMTP" title = "网络艺术:自建域名邮箱"
date = 2024-02-21 date = 2024-02-22
[taxonomies] [taxonomies]
tags = ["网络艺术"] tags = ["Network"]
+++ +++
前言 POP3、IMAP 和 SMTP 是用于电子邮件传输的常见协议和服务,这些协议共同构成了电子邮件系统的基础,允许用户接收、发送和管理电子邮件 前言 poste.io 邮件服务基于 Docker 搭建,用的是 Haraka + Dovecot + SQLite 邮件系统,占用资源较少,安装简单,适合个人使用
<!-- more --> <!-- more -->
1. **POP3邮局协议版本3**POP3 是一种用于接收电子邮件的协议。当你使用 POP3 时电子邮件会从服务器下载到你的设备上并且通常会从服务器上删除。这意味着邮件只存在于你的设备上而不再保留在服务器上。POP3 通常用于单一设备或者设备上少量的邮件存储需求。 ## VPS上的配置
2. **IMAP互联网邮件访问协议**IMAP 也是一种用于接收电子邮件的协议,但它与 POP3 不同的是IMAP 允许邮件保留在服务器上并且同步到多个设备上。这意味着无论你使用哪个设备访问邮件都能看到同样的邮件状态包括已读、未读、已删除等。IMAP 适用于需要在多个设备之间同步邮件的情况,例如在手机、平板电脑和台式电脑之间。
3. **SMTP简单邮件传输协议**SMTP 是用于发送电子邮件的协议。当你发送一封电子邮件时,你的邮件客户端会使用 SMTP 协议将邮件发送到电子邮件服务器。SMTP 负责将邮件从发送者的电子邮件客户端传送到接收者的邮件服务器。SMTP 是一个推送协议,它将邮件推送给服务器,而不是拉取邮件。
这是每个协议的简要技术原理: ### 修改VPS hostname
```bash
## **POP3邮局协议版本3** hostnamectl set-hostname mail.your-domain.com
```
- 客户端连接到邮件服务器上的 POP3 端口(通常是 110 端口)。 ### 修改hosts文件
- 客户端发送身份验证信息(通常是用户名和密码)以登录到邮箱。 ```bash
- 一旦登录成功,客户端可以请求收件箱中的邮件列表。 vim /etc/hosts
- 客户端可以选择下载邮件到本地设备。 ```
- 下载的邮件通常从服务器上删除,但可以根据设置保留一份副本。 添加一行
- 客户端可以选择在下载后删除邮件,或者在稍后删除它们。 ```bash
127.0.1.1 localhost.localdomain mail.your-domain.com
## **IMAP互联网邮件访问协议** ```
- 客户端连接到邮件服务器上的 IMAP 端口(通常是 143 端口)。
- 客户端发送身份验证信息(通常是用户名和密码)以登录到邮箱。
- 一旦登录成功,客户端可以请求收件箱中的邮件列表,以及邮件的状态信息(如已读、未读、已删除等)。
- 客户端可以选择下载完整的邮件或邮件的部分内容到本地设备,同时保留邮件在服务器上的副本。
- 客户端对邮件的操作(如标记为已读、移动到文件夹等)将反映在服务器上,从而在其他设备上同步。
## **SMTP简单邮件传输协议**
- 客户端连接到邮件服务器上的 SMTP 端口(通常是 25 端口)。
- 客户端发送邮件内容和邮件头信息(如发件人、收件人、主题等)给服务器。
- 服务器接受邮件,并将其转发到接收者的邮件服务器。
- 接收者的邮件服务器接收邮件,并将其存储在相应的收件人邮箱中。
- SMTP 是一个简单的推送协议,它负责将邮件从发送方传送到接收方,但不涉及接收方对邮件的确认或响应。
## **它们的区别和共同点:**
**区别:** ## 安装poste
**功能:** docker compose文件示例
- POP3 主要用于从邮件服务器上下载邮件到本地设备,通常会将邮件从服务器上删除。 ```yaml
- IMAP 允许用户在多个设备之间同步邮件状态,并且邮件保留在服务器上。 version: '3.7'
- SMTP 用于发送电子邮件。
**邮件管理:** services:
mailserver:
image: analogic/poste.io
hostname: mail.your-domain.com
ports:
- "25:25"
- "110:110"
- "143:143"
- "587:587"
- "993:993"
- "995:995"
- "4190:4190"
- "465:465"
- "127.0.0.1:8808:80"
- "127.0.0.1:8843:443"
environment:
- LETSENCRYPT_EMAIL=admin@your-domain.com
- LETSENCRYPT_HOST=mail.your-domain.com
- VIRTUAL_HOST=mail.your-domain.com
- DISABLE_CLAMAV=TRUE
- TZ=Asia/Shanghai
- HTTPS=OFF
volumes:
- /etc/localtime:/etc/localtime:ro
- ./mail-data:/data
```
- POP3 在客户端下载邮件后通常会将邮件从服务器上删除,因此邮件只存在于本地设备上 - 禁用反病毒功能DISABLE_CLAMAV=TRUE、禁用反垃圾邮件功能DISABLE_RSPAMD=TRUE可以大幅减低内存和CPU占用请酌情设置禁用选项
- IMAP 允许邮件在多个设备之间同步,因为邮件保留在服务器上。
- SMTP 不管理邮件存储,它只是负责将邮件从发送方传送到接收方。
**端口号:** - 禁用WEB收发功能DISABLE_ROUNDCUBE=TRUE可以进一步减少资源占用不过非必要不建议禁止。
- POP3 默认端口号是 110 - 8808为http端口可以根据自己的需求修改
- IMAP 默认端口号是 143。
- SMTP 默认端口号是 25。
**操作方式:** ## Dns配置
- POP3 是拉取协议,客户端需要主动连接到服务器并拉取邮件。
- IMAP 是双向同步协议,客户端与服务器之间进行交互,可以同步邮件状态。
- SMTP 是推送协议,用于将邮件从发送方传送到接收方。
**共同点:** | 记录类型 | 主机记录 | 记录值 |
|----------|----------|----------|
| A | mail | 1.2.3.4 (your ip) |
| MX | your-domain.com | mail.your-domain.com |
| TXT | your-domain.com | v=spf1 mx ~all |
| TXT | _s20160910378._domainkey.your-domain.com | k=rsa;p=MII.........|
| TXT | _dmarc | v=DMARC1; p=none; pct=100; rua=mailto:mail@your-domain.com |
| CNAME | imap | mail |
| CNAME | smtp | mail |
| CNAME | pop | mail |
- **用途:**:它们都是用于电子邮件传输的标准协议 最后还需到 VPS 服务商处添加一个反向 DNS也就是 rDNS 解析,把 IP 解析到 mail.your-domain.com 这个域名,有些 VPS 商家不提供这种服务,所以需要选择好VPS服务商
- **与邮件服务器的通信:**:它们都涉及客户端与邮件服务器之间的通信。 ## 配置poste
- **身份验证:**:它们都需要用户身份验证来访问邮箱。 通过浏览器访问``https://mail.your-domain.com/admin/login``进入poste.io的配置页面按照提示进行配置然后点击 Generate new key生成 key添加到 DNS 解析记录,就是上面最后一条解析``_s20160910378._domainkey.your-domain.com``
## **一次完整的邮件通信过程** ## 第三方客户端 SMTP/IMAP/POP3 配置
搭建完毕之后我们也可以通过客户端软件连接到我们的邮箱如thunderbird.
**发送方(发件人):** | 协议 | 服务器地址 | 端口 | SSL |
|------|------------|------|-----|
- **撰写邮件:** 发件人使用邮件客户端如Outlook、Gmail等撰写邮件并填写收件人的电子邮件地址、主题和邮件内容。 | SMTP | mail.your-domain.com, smtp.your-domain.com | 25, 465, 587 | STARTTLS |
| IMAP | mail.your-domain.com, imap.your-domain.com | 993, 143 | STARTTLS |
- **SPF 检查:** 发送邮件服务器可能会执行 SPFSender Policy Framework检查。它查询发件人域名的 DNS 记录,以确认发送邮件的服务器是否被授权发送邮件。 | POP3 | mail.your-domain.com, pop.your-domain.com | 995, 110 | STARTTLS |
- **DKIM 签名:** 发送邮件服务器对邮件进行 DKIMDomainKeys Identified Mail签名。它使用发件人域名的私钥对邮件进行加密签名以确保邮件内容在传输过程中不被篡改。
- **SMTP 发送邮件:** 发送邮件服务器使用 SMTP简单邮件传输协议将邮件发送到接收邮件服务器。SMTP 服务器与接收邮件服务器之间建立连接,并通过指定的端口(通常是 25 端口)传输邮件。
**接收方(收件人):**
- **SMTP 接收邮件:** 接收邮件服务器接收到发送方发送的邮件。SMTP 协议负责将邮件从发送方传输到接收方。
- **SPF 验证:** 接收邮件服务器执行 SPF 验证,检查发送方服务器的 IP 地址是否在发件人域名的 SPF 记录中被授权发送邮件。
- **DKIM 验证:** 接收邮件服务器对收到的邮件执行 DKIM 验证。它使用发件人域名的公钥来验证邮件的 DKIM 签名,以确保邮件内容的完整性和真实性。
- **DMARC 检查:** 如果接收邮件服务器支持 DMARCDomain-based Message Authentication, Reporting, and Conformance它会执行 DMARC 检查。DMARC 结合了 SPF 和 DKIM允许域名所有者指定如何处理未通过验证的邮件。
- **投递邮件到邮箱:** 如果邮件通过了所有的验证步骤,并且没有被识别为垃圾邮件,接收邮件服务器将把邮件投递到收件人的邮箱中。
**邮件获取(收件人):**
- **POP3 获取邮件(可选):** 收件人可以使用 POP3邮局协议版本3从邮件服务器上下载邮件到本地设备。POP3 客户端通过指定的端口(通常是 110 端口)连接到邮件服务器,并下载邮件到本地设备上。根据设置,邮件可能会从服务器上删除。
- **IMAP 获取邮件(可选):** 收件人可以使用 IMAP互联网邮件访问协议从邮件服务器上获取邮件。IMAP 允许邮件保留在服务器上并且在多个设备之间同步邮件状态。IMAP 客户端通过指定的端口(通常是 143 端口)连接到邮件服务器,并获取邮件列表和邮件内容。
这是一个完整的双向邮件通信过程,包括了 SPF、DKIM、DMARC以及 POP3、IMAP、SMTP 协议的作用。这些技术和协议共同构成了电子邮件系统的基础架构,保障了邮件的传输安全性和可靠性。
---
Done.

View File

@@ -1,100 +0,0 @@
+++
title = "电子邮件是如何工作的:自建域名邮箱"
date = 2024-02-22
[taxonomies]
tags = ["网络艺术"]
+++
前言 poste.io 邮件服务基于 Docker 搭建,用的是 Haraka + Dovecot + SQLite 邮件系统,占用资源较少,安装简单,适合个人使用。
<!-- more -->
## VPS上的配置
### 修改VPS hostname
```
hostnamectl set-hostname mail.your-domain.com
```
### 修改hosts文件
```
vim /etc/hosts
```
添加一行
```
127.0.1.1 localhost.localdomain mail.your-domain.com
```
## 安装poste
docker compose文件示例
```
version: '3.7'
services:
mailserver:
image: analogic/poste.io
hostname: mail.your-domain.com
ports:
- "25:25"
- "110:110"
- "143:143"
- "587:587"
- "993:993"
- "995:995"
- "4190:4190"
- "465:465"
- "127.0.0.1:8808:80"
- "127.0.0.1:8843:443"
environment:
- LETSENCRYPT_EMAIL=admin@your-domain.com
- LETSENCRYPT_HOST=mail.your-domain.com
- VIRTUAL_HOST=mail.your-domain.com
- DISABLE_CLAMAV=TRUE
- TZ=Asia/Shanghai
- HTTPS=OFF
volumes:
- /etc/localtime:/etc/localtime:ro
- ./mail-data:/data
```
- 禁用反病毒功能DISABLE_CLAMAV=TRUE、禁用反垃圾邮件功能DISABLE_RSPAMD=TRUE可以大幅减低内存和CPU占用请酌情设置禁用选项。
- 禁用WEB收发功能DISABLE_ROUNDCUBE=TRUE可以进一步减少资源占用不过非必要不建议禁止。
- 8808为http端口可以根据自己的需求修改。
## Dns配置
| 记录类型 | 主机记录 | 记录值 |
|----------|----------|----------|
| A | mail | 1.2.3.4 (your ip) |
| MX | your-domain.com | mail.your-domain.com |
| TXT | your-domain.com | v=spf1 mx ~all |
| TXT | _s20160910378._domainkey.your-domain.com | k=rsa;p=MII.........|
| TXT | _dmarc | v=DMARC1; p=none; pct=100; rua=mailto:mail@your-domain.com |
| CNAME | imap | mail |
| CNAME | smtp | mail |
| CNAME | pop | mail |
最后还需到 VPS 服务商处添加一个反向 DNS也就是 rDNS 解析,把 IP 解析到 mail.your-domain.com 这个域名,有些 VPS 商家不提供这种服务,所以需要选择好VPS服务商。
## 配置poste
通过浏览器访问``https://mail.your-domain.com/admin/login``进入poste.io的配置页面按照提示进行配置然后点击 Generate new key生成 key添加到 DNS 解析记录,就是上面最后一条解析``_s20160910378._domainkey.your-domain.com``
## 第三方客户端 SMTP/IMAP/POP3 配置
搭建完毕之后我们也可以通过客户端软件连接到我们的邮箱如thunderbird.
| 协议 | 服务器地址 | 端口 | SSL |
|------|------------|------|-----|
| SMTP | mail.your-domain.com, smtp.your-domain.com | 25, 465, 587 | STARTTLS |
| IMAP | mail.your-domain.com, imap.your-domain.com | 993, 143 | STARTTLS |
| POP3 | mail.your-domain.com, pop.your-domain.com | 995, 110 | STARTTLS |
---
Done.

View File

@@ -1,9 +1,9 @@
+++ +++
title = "Network的艺术:国内国际骨干ISP线路整理" title = "网络艺术:国内/国际骨干ISP线路整理"
date = 2024-02-10 date = 2024-02-10
[taxonomies] [taxonomies]
tags = ["网络艺术"] tags = ["Network"]
+++ +++
前言 本文主要探讨的是IPv4网络国际出口线路的质量分析以及各大ISP的介绍。 前言 本文主要探讨的是IPv4网络国际出口线路的质量分析以及各大ISP的介绍。
@@ -68,7 +68,7 @@ nexttrace --queries 3 --parallel-requests 4 example.com
nexttrace --table --no-rdns www.example.org nexttrace --table --no-rdns www.example.org
``` ```
### 示例 ### 示例
``` ```bash
nexttrace 38.207.170.5x nexttrace 38.207.170.5x
NextTrace v1.4.0 2025-04-16T01:10:07Z dccc41b NextTrace v1.4.0 2025-04-16T01:10:07Z dccc41b
[NextTrace API] preferred API IP - 198.18.0.61 - 601.41ms - 🐠 (Relay) → Misaka.HKG [NextTrace API] preferred API IP - 198.18.0.61 - 601.41ms - 🐠 (Relay) → Misaka.HKG
@@ -424,4 +424,4 @@ Telia在美国、欧洲都有和电信163互联总体来说是很中规中矩
需要注意的是,欧洲/北美的网络情况跟亚太差异比较大。欧美的中小ISP大部分依靠的是IX互联或者机房托管的混合网络接入。虽然商业网络的价格比亚洲地区便宜但至少对中国用户来说很少再回程路由中遇见欧美的Regional T1或者高质量T1 ISP。 需要注意的是,欧洲/北美的网络情况跟亚太差异比较大。欧美的中小ISP大部分依靠的是IX互联或者机房托管的混合网络接入。虽然商业网络的价格比亚洲地区便宜但至少对中国用户来说很少再回程路由中遇见欧美的Regional T1或者高质量T1 ISP。
--- ---
**Done.** **Done.**

238
content/Network-aria2.md Normal file
View File

@@ -0,0 +1,238 @@
+++
title = "下载系列(3):Aria2使用指南"
date = 2025-04-15
[taxonomies]
tags = ["Network"]
+++
前言 Aria2是一款开源、跨平台的命令行界面下载管理器常常被各种下载器软件使用。
<!-- more -->
## 介绍
在上网的时候我们可能需要下载一些东西而浏览器自带的下载比较缓慢。为此许多人安装了类似IDM或者Motrix等等软件用多线程来加速下载。其实许多开源的下载器就是Aria2的前端我们可以直接使用Aria2进行下载。
[Aria2](https://github.com/aria2/aria2)是一款开源、跨平台的命令行界面下载管理器,支持的下载协议有:``HTTP、HTTPS、FTP、Bittorrent 和 Metalink``。它以高效、轻量和灵活著称,适用于需要批量下载、自动化任务或远程控制的用户。
Aria2 有以下几个特点:
- ``多连接下载``:可以从多个来源/协议下载文件并尝试利用您的最大下载带宽,真正加快您的下载体验;
- ``轻量``:不需要太多内存和 CPU 时间;
- ``全功能的 BitTorrent 客户端``BitTorrent 客户端的所有功能都可用,,如 DHT、PEX、加密、Magnet URI、网络播种、选择性下载、本地对等发现和 UDP 跟踪器;
- ``支持Metalink``:支持 Metalink 下载描述格式。 在下载中使用 Metalink 数据块的校验和自动验证下载的数据部分;
- ``远程控制``:支持 RPC 接口来控制 aria2 进程。 支持的接口是 JSON-RPC通过 HTTP 和 WebSocket和 XML-RPC。
要**使用Aria2来替代浏览器自带的下载**,一般需要三个条件:
1. 在系统中安装Aria2,并设置环境变量和开机自启;
2. 让Aria2接管浏览器的下载
3. 需要一个前端面板来更方便的控制Aria2(可选).
## 安装
### Windows
首先下载[aria2-1.37.0-win-64bit-build1.zip](https://github.com/aria2/aria2/releases/tag/release-1.37.0),将下载好的文件解压并放到你喜欢的目录下,设置系统环境变量,类似``D:\DATA\Data\AriaNg-1.3.10-AllInOne``,随后即可在 CMD 中使用``aria2c -v``查看Aria2 。
然后创建一个配置文件``C:\Users\<你>\.aria2\aria2.conf``,内容如下:
```conf
# 下载目录
dir=C:/Users/<你>/Downloads
# 断点续传
continue=true
file-allocation=prealloc
# RPC 设置
enable-rpc=true
rpc-listen-all=true
rpc-allow-origin-all=true
rpc-listen-port=6800
rpc-secret=<你的密码>
```
随后在这个项目中[winsw](https://github.com/winsw/winsw)下载 WinSW-x64.exe到一个目录并重命名为 aria2-service.exe并在同目录下创建``aria2-service.xml``,内容如下:
```xml
<service>
<id>aria2</id>
<name>Aria2 Service</name>
<description>Aria2 Download Manager</description>
<executable>C:\Users\<你>\scoop\apps\aria2\current\aria2c.exe</executable>
<arguments>--conf-path=C:\Users\<你>\.aria2\aria2.conf</arguments>
</service>
```
随后使用``.\aria2-service.exe install``安装服务,并使用``.\aria2-service.exe start``启动服务类似linux上的systemctl.
> 注意修改用户名!
### Arch linux
Arch linux 和大部分常规发行版可以适用此方法。
首先安装aria2本体:
```bash
paru -S aria2
```
随后创建配置文件
```bash
nano /home/<you-username>/.config/aria2/aria2.conf
```
内容为
```conf
enable-rpc=true
rpc-listen-all=true
rpc-allow-origin-all=true
rpc-listen-port=6800
continue=true
dir=/home/<you-username>/Downloads
input-file=/home/<you-username>/.config/aria2/aria2.session
save-session=/home/<you-username>/.config/aria2/aria2.session
save-session-interval=60
```
保存退出;随后创建守护进程以便开机自启动:
```bash
nano ~/.config/systemd/user/aria2.service
```
写入:
```conf
[Unit]
Description=Aria2 Daemon
After=network.target
[Service]
ExecStart=/usr/bin/aria2c --conf-path=/home/<you-username>/.config/aria2/aria2.conf
Restart=on-failure
[Install]
WantedBy=default.target
```
在更新配置文件和服务文件后,执行以下命令以重启服务:
```bash
systemctl --user daemon-reload
systemctl --user enable aria2.service
systemctl --user start aria2.service
```
使用以下命令检查服务状态:
```bash
systemctl --user status aria2.service
```
### Nixos
```nix
{ lib, pkgs, username, ... }:
{
services.aria2.enable = false;
systemd.services.aria2 = {
description = "Aria2 Download Manager (dich)";
after = [ "network.target" ];
wants = [ "network.target" ];
wantedBy = [ "multi-user.target" ];
serviceConfig = {
Type = "simple";
User = username;
ExecStartPre = [
"${pkgs.coreutils}/bin/mkdir -p /home/${username}/.config/aria2"
"${pkgs.coreutils}/bin/touch /home/${username}/.config/aria2/aria2.session"
];
ExecStart = "${pkgs.aria2}/bin/aria2c --conf-path=/home/${username}/.config/aria2/aria2.conf";
Restart = "always";
RestartSec = "5s";
NoNewPrivileges = true;
PrivateTmp = true;
};
};
}
```
## 命令行用法
如果你不想用浏览器插件或者面板,也可以直接使用命令行操作:
```bash
aria2c [选项] [URL | 磁力链接 | .torrent文件]
```
### 例子:
1. **下载单个文件**
```bash
aria2c https://example.com/file.iso
```
2. **指定保存路径和文件名**
```bash
aria2c -d ~/Downloads -o ubuntu.iso https://releases.ubuntu.com/24.04/ubuntu.iso
```
3. **同时下载多个文件**
```bash
aria2c https://example.com/file1.zip https://example.com/file2.zip
```
4. **从文件读取 URL 列表**
```bash
aria2c -i urls.txt
```
`urls.txt` 每行一个链接)
7. **下载 torrent 文件**
```bash
aria2c ubuntu.torrent
```
8. **下载磁力链接**
```bash
aria2c "magnet:?xt=urn:btih:xxxxx..."
```
9. **限制 BT 上传**
```bash
aria2c --max-upload-limit=50K ubuntu.torrent
```
## 浏览器插件
如果你想让其直接接管浏览器下载,可以使用以下几种浏览器插件,它们都自带面板:
**Chrome 浏览器**
- [Aria2 Explorer](https://github.com/alexhua/Aria2-Explorer)是一款功能强大的扩展能够自动拦截浏览器下载任务并自带Aria2-NG面板。
**Firefox 浏览器**
- [Aria2-Integration](https://github.com/RossWang/Aria2-Integration?tab=readme-ov-file)也是一款 Firefox 拓展,拦截下载任务的同时带有 Aria2-NG面板方便使用。
> 注意如果你前面配置中设置了rpc的密码需要在面板中也写入才可连接成功。
![aria2-rpc](/images/aria2-rpc.webp)
## 面板
如果你不想使用浏览器插件也可以使用aria2+独立面板的方法,但这样就不能接管浏览器的下载,适合其他环境使用。
这里推荐使用 AriaNg 前端AriaNg 使用纯 html & javascript 开发, 所以其不需要任何编译器或运行环境.
![ariang-1](https://raw.githubusercontent.com/mayswind/AriaNg-WebSite/master/screenshots/desktop.png)
AriaNg 现在提供三种版本, ``标准版、单文件版和 AriaNg Native. ``标准版适合在 Web 服务器中部署, 提供资源缓存和按需加载的功能. 单文件版适合本地使用, 您下载后只要在浏览器中打开唯一的 html 文件即可. AriaNg Native 同样适合本地使用, 并且不需要使用浏览器.这里``建议使用单文件版或者Native版``,下之后打开其中的html并设为书签即可。
[单文件版(AllinOne)](https://github.com/mayswind/AriaNg/releases)
[Native版](https://github.com/mayswind/AriaNg-Native/releases/tag/1.3.10)
---
**Done.**

View File

@@ -1,9 +1,9 @@
+++ +++
title = "Network的艺术:CDN技术与应用" title = "网络艺术:CDN技术与应用"
date = 2024-02-16 date = 2024-02-16
[taxonomies] [taxonomies]
tags = ["网络艺术"] tags = ["Network"]
+++ +++
前言 内容分发网络CDN是一组分布在不同地理位置的服务器网络,使用户能够就近获取内容,从而降低延迟并缓解源站压力​. 前言 内容分发网络CDN是一组分布在不同地理位置的服务器网络,使用户能够就近获取内容,从而降低延迟并缓解源站压力​.
@@ -182,7 +182,7 @@ Netlify在考虑到CDN成本以及可用性的情况下选择了以下这些地
> 需要注意的是有些CDN的回源IP并不用作节点IP比如Cloudflare的回源IP仅作回源IP使用如果要获取Cloudflare的节点IP可前往https://bgp.tools/as/13335#prefixes。而有些CDN的回源IP同时被用作CDN节点比如BunnyCDN和Gcore CDN。 > 需要注意的是有些CDN的回源IP并不用作节点IP比如Cloudflare的回源IP仅作回源IP使用如果要获取Cloudflare的节点IP可前往https://bgp.tools/as/13335#prefixes。而有些CDN的回源IP同时被用作CDN节点比如BunnyCDN和Gcore CDN。
Cloudflare Cloudflare
``` ```bash
# https://www.cloudflare.com/ips-v4 # https://www.cloudflare.com/ips-v4
103.21.244.0/22 103.21.244.0/22
103.22.200.0/22 103.22.200.0/22
@@ -210,46 +210,46 @@ Cloudflare
2c0f:f248::/32 2c0f:f248::/32
``` ```
Gcore Gcore
``` ```bash
https://api.gcore.com/cdn/public-ip-list https://api.gcore.com/cdn/public-ip-list
``` ```
BunnyCDN BunnyCDN
``` ```bash
https://api.bunny.net/system/edgeserverlist https://api.bunny.net/system/edgeserverlist
https://api.bunny.net/system/edgeserverlist/plain https://api.bunny.net/system/edgeserverlist/plain
``` ```
Cloudfront Cloudfront
``` ```bash
https://d7uri8nf7uskq.cloudfront.net/tools/list-cloudfront-ips https://d7uri8nf7uskq.cloudfront.net/tools/list-cloudfront-ips
https://files.imunify360.com/static/whitelist/v2/cloudfront-cdn.txt https://files.imunify360.com/static/whitelist/v2/cloudfront-cdn.txt
``` ```
CDN77 CDN77
``` ```bash
https://files.imunify360.com/static/whitelist/v2/cdn77.txt https://files.imunify360.com/static/whitelist/v2/cdn77.txt
``` ```
Fastly Fastly
``` ```bash
https://api.fastly.com/public-ip-list https://api.fastly.com/public-ip-list
``` ```
Keycdn Keycdn
``` ```bash
https://www.keycdn.com/shield-prefixes.json https://www.keycdn.com/shield-prefixes.json
``` ```
quic.cloud quic.cloud
``` ```bash
https://quic.cloud/ips https://quic.cloud/ips
``` ```
Google CDN Google CDN
``` ```bash
https://files.imunify360.com/static/whitelist/v2/google-cdn.txt https://files.imunify360.com/static/whitelist/v2/google-cdn.txt
``` ```
CacheFly CacheFly
``` ```bash
https://cachefly.cachefly.net/ips/cdn.txt https://cachefly.cachefly.net/ips/cdn.txt
``` ```
Akaima Akaima
``` ```bash
https://techdocs.akamai.com/origin-ip-acl/docs/update-your-origin-server https://techdocs.akamai.com/origin-ip-acl/docs/update-your-origin-server
``` ```
--- ---
**Done.** **Done.**

View File

@@ -1,9 +1,9 @@
+++ +++
title = "Network的艺术:Docker建站与反向代理" title = "网络艺术:Docker建站与反向代理"
date = 2024-07-14 date = 2024-07-14
[taxonomies] [taxonomies]
tags = ["网络艺术"] tags = ["Network"]
+++ +++
前言 Docker的出现极大简化了建站流程较过去的LAMP方式优雅了许多配合Nginx反向代理可以快速上线HTTPS站点。 前言 Docker的出现极大简化了建站流程较过去的LAMP方式优雅了许多配合Nginx反向代理可以快速上线HTTPS站点。
@@ -13,7 +13,7 @@ tags = ["网络艺术"]
这里以Debian12为例 这里以Debian12为例
- 官方安装脚本: - 官方安装脚本:
``` ```bash
curl -fsSL https://get.docker.com -o get-docker.sh curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh sudo sh get-docker.sh
``` ```
@@ -21,31 +21,31 @@ sudo sh get-docker.sh
使用以下命令安装此方法的先决条件: 使用以下命令安装此方法的先决条件:
```` ````bash
sudo apt update && sudo apt install ca-certificates curl gnupg sudo apt update && sudo apt install ca-certificates curl gnupg
```` ````
创建一个目录来存储密钥环: 创建一个目录来存储密钥环:
```` ````bash
sudo install -m 0755 -d /etc/apt/keyrings sudo install -m 0755 -d /etc/apt/keyrings
```` ````
使用给定的命令下载 GPG 密钥并将其存储在 `/etc/apt/keyrings/etc/apt/keyrings` 目录中: 使用给定的命令下载 GPG 密钥并将其存储在 `/etc/apt/keyrings/etc/apt/keyrings` 目录中:
```` ````bash
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
```` ````
使用 chmod 命令更改 docker.gpg 文件的权限: 使用 chmod 命令更改 docker.gpg 文件的权限:
```` ````bash
sudo chmod a+r /etc/apt/keyrings/docker.gpg sudo chmod a+r /etc/apt/keyrings/docker.gpg
```` ````
使用以下命令为 Docker 设置存储库: 使用以下命令为 Docker 设置存储库:
```` ````bash
echo \ echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \ "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \ "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
@@ -53,17 +53,175 @@ echo \
```` ````
现在可以使用以下命令更新存储库索引并安装 Docker 现在可以使用以下命令更新存储库索引并安装 Docker
```` ````bash
sudo apt update && sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin sudo apt update && sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
```` ````
## 常用命令
### 基础命令
| 命令 | 说明 |
| ------------------------- | ------------------------ |
| `docker version` | 查看 Docker 版本信息 |
| `docker info` | 查看 Docker 系统信息,包括镜像和容器数量 |
| `docker help` | 查看帮助信息 |
| `docker <command> --help` | 查看某个命令的详细帮助 |
---
### 镜像相关命令Images
| 命令 | 说明 |
| ---------------------------------- | ----------------- |
| `docker images` | 列出本地所有镜像 |
| `docker search nginx` | 从 Docker Hub 搜索镜像 |
| `docker pull nginx:latest` | 拉取镜像 |
| `docker rmi nginx:latest` | 删除镜像 |
| `docker rmi $(docker images -q)` | 删除所有镜像 |
| `docker inspect nginx` | 查看镜像详细信息 |
| `docker tag nginx myrepo/nginx:v1` | 给镜像打标签 |
| `docker save -o nginx.tar nginx` | 导出镜像为 tar 包 |
| `docker load -i nginx.tar` | 从 tar 文件加载镜像 |
---
### 容器管理命令Containers
| 命令 | 说明 |
| --------------------------------------------- | ----------------- |
| `docker ps` | 查看正在运行的容器 |
| `docker ps -a` | 查看所有容器(包括已停止) |
| `docker run -d -p 80:80 --name web nginx` | 启动容器(后台运行) |
| `docker run -it ubuntu /bin/bash` | 启动交互式容器 |
| `docker exec -it web bash` | 进入正在运行的容器 |
| `docker logs -f web` | 查看容器日志(`-f` 实时输出) |
| `docker stop web` | 停止容器 |
| `docker start web` | 启动容器 |
| `docker restart web` | 重启容器 |
| `docker rm web` | 删除容器 |
| `docker rm $(docker ps -aq)` | 删除所有容器 |
| `docker inspect web` | 查看容器详细信息 |
| `docker stats` | 查看容器资源使用情况 |
| `docker top web` | 查看容器内运行的进程 |
| `docker cp web:/path/in/container ./localdir` | 从容器复制文件到主机 |
| `docker cp ./file web:/path/in/container` | 从主机复制文件到容器 |
---
### 网络相关命令Networks
| 命令 | 说明 |
| ------------------------------------- | -------- |
| `docker network ls` | 列出所有网络 |
| `docker network inspect bridge` | 查看网络详情 |
| `docker network create mynet` | 创建自定义网络 |
| `docker network connect mynet web` | 将容器连接到网络 |
| `docker network disconnect mynet web` | 将容器从网络断开 |
| `docker network rm mynet` | 删除网络 |
---
### 数据卷Volumes
| 命令 | 说明 |
| ---------------------------------- | ---------- |
| `docker volume ls` | 查看所有卷 |
| `docker volume create mydata` | 创建数据卷 |
| `docker volume inspect mydata` | 查看卷详情 |
| `docker volume rm mydata` | 删除数据卷 |
| `docker run -v mydata:/data nginx` | 启动容器并挂载卷 |
| `docker run -v $(pwd):/app nginx` | 挂载主机目录到容器中 |
---
### 构建与导出镜像Build & Export
| 命令 | 说明 |
| --------------------------------------- | ------------ |
| `docker build -t myapp:latest .` | 构建镜像 |
| `docker commit web myimage:v1` | 将容器保存为镜像 |
| `docker save -o myimage.tar myimage:v1` | 导出镜像文件 |
| `docker load -i myimage.tar` | 导入镜像文件 |
| `docker export web > web.tar` | 导出容器文件系统 |
| `docker import web.tar myweb:v1` | 从 tar 文件导入镜像 |
---
### 系统清理与维护
| 命令 | 说明 |
| ------------------------ | --------------- |
| `docker system df` | 显示磁盘使用情况 |
| `docker system prune` | 清理无用的容器、镜像、卷和网络 |
| `docker image prune` | 清理未使用的镜像 |
| `docker container prune` | 清理已停止的容器 |
| `docker volume prune` | 清理无用卷 |
---
### Docker Compose多容器管理
| 命令 | 说明 |
| ------------------------ | -------- |
| `docker compose up -d` | 启动服务(后台) |
| `docker compose down` | 停止并删除容器 |
| `docker compose ps` | 查看当前项目容器 |
| `docker compose logs -f` | 查看日志 |
| `docker compose build` | 重新构建服务镜像 |
| `docker compose restart` | 重启服务 |
---
### 卸载 Docker
> 删除所有 Docker 容器和 Docker 本身
1. 首先停止所有正在运行的容器:
```bash
docker stop $(docker ps -aq)
```
2. 删除所有容器
删除所有容器(包括停止的容器):
```bash
docker rm $(docker ps -aq)
```
3. 删除所有镜像
```bash
docker rmi $(docker images -q)
```
4. 删除所有网络
```bash
docker network prune -f
```
5. 删除所有未使用的卷
```bash
docker volume prune -f
```
6. 卸载 Docker
如果您希望完全删除 Docker 本身,可以执行以下命令:
```bash
sudo apt-get purge docker-ce docker-ce-cli containerd.io
sudo apt-get autoremove --purge
sudo rm -rf /var/lib/docker
sudo rm -rf /etc/docker
```
这些命令会卸载 Docker 软件并删除 Docker 数据目录。
---
## 使用Docker-Compose ## 使用Docker-Compose
- 目标:创建一个``Searxng服务``并对外开放。 - 目标:创建一个``Searxng服务``并对外开放。
- 方法:创建两个 docker-compose 文件,并``使用同一个外部 Docker 网络``使两个服务互联。 - 方法:创建两个 docker-compose 文件,并``使用同一个外部 Docker 网络``使两个服务互联。
0. 首先``创建好工作目录``,例如: 0. 首先``创建好工作目录``,例如:
``` ```bash
. .
└── docker └── docker
├── docker-compose.nginx.yml ├── docker-compose.nginx.yml
@@ -76,13 +234,13 @@ sudo apt update && sudo apt-get install docker-ce docker-ce-cli containerd.io do
``` ```
1. 在启动服务前,首先创建一个 Docker 外部网络(例如命名为 nginx 1. 在启动服务前,首先创建一个 Docker 外部网络(例如命名为 nginx
``` ```bash
docker network create nginx docker network create nginx
``` ```
这样,无论是哪个 docker-compose 项目中的容器,只要加入此网络,就能直接通信。 这样,无论是哪个 docker-compose 项目中的容器,只要加入此网络,就能直接通信。
2. 编写 searxng 的 docker-compose 文件 2. 编写 searxng 的 docker-compose 文件
``` ```yaml
version: '3' version: '3'
services: services:
@@ -110,7 +268,7 @@ networks:
3. 编写 Nginx 的 docker-compose 文件 3. 编写 Nginx 的 docker-compose 文件
创建 nginx 的 docker-compose 文件,例如: 创建 nginx 的 docker-compose 文件,例如:
``` ```yaml
version: '3' version: '3'
services: services:
@@ -133,7 +291,7 @@ networks:
external: true external: true
``` ```
4. 编写 Nginx 配置文件 4. 编写 Nginx 配置文件
``` ```conf
server { server {
listen 80; listen 80;
server_name searxng.dich.bid; server_name searxng.dich.bid;
@@ -162,11 +320,11 @@ server {
5. 启动服务 5. 启动服务
- 启动 searxng 服务: - 启动 searxng 服务:
``` ```bash
docker-compose -f docker-compose.searxng.yml up -d docker-compose -f docker-compose.searxng.yml up -d
``` ```
- 启动 nginx 服务: - 启动 nginx 服务:
``` ```bash
docker-compose -f docker-compose.nginx.yml up -d docker-compose -f docker-compose.nginx.yml up -d
``` ```
由于两者都加入了外部网络 nginxnginx 内的``proxy_pass http://searxng:8080``就能解析到 searxng 容器,实现反向代理效果。现在,访问``http://ip:18080``就可以访问Searxng搜索引擎。 由于两者都加入了外部网络 nginxnginx 内的``proxy_pass http://searxng:8080``就能解析到 searxng 容器,实现反向代理效果。现在,访问``http://ip:18080``就可以访问Searxng搜索引擎。
@@ -179,7 +337,7 @@ docker-compose -f docker-compose.nginx.yml up -d
1. 证书生成 1. 证书生成
- 如果只是用于测试可以生成自签名证书: - 如果只是用于测试可以生成自签名证书:
``` ```bash
mkdir -p /home/dich/docker/nginx/certs mkdir -p /home/dich/docker/nginx/certs
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /home/dich/docker/nginx/certs/privkey.pem \ -keyout /home/dich/docker/nginx/certs/privkey.pem \
@@ -188,7 +346,7 @@ openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
``` ```
2. 更改searxng.conf: 2. 更改searxng.conf:
``` ```conf
server { server {
listen 443 ssl; listen 443 ssl;
server_name searxng.dich.bid; server_name searxng.dich.bid;
@@ -227,7 +385,7 @@ server {
``` ```
3. 更改docker-compose.nginx.yml 3. 更改docker-compose.nginx.yml
``` ```yaml
version: '3' version: '3'
services: services:
@@ -254,11 +412,11 @@ networks:
4. 启动新配置 4. 启动新配置
- 重启容器 - 重启容器
``` ```bash
sudo docker compose -f docker-compose.nginx.yml up -d sudo docker compose -f docker-compose.nginx.yml up -d
``` ```
- 查看日志 - 查看日志
``` ```bash
sudo docker logs searxng sudo docker logs searxng
``` ```
## Caddy ## Caddy
@@ -266,7 +424,7 @@ sudo docker logs searxng
> Caddy 自 2015 年起用 Go 语言重写,定位为“开箱即用”的现代 Web 服务器,内置自动 Lets Encrypt 证书管理和续期,默认支持 HTTP/2 及 HTTP/3QUIC并通过简洁明了的 Caddyfile 语法极大降低配置成本. > Caddy 自 2015 年起用 Go 语言重写,定位为“开箱即用”的现代 Web 服务器,内置自动 Lets Encrypt 证书管理和续期,默认支持 HTTP/2 及 HTTP/3QUIC并通过简洁明了的 Caddyfile 语法极大降低配置成本.
0. 示例结构: 0. 示例结构:
``` ```bash
. .
└── compose └── compose
├── certs ├── certs
@@ -279,11 +437,11 @@ sudo docker logs searxng
└── Caddyfile └── Caddyfile
``` ```
1. 同样创建名为Caddy的docker网络 1. 同样创建名为Caddy的docker网络
``` ```bash
docker network create caddy docker network create caddy
``` ```
2. 编写Caddy的compose可以看到caddy可以自带签发证书 2. 编写Caddy的compose可以看到caddy可以自带签发证书
``` ```yaml
version: '3.7' version: '3.7'
# 自动签发模式 # 自动签发模式
@@ -340,7 +498,7 @@ networks:
external: true external: true
``` ```
3. 编写Caddyfile可以看到自动开启HTTPS模式 3. 编写Caddyfile可以看到自动开启HTTPS模式
``` ```conf
# 自动签发模式 # 自动签发模式
searxng.dich.bid { searxng.dich.bid {
reverse_proxy searxng:8080 { reverse_proxy searxng:8080 {
@@ -379,4 +537,4 @@ miniflux.dich.bid {
- 每增加一个服务需要在nginx中更新volume - 每增加一个服务需要在nginx中更新volume
--- ---
**Done.** **Done.**

View File

@@ -1,9 +1,9 @@
+++ +++
title = "Network的艺术:下载技术的历史" title = "下载系列(1):下载技术的历史"
date = 2024-02-09 date = 2025-04-11
[taxonomies] [taxonomies]
tags = ["网络艺术"] tags = ["Network"]
+++ +++
前言 下载就是将我们所需要的文件数据通过网络从拥有该文件资源的计算机上传输过来并保存到我们的计算机上供我们使用。本系列将详细讲述各种常见网络下载技术的原理包括HTTP,FTP,BT等等。 前言 下载就是将我们所需要的文件数据通过网络从拥有该文件资源的计算机上传输过来并保存到我们的计算机上供我们使用。本系列将详细讲述各种常见网络下载技术的原理包括HTTP,FTP,BT等等。

View File

@@ -1,9 +1,9 @@
+++ +++
title = "乱七八糟:FRP使用指南" title = "网络艺术:FRP使用指南"
date = 2025-03-01 date = 2025-03-01
[taxonomies] [taxonomies]
tags = ["乱七八糟"] tags = ["Network"]
+++ +++
前言 FRP (Fast Reverse Proxy) 是一个用Go语言开发的高性能反向代理应用可以帮助您轻松地进行内网穿透对外提供服务. 前言 FRP (Fast Reverse Proxy) 是一个用Go语言开发的高性能反向代理应用可以帮助您轻松地进行内网穿透对外提供服务.
@@ -460,4 +460,4 @@ max_ports_per_client = 10
- [FRP常见问题解答](https://github.com/fatedier/frp/issues) - [FRP常见问题解答](https://github.com/fatedier/frp/issues)
--- ---
**Done.** **Done.**

View File

@@ -1,9 +1,9 @@
+++ +++
title = "Network的艺术:家庭组网方案与设备选购" title = "家庭组网系列(1):方案与设备选购"
date = 2025-01-21 date = 2025-01-21
[taxonomies] [taxonomies]
tags = ["网络艺术"] tags = ["Network"]
+++ +++
前言 本文介绍一些家庭组网方案和家庭网络升级方案。 前言 本文介绍一些家庭组网方案和家庭网络升级方案。

View File

@@ -0,0 +1,89 @@
+++
title = "家庭组网系列(2):路由器性能测试"
date = 2025-01-22
[taxonomies]
tags = ["Network"]
+++
前言 本文介绍常用的家庭网络测试方法,包括开源固件和闭源商用设备的测试。
<!-- more -->
随着Wi-Fi7设备的逐渐普及和家用路由器的性能提升百元以内的wifi6路由器性价比变得非常高可以用非常少的预算搭建高速网络然而即使是同样的方案各家路由器的实际体验却不一致因此这里记载一些测试路由器性能的方法。
开源固件如OpenWrt无论是软路由还是硬路由都很方便测试。为了方便测试我们假设你的网络拓扑为简单的光猫+无线路由器;实际使用中自上而下的,运营商的套餐带宽/限速/QOS设备的转发性能和网线/网卡的质量都会引起整个网络的波动。
## 性能指标
| 指标 | 含义 |
| --------------- | --------------- |
| 吞吐量Throughput | 最大数据传输速度 |
| 延迟 / 抖动 | 延迟和波动情况 |
| 转发性能 / pps | 每秒能转发多少数据包 |
| 并发连接数 | 同时建立多少TCP连接 |
| NAT / 防火墙性能 | 打开转发、NAT、规则后的性能 |
## 带宽
带宽,也叫吞吐量,是我们最为关心的一个性能指标之一。
理论上1000兆宽带的极限下载速度为125MB每秒实际上日常生活中少有跑满带宽的使用情况毕竟商用服务器的带宽成本高比如B站的视频降码率等等。对于极客玩家来说内网文件共享游戏串流NAS服务和外网多线程下载BT下载等等需要比较高的带宽性能。以下是一些常见的测试方法
开源固件可以使用[iperf3](https://github.com/esnet/iperf)来测试。
在路由器A上和设备B上安装iperf3,openwrt为``opkg install iperf3``随后在A上使用命令``iperf3 -s``开启服务端在B上使用命令``iperf3 -c <A的IP>``,即可测试B到A的TCP单线程上传速率(本地带宽)应该和A的物理端口速率相近。若要测试下载速率``iperf3 -c <A的IP> -R``即可。
TCP单线程下载测试示例
![iperf3.webp](/images/iperf3.webp)
如果你的路由器为闭源固件,也可以到在线测速站进行简单测试:
- [测速网:speedtest.cn](https://www.speedtest.cn/)
- [中国科学技术大学测速网站](https://test.ustc.edu.cn/)
- [Netflix运营的fast.com](fast.com)
- [Openspeedtest](https://openspeedtest.com/)
- [Cloudflare测速](https://speed.cloudflare.com/)
这些网站的测试速度随着节点的不同而有所差异比如测试节点在北京联通而你是广东电信会和实际差距较大。当然还有一个简单权威的方法就是下载一个Steam上的大型游戏Steam的节点在任何国家基本都可以跑满。
## 延迟与抖动
简单的ping命令即可测试延迟对网络排除故障很有帮助。ping命令是一个广泛使用的命令在各种系统上都有。
使用``ping <目标IP> -c 20``命令进行测试可以看到min/avg/max三个值即为最小/平均/最大延迟;
![ping](/images/ping.webp)
也可以使用iperf3来测试UDP抖动使用命令``iperf3 -c <server_ip> -u -b 100M -t 10``-u表示使用udp-100M表示使用100兆带宽可逐渐调高并接近极限性能。
![iperf3-udp](/images/iperf3-udp.webp)
## 转发
路由器的CPU作为核心需要处理外网与内网IP的转发这种转发能力称为包转发率通常拿小包的转发率来衡量能力的高低。测试“小包转发能力”其实就是测试 PPSPackets Per Second能力,在x86软路由上面这个性能尤为重要因为无线路由器有硬件级别的加速芯片而软路由没有。
> 以单位时间内发送64byte的数据包最小包的个数作为计算基准的。对于千兆以太网来说计算方法如下1000000000bps/8bit/64812byte=1,488,095pps,说明当以太网帧为64byte时需考虑8byte的帧头和12byte的帧间隙的固定开销。故一个线速的千兆以太网端口在转发64byte包时的包转发率为1.488Mpps
测试转发性能需要发包-转发-收包三台设备或者使用环回测试仪。由于iperf3 处于 TCP/UDP 层,包也会变大且加了协议头,测试的结果误差很大,因此不建议用其进行测试小包性能。
---
未完待续。

195
content/Network-ssh.md Normal file
View File

@@ -0,0 +1,195 @@
+++
title = "网络艺术:SSH使用指南"
date = 2025-05-02
[taxonomies]
tags = ["Network"]
+++
前言 SSHSecure Shell 的缩写)是一种网络协议,用于加密两台计算机之间的通信,并且支持各种身份验证机制。
<!-- more -->
## 历史
1995年芬兰赫尔辛基工业大学的研究员 Tatu Ylönen 设计了 ``SSH 协议的第一个版本(现称为 SSH 1``,同时写出了第一个实现(称为 SSH1
当时,他所在的大学网络一直发生密码嗅探攻击,他不得不为服务器设计一个更安全的登录方式。写完以后,他就把这个工具公开了,允许其他人免费使用。
SSH 可以替换 rlogin、TELNET、FTP 和 rsh 这些不安全的协议所以大受欢迎用户快速增长1995年底已经发展到五十个国家的20,000个用户。SSH 1 协议也变成 IETF 的标准文档。
1995年12月由于客服需求越来越大``TatuYlönen就成立了一家公司SCS专门销售和开发SSH``。这个软件的后续版本,逐渐从免费软件变成了专有的商业软件。
SSH 1 协议存在一些安全漏洞,所以``1996年又提出了 SSH 2 协议(或者称为 SSH 2.0``。这个协议与1.0版不兼容在1997年进行了标准化1998年推出了软件实现 SSH2。但是官方的 SSH2 软件是一个专有软件,不能免费使用,而且 SSH1的有些功能也没有提供。
1999年OpenBSD 的开发人员决定写一个``SSH 2 协议的开源实现`` ,这就是 OpenSSH 项目。该项目最初是基于 SSH 1.2.12 版本,那是当时 SSH1 最后一个开源版本。但是OpenSSH 很快就完全摆脱了原始的官方代码在许多开发者的参与下按照自己的路线发展。OpenSSH 随 OpenBSD 2.6 版本一起提供,以后又移植到其他操作系统,成为最流行的 SSH 实现。目前Linux 的所有发行版几乎都自带 OpenSSH。
## 开始
李华是一个大学生现在他买了一台服务器公网IPv4为114.514.114.514,李华打算连到上面看看:
```bash
ssh -p 22 root@114.514.114.514
```
随后命令行弹出了密码输入李华输入了初始密码114514,成功登录了进去;现在每次登录只要输入一行命令就可以,大功告成!
## 安全
一段时间后李华的linux知识提高了不少他发现有不少IP在用随机密码不断尝试登录自己的服务器这太危险了
于是,李华查阅了资料,发现有一篇博客[乱七八糟:服务器初始化与安全设置](https://blog.dich.bid/about-server-set/)于是他将openssh-server的端口改成了2333,并开启了fail2ban这下应该安全了
```bash
### 更换SSH端口
使用root账户或已经有sudo权限的用户登录到系统。
打开SSH配置文件`sshd_config`可以使用文本编辑器如nano或vi。以下是使用nano编辑器的示例
sudo vim /etc/ssh/sshd_config
在配置文件中找到以下行:
Port 22
这是SSH默认的端口号你可以将其更改为你想要的任何未被占用的端口号。例如将端口更改为2333
Port 2333
保存并关闭文本编辑器。重新启动SSH服务以应用更改
sudo service ssh restart
或者如果你的系统使用systemd可以使用以下命令
sudo systemctl restart ssh
### 安装 Fail2ban
sudo apt-get install fail2ban
#### Debian 12 及以上的版本需要手动安装 rsyslog
sudo apt-get install rsyslog
####启动 Fail2ban 服务
sudo systemctl start fail2ban
#### 开机自启动
sudo systemctl enable fail2ban
#### 查看 Fail2ban 服务状态
sudo systemctl status fail2ban
```
但是服务器依然在被爆破,李华又又研究了以下教程,决定将自己的服务器由密码登录改为密钥登录,这下没有牛马来爆破了!
```bash
#### 执行以下命令生成.pub后缀的公钥和无后缀的密钥
ssh-keygen
注意不同密钥对名称不能相同;同时可以为这两个文件用密码加密;
#### 随后将.pub后缀的公钥中的内容写入服务器的~/.ssh/authorized_keys中
#### 使用以下命令编译服务器的SSH配置
vim /etc/ssh/sshd_config
将其中的该行改为PasswordAuthentication no保存退出随后使用
sudo systemctl restart sshd
重启SSH即可禁用密码登录
#### 将PermitRootLogin一栏改为PermitRootLogin prohibit-password**即可实现仅root用户密钥登录
#### 使用以下命令查看输出,
sudo cat /etc/ssh/sshd_config | grep -E 'PasswordAuthentication|PubkeyAuthentication'
如有PasswordAuthentication no → 禁用密码登录以及PubkeyAuthentication yes → 允许密钥登录则成功。
> 注意authorized_keys**的权限为600如果不是则需要改正chmod 600 ~/.ssh/authorized_keys
```
## 管理
现在服务器安全了但随着服务器数量的增加李华很快发现一个新问题如何管理这些个SSH连接呢手动输入太慢了每次都要复制粘贴也很麻烦但是又不得不用总不能回退到密码时代吧况且数量多了密码也记不住。
于是李华运用软件工程学的思想想着这种大众的需求应该有人解决过了吧果然李华很快在GitHub上找到了一个开源跨平台的SSH管理软件[electerm](https://github.com/electerm/electerm)!
![electerm](/images/electerm.png)
通过在electerm的书签中写入服务器的地址登录用户和密钥只要打开electerm并点击书签就可以连接了太方便了
## 返璞
随着技术阅历的增长李华看electerm越来越不顺眼用它管理SSH固然方便但同时这就得在各个系统上安装一个Electron架构的软件而且用electerm的shell并不好用,并且备份electerm的配置不能给其他软件使用。终于在一次界面崩溃之后李华忍无可忍决定更换新的方案
通过研究李华发现原来openssh有自带的管理方法且非常便捷好用。
首先,李华在用户目录下创建了一个``.ssh``文件夹linux中在``/home/username/.ssh``这里windows下在``C:\Users\username\.ssh``这里。
随后李华安装了openssh在系统上linux中一般已经存在windows上在``设置-系统-可选功能-添加功能``中选中OpenSSH Client和openssh-server开启即可.
随后,李华在.ssh文件夹下创建了一个文件名为``config``,并在其中写入以下内容:
```bash
Host US
HostName 114.514.114.514
User root
IdentityFile ~/.ssh/US
IdentitiesOnly yes
```
随后李华在对应的位置``~/.ssh/US``创建了一个文件,李华将服务器的私钥放了进去,里面是以``-----BEGIN OPENSSH PRIVATE KEY-----``开头``-----END OPENSSH PRIVATE KEY-----``结尾的私钥。
现在,要登录``114.514.114.514``这台服务器,只需要使用``ssh US``命令就可以连上服务器了,不用再手动输入了!
## 归真
在进一步了解SSH之后李华很快又发现了新的问题服务器的私钥放在本地是不安全的尤其是Windows这种安装源松散鱼龙混杂的系统上。究竟有没有更好的方法呢在对keepassxc进行研究后李华终于得出了一个几乎完美的方案
- 开启keepassxc的SSH代理集成
- 本地.ssh文件夹只保留公钥
- 私钥保存在keepassxc的一个组中
这样一来,当你执行``ssh xxx``时ssh 不是去读私钥文件,而是通过``SSH_AUTH_SOCK``环境变量找到 KeePassXC 的 agent。KeePassXC 会提示你解锁数据库/确认使用密钥。私钥不会离开 KeePassXC只是 KeePassXC ``用私钥做一次签名``,把结果返回给 ssh。这样``硬盘上不需要保存私钥文件``,安全性更高,且``只需要备份.ssh文件夹和keepassxc的kbdx文件``即可.
那么该怎么做呢?
首先,将.ssh文件夹中的config进行修改,把私钥文件改为公钥文件,同时创建对应的``~/.ssh/US.pub``公钥文件里面是以ssh-ed25519或者ssh-rsa开头的公钥.
```bash
Host US
HostName 114.514.114.514
User root
IdentityFile ~/.ssh/US.pub
IdentitiesOnly yes
```
随后在keepassxc的设置-ssh代理中开启``启用SSH代理集成``.openssh
接下来在keepassxc中左侧栏``新建一个文件夹``名为SSH里面``新建条目``标题为US和config中一致然后在右侧``高级``中``新建``附件文件名为US和config中保持一致文件内容为US的私钥.随后在左侧SSH代理中选中``在打开或解锁数据库的时候,向代理添加密钥``和``数据库锁定或关闭时从SSH代理中删除密钥``这两个选项,并将下面的``私钥``选择``附件``即为我们刚刚在高级中新建的US可以看到对应的公钥也出现了上一步没有公钥的可以在这里添加.按``确定``后关闭keepassxc并重新开启这时候就可以使用``ssh US``命令登录了!
> 注意每次登录前先开启keepassxc并解锁
---
**Done.**

View File

@@ -1,9 +1,9 @@
+++ +++
title = "Network的艺术:SSL/TLS证书" title = "网络艺术:SSL/TLS证书"
date = 2024-02-15 date = 2024-02-15
[taxonomies] [taxonomies]
tags = ["网络艺术"] tags = ["Network"]
+++ +++
前言 什么是SSL/TLS证书它有什么作用如何部署 前言 什么是SSL/TLS证书它有什么作用如何部署
@@ -100,4 +100,4 @@ Let's Encrypt等颁布CA证书的层级结构如下
--- ---
**Done.** **Done.**

241
content/Network-yt-dlp.md Normal file
View File

@@ -0,0 +1,241 @@
+++
title = "下载系列(2):Yt-dlp使用指南"
date = 2025-04-12
[taxonomies]
tags = ["Network"]
+++
前言 yt-dlp是一款功能强大的命令行工具专注于下载视频与音频内容支持数千个平台是开源下载工具爱好者的常用选择。
<!-- more -->
有时候我们想要下载网络上的某些视频比如BilibiliYouTube等等但它们没有提供下载按钮这时候就可以用开源的yt-dlp来进行下载。和Aria2一样很多下载软件的核心就是yt-dlp.
## 历史
- **起源与演进**
`youtube-dl` 由 Ricardo García González 于 **2006 年**创建,最初仅支持 YouTube随后扩展至其他网站成为 GitHub 上最受欢迎的开源下载项目之一.项目维护者在 2011 年、2021 年等阶段陆续交替,由 phihag、dstftw 等接手.2020 年唱片业协会RIAA发起 DMCA 要求删除该项目,虽一度被移除,但在公众与 EFF 的推动下于当年 11 月恢复,并促使 GitHub 改进相关策略.
- **停滞youtube-dlc → yt-dlp 的诞生**
随着开发进度放缓,社区于 2020 年衍生出 youtube-dlc 分支,在**2021 年**演变为更活跃的 `yt-dlp` 项目,它继承了 youtube-dl 的核心功能并引入更多改进包括更好的格式选择、多线程下载等成为了GitHub上star最多的项目之一.
- **重构与功能拓展**
`yt-dlp` 从 youtube-dlc 完全重构,新增许多 extractor解析器、改进配置与默认行为还扩展了插件系统和兼容性支持.
## 安装
### Windows
从yt-dlp官方GitHub上下载exe二进制文件
[yt-dlp](https://github.com/yt-dlp/yt-dlp/releases/tag/2025.08.22)
将其放到一个目录下,比如``C:\Users\<你的用户名>\yt-dlp\yt-dlp.exe``,随后添加环境变量。
> 添加环境变量Win键搜索“环境变量”打开“编辑系统环境变量”点击最下方的“环境变量”选择“系统变量”中的path点击“编辑”新建一个变量将上面的目录 C:\Users\<你的用户名>\yt-dlp\ 写入,注意去掉前后引号,随后确定-确定-确定退出。
更新版本:
```bash
yt-dlp -U
```
- Python Pip 安装
```bash
python3 -m pip install -U yt-dlp
```
### Linux 发行版
- Debian / Ubuntu`sudo apt install yt-dlp`
- Arch / Manjaro`sudo pacman -S yt-dlp`
- Fedora`sudo dnf install yt-dlp`
- Nixos:
```nix
{pkgs, ...}: {
home.packages = with pkgs; [
peazip
];
}
```
### AndroidTermux
```bash
pkg update && pkg upgrade
pkg install python libexpat openssl ffmpeg
python3 -m pip install -U yt-dlp
```
## 下载实战
- **下载B站带字幕视频**:
```bash
yt-dlp "https://www.bilibili.com/video/BVxxxxx" --write-subs --embed-subs --sub-langs all,-live_chat
--write-subs: 将字幕文件下载为单独文件 (如 .vtt 或 .ass)
--embed-subs: 将下载的字幕嵌入到视频文件中(如果格式支持)
--sub-langs all,-live_chat: 下载所有字幕语言,但排除像“弹幕/实时聊天”之类的非标准字幕流
```
- **下载YouTube视频**
先使用这个命令查看可用格式:
```bash
yt-dlp -F https://www.youtube.com/watch?v=xxxxxxxxxxxx
```
然后它会列举出所有可用的格式,如下:
```bash
[youtube] MgtOAVOXBWo: Downloading webpage
[youtube] MgtOAVOXBWo: Downloading tv client config
[youtube] MgtOAVOXBWo: Downloading tv player API JSON
[youtube] MgtOAVOXBWo: Downloading ios player API JSON
[youtube] MgtOAVOXBWo: Downloading m3u8 information
[info] Available formats for MgtOAVOXBWo:
ID EXT RESOLUTION FPS │ FILESIZE TBR PROTO │ VCODEC VBR ACODEC MORE INFO
──────────────────────────────────────────────────────────────────────────────────────────────────────────
sb2 mhtml 48x27 0 │ mhtml │ images storyboard
sb1 mhtml 80x45 0 │ mhtml │ images storyboard
sb0 mhtml 160x90 0 │ mhtml │ images storyboard
233 mp4 audio only │ m3u8 │ audio only unknown Untested, Default, low
234 mp4 audio only │ m3u8 │ audio only unknown Untested, Default, high
602 mp4 256x144 15 │ ~ 9.23MiB 81k m3u8 │ vp09.00.10.08 81k video only Untested
269 mp4 256x144 30 │ ~ 14.94MiB 130k m3u8 │ avc1.4D400C 130k video only Untested
603 mp4 256x144 30 │ ~ 15.90MiB 139k m3u8 │ vp09.00.11.08 139k video only Untested
229 mp4 426x240 30 │ ~ 33.33MiB 291k m3u8 │ avc1.4D4015 291k video only Untested
604 mp4 426x240 30 │ ~ 25.82MiB 225k m3u8 │ vp09.00.20.08 225k video only Untested
230 mp4 640x360 30 │ ~ 73.50MiB 642k m3u8 │ avc1.4D401E 642k video only Untested
605 mp4 640x360 30 │ ~ 55.73MiB 487k m3u8 │ vp09.00.21.08 487k video only Untested
231 mp4 854x480 30 │ ~104.35MiB 911k m3u8 │ avc1.4D401F 911k video only Untested
606 mp4 854x480 30 │ ~ 94.79MiB 827k m3u8 │ vp09.00.30.08 827k video only Untested
311 mp4 1280x720 60 │ ~330.73MiB 2887k m3u8 │ avc1.4D4020 2887k video only Untested
612 mp4 1280x720 60 │ ~197.04MiB 1720k m3u8 │ vp09.00.40.08 1720k video only Untested
312 mp4 1920x1080 60 │ ~486.64MiB 4248k m3u8 │ avc1.64002A 4248k video only Untested
617 mp4 1920x1080 60 │ ~369.06MiB 3222k m3u8 │ vp09.00.41.08 3222k video only Untested
623 mp4 2560x1440 60 │ ~ 1.00GiB 8945k m3u8 │ vp09.00.50.08 8945k video only Untested
```
我们下载312和233,即视频和音频,使用以下命令:
```bash
yt-dlp -f "312+233" -o "<新视频的名字,要短一点>.%(ext)s" https://www.youtube.com/watch?v=xxxxxxxxxxxx
```
这行命令会自动将下载的312的1080p/H.264的视频和233的音频合并为一个mp4视频注意新的名称不能太长否则会下载失败。
如果要下载带字幕的视频,则使用
```bash
yt-dlp -f "312+233" --write-subs --write-auto-subs --embed-subs --sub-langs "zh.*,en.*" -o "<新视频的名字,要短一点>.%(ext)s" https://www.youtube.com/watch?v=xxxxxxxxxxx
```
这个命令会:
- 下载1080p视频
- 下载中文和英文字幕(包括自动生成的)
- 将字幕嵌入到视频文件中
- 同时保存单独的字幕文件
- 参数说明
```bash
--write-subs: 下载手动字幕
--write-auto-subs: 下载自动生成的字幕
--embed-subs: 将字幕嵌入到视频中
--sub-langs "zh.*": 指定下载中文字幕(所有中文变体)
--sub-format srt: 指定字幕格式(可选)
```
## 常用参数
- **下载视频**
```bash
yt-dlp "视频链接"
```
- **提取为 MP3 音频**
```bash
yt-dlp -x --audio-format mp3 "视频链接"
```
- **下载播放列表**
```bash
yt-dlp -i "播放列表链接"
```
- **批量处理(文件或多个 URL**
```bash
yt-dlp -a urls.txt
```
- **选择格式下载**
```bash
yt-dlp -F "视频链接" # 显示所有格式
yt-dlp -f 137+140 "链接" # 下载指定视频 + 音频合并
```
- **自定义输出路径与模板**
```bash
yt-dlp -o '%(title)s by %(uploader)s on %(upload_date)s.%(ext)s'
```
- **日期过滤**
```bash
yt-dlp --dateafter 20230101 --datebefore 20231231 "链接"
```
- **速度限制 / 恢复下载 / 年龄筛选**
```bash
-r 500K # 限速
-c # 断点续传
--age-limit 18 # 仅下载适合年龄 ≥18 的视频
```
- **只输出描述,不下载内容**
```bash
yt-dlp --skip-download "链接"
```
- **下载封面、字幕、缩略图、元数据等**
```bash
--write-thumbnail --write-sub --embed-subs --embed-thumbnail
```
- **使用浏览器 Cookies 下载私密内容**
```bash
--cookies your-cookies.txt
--cookies-from-browser firefox
```
- **并行下载示例Hacker News 用户提供)**
```bash
yt-dlp --flat-playlist --print id playlist_url | \
parallel yt-dlp -x --wait-for-video 3 --download-archive archive.txt https://www.youtube.com/watch?v={}
```
- **记录下载历史**
```bash
yt-dlp --download-archive archive.txt "链接"
```
- **配置文件设定默认参数**
在 `~/.config/yt-dlp/config` 文件中添加习惯参数,如下载路径、格式偏好等。
---
**Done.**

View File

@@ -103,35 +103,35 @@ tags = ["乱七八糟"]
8. **Docker日志文件**: 8. **Docker日志文件**:
使用 `docker ps -a` 命令查找你感兴趣的容器的 ID。 使用 `docker ps -a` 命令查找你感兴趣的容器的 ID。
```` ````bash
docker ps -a docker ps -a
```` ````
进入容器的日志目录,路径类似于 `/var/lib/docker/containers/<container-id>/`。 进入容器的日志目录,路径类似于 `/var/lib/docker/containers/<container-id>/`。
```` ````bash
cd /var/lib/docker/containers/<container-id>/ cd /var/lib/docker/containers/<container-id>/
```` ````
使用命令清理或删除日志文件。你可以删除所有日志文件,或者只删除特定的日志文件。 使用命令清理或删除日志文件。你可以删除所有日志文件,或者只删除特定的日志文件。
```` ````bash
# 删除所有日志文件 # 删除所有日志文件
rm *.log rm *.log
# 删除特定日志文件(例如 stdout 和 stderr # 删除特定日志文件(例如 stdout 和 stderr
rm *-json.log rm *-json.log
```` ````
## **Arch Linux 安装备份** ## **Arch Linux 安装备份**
你可以定期备份 Arch Linux 安装的软件列表,以便在需要时轻松还原。 你可以定期备份 Arch Linux 安装的软件列表,以便在需要时轻松还原。
```` ````bash
pacman -Qqe > package-list.txt pacman -Qqe > package-list.txt
```` ````
这将列出所有已安装的软件包,并将其保存到文件 `package-list.txt` 中。在还原系统时,你可以使用以下命令: 这将列出所有已安装的软件包,并将其保存到文件 `package-list.txt` 中。在还原系统时,你可以使用以下命令:
```` ````bash
sudo pacman -S --needed - < package-list.txt sudo pacman -S --needed - < package-list.txt
```` ````

View File

@@ -1,5 +1,5 @@
+++ +++
title = "搭建个人信息流:RSS阅读指南" title = "乱七八糟:RSS阅读指南"
date = 2024-03-05 date = 2024-03-05
[taxonomies] [taxonomies]
@@ -141,7 +141,7 @@ RSS客户端非常丰富包括 Android 端IOS 端Windows 端linux
3在文件中写入以下内容并保存 3在文件中写入以下内容并保存
``` ```yaml
version: '3.4' version: '3.4'
services: services:

View File

@@ -1,117 +0,0 @@
+++
title = "乱七八糟:Aria2各平台使用指南"
date = 2025-04-15
[taxonomies]
tags = ["乱七八糟"]
+++
前言 Aria2是一款开源、跨平台的命令行界面下载管理器常常被各种下载器软件使用。
<!-- more -->
## 介绍
[Aria2](https://github.com/aria2/aria2)是一款开源、跨平台的命令行界面下载管理器,支持的下载协议有:``HTTP、HTTPS、FTP、Bittorrent 和 Metalink``。​它以高效、轻量和灵活著称,适用于需要批量下载、自动化任务或远程控制的用户。
Aria2 有以下几个特点:
- ``多连接下载``:可以从多个来源/协议下载文件并尝试利用您的最大下载带宽,真正加快您的下载体验;
- ``轻量``:不需要太多内存和 CPU 时间;
- ``全功能的 BitTorrent 客户端``BitTorrent 客户端的所有功能都可用,,如 DHT、PEX、加密、Magnet URI、网络播种、选择性下载、本地对等发现和 UDP 跟踪器;
- ``支持Metalink``:支持 Metalink 下载描述格式。 在下载中使用 Metalink 数据块的校验和自动验证下载的数据部分;
- ``远程控制``:支持 RPC 接口来控制 aria2 进程。 支持的接口是 JSON-RPC通过 HTTP 和 WebSocket和 XML-RPC。
Aria2 原生使用命令行工具进行操作,为了更方便控制我们可以使用其他开源的面板配合本体,如[AriaNg](https://github.com/mayswind/AriaNg)或者[webui-aria2](https://github.com/ziahamza/webui-aria2)。
## Windows
首先下载[aria2-1.37.0-win-64bit-build1.zip](https://github.com/aria2/aria2/releases/tag/release-1.37.0),将下载好的文件解压并放到你喜欢的目录下,设置系统环境变量,类似``D:\DATA\Data\AriaNg-1.3.10-AllInOne``,随后即可在 CMD 中使用 Aria2 。
随后可以安装 AriaNg 前端AriaNg 使用纯 html & javascript 开发, 所以其不需要任何编译器或运行环境.
![ariang-1](https://raw.githubusercontent.com/mayswind/AriaNg-WebSite/master/screenshots/desktop.png)
AriaNg 现在提供三种版本, ``标准版、单文件版和 AriaNg Native. ``标准版适合在 Web 服务器中部署, 提供资源缓存和按需加载的功能. 单文件版适合本地使用, 您下载后只要在浏览器中打开唯一的 html 文件即可. AriaNg Native 同样适合本地使用, 并且不需要使用浏览器.这里``建议使用单文件版或者Native版。``
[单文件版(AllinOne)](https://github.com/mayswind/AriaNg/releases)
[Native版](https://github.com/mayswind/AriaNg-Native/releases/tag/1.3.10)
## Arch linux
首先安装aria2本体:
```
paru -S aria2
```
随后创建配置文件
```
nano /home/<you-username>/.config/aria2/aria2.conf
```
内容为
```
enable-rpc=true
rpc-listen-all=true
rpc-allow-origin-all=true
rpc-listen-port=6800
continue=true
dir=/home/<you-username>/Downloads
input-file=/home/<you-username>/.config/aria2/aria2.session
save-session=/home/<you-username>/.config/aria2/aria2.session
save-session-interval=60
```
保存退出;随后创建守护进程以便开机自启动:
```
nano ~/.config/systemd/user/aria2.service
```
写入:
```
[Unit]
Description=Aria2 Daemon
After=network.target
[Service]
ExecStart=/usr/bin/aria2c --conf-path=/home/<you-username>/.config/aria2/aria2.conf
Restart=on-failure
[Install]
WantedBy=default.target
```
在更新配置文件和服务文件后,执行以下命令以重启服务:​
```
systemctl --user daemon-reload
systemctl --user enable aria2.service
systemctl --user start aria2.service
```
使用以下命令检查服务状态:​
```
systemctl --user status aria2.service
```
## 浏览器插件
如果你想让其直接接管浏览器下载,可以使用以下几种浏览器插件:
**Chrome 浏览器**
- [Aria2 Explorer](https://github.com/alexhua/Aria2-Explorer)是一款功能强大的扩展,能够自动拦截浏览器的下载任务,并通过 JSON-RPC 接口将其导出到 Aria2 进行下载。
- [Aria2 for Chrome](https://github.com/alexhua/Aria2-for-chrome)
**Firefox 浏览器**
- [Integrated Aria2 Download Manager](https://github.com/Cudiph/IA2DM) 是一款 Firefox 扩展,能够拦截下载任务,并将其转发到 Aria2。
**通用版**
- [varia](https://github.com/giantpinkrobots/varia)
🔗
**附带 aria2 的服务端应用**
- [AriaNg for Openwrt](https://github.com/openwrt/packages/tree/master/net/ariang)
- [aria2-ariang-docker](https://github.com/wahyd4/aria2-ariang-docker)
---
**Done.**

View File

@@ -18,7 +18,7 @@ tags = ["乱七八糟"]
> 作者Bill Bynum/Tracy Camp 威廉玛丽学院/科罗拉多矿业学院 2002年11月5日 > 作者Bill Bynum/Tracy Camp 威廉玛丽学院/科罗拉多矿业学院 2002年11月5日
## 目录 ## 目录
``` ```bash
1. 引言 1. 引言
2. C-- 编译器语法 2. C-- 编译器语法
3. 并发结构 3. 并发结构
@@ -238,7 +238,7 @@ v(sem);
为帮助解释信号量的使用,我们提供以下简短示例: 为帮助解释信号量的使用,我们提供以下简短示例:
``` ```java
BACI System: C-- to PCODE Compiler, 09:24 2 May 2002 BACI System: C-- to PCODE Compiler, 09:24 2 May 2002
Source file: semexample.cm Sun Apr 28 20:40:12 2002 Source file: semexample.cm Sun Apr 28 20:40:12 2002
line pc line pc
@@ -277,7 +277,7 @@ line pc
我们使用以下命令生成上述编译器列表: 我们使用以下命令生成上述编译器列表:
``` ```bash
prompt% bacc semexample prompt% bacc semexample
Pcode and tables are stored in semexample.pco Pcode and tables are stored in semexample.pco
Compilation listing is stored in semexample.lst Compilation listing is stored in semexample.lst
@@ -285,7 +285,7 @@ Compilation listing is stored in semexample.lst
然后可以使用 BACI PCODE 解释器执行 semexample.pco 文件: 然后可以使用 BACI PCODE 解释器执行 semexample.pco 文件:
``` ```bash
prompt% bainterp semexample prompt% bainterp semexample
Source file: semexample.cm Sun Apr 28 20:40:12 2002 Source file: semexample.cm Sun Apr 28 20:40:12 2002
Executing PCODE ... Executing PCODE ...
@@ -295,7 +295,7 @@ before p(count) value of count is 1
这是程序可能产生的三种可能输出之一。另外两种可能的程序输出是: 这是程序可能产生的三种可能输出之一。另外两种可能的程序输出是:
``` ```bash
prompt% bainterp semexample prompt% bainterp semexample
Source file: semexample.cm Sun Apr 28 20:40:12 2002 Source file: semexample.cm Sun Apr 28 20:40:12 2002
Executing PCODE ... Executing PCODE ...
@@ -303,7 +303,7 @@ before p(count) value of count is 0
before v(count) value of count is 0 before v(count) value of count is 0
``` ```
``` ```bash
prompt% bainterp semexample prompt% bainterp semexample
Source file: semexample.cm Sun Apr 28 20:40:12 2002 Source file: semexample.cm Sun Apr 28 20:40:12 2002
Executing PCODE ... Executing PCODE ...
@@ -534,7 +534,7 @@ sprintf(x,".%12d. .%-20s. .%q. .%08X.",202,y,z,0x3c03);
以下列表由 C-- BACI 编译器生成。行号右侧的数字是开始该行的指令的 PCODE 偏移量。BACI 编译器从文件 "incremen.cm" 创建此列表。该列表被放置在文件 "incremen.lst" 中。还创建了一个 "incremen.pco" 文件;此文件由解释器使用。 以下列表由 C-- BACI 编译器生成。行号右侧的数字是开始该行的指令的 PCODE 偏移量。BACI 编译器从文件 "incremen.cm" 创建此列表。该列表被放置在文件 "incremen.lst" 中。还创建了一个 "incremen.pco" 文件;此文件由解释器使用。
``` ```java
BACI System: C-- to PCODE Compiler, 09:24 2 May 2002 BACI System: C-- to PCODE Compiler, 09:24 2 May 2002
Source file: incremen.cm Wed Oct 22 21:18:02 1997 Source file: incremen.cm Wed Oct 22 21:18:02 1997
line pc line pc
@@ -566,7 +566,7 @@ line pc
以下列表由 BACI 解释器生成。解释器执行编译到文件 "incremen.pco" 中的程序。 以下列表由 BACI 解释器生成。解释器执行编译到文件 "incremen.pco" 中的程序。
``` ```java
Source file: incremen.cm Wed Oct 22 21:18:02 1997 Source file: incremen.cm Wed Oct 22 21:18:02 1997
Executing PCODE ... Executing PCODE ...
C n =1 i =A n =1 C2 i = C n =1 i =A n =1 C2 i =
@@ -600,7 +600,7 @@ dos2unix ~/Git/java/baci/scripts/baci
``` ```
- 编写baci脚本 - 编写baci脚本
``` ```bash
#!/usr/bin/env bash #!/usr/bin/env bash
# 定位到项目根目录(包含 javabaci 子目录的目录) # 定位到项目根目录(包含 javabaci 子目录的目录)
BASEDIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" BASEDIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
@@ -613,19 +613,19 @@ exec java -cp "$CLASSPATH" "$@"
``` ```
- 给baci授予可执行权限 - 给baci授予可执行权限
``` ```bash
chmod +x ~/Git/java/baci/scripts/baci chmod +x ~/Git/java/baci/scripts/baci
``` ```
- 添加系统环境变量 - 添加系统环境变量
``` ```bash
fish_add_path ~/Git/java/baci/scripts fish_add_path ~/Git/java/baci/scripts
``` ```
- 查看baci是否存在 - 查看baci是否存在
``` ```bash
which baci which baci
``` ```
- 现在即可编译运行 - 现在即可编译运行
``` ```bash
baci bacc ex3_1.cm baci bacc ex3_1.cm
baci bainterp ex3_1 baci bainterp ex3_1
``` ```

View File

@@ -24,7 +24,7 @@ tags = ["乱七八糟"]
- 首先你需要有一台自己的云服务器建议在1核1G以上配置并安装Debian系统 - 首先你需要有一台自己的云服务器建议在1核1G以上配置并安装Debian系统
- 随后我们安装1panel执行以下命令一键安装 - 随后我们安装1panel执行以下命令一键安装
``` ```bash
curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh && sudo bash quick_start.sh curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh && sudo bash quick_start.sh
``` ```
> 1panel依赖于docker如果实现没有安装docker脚本会帮你安装。 > 1panel依赖于docker如果实现没有安装docker脚本会帮你安装。
@@ -54,33 +54,33 @@ curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_
1. **安装Hugo**:选择好你的框架与主题后这里以hugo为例子随后安装hugo以及对应的依赖 1. **安装Hugo**:选择好你的框架与主题后这里以hugo为例子随后安装hugo以及对应的依赖
- **Windows** - **Windows**
``` ```bash
# 打开以管理员模式运行的PowerShell,输入命令安装 Hugo Extended # 打开以管理员模式运行的PowerShell,输入命令安装 Hugo Extended
winget install Hugo.Hugo.Extended winget install Hugo.Hugo.Extended
``` ```
- **Arch linux** - **Arch linux**
``` ```bash
paru -S hugo paru -S hugo
``` ```
- **检查版本** - **检查版本**
``` ```bash
hugo version hugo version
``` ```
2. **创建新的 Hugo 站点**:选择一个文件夹打开命令行,执行: 2. **创建新的 Hugo 站点**:选择一个文件夹打开命令行,执行:
``` ```bash
hugo new site myblog hugo new site myblog
``` ```
该命令会在``myblog``文件夹下生成hugo的基础目录。 该命令会在``myblog``文件夹下生成hugo的基础目录。
3. **安装主题**,这里以[hugo-blog-awesome](https://jamstackthemes.dev/theme/hugo-blog-awesome/)主题为例: 3. **安装主题**,这里以[hugo-blog-awesome](https://jamstackthemes.dev/theme/hugo-blog-awesome/)主题为例:
``` ```bash
cd myblog cd myblog
git clone https://github.com/hugo-sid/hugo-blog-awesome.git themes/hugo-blog-awesome git clone https://github.com/hugo-sid/hugo-blog-awesome.git themes/hugo-blog-awesome
``` ```
并在``hugo.toml``顶层添加: 并在``hugo.toml``顶层添加:
``` ```bash
theme = "hugo-blog-awesome" theme = "hugo-blog-awesome"
``` ```
这样 Hugo 在构建时会从 themes/ 目录加载主题文件。后续可使用``git pull``获取主题更新。 这样 Hugo 在构建时会从 themes/ 目录加载主题文件。后续可使用``git pull``获取主题更新。
@@ -88,7 +88,7 @@ theme = "hugo-blog-awesome"
> 你也可以直接用theme中的文件夹替换掉项目根目录下的同名文件夹并再次修改。 > 你也可以直接用theme中的文件夹替换掉项目根目录下的同名文件夹并再次修改。
4. **写入文章**:使用 Hugo 提供的命令创建新文章: 4. **写入文章**:使用 Hugo 提供的命令创建新文章:
``` ```bash
hugo new posts/hello-world.md hugo new posts/hello-world.md
``` ```
该命令会在``content/posts/``下生成 Markdown 文件,打开后修改``title、date、tags``等前缀然后撰写 Markdown 正文, Markdown 编辑器参考[前文](https://blog.dich.bid/about-markdown/)。 该命令会在``content/posts/``下生成 Markdown 文件,打开后修改``title、date、tags``等前缀然后撰写 Markdown 正文, Markdown 编辑器参考[前文](https://blog.dich.bid/about-markdown/)。
@@ -96,7 +96,7 @@ hugo new posts/hello-world.md
> 注意md文章头部和正文之间得使用``<!-- more -->``隔断 > 注意md文章头部和正文之间得使用``<!-- more -->``隔断
5. **本地测试**:在项目根目录运行: 5. **本地测试**:在项目根目录运行:
``` ```bash
hugo server -D hugo server -D
``` ```
然后在浏览器访问``http://localhost:1313``即可实时预览并查看更新效果。 然后在浏览器访问``http://localhost:1313``即可实时预览并查看更新效果。
@@ -132,6 +132,22 @@ hugo server -D
**以上的功能和需求是否对SEO和界面相应时间造成影响** **以上的功能和需求是否对SEO和界面相应时间造成影响**
## 小记
由于我所使用的平台不支持zola因此我直接在本地编译public并推送这样时间久了.git文件夹大小会非常大记录public的变化我又不想将zola的二进制包放入目录下因此有了这个办法
```bash
# 安装git-filter-repo工具
paru git-filter-repo
# 清理public相关的历史
git clone git@github.com:Dichgrem/Blog.git blog1 && cd blog1
git filter-repo --path public --invert-paths
git gc --aggressive --prune=now
# 重新推送到github
git push --force --mirror
```
## 🔗 ## 🔗
- [Hugo官方文档](https://gohugo.io/documentation/) - [Hugo官方文档](https://gohugo.io/documentation/)
- [zola官方文档](https://www.getzola.org/documentation/getting-started/overview/) - [zola官方文档](https://www.getzola.org/documentation/getting-started/overview/)
@@ -140,4 +156,4 @@ hugo server -D
- [如何提高用户网页阅读体验](https://atpx.com/blog/improving-online-reading-experience/) - [如何提高用户网页阅读体验](https://atpx.com/blog/improving-online-reading-experience/)
--- ---
**Done.** **Done.**

View File

@@ -173,6 +173,31 @@ tags = ["乱七八糟"]
- [离散数学-东北大学](https://www.bilibili.com/video/BV1d7411v7zu/?spm_id_from=333.999.0.0&vd_source=cc4bfbaa0f8c6c363ff9afecce036d91) - [离散数学-东北大学](https://www.bilibili.com/video/BV1d7411v7zu/?spm_id_from=333.999.0.0&vd_source=cc4bfbaa0f8c6c363ff9afecce036d91)
- [统计学-个人 UP 主](https://space.bilibili.com/610062295/channel/seriesdetail?sid=2558242&ctype=0) - [统计学-个人 UP 主](https://space.bilibili.com/610062295/channel/seriesdetail?sid=2558242&ctype=0)
## 英语相关
| 频道名称 | 频道 URL | 内容类型 | 口音/特色 | 难度 | 推荐理由/备注 |
| :--- | :--- | :--- | :--- | :--- | :--- |
| **Max Amini** | [youtube.com/@MaxAmini](https://www.youtube.com/@MaxAmini) | 娱乐 | 脱口秀 | 高阶 | 男、伊朗裔美国喜剧演员,语速快,内容幽默。 |
| **Michelle Khare** | [youtube.com/@MichelleKhare](https://www.youtube.com/@MichelleKhare) | 兴趣频道 | Vlog | 中阶 | 女、兴趣内容、有挑战自我的性质。 |
| **This Is How We Bingham** | [youtube.com/@ThisIsHowWeBingham](https://www.google.com/search?q=https://www.youtube.com/%40ThisIsHowWeBingham) | 生活 | 美音 | 初阶 | 一家人的生活记录,语速较慢,内容温馨。 |
| **Travel with Wife and Baby** | [youtube.com/@TravelwithWifeandBaby](https://www.google.com/search?q=https://www.youtube.com/%40TravelwithWifeandBaby) | 生活 | 美音 | 初阶 | 男、旅行Vlog语速适中内容有趣。 |
| **MKBHD** | [youtube.com/@mkbhd](https://www.youtube.com/@mkbhd) | 兴趣频道 | 美音 | 高阶 | 男、科技评测频道,语速快,内容专业,适合科技爱好者。 |
| **Mark Wiens** | [youtube.com/@MarkWiens](https://www.youtube.com/@MarkWiens) | 兴趣频道 | 美音 | 中阶 | 男、美食旅行频道,语速适中,内容诱人。 |
| **MrBeast** | [youtube.com/@MrBeast](https://www.youtube.com/@MrBeast) | 娱乐 | 美音 | 初阶 | 男、以大手笔挑战和慈善活动闻名,语速快,内容刺激。 |
| **Medlife Crisis** | [youtube.com/@MedlifeCrisis](https://www.youtube.com/@MedlifeCrisis) | 知识 | 英音 | 中高阶 | 男、医学专业,内容深入浅出,语速较快。 |
| **Learn English with Bob the Canadian** | [youtube.com/@LearnEnglishwithBobtheCanadian/videos](https://www.youtube.com/@LearnEnglishwithBobtheCanadian/videos) | 英文学习 | 美音 | 初中阶 | 男、内容以日常生活为主,语速较慢,发音清晰,适合初学者。 |
| **The Late Late Show with James Corden** | [youtube.com/@TheLateLateShow](https://www.youtube.com/@TheLateLateShow) | 娱乐 | 英音 | 高阶 | James Corden的深夜秀有很多明星访谈和各种有趣的单元如Carpool Karaoke。 |
| **The School of Life** | [youtube.com/@theschooloflifetv](https://www.youtube.com/@theschooloflifetv) | 知识 | 英音 | 中高阶 | 哲学、心理学、社会学等,内容发人深省,语速适中,是很好的听力材料。 |
| **Kurzgesagt In a Nutshell** | [youtube.com/@kurzgesagt](https://www.youtube.com/@kurzgesagt) | 知识 | 英音 | 中高阶 | 科普动画频道,内容严肃有趣,制作精良,适合拓展词汇和知识面。 |
| **The LeBrons** | [youtube.com/@TheLeBrons](https://www.google.com/search?q=https://www.youtube.com/%40TheLeBrons) | 娱乐 | 美音 | 初阶 | 勒布朗·詹姆斯的播客频道。 |
| **Keith Williams** | [youtube.com/@KeithWilliamsvideos](https://www.google.com/search?q=https://www.youtube.com/%40KeithWilliamsvideos) | 英文学习 | 美音 | 初中阶 | 男、视频内容较长、语速适中、发音标准,适合初学者。 |
| **Kevin in Shanghai** | [youtube.com/@KevinInShanghai](https://www.google.com/search?q=https://www.youtube.com/%40KevinInShanghai) | 生活 | 住在华语地区的外国人 | 初中阶 | 男、在上海生活的外国人,语速慢,内容贴近生活。 |
| **Kevin's English Class** | [youtube.com/@KevinsEnglishClass](https://www.youtube.com/@KevinsEnglishClass) | 英文学习 | 美音 | 初阶 | 男、英文教学频道,内容短小精悍,适合碎片时间学习。 |
| **Leo Roget** | [youtube.com/@leoroget](https://www.google.com/search?q=https://www.youtube.com/%40leoroget) | 生活 | 美音 | 初阶 | 男、日常Vlog、语速适中、内容轻松。 |
| **Learners English** | [youtube.com/@LearnersEnglish](https://www.google.com/search?q=https://www.youtube.com/%40LearnersEnglish) | 英文学习 | 美音 | 初阶 | 男、英文学习频道,内容全面、系统性强。 |
| **LangFocus** | [youtube.com/@Langfocus](https://www.youtube.com/@Langfocus) | 知识 | 美音 | 中阶 | 男、语言学频道,内容涉及语言起源、发展、对比等,语速适中,知识点丰富。 |
## 哲学相关 ## 哲学相关
- [中国人民大学:西方哲学史-张志伟](https://www.bilibili.com/video/BV1y64y1r7Mt/?spm_id_from=333.337.search-card.all.click&vd_source=cc4bfbaa0f8c6c363ff9afecce036d91) - [中国人民大学:西方哲学史-张志伟](https://www.bilibili.com/video/BV1y64y1r7Mt/?spm_id_from=333.337.search-card.all.click&vd_source=cc4bfbaa0f8c6c363ff9afecce036d91)
@@ -206,4 +231,4 @@ tags = ["乱七八糟"]
- [每个程序员都应该知道的内存知识 (带你走读 Ulrich Drepper 的经典论文)](https://www.bilibili.com/video/BV1Xy4y1b7SK/) - [每个程序员都应该知道的内存知识 (带你走读 Ulrich Drepper 的经典论文)](https://www.bilibili.com/video/BV1Xy4y1b7SK/)
## 后记 ## 后记
待续... 待续...

View File

@@ -26,19 +26,19 @@ tags = ["乱七八糟"]
## 免密码运行TUN模式: ## 免密码运行TUN模式:
- 检查 polkit 服务是否正在运行 - 检查 polkit 服务是否正在运行
``` ```bash
systemctl status polkit systemctl status polkit
``` ```
- 若返回状态为除 active (running) 之外的结果,运行 - 若返回状态为除 active (running) 之外的结果,运行
``` ```bash
sudo systemctl enable --now polkit sudo systemctl enable --now polkit
``` ```
- 创建 polkit 策略 - 创建 polkit 策略
``` ```bash
sudo vi /etc/polkit-1/rules.d/99-nopassword.rules sudo vi /etc/polkit-1/rules.d/99-nopassword.rules
``` ```
- 添加以下内容并保存退出 - 添加以下内容并保存退出
``` ```bash
polkit.addRule(function (action, subject) { polkit.addRule(function (action, subject) {
if ( if (
(action.id == "org.freedesktop.resolve1.set-domains" || (action.id == "org.freedesktop.resolve1.set-domains" ||
@@ -53,11 +53,11 @@ polkit.addRule(function (action, subject) {
}); });
``` ```
- 将当前用户添加至 wheel 组中,注意Debian 与衍生系统需要先创建 wheel 组,然后运行: - 将当前用户添加至 wheel 组中,注意Debian 与衍生系统需要先创建 wheel 组,然后运行:
``` ```bash
sudo usermod -G wheel 当前用户 sudo usermod -G wheel 当前用户
``` ```
- 重新加载 polkit 使更改生效 - 重新加载 polkit 使更改生效
``` ```bash
sudo systemctl restart polkit sudo systemctl restart polkit
``` ```

View File

@@ -6,391 +6,205 @@ date = 2023-12-15
tags = ["乱七八糟"] tags = ["乱七八糟"]
+++ +++
前言 Git作为现代软件开发中不可或缺的版本控制工具常常让初学者感到困惑。本文旨在介绍 Git 的全流程安装和基本使用,希望能够帮助新手更轻松地理解和掌握 Git 的基本概念和操作。 前言 Git作为现代软件开发中不可或缺的版本控制工具常常让初学者感到困惑。本文旨在介绍 Git 的全流程安装和基本使用,希望能够帮助新手更轻松地理解和掌握 Git 的基本概念和操作。
<!-- more --> <!-- more -->
## 安装git
- Windows[Git-download](https://git-scm.com/download/) 我们以Github为例子过一遍Git的安装/配置/连接和第一次提交.
- Archlinux`sudo pacman -S git` ## 1.安装Git
## 原理 - Windows官网下载[Git-download](https://git-scm.com/download/)或者使用Scoop/WinGet等等.
一个Git仓库的目录里面包括``工作目录``(即我们要追踪的代码)以及``.git``目录Git 在这里存储自己的数据。Git 维护了三棵“树”:第一个是你的 `工作目录`,它持有实际文件;第二个是 `暂存区Index`,它像个缓存区域,临时保存你的改动;最后是 `HEAD`,它指向你最后一次提交的结果。 - LinuxUbuntu:`sudo apt install git` / Arch:`sudo pacman -S git`
安装完成后可以在终端中检测版本:
![git-tree](http://marklodato.github.io/visual-git-guide/basic-usage.svg.png)
## 创建新仓库
首先我们需要得到一个Git仓库一般有两种方法
- 在本地初始化之后连接到远程;
- 在远程创建后”下载“到本地。
**方法一**
创建新文件夹,在你的项目目录中运行以下命令:
``` ```
git init --initial-branch=main git -v
git version 2.51.2
``` ```
这里设置默认仓库主分支名称为 main,避免因为 main/master 名称不同导致的推送问题。
> Git目前默认的主分支为 master和 github 默认分支 main 不同,这使得默认配置下 git 往往连接失败。除了创建的时候设定外还可以通过以下方法改变默认分支。 ## 2.创建密钥
在推送代码到Github的时候我们需要进行认证有密码认证和密钥认证两种方法现在推荐使用密钥认证。
- 首先生成一对公私钥,这里的邮箱可以随意填写:
```bash
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
``` ```
git config --global init.defaultBranch main //将默认分支修改成main 你会看到如下所示的提示,像我一样填写路径的时候就可以顺便给它改个名字否则会使用默认名id_rsa:
``` ```
**方法二** ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/dich/.ssh/id_rsa): /home/dich/.ssh/Github
```
随后一直按回车即可.
克隆远端服务器上的仓库: - 生成的这对公私钥位于``~/.ssh/config``路径下在Windows中就是``C盘/User/你的用户名``下,带.pub后缀的文件为公钥不带.pub后缀的为私钥,打开公钥复制全部内容然后将公钥添加到Github的``Settings-SSH and GPG keys``中。
- HTTPS方法``git clone https://github.com/Dichgrem/script.git`` > 当你添加完毕后就无法在Github的设置中再次查看它了确保了安全性.
- 或者使用SSH方法``git clone git@github.com:Dichgrem/script.git``
>建议使用SSH方法如果你使用HTTPS方法则提交代码时需要手动输入用户名/密码使用SSH方法则只需要在``~/.ssh/config``中配置即可。 - 随后编辑 `~/.ssh/config` 文件这个文件的作用是让Git知道主机对应的密钥例如
## 配置 ```bash
# GitHub
Git的设置文件为.gitconfig它可以在用户主目录下全局配置也可以在项目目录下项目配置 Host github
HostName github.com
User git
IdentityFile ~/.ssh/Github
# Gitee
Host gitee
HostName gitee.com
User git
IdentityFile ~/.ssh/Gitee
```
> 这边的IdentityFile是你的私钥位置即为不带pub后缀的文件。如果你不想将私钥放在~/.ssh/下,可以查看我的另一篇[博客](https://blog.dich.bid/network-ssh/)
- 设置好上面这些后就可以测试连接到Github,如果成功则显示successfully.
```bash
ssh -T git@github.com
Hi Dichgrem! You've successfully authenticated, but GitHub does not provide shell access.
```
## 3.配置Git
在正式连接到仓库前我们还需要让Git知道我们的用户名和邮箱地址。
- 显示当前的Git配置 - 显示当前的Git配置
``` ```bash
git config --list git config --list
``` ```
- 编辑Git配置文件
``` - 设置提交代码时的用户信息,这里的name推荐和你的GitHub用户名一致邮箱可以不为真实邮箱比如``no-reply@github.com``
git config -e [--global] ```bash
```
- 设置提交代码时的用户信息
```
git config [--global] user.name "[name]" git config [--global] user.name "[name]"
git config [--global] user.email "[email address]" git config [--global] user.email "[email address]"
``` ```
- 设置大小写敏感windows不区分大小写的解决办法
```
git config core.ignorecase false
```
## 连接远程仓库
连接到远程仓库并推送需要证明你有权写入仓库。早期Github可以使用密码认证现在则使用密钥认证。 > 注意如果你填写了你的真实邮箱同时这个仓库又是Public的那么其他人可以看到你的邮箱
- 生成密钥: - 配置默认主分支为Main
```
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
```
- 生成的文件位于``~/.ssh/config``路径下,带.pub后缀的文件为公钥不带.pub后缀的为私钥使用``cat ~/.ssh/id_rsa.pub``将公钥添加到github/gitee的设置-SSH中。
- 随后使用 `ssh-add` 命令将生成的密钥添加到 SSH 代理中。 ```bash
``` git config --global init.defaultBranch main
ssh-add ~/.ssh/github_key
ssh-add ~/.ssh/gitee_key
```
- 在 `~/.ssh/config` 文件中配置不同的主机别名以及相应的密钥文件。编辑该文件并添加内容,例如:
```
# GitHub repository 1
Host github1
HostName github.com
User git
IdentityFile ~/.ssh/github_key
# GitHub repository 2
Host github2
HostName gitee.com
User git
IdentityFile ~/.ssh/gitee_key
``` ```
- 连接到github 这里的设置是因为Git目前默认的主分支名为 master ,而 Github 默认分支名为 main ,这样可以保持一致。
## 4.创建仓库
配置完Git之后我们就可以连接到远程的仓库了。首先创建一个Git仓库一般有两种方法
- 方法一(推荐)在远程创建后下载到本地
我们在Github中的``repositories``下New一个仓库然后在绿色的Code按钮中复制链接克隆远端服务器上的仓库
``` ```
ssh -T git@github.com git clone git@github.com:Dichgrem/script.git
``` ```
- 添加远程仓库:
>如果你前面没有配置密钥就会发现无法使用这个命令克隆仓库。那么什么时候使用HTTPS的克隆呢比如其他人的仓库你没有权限又不想fork一份的情况下就可以使用HTTPS.
- 方法二:在本地初始化之后连接到远程
创建一个新文件夹,然后在那个文件夹下运行以下命令:
```bash
git init --initial-branch=main
``` ```
- 在Github上创建一个同名仓库随后添加远程链接
```bash
git remote add origin <remote_repository_url> git remote add origin <remote_repository_url>
```
# 例如git remote add origin git@github.com:Dichgrem/dichos.git
```
> 如果你运行``git remote -v``发现URL为HTTP格式则可以用下面的命令改为Git格式 > 如果你运行``git remote -v``发现URL为HTTP格式则可以用下面的命令改为Git格式
``` ```bash
# 例如git remote set-url origin git@github.com:Dichgrem/dichos.git # 例如git remote set-url origin git@github.com:Dichgrem/dichos.git
``` ```
## 创建分支 ## 4.推送代码
```
git branch main
```
这将创建一个名为 main 的分支。
- 删除分支 - 添加
```
git branch -d master
```
- 使用大写强制删除
```
git branch -D master
```
在Git仓库中新建或修改文件后使用如下命令把它们添加到暂存区
## 添加和提交 ```bash
你可以提出更改(把它们添加到暂存区),使用如下命令:
```
git add <filename>
git add * git add *
``` ```
这是 git 基本工作流程的第一步;使用如下命令以实际提交改动:
``` - 提交
随后使用如下命令提交改动:
```bash
git commit -m "代码提交信息" git commit -m "代码提交信息"
# 例如git commit -m "Initial commit" # 例如git commit -m "update:mycode"
``` ```
现在,你的改动已经提交到了 **HEAD**,但是还没到你的远端仓库。 现在,你的改动已经提交到了 **HEAD**,但是还没到你的远端仓库。
- 添加指定文件到暂存区 - 推送改动
```
git add [file1] [file2] ...
```
- 添加指定目录到暂存区,包括子目录
```
git add [dir]
```
- 添加当前目录的所有文件到暂存区
```
git add .
```
添加每个变化前,都会要求确认
- 对于同一个文件的多处变化,可以实现分次提交
```
git add -p
```
- 删除工作区文件,并且将这次删除放入暂存区
```
git rm [file1] [file2] ...
```
- 停止追踪指定文件,但该文件会保留在工作区
```
git rm --cached [file]
```
- 改名文件,并且将这个改名放入暂存区
```
git mv [file-original] [file-renamed]
```
## 推送改动
你的改动现在已经在本地仓库的 **HEAD** 中了。执行如下命令以将这些改动提交到远端仓库 执行如下命令以将这些改动提交到远端仓库,随后即可在GitHub上查看
```
```bash
git push origin main git push origin main
``` ```
可以把 **main** 换成你想要推送的任何分支,如**master**或者**test**
如果你的远程仓库是最新的,可以使用以下命令更新本地仓库: > 想学习更多Git操作可以使用这个[Git练习网站](https://learngitbranching.js.org/?locale=zh_CN)
```
git pull
```
## 合并分支
分支是用来将特性开发绝缘开来的。比如你在本地的test分支新增了一个功能想要合并到主分支中。 ## 5.Commit规范
创建一个叫做“test”的分支并切换过去 - 提交信息的基本格式,例如
```
git checkout -b test
```
新增某些功能后切换回主分支:
```
git checkout master
```
在主分支上执行合并操作,将 test 分支的改动合并到主分支:
```
git merge test
```
推送完成后可以把新建的分支删掉:
```
git branch -d test
```
### 分支常用操作
```
- 列出所有本地分支
git branch
- 列出所有远程分支
git branch -r
- 列出所有本地分支和远程分支
git branch -a
- 列出所有本地分支,并展示没有分支最后一次提交的信息
git branch -v
- 列出所有本地分支,并展示没有分支最后一次提交的信息和远程分支的追踪情况
git branch -vv
- 列出所有已经合并到当前分支的分支
git branch --merged
- 列出所有还没有合并到当前分支的分支
git branch --no-merged
- 新建一个分支,但依然停留在当前分支
git branch [branch-name]
- 新建一个分支,并切换到该分支
git checkout -b [branch]
- 新建一个与远程分支同名的分支,并切换到该分支
git checkout --track [branch-name]
- 新建一个分支指向指定commit
git branch [branch] [commit]
- 新建一个分支,与指定的远程分支建立追踪关系
git branch --track [branch] [remote-branch]
- 切换到指定分支,并更新工作区
git checkout [branch-name]
- 切换到上一个分支
git checkout -
- 建立追踪关系,在现有分支与指定的远程分支之间
git branch --set-upstream-to=[remote-branch]
git branch --set-upstream [branch] [remote-branch] - 已被弃用
- 合并指定分支到当前分支
git merge [branch]
- 中断此次合并(你可能不想处理冲突)
git merge --abort
- 选择一个commit合并进当前分支
git cherry-pick [commit]
- 删除分支
git branch -d [branch-name]
#新增远程分支 远程分支需先在本地创建,再进行推送
git push origin [branch-name]
- 删除远程分支
git push origin --delete [branch-name]
git branch -dr [remote/branch]
```
## 标签
Git 的 tag 功能主要用于``给仓库历史中的某个特定提交打上“标签”``,通常用于标记版本发布点(例如 v1.0、v2.0 等),以``便于后续的版本定位、回溯和发布管理``。
### 标签类型
Git 提供两种类型的标签:
- 附注标签Annotated Tag会创建成一个完整的 Git 对象,存储打标签者的名字、邮箱、日期和标签说明,还可采用 GPG 进行签名。推荐用于正式发布,因为包含更多元数据和安全信息。
- 轻量标签Lightweight Tag实际上只是对某个提交的引用不保存额外信息类似一个固定的分支。适用于临时标记或非正式用途。
### 创建标签
- 创建附注标签
使用 -a 参数表示“annotated”并用 -m 提供标签说明。例如,给当前提交创建一个名为 v1.0 的附注标签:
```
git tag -a v1.0 -m "发布版本 v1.0"
```
这会在 Git 数据库中生成一个完整的标签对象,可通过 git show v1.0 查看标签信息和对应的提交详情。
如果需要给旧提交贴标签,可以在命令末尾指定提交的 SHA 值(部分 SHA 也可):
```
git tag -a v1.0 <commit-sha> -m "发布版本 v1.0"
```
- 创建轻量标签
直接指定标签名即可,不加任何参数:
```
git tag v1.0-light
```
轻量标签仅仅是一个提交引用,因此查看时不会显示附加信息。
### 列出标签
- 列出所有标签
```
git tag
```
- 还可以使用通配符过滤:
```
git tag -l "v1.*"
```
这样便于管理和筛选大量标签。
- 查看标签详细信息
```
git show v1.0
```
这会显示标签对象的元数据以及对应的提交记录。
### 推送标签
``默认情况下git push 不会将本地标签推送到远程仓库。推送标签有两种方式:``
- 推送单个标签
```
git push origin v1.0
```
- 一次性推送所有标签
```
git push origin --tags
```
### 删除标签
- 删除本地标签
```
git tag -d v1.0
```
- 删除远程标签
```
git push origin --delete v1.0
```
## 日志
如果你想了解本地仓库的历史记录,最简单的命令就是使用:
```
git log
```
- 只看某一个人的提交记录:
```
git log --author=bob
```
- 一个压缩后的每一条提交记录只占一行的输出:
```
git log --pretty=oneline
```
- 看看哪些文件改变了:
```
git log --name-status
```
## 删除前一个提交记录
有时候手滑或者不想使用一个commit说明可以用以下命令撤销上一个 commit
```
git reset --soft HEAD~1
```
这个命令会撤销上一个 commit但保留文件修改代码仍然在工作区。适用于 想要重新提交amend或调整 commit 的情况。
如果你想彻底删除更改(不保留代码修改),可以使用:
```
git reset --hard HEAD~1
```
> 注意:--hard 会清除未提交的更改,无法恢复。
## `.git` 目录中主要文件和子目录的结构及其作用
### 📁 `.git` 目录结构概览
``` ```
feat:add_highlight
```
- 常见的 Commit 类型
```bash
- feat新功能的添加
- fix修复 Bug
- docs文档相关的修改
- style代码格式、排版等不影响代码逻辑的调整
- refactor代码重构不涉及新功能或 Bug 修复
- perf性能优化
- test添加或修改测试代码
- build构建相关的变更如依赖管理、构建脚本等
- ci持续集成相关的修改
- chore其他杂项维护不涉及源代码或测试文件的修改
- revert回滚到上一个版本的提交
```
## 6.Git原理
- 三棵树
一个Git仓库的目录里面包括``工作目录``(即我们要追踪的代码)以及``.git``目录Git 在这里存储自己的数据。Git 维护了三棵“树”:第一个是你的 `工作目录`,它持有实际文件;第二个是 `暂存区Index`,它像个缓存区域,临时保存你的改动;最后是 `HEAD`,它指向你最后一次提交的结果。
![git-tree](http://marklodato.github.io/visual-git-guide/basic-usage.svg.png)
- `.git` 目录结构
```bash
.git/ .git/
├── HEAD ├── HEAD
├── config ├── config
@@ -411,95 +225,95 @@ git reset --hard HEAD~1
│ └── tags/ │ └── tags/
``` ```
### 🗂️ 核心文件和目录说明 * objects存储 Git 的所有对象,包括:
* blob文件内容
* tree目录结构
* commit提交对象记录提交信息和指向的树对象
* tag标签对象
这些对象以 SHA-1 哈希命名,前两位作为子目录,其余作为文件名
* refs存储所有引用包括
* heads本地分支
* remotes远程分支
* tags标签
* HEAD指向当前检出的分支或提交。例如`ref: refs/heads/main` 表示当前位于 `main` 分支
* config仓库级别的配置文件包含用户名、邮箱、远程仓库等信息
* description用于描述仓库仅供 GitWeb 等工具使用
* hooks存放 Git 钩子脚本的目录,可用于在特定操作前后执行自定义脚本,如 `pre-commit`、`post-merge` 等
* index暂存区staging area的索引文件记录了即将提交的文件信息
* info包含辅助信息如 `exclude` 文件用于定义仓库级别的忽略规则
* logs记录了引用如分支、标签的更新历史有助于追踪操作记录
* **HEAD**:指向当前检出的分支或提交。例如,`ref: refs/heads/main` 表示当前位于 `main` 分支。 ---
* **config**:仓库级别的配置文件,包含用户名、邮箱、远程仓库等信息. ## 7.Tips
* **description**:用于描述仓库,仅供 GitWeb 等工具使用。
* **hooks/**:存放 Git 钩子脚本的目录,可用于在特定操作前后执行自定义脚本,如 `pre-commit`、`post-merge` 等. ### Verified
* **index**暂存区staging area的索引文件记录了即将提交的文件信息。 在 GitHub 的 commit 历史中看到的 “Verified” 标记,表示该提交是经过 签名验证signed commit 的,也就是 GitHub 能确认这个 commit 的确是由声明的提交者签名并发布的。可以通过GPG或者SSH配置
* **info/**:包含辅助信息,如 `exclude` 文件用于定义仓库级别的忽略规则。 - GPG方式
* **logs/**:记录了引用(如分支、标签)的更新历史,有助于追踪操作记录。 ```bash
sudo pacman -S gnupg //安装 GPG
* **objects/**:存储 Git 的所有对象,包括: gpg --full-generate-key //生成 GPG 密钥
gpg --list-secret-keys --keyid-format=long //查看你生成的密钥 ID
* **blob**:文件内容。 git config --global user.signingkey ABCDEF1234567890 //让 Git 使用该密钥签名
* **tree**:目录结构。 git config --global commit.gpgsign true //启用自动签名所有提交
* **commit**:提交对象,记录提交信息和指向的树对象。 gpg --armor --export ABCDEF1234567890 //导出公钥并添加到 GitHub
* **tag**:标签对象。
这些对象以 SHA-1 哈希命名,前两位作为子目录,其余作为文件名。
* **refs/**:存储所有引用,包括:
* **heads/**:本地分支。
* **remotes/**:远程分支。
* **tags/**:标签。
## Commit规范
### 提交信息的基本格式
- Header头部
格式:
``` ```
<type>[可选的 scope]: <简短描述> 然后前往``GitHub → Settings → SSH and GPG keys → New GPG key``粘贴并保存。
- SSH方式
可以用你平时登录 GitHub 的同一个 SSH 密钥:
```bash
git config --global gpg.format ssh //让 Git 使用 SSH 格式签名
git config --global user.signingkey ~/.ssh/Github.pub //指定使用的 SSH 公钥
git config --global commit.gpgsign true //表示自动签名所有提交
```
然后前往``Settings → SSH and GPG keys → New SSH key → Signing key``粘贴并保存。
- 本地查看
首先创建这个文件:
```bash
mkdir -p ~/.ssh
nano ~/.ssh/allowed_signers
```
写入你的 ``test@mail.com ssh-ed25519 AAAABBBBBBBBBBBBBBBBxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx``并保存。
随后配置Git信任该文件
```bash
git config --global gpg.ssh.allowedSignersFile ~/.ssh/allowed_signers
```
随后使用``git log --show-signature``即可查看本地log中的
```bash
Good "git" signature for test@mail.com with ED25519 key SHA256:ssh-ed25519 AAAABBBBBBBBBBBBBBBBBBBBB
``` ```
type 表示提交类型feat新功能、fix修复bug等。 ### 生成补丁
scope 是可选的,用于指出变更影响的模块或范围。
简短描述 用于概述本次提交的核心内容,通常使用祈使语气。
- Body正文 比如你修改了项目中的``fs/proc/base.c``,然后
用于详细说明变更的动机、方法以及可能的影响,建议每行不超过 72 个字符。
- Footer脚注
可选部分,用来引用相关 issue、任务或说明破坏性变更例如BREAKING CHANGE: ...)。例如:
```bash
git add fs/proc/base.c
git commit -m "fix:base"
git format-patch origin/16.0
``` ```
Fixes #123 即可在目录下生成补丁``0001-fix-base.patch``.
### 删除前一个提交记录
有时候手滑或者不想使用一个commit说明可以用以下命令撤销上一个 commit
```bash
git reset --soft HEAD~1
``` ```
可以在提交后自动关闭相关问题 个命令会撤销上一个 commit但保留文件修改代码仍然在工作区。适用于 想要重新提交amend或调整 commit 的情况
### 常见的 Commit 类型 如果你想彻底删除更改(不保留代码修改),可以使用:
```bash
git reset --hard HEAD~1
``` ```
- feat新功能的添加
示例feat(user): 添加用户注册功能
- fix修复 Bug
示例fix(parser): 修复解析错误导致程序崩溃
- docs文档相关的修改
示例docs(readme): 更新使用说明
- style代码格式、排版等不影响代码逻辑的调整
示例style: 优化代码缩进和空格
- refactor代码重构不涉及新功能或 Bug 修复
示例refactor: 优化数据处理逻辑
- perf性能优化
示例perf: 提升数据查询速度
- test添加或修改测试代码
示例test: 补充用户登录单元测试
- build构建相关的变更如依赖管理、构建脚本等
示例build: 更新 webpack 配置
- ci持续集成相关的修改
示例ci: 调整 GitHub Actions 配置
- chore其他杂项维护不涉及源代码或测试文件的修改
示例chore: 更新项目依赖
- revert回滚到上一个版本的提交
示例revert: 撤销上次提交
```
--- ---
**Done.** **Done.**

View File

@@ -52,19 +52,19 @@ tags = ["乱七八糟"]
## 安装 GnuPG ## 安装 GnuPG
``` ```bash
paru -S gnupg paru -S gnupg
``` ```
## 生成公钥与私钥 ## 生成公钥与私钥
使用如下命令: 使用如下命令:
``` ```bash
gpg --full-generate-key gpg --full-generate-key
``` ```
生成流程: 生成流程:
``` ```bash
gpg (GnuPG) 2.4.7; Copyright (C) 2024 g10 Code GmbH gpg (GnuPG) 2.4.7; Copyright (C) 2024 g10 Code GmbH
This is free software: you are free to change and redistribute it. This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. There is NO WARRANTY, to the extent permitted by law.
@@ -116,7 +116,7 @@ generator a better chance to gain enough entropy.
``` ```
## 列出密钥 ## 列出密钥
``` ```bash
gpg --list-secret-keys --keyid-format long gpg --list-secret-keys --keyid-format long
``` ```
@@ -126,18 +126,18 @@ gpg --list-secret-keys --keyid-format long
例如上传你的 key 例如上传你的 key
``` ```bash
gpg --send-keys <你的LongKeyID> gpg --send-keys <你的LongKeyID>
``` ```
默认为你的 gpg.conf 中配置的 keyserver也可以显式指定 默认为你的 gpg.conf 中配置的 keyserver也可以显式指定
``` ```bash
gpg --keyserver hkps://keys.openpgp.org --send-keys <KeyID> gpg --keyserver hkps://keys.openpgp.org --send-keys <KeyID>
``` ```
也可以使用如下命令导出公钥为可读 ASCII 格式类似ssh-keys随后即可发布在个人博客上等等。 也可以使用如下命令导出公钥为可读 ASCII 格式类似ssh-keys随后即可发布在个人博客上等等。
``` ```bash
gpg --armor --export <KeyID> > mypubkey.asc gpg --armor --export <KeyID> > mypubkey.asc
``` ```
@@ -145,7 +145,7 @@ gpg --armor --export <KeyID> > mypubkey.asc
如果怀疑密钥被泄露或被中间人替换立即发布“撤销证书”revocation certificate并上传到 keyserver。 如果怀疑密钥被泄露或被中间人替换立即发布“撤销证书”revocation certificate并上传到 keyserver。
``` ```bash
gpg --gen-revoke <KeyID> > revoke.asc gpg --gen-revoke <KeyID> > revoke.asc
``` ```
上传撤销证书后,所有人都能知道该公钥已不再可信。 上传撤销证书后,所有人都能知道该公钥已不再可信。

View File

@@ -10,35 +10,36 @@ tags = ["乱七八糟"]
<!-- more --> <!-- more -->
## Lazy! ## Lazy!
> Vim 是从早期的 vi 编辑器发展而来的增强版其名称代表“Vi IMproved”。由荷兰程序员 Bram Moolenaar 于 1991 年首次发布。Vim 是开源软件,支持多种操作系统,包括 Unix、Linux、Windows 和 macOS 等。
> LazyVim 是一个基于 Neovim 的现代化配置框架,旨在简化 Neovim 的配置过程。它通过集成的 lazy.nvim 插件管理器,提供了一种易于定制和扩展配置的方式,结合了从头开始配置的灵活性和预配置设置的便利性 。 > LazyVim 是一个基于 Neovim 的现代化配置框架,旨在简化 Neovim 的配置过程。它通过集成的 lazy.nvim 插件管理器,提供了一种易于定制和扩展配置的方式,结合了从头开始配置的灵活性和预配置设置的便利性 。
> LazyVim 是在Neovim的基础上进行配置Neovim又继承了vim的操作模式对vim不熟悉的同学可以看[这里](https://vimsheet.com/) > LazyVim 是在Neovim的基础上进行配置Neovim又继承了vim的操作模式对vim不熟悉的同学可以看[这里](https://vimsheet.com/)或者本文末尾的 Vim 速查表.
## 安装 ## 安装
首先安装neovim,在arch linux上是 首先安装neovim,在arch linux上是
``` ```bash
paru -S neovim paru -S neovim
``` ```
在Ubuntu上是 在Ubuntu上是
``` ```bash
sudo add-apt-repository ppa:neovim-ppa/unstable sudo add-apt-repository ppa:neovim-ppa/unstable
sudo apt update sudo apt update
sudo apt install -y \ neovim git curl unzip build-essential ripgrep fd-find sudo apt install -y \ neovim git curl unzip build-essential ripgrep fd-find
``` ```
备份现有配置: 备份现有配置:
``` ```bash
mv ~/.config/nvim ~/.config/nvim.bak mv ~/.config/nvim ~/.config/nvim.bak
mv ~/.local/share/nvim ~/.local/share/nvim.bak mv ~/.local/share/nvim ~/.local/share/nvim.bak
``` ```
克隆 LazyVim Starter 模板: 克隆 LazyVim Starter 模板:
``` ```bash
git clone https://github.com/LazyVim/starter ~/.config/nvim git clone https://github.com/LazyVim/starter ~/.config/nvim
``` ```
启动 Neovim 启动 Neovim
``` ```bash
nvim nvim
``` ```
首次启动时LazyVim 会自动安装并配置所需的插件。 首次启动时LazyVim 会自动安装并配置所需的插件。
@@ -46,7 +47,7 @@ nvim
## 结构 ## 结构
LazyVim 的配置目录通常位于``~/.config/nvim/``中: LazyVim 的配置目录通常位于``~/.config/nvim/``中:
``` ``` bash
~/.config/nvim ~/.config/nvim
tree tree
. .
@@ -230,7 +231,7 @@ LazyVim 默认使用``<space> 作为 <leader>``\ 作为``<localleader>``
在``~/config/nvim/lua/plugins/``下新建一个mp.lua写入如下配置 在``~/config/nvim/lua/plugins/``下新建一个mp.lua写入如下配置
``` ```lua
return { return {
{ {
"iamcco/markdown-preview.nvim", "iamcco/markdown-preview.nvim",
@@ -242,21 +243,21 @@ return {
``` ```
随后即可在 Neovim 中打开一个 Markdown 文件,执行以下命令启动预览:​ 随后即可在 Neovim 中打开一个 Markdown 文件,执行以下命令启动预览:​
``` ```bash
:MarkdownPreview :MarkdownPreview
``` ```
## tips ## tips
- lazyvim中的行号是非自然序的这是为了方便光标移动而设置的你可以在正常模式中通过10k快速移动光标到10行前10j10h10l同理。
- lazyvim的字体是和终端相同的不同单独设置
- lazyvim中在侧边栏选择文件按d删除,按y复制,按p粘贴,按a创建,按r重命名
- gcc:注释当前行; - gcc:注释当前行;
- g+ctrl+g:显示信息; - g+ctrl+g:显示信息;
- alt+h显示隐藏文件 - alt+h显示隐藏文件
- space+c+f:将当前代码格式化; - space+c+f:将当前代码格式化;
- 设置文件编码``:set fileencoding?`` - 设置文件编码``:set fileencoding?``
- 设置换行符``:set fileformat=unix`` - 设置换行符``:set fileformat=unix``
- lazyvim的字体是和终端相同的不同单独设置
- lazyvim中在侧边栏选择文件按d删除,按y复制,按p粘贴,按a创建,按r重命名
- lazyvim中的行号是非自然序的这是为了方便光标移动而设置的你可以在正常模式中通过10k快速移动光标到10行前10j10h10l同理。
- LSP快捷操作 - LSP快捷操作
| 快捷键 | 功能 | | 快捷键 | 功能 |
@@ -273,13 +274,23 @@ return {
> 编辑器的基本素养 > 编辑器的基本素养
``文件操作`` ``外观``
- 创建文件/文件夹 - 面板
- 打开/关闭/切换文件 - 侧边栏
- 复制/粘贴 - Git符号
- 写入/保存/退出 - 全局主题
- 文件类型主题
``编辑器``
- 显示行号
- 搜索替换 - 搜索替换
``Code``
- 高亮
- 格式化
- 自动补全
- 代码调试
``字符处理`` ``字符处理``
- LF/CRLF处理 - LF/CRLF处理
- 零宽字符处理 - 零宽字符处理
@@ -288,13 +299,173 @@ return {
``终端`` ``终端``
- 打开终端/复用终端 - 打开终端/复用终端
``其他功能`` ``文件操作``
- LSP - 创建文件/文件夹
- 代码调试 - 打开/关闭/切换文件
- 工作区切换 - 复制/粘贴
- Git支持 - 写入/保存/退出
- 主题与显示效果
``其他功能``
- 工作区切换
- gitui
- diff历史
## 一份优秀的 Vim 速查表
> 翻译自``https://vimsheet.com/``
我整理了一份我每天使用的 Vim 基本命令列表,并提供了一些配置建议,使 Vim 更加实用。因为没有配置的 Vim 使用起来会比较痛苦。
## 基础命令
### 光标移动(普通模式/可视模式)
* `h` `j` `k` `l`:左、下、上、右移动
* `w` / `b`:下一个/上一个单词
* `W` / `B`:下一个/上一个以空格分隔的单词
* `e` / `ge`:下一个/上一个单词的结尾
* `0` / `$`:行首/行尾
* `^`:行首第一个非空白字符(等同于 `0w`
### 编辑文本
* `i` / `a`:在光标处/之后进入插入模式
* `I` / `A`:在行首/行尾进入插入模式
* `o` / `O`:在当前行下方/上方插入空行
* `Esc` 或 `Ctrl+[`:退出插入模式
* `d`:删除
* `dd`:删除整行
* `c`:删除并进入插入模式
* `cc`:删除整行并进入插入模式
### 操作符
* 操作符也适用于可视模式
* `d`:从光标处删除到移动目标
* `c`:从光标处删除到移动目标,并进入插入模式
* `y`:从光标处复制到移动目标
* `>`:缩进一级
* `<`:取消缩进一级
* 操作符可与移动命令组合使用,例如:`d$` 删除从光标到行尾的内容
### 标记文本(可视模式)
* `v`:进入可视模式
* `V`:进入行可视模式
* `Ctrl+v`:进入块可视模式
* `Esc` 或 `Ctrl+[`:退出可视模式
### 剪贴板操作
* `yy`:复制整行
* `p`:在光标后粘贴
* `P`:在光标前粘贴
* `dd`:剪切整行
* `x`:删除当前字符
* `X`:删除前一个字符
* 默认情况下,`d` / `c` 会将删除的内容复制到剪贴板
### 退出
* `:w`:保存文件但不退出
* `:wq`:保存并退出
* `:q`:退出(如果有修改会失败)
* `:q!`:强制退出并放弃修改
### 搜索/替换
* `/pattern`:搜索 pattern
* `?pattern`:向上搜索 pattern
* `n`:重复上一次搜索(同方向)
* `N`:重复上一次搜索(反方向)
* `:%s/old/new/g`:全文件替换 old 为 new
* `:%s/old/new/gc`:全文件替换 old 为 new并逐个确认
### 常规命令
* `u`:撤销
* `Ctrl+r`:重做
## 高级命令
### 光标移动
* `Ctrl+d`:向下移动半页
* `Ctrl+u`:向上移动半页
* `}`:跳转到下一个段落(空行)
* `{`:跳转到上一个段落(空行)
* `gg`:跳转到文件顶部
* `G`:跳转到文件底部
* `:[num]`:跳转到指定行号
* `Ctrl+e` / `Ctrl+y`:向下/向上滚动一行
### 字符搜索
* `f [char]`:向前移动到指定字符
* `F [char]`:向后移动到指定字符
* `t [char]`:向前移动到指定字符之前
* `T [char]`:向后移动到指定字符之前
* `;` / `,`:重复上一次字符搜索(正向/反向)
### 编辑文本
* `J`:将下一行合并到当前行
* `r [char]`:用指定字符替换当前字符(不进入插入模式)
### 可视模式
* `O`:移动到块的另一个角
* `o`:移动到标记区域的另一端
### 文件标签
* `:e filename`:编辑文件
* `:tabe`:打开新标签页
* `gt`:切换到下一个标签页
* `gT`:切换到上一个标签页
* `:vsp`:垂直分割窗口
* `Ctrl+ws`:水平分割窗口
* `Ctrl+wv`:垂直分割窗口
* `Ctrl+ww`:在窗口间切换
* `Ctrl+wq`:关闭当前窗口
### 标记
* 标记允许你跳转到代码中的指定位置
* `m{a-z}`:在光标位置设置标记 {a-z}
* 大写标记 {A-Z} 是全局标记,可跨文件使用
* `'{a-z}`:跳转到设置标记的行首
* `''`:返回上一个跳转位置
### 文本对象
* 例如:`def (arg1, arg2, arg3)`,光标在括号内
* `di(`:删除括号内的内容,即“删除最近括号内的内容”
* 如果没有文本对象,你需要使用 `T(dt)` 来实现相同的功能
### 常规命令
* `.`:重复上一次命令
* 在插入模式下,`Ctrl+r 0`:插入最近复制的文本
* `gv`:重新选择上一次选中的文本块
* `%`:在匹配的 `()` 或 `{}` 之间跳转
---
如果你希望将此速查表保存为 PDF 或打印出来,可以使用 Markdown 编辑器(如 Typora或在线工具如 Dillinger进行导出。
此外Vim 的默认配置可能不够友好,建议你参考以下资源进行配置优化:
* [vim-sensible](https://github.com/tpope/vim-sensible):提供一套合理的默认配置
* [vim-pathogen](https://github.com/tpope/vim-pathogen):插件管理工具
* [ag.vim](https://github.com/rking/ag.vim):快速全局搜索插件
* [ctrlp.vim](https://github.com/ctrlpvim/ctrlp.vim):文件和缓冲区快速切换插件
* [nerdcommenter](https://github.com/preservim/nerdcommenter):代码注释插件
这些插件可以显著提升 Vim 的功能,使其更接近一个完整的 IDE。
---
🔗 🔗
[用 neovim 写 markdown 是一种什么样的体验](https://yelog.org/2024/08/02/write-markdown-in-neovim-experience-and-tips/) [用 neovim 写 markdown 是一种什么样的体验](https://yelog.org/2024/08/02/write-markdown-in-neovim-experience-and-tips/)

View File

@@ -19,7 +19,7 @@ tags = ["乱七八糟"]
## 三.解决方法 ## 三.解决方法
既然是高低电平表述的错误那么我们只需建立DSDT 表副本,将其修改,然后让它优先启动,从而让键盘配置正常;另外还存在 BIOS 修复,内核编译的方法,比较复杂,这里不做说明。 既然是高低电平表述的错误那么我们只需建立DSDT 表副本,将其修改,然后让它优先启动,从而让键盘配置正常;另外还存在 BIOS 修复,内核编译的方法,比较复杂,这里不做说明。
``` ```bash
首先建立一个DSDT文件夹 首先建立一个DSDT文件夹
sudo su sudo su
mkdir -p /home/dsdt mkdir -p /home/dsdt
@@ -75,7 +75,7 @@ reboot
### 修复wifi驱动 ### 修复wifi驱动
``` ```bash
# 内核小于5.18的 # 内核小于5.18的
git clone https://github.com/HRex39/rtl8852be.git git clone https://github.com/HRex39/rtl8852be.git
# 内核大于等于5.18的 # 内核大于等于5.18的
@@ -89,7 +89,7 @@ sudo modprobe 8852be
### 修复蓝牙驱动 ### 修复蓝牙驱动
``` ```bash
# 内核=5.15 # 内核=5.15
git clone https://github.com/HRex39/rtl8852be_bt.git -b 5.15 git clone https://github.com/HRex39/rtl8852be_bt.git -b 5.15
# 内核=5.18 # 内核=5.18
@@ -104,13 +104,13 @@ sudo make install
首先去amd官网下载最新的linux-amd驱动 首先去amd官网下载最新的linux-amd驱动
```` ````bash
https://www.amd.com/zh-hans/support/linux-drivers // 22.20 for Ubuntu 20.04.5 HWE https://www.amd.com/zh-hans/support/linux-drivers // 22.20 for Ubuntu 20.04.5 HWE
```` ````
修改Deepin为ubuntu 修改Deepin为ubuntu
```` ````bash
sudo vim /etc/os-release // ID=Deepin => ID=ubuntu sudo vim /etc/os-release // ID=Deepin => ID=ubuntu
sudo apt install ./amdgpu-install_22.20.50200-1_all.deb sudo apt install ./amdgpu-install_22.20.50200-1_all.deb
@@ -128,7 +128,7 @@ sudo apt install inxi clinfo
`inxi -G` `inxi -G`
```` ````bash
Graphics: Device-1: AMD Rembrandt driver: amdgpu v: kernel Graphics: Device-1: AMD Rembrandt driver: amdgpu v: kernel
Display: x11 server: X.Org 1.20.11 driver: amdgpu,ati unloaded: fbdev,modesetting,vesa Display: x11 server: X.Org 1.20.11 driver: amdgpu,ati unloaded: fbdev,modesetting,vesa
resolution: 1920x1080~60Hz resolution: 1920x1080~60Hz
@@ -138,14 +138,14 @@ Graphics: Device-1: AMD Rembrandt driver: amdgpu v: kernel
最后还原最初的修改: 最后还原最初的修改:
```` ````bash
sudo vim /etc/os-release // ID=ubuntu => ID=Deepin sudo vim /etc/os-release // ID=ubuntu => ID=Deepin
sudo apt purge amdgpu-install sudo apt purge amdgpu-install
```` ````
看下效果图: 看下效果图:
```` ````bash
➜ ~ glxinfo -B ➜ ~ glxinfo -B
name of display: :0 name of display: :0
display: :0 screen: 0 display: :0 screen: 0
@@ -193,7 +193,7 @@ OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.20
安装下面的三方电源管理工具 `Boost Changer`,选择 `Performance`策略即可 安装下面的三方电源管理工具 `Boost Changer`,选择 `Performance`策略即可
```` ````bash
wget https://github.com/nbebaw/boostchanger/releases/download/v4.4.0/boostchanger_4.4.0_amd64.deb wget https://github.com/nbebaw/boostchanger/releases/download/v4.4.0/boostchanger_4.4.0_amd64.deb
```` ````
## 参考 ## 参考

View File

@@ -1,5 +1,5 @@
+++ +++
title = "搭建个人信息流:播客收听指北" title = "乱七八糟:播客收听指北"
date = 2024-03-06 date = 2024-03-06
[taxonomies] [taxonomies]

View File

@@ -1,72 +0,0 @@
+++
title = "乱七八糟:跑步笔记(一)"
date = 2024-06-08
[taxonomies]
tags = ["乱七八糟"]
+++
前言 最近读得<<亮哥跑经>>一书,遂迷上跑步;奈何体重偏高,略微有些吃力.以下是一些笔记:
<!-- more -->
> 为啥有人跑两步就喘?
- 运动基础薄弱
再慢的跑步,它也比快走的强度要大。跑步虽然很简单,但它并不是低强度的运动。
- 呼吸方法错误
跑步时需要更多的氧气,如果呼和吸的量不均等,吐气比吸的要多,身体没有充分地进行气体交换,就会气喘吁吁。
- 呼吸肌能力较弱
大基数体重的人,腹部往往很胖,身体的呼吸系统较弱。内脏脂肪多,呼吸肌就像吹大的气球一样,被撑薄了,相应的,它收缩和扩张的能力就会下降,所以大体重的人跑步更容易喘。而且除了容易喘之外,他们跑步也更容易岔气。
> 正确的呼吸方法是什么?
- 建议初学者采用两步一吸两步一呼的方式。
- 等跑了一段时间,心肺功能和整体体能加强之后,可以改为三步一吸三步一呼。
- 需要注意的是,最好口鼻同时呼吸,才能使充足氧气吸入
> 冬天跑步注意事项
- 冬天户外跑时,因为天气比较冷,为了防止冷空气进入我们的身体,可以带一个薄薄的口罩。
- 不要秋天的时候都没跑,到冬天最冷的时候突然出去跑步了。也不要顶风跑,这样你的呼吸系统是受不了的。
- 冬天跑步的时候,可以用舌尖顶住上牙膛,过滤加温一下冷空气,免得空气直灌入身体,造成肠胃不适。
> 为什么会岔气?
- 岔气,简单来说,就是呼吸肌痉挛(抽筋)了。
- 当呼吸肌的能力不足以支撑你的身体这样强度运动时,就会通过痉挛的方式告诉你,你需要停下来或者减慢速度。
- 平时可以配合做一些腰腹部的核心训练,比如说卷腹、平板支撑等,多练习腹部呼吸法,这样在加强核心力量的同时,也加强了呼吸肌的能力。
- 跑步之前,要做好充分的热身,不要上来就加速跑,逐渐平缓地提升呼吸节奏,你得让呼吸肌有适应的过程。
- 如果跑步时出现了岔气情况,可以放慢跑步速度;严重的话,可以停下来调整呼吸,并且身体向相反方向伸展,右侧岔气的话,那就向上伸直右侧手臂,并向左侧伸展 1530 秒.
> 跑步前期很难坚持,怎么办?
- 刚开始跑,心肺体能都还跟不上,那可能跑起来不太有成就感,没有正反馈,也不好坚持。因此,需要制定合理的跑步计划(时间/距离)
- 从跑够 10 分钟开始的。之后每周的运动强度可以比前一周提高 5%。
- 无论是跑步还是健身,训练时长最好控制在 1 个小时之内,因为 1 个小时的运动会让我们身心都得到满足.
- 在前期跑步的时候,不要跑上坡路,上坡路非常累.
- 另外可以通过听音乐、给跑步赋予意义和仪式感、装备奖励等方式,帮助自己度过刚开始跑时的枯燥期。
---
**Done**

View File

@@ -1,63 +0,0 @@
+++
title = "乱七八糟:跑步笔记(二)"
date = 2024-06-11
[taxonomies]
tags = ["乱七八糟"]
+++
前言 最近读得<<亮哥跑经>>一书,遂迷上跑步;奈何体重偏高,略微有些吃力.以下是一些笔记:
<!-- more -->
## 关于跑姿:
> 摆臂
- 摆臂的主要目的,是对抗腿的阻力,来保持我们的身体平衡,让身体向正前方笔直前行。
- 摆臂和步频是紧密相关的。所以你看那些短跑运动员,他们上肢力量也很发达,因为他们短跑时速度很快,步频很大,如果没有相应的摆臂,他们身体会不平衡.
- 正确的摆臂应该是什么样的呢?既然我们是向前跑,那么摆臂也应该是垂直向前的,而不是在胸口前左右交叉的,因为你左右摆臂的时候,等于给身体一个左右旋转的力,实际上这消耗了多余的能量,对于腰腹肌肉及腰椎压力也比较大,跑的也不快也不长久。
- 正确的摆臂应该是肩膀放松状态下,以肩关节为轴的,大臂和小臂成 90 度角,大臂带动小臂前后垂直摆动。 抬起时,大拇指不要超过眉毛,回来时,大拇指不要越过躯干。
> 常见的错误摆臂方式
- 双臂在身前交叉,我称之为“戳鼻孔跑”。当你的双臂不是垂直向前用力,而是左右旋转的时候,身体会消耗多余能量。
- 只摆小臂,不摆大臂。跑步时把大臂夹得特别紧,而且摆臂是以肘关节为轴了,这是不对的。
- 不摆手臂,摆动躯干。完全只是靠摆动躯干的方式在维持平衡,这样会造成能量过度损失,而且对腰椎压力也比较大。
- 摆臂高度不对,比如说摆臂过大,或是一面高一面低。摆臂过大是短跑的摆臂方式,长跑的摆臂,向前手指不超过眉梢、向后不超过躯干。
- 摆臂一面高一面低,一般我们戴臂包、手中握手机或水瓶等容易出现这个问题。摆臂是帮我们平衡的,如果你的左右摆臂高度不一样,那跑姿一定是变形的,也就是说身体左右受力是不均匀的,这时很容易导致身体的一侧肌肉紧张,出现像跑步膝等身体损伤.
> 摆腿
- 看一个人摆腿对不对,就看他是用髋关节跑还是膝关节跑。
- 正确的长跑姿势,应该是核心收紧,臀大肌和大腿后侧肌肉发力,以髋关节为轴,带动膝关节和踝关节向前跑动,小腿只是辅助性肌肉,它发力不多。所以长跑运动员基本上臀部都是很翘的,而小腿纤细。
- 如果一直屈髋“坐着跑”,跑步时就会经常出现重心不稳的情况,而且地面给你带来的冲击力,你不能很好地将它传导到臀部,也就是说,这些冲击力都消耗在了膝关节这里。这样的话,一是你很难跑得长久,二是容易把小腿跑粗,三是全身的压力都集中在膝关节,容易带来一些慢性损伤。
> 着地
- 跑步的着地方式主要有三种:前脚掌、中脚掌和后脚掌。如果我们是长跑的话,主要采用的是后脚跟着地和中足着地的方式。
- 前脚掌着地会帮助我们跑步提速,但是大众跑者跑长跑,不是比谁跑的快,而是看谁跑得更健康、更安全、更节能。
> 前倾跑 & 低头族
- 跑步时腰疼或者下背部疼痛,其实这主要和你跑步时身体前倾了有关。因为当你身体前倾时,你的屈髋肌群,也就是胯骨部位会过度紧张,你的下背部肌肉会被反向拉长,它的压力就会增加。这就好比你背个书包去跑步,背部肌肉很容易疲劳的。
- 而且当你身体前倾的时候,你的髋关节不能很好的帮你做功,身体容易左右扭动,时间长了也容易引起腰部肌肉酸疼。
- 还有的人是低头跑,如果有这个情况,可以在跑步之前做一些颈部伸展;跑步时,不要探头,稍微收下巴,眼睛可以平视前方 50 米左右地方,这样就可以很好地解决这个问题了。
---
**Done**

View File

@@ -22,26 +22,26 @@ tags = ["乱七八糟"]
- **cn 域名有被停用的风险**。2008 年,有人以跳水奥运冠军吴敏霞拼音注册了 wuminxia.cn[结果被中国互联网络信息中心CNNIC回收了域名](https://www.cnbeta.com/articles/tech/62209.htm),并转交给国家体育总局。此域名在 2021 年 2 月 28 日被优视科技[注册](https://whois.cnnic.cn/WhoisServlet?queryType=Domain&domain=wuminxia.cn)呵呵。2009 年,牛博网被域名注册商万网停止解析。 - **cn 域名有被停用的风险**。2008 年,有人以跳水奥运冠军吴敏霞拼音注册了 wuminxia.cn[结果被中国互联网络信息中心CNNIC回收了域名](https://www.cnbeta.com/articles/tech/62209.htm),并转交给国家体育总局。此域名在 2021 年 2 月 28 日被优视科技[注册](https://whois.cnnic.cn/WhoisServlet?queryType=Domain&domain=wuminxia.cn)呵呵。2009 年,牛博网被域名注册商万网停止解析。
## VPS ## VPS
``` ```bash
# 更新系统 # 更新系统
apt update && apt upgrade -y apt update && apt upgrade -y
apt install wget curl vim sudo neofetch apt install wget curl vim sudo neofetch
# 添加普通用户并赋予sudo # 创建用户并赋予sudo
adduser xxx adduser xxx
sudo usermod -aG sudo xxx sudo usermod -aG sudo xxx
``` ```
## BBR ## BBR
- 查询系统所支持的拥塞控制算法 - 查询系统所支持的拥塞控制算法
```` ````bash
sysctl net.ipv4.tcp_available_congestion_control sysctl net.ipv4.tcp_available_congestion_control
```` ````
- 查询正在使用中的拥塞控制算法Linux 绝大部分系统默认为 Cubic 算法) - 查询正在使用中的拥塞控制算法Linux 绝大部分系统默认为 Cubic 算法)
```` ````bash
sysctl net.ipv4.tcp_congestion_control sysctl net.ipv4.tcp_congestion_control
```` ````
- 指定拥塞控制算法为 bbr - 指定拥塞控制算法为 bbr
```` ````bash
echo net.ipv4.tcp_congestion_control=bbr >> /etc/sysctl.conf && sysctl -p echo net.ipv4.tcp_congestion_control=bbr >> /etc/sysctl.conf && sysctl -p
```` ````
@@ -56,43 +56,43 @@ echo net.ipv4.tcp_congestion_control=bbr >> /etc/sysctl.conf && sysctl -p
打开SSH配置文件`sshd_config`可以使用文本编辑器如nano或vi。以下是使用nano编辑器的示例 打开SSH配置文件`sshd_config`可以使用文本编辑器如nano或vi。以下是使用nano编辑器的示例
```` ````bash
sudo vim /etc/ssh/sshd_config sudo vim /etc/ssh/sshd_config
```` ````
在配置文件中找到以下行: 在配置文件中找到以下行:
```` ````bash
Port 22 Port 22
```` ````
这是SSH默认的端口号你可以将其更改为你想要的任何未被占用的端口号。例如将端口更改为2222 这是SSH默认的端口号你可以将其更改为你想要的任何未被占用的端口号。例如将端口更改为2222
```` ````bash
Port 2222 Port 2222
```` ````
保存并关闭文本编辑器。重新启动SSH服务以应用更改 保存并关闭文本编辑器。重新启动SSH服务以应用更改
```` ````bash
sudo service ssh restart sudo service ssh restart
```` ````
或者如果你的系统使用systemd可以使用以下命令 或者如果你的系统使用systemd可以使用以下命令
```` ````bash
sudo systemctl restart ssh sudo systemctl restart ssh
```` ````
### 安装 UFW ### 安装 UFW
```` ````bash
sudo apt install ufw sudo apt install ufw
```` ````
**如果你在远程位置连接你的服务器,在启用 UFW 防火墙之前,你必须显式允许进来的 SSH 连接。否则,你将永远都无法连接到机器上。** **如果你在远程位置连接你的服务器,在启用 UFW 防火墙之前,你必须显式允许进来的 SSH 连接。否则,你将永远都无法连接到机器上。**
```` ````bash
sudo ufw allow 22/tcp sudo ufw allow 22/tcp
```` ````
@@ -100,37 +100,37 @@ sudo ufw allow 22/tcp
**启动 UFW** **启动 UFW**
```` ````bash
sudo ufw enable sudo ufw enable
```` ````
### 安装 Fail2ban ### 安装 Fail2ban
```` ````bash
sudo apt-get install fail2ban sudo apt-get install fail2ban
```` ````
**2、Debian 12 及以上的版本需要手动安装 rsyslog** **2、Debian 12 及以上的版本需要手动安装 rsyslog**
```` ````bash
sudo apt-get install rsyslog sudo apt-get install rsyslog
```` ````
**3、启动 Fail2ban 服务** **3、启动 Fail2ban 服务**
```` ````bash
sudo systemctl start fail2ban sudo systemctl start fail2ban
```` ````
**4、开机自启动** **4、开机自启动**
```` ````bash
sudo systemctl enable fail2ban sudo systemctl enable fail2ban
```` ````
**5、查看 Fail2ban 服务状态。** **5、查看 Fail2ban 服务状态。**
```` ````bash
sudo systemctl status fail2ban sudo systemctl status fail2ban
```` ````
@@ -139,7 +139,7 @@ sudo systemctl status fail2ban
### 改为密钥登录 ### 改为密钥登录
- 执行以下命令生成.pub后缀的公钥和无后缀的密钥 - 执行以下命令生成.pub后缀的公钥和无后缀的密钥
``` ```bash
ssh-keygen ssh-keygen
``` ```
注意不同密钥对名称不能相同;同时可以为这两个文件用密码加密; 注意不同密钥对名称不能相同;同时可以为这两个文件用密码加密;
@@ -147,11 +147,11 @@ ssh-keygen
- 随后将.pub后缀的公钥中的内容写入服务器的``~/.ssh/authorized_keys``中; - 随后将.pub后缀的公钥中的内容写入服务器的``~/.ssh/authorized_keys``中;
- 使用以下命令编译服务器的SSH配置 - 使用以下命令编译服务器的SSH配置
``` ```bash
vim /etc/ssh/sshd_config vim /etc/ssh/sshd_config
``` ```
将其中的该行改为``PasswordAuthentication no``,保存退出;随后使用 将其中的该行改为``PasswordAuthentication no``,保存退出;随后使用
``` ```bash
sudo systemctl restart sshd sudo systemctl restart sshd
``` ```
重启SSH即可禁用密码登录 重启SSH即可禁用密码登录
@@ -159,109 +159,44 @@ sudo systemctl restart sshd
- 将**PermitRootLogin**一栏改为**PermitRootLogin prohibit-password**即可实现仅root用户密钥登录 - 将**PermitRootLogin**一栏改为**PermitRootLogin prohibit-password**即可实现仅root用户密钥登录
- 使用以下命令查看输出, - 使用以下命令查看输出,
``` ```bash
sudo cat /etc/ssh/sshd_config | grep -E 'PasswordAuthentication|PubkeyAuthentication' sudo cat /etc/ssh/sshd_config | grep -E 'PasswordAuthentication|PubkeyAuthentication'
``` ```
如有**PasswordAuthentication no → 禁用密码登录**以及**PubkeyAuthentication yes → 允许密钥登录**则成功。 如有**PasswordAuthentication no → 禁用密码登录**以及**PubkeyAuthentication yes → 允许密钥登录**则成功。
> 注意**authorized_keys**的权限为600如果不是则需要改正``chmod 600 ~/.ssh/authorized_keys`` > 注意**authorized_keys**的权限为600如果不是则需要改正``chmod 600 ~/.ssh/authorized_keys``
## Docker
### 脚本安装
Docker 官方提供了一个安装脚本,可以自动选择适当版本,并规避仓库问题:
```
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
```
这个脚本会为你的系统自动选择合适的安装方式。
### 卸载 Docker
要删除所有 Docker 容器和 Docker 本身,可以按照以下步骤操作:
1. 首先停止所有正在运行的容器:
```
docker stop $(docker ps -aq)
```
2. 删除所有容器
删除所有容器(包括停止的容器):
```
docker rm $(docker ps -aq)
```
3. 删除所有镜像
```
docker rmi $(docker images -q)
```
4. 删除所有网络
```
docker network prune -f
```
5. 删除所有未使用的卷
```
docker volume prune -f
```
6. 卸载 Docker
最后,如果您希望完全删除 Docker 本身,可以执行以下命令:
```
sudo apt-get purge docker-ce docker-ce-cli containerd.io
sudo apt-get autoremove --purge
sudo rm -rf /var/lib/docker
sudo rm -rf /etc/docker
```
这些命令会卸载 Docker 软件并删除 Docker 数据目录。
### Docker 常用命令
```
docker-compose up -d #在后台启动容器
docker-compose ps #查看正在运行的容器
docker-compose down #停止并移除所有运行中的容器
docker-compose stop #停止容器,但保留数据和卷
docker pull <镜像名称>:latest #拉取最新镜像
docker-compose build #更新镜像后重新构建
docker-compose logs #查看日志
docker image prune -a #删除所有未被容器使用的镜像
```
## 常用环境 ## 常用环境
- ALL - ALL
``` ```bash
apt install curl wget gpg vim nano sudo neofetch openssh-server apt install curl wget gpg vim nano sudo neofetch openssh-server
``` ```
- C/C++ - C/C++
``` ```bash
sudo apt install build-essential gdb cmake clangd clang-format libstdc++-dev sudo apt install build-essential gdb cmake clangd clang-format libstdc++-dev
``` ```
- Miniconda - Miniconda
``` ```bash
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh
``` ```
- UV - UV
``` ```bash
curl -LsSf https://astral.sh/uv/install.sh | sh curl -LsSf https://astral.sh/uv/install.sh | sh
``` ```
- Docker - Docker
``` ```bash
curl -fsSL https://get.docker.com -o get-docker.sh curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh sudo sh get-docker.sh
``` ```
- OpenCV - OpenCV
``` ```bash
sudo apt install tree libx11-dev libgtk-3-dev freeglut3-dev libopencv-dev libdlib-dev sudo apt install tree libx11-dev libgtk-3-dev freeglut3-dev libopencv-dev libdlib-dev
``` ```
- Vmware - Vmware
``` ```bash
sudo apt install open-vm-tools sudo apt install open-vm-tools
sudo apt install open-vm-tools-desktop sudo apt install open-vm-tools-desktop
``` ```
@@ -276,7 +211,7 @@ Set-Content "$env:USERPROFILE\.ssh\known_hosts"
执行如下命令一键安装 1Panel: 执行如下命令一键安装 1Panel:
```` ````bash
curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh && sudo bash quick_start.sh curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh && sudo bash quick_start.sh
```` ````
@@ -285,27 +220,27 @@ curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_
### 禁用 IPv6 ### 禁用 IPv6
手动 禁用 VPS 的 IPv6 命令: 手动 禁用 VPS 的 IPv6 命令:
``` ```bash
sysctl -w net.ipv6.conf.all.disable_ipv6=1 sysctl -w net.ipv6.conf.all.disable_ipv6=1
sysctl -w net.ipv6.conf.default.disable_ipv6=1 sysctl -w net.ipv6.conf.default.disable_ipv6=1
``` ```
如果想重启系统也生效, 执行: 如果想重启系统也生效, 执行:
``` ```bash
echo 'net.ipv6.conf.all.disable_ipv6=1' >> /etc/sysctl.conf echo 'net.ipv6.conf.all.disable_ipv6=1' >> /etc/sysctl.conf
echo 'net.ipv6.conf.default.disable_ipv6=1' >> /etc/sysctl.conf echo 'net.ipv6.conf.default.disable_ipv6=1' >> /etc/sysctl.conf
``` ```
手动 启用 VPS 的 IPv6 命令: 手动 启用 VPS 的 IPv6 命令:
``` ```bash
sysctl -w net.ipv6.conf.all.disable_ipv6=0 sysctl -w net.ipv6.conf.all.disable_ipv6=0
sysctl -w net.ipv6.conf.default.disable_ipv6=0 sysctl -w net.ipv6.conf.default.disable_ipv6=0
``` ```
重新载入 sysctl 配置 重新载入 sysctl 配置
``` ```bash
sysctl --system # reload sysctl sysctl --system # reload sysctl
``` ```
如果重载, 还无效果, 可能要 reboot 重启下. 如果重载, 还无效果, 可能要 reboot 重启下.
查看 VPS 的 IPv6 信息 查看 VPS 的 IPv6 信息
``` ```bash
ip -6 addr show scope global ip -6 addr show scope global
或者 curl ipv6.ip.sb 或者 curl ipv6.ip.sb
@@ -318,13 +253,13 @@ ip -6 addr show scope global
- 然后在VPS上输入以下命令 - 然后在VPS上输入以下命令
``` ```bash
mkdir -p ./.well-known/pki-validation mkdir -p ./.well-known/pki-validation
``` ```
- 随后在ZeroSSL中将所给出的类似**B992F08CB46748D02E4C553A4038BC.txt**复制; - 随后在ZeroSSL中将所给出的类似**B992F08CB46748D02E4C553A4038BC.txt**复制;
- 将从ZeroSSL下载得到的文件打开复制里面的东西形成以下的格式:``将pki-validation/之后EOF之前的内容``替换为你自己的。 - 将从ZeroSSL下载得到的文件打开复制里面的东西形成以下的格式:``将pki-validation/之后EOF之前的内容``替换为你自己的。
``` ```bash
cat << EOF | sudo tee ./.well-known/pki-validation/B992F08CB46748D02E4C553A4038BC.txt cat << EOF | sudo tee ./.well-known/pki-validation/B992F08CB46748D02E4C553A4038BC.txt
254563C20918258D661E7D43D6A43A2A258857E191977DD5F740FBB9ABD25279 254563C20918258D661E7D43D6A43A2A258857E191977DD5F740FBB9ABD25279
comodoca.com comodoca.com
@@ -333,7 +268,7 @@ EOF
``` ```
随后在VPS上运行该命令。 随后在VPS上运行该命令。
- 开启一个临时HTTP服务器 - 开启一个临时HTTP服务器
``` ```bash
python3 -m http.server 80 python3 -m http.server 80
``` ```
- 随后即可在ZeroSSL中验证证书并开启SSL。 - 随后即可在ZeroSSL中验证证书并开启SSL。
@@ -350,15 +285,15 @@ python3 -m http.server 80
- 进入恢复模式后,选择`root Drop to root shell prompt`进入 root shell不需要密码 - 进入恢复模式后,选择`root Drop to root shell prompt`进入 root shell不需要密码
- 挂载文件系统为可写模式: - 挂载文件系统为可写模式:
``` ```bash
mount -o remount,rw / mount -o remount,rw /
``` ```
- 将用户添加到 sudo 组: - 将用户添加到 sudo 组:
``` ```bash
usermod -aG sudo 用户名 usermod -aG sudo 用户名
``` ```
- 重启计算机: - 重启计算机:
``` ```bash
reboot reboot
``` ```
@@ -380,7 +315,7 @@ sudo apt update
``` ```
3. 搜索可用内核 3. 搜索可用内核
``` ```bash
apt search xanmod apt search xanmod
sudo apt install linux-image-6.8.6-x64v3-xanmod1 linux-headers-6.8.6-x64v3-xanmod1 sudo apt install linux-image-6.8.6-x64v3-xanmod1 linux-headers-6.8.6-x64v3-xanmod1
``` ```
@@ -444,6 +379,23 @@ GRUB_DEFAULT="Advanced options for Debian>Debian, with Linux 6.8.6-x64v3-xanmod1
sudo update-grub sudo update-grub
``` ```
## 更换系统
除了到VPS后台更换外还可以使用这个脚本
[bin456789/reinstall](github.com/bin456789/reinstall)
```
一键重装到 Linux支持 19 种常见发行版
一键重装到 Windows使用官方原版 ISO 而非自制镜像,脚本支持自动查找 ISO 链接、自动安装 VirtIO 等公有云驱动
支持任意方向重装,即 Linux to Linux、Linux to Windows、Windows to Windows、Windows to Linux
自动设置 IP智能设置动静态支持 /32、/128、网关不在子网范围内、纯 IPv6、IPv4/IPv6 在不同的网卡
专门适配低配小鸡,比官方 netboot 需要更少的内存
全程用分区表 ID 识别硬盘,确保不会写错硬盘
支持 BIOS、EFI 引导,支持 ARM 服务器
不含自制包,所有资源均实时从镜像源获得
```
--- ---
**Done.** **Done.**

65
content/about-sports.md Normal file
View File

@@ -0,0 +1,65 @@
+++
title = "乱七八糟:运动健身基本理论"
date = 2025-07-05
[taxonomies]
tags = ["乱七八糟"]
+++
前言 本文记录着无器械健身理论以及相关的读后感。
<!-- more -->
## 前言
人类的发展史决定了增肥比减肥容易,脂肪的快速积累能力保障了我们的祖先在冰河/饥荒/战乱年代的生存,否则将带来极大的生存劣势;而如今食物的匮乏在大多数国家已经不是问题,肥胖/超重问题频发。
> BMI身体质量指数(Body Mass Index)计算体重kg/身高(m)2,如体重70kg身高1.75m则BMI为22.86.
| BMI 值 | 体重分类 |
| ----------- | ---- |
| < 18.5 | 体重过轻 |
| 18.5 23.9 | 正常范围 |
| 24 27.9 | 超重 |
| 28 及以上 | 肥胖 |
## 训练目标
**提高五大综合水平**
- 力量:包括肌肉力量和爆发力
- 耐力:保持运动时间的长短
- 速度:快速做系列动作的能力
- 协调:包括平衡性和精确动作能力
- 柔韧:可做到动作幅度的大小
自体重训练完全可以达到预期效果,实现简单方便,无须复杂器械。
## 基本理论
- 减肥:消耗热量大于摄入热量,减掉赘余脂肪
- 静息代谢率(RMR):指休息时维持身体所有功能要消耗的热量,主要由肌肉消耗,可以理解为电脑功耗;
- 有氧运动:有氧运动的消耗热量并不高,且会带来饥饿感,甚至消耗肌肉,应该用间隔力量训练替代;
- 减肥方法1.提高RMR,通过力量训练锻炼出消耗热量的肌肉;2.控制饮食,减少摄入热量;
## 误区
- 局部减肥:减脂肪是全身同时进行的,单单通过某部位锻炼,可能会造成肌肉外推脂肪导致外形不显;
- 肌肉转换:肌肉并不能转换为脂肪,二者是完全不同的细胞;
- 严格节食:会降低新陈代谢率,减少热量消耗,往往适得其反;
- 过度发达实际上男性一个月增重0.68kg女性增重0.23kg是很困难的,减肥同理;
## 营养
- 基本食物种类:蔬菜/水果/坚果/种子/肉类/蛋类/鱼类
- 深加工食物的营养价值有待商榷,容易打乱内分泌和增加食欲;
- 少食多餐每天吃5~6餐间隔3小时左右让身体意识到无须过于储存脂肪
- 高糖类食物会提高胰岛素分泌降低血糖,使我们容易感到疲劳和更想摄入糖分,形成恶性循环;
- 蛋白质和水的摄入非常重要,不要等到口渴的时候才喝水;
## 训练
未完待续...

View File

@@ -32,6 +32,8 @@ tags = ["乱七八糟"]
- 随后``选择磁盘``并开始安装; - 随后``选择磁盘``并开始安装;
- 制作完成后即可使用 ``BIOS Legacy``模式 或 ``UEFI`` 模式启动。 - 制作完成后即可使用 ``BIOS Legacy``模式 或 ``UEFI`` 模式启动。
> 注意不可在PE环境下安装Ventoy
## 文件存储盘 ## 文件存储盘
使用``DiskGenius``或其他磁盘工具可以看到刚刚制作的磁盘有两个分区ventoy保留分区(有文件)和Ventoy分区(无文件)以及一个空闲空间。 使用``DiskGenius``或其他磁盘工具可以看到刚刚制作的磁盘有两个分区ventoy保留分区(有文件)和Ventoy分区(无文件)以及一个空闲空间。

View File

@@ -1,174 +0,0 @@
+++
title = "乱七八糟:Vim编辑器速查"
date = 2024-08-15
[taxonomies]
tags = ["乱七八糟"]
+++
前言 Vim 是从早期的 vi 编辑器发展而来的增强版其名称代表“Vi IMproved”。由荷兰程序员 Bram Moolenaar 于 1991 年首次发布。Vim 是开源软件,支持多种操作系统,包括 Unix、Linux、Windows 和 macOS 等。
<!-- more -->
---
## 一份优秀的 Vim 速查表
> 翻译自``https://vimsheet.com/``
我整理了一份我每天使用的 Vim 基本命令列表,并提供了一些配置建议,使 Vim 更加实用。因为没有配置的 Vim 使用起来会比较痛苦。
## 基础命令
### 光标移动(普通模式/可视模式)
* `h` `j` `k` `l`:左、下、上、右移动
* `w` / `b`:下一个/上一个单词
* `W` / `B`:下一个/上一个以空格分隔的单词
* `e` / `ge`:下一个/上一个单词的结尾
* `0` / `$`:行首/行尾
* `^`:行首第一个非空白字符(等同于 `0w`
### 编辑文本
* `i` / `a`:在光标处/之后进入插入模式
* `I` / `A`:在行首/行尾进入插入模式
* `o` / `O`:在当前行下方/上方插入空行
* `Esc``Ctrl+[`:退出插入模式
* `d`:删除
* `dd`:删除整行
* `c`:删除并进入插入模式
* `cc`:删除整行并进入插入模式
### 操作符
* 操作符也适用于可视模式
* `d`:从光标处删除到移动目标
* `c`:从光标处删除到移动目标,并进入插入模式
* `y`:从光标处复制到移动目标
* `>`:缩进一级
* `<`:取消缩进一级
* 操作符可与移动命令组合使用,例如:`d$` 删除从光标到行尾的内容
### 标记文本(可视模式)
* `v`:进入可视模式
* `V`:进入行可视模式
* `Ctrl+v`:进入块可视模式
* `Esc``Ctrl+[`:退出可视模式
### 剪贴板操作
* `yy`:复制整行
* `p`:在光标后粘贴
* `P`:在光标前粘贴
* `dd`:剪切整行
* `x`:删除当前字符
* `X`:删除前一个字符
* 默认情况下,`d` / `c` 会将删除的内容复制到剪贴板
### 退出
* `:w`:保存文件但不退出
* `:wq`:保存并退出
* `:q`:退出(如果有修改会失败)
* `:q!`:强制退出并放弃修改
### 搜索/替换
* `/pattern`:搜索 pattern
* `?pattern`:向上搜索 pattern
* `n`:重复上一次搜索(同方向)
* `N`:重复上一次搜索(反方向)
* `:%s/old/new/g`:全文件替换 old 为 new
* `:%s/old/new/gc`:全文件替换 old 为 new并逐个确认
### 常规命令
* `u`:撤销
* `Ctrl+r`:重做
## 高级命令
### 光标移动
* `Ctrl+d`:向下移动半页
* `Ctrl+u`:向上移动半页
* `}`:跳转到下一个段落(空行)
* `{`:跳转到上一个段落(空行)
* `gg`:跳转到文件顶部
* `G`:跳转到文件底部
* `:[num]`:跳转到指定行号
* `Ctrl+e` / `Ctrl+y`:向下/向上滚动一行
### 字符搜索
* `f [char]`:向前移动到指定字符
* `F [char]`:向后移动到指定字符
* `t [char]`:向前移动到指定字符之前
* `T [char]`:向后移动到指定字符之前
* `;` / `,`:重复上一次字符搜索(正向/反向)
### 编辑文本
* `J`:将下一行合并到当前行
* `r [char]`:用指定字符替换当前字符(不进入插入模式)
### 可视模式
* `O`:移动到块的另一个角
* `o`:移动到标记区域的另一端
### 文件标签
* `:e filename`:编辑文件
* `:tabe`:打开新标签页
* `gt`:切换到下一个标签页
* `gT`:切换到上一个标签页
* `:vsp`:垂直分割窗口
* `Ctrl+ws`:水平分割窗口
* `Ctrl+wv`:垂直分割窗口
* `Ctrl+ww`:在窗口间切换
* `Ctrl+wq`:关闭当前窗口
### 标记
* 标记允许你跳转到代码中的指定位置
* `m{a-z}`:在光标位置设置标记 {a-z}
* 大写标记 {A-Z} 是全局标记,可跨文件使用
* `'{a-z}`:跳转到设置标记的行首
* `''`:返回上一个跳转位置
### 文本对象
* 例如:`def (arg1, arg2, arg3)`,光标在括号内
* `di(`:删除括号内的内容,即“删除最近括号内的内容”
* 如果没有文本对象,你需要使用 `T(dt)` 来实现相同的功能
### 常规命令
* `.`:重复上一次命令
* 在插入模式下,`Ctrl+r 0`:插入最近复制的文本
* `gv`:重新选择上一次选中的文本块
* `%`:在匹配的 `()``{}` 之间跳转
---
如果你希望将此速查表保存为 PDF 或打印出来,可以使用 Markdown 编辑器(如 Typora或在线工具如 Dillinger进行导出。
此外Vim 的默认配置可能不够友好,建议你参考以下资源进行配置优化:
* [vim-sensible](https://github.com/tpope/vim-sensible):提供一套合理的默认配置
* [vim-pathogen](https://github.com/tpope/vim-pathogen):插件管理工具
* [ag.vim](https://github.com/rking/ag.vim):快速全局搜索插件
* [ctrlp.vim](https://github.com/ctrlpvim/ctrlp.vim):文件和缓冲区快速切换插件
* [nerdcommenter](https://github.com/preservim/nerdcommenter):代码注释插件
这些插件可以显著提升 Vim 的功能,使其更接近一个完整的 IDE。
---
**Done.**

319
content/about-virtual.md Normal file
View File

@@ -0,0 +1,319 @@
+++
title = "乱七八糟:虚拟化常用设置与操作"
date = 2024-08-16
[taxonomies]
tags = ["乱七八糟"]
+++
前言 本文记录常用虚拟化平台的使用与操作包括VmwareHypr-vQEMU等等。
<!-- more -->
# 一.Vmware
## 下载
Vmware最新版本对个人已经免费不需要再寻找激活码
由于博通官网下载Vmware需要登录账号这里给出第三方下载站链接[techspot](https://www.techspot.com/downloads/189-vmware-workstation-for-windows.html)
## 安装ubuntu虚拟机
**前期准备**
- 下载 Ubuntu ISO 镜像
- 确保你的主机支持虚拟化Intel VT-x / AMD-V并在 BIOS/UEFI 中启用
**开始安装**
1. 启动 VMware → 选择 “Create a New Virtual Machine” 或 “新建虚拟机”。
2. 在安装来源 (Installer source) 页选择 “Installer disc image file (ISO)” → 浏览并选中你下载的 Ubuntu ISO 文件。
3. 在“Guest OS Family / 来宾操作系统类型”中选择 **Linux**
4. 在 OS 版本中选择 “Ubuntu 64-bit” 或者 “Other Linux 64-bit”如果没有明确 Ubuntu 选项)。
5. 给虚拟机起一个名字,例如 “Ubuntu-VM”。
6. 指定存放虚拟机文件 (.vmx, .vmdk 等) 的文件夹位置。默认位置在``C:\Users\<你的用户名>\Documents\Virtual Machines\<虚拟机名称>\``下.
7. 在磁盘设置部分设置虚拟磁盘大小,推荐 **25-40 GB**。选择把虚拟磁盘存为一个文件或拆分为多个文件,这两种方式各有优劣(一个文件通常略快些)。
8. 自定义硬件设置
| 硬件 | 推荐配置 / 注意事项 |
| ----------- | ---------------------------------------- |
| CPU 核心数 | 2 或更多 |
| 内存 | 至少 4 GB若要流畅用 GNOME 桌面建议 8 GB |
| 显示适配 | 开启 3D 加速(如果 VMware 支持) |
| 硬盘控制器类型 | 通常 VMware 默认就行SATA/SCSI一般 Ubuntu 支持都不错 |
| 网卡 | 使用 NAT 或桥接,根据是否要虚拟机直接在局域网中可访问来定 |
9. 启动虚拟机并选择“Install Ubuntu”。
10. 安装 VMware Tools 或 Open-VM-Tools
安装这些工具能增强体验,例如鼠标整合、屏幕分辨率自动调整、剪贴板共享等等。
Ubuntu 的方式通常是用 `open-vm-tools` 包:
```bash
sudo apt update
sudo apt install open-vm-tools-desktop
sudo reboot
```
### FAQ
- 屏幕分辨率不能拉大/全屏:安装 open-vm-tools + open-vm-tools-desktop开启 3D 支持;在虚拟机设置里提升视频内存。
- 虚拟机启动慢:给虚拟机分配更多 RAMCPU关闭不必要的服务确保主机虚拟化支持开启。
- 无法挂载 ISO 或虚拟光驱:检查虚拟机设置里 CD/DVD 光驱是否连接ISO 文件是否损坏。
- 时间不对同步差:安装 VMware 工具通常能解决时间同步;也可手动配置 NTP 服务。
- 网络不通:检查虚拟机网卡类型;如果用 NAT看主机网络如果用桥接看是否有权限或防火墙问题。
# 二.Hyper-V
Hyper-V 是微软内建的虚拟化平台native hypervisor。开启后它会占用硬件虚拟化特性Intel VT-x / AMD-V这可能会和 VMware、VirtualBox 等第三方虚拟化软件冲突。
## 开启 Hyper-V
* PowerShell以管理员权限运行
```bash
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
```
* DISM部署映像服务和管理工具
```bash
DISM /Online /Enable-Feature /All /FeatureName:Microsoft-Hyper-V
```
* Windows 功能 GUI 操作:
在``控制面板 → 程序和功能 → 启用或关闭 Windows 功能``中勾选 “Hyper-V”、 “Hyper-V 平台”、 “Hyper-V 管理工具” 等相关项目,然后按提示操作。
## 关闭 Hyper-V
* PowerShell管理员权限
```bash
Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All
```
* DISM
```bash
DISM /Online /Disable-Feature:Microsoft-Hyper-V
```
* 用 bcdedit 修改启动配置,使系统启动时不加载 HypervisorHyper-V 的虚拟化内核)但保留功能安装:
```bash
bcdedit /set hypervisorlaunchtype off
```
若要恢复加载,则:
```bash
bcdedit /set hypervisorlaunchtype auto
```
* Windows 功能 GUI 中,取消勾选 Hyper-V 相应项。
## 使用方法
下面是几个典型的场景和命令:
1. **给 VMware 或 VirtualBox 使用环境临时关闭 Hyper-V**
```bash
bcdedit /set hypervisorlaunchtype off
```
然后重启 Windows就能让这些软件正常启动虚拟机。要还原 Hyper-V改为 `auto` 或 `on`:
```bash
bcdedit /set hypervisorlaunchtype auto
```
2. **从命令行完全关闭 Hyper-V 功能**
```bash
Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All
```
或者用 DISM
```bash
DISM /Online /Disable-Feature:Microsoft-Hyper-V
```
3. **检查当前 Hyper-V 是否正在运行**
* 用 `msinfo32.exe`(系统信息)看 “Hyper-V Requirements” 部分或者在命令提示符PowerShell 用 `systeminfo` 查看是否显示 “Hypervisor has been detected” 之类信息。
4. **用 GUI 控制 Windows 功能开关**
* 打开 `控制面板 → 程序 → 启用或关闭 Windows 功能`
* 勾选 “Hyper-V” 及 Hyper-V 平台 / 虚拟机平台等
* 点击确定,重启即可。
## FAQ
* Windows 家庭版Home通常不提供完整的 Hyper-V 功能 GUI但系统中某些虚拟化基于安全的功能例如 VBS、Core Isolation / Memory Integrity依然可能启用这样也会表现为“Hyper-V 在运行”,建议更换到专业工作站版本。
* 部分软件(如 Android 模拟器、BlueStacks 等)在检测到 Hyper-V 存在时性能可能受影响关闭后可能解决问题。比如Steam游戏安卓模拟器HCL等等。
# 三.QEMU
## 备份
QEMU安装的系统默认在此位置下可以使用Root用户将其复制到其他位置并备份
```bash
[root@dos:/var/lib/libvirt/images]ls
ubuntu24.04-2.qcow2
```
## 格式转换
QEMU默认使用qcow2格式几乎可以转换为所有其他虚拟机格式我们可以使用`qemu-img`QEMU 提供的镜像管理工具)来创建、转换、检查、调整虚拟机磁盘镜像。
**基本语法**
```bash
qemu-img [command] [options] filename
```
**镜像格式转换命令大全**
`qemu-img convert -f <源格式> -O <目标格式> <源文件> <目标文件>`
**常见虚拟机平台格式**
| 平台/软件 | 格式 | 示例扩展名 |
| ----------------- | -------- | ---------------- |
| QEMU/KVM | qcow2 | `.qcow2` |
| VirtualBox | vdi | `.vdi` |
| VMware | vmdk | `.vmdk` |
| Microsoft Hyper-V | vhd/vhdx | `.vhd` / `.vhdx` |
| Xen | raw | `.img` |
- ``raw ↔ qcow2``
```bash
# raw → qcow2
qemu-img convert -f raw -O qcow2 disk.img disk.qcow2
# qcow2 → raw
qemu-img convert -f qcow2 -O raw disk.qcow2 disk.img
```
- ``qcow2 ↔ vdi (VirtualBox)``
```bash
# qcow2 → vdi
qemu-img convert -f qcow2 -O vdi disk.qcow2 disk.vdi
# vdi → qcow2
qemu-img convert -f vdi -O qcow2 disk.vdi disk.qcow2
```
- ``qcow2 ↔ vmdk (VMware)``
```bash
# qcow2 → vmdk
qemu-img convert -f qcow2 -O vmdk disk.qcow2 disk.vmdk
# vmdk → qcow2
qemu-img convert -f vmdk -O qcow2 disk.vmdk disk.qcow2
```
- ``qcow2 ↔ vhd/vhdx (Hyper-V)``
```bash
# qcow2 → vhdx
qemu-img convert -f qcow2 -O vhdx disk.qcow2 disk.vhdx
# vhdx → qcow2
qemu-img convert -f vhdx -O qcow2 disk.vhdx disk.qcow2
```
- ``raw ↔ vdi/vmdk/vhdx``
```bash
# raw → vdi
qemu-img convert -f raw -O vdi disk.img disk.vdi
# raw → vmdk
qemu-img convert -f raw -O vmdk disk.img disk.vmdk
# raw → vhdx
qemu-img convert -f raw -O vhdx disk.img disk.vhdx
```
## 扩展
1. 扩展大小
```
virsh domblklist <虚拟机名字>
Target Source
vda /var/lib/libvirt/images/ubuntu-24-04.qcow2
qemu-img resize /var/lib/libvirt/images/ubuntu-24-04.qcow2 +20G
```
2. 查看磁盘情况:
```bash
lsblk
```
3. 如果是单分区系统ext4
* 安装工具:
```bash
sudo nix-env -iA nixos.cloud-utils # 提供 growpart
```
* 扩展分区:
```bash
sudo growpart /dev/vda 1
```
* 扩展文件系统:
ext4
```bash
sudo resize2fs /dev/vda1
```
xfs
```bash
sudo xfs_growfs /
```
## 压缩
有时候我们需要备份QEMU的镜像但是镜像大小非常庞大可以对其进行压缩。
首先在虚拟机里以Ubuntu为例执行
```bash
sudo apt clean
sudo rm -rf /var/log/*log /var/log/journal/* # 清理日志
```
然后填充空闲空间:
```bash
sudo dd if=/dev/zero of=/zero.fill bs=1M || true
sudo sync
sudo rm -f /zero.fill
```
随后关闭虚拟机,在宿主机上使用 `qemu-img` 压缩:
```bash
qemu-img convert -O qcow2 ubuntu24.04-2.qcow2 ubuntu24.04-2-compressed.qcow2
```
可选:加上 `-c` 开启压缩:
```bash
qemu-img convert -O qcow2 -c ubuntu24.04-2.qcow2 ubuntu24.04-2-compressed.qcow2
```
> **不要直接删除原始文件**,先确认新文件能正常启动。如果你的 qcow2 镜像是直接被写满了(比如里面确实存了很多真实数据),那即使压缩也不会小太多。如果镜像内部用了 LVM还可以在 LVM 里使用sudo fstrim -av进行fstrim.
---
**Done.**

View File

@@ -52,14 +52,14 @@ MCSManager 面板简称MCSM 面板)是一款全中文,轻量级,开
## 换源 ## 换源
**禁用 Ceph 企业仓库:** **禁用 Ceph 企业仓库:**
``` ```bash
nano /etc/apt/sources.list.d/ceph.list nano /etc/apt/sources.list.d/ceph.list
``` ```
将文件内容注释掉或删除。 将文件内容注释掉或删除。
**编辑仓库源文件:** **编辑仓库源文件:**
``` ```bash
nano /etc/apt/sources.list.d/pve-enterprise.list nano /etc/apt/sources.list.d/pve-enterprise.list
``` ```
将文件内容注释掉或删除; 将文件内容注释掉或删除;
@@ -67,11 +67,11 @@ nano /etc/apt/sources.list.d/pve-enterprise.list
**启用社区仓库:** **启用社区仓库:**
确保社区仓库已启用。编辑社区仓库文件: 确保社区仓库已启用。编辑社区仓库文件:
``` ```bash
nano /etc/apt/sources.list.d/pve-no-subscription.list nano /etc/apt/sources.list.d/pve-no-subscription.list
``` ```
确保文件内容如下: 确保文件内容如下:
``` ```bash
deb http://download.proxmox.com/debian/pve bookworm pve-no-subscription deb http://download.proxmox.com/debian/pve bookworm pve-no-subscription
``` ```
## 二.新建虚拟机并安装Debian ## 二.新建虚拟机并安装Debian
@@ -95,12 +95,12 @@ deb http://download.proxmox.com/debian/pve bookworm pve-no-subscription
在安装步骤进入到选择安装的桌面环境和软件时, 键入 Ctrl+Alt+F2 可以看到从图形界面转到了tty命令终端, 键入 Enter 在安装步骤进入到选择安装的桌面环境和软件时, 键入 Ctrl+Alt+F2 可以看到从图形界面转到了tty命令终端, 键入 Enter
这里修改软件源配置文件 这里修改软件源配置文件
``` ```bash
nano /target/etc/apt/sources.list nano /target/etc/apt/sources.list
``` ```
修改debian-security源地址  `http://mirrors.ustc.edu.cn ` 目测最快 修改debian-security源地址  `http://mirrors.ustc.edu.cn ` 目测最快
``` ```bash
deb http://mirrors.ustc.edu.cn/debian-security bullseye-security main deb http://mirrors.ustc.edu.cn/debian-security bullseye-security main
``` ```
修改后 Ctrl+X 退出保存,然后退出终端重新进入界面继续安装,键入 Ctrl+Alt+F5。 修改后 Ctrl+X 退出保存,然后退出终端重新进入界面继续安装,键入 Ctrl+Alt+F5。
@@ -144,7 +144,7 @@ deb http://mirrors.ustc.edu.cn/debian-security bullseye-security main
在 PVE-防火墙中打开它们。如果还是不行,执行如下命令: 在 PVE-防火墙中打开它们。如果还是不行,执行如下命令:
``` ```bash
systemctl stop firewalld systemctl stop firewalld
systemctl disable firewalld systemctl disable firewalld

View File

@@ -27,13 +27,30 @@ tags = ["综合工程"]
## 一.选择合适的平台 ## 一.选择合适的平台
X86还是Arm两者之间各有优点截止到今天各种Arm电视盒子已经非常成熟价格便宜也可以使用运营商的电视盒子进行刷机性能并不会太弱而X86平台往往价格偏贵且解码性能和功能适配没有和电视生态联系紧密因此建议首选Arm平台 X86还是Arm两者之间各有优点截止到今天各种Arm电视盒子已经非常成熟价格便宜也可以使用运营商的电视盒子进行刷机性能并不会太弱而X86平台往往价格偏贵驱动不全,解码性能和功能适配没有和电视生态联系紧密因此建议首选Arm平台.
本文以s905l3a盒子为示例截止目前平均价格在60rmb左右非常具有性价比。
| 项目 | 规格说明 |
| ------- | ---------------------------------------------- |
| CPU 架构 | 四核 ARM Cortex-A53 (64-bit) |
| 主频 | \~1.8 GHz |
| 制程工艺 | 12 nm |
| GPU | Mali-G31 MP2约 850 MHz20.8 GFLOPS |
| 视频解码 | H.265 4Kp75 (10-bit), H.264 4Kp30 |
| 视频编码 | H.264/H.265 1080p60 |
| 最大显示输出 | 4K @ 75fps |
| 内存支持 | 支持 DDR3, DDR4-2666, LPDDR4-3200设备常见 2 GB DDR4 |
| 存储 | 常见 8 GB eMMC5.1 |
| 接口支持 | USB2.0/3.0, HDMI 2.0b/2.1 |
| 网络支持 | 千兆 MAC (常见盒子为 10/100), Wi-Fi, BT4.1/5.0 |
| 发布时间/制程 | Q3 202212 nm |
> 如果预算充足也可以选择s905x3s905x4以及rk3528等等芯片的盒子。如果有旧手机也可以改装为电视盒子比如骁龙865盒子性能非常强大。
## 二.选择合适的系统 ## 二.选择合适的系统
无论是运营商自带的电视盒子还是各种所谓的“无广告”电视盒子,往往都基于以下两种系统,且不要迷信所谓的“无广告”电视盒子,它们往往配置低,性价比不高且还是有内置付费项目,甚至有一些根本没有做到去广告 无论是运营商自带的电视盒子还是各种所谓的“无广告”电视盒子,往往都基于以下两种系统,且要小心一些所谓的“无广告”电视盒子或者外贸盒子,它们往往配置低,性价比不高且还是有内置付费项目,甚至有一些还会偷偷跑PCDN。因此建议买到手之后自行刷写固件
| 特性 | **Android-x86** | **Android TV** | | 特性 | **Android-x86** | **Android TV** |
|--------------------|---------------------------------------------------------|----------------------------------------------------------| |--------------------|---------------------------------------------------------|----------------------------------------------------------|
@@ -48,79 +65,35 @@ X86还是Arm两者之间各有优点截止到今天各种Arm电视盒子
| **遥控器支持** | 不适配遥控器,主要使用鼠标键盘操作。 | 专为遥控器优化,支持按键导航和语音输入。 | | **遥控器支持** | 不适配遥控器,主要使用鼠标键盘操作。 | 专为遥控器优化,支持按键导航和语音输入。 |
| **开源贡献** | 由社区维护,支持各种自定义和实验功能。 | 由 Google 官方主导OEM 厂商提供硬件优化支持。 | | **开源贡献** | 由社区维护,支持各种自定义和实验功能。 | 由 Google 官方主导OEM 厂商提供硬件优化支持。 |
--- > Android-x86 的安装类似windowsAndroid TV安装类似 Android手机通过刷分区或TWRP卡刷安装。
> Android-x86 的安装类似windows需要命令行界面配置Android TV安装类似 Android手机通过刷分区或TWRP卡刷安装。
> Tosathony 制作的 Android TV x86 是一个由社区成员制作的定制化 Android TV 版本,针对 Android TV 的大屏界面 和 遥控器操作 进行特别优化,但某些硬件(如 Wi-Fi、GPU、音频设备等的驱动可能不兼容或需要额外的配置。 > Tosathony 制作的 Android TV x86 是一个由社区成员制作的定制化 Android TV 版本,针对 Android TV 的大屏界面 和 遥控器操作 进行特别优化,但某些硬件(如 Wi-Fi、GPU、音频设备等的驱动可能不兼容或需要额外的配置,本文不再说明Android TV x86的安装与使用
**刷 Tosathony Android TV X86 准备工作** 刷写固件可以买一个“刷机神器”HDMI短接器和一个双公头的USB线即可使用[usb-burning-tool](https://androidmtk.com/download-amlogic-usb-burning-tool)来进行刷机推荐使用2.2.4版本.
- 1.[Tosathony 制作的 Android TV x86 9.0](https://pan.baidu.com/s/17eDDrf4WzWVmrc9hLw-c_w?pwd=a728) ## 三.安装软件
- 2.[Rufus 写盘工具](https://www.423down.com/10080.html) 安装软件有很多方法可以使用U盘将apk安装包拷入也可以使用localsend将apk安装包通过内网传输过去。这里介绍一种通过ADB安装软件的方法。
- 3.[Android tv Remote 手机遥控器软件:](https://android-tv-remote-control.en.softonic.com/android) - 首先我们在设置中找到“设置”>“设备首选项”>“关于”,然后在“构建”上点击几次以解锁``开发者模式``随后开启USB调试开关。
- 4.[Tiny ADB 软件](https://androidmtk.com/tiny-adb-and-fastboot-tool#installer) - 随后在设置 > 设备首选项 > 关于 > 状态中找到并记下IP 地址然后用ADB连接上去这里使用命令``adb connect <IP 地址>:<端口> ``随后在ATV端授权连接例如
**一些可安装的软件** ```bash
adb connect 192.168.1.666:9527
- [kodi](http://www.kodiplayer.cn/) connected to 192.168.1.666:9527
- [当贝市场](https://www.dangbei.com/apps/) adb devices
- [哔哩哔哩TV版](https://www.fenxm.com/104.html) xxxxxxxxx sideload
```
- [ATV Launcher](https://www.fenxm.com/592.html) - 接着使用命令``adb install <path to android app.apk>``将要安装的软件包上传,也可以将文件拖到命令提示符窗口上以复制其路径,回车确认。
## 一、写盘BIOS启动
- 使用 Rufus 将下载好的 ATV 镜像写入U盘。
- 将U盘插到目标主机上并设置 BIOS-boot 优先启动,不同设备进入 BIOS 的按键不同大部分是F2或者DEL
## 二、开始安装
- boot 成功后选择自动安装;
- 经过跑码后进入若干个选项,一路 yes 过去,文件系统选 ext4;随后运行 ATV 并拔出U盘
## 三、进入Google界面
由于国内网络环境问题,导致一些界面无法进入,可使用如下方法或全局科学。
1.如果卡在 Google的logo 界面或者动画比较缓慢,或者重启后无法进入 ATV 界面,需要在``BIOS-Advanced-OS selection``中将其设置为Windows 8.X或者Android。
2.然后可以看到 PayPal 界面,这里使用可以 `Ctrl+Alt+F1` 进入命令行界面,随后输入
``pm disable com.tosanthony.tv.networkprovider #注意空格``
回车执行,随后按`Ctrl+Alt+F7或F8`回到图形界面。
3.下一步,我们可以看到自动更新界面,这里我们需要禁用它:
同样`Ctrl+Alt+F1` 进入命令行界面,随后输入
``pm disable com.google.android.tungsten.setupwraith #注意空格``
回车执行,随后按`Ctrl+Alt+F7或F8`回到图形界面。
4.此时会进入一个 WiFi 界面如果你是使用网线直连就没有问题或者用键盘连接家里的WiFi作者因为工控机没有WiFi模块在这里卡了半天。
5.随后进入了 AndroidTV 的桌面。
## 四、安装软件并设置桌面启动
1.首先我们在设置中找到“设置”>“设备首选项”>“关于”然后在“构建”上点击几次以解锁“开发人员”选项随后开启USB调试开关。
2.随后在设置 > 设备首选项 > 关于 > 状态中找到并记下IP 地址然后用Tiny ADB连接上去这里使用命令``adb connect <IP 地址> ``随后在ATV端授权连接
3.接着使用命令adb install <path to android app.apk>将要安装的软件包上传,也可以将文件拖到命令提示符窗口上以复制其路径,回车确认。
**一些 ADB 常用命令** **一些 ADB 常用命令**
``` ```bash
adb reboot #将重启 Android 设备。 adb reboot #将重启 Android 设备。
adb reboot recovery #将设备重新启动到恢复模式。 adb reboot recovery #将设备重新启动到恢复模式。
@@ -131,42 +104,125 @@ adb shell wm density <dpi> #改变显示器的像素密度。
adb kill server #切断 PC 和 Android TV 之间的连接。 adb kill server #切断 PC 和 Android TV 之间的连接。
``` ```
4.如果存在一些软件无法安装可开启ARM兼容层具体方法为在 `dl.android-x86.org/houdini/9_y/houdini.sfs` 中下载得到`houdini.sfs`,把文件名改成`houdini9_y.sfs`随后拷贝进U盘进入命令行界面输入 `ls` 找到 storage 目录,输入 `cd storage` 进入你的U盘输入 `ls` ,查看你拷贝的 `houdini9_y.sfs` 文件,并复制到该目录下。
**要安装的软件**
- [TVBox](https://github.com/o0HalfLife0o/TVBoxOSC/releases/tag/20250706-1456):前猫影视,可自行添加源,包括电影电视剧等等,选择 armeabi-generic-java.apk
- [PPSSPP](https://www.ppsspp.org/download/):PSP模拟器支持高清修复游戏选择 APK for Android
- [BBLL](https://github.com/xiaye13579/BBLL):第三方开源哔哩哔哩客户端适配TV界面不需要额外VIP
- [酷9TV](https://www.right.com.cn/FORUM/thread-8437225-1-1.html):经典IPTV播放器功能丰富可导入IPTV源使用
- [VLC](http://www.videolan.org/vlc/download-android.html):老牌开源音视频播放器,支持远程和串流功能
- [Kodi](https://github.com/xbmc/xbmc):开源的跨平台多功能媒体播放器和数字媒体娱乐中心,非常强大
- [TV-Bro](https://github.com/truefedex/tv-bro):适用与安卓TV的浏览器经过了遥控器优化设计可以作为网页播放器
- [MaterialFiles](https://github.com/zhanghai/MaterialFiles):又名质感文件,优秀的开源文件管理器
- [Localsend](https://github.com/localsend/localsend):经典内网互传工具可以通过它传输apk安装包或者视频到TV上
- [ATV Launcher](https://www.fenxm.com/592.html):平铺风格的安卓启动器,可以形成海报墙效果
> 注意s905l3a为32位架构需要下载带armv7a的软件
## 四.设置ATV桌面
安装所需的软件包后我们可以删除自带的牛马软件或者不需要的软件比如我们要安装ATV就可以删除当贝桌面。
1. ADB连接连接到ADB成功后我们使用``adb shell``进入shell随后使用命令``pm list packages``列出所有软件包;
```bash
pm list packages -s 列出系统软件包
pm list packages -3 列出第三方软件包
``` ```
cp houdini9_y.sfs /system/etc 2. 获取包名:对于暂时无法确定包名的软件,可以先打开,再使用
enable_nativebridge ```bash
adb shell dumpsys activity activities | grep mResumedActivity
reboot
```
5.安装一些软件包后我们发现需要代替掉ATV自带的桌面从而形成海报墙的效果这和 linux 的桌面环境切换有异曲同工之处。注意:替换前需要已经安装完成其他桌面!!!!(比如 ATV Launcher )我们使用以下命令禁用 google 默认的桌面。随后重启即可看到ATV的海报墙。
``pm disable-user --user 0 com.google.android.tvlauncher ``
恢复原有桌面:
```
C:\Users\root>adb shell
generic_x86:/ $ su
generic_x86:/ # pm enable --user 0 com.google.android.tvlauncher
Package com.google.android.tvlauncher new state: enabled
``` ```
获取当前前台应用的包名,随后再禁用或者删除.
3. 删除软件:可以先使用
```bash
pm disable-user --user 0 com.dangbei1.tvlauncher
```
禁用软件,确认没有问题之后再用
```bash
pm uninstall -k --user 0 com.dangbei1.tvlauncher
```
删除;
4. 备份软件对于想要备份的软件可以使用1和2中的方法获取软件包名然后使用例如以下命令
```bash
adb shell pm path org.videolan.vlc
package:/data/app/~~hY2Y0_PdaDlasfVwkUNcoQ==/org.videolan.vlc-WnNhCJLQUJdZYYzUxzBNBA==/base.apk
```
获取到安装路径随后将apk包拿走就可以
```bash
adb pull /data/app/~~hY2Y0_PdaDlasfVwkUNcoQ==/org.videolan.vlc-WnNhCJLQUJdZYYzUxzBNBA==/base.apk ./Downloads/
```
5. 备份分区如果你想要修改当前系统的img可以用adb提取并导出
```bash
# 确定分区对应关系
ls -l /dev/block
ls -l /dev/block/platform
cat /proc/mounts
# 导出到 /sdcard/
dd if=/dev/block/boot of=/sdcard/boot.img
dd if=/dev/block/recovery of=/sdcard/recovery.img
dd if=/dev/block/system of=/sdcard/system.img
dd if=/dev/block/vendor of=/sdcard/vendor.img
dd if=/dev/block/product of=/sdcard/product.img
dd if=/dev/block/odm of=/sdcard/odm.img
# 拉去到PC
adb pull /sdcard/boot.img
adb pull /sdcard/recovery.img
adb pull /sdcard/system.img
adb pull /sdcard/vendor.img
adb pull /sdcard/product.img
adb pull /sdcard/odm.img
```
5. 修改桌面可以进入安卓原生设置里面将默认主屏幕应用改为ATV代替掉自带的桌面,并使用
```bash
adb shell pm disable-user --user 0 com.google.android.tvlauncher
adb shell pm disable-user --user 0 com.google.android.tungsten.setupwraith
```
命令禁用原来的默认桌面。随后重启盒子即可看到海报墙效果如果ATV桌面没有开机自启动可以使用Launch on Boot工具。
**最终效果**
![s905-atv](/images/s905-atv.webp)
## 后记 ## 后记
- [Android TV google 官方 TV 库](https://github.com/googlesamples/leanback-showcase) - [Android TV google 官方 TV 库](https://github.com/googlesamples/leanback-showcase)
- [智能电视,电视盒子开发 SDK](https://github.com/boxmate/tvframe) - [智能电视,电视盒子开发 SDK](https://github.com/boxmate/tvframe)
- [选中框切换动画,适用于电视](https://github.com/EZJasonBoy/FocusChangeAnimation) - [选中框切换动画,适用于电视](https://github.com/EZJasonBoy/FocusChangeAnimation)
- [Android tv盒子投影仪 控件](https://github.com/FrozenFreeFall/Android-tv-widget) - [Android tv盒子投影仪 控件](https://github.com/FrozenFreeFall/Android-tv-widget)
- [TV 项目常用工具(焦点问题,适配问题等.)](https://github.com/genius158/TVProjectUtils) - [TV 项目常用工具(焦点问题,适配问题等.)](https://github.com/genius158/TVProjectUtils)
- [e900v22c项目与讨论组文档](https://github.com/Calmact/e900v22c)

View File

@@ -125,11 +125,9 @@ tags = ["综合工程"]
- [KernelSU Next](https://rifsxd.github.io/KernelSU-Next/zh/index.html) - [KernelSU Next](https://rifsxd.github.io/KernelSU-Next/zh/index.html)
- [APatch](https://apatch.dev/zh_CN/) - [APatch](https://apatch.dev/zh_CN/)
## **六.具体操作流程** ## **六.前置知识**
> 前置知识ADB与Fastboot命令的使用 ### **adb 命令**
**adb 命令**
| 命令 | 说明 | | 命令 | 说明 |
|------|------| |------|------|
@@ -140,7 +138,36 @@ tags = ["综合工程"]
| `adb reboot edl` | 重启到 edl 模式 | | `adb reboot edl` | 重启到 edl 模式 |
| `adb sideload <要刷写的文件路径>` | 刷写模块,如 Magisk | | `adb sideload <要刷写的文件路径>` | 刷写模块,如 Magisk |
**fastboot 命令** **使用adb备份分区**
```bash
adb shell ls -l /dev/block/bootdevice/by-name
```
可以看到有很多分区,例如这些
```bash
...
lrwxrwxrwx 1 root root 15 1970-12-24 11:30 frp -> /dev/block/sda5
lrwxrwxrwx 1 root root 16 1970-12-24 11:30 fsc -> /dev/block/sdf13
lrwxrwxrwx 1 root root 16 1970-12-24 11:30 fsg -> /dev/block/sdf12
lrwxrwxrwx 1 root root 15 1970-12-24 11:30 hyp_a -> /dev/block/sde5
lrwxrwxrwx 1 root root 16 1970-12-24 11:30 hyp_b -> /dev/block/sde40
...
```
随后使用root备份分区到手机上
```bash
adb root
adb shell "dd if=/dev/block/sda2 of=/sdcard/partition_backup/persist.img"
```
然后可以上传到PC端
```bash
adb pull /sdcard/partition_backup/ ./backup/
```
### **fastboot 命令**
| 命令 | 说明 | | 命令 | 说明 |
|------|------| |------|------|
@@ -151,6 +178,8 @@ tags = ["综合工程"]
| `fastboot oem reboot-<模式名称>` | 重启到相应模式 | | `fastboot oem reboot-<模式名称>` | 重启到相应模式 |
| `fastboot oem device-info` | 查看解锁状态 | | `fastboot oem device-info` | 查看解锁状态 |
## **七.具体操作流程**
> 以 Poco F2 这款手机为例, > 以 Poco F2 这款手机为例,
1. 首先我们进入手机设置界面,进入“我的设备”,在“全部参数”中找到“ MIUI 版本”,连续点击后开启开发者模式,随后在“更多设置”中开启 USB 调试, USB安装 功能。 1. 首先我们进入手机设置界面,进入“我的设备”,在“全部参数”中找到“ MIUI 版本”,连续点击后开启开发者模式,随后在“更多设置”中开启 USB 调试, USB安装 功能。
@@ -187,7 +216,6 @@ tags = ["综合工程"]
> 如果你不想安装TWRP也可以直接安装要刷的系统的recovery一般放在系统zip包的中如果没有则需要手动解包payload.bin可以安装payload-dumper-go并在解压出来的系统文件夹中使用``payload-dumper-go payload.bin``,随后会将所有.img后缀的文件放在文件夹中。 > 如果你不想安装TWRP也可以直接安装要刷的系统的recovery一般放在系统zip包的中如果没有则需要手动解包payload.bin可以安装payload-dumper-go并在解压出来的系统文件夹中使用``payload-dumper-go payload.bin``,随后会将所有.img后缀的文件放在文件夹中。
## **八.Root后的模块安装** ## **八.Root后的模块安装**
在 Root 管理器中安装 Zygisk-Lsposed 模块,即可使用 Lsposed在 Lsposed 中可以安装 HMA, Amarok QAuxiliary 模块,并配合 MMRL 等软件等等。 在 Root 管理器中安装 Zygisk-Lsposed 模块,即可使用 Lsposed在 Lsposed 中可以安装 HMA, Amarok QAuxiliary 模块,并配合 MMRL 等软件等等。
@@ -202,6 +230,56 @@ tags = ["综合工程"]
- [ZygiskNext](https://github.com/Dr-TSNG/ZygiskNext) - [ZygiskNext](https://github.com/Dr-TSNG/ZygiskNext)
- [Zygisk-Assistant](https://github.com/snake-4/Zygisk-Assistant) - [Zygisk-Assistant](https://github.com/snake-4/Zygisk-Assistant)
## **附录**
### 系统变迁表
| 厂商 | 系统 / 子品牌 | 演变历史及时间点 |
| --------------- | ------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------- |
| **Xiaomi** | MIUI → 澎湃OSHyperOS / Surge OS | 2010 年推出 MIUI2023 年 10 月 17 日官方宣布替代 MIUI 的 HyperOS中文名“澎湃OS”2023 年 10 月 26 日随 Xiaomi 14 系列一起发布2024 年起全面替代 MIUI |
| **Huawei** | EMUI → HarmonyOS | 2012 年采用 EMUI2021 年宣布推出基于微内核的鸿蒙 HarmonyOS新机逐步切换。 |
| **OPPO** | ColorOS | 2013 年推出 ColorOS2020 年对版本号体系调整至与 Android 主版本同步(例如从 7 跳到 11之后持续 UI 与功能迭代。 | |
| **Realme** | Realme UI | 2019 年从 ColorOS 分支出 Realme UI此后持续独立更新、优化未查到主要时间节点。 |
| **Vivo / iQOO** | Funtouch OS → OriginOS (+ Ocean/Pux 系列) | 2012 年左右推出 Funtouch OS2020 年推出 OriginOS后续版本如 OriginOS Ocean、Pux 迭代 UI 核心。 |
| **OnePlus** | HydrogenOS (中国) → OxygenOS (海外) → 合并后 OPOS | 2014 年中国区发布 HydrogenOS2015 年海外推 OxygenOS2021 年底与 OPPO 合并,代码库统一(国内使用 ColorOS全球继续用 OxygenOS但官方未明确推出 "OPOS" 这一新名。 |
| **Samsung** | TouchWiz → Samsung Experience → OneUI (+ One UI Core) | 2009 年推出 TouchWiz2016 年改名为 Samsung Experience2018 年重塑为 OneUI2020 年开始细化为标准与精简版 OneUI Core。 |
| **Asus** | ZenUI | 2014 年推出 ZenUI后续多年持续在视觉与功能上迭代。 |
| **Motorola** | MotoBlur → My UX | 2009 年推出 MotoBlur2020 年推出基于原生 Android 的 My UX。 |
| **Sony** | Xperia UI | 自 Xperia 系列以来Sony 一直使用 Xperia UI接近原生 Android逐步做微调。 |
### 固件包中实际文件
| 文件名 | 说明与功能 |
| -------------------------------------------------------- | --------------------------------------------------------------------------------------- |
| **abl.img** | Android Boot Loader第二阶段引导加载器负责从 XBL 启动 Android kernel。 |
| **aop.img / aop\_config.img** | Always-On Processor负责处理低功耗任务辅助系统唤醒等操作。Config 存配置。 |
| **bluetooth.img** | 蓝牙固件,负责设备蓝牙功能的驱动与协议栈加载。 |
| **boot.img / init\_boot.img** | 启动分区:包含 kernelinit\_boot 从 Android 13+ 将 ramdisk 拆出)|
| **cpucp.img / cpucp\_dtb.img** | CPU Control Processor处理内核 CPU 调度或控制器DTB 部分存设备树信息。 |
| **devcfg.img** | Device Configuration设备硬件配置例如 I/O 设置等参数。 |
| **dsp.img** | Digital Signal Processor 固件,处理音频等信号处理任务。 |
| **dtbo.img** | 设备树覆盖层Device Tree Blob Overlay定义硬件特定参数。 |
| **engineering\_cdt.img** | 工程测试用 partition常含硬件校正或测试数据。 |
| **featenabler.img** | Feature Enabler启用或关闭厂商定制功能或隐藏功能的标记配置区。 |
| **imagefv.img** | Image Feature Version存储镜像版本控制或签名校验信息。 |
| **hyp.img** | Hypervisor虚拟化层固件用于安全隔离或多系统调度。 |
| **keymaster.img** | 安全模块 Keymaster处理加密密钥、安全认证等功能。 |
| **modem.img** | 基带固件控制数据通信LTE/5G/Wi-Fi/Bluetooth等。 |
| **odm.img** | OEM 驱动与功能,硬件相关组件:摄像头、传感器等逻辑支持层。 |
| **oplus\_sec.img / oplusstanvbk.img** | 厂商定制安全配置或分区OnePlus 专用)。 |
| **product.img** | OEM 或 carrier 定制应用和配置Android 9+ 新增分区 |
| **qupfw\.img** | Qualcomm UFS或其他闪存媒体驱动固件通常用于闪存控制器。 |
| **recovery.img** | Recovery 启动镜像,用于刷机、恢复环境。 |
| **shrm.img** | Secure Hardware Resource Management安全资源管理模块。 |
| **splash.img** | 启动动画或厂商 Logo 展示图片。 |
| **system.img / system\_ext.img / system\_dlkm.img** | 系统分区:包含 Android 框架、扩展库dlkm 存模块) |
| **tz.img** | TrustZone 安全环境固件QSEE / TEE。 |
| **uefi.img / uefisecapp.img** | UEFI 启动环境及安全应用层,用于兼容启动和安全验证。 |
| **vbmeta.img / vbmeta\_system.img / vbmeta\_vendor.img** | Verified Boot 签名校验 metadata确保完整性安全。 |
| **vendor.img / vendor\_boot.img / vendor\_dlkm.img** | 厂商驱动层及扩展vendor\_boot 是引导层dlkm 是模块。 |
| **xbl.img / xbl\_config.img / xbl\_ramdump.img** | Qualcomm XBLeXtensible Boot Loader引导加载 ABL 等ramdump 用于调试。 |
## **参考** ## **参考**
- [lineageos镜像](https://download.lineageos.org/devices/lmi/builds) - [lineageos镜像](https://download.lineageos.org/devices/lmi/builds)

View File

@@ -29,31 +29,68 @@ tags = ["综合工程"]
## 安装软件 ## 安装软件
随后安装常用开源软件 随后安装常用开源软件(KDE环境省略file和wayland)
``` ```bash
# gui # gui
paru -S alacritty zellij qemu-full virt-manager wireshark-qt floorp-bin foliate materialgram-bin legcord-bin keepassxc onlyoffice-bin kazumi-bin vlc krita qtscrcpy localsend-bin strawberry oculante obs-studio paru -S floorp-bin keepassxc qemu-full virt-manager materialgram-bin legcord-bin onlyoffice-bin localsend-bin kazumi-bin foliate vlc krita qtscrcpy strawberry oculante obs-studio
# tui # tui
paru -S neovim yazi lazygit btop paru -S neovim yazi lazygit btop zellij termshark
# cli # cli
paru -S nexttrace-bin android-tools syncthing aria2 zola fastfetch onefetch starship atuin bat fzf eza tree paru -S alacritty fish fastfetch tealdeer expac fish-autopair fish-pure-prompt fisher onefetch starship atuin bat fzf fd ripgrep eza tree android-tools payload-dumper-go-bin nexttrace-bin syncthing aria2
# other
paru -S ttf-jetbrains-mono-nerd fcitx5-chinese-addons fcitx5-skin-material fcitx5-im fcitx5-rime npm pnpm just go wl-clipboard # file
paru -S gvfs gvfs-mtp gvfs-afc gvfs-nfs nemo
# zip
paru -S peazip
# Type
paru -S fcitx5-configtool fcitx5-chinese-addons fcitx5-skin-material fcitx5-im fcitx5-rime
# Blog
paru -S zola npm pnpm just go
# ttf
paru -S ttf-jetbrains-mono-nerd
# Wayland
paru -S hyprland waybar wofi network-manager-applet swww wl-gammarelay-rs brightnessctl easyeffects wireplumber pipewire blueman wl-clipboard-rs swaync swayosd swappy grim wlogout hyprlock hyprpolkitagent
``` ```
| 分类 | 软件列表 |
| ------------ | ------------------------------------------------ |
| **窗口管理器** | hyprland |
| **状态栏** | waybar |
| **启动器** | wofi |
| **网络** | network-manager-applet |
| **蓝牙** | blueman |
| **音频** | pipewire, wireplumber |
| **亮度** | brightnessctl, wl-gammarelay-rs |
| **剪贴板** | wl-clipboard-rs,wl-clip-persist |
| **通知** |swaync,swayosd |
| **截图** | grim, swappy |
| **壁纸管理** | swww |
| **Polkit 授权代理** | hyprpolkitagent |
| **锁屏/开始菜单** | hyprlock, wlogout |
| **文件管理** | gvfs, gvfs-mtp, gvfs-afc, gvfs-nfs, nemo |
安装完毕后我们开始配置输入法与字体: 安装完毕后我们开始配置输入法与字体:
输入法我们采用雾凇拼音即前面我们安装的fcitx5系列软件包的一个输入方案这里我们使用[自动部署脚本](https://github.com/Mark24Code/rime-auto-deploy) 输入法我们采用雾凇拼音即前面我们安装的fcitx5系列软件包的一个输入方案这里我们使用[自动部署脚本](https://github.com/Mark24Code/rime-auto-deploy)
``` ```bash
# step1: 克隆/下载 latest 最新的稳定版到本地 # step1: 克隆/下载 latest 最新的稳定版到本地
git clone --depth=1 https://github.com/Mark24Code/rime-auto-deploy.git --branch latest git clone --depth=1 https://github.com/Mark24Code/rime-auto-deploy.git --branch latest
# step2: 进入项目目录 # step2: 进入项目目录
@@ -72,7 +109,7 @@ cd rime-auto-deploy
安装完毕后可以看到KDE的界面较为简陋这里给出笔者的美化配置 安装完毕后可以看到KDE的界面较为简陋这里给出笔者的美化配置
- 在设置中找到Colors&Themes分别设置为 - 在设置中找到Colors&Themes分别设置为
``` ```bash
- ColorBreeze Dark - ColorBreeze Dark
- Application StyleBreeze - Application StyleBreeze
- Plasma StyleSweet - Plasma StyleSweet
@@ -127,27 +164,27 @@ V2EX PolishV站美化
如果Grub引导菜单中没有windows选项可以通过以下方法添加 如果Grub引导菜单中没有windows选项可以通过以下方法添加
- 安装 os-prober首先确保系统中安装了 os-prober这是一个用于检测其他操作系统的工具。 - 安装 os-prober首先确保系统中安装了 os-prober这是一个用于检测其他操作系统的工具。
``` ```bash
sudo pacman -S os-prober sudo pacman -S os-prober
sudo os-prober sudo os-prober
``` ```
- 打开 /etc/default/grub 文件进行编辑: - 打开 /etc/default/grub 文件进行编辑:
``` ```bash
sudo nano /etc/default/grub sudo nano /etc/default/grub
# 确保 GRUB_DISABLE_OS_PROBER 设置为 false # 确保 GRUB_DISABLE_OS_PROBER 设置为 false
``` ```
- 保存文件并退出编辑器后,运行以下命令更新 GRUB 配置: - 保存文件并退出编辑器后,运行以下命令更新 GRUB 配置:
``` ```bash
sudo grub-mkconfig -o /boot/grub/grub.cfg sudo grub-mkconfig -o /boot/grub/grub.cfg
``` ```
或者``手动添加`` 或者``手动添加``
``` ```bash
nano /etc/grub.d/40_custom nano /etc/grub.d/40_custom
``` ```
``` ```bash
#!/bin/sh #!/bin/sh
exec tail -n +3 $0 exec tail -n +3 $0
# This file provides an easy way to add custom menu entries. Simply type the # This file provides an easy way to add custom menu entries. Simply type the
@@ -167,26 +204,26 @@ menuentry "Windows 11 (Manual)" {
如果virt-manager报错无法找到Qemu 如果virt-manager报错无法找到Qemu
- ​如果 libvirtd 服务未运行virt-manager 将无法连接到虚拟化环境。​ - ​如果 libvirtd 服务未运行virt-manager 将无法连接到虚拟化环境。​
``` ```bash
sudo systemctl start libvirtd sudo systemctl start libvirtd
sudo systemctl enable libvirtd sudo systemctl enable libvirtd
``` ```
- 用户权限问题:​​将当前用户添加到 libvirt 组,以获得必要的权限。​ - 用户权限问题:​​将当前用户添加到 libvirt 组,以获得必要的权限。​
``` ```bash
sudo usermod -aG libvirt $(whoami) sudo usermod -aG libvirt $(whoami)
``` ```
- 虚拟网络未激活virt-manager 可能无法连接到默认的虚拟网络。​ - 虚拟网络未激活virt-manager 可能无法连接到默认的虚拟网络。​
``` ```bash
sudo virsh net-start default sudo virsh net-start default
``` ```
默认网络在系统启动时自动启动,可以执行: 默认网络在系统启动时自动启动,可以执行:
``` ```bash
sudo virsh net-autostart default sudo virsh net-autostart default
``` ```
- 配置文件权限问题:​配置文件的权限设置可能导致访问问题。 - 配置文件权限问题:​配置文件的权限设置可能导致访问问题。
``` ```bash
sudo chown $(whoami):libvirt /var/run/libvirt/libvirt-sock sudo chown $(whoami):libvirt /var/run/libvirt/libvirt-sock
``` ```
随后安装虚拟机,流程大概为``选择镜像和系统类型--设置CPU/内存--设置空间大小--编辑配置项--开启UEFI引导和3D加速``. 随后安装虚拟机,流程大概为``选择镜像和系统类型--设置CPU/内存--设置空间大小--编辑配置项--开启UEFI引导和3D加速``.
@@ -194,7 +231,7 @@ sudo chown $(whoami):libvirt /var/run/libvirt/libvirt-sock
**开启3D加速** **开启3D加速**
- NIC - NIC
``` ```xml
<graphics type="spice"> <graphics type="spice">
<listen type="none"/> <listen type="none"/>
<image compression="off"/> <image compression="off"/>
@@ -203,7 +240,7 @@ sudo chown $(whoami):libvirt /var/run/libvirt/libvirt-sock
``` ```
- video virtio - video virtio
``` ```xml
<video> <video>
<model type="virtio" heads="1" primary="yes"> <model type="virtio" heads="1" primary="yes">
<acceleration accel3d="yes"/> <acceleration accel3d="yes"/>
@@ -218,17 +255,17 @@ sudo chown $(whoami):libvirt /var/run/libvirt/libvirt-sock
如果安装了多个linux内核可以使用以下方法调整启动顺序 如果安装了多个linux内核可以使用以下方法调整启动顺序
- 使用以下命令查看内核名称: - 使用以下命令查看内核名称:
``` ```bash
ls /boot/vmlinuz* ls /boot/vmlinuz*
``` ```
- 在 /etc/default/grub 中添加或修改如下行: - 在 /etc/default/grub 中添加或修改如下行:
``` ```bash
GRUB_TOP_LEVEL="/boot/vmlinuz-linux-cachyos" GRUB_TOP_LEVEL="/boot/vmlinuz-linux-cachyos"
``` ```
需要注意,这种方法会关闭 GRUB 的“记住上次启动项”的功能。 需要注意,这种方法会关闭 GRUB 的“记住上次启动项”的功能。
- 修改完 /etc/default/grub 后,记得重新生成 GRUB 配置文件: - 修改完 /etc/default/grub 后,记得重新生成 GRUB 配置文件:
``` ```bash
sudo grub-mkconfig -o /boot/grub/grub.cfg sudo grub-mkconfig -o /boot/grub/grub.cfg
``` ```
**图形界面更改方法:** **图形界面更改方法:**
@@ -236,12 +273,12 @@ sudo grub-mkconfig -o /boot/grub/grub.cfg
可以使用grub-customizer来修改Grub这里以ubuntu为例子 可以使用grub-customizer来修改Grub这里以ubuntu为例子
- 添加PPA源并更新软件列表 - 添加PPA源并更新软件列表
``` ```bash
sudo add-apt-repository ppa:danielrichter2007/grub-customizer sudo add-apt-repository ppa:danielrichter2007/grub-customizer
sudo apt update sudo apt update
``` ```
- 安装GRUB Customizer - 安装GRUB Customizer
``` ```bash
sudo apt install grub-customizer sudo apt install grub-customizer
``` ```
随后在grub-customizer中将要默认启动的选项放在首位即可。 随后在grub-customizer中将要默认启动的选项放在首位即可。
@@ -249,69 +286,168 @@ sudo apt install grub-customizer
## 开机自启动 ## 开机自启动
**设置Syncthing开机自启动** **设置Syncthing开机自启动**
``` ```bash
sudo systemctl enable --now syncthing@<username>.service sudo systemctl enable --now syncthing@<username>.service
``` ```
**设置Aria2开机自启动**
```conf
[Unit]
Description=Aria2c - lightweight multi-protocol & multi-source command-line download utility
After=network.target
[Service]
User=dich
Group=dich
WorkingDirectory=/home/dich
Environment=HOME=/home/dich
Environment=USER=dich
ExecStart=/usr/bin/aria2c --conf-path=/home/dich/.config/aria2/aria2.conf
Restart=always
NoNewPrivileges=true
PrivateTmp=true
[Install]
WantedBy=multi-user.target
```
## 开启BBR ## 开启BBR
- 确保你的内核版本 >= 4.9 - 确保你的内核版本 >= 4.9
``` ```bash
uname -r uname -r
``` ```
- 启用 BBR - 启用 BBR
你只需要设置两个 sysctl 参数即可: 你只需要设置两个 sysctl 参数即可:
``` ```bash
sudo sysctl -w net.core.default_qdisc=fq sudo sysctl -w net.core.default_qdisc=fq
sudo sysctl -w net.ipv4.tcp_congestion_control=bbr sudo sysctl -w net.ipv4.tcp_congestion_control=bbr
``` ```
要让它们永久生效,把它们写入配置文件: 要让它们永久生效,把它们写入配置文件:
``` ```bash
sudo nano /etc/sysctl.d/99-bbr.conf sudo nano /etc/sysctl.d/99-bbr.conf
``` ```
加入以下内容: 加入以下内容:
``` ```bash
net.core.default_qdisc = fq net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr net.ipv4.tcp_congestion_control = bbr
``` ```
然后重新加载配置: 然后重新加载配置:
``` ```bash
sudo sysctl --system sudo sysctl --system
``` ```
- 验证 BBR 是否启用 - 验证 BBR 是否启用
``` ```bash
sysctl net.ipv4.tcp_congestion_control sysctl net.ipv4.tcp_congestion_control
``` ```
应该输出: 应该输出:
``` ```bash
net.ipv4.tcp_congestion_control = bbr net.ipv4.tcp_congestion_control = bbr
``` ```
## 性能模式切换
需要安装``power-profiles-daemon``
```bash
# 查看可用的电源配置文件profiles
powerprofilesctl list
# 查看当前正在使用的 profile
powerprofilesctl get
# 切换到“性能”模式
sudo powerprofilesctl set performance
# 切换到“平衡”模式
sudo powerprofilesctl set balanced
# 切换到“省电”模式
sudo powerprofilesctl set power-saver
```
## 其他性能优化
```bash
Profilesyncdaemon
将浏览器配置文件和缓存挂载到内存,退出时再写回磁盘:
sudo pacman -S profile-sync-daemon
systemctl --user enable --now psd.service
Systemdoomd
启用 systemd 自带的内存超载保护守护进程:
sudo pacman -S systemd-oomd
sudo systemctl enable --now systemd-oomd
Bpftune
加载 BPF 性能调优脚本网络、I/O、调度等
sudo pacman -S bpftune
sudo systemctl enable --now bpftune
AnanicyCpp
根据预设规则给游戏、多媒体和后台任务打优先级标签:
sudo pacman -S ananicy-cpp
sudo systemctl enable --now ananicy-cpp
```
## 常用命令
```bash
更新系统sudo pacman -Syu
重新安装所有软件包sudo pacman -Qq | sudo pacman -S -
Reset keyrings
sudo rm -rf /etc/pacman.d/gnupg
sudo pacman-key --init
sudo pacman-key --populate archlinux
移除数据库锁sudo rm -f /var/lib/pacman/db.lck
清理软件包缓存sudo pacman -Sc (或 -Scc 完全清空)
删除孤立软件包sudo pacman -Rns $(pacman -Qtdq)
Install Gaming packagessudo pacman -S steam wine lutris dxvk
排序镜像:
sudo pacman -S reflector
sudo reflector --latest 10 --sort rate --save /etc/pacman.d/mirrorlist
更改 DNS 服务器:编辑 /etc/systemd/resolved.conf 中的 DNS=1.1.1.1 8.8.8.8,然后 sudo systemctl restart systemd-resolved
```
## 在Arch Linux上安装Docker ## 在Arch Linux上安装Docker
一般推荐在qemu虚拟机中安装这里仅做示例 一般推荐在qemu虚拟机中安装这里仅做示例
``` ```bash
sudo pacman -S docker sudo pacman -S docker
``` ```
安装完成后需要启动Docker服务并设置为开机自启 安装完成后需要启动Docker服务并设置为开机自启
``` ```bash
sudo systemctl start docker sudo systemctl start docker
sudo systemctl enable docker sudo systemctl enable docker
``` ```
运行以下命令来验证Docker是否正常工作 运行以下命令来验证Docker是否正常工作
``` ```bash
sudo docker run hello-world sudo docker run hello-world
``` ```
默认情况下只有root用户才能运行Docker命令。为了避免每次运行Docker命令时都需要使用sudo可以将当前用户添加到docker组 默认情况下只有root用户才能运行Docker命令。为了避免每次运行Docker命令时都需要使用sudo可以将当前用户添加到docker组
``` ```bash
sudo usermod -aG docker $USER sudo usermod -aG docker $USER
``` ```
之后,需要注销并重新登录,或者重启系统以使更改生效。 之后,需要注销并重新登录,或者重启系统以使更改生效。
安装Docker Compose 安装Docker Compose
``` ```bash
sudo pacman -S docker-compose sudo pacman -S docker-compose
``` ```
--- ---

View File

@@ -22,8 +22,6 @@ tags = ["综合工程"]
- 8.VPN配置回家 - 8.VPN配置回家
- 9.实现透明代理。 - 9.实现透明代理。
> 剩余专业路由功能可以由ROS替代服务则跑在NAS系统上避免ALL in Boom
## 大致思路 ## 大致思路
- 使用高性能的X86主机管理拨号和 DHCP 内网的工作其他无线路由器桥接做APMesh组网 - 使用高性能的X86主机管理拨号和 DHCP 内网的工作其他无线路由器桥接做APMesh组网
@@ -52,14 +50,39 @@ tags = ["综合工程"]
## **如何得到一个openwrt系统** ## **如何得到一个openwrt系统**
- 可以在恩山论坛上使用他人编译好的现成的镜像,如"高大全","精品小包"等等,但存在一定风险; 1. 使用编译好的现成的镜像:
- 可以使用[官方固件](https://downloads.openwrt.org/)下载得到一个最小化的系统再一步步添加自己要用的包注意需要根据你的uboot来选择注意固件名称是否带了uboot_mod!
- 可以使用[Openwrt 在线编译](https://firmware-selector.openwrt.org/)或[Openwrt.ai](https://openwrt.ai/?target=x86%2F64&id=generic)在线编译 - 恩山论坛上的"高大全","精品小包"等等,但存在一定风险;
- 使用[官方固件](https://downloads.openwrt.org)下载得到一个最小化的系统再一步步添加自己要用的包注意需要根据你的uboot来选择注意固件名称是否带了uboot_mod!
2. 自行编译:
- [Openwrt.ai](https://openwrt.ai/?target=x86%2F64&id=generic)在线编译
一个固件; 一个固件;
- 可以使用GitHub action 云编译一个固件; - 可以使用GitHub action 云编译一个固件;
- 可以在本地linux环境中进行编译。 - 可以在本地linux环境中进行编译。
## **X86平台安装准备** 3. ImageBuilder
- 使用[Openwrt 官方ImageBuilder编译](https://firmware-selector.openwrt.org/)
- 自行下载对应的ImageBuilder包并构建.
## Toolchain/SDK/ImageBuilder
| 特性 | **Toolchain** | **SDK** | **Image Builder** |
| -------- | -------------------------------------- | ---------------------------------------------- | ------------------------------------------------------------------------------ |
| 包含内容 | 仅交叉编译工具链(二进制版 GCC、ld、musl、binutils | 完整交叉编译环境 + feeds 脚本 + package 目录,用于 `.ipk` 包开发 | 预编译的根文件系统 + opkg 包(无需源码编译),用于快速定制固件映像 |
| 典型用途 | 用于编译第三方程序或 CI如 hello-world 示例 | 编写和编译 `.ipk` 包,本地或自动化环境中离线开发 | 快速生成可刷写的固件镜像,集成所需包且无需完整源码树 |
| 解压即用 | ✅ | ✅ | ✅ |
| 在源码树中的作用 | `make toolchain/install` 自动识别并使用跳过编译流程 | 源码树中不会触发 SDK 安装,需要手动解压并进入其目录使用 | 不使用源码树,直接在 Image Builder 根目录下运行 `make image` 等命令 |
| 大小 | 较小(几十 MB | 较大(上百 MB | 中等(约数百 MB因包含预编译包 |
| 构建时间 | 几秒到几分钟 | 几分钟到十几分钟(取决于 feeds 大小) | 极快,可在几十秒到几分钟内完成定制镜像 |
| 兼容性 | 与对应 Release 完全匹配 | 与对应 Release 完全匹配 | 与对应 Release 完全匹配 |
| 使用难度 | 简单,只需解压并设置 PATH | 适中,需要理解 feeds 机制及包管理 | 最简单,适合终端用户或快速测试环境
## **X86平台安装流程**
0. 安装准备:
- 一个U盘与一台双网口物理机 - 一个U盘与一台双网口物理机
@@ -72,26 +95,22 @@ tags = ["综合工程"]
- [img 写盘工具](https://www.roadkil.net/program.php?ProgramID=12#google_vignette) - [img 写盘工具](https://www.roadkil.net/program.php?ProgramID=12#google_vignette)
1. 进入PE环境
## **X86平台安装流程**
1.进入PE环境
- 打开微PE将其安装进U盘中安装完成后将 img 工具和 openwrt 包一起放进去; - 打开微PE将其安装进U盘中安装完成后将 img 工具和 openwrt 包一起放进去;
- 将U盘插入目标主机进入 BIOS-boot 设置U盘优先启动各主板进入 BIOS 的按键不同,不确定的话建议都试一遍。 - 将U盘插入目标主机进入 BIOS-boot 设置U盘优先启动各主板进入 BIOS 的按键不同,不确定的话建议都试一遍。
2.格式化硬盘并写盘 2. 格式化硬盘并写盘
- 进入PE环境中可以看到存在名为“分区助手”的软件打开它并将目标主机硬盘格式化注意不要分区不要分区不要设置文件系统否则后续可能无法编译点击左上角提交并执行 - 进入PE环境中可以看到存在名为“分区助手”的软件打开它并将目标主机硬盘格式化注意不要分区不要分区不要设置文件系统否则后续可能无法编译点击左上角提交并执行
- 打开img写盘工具将openwrt包写入硬盘注意不要写进U盘里。 - 打开img写盘工具将openwrt包写入硬盘注意不要写进U盘里。
3.进入配置界面 3. 进入配置界面
- 重启系统并快速拔出U盘避免重新进入PE这时系统开始运行了。注意Esir固件是不跑码的无需担心。- 一个U盘与一台双网口物理机 - 重启系统并快速拔出U盘避免重新进入PE这时系统开始运行了。注意Esir固件是不跑码的无需担心。- 一个U盘与一台双网口物理机
- 当看到 `please press Enter to activate this console`这个提示的时候系统就安装完毕了。可使用 passwd 命令设置密码。软路由将自动获取IP地址随后我们在浏览器中打开该地址即可看到 Lucl 界面。 - 当看到 `please press Enter to activate this console`这个提示的时候系统就安装完毕了。可使用 passwd 命令设置密码。软路由将自动获取IP地址随后我们在浏览器中打开该地址即可看到 Lucl 界面。
4.如果你使用官方固件,注意: 4. 如果你使用官方固件,注意:
- 硬盘空间有一部分没有被格式化可以手动格式化为ext4并挂载。 - 硬盘空间有一部分没有被格式化可以手动格式化为ext4并挂载。
- 注意初始IP往往是192.168.1.1,如果和光猫冲突需要在网络-接口中更改。 - 注意初始IP往往是192.168.1.1,如果和光猫冲突需要在网络-接口中更改。
- 基本系统主题比较简陋可以使用luci-theme-argon。 - 基本系统主题比较简陋可以使用luci-theme-argon。
@@ -100,14 +119,8 @@ tags = ["综合工程"]
uci commit luci uci commit luci
/etc/init.d/uhttpd restart`` /etc/init.d/uhttpd restart``
然后重新访问 Web 界面,查看是否恢复正常。 然后重新访问 Web 界面,查看是否恢复正常。
- 一般要安装的包:
```
openssh-sftp-server
libpcap
luci-app-upnp
luci-app-ttyd
kmod-nft-xxx
```
## **X86平台本地编译完整openwrt** ## **X86平台本地编译完整openwrt**
- **系统版本Debian 11 或者 Ubuntu LTS** - **系统版本Debian 11 或者 Ubuntu LTS**
@@ -116,7 +129,7 @@ kmod-nft-xxx
- **编译依赖** - **编译依赖**
``` ```bash
sudo apt update sudo apt update
sudo apt install -y \ sudo apt install -y \
ack antlr3 asciidoc autoconf automake autopoint binutils bison build-essential \ ack antlr3 asciidoc autoconf automake autopoint binutils bison build-essential \
@@ -134,379 +147,382 @@ sudo apt install -y \
``` ```
- **清理** - **清理**
``` ```bash
sudo apt autoremove --purge sudo apt autoremove --purge
sudo apt clean sudo apt clean
``` ```
- **新建一个用户,用于编译固件(可选)** - **新建一个用户,用于编译固件(可选)**
``` ```bash
useradd -m openwrt # 新建一个名为 openwrt 的用户 useradd -m openwrt # 新建一个名为 openwrt 的用户
``` ```
> 不可以使用Root用户进行编译!! > 不可以使用Root用户进行编译!!!
- **修改用户默认的 Shell** - **修改用户默认的 Shell**
``` ```bash
apt install -y sudo apt install -y sudo
usermod -s /bin/bash openwrt usermod -s /bin/bash openwrt
``` ```
- **切换用户** - **切换用户**
``` ```bash
su openwrt su openwrt
cd ~ cd ~
``` ```
- **拉取源码,这里用的是 LEDE 分支源码:** - **拉取源码,这里用的是 ImmortalWrt 24.10 分支源码:**
```bash
git clone https://github.com/immortalwrt/immortalwrt.git
cd immortalwrt
``` ```
git clone https://github.com/coolsnowwolf/lede
cd lede - **选择分支**
如果你想要编译稳定版(stable),使用
```bash
git checkout xxx #例如git checkout v24.10.2
```
如果你想要编译最新版(snapshot),使用
```bash
git switch xxx #例如git switch openwrt-24.10
``` ```
### 目录说明 ### 目录说明
- buildroot: OpenWrt 的核心目录,包含构建系统相关的文件。 | 名称 | 作用 |
- `feeds.conf.default`:定义软件包源的配置文件。 | -------------------- | ---------------------------------------------------------------------- |
- `files/`:存放自定义文件,用于覆盖默认的 root 文件系统。 | `Makefile` | **整个 OpenWrt 构建系统的总入口点**(顶层 Makefile运行 `make menuconfig`、`make` 都依赖它 |
| `Config.in` | Kconfig 系统的入口配置文件,决定 `make menuconfig` 菜单显示什么选项 |
- target: 包含目标设备架构的配置和构建信息。 | `config/` | 构建系统的默认配置模板、菜单逻辑,和 `menuconfig` 相关 |
- `linux/`:包含与 Linux 内核相关的代码和配置。 | `include/` | 包含通用 makefile 片段的目录(比如编译选项、函数定义) |
- `generic/`:通用配置文件。 | `rules.mk` | 所有包编译通用规则都写在这里,`include $(TOPDIR)/rules.mk` 是常见语句 |
- `platform/`:针对具体设备平台的特定配置。 | `feeds.conf.default` | 定义 Feed 源(即可选的软件源),可用于管理外部包,比如 `luci`、`packages` |
| `feeds/` *(克隆后还没出现)* | `./scripts/feeds update -a` 后才会出现,用来保存外部 feed 的代码 |
- package: 包含所有 OpenWrt 的软件包。 | `package/` | OpenWrt 自带的核心包和第三方包(除 feeds 外的)都在这,结构是 `package/<分类>/<包名>` |
- `base/`:基本功能相关的软件包(如 BusyBox、opkg | `target/` | 支持的平台架构,比如 `x86`、`ramips`、`ath79`、`mediatek` 等都在里面 |
- `kernel/`:与内核相关的补丁或模块。 | `toolchain/` | 编译器链、glibc/musl、binutils、gcc 都在这里构建 |
- `network/`:网络工具和协议(如 DHCP、DNS | `tools/` | 构建工具目录,编译前工具如 `m4`、`autoconf`、`xz`、`patch` 等放在这 |
- `utils/`:各种实用工具(如编解码器、文件工具)。 | `scripts/` | 脚本工具目录,如 `feeds` 管理、镜像合并、menuconfig 支持等 |
| `LICENSES/` | 所有包/组件的许可证归档 |
- config: 存放默认配置文件,例如 `Config.in`,用于定义菜单项。 | `COPYING` | OpenWrt 的主许可证GPLv2 |
- scripts: 构建过程中使用的辅助脚本(如生成补丁、编译镜像)。 | `README.md` | 简要介绍如何开始使用 OpenWrt 的说明文档 |
- toolchain: 构建工具链所需的文件,如编译器、链接器。 | `BSDmakefile` | 为 BSD 系统一些兼容 makefileLinux 用户用不到 |
- tools: 一些构建系统依赖的额外工具(如 `autoconf`、`zlib`)。
- include: 存放 Makefile 的通用模板和其他全局定义文件。
- feeds: 包含通过 `feeds.conf` 配置的外部软件包源。
- documentation: 包含与 OpenWrt 项目相关的文档,如构建指南和开发文档。
- **添加软件源,可自行添加软件源至 feeds.conf.default 文件也可以直接git添加需要的软件到lede目录下** - **添加软件源,可自行添加软件源至 feeds.conf.default 文件**
``` ```bash
vim feeds.conf.default vim feeds.conf.default
``` ```
```
常用源 **常用源**
```bash
src-git kenzo https://github.com/kenzok8/openwrt-packages src-git kenzo https://github.com/kenzok8/openwrt-packages
src-git small https://github.com/kenzok8/small src-git small https://github.com/kenzok8/small
src-git haibo https://github.com/haiibo/openwrt-packages src-git haibo https://github.com/haiibo/openwrt-packages
src-git liuran001 https://github.com/liuran001/openwrt-packages src-git liuran001 https://github.com/liuran001/openwrt-packages
``` ```
**常用仓库**
```bash
src/gz kwrt_core https://dl.openwrt.ai/releases/24.10/targets/x86/64/6.6.83
src/gz kwrt_base https://dl.openwrt.ai/releases/24.10/packages/x86_64/base
src/gz kwrt_packages https://dl.openwrt.ai/releases/24.10/packages/x86_64/packages
src/gz kwrt_luci https://dl.openwrt.ai/releases/24.10/packages/x86_64/luci
src/gz kwrt_routing https://dl.openwrt.ai/releases/24.10/packages/x86_64/routing
src/gz kwrt_kiddin9 https://dl.openwrt.ai/releases/24.10/packages/x86_64/kiddin9
```
- **单独添加**(在更新并安装插件之前执行)例如: - **单独添加**(在更新并安装插件之前执行)例如:
``` ```bash
git clone https://github.com/chenmozhijin/turboacc.git git clone https://github.com/chenmozhijin/turboacc.git
``` ```
- **更新并安装插件** - **更新并安装插件**
``` ```bash
./scripts/feeds clean ./scripts/feeds clean
./scripts/feeds update -a ./scripts/feeds update -a
./scripts/feeds install -a ./scripts/feeds install -a
``` ```
| `./scripts/feeds update -a` | 同步/更新 **外部 feed**packages、luci、routing 等)的 Git 仓库到本地 `feeds/` 目录 |
| ---------------------------- | ----------------------------------------------------------------- |
| `./scripts/feeds install -a` | 把你在 feeds 里选要用的包 **链接** 到源码树的 `package/feeds/`,让它们参与编译 |
- **自定义配置** - **自定义配置**
**修改默认IP为 10.0.0.2** ```bash
``` #!/usr/bin/env bash
sed -i 's/192.168.1.1/192.168.2.1/g' package/base-files/files/bin/config_generate # diy-part2.sh — 在镜像生成时注入默认设置和定制 SSH 横幅及模型修复
```
**修改默认主机名** # 1. 默认 hostname可选
``` sed -i 's/=ImmortalWrt/=my-device/' package/base-files/files/bin/config_generate
sed -i '/uci commit system/i\uci set system.@system[0].hostname='OpenWrt'' package/lean/default-settings/files/zzz-default-settings
# 2. 默认 IP 地址(可选)
sed -i 's/192.168.1.1/192.168.5.1/' package/base-files/files/bin/config_generate
# 3. 默认 root 密码(请换成安全密码)
HASH=$(openssl passwd -1 'yourpassword')
sed -i "s|root::0:0:99999|root:${HASH}:0:0:99999|" package/base-files/files/etc/shadow
# 4. 设置默认 LuCI 主题为 argon内置在 luci feeds
cat >>package/base-files/files/etc/uci-defaults/99_set_theme <<'EOF'
uci set luci.main.mediaurlbase=/luci-static/argon
uci commit luci
EOF
chmod +x package/base-files/files/etc/uci-defaults/99_set_theme
# 5. 默认加载 BBR 拥塞控制算法
mkdir -p package/base-files/files/etc/sysctl.d
cat >>package/base-files/files/etc/sysctl.d/99-bbr.conf <<'EOF'
net.core.default_qdisc=fq_codel
net.ipv4.tcp_congestion_control=bbr
EOF
# 检查BBR: sysctl net.ipv4.tcp_congestion_control
# 6. 将默认 shell 修改为 bash
sed -i "s|/bin/ash|/bin/bash|g" package/base-files/files/etc/passwd
# 请在 .config 中添加 TARGET_PACKAGES += bash
# 7. 自定义 SSH 登录横幅banner
mkdir -p package/base-files/files/etc
if [ -f "scripts/custom-files/banner.txt" ]; then
cp scripts/custom-files/banner.txt package/base-files/files/etc/banner
else
cat >package/base-files/files/etc/banner <<'EOF'
Welcome to MyDevice (ImmortalWrt)\n
EOF
fi
# 8. 自定义 LuCI 概览设备型号 🛠
# 通过 uci-defaults 脚本写入 /tmp/sysinfo/model
cat >>package/base-files/files/etc/uci-defaults/99-model-fix <<'EOF'
#!/bin/sh
# 设置自定义设备型号
mkdir -p /tmp/sysinfo
echo "Your Router Model" > /tmp/sysinfo/model
exit 0
EOF
chmod +x package/base-files/files/etc/uci-defaults/99-model-fix
``` ```
**加入编译者信息** - 执行 **make menuconfig** 命令进入编译菜单。
```
sed -i "s/OpenWrt /smith build $(TZ=UTC-8 date "+%Y.%m.%d") @ OpenWrt /g" package/lean/default-settings/files/zzz-default-settings
```
**修改默认主题**
```
sed -i "s/luci-theme-bootstrap/luci-theme-argon/g" feeds/luci/collections/luci/Makefile
```
执行 **make menuconfig** 命令进入编译菜单。 | 命令 | 功能描述 | 优点 | 适用场景 |
| ----------------- | ---------------------------------------------------- | -------------------- | -------------- |
| `make menuconfig` | 以 ncurses 界面交互式地浏览、修改当前 `.config` 与最新 Kconfig 中的所有选项 | 界面友好,支持搜索和分类;可直观调整 | 想手动挑选/调整配置时 |
| `make oldconfig` | 在命令行逐项对比 `.config` 与最新 Kconfig保留原值、提示新增项、删除废弃项 | 快速同步,只对新增选项发出提示;无需界面 | 自动化脚本或快速同步配置时 |
| `make defconfig` | 忽略当前 `.config`,直接加载架构/板级目录下的默认配置(`defconfig` | 一键生成官方/平台推荐的「干净」配置 | 想重置到官方默认或重新开始时 |
### **编译配置菜单说明(部分)** ### **编译配置菜单说明(部分)**
``` ```bash
Target System (Broadcom BCM27xx) # 选择处理器架构 Target System (x86) # 选择目标平台
└── Subtarget (BCM2711 boards (64 bit)) # 选择处理器 └── Subtarget (x86_64) # 选择 64-bit 子架构
└── Target Profile (Raspberry Pi 4B/400/4CM (64bit)) # 预制配置文件 └── Target Profile (Generic) # “Generic” 表示通用 x86_64 设备
└── Target Images # 固件像设置 └── Target Images # 固件像设置
── ramdisk # 内存盘 ── ramdisk # 可选内存盘镜像
├── Compression # 压缩等级 (none 表示压缩) ├── Compression # 压缩类型(如 none 表示压缩
├── Root filesystem archives # 根文件系统存档类型 ├── Root filesystem archives # 压缩存档cpio.gz 或 tar.gz
── cpio.gz ── Root filesystem images # 文件系统镜像ext4、squashfs、Gzip
│ └── tar.gz └── Image Options # 镜像选项
├── Root filesystem images # 根文件系统格式 ├── Kernel partition size # 内核分配分区大小
│ ├── ext4 # 适用于大容量闪存 ├── Root filesystem partition size # 根文件系统分区大小
│ ├── squashfs # 适用于小容量闪存 └── Make /var persistent # 是否保留 /var 持久化
│ └── Gzip images # Gzip 存档
└── Image Options
├── Kernel partition size # 内核分区大小
├── Root filesystem partition size # 跟文件系统分区大小
└── Make /var persistent # 持久化 /var
Enable experimental features by default # 默认启用实验性功能 Global build settings # 全局构建设置
Global build settings # 全局编译设置 Advanced configuration options (for developers) # 开发者高级选项
Advanced configuration options (for developers) # 高级选项(仅供开发者) Build the OpenWrt Image Builder # 编译镜像构建器
Build the OpenWrt Image Builder # 编译 OpenWrt 镜像编译器 Build the OpenWrt SDK # 构建交叉编译 SDK
Build the OpenWrt SDK # 编译 OpenWrt SDK Package the OpenWrtbased Toolchain # 打包 OpenWrt 工具链
Package the OpenWrt-based Toolchain # 打包 OpenWrt 工具链 Image configuration # 镜像总体配置页面
Image configuration # 镜像选项
Base system # 基本组件 Base system # 系统基础组件
Administration # 管理工具 Administration # 管理工具(如 ssh、管理员脚本
Boot Loaders # 引导程序 Boot Loaders # 引导程序(如 grub、syslinux
Development # 开发者工具 Development # 编译/调试辅助工具
Extra packages # 额外包 Extra packages # 附加应用(如 wget、curl
Firmware # 固件工具 Firmware # 固件工具
Fonts # 字体 Fonts # 字体支持
Kernel modules # 内核模块 Kernel modules # x86 内核模块驱动
Languages # 额外的语言 (Python3, PHP, NodeJS 等) Languages # 编程语言包(如 Python3、Node.js
Libraries # 系统库 Libraries # 系统库依赖
LuCI # LuCI 插件(一般只需修改应用和主题) LuCI # Web UI 前端
└── Collections └── Collections
└── Modules └── Modules
└── Applications └── Applications
└── Themes └── Themes
└── Protocols └── Protocols
└── Libraries └── Libraries
└── default-settings # 默认选项(自动配置语言包) └── defaultsettings
Mail # 邮件 Mail # 邮件客户端
Multimedia # 媒体 Multimedia # 媒体工具(如 ffmpeg
Network # 网络相关 Network # 网络功能(如 openvpn、wireguard
Sound # 音频 Sound # 音频相关软件
Utilities # 各类实用软件(比如 VIM Utilities # 常用实用程序(如 vim、htop
Xorg Xorg # 桌面环境支持X11 图形系统)
```
### **菜单选项说明**
**选择 CPU 类型**
``` ```
Target System (x86) --> # 软路由选择 x86硬路由根据型号厂家自行选择
Subtarget (x86_64) --> # CPU 子选项
Target Profile (Generic x86/64) --> # 厂家具体型号
```
**设置镜像编译的格式squashfsext4**
```
Target Images --> # 默认 squashfs
```
**添加较多插件时为了避免空间不足建议修改下面两项默认大小x86/64**
```
Target Images --> (16) Kernel partition size (in MB) # 默认是16建议修改为256
```
**开启 IPv6 支持**
```
Extra packages --> ipv6helper选定这个后下面几项会自动选择
```
**开启适用于 VMware 的 VMware Tools**
```
Utilities --> open-vm-tools
Utilities --> open-vm-tools-fuse
```
**选择插件**
```
LuCI --> Applications # 根据需要选择,* 代表编入固件M 表示编译成模块或者IPK包为空表示不编译
```
**选择主题**
```
LuCI --> Themes # 选择喜欢的主题,可以选多个
```
配置完成后使用编译菜单底部的 Save 保存,然后退出菜单 Exit开始下载软件包
- **预下载编译所需的软件包** - **预下载编译所需的软件包**
``` ```bash
make download -j8 make download -j8
``` ```
- **检查文件完整性** - **检查文件完整性**
``` ```bash
find dl -size -1024c -exec ls -l {} \; find dl -size -1024c -exec ls -l {} \;
``` ```
检查文件完整性命令可以列出下载不完整的文件小于1k的文件属于下载不完整如果存在则用下面的命令删除然后重新下载编译所需的软件包再次检查.确认所有文件完整可大大提高编译成功率,避免浪费时间 检查文件完整性命令可以列出下载不完整的文件小于1k的文件属于下载不完整如果存在则用下面的命令删除然后重新下载编译所需的软件包再次检查.确认所有文件完整可大大提高编译成功率,避免浪费时间
``` ```bash
find dl -size -1024c -exec rm -f {} \; find dl -size -1024c -exec rm -f {} \;
``` ```
最后编译固件,编译完成后输出路径是 **bin/targets**,默认密码是 **password**.
- **编译固件(-j 后面是线程数,首次编译推荐用单线程)** - **最后编译固件(-j 后面是线程数,首次编译推荐用单线程)编译完成后输出路径是bin/targets.**
``` ```bash
make V=s -j1 make V=s -j1
或者使用 make world -j1 V=s 2>&1 | tee world_debug.log
如果报错可查看 grep -E "(error|fatal|Cannot install package)" world_debug.log -n
``` ```
- **二次编译** | make层级 | 目录示例 | 说明 |
| -------- | ---------------------------- | ---------------- |
| make\[1] | 顶层 Makefile | 解析依赖,调度模块 |
| make\[2] | `tools/` | 编译辅助工具 |
| make\[2] | `toolchain/` | 编译交叉编译工具链 |
| make\[2] | `target/linux/` | 编译内核及设备树 |
| make\[2] | `package/` | 进入包管理,调度包构建 |
| make\[3] | `package/libs/libc` | 单个包的 Makefile |
| make\[3] | `package/utils/busybox` | 单个包的 Makefile |
| make\[4] | `build_dir/target-...` | 包源码目录,运行源码的 make |
| make\[4] | `build_dir/target-linux-...` | 内核源码目录 |
拉取最新 OpenWrt 源码和更新 feeds 源中的软件包源码 ## 二次编译
```
cd lede
git pull | 命令 | 清除内容 | 保留内容 | 适用场景 |
| ---------------- | ------------------------------------------------------------- | --------------------------------------- | ---------------------------------------------- |
| `make clean` | 删除 `bin/` 镜像、`build_dir/` 编译产物 | `.config`、`staging_dir/`、`toolchain/` 等 | 小修改后重建镜像,速度快,常用于增量编译。|
| `make dirclean` | 和 `make clean` 一样,还删除 `staging_dir/`、`toolchain/`、`logs` | `.config` | 彻底重建交叉编译环境,适合更改编译配置如 `.config`、feeds 等。 |
| `make distclean` | 删除 `make dirclean` 的所有内容 + feeds 下载文件 + `.config`、patch 等所有状态 | 只有源码目录保持不变 | 专用于回到一个“零配置、重做一切”的状态,完全从头开始构建。 |
./scripts/feeds update -a 恢复所有修改(包括未跟踪文件):
```bash
./scripts/feeds install -a git clean -fd
``` git restore --source=v24.10.2 --staged --worktree .
清除旧的编译产物和目录(可选)
```
make clean
```
- 源码有大规模更新或者内核更新后执行,以保证编译质量;此操作会删除 /bin 和 /build_dir 目录中的文件
```
make dirclean
```
> 更换架构编译前必须执行
> 此操作会删除 /bin 和 /build_dir 目录的中的文件make clean以及 /staging_dir、/toolchain、/tmp 和 /logs 中的文件
同首次编译,多线程编译失败后自动进入单线程编译,失败则输出详细日志
```
make defconfig
make download -j8
find dl -size -1024c -exec ls -l {} \;
make -j$(nproc) || make -j1 || make -j1 V=s
```
### 如果需要重新配置
```
rm -rf ./tmp && rm -rf .config # 清除临时文件和编译配置文件
make menuconfig
make download -j8
find dl -size -1024c -exec ls -l {} \;
make -j$(nproc) || make -j1 || make -j1 V=s
``` ```
## Dwrt 方案
| 作用 | 组件 |
| ----------- | -------------------- |
| 主题 | argon |
| Shell | bash |
| SSH 服务器 | dropbear |
| Web 服务器 | uhttpd |
| DNS/DHCP 服务 | dnsmasqfull |
| 加密库 | openssl |
| 压缩算法 | zram+zstd |
| 拥塞控制 | bbr |
| 防火墙 | nftables + iptables |
| 调度模块 | BPF + kmod-sched-xxx |
| 时间同步 | ntpd-full |
| 文本编辑 | vim-fullvim-runtime |
| 编译优化 | LTO + O3 |
## Arm平台安装OpenWrt 要启用的软件包
相比X86平台arm架构的设备兼容性不高不能随便找一个包就能安装。以下是一般步骤
- 首先得知道你的设备的CPU比如ipq40XX系列然后在对应的[仓库](https://archive.openwrt.org/releases/23.05.4/targets/)查看并下载包体。
- 当然也可以在[这里](https://firmware-selector.openwrt.org/)直接下载相关型号对应的固件,其中 Sysupgrade 映像是用来更新现有运行 OpenWrt 的设备,使用 Factory 映像在首次刷机时刷入。
- 随后开启Telnet或者SSH或者TTL串口连接到路由器将对应的Uboot刷入如果没有适配的包就无法刷openwrt。
- 通过Uboot的网络界面刷入Factory包随后就可以在后台如192.168.1.1进入openwrt的管理界面。
## 在ubuntu上单独编译openwrt的ipk包
这里以ubuntu环境为例我们假设你有一台虚拟机或者WSL。
> ``注意编译不能使用Root用户``
**随后安装编译依赖的各个包:**
**base**
```bash
autocore base-files bash block-mount ca-bundle coremark curl dnsmasq-full dropbear ds-lite e2fsprogs fdisk firewall4 fstools grub2-bios-setup htop kmod-8139cp kmod-8139too kmod-amazon-ena kmod-amd-xgbe kmod-atlantic kmod-bnx2 kmod-bnx2x kmod-button-hotplug kmod-drm-amdgpu kmod-drm-i915 kmod-dwmac-intel kmod-e1000 kmod-e1000e kmod-forcedeth kmod-fs-f2fs kmod-fs-vfat kmod-i40e kmod-iavf kmod-igb kmod-igbvf kmod-igc kmod-ixgbe kmod-ixgbevf kmod-lib-zstd kmod-mlx4-core kmod-mlx5-core kmod-mmc kmod-pcnet32 kmod-phy-broadcom kmod-r8101 kmod-r8125 kmod-r8126 kmod-r8168 kmod-sdhci kmod-tcp-bbr kmod-tg3 kmod-tulip kmod-usb-hid kmod-vmxnet3 libc libgcc libustream-mbedtls lm-sensors-detect logd lsblk luci-app-fan luci-app-filemanager luci-app-firewall luci-app-log-viewer luci-app-package-manager luci-app-syscontrol luci-app-upnp luci-base luci-compat luci-lib-fs luci-lib-ipkg mkf2fs mtd nano netifd odhcp6c odhcpd-ipv6only openssh-sftp-server opkg partx-utils pciutils ppp ppp-mod-pppoe resolveip swconfig uci uclient-fetch urandom-seed urngd usbutils wget-ssl zram-swap
``` ```
sudo apt update **cli**
sudo apt install -y \ ```bash
ack antlr3 asciidoc autoconf automake autopoint binutils bison build-essential \ btop iperf3 tcpdump
bzip2 ccache clang cmake cpio curl device-tree-compiler diffutils diffstat findutils flex gawk \
gcc-multilib g++-multilib git gettext gperf grep haveged help2man intltool \
libelf-dev libfuse-dev libgmp3-dev libgl1-mesa-dev libgraphene-1.0-dev libglib2.0-dev \
libltdl-dev libmpc-dev libmpfr-dev libncurses-dev libpython3-dev libreadline-dev libssl-dev \
libtool lrzsz make mesa-common-dev msmtp ninja-build p7zip p7zip-full patch pkgconf \
perl python-is-python3 python3 python3-dev python3-distutils-extra python3-pip python3-pyelftools \
python3-setuptools qemu-utils rsync scons squashfs-tools subversion swig texinfo uglifyjs \
upx-ucl unzip vim wget gnu-which xmlto xxd zlib1g-dev genisoimage llvm llvm-runtime docutils-common \
ecj fastjar java-wrappers libeclipse-jdt-core-java libgnutls-dane0t64 \
libgnutls-openssl27t64 libgnutls28-dev libidn2-dev libp11-kit-dev libtasn1-6-dev libtasn1-doc \
libunbound8 libyaml-dev lld lld-18 nettle-dev python3-docutils python3-ply python3-roman re2c
``` ```
随后下载我们**刷入openwrt的对应的SDK包**,如 **luci**
```bash
luci-app-argon luci-app-upnp luci-app-ttyd luci-app-eqosplus luci-app-timecontrol luci-app-parentcontrol luci-app-homeproxy luci-app-daed
```
**lib**
```bash
kmod-ipt-conntrack kmod-ipt-nat kmod-nft-compat kmod-ipt-fullconenat kmod-ip6tables ca-certificates
```
## 使用SDK快速编译包
``` 首先新建一个文件夹并将SDK克隆下来
git clone https://github.com/immortalwrt/immortalwrt.git
```bash
mkdir imwrt-sdk
cd ./imwrt-sdk
wget https://downloads.immortalwrt.org/snapshots/targets/mediatek/filogic/immortalwrt-sdk-mediatek-filogic_gcc-14.3.0_musl.Linux-x86_64.tar.zst
``` ```
**下载和安装仓库信息** 新版本的SDK使用ZSTD压缩因此解压的命令为
```bash
tar -I zstd -xvf ./immortalwrt-sdk-mediatek-filogic_gcc-14.3.0_musl.Linux-x86_64.tar.zst
``` ```
随后进入该目录并和一般流程一样更新Feeds
```bash
cd ./immortalwrt-sdk-mediatek-filogic_gcc-14.3.0_musl.Linux-x86_64/
./scripts/feeds update -a ./scripts/feeds update -a
./scripts/feeds install -a ./scripts/feeds install -a
``` ```
**下载并选中我们需要编译的包,这里以inyn为例**
``` 更新完成后克隆你要编译的包的源码到package下
git clone https://github.com/diredocks/openwrt-inyn.git ./package/inyn
make menuconfig ```bash
cd ./package/
git clone https://github.com/Dichgrem/luci-app-nyn.git
cp ./luci-app-nyn/luci-app-zzz ./
cp ./luci-app-nyn/zzz ./
rm -rf ./luci-app-nyn
cd ../
``` ```
在 `menuconfig` 的命令行界面中,选中 `Network -> inyn` 将其首部调整为 `<M>` 表示按需编译,最后选中 `Save -> OK -> Exit` 保存配置信息,然后 `Exit` 退出配置。 随后开始编译编译结果在对应架构的base目录下
**编译 inyn 软件包** ```bash
``` make package/luci-app-zzz/compile V=s
make package/inyn/compile V=s
## 如果不行则需要先编译工具链,即为 make j=4 j为CPU核数 ~/imwrt-sdk/immortalwrt-sdk-24.10.3-x86-64_gcc-13.3.0_musl.Linux-x86_64 dich@uos
find ./ -name "zzz*.ipk"
./bin/packages/x86_64/base/zzz_0.1.1-r1_x86_64.ipk
``` ```
## Github Actions 编译OpenWrt ## 常用命令
Github为我们提供了免费的E5主机用来编译。 > 注意不能升级kmod前缀的软件包base-files是危险包谨慎升级
- 首先Fork[这个仓库](https://github.com/hugcabbage/shared-lede),可以看到有许多现成的配置,在**顶栏actions里面可以直接启动一个Workflow**来编译。 ```bash
- 大体架构是选择**源码 -- 机型 -- 版本 -- 插件/主题 -- 配置IP/密码/Hostname/编译者)**由一个config文件管理这个文件在前面也提到过可以在本地生成并上传
- 想要什么插件可以直接git clone过来原仓库如果你想要添加其他架构和设备这里**使用templet里面的init.toml来创建**,按照类似的格式填好;
- 在actions里面运行produce注意这需要**GitHub Personal Access Token (PAT)**;如果没有,必须先添加:
- 打开 GitHub进入[GitHub Developer Settings](https://github.com/settings/tokens)点击 “Generate new token (classic)”,**勾选所需权限**(最关键的是 repo 和 workflow✅ repo所有子权限✅ workflow✅ read:packages **Token 过期时间**:选择 “No expiration”不过期否则过期后需要重新生成。**点击** “Generate token”
**复制 Token**(只显示一次,一定要保存好!)
- 然后添加 **PRODUCE_DEVICE** 到 **GitHub Secrets**
首先进入你的 GitHub 仓库,``依次进入Settings设置-
Secrets and variables-Actions-New repository secret
名称为PRODUCE_DEVICE``,值为粘贴刚刚复制的 GitHub Token点击 “Add secret” 完成添加。
- 随后``在actions里面运行produce``,完成后即可出现新架构的编译按钮.
## 常用命令:
```
# 更新软件列表 # 更新软件列表
opkg update opkg update
# 更新所有 LUCI 插件 # 列出可升级的非内核包
opkg list-upgradable | grep luci- | cut -f 1 -d ' ' | xargs opkg upgrade opkg list-upgradable | grep -vE '^(kmod-|kernel)'
# 如果要更新所有软件,包括 OpenWRT 内核、固件等 # 升级单个软件包
opkg list-upgradable | cut -f 1 -d ' ' | xargs opkg upgrade opkg upgrade 包名
# 固件版本号
vim /etc/os-release
# 脚本&脚注
vim /etc/openwrt_release
# ASCII字符画
vim /etc/banner
# 登录脚本显示
vim /etc/profile
``` ```
> 新版本的openwrt24.10已经改用APK包管理器。
## 常用科学插件 ## 常用科学插件
@@ -516,6 +532,7 @@ opkg list-upgradable | cut -f 1 -d ' ' | xargs opkg upgrade
| **UI 管理** | ✅Web UI、桌面端 GUI | ✅OpenClash Web UI | ✅Luci Web UI | ❌Shell 终端管理) | | **UI 管理** | ✅Web UI、桌面端 GUI | ✅OpenClash Web UI | ✅Luci Web UI | ❌Shell 终端管理) |
| **适用场景** | 性能较好,但分流设置复杂 | 适用于clash系,机场首选 | 操作简单,分流完善,但对路由器性能要求较高 | 没有UI界面性能最好支持完善可以通过clashapi安装UI | | **适用场景** | 性能较好,但分流设置复杂 | 适用于clash系,机场首选 | 操作简单,分流完善,但对路由器性能要求较高 | 没有UI界面性能最好支持完善可以通过clashapi安装UI |
## 校园网多设备防检测 ## 校园网多设备防检测
**常见检测方法** **常见检测方法**

View File

@@ -28,21 +28,21 @@ Waydroid是Anbox配合Halium技术开发的LXC Android容器可在GNU/Linux
目前Waydroid只支持Intel和AMD的显卡对于 NVIDIA 显卡(除 Tegra 系列外Waydroid 不支持硬件加速推荐使用软件渲染或QEMU方案。 目前Waydroid只支持Intel和AMD的显卡对于 NVIDIA 显卡(除 Tegra 系列外Waydroid 不支持硬件加速推荐使用软件渲染或QEMU方案。
- Waydroid必须使用Wayland用此命令检查当前系统是否为Wayland - Waydroid必须使用Wayland用此命令检查当前系统是否为Wayland
``` ```bash
echo $XDG_SESSION_TYPE echo $XDG_SESSION_TYPE
``` ```
若显示X11代表不是Wayland。GNOME和KDE可在登入画面切换至Wayland工作阶段。 若显示X11代表不是Wayland。GNOME和KDE可在登入画面切换至Wayland工作阶段。
- Waydroid要求Linux核心支持binder核心模组但Arch Linux预设的linux核心並无开启此选项因此需要从AUR安装binder_linux-dkms补齐。 - Waydroid要求Linux核心支持binder核心模组但Arch Linux预设的linux核心並无开启此选项因此需要从AUR安装binder_linux-dkms补齐。
``` ```bash
paru -S binder_linux-dkms paru -S binder_linux-dkms
``` ```
- 安装后载入binder核心模组 - 安装后载入binder核心模组
``` ```bash
sudo modprobe binder-linux devices=binder,hwbinder,vndbinder sudo modprobe binder-linux devices=binder,hwbinder,vndbinder
``` ```
- 设定开机自动载入核心模组 - 设定开机自动载入核心模组
``` ```bash
echo "binder_linux" | sudo tee -a /etc/modules-load.d/binder_linux.conf echo "binder_linux" | sudo tee -a /etc/modules-load.d/binder_linux.conf
echo "options binder_linux devices=binder,hwbinder,vndbinder" | sudo tee -a /etc/modprobe.d/binder_linux.conf echo "options binder_linux devices=binder,hwbinder,vndbinder" | sudo tee -a /etc/modprobe.d/binder_linux.conf
@@ -51,36 +51,36 @@ echo "options binder_linux devices=binder,hwbinder,vndbinder" | sudo tee -a /etc
## 安装Waydroid ## 安装Waydroid
- 安装以下软件包让Linux与Waydroid共享剪切板 - 安装以下软件包让Linux与Waydroid共享剪切板
``` ```bash
paru -S wl-clipboard xclip paru -S wl-clipboard xclip
paru -S python-pyclip paru -S python-pyclip
``` ```
- 安装Waydroid - 安装Waydroid
``` ```bash
paru -S waydroid paru -S waydroid
``` ```
- 初始化Waydroid下载含有GAPPS的Android系统映像档 - 初始化Waydroid下载含有GAPPS的Android系统映像档
``` ```bash
sudo waydroid init -s GAPPS -f sudo waydroid init -s GAPPS -f
``` ```
- 启动Waydroid容器服务 - 启动Waydroid容器服务
``` ```bash
sudo systemctl start waydroid-container sudo systemctl start waydroid-container
``` ```
## 常用命令 ## 常用命令
- 开机自动启动 - 开机自动启动
``` ```bash
sudo systemctl enable waydroid-container sudo systemctl enable waydroid-container
``` ```
- 点选应用列表的「Waydroid」图示开启主画面或者使用命令 - 点选应用列表的「Waydroid」图示开启主画面或者使用命令
``` ```bash
waydroid show-full-ui waydroid show-full-ui
``` ```
- 若Waydroid无法连上网路开放UFW防火墙 - 若Waydroid无法连上网路开放UFW防火墙
``` ```bash
sudo ufw allow 53 sudo ufw allow 53
sudo ufw allow 67 sudo ufw allow 67
sudo ufw default allow FORWARD sudo ufw default allow FORWARD
@@ -88,21 +88,21 @@ sudo ufw reload
sudo systemctl restart waydroid-container sudo systemctl restart waydroid-container
``` ```
- 重启Waydroid - 重启Waydroid
``` ```bash
sudo systemctl restart waydroid-container sudo systemctl restart waydroid-container
``` ```
- 启动/停止Waydroid容器服务 - 启动/停止Waydroid容器服务
``` ```bash
sudo systemctl start waydroid-container sudo systemctl start waydroid-container
sudo systemctl stop waydroid-container sudo systemctl stop waydroid-container
``` ```
- 用命令开启Waydroid主画面 - 用命令开启Waydroid主画面
``` ```bash
waydroid show-full-ui waydroid show-full-ui
``` ```
- 查看系统错误讯息 - 查看系统错误讯息
``` ```bash
waydroid log waydroid log
sudo waydroid logcat sudo waydroid logcat
``` ```
@@ -116,35 +116,35 @@ sudo waydroid logcat
安装Package Manager用於查看APP的软件包名称。 安装Package Manager用於查看APP的软件包名称。
部份APP会要求开启Wifi才能上网那么就如它所愿开启fake wifi 部份APP会要求开启Wifi才能上网那么就如它所愿开启fake wifi
``` ```bash
waydroid prop set persist.waydroid.fake_wifi "软件包名称" waydroid prop set persist.waydroid.fake_wifi "软件包名称"
``` ```
例如给Fate/Go游戏开启模拟Wifi 例如给Fate/Go游戏开启模拟Wifi
``` ```bash
waydroid prop set persist.waydroid.fake_wifi "com.aniplex.fategrandorder" waydroid prop set persist.waydroid.fake_wifi "com.aniplex.fategrandorder"
``` ```
- 模拟触控功能 - 模拟触控功能
安装Package Manager用於查看APP的软件包名称。有些APP认不到鼠标点击需要启用模拟触控(fake touch) 安装Package Manager用於查看APP的软件包名称。有些APP认不到鼠标点击需要启用模拟触控(fake touch)
``` ```bash
waydroid prop set persist.waydroid.fake_touch "软件包名称" waydroid prop set persist.waydroid.fake_touch "软件包名称"
``` ```
例如给Fate/Go游戏开启模拟触控 例如给Fate/Go游戏开启模拟触控
``` ```bash
waydroid prop set persist.waydroid.fake_touch "com.aniplex.fategrandorder" waydroid prop set persist.waydroid.fake_touch "com.aniplex.fategrandorder"
``` ```
- 用命令安装APK - 用命令安装APK
``` ```bash
waydroid app install <APK档案路径>.apk waydroid app install <APK档案路径>.apk
``` ```
- 进入ADB Shell - 进入ADB Shell
``` ```bash
sudo waydroid shell sudo waydroid shell
``` ```
- 开启多视窗模式 - 开启多视窗模式
Waydroid的多视窗模式看起来像Linux的原生应用。启动后按F11改回来。 Waydroid的多视窗模式看起来像Linux的原生应用。启动后按F11改回来。
``` ```bash
waydroid prop set persist.waydroid.multi_windows true waydroid prop set persist.waydroid.multi_windows true
sudo systemctl restart waydroid-container sudo systemctl restart waydroid-container
``` ```
@@ -154,13 +154,13 @@ sudo systemctl restart waydroid-container
Waydroid第一次开机可能会收到``Device is not Play Protect certified``的通知无法登入Google账号。 Waydroid第一次开机可能会收到``Device is not Play Protect certified``的通知无法登入Google账号。
用以下命令取得Waydroid的装置ID。该命令会印出一长串数字。 用以下命令取得Waydroid的装置ID。该命令会印出一长串数字。
``` ```bash
sudo waydroid shell sudo waydroid shell
ANDROID_RUNTIME_ROOT=/apex/com.android.runtime ANDROID_DATA=/data ANDROID_TZDATA_ROOT=/apex/com.android.tzdata ANDROID_I18N_ROOT=/apex/com.android.i18n sqlite3 /data/data/com.google.android.gsf/databases/gservices.db "select * from main where name = \"android_id\";" ANDROID_RUNTIME_ROOT=/apex/com.android.runtime ANDROID_DATA=/data ANDROID_TZDATA_ROOT=/apex/com.android.tzdata ANDROID_I18N_ROOT=/apex/com.android.i18n sqlite3 /data/data/com.google.android.gsf/databases/gservices.db "select * from main where name = \"android_id\";"
``` ```
开启装置注册页面登入Google账号输入装置ID注册等个半小时应该就能登入Google账号了。如果还是不行就重新启动Waydroid容器服务 开启装置注册页面登入Google账号输入装置ID注册等个半小时应该就能登入Google账号了。如果还是不行就重新启动Waydroid容器服务
``` ```bash
sudo systemctl restart waydroid-container sudo systemctl restart waydroid-container
``` ```
现在可以安装APP了Google Play和F-Droid会自动筛出適合x86架构的APP。 现在可以安装APP了Google Play和F-Droid会自动筛出適合x86架构的APP。
@@ -267,18 +267,18 @@ ReDroidRemote-Android是一款开源的容器化 Android 解决方案,
## 日常使用 ## 日常使用
- **ADB 连接与屏幕镜像** - **ADB 连接与屏幕镜像**
```bash ```bash
adb connect localhost:5555 adb connect localhost:5555
scrcpy -s localhost:5555 --audio-codec=aac scrcpy -s localhost:5555 --audio-codec=aac
``` ```
- **安装 APK** - **安装 APK**
- 使用 `adb install your_app.apk` - 使用 `adb install your_app.apk`
- 或在 Scrcpy 界面中拖拽 APK 文件进行安装 - 或在 Scrcpy 界面中拖拽 APK 文件进行安装
- **停止与重启** - **停止与重启**
```bash ```bash
sudo docker compose down sudo docker compose down
sudo docker compose up -d sudo docker compose up -d
``` ```
- **数据持久化**:所有数据保存在 `~/redroid/redroid-11-data`,可备份或运行多实例。 - **数据持久化**:所有数据保存在 `~/redroid/redroid-11-data`,可备份或运行多实例。
## 高级操作与安全建议 ## 高级操作与安全建议

View File

@@ -1,100 +0,0 @@
+++
title = "Linux之旅(一):构成与发行版"
date = 2023-07-20
[taxonomies]
tags = ["Linux"]
+++
前言 Linux 作为一款强大、灵活且免费的操作系统吸引了越来越多的用户。然而对于初学者来说Linux 可能显得有些陌生,甚至有些令人望而生畏。本文旨在为那些刚踏入 Linux 世界的新手提供一份指南帮助他们更好地了解、使用这个令人着迷的操作系统。我们将探讨Linux的基本概念解释为何选择Linux深入剖析其主要构成要素以及不同的发行版之间的差异。
<!-- more -->
## 一.什么是Linux
Linux 是一种开源的类 UNIX 操作系统内核。它由芬兰的 Linus Torvalds 于1991年开始开发是一个自由、免费的操作系统。Linux 内核是操作系统的核心,负责管理硬件资源,并提供各种系统服务。与 Windows 和 macOS 等操作系统不同Linux 的源代码对所有人开放,任何人都可以查看、修改和重新分发。这使得 Linux 具有极高的自由度和可定制性用户可以根据自己的需求和偏好来定制操作系统。Linux 广泛应用于各种设备,包括个人计算机、服务器、手机、嵌入式系统等,是一个功能强大且灵活多样的操作系统。
## 二.为什么要用Linux
1. **开源免费**Linux 是完全开源的,用户可以免费使用和修改源代码。
2. **稳定性和安全性**Linux 系统以其稳定性和安全性而闻名,适合长时间运行的服务。
3. **灵活性和可定制性**:用户可以根据需要定制 Linux 系统。
4. **广泛的软件支持**:有大量的开源软件可供选择,满足不同需求。
> Liunx可以用来玩游戏吗
实际上著名的 Steam Deck 的系统就是基于Arch linux 的。对于个人使用而言现在有不少原生支持linux 的游戏也可以使用Wine来运行Windows下的游戏。
>Linux上软件会不会太少
参见 [常用跨平台开源软件](https://blog.dich.ink/open-source-software)一文在社区的努力下如今软件生态已经非常丰富你也可以使用如Flatpak等商店安装软件或者直接使用Wine。如果有不得不在Windows下使用的软件可以装双系统。
## 三.Linux的主要构成
Linux操作系统主要由以下几个部分组成
1. **内核**操作系统的核心负责管理系统资源。如Zen内核LTS内核等。
2. **Shell**命令行界面用户通过它与系统交互如Bash,Zsh等。
3. **图形用户界面GUI**提供图形化操作界面如GNOME、KDE、XFCE等。
4. **文件系统**如ext4、Btrfs等用于组织和管理磁盘上的文件。
5. **系统库**:为应用程序提供运行时支持。
6. **应用程序**用户可以直接使用的软件如文本编辑器、网页浏览器等。其中也有著名的GNU工具如Vim,GCC等。
## 四.选择Linux发行版
从上文可以发现选择Linux发行版实际上是在选择 **内核/包管理器/图形界面** 等组件的排列组合。其中最主要的因素是包管理器。
Linux有许多不同的发行版但大致可以分为几个系
**Debian系**
DebianDebian以稳定性安全性和轻量级著称适合用于服务器和桌面环境。我们常说的Ubuntu就是基于Debian的发行版注重用户友好性和易用性。它提供了多种桌面环境选择以及许多现成的软件包。
```
APTAdvanced Package Tool是Debian系发行版的主要包管理器。它使用命令行工具如apt-get、aptitude等来管理软件包。
```
**Red Hat系**
- Red Hat Enterprise LinuxRHELRHEL是一款商业发行版专注于企业级应用和支持。它提供了长期支持和专业技术支持服务适用于企业级服务器和工作站。
- CentOSCentOS是基于RHEL源代码编译而成的免费发行版与RHEL兼容并提供类似的功能和性能。它也提供了长期支持版本和稳定性较高的特点。
- FedoraFedora是由Red Hat支持的社区驱动的发行版注重提供最新的软件特性和技术。它适用于开发者和技术爱好者提供了稳定的发布周期和丰富的软件包。
```
YUMYellowdog Updater, Modified是Red Hat系发行版的主要包管理器。最近的版本也开始采用DNFDandified YUM
```
**Arch系**
Arch LinuxArch Linux是一个简洁、轻量级且灵活的发行版注重简洁性和滚动更新。它采用“滚动发布”的方式用户可以通过自定义安装来构建自己的系统适合有一定Linux经验的用户。
```
PacmanPackage Manager是Arch Linux的主要包管理器。它使用简洁的命令来管理软件包如pacman -S安装软件包、pacman -Syu更新系统等。
```
**Gentoo系**
GentooGentoo是一个源码驱动的发行版用户可以通过源代码自定义编译软件包以满足自己的需求。它注重性能和灵活性适合高级用户和技术爱好者。
```
Portage是Gentoo的包管理器它是一个源代码驱动的包管理器允许用户从源代码构建和安装软件包。
```
除了以上列举的包管理器外还有其他一些较为特殊的包管理器如Slackware系的pkgtool、SUSE系的zypper等。
对于个人使用而言我个人建议新手使用Ubuntu,有比较易用的界面和完善的资料参考如果你是一个系统极客可以使用Arch linux 或者 NixOS。
## 五.个人日常使用需要注意什么?
1. **学习命令行**命令行是Linux的强大工具学习基本命令可以提高效率。
2. **选择合适的发行版**:根据个人需求和技术水平选择适合的发行版。
3. **系统备份**:定期备份重要数据,以防意外丢失。
4. **软件管理**:了解如何安装、更新和卸载软件。
5. **安全设置**:设置强密码,定期更新系统以修复安全漏洞。
6. **社区参与**Linux社区非常活跃遇到问题可以寻求社区帮助。
7. **硬件兼容性**检查你的硬件是否与选择的Linux发行版兼容。
8. **驱动程序**:确保你的硬件设备有可用的驱动程序,以避免兼容性问题。

View File

@@ -1,127 +0,0 @@
+++
title = "Linux之旅(二):FHS与目录结构"
date = 2023-07-21
[taxonomies]
tags = ["Linux"]
+++
前言 在Linux世界中Filesystem Hierarchy StandardFHS是一座引导我们进入系统核心的桥梁它定义了Linux系统中目录结构的规范与作用为我们提供了一张清晰的地图指引我们轻松管理和理解系统。本文将深入探讨FHS规范与Linux系统目录结构解释各个目录的用途与功能帮助我们更好地理解和利用Linux系统。
<!-- more -->
## 一.认识FHS
FHS是Filesystem Hierarchy Standard文件系统层次结构标准的缩写。它是一个定义了Linux系统中目录结构和各个目录作用的规范。FHS规定了Linux系统中各个目录的用途和预期内容以便确保不同Linux发行版之间的兼容性并使得用户能够更轻松地理解和管理系统。
FHS规范最初由Linux基金会Linux Foundation和自由软件基金会Free Software Foundation共同发布并经过多次修订和更新。该规范不仅对Linux系统本身有用也适用于其他类UNIX操作系统。
FHS规范定义了一些基本的目录如/bin、/boot、/dev等并规定了每个目录的作用和预期内容。这样做有助于系统管理员和开发人员更好地组织和管理文件系统并使得用户能够更轻松地找到所需的文件和数据。
## 二.常见目录结构
在刚刚由Windows切换至Linux时往往会对目录感到不解不知道安装的软件放在哪个目录之下
以下是对Linux系统目录结构的详细说明
- **/(根目录)**
根目录是整个文件系统的起点包含了系统中所有其他目录和文件。在Linux系统中根目录被表示为/。
- **/bin二进制文件**
/bin目录存放着一些最基本的系统命令如ls、cp、mv等这些命令通常被所有用户使用。
- **/boot引导文件**
/boot目录存放着启动Linux系统所需的引导文件如内核映像vmlinuz、引导加载程序boot loader配置文件如GRUB配置文件等。
- **/dev设备文件**
/dev目录包含了系统中所有设备的特殊文件如硬盘、键盘、鼠标等。在Linux中一切皆文件设备被抽象为文件通过/dev目录中的特殊文件来表示。
- **/etc配置文件**
/etc目录包含了系统的配置文件如网络配置、用户账户信息、服务配置等。这些配置文件通常以纯文本的形式存在可以由系统管理员进行编辑和修改。
- **/home用户主目录**
/home目录是系统中所有普通用户的主目录所在地每个用户通常都有一个对应的子目录用于存放用户的个人文件和数据。
- **/lib库文件**
/lib目录存放着系统所需的共享库文件这些库文件包含了一些程序运行所需的函数和数据为程序提供了基本的支持。
- **/mnt挂载点**
/mnt目录用于挂载临时文件系统如光盘、移动硬盘等。系统管理员可以将其他设备或文件系统挂载到/mnt目录下以便访问其中的文件和数据。
- **/opt可选软件包**
/opt目录用于存放一些可选的软件包和应用程序这些软件包通常不属于Linux发行版的默认安装范围但可以被用户自行安装和管理。
- **/proc进程信息**
/proc目录是一个虚拟的文件系统包含了系统运行时的各种进程信息和系统状态信息。用户可以通过读取/proc目录中的特殊文件来获取系统信息。
- **/sbin系统命令**
/sbin目录存放着一些系统管理和维护命令这些命令通常只能由超级用户root执行用于系统的管理和维护。
- **/srv服务数据**
/srv目录用于存放一些服务相关的数据文件如Web服务器的网站数据、FTP服务器的文件等。每个服务通常都会有一个对应的子目录。
- **/tmp临时文件**
/tmp目录用于存放临时文件和临时数据这些文件通常在系统重启时会被删除。任何用户都可以在/tmp目录下创建临时文件。
- **/usr用户程序**
/usr目录包含了系统中大部分用户可用的程序和文件如用户应用程序、共享库文件、文档等。它通常是系统的二级目录类似于Windows系统中的Program Files目录。
- **/var可变数据**
/var目录用于存放系统运行时产生的可变数据如日志文件、邮件、缓存文件等。这些数据通常会随着系统的运行而不断变化。
> 注意NixOS不符合FHS标准
## 三.分区大小
对各个分区进行容量分配时,需要根据系统的实际需求和用途来进行规划。一般而言在安装引导时可以选择让程序自动分区。
- **根目录(/**根目录是整个文件系统的起点通常会分配较大的空间以确保系统和应用程序有足够的空间运行。建议分配至少20GB的空间给根目录。
- **/home目录**/home目录用于存放用户的个人文件和数据因此需要根据用户数量和存储需求来进行容量分配。一般情况下建议为每个用户分配至少10GB的空间。
- **/var目录**/var目录用于存放系统运行时产生的可变数据如日志文件、邮件、缓存文件等。根据系统的运行情况和日志文件的大小来进行容量分配一般建议分配10-20GB的空间。
- **/tmp目录**/tmp目录用于存放临时文件和临时数据通常不需要分配太大的空间。建议分配至少1-2GB的空间给/tmp目录。
- **/boot目录**/boot目录存放着启动Linux系统所需的引导文件通常只需要分配几百MB的空间即可。
- **Swap分区**Swap分区是一种虚拟内存用于暂时存放不常用的内存数据。当系统内存不足时Linux会将一部分内存数据移动到Swap分区中以避免内存耗尽导致系统崩溃。Swap分区的大小通常与系统内存大小有关一般建议为系统内存的1.5-2倍。例如如果系统内存为4GB则建议设置Swap分区大小为6-8GB。
> 这里特别讲讲Swap分区
Swap分区可以通过以下几种方式实现
- 交换分区Swap Partition创建一个独立的交换分区通常是一个专门的分区用于存放Swap数据。
- 交换文件Swap File创建一个专门的文件用于存放Swap数据而不是创建独立的分区。这种方式更加灵活可以根据需要动态调整Swap的大小。
- Swap大小Swap的大小应该根据系统的内存大小和使用情况来确定一般建议为系统内存的1.5-2倍。
- Swap分区/文件的位置Swap分区/文件应该位于较快的存储介质上,以确保交换操作的效率。
Swap的优先级如果同时存在多个Swap分区/文件可以通过设置优先级来指定系统使用的Swap空间。
## 四.将 `home` 目录下的文件夹改为英文
可以使用 `xdg-user-dirs-update` 工具来更新用户目录为英文版本。你可以按照以下步骤进行:
1. **编辑用户目录配置文件**
打开或创建 `~/.config/user-dirs.dirs` 文件,用文本编辑器编辑它:
```bash
nano ~/.config/user-dirs.dirs
```
2. **将目录名称更改为英文**
在该文件中,你可以看到类似以下的条目:
```bash
XDG_DESKTOP_DIR="$HOME/桌面"
XDG_DOWNLOAD_DIR="$HOME/下载"
XDG_DOCUMENTS_DIR="$HOME/文档"
XDG_MUSIC_DIR="$HOME/音乐"
XDG_PICTURES_DIR="$HOME/图片"
XDG_VIDEOS_DIR="$HOME/视频"
```
将这些路径改为英文,例如:
```bash
XDG_DESKTOP_DIR="$HOME/Desktop"
XDG_DOWNLOAD_DIR="$HOME/Downloads"
XDG_DOCUMENTS_DIR="$HOME/Documents"
XDG_MUSIC_DIR="$HOME/Music"
XDG_PICTURES_DIR="$HOME/Pictures"
XDG_VIDEOS_DIR="$HOME/Videos"
```
3. **重命名现有的文件夹**
手动将 `home` 目录下的文件夹重命名为英文版本:
```bash
mv ~/桌面 ~/Desktop
mv ~/下载 ~/Downloads
mv ~/文档 ~/Documents
mv ~/音乐 ~/Music
mv ~/图片 ~/Pictures
mv ~/视频 ~/Videos
```
4. **应用更改**
完成以上操作后,运行以下命令应用新配置:
```bash
xdg-user-dirs-update
```
这样,`home` 目录下的文件夹就会改为英文,并且系统也会正确识别这些新的目录路径。

View File

@@ -1,176 +0,0 @@
+++
title = "Linux之旅(三):内核/shell/包管理/文件系统/桌面环境"
date = 2023-07-22
[taxonomies]
tags = ["Linux"]
+++
前言 在Linux世界中内核/shell/包管理/文件系统构成了Linux系统的核心它们相互配合共同构建了一个强大而稳定的操作环境。本文将深入探讨这些关键组成部分解释它们的作用和原理帮助读者更好地理解Linux系统的运作机制。
<!-- more -->
## **一.Linux内核**
有许多不同的版本每个版本都包含了一系列的功能改进、bug修复和性能优化。在Linux发行版中通常会使用某个特定版本的Linux内核或者在需要时进行升级。以下是一些常见的Linux内核及其主要特点
**Zen内核**
- Zen内核是Linux内核的一个变体旨在提供更好的性能和响应性。它通常包含了一些特定的调度程序和调优参数以提高系统的负载均衡和响应速度。Zen内核也可能包含一些来自其他内核变体的功能和补丁以进一步优化性能。
**LTS内核**
- LTSLong-Term Support内核是一种长期支持的内核版本它会获得更长时间的更新和维护。LTS内核通常会选择一些相对稳定和经过充分测试的功能并对其进行长期支持以确保系统的稳定性和安全性。
**Real-Time内核**
- Real-Time内核是一种专门针对实时应用场景进行优化的内核变体。它通常包含了一些实时调度算法和机制以确保系统能够及时响应各种事件并满足实时性要求。Real-Time内核适用于一些对实时性要求较高的应用如工业控制、机器人控制等领域。
**Hardened内核**
- Hardened内核是一种针对安全性进行优化的内核变体。它通常包含了一些安全增强功能和补丁以提高系统的安全性和抵御攻击的能力。Hardened内核适用于一些对安全性要求较高的应用如服务器、云计算等场景。
**XanMod内核**
- XanMod内核是一个基于Linux内核的自定义内核旨在提供更好的响应性和性能。它包含了一些针对桌面和工作站系统优化的功能和补丁如MuQSS调度器、BFQ I/O调度器等以提高系统的响应速度和性能稳定性。XanMod内核还支持一些实时性应用如音视频处理等适用于对系统响应速度要求较高的用户。
**CachyOS内核**
- CachyOS内核是一个专门针对缓存优化的Linux内核变体。它包含了一些针对缓存系统优化的功能和调整以提高系统的缓存性能和数据访问速度。CachyOS内核通常适用于需要高性能缓存的应用场景如数据库服务器、Web服务器等。
这些内核变体针对不同的需求和使用场景进行了优化可以根据具体的应用需求来选择合适的内核版本。例如如果您需要更好的性能和响应性可以选择Zen内核如果您需要长期支持和稳定性可以选择LTS内核如果您需要实时性能可以选择Real-Time内核如果您需要更高的安全性可以选择Hardened内核。
## **二.Linux Shell**
在Linux系统中有许多不同的Shell命令行解释器每种Shell都有自己的特点和用途。以下是一些常见的Linux Shell及其主要特点
**BashBourne Again Shell**
- Bash是Linux系统中最常用的Shell之一也是默认的命令行解释器。它是Bourne Shell的增强版提供了丰富的功能和扩展性包括命令历史、命令补全、作业控制等。Bash具有良好的兼容性和易用性适用于日常的系统管理和脚本编程。
**ZshZ Shell**
- Zsh是一种功能强大的Shell提供了丰富的功能和扩展性如更强大的命令补全、自动纠正拼写错误、主题和插件系统等。Zsh具有良好的可定制性和用户体验适用于高级用户和程序员。
**FishFriendly Interactive Shell**
- Fish是一种用户友好的交互式Shell提供了直观的命令提示和自动补全功能以及丰富的语法高亮和命令提示信息。Fish具有良好的用户体验和易用性适用于初学者和普通用户。
**DashDebian Almquist Shell**
- Dash是一种轻量级的Shell专门设计用于系统启动过程和脚本执行。Dash具有较高的执行速度和较低的内存占用适用于系统启动脚本和简单的脚本编程。
Bash是最常用的Shell之一具有良好的兼容性和功能性Zsh提供了更多的高级特性和定制选项适用于高级用户和程序员Fish具有友好的交互式体验和直观的用户界面适用于初学者和普通用户Dash则是一个轻量级的Shell专门用于系统启动过程和简单的脚本编程。用户可以根据自己的需求和偏好选择合适的Shell。
## **三.Linux包管理器**
在Linux系统中有几种常见的包管理器它们各自管理着不同的发行版具有不同的特点和用途。以下是一些常见的Linux包管理器及其主要特点
**APTAdvanced Package Tool**
- APT是Debian系如Debian、Ubuntu中最常用的包管理器之一。它使用基于命令行的工具`apt-get``apt-cache`等来安装、升级和删除软件包。APT还支持依赖关系的自动解决使得软件包的安装和管理变得更加方便。
**YUMYellowdog Updater, Modified**
- YUM是Red Hat系如CentOS、Fedora中常用的包管理器之一。它使用基于命令行的工具`yum`来管理软件包。YUM具有良好的依赖关系解决能力和事务处理功能使得系统升级和软件包管理变得更加简单和可靠。
**DNFDandified YUM**
- DNF是YUM的下一代版本逐渐取代了YUM在Fedora和RHEL系列中的地位。DNF具有更快的包查询和事务处理能力以及更友好的用户界面。它是未来主流的包管理器之一。
**PacmanPackage Manager**
- Pacman是Arch Linux中常用的包管理器也被一些其他发行版如Manjaro采用。Pacman使用简洁的命令`pacman -S`安装软件包、`pacman -Syu`更新系统等来管理软件包。Pacman具有简单、直观的界面和快速的操作速度适用于对系统有一定了解的用户。
**zypper**
- zypper是openSUSE中常用的包管理器它使用基于命令行的工具`zypper install``zypper update`等来管理软件包。zypper具有良好的依赖关系解决能力和事务处理功能使得系统升级和软件包管理变得更加简单和可靠。
**dpkg**
- dpkg是Debian系如Debian、Ubuntu中的低级别软件包管理工具用于直接管理软件包的安装、升级和删除。它提供了一系列的命令`dpkg -i`安装软件包、`dpkg -r`删除软件包等。
**RPMRPM Package Manager**
- RPM是Red Hat系如CentOS、Fedora中的低级别软件包管理工具用于直接管理软件包的安装、升级和删除。它提供了一系列的命令`rpm -i`安装软件包、`rpm -e`删除软件包等。
**Portage**
- Portage是Gentoo Linux中的包管理器它使用源代码进行软件包的安装和管理。Portage具有高度定制化和灵活性允许用户根据需要自定义软件包的编译参数和依赖关系。
**Snap**
- Snap是一种跨发行版的软件包格式和包管理器允许用户在不同的Linux发行版上安装和管理软件包。Snap具有自包含性和隔离性使得软件包的安装和升级变得更加简单和安全。
**Flatpak**
- Flatpak是另一种跨发行版的软件包格式和包管理器类似于Snap允许用户在不同的Linux发行版上安装和管理软件包。Flatpak提供了一种统一的应用分发和运行环境使得软件包的安装和升级更加简单和可靠。
## **四.Linux文件系统**
Linux系统支持多种文件系统每种文件系统都有自己的特点和优势适用于不同的应用场景和需求。以下是一些常见的Linux文件系统及其主要特点
**ext4**
- ext4是Linux系统中最常用的文件系统之一它是ext文件系统的后续版本提供了更好的性能和扩展性。ext4支持更大的文件和分区大小更快的文件系统检查和恢复速度以及更高的性能和稳定性。
**Btrfs**
- Btrfs是一种先进的文件系统具有许多先进的功能和特性如快照、数据校验、数据压缩等。Btrfs支持在线扩展和收缩分区大小以及动态添加和删除磁盘适用于需要高级特性和灵活性的应用场景。此外Btrfs对快照功能支持较好。
> 快照功能是一种文件系统的特性,它允许用户在特定时间点对文件系统的状态进行快照或备份,并且可以在需要时一键恢复到该时间点的状态。
快照允许用户轻松地创建文件系统的历史版本,并在需要时回滚到特定的版本;快照允许用户在文件系统中进行实验和测试,并在测试失败或不需要时轻松地回滚到初始状态,以避免对系统造成影响。在升级或安装过程中出现问题时快速恢复到原始状态
**XFS**
- XFS是一种高性能的日志文件系统适用于大型文件和高吞吐量的应用场景。XFS支持大容量的文件和分区具有较低的碎片化和较高的并发性能适用于大规模存储和数据分析等应用。
**ZFS**
- ZFS是一种先进的文件系统具有强大的数据管理和保护功能如快照、数据校验、数据压缩等。ZFS支持软件RAID和存储池pool以及动态添加和删除磁盘适用于数据中心和大规模存储等应用场景。
**F2FS**
- F2FS是一种针对闪存存储设备进行优化的文件系统具有高性能和高可靠性。F2FS支持闪存特性如块擦除计数block erase count和块生命周期管理block lifetime management适用于固态硬盘SSD和闪存卡等闪存设备。
## **五.Linux桌面环境**
Linux系统有多种不同的桌面环境每种环境都有其独特的特点、风格和用户体验。以下是一些常见的Linux桌面环境及其主要特点
**GNOME**
- GNOME是一个功能强大、现代化的桌面环境具有直观的用户界面和丰富的功能。它采用了扁平化的设计风格和简洁的用户界面提供了丰富的应用程序和插件适用于普通用户和开发人员。
**KDE Plasma**
- KDE Plasma是一个灵活、可定制的桌面环境提供了丰富的特性和选项如桌面特效、窗口管理器、小部件等。它采用了现代化的设计风格和强大的桌面管理功能适用于高级用户和技术爱好者。
**XFCE**
- XFCE是一个轻量级、快速的桌面环境具有简洁的用户界面和低资源消耗。它采用了传统的桌面布局和简约的设计风格提供了基本的桌面管理功能和应用程序适用于老旧计算机和资源有限的环境。
**LXQt**
- LXQt是一个轻量级、快速的桌面环境是LXDE和Razor-qt的合并项目。它采用了现代化的设计风格和简洁的用户界面提供了丰富的特性和可定制选项适用于资源有限的环境和嵌入式系统。
**Cinnamon**
- Cinnamon是一个基于GNOME的桌面环境具有类似于传统Windows桌面的用户界面和功能。它采用了传统的桌面布局和直观的用户体验提供了丰富的特性和可定制选项适用于对传统桌面风格有需求的用户。
GNOME和KDE Plasma提供了丰富的特性和高度定制化选项适用于高级用户和开发人员XFCE和LXQt则提供了轻量级和快速的用户体验适用于资源有限的环境Cinnamon则提供了类似于传统Windows桌面的用户界面和功能适用于对传统桌面风格有需求的用户。可以根据自己的需求和偏好选择合适的桌面环境。
> 当然,也可以使用轻量级的窗口管理器。
窗口管理器是Linux系统中控制窗口布局、管理窗口行为的关键组件。它们决定了窗口的外观和行为方式以及如何管理和排列窗口。以下是一些常见的窗口管理器及其主要特点
**X Window Manager (XWM)**
- X Window Manager是最基本的窗口管理器用于管理X Window系统中的窗口。它提供了最基本的窗口布局和管理功能如窗口移动、调整大小、最小化等。XWM本身并不提供任何外观效果但可以与其他工具配合使用来实现更丰富的窗口管理和外观特性。
**Openbox**
- Openbox是一个轻量级的窗口管理器具有简洁的用户界面和低资源消耗。它提供了丰富的自定义选项和扩展功能如虚拟桌面、窗口装饰、键盘快捷键等。Openbox适用于资源有限的环境和对简洁风格有需求的用户。
**i3**
- i3是一个动态平铺窗口管理器采用了平铺式布局将窗口按照一定规则自动排列在屏幕上。它提供了快速的窗口切换和管理功能支持键盘操作和自动布局调整适用于需要高效多任务处理的用户。
**Awesome**
- Awesome是一个高度可定制的动态平铺窗口管理器具有丰富的特性和扩展功能。它采用Lua脚本语言进行配置和定制支持强大的自定义选项和扩展功能适用于高级用户和技术爱好者。
**KWin**
- KWin是KDE桌面环境中的默认窗口管理器具有丰富的特性和功能。它提供了多种窗口布局和管理选项支持虚拟桌面、窗口效果、窗口组织等功能适用于需要丰富特性和高度定制化的用户。
这些窗口管理器之间的主要异同在于窗口布局、外观效果、自定义选项和功能特性等方面。Openbox和i3提供了简洁的用户界面和低资源消耗适用于资源有限的环境Awesome和KWin则提供了丰富的特性和扩展功能适用于高级用户和技术爱好者。用户可以根据自己的需求和偏好选择合适的窗口管理器。
> Wayland和X11
Wayland和X11都是用于Linux系统的图形显示协议它们负责管理图形用户界面GUI的显示和交互。下面是它们的简要介绍以及异同点
- **X11X Window System**
X11是一个由MIT开发的图形显示协议长期以来一直是Linux系统中最常用的图形显示系统。它采用客户端-服务器模型图形应用程序客户端通过X服务器与显示设备服务器进行通信。X11提供了丰富的图形特性和功能如窗口管理、窗口装饰、多任务处理等。
- **Wayland**
Wayland是一个由Red Hat主导开发的新一代图形显示协议旨在取代X11成为Linux系统的标准图形显示系统。Wayland采用了现代化的设计理念和架构取消了X11中复杂的客户端-服务器模型将图形显示功能直接集成到操作系统中。Wayland具有更低的延迟和更高的性能支持更好的硬件加速和多触摸设备以及更简洁的代码结构。
**异同点**
- **架构差异**X11采用了客户端-服务器模型图形应用程序通过X服务器与显示设备进行通信而Wayland取消了这种模型将图形显示功能直接集成到操作系统中减少了中间层的复杂性。
- **性能差异**Wayland具有更低的延迟和更高的性能支持更好的硬件加速和多触摸设备使得图形显示更加流畅和响应。
- **功能差异**X11提供了丰富的图形特性和功能如窗口管理、窗口装饰、多任务处理等Wayland在功能上相对较少但提供了更简洁的代码结构和更好的性能。
- **兼容性差异**X11在Linux系统中被广泛使用拥有大量的应用程序和工具的支持而Wayland在兼容性方面仍在发展中尚未完全取代X11成为Linux系统的标准图形显示系统。
总的来说Wayland是未来Linux系统中的趋势具有更好的性能和更简洁的架构但在兼容性和功能丰富度上仍有待改进。X11则是当前仍然广泛使用的图形显示系统拥有丰富的生态和大量的应用程序支持。
## **六.后记**
个人使用推荐Zen+Zsh+Pacman+Btrfs+Hyprland,并使用 paru xxx 来搜索软件包使用paru -S xxx 安装软件。

View File

@@ -1,82 +0,0 @@
+++
title = "Linux之旅(四):TerminalConsole and Shell"
date = 2023-07-23
[taxonomies]
tags = ["Linux"]
+++
前言 在linux的学习过程中我们常常遇到诸如 TerminalConsolebash,zsh,shell,tty 等概念,这些概念常常被混淆,似乎都和命令行相关。本文从历史角度出发介绍它们的前世今生。
<!-- more -->
## 终端和控制台
终端,英文叫做 terminal ,通常简称为 term控制台英文叫做 console。
要明白这两者的关系,还得从最初的计算机说起。当时的计算机价格昂贵,一台计算机一般是由多个人同时使用的。在这种情况下一台计算机需要连接上许多套键盘和显示器来供多个人使用。在以前专门有这种可以连上一台电脑的设备,只有显示器和键盘,还有简单的处理电路,本身不具有处理计算机信息的能力,他是负责连接到一台正常的计算机上(通常是通过串口) ,然后登陆计算机,并对该计算机进行操作。当然,那时候的计算机操作系统都是多任务多用户的操作系统。这样一台只有显示器和键盘能够通过串口连接到计算机的设备就叫做终端。
而控制台又是什么回事呢?其概念来自于管风琴的控制台。顾名思义,控制台就是一个直接控制设备的台面(一个面板,上面有很多控制按钮)。 在计算机里,把那套直接连接在电脑上的键盘和显示器就叫做控制台。
终端是通过串口连接上的,不是计算机本身就有的设备,而控制台是计算机本身就有的设备,一个计算机只有一个控制台。计算机启动的时候,所有的信息都会显示到控制台上,而不会显示到终端上。也就是说,控制台是计算机的基本设备,而终端是附加设备。 当然,由于控制台也有终端一样的功能,控制台有时候也被模糊的统称为终端。
以上是控制台和终端的历史遗留区别。现在由于计算机硬件越来越便宜,终端和控制台的概念也慢慢演化了。终端和控制台由硬件的概念,演化成了软件的概念。
  
## 内核与外壳
内核( Kernel )和外壳( Shell )是 linux 的两个主要部分。Kernel 是操作系统的核心,系统的文件管理、进程管理、内存管理、设备管理这些功能,都是由 Kernel 提供的。
用户和操作系统内核交流需要一个工具,那么这个工具就是 Shell。
什么是 Shell在 Linux 中,最常见的 Shell 形式有命令行界面命令行界面和图形界面两种。并不是打开的那个终端窗口就是 Shell如Alacritty、Gnome-Terminal、xterm 、kitty等程序它们不是 Shell而它们里面运行的 Bash、Zsh、fish 等命令行解释器程序,才是 Shell。
那 Alacritty、Gnome-Terminal、xtermxterm 是什么?
它们是终端模拟器。
前面提到过,在远古时代,终端和控制台都是有实体的。控制台直接和计算机在一起,你可以通过控制台控制计算机。终端通过数据线和计算机连接,终端也提供一个键盘和一个屏幕,你可以通过键盘向计算机下达指令,然后通过屏幕观察输出。
但是现在的计算机组成和以前不一样了,一般一台电脑都是自带键盘和屏幕,很少再外接终端设备。
所以 Linux 提供了另外一个更高级的功能,那就是虚拟终端。那就是在一台电脑上,通过软件的模拟,好像有好几个终端连接在这台计算机上一样。
现在说的终端,比如 linux 中的虚拟终端,都是软件的概念。虚拟终端称之为 ttytty 是电传打字机电传打字机 Teletypewriter 的缩写在带显示屏的视频终端出现之前tty是最流行的终端设备。每一个 tty 都有一个编号,在/dev目录下有相应的设备文件。其中/dev/tty1到/dev/tty7可以通过 Ctrl+Alt+F1 到 Ctrl+Alt+F7 进行切换,也可以通过 chvt 命令进行切换,就好比是以前多人公用的计算机中的六个终端设备,这就是为什么这个叫“虚拟终端”的原因。
## 时代变迁
随着时间的推移,我们看到了从硬件到软件的转变,以及从多用户共享到个人使用的转变。这种变迁不仅影响了终端和控制台的概念,也塑造了我们对计算机的理解和期待。

View File

@@ -1,130 +0,0 @@
+++
title = "Linux之旅(五):BIOS-UEFI-MBR-GPT-GRUB"
date = 2023-07-24
[taxonomies]
tags = ["Linux"]
+++
前言 在计算机领域系统引导和磁盘分区是至关重要的。本文将介绍BIOS与UEFIMBR与GPT以及它们之间的异同点。此外我们还会讨论与这些概念密切相关的引导加载程序——GRUB。
<!-- more -->
## BIOS
> `BIOSBasic Input Output System`,直译成中文名称就是"`基本输入输出系统`"。它是一组固化到主板中一个ROM芯片上的程序它可以从CMOS中读写系统设置的具体信息。此程序保存着计算机最重要的基本输入输出程序、开机后的自检程序和系统自启动程序。简单来说BIOS只认识设备不认识分区、不认识文件。
## UEFI
> UEFI统一可扩展固件接口是一个公开的规范定义了操作系统和平台固件之间的软件接口。UEFI 是传统 PC BIOS 的继承者是取代传统BIOS的相比传统BIOS来说它更易实现容错和纠错特性也更强。 它将引导数据存储在 .efi 文件中,而不是固件中。你经常会在新款的主板中找到 UEFI 启动模式。UEFI 启动模式包含一个特殊的 EFI 分区,用于存储 .efi 文件并用于引导过程和引导加载程序。
> UEFI使用GPT的分区引导方案支持更大的硬盘。由于省去了BIOS自检的过程所以启动速度更快。传统BIOS主要支持MBR引导UEFI则是取代传统BIOS它加入了对新硬件的支持其中就有支持2TB以上硬盘。
## MBR
> 全新硬盘在使用之前必须进行分区格式化,硬盘分区初始化的格式主要有两种,分别为`MBR`格式和`GPT`格式。MBR是传统的分区表类型当一台电脑启动时它会先启动主板上的BIOS系统BIOS再从硬盘上读取MBR主引导记录硬盘上的MBR运行后就会启动操作系统但最大的缺点则是不支持容量大于2T的硬盘。
## GPT
> 而GPT是另一种更先进的磁盘系统分区方式它的出现弥补了MBR这个缺点最大支持`18EB`的硬盘,是基于`UEFI`使用的磁盘分区架构。目前所有Windows系统均支持`MBR`,而`GPT`只有`64`位系统才能支持。`BIOS只支持MBR引导系统而GPT仅可用UEFI引导系统`。正因为这样现在主板大多采用BIOS集成UEFI或UEFI集成BIOS以此达到同时兼容MBR和GPT引导系统的目的。
## GRUB
> GRUBGRand unified bootloader,多操作系统启动程序。它允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系统。
>
> GRUB可用于选择操作系统分区上的不同内核也可用于向这些内核传递启动参数。`它是一个多重操作系统启动管理器,用来引导不同系统`如Windows、Linux。Linux常见的引导程序包括LILO、GRUB、GRUB2。
## Legacy
> 如果你遇到过刚制作的U盘启动盘无法启动或者新买的固态硬盘做好系统后无法启动那么大概率的问题就出现在BIOS的引导模式的选择上是UEFI还是Legacy。legacy启动模式是指BIOS 固件用来初始化硬件设备的引导过程Legacy启动模式包含一系列已安装的设备这些设备在引导过程中计算机执行 POST (开机自检)测试时会被初始化。传统引导将检查所有连接设备的主引导记录 (MBR),通常位于磁盘的第一个扇区。
当它在设备中找不到引导加载程序时Legacy会切换到列表中的下一个设备并不断重复此过程直到找到引导加载程序否则返回错误。
## 表格
### BIOS/UEFI
| BIOS | UEFI |
| ---------------------------------- | --------------------------------------------------------------- |
| 用于初始化计算机硬件并引导操作系统 | 在计算机启动时运行 |
| 具有较少功能和灵活性 | 具有更多功能和灵活性 |
| | 支持更大的硬盘容量、更快的启动速度、更好的安全性和更多的扩展性v |
| | 通常具有图形用户界面GUI |
### MBR/GPT
| MBR | GPT |
| ----------------------------------------- | ---------------------------------------------------------------------------------- |
| 用于分区磁盘并存储分区布局信息 | 用于分区磁盘并存储分区布局信息 |
| 支持最多4个主分区或3个主分区加1个扩展分区 | 支持最多4个主分区或3个主分区加1个扩展分区支持最多4个主分区或3个主分区加1个扩展分区 |
| | 具有更好的数据完整性和可靠性,使用校验和检测数据损坏 |
| | UEFI需要GPT格式的磁盘才能引导 |
### UEFI/Legacy
| UEFI 引导模式 | Legacy引导模式 |
| ------------------------------------------------------------------------------------------------ | -------------------------------------------------------------- |
| UEFI 提供了更好的用户界面 | Legacy引导模式是传统的且非常基本的 |
| 使用 GPT 分区方案 | 使用 MBR 分区方案 |
| UEFI 提供更快的启动时间 | 相比UEFI它的速度较慢 |
| 由于 UEFI 使用 GPT 分区方案,因此它可以支持多达 9 zB 的存储设备 | Legacy使用的 MBR 分区方案仅支持最多 2 TB 存储设备 |
| UEFI 以 32 位和 64 位运行,支持鼠标和触摸板 | Legacy在仅支持键盘仅 16 位模式下运行 |
| 它允许安全启动防止加载未经授权的应用程序它还可能阻碍双启动因为它将操作系统OS视为应用程序 | 它不提供允许加载未经授权的应用程序的安全启动方法,未限制双启动 |
| 它具有更简单的更新过程 | 与UEFI相比它更复杂 |
## 组合
- **BIOS+MBR**
这是最传统的,系统都会支持;唯一的缺点就是`不支持容量大于2T的硬盘`
- **BIOS+GPT**
BIOS是可以使用GPT分区表的硬盘来作为数据盘的但不能引导系统若电脑同时带有容量小于2T的硬盘和容量大于2T的硬盘`小于2T的可以用MBR分区表安装系统而大于2T的可以使用GPT分区表来存放资料`。但系统须使用64位系统。
- **UEFI+MBR**
可以把UEFI设置成`Legacy模式`传统模式让其支持传统MBR启动效果同`BIOS+MBR`也可以建立FAT分区放置UEFI启动文件来可应用在U盘和移动硬盘上实现双模式启动。
- **UEFI+GPT**
如果要把大于2T的硬盘作为系统盘来安装系统的话就必须`UEFI+GPT`。而且系统须使用64位系统否则无法引导。但系统又不是传统在PE下安装后就能直接使用的引导还得经过处理才行。
## 系统的启动过程
从按下计算机的开机按钮到用户开始使用计算机,涉及了多个步骤和组件,让我们一起详细了解整个过程:
**1. 电源启动**
- 用户按下计算机的开机按钮电源开始供电计算机硬件开始初始化。电源将电流传递到主板上的BIOS/UEFI芯片。
**2. BIOS/UEFI启动**
- BIOS/UEFI芯片接收到电源信号后开始执行初始化过程。它首先进行自检POST检测主板、CPU、内存等硬件设备的工作状态并在显示屏上输出相关信息。
- BIOS/UEFI根据配置的启动顺序通常为硬盘、光盘、USB等搜索启动设备并加载位于启动设备上的引导加载程序。
**3. 引导加载程序加载**
- 引导加载程序如GRUB被加载到内存中它负责后续的操作系统加载过程。GRUB通常会显示启动菜单列出可用的操作系统选项。
- 用户可以在GRUB菜单中选择要启动的操作系统或者等待默认选项启动。
**4. 操作系统加载**
- 一旦选择了启动选项引导加载程序会加载操作系统的内核和初始化RAM磁盘initramfs/initrd
- 内核加载完成后,操作系统开始启动初始化过程,包括加载系统服务、挂载文件系统、启动用户界面等。
**5. 用户登录**
- 操作系统初始化完成后,显示登录界面(如果配置了图形用户界面),用户输入用户名和密码登录系统。
- 如果登录成功,操作系统加载用户的桌面环境或命令行界面,用户开始使用计算机。
## 各种引导加载程序
| 特性 | GRUBGRand Unified Bootloader | LILOLinux Loader | systemd-boot前身为 gummiboot | rEFIndUEFI 引导管理器) |
|--------------------|----------------------------------|-----------------------------------|----------------------------------|------------------------------------|
| **支持的系统类型** | BIOS 和 UEFI | 仅支持 BIOS 模式 | 仅支持 UEFI | 仅支持 UEFI |
| **多系统引导支持** | ✅ 强大支持 | ❌ 不支持多系统引导 | ✅ 支持(需手动配置) | ✅ 自动检测操作系统 |
| **图形界面支持** | ✅ 支持(可自定义主题) | ❌ 不支持 | ❌ 不支持 | ✅ 支持(可自定义主题) |
| **配置方式** | 配置文件(复杂) | 配置文件(简单) | 配置文件(简单) | 配置文件(简单) |
| **命令行支持** | ✅ 支持(交互式命令行) | ❌ 不支持 | ❌ 不支持 | ❌ 不支持 |
| **文件系统支持** | ✅ 支持多种文件系统 | ✅ 支持 ext2/ext3/ext4 等 | ✅ 支持 ext4、FAT 等 | ✅ 支持 ext4、FAT 等 |
| **安全启动支持** | ✅ 支持(需配置) | ❌ 不支持 | ✅ 支持(需配置) | ✅ 支持(需配置) |
| **安装复杂度** | 中等(需配置) | 较低 | 较低 | 中等(需配置) |
| **适用场景** | 多系统引导、复杂配置 | 简单系统引导 | 简单系统引导 | 多系统引导、美观界面 |
## 后记
- [聊聊BIOS、UEFI、MBR、GPT、GRUB……](https://segmentfault.com/a/1190000020850901)

View File

@@ -1,231 +0,0 @@
+++
title = "Linux之旅(六):常用命令与性能分析"
date = 2023-07-25
[taxonomies]
tags = ["Linux"]
+++
前言 在学习Linux操作系统时熟悉常用命令和性能分析工具是至关重要的。让我们一起探索Linux的世界提升技能解锁无限可能
<!-- more -->
> 翻译自https://medium.com/netflix-techblog/linux-performance-analysis-in-60-000-milliseconds-accc10403c55。
## **问题背景**
当登录到一台有性能问题的Linux服务器第一分钟要检查什么
在Netflix我们拥有庞大的EC2 Linux虚拟机云我们有众多性能分析工具来监视和诊断这些Linux服务器的性能。这些工具包括Atlas负责整个虚拟机云的监控和Vector负责按需对虚拟机实例进行性能分析。这些工具可以帮助我们解决大多数问题但有时我们需要登录到虚拟机实例并运行一些标准的Linux性能工具。
## **前60秒摘要**
在本文中Netflix性能工程团队将使用您应该使用的标准Linux工具在命令行中向您展示一个性能诊断过程的前60秒。在60秒内您可以通过运行以下十个命令来了解有关系统资源使用和运行进程的信息。最应该关注的是一些很容易理解的错误、饱和度指标和资源利用率等指标。饱和度是衡量资源负载超出其处理能力的指标它可以通过观察请求队列的长度或等待时间反映出来。
```
uptime
dmesg | tail
vmstat 1
mpstat -P ALL 1
pidstat 1
iostat -xz 1
free -m
sar -n DEV 1
sar -n TCP,ETCP 1
top
```
其中的一些命令需要安装sysstat软件包。这些命令暴露出的指标将帮助您完成一些USE方法一种查找性能瓶颈的方法。它们涉及检查所有资源CPU、内存、磁盘等的利用率饱和度和错误指标。在诊断过程中还应该注意检查和排除某些资源的问题。因为通过排除某些资源的问题可以缩小诊断的范围并指民后续的诊断。
## **uptime**
```
$ uptime
23:51:26 up 21:31, 1 user, load average: 30.02, 26.43, 19.02
```
这是快速查看平均负载的方法该平均负载指标了要运行的任务进程的数量。在Linux系统上这些数字包括要在CPU上运行的进程以及在不中断IO通常是磁盘IO中阻塞的进程。这里给出了资源负载高层次的概览但是没有其它工具就很难正确理解值得快速看一眼。
这三个数字是指数衰减移动平均值分别代表了1分钟、5分钟、15分钟的平均值。这三个数字使我们对负载如何随时间变化有了一定的了解。例如如果您去诊断一个有问题的服务器发现1分钟的值比15分钟的值低很多那么您可能已经登录得太晚了错过了问题。
在上面的例子中平均负载有所增加因为1分钟的值30相对15分钟的值19来说大了一些。数字变大意味着很多种可能有可能是CPU的需求变多了使用3和4中提到的vmstat或mpstat命令将可以进一步确认问题。
## **dmesg|tail**
```
$ dmesg | tail
[1880957.563150] perl invoked oom-killer: gfp_mask=0x280da, order=0, oom_score_adj=0
[...]
[1880957.563400] Out of memory: Kill process 18694 (perl) score 246 or sacrifice child
[1880957.563408] Killed process 18694 (perl) total-vm:1972392kB, anon-rss:1953348kB, file-rss:0kB
[2320864.954447] TCP: Possible SYN flooding on port 7001. Dropping request. Check SNMP counters.
```
该命令展示最近 10条系统消息。在这些系统消息中查找有可能引起性能问题的报错。上面的例子包括oom-killer和TCP丢弃了一个请求。
不能忘记这个步骤dmesg通常对诊断问题很有价值。
```
## **vmstat 1**
$ vmstat 1
procs ---------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
34 0 0 200889792 73708 591828 0 0 0 5 6 10 96 1 3 0 0
32 0 0 200889920 73708 591860 0 0 0 592 13284 4282 98 1 1 0 0
32 0 0 200890112 73708 591860 0 0 0 0 9501 2154 99 1 0 0 0
32 0 0 200889568 73712 591856 0 0 0 48 11900 2459 99 0 0 0 0
32 0 0 200890208 73712 591860 0 0 0 0 15898 4840 98 1 1 0 0
```
vmstat是虚拟内存统计(Virtual Memory Stat)的缩写vmstat(8)是一个通常可用的工具(最初是在之前的BSD时代创建的),它每行打印一行服务器关键统计的概览。
vmstat使用参数1运行意味着每1秒打印打印一次概览。命令输出的第一行展示的是从启动开始的平均值而不是最近一秒的平均值。因此跳过第一行除非您想学习并记住哪一列是哪一列。
要检查的列:
r在CPU上运行并等待回合的进程数。由于它不包含IO因此它比指示CPU饱和的平均负载提供了更多的信息。一个大于CPU核数的r值就是饱和的。
free空闲的内存单位的KB。如果计数很大说明服务器有足够的内存free -m命令将对空闲内存的状态有更好的说明。
si、so交换置入和交换置出。如果这两个值是非空说明物理内存用完了现在在使用交换内存了。
us、sy、id、wa、st这些是CPU时间的分类其是所有CPU的平均值。它们是用户时间、系统时间(内核)、空闲时间、等待IO和被偷窃时间被其它宾客系统进行使用或宾客系统隔离的驱动程序域Xen
通过将用户时间和系统时间这两个分类相加即可判断CPU是否繁忙。一定的等待IO时间说明磁盘有可能是性能瓶颈。你可以认为等待IO时间是另一种形式的空闲时间它提供了它是如何空闲的线索。
IO处理需要占用CPU系统时间。一个较高的CPU系统时间超过20%可能会很有趣有必要进一步研究也许内核在很低效地处理IO。
在上面的示例中CPU时间基本全在用户时间这说明应用程序本身在大量占用CPU时间。CPU的平均利用率也远远超过90%。这不一定是问题可以使用r列来检查饱和度。
## **mpstat -P ALL 1**
```
$ mpstat -P ALL 1
Linux 3.13.0-49-generic (titanclusters-xxxxx) 07/14/2015 _x86_64_ (32 CPU)
07:38:49 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
07:38:50 PM all 98.47 0.00 0.75 0.00 0.00 0.00 0.00 0.00 0.00 0.78
07:38:50 PM 0 96.04 0.00 2.97 0.00 0.00 0.00 0.00 0.00 0.00 0.99
07:38:50 PM 1 97.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 2.00
07:38:50 PM 2 98.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 1.00
07:38:50 PM 3 96.97 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 3.03
[...]
```
此命令显示每个CPU的CPU时间明细可用于检查不平衡的情况。单个热CPU说明是单线程应用程序在大量占用CPU时间。
## **pidstat 1**
```
$ pidstat 1
Linux 3.13.0-49-generic (titanclusters-xxxxx) 07/14/2015 _x86_64_ (32 CPU)
07:41:02 PM UID PID %usr %system %guest %CPU CPU Command
07:41:03 PM 0 9 0.00 0.94 0.00 0.94 1 rcuos/0
07:41:03 PM 0 4214 5.66 5.66 0.00 11.32 15 mesos-slave
07:41:03 PM 0 4354 0.94 0.94 0.00 1.89 8 java
07:41:03 PM 0 6521 1596.23 1.89 0.00 1598.11 27 java
07:41:03 PM 0 6564 1571.70 7.55 0.00 1579.25 28 java
07:41:03 PM 60004 60154 0.94 4.72 0.00 5.66 9 pidstat
07:41:03 PM UID PID %usr %system %guest %CPU CPU Command
07:41:04 PM 0 4214 6.00 2.00 0.00 8.00 15 mesos-slave
07:41:04 PM 0 6521 1590.00 1.00 0.00 1591.00 27 java
07:41:04 PM 0 6564 1573.00 10.00 0.00 1583.00 28 java
07:41:04 PM 108 6718 1.00 0.00 0.00 1.00 0 snmp-pass
07:41:04 PM 60004 60154 1.00 4.00 0.00 5.00 9 pidstat
```
pidstat有点像top的每个进程摘要但是会滚动打印而不是清屏再打印。这对于观察一段时间内的模式以及将所看到的内容复制&粘贴)记录到调查记录中很有用。
上面的示例显示两个Java进程要为消耗大量CPU负责。%CPU这一列是所有CPU核的总和1591%说明Java进程差不多消耗了16个核的CPU。
## **iostat -xz 1**
```
$ iostat -xz 1
Linux 3.13.0-49-generic (titanclusters-xxxxx) 07/14/2015 _x86_64_ (32 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
73.96 0.00 3.73 0.03 0.06 22.21
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
xvda 0.00 0.23 0.21 0.18 4.52 2.08 34.37 0.00 9.98 13.80 5.42 2.44 0.09
xvdb 0.01 0.00 1.02 8.94 127.97 598.53 145.79 0.00 0.43 1.78 0.28 0.25 0.25
xvdc 0.01 0.00 1.02 8.86 127.79 595.94 146.50 0.00 0.45 1.82 0.30 0.27 0.26
dm-0 0.00 0.00 0.69 2.32 10.47 31.69 28.01 0.01 3.23 0.71 3.98 0.13 0.04
dm-1 0.00 0.00 0.00 0.94 0.01 3.78 8.00 0.33 345.84 0.04 346.81 0.01 0.00
dm-2 0.00 0.00 0.09 0.07 1.35 0.36 22.50 0.00 2.55 0.23 5.62 1.78 0.03
[...]
```
这是了解块设备(磁盘),应用的工作负载和产生的性能影响的绝佳工具。重点关注下面的指标:
- r/s、w/s、 rkB/s、 wkB/s这些是设备每秒交付的读取、写入、读取千字节和写入千字节。使用这些来表征块设备的工作负载。性能问题可能是由于向块设备施加了过多的工作负载。
- awaitIO的平均时间以毫秒为单位。这是应用程序所感受到的时间它包括IO排队时间和IO服务时间。大于预期的平均时间可能表示块设备饱和或设备出现问题了。
- avgqu-sz发给设备的平均请求数。值大于1可以表明已达到饱和状态尽管设备通常可以并行处理请求尤其是在多个后端磁盘所组成的前端虚拟设备的情况下
- %util设备利用率。这是一个表征繁忙度的百分比它表示设备每秒工作的时间。尽管它的值取决于设备但值大于60%通常会导致性能不佳也会通过await的值观察到。接近100%的值通常表示饱和。
如果存储设备是有许多后端磁盘组成的前端逻辑磁盘设备则100%的利用率可能仅意味着100%的时间正在处理某些IO但是后端磁盘可能远远没有饱和并且可能还可以处理更多的工作。
请记住性能不佳的磁盘IO不一定是应用问题通常可以使用许多技术以执行异步IO以便使应用程序不会被阻塞住而产生直接产生IO延迟例如预读和缓冲写入技术
## **free -m**
```
$ free -m
total used free shared buffers cached
Mem: 245998 24545 221453 83 59 541
-/+ buffers/cache: 23944 222053
Swap: 0 0 0
```
右边两列:
buffers缓冲区高速缓存用于块设备I / O
cached页面缓存由文件系统使用
我们只需要检查下它们的大小是否接近零。如果接近零的话这可能导致较高的磁盘IO可以使用iostat进行确认和较差的性能。上面的示例看起来不错每列都有较大的数据。
-/+ buffers/cache为已用和空闲内存提供较少让人产生混乱的值。Linux将可用内存用于高速缓存但是如果应用程序需要它们可以快速被回收。因此应以某种方式将缓存的内存包括在free列中这也就是这一行的所做的。甚至还有一个网站专门讨论了这种混乱。
如果在Linux上使用ZFS就像我们对某些服务所做的那么因为ZFS具有自己的文件系统缓存它们并不会反映在free -m的列中因此这种场景下这种混乱还将存在。所以会看到似乎系统的可用内存不足而实际上可根据需要从ZFS缓存中申请到内存。
## **sar -n DEV 1**
```
$ sar -n DEV 1
Linux 3.13.0-49-generic (titanclusters-xxxxx) 07/14/2015 _x86_64_ (32 CPU)
12:16:48 AM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil
12:16:49 AM eth0 18763.00 5032.00 20686.42 478.30 0.00 0.00 0.00 0.00
12:16:49 AM lo 14.00 14.00 1.36 1.36 0.00 0.00 0.00 0.00
12:16:49 AM docker0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
12:16:49 AM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil
12:16:50 AM eth0 19763.00 5101.00 21999.10 482.56 0.00 0.00 0.00 0.00
12:16:50 AM lo 20.00 20.00 3.25 3.25 0.00 0.00 0.00 0.00
12:16:50 AM docker0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
```
此工具可以检查网络接口的吞吐量rxkB/s和txkB/s作为工作负载的度量还可以检查是否已达到网络接口的限制。在上面的示例中eth0接收速率达到22MB/s即176Mbit/s远低于1Gbit/s的网络接口限制假设是千兆网卡
此版本还具有%ifutil用来指示设备利用率全双工双向这也是我们使用的Brendan的nicstat工具测量出来的。就像nicstat一样这个指标很难计算正确而且在本例中好像不起作用数据是0.00)。
## **sar -n TCP,ETCP 1**
```
$ sar -n TCP,ETCP 1
Linux 3.13.0-49-generic (titanclusters-xxxxx) 07/14/2015 _x86_64_ (32 CPU)
12:17:19 AM active/s passive/s iseg/s oseg/s
12:17:20 AM 1.00 0.00 10233.00 18846.00
12:17:19 AM atmptf/s estres/s retrans/s isegerr/s orsts/s
12:17:20 AM 0.00 0.00 0.00 0.00 0.00
12:17:20 AM active/s passive/s iseg/s oseg/s
12:17:21 AM 1.00 0.00 8359.00 6039.00
12:17:20 AM atmptf/s estres/s retrans/s isegerr/s orsts/s
12:17:21 AM 0.00 0.00 0.00 0.00 0.00
```
这是一些关键的TCP指标的摘要包括
- active / s每秒本地启动的TCP连接数例如通过connect
- passive/s每秒远程启动的TCP连接数例如通过accept
- retrans / s每秒TCP重传的次数。
主动和被动计数通常作为服务器TCP负载的粗略度量新接受的连接数被动和新出站的连接数主动。将主动视为出站将被动视为入站可能对理解这两个指标有些帮助但这并不是严格意义上的例如考虑从localhost到localhost的连接
重新传输是网络或服务器问题的迹象它可能是不可靠的网络例如公共Internet也可能是由于服务器过载并丢弃了数据包。上面的示例仅显示每秒一个新的TCP连接。
## **top**
$ top
```
top - 00:15:40 up 21:56, 1 user, load average: 31.09, 29.87, 29.92
Tasks: 871 total, 1 running, 868 sleeping, 0 stopped, 2 zombie
%Cpu(s): 96.8 us, 0.4 sy, 0.0 ni, 2.7 id, 0.1 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 25190241+total, 24921688 used, 22698073+free, 60448 buffers
KiB Swap: 0 total, 0 used, 0 free. 554208 cached Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
20248 root 20 0 0.227t 0.012t 18748 S 3090 5.2 29812:58 java
4213 root 20 0 2722544 64640 44232 S 23.5 0.0 233:35.37 mesos-slave
66128 titancl+ 20 0 24344 2332 1172 R 1.0 0.0 0:00.07 top
5235 root 20 0 38.227g 547004 49996 S 0.7 0.2 2:02.74 java
4299 root 20 0 20.015g 2.682g 16836 S 0.3 1.1 33:14.42 java
1 root 20 0 33620 2920 1496 S 0.0 0.0 0:03.82 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.02 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:05.35 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
6 root 20 0 0 0 0 S 0.0 0.0 0:06.94 kworker/u256:0
8 root 20 0 0 0 0 S 0.0 0.0 2:38.05 rcu_sched
```
top命令包括我们之前检查的许多指标。运行它可以很方便地查看是否有任何东西与以前的命令有很大不同这表明负载是可变的。
top命令不太好的地方是随着时间的推移很难看到指标变化的模式这在提供滚动输出的vmstat和pidstat之类的工具中可能更清楚一点。如果您没有足够快地暂停输出Ctrl-S暂停Ctrl-Q继续在屏幕输出被top命令清除后间歇性问题的证据也可能被丢失了。

View File

@@ -1,48 +0,0 @@
+++
title = "Linux之旅(七):系统与终端字体设置"
date = 2023-08-01
[taxonomies]
tags = ["Linux"]
+++
前言 一个好看的字体会提高工作效率与审美.Linux 下的字体可以很漂亮,但需要一些设置.
<!-- more -->
随着 FreeType2 由于专利过期默认开启了高质量的 LCD 优化,以及一批高质量的开源字体的公布,Linux 上的中文字体渲染比过去好了太多.
> Windows 的字体渲染从技术上来说是相当先进的,问题是在中文字体的选择上实在是一坨...
## 选择字体
近几年来出现了一大批自由字体(包括工作量极大的 CJK 字体),使 Linux 下的字体选择一下子丰富了起来.如果愿意花一点时间的话,可以去[ArchWiki](https://wiki.archlinux.org/title/Fonts#Font_packages) 上看看,里面涵盖了相当多的自由字体.
### 终端字体
[Maple Mono](https://github.com/subframe7536/maple-font?tab=readme-ov-file),这是一款字形整洁、拥有手写风格的斜体、细粒度配置、内置 Nerd-Font、中英文2:1等宽 的字体.我使用的:
```
MapleMono-Bold
```
### 阅读器字体
[霞鹜文楷](https://github.com/lxgw/LxgwWenKai),一款开源中文字体,基于 FONTWORKS 出品字体 Klee One 衍生.我使用的:
```
LXGW WenKai
```
### 浏览器字体
```
拉丁字体
├── Inter -无衬线,类似于 Roboto 但更适合屏幕显示的字体
├── Noto Serif -衬线
└── Sarasa Term SC -等宽,拉丁文字符严格为半宽的字体,中英文混排时较协调
├── 如果不适应这种较瘦的字体风格, 则可以尝试使用:
│ ├── Adobe Source Pro
│ ├── Cascadia Code
│ └── Fira Code
中文字体
├── Noto Sans CJK SC (思源黑体)
└── Noto Serif CJK SC思源宋体
```
---
**Done.**

6
content/links/link-7.md Normal file
View File

@@ -0,0 +1,6 @@
+++
title = "coperlm's Blog"
weight = 7
+++
[coperlm.github.io](https://coperlm.github.io)

379
content/linux-0-start.md Normal file
View File

@@ -0,0 +1,379 @@
+++
title = "Linux-优雅过渡"
date = 2023-06-20
[taxonomies]
tags = ["Linux"]
+++
前言 本文面向刚刚从Windows转向Linux的一般使用者和想在Linux上进行开发的开发者主要说明其系统特点和使用须知。
<!-- more -->
## 0.启程
### 内核/发行版
Linux 是一种开源的类 UNIX 操作系统内核,广泛应用于各种设备,包括个人计算机、服务器、手机、嵌入式系统等。它由芬兰的 Linus Torvalds 于1991年开始开发是一个自由、免费的操作系统。与 Windows 和 macOS 等操作系统不同Linux 的源代码对所有人开放任何人都可以查看、修改和重新分发。我们常常说的Linux实际上是指各种发行版比如UbuntuArch LinuxDebian等等。
> Liunx可以用来玩游戏吗
实际上著名的 Steam Deck 的系统就是基于Arch linux 的。对于个人使用而言现在有不少原生支持linux 的游戏也可以使用Wine来运行Windows下的游戏。
### Linux的主要构成
Linux操作系统主要由以下几个部分组成
1. **内核**操作系统的核心负责管理系统资源。如Zen内核LTS内核等。
2. **Shell**命令行界面用户通过它与系统交互如Bash,Zsh等。
3. **图形用户界面GUI**提供图形化操作界面如GNOME、KDE、XFCE等。
4. **文件系统**如ext4、Btrfs等用于组织和管理磁盘上的文件。
5. **系统库**:为应用程序提供运行时支持。
6. **应用程序**用户可以直接使用的软件如文本编辑器、网页浏览器等。其中也有著名的GNU工具如Vim,GCC等。
### 选择Linux发行版
从上文可以发现选择Linux发行版实际上是在选择 **内核/包管理器/图形界面** 等组件的排列组合。其中最主要的因素是包管理器。
Linux有许多不同的发行版但大致可以分为几个系
**Debian系**
- DebianDebian以稳定性安全性和轻量级著称适合用于服务器和桌面环境。我们常说的Ubuntu就是基于Debian的发行版注重用户友好性和易用性。它提供了多种桌面环境选择以及许多现成的软件包。
- APTAdvanced Package Tool是Debian系发行版的主要包管理器。它使用命令行工具如apt-get、aptitude等来管理软件包。
**Red Hat系**
- Red Hat Enterprise LinuxRHELRHEL是一款商业发行版专注于企业级应用和支持。它提供了长期支持和专业技术支持服务适用于企业级服务器和工作站。
- CentOSCentOS是基于RHEL源代码编译而成的免费发行版与RHEL兼容并提供类似的功能和性能。它也提供了长期支持版本和稳定性较高的特点。
- FedoraFedora是由Red Hat支持的社区驱动的发行版注重提供最新的软件特性和技术。它适用于开发者和技术爱好者提供了稳定的发布周期和丰富的软件包。
- YUMYellowdog Updater, Modified是Red Hat系发行版的主要包管理器。最近的版本也开始采用DNFDandified YUM
**Arch系**
- Arch LinuxArch Linux是一个简洁、轻量级且灵活的发行版注重简洁性和滚动更新。它采用“滚动发布”的方式用户可以通过自定义安装来构建自己的系统适合有一定Linux经验的用户。
- PacmanPackage Manager是Arch Linux的主要包管理器。它使用简洁的命令来管理软件包如pacman -S安装软件包、pacman -Syu更新系统等。
**Gentoo系**
- GentooGentoo是一个源码驱动的发行版用户可以通过源代码自定义编译软件包以满足自己的需求。它注重性能和灵活性适合高级用户和技术爱好者。
- Portage是Gentoo的包管理器它是一个源代码驱动的包管理器允许用户从源代码构建和安装软件包。
除了以上列举的包管理器外还有其他一些较为特殊的包管理器如Slackware系的pkgtool、SUSE系的zypper等。
对于个人使用而言我个人建议新手使用Ubuntu,有比较易用的界面和完善的资料参考如果你是一个系统极客可以使用Arch linux 或者 NixOS。
## 1.初探FHS
李华是一个从WindowsXP时代一直使用到Win11的微软“老资历”用户这一天他下定决心要学会使用Linux于是他按照网上CSDN的教程在VMware中安装了大名鼎鼎的Ubuntu系统但很快他发现为什么系统里面``没有C盘和D盘``,只有一个神秘的``/``和一堆奇怪的英文?
在 Windows 的世界里,存储设备是用字母区分的,比如``C: D: E:``等等。但Linux 不给磁盘分字母,它采用的是一种叫做 ``FHSFilesystem Hierarchy Standard文件系统层次结构标准`` 的方式来组织系统。在 FHS 的世界里,整个系统就像一棵树:
- 树根是 /(根目录)
- 所有磁盘、分区、U盘、设备都会被“挂载mount”到这棵树的某个枝丫上
因此对于Linux而言文件系统是这样的
```shell
/ — 根
/home — 用户家目录
/root — 超级用户的家
/bin — 基础命令/二进制文件
/sbin — 管理命令
/usr — 大多数程序和资源
/lib — 库文件
/etc — 配置文件
/var — 日志、缓存、变化的数据
/tmp — 临时文件
/dev — 设备文件
/media — 自动挂载U盘
/mnt — 手动挂载点
/opt — 第三方软件
/boot — 系统启动文件
/proc — 虚拟进程信息
/sys — 虚拟硬件信息
/run — 系统运行状态
```
其中Home目录类似Windows上的``C:\Users\你的名字``,里面有``桌面/文档/下载/图片/音乐/视频/``,是不是非常眼熟?
可以看出Linux下是不用专门分出系统盘和数据盘的某种意义上解决了Windows的C盘空间不足红色爆满的问题。
> 小知识为什么Windows上是“\”而Linux是“/”? Unix 在1970年代就使用“/”,诞生于 1980 年代的 MS-DOS 本来也是用“/”的!但后来微软加入了命令行参数(如 /help和路径冲突了。为了区分选项和路径微软紧急决定“/” 用来当选项前缀至今仍如此dir /a文件路径改用“\”,于是 Windows 专门和全世界不一样。
> 并非所有Linux发行版都遵守FHS比如Nixos.
理解了FHS下一步就是要如何安装软件呢
## 2.包管理器与ELF
在windows中当我们想要安装某个软件的时候第一时间就是去寻找``EXE安装包``,而后点击安装-确定软件就出现在桌面了但李华很快发现他将下载的EXE文件放在Ubuntu的桌面并点击显示无法运行
这是因为Linux下不使用Windows的PE格式而是用ELF格式这并不是说李华得手动一个个下载ELF并点击运行实际上Linux上使用的是名为``包管理器``的方法。
在Ubuntu的界面中李华看到了一个名为``终端``的应用,输入``apt install neofetch``,就安装成功...不,暂时还没有成功,再次输入``sudo apt install neofetch``,就成功安装了neofetch这个软件随后我们输入``neofetch``,可以看到系统的一些信息:
```shell
neofetch
.-/+oossssoo+/-. dich@uos
`:+ssssssssssssssssss+:` --------
-+ssssssssssssssssssyyssss+- OS: Ubuntu 24.04.3 LTS x86_64
.ossssssssssssssssssdMMMNysssso. Host: KVM/QEMU (Standard PC (Q35 + ICH9, 2009) pc-q35-10.0)
/ssssssssssshdmmNNmmyNMMMMhssssss/ Kernel: 6.14.0-35-generic
+ssssssssshmydMMMMMMMNddddyssssssss+ Uptime: 2 mins
/sssssssshNMMMyhhyyyyhmNMMMNhssssssss/ Packages: 2522 (dpkg), 12 (snap)
.ssssssssdMMMNhsssssssssshNMMMdssssssss. Shell: zsh 5.9
+sssshhhyNMMNyssssssssssssyNMMMysssssss+ Resolution: 1280x800
ossyNMMMNyMMhsssssssssssssshmmmhssssssso Terminal: /dev/pts/0
ossyNMMMNyMMhsssssssssssssshmmmhssssssso GPU: 00:01.0 Red Hat, Inc. Virtio 1.0 GPU
+sssshhhyNMMNyssssssssssssyNMMMysssssss+ Memory: 1126MiB / 13976MiB
.ssssssssdMMMNhsssssssssshNMMMdssssssss.
/sssssssshNMMMyhhyyyyhdNMMMNhssssssss/
+sssssssssdmydMMMMMMMMddddyssssssss+
/ssssssssssshdmNNNNmyNMMMMhssssss/
.ossssssssssssssssssdMMMNysssso.
-+sssssssssssssssssyyyssss+-
`:+ssssssssssssssssss+:`
.-/+oossssoo+/-.
```
可见在Linux上安装软件其实比Windows的简单只需一行命令包管理器会从``源``下载软件包,并进行解压,``处理依赖项/动态链接/环境变量``等等这并非代表不安全Linux上大部分是开源软件关于开源软件日后我们再进行说明。那么如何知道安装需要的命令呢
我们可以从Ubuntu的软件源``https://packages.ubuntu.com/``上搜索软件包的名字,输入关键字(如 firefox、python、vlc它会列出
- 软件包的准确名字
- 所属版本(如 24.04、22.04
- 依赖关系
- 下载链接(如果你想手工装)
或者使用``apt search 包名``如果apt没有某个包还可以使用``AppImage / Flatpak / Snap``等等管理器来下载。
> 包管理器常用命令
| 功能 | aptUbuntu/Debian | paru/pacmanArch/Manjaro | 说明 |
| ------------ | ------------------------------------------- | -------------------------------- | ---------------------------- |
| 更新软件包索引 | `sudo apt update` | `sudo paru -Sy` | 先更新仓库信息 |
| 升级已安装的软件 | `sudo apt upgrade` | `sudo paru -Syu` | 升级所有已安装的软件(包含系统更新) |
| 安装软件包 | `sudo apt install <package>` | `sudo paru -S <package>` | 安装指定软件 |
| 移除软件包(保留配置) | `sudo apt remove <package>` | `sudo paru -R <package>` | 删除软件包,但保留配置文件 |
| 完全删除软件包(含配置) | `sudo apt purge <package>` | `sudo paru -Rns <package>` | 删除软件包及依赖、配置文件 |
| 搜索软件包 | `apt search <package>` | `paru -Ss <package>` | 查找仓库中的软件包 |
| 查看已安装软件 | `apt list --installed` | `paru -Q` | 列出系统已安装软件 |
| 查看软件信息 | `apt show <package>` | `paru -Si <package>` | 显示软件包详细信息 |
| 自动清理无用依赖 | `sudo apt autoremove` | `sudo paru -Rns $(pacman -Qdtq)` | 删除不再需要的依赖包 |
| 清理下载缓存 | `sudo apt clean` | `sudo paru -Sc` | 删除已下载的软件包缓存 |
| 升级单个软件包 | `sudo apt install --only-upgrade <package>` | `sudo paru -S <package>` | 仅升级指定软件 |
> AppImage可直接运行像“可携带版 EXE”;Flatpak沙盒化、现代、安全;Snap由 Ubuntu 官方主推;第三方仓库 PPA常见于开发版软件...
> 如果你使用其他Linux发行版也有对应的包管理器。比如Arch的Pacman/ParuFedora 的 dnfopenSUSE 的 zypperNixOS 的 nix...
> 实际上Windows上也是有包管理的比如 Windows 10/11 内置的 wingetWindows Package ManagerchocoChocolateyscoop...由于历史原因不为大部分人所熟悉.可以使用这个项目[UniGetUI](https://github.com/marticliment/UniGetUI)在Windows上方便的进行包管理.
## 3.权限系统/Sudo/Root
还记得前面我们使用的``sudo apt install xxx``吗为什么不加上sudo就无法运行呢这其实和Linux的权限系统有关.在Windows中有些无法直接运行的软件需要右键单击并选择``以管理员权限运行``.这表示某个操作会修改系统需要管理员Administrator的允许。Linux 也有类似的概念但名字不一样Linux 的管理员叫:``root``.
在Linux中普通用户如你的账户只能管理自己的文件、自己的程序
而root 用户能管理整个系统、安装软件、删除系统文件、修改配置;所以,日常使用的时候不是“管理员账号”,而是一个安全的普通用户。`sudo`super user do就是“请允许我**暂时**以 root 的身份执行这一条命令。”
为什么不用 root 账号直接登录呢?因为 root 太强大了:
- 可以删掉任何文件
- 可以覆盖系统配置
- 可以误操作把系统搞到无法启动
所以日常使用 root 类似于:“天天坐在一个自带核弹按钮的办公桌前”。这就是为什么 Linux 默认让你用普通用户,然后用 `sudo` 临时提升权限。
当李华学会使用 `sudo` 后,他又开始好奇:
> “为什么有些文件我能读,有些不能?
> 为什么有些文件能执行,有些却提示权限不够?”
Linux 的权限可以简单理解为``UGO+RWX``.
- UGO由用户User/ 用户组Group/ 其他人Others构成每个文件都有 Owner所有者和 Group用户组
- RWX权限分为 **r 读 / w 写 / x 执行**,并以类似 `-rwxr-x---` 的形式展示(文件类型 + Owner 权限 + Group 权限 + Others 权限)。
- **用户组Group** 是“权限相同的用户集合”,如:`sudo` 组能用 sudo`audio` 组能访问音频,`video` 组能用 GPU`docker` 组能管理容器。Linux 通过把用户加入不同组来决定他们能操作什么。
- **chmod** 用于修改权限:`chmod +x a.sh`(所有人加执行权限),`chmod u+x`(给 Owner 加执行权限),`chmod g-w`(去掉 Group 写权限),`chmod o-r`(禁掉 Others 读权限)。数字模式如 `755`、`644` 表示 r/w/x 的数字和(``r=4, w=2, x=1``):例如 `755` = Owner(rwx) / Group(r-x) / Others(r-x)。
比如创建一个新用户,可以使用``sudo adduser <用户名>``授予这个用户sudo权限可以使用``sudo usermod -aG sudo <用户名>``.
## 4.命令行
看到这里李华发觉Linux很多操作都是命令行式的在终端里面操作的但李华不知道有那些命令可以使用于是李华找了一些网站并尝试了一些常用的命令
- Linux命令查询[linux-command](https://wangchujiang.com/linux-command/hot.html)
- Linux常用命令表[Quick Reference](https://wangchujiang.com/reference/docs/linux-command.html)
```bash
date
Sun Nov 16 09:16:15 PM +08 2025
uname -a
Linux dos 6.17.7-cachyos #1-NixOS SMP PREEMPT_DYNAMIC Sun Nov 2 13:18:05 UTC 2025 x86_64 GNU/Linux
uptime
21:16:23 up 4:54, 0 users, load average: 0.79, 0.74, 0.70
ls
Data Desktop Documents Downloads Git go Picback Pictures
cd ./Downloads
~/Downloads
```
李华很好奇:这些 `ls`、`cd`、`uname`、`date` 等命令究竟来自哪里?它们是 Linux 内置的吗其实Linux 里的命令大致可以分为三类:**Shell 内建命令、外部二进制程序、BusyBox 提供的工具**。
- 一些命令是由 Shell 自己实现的,例如`cd` `echo` `pwd` `export` `alias` `history`这些命令不需要执行外部程序,由 Shell 本身的代码直接完成。可以用下面的方式判断命令是否是内建的:
```bash
type cd
# cd is a shell builtin
```
- 大多数常用命令是独立的可执行文件,例如 `/usr/bin/ls`、`/usr/bin/date`,它们通常来自一个叫 **coreutilsGNU Core Utilities** 的软件集合。可以用 `which` 查看一个命令的真实位置:
```bash
which ls
# /usr/bin/ls
```
这类命令本质上是ELF 可执行文件/被内核加载/在用户空间运行
- 在一些精简 Linux例如 Alpine、OpenWrt中命令不来自 GNU coreutils而来自一个叫 **BusyBox** 的单程序。BusyBox 只一个二进制文件,但内部包含了上百个命令,这种方式体积小,适用于嵌入式设备。
```bash
/bin/busybox ls
/bin/busybox cp
/bin/busybox tar
```
## 5.Shell/Terminal/TTY
随着李华在系统中的探索,李华发现常常遇到诸如``TerminalConsolebash,zsh,shell,tty``等概念,这些概念常常被混淆,似乎都和命令行相关,但又不太清楚它们之间是什么关系?
### 终端和控制台
终端,英文叫做 terminal ,通常简称为 term控制台英文叫做 console。
要明白这两者的关系,还得从最初的计算机说起。当时的计算机价格昂贵,一台计算机一般是由多个人同时使用的。在这种情况下一台计算机需要连接上许多套键盘和显示器来供多个人使用。在以前专门有这种可以连上一台电脑的设备,只有显示器和键盘,还有简单的处理电路,本身不具有处理计算机信息的能力,他是负责连接到一台正常的计算机上(通常是通过串口) ,然后登陆计算机,并对该计算机进行操作。当然,那时候的计算机操作系统都是多任务多用户的操作系统。这样一台``只有显示器和键盘能够通过串口连接到计算机的设备就叫做终端``。
而控制台又是什么回事呢?其概念来自于管风琴的控制台。顾名思义,控制台就是一个直接控制设备的台面(一个面板,上面有很多控制按钮)。 在计算机里,把那套``直接连接在电脑上的键盘和显示器就叫做控制台``。
终端是通过串口连接上的,不是计算机本身就有的设备,而控制台是计算机本身就有的设备,一个计算机只有一个控制台。计算机启动的时候,所有的信息都会显示到控制台上,而不会显示到终端上。也就是说,``控制台是计算机的基本设备,而终端是附加设备``。 当然,由于控制台也有终端一样的功能,控制台有时候也被模糊的统称为终端。
以上是控制台和终端的历史遗留区别。现在由于计算机硬件越来越便宜,终端和控制台的概念也慢慢演化了。``终端和控制台由硬件的概念,演化成了软件的概念``。
### 内核与外壳
内核( Kernel )和外壳( Shell )是 linux 的两个主要部分。Kernel 是操作系统的核心,系统的文件管理、进程管理、内存管理、设备管理这些功能,都是由 Kernel 提供的。
用户和操作系统内核交流需要一个工具,那么这个工具就是 Shell。
什么是 Shell在 Linux 中,最常见的 Shell 形式有命令行界面命令行界面和图形界面两种。并不是打开的那个终端窗口就是 Shell如Alacritty、Gnome-Terminal、xterm 、kitty等程序它们不是 Shell而它们里面``运行的 Bash、Zsh、fish 等命令行解释器程序,才是 Shell``。
那``Alacritty、Gnome-Terminal、xtermxterm``是什么?
它们是``终端模拟器``。
前面提到过,在远古时代,终端和控制台都是有实体的。控制台直接和计算机在一起,你可以通过控制台控制计算机。终端通过数据线和计算机连接,终端也提供一个键盘和一个屏幕,你可以通过键盘向计算机下达指令,然后通过屏幕观察输出。
但是现在的计算机组成和以前不一样了,一般一台电脑都是自带键盘和屏幕,很少再外接终端设备。
所以 Linux 提供了另外一个更高级的功能,那就是虚拟终端。那就是在一台电脑上,通过软件的模拟,好像有好几个终端连接在这台计算机上一样。
``现在说的终端,比如 linux 中的虚拟终端,都是软件的概念``。虚拟终端称之为 ttytty 是电传打字机电传打字机 Teletypewriter 的缩写在带显示屏的视频终端出现之前tty是最流行的终端设备。每一个 tty 都有一个编号,在/dev目录下有相应的设备文件。其中/dev/tty1到/dev/tty7可以通过 Ctrl+Alt+F1 到 Ctrl+Alt+F7 进行切换,也可以通过 chvt 命令进行切换,就好比是以前多人公用的计算机中的六个终端设备,这就是为什么这个叫“虚拟终端”的原因。
> 如果你现在使用linux可以使用Ctrl+Alt+F2切换到TTY界面
## 6.DE/WM/Wayland/X11
在 Windows 上,图形界面是系统密不可分的一部分。但李华发现,他安装的 Ubuntu 界面叫 GNOME而他同学安装的 Mint 界面却是 Cinnamon而且他听说还有 KDE、XFCE 等等,这让他感到困惑。
在 Linux 中,``图形界面是可以高度定制和替换的``。它主要由以下几个核心组件构成:
- 桌面环境Desktop Environment, DE
**桌面环境DE** 是一整套完整的、提供图形化操作体验的软件集合。它包括了:
```
窗口管理器Window Manager, WM负责绘制窗口边框、最大化/最小化按钮、控制窗口的移动和堆叠。
文件管理器:如 Nautilus (GNOME)、Dolphin (KDE)。
面板/任务栏:提供应用启动器、系统托盘、时钟等。
显示管理器Display Manager, DM负责登录界面如 GDM, LightDM
一系列配套应用:如文本编辑器、图片查看器等。
```
- 窗口管理器Window Manager, WM
**窗口管理器WM** 是 DE 的核心组件之一,但也可以独立运行。如果你不需要一个完整的桌面环境(如文件管理器、面板等),只想要管理窗口的显示和布局,就可以只安装一个 WM。
| 常见 DE | 常见 WM |
| -------------------------------- | ---------------------------------------------- |
| [KDE](https://docs.kde.org/) | [i3](https://i3wm.org/) |
| [Xfce](https://docs.xfce.org/) | [niri](https://github.com/YaLTeR/niri) |
| [Gnome](https://help.gnome.org/) | [qtile](https://github.com/qtile/qtile/) |
| — | [bspwm](https://github.com/baskerville/bspwm) |
| — | [Hyprland](https://github.com/hyprwm/Hyprland) |
| — | [awesomewm](https://awesomewm.org/) |
### 图形协议X11 与 Wayland
无论是 DE 还是 WM它们都需要一套机制来告诉应用程序“在哪里绘制一个按钮”、“如何响应鼠标点击”等。这就是 **图形显示协议**。
* **X Window SystemX11/Xorg** 历史悠久、功能强大但结构复杂的图形协议,已经使用了几十年。它的设计初衷是网络透明——理论上你可以在一台机器上运行程序,并在另一台机器上显示其图形界面。
* **Wayland** X11 的现代替代品。它设计更简洁、安全性更高、性能更好,尤其是在高分屏和混合刷新率显示器上。目前 GNOME 和 KDE 都在积极转向 Wayland。
> 对于新手,建议直接使用主流发行版的默认 DE如 Ubuntu 的 GNOME 或 CachyOS 的 KDE它们都提供了完整的用户体验。如果你是开发者或极客可以尝试平铺式 WM并关注 Wayland 的发展。
## 7.XDG
李华在折腾 GNOME 桌面时,发现很多配置文件夹都藏在 `~/.config` 下,而缓存文件在 `~/.cache`,下载的应用数据却在 `~/.local/share`。他发现这比 Windows 时代全部扔在 `C:\Users\username\AppData` 里规范多了!
这套规范就是 **XDG 基础目录规范XDG Base Directory Specification**,它是 Freedesktop.org一个致力于桌面环境互操作性的组织推广的一项标准。
XDG 规范的核心思想是将用户的文件按照用途分离,而不是像 Windows 那样把所有数据都塞进一个 `AppData` 文件夹。
| 环境变量/目录 | 默认路径(若未设置) | 用途 |
| :---------- | :----------------------------- | :----------------------------------------------------- |
| `$XDG_CONFIG_HOME` | `~/.config` | 存放**用户配置文件**Configuration files。 |
| `$XDG_CACHE_HOME` | `~/.cache` | 存放**非关键的缓存文件**Cache files可以随时删除。 |
| `$XDG_DATA_HOME` | `~/.local/share` | 存放**应用程序生成的用户数据**Data files如游戏存档、下载的图标等。 |
| `$XDG_RUNTIME_DIR` | 通常是 `/run/user/$(id -u)` | 存放**运行时文件**,生命周期与用户登录会话一致,重启或注销后消失。 |
通过遵守 XDG 规范,可以带来很多好处:
- **清理更方便:** 想清理缓存?直接删除 `$XDG_CACHE_HOME` 下的文件即可,不会误删配置。
- **备份更清晰:** 只需要备份 `$XDG_CONFIG_HOME` 就可以保留所有应用程序的配置。
- **兼容性更好:** 不同 Linux 发行版和桌面环境下的应用程序都能遵循一致的目录结构。
## 8.DEV面向开发者
对于想在 Linux 上进行开发的李华来说Linux 简直是为开发而生的系统。由于其开源、类 UNIX 的特性,它在软件开发领域拥有巨大的优势。
Linux 默认提供了强大的 GNU 工具链:
* **GCC/Clang** 编译 C/C++ 等语言。
* **Make/CMake** 构建自动化工具。
* **Git** 版本控制的行业标准Linux 对其支持极佳。
* **Bash/Zsh/Shell Scripting** 强大的命令行脚本能力,用于自动化运维。
* **Docker/Podman** 容器化技术在 Linux 上天然且高效。
在 Windows 上,安装 Python 或 Node.js 往往需要下载安装包并手动设置环境变量,管理多版本很麻烦。在 Linux 上,这变得非常优雅:
* **包管理器:** 可以直接通过 `apt` 或 `pacman` 安装主流编程语言及其依赖。
* **版本管理器:** 开发者通常会使用专门的工具来隔离和管理不同项目的语言版本,例如:
* **Python** `pyenv`
* **Node.js** `nvm`
* **Go** `gvm`
* **Ruby** `rvm` / `rbenv`
Linux 的内核天然支持 **Cgroups****Namespaces**,这是 **Docker****Kubernetes** 等容器化技术的基础。
* **Docker** 在 Linux 上运行 Docker 几乎没有性能损耗,是开发、测试和部署微服务的理想平台。
* **KVM/QEMU** 内置的高性能虚拟化技术,相比 Windows 的 Hyper-V 或 VMware性能更好更通用。
---
**Done.**

360
content/linux-1-command.md Normal file
View File

@@ -0,0 +1,360 @@
+++
title = "Linux-命令行操控"
date = 2023-07-20
[taxonomies]
tags = ["Linux"]
+++
前言 本文基于常见发行版systemd + NetworkManager + PipeWire/ PulseAudio / ALSA,目标是把常见的桌面/笔记本硬件Wi-Fi、蓝牙、亮度、音量通过命令行可复现、可理解地组织起来。
<!-- more -->
# Wifi 控制
现代桌面大多使用 NetworkManager 管理网络,`nmcli` 是其命令行接口。`nmcli` 能列出可用网络、连接/断开、创建配置文件(包括 WPA/WPA2/PSK、enterprise等。相比直接编辑 wpa_supplicant 配置,`nmcli` 更安全、统一,能与 GUI 保持一致。
### 常用命令
列出接口及设备状态:
```bash
nmcli device status
```
列出附近 Wi-FiSSID、信号强度、安全类型
```bash
nmcli device wifi list
```
交互式连接(会提示输入密码):
```bash
nmcli device wifi connect "wifi-2.4G" --ask
```
不交互式连接(将密码放在命令里 — 注意安全风险):
```bash
nmcli device wifi connect "wifi-2.4G" password "your_password"
```
基于已有配置文件连接(例如创建一个保存的 connection 名称):
```bash
# 创建连接(自动选择设备)
nmcli connection add type wifi ifname wlan0 con-name my-home ssid "wifi-2.4G" \
wifi-sec.key-mgmt wpa-psk wifi-sec.psk "your_password"
# 启用连接
nmcli connection up my-home
```
断开或禁用接口:
```bash
# 断开当前连接
nmcli device disconnect wlan0
# 禁用设备(软禁用)
nmcli device set wlan0 managed no
```
查看连接详情:
```bash
nmcli -f all connection show my-home
nmcli device show wlan0
```
---
# 蓝牙控制
Linux 上常见蓝牙栈为 BlueZ蓝牙守护 `bluetoothd``bluetoothctl` 提供交互式 CLI。音频设备通常通过 BlueZ + PulseAudio或 PipeWire进行音频路由配对/信任步骤必须完成才能稳定连接音频/键盘/鼠标等设备。
### 一、蓝牙服务与模块启用/禁用
启用蓝牙服务systemd
```bash
sudo systemctl enable --now bluetooth.service
```
打开蓝牙适配器电源:
```bash
bluetoothctl power on
```
打开配对代理(用于交互式配对)并设置为默认:
```bash
bluetoothctl agent on
bluetoothctl default-agent
```
开启可发现(让其它设备能扫描到):
```bash
bluetoothctl discoverable on
```
重启蓝牙服务(排错常用):
```bash
sudo systemctl restart bluetooth
sudo journalctl -u bluetooth -f
```
> 注意:某些发行版在使用 PipeWire 做音频时还需要 `pipewire` / `wireplumber` 正确运行否则音频通道A2DP/HFP无法建立。
### 二、查看设备与状态
```bash
# 列出本机所有蓝牙适配器
bluetoothctl list
# 查看本地适配器详细状态
bluetoothctl show
# 查看已配对设备
bluetoothctl paired-devices
# 查看某个设备详情(包括 UUID、已连接服务
bluetoothctl info AA:BB:CC:DD:EE:FF
```
### 三、交互式配对与连接
交互式步骤(在 `bluetoothctl` 提示符下):
```text
$ bluetoothctl
[bluetooth]# power on
[bluetooth]# agent on
[bluetooth]# default-agent
[bluetooth]# scan on
# 等待几秒,看到目标设备(并记录 MAC
[bluetooth]# pair AA:BB:CC:DD:EE:FF
# 如果是需要 PIN 的设备,会提示配对码;确认或输入即可
[bluetooth]# trust AA:BB:CC:DD:EE:FF # 使系统信任设备(开机后自动连接)
[bluetooth]# connect AA:BB:CC:DD:EE:FF
[bluetooth]# exit
```
### 四、断开与删除设备
断开连接:
```bash
bluetoothctl disconnect AA:BB:CC:DD:EE:FF
```
删除配对信息(“忘记设备”):
```bash
bluetoothctl remove AA:BB:CC:DD:EE:FF
```
### 五、蓝牙软/硬封锁
查看封锁状态:
```bash
rfkill list bluetooth
```
封锁(禁用):
```bash
sudo rfkill block bluetooth
```
解封(启用):
```bash
sudo rfkill unblock bluetooth
```
如果设备被**硬封锁**(硬件开关),软件方法无效,需要物理开关或 BIOS 设置。
### 六、音频输出切换
* 现代发行版多用 PipeWire 替代 PulseAudio但 PipeWire 提供兼容接口,因此 `pactl`PulseAudio 控制工具)在很多系统仍然可用。
* 蓝牙设备会在连接后生成类似 `bluez_output.XX_XX_XX_XX_XX_XX.a2dp_sink` 的 sink 名称;有时名称会略有差异,建议先查询。
列出 sinks输出设备
```bash
pactl list short sinks
```
设置默认输出为蓝牙耳机(示例):
```bash
pactl set-default-sink bluez_output.XX_XX_XX_XX_XX_XX.a2dp_sink
```
把当前正在播放的流移动到蓝牙设备:
```bash
pactl list short sink-inputs # 找到输入编号
pactl move-sink-input <输入编号> bluez_output.XX_XX_XX_XX_XX_XX.a2dp_sink
```
如果使用 PipeWire遇到连接但没有声音的问题
* 确保 `wireplumber``pipewire-media-session` 正常运行。
* 检查 profileA2DP vs HFPA2DP 提供高音质但不可通话HFP 可通话但质量较低。可通过 `pactl list cards` / `pactl set-card-profile` 调整。
---
# 亮度控制
笔记本屏幕亮度通常由内核暴露的 SysFS 接口 `/sys/class/backlight/*/brightness` 提供,写入该文件需要 root 权限或合适的权限udev 规则。桌面显示器、USB 显卡或 Wayland特别是 wlroots环境可能不会使用该接口需要使用专门工具`light``brightnessctl`、或 DE/Compositor 提供的接口)。
### 一、SysFS多数笔记本适用
查看最大亮度值与当前亮度:
```bash
cat /sys/class/backlight/*/max_brightness
cat /sys/class/backlight/*/brightness
```
设置亮度(需要 root
```bash
# 写入数值0~max_brightness
echo 5 | sudo tee /sys/class/backlight/*/brightness
# 或者重定向(注意 sudo 的作用域)
sudo sh -c 'echo 5 > /sys/class/backlight/*/brightness'
```
如果遇到 “权限被拒绝”:
* 使用 `sudo tee``sudo sh -c`;或添加 udev 规则给某个用户写权限。
* 在某些内核/驱动下,背光接口名称可能不同(`intel_backlight``amdgpu_bl0` 等)。
### 二、brightnessctl
`brightnessctl` 是一个用户友好、支持百分比与设备选择的工具。
安装:
* Debian/Ubuntu:
```bash
sudo apt install brightnessctl
```
* Arch:
```bash
sudo pacman -S brightnessctl
```
用法示例:
```bash
brightnessctl info # 显示当前设备信息
brightnessctl get # 当前亮度
brightnessctl max # 最大亮度
brightnessctl set +10% # 增加 10%
brightnessctl set 50% # 设为 50%
```
---
# 音量控制
Linux 下有几层音量控制硬件ALSA、中间层PulseAudio / PipeWire、用户层桌面音量控制器。常用命令行工具`pactl`PulseAudio / PipeWire`pamixer`PulseAudio 前端)、`amixer`ALSA 原生)。
### 一、pactlPulseAudio / PipeWire
查看 sinks
```bash
pactl list short sinks
```
查看默认 sink
```bash
pactl info | grep 'Default Sink'
```
设置默认音量:
```bash
pactl set-sink-volume @DEFAULT_SINK@ 50%
```
增量调节:
```bash
pactl set-sink-volume @DEFAULT_SINK@ +5%
pactl set-sink-volume @DEFAULT_SINK@ -5%
```
静音/取消静音/切换:
```bash
pactl set-sink-mute @DEFAULT_SINK@ 1
pactl set-sink-mute @DEFAULT_SINK@ 0
pactl set-sink-mute @DEFAULT_SINK@ toggle
```
移动播放流(见蓝牙章节):
```bash
pactl list short sink-inputs
pactl move-sink-input <输入编号> <目标-sink>
```
### 二、amixerALSA
列出通道与当前值:
```bash
amixer sget Master
```
设置音量(绝对 / 相对):
```bash
amixer sset Master 50% # 绝对值
amixer sset Master 5%+ # 增加
amixer sset Master 5%- # 减少
```
静音:
```bash
amixer set Master mute
amixer set Master unmute
amixer set Master toggle
```
> 当使用 PipeWire/PulseAudio 时,`amixer` 仍然可以操作底层硬件但用户可听到的效果可能被上层音量PulseWire/PulseAudio覆盖。
### 三、pamixerPulseAudio
简洁的命令行前端,适合脚本:
```bash
pamixer --get-volume
pamixer --set-volume 40
pamixer --increase 5
pamixer --decrease 5
pamixer --toggle-mute
```
---
**Done.**

347
content/linux-2-stm32.md Normal file
View File

@@ -0,0 +1,347 @@
+++
title = "Linux-STM32开发环境部署"
date = 2025-07-20
[taxonomies]
tags = ["Linux"]
+++
前言 本文记录STM32命令行开发环境在Linux上的部署用以替代Windows上的RT-Thread-studio。RT-Thread-studio同样是开源
软件但目前没有Nixos上的打包。
<!-- more -->
## 依赖包
- **Ubuntu**
以ubuntu24.04为例,首先安装这些包,包括连接工具,工具链和调试器等等。
```bash
sudo apt update
sudo apt install -y git python3 scons openocd stlink-tools gcc-arm-none-eabi gdb-multiarch
```
- **Nixos**
虽然Nixos上没有RT-Thread-studio这个包但是可以用flake.nix很方便的搭建一个开发环境
```nix
{
description = "STM32 && RT-Thread development environment";
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
outputs = { self, nixpkgs }:
let
supportedSystems = [ "x86_64-linux" "aarch64-linux" ];
forEachSupportedSystem = f: nixpkgs.lib.genAttrs supportedSystems (system: f {
pkgs = import nixpkgs { inherit self system; };
});
in
{
devShells = forEachSupportedSystem ({ pkgs }: {
default = pkgs.mkShell {
packages = with pkgs; [
python312
scons
openocd
stlink
stlink-tool
gcc-arm-embedded
picocom
renode-bin
];
};
});
};
}
```
## 源码
随后使用Git拉取项目源码
```bash
git clone https://github.com/RT-Thread-Studio/sdk-bsp-stm32f407-spark.git
```
## ENV工具
使用Git拉取RT-Thread配套的linux开发环境并添加Shell变量。
```bash
# 克隆仓库
git clone https://github.com/RT-Thread/env.git ~/env
# 将 ~/env 添加到 PATH
export PATH="$PATH:$HOME/env"
# 显示 PATH
echo "$PATH"
# 查看 pkgs 命令是否存在
type pkgs
```
随后可以使用PKG初始化并安装两个必要的包
```bash
pkgs --update
pip install kconfiglib
pip install scons
```
## 连接
使用USB线连接开发板和开发PC并使用lsusb命令查看是否出现
```bash
lsusb
Bus 001 Device 004: ID 0483:374b STMicroelectronics ST-LINK/V2.1
```
添加成功后可以使用这个命令来检测是否连接成功:
```bash
st-info --probe
Found 1 stlink programmers
version: V2J35S26
serial: 0671FF373654393143244522
flash: 1048576 (pagesize: 16384)
sram: 196608
chipid: 0x413
dev-type: STM32F4x5_F4x7
```
> 如果你和我一样将Ubuntu安装在QEMU虚拟机中 需要在libvirt中使用Add_hardware添加usb设备。
## 修改交叉工具链
链接成功后进入项目目录,发现``rtconfig.py``没有Linux路径需要我们手动修改交叉工具链部分
```python
#修改 rtconfig.py
# cross_tool provides the cross compiler
# EXEC_PATH is the compiler execute path, for example, CodeSourcery, Keil MDK, IAR
import os
if CROSS_TOOL == 'gcc':
PLATFORM = 'gcc'
if os.name == 'nt':
# Windows 平台
EXEC_PATH = r'C:\Users\XXYYZZ'
else:
# 修改这里
# Linux / macOS 平台
EXEC_PATH = '/usr/bin'
elif CROSS_TOOL == 'keil':
PLATFORM = 'armclang' # KEIL AC6
# PLATFORM = 'armcc' # KEIL AC5
EXEC_PATH = r'C:/Keil_v5'
elif CROSS_TOOL == 'iar':
PLATFORM = 'iccarm'
EXEC_PATH = r'C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.3'
elif CROSS_TOOL == 'llvm-arm':
PLATFORM = 'llvm-arm'
if os.name == 'nt':
EXEC_PATH = r'D:\Progrem\LLVMEmbeddedToolchainForArm-17.0.1-Windows-x86_64\bin'
else:
EXEC_PATH = '/usr/bin'
```
## 编译
在完成以上设置之后我们可以开始编译。STM32使用scons编译系统同样是menuconfig命令
```bash
scons --menuconfig
```
修改配置并保存退出后即可开始编译,$(nproc)代表使用全部CPU线程来编译
```bash
scons -j$(nproc)
```
## 烧入
编译成功后你应该会看到有一个rtthread.bin在目录下这就是我们编译出来的系统
在烧入之前,我们可以备份一下原来的系统:
```bash
st-flash read firmware_backup.bin 0x08000000 0x100001
```
随后使用如下命令烧入系统:
```bash
st-flash write rtthread.bin 0x08000000
```
## 串口
除了USB之外我们还可以使用串口连接
```bash
sudo apt install picocom
picocom -b 115200 /dev/ttyACM0
```
可以使用``ctrl + A 然后 ctrl + x``退出。
## 使用Cmake
通过官方文档可以得知除了scons外还可以使用Cmake来编译.
首先找到编译器的路径并export我这里是Nixos的路径如果你使用其他发行版注意修改
```bash
which arm-none-eabi-gcc
/nix/store/v9p5md3d4aaqwc9i9hlaxkl7nawd9vrc-gcc-arm-embedded-14.3.rel1/bin/arm-none-eabi-gcc
export RTT_EXEC_PATH=/nix/store/v9p5md3d4aaqwc9i9hlaxkl7nawd9vrc-gcc-arm-embedded-14.3.rel1/bin
export RTT_CC=gcc
```
随后使用指令``scons --target=cmake``
```bash
scons --target=cmake
scons: Reading SConscript files ...
Newlib version:4.5.0
Update setting files for CMakeLists.txt...
Done!
scons: done reading SConscript files.
scons: Building targets ...
scons: building associated VariantDir targets: build
CC build/applications/main.o
LINK rt-thread.elf
arm-none-eabi-objcopy -O binary rt-thread.elf rtthread.bin
arm-none-eabi-size rt-thread.elf
scons: done building targets.
```
可以看到生成CmakeLists.txt成功随后开始构建
```bash
cd ./build
cmake ..
CMake Warning (dev) at CMakeLists.txt:43:
Syntax Warning in cmake code at column 100
Argument not separated from preceding token by whitespace.
This warning is for project developers. Use -Wno-dev to suppress it.
-- The C compiler identification is GNU 14.3.1
-- The CXX compiler identification is GNU 14.3.1
-- The ASM compiler identification is GNU
-- Found assembler: /nix/store/v9p5md3d4aaqwc9i9hlaxkl7nawd9vrc-gcc-arm-embedded-14.3.rel1/bin/arm-none-eabi-gcc
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /nix/store/v9p5md3d4aaqwc9i9hlaxkl7nawd9vrc-gcc-arm-embedded-14.3.rel1/bin/arm-none-eabi-gcc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /nix/store/v9p5md3d4aaqwc9i9hlaxkl7nawd9vrc-gcc-arm-embedded-14.3.rel1/bin/arm-none-eabi-g++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done (0.4s)
-- Generating done (0.0s)
-- Build files have been written to: /home/dich/Git/sdk-bsp-stm32f407-spark/projects/02_basic_ir/build
```
使用``make``命令编译:
```bash
make
[ 1%] Building C object CMakeFiles/rtthread.elf.dir/applications/main.c.obj
[ 2%] Building C object CMakeFiles/rtthread.elf.dir/home/dich/Git/sdk-bsp-stm32f407-spark/rt-thread/components/libc/compilers/common/cctype.c.obj
[ 3%] Building C object CMakeFiles/rtthread.elf.dir/home/dich/Git/sdk-bsp-stm32f407-spark/rt-thread/components/libc/compilers/common/cstdio.c.obj
......
[ 97%] Building C object CMakeFiles/rtthread.elf.dir/home/dich/Git/sdk-bsp-stm32f407-spark/libraries/STM32F4xx_HAL/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c.obj
[ 98%] Building C object CMakeFiles/rtthread.elf.dir/home/dich/Git/sdk-bsp-stm32f407-spark/libraries/STM32F4xx_HAL/CMSIS/Device/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c.obj
[100%] Linking C executable rtthread.elf
text data bss dec hex filename
98516 1468 8400 108384 1a760 rtthread.elf
[100%] Built target rtthread.elf
```
## 使用Renode
如果没有真实的开发版可以使用Renode来进行仿真模拟
```bash
# 启动renode
renode
# 创建机器
(monitor) mach create
# 加载STM32F407平台
(monitor) machine LoadPlatformDescription @platforms/boards/stm32f4_discovery.repl
# 加载你的固件
(monitor) sysbus LoadELF @/你的路径/rtthread.elf
# 打开串口窗口finsh会显示在这里
(monitor) showAnalyzer sysbus.usart1
# 启动仿真
(monitor) start
```
> Renode 常用命令大全
```bash
# 机器管理
mach add "名称" # 创建新机器(指定名称)
mach create # 创建新机器(自动命名)
mach set "名称" # 切换到指定机器
mach set 0 # 切换到编号0的机器
mach rem "名称" # 删除机器
mach clear # 清除当前选择
mach # 显示帮助信息
emulation # 查看仿真信息
# 仿真控制
start # 启动仿真
pause # 暂停仿真
quit # 退出Renode
# 帮助
help # 显示帮助
help 命令名 # 查看特定命令帮助
# 加载固件
sysbus LoadELF @/path/to/firmware.elf # 加载ELF文件
sysbus LoadBinary @/path/to/firmware.bin 0x8000000 # 加载BIN到指定地址
# 重置
sysbus Reset # 重置系统总线
machine Reset # 重置整个机器
# 读取内存
sysbus ReadByte 0x20000000 # 读1字节
sysbus ReadWord 0x20000000 # 读2字节
sysbus ReadDoubleWord 0x20000000 # 读4字节
# 写入内存
sysbus WriteByte 0x20000000 0xFF
sysbus WriteWord 0x20000000 0x1234
sysbus WriteDoubleWord 0x20000000 0x12345678
# 查看内存区域
sysbus FindSymbolAt 0x08000000 # 查找地址对应的符号
# 查看GPIO端口
sysbus.gpioPortA
# 设置GPIO状态
sysbus.gpioPortA.0 Set true # 设置PA0为高
sysbus.gpioPortA.0 Set false # 设置PA0为低
sysbus.gpioPortA.0 Toggle # 切换PA0状态
# 读取GPIO状态
sysbus.gpioPortA.0 State
# 使用GDB调试
(monitor) machine StartGdbServer 3333
# 另一个终端
arm-none-eabi-gdb firmware.elf
(gdb) target remote :3333
(gdb) load
(gdb) b main
(gdb) c
```
---
**Done.**

View File

@@ -0,0 +1,182 @@
+++
title = "Linux-Android开发环境部署"
date = 2025-11-20
[taxonomies]
tags = ["Linux"]
+++
前言 本文记录Android命令行开发环境在Linux上的部署用以替代Android-studio。
<!-- more -->
## Ubuntu方案
- 首先安装依赖包:
```bash
sudo apt install openjdk-17-jdk nodejs
```
- 安装Command-tools
```bash
mkdir -p ~/Android/cmdline-tools/latest
## 下载链接https://developer.android.com/studio?hl=zh-cn#command-tools
cd ~/Android/cmdline-tools/latest
wget https://dl.google.com/android/repository/commandlinetools-linux-13114758_latest.zip
unzip ./commandlinetools-linux-13114758_latest.zip
```
- 使用官方脚本安装Sdkman包管理器
```bash
curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"
```
- 随后使用Sdkman下载并安装gradle/kotlin
```bash
sdk install gradle
sdk install kotlin
```
- 设置环境变量:
```bash
export ANDROID_HOME=$HOME/Android
export PATH=$PATH:$ANDROID_HOME/emulator
export PATH=$PATH:$ANDROID_HOME/platform-tools
export PATH=$PATH:$ANDROID_HOME/cmdline-tools/latest/bin
export PATH=$PATH:$ANDROID_HOME/build-tools/34.0.0
source ~/.bashrc
```
- 继续下载一些SDK平台与构建工具
```bash
sdkmanager "platforms;android-34" "build-tools;34.0.0" "platform-tools"
sdkmanager "emulator" //虚拟机中调试
```
- 查看版本
```bash
(base) dich@uos:~$ sdk version
SDKMAN!
script: 5.20.0
native: 0.7.14 (linux x86_64)
(base) dich@uos:~$ gradle -v
------------------------------------------------------------
Gradle 8.10.2
------------------------------------------------------------
Build time: 2024-09-23 21:28:39 UTC
Revision: 415adb9e06a516c44b391edff552fd42139443f7
Kotlin: 1.9.24
Groovy: 3.0.22
Ant: Apache Ant(TM) version 1.10.14 compiled on August 16 2023
Launcher JVM: 17.0.16 (Ubuntu 17.0.16+8-Ubuntu-0ubuntu124.04.1)
Daemon JVM: /usr/lib/jvm/java-17-openjdk-amd64 (no JDK specified, using current Java home)
OS: Linux 6.14.0-35-generic amd64
(base) dich@uos:~/Git/android-templates$ kotlin -version
Kotlin version 1.6.21-release-334 (JRE 21.0.8+9-Ubuntu-0ubuntu124.04.1)
(base) dich@uos:~/Git/android-templates/template-compose$ kscript -v
Copyright : 2022 Holger Brandl
License : MIT
Version : v4.0.3
Website : https://github.com/holgerbrandl/kscript
A new version (v4.2.0) of kscript is available.
Kotlin : 2.1.10-release-473
Java : JRE 17.0.16+8
```
## Key方案
构建Release包需要密钥签名验证可以使用传统的环境变量配置或者使用密钥管理器.
### 相同部分
- 生成密钥
```bash
keytool -genkey -v \
-keystore ~/.android/jetlagged-release.keystore \
-alias jetlagged \
-keyalg RSA \
-keysize 2048 \
-validity 10000
```
- 修改app/build.gradle.kts
```java
signingConfigs {
create("release") {
storeFile = System.getenv("KEYSTORE_FILE")?.let { file(it) }
storePassword = System.getenv("KEYSTORE_PASSWORD")
keyAlias = System.getenv("KEY_ALIAS")
keyPassword = System.getenv("KEY_PASSWORD")
}
}
buildTypes {
release {
signingConfig = signingConfigs.getByName("release") // 添加这行
isMinifyEnabled = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
```
### 传统方法
- 创建配置文件
```bash
cat > ~/.android-signing-secrets << 'EOF'
export KEYSTORE_FILE="$HOME/.android/jetlagged-release.keystore"
export KEYSTORE_PASSWORD="你的keystore密码"
export KEY_ALIAS="jetlagged"
export KEY_PASSWORD="你的key密码"
EOF
# 设置权限
chmod 600 ~/.android-signing-secrets
# 添加到 gitignore (全局)
echo ".android-signing-secrets" >> ~/.gitignore_global
```
- flake配置
```bash
# Auto load Key
if [ -f "$HOME/.android-signing-secrets" ]; then
source "$HOME/.android-signing-secrets"
echo "KeyOK"
fi
```
### 现代方法
- 安装libsecret包
- keepassxc新建Android群组添加条目``android_key_password``和``android_keystore_password``
- 设置密码,和上面生成的相同;
- 在条目的高级-属性中添加``name/android_key_password``和``name/android_keystore_password``
- 打开设置-保密服务集成公开Android文件夹
- flake中写
```bash
# Release Key
export KEYSTORE_FILE="$HOME/.android/jetlagged-release.keystore"
export KEY_ALIAS="jetlagged"
export KEYSTORE_PASSWORD="$(secret-tool lookup name android_keystore_password)"
export KEY_PASSWORD="$(secret-tool lookup name android_key_password)"
```
---
**Done.**

View File

@@ -10,67 +10,3 @@ path = "about"
> 一个人应该能够给孩子换尿布、计划一次侵略行动、杀猪、驾驶飞船、设计建筑物、写诗、做会计账目、砌墙、接合断骨、照顾临终的人、执行命令、下达命令、与人合作、独立行动、解方程式、分析一个新问题、施肥、编程、做一餐美味的饭、高效地战斗、勇敢地死去。专业化是为昆虫准备的。 ——*罗伯特·海因莱恩* > 一个人应该能够给孩子换尿布、计划一次侵略行动、杀猪、驾驶飞船、设计建筑物、写诗、做会计账目、砌墙、接合断骨、照顾临终的人、执行命令、下达命令、与人合作、独立行动、解方程式、分析一个新问题、施肥、编程、做一餐美味的饭、高效地战斗、勇敢地死去。专业化是为昆虫准备的。 ——*罗伯特·海因莱恩*
有事请联系 admin@dich.bid 有事请联系 admin@dich.bid
GPG公钥:
```
-----BEGIN PGP PUBLIC KEY BLOCK-----
mDMEaFD4ERYJKwYBBAHaRw8BAQdAWahrrdkEPyUXuYxI72vuu10wdzoUflXwgoOP
W5BDNwy0F2RpY2ggPGJyY2VmeUBnbWFpbC5jb20+iJYEExYKAD4WIQQLzPfdBMio
WbXLx6aN3u4/oWJWBAUCaFD4EQIbAwUJAeEzgAULCQgHAgYVCgkICwIEFgIDAQIe
AQIXgAAKCRCN3u4/oWJWBJyIAP9pDBde2tEdppRHn+Qk8tYIsdJHmEdbSiWBRGgq
oEtqZwD/SlTXOKC8XFBHhXfDQe6HKKfcmOHzI7tCAbEvYzXNPwW4OARoUPgREgor
BgEEAZdVAQUBAQdAtId5jz2fnDkGUz2b4Y7wqI4yDAgeJgKlmEdxMMVEjgcDAQgH
iH4EGBYKACYWIQQLzPfdBMioWbXLx6aN3u4/oWJWBAUCaFD4EQIbDAUJAeEzgAAK
CRCN3u4/oWJWBPrHAQCtfO5kC5XEEcJUCM7hKjC1OMzqE2qlBS3te2rZT3KH0wD/
dr+m3w+D4q5y5uy1sny6BW6QjjdrQP+ZWUjA3na0jgqZAg0EWpElGwEQAMkauPYV
lZPeaWC0AUxQJ7EPFVBcuAEnYZ9eXoPvlo74DIuqODCmaj90uBfyhkKcFj4c63WZ
9eFL5JpJxz7BuIMjLbaaVI1eFE9EvBXW0cUeu86WNu8Jbtn5CxtfyokqtYXmP6AP
hj1p8hdic//hRXs3eLeeNe1YZRW6i8cLM1WCkbWjzKvg91JX4hKXDPExwgGwoqDi
ZqrvkyQ4kY0oddzwoQ9Lb1U4oXWzE4g34o46hUaLgNW1iZ/zYJNT3EUb74bAzxvE
nwsVrueNsS8wuYOWckD2WKt7KjHJxg4uo+MjSUdPf5+qgN68+n91qKstSz3lZq25
1q5HUL2jnyeCTMBl8BY9O/+qdDrm2dXNaPSfRCk0jPKxcyi0YydhrEgzDX9wW2Ha
dDyGIUwSKxvwdzjE/quE+d3WUWv51oTrYZmHm9YhXki37AFqCcz+7qECvNTvyvih
tQ86x+TUwZmlWwusPoZJNEOOi/9Popvd+ys7uBiCKae7wAAtlrdMXLBwOLMpis+z
HkfHN41ZpjwnbPSq7hM7NwhHTBA+8TxNTgu4piZadHf2Qvw0ofme5+ipkcueufdf
ocj9rXGZ7D3cxVgCK2c7QpUV+gVcY29hqNAiY7Eh+ldgxHt/o6vTiauYjPpjlyh4
31TEv8kQapqcgtC6JL6LKeZiyqb7+5YTt7rbABEBAAG0REZyYW5jaXMgQmFueWlr
d2EgKEEga2V5IGZvciBzaWduaW5nIHBhY2thZ2VzKSA8YmFueWlrd2FmYkBnbWFp
bC5jb20+iQI3BBMBCAAhBQJakSUbAhsDBQsJCAcDBRUKCQgLBRYCAwEAAh4BAheA
AAoJEBbi4azG9RJCoasQAMkL3AcIinDXec8/9Tg4MFMKd0/owT9arC0K8UP7yu2S
/H+G+uYm8lsnjCv2Nlsll8fo2P+QuIsIg4ec7qb6Ng/ZAXvKwILMHsULLcYY1Jv5
n5k5+DnItUehUSSKTn1haOvL0+3u48PzcCmVHVMsECnW6sUuUnVPE+gtuvwChKWV
92jLfWkk+jl7FxxCv0b20COCX0MRtIO1Im7oqSgTLQLzKQiK2NxsNmciMBmWhzZm
X/64eZeidS3VRYmWd0rUdFCXwTDgXeHOwYmlI9la7hmqi1k5i2ILFW2XE4m5+Jtv
5VIIa1rSB6iOVpsIKb0wFwJhye8ak2ZCQfRLL3Fhwt8M+qri0V9X6EJpa7U6uMUL
qWl3N6Tt7DMbTFAFfxeykRSzEENGWF3PcyC/KGakuQGhsNJcUInXUhjKKHyUPRpo
udV14RZoSzLEBepjowUCulRGJ6VIcDpmmCMKmlOBMiErtqyBeLJZ3L6DGgW059bW
FxPZeyauoO86mZ3eA2WRrm7B1jb/1gCg8IneqOIVp9Vt5yLmfZ5ZrM5m3L/Id7Zs
dAU0ATYv2YIh3tZWfgG7SKIlv7eBj7Ytwl4ELLHRgyE0mewZen5qxcACxCax6rJw
aM+jgmnSlyWpt1JuQJBNIdV6UCi3G7fkfQBAmFftF1ZgYTx9/6fiB2bvr3DQkn57
uQINBFqRJRsBEACt+JgM+FRqK5EDUZEhP0huTAzMdZITBjtDbCNs2UakAVJS8l4C
P9pulv+E01yAj+ecw++Ke/tKeeUOjzezGihRhpwAstPiquNodkE9MLftkyu9lkIN
Xvzt6t6fLdIJzE+kB0x8gMphSq0Wp7qjWxDXCyr0SMYD8wLttYIjFogG5YRsQ/j6
PV+hRexZ+P8l2UoWvtbxDCbNrDLUMEYjK6CZjtXn8qNLzPFSOVNjqZpIm9/BlWZZ
0WbtpSmzdVL23aGt968RueqcRdqy9+lvw7U8tOUOmjP9zKRN0IADdw0WphYEBfWa
hxeKmJk+nFR6g3TPQ86xdL3VZsPtqSdVO6O5CdqcVFVyoaebsTZlw/Qz1/6Sy3gJ
83IezA8kJItk6ZRMiHNVM5+x/z8feFVjnDz+DG3px09vZ/YOi4GF1d0G/dnCf2DF
l4dH6+Va34KfCwYjnkFPtd8Wj4M8H62UMJrCg81eEcGtlFtKBtkHv8VMRl6I/cYH
p1uq3eNCy5G7IrIlYyG1zc6xuDun0PZChnkwNWjylfdk0XFGTtASC9WjIjIBD364
ns/p4j7gJYx5RZspCfytPzjpUtP0N5wEMLoz3KbQsbxAuDxkijV7s1xVrApxk2xG
rdMeWM5KpbAwlos9yDlb4YYbUrOR+CPBYPTbrQ55wcePV4gOnEmoyrdkYwARAQAB
iQIfBBgBCAAJBQJakSUbAhsMAAoJEBbi4azG9RJCaEsQAJJB2BXMks73ETSdvIPn
R9eRFIpXmaYnGOBQnvz+lSlQ+etcjmXbWw8YxKohdeIfuydV1Fug/I/WmlzDDH8B
1R26Vs0Czr2P64iNJVIhrdjvfPK5fdJXKwSchiJ1SEWahsXXXyQXqOZwMkGMxxFd
diH4OVsY5q9cM21gXup4WBezFPMtaUvu35QKbwgKntgdJJv/JSc8rWHZQS8p/820
v8UWxxxbgprbtTvmwMakr70u4FtORWic1UTJ9sCsD4Yw6CbvLyMV8z5vAQhi+lND
qIzRXEXTfYnZaQ6ddCuTMGF2K1+CyS7/7FA0YwxrjhlxE0XwOgvpvJS/tmK0fB4J
IvDXgCW/ym2xvGVwLTNu/apeon0Skli4sokl2yVnUMRKGCz7ApjhrNo1kikHKGJw
8jv6tCTIyJtGobmTaIZGg2N3Owd7QhoBbR80LIFFaAlWgFv2XnLes8wF1xVNmjMI
jsKO+itYmntg/GPep6hOcFnU/JrsSiVTvmHlpTHqK7q1cZTDV/G5W739m4z00hgw
zXHD2OOP/LPGEtQWOg+g8g3+KNQzLHZqQO5UScTG2fL99FaXNDv3BZt4e4liGD01
5oRRZTFV4YPmXVB1x23FhkRQN2Jnt76x9t8QcwKcXWBUOUZg9uJUkIgipxxPEPSC
NS+riEdhXHgqG76f+wRnkDOK
=2r/G
-----END PGP PUBLIC KEY BLOCK-----
```

View File

@@ -2,8 +2,7 @@
title = "谈天说地:狄奇周刊(二十)" title = "谈天说地:狄奇周刊(二十)"
date = 2025-01-25 date = 2025-01-25
[taxonomies]
tags = ["谈天说地"]
+++ +++
前言 这里是Dich的周刊,通过博客的形式讲述每周互联网形势,以及分享一些文章。 前言 这里是Dich的周刊,通过博客的形式讲述每周互联网形势,以及分享一些文章。

View File

@@ -2,8 +2,7 @@
title = "谈天说地:狄奇周刊(二一)" title = "谈天说地:狄奇周刊(二一)"
date = 2025-02-04 date = 2025-02-04
[taxonomies]
tags = ["谈天说地"]
+++ +++
前言 这里是Dich的周刊,通过博客的形式讲述每周互联网形势,以及分享一些文章。 前言 这里是Dich的周刊,通过博客的形式讲述每周互联网形势,以及分享一些文章。
@@ -71,4 +70,4 @@ AI圈大V Yuchen Jin认为DeepSeek-R1 论文中的这个“顿悟时刻”意
[SamWaf开源轻量级网站防火墙完全私有化部署](https://github.com/samwafgo/SamWaf) [SamWaf开源轻量级网站防火墙完全私有化部署](https://github.com/samwafgo/SamWaf)
[在PDF里运行Linux利用RISC-V模拟器将Linux系统嵌入PDF文件基于TinyEMU支持32位和64位系统](https://github.com/ading2210/linuxpdf) [在PDF里运行Linux利用RISC-V模拟器将Linux系统嵌入PDF文件基于TinyEMU支持32位和64位系统](https://github.com/ading2210/linuxpdf)

View File

@@ -0,0 +1,229 @@
+++
title = "Windows系列(1):系统安装与设置"
date = 2024-05-24
[taxonomies]
tags = ["Windows"]
+++
前言 由于厂商默认安装windows家庭版导致各种问题频发,这里对 widnows 安装做一个总结以及附上我个人的windows配置。
<!-- more -->
## 总纲
安装Windows有两种情况:1.在一台全新的电脑上安装2.想为现有的系统更换版本。本文主要介绍这两种情况。如果只想对现有的系统进行优化,推荐看下一篇的``"Windows系列(2):常用操作与配置"``.
**全新安装**
- 获得一个Windows的ISO镜像
- 制作外部启动盘;
- 做好环境准备,备份数据;
- 引导外部启动盘安装系统;
- 激活系统;
- 进行安装后设置与优化;
**为现有系统更换版本**
- 做好环境准备,备份数据;
- 方法一获得ISO镜像并选择从``本地升级``或``外部升级``
- 方法二:在设置中填写预安装密钥并切换系统;
- 激活系统;
- 进行安装后设置与优化;
**PS:**
> ``本地升级``:即为不需要外部启动盘,不动你的任何东西的无损安装;但需要一些前提条件;
> ``外部升级``即为外部启动盘安装系统可以格式化全盘全新安装也可以保留数据安装会将你的的数据放在C盘的``windows.old``文件夹。
> 数据安全不管是本地还是外部升级除非你格式化全盘重新安装否则安装只会动C盘其他分区的数据(如D盘等)不会触碰,可放心;
## 获取ISO镜像
不管你是哪一种情况都推荐你先下载ISO镜像因为ISO镜像方法是最通用,最常用的。
- 官方镜像:从[微软官网](https://www.microsoft.com/en-us/software-download/windows11)下载镜像或[MAS镜像站](https://massgrave.dev/genuine-installation-media)下载。
- Dichos镜像是笔者个人制作的镜像参考[乱七八糟:Windows封装与全自动安装](https://blog.dich.bid/windows-4-auto/)
**PS:**
> 镜像大小从1G~8G左右不等因为有的不知道哪来的镜像里面版本不全我们要下载的是包括所有主流版本的ISO即为里面包括家庭版教育版专业版等等。如果你从其他地方下载ISO镜像里面可能会捆绑流氓软件甚至有病毒。
> 我们要使用的是``23H2专业工作站版本``性能最强功能最全面适合日常使用和开发笔记本自带的往往是24H2家庭中文版bug多功能少不建议使用。
> 以上说的是功能版本,还有大版本的区别,目前暂时用不上,详细可以看本系列第三篇``Windows系列(3):分类与激活``.
## 制作启动盘
在远古年代你可能看过电脑城老板使用Ghost安装系统近一点的使用诸如“大白菜”“老毛桃”以及各种PE安装系统这是比较旧式的方法。
本文推荐使用Ventoy启动盘+windows镜像的方法安装Windows好处在于
- Ventoy开源
- 不必每次安装都格式化U盘比如刷了某某PE整个盘就不能放数据刷其他系统前需要格式化
- 兼容性好可以放各种ISO到里面并直接启动包括Windows/Linux等等
- 其他详见[乱七八糟:Ventoy战斗盘部署](https://blog.dich.bid/about-ventoy/)
### 制作流程
- 首先``在官网下载``[Ventoy](https://www.ventoy.net/cn/download.html)
- 随后在``language``中改为中文显示,可以看到左上角有``配置选项``
- 将分区类型设置为``GPT``,开启安全启动支持;
- 将``分区格式``设置为NTFS
- 随后在``分区设置``中进行分区,选择在``磁盘后保留一段空间``,这里的空间将不被分区,即为空闲空间,可以稍后建立分区当作普通的文件存储盘;
- Ventoy分区则会使用``U盘总容量-保留空间-ventoy保留分区``的空间新建一个盘,这里可以放``ISO、WIM、IMG、VHD(x)、EFI``等等
- 随后``选择磁盘``并开始安装,过一会儿即可安装完成。
- 安装完成后可以看到一个新分区把我们的ISO镜像放在里面即可。
- 随后下载[HotPE](https://github.com/VirtualHotBar/HotPEToolBox),也放在里面。
## 环境准备&数据备份
不管你使用哪种方法都建议做好这一步骤:
- 关闭Bitlocker(防止磁盘访问受阻)
- 关闭安全启动;(防止本地升级失败)
- 关闭Intel VMD(如果有)(防止磁盘识别不到)
- 确保C盘有足够的空间(9GB+);
- 备份好数据以防万一,以及如果原厂系统有驱动安装包也备份起来。
`关闭Bitclocker`:打开设置,进入隐私与安全→ 设备加密,将其状态切换为关闭。系统会弹窗提示确认,点击关闭,系统将开始解密。解密过程中需要比较久的时间,解密完成后即可成功。
`关闭安全启动和Intel VMD`:查找你的笔记本的BIOS 进入键一般为F2在开机的时候一直按按按BIOS 进入键,即可进入BIOS/UEFI。在其中查找安全启动(Secure Boot)和Intel VMD(如果有)并将它们关闭(disable),随后按保存退出键(一般为F10或F12)。
`确保C盘有足够的空间`:重新进入BIOS在其中的引导选项中选择USB设备(你的启动盘的设备名)将其调到第一个然后保存退出重新启动这时候就会进入Ventoy的界面可以看到我们放进去的两个ISO我们直接选择HotPE进入并使用里面的Diskgenius把其他盘的空间分给C盘一点点使其有至少9GB可以使用。
## 安装系统
- 全新安装进入BIOS选择Ventoy启动并选择Windows的ISO镜像一路安装过去
- 更换版本外部升级同上记得选择保留当前数据会保留C盘旧数据到Windows.old文件夹
- 更换版本本地升级不用进BIOS直接在文件管理器中打开ISO镜像并点击setup.exe,同样选择保留数据;
- 更换版本预安装密钥:获得一个专业工作站版本的预安装密钥并在设置里面切换密钥,直接升级系统;
**PS:**
> 无论你用什么方法都建议先备份好数据!!!
> 无损升级是有前提条件的!!!除了前面说的环境准备还需要ISO镜像比原来的系统更新比如23H2的镜像往往就不能无损更新24H2的系统只能选择外部升级
> 如果你选择预安装密钥的方法往往比较容易无损升级但这样就不能使用Dichos的优化需要手动优化。
## 激活系统
如果你没有购买正版Windows上文安装的系统可以使用[MAS脚本](https://github.com/massgravel/Microsoft-Activation-Scripts)或者[HEU_KMS工具](https://github.com/zbezj/HEU_KMS_Activator)来激活.
## 安装后优化
> 如果你使用Dichos,可以直接跳到**三.驱动级**开始.
#### **一.设备级:**
- 关闭 BIOS 安全启动,快速启动
- 解锁 BitLocker
- 删除 OEM 分区,恢复简洁的设备分区
#### **二.系统级:**
- 家庭版升级为专业工作站版
- 将用户名改为非中文
- 退出云端账号,杀死家庭组策略
- 激活 Windows 与 MS office
- 停止自动更新并恢复单级菜单
> 常用的优化软件:
- [Dism++](https://github.com/Chuyu-Team/Dism-Multi-language)
- [Winutil](https://github.com/ChrisTitusTech/winutil)
- [Optimizer](https://github.com/hellzerg/optimizer)
#### **三.驱动级:**
驱动的安装没有集成在Dichos中而是作为手动安装的一部分避免出错。如自带系统有驱动包先进系统拿出然后再安装新系统一般来说包括:
- 主板驱动和CPU驱动
- 显卡驱动(独显/核显);
- Wifi网卡驱动和蓝牙驱动
- 声卡驱动;
- 硬盘驱动(较少见);
- Fn快捷键驱动厂商自带
- 笔记本自带的其他某某中心/管家(不建议使用)
而根据来源,又可以分为``公版/通用驱动``和``笔记本厂商特调/专用驱动``,一般而言装公版驱动即可,保持通用性;如果你是重度游戏玩家则可以考虑特调驱动。
**常用驱动下载网站**
| 分类 | 名称 | 下载 |
|--------|----------|------|
| 综合 | 驱动天空 | [链接](https://www.drvsky.com/) |
| 厂商 | 吾空 | [链接](http://www.wooking.com.cn/drives) |
| 厂商 | 华硕 | [链接](https://www.asus.com.cn/support/download-center/) |
| 厂商 | 联想 | [链接](https://newsupport.lenovo.com.cn/driveDownloads_index.html) |
| 三大件 | AMD | [链接](https://www.amd.com/en/support/download/drivers.html) |
| 三大件 | Intel | [链接](https://www.intel.cn/content/www/cn/zh/support/detect.html) |
| 三大件 | NVIDIA | [链接](https://www.nvidia.cn/geforce/drivers/) |
#### **四.软件级:**
- 删除自带牛马以及不必要的管家类软件.
``使用开源软件!``
- **AI**: [GPT4All](https://github.com/nomic-ai/gpt4all)
- **截图**: [ShareX](https://github.com/ShareX/ShareX)
- **绘画**: [Krita](https://github.com/KDE/krita)
- **办公**: [Microsoft Office](https://github.com/YerongAI/Office-Tool)
- **PDF**: [Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF)
- **游戏**: [Steam](https://store.steampowered.com/)
- **抓包**: [Wireshark](https://www.wireshark.org/download.html)
- **启动器**: [Flow.Launcher](https://github.com/Flow-Launcher/Flow.Launcher)
- **输入法**: [Rime](https://rime.im/download/)
- **浏览器**: [Floorp](https://github.com/Floorp-Projects/Floorp) / [Chrome](https://www.google.com/chrome/)
- **编辑器**: [VSCodium](https://github.com/VSCodium/vscodium)
- **虚拟机**: HyperV
- **科学上网**: [GFS](https://github.com/GUI-for-Cores/GUI.for.SingBox)
- **书籍阅读**: [Readest](https://github.com/readest/readest)
- **内网互传**: [LocalSend](https://github.com/localsend/localsend)
- **文件同步**: [Syncthing](https://github.com/syncthing/syncthing)
- **屏幕录制**: [OBS Studio](https://github.com/obsproject/obs-studio)
- **手机投屏**: [QtScrcpy](https://github.com/barry-ran/QtScrcpy)
- **包管理**: [UniGetUI](https://github.com/marticliment/UniGetUI)
- **软件卸载**: [Geek Uninstaller](https://geekuninstaller.com/download)
- **显示器亮度**: [Twinkle Tray](https://github.com/xanderfrangos/twinkle-tray)
- **系统工具**: [Dism++](https://github.com/Chuyu-Team/Dism-Multi-language) / [NTLite](https://www.ntlite.com/)
- **综合工具**: [图吧工具箱](https://www.tbtool.cn/)
- **文件搜索**: [Everything](https://www.voidtools.com/zh-cn/)
- **磁盘工具**: [DiskGenius](https://www.diskgenius.cn/)
- **密码管理器**: [KeePassXC](https://github.com/keepassxreboot/keepassxc)
- **终端/SSH**: [Electerm](https://github.com/electerm/electerm)
> Rime输入法在Windows端叫小狼毫输入方案用的是[雾凇拼音](https://github.com/iDvel/rime-ice?tab=readme-ov-file) ,在``获取更多输入方案``中命令行输入``iDvel/rime-ice:others/recipes/full``安装。
#### **五.设置级**
- 设置简洁高效的浏览器
- 优化桌面布局与任务栏布局
- 关闭不必要的开机自启软件
- 关闭 Windows Defender 等烦人的通知
#### **六.测试级(可选)**
- 查看PC型号与配置是否相同
- 屏幕坏点/喇叭/蓝牙检测
- 查看硬盘健康度与使用时间
- AIDA64稳定性测试/Diskinfo硬盘测试
- 单烤/双烤机测试
- 网络测速
**常用测试软件**
[CPU-Z](https://www.cpuid.com/softwares/cpu-z.html)
[GPU-Z](https://www.techpowerup.com/download/)
[AIDA64](https://www.aida64.com/downloads)
[Diskinfo](https://crystalmark.info/en/)
[Furmark](https://www.geeks3d.com/furmark/)
[Afterburner](https://www.msi.com/Landing/afterburner/graphics-cards)
---
**Done.**

View File

@@ -1,24 +1,23 @@
+++ +++
title = "乱七八糟:Windows常用操作" title = "Windows系列(2):常用操作与配置"
date = 2024-05-24 date = 2024-05-25
[taxonomies] [taxonomies]
tags = ["乱七八糟","Windows"] tags = ["Windows"]
+++ +++
前言 Windows操作系统作为全球最为普及的桌面操作系统之一其用户界面的设计非常经典但存在许多不足之处本篇记录一些常用脚本。 前言 Windows操作系统作为全球最为普及的桌面操作系统之一其用户界面的设计非常经典但存在许多不足之处本篇记录一些常用脚本。
<!-- more --> <!-- more -->
## **Windows11跳过联网激活 & 使用本地账号** ## **Windows11跳过联网激活 & 使用本地账号**
开机之前先断网然后输入Shift+F10会弹出命令行界面并输入 开机之前先断网然后输入Shift+F10会弹出命令行界面并输入
`` ``bash
oobe\BypassNRO.cmd oobe\BypassNRO.cmd
`` ``
回车之后会重启,之后就可以跳过联网了,选择 回车之后会重启,之后就可以跳过联网了,选择
`` ``bash
I don't have internet I don't have internet
`` ``
即可。 即可。
@@ -37,7 +36,7 @@ I don't have internet
## 激活windows ## 激活windows
这里使用MAS的脚本: 这里使用MAS的脚本:
``` ```bash
irm https://get.activated.win | iex irm https://get.activated.win | iex
``` ```
@@ -49,7 +48,7 @@ irm https://get.activated.win | iex
3.然后就可以使用脚本彻底关闭更新:将以下命令保存为.bat文件运行即可。 3.然后就可以使用脚本彻底关闭更新:将以下命令保存为.bat文件运行即可。
``` ```bat
::Windows auomatic updates ::Windows auomatic updates
reg add HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU /v AutoInstallMinorUpdates /t REG_DWORD /d 1 /f reg add HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU /v AutoInstallMinorUpdates /t REG_DWORD /d 1 /f
reg add HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU /v NoAutoUpdate /t REG_DWORD /d 1 /f reg add HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU /v NoAutoUpdate /t REG_DWORD /d 1 /f
@@ -72,7 +71,7 @@ reg add HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings /v Pause
reg add HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings /v PauseQualityUpdatesEndTime /t REG_SZ /d "2100-01-01T00:00:00Z" /f reg add HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings /v PauseQualityUpdatesEndTime /t REG_SZ /d "2100-01-01T00:00:00Z" /f
``` ```
如果要恢复更新,使用以下命令,同样保存为.bat运行 如果要恢复更新,使用以下命令,同样保存为.bat运行
``` ```bat
::Windows auomatic updates ::Windows auomatic updates
reg add HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU /v AutoInstallMinorUpdates /t REG_DWORD /d 0 /f reg add HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU /v AutoInstallMinorUpdates /t REG_DWORD /d 0 /f
reg add HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU /v NoAutoUpdate /t REG_DWORD /d 0 /f reg add HKLM\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU /v NoAutoUpdate /t REG_DWORD /d 0 /f
@@ -104,17 +103,17 @@ Win11的`显示更多选项`的二级菜单过于繁琐,怎么设置才能将
**步骤2.** 输入以下命令并按**Enter**键执行。 **步骤2.** 输入以下命令并按**Enter**键执行。
``` ```bash
reg add HKCU\Software\Classes\CLSID{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32 /ve /d “” /f reg add HKCU\Software\Classes\CLSID{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32 /ve /d “” /f
``` ```
或者 或者
``` ```bash
reg add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /f /ve reg add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /f /ve
taskkill /f /im explorer.exe taskkill /f /im explorer.exe
start explorer.exe start explorer.exe
``` ```
如果想要重新打开Win11新样式的右键菜单的话以同样的方式在命令提示符中执行此命令 如果想要重新打开Win11新样式的右键菜单的话以同样的方式在命令提示符中执行此命令
``` ```bash
reg delete "HKCU\Software\Classes\CLSID{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}" /f reg delete "HKCU\Software\Classes\CLSID{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}" /f
``` ```
## Win11关闭 Windows Defender ## Win11关闭 Windows Defender
@@ -129,6 +128,8 @@ HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows Defender
- 将名为``DisableAntiSpyware``的 DWORD (32位) 值设置为1如果没有就新建。 - 将名为``DisableAntiSpyware``的 DWORD (32位) 值设置为1如果没有就新建。
- 重启后生效。 - 重启后生效。
> 也可以使用[defendnot](https://github.com/es3n1n/defendnot)
## **Win11添加开机自启动项方法** ## **Win11添加开机自启动项方法**
选择“开始”按钮 ,然后滚动查找你希望在启动时运行的应用。 选择“开始”按钮 ,然后滚动查找你希望在启动时运行的应用。
@@ -150,7 +151,7 @@ pool.ntp.org一个公共的 NTP 时间服务器池)
应用更改:点击 "更新现在",然后 "确定" 保存设置。 应用更改:点击 "更新现在",然后 "确定" 保存设置。
- 如果有linux/win双系统可以让 Windows 使用 UTC 作为硬件时钟时间: - 如果有linux/win双系统可以让 Windows 使用 UTC 作为硬件时钟时间:
``` ```bash
# 在 Windows 中以管理员权限运行命令提示符,执行: # 在 Windows 中以管理员权限运行命令提示符,执行:
reg add "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TimeZoneInformation" /v RealTimeIsUniversal /t REG_DWORD /d 1 /f reg add "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TimeZoneInformation" /v RealTimeIsUniversal /t REG_DWORD /d 1 /f
``` ```
@@ -158,11 +159,11 @@ reg add "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TimeZoneInformation
## 调整网络优先级 ## 调整网络优先级
- 查看当前优先级PowerShell/管理员) - 查看当前优先级PowerShell/管理员)
``` ```bash
Get-NetIPInterface Get-NetIPInterface
``` ```
你会看到类似: 你会看到类似:
``` ```bash
IfIndex InterfaceMetric InterfaceAlias IfIndex InterfaceMetric InterfaceAlias
------- -------------- -------------- ------- -------------- --------------
15 25 Wi-Fi 15 25 Wi-Fi
@@ -173,15 +174,15 @@ IfIndex InterfaceMetric InterfaceAlias
- 修改网络优先级 - 修改网络优先级
将有线网络(以太网) 设为更高优先级(值更小): 将有线网络(以太网) 设为更高优先级(值更小):
``` ```bash
Set-NetIPInterface -InterfaceIndex 3 -InterfaceMetric 10 Set-NetIPInterface -InterfaceIndex 3 -InterfaceMetric 10
``` ```
- 将 WiFi 设为更低优先级: - 将 WiFi 设为更低优先级:
``` ```bash
Set-NetIPInterface -InterfaceIndex 15 -InterfaceMetric 25 Set-NetIPInterface -InterfaceIndex 15 -InterfaceMetric 25
``` ```
- 重启网络 - 重启网络
``` ```bash
Restart-NetAdapter -Name "以太网" Restart-NetAdapter -Name "以太网"
``` ```
这样当网线插入时Windows 会优先使用有线网络;断开网线后,自动切换到 WiFi。 这样当网线插入时Windows 会优先使用有线网络;断开网线后,自动切换到 WiFi。
@@ -190,7 +191,7 @@ Restart-NetAdapter -Name "以太网"
- 如需永久设置,可修改注册表: - 如需永久设置,可修改注册表:
Win + R 输入 regedit 打开注册表编辑器,进入路径: Win + R 输入 regedit 打开注册表编辑器,进入路径:
``` ```bash
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces
``` ```
在 Interfaces 里找到你的有线网卡和无线网卡(可以根据 IP 或 MAC 地址确认)。 在 Interfaces 里找到你的有线网卡和无线网卡(可以根据 IP 或 MAC 地址确认)。
@@ -206,7 +207,7 @@ HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces
> 保存为.bat格式 > 保存为.bat格式
``` ```bat
@echo off @echo off
REM 清理代理设置 REM 清理代理设置
REG DELETE "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyEnable /f REG DELETE "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyEnable /f
@@ -218,7 +219,7 @@ echo 代理设置已清除
> 保存为.reg格式 > 保存为.reg格式
开启3D加速 开启3D加速
``` ```bat
Windows Registry Editor Version 5.00 Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DirectDraw] [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DirectDraw]
"EmulationOnly"=dword:00000000 "EmulationOnly"=dword:00000000
@@ -231,7 +232,7 @@ Windows Registry Editor Version 5.00
``` ```
关闭3D加速 关闭3D加速
``` ```bat
Windows Registry Editor Version 5.00 Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DirectDraw] [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DirectDraw]
"EmulationOnly"=dword:00000001 "EmulationOnly"=dword:00000001

View File

@@ -1,9 +1,9 @@
+++ +++
title = "乱七八糟:Windows激活那些事" title = "Windows系列(3):分类与激活"
date = 2024-05-25 date = 2024-05-26
[taxonomies] [taxonomies]
tags = ["乱七八糟","Windows"] tags = ["Windows"]
+++ +++
前言 Windows的正版售价十分昂贵2025年的今天大部分人都使用着OEM厂商自带的windows系统或自己想办法激活那么激活到底是什么原理 前言 Windows的正版售价十分昂贵2025年的今天大部分人都使用着OEM厂商自带的windows系统或自己想办法激活那么激活到底是什么原理
@@ -30,6 +30,18 @@ tags = ["乱七八糟","Windows"]
- 批量版VOLVolume Licensing for Organizations企业批量购买提供了方便大量激活的方案 - 批量版VOLVolume Licensing for Organizations企业批量购买提供了方便大量激活的方案
- 厂商版OEMOriginal Equipment Manufacturer随电脑整机附赠主板BIOS内嵌激活信息 - 厂商版OEMOriginal Equipment Manufacturer随电脑整机附赠主板BIOS内嵌激活信息
**大版本分类**
| 分类 | 消费者版Consumer | 商务版Business | 物联网版IoT | 长期服务版LTSC |
|------------------|--------------------------------------------------|---------------------------------------------------|---------------------------------------------------|-----------------------------------------------------|
| **目标用户** | 家庭用户、个人消费者 | 企业、机构、教育用户 | 嵌入式设备、工业控制、POS、医疗设备等 | 关键任务系统、长期稳定运行的设备 |
| **主要版本** | Windows Home、Home Single Language、Education | Windows Professional、Enterprise、Education | Windows IoT Core、IoT Enterprise、IoT Enterprise LTSC | Windows Enterprise LTSC、IoT Enterprise LTSC |
| **预装应用** | 包含 Microsoft Store、娱乐和社交类应用 | 精简部分消费类应用,保留企业管理工具 | 极度精简,移除大部分消费类应用 | 移除 Microsoft Store、Cortana 等非必要功能 |
| **更新策略** | 定期推送功能和安全更新 | 可由企业控制更新策略,支持延迟功能更新 | 可选择常规更新或 LTSC 版本,更新策略灵活 | 仅推送安全补丁和关键修复,无新功能更新 |
| **支持周期** | 通常为 18 个月 | 通常为 1830 个月,取决于版本和配置 | IoT Enterprise LTSC 支持周期可达 1015 年 | 通常为 5 年主流支持 + 5 年扩展支持,共 10 年 |
| **授权方式** | 零售授权,需在线激活 | 批量许可Volume Licensing、OEM 授权 | OEM 授权,适用于特定硬件设备 | 批量许可,适用于特定行业和关键任务设备 |
| **适用场景** | 日常办公、娱乐、学习 | 企业办公、教育机构、专业工作站 | 工业自动化、零售终端、医疗设备等嵌入式系统 | 医疗设备、金融终端、工业控制系统等需长期稳定运行的环境 |
--- ---
## **二.激活方法和原理** ## **二.激活方法和原理**

View File

@@ -1,9 +1,9 @@
+++ +++
title = "乱七八糟:Windows封装与全自动安装" title = "Windows系列(4):封装与全自动安装"
date = 2024-05-29 date = 2024-05-29
[taxonomies] [taxonomies]
tags = ["乱七八糟","Windows"] tags = ["Windows"]
+++ +++
前言 由于厂商默认安装windows家庭版导致各种问题频发,这里作者封装了一个开箱即用的全自动安装激活和优化的Windows11镜像。 前言 由于厂商默认安装windows家庭版导致各种问题频发,这里作者封装了一个开箱即用的全自动安装激活和优化的Windows11镜像。
@@ -11,30 +11,35 @@ tags = ["乱七八糟","Windows"]
**Dich-OS base on zh-cn_windows_11_business_23h2** **Dich-OS base on zh-cn_windows_11_business_23h2**
**实现了以下功能**: ### 实现了以下功能
### 安装过程中
- [x] 绕过 Windows 11 要求检查(TPM/安全启动等) - [x] 绕过 Windows 11 要求检查(TPM/安全启动等)
- [x] 允许在没有互联网连接的情况下安装 Windows 11 - [x] 允许在没有互联网连接的情况下安装 Windows 11
- [x] 随机生成的计算机名称,例如:DESKTOP-ZFAH8Z2 - [x] 在安装过程中以交互方式添加本地用户,无需注册云端账户
- [x] 在OOBE阶段自动激活Windows(专业工作站版本) - [x] 在OOBE阶段自动激活Windows(专业工作站版本)
- [x] 禁用 Windows 更新* - [x] 随机生成的计算机名称,例如:DESKTOP-ZFAH8Z2
- [x] 删除了默认应用程序*
- [x] 禁用 Windows Defender ### 最终效果
- [x] 在 Windows 11 中使用经典菜单,而不是二级菜单
- [x] 禁用 Windows 更新
- [x] 删除了默认应用程序
- [x] 使用单级右键菜单
- [x] 始终显示文件扩展名 - [x] 始终显示文件扩展名
- [x] 打开文件资源管理器到'此电脑'而不是'快速访问' - [x] 任务栏中隐藏搜索框,任务视图和小部件
- [x] 任务栏中隐藏搜索框,Task view 和小部件 - [x] 打开文件资源管理器到“此电脑”而不是“快速访问”
- [x] 用户密码不会过期
### 其他优化特性
- [x] 强化 ACL - [x] 强化 ACL
- [x] 禁用快速启动
- [x] 启用长路径 - [x] 启用长路径
- [x] 禁用快速启动
- [x] 用户密码不会过期
- [x] 启用远程桌面服务 (RDP) - [x] 启用远程桌面服务 (RDP)
- [x] 阻止 Windows Update 重新启动您的计算机*
- [x] 阻止设备 BitLocker 加密 - [x] 阻止设备 BitLocker 加密
- [x] 删除空 C:\Windows.old 文件夹 - [x] 阻止 Windows Update 重新启动您的计算机
- [x] 自动将ISO中的Source\$OEM$\Setup\Scripts\Files文件夹中的软件放到桌面* - [x] 自动将ISO中的 $OEM$\Setup\Scripts\Files文件夹中的软件放到桌面
- [x] 保留Windows 安装过程中以交互方式对磁盘进行分区
- [x] 保留在 Windows 安装过程中以交互方式添加本地(“脱机”)用户
**PS**: **PS**:
- 禁用自动更新是创建一个名为 PauseWindowsUpdate 的计划任务,一次又一次地暂停更新一周.如果要运行 Windows 更新一次,请单击 “设置”中的“恢复更新 ”. - 禁用自动更新是创建一个名为 PauseWindowsUpdate 的计划任务,一次又一次地暂停更新一周.如果要运行 Windows 更新一次,请单击 “设置”中的“恢复更新 ”.
@@ -55,4 +60,4 @@ tags = ["乱七八糟","Windows"]
**SHA-256:5920ca1b839c2823cad5223cdff39671784d98d18da03fa4377a362ad480ce54** **SHA-256:5920ca1b839c2823cad5223cdff39671784d98d18da03fa4377a362ad480ce54**
**下载链接:**[这里](https://drive.google.com/file/d/1CWXtHJRmDaGYVV7k9mRsn1cDxIwomavO/view?usp=drive_link) **下载链接:**[这里](https://drive.google.com/file/d/160BjAvq0zdQPz3MjVowuCtcucj1PFPQ8/view)

335
content/windows-5-py.md Normal file
View File

@@ -0,0 +1,335 @@
+++
title = "Windows系列(5):Python开发配置"
date = 2024-05-31
[taxonomies]
tags = ["Windows"]
+++
前言 由于 Windows 中开发环境较 linux 复杂,这里总结 Windows 中使用 Jupyter 开发 Python 的环境配置。
<!-- more -->
## 安装
Python是一种跨平台的编程语言,社区生态丰富,有许多现成的包可以调用。传统的安装方法如下:
- 下载、安装Pythond解释器
- 验证安装;
- 安装VScode以及Python的拓展
但Python开发项目时往往需要不同版本不同的第三方包如果用传统方法难以管理因此现在的主流方法是
- 安装Anaconda或miniconda等Python集成包
- 使用conda创建并启动一个Python环境
- 安装jupyter编辑器编写python。
在[Anaconda官网](https://www.anaconda.com/)下载并安装,安装成功后,命令行中敲``conda info``会显示conda的版本和python的版本等详细信息再敲``conda list``,会列出当前环境下所有安装的包。
安装好了Anaconda就相当于同时有了Python、环境管理器、包管理器以及一大堆开箱即用的科学计算工具包。
> linux中安装Miniconda
```bash
# Miniconda安装脚本
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
# 执行以下命令启动安装程序:
bash Miniconda3-latest-Linux-x86_64.sh
# 验证安装
conda --version
```
## 使用
- 创建环境后面的python=3.6是指定python的版本
```bash
conda create --name env_name python=3.6
```
- 创建包含某些包的环境(也可以加上版本信息)
```bash
conda create --name env_name python=3.7 numpy scrapy
```
- 激活某个环境
```bash
conda activate env_name
```
- 关闭某个环境
```bash
conda deactivate env_name
```
- 复制某个环境
```bash
conda create --name new_env_name --clone old_env_name
```
- 删除某个环境
```bash
conda remove --name env_name --all
```
- 生成需要分享环境的yml文件需要在虚拟环境中执行
```bash
conda env export > environment.yml
```
- 在本地使用yml文件创建虚拟环境
```bash
conda env create -f environment.yml
```
- 列出本机的所有环境如下可见当前有2个环境当前激活的是test环境
```bash
(test) ➜ ~ conda info -e
- conda environments:
#
base /Volumes/300g/opt/anaconda3
test * /Volumes/300g/opt/anaconda3/envs/test
```
### 包管理
- 列出当前环境下所有安装的包
```bash
conda list
```
- 列举一个指定环境下的所有包
```bash
conda list -n env_name
```
- 查询库
```bash
conda search scrapys
```
- 安装库安装时可以指定版本例如scrapy=1.5.0
```bash
conda install scrapy
```
- 为指定环境安装某个包
```bash
conda install --name target_env_name package_name
```
- 更新安装的库
```bash
conda update scrapy
```
- 更新指定环境某个包
```bash
conda update -n target_env_name package_name
```
- 更新所有包
```bash
conda update --all
```
- 删除已经安装的库
```bash
conda remove scrapy
```
- 删除指定环境某个包
```bash
conda remove -n target_env_name package_name
```
- 更多命令请查看官方文档或者查询帮助命令:
```bash
conda --help
conda install --help
```
## Jupyter使用
安装Anaconda并启动一个环境之后如何让Jupyter Notebook在我们要的环境中启动呢
- 安装jupyter
```bash
conda install jupyter notebook
```
- 配置虚拟机中允许宿主机访问
```bash
# 生成配置
jupyter notebook --generate-config
# 编辑配置
nano ~/.jupyter/jupyter_notebook_config.py
# 写入这三行
c.NotebookApp.ip = '0.0.0.0' # 允许任何 IP 访问
c.NotebookApp.port = 8888 # 指定端口
c.NotebookApp.open_browser = False # 不自动开浏览器
# 重启jupyter
jupyter notebook
```
- 安装 ipykernel
为了让 Jupyter Notebook 能识别该环境中的 Python 解释器,你需要在该环境中安装 ipykernel
```bash
conda install ipykernel
```
- 注册环境内核
将该环境注册为 Jupyter 的一个内核kernel这样启动 Jupyter Notebook 后就能选择这个内核:
```bash
python -m ipykernel install --user --name myenv --display-name "Python (myenv)"
```
这里 --name 指定内核的名称,--display-name 是在 Jupyter Notebook 界面中显示的名称,你可以根据需要自定义。
- 启动 Jupyter Notebook依然在激活后的环境中启动 Jupyter Notebook启动后你在新建 notebook 时可以选择刚刚注册的内核 “Python (myenv)” 来确保使用该环境的 Python 解释器。
```bash
jupyter notebook
```
- 汉化jupyter(可选)
Jupyter Notebook 本身没有官方语言包,但可以用第三方扩展 ``jupyter_contrib_nbextensions``和``notebook-translation``来实现部分汉化
```bash
pip install jupyter_contrib_nbextensions
jupyter contrib nbextension install --user
pip install jupyter-notebook-translation
```
> 当然,你也可以使用其他编辑器/IDE如 Sublime Text 或者 JetBrains 系列的 PyCharm 。
## 使用 UV 替代 Conda
> UV由 Astral 团队开发)是一个用 Rust 编写的高性能 Python 包管理器,提供类似 Conda 的虚拟环境管理和依赖解析功能,在大多数场景下比 pip 和 Conda 快 10100 倍。它通过命令行工具如 `uv venv`(创建/管理虚拟环境)和 `uv pip`(安装/锁定/同步依赖)覆盖传统的 Conda 流程,但本身不管理底层的 C/C++ 库,因此对于 GDAL、SciPy 等需要系统级二进制依赖的包,仍建议先通过系统包管理器或 Conda 安装,然后用 UV 管理 Python 包。
---
- 安装 UV
```bash
wget -qO- https://astral.sh/uv/install.sh | sh
```
- 创建与管理环境
```bash
# 创建虚拟环境,指定 Python 版本
uv venv --python 3.12
# 激活环境
source .venv/bin/activate
# 退出环境
deactivate
# 删除环境
rm -rf .venv
```
- 直接运行
```bash
uv run python
uv run jupyter lab
```
- 注册 Jupyter 内核
```bash
uv run python -m ipykernel install --user --name bank --display-name "Python (bank)"
```
---
- 安装依赖
```bash
uv add tensorflow
uv pip install requests fastapi uvicorn sqlalchemy
```
> 安装完成后UV 会自动更新 `uv.lock` 文件锁定依赖版本,保证环境可复现。
- 使用 TOML 配置管理依赖
创建一个 `pyproject.toml`
```toml
[tool.uv.dependencies]
fastapi = "*"
uvicorn = "*"
sqlalchemy = "*"
```
然后同步环境:
```bash
uv pip sync
```
这会根据 `pyproject.toml` + `uv.lock` 安装和锁定所有依赖。
- 查看与卸载包
```bash
uv pip list # 列出已安装包
uv pip uninstall numpy
```
- 更新UV自身
```bash
uv self update
```
---
### 替代常见 Conda 工作流
| Conda 操作 | UV 对应 |
| -------------------------------- | ------------------------------------------------- |
| `conda create -n env python=3.x` | `uv venv --python 3.x` |
| `conda activate env` | `source .venv/bin/activate` 或 `uv venv activate` |
| `conda install pkg1 pkg2` | `uv pip install pkg1 pkg2` |
| `conda env export > env.yml` | 自动生成 `uv.lock` 或 `uv pip compile requirements.in` |
| `conda env update -f env.yml` | `uv pip sync`(根据 `uv.lock` 或 `pyproject.toml` 同步) |
| `conda list` | `uv pip list` |
## ipynb转markdown
首先安装 nbformat 和 nbconvert包
```bash
conda install nbformat nbconvert -y
touch ipynb2md.py && nano ipynb2md.py
```
写入以下脚本:
```python
import nbformat
from nbconvert import MarkdownExporter
from pathlib import Path
def ipynb_to_md(ipynb_path: Path, output_dir: Path):
"""单个 ipynb 转 md"""
with open(ipynb_path, "r", encoding="utf-8") as f:
nb = nbformat.read(f, as_version=4)
exporter = MarkdownExporter()
body, resources = exporter.from_notebook_node(nb)
output_file = output_dir / (ipynb_path.stem + ".md")
with open(output_file, "w", encoding="utf-8") as f:
f.write(body)
print(f"✔ 转换完成: {ipynb_path} -> {output_file}")
def batch_convert(input_dir: str, output_dir: str = "markdown_output"):
input_dir = Path(input_dir)
output_dir = Path(output_dir)
output_dir.mkdir(parents=True, exist_ok=True)
for ipynb_file in input_dir.glob("*.ipynb"):
ipynb_to_md(ipynb_file, output_dir)
if __name__ == "__main__":
# 修改这里的目录路径即可
batch_convert(input_dir=".")
```
运行脚本:
```bash
python ipynb2md.py
```
脚本会自动扫描当前目录下的所有 .ipynb 文件,并把 .md 文件输出到 markdown_output/ 文件夹。
---
**Done.**

View File

@@ -1,9 +1,9 @@
+++ +++
title = "乱七八糟:Windows-VScode开发C/C++" title = "Windows系列(6):C/C++开发配置"
date = 2024-05-30 date = 2024-05-30
[taxonomies] [taxonomies]
tags = ["乱七八糟","Windows"] tags = ["Windows"]
+++ +++
前言 由于 Windows 中开发环境较 linux 复杂,这里总结 Windows 中使用 VScode 开发 C/C++ 的环境配置。 前言 由于 Windows 中开发环境较 linux 复杂,这里总结 Windows 中使用 VScode 开发 C/C++ 的环境配置。
@@ -44,7 +44,7 @@ tags = ["乱七八糟","Windows"]
## 配置JSON ## 配置JSON
- 回到 Visual Studio Code 继续配置。点击左侧的资源管理器,点击打开文件夹,创建一个``.cpp``文件,里面代码可以是 - 回到 Visual Studio Code 继续配置。点击左侧的资源管理器,点击打开文件夹,创建一个``.cpp``文件,里面代码可以是
``` ```bash
#include <iostream> #include <iostream>
int main() { int main() {

View File

@@ -1,204 +0,0 @@
+++
title = "乱七八糟:Windows安装与环境配置"
date = 2024-05-26
[taxonomies]
tags = ["乱七八糟","Windows"]
+++
前言 由于厂商默认安装windows家庭版导致各种问题频发,这里对 widnows 安装做一个总结以及附上我个人的windows配置。
<!-- more -->
> 从官方安装:从[微软官网](https://www.microsoft.com/en-us/software-download/windows11)下载镜像或[MAS镜像站](https://massgrave.dev/genuine-installation-media)下载。
> 从Dichos安装参考[乱七八糟:Windows封装与全自动安装](https://blog.dich.bid/windows-iso/)
> 二者都基于专业工作站版本区别在于Dichos通过预应答文件和封装完成了许多设置与优化。Windows最新版本往往Bug比较多推荐用上一版本如最新版本为24H2则推荐使用23H2.
**大版本分类**
| 分类 | 消费者版Consumer | 商务版Business | 物联网版IoT | 长期服务版LTSC |
|------------------|--------------------------------------------------|---------------------------------------------------|---------------------------------------------------|-----------------------------------------------------|
| **目标用户** | 家庭用户、个人消费者 | 企业、机构、教育用户 | 嵌入式设备、工业控制、POS、医疗设备等 | 关键任务系统、长期稳定运行的设备 |
| **主要版本** | Windows Home、Home Single Language、Education | Windows Professional、Enterprise、Education | Windows IoT Core、IoT Enterprise、IoT Enterprise LTSC | Windows Enterprise LTSC、IoT Enterprise LTSC |
| **预装应用** | 包含 Microsoft Store、娱乐和社交类应用 | 精简部分消费类应用,保留企业管理工具 | 极度精简,移除大部分消费类应用 | 移除 Microsoft Store、Cortana 等非必要功能 |
| **更新策略** | 定期推送功能和安全更新 | 可由企业控制更新策略,支持延迟功能更新 | 可选择常规更新或 LTSC 版本,更新策略灵活 | 仅推送安全补丁和关键修复,无新功能更新 |
| **支持周期** | 通常为 18 个月 | 通常为 1830 个月,取决于版本和配置 | IoT Enterprise LTSC 支持周期可达 1015 年 | 通常为 5 年主流支持 + 5 年扩展支持,共 10 年 |
| **授权方式** | 零售授权,需在线激活 | 批量许可Volume Licensing、OEM 授权 | OEM 授权,适用于特定硬件设备 | 批量许可,适用于特定行业和关键任务设备 |
| **适用场景** | 日常办公、娱乐、学习 | 企业办公、教育机构、专业工作站 | 工业自动化、零售终端、医疗设备等嵌入式系统 | 医疗设备、金融终端、工业控制系统等需长期稳定运行的环境 |
> 安装完成后的优化:
## **一.设备级:**
- 关闭 BIOS 安全启动,快速启动
- 解锁 BitLocker
- 删除 OEM 分区,恢复简洁的设备分区
## **二.系统级:**
- 家庭版升级为专业工作站版
- 将用户名改为非中文
- 退出云端账号,杀死家庭组策略
- 激活 Windows 与 MS office
- 停止自动更新并恢复单级菜单
## **三.驱动级:**
驱动的安装没有集成在Dichos中而是作为手动安装的一部分避免出错。如自带系统有驱动包先进系统拿出然后再安装新系统一般来说包括:
- 主板驱动和CPU驱动
- 显卡驱动(独显/核显);
- Wifi网卡驱动和蓝牙驱动
- 声卡驱动;
- 硬盘驱动(较少见);
- Fn快捷键驱动厂商自带
- 笔记本自带的其他某某中心/管家(不建议使用)
而根据来源,又可以分为``公版/通用驱动``和``笔记本厂商特调/专用驱动``,一般而言装公版驱动即可,保持通用性;如果你是重度游戏玩家则可以考虑特调驱动。
**常用驱动下载网站**
| 分类 | 名称 | 下载 |
|--------|----------|------|
| 综合 | 驱动天空 | [链接](https://www.drvsky.com/) |
| 厂商 | 吾空 | [链接](http://www.wooking.com.cn/drives) |
| 厂商 | 华硕 | [链接](https://www.asus.com.cn/support/download-center/) |
| 厂商 | 联想 | [链接](https://newsupport.lenovo.com.cn/driveDownloads_index.html) |
| 三大件 | AMD | [链接](https://www.amd.com/en/support/download/drivers.html) |
| 三大件 | Intel | [链接](https://www.intel.cn/content/www/cn/zh/support/detect.html) |
| 三大件 | NVIDIA | [链接](https://www.nvidia.cn/geforce/drivers/) |
## **四.软件级:**
- 删除自带牛马以及不必要的管家类软件.
## 软件
- **AI**: [GPT4All](https://github.com/nomic-ai/gpt4all)
- **截图**: [ShareX](https://github.com/ShareX/ShareX)
- **绘画**: [Krita](https://github.com/KDE/krita)
- **办公**: [Microsoft Office](https://github.com/YerongAI/Office-Tool)
- **PDF**: [Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF)
- **游戏**: [Steam](https://store.steampowered.com/)
- **抓包**: [Wireshark](https://www.wireshark.org/download.html)
- **启动器**: [Flow.Launcher](https://github.com/Flow-Launcher/Flow.Launcher)
- **输入法**: [Rime](https://rime.im/download/)
- **浏览器**: [Floorp](https://github.com/Floorp-Projects/Floorp) / [Chrome](https://www.google.com/chrome/)
- **编辑器**: [VSCodium](https://github.com/VSCodium/vscodium)
- **虚拟机**: HyperV
- **科学上网**: [GFS](https://github.com/GUI-for-Cores/GUI.for.SingBox)
- **书籍阅读**: [Readest](https://github.com/readest/readest)
- **内网互传**: [LocalSend](https://github.com/localsend/localsend)
- **文件同步**: [Syncthing](https://github.com/syncthing/syncthing)
- **屏幕录制**: [OBS Studio](https://github.com/obsproject/obs-studio)
- **手机投屏**: [QtScrcpy](https://github.com/barry-ran/QtScrcpy)
- **包管理**: [UniGetUI](https://github.com/marticliment/UniGetUI)
- **软件卸载**: [Geek Uninstaller](https://geekuninstaller.com/download)
- **显示器亮度**: [Twinkle Tray](https://github.com/xanderfrangos/twinkle-tray)
- **系统工具**: [Dism++](https://github.com/Chuyu-Team/Dism-Multi-language) / [NTLite](https://www.ntlite.com/)
- **综合工具**: [图吧工具箱](https://www.tbtool.cn/)
- **文件搜索**: [Everything](https://www.voidtools.com/zh-cn/)
- **磁盘工具**: [DiskGenius](https://www.diskgenius.cn/)
- **密码管理器**: [KeePassXC](https://github.com/keepassxreboot/keepassxc)
- **终端/SSH**: [Electerm](https://github.com/electerm/electerm)
> 这里说一下Rime输入法在Windows端叫小狼毫输入方案用的是[雾凇拼音](https://github.com/iDvel/rime-ice?tab=readme-ov-file) ,在``获取更多输入方案``中命令行输入``iDvel/rime-ice:others/recipes/full``安装。
> 传统意义上的三大件包括浏览器,编辑器以及密码管理器。
## **五.设置级**
- 设置简洁高效的浏览器
- 优化桌面布局与任务栏布局
- 关闭开机自启软件
- 关闭 Windows Defender 等烦人的通知
## **六.测试级(可选)**
- 查看PC型号与配置是否相同
- 测试GPU/CPU/硬盘速率与使用时间
- 屏幕坏点/喇叭/蓝牙检测
- 网络测速
---
## 开发环境
### 搭建虚拟机环境
- Hyper-V
在 BIOS 中找到类似``Intel VT-x”、“AMD-V”或“Virtualization Technology``的选项确保它是“Enabled”启用。随后按下 Win + S输入“打开或关闭 Windows 功能”,在弹出的窗口中,找到 Hyper-V并启用重启后即可出现。
- VMware
首先下载 [Vmware](https://www.423down.com/14542.html),随后安装并[激活](https://www.ypojie.com/6066.html),然后提前下载好所需系统的镜像,这里推荐[整合镜像站](https://help.mirrorz.org/)并在Vmware中启动。
- Virtulbox
直接到[官网](https://www.virtualbox.org/wiki/Downloads)下载并安装。
- WSL
在``控制面板->程序->启用或关闭Windows功能``选中适用于Linux的Windows子系统和虚拟机平台待安装完成后重启电脑。
然后,在``管理员模式下打开 PowerShell 或 Windows 命令提示符``,方法是右键单击并选择“以管理员身份运行”,输入以下命令,然后重启计算机。
```
wsl --install
```
此命令将启用运行 WSL 并安装 Linux 的 Ubuntu 发行版所需的功能。(可以更改此默认发行版)。
> 使用 qemu-img 进行各种虚拟机格式转换
- qcow2 转 vmdkVMware
```
qemu-img convert -f qcow2 -O vmdk input.qcow2 output.vmdk
```
- qcow2 转 vdiVirtualBox
```
qemu-img convert -f qcow2 -O vdi input.qcow2 output.vdi
```
- qcow2 转 vhdx新版 Hyper-V
目前 qemu-img 不能直接输出 vhdx但你可以先转成 vhd再用微软工具如 Convert-VHD转换为 vhdx
```
Convert-VHD -Path "output.vhd" -DestinationPath "output.vhdx" -VHDType Dynamic
```
- vmdk转vhdx
```
qemu-img convert -f vmdk -O vhdx input.vmdk output.vhdx
```
- vhd转vhdx
在 PowerShell 中执行以下命令:​
```
Convert-VHD -Path "C:\路径\源文件.vhd" -DestinationPath "C:\路径\目标文件.vhdx" -VHDType Dynamic
# -Path指定原始 VHD 文件的路径。​
# -DestinationPath指定转换后 VHDX 文件的保存路径。​
# -VHDType指定磁盘类型可选值为 Fixed固定大小或 Dynamic动态扩展
```
请确保虚拟机已关闭,并且 PowerShell 以管理员权限运行。
> Vscode SSH 连接
使用``Open Remote - SSH``插件,需要创建.ssh文件夹Windows中在``C://users//username//``路径下。
随后使用插件新建一个连接,如:
```
Host myserver
HostName 192.168.1.100
User your_username
```
---
**Done.**

View File

@@ -1,269 +0,0 @@
+++
title = "乱七八糟:Windows-Jupyter开发Python"
date = 2024-05-31
[taxonomies]
tags = ["乱七八糟","Windows"]
+++
前言 由于 Windows 中开发环境较 linux 复杂,这里总结 Windows 中使用 Jupyter 开发 Python 的环境配置。
<!-- more -->
## 安装
Python是一种跨平台的编程语言,社区生态丰富,有许多现成的包可以调用。传统的安装方法如下:
- 下载、安装Pythond解释器
- 验证安装;
- 安装VScode以及Python的拓展
但Python开发项目时往往需要不同版本不同的第三方包如果用传统方法难以管理因此现在的主流方法是
- 安装Anaconda或miniconda等Python集成包
- 使用conda创建并启动一个Python环境
- 安装jupyter编辑器编写python。
在[Anaconda官网](https://www.anaconda.com/)下载并安装,安装成功后,命令行中敲``conda info``会显示conda的版本和python的版本等详细信息再敲``conda list``,会列出当前环境下所有安装的包。
安装好了Anaconda就相当于同时有了Python、环境管理器、包管理器以及一大堆开箱即用的科学计算工具包。
## 使用
安装好了默认是在base虚拟环境下此时我们从base环境复制一份出来在新环境里工作。
- 复制base环境, 创建test环境
```
conda create --name test --clone base
```
- 激活test环境
```
conda activate test
```
- 取消Conda默认激活base虚拟环境
```
conda config --set auto_activate_base false
```
- 列出本机的所有环境如下可见当前有2个环境当前激活的是test环境
```
(test) ➜ ~ conda info -e
- conda environments:
#
base /Volumes/300g/opt/anaconda3
test * /Volumes/300g/opt/anaconda3/envs/test
```
- Anaconda默认安装了jupyter打开jupyter
```
jupyter notebook
```
此时会自动弹出浏览器窗口打开Jupyter Notebook网页默认为``http://localhost:8888``
> Jupyter汉化/下载中文包:``pip install jupyterlab-language-pack-zh-CN``
### 虚拟环境管理
- 创建环境后面的python=3.6是指定python的版本
```
conda create --name env_name python=3.6
```
- 创建包含某些包的环境(也可以加上版本信息)
```
conda create --name env_name python=3.7 numpy scrapy
```
- 激活某个环境
```
conda activate env_name
```
- 关闭某个环境
```
conda deactivate
```
- 复制某个环境
```
conda create --name new_env_name --clone old_env_name
```
- 删除某个环境
```
conda remove --name env_name --all
```
- 生成需要分享环境的yml文件需要在虚拟环境中执行
```
conda env export > environment.yml
```
- 别人在自己本地使用yml文件创建虚拟环境
```
conda env create -f environment.yml
```
### 包管理
- 列出当前环境下所有安装的包
```
conda list
```
- 列举一个指定环境下的所有包
```
conda list -n env_name
```
- 查询库
```
conda search scrapys
```
- 安装库安装时可以指定版本例如scrapy=1.5.0
```
conda install scrapy
```
- 为指定环境安装某个包
```
conda install --name target_env_name package_name
```
- 更新安装的库
```
conda update scrapy
```
- 更新指定环境某个包
```
conda update -n target_env_name package_name
```
- 更新所有包
```
conda update --all
```
- 删除已经安装的库
```
conda remove scrapy
```
- 删除指定环境某个包
```
conda remove -n target_env_name package_name
```
- 更多命令请查看官方文档或者查询帮助命令:
```
conda --help
conda install --help
```
有了Conda包管理器为什么Anaconda环境中可能还需要用pip安装包呢因为Anaconda本身只提供部分包远没有pip提供的包多有时conda无法安装我们需要的包此时需要用pip将其装到conda环境里。
安装特定版本的包conda用=pip用==。例如:
```
conda install xxx=1.0.0
pip install xxx==1.0.0
```
## Jupyter使用
安装Anaconda并启动一个环境之后如何让Jupyter Notebook在我们要的环境中启动呢
- 激活目标环境
```
conda activate myenv
```
- 安装 ipykernel如尚未安装
为了让 Jupyter Notebook 能识别该环境中的 Python 解释器,你需要在该环境中安装 ipykernel
```
conda install ipykernel
# 或者使用 pip
pip install ipykernel
```
- 注册环境内核
将该环境注册为 Jupyter 的一个内核kernel这样启动 Jupyter Notebook 后就能选择这个内核:
```
python -m ipykernel install --user --name myenv --display-name "Python (myenv)"
# 这里 --name 指定内核的名称,--display-name 是在 Jupyter Notebook 界面中显示的名称,你可以根据需要自定义。
```
- 启动 Jupyter Notebook依然在激活后的环境中启动 Jupyter Notebook
```
jupyter notebook
```
- 启动后,你在新建 notebook 时可以选择刚刚注册的内核 “Python (myenv)” 来确保使用该环境的 Python 解释器。
> 当然,你也可以使用其他编辑器/IDE如 Sublime Text 或者 JetBrains 系列的 PyCharm 。
> linux中使用Miniconda
```
# Miniconda安装脚本
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
# 执行以下命令启动安装程序:
bash Miniconda3-latest-Linux-x86_64.sh
# 验证安装
conda --version
```
## 使用UV替代Conda
> UV由 Astral 团队开发)是一个用 Rust 编写的高性能包管理器,提供了类似 Conda 的虚拟环境管理和依赖解析功能,并且在大多数场景下比 pip 和 Conda 快 10100 倍。它通过命令行工具如 uv venv创建/管理虚拟环境)和 uv pip安装/锁定/同步依赖)来覆盖传统的 conda create、conda install、conda env export 等操作,但本身并不管理底层的 C/C++ 库,因此对于诸如 GDAL、SciPy 等需要系统级二进制依赖的包,仍建议在 Conda/系统包管理器中预装相关库,然后用 UV 来管理 Python 包。
**安装与激活**
```
wget -qO- https://astral.sh/uv/install.sh | sh
```
- 在当前目录下创建 .venv使用系统默认 Python若不存在则自动下载
```
uv venv
```
- 指定环境名称或路径
```
uv venv myenv
```
- 指定 Python 版本(需系统已有或可下载)
```
uv venv --python 3.11
```
- 激活
```
source .venv/bin/activate
```
**安装包**
```bash
# 安装单个包
uv pip install requests
# 批量安装并自动锁定依赖
uv pip install fastapi uvicorn sqlalchemy
```
**生成与同步锁文件**
```bash
# 从 requirements.in 生成统一依赖文件
uv pip compile docs/requirements.in \
--universal \
--output-file docs/requirements.txt
# 根据锁文件同步环境
uv pip sync docs/requirements.txt
```
此流程替代 `conda env export` + `conda env update`,并保证跨平台一致性 ([GitHub][3])。
**查看与卸载**
```bash
uv pip list # 列出已安装包(类似 conda list
uv pip uninstall numpy
```
**替代常见 Conda 工作流**
| Conda 操作 | UV 对应 |
| -------------------------------- | ---------------------------------------- |
| `conda create -n env python=3.x` | `uv venv --python 3.x` |
| `conda activate env` | `source .venv/bin/activate` 或 `activate` |
| `conda install pkg1 pkg2` | `uv pip install pkg1 pkg2` |
| `conda env export > env.yml` | `uv pip compile requirements.in` |
| `conda env update -f env.yml` | `uv pip sync requirements.txt` |
| `conda list` | `uv pip list` |
**最佳实践**
1. **系统依赖**:用 Conda/Mamba 安装较难编译的 C 库(`conda install gdal`)。
2. **Python 包**:用 UV 管理所有纯 Python 依赖(`uv pip install pandas scikit-learn`)。
3. **统一锁定**:把 `uv pip compile` 生成的 `requirements.txt` 放入版本控制,确保团队环境一致。
---
**Done.**

27
flake.lock generated Normal file
View File

@@ -0,0 +1,27 @@
{
"nodes": {
"nixpkgs": {
"locked": {
"lastModified": 1754278406,
"narHash": "sha256-jvIQTMN5EzoOP5RaGztpVese8a3wqy0M/h6tNzycW28=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "6a489c9482ca676ce23c0bcd7f2e1795383325fa",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixpkgs-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"root": {
"inputs": {
"nixpkgs": "nixpkgs"
}
}
},
"root": "root",
"version": 7
}

21
flake.nix Normal file
View File

@@ -0,0 +1,21 @@
{
description = "A Nix-flake-based development environment";
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
outputs = { self, nixpkgs }:
let
supportedSystems = [ "x86_64-linux" "aarch64-linux" ];
forEachSupportedSystem = f: nixpkgs.lib.genAttrs supportedSystems (system: f {
pkgs = import nixpkgs { inherit self system; };
});
in
{
devShells = forEachSupportedSystem ({ pkgs }: {
default = pkgs.mkShell {
packages = with pkgs; [
pagefind
zola
];
};
});
};
}

View File

@@ -1,10 +1,4 @@
#!/usr/bin/env -S just --justfile #!/usr/bin/env -S just --justfile
# ^ A shebang isn't required, but allows a justfile to be executed
# like a script, with `./justfile build`, for example.
# Task thet using Zola and Pagefindo build site
build: build:
# Build the si\ zola build && pagefind --site public --root-selector body
te with Zola
zola build && npx pagefind --site public

View File

@@ -2,7 +2,7 @@
{% macro head(config) %} {% macro head(config) %}
<meta http-equiv="content-type" content="text/html; charset=utf-8"> <meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=5"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="robots" content="noodp"/> <meta name="robots" content="noodp"/>
<link rel="stylesheet" href="{{ get_url(path="style.css", trailing_slash=false) | safe }}"> <link rel="stylesheet" href="{{ get_url(path="style.css", trailing_slash=false) | safe }}">

View File

@@ -1,9 +1,9 @@
:root { :root {
--accent: rgb(35,176,255); --accent: rgb(50, 200, 255);
--accent-alpha-70: rgba(35,176,255,.7); --accent-alpha-70: rgba(50,200,255,0.7);
--accent-alpha-20: rgba(35,176,255,.2); --accent-alpha-20: rgba(50,200,255,0.35);
--background: #1D212C; --background: #1D212C;
--color: white; --color: #E0E6F0;
--border-color: rgba(255, 255, 255, .1); --border-color: rgba(255, 255, 255, .1);
} }

File diff suppressed because one or more lines are too long

View File

@@ -10,6 +10,7 @@
src: url('fonts/hack-regular.woff2?sha=3114f1256') format('woff2'), url('fonts/hack-regular.woff?sha=3114f1256') format('woff'); src: url('fonts/hack-regular.woff2?sha=3114f1256') format('woff2'), url('fonts/hack-regular.woff?sha=3114f1256') format('woff');
font-weight: 400; font-weight: 400;
font-style: normal; font-style: normal;
font-display: swap;
} }
@font-face { @font-face {
@@ -17,6 +18,7 @@
src: url('fonts/hack-bold-subset.woff2?sha=3114f1256') format('woff2'), url('fonts/hack-bold-subset.woff?sha=3114f1256') format('woff'); src: url('fonts/hack-bold-subset.woff2?sha=3114f1256') format('woff2'), url('fonts/hack-bold-subset.woff?sha=3114f1256') format('woff');
font-weight: 700; font-weight: 700;
font-style: normal; font-style: normal;
font-display: swap;
} }
@font-face { @font-face {
@@ -24,6 +26,7 @@
src: url('fonts/hack-italic-subset.woff2?sha=3114f1256') format('woff2'), url('fonts/hack-italic-webfont.woff?sha=3114f1256') format('woff'); src: url('fonts/hack-italic-subset.woff2?sha=3114f1256') format('woff2'), url('fonts/hack-italic-webfont.woff?sha=3114f1256') format('woff');
font-weight: 400; font-weight: 400;
font-style: italic; font-style: italic;
font-display: swap;
} }
@font-face { @font-face {
@@ -31,4 +34,5 @@
src: url('fonts/hack-bolditalic-subset.woff2?sha=3114f1256') format('woff2'), url('fonts/hack-bolditalic-subset.woff?sha=3114f1256') format('woff'); src: url('fonts/hack-bolditalic-subset.woff2?sha=3114f1256') format('woff2'), url('fonts/hack-bolditalic-subset.woff?sha=3114f1256') format('woff');
font-weight: 700; font-weight: 700;
font-style: italic; font-style: italic;
font-display: swap;
} }

View File

@@ -9,6 +9,7 @@
src: url('fonts/hack-regular.woff2?sha=3114f1256') format('woff2'), url('fonts/hack-regular.woff?sha=3114f1256') format('woff'); src: url('fonts/hack-regular.woff2?sha=3114f1256') format('woff2'), url('fonts/hack-regular.woff?sha=3114f1256') format('woff');
font-weight: 400; font-weight: 400;
font-style: normal; font-style: normal;
font-display: swap;
} }
@font-face { @font-face {
@@ -16,6 +17,7 @@
src: url('fonts/hack-bold.woff2?sha=3114f1256') format('woff2'), url('fonts/hack-bold.woff?sha=3114f1256') format('woff'); src: url('fonts/hack-bold.woff2?sha=3114f1256') format('woff2'), url('fonts/hack-bold.woff?sha=3114f1256') format('woff');
font-weight: 700; font-weight: 700;
font-style: normal; font-style: normal;
font-display: swap;
} }
@font-face { @font-face {
@@ -23,6 +25,7 @@
src: url('fonts/hack-italic.woff2?sha=3114f1256') format('woff2'), url('fonts/hack-italic.woff?sha=3114f1256') format('woff'); src: url('fonts/hack-italic.woff2?sha=3114f1256') format('woff2'), url('fonts/hack-italic.woff?sha=3114f1256') format('woff');
font-weight: 400; font-weight: 400;
font-style: italic; font-style: italic;
font-display: swap;
} }
@font-face { @font-face {
@@ -30,4 +33,5 @@
src: url('fonts/hack-bolditalic.woff2?sha=3114f1256') format('woff2'), url('fonts/hack-bolditalic.woff?sha=3114f1256') format('woff'); src: url('fonts/hack-bolditalic.woff2?sha=3114f1256') format('woff2'), url('fonts/hack-bolditalic.woff?sha=3114f1256') format('woff');
font-weight: 700; font-weight: 700;
font-style: italic; font-style: italic;
font-display: swap;
} }

View File

@@ -3,7 +3,7 @@
.footer { .footer {
padding: 40px 0; padding: 40px 0;
flex-grow: 0; flex-grow: 0;
opacity: .5; opacity: .8;
&__inner { &__inner {
display: flex; display: flex;

View File

@@ -52,7 +52,7 @@
%tags { %tags {
margin-bottom: 20px; margin-bottom: 20px;
font-size: 1rem; font-size: 1rem;
opacity: .5; opacity: .9;
} }
&-tags { &-tags {

View File

@@ -1,2 +1,5 @@
$phone-max-width: 683px; $phone-max-width: 683px;
$tablet-max-width: 899px; $tablet-max-width: 899px;
// 字体回退栈
$font-family: 'Hack', 'SF Mono', 'Monaco', 'Inconsolata', 'Consolas', 'Courier New', monospace;

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

BIN
static/images/electerm.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 195 KiB

BIN
static/images/iperf3.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 174 KiB

BIN
static/images/ping.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

BIN
static/images/s905-atv.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 727 KiB

View File

@@ -6,7 +6,7 @@
<xsl:template match="/"> <xsl:template match="/">
<html> <html>
<head> <head>
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="referrer" content="unsafe-url" /> <meta name="referrer" content="unsafe-url" />
<title><xsl:value-of select="/atom:feed/atom:title"/></title> <title><xsl:value-of select="/atom:feed/atom:title"/></title>
<link rel="stylesheet" href="/css/water.min.css" /> <link rel="stylesheet" href="/css/water.min.css" />
@@ -57,4 +57,4 @@
</body> </body>
</html> </html>
</xsl:template> </xsl:template>
</xsl:stylesheet> </xsl:stylesheet>

View File

@@ -12,7 +12,7 @@
({{ term.pages | length }} post{{ term.pages | length | pluralize }}) ({{ term.pages | length }} post{{ term.pages | length | pluralize }})
</h1> </h1>
<a href="{{ config.base_url | safe }}/tags"> <a href="{{ config.base_url | safe }}/tags/">
Show all tags Show all tags
</a> </a>

View File

@@ -18,16 +18,17 @@
{%- if feed is containing('atom') %} {%- if feed is containing('atom') %}
<link rel="alternate" type="application/atom+xml" title="{{ config.title }} Atom Feed" href="{{ get_url(path=feed, trailing_slash=false, lang=lang) | safe }}" /> <link rel="alternate" type="application/atom+xml" title="{{ config.title }} Atom Feed" href="{{ get_url(path=feed, trailing_slash=false, lang=lang) | safe }}" />
{%- endif %} {%- endif %}
{%- if feed is containing('rss') %} {%- if feed is containing('rss') %}
<link rel="alternate" type="application/rss+xml" title="{{ config.title }} RSS Feed" href="{{ get_url(path=feed, trailing_slash=false, lang=lang) | safe }}" /> <link rel="alternate" type="application/rss+xml" title="{{ config.title }} RSS Feed" href="{{ get_url(path=feed, trailing_slash=false, lang=lang) | safe }}" />
{%- endif %} {%- endif %}
{%- endfor %}
{% endif -%}
{# Favicon #} {%- endfor %}
{% if config.extra.favicon %} {%- endif -%}
<link rel="icon" type="image/png" href={{ config.extra.favicon }} />
{% endif %} {%- if config.extra.favicon %}
<link rel="shortcut icon" type="{{ config.extra.favicon_mimetype | default(value="image/x-icon") | safe }}" href="{{ config.extra.favicon | safe }}">
{% endif -%}
{%- block extra_head %} {%- block extra_head %}
{% endblock extra_head -%} {% endblock extra_head -%}

View File

@@ -2,8 +2,13 @@
{% macro head(config) %} {% macro head(config) %}
<meta http-equiv="content-type" content="text/html; charset=utf-8"> <meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="robots" content="noodp"/> <meta name="robots" content="noodp"/>
<!-- 字体预加载 - 减少布局偏移 CLS -->
<link rel="preload" href="{{ get_url(path='fonts/hack-regular.woff2?sha=3114f1256') }}" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="{{ get_url(path='fonts/hack-bold.woff2?sha=3114f1256') }}" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="{{ get_url(path='fonts/hack-italic.woff2?sha=3114f1256') }}" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="{{ get_url(path='fonts/hack-bolditalic.woff2?sha=3114f1256') }}" as="font" type="font/woff2" crossorigin>
<link rel="stylesheet" href="{{ get_url(path="style.css", trailing_slash=false) | safe }}"> <link rel="stylesheet" href="{{ get_url(path="style.css", trailing_slash=false) | safe }}">
@@ -94,4 +99,4 @@
<meta name="twitter:title" content="{{ title | safe }}"> <meta name="twitter:title" content="{{ title | safe }}">
<meta property="twitter:domain" content="{{ config.base_url | replace(from="https://", to="") }}"> <meta property="twitter:domain" content="{{ config.base_url | replace(from="https://", to="") }}">
<meta property="twitter:url" content="{{ permalink | safe }}"> <meta property="twitter:url" content="{{ permalink | safe }}">
{% endmacro open_graph %} {% endmacro open_graph %}

View File

@@ -5,9 +5,10 @@
{%- endblock -%} {%- endblock -%}
{% block content %} {% block content %}
<div class="post"> <div class="post" data-pagefind-body>
{{ post_macros::header(page=page) }} {{ post_macros::header(page=page) }}
{{ post_macros::content(page=page, summary=false, show_only_description=false) }} {{ post_macros::content(page=page, summary=false, show_only_description=false) }}
{{ post_macros::earlier_later(page=page) }} {{ post_macros::earlier_later(page=page) }}
</div> </div>
{% endblock content %} {% endblock content %}