mirror of
https://github.com/Dichgrem/Blog.git
synced 2025-12-16 21:42:00 -05:00
Compare commits
69 Commits
c883e002ad
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3074cce943 | ||
|
|
7a2a62ca81 | ||
|
|
fc214b99ea | ||
|
|
a14f07559d | ||
|
|
885e428b34 | ||
|
|
784cceb48a | ||
|
|
8adb0f14ef | ||
|
|
845850871a | ||
|
|
f59ce84988 | ||
|
|
d80a243878 | ||
|
|
9d0fc8768a | ||
|
|
08cebea624 | ||
|
|
171d867f21 | ||
|
|
1f325ce9a3 | ||
|
|
c5ff247d7e | ||
|
|
7ba1088bc2 | ||
|
|
0fe644e4b7 | ||
|
|
faf43c3e1c | ||
|
|
4f48f01b73 | ||
|
|
d532bb0513 | ||
|
|
f8247b7b65 | ||
|
|
b8bc69f0cb | ||
|
|
1be2f70fd6 | ||
|
|
22e848ef8b | ||
|
|
01cbcbf9ee | ||
|
|
63ea6e613b | ||
|
|
290570c778 | ||
|
|
5899eff867 | ||
|
|
8e2f579ed7 | ||
|
|
b88b56879d | ||
|
|
981ac7358a | ||
|
|
fa8f570549 | ||
|
|
baeda9f1f2 | ||
|
|
9fad7502a3 | ||
|
|
b407b86945 | ||
|
|
d7d9103e4d | ||
|
|
98728f35b2 | ||
|
|
fd06c5a402 | ||
|
|
a33789bb25 | ||
|
|
a49713d90f | ||
|
|
8147523c19 | ||
|
|
a8a1f8e1a9 | ||
|
|
bebfe13851 | ||
|
|
a910695a09 | ||
|
|
d217308abc | ||
|
|
f1659ca18a | ||
|
|
dd808adc38 | ||
|
|
f0cbca1045 | ||
|
|
f6543a51df | ||
|
|
b0c2825c6b | ||
|
|
ca222a05e8 | ||
|
|
e9b3d1407b | ||
|
|
39282f6184 | ||
|
|
69d74d0de3 | ||
|
|
2818f64dd3 | ||
|
|
19fa0be7d6 | ||
|
|
534104b60c | ||
|
|
ca0c9fc210 | ||
|
|
2f77984240 | ||
|
|
e1fb8ecee6 | ||
|
|
3e03623d57 | ||
|
|
d25fc202b4 | ||
|
|
d11e75dd3e | ||
|
|
fe9343dea7 | ||
|
|
f75b90ee08 | ||
|
|
6fc01e7a9d | ||
|
|
3866b3b27c | ||
|
|
c74cf1bb3f | ||
|
|
51998fa861 |
42
.github/workflows/build.yml
vendored
Normal file
42
.github/workflows/build.yml
vendored
Normal 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
|
||||
|
||||
26
config.toml
26
config.toml
@@ -1,6 +1,6 @@
|
||||
# Be sure to change these!
|
||||
base_url = "https://blog.dich.bid"
|
||||
title = "Dich'blog"
|
||||
title = "Dich's Blog"
|
||||
description = "用电子罗盘,转赛博核桃,勘电磁风水,寻网络龙脉"
|
||||
|
||||
# Sass compilation is required
|
||||
@@ -34,10 +34,10 @@ accent_color = "blue"
|
||||
# One of: blue, dark, green, orange, pink, red, light, auto
|
||||
# Enabling dark background will also modify primary font color to be darker.
|
||||
# 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"
|
||||
logo_text = "Dich'blog"
|
||||
logo_text = "Dich's Blog"
|
||||
|
||||
# The logo link - defaults to base_url.
|
||||
#logo_home_link = "/take/me/away!"
|
||||
@@ -55,21 +55,23 @@ author = "Dichgrem"
|
||||
menu_items = [
|
||||
# each of these is optional, name and url are required
|
||||
# $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
|
||||
# see documentation below for more details
|
||||
{name = "archive", url = "$BASE_URL/archive"},
|
||||
{name = "tags", url = "$BASE_URL/tags"},
|
||||
{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 = "Archive", url = "$BASE_URL/archive"},
|
||||
{name = "Weekly", url = "$BASE_URL/weekly"},
|
||||
|
||||
{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
|
||||
{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
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
+++
|
||||
title = "电子邮件是如何工作的:SPF/DKIM/DMARC"
|
||||
title = "网络艺术:电子邮件的工作原理"
|
||||
date = 2024-02-20
|
||||
|
||||
[taxonomies]
|
||||
tags = ["网络艺术"]
|
||||
tags = ["Network"]
|
||||
+++
|
||||
|
||||
前言 在互联网的日常使用中,电子邮件作为一项基础服务扮演着重要的角色。尽管在过去几十年里出现了各种新型的通讯方式,但电子邮件仍然保持着其不可替代的地位。了解电子邮件的工作原理,有助于更好地理解这一基础服务是如何运作的。
|
||||
@@ -120,7 +120,7 @@ DKIM (DomainKeys Identified Mail) 的缩写,允许发送者通过在邮件的
|
||||
|
||||
经过了 SPF 和 DKIM 的保证,是不是就可以完美的发送接收邮件了?其实并不能,我们通过邮件后台来看一下邮件的原始文本。
|
||||
|
||||
````
|
||||
````bash
|
||||
MIME-Version: 1.0
|
||||
Return-Path: xxx@fake.com
|
||||
DKIM-Signature: d=fake.com,b=adceabkekd12
|
||||
@@ -167,5 +167,111 @@ SPF 解决了接收方验证发件人域名 SPF 记录内 IP 地址从而验证
|
||||
当邮件服务器接收到邮件时,先验证 DKIM,SPF,然后再根据 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 检查:** 发送邮件服务器可能会执行 SPF(Sender Policy Framework)检查。它查询发件人域名的 DNS 记录,以确认发送邮件的服务器是否被授权发送邮件。
|
||||
|
||||
- **DKIM 签名:** 发送邮件服务器对邮件进行 DKIM(DomainKeys Identified Mail)签名。它使用发件人域名的私钥对邮件进行加密签名,以确保邮件内容在传输过程中不被篡改。
|
||||
|
||||
- **SMTP 发送邮件:** 发送邮件服务器使用 SMTP(简单邮件传输协议)将邮件发送到接收邮件服务器。SMTP 服务器与接收邮件服务器之间建立连接,并通过指定的端口(通常是 25 端口)传输邮件。
|
||||
|
||||
**接收方(收件人):**
|
||||
|
||||
- **SMTP 接收邮件:** 接收邮件服务器接收到发送方发送的邮件。SMTP 协议负责将邮件从发送方传输到接收方。
|
||||
|
||||
- **SPF 验证:** 接收邮件服务器执行 SPF 验证,检查发送方服务器的 IP 地址是否在发件人域名的 SPF 记录中被授权发送邮件。
|
||||
|
||||
- **DKIM 验证:** 接收邮件服务器对收到的邮件执行 DKIM 验证。它使用发件人域名的公钥来验证邮件的 DKIM 签名,以确保邮件内容的完整性和真实性。
|
||||
|
||||
- **DMARC 检查:** 如果接收邮件服务器支持 DMARC(Domain-based Message Authentication, Reporting, and Conformance),它会执行 DMARC 检查。DMARC 结合了 SPF 和 DKIM,允许域名所有者指定如何处理未通过验证的邮件。
|
||||
|
||||
- **投递邮件到邮箱:** 如果邮件通过了所有的验证步骤,并且没有被识别为垃圾邮件,接收邮件服务器将把邮件投递到收件人的邮箱中。
|
||||
|
||||
**邮件获取(收件人):**
|
||||
|
||||
- **POP3 获取邮件(可选):** 收件人可以使用 POP3(邮局协议版本3)从邮件服务器上下载邮件到本地设备。POP3 客户端通过指定的端口(通常是 110 端口)连接到邮件服务器,并下载邮件到本地设备上。根据设置,邮件可能会从服务器上删除。
|
||||
|
||||
- **IMAP 获取邮件(可选):** 收件人可以使用 IMAP(互联网邮件访问协议)从邮件服务器上获取邮件。IMAP 允许邮件保留在服务器上,并且在多个设备之间同步邮件状态。IMAP 客户端通过指定的端口(通常是 143 端口)连接到邮件服务器,并获取邮件列表和邮件内容。
|
||||
|
||||
---
|
||||
**Done.**
|
||||
|
||||
|
||||
|
||||
@@ -1,114 +1,100 @@
|
||||
+++
|
||||
title = "电子邮件是如何工作的:POP3/IMAP/SMTP"
|
||||
date = 2024-02-21
|
||||
title = "网络艺术:自建域名邮箱"
|
||||
date = 2024-02-22
|
||||
|
||||
[taxonomies]
|
||||
tags = ["网络艺术"]
|
||||
tags = ["Network"]
|
||||
+++
|
||||
|
||||
前言 POP3、IMAP 和 SMTP 是用于电子邮件传输的常见协议和服务,这些协议共同构成了电子邮件系统的基础,允许用户接收、发送和管理电子邮件。
|
||||
前言 poste.io 邮件服务基于 Docker 搭建,用的是 Haraka + Dovecot + SQLite 邮件系统,占用资源较少,安装简单,适合个人使用。
|
||||
|
||||
<!-- more -->
|
||||
|
||||
1. **POP3(邮局协议版本3)**:POP3 是一种用于接收电子邮件的协议。当你使用 POP3 时,电子邮件会从服务器下载到你的设备上,并且通常会从服务器上删除。这意味着邮件只存在于你的设备上,而不再保留在服务器上。POP3 通常用于单一设备或者设备上少量的邮件存储需求。
|
||||
2. **IMAP(互联网邮件访问协议)**:IMAP 也是一种用于接收电子邮件的协议,但它与 POP3 不同的是,IMAP 允许邮件保留在服务器上,并且同步到多个设备上。这意味着无论你使用哪个设备访问邮件,都能看到同样的邮件状态,包括已读、未读、已删除等。IMAP 适用于需要在多个设备之间同步邮件的情况,例如在手机、平板电脑和台式电脑之间。
|
||||
3. **SMTP(简单邮件传输协议)**:SMTP 是用于发送电子邮件的协议。当你发送一封电子邮件时,你的邮件客户端会使用 SMTP 协议将邮件发送到电子邮件服务器。SMTP 负责将邮件从发送者的电子邮件客户端传送到接收者的邮件服务器。SMTP 是一个推送协议,它将邮件推送给服务器,而不是拉取邮件。
|
||||
## VPS上的配置
|
||||
|
||||
这是每个协议的简要技术原理:
|
||||
|
||||
## **POP3(邮局协议版本3)**
|
||||
|
||||
- 客户端连接到邮件服务器上的 POP3 端口(通常是 110 端口)。
|
||||
- 客户端发送身份验证信息(通常是用户名和密码)以登录到邮箱。
|
||||
- 一旦登录成功,客户端可以请求收件箱中的邮件列表。
|
||||
- 客户端可以选择下载邮件到本地设备。
|
||||
- 下载的邮件通常从服务器上删除,但可以根据设置保留一份副本。
|
||||
- 客户端可以选择在下载后删除邮件,或者在稍后删除它们。
|
||||
|
||||
## **IMAP(互联网邮件访问协议)**:
|
||||
|
||||
- 客户端连接到邮件服务器上的 IMAP 端口(通常是 143 端口)。
|
||||
- 客户端发送身份验证信息(通常是用户名和密码)以登录到邮箱。
|
||||
- 一旦登录成功,客户端可以请求收件箱中的邮件列表,以及邮件的状态信息(如已读、未读、已删除等)。
|
||||
- 客户端可以选择下载完整的邮件或邮件的部分内容到本地设备,同时保留邮件在服务器上的副本。
|
||||
- 客户端对邮件的操作(如标记为已读、移动到文件夹等)将反映在服务器上,从而在其他设备上同步。
|
||||
|
||||
## **SMTP(简单邮件传输协议)**:
|
||||
|
||||
- 客户端连接到邮件服务器上的 SMTP 端口(通常是 25 端口)。
|
||||
- 客户端发送邮件内容和邮件头信息(如发件人、收件人、主题等)给服务器。
|
||||
- 服务器接受邮件,并将其转发到接收者的邮件服务器。
|
||||
- 接收者的邮件服务器接收邮件,并将其存储在相应的收件人邮箱中。
|
||||
- SMTP 是一个简单的推送协议,它负责将邮件从发送方传送到接收方,但不涉及接收方对邮件的确认或响应。
|
||||
|
||||
## **它们的区别和共同点:**
|
||||
### 修改VPS hostname
|
||||
```bash
|
||||
hostnamectl set-hostname mail.your-domain.com
|
||||
```
|
||||
### 修改hosts文件
|
||||
```bash
|
||||
vim /etc/hosts
|
||||
```
|
||||
添加一行
|
||||
```bash
|
||||
127.0.1.1 localhost.localdomain mail.your-domain.com
|
||||
```
|
||||
|
||||
|
||||
**区别:**
|
||||
## 安装poste
|
||||
|
||||
**功能:**
|
||||
docker compose文件示例:
|
||||
|
||||
- POP3 主要用于从邮件服务器上下载邮件到本地设备,通常会将邮件从服务器上删除。
|
||||
- IMAP 允许用户在多个设备之间同步邮件状态,并且邮件保留在服务器上。
|
||||
- SMTP 用于发送电子邮件。
|
||||
```yaml
|
||||
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
|
||||
```
|
||||
|
||||
- POP3 在客户端下载邮件后通常会将邮件从服务器上删除,因此邮件只存在于本地设备上。
|
||||
- IMAP 允许邮件在多个设备之间同步,因为邮件保留在服务器上。
|
||||
- SMTP 不管理邮件存储,它只是负责将邮件从发送方传送到接收方。
|
||||
- 禁用反病毒功能(DISABLE_CLAMAV=TRUE)、禁用反垃圾邮件功能(DISABLE_RSPAMD=TRUE),可以大幅减低内存和CPU占用,请酌情设置禁用选项。
|
||||
|
||||
**端口号:**
|
||||
- 禁用WEB收发功能(DISABLE_ROUNDCUBE=TRUE),可以进一步减少资源占用,不过非必要不建议禁止。
|
||||
|
||||
- POP3 默认端口号是 110。
|
||||
- IMAP 默认端口号是 143。
|
||||
- SMTP 默认端口号是 25。
|
||||
- 8808为http端口,可以根据自己的需求修改。
|
||||
|
||||
**操作方式:**
|
||||
|
||||
- POP3 是拉取协议,客户端需要主动连接到服务器并拉取邮件。
|
||||
- IMAP 是双向同步协议,客户端与服务器之间进行交互,可以同步邮件状态。
|
||||
- SMTP 是推送协议,用于将邮件从发送方传送到接收方。
|
||||
## 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.
|
||||
|
||||
**发送方(发件人):**
|
||||
|
||||
- **撰写邮件:** 发件人使用邮件客户端(如Outlook、Gmail等)撰写邮件,并填写收件人的电子邮件地址、主题和邮件内容。
|
||||
|
||||
- **SPF 检查:** 发送邮件服务器可能会执行 SPF(Sender Policy Framework)检查。它查询发件人域名的 DNS 记录,以确认发送邮件的服务器是否被授权发送邮件。
|
||||
|
||||
- **DKIM 签名:** 发送邮件服务器对邮件进行 DKIM(DomainKeys Identified Mail)签名。它使用发件人域名的私钥对邮件进行加密签名,以确保邮件内容在传输过程中不被篡改。
|
||||
|
||||
- **SMTP 发送邮件:** 发送邮件服务器使用 SMTP(简单邮件传输协议)将邮件发送到接收邮件服务器。SMTP 服务器与接收邮件服务器之间建立连接,并通过指定的端口(通常是 25 端口)传输邮件。
|
||||
|
||||
**接收方(收件人):**
|
||||
|
||||
- **SMTP 接收邮件:** 接收邮件服务器接收到发送方发送的邮件。SMTP 协议负责将邮件从发送方传输到接收方。
|
||||
|
||||
- **SPF 验证:** 接收邮件服务器执行 SPF 验证,检查发送方服务器的 IP 地址是否在发件人域名的 SPF 记录中被授权发送邮件。
|
||||
|
||||
- **DKIM 验证:** 接收邮件服务器对收到的邮件执行 DKIM 验证。它使用发件人域名的公钥来验证邮件的 DKIM 签名,以确保邮件内容的完整性和真实性。
|
||||
|
||||
- **DMARC 检查:** 如果接收邮件服务器支持 DMARC(Domain-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 协议的作用。这些技术和协议共同构成了电子邮件系统的基础架构,保障了邮件的传输安全性和可靠性。
|
||||
| 协议 | 服务器地址 | 端口 | 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.
|
||||
|
||||
@@ -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.
|
||||
@@ -1,9 +1,9 @@
|
||||
+++
|
||||
title = "Network的艺术:国内至国际骨干ISP线路整理"
|
||||
title = "网络艺术:国内/国际骨干ISP线路整理"
|
||||
date = 2024-02-10
|
||||
|
||||
[taxonomies]
|
||||
tags = ["网络艺术"]
|
||||
tags = ["Network"]
|
||||
+++
|
||||
|
||||
前言 本文主要探讨的是IPv4网络,国际出口线路的质量分析以及各大ISP的介绍。
|
||||
@@ -68,7 +68,7 @@ nexttrace --queries 3 --parallel-requests 4 example.com
|
||||
nexttrace --table --no-rdns www.example.org
|
||||
```
|
||||
### 示例
|
||||
```
|
||||
```bash
|
||||
❯ nexttrace 38.207.170.5x
|
||||
NextTrace v1.4.0 2025-04-16T01:10:07Z dccc41b
|
||||
[NextTrace API] preferred API IP - 198.18.0.61 - 601.41ms - 🐠 (Relay) → Misaka.HKG
|
||||
|
||||
238
content/Network-aria2.md
Normal file
238
content/Network-aria2.md
Normal 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+独立面板的方法,但这样就不能接管浏览器的下载,适合其他环境使用。
|
||||
|
||||
这里推荐使用 AriaNg 前端,AriaNg 使用纯 html & javascript 开发, 所以其不需要任何编译器或运行环境.
|
||||
|
||||

|
||||
|
||||
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.**
|
||||
@@ -1,9 +1,9 @@
|
||||
+++
|
||||
title = "Network的艺术:CDN技术与应用"
|
||||
title = "网络艺术:CDN技术与应用"
|
||||
date = 2024-02-16
|
||||
|
||||
[taxonomies]
|
||||
tags = ["网络艺术"]
|
||||
tags = ["Network"]
|
||||
+++
|
||||
|
||||
前言 内容分发网络(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。
|
||||
|
||||
Cloudflare
|
||||
```
|
||||
```bash
|
||||
# https://www.cloudflare.com/ips-v4
|
||||
103.21.244.0/22
|
||||
103.22.200.0/22
|
||||
@@ -210,45 +210,45 @@ Cloudflare
|
||||
2c0f:f248::/32
|
||||
```
|
||||
Gcore
|
||||
```
|
||||
```bash
|
||||
https://api.gcore.com/cdn/public-ip-list
|
||||
```
|
||||
BunnyCDN
|
||||
```
|
||||
```bash
|
||||
https://api.bunny.net/system/edgeserverlist
|
||||
https://api.bunny.net/system/edgeserverlist/plain
|
||||
```
|
||||
Cloudfront
|
||||
```
|
||||
```bash
|
||||
https://d7uri8nf7uskq.cloudfront.net/tools/list-cloudfront-ips
|
||||
https://files.imunify360.com/static/whitelist/v2/cloudfront-cdn.txt
|
||||
```
|
||||
CDN77
|
||||
```
|
||||
```bash
|
||||
https://files.imunify360.com/static/whitelist/v2/cdn77.txt
|
||||
```
|
||||
Fastly
|
||||
```
|
||||
```bash
|
||||
https://api.fastly.com/public-ip-list
|
||||
```
|
||||
Keycdn
|
||||
```
|
||||
```bash
|
||||
https://www.keycdn.com/shield-prefixes.json
|
||||
```
|
||||
quic.cloud
|
||||
```
|
||||
```bash
|
||||
https://quic.cloud/ips
|
||||
```
|
||||
Google CDN
|
||||
```
|
||||
```bash
|
||||
https://files.imunify360.com/static/whitelist/v2/google-cdn.txt
|
||||
```
|
||||
CacheFly
|
||||
```
|
||||
```bash
|
||||
https://cachefly.cachefly.net/ips/cdn.txt
|
||||
```
|
||||
Akaima
|
||||
```
|
||||
```bash
|
||||
https://techdocs.akamai.com/origin-ip-acl/docs/update-your-origin-server
|
||||
```
|
||||
---
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
+++
|
||||
title = "Network的艺术:Docker建站与反向代理"
|
||||
title = "网络艺术:Docker建站与反向代理"
|
||||
date = 2024-07-14
|
||||
|
||||
[taxonomies]
|
||||
tags = ["网络艺术"]
|
||||
tags = ["Network"]
|
||||
+++
|
||||
|
||||
前言 Docker的出现极大简化了建站流程,较过去的LAMP方式优雅了许多,配合Nginx反向代理可以快速上线HTTPS站点。
|
||||
@@ -13,7 +13,7 @@ tags = ["网络艺术"]
|
||||
|
||||
这里以Debian12为例:
|
||||
- 官方安装脚本:
|
||||
```
|
||||
```bash
|
||||
curl -fsSL https://get.docker.com -o 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
|
||||
````
|
||||
|
||||
创建一个目录来存储密钥环:
|
||||
|
||||
````
|
||||
````bash
|
||||
sudo install -m 0755 -d /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
|
||||
````
|
||||
|
||||
使用 chmod 命令更改 docker.gpg 文件的权限:
|
||||
|
||||
````
|
||||
````bash
|
||||
sudo chmod a+r /etc/apt/keyrings/docker.gpg
|
||||
````
|
||||
|
||||
使用以下命令为 Docker 设置存储库:
|
||||
|
||||
````
|
||||
````bash
|
||||
echo \
|
||||
"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" | \
|
||||
@@ -53,17 +53,175 @@ echo \
|
||||
````
|
||||
现在可以使用以下命令更新存储库索引并安装 Docker:
|
||||
|
||||
````
|
||||
````bash
|
||||
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
|
||||
|
||||
- 目标:创建一个``Searxng服务``并对外开放。
|
||||
- 方法:创建两个 docker-compose 文件,并``使用同一个外部 Docker 网络``使两个服务互联。
|
||||
|
||||
0. 首先``创建好工作目录``,例如:
|
||||
```
|
||||
```bash
|
||||
.
|
||||
└── docker
|
||||
├── 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):
|
||||
```
|
||||
```bash
|
||||
docker network create nginx
|
||||
```
|
||||
这样,无论是哪个 docker-compose 项目中的容器,只要加入此网络,就能直接通信。
|
||||
|
||||
2. 编写 searxng 的 docker-compose 文件
|
||||
```
|
||||
```yaml
|
||||
version: '3'
|
||||
|
||||
services:
|
||||
@@ -110,7 +268,7 @@ networks:
|
||||
3. 编写 Nginx 的 docker-compose 文件
|
||||
|
||||
创建 nginx 的 docker-compose 文件,例如:
|
||||
```
|
||||
```yaml
|
||||
version: '3'
|
||||
|
||||
services:
|
||||
@@ -133,7 +291,7 @@ networks:
|
||||
external: true
|
||||
```
|
||||
4. 编写 Nginx 配置文件
|
||||
```
|
||||
```conf
|
||||
server {
|
||||
listen 80;
|
||||
server_name searxng.dich.bid;
|
||||
@@ -162,11 +320,11 @@ server {
|
||||
5. 启动服务
|
||||
|
||||
- 启动 searxng 服务:
|
||||
```
|
||||
```bash
|
||||
docker-compose -f docker-compose.searxng.yml up -d
|
||||
```
|
||||
- 启动 nginx 服务:
|
||||
```
|
||||
```bash
|
||||
docker-compose -f docker-compose.nginx.yml up -d
|
||||
```
|
||||
由于两者都加入了外部网络 nginx,nginx 内的``proxy_pass http://searxng:8080``就能解析到 searxng 容器,实现反向代理效果。现在,访问``http://ip:18080``就可以访问Searxng搜索引擎。
|
||||
@@ -179,7 +337,7 @@ docker-compose -f docker-compose.nginx.yml up -d
|
||||
1. 证书生成
|
||||
|
||||
- 如果只是用于测试可以生成自签名证书:
|
||||
```
|
||||
```bash
|
||||
mkdir -p /home/dich/docker/nginx/certs
|
||||
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
|
||||
-keyout /home/dich/docker/nginx/certs/privkey.pem \
|
||||
@@ -188,7 +346,7 @@ openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
|
||||
```
|
||||
|
||||
2. 更改searxng.conf:
|
||||
```
|
||||
```conf
|
||||
server {
|
||||
listen 443 ssl;
|
||||
server_name searxng.dich.bid;
|
||||
@@ -227,7 +385,7 @@ server {
|
||||
```
|
||||
|
||||
3. 更改docker-compose.nginx.yml
|
||||
```
|
||||
```yaml
|
||||
version: '3'
|
||||
|
||||
services:
|
||||
@@ -254,11 +412,11 @@ networks:
|
||||
4. 启动新配置
|
||||
|
||||
- 重启容器
|
||||
```
|
||||
```bash
|
||||
sudo docker compose -f docker-compose.nginx.yml up -d
|
||||
```
|
||||
- 查看日志
|
||||
```
|
||||
```bash
|
||||
sudo docker logs searxng
|
||||
```
|
||||
## Caddy
|
||||
@@ -266,7 +424,7 @@ sudo docker logs searxng
|
||||
> Caddy 自 2015 年起用 Go 语言重写,定位为“开箱即用”的现代 Web 服务器,内置自动 Let’s Encrypt 证书管理和续期,默认支持 HTTP/2 及 HTTP/3(QUIC),并通过简洁明了的 Caddyfile 语法极大降低配置成本.
|
||||
|
||||
0. 示例结构:
|
||||
```
|
||||
```bash
|
||||
.
|
||||
└── compose
|
||||
├── certs
|
||||
@@ -279,11 +437,11 @@ sudo docker logs searxng
|
||||
└── Caddyfile
|
||||
```
|
||||
1. 同样创建名为Caddy的docker网络:
|
||||
```
|
||||
```bash
|
||||
docker network create caddy
|
||||
```
|
||||
2. 编写Caddy的compose,可以看到caddy可以自带签发证书:
|
||||
```
|
||||
```yaml
|
||||
version: '3.7'
|
||||
|
||||
# 自动签发模式
|
||||
@@ -340,7 +498,7 @@ networks:
|
||||
external: true
|
||||
```
|
||||
3. 编写Caddyfile,可以看到自动开启HTTPS模式:
|
||||
```
|
||||
```conf
|
||||
# 自动签发模式
|
||||
searxng.dich.bid {
|
||||
reverse_proxy searxng:8080 {
|
||||
@@ -1,9 +1,9 @@
|
||||
+++
|
||||
title = "Network的艺术:下载技术的历史"
|
||||
date = 2024-02-09
|
||||
title = "下载系列(1):下载技术的历史"
|
||||
date = 2025-04-11
|
||||
|
||||
[taxonomies]
|
||||
tags = ["网络艺术"]
|
||||
tags = ["Network"]
|
||||
+++
|
||||
|
||||
前言 下载,就是将我们所需要的文件数据,通过网络从拥有该文件资源的计算机上传输过来并保存到我们的计算机上,供我们使用。本系列将详细讲述各种常见网络下载技术的原理,包括HTTP,FTP,BT等等。
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
+++
|
||||
title = "乱七八糟:FRP使用指南"
|
||||
title = "网络艺术:FRP使用指南"
|
||||
date = 2025-03-01
|
||||
|
||||
[taxonomies]
|
||||
tags = ["乱七八糟"]
|
||||
tags = ["Network"]
|
||||
+++
|
||||
|
||||
前言 FRP (Fast Reverse Proxy) 是一个用Go语言开发的高性能反向代理应用,可以帮助您轻松地进行内网穿透,对外提供服务.
|
||||
@@ -1,9 +1,9 @@
|
||||
+++
|
||||
title = "Network的艺术:家庭组网方案与设备选购"
|
||||
title = "家庭组网系列(1):方案与设备选购"
|
||||
date = 2025-01-21
|
||||
|
||||
[taxonomies]
|
||||
tags = ["网络艺术"]
|
||||
tags = ["Network"]
|
||||
+++
|
||||
|
||||
前言 本文介绍一些家庭组网方案和家庭网络升级方案。
|
||||
89
content/Network-homenet-2.md
Normal file
89
content/Network-homenet-2.md
Normal 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单线程下载测试示例:
|
||||

|
||||
|
||||
如果你的路由器为闭源固件,也可以到在线测速站进行简单测试:
|
||||
|
||||
- [测速网: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三个值,即为最小/平均/最大延迟;
|
||||
|
||||

|
||||
|
||||
也可以使用iperf3来测试UDP抖动:使用命令``iperf3 -c <server_ip> -u -b 100M -t 10``,-u表示使用udp,-100M表示使用100兆带宽,可逐渐调高并接近极限性能。
|
||||
|
||||

|
||||
|
||||
## 转发
|
||||
|
||||
路由器的CPU作为核心,需要处理外网与内网IP的转发,这种转发能力称为包转发率,通常拿小包的转发率来衡量能力的高低。测试“小包转发能力”其实就是测试 PPS(Packets Per Second)能力,在x86软路由上面这个性能尤为重要,因为无线路由器有硬件级别的加速芯片而软路由没有。
|
||||
|
||||
> 以单位时间内发送64byte的数据包(最小包)的个数作为计算基准的。对于千兆以太网来说,计算方法如下:1,000,000,000bps/8bit/(64+8+12)byte=1,488,095pps,说明:当以太网帧为64byte时,需考虑8byte的帧头和12byte的帧间隙的固定开销。故一个线速的千兆以太网端口在转发64byte包时的包转发率为1.488Mpps
|
||||
|
||||
测试转发性能需要发包-转发-收包三台设备,或者使用环回测试仪。由于iperf3 处于 TCP/UDP 层,包也会变大且加了协议头,测试的结果误差很大,因此不建议用其进行测试小包性能。
|
||||
|
||||
---
|
||||
未完待续。
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
195
content/Network-ssh.md
Normal file
195
content/Network-ssh.md
Normal file
@@ -0,0 +1,195 @@
|
||||
+++
|
||||
title = "网络艺术:SSH使用指南"
|
||||
date = 2025-05-02
|
||||
|
||||
[taxonomies]
|
||||
tags = ["Network"]
|
||||
+++
|
||||
|
||||
前言 SSH(Secure 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的书签中写入服务器的地址,登录用户和密钥,只要打开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.**
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
+++
|
||||
title = "Network的艺术:SSL/TLS证书"
|
||||
title = "网络艺术:SSL/TLS证书"
|
||||
date = 2024-02-15
|
||||
|
||||
[taxonomies]
|
||||
tags = ["网络艺术"]
|
||||
tags = ["Network"]
|
||||
+++
|
||||
|
||||
前言 什么是SSL/TLS证书?它有什么作用?如何部署?
|
||||
|
||||
241
content/Network-yt-dlp.md
Normal file
241
content/Network-yt-dlp.md
Normal file
@@ -0,0 +1,241 @@
|
||||
+++
|
||||
title = "下载系列(2):Yt-dlp使用指南"
|
||||
date = 2025-04-12
|
||||
|
||||
[taxonomies]
|
||||
tags = ["Network"]
|
||||
+++
|
||||
|
||||
前言 yt-dlp是一款功能强大的命令行工具,专注于下载视频与音频内容,支持数千个平台,是开源下载工具爱好者的常用选择。
|
||||
|
||||
<!-- more -->
|
||||
|
||||
有时候我们想要下载网络上的某些视频,比如Bilibili,YouTube等等,但它们没有提供下载按钮,这时候就可以用开源的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
|
||||
];
|
||||
}
|
||||
```
|
||||
|
||||
### Android(Termux)
|
||||
|
||||
```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.**
|
||||
|
||||
@@ -103,17 +103,17 @@ tags = ["乱七八糟"]
|
||||
8. **Docker日志文件**:
|
||||
使用 `docker ps -a` 命令查找你感兴趣的容器的 ID。
|
||||
|
||||
````
|
||||
````bash
|
||||
docker ps -a
|
||||
````
|
||||
进入容器的日志目录,路径类似于 `/var/lib/docker/containers/<container-id>/`。
|
||||
|
||||
````
|
||||
````bash
|
||||
cd /var/lib/docker/containers/<container-id>/
|
||||
````
|
||||
使用命令清理或删除日志文件。你可以删除所有日志文件,或者只删除特定的日志文件。
|
||||
|
||||
````
|
||||
````bash
|
||||
# 删除所有日志文件
|
||||
rm *.log
|
||||
|
||||
@@ -125,13 +125,13 @@ tags = ["乱七八糟"]
|
||||
|
||||
你可以定期备份 Arch Linux 安装的软件列表,以便在需要时轻松还原。
|
||||
|
||||
````
|
||||
````bash
|
||||
pacman -Qqe > package-list.txt
|
||||
````
|
||||
|
||||
这将列出所有已安装的软件包,并将其保存到文件 `package-list.txt` 中。在还原系统时,你可以使用以下命令:
|
||||
|
||||
````
|
||||
````bash
|
||||
sudo pacman -S --needed - < package-list.txt
|
||||
````
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
+++
|
||||
title = "搭建个人信息流:RSS阅读指南"
|
||||
title = "乱七八糟:RSS阅读指南"
|
||||
date = 2024-03-05
|
||||
|
||||
[taxonomies]
|
||||
@@ -141,7 +141,7 @@ RSS客户端非常丰富,包括 Android 端,IOS 端,Windows 端,linux
|
||||
|
||||
(3)在文件中写入以下内容并保存:
|
||||
|
||||
```
|
||||
```yaml
|
||||
version: '3.4'
|
||||
|
||||
services:
|
||||
|
||||
@@ -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 现在提供三种版本, ``标准版、单文件版和 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.**
|
||||
@@ -18,7 +18,7 @@ tags = ["乱七八糟"]
|
||||
> 作者:Bill Bynum/Tracy Camp 威廉玛丽学院/科罗拉多矿业学院 2002年11月5日
|
||||
|
||||
## 目录
|
||||
```
|
||||
```bash
|
||||
1. 引言
|
||||
2. C-- 编译器语法
|
||||
3. 并发结构
|
||||
@@ -238,7 +238,7 @@ v(sem);
|
||||
|
||||
为帮助解释信号量的使用,我们提供以下简短示例:
|
||||
|
||||
```
|
||||
```java
|
||||
BACI System: C-- to PCODE Compiler, 09:24 2 May 2002
|
||||
Source file: semexample.cm Sun Apr 28 20:40:12 2002
|
||||
line pc
|
||||
@@ -277,7 +277,7 @@ line pc
|
||||
|
||||
我们使用以下命令生成上述编译器列表:
|
||||
|
||||
```
|
||||
```bash
|
||||
prompt% bacc semexample
|
||||
Pcode and tables are stored in semexample.pco
|
||||
Compilation listing is stored in semexample.lst
|
||||
@@ -285,7 +285,7 @@ Compilation listing is stored in semexample.lst
|
||||
|
||||
然后可以使用 BACI PCODE 解释器执行 semexample.pco 文件:
|
||||
|
||||
```
|
||||
```bash
|
||||
prompt% bainterp semexample
|
||||
Source file: semexample.cm Sun Apr 28 20:40:12 2002
|
||||
Executing PCODE ...
|
||||
@@ -295,7 +295,7 @@ before p(count) value of count is 1
|
||||
|
||||
这是程序可能产生的三种可能输出之一。另外两种可能的程序输出是:
|
||||
|
||||
```
|
||||
```bash
|
||||
prompt% bainterp semexample
|
||||
Source file: semexample.cm Sun Apr 28 20:40:12 2002
|
||||
Executing PCODE ...
|
||||
@@ -303,7 +303,7 @@ before p(count) value of count is 0
|
||||
before v(count) value of count is 0
|
||||
```
|
||||
|
||||
```
|
||||
```bash
|
||||
prompt% bainterp semexample
|
||||
Source file: semexample.cm Sun Apr 28 20:40:12 2002
|
||||
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" 文件;此文件由解释器使用。
|
||||
|
||||
```
|
||||
```java
|
||||
BACI System: C-- to PCODE Compiler, 09:24 2 May 2002
|
||||
Source file: incremen.cm Wed Oct 22 21:18:02 1997
|
||||
line pc
|
||||
@@ -566,7 +566,7 @@ line pc
|
||||
|
||||
以下列表由 BACI 解释器生成。解释器执行编译到文件 "incremen.pco" 中的程序。
|
||||
|
||||
```
|
||||
```java
|
||||
Source file: incremen.cm Wed Oct 22 21:18:02 1997
|
||||
Executing PCODE ...
|
||||
C n =1 i =A n =1 C2 i =
|
||||
@@ -600,7 +600,7 @@ dos2unix ~/Git/java/baci/scripts/baci
|
||||
```
|
||||
|
||||
- 编写baci脚本
|
||||
```
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
# 定位到项目根目录(包含 javabaci 子目录的目录)
|
||||
BASEDIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
@@ -613,19 +613,19 @@ exec java -cp "$CLASSPATH" "$@"
|
||||
```
|
||||
|
||||
- 给baci授予可执行权限
|
||||
```
|
||||
```bash
|
||||
chmod +x ~/Git/java/baci/scripts/baci
|
||||
```
|
||||
- 添加系统环境变量
|
||||
```
|
||||
```bash
|
||||
fish_add_path ~/Git/java/baci/scripts
|
||||
```
|
||||
- 查看baci是否存在
|
||||
```
|
||||
```bash
|
||||
which baci
|
||||
```
|
||||
- 现在即可编译运行
|
||||
```
|
||||
```bash
|
||||
baci bacc ex3_1.cm
|
||||
baci bainterp ex3_1
|
||||
```
|
||||
|
||||
@@ -24,7 +24,7 @@ tags = ["乱七八糟"]
|
||||
|
||||
- 首先你需要有一台自己的云服务器,建议在1核1G以上配置,并安装Debian系统;
|
||||
- 随后我们安装1panel,执行以下命令一键安装:
|
||||
```
|
||||
```bash
|
||||
curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh && sudo bash quick_start.sh
|
||||
```
|
||||
> 1panel依赖于docker,如果实现没有安装docker,脚本会帮你安装。
|
||||
@@ -54,33 +54,33 @@ curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_
|
||||
1. **安装Hugo**:选择好你的框架与主题后(这里以hugo为例子),随后安装hugo以及对应的依赖:
|
||||
|
||||
- **Windows**
|
||||
```
|
||||
```bash
|
||||
# 打开以管理员模式运行的PowerShell,输入命令安装 Hugo Extended:
|
||||
winget install Hugo.Hugo.Extended
|
||||
```
|
||||
- **Arch linux**
|
||||
```
|
||||
```bash
|
||||
paru -S hugo
|
||||
```
|
||||
- **检查版本**
|
||||
```
|
||||
```bash
|
||||
hugo version
|
||||
```
|
||||
|
||||
2. **创建新的 Hugo 站点**:选择一个文件夹打开命令行,执行:
|
||||
```
|
||||
```bash
|
||||
hugo new site myblog
|
||||
```
|
||||
该命令会在``myblog``文件夹下生成hugo的基础目录。
|
||||
|
||||
3. **安装主题**,这里以[hugo-blog-awesome](https://jamstackthemes.dev/theme/hugo-blog-awesome/)主题为例:
|
||||
|
||||
```
|
||||
```bash
|
||||
cd myblog
|
||||
git clone https://github.com/hugo-sid/hugo-blog-awesome.git themes/hugo-blog-awesome
|
||||
```
|
||||
并在``hugo.toml``顶层添加:
|
||||
```
|
||||
```bash
|
||||
theme = "hugo-blog-awesome"
|
||||
```
|
||||
这样 Hugo 在构建时会从 themes/ 目录加载主题文件。后续可使用``git pull``获取主题更新。
|
||||
@@ -88,7 +88,7 @@ theme = "hugo-blog-awesome"
|
||||
> 你也可以直接用theme中的文件夹替换掉项目根目录下的同名文件夹,并再次修改。
|
||||
|
||||
4. **写入文章**:使用 Hugo 提供的命令创建新文章:
|
||||
```
|
||||
```bash
|
||||
hugo new posts/hello-world.md
|
||||
```
|
||||
该命令会在``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 -->``隔断
|
||||
|
||||
5. **本地测试**:在项目根目录运行:
|
||||
```
|
||||
```bash
|
||||
hugo server -D
|
||||
```
|
||||
然后在浏览器访问``http://localhost:1313``即可实时预览并查看更新效果。
|
||||
@@ -132,6 +132,22 @@ hugo server -D
|
||||
|
||||
**以上的功能和需求是否对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/)
|
||||
- [zola官方文档](https://www.getzola.org/documentation/getting-started/overview/)
|
||||
|
||||
@@ -173,6 +173,31 @@ tags = ["乱七八糟"]
|
||||
- [离散数学-东北大学](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)
|
||||
|
||||
## 英语相关
|
||||
|
||||
| 频道名称 | 频道 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)
|
||||
|
||||
@@ -26,19 +26,19 @@ tags = ["乱七八糟"]
|
||||
## 免密码运行TUN模式:
|
||||
|
||||
- 检查 polkit 服务是否正在运行
|
||||
```
|
||||
```bash
|
||||
systemctl status polkit
|
||||
```
|
||||
- 若返回状态为除 active (running) 之外的结果,运行
|
||||
```
|
||||
```bash
|
||||
sudo systemctl enable --now polkit
|
||||
```
|
||||
- 创建 polkit 策略
|
||||
```
|
||||
```bash
|
||||
sudo vi /etc/polkit-1/rules.d/99-nopassword.rules
|
||||
```
|
||||
- 添加以下内容并保存退出
|
||||
```
|
||||
```bash
|
||||
polkit.addRule(function (action, subject) {
|
||||
if (
|
||||
(action.id == "org.freedesktop.resolve1.set-domains" ||
|
||||
@@ -53,11 +53,11 @@ polkit.addRule(function (action, subject) {
|
||||
});
|
||||
```
|
||||
- 将当前用户添加至 wheel 组中,注意Debian 与衍生系统需要先创建 wheel 组,然后运行:
|
||||
```
|
||||
```bash
|
||||
sudo usermod -G wheel 当前用户
|
||||
```
|
||||
- 重新加载 polkit 使更改生效
|
||||
```
|
||||
```bash
|
||||
sudo systemctl restart polkit
|
||||
```
|
||||
|
||||
|
||||
@@ -6,391 +6,205 @@ date = 2023-12-15
|
||||
tags = ["乱七八糟"]
|
||||
+++
|
||||
|
||||
|
||||
|
||||
前言 Git,作为现代软件开发中不可或缺的版本控制工具,常常让初学者感到困惑。本文旨在介绍 Git 的全流程安装和基本使用,希望能够帮助新手更轻松地理解和掌握 Git 的基本概念和操作。
|
||||
<!-- 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`,它指向你最后一次提交的结果。
|
||||
- Linux:Ubuntu:`sudo apt install git` / Arch:`sudo pacman -S git`
|
||||
|
||||
安装完成后可以在终端中检测版本:
|
||||
|
||||

|
||||
|
||||
## 创建新仓库
|
||||
|
||||
首先我们需要得到一个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``
|
||||
- 或者使用SSH方法:``git clone git@github.com:Dichgrem/script.git``
|
||||
> 当你添加完毕后就无法在Github的设置中再次查看它了,确保了安全性.
|
||||
|
||||
>建议使用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配置
|
||||
```
|
||||
```bash
|
||||
git config --list
|
||||
```
|
||||
- 编辑Git配置文件
|
||||
```
|
||||
git config -e [--global]
|
||||
```
|
||||
- 设置提交代码时的用户信息
|
||||
```
|
||||
|
||||
- 设置提交代码时的用户信息,这里的name推荐和你的GitHub用户名一致,邮箱可以不为真实邮箱,比如``no-reply@github.com``
|
||||
```bash
|
||||
git config [--global] user.name "[name]"
|
||||
git config [--global] user.email "[email address]"
|
||||
```
|
||||
- 设置大小写敏感(windows不区分大小写的解决办法)
|
||||
```
|
||||
git config core.ignorecase false
|
||||
```
|
||||
## 连接远程仓库
|
||||
|
||||
连接到远程仓库并推送需要证明你有权写入仓库。早期Github可以使用密码认证,现在则使用密钥认证。
|
||||
> 注意!如果你填写了你的真实邮箱,同时这个仓库又是Public的,那么其他人可以看到你的邮箱!
|
||||
|
||||
- 生成密钥:
|
||||
```
|
||||
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
|
||||
```
|
||||
- 生成的文件位于``~/.ssh/config``路径下,带.pub后缀的文件为公钥,不带.pub后缀的为私钥,使用``cat ~/.ssh/id_rsa.pub``将公钥添加到github/gitee的设置-SSH中。
|
||||
- 配置默认主分支为Main
|
||||
|
||||
- 随后使用 `ssh-add` 命令将生成的密钥添加到 SSH 代理中。
|
||||
```
|
||||
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
|
||||
```bash
|
||||
git config --global init.defaultBranch main
|
||||
```
|
||||
|
||||
- 连接到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 git@github.com:Dichgrem/dichos.git
|
||||
```
|
||||
> 如果你运行``git remote -v``发现URL为HTTP格式则可以用下面的命令改为Git格式:
|
||||
```
|
||||
```bash
|
||||
# 例如:git remote set-url origin git@github.com:Dichgrem/dichos.git
|
||||
```
|
||||
|
||||
## 创建分支
|
||||
```
|
||||
git branch main
|
||||
```
|
||||
这将创建一个名为 main 的分支。
|
||||
## 4.推送代码
|
||||
|
||||
- 删除分支
|
||||
```
|
||||
git branch -d master
|
||||
```
|
||||
- 使用大写强制删除
|
||||
```
|
||||
git branch -D master
|
||||
```
|
||||
- 添加
|
||||
|
||||
|
||||
## 添加和提交
|
||||
|
||||
你可以提出更改(把它们添加到暂存区),使用如下命令:
|
||||
```
|
||||
git add <filename>
|
||||
在Git仓库中新建或修改文件后,使用如下命令把它们添加到暂存区:
|
||||
```bash
|
||||
git add *
|
||||
```
|
||||
这是 git 基本工作流程的第一步;使用如下命令以实际提交改动:
|
||||
```
|
||||
|
||||
- 提交
|
||||
|
||||
随后使用如下命令提交改动:
|
||||
```bash
|
||||
git commit -m "代码提交信息"
|
||||
# 例如:git commit -m "Initial commit"
|
||||
# 例如:git commit -m "update:mycode"
|
||||
```
|
||||
现在,你的改动已经提交到了 **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
|
||||
```
|
||||
可以把 **main** 换成你想要推送的任何分支,如**master**或者**test**
|
||||
|
||||
如果你的远程仓库是最新的,可以使用以下命令更新本地仓库:
|
||||
```
|
||||
git pull
|
||||
```
|
||||
## 合并分支
|
||||
> 想学习更多Git操作,可以使用这个[Git练习网站](https://learngitbranching.js.org/?locale=zh_CN)
|
||||
|
||||
分支是用来将特性开发绝缘开来的。比如你在本地的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` 目录结构
|
||||
|
||||
```bash
|
||||
.git/
|
||||
├── HEAD
|
||||
├── config
|
||||
@@ -411,95 +225,95 @@ git reset --hard HEAD~1
|
||||
│ └── 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/**:记录了引用(如分支、标签)的更新历史,有助于追踪操作记录。
|
||||
|
||||
* **objects/**:存储 Git 的所有对象,包括:
|
||||
|
||||
* **blob**:文件内容。
|
||||
* **tree**:目录结构。
|
||||
* **commit**:提交对象,记录提交信息和指向的树对象。
|
||||
* **tag**:标签对象。
|
||||
这些对象以 SHA-1 哈希命名,前两位作为子目录,其余作为文件名。
|
||||
|
||||
* **refs/**:存储所有引用,包括:
|
||||
|
||||
* **heads/**:本地分支。
|
||||
* **remotes/**:远程分支。
|
||||
* **tags/**:标签。
|
||||
|
||||
## Commit规范
|
||||
|
||||
### 提交信息的基本格式
|
||||
|
||||
- Header(头部)
|
||||
格式:
|
||||
```bash
|
||||
sudo pacman -S gnupg //安装 GPG
|
||||
gpg --full-generate-key //生成 GPG 密钥
|
||||
gpg --list-secret-keys --keyid-format=long //查看你生成的密钥 ID
|
||||
git config --global user.signingkey ABCDEF1234567890 //让 Git 使用该密钥签名
|
||||
git config --global commit.gpgsign true //启用自动签名所有提交
|
||||
gpg --armor --export ABCDEF1234567890 //导出公钥并添加到 GitHub
|
||||
```
|
||||
<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(正文)
|
||||
用于详细说明变更的动机、方法以及可能的影响,建议每行不超过 72 个字符。
|
||||
|
||||
- Footer(脚注)
|
||||
可选部分,用来引用相关 issue、任务或说明破坏性变更(例如:BREAKING CHANGE: ...)。例如:
|
||||
比如你修改了项目中的``fs/proc/base.c``,然后
|
||||
|
||||
```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.**
|
||||
|
||||
@@ -52,19 +52,19 @@ tags = ["乱七八糟"]
|
||||
|
||||
## 安装 GnuPG
|
||||
|
||||
```
|
||||
```bash
|
||||
paru -S gnupg
|
||||
```
|
||||
|
||||
## 生成公钥与私钥
|
||||
|
||||
使用如下命令:
|
||||
```
|
||||
```bash
|
||||
gpg --full-generate-key
|
||||
```
|
||||
生成流程:
|
||||
|
||||
```
|
||||
```bash
|
||||
gpg (GnuPG) 2.4.7; Copyright (C) 2024 g10 Code GmbH
|
||||
This is free software: you are free to change and redistribute it.
|
||||
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
|
||||
```
|
||||
|
||||
@@ -126,18 +126,18 @@ gpg --list-secret-keys --keyid-format long
|
||||
|
||||
例如上传你的 key:
|
||||
|
||||
```
|
||||
```bash
|
||||
gpg --send-keys <你的Long‑Key‑ID>
|
||||
```
|
||||
|
||||
默认为你的 gpg.conf 中配置的 keyserver,也可以显式指定:
|
||||
|
||||
```
|
||||
```bash
|
||||
gpg --keyserver hkps://keys.openpgp.org --send-keys <Key‑ID>
|
||||
```
|
||||
|
||||
也可以使用如下命令导出公钥为可读 ASCII 格式,类似ssh-keys,随后即可发布在个人博客上等等。
|
||||
```
|
||||
```bash
|
||||
gpg --armor --export <Key‑ID> > mypubkey.asc
|
||||
```
|
||||
|
||||
@@ -145,7 +145,7 @@ gpg --armor --export <Key‑ID> > mypubkey.asc
|
||||
|
||||
如果怀疑密钥被泄露或被中间人替换,立即发布“撤销证书”(revocation certificate)并上传到 keyserver。
|
||||
|
||||
```
|
||||
```bash
|
||||
gpg --gen-revoke <KeyID> > revoke.asc
|
||||
```
|
||||
上传撤销证书后,所有人都能知道该公钥已不再可信。
|
||||
|
||||
@@ -10,35 +10,36 @@ tags = ["乱七八糟"]
|
||||
|
||||
<!-- more -->
|
||||
## Lazy!
|
||||
> Vim 是从早期的 vi 编辑器发展而来的增强版,其名称代表“Vi IMproved”。由荷兰程序员 Bram Moolenaar 于 1991 年首次发布。Vim 是开源软件,支持多种操作系统,包括 Unix、Linux、Windows 和 macOS 等。
|
||||
|
||||
> 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上是:
|
||||
```
|
||||
```bash
|
||||
paru -S neovim
|
||||
```
|
||||
在Ubuntu上是
|
||||
```
|
||||
```bash
|
||||
sudo add-apt-repository ppa:neovim-ppa/unstable
|
||||
sudo apt update
|
||||
sudo apt install -y \ neovim git curl unzip build-essential ripgrep fd-find
|
||||
```
|
||||
|
||||
备份现有配置:
|
||||
```
|
||||
```bash
|
||||
mv ~/.config/nvim ~/.config/nvim.bak
|
||||
mv ~/.local/share/nvim ~/.local/share/nvim.bak
|
||||
```
|
||||
克隆 LazyVim Starter 模板:
|
||||
```
|
||||
```bash
|
||||
git clone https://github.com/LazyVim/starter ~/.config/nvim
|
||||
```
|
||||
启动 Neovim:
|
||||
```
|
||||
```bash
|
||||
nvim
|
||||
```
|
||||
首次启动时,LazyVim 会自动安装并配置所需的插件。
|
||||
@@ -46,7 +47,7 @@ nvim
|
||||
## 结构
|
||||
|
||||
LazyVim 的配置目录通常位于``~/.config/nvim/``中:
|
||||
```
|
||||
``` bash
|
||||
~/.config/nvim
|
||||
❯ tree
|
||||
.
|
||||
@@ -230,7 +231,7 @@ LazyVim 默认使用``<space> 作为 <leader>``,\ 作为``<localleader>``,
|
||||
|
||||
在``~/config/nvim/lua/plugins/``下新建一个mp.lua,写入如下配置:
|
||||
|
||||
```
|
||||
```lua
|
||||
return {
|
||||
{
|
||||
"iamcco/markdown-preview.nvim",
|
||||
@@ -242,21 +243,21 @@ return {
|
||||
```
|
||||
|
||||
随后即可在 Neovim 中打开一个 Markdown 文件,执行以下命令启动预览:
|
||||
```
|
||||
```bash
|
||||
:MarkdownPreview
|
||||
```
|
||||
|
||||
## tips
|
||||
|
||||
- lazyvim中的行号是非自然序的,这是为了方便光标移动而设置的:你可以在正常模式中通过10k快速移动光标到10行前,10j,10h,10l同理。
|
||||
- lazyvim的字体是和终端相同的,不同单独设置;
|
||||
- lazyvim中在侧边栏选择文件按d删除,按y复制,按p粘贴,按a创建,按r重命名;
|
||||
- gcc:注释当前行;
|
||||
- g+ctrl+g:显示信息;
|
||||
- alt+h:显示隐藏文件;
|
||||
- space+c+f:将当前代码格式化;
|
||||
- 设置文件编码``:set fileencoding?``
|
||||
- 设置换行符``:set fileformat=unix``
|
||||
- lazyvim的字体是和终端相同的,不同单独设置;
|
||||
- lazyvim中在侧边栏选择文件按d删除,按y复制,按p粘贴,按a创建,按r重命名;
|
||||
- lazyvim中的行号是非自然序的,这是为了方便光标移动而设置的:你可以在正常模式中通过10k快速移动光标到10行前,10j,10h,10l同理。
|
||||
- LSP快捷操作:
|
||||
|
||||
| 快捷键 | 功能 |
|
||||
@@ -273,13 +274,23 @@ return {
|
||||
|
||||
> 编辑器的基本素养
|
||||
|
||||
``文件操作``
|
||||
- 创建文件/文件夹
|
||||
- 打开/关闭/切换文件
|
||||
- 复制/粘贴
|
||||
- 写入/保存/退出
|
||||
``外观``
|
||||
- 面板
|
||||
- 侧边栏
|
||||
- Git符号
|
||||
- 全局主题
|
||||
- 文件类型主题
|
||||
|
||||
``编辑器``
|
||||
- 显示行号
|
||||
- 搜索替换
|
||||
|
||||
``Code``
|
||||
- 高亮
|
||||
- 格式化
|
||||
- 自动补全
|
||||
- 代码调试
|
||||
|
||||
``字符处理``
|
||||
- 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/)
|
||||
|
||||
@@ -19,7 +19,7 @@ tags = ["乱七八糟"]
|
||||
## 三.解决方法
|
||||
|
||||
既然是高低电平表述的错误,那么我们只需建立DSDT 表副本,将其修改,然后让它优先启动,从而让键盘配置正常;另外还存在 BIOS 修复,内核编译的方法,比较复杂,这里不做说明。
|
||||
```
|
||||
```bash
|
||||
首先建立一个DSDT文件夹:
|
||||
sudo su
|
||||
mkdir -p /home/dsdt
|
||||
@@ -75,7 +75,7 @@ reboot
|
||||
|
||||
### 修复wifi驱动
|
||||
|
||||
```
|
||||
```bash
|
||||
# 内核小于5.18的
|
||||
git clone https://github.com/HRex39/rtl8852be.git
|
||||
# 内核大于等于5.18的
|
||||
@@ -89,7 +89,7 @@ sudo modprobe 8852be
|
||||
|
||||
### 修复蓝牙驱动
|
||||
|
||||
```
|
||||
```bash
|
||||
# 内核=5.15
|
||||
git clone https://github.com/HRex39/rtl8852be_bt.git -b 5.15
|
||||
# 内核=5.18
|
||||
@@ -104,13 +104,13 @@ sudo make install
|
||||
|
||||
首先去amd官网下载最新的linux-amd驱动:
|
||||
|
||||
````
|
||||
````bash
|
||||
https://www.amd.com/zh-hans/support/linux-drivers // 22.20 for Ubuntu 20.04.5 HWE
|
||||
````
|
||||
|
||||
修改Deepin为ubuntu
|
||||
|
||||
````
|
||||
````bash
|
||||
sudo vim /etc/os-release // ID=Deepin => ID=ubuntu
|
||||
|
||||
sudo apt install ./amdgpu-install_22.20.50200-1_all.deb
|
||||
@@ -128,7 +128,7 @@ sudo apt install inxi clinfo
|
||||
|
||||
`inxi -G`
|
||||
|
||||
````
|
||||
````bash
|
||||
Graphics: Device-1: AMD Rembrandt driver: amdgpu v: kernel
|
||||
Display: x11 server: X.Org 1.20.11 driver: amdgpu,ati unloaded: fbdev,modesetting,vesa
|
||||
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 apt purge amdgpu-install
|
||||
````
|
||||
|
||||
看下效果图:
|
||||
|
||||
````
|
||||
````bash
|
||||
➜ ~ glxinfo -B
|
||||
name of display: :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`策略即可
|
||||
|
||||
````
|
||||
````bash
|
||||
wget https://github.com/nbebaw/boostchanger/releases/download/v4.4.0/boostchanger_4.4.0_amd64.deb
|
||||
````
|
||||
## 参考
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
+++
|
||||
title = "搭建个人信息流:播客收听指北"
|
||||
title = "乱七八糟:播客收听指北"
|
||||
date = 2024-03-06
|
||||
|
||||
[taxonomies]
|
||||
|
||||
@@ -1,72 +0,0 @@
|
||||
+++
|
||||
title = "乱七八糟:跑步笔记(一)"
|
||||
date = 2024-06-08
|
||||
|
||||
[taxonomies]
|
||||
tags = ["乱七八糟"]
|
||||
+++
|
||||
|
||||
前言 最近读得<<亮哥跑经>>一书,遂迷上跑步;奈何体重偏高,略微有些吃力.以下是一些笔记:
|
||||
|
||||
|
||||
<!-- more -->
|
||||
|
||||
> 为啥有人跑两步就喘?
|
||||
|
||||
- 运动基础薄弱
|
||||
|
||||
再慢的跑步,它也比快走的强度要大。跑步虽然很简单,但它并不是低强度的运动。
|
||||
|
||||
- 呼吸方法错误
|
||||
|
||||
跑步时需要更多的氧气,如果呼和吸的量不均等,吐气比吸的要多,身体没有充分地进行气体交换,就会气喘吁吁。
|
||||
|
||||
- 呼吸肌能力较弱
|
||||
|
||||
大基数体重的人,腹部往往很胖,身体的呼吸系统较弱。内脏脂肪多,呼吸肌就像吹大的气球一样,被撑薄了,相应的,它收缩和扩张的能力就会下降,所以大体重的人跑步更容易喘。而且除了容易喘之外,他们跑步也更容易岔气。
|
||||
|
||||
> 正确的呼吸方法是什么?
|
||||
|
||||
- 建议初学者采用两步一吸两步一呼的方式。
|
||||
|
||||
- 等跑了一段时间,心肺功能和整体体能加强之后,可以改为三步一吸三步一呼。
|
||||
|
||||
- 需要注意的是,最好口鼻同时呼吸,才能使充足氧气吸入
|
||||
|
||||
> 冬天跑步注意事项
|
||||
|
||||
- 冬天户外跑时,因为天气比较冷,为了防止冷空气进入我们的身体,可以带一个薄薄的口罩。
|
||||
|
||||
- 不要秋天的时候都没跑,到冬天最冷的时候突然出去跑步了。也不要顶风跑,这样你的呼吸系统是受不了的。
|
||||
|
||||
- 冬天跑步的时候,可以用舌尖顶住上牙膛,过滤加温一下冷空气,免得空气直灌入身体,造成肠胃不适。
|
||||
|
||||
|
||||
> 为什么会岔气?
|
||||
|
||||
- 岔气,简单来说,就是呼吸肌痉挛(抽筋)了。
|
||||
|
||||
- 当呼吸肌的能力不足以支撑你的身体这样强度运动时,就会通过痉挛的方式告诉你,你需要停下来或者减慢速度。
|
||||
|
||||
- 平时可以配合做一些腰腹部的核心训练,比如说卷腹、平板支撑等,多练习腹部呼吸法,这样在加强核心力量的同时,也加强了呼吸肌的能力。
|
||||
|
||||
- 跑步之前,要做好充分的热身,不要上来就加速跑,逐渐平缓地提升呼吸节奏,你得让呼吸肌有适应的过程。
|
||||
|
||||
- 如果跑步时出现了岔气情况,可以放慢跑步速度;严重的话,可以停下来调整呼吸,并且身体向相反方向伸展,右侧岔气的话,那就向上伸直右侧手臂,并向左侧伸展 15~30 秒.
|
||||
|
||||
|
||||
> 跑步前期很难坚持,怎么办?
|
||||
|
||||
- 刚开始跑,心肺体能都还跟不上,那可能跑起来不太有成就感,没有正反馈,也不好坚持。因此,需要制定合理的跑步计划(时间/距离)
|
||||
|
||||
- 从跑够 10 分钟开始的。之后每周的运动强度可以比前一周提高 5%。
|
||||
|
||||
- 无论是跑步还是健身,训练时长最好控制在 1 个小时之内,因为 1 个小时的运动会让我们身心都得到满足.
|
||||
|
||||
- 在前期跑步的时候,不要跑上坡路,上坡路非常累.
|
||||
|
||||
- 另外可以通过听音乐、给跑步赋予意义和仪式感、装备奖励等方式,帮助自己度过刚开始跑时的枯燥期。
|
||||
|
||||
---
|
||||
**Done**
|
||||
|
||||
@@ -1,63 +0,0 @@
|
||||
+++
|
||||
title = "乱七八糟:跑步笔记(二)"
|
||||
date = 2024-06-11
|
||||
|
||||
[taxonomies]
|
||||
tags = ["乱七八糟"]
|
||||
+++
|
||||
|
||||
前言 最近读得<<亮哥跑经>>一书,遂迷上跑步;奈何体重偏高,略微有些吃力.以下是一些笔记:
|
||||
|
||||
|
||||
<!-- more -->
|
||||
## 关于跑姿:
|
||||
|
||||
> 摆臂
|
||||
|
||||
- 摆臂的主要目的,是对抗腿的阻力,来保持我们的身体平衡,让身体向正前方笔直前行。
|
||||
|
||||
- 摆臂和步频是紧密相关的。所以你看那些短跑运动员,他们上肢力量也很发达,因为他们短跑时速度很快,步频很大,如果没有相应的摆臂,他们身体会不平衡.
|
||||
|
||||
- 正确的摆臂应该是什么样的呢?既然我们是向前跑,那么摆臂也应该是垂直向前的,而不是在胸口前左右交叉的,因为你左右摆臂的时候,等于给身体一个左右旋转的力,实际上这消耗了多余的能量,对于腰腹肌肉及腰椎压力也比较大,跑的也不快也不长久。
|
||||
|
||||
- 正确的摆臂应该是肩膀放松状态下,以肩关节为轴的,大臂和小臂成 90 度角,大臂带动小臂前后垂直摆动。 抬起时,大拇指不要超过眉毛,回来时,大拇指不要越过躯干。
|
||||
|
||||
|
||||
> 常见的错误摆臂方式
|
||||
|
||||
- 双臂在身前交叉,我称之为“戳鼻孔跑”。当你的双臂不是垂直向前用力,而是左右旋转的时候,身体会消耗多余能量。
|
||||
|
||||
- 只摆小臂,不摆大臂。跑步时把大臂夹得特别紧,而且摆臂是以肘关节为轴了,这是不对的。
|
||||
|
||||
- 不摆手臂,摆动躯干。完全只是靠摆动躯干的方式在维持平衡,这样会造成能量过度损失,而且对腰椎压力也比较大。
|
||||
|
||||
- 摆臂高度不对,比如说摆臂过大,或是一面高一面低。摆臂过大是短跑的摆臂方式,长跑的摆臂,向前手指不超过眉梢、向后不超过躯干。
|
||||
|
||||
- 摆臂一面高一面低,一般我们戴臂包、手中握手机或水瓶等容易出现这个问题。摆臂是帮我们平衡的,如果你的左右摆臂高度不一样,那跑姿一定是变形的,也就是说身体左右受力是不均匀的,这时很容易导致身体的一侧肌肉紧张,出现像跑步膝等身体损伤.
|
||||
|
||||
> 摆腿
|
||||
|
||||
- 看一个人摆腿对不对,就看他是用髋关节跑还是膝关节跑。
|
||||
|
||||
- 正确的长跑姿势,应该是核心收紧,臀大肌和大腿后侧肌肉发力,以髋关节为轴,带动膝关节和踝关节向前跑动,小腿只是辅助性肌肉,它发力不多。所以长跑运动员基本上臀部都是很翘的,而小腿纤细。
|
||||
|
||||
- 如果一直屈髋“坐着跑”,跑步时就会经常出现重心不稳的情况,而且地面给你带来的冲击力,你不能很好地将它传导到臀部,也就是说,这些冲击力都消耗在了膝关节这里。这样的话,一是你很难跑得长久,二是容易把小腿跑粗,三是全身的压力都集中在膝关节,容易带来一些慢性损伤。
|
||||
|
||||
> 着地
|
||||
|
||||
- 跑步的着地方式主要有三种:前脚掌、中脚掌和后脚掌。如果我们是长跑的话,主要采用的是后脚跟着地和中足着地的方式。
|
||||
|
||||
- 前脚掌着地会帮助我们跑步提速,但是大众跑者跑长跑,不是比谁跑的快,而是看谁跑得更健康、更安全、更节能。
|
||||
|
||||
> 前倾跑 & 低头族
|
||||
|
||||
- 跑步时腰疼或者下背部疼痛,其实这主要和你跑步时身体前倾了有关。因为当你身体前倾时,你的屈髋肌群,也就是胯骨部位会过度紧张,你的下背部肌肉会被反向拉长,它的压力就会增加。这就好比你背个书包去跑步,背部肌肉很容易疲劳的。
|
||||
|
||||
- 而且当你身体前倾的时候,你的髋关节不能很好的帮你做功,身体容易左右扭动,时间长了也容易引起腰部肌肉酸疼。
|
||||
|
||||
- 还有的人是低头跑,如果有这个情况,可以在跑步之前做一些颈部伸展;跑步时,不要探头,稍微收下巴,眼睛可以平视前方 50 米左右地方,这样就可以很好地解决这个问题了。
|
||||
|
||||
---
|
||||
**Done**
|
||||
|
||||
|
||||
@@ -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 年,牛博网被域名注册商万网停止解析。
|
||||
|
||||
## VPS
|
||||
```
|
||||
```bash
|
||||
# 更新系统
|
||||
apt update && apt upgrade -y
|
||||
apt install wget curl vim sudo neofetch
|
||||
# 添加普通用户并赋予sudo
|
||||
# 创建用户并赋予sudo
|
||||
adduser xxx
|
||||
sudo usermod -aG sudo xxx
|
||||
```
|
||||
## BBR
|
||||
|
||||
- 查询系统所支持的拥塞控制算法
|
||||
````
|
||||
````bash
|
||||
sysctl net.ipv4.tcp_available_congestion_control
|
||||
````
|
||||
- 查询正在使用中的拥塞控制算法(Linux 绝大部分系统默认为 Cubic 算法)
|
||||
````
|
||||
````bash
|
||||
sysctl net.ipv4.tcp_congestion_control
|
||||
````
|
||||
- 指定拥塞控制算法为 bbr
|
||||
````
|
||||
````bash
|
||||
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编辑器的示例:
|
||||
|
||||
````
|
||||
````bash
|
||||
sudo vim /etc/ssh/sshd_config
|
||||
````
|
||||
|
||||
在配置文件中找到以下行:
|
||||
|
||||
````
|
||||
````bash
|
||||
Port 22
|
||||
````
|
||||
|
||||
这是SSH默认的端口号,你可以将其更改为你想要的任何未被占用的端口号。例如,将端口更改为2222:
|
||||
|
||||
````
|
||||
````bash
|
||||
Port 2222
|
||||
````
|
||||
|
||||
保存并关闭文本编辑器。重新启动SSH服务,以应用更改:
|
||||
|
||||
````
|
||||
````bash
|
||||
sudo service ssh restart
|
||||
````
|
||||
|
||||
或者,如果你的系统使用systemd,可以使用以下命令:
|
||||
|
||||
````
|
||||
````bash
|
||||
sudo systemctl restart ssh
|
||||
````
|
||||
|
||||
### 安装 UFW
|
||||
|
||||
````
|
||||
````bash
|
||||
sudo apt install ufw
|
||||
````
|
||||
|
||||
**如果你在远程位置连接你的服务器,在启用 UFW 防火墙之前,你必须显式允许进来的 SSH 连接。否则,你将永远都无法连接到机器上。**
|
||||
|
||||
````
|
||||
````bash
|
||||
sudo ufw allow 22/tcp
|
||||
````
|
||||
|
||||
@@ -100,37 +100,37 @@ sudo ufw allow 22/tcp
|
||||
|
||||
**启动 UFW**
|
||||
|
||||
````
|
||||
````bash
|
||||
sudo ufw enable
|
||||
````
|
||||
|
||||
### 安装 Fail2ban
|
||||
|
||||
````
|
||||
````bash
|
||||
sudo apt-get install fail2ban
|
||||
````
|
||||
|
||||
**2、Debian 12 及以上的版本需要手动安装 rsyslog**
|
||||
|
||||
````
|
||||
````bash
|
||||
sudo apt-get install rsyslog
|
||||
````
|
||||
|
||||
**3、启动 Fail2ban 服务**
|
||||
|
||||
````
|
||||
````bash
|
||||
sudo systemctl start fail2ban
|
||||
````
|
||||
|
||||
**4、开机自启动**
|
||||
|
||||
````
|
||||
````bash
|
||||
sudo systemctl enable fail2ban
|
||||
````
|
||||
|
||||
**5、查看 Fail2ban 服务状态。**
|
||||
|
||||
````
|
||||
````bash
|
||||
sudo systemctl status fail2ban
|
||||
````
|
||||
|
||||
@@ -139,7 +139,7 @@ sudo systemctl status fail2ban
|
||||
### 改为密钥登录
|
||||
|
||||
- 执行以下命令生成.pub后缀的公钥和无后缀的密钥:
|
||||
```
|
||||
```bash
|
||||
ssh-keygen
|
||||
```
|
||||
注意不同密钥对名称不能相同;同时可以为这两个文件用密码加密;
|
||||
@@ -147,11 +147,11 @@ ssh-keygen
|
||||
- 随后将.pub后缀的公钥中的内容写入服务器的``~/.ssh/authorized_keys``中;
|
||||
|
||||
- 使用以下命令编译服务器的SSH配置:
|
||||
```
|
||||
```bash
|
||||
vim /etc/ssh/sshd_config
|
||||
```
|
||||
将其中的该行改为``PasswordAuthentication no``,保存退出;随后使用
|
||||
```
|
||||
```bash
|
||||
sudo systemctl restart sshd
|
||||
```
|
||||
重启SSH即可禁用密码登录;
|
||||
@@ -159,109 +159,44 @@ sudo systemctl restart sshd
|
||||
- 将**PermitRootLogin**一栏改为**PermitRootLogin prohibit-password**,即可实现仅root用户密钥登录;
|
||||
|
||||
- 使用以下命令查看输出,
|
||||
```
|
||||
```bash
|
||||
sudo cat /etc/ssh/sshd_config | grep -E 'PasswordAuthentication|PubkeyAuthentication'
|
||||
```
|
||||
如有**PasswordAuthentication no → 禁用密码登录**以及**PubkeyAuthentication yes → 允许密钥登录**则成功。
|
||||
|
||||
> 注意**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
|
||||
|
||||
```
|
||||
```bash
|
||||
apt install curl wget gpg vim nano sudo neofetch openssh-server
|
||||
```
|
||||
- C/C++
|
||||
```
|
||||
```bash
|
||||
sudo apt install build-essential gdb cmake clangd clang-format libstdc++-dev
|
||||
```
|
||||
- Miniconda
|
||||
```
|
||||
```bash
|
||||
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
|
||||
bash Miniconda3-latest-Linux-x86_64.sh
|
||||
```
|
||||
- UV
|
||||
```
|
||||
```bash
|
||||
curl -LsSf https://astral.sh/uv/install.sh | sh
|
||||
```
|
||||
- Docker
|
||||
```
|
||||
```bash
|
||||
curl -fsSL https://get.docker.com -o get-docker.sh
|
||||
sudo sh get-docker.sh
|
||||
```
|
||||
- OpenCV
|
||||
```
|
||||
```bash
|
||||
sudo apt install tree libx11-dev libgtk-3-dev freeglut3-dev libopencv-dev libdlib-dev
|
||||
```
|
||||
- Vmware
|
||||
```
|
||||
```bash
|
||||
sudo apt install open-vm-tools
|
||||
sudo apt install open-vm-tools-desktop
|
||||
```
|
||||
@@ -276,7 +211,7 @@ Set-Content "$env:USERPROFILE\.ssh\known_hosts"
|
||||
|
||||
执行如下命令一键安装 1Panel:
|
||||
|
||||
````
|
||||
````bash
|
||||
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
|
||||
|
||||
手动 禁用 VPS 的 IPv6 命令:
|
||||
```
|
||||
```bash
|
||||
sysctl -w net.ipv6.conf.all.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.default.disable_ipv6=1' >> /etc/sysctl.conf
|
||||
```
|
||||
手动 启用 VPS 的 IPv6 命令:
|
||||
```
|
||||
```bash
|
||||
sysctl -w net.ipv6.conf.all.disable_ipv6=0
|
||||
sysctl -w net.ipv6.conf.default.disable_ipv6=0
|
||||
```
|
||||
重新载入 sysctl 配置
|
||||
```
|
||||
```bash
|
||||
sysctl --system # reload sysctl
|
||||
```
|
||||
如果重载, 还无效果, 可能要 reboot 重启下.
|
||||
查看 VPS 的 IPv6 信息
|
||||
```
|
||||
```bash
|
||||
ip -6 addr show scope global
|
||||
|
||||
或者 curl ipv6.ip.sb
|
||||
@@ -318,13 +253,13 @@ ip -6 addr show scope global
|
||||
|
||||
- 然后在VPS上输入以下命令:
|
||||
|
||||
```
|
||||
```bash
|
||||
mkdir -p ./.well-known/pki-validation
|
||||
```
|
||||
- 随后在ZeroSSL中将所给出的类似**B992F08CB46748D02E4C553A4038BC.txt**复制;
|
||||
|
||||
- 将从ZeroSSL下载得到的文件打开,复制里面的东西形成以下的格式:``将pki-validation/之后EOF之前的内容``替换为你自己的。
|
||||
```
|
||||
```bash
|
||||
cat << EOF | sudo tee ./.well-known/pki-validation/B992F08CB46748D02E4C553A4038BC.txt
|
||||
254563C20918258D661E7D43D6A43A2A258857E191977DD5F740FBB9ABD25279
|
||||
comodoca.com
|
||||
@@ -333,7 +268,7 @@ EOF
|
||||
```
|
||||
随后在VPS上运行该命令。
|
||||
- 开启一个临时HTTP服务器:
|
||||
```
|
||||
```bash
|
||||
python3 -m http.server 80
|
||||
```
|
||||
- 随后即可在ZeroSSL中验证证书并开启SSL。
|
||||
@@ -350,15 +285,15 @@ python3 -m http.server 80
|
||||
- 进入恢复模式后,选择`root – Drop to root shell prompt`进入 root shell(不需要密码)。
|
||||
|
||||
- 挂载文件系统为可写模式:
|
||||
```
|
||||
```bash
|
||||
mount -o remount,rw /
|
||||
```
|
||||
- 将用户添加到 sudo 组:
|
||||
```
|
||||
```bash
|
||||
usermod -aG sudo 用户名
|
||||
```
|
||||
- 重启计算机:
|
||||
```
|
||||
```bash
|
||||
reboot
|
||||
```
|
||||
|
||||
@@ -380,7 +315,7 @@ sudo apt update
|
||||
```
|
||||
|
||||
3. 搜索可用内核
|
||||
```
|
||||
```bash
|
||||
apt search xanmod
|
||||
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
|
||||
```
|
||||
|
||||
## 更换系统
|
||||
|
||||
除了到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.**
|
||||
|
||||
|
||||
65
content/about-sports.md
Normal file
65
content/about-sports.md
Normal 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小时左右,让身体意识到无须过于储存脂肪;
|
||||
- 高糖类食物会提高胰岛素分泌降低血糖,使我们容易感到疲劳和更想摄入糖分,形成恶性循环;
|
||||
- 蛋白质和水的摄入非常重要,不要等到口渴的时候才喝水;
|
||||
|
||||
## 训练
|
||||
|
||||
未完待续...
|
||||
|
||||
@@ -32,6 +32,8 @@ tags = ["乱七八糟"]
|
||||
- 随后``选择磁盘``并开始安装;
|
||||
- 制作完成后即可使用 ``BIOS Legacy``模式 或 ``UEFI`` 模式启动。
|
||||
|
||||
> 注意不可在PE环境下安装Ventoy!
|
||||
|
||||
## 文件存储盘
|
||||
|
||||
使用``DiskGenius``或其他磁盘工具,可以看到刚刚制作的磁盘有两个分区:ventoy保留分区(有文件)和Ventoy分区(无文件)以及一个空闲空间。
|
||||
|
||||
@@ -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
319
content/about-virtual.md
Normal file
@@ -0,0 +1,319 @@
|
||||
+++
|
||||
title = "乱七八糟:虚拟化常用设置与操作"
|
||||
date = 2024-08-16
|
||||
|
||||
[taxonomies]
|
||||
tags = ["乱七八糟"]
|
||||
+++
|
||||
|
||||
前言 本文记录常用虚拟化平台的使用与操作,包括Vmware,Hypr-v,QEMU等等。
|
||||
<!-- 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 支持;在虚拟机设置里提升视频内存。
|
||||
- 虚拟机启动慢:给虚拟机分配更多 RAM/CPU;关闭不必要的服务;确保主机虚拟化支持开启。
|
||||
- 无法挂载 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 修改启动配置,使系统启动时不加载 Hypervisor(Hyper-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.**
|
||||
@@ -52,14 +52,14 @@ MCSManager 面板(简称:MCSM 面板)是一款全中文,轻量级,开
|
||||
## 换源
|
||||
|
||||
**禁用 Ceph 企业仓库:**
|
||||
```
|
||||
```bash
|
||||
nano /etc/apt/sources.list.d/ceph.list
|
||||
```
|
||||
将文件内容注释掉或删除。
|
||||
|
||||
**编辑仓库源文件:**
|
||||
|
||||
```
|
||||
```bash
|
||||
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
|
||||
```
|
||||
确保文件内容如下:
|
||||
```
|
||||
```bash
|
||||
deb http://download.proxmox.com/debian/pve bookworm pve-no-subscription
|
||||
```
|
||||
## 二.新建虚拟机并安装Debian
|
||||
@@ -95,12 +95,12 @@ deb http://download.proxmox.com/debian/pve bookworm pve-no-subscription
|
||||
在安装步骤进入到选择安装的桌面环境和软件时, 键入 Ctrl+Alt+F2 可以看到从图形界面转到了tty命令终端, 键入 Enter
|
||||
这里修改软件源配置文件
|
||||
|
||||
```
|
||||
```bash
|
||||
nano /target/etc/apt/sources.list
|
||||
```
|
||||
修改debian-security源地址 `http://mirrors.ustc.edu.cn ` 目测最快
|
||||
|
||||
```
|
||||
```bash
|
||||
deb http://mirrors.ustc.edu.cn/debian-security bullseye-security main
|
||||
```
|
||||
修改后 Ctrl+X 退出保存,然后退出终端重新进入界面继续安装,键入 Ctrl+Alt+F5。
|
||||
@@ -144,7 +144,7 @@ deb http://mirrors.ustc.edu.cn/debian-security bullseye-security main
|
||||
|
||||
在 PVE-防火墙中打开它们。如果还是不行,执行如下命令:
|
||||
|
||||
```
|
||||
```bash
|
||||
systemctl stop firewalld
|
||||
|
||||
systemctl disable firewalld
|
||||
|
||||
@@ -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 MHz,20.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 2022,12 nm |
|
||||
|
||||
> 如果预算充足,也可以选择s905x3,s905x4,以及rk3528等等芯片的盒子。如果有旧手机,也可以改装为电视盒子,比如骁龙865盒子,性能非常强大。
|
||||
|
||||
## 二.选择合适的系统
|
||||
|
||||
无论是运营商自带的电视盒子还是各种所谓的“无广告”电视盒子,往往都基于以下两种系统,且不要迷信所谓的“无广告”电视盒子,它们往往配置低下,性价比不高且还是有内置付费项目,甚至有一些根本没有做到去广告。
|
||||
无论是运营商自带的电视盒子还是各种所谓的“无广告”电视盒子,往往都基于以下两种系统,且要小心一些所谓的“无广告”电视盒子或者外贸盒子,它们往往配置低,性价比不高且还是有内置付费项目,甚至有一些还会偷偷跑PCDN。因此,建议买到手之后自行刷写固件。
|
||||
|
||||
| 特性 | **Android-x86** | **Android TV** |
|
||||
|--------------------|---------------------------------------------------------|----------------------------------------------------------|
|
||||
@@ -48,79 +65,35 @@ X86还是Arm?两者之间各有优点,截止到今天各种Arm电视盒子
|
||||
| **遥控器支持** | 不适配遥控器,主要使用鼠标键盘操作。 | 专为遥控器优化,支持按键导航和语音输入。 |
|
||||
| **开源贡献** | 由社区维护,支持各种自定义和实验功能。 | 由 Google 官方主导,OEM 厂商提供硬件优化支持。 |
|
||||
|
||||
---
|
||||
> Android-x86 的安装类似windows,需要命令行界面配置;Android 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)
|
||||
|
||||
|
||||
## 一、写盘,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 install <path to android app.apk>``将要安装的软件包上传,也可以将文件拖到命令提示符窗口上以复制其路径,回车确认。
|
||||
|
||||
**一些 ADB 常用命令**:
|
||||
|
||||
```
|
||||
```bash
|
||||
adb reboot #将重启 Android 设备。
|
||||
|
||||
adb reboot recovery #将设备重新启动到恢复模式。
|
||||
@@ -131,42 +104,125 @@ adb shell wm density <dpi> #改变显示器的像素密度。
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
```bash
|
||||
adb shell dumpsys activity activities | grep mResumedActivity
|
||||
```
|
||||
|
||||
获取当前前台应用的包名,随后再禁用或者删除.
|
||||
|
||||
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工具。
|
||||
|
||||
**最终效果**:
|
||||
|
||||

|
||||
|
||||
|
||||
## 后记
|
||||
|
||||
- [Android TV google 官方 TV 库](https://github.com/googlesamples/leanback-showcase)
|
||||
|
||||
|
||||
- [智能电视,电视盒子开发 SDK](https://github.com/boxmate/tvframe)
|
||||
|
||||
|
||||
- [选中框切换动画,适用于电视](https://github.com/EZJasonBoy/FocusChangeAnimation)
|
||||
|
||||
|
||||
- [Android tv,盒子,投影仪 控件](https://github.com/FrozenFreeFall/Android-tv-widget)
|
||||
|
||||
|
||||
- [TV 项目常用工具(焦点问题,适配问题等.)](https://github.com/genius158/TVProjectUtils)
|
||||
|
||||
- [e900v22c项目与讨论组文档](https://github.com/Calmact/e900v22c)
|
||||
|
||||
@@ -125,11 +125,9 @@ tags = ["综合工程"]
|
||||
- [KernelSU Next](https://rifsxd.github.io/KernelSU-Next/zh/index.html)
|
||||
- [APatch](https://apatch.dev/zh_CN/)
|
||||
|
||||
## **六.具体操作流程**
|
||||
## **六.前置知识**
|
||||
|
||||
> 前置知识:ADB与Fastboot命令的使用
|
||||
|
||||
**adb 命令**
|
||||
### **adb 命令**
|
||||
|
||||
| 命令 | 说明 |
|
||||
|------|------|
|
||||
@@ -140,7 +138,36 @@ tags = ["综合工程"]
|
||||
| `adb reboot edl` | 重启到 edl 模式 |
|
||||
| `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 device-info` | 查看解锁状态 |
|
||||
|
||||
## **七.具体操作流程**
|
||||
|
||||
> 以 Poco F2 这款手机为例,
|
||||
|
||||
1. 首先我们进入手机设置界面,进入“我的设备”,在“全部参数”中找到“ MIUI 版本”,连续点击后开启开发者模式,随后在“更多设置”中开启 USB 调试, USB安装 功能。
|
||||
@@ -187,7 +216,6 @@ tags = ["综合工程"]
|
||||
|
||||
> 如果你不想安装TWRP也可以直接安装要刷的系统的recovery,一般放在系统zip包的中,如果没有则需要手动解包payload.bin,可以安装payload-dumper-go并在解压出来的系统文件夹中使用``payload-dumper-go payload.bin``,随后会将所有.img后缀的文件放在文件夹中。
|
||||
|
||||
|
||||
## **八.Root后的模块安装**
|
||||
|
||||
在 Root 管理器中安装 Zygisk-Lsposed 模块,即可使用 Lsposed,在 Lsposed 中可以安装 HMA, Amarok ,QAuxiliary 模块,并配合 MMRL 等软件等等。
|
||||
@@ -202,6 +230,56 @@ tags = ["综合工程"]
|
||||
- [ZygiskNext](https://github.com/Dr-TSNG/ZygiskNext)
|
||||
- [Zygisk-Assistant](https://github.com/snake-4/Zygisk-Assistant)
|
||||
|
||||
|
||||
## **附录**
|
||||
|
||||
### 系统变迁表
|
||||
| 厂商 | 系统 / 子品牌 | 演变历史及时间点 |
|
||||
| --------------- | ------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| **Xiaomi** | MIUI → 澎湃OS(HyperOS / Surge OS) | 2010 年推出 MIUI,2023 年 10 月 17 日官方宣布替代 MIUI 的 HyperOS(中文名“澎湃OS”),2023 年 10 月 26 日随 Xiaomi 14 系列一起发布,2024 年起全面替代 MIUI |
|
||||
| **Huawei** | EMUI → HarmonyOS | 2012 年采用 EMUI,2021 年宣布推出基于微内核的鸿蒙 HarmonyOS,新机逐步切换。 |
|
||||
| **OPPO** | ColorOS | 2013 年推出 ColorOS,2020 年对版本号体系调整至与 Android 主版本同步(例如从 7 跳到 11),之后持续 UI 与功能迭代。 | |
|
||||
| **Realme** | Realme UI | 2019 年从 ColorOS 分支出 Realme UI,此后持续独立更新、优化(未查到主要时间节点)。 |
|
||||
| **Vivo / iQOO** | Funtouch OS → OriginOS (+ Ocean/Pux 系列) | 2012 年左右推出 Funtouch OS,2020 年推出 OriginOS;后续版本如 OriginOS Ocean、Pux 迭代 UI 核心。 |
|
||||
| **OnePlus** | HydrogenOS (中国) → OxygenOS (海外) → 合并后 OP OS? | 2014 年中国区发布 HydrogenOS,2015 年海外推 OxygenOS;2021 年底与 OPPO 合并,代码库统一(国内使用 ColorOS,全球继续用 OxygenOS),但官方未明确推出 "OP OS" 这一新名。 |
|
||||
| **Samsung** | TouchWiz → Samsung Experience → One UI (+ One UI Core) | 2009 年推出 TouchWiz,2016 年改名为 Samsung Experience,2018 年重塑为 One UI,2020 年开始细化为标准与精简版 One UI Core。 |
|
||||
| **Asus** | ZenUI | 2014 年推出 ZenUI,后续多年持续在视觉与功能上迭代。 |
|
||||
| **Motorola** | MotoBlur → My UX | 2009 年推出 MotoBlur,2020 年推出基于原生 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** | 启动分区:包含 kernel(init\_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 XBL(eXtensible Boot Loader)引导,加载 ABL 等;ramdump 用于调试。 |
|
||||
|
||||
|
||||
## **参考**
|
||||
|
||||
- [lineageos镜像](https://download.lineageos.org/devices/lmi/builds)
|
||||
|
||||
@@ -29,31 +29,68 @@ tags = ["综合工程"]
|
||||
|
||||
## 安装软件
|
||||
|
||||
随后安装常用开源软件:
|
||||
随后安装常用开源软件(KDE环境省略file和wayland)
|
||||
|
||||
```
|
||||
```bash
|
||||
# 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
|
||||
|
||||
paru -S neovim yazi lazygit btop
|
||||
paru -S neovim yazi lazygit btop zellij termshark
|
||||
|
||||
# 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):
|
||||
|
||||
```
|
||||
```bash
|
||||
# step1: 克隆/下载 latest 最新的稳定版到本地
|
||||
git clone --depth=1 https://github.com/Mark24Code/rime-auto-deploy.git --branch latest
|
||||
# step2: 进入项目目录
|
||||
@@ -72,7 +109,7 @@ cd rime-auto-deploy
|
||||
安装完毕后可以看到KDE的界面较为简陋,这里给出笔者的美化配置:
|
||||
|
||||
- 在设置中找到Colors&Themes,分别设置为:
|
||||
```
|
||||
```bash
|
||||
- Color:Breeze Dark
|
||||
- Application Style:Breeze
|
||||
- Plasma Style:Sweet
|
||||
@@ -127,27 +164,27 @@ V2EX Polish(V站美化)
|
||||
如果Grub引导菜单中没有windows选项,可以通过以下方法添加:
|
||||
|
||||
- 安装 os-prober:首先确保系统中安装了 os-prober,这是一个用于检测其他操作系统的工具。
|
||||
```
|
||||
```bash
|
||||
sudo pacman -S os-prober
|
||||
sudo os-prober
|
||||
```
|
||||
|
||||
- 打开 /etc/default/grub 文件进行编辑:
|
||||
```
|
||||
```bash
|
||||
sudo nano /etc/default/grub
|
||||
# 确保 GRUB_DISABLE_OS_PROBER 设置为 false
|
||||
```
|
||||
|
||||
- 保存文件并退出编辑器后,运行以下命令更新 GRUB 配置:
|
||||
```
|
||||
```bash
|
||||
sudo grub-mkconfig -o /boot/grub/grub.cfg
|
||||
```
|
||||
|
||||
或者``手动添加``:
|
||||
```
|
||||
```bash
|
||||
nano /etc/grub.d/40_custom
|
||||
```
|
||||
```
|
||||
```bash
|
||||
#!/bin/sh
|
||||
exec tail -n +3 $0
|
||||
# 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,则:
|
||||
- 如果 libvirtd 服务未运行,virt-manager 将无法连接到虚拟化环境。
|
||||
```
|
||||
```bash
|
||||
sudo systemctl start libvirtd
|
||||
sudo systemctl enable libvirtd
|
||||
```
|
||||
- 用户权限问题:将当前用户添加到 libvirt 组,以获得必要的权限。
|
||||
```
|
||||
```bash
|
||||
sudo usermod -aG libvirt $(whoami)
|
||||
```
|
||||
|
||||
- 虚拟网络未激活:virt-manager 可能无法连接到默认的虚拟网络。
|
||||
```
|
||||
```bash
|
||||
sudo virsh net-start default
|
||||
```
|
||||
默认网络在系统启动时自动启动,可以执行:
|
||||
```
|
||||
```bash
|
||||
sudo virsh net-autostart default
|
||||
```
|
||||
- 配置文件权限问题:配置文件的权限设置可能导致访问问题。
|
||||
|
||||
```
|
||||
```bash
|
||||
sudo chown $(whoami):libvirt /var/run/libvirt/libvirt-sock
|
||||
```
|
||||
随后安装虚拟机,流程大概为``选择镜像和系统类型--设置CPU/内存--设置空间大小--编辑配置项--开启UEFI引导和3D加速``.
|
||||
@@ -194,7 +231,7 @@ sudo chown $(whoami):libvirt /var/run/libvirt/libvirt-sock
|
||||
**开启3D加速:**
|
||||
|
||||
- NIC:
|
||||
```
|
||||
```xml
|
||||
<graphics type="spice">
|
||||
<listen type="none"/>
|
||||
<image compression="off"/>
|
||||
@@ -203,7 +240,7 @@ sudo chown $(whoami):libvirt /var/run/libvirt/libvirt-sock
|
||||
|
||||
```
|
||||
- video virtio:
|
||||
```
|
||||
```xml
|
||||
<video>
|
||||
<model type="virtio" heads="1" primary="yes">
|
||||
<acceleration accel3d="yes"/>
|
||||
@@ -218,17 +255,17 @@ sudo chown $(whoami):libvirt /var/run/libvirt/libvirt-sock
|
||||
如果安装了多个linux内核,可以使用以下方法调整启动顺序:
|
||||
|
||||
- 使用以下命令查看内核名称:
|
||||
```
|
||||
```bash
|
||||
ls /boot/vmlinuz*
|
||||
```
|
||||
- 在 /etc/default/grub 中添加或修改如下行:
|
||||
```
|
||||
```bash
|
||||
GRUB_TOP_LEVEL="/boot/vmlinuz-linux-cachyos"
|
||||
```
|
||||
需要注意,这种方法会关闭 GRUB 的“记住上次启动项”的功能。
|
||||
|
||||
- 修改完 /etc/default/grub 后,记得重新生成 GRUB 配置文件:
|
||||
```
|
||||
```bash
|
||||
sudo grub-mkconfig -o /boot/grub/grub.cfg
|
||||
```
|
||||
**图形界面更改方法:**
|
||||
@@ -236,12 +273,12 @@ sudo grub-mkconfig -o /boot/grub/grub.cfg
|
||||
可以使用grub-customizer来修改Grub,这里以ubuntu为例子:
|
||||
|
||||
- 添加PPA源并更新软件列表:
|
||||
```
|
||||
```bash
|
||||
sudo add-apt-repository ppa:danielrichter2007/grub-customizer
|
||||
sudo apt update
|
||||
```
|
||||
- 安装GRUB Customizer:
|
||||
```
|
||||
```bash
|
||||
sudo apt install grub-customizer
|
||||
```
|
||||
随后在grub-customizer中将要默认启动的选项放在首位即可。
|
||||
@@ -249,69 +286,168 @@ sudo apt install grub-customizer
|
||||
## 开机自启动
|
||||
|
||||
**设置Syncthing开机自启动**
|
||||
```
|
||||
```bash
|
||||
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
|
||||
|
||||
- 确保你的内核版本 >= 4.9:
|
||||
```
|
||||
```bash
|
||||
uname -r
|
||||
```
|
||||
- 启用 BBR
|
||||
|
||||
你只需要设置两个 sysctl 参数即可:
|
||||
```
|
||||
```bash
|
||||
sudo sysctl -w net.core.default_qdisc=fq
|
||||
sudo sysctl -w net.ipv4.tcp_congestion_control=bbr
|
||||
```
|
||||
要让它们永久生效,把它们写入配置文件:
|
||||
```
|
||||
```bash
|
||||
sudo nano /etc/sysctl.d/99-bbr.conf
|
||||
```
|
||||
加入以下内容:
|
||||
```
|
||||
```bash
|
||||
net.core.default_qdisc = fq
|
||||
net.ipv4.tcp_congestion_control = bbr
|
||||
```
|
||||
然后重新加载配置:
|
||||
```
|
||||
```bash
|
||||
sudo sysctl --system
|
||||
```
|
||||
- 验证 BBR 是否启用
|
||||
```
|
||||
```bash
|
||||
sysctl net.ipv4.tcp_congestion_control
|
||||
```
|
||||
应该输出:
|
||||
```
|
||||
```bash
|
||||
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
|
||||
Profile‑sync‑daemon
|
||||
将浏览器配置文件和缓存挂载到内存,退出时再写回磁盘:
|
||||
|
||||
sudo pacman -S profile-sync-daemon
|
||||
systemctl --user enable --now psd.service
|
||||
|
||||
Systemd‑oomd
|
||||
启用 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
|
||||
|
||||
Ananicy‑Cpp
|
||||
根据预设规则给游戏、多媒体和后台任务打优先级标签:
|
||||
|
||||
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 packages:sudo 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
|
||||
|
||||
一般推荐在qemu虚拟机中安装,这里仅做示例:
|
||||
```
|
||||
```bash
|
||||
sudo pacman -S docker
|
||||
```
|
||||
|
||||
安装完成后,需要启动Docker服务,并设置为开机自启:
|
||||
```
|
||||
```bash
|
||||
sudo systemctl start docker
|
||||
sudo systemctl enable docker
|
||||
```
|
||||
|
||||
运行以下命令来验证Docker是否正常工作:
|
||||
```
|
||||
```bash
|
||||
sudo docker run hello-world
|
||||
```
|
||||
默认情况下,只有root用户才能运行Docker命令。为了避免每次运行Docker命令时都需要使用sudo,可以将当前用户添加到docker组:
|
||||
```
|
||||
```bash
|
||||
sudo usermod -aG docker $USER
|
||||
```
|
||||
之后,需要注销并重新登录,或者重启系统以使更改生效。
|
||||
|
||||
安装Docker Compose:
|
||||
```
|
||||
```bash
|
||||
sudo pacman -S docker-compose
|
||||
```
|
||||
---
|
||||
|
||||
@@ -22,8 +22,6 @@ tags = ["综合工程"]
|
||||
- 8.VPN配置回家;
|
||||
- 9.实现透明代理。
|
||||
|
||||
> 剩余专业路由功能可以由ROS替代,服务则跑在NAS系统上,避免ALL in Boom!
|
||||
|
||||
## 大致思路
|
||||
|
||||
- 使用高性能的X86主机管理拨号和 DHCP 内网的工作,其他无线路由器桥接做AP,Mesh组网;
|
||||
@@ -52,14 +50,39 @@ tags = ["综合工程"]
|
||||
|
||||
## **如何得到一个openwrt系统**
|
||||
|
||||
- 可以在恩山论坛上使用他人编译好的现成的镜像,如"高大全","精品小包"等等,但存在一定风险;
|
||||
- 可以使用[官方固件](https://downloads.openwrt.org/)下载得到一个最小化的系统,再一步步添加自己要用的包;注意需要根据你的uboot来选择,注意固件名称是否带了uboot_mod!
|
||||
- 可以使用[Openwrt 在线编译](https://firmware-selector.openwrt.org/)或[Openwrt.ai](https://openwrt.ai/?target=x86%2F64&id=generic)在线编译
|
||||
1. 使用编译好的现成的镜像:
|
||||
|
||||
- 恩山论坛上的"高大全","精品小包"等等,但存在一定风险;
|
||||
- 使用[官方固件](https://downloads.openwrt.org)下载得到一个最小化的系统,再一步步添加自己要用的包;注意需要根据你的uboot来选择,注意固件名称是否带了uboot_mod!
|
||||
|
||||
2. 自行编译:
|
||||
|
||||
- [Openwrt.ai](https://openwrt.ai/?target=x86%2F64&id=generic)在线编译
|
||||
一个固件;
|
||||
- 可以使用GitHub action 云编译一个固件;
|
||||
- 可以在本地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盘与一台双网口物理机
|
||||
|
||||
@@ -72,10 +95,6 @@ tags = ["综合工程"]
|
||||
|
||||
- [img 写盘工具](https://www.roadkil.net/program.php?ProgramID=12#google_vignette)
|
||||
|
||||
|
||||
|
||||
## **X86平台安装流程:**
|
||||
|
||||
1. 进入PE环境:
|
||||
|
||||
- 打开微PE,将其安装进U盘中,安装完成后将 img 工具和 openwrt 包一起放进去;
|
||||
@@ -100,14 +119,8 @@ tags = ["综合工程"]
|
||||
uci commit luci
|
||||
/etc/init.d/uhttpd restart``
|
||||
然后重新访问 Web 界面,查看是否恢复正常。
|
||||
- 一般要安装的包:
|
||||
```
|
||||
openssh-sftp-server
|
||||
libpcap
|
||||
luci-app-upnp
|
||||
luci-app-ttyd
|
||||
kmod-nft-xxx
|
||||
```
|
||||
|
||||
|
||||
## **X86平台本地编译完整openwrt**
|
||||
|
||||
- **系统版本:Debian 11 或者 Ubuntu LTS**
|
||||
@@ -116,7 +129,7 @@ kmod-nft-xxx
|
||||
|
||||
- **编译依赖**
|
||||
|
||||
```
|
||||
```bash
|
||||
sudo apt update
|
||||
sudo apt install -y \
|
||||
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 clean
|
||||
```
|
||||
|
||||
|
||||
- **新建一个用户,用于编译固件(可选)**
|
||||
```
|
||||
```bash
|
||||
useradd -m openwrt # 新建一个名为 openwrt 的用户
|
||||
```
|
||||
> 不可以使用Root用户进行编译!!!
|
||||
> 不可以使用Root用户进行编译!!!
|
||||
|
||||
- **修改用户默认的 Shell**
|
||||
```
|
||||
```bash
|
||||
apt install -y sudo
|
||||
usermod -s /bin/bash openwrt
|
||||
```
|
||||
|
||||
- **切换用户**
|
||||
```
|
||||
```bash
|
||||
su openwrt
|
||||
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 文件系统。
|
||||
|
||||
- target: 包含目标设备架构的配置和构建信息。
|
||||
- `linux/`:包含与 Linux 内核相关的代码和配置。
|
||||
- `generic/`:通用配置文件。
|
||||
- `platform/`:针对具体设备平台的特定配置。
|
||||
|
||||
- package: 包含所有 OpenWrt 的软件包。
|
||||
- `base/`:基本功能相关的软件包(如 BusyBox、opkg)。
|
||||
- `kernel/`:与内核相关的补丁或模块。
|
||||
- `network/`:网络工具和协议(如 DHCP、DNS)。
|
||||
- `utils/`:各种实用工具(如编解码器、文件工具)。
|
||||
|
||||
- config: 存放默认配置文件,例如 `Config.in`,用于定义菜单项。
|
||||
- scripts: 构建过程中使用的辅助脚本(如生成补丁、编译镜像)。
|
||||
- toolchain: 构建工具链所需的文件,如编译器、链接器。
|
||||
- tools: 一些构建系统依赖的额外工具(如 `autoconf`、`zlib`)。
|
||||
- include: 存放 Makefile 的通用模板和其他全局定义文件。
|
||||
- feeds: 包含通过 `feeds.conf` 配置的外部软件包源。
|
||||
- documentation: 包含与 OpenWrt 项目相关的文档,如构建指南和开发文档。
|
||||
| 名称 | 作用 |
|
||||
| -------------------- | ---------------------------------------------------------------------- |
|
||||
| `Makefile` | **整个 OpenWrt 构建系统的总入口点**(顶层 Makefile),运行 `make menuconfig`、`make` 都依赖它 |
|
||||
| `Config.in` | Kconfig 系统的入口配置文件,决定 `make menuconfig` 菜单显示什么选项 |
|
||||
| `config/` | 构建系统的默认配置模板、菜单逻辑,和 `menuconfig` 相关 |
|
||||
| `include/` | 包含通用 makefile 片段的目录(比如编译选项、函数定义) |
|
||||
| `rules.mk` | 所有包编译通用规则都写在这里,`include $(TOPDIR)/rules.mk` 是常见语句 |
|
||||
| `feeds.conf.default` | 定义 Feed 源(即可选的软件源),可用于管理外部包,比如 `luci`、`packages` |
|
||||
| `feeds/` *(克隆后还没出现)* | `./scripts/feeds update -a` 后才会出现,用来保存外部 feed 的代码 |
|
||||
| `package/` | OpenWrt 自带的核心包和第三方包(除 feeds 外的)都在这,结构是 `package/<分类>/<包名>` |
|
||||
| `target/` | 支持的平台架构,比如 `x86`、`ramips`、`ath79`、`mediatek` 等都在里面 |
|
||||
| `toolchain/` | 编译器链、glibc/musl、binutils、gcc 都在这里构建 |
|
||||
| `tools/` | 构建工具目录,编译前工具如 `m4`、`autoconf`、`xz`、`patch` 等放在这 |
|
||||
| `scripts/` | 脚本工具目录,如 `feeds` 管理、镜像合并、menuconfig 支持等 |
|
||||
| `LICENSES/` | 所有包/组件的许可证归档 |
|
||||
| `COPYING` | OpenWrt 的主许可证(GPLv2) |
|
||||
| `README.md` | 简要介绍如何开始使用 OpenWrt 的说明文档 |
|
||||
| `BSDmakefile` | 为 BSD 系统一些兼容 makefile,Linux 用户用不到 |
|
||||
|
||||
|
||||
- **添加软件源,可自行添加软件源至 feeds.conf.default 文件,也可以直接git添加需要的软件到lede目录下:**
|
||||
```
|
||||
- **添加软件源,可自行添加软件源至 feeds.conf.default 文件**
|
||||
```bash
|
||||
vim feeds.conf.default
|
||||
```
|
||||
```
|
||||
常用源
|
||||
|
||||
**常用源**
|
||||
```bash
|
||||
src-git kenzo https://github.com/kenzok8/openwrt-packages
|
||||
src-git small https://github.com/kenzok8/small
|
||||
src-git haibo https://github.com/haiibo/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
|
||||
```
|
||||
|
||||
- **更新并安装插件**
|
||||
```
|
||||
```bash
|
||||
./scripts/feeds clean
|
||||
./scripts/feeds update -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**
|
||||
```
|
||||
sed -i 's/192.168.1.1/192.168.2.1/g' package/base-files/files/bin/config_generate
|
||||
```bash
|
||||
#!/usr/bin/env bash
|
||||
# diy-part2.sh — 在镜像生成时注入默认设置和定制 SSH 横幅及模型修复
|
||||
|
||||
# 1. 默认 hostname(可选)
|
||||
sed -i 's/=ImmortalWrt/=my-device/' package/base-files/files/bin/config_generate
|
||||
|
||||
# 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
|
||||
```
|
||||
|
||||
|
||||
**修改默认主机名**
|
||||
```
|
||||
sed -i '/uci commit system/i\uci set system.@system[0].hostname='OpenWrt'' package/lean/default-settings/files/zzz-default-settings
|
||||
```
|
||||
|
||||
**加入编译者信息**
|
||||
```
|
||||
sed -i "s/OpenWrt /smith build $(TZ=UTC-8 date "+%Y.%m.%d") @ OpenWrt /g" package/lean/default-settings/files/zzz-default-settings
|
||||
```
|
||||
- 执行 **make menuconfig** 命令进入编译菜单。
|
||||
|
||||
|
||||
**修改默认主题**
|
||||
```
|
||||
sed -i "s/luci-theme-bootstrap/luci-theme-argon/g" feeds/luci/collections/luci/Makefile
|
||||
```
|
||||
| 命令 | 功能描述 | 优点 | 适用场景 |
|
||||
| ----------------- | ---------------------------------------------------- | -------------------- | -------------- |
|
||||
| `make menuconfig` | 以 ncurses 界面交互式地浏览、修改当前 `.config` 与最新 Kconfig 中的所有选项 | 界面友好,支持搜索和分类;可直观调整 | 想手动挑选/调整配置时 |
|
||||
| `make oldconfig` | 在命令行逐项对比 `.config` 与最新 Kconfig:保留原值、提示新增项、删除废弃项 | 快速同步,只对新增选项发出提示;无需界面 | 自动化脚本或快速同步配置时 |
|
||||
| `make defconfig` | 忽略当前 `.config`,直接加载架构/板级目录下的默认配置(`defconfig`) | 一键生成官方/平台推荐的「干净」配置 | 想重置到官方默认或重新开始时 |
|
||||
|
||||
执行 **make menuconfig** 命令进入编译菜单。
|
||||
|
||||
### **编译配置菜单说明(部分)**
|
||||
|
||||
```
|
||||
Target System (Broadcom BCM27xx) # 选择处理器架构
|
||||
└── Subtarget (BCM2711 boards (64 bit)) # 选择处理器
|
||||
└── Target Profile (Raspberry Pi 4B/400/4CM (64bit)) # 预制配置文件
|
||||
└── Target Images # 固件映像设置
|
||||
└── ramdisk # 内存盘
|
||||
├── Compression # 压缩等级 (none 表示不压缩)
|
||||
├── Root filesystem archives # 根文件系统存档类型
|
||||
│ ├── cpio.gz
|
||||
│ └── tar.gz
|
||||
├── Root filesystem images # 根文件系统格式
|
||||
│ ├── ext4 # 适用于大容量闪存
|
||||
│ ├── squashfs # 适用于小容量闪存
|
||||
│ └── Gzip images # Gzip 存档
|
||||
└── Image Options
|
||||
├── Kernel partition size # 内核分区大小
|
||||
├── Root filesystem partition size # 跟文件系统分区大小
|
||||
└── Make /var persistent # 持久化 /var
|
||||
```bash
|
||||
Target System (x86) # 选择目标平台
|
||||
└── Subtarget (x86_64) # 选择 64-bit 子架构
|
||||
└── Target Profile (Generic) # “Generic” 表示通用 x86_64 设备
|
||||
└── Target Images # 固件镜像设置
|
||||
├── ramdisk # 可选内存盘镜像
|
||||
│ ├── Compression # 压缩类型(如 none 表示无压缩)
|
||||
│ ├── Root filesystem archives # 压缩存档:cpio.gz 或 tar.gz
|
||||
│ └── Root filesystem images # 文件系统镜像:ext4、squashfs、Gzip
|
||||
└── Image Options # 镜像选项
|
||||
├── Kernel partition size # 内核分配分区大小
|
||||
├── Root filesystem partition size # 根文件系统分区大小
|
||||
└── Make /var persistent # 是否保留 /var 持久化
|
||||
|
||||
Enable experimental features by default # 默认启用实验性功能
|
||||
Global build settings # 全局编译设置
|
||||
Advanced configuration options (for developers) # 高级选项(仅供开发者)
|
||||
Build the OpenWrt Image Builder # 编译 OpenWrt 镜像编译器
|
||||
Build the OpenWrt SDK # 编译 OpenWrt SDK
|
||||
Package the OpenWrt-based Toolchain # 打包 OpenWrt 工具链
|
||||
Image configuration # 镜像选项
|
||||
Global build settings # 全局构建设置
|
||||
Advanced configuration options (for developers) # 开发者高级选项
|
||||
Build the OpenWrt Image Builder # 编译镜像构建器
|
||||
Build the OpenWrt SDK # 构建交叉编译 SDK
|
||||
Package the OpenWrt‑based Toolchain # 打包 OpenWrt 工具链
|
||||
Image configuration # 镜像总体配置页面
|
||||
|
||||
Base system # 基本组件
|
||||
Administration # 管理员工具
|
||||
Boot Loaders # 引导程序
|
||||
Development # 开发者工具
|
||||
Extra packages # 额外包
|
||||
Base system # 系统基础组件
|
||||
Administration # 管理工具(如 ssh、管理员脚本)
|
||||
Boot Loaders # 引导程序(如 grub、syslinux)
|
||||
Development # 编译/调试辅助工具
|
||||
Extra packages # 附加应用(如 wget、curl)
|
||||
Firmware # 固件工具
|
||||
Fonts # 字体
|
||||
Kernel modules # 内核模块
|
||||
Languages # 额外的语言 (Python3, PHP, NodeJS 等)
|
||||
Libraries # 系统库
|
||||
LuCI # LuCI 插件(一般只需修改应用和主题)
|
||||
Fonts # 字体支持
|
||||
Kernel modules # x86 内核模块驱动
|
||||
Languages # 编程语言包(如 Python3、Node.js)
|
||||
Libraries # 系统库依赖
|
||||
LuCI # Web UI 前端
|
||||
└── Collections
|
||||
└── Modules
|
||||
└── Applications
|
||||
└── Themes
|
||||
└── Protocols
|
||||
└── Libraries
|
||||
└── default-settings # 默认选项(自动配置语言包)
|
||||
└── default‑settings
|
||||
|
||||
Mail # 邮件
|
||||
Multimedia # 多媒体
|
||||
Network # 网络相关
|
||||
Sound # 音频
|
||||
Utilities # 各类实用软件(比如 VIM)
|
||||
Xorg
|
||||
```
|
||||
Mail # 邮件客户端
|
||||
Multimedia # 媒体工具(如 ffmpeg)
|
||||
Network # 网络功能(如 openvpn、wireguard)
|
||||
Sound # 音频相关软件
|
||||
Utilities # 常用实用程序(如 vim、htop)
|
||||
Xorg # 桌面环境支持(X11 图形系统)
|
||||
|
||||
### **菜单选项说明**
|
||||
|
||||
**选择 CPU 类型**
|
||||
```
|
||||
Target System (x86) --> # 软路由选择 x86,硬路由根据型号厂家自行选择
|
||||
|
||||
Subtarget (x86_64) --> # CPU 子选项
|
||||
|
||||
Target Profile (Generic x86/64) --> # 厂家具体型号
|
||||
```
|
||||
**设置镜像编译的格式(squashfs,ext4)**
|
||||
```
|
||||
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
|
||||
```
|
||||
|
||||
- **检查文件完整性**
|
||||
```
|
||||
```bash
|
||||
find dl -size -1024c -exec ls -l {} \;
|
||||
```
|
||||
检查文件完整性命令可以列出下载不完整的文件,小于1k的文件属于下载不完整,如果存在则用下面的命令删除,然后重新下载编译所需的软件包,再次检查.确认所有文件完整可大大提高编译成功率,避免浪费时间
|
||||
```
|
||||
```bash
|
||||
find dl -size -1024c -exec rm -f {} \;
|
||||
```
|
||||
最后编译固件,编译完成后输出路径是 **bin/targets**,默认密码是 **password**.
|
||||
|
||||
- **编译固件(-j 后面是线程数,首次编译推荐用单线程)**
|
||||
```
|
||||
- **最后编译固件(-j 后面是线程数,首次编译推荐用单线程)编译完成后输出路径是bin/targets.**
|
||||
```bash
|
||||
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
|
||||
|
||||
./scripts/feeds install -a
|
||||
```
|
||||
清除旧的编译产物和目录(可选)
|
||||
```
|
||||
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
|
||||
恢复所有修改(包括未跟踪文件):
|
||||
```bash
|
||||
git clean -fd
|
||||
git restore --source=v24.10.2 --staged --worktree .
|
||||
```
|
||||
|
||||
## Dwrt 方案
|
||||
|
||||
### 如果需要重新配置
|
||||
| 作用 | 组件 |
|
||||
| ----------- | -------------------- |
|
||||
| 主题 | argon |
|
||||
| Shell | bash |
|
||||
| SSH 服务器 | dropbear |
|
||||
| Web 服务器 | uhttpd |
|
||||
| DNS/DHCP 服务 | dnsmasq‑full |
|
||||
| 加密库 | openssl |
|
||||
| 压缩算法 | zram+zstd |
|
||||
| 拥塞控制 | bbr |
|
||||
| 防火墙 | nftables + iptables |
|
||||
| 调度模块 | BPF + kmod-sched-xxx |
|
||||
| 时间同步 | ntpd-full |
|
||||
| 文本编辑 | vim-full vim-runtime |
|
||||
| 编译优化 | LTO + O3 |
|
||||
|
||||
要启用的软件包:
|
||||
|
||||
**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
|
||||
```
|
||||
rm -rf ./tmp && rm -rf .config # 清除临时文件和编译配置文件
|
||||
**cli**
|
||||
```bash
|
||||
btop iperf3 tcpdump
|
||||
```
|
||||
**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快速编译包
|
||||
|
||||
make menuconfig
|
||||
首先新建一个文件夹并将SDK克隆下来:
|
||||
|
||||
make download -j8
|
||||
|
||||
find dl -size -1024c -exec ls -l {} \;
|
||||
|
||||
make -j$(nproc) || make -j1 || make -j1 V=s
|
||||
```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压缩,因此解压的命令为
|
||||
|
||||
|
||||
## 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用户!``
|
||||
|
||||
**随后安装编译依赖的各个包:**
|
||||
|
||||
```
|
||||
sudo apt update
|
||||
sudo apt install -y \
|
||||
ack antlr3 asciidoc autoconf automake autopoint binutils bison build-essential \
|
||||
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包**,如
|
||||
|
||||
```
|
||||
git clone https://github.com/immortalwrt/immortalwrt.git
|
||||
```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 install -a
|
||||
```
|
||||
**下载并选中我们需要编译的包,这里以inyn为例:**
|
||||
```
|
||||
git clone https://github.com/diredocks/openwrt-inyn.git ./package/inyn
|
||||
make menuconfig
|
||||
|
||||
更新完成后克隆你要编译的包的源码到package下:
|
||||
|
||||
```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 软件包**
|
||||
```
|
||||
make package/inyn/compile V=s
|
||||
## 如果不行则需要先编译工具链,即为 make j=4 ,j为CPU核数
|
||||
```bash
|
||||
make package/luci-app-zzz/compile V=s
|
||||
|
||||
~/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**来编译。
|
||||
|
||||
- 大体架构是选择**源码 -- 机型 -- 版本 -- 插件/主题 -- 配置(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``,完成后即可出现新架构的编译按钮.
|
||||
|
||||
|
||||
|
||||
## 常用命令:
|
||||
```
|
||||
```bash
|
||||
# 更新软件列表
|
||||
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
|
||||
```
|
||||
> 新版本的openwrt(24.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 终端管理) |
|
||||
| **适用场景** | 性能较好,但分流设置复杂 | 适用于clash系,机场首选 | 操作简单,分流完善,但对路由器性能要求较高 | 没有UI界面,性能最好,支持完善,可以通过clashapi安装UI |
|
||||
|
||||
|
||||
## 校园网多设备防检测
|
||||
|
||||
**常见检测方法**:
|
||||
|
||||
@@ -28,21 +28,21 @@ Waydroid是Anbox配合Halium技术开发的LXC Android容器,可在GNU/Linux
|
||||
目前Waydroid只支持Intel和AMD的显卡,对于 NVIDIA 显卡(除 Tegra 系列外),Waydroid 不支持硬件加速,推荐使用软件渲染或QEMU方案。
|
||||
|
||||
- Waydroid必须使用Wayland,用此命令检查当前系统是否为Wayland:
|
||||
```
|
||||
```bash
|
||||
echo $XDG_SESSION_TYPE
|
||||
```
|
||||
若显示X11代表不是Wayland。GNOME和KDE可在登入画面切换至Wayland工作阶段。
|
||||
|
||||
- Waydroid要求Linux核心支持binder核心模组,但Arch Linux预设的linux核心並无开启此选项,因此需要从AUR安装binder_linux-dkms补齐。
|
||||
```
|
||||
```bash
|
||||
paru -S binder_linux-dkms
|
||||
```
|
||||
- 安装后载入binder核心模组
|
||||
```
|
||||
```bash
|
||||
sudo modprobe binder-linux devices=binder,hwbinder,vndbinder
|
||||
```
|
||||
- 设定开机自动载入核心模组
|
||||
```
|
||||
```bash
|
||||
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
|
||||
@@ -51,36 +51,36 @@ echo "options binder_linux devices=binder,hwbinder,vndbinder" | sudo tee -a /etc
|
||||
## 安装Waydroid
|
||||
|
||||
- 安装以下软件包,让Linux与Waydroid共享剪切板
|
||||
```
|
||||
```bash
|
||||
paru -S wl-clipboard xclip
|
||||
paru -S python-pyclip
|
||||
```
|
||||
|
||||
- 安装Waydroid
|
||||
```
|
||||
```bash
|
||||
paru -S waydroid
|
||||
```
|
||||
- 初始化Waydroid,下载含有GAPPS的Android系统映像档
|
||||
```
|
||||
```bash
|
||||
sudo waydroid init -s GAPPS -f
|
||||
```
|
||||
- 启动Waydroid容器服务
|
||||
```
|
||||
```bash
|
||||
sudo systemctl start waydroid-container
|
||||
```
|
||||
|
||||
## 常用命令
|
||||
|
||||
- 开机自动启动
|
||||
```
|
||||
```bash
|
||||
sudo systemctl enable waydroid-container
|
||||
```
|
||||
- 点选应用列表的「Waydroid」图示开启主画面,或者使用命令:
|
||||
```
|
||||
```bash
|
||||
waydroid show-full-ui
|
||||
```
|
||||
- 若Waydroid无法连上网路,开放UFW防火墙:
|
||||
```
|
||||
```bash
|
||||
sudo ufw allow 53
|
||||
sudo ufw allow 67
|
||||
sudo ufw default allow FORWARD
|
||||
@@ -88,21 +88,21 @@ sudo ufw reload
|
||||
sudo systemctl restart waydroid-container
|
||||
```
|
||||
- 重启Waydroid
|
||||
```
|
||||
```bash
|
||||
sudo systemctl restart waydroid-container
|
||||
```
|
||||
|
||||
- 启动/停止Waydroid容器服务
|
||||
```
|
||||
```bash
|
||||
sudo systemctl start waydroid-container
|
||||
sudo systemctl stop waydroid-container
|
||||
```
|
||||
- 用命令开启Waydroid主画面
|
||||
```
|
||||
```bash
|
||||
waydroid show-full-ui
|
||||
```
|
||||
- 查看系统错误讯息
|
||||
```
|
||||
```bash
|
||||
waydroid log
|
||||
sudo waydroid logcat
|
||||
```
|
||||
@@ -116,35 +116,35 @@ sudo waydroid logcat
|
||||
安装Package Manager,用於查看APP的软件包名称。
|
||||
|
||||
部份APP会要求开启Wifi才能上网,那么就如它所愿,开启fake wifi:
|
||||
```
|
||||
```bash
|
||||
waydroid prop set persist.waydroid.fake_wifi "软件包名称"
|
||||
```
|
||||
例如给Fate/Go游戏开启模拟Wifi:
|
||||
```
|
||||
```bash
|
||||
waydroid prop set persist.waydroid.fake_wifi "com.aniplex.fategrandorder"
|
||||
```
|
||||
- 模拟触控功能
|
||||
|
||||
安装Package Manager,用於查看APP的软件包名称。有些APP认不到鼠标点击,需要启用模拟触控(fake touch):
|
||||
```
|
||||
```bash
|
||||
waydroid prop set persist.waydroid.fake_touch "软件包名称"
|
||||
```
|
||||
例如给Fate/Go游戏开启模拟触控:
|
||||
```
|
||||
```bash
|
||||
waydroid prop set persist.waydroid.fake_touch "com.aniplex.fategrandorder"
|
||||
```
|
||||
- 用命令安装APK
|
||||
```
|
||||
```bash
|
||||
waydroid app install <APK档案路径>.apk
|
||||
```
|
||||
- 进入ADB Shell
|
||||
```
|
||||
```bash
|
||||
sudo waydroid shell
|
||||
```
|
||||
- 开启多视窗模式
|
||||
|
||||
Waydroid的多视窗模式,看起来像Linux的原生应用。启动后按F11改回来。
|
||||
```
|
||||
```bash
|
||||
waydroid prop set persist.waydroid.multi_windows true
|
||||
sudo systemctl restart waydroid-container
|
||||
```
|
||||
@@ -154,13 +154,13 @@ sudo systemctl restart waydroid-container
|
||||
Waydroid第一次开机可能会收到``Device is not Play Protect certified``的通知,无法登入Google账号。
|
||||
|
||||
用以下命令取得Waydroid的装置ID。该命令会印出一长串数字。
|
||||
```
|
||||
```bash
|
||||
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\";"
|
||||
```
|
||||
开启装置注册页面,登入Google账号,输入装置ID注册,等个半小时应该就能登入Google账号了。如果还是不行就重新启动Waydroid容器服务:
|
||||
```
|
||||
```bash
|
||||
sudo systemctl restart waydroid-container
|
||||
```
|
||||
现在可以安装APP了,Google Play和F-Droid会自动筛出適合x86架构的APP。
|
||||
|
||||
@@ -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系:**
|
||||
Debian:Debian以稳定性,安全性和轻量级著称,适合用于服务器和桌面环境。我们常说的Ubuntu就是基于Debian的发行版,注重用户友好性和易用性。它提供了多种桌面环境选择,以及许多现成的软件包。
|
||||
```
|
||||
APT(Advanced Package Tool)是Debian系发行版的主要包管理器。它使用命令行工具如apt-get、aptitude等来管理软件包。
|
||||
```
|
||||
**Red Hat系:**
|
||||
- Red Hat Enterprise Linux(RHEL):RHEL是一款商业发行版,专注于企业级应用和支持。它提供了长期支持和专业技术支持服务,适用于企业级服务器和工作站。
|
||||
- CentOS:CentOS是基于RHEL源代码编译而成的免费发行版,与RHEL兼容并提供类似的功能和性能。它也提供了长期支持版本和稳定性较高的特点。
|
||||
- Fedora:Fedora是由Red Hat支持的社区驱动的发行版,注重提供最新的软件特性和技术。它适用于开发者和技术爱好者,提供了稳定的发布周期和丰富的软件包。
|
||||
```
|
||||
YUM(Yellowdog Updater, Modified)是Red Hat系发行版的主要包管理器。最近的版本也开始采用DNF(Dandified YUM)。
|
||||
```
|
||||
**Arch系:**
|
||||
Arch Linux:Arch Linux是一个简洁、轻量级且灵活的发行版,注重简洁性和滚动更新。它采用“滚动发布”的方式,用户可以通过自定义安装来构建自己的系统,适合有一定Linux经验的用户。
|
||||
```
|
||||
Pacman(Package Manager)是Arch Linux的主要包管理器。它使用简洁的命令来管理软件包,如pacman -S安装软件包、pacman -Syu更新系统等。
|
||||
```
|
||||
**Gentoo系:**
|
||||
Gentoo:Gentoo是一个源码驱动的发行版,用户可以通过源代码自定义编译软件包以满足自己的需求。它注重性能和灵活性,适合高级用户和技术爱好者。
|
||||
```
|
||||
Portage是Gentoo的包管理器,它是一个源代码驱动的包管理器,允许用户从源代码构建和安装软件包。
|
||||
```
|
||||
除了以上列举的包管理器外,还有其他一些较为特殊的包管理器,如Slackware系的pkgtool、SUSE系的zypper等。
|
||||
|
||||
对于个人使用而言,我个人建议新手使用Ubuntu,有比较易用的界面和完善的资料参考;如果你是一个系统极客,可以使用Arch linux 或者 NixOS。
|
||||
|
||||
## 五.个人日常使用需要注意什么?
|
||||
|
||||
1. **学习命令行**:命令行是Linux的强大工具,学习基本命令可以提高效率。
|
||||
|
||||
2. **选择合适的发行版**:根据个人需求和技术水平选择适合的发行版。
|
||||
|
||||
3. **系统备份**:定期备份重要数据,以防意外丢失。
|
||||
|
||||
4. **软件管理**:了解如何安装、更新和卸载软件。
|
||||
|
||||
5. **安全设置**:设置强密码,定期更新系统以修复安全漏洞。
|
||||
|
||||
6. **社区参与**:Linux社区非常活跃,遇到问题可以寻求社区帮助。
|
||||
|
||||
7. **硬件兼容性**:检查你的硬件是否与选择的Linux发行版兼容。
|
||||
|
||||
8. **驱动程序**:确保你的硬件设备有可用的驱动程序,以避免兼容性问题。
|
||||
|
||||
@@ -1,127 +0,0 @@
|
||||
+++
|
||||
title = "Linux之旅(二):FHS与目录结构"
|
||||
date = 2023-07-21
|
||||
|
||||
[taxonomies]
|
||||
tags = ["Linux"]
|
||||
+++
|
||||
|
||||
前言 在Linux世界中,Filesystem Hierarchy Standard(FHS)是一座引导我们进入系统核心的桥梁,它定义了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` 目录下的文件夹就会改为英文,并且系统也会正确识别这些新的目录路径。
|
||||
@@ -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内核**:
|
||||
- LTS(Long-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及其主要特点:
|
||||
|
||||
**Bash(Bourne Again Shell)**:
|
||||
- Bash是Linux系统中最常用的Shell之一,也是默认的命令行解释器。它是Bourne Shell的增强版,提供了丰富的功能和扩展性,包括命令历史、命令补全、作业控制等。Bash具有良好的兼容性和易用性,适用于日常的系统管理和脚本编程。
|
||||
|
||||
**Zsh(Z Shell)**:
|
||||
- Zsh是一种功能强大的Shell,提供了丰富的功能和扩展性,如更强大的命令补全、自动纠正拼写错误、主题和插件系统等。Zsh具有良好的可定制性和用户体验,适用于高级用户和程序员。
|
||||
|
||||
**Fish(Friendly Interactive Shell)**:
|
||||
- Fish是一种用户友好的交互式Shell,提供了直观的命令提示和自动补全功能,以及丰富的语法高亮和命令提示信息。Fish具有良好的用户体验和易用性,适用于初学者和普通用户。
|
||||
|
||||
**Dash(Debian Almquist Shell)**:
|
||||
- Dash是一种轻量级的Shell,专门设计用于系统启动过程和脚本执行。Dash具有较高的执行速度和较低的内存占用,适用于系统启动脚本和简单的脚本编程。
|
||||
|
||||
Bash是最常用的Shell之一,具有良好的兼容性和功能性;Zsh提供了更多的高级特性和定制选项,适用于高级用户和程序员;Fish具有友好的交互式体验和直观的用户界面,适用于初学者和普通用户;Dash则是一个轻量级的Shell,专门用于系统启动过程和简单的脚本编程。用户可以根据自己的需求和偏好选择合适的Shell。
|
||||
|
||||
|
||||
## **三.Linux包管理器**
|
||||
|
||||
在Linux系统中,有几种常见的包管理器,它们各自管理着不同的发行版,具有不同的特点和用途。以下是一些常见的Linux包管理器及其主要特点:
|
||||
|
||||
**APT(Advanced Package Tool)**:
|
||||
- APT是Debian系(如Debian、Ubuntu)中最常用的包管理器之一。它使用基于命令行的工具,如`apt-get`、`apt-cache`等来安装、升级和删除软件包。APT还支持依赖关系的自动解决,使得软件包的安装和管理变得更加方便。
|
||||
|
||||
**YUM(Yellowdog Updater, Modified)**:
|
||||
- YUM是Red Hat系(如CentOS、Fedora)中常用的包管理器之一。它使用基于命令行的工具,如`yum`来管理软件包。YUM具有良好的依赖关系解决能力和事务处理功能,使得系统升级和软件包管理变得更加简单和可靠。
|
||||
|
||||
**DNF(Dandified YUM)**:
|
||||
- DNF是YUM的下一代版本,逐渐取代了YUM在Fedora和RHEL系列中的地位。DNF具有更快的包查询和事务处理能力,以及更友好的用户界面。它是未来主流的包管理器之一。
|
||||
|
||||
**Pacman(Package 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`删除软件包等。
|
||||
|
||||
**RPM(RPM 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)的显示和交互。下面是它们的简要介绍以及异同点:
|
||||
|
||||
- **X11(X 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 安装软件。
|
||||
@@ -1,82 +0,0 @@
|
||||
+++
|
||||
title = "Linux之旅(四):Terminal,Console and Shell"
|
||||
date = 2023-07-23
|
||||
|
||||
[taxonomies]
|
||||
tags = ["Linux"]
|
||||
+++
|
||||
|
||||
|
||||
前言 在linux的学习过程中,我们常常遇到诸如 Terminal,Console,bash,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 中的虚拟终端,都是软件的概念。虚拟终端称之为 tty,tty 是电传打字机电传打字机 Teletypewriter 的缩写,在带显示屏的视频终端出现之前,tty是最流行的终端设备。每一个 tty 都有一个编号,在/dev目录下有相应的设备文件。其中/dev/tty1到/dev/tty7可以通过 Ctrl+Alt+F1 到 Ctrl+Alt+F7 进行切换,也可以通过 chvt 命令进行切换,就好比是以前多人公用的计算机中的六个终端设备,这就是为什么这个叫“虚拟终端”的原因。
|
||||
|
||||
|
||||
|
||||
|
||||
## 时代变迁
|
||||
|
||||
随着时间的推移,我们看到了从硬件到软件的转变,以及从多用户共享到个人使用的转变。这种变迁不仅影响了终端和控制台的概念,也塑造了我们对计算机的理解和期待。
|
||||
@@ -1,130 +0,0 @@
|
||||
+++
|
||||
title = "Linux之旅(五):BIOS-UEFI-MBR-GPT-GRUB"
|
||||
date = 2023-07-24
|
||||
|
||||
[taxonomies]
|
||||
tags = ["Linux"]
|
||||
+++
|
||||
|
||||
|
||||
前言 在计算机领域,系统引导和磁盘分区是至关重要的。本文将介绍BIOS与UEFI,MBR与GPT,以及它们之间的异同点。此外,我们还会讨论与这些概念密切相关的引导加载程序——GRUB。
|
||||
<!-- more -->
|
||||
## BIOS
|
||||
|
||||
> `BIOS(Basic 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
|
||||
|
||||
> GRUB(GRand 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. 用户登录**:
|
||||
- 操作系统初始化完成后,显示登录界面(如果配置了图形用户界面),用户输入用户名和密码登录系统。
|
||||
- 如果登录成功,操作系统加载用户的桌面环境或命令行界面,用户开始使用计算机。
|
||||
|
||||
## 各种引导加载程序
|
||||
|
||||
| 特性 | GRUB(GRand Unified Bootloader) | LILO(Linux Loader) | systemd-boot(前身为 gummiboot) | rEFInd(UEFI 引导管理器) |
|
||||
|--------------------|----------------------------------|-----------------------------------|----------------------------------|------------------------------------|
|
||||
| **支持的系统类型** | BIOS 和 UEFI | 仅支持 BIOS 模式 | 仅支持 UEFI | 仅支持 UEFI |
|
||||
| **多系统引导支持** | ✅ 强大支持 | ❌ 不支持多系统引导 | ✅ 支持(需手动配置) | ✅ 自动检测操作系统 |
|
||||
| **图形界面支持** | ✅ 支持(可自定义主题) | ❌ 不支持 | ❌ 不支持 | ✅ 支持(可自定义主题) |
|
||||
| **配置方式** | 配置文件(复杂) | 配置文件(简单) | 配置文件(简单) | 配置文件(简单) |
|
||||
| **命令行支持** | ✅ 支持(交互式命令行) | ❌ 不支持 | ❌ 不支持 | ❌ 不支持 |
|
||||
| **文件系统支持** | ✅ 支持多种文件系统 | ✅ 支持 ext2/ext3/ext4 等 | ✅ 支持 ext4、FAT 等 | ✅ 支持 ext4、FAT 等 |
|
||||
| **安全启动支持** | ✅ 支持(需配置) | ❌ 不支持 | ✅ 支持(需配置) | ✅ 支持(需配置) |
|
||||
| **安装复杂度** | 中等(需配置) | 较低 | 较低 | 中等(需配置) |
|
||||
| **适用场景** | 多系统引导、复杂配置 | 简单系统引导 | 简单系统引导 | 多系统引导、美观界面 |
|
||||
|
||||
## 后记
|
||||
|
||||
|
||||
- [聊聊BIOS、UEFI、MBR、GPT、GRUB……](https://segmentfault.com/a/1190000020850901)
|
||||
@@ -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:这些是设备每秒交付的读取、写入、读取千字节和写入千字节。使用这些来表征块设备的工作负载。性能问题可能是由于向块设备施加了过多的工作负载。
|
||||
- await:IO的平均时间,以毫秒为单位。这是应用程序所感受到的时间,它包括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命令清除后,间歇性问题的证据也可能被丢失了。
|
||||
@@ -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
6
content/links/link-7.md
Normal 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
379
content/linux-0-start.md
Normal 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,实际上是指各种发行版,比如Ubuntu,Arch Linux,Debian等等。
|
||||
|
||||
> 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系:**
|
||||
|
||||
- Debian:Debian以稳定性,安全性和轻量级著称,适合用于服务器和桌面环境。我们常说的Ubuntu就是基于Debian的发行版,注重用户友好性和易用性。它提供了多种桌面环境选择,以及许多现成的软件包。
|
||||
|
||||
- APT(Advanced Package Tool)是Debian系发行版的主要包管理器。它使用命令行工具如apt-get、aptitude等来管理软件包。
|
||||
|
||||
**Red Hat系:**
|
||||
- Red Hat Enterprise Linux(RHEL):RHEL是一款商业发行版,专注于企业级应用和支持。它提供了长期支持和专业技术支持服务,适用于企业级服务器和工作站。
|
||||
- CentOS:CentOS是基于RHEL源代码编译而成的免费发行版,与RHEL兼容并提供类似的功能和性能。它也提供了长期支持版本和稳定性较高的特点。
|
||||
- Fedora:Fedora是由Red Hat支持的社区驱动的发行版,注重提供最新的软件特性和技术。它适用于开发者和技术爱好者,提供了稳定的发布周期和丰富的软件包。
|
||||
- YUM(Yellowdog Updater, Modified)是Red Hat系发行版的主要包管理器。最近的版本也开始采用DNF(Dandified YUM)。
|
||||
|
||||
**Arch系:**
|
||||
|
||||
- Arch Linux:Arch Linux是一个简洁、轻量级且灵活的发行版,注重简洁性和滚动更新。它采用“滚动发布”的方式,用户可以通过自定义安装来构建自己的系统,适合有一定Linux经验的用户。
|
||||
|
||||
- Pacman(Package Manager)是Arch Linux的主要包管理器。它使用简洁的命令来管理软件包,如pacman -S安装软件包、pacman -Syu更新系统等。
|
||||
|
||||
**Gentoo系:**
|
||||
|
||||
- Gentoo:Gentoo是一个源码驱动的发行版,用户可以通过源代码自定义编译软件包以满足自己的需求。它注重性能和灵活性,适合高级用户和技术爱好者。
|
||||
|
||||
- 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 不给磁盘分字母,它采用的是一种叫做 ``FHS(Filesystem 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``等等管理器来下载。
|
||||
|
||||
> 包管理器常用命令
|
||||
|
||||
| 功能 | apt(Ubuntu/Debian) | paru/pacman(Arch/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/Paru,Fedora 的 dnf,openSUSE 的 zypper,NixOS 的 nix...
|
||||
|
||||
> 实际上Windows上也是有包管理的,比如 Windows 10/11 内置的 winget(Windows Package Manager),choco(Chocolatey),scoop...由于历史原因不为大部分人所熟悉.可以使用这个项目[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`,它们通常来自一个叫 **coreutils(GNU 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
|
||||
|
||||
随着李华在系统中的探索,李华发现常常遇到诸如``Terminal,Console,bash,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 中的虚拟终端,都是软件的概念``。虚拟终端称之为 tty,tty 是电传打字机电传打字机 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 System(X11/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
360
content/linux-1-command.md
Normal 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-Fi(SSID、信号强度、安全类型):
|
||||
|
||||
```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` 正常运行。
|
||||
* 检查 profile(A2DP vs HFP):A2DP 提供高音质但不可通话,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 原生)。
|
||||
|
||||
|
||||
### 一、pactl(PulseAudio / 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>
|
||||
```
|
||||
|
||||
### 二、amixer(ALSA)
|
||||
|
||||
列出通道与当前值:
|
||||
|
||||
```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)覆盖。
|
||||
|
||||
### 三、pamixer(PulseAudio)
|
||||
|
||||
简洁的命令行前端,适合脚本:
|
||||
|
||||
```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
347
content/linux-2-stm32.md
Normal 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.**
|
||||
182
content/linux-3-android-dev.md
Normal file
182
content/linux-3-android-dev.md
Normal 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.**
|
||||
@@ -10,67 +10,3 @@ path = "about"
|
||||
> 一个人应该能够给孩子换尿布、计划一次侵略行动、杀猪、驾驶飞船、设计建筑物、写诗、做会计账目、砌墙、接合断骨、照顾临终的人、执行命令、下达命令、与人合作、独立行动、解方程式、分析一个新问题、施肥、编程、做一餐美味的饭、高效地战斗、勇敢地死去。专业化是为昆虫准备的。 ——*罗伯特·海因莱恩*
|
||||
|
||||
有事请联系 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-----
|
||||
```
|
||||
|
||||
@@ -2,8 +2,7 @@
|
||||
title = "谈天说地:狄奇周刊(二十)"
|
||||
date = 2025-01-25
|
||||
|
||||
[taxonomies]
|
||||
tags = ["谈天说地"]
|
||||
|
||||
+++
|
||||
|
||||
前言 这里是Dich的周刊,通过博客的形式讲述每周互联网形势,以及分享一些文章。
|
||||
|
||||
@@ -2,8 +2,7 @@
|
||||
title = "谈天说地:狄奇周刊(二一)"
|
||||
date = 2025-02-04
|
||||
|
||||
[taxonomies]
|
||||
tags = ["谈天说地"]
|
||||
|
||||
+++
|
||||
|
||||
前言 这里是Dich的周刊,通过博客的形式讲述每周互联网形势,以及分享一些文章。
|
||||
|
||||
229
content/windows-1-install.md
Normal file
229
content/windows-1-install.md
Normal 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)
|
||||
- **虚拟机**: Hyper‑V
|
||||
- **科学上网**: [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.**
|
||||
@@ -1,24 +1,23 @@
|
||||
+++
|
||||
title = "乱七八糟:Windows常用操作"
|
||||
date = 2024-05-24
|
||||
title = "Windows系列(2):常用操作与配置"
|
||||
date = 2024-05-25
|
||||
|
||||
[taxonomies]
|
||||
tags = ["乱七八糟","Windows"]
|
||||
tags = ["Windows"]
|
||||
+++
|
||||
|
||||
前言 Windows操作系统作为全球最为普及的桌面操作系统之一,其用户界面的设计非常经典,但存在许多不足之处,本篇记录一些常用脚本。
|
||||
|
||||
<!-- more -->
|
||||
|
||||
## **Windows11跳过联网激活 & 使用本地账号**
|
||||
|
||||
|
||||
开机之前,先断网,然后输入Shift+F10,会弹出命令行界面,并输入
|
||||
``
|
||||
``bash
|
||||
oobe\BypassNRO.cmd:
|
||||
``
|
||||
回车之后会重启,之后就可以跳过联网了,选择
|
||||
``
|
||||
``bash
|
||||
I don't have internet
|
||||
``
|
||||
即可。
|
||||
@@ -37,7 +36,7 @@ I don't have internet
|
||||
## 激活windows
|
||||
|
||||
这里使用MAS的脚本:
|
||||
```
|
||||
```bash
|
||||
irm https://get.activated.win | iex
|
||||
```
|
||||
|
||||
@@ -49,7 +48,7 @@ irm https://get.activated.win | iex
|
||||
|
||||
3.然后就可以使用脚本彻底关闭更新:将以下命令保存为.bat文件,运行即可。
|
||||
|
||||
```
|
||||
```bat
|
||||
::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 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
|
||||
```
|
||||
如果要恢复更新,使用以下命令,同样保存为.bat运行:
|
||||
```
|
||||
```bat
|
||||
::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 NoAutoUpdate /t REG_DWORD /d 0 /f
|
||||
@@ -104,17 +103,17 @@ Win11的`显示更多选项`的二级菜单过于繁琐,怎么设置才能将
|
||||
|
||||
**步骤2.** 输入以下命令并按**Enter**键执行。
|
||||
|
||||
```
|
||||
```bash
|
||||
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
|
||||
taskkill /f /im explorer.exe
|
||||
start explorer.exe
|
||||
```
|
||||
如果想要重新打开Win11新样式的右键菜单的话,以同样的方式在命令提示符中执行此命令:
|
||||
```
|
||||
```bash
|
||||
reg delete "HKCU\Software\Classes\CLSID{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}" /f
|
||||
```
|
||||
## Win11关闭 Windows Defender
|
||||
@@ -129,6 +128,8 @@ HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows Defender
|
||||
- 将名为``DisableAntiSpyware``的 DWORD (32位) 值设置为1,如果没有就新建。
|
||||
- 重启后生效。
|
||||
|
||||
> 也可以使用[defendnot](https://github.com/es3n1n/defendnot)
|
||||
|
||||
## **Win11添加开机自启动项方法**
|
||||
|
||||
选择“开始”按钮 ,然后滚动查找你希望在启动时运行的应用。
|
||||
@@ -150,7 +151,7 @@ pool.ntp.org(一个公共的 NTP 时间服务器池)
|
||||
应用更改:点击 "更新现在",然后 "确定" 保存设置。
|
||||
|
||||
- 如果有linux/win双系统,可以让 Windows 使用 UTC 作为硬件时钟时间:
|
||||
```
|
||||
```bash
|
||||
# 在 Windows 中以管理员权限运行命令提示符,执行:
|
||||
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/管理员)
|
||||
```
|
||||
```bash
|
||||
Get-NetIPInterface
|
||||
```
|
||||
你会看到类似:
|
||||
```
|
||||
```bash
|
||||
IfIndex InterfaceMetric InterfaceAlias
|
||||
------- -------------- --------------
|
||||
15 25 Wi-Fi
|
||||
@@ -173,15 +174,15 @@ IfIndex InterfaceMetric InterfaceAlias
|
||||
- 修改网络优先级
|
||||
|
||||
将有线网络(以太网) 设为更高优先级(值更小):
|
||||
```
|
||||
```bash
|
||||
Set-NetIPInterface -InterfaceIndex 3 -InterfaceMetric 10
|
||||
```
|
||||
- 将 WiFi 设为更低优先级:
|
||||
```
|
||||
```bash
|
||||
Set-NetIPInterface -InterfaceIndex 15 -InterfaceMetric 25
|
||||
```
|
||||
- 重启网络
|
||||
```
|
||||
```bash
|
||||
Restart-NetAdapter -Name "以太网"
|
||||
```
|
||||
这样,当网线插入时,Windows 会优先使用有线网络;断开网线后,自动切换到 WiFi。
|
||||
@@ -190,7 +191,7 @@ Restart-NetAdapter -Name "以太网"
|
||||
- 如需永久设置,可修改注册表:
|
||||
|
||||
Win + R 输入 regedit 打开注册表编辑器,进入路径:
|
||||
```
|
||||
```bash
|
||||
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces
|
||||
```
|
||||
在 Interfaces 里找到你的有线网卡和无线网卡(可以根据 IP 或 MAC 地址确认)。
|
||||
@@ -206,7 +207,7 @@ HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces
|
||||
|
||||
> 保存为.bat格式
|
||||
|
||||
```
|
||||
```bat
|
||||
@echo off
|
||||
REM 清理代理设置
|
||||
REG DELETE "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyEnable /f
|
||||
@@ -218,7 +219,7 @@ echo 代理设置已清除
|
||||
> 保存为.reg格式
|
||||
|
||||
开启3D加速
|
||||
```
|
||||
```bat
|
||||
Windows Registry Editor Version 5.00
|
||||
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DirectDraw]
|
||||
"EmulationOnly"=dword:00000000
|
||||
@@ -231,7 +232,7 @@ Windows Registry Editor Version 5.00
|
||||
```
|
||||
|
||||
关闭3D加速
|
||||
```
|
||||
```bat
|
||||
Windows Registry Editor Version 5.00
|
||||
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DirectDraw]
|
||||
"EmulationOnly"=dword:00000001
|
||||
@@ -1,9 +1,9 @@
|
||||
+++
|
||||
title = "乱七八糟:Windows激活那些事"
|
||||
date = 2024-05-25
|
||||
title = "Windows系列(3):分类与激活"
|
||||
date = 2024-05-26
|
||||
|
||||
[taxonomies]
|
||||
tags = ["乱七八糟","Windows"]
|
||||
tags = ["Windows"]
|
||||
+++
|
||||
|
||||
前言 Windows的正版售价十分昂贵,2025年的今天大部分人都使用着OEM厂商自带的windows系统或自己想办法激活,那么,激活到底是什么原理?
|
||||
@@ -30,6 +30,18 @@ tags = ["乱七八糟","Windows"]
|
||||
- 批量版(VOL,Volume Licensing for Organizations):企业批量购买,提供了方便大量激活的方案;
|
||||
- 厂商版(OEM,Original 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 个月 | 通常为 18~30 个月,取决于版本和配置 | IoT Enterprise LTSC 支持周期可达 10~15 年 | 通常为 5 年主流支持 + 5 年扩展支持,共 10 年 |
|
||||
| **授权方式** | 零售授权,需在线激活 | 批量许可(Volume Licensing)、OEM 授权 | OEM 授权,适用于特定硬件设备 | 批量许可,适用于特定行业和关键任务设备 |
|
||||
| **适用场景** | 日常办公、娱乐、学习 | 企业办公、教育机构、专业工作站 | 工业自动化、零售终端、医疗设备等嵌入式系统 | 医疗设备、金融终端、工业控制系统等需长期稳定运行的环境 |
|
||||
|
||||
|
||||
---
|
||||
|
||||
## **二.激活方法和原理**
|
||||
@@ -1,9 +1,9 @@
|
||||
+++
|
||||
title = "乱七八糟:Windows封装与全自动安装"
|
||||
title = "Windows系列(4):封装与全自动安装"
|
||||
date = 2024-05-29
|
||||
|
||||
[taxonomies]
|
||||
tags = ["乱七八糟","Windows"]
|
||||
tags = ["Windows"]
|
||||
+++
|
||||
|
||||
前言 由于厂商默认安装windows家庭版导致各种问题频发,这里作者封装了一个开箱即用的,全自动安装,激活和优化的Windows11镜像。
|
||||
@@ -11,30 +11,35 @@ tags = ["乱七八糟","Windows"]
|
||||
|
||||
**Dich-OS base on zh-cn_windows_11_business_23h2**
|
||||
|
||||
**实现了以下功能**:
|
||||
### 实现了以下功能
|
||||
|
||||
### 安装过程中
|
||||
|
||||
- [x] 绕过 Windows 11 要求检查(TPM/安全启动等)
|
||||
- [x] 允许在没有互联网连接的情况下安装 Windows 11
|
||||
- [x] 随机生成的计算机名称,例如:DESKTOP-ZFAH8Z2
|
||||
- [x] 在安装过程中以交互方式添加本地用户,无需注册云端账户
|
||||
- [x] 在OOBE阶段自动激活Windows(专业工作站版本)
|
||||
- [x] 禁用 Windows 更新*
|
||||
- [x] 删除了默认应用程序*
|
||||
- [x] 禁用 Windows Defender
|
||||
- [x] 在 Windows 11 中使用经典菜单,而不是二级菜单
|
||||
- [x] 随机生成的计算机名称,例如:DESKTOP-ZFAH8Z2
|
||||
|
||||
### 最终效果
|
||||
|
||||
- [x] 禁用 Windows 更新
|
||||
- [x] 删除了默认应用程序
|
||||
- [x] 使用单级右键菜单
|
||||
- [x] 始终显示文件扩展名
|
||||
- [x] 打开文件资源管理器到'此电脑'而不是'快速访问'
|
||||
- [x] 任务栏中隐藏搜索框,Task view 和小部件
|
||||
- [x] 用户密码不会过期
|
||||
- [x] 任务栏中隐藏搜索框,任务视图和小部件
|
||||
- [x] 打开文件资源管理器到“此电脑”而不是“快速访问”
|
||||
|
||||
### 其他优化特性
|
||||
|
||||
- [x] 强化 ACL
|
||||
- [x] 禁用快速启动
|
||||
- [x] 启用长路径
|
||||
- [x] 禁用快速启动
|
||||
- [x] 用户密码不会过期
|
||||
- [x] 启用远程桌面服务 (RDP)
|
||||
- [x] 阻止 Windows Update 重新启动您的计算机*
|
||||
- [x] 阻止设备 BitLocker 加密
|
||||
- [x] 删除空 C:\Windows.old 文件夹
|
||||
- [x] 自动将ISO中的Source\$OEM$\Setup\Scripts\Files文件夹中的软件放到桌面*
|
||||
- [x] 保留Windows 安装过程中以交互方式对磁盘进行分区
|
||||
- [x] 保留在 Windows 安装过程中以交互方式添加本地(“脱机”)用户
|
||||
- [x] 阻止 Windows Update 重新启动您的计算机
|
||||
- [x] 自动将ISO中的 $OEM$\Setup\Scripts\Files文件夹中的软件放到桌面
|
||||
|
||||
**PS**:
|
||||
- 禁用自动更新是创建一个名为 PauseWindowsUpdate 的计划任务,一次又一次地暂停更新一周.如果要运行 Windows 更新一次,请单击 “设置”中的“恢复更新 ”.
|
||||
@@ -55,4 +60,4 @@ tags = ["乱七八糟","Windows"]
|
||||
|
||||
**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
335
content/windows-5-py.md
Normal 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 快 10–100 倍。它通过命令行工具如 `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.**
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
+++
|
||||
title = "乱七八糟:Windows-VScode开发C/C++"
|
||||
title = "Windows系列(6):C/C++开发配置"
|
||||
date = 2024-05-30
|
||||
|
||||
[taxonomies]
|
||||
tags = ["乱七八糟","Windows"]
|
||||
tags = ["Windows"]
|
||||
+++
|
||||
|
||||
前言 由于 Windows 中开发环境较 linux 复杂,这里总结 Windows 中使用 VScode 开发 C/C++ 的环境配置。
|
||||
@@ -44,7 +44,7 @@ tags = ["乱七八糟","Windows"]
|
||||
## 配置JSON
|
||||
|
||||
- 回到 Visual Studio Code 继续配置。点击左侧的资源管理器,点击打开文件夹,创建一个``.cpp``文件,里面代码可以是
|
||||
```
|
||||
```bash
|
||||
#include <iostream>
|
||||
|
||||
int main() {
|
||||
@@ -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 个月 | 通常为 18~30 个月,取决于版本和配置 | IoT Enterprise LTSC 支持周期可达 10~15 年 | 通常为 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)
|
||||
- **虚拟机**: Hyper‑V
|
||||
- **科学上网**: [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 转 vmdk(VMware)
|
||||
```
|
||||
qemu-img convert -f qcow2 -O vmdk input.qcow2 output.vmdk
|
||||
```
|
||||
- qcow2 转 vdi(VirtualBox)
|
||||
```
|
||||
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.**
|
||||
@@ -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 快 10–100 倍。它通过命令行工具如 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
27
flake.lock
generated
Normal 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
21
flake.nix
Normal 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
|
||||
];
|
||||
};
|
||||
});
|
||||
};
|
||||
}
|
||||
8
justfile
8
justfile
@@ -1,10 +1,4 @@
|
||||
#!/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 the si\
|
||||
te with Zola
|
||||
zola build && npx pagefind --site public
|
||||
zola build && pagefind --site public --root-selector body
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
{% macro head(config) %}
|
||||
<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"/>
|
||||
|
||||
<link rel="stylesheet" href="{{ get_url(path="style.css", trailing_slash=false) | safe }}">
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
:root {
|
||||
--accent: rgb(35,176,255);
|
||||
--accent-alpha-70: rgba(35,176,255,.7);
|
||||
--accent-alpha-20: rgba(35,176,255,.2);
|
||||
|
||||
--accent: rgb(50, 200, 255);
|
||||
--accent-alpha-70: rgba(50,200,255,0.7);
|
||||
--accent-alpha-20: rgba(50,200,255,0.35);
|
||||
--background: #1D212C;
|
||||
--color: white;
|
||||
--color: #E0E6F0;
|
||||
--border-color: rgba(255, 255, 255, .1);
|
||||
}
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -10,6 +10,7 @@
|
||||
src: url('fonts/hack-regular.woff2?sha=3114f1256') format('woff2'), url('fonts/hack-regular.woff?sha=3114f1256') format('woff');
|
||||
font-weight: 400;
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
}
|
||||
|
||||
@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');
|
||||
font-weight: 700;
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
}
|
||||
|
||||
@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');
|
||||
font-weight: 400;
|
||||
font-style: italic;
|
||||
font-display: swap;
|
||||
}
|
||||
|
||||
@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');
|
||||
font-weight: 700;
|
||||
font-style: italic;
|
||||
font-display: swap;
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
src: url('fonts/hack-regular.woff2?sha=3114f1256') format('woff2'), url('fonts/hack-regular.woff?sha=3114f1256') format('woff');
|
||||
font-weight: 400;
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
}
|
||||
|
||||
@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');
|
||||
font-weight: 700;
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
}
|
||||
|
||||
@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');
|
||||
font-weight: 400;
|
||||
font-style: italic;
|
||||
font-display: swap;
|
||||
}
|
||||
|
||||
@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');
|
||||
font-weight: 700;
|
||||
font-style: italic;
|
||||
font-display: swap;
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
.footer {
|
||||
padding: 40px 0;
|
||||
flex-grow: 0;
|
||||
opacity: .5;
|
||||
opacity: .8;
|
||||
|
||||
&__inner {
|
||||
display: flex;
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
%tags {
|
||||
margin-bottom: 20px;
|
||||
font-size: 1rem;
|
||||
opacity: .5;
|
||||
opacity: .9;
|
||||
}
|
||||
|
||||
&-tags {
|
||||
|
||||
@@ -1,2 +1,5 @@
|
||||
$phone-max-width: 683px;
|
||||
$tablet-max-width: 899px;
|
||||
|
||||
// 字体回退栈
|
||||
$font-family: 'Hack', 'SF Mono', 'Monaco', 'Inconsolata', 'Consolas', 'Courier New', monospace;
|
||||
|
||||
BIN
static/images/aria2-rpc.webp
Normal file
BIN
static/images/aria2-rpc.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 73 KiB |
BIN
static/images/electerm.png
Normal file
BIN
static/images/electerm.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 174 KiB |
BIN
static/images/iperf3-udp.webp
Normal file
BIN
static/images/iperf3-udp.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 195 KiB |
BIN
static/images/iperf3.webp
Normal file
BIN
static/images/iperf3.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 174 KiB |
BIN
static/images/ping.webp
Normal file
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
BIN
static/images/s905-atv.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 727 KiB |
@@ -6,7 +6,7 @@
|
||||
<xsl:template match="/">
|
||||
<html>
|
||||
<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" />
|
||||
<title><xsl:value-of select="/atom:feed/atom:title"/></title>
|
||||
<link rel="stylesheet" href="/css/water.min.css" />
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
({{ term.pages | length }} post{{ term.pages | length | pluralize }})
|
||||
</h1>
|
||||
|
||||
<a href="{{ config.base_url | safe }}/tags">
|
||||
<a href="{{ config.base_url | safe }}/tags/">
|
||||
Show all tags
|
||||
</a>
|
||||
|
||||
|
||||
@@ -18,16 +18,17 @@
|
||||
{%- 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 }}" />
|
||||
{%- endif %}
|
||||
|
||||
{%- 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 }}" />
|
||||
{%- endif %}
|
||||
{%- endfor %}
|
||||
{% endif -%}
|
||||
|
||||
{# Favicon #}
|
||||
{% if config.extra.favicon %}
|
||||
<link rel="icon" type="image/png" href={{ config.extra.favicon }} />
|
||||
{% endif %}
|
||||
{%- endfor %}
|
||||
{%- 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 %}
|
||||
{% endblock extra_head -%}
|
||||
|
||||
@@ -2,8 +2,13 @@
|
||||
|
||||
{% macro head(config) %}
|
||||
<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"/>
|
||||
<!-- 字体预加载 - 减少布局偏移 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 }}">
|
||||
|
||||
|
||||
@@ -5,9 +5,10 @@
|
||||
{%- endblock -%}
|
||||
|
||||
{% block content %}
|
||||
<div class="post">
|
||||
<div class="post" data-pagefind-body>
|
||||
{{ post_macros::header(page=page) }}
|
||||
{{ post_macros::content(page=page, summary=false, show_only_description=false) }}
|
||||
{{ post_macros::earlier_later(page=page) }}
|
||||
</div>
|
||||
{% endblock content %}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user