Skip to content

Commit 880f137

Browse files
committed
update
1 parent b21dc29 commit 880f137

26 files changed

+575
-16
lines changed

docker/macvlan.md

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# docker macvlan
2+
3+
## 使用场景
4+
5+
给容器分配局域网 IP 和独立 Mac 地址。
6+
7+
## 前置要求
8+
9+
1. `sudo modprobe macvlan` 开启 macvlan 内核模块。
10+
2. 物理网卡支持 macvlan。
11+
3. 物理网卡开启混杂模式。
12+
13+
## 注意
14+
15+
1. podman、nerdctl、docker 在 rootless 模式下都不支持 macvlan。
16+
2. nerdctl 的 macvlan 子网不支持跟宿主机的网段有重合。就没法获取宿主机的局域网 IP。docker 可以。
17+
18+
## mac_address
19+
20+
mac_address 的地址不能随意填。需要匹配物理网卡的 mac 地址的前缀。
21+
22+
## 排查问题
23+
24+
可以自己手动创建 macvlan 来排查问题。`sudo ip link add link eth0 name macvlan0 type macvlan mode bridge`
25+
如果显示 `Unknown device type.` 那就是内核模块没开启。

docker/networks-in-rootless-docker.md

+7-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# rootless docker
1+
# rootless docker 网络
22

33
<!-- MarkdownTOC GFM -->
44

@@ -7,6 +7,7 @@
77
- [rootlesskit --net=vpnkit](#rootlesskit---netvpnkit)
88
- [源码分析](#源码分析)
99
- [rootlesskit --net=slirp4netns](#rootlesskit---netslirp4netns)
10+
- [CNI](#cni)
1011

1112
<!-- /MarkdownTOC -->
1213

@@ -151,3 +152,8 @@ nameserver 10.0.2.3
151152

152153
这里的网关 10.0.2.2 指向的是什么?其实它是宿主机的 IP。[slirp4netns 的 vhost 默认配置](https://github.com/rootless-containers/slirp4netns/blob/462be177a5282a7dc76b2308a55b745ef9d50d2d/slirp4netns.1.md#description)
153154
子命名空间通过这个 IP 将网络包发给宿主机。
155+
156+
## CNI
157+
158+
rootless 模式,CNI conflist 存储在 `~/.config/cni/net.d/*.conflist`
159+
root 模式,CNI conflist 存储在 `/etc/cni/net.d/*.conflist`

docker/volume-in-non-root-rootless.md

+9-2
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,17 @@ touch: ./abc/d: Permission denied
6666
在目标容器启动之前,先用其他镜像挂载 volume,把文件放进去,用 `chown` 修改文件权限。然后把这个 volume 挂到目标容器里。
6767
具体执行代码参考下面。
6868
69-
```
69+
```sh
7070
# docker 可以换成 nerdctl, podman
7171
docker volume create vol
72-
docker run --rm -v vol:/data alpine:3 sh -c 'mkdir /data/abc && chown 1000:1000 /data/abc'
72+
docker run --rm -v vol:/data alpine sh -c 'mkdir /data/abc && chown 1000:1000 /data/abc'
73+
```
74+
75+
或者,可以复制宿主机的文件到容器的 volume 里。
76+
77+
```sh
78+
docker run --name temp --rm -d -v vol:/data alpine sleep 30
79+
docker cp ./config.yaml temp:/data/
7380
```
7481

7582
可以进到容器看看 volume 里的文件,`docker run --rm -it -v vol:/data alpine:3`

go/cgo-build-for-android.md

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# go 交叉编译安卓程序
2+
3+
首先需要安装 [NDK](https://developer.android.com/ndk/downloads)。可以直接从官网下载,也可以用 homebrew 安装。
4+
5+
如果从官网下载,Mac 平台的是 dmg 安装包。打开后会有两个文件,AndroidNDK9519653.app 和 source.properties。把前者放到 /Applications 目录下,后者没什么用,就记录了版本信息。
6+
7+
go build 需要加上环境变量 `CGO_ENABLED=1 CC=/Applications/AndroidNDK9519653.app/Contents/NDK/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android33-clang CXX=/Applications/AndroidNDK9519653.app/Contents/NDK/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android33-clang++ GOOS=android GOARCH=arm64`
8+
9+
CC 是用来编译 C 的,CXX 编译 C++。具体查阅 `go help environment`
10+
11+
## _cgo_export.c:3:10: fatal error: 'stdlib.h' file not found
12+
13+
如果用的是 `toolchains/llvm/prebuilt/darwin-x86_64/bin/clang` 可能会碰到这个错。试试 `toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android33-clang`

go/gopls.md

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# gopls
2+
3+
gopls 在跨平台开发时,会有点问题。比如当我在 MacOS 电脑进行开发,gopls 就会省略 `//go:build linux` 的文件。当我期望是能包括这些文件内容的。
4+
5+
解决方法是增加环境变量 `GOFLAGS=-tags=windows,linux,darwin,test,unittest`。这里的 tags 根据你的实际需要填写。
6+
具体看 `go help build``go help buildconstraint`
7+
8+
不同的编辑器设置方法不一样,详见 https://github.com/golang/go/issues/29202 里的讨论。
9+
10+
## lspconfig.nvim
11+
12+
```sh
13+
lspconfig.gopls.setup {
14+
settings = {
15+
gopls = {
16+
env = {
17+
GOFLAGS = "-tags=windows,linux,darwin,test,unittest"
18+
}
19+
}
20+
}
21+
}
22+
```

hardware/netgear-R6900-asuswrt-merlin.md

+7-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
## 网件 R6900 刷梅林固件
1+
# 网件 R6900 刷梅林固件
22

33
网件 R6900 与 R7000 硬件配置一样,只是少一个 USB 接口的差别。以下都用 R7000 统称。
44

@@ -14,3 +14,9 @@
1414
(以 386.3_2 版本为例)`R7000_386.3_2.chk` 用于从网件固件刷到梅林固件。`R7000_386.3_2.trx` 用于从梅林固件刷到这个版本的梅林固件。根据当前路由器选择对应的固件就行。
1515

1616
**需要注意的一点**:装完固件后,登录管理界面,查看「系统管理-系统设置-Persistent JFFS2 partition」有两个选项,`Format JFFS partition at next boot``Enable JFFS custom scripts and configs` 都选****。然后重启系统,可能需要 5~10 分钟,耐心等待,切勿断电和手动重启,直到完成。重新连上后再检查 `Format JFFS partition at next boot`****。刷固件就顺利完成了。
17+
18+
## mount invalid argument
19+
20+
挂载 U 盘发现总是 invalid argument。格式化后重刷文件系统可以挂载上,但是重现拔插 U 盘后又是同样的问题。
21+
22+
经过各种尝试,我的结论是它不支持 ext4 文件系统。U 盘得刷成 ext3 才可以正常使用。

k8s/kubespray.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -311,4 +311,4 @@ quay.azk8s.cn/coreos/flannel-cni v0.3.0
311311

312312
kubespray 默认给 nodelocaldns 设置的 ip 是 `169.254.25.10`。这可能有坑。
313313
因为 `169.254.0.0/16` 一般是设备从 DHCP 分配 IP 失败或者没有 DHCP 服务器时,就会随机在这个 B 类地址段获取一个地址。
314-
详见 [RFC3927](https://www.rfc-editor.org/rfc/rfc3927)
314+
详见 [169.254.0.0/16](../network/private-ip.md#1692540016)

linux/adduser-and-useradd.md

+11
Original file line numberDiff line numberDiff line change
@@ -1 +1,12 @@
11
# adduser 与 useradd
2+
3+
`useradd``adduser` 命令的一些关键区别:
4+
5+
| 特性 | useradd | adduser |
6+
|:---------|:--------------------------|:--------------------------------------------|
7+
| 通用性 | 在所有 Linux 发行版上可用 | 仅在某些发行版上可用,例如 Debian 和 Ubuntu |
8+
| 可用选项 | 提供更多选项 | 提供较少的选项 |
9+
| 易用性 | 更复杂 | 更简单 |
10+
| 兼容性 | 更兼容 | 不那么兼容 |
11+
12+
如果您需要创建用户并能够自定义用户帐户的设置,那么 `useradd` 是更好的选择。但是,如果您需要创建用户并只需要简单的命令,那么 `adduser` 是更好的选择。

linux/busybox.md

+9
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,12 @@ BusyBox 考虑到了尺寸优化和有限的资源。它非常模块化,所以
1616
于是可以很容易地定制你的嵌入式系统。只需在 /dev 中添加一些设备节点,在 /etc 中添加一些配置文件,再加入一个 Linux 内核。
1717

1818
注意: **BusyBox 使用 GPL v2 协议开源**。如果不想开源,可以使用 [toybox](https://landley.net/toybox/),MIT 协议。
19+
20+
## shell
21+
22+
```
23+
/busybox/sh -> busybox
24+
/busybox/ash -> busybox
25+
```
26+
27+
ash 支持登录后自动按顺序执行 /etc/profile 和 ~/.profile 文件里的内容。

linux/device-mapper.md

+9
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,15 @@ Device Mapper 是 Linux 内核提供的一种从逻辑设备到物理设备的
1111
- `udevadm info -a -n /dev/xxx`
1212
- `udevadm monitor` 监听设备变化
1313

14+
## /etc/udev/rules.d/*.rules
15+
16+
根据获取的设备信息,编写 udev 规则。规则通常保存在 /etc/udev/rules.d 目录下的文件中。这些文件的名称应该是以两位数字开头,后接描述规则的文本,扩展名为 .rules。数字表示规则的优先级,数字越低,优先级越高。
17+
18+
```sh
19+
sudo udevadm control --reload
20+
sudo udevadm trigger
21+
```
22+
1423
## 命令
1524

1625
- dmsetup

linux/find-dev-tty-for-serial-usb.md

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
# 查找 USB 串口设备对应的是哪个 /dev tty 文件
2+
3+
有两种方法。
4+
5+
## 方法一
6+
7+
串口设备会在 `/dev/serial/` 目录下生成一个软链接列表。可以在 /dev/serial/ 目录下的 by-path/ 或 by-id/ 或 by-label/ 或 by-uuid/ 子目录里找到对应的 tty 文件。
8+
9+
比如我有一个 zigbee router USB dongle。
10+
11+
```sh
12+
$ ls -l /dev/serial/by-path/platform-xhci-hcd.3.auto-usb-0\:2\:1.0
13+
lrwxrwxrwx 1 root root 13 7月 13 00:00 /dev/serial/by-path/platform-xhci-hcd.3.auto-usb-0:2:1.0 -> ../../ttyACM0
14+
$ ls -l /dev/serial/by-id/usb-1a86_USB_Single_Serial_550D016719-if00
15+
lrwxrwxrwx 1 root root 13 7月 13 00:00 /dev/serial/by-id/usb-1a86_USB_Single_Serial_550D016719-if00 -> ../../ttyACM0
16+
```
17+
18+
所以它对应的是 `/dev/ttyACM0`
19+
20+
## 方法二
21+
22+
先通过 `lsusb` 列出 usb 设备列表。
23+
24+
```sh
25+
$ lsusb
26+
Bus 001 Device 003: ID 1a86:55d4 QinHeng Electronics USB Single Serial
27+
Bus 001 Device 002: ID 0bda:0179 Realtek Semiconductor Corp. RTL8188ETV Wireless LAN 802.11n Network Adapter
28+
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
29+
```
30+
31+
再通过 `dmesg` 查找内核消息。
32+
33+
```
34+
[ 4.783976] usb 1-2: new full-speed USB device number 3 using xhci-hcd
35+
[ 4.798624] mmc0: new high speed SDIO card at address 0001
36+
[ 4.937059] usb 1-2: New USB device found, idVendor=1a86, idProduct=55d4, bcdDevice= 4.44
37+
[ 4.944033] usb 1-2: New USB device strings: Mfr=0, Product=2, SerialNumber=3
38+
[ 4.951137] usb 1-2: Product: USB Single Serial
39+
[ 4.955577] usb 1-2: SerialNumber: 550D016719
40+
...
41+
[ 11.760637] cdc_acm 1-2:1.0: ttyACM0: USB ACM device
42+
```
43+
44+
`cdc_acm` 是一个 Linux 内核模块,通常用于支持通过 USB 端口进行串行通信。它是 "Communication Device Class (CDC) Abstract Control Model (ACM)" 的缩写。
45+
46+
- Communications Device Class (CDC): 这是 USB 规范的一部分,定义了如何在通用串行总线(USB)上通信的设备应该如何工作。
47+
- Abstract Control Model (ACM): 这是 CDC 规范中的一部分,它定义了一种通用模型,使得在 USB 设备和主机之间进行串行通信成为可能。这包括像调制解调器或网络设备这样的设备。

linux/network-manage-tools.md

+36
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,39 @@
1616
NetworkManager 配置: `/etc/NetworkManager/NetworkManager.conf`
1717

1818
连接配置信息: `/etc/NetworkManager/system-connections/*.nmconnection`。如果手动修改 .nmconnectio 文件,需要执行 `nmcli connection reload` 来生效。
19+
20+
### 连接 wifi
21+
22+
- `nmcli d wifi list` 搜索 wifi 信号
23+
- `nmcli -a d wifi connect $SSID` 连接 wifi。`-a` 参数指示询问密码。
24+
- `nmcli c` 查看当前已保存的链接信息。
25+
26+
### 创建 connection
27+
28+
```sh
29+
# 创建以太网 connection,监听 eth0 网卡。connection 名字为 Wired。
30+
# 配置默认会保存到文件 /etc/NetworkManager/system-connections/Wired.nmconnection
31+
sudo nmcli c add type ethernet ifname eth0 con-name Wired
32+
# 设置静态 IP
33+
sudo nmcli c mod Wired ipv4.method manual ipv4.addresses 192.168.139.130/24 ipv4.gateway 192.168.139.2 ipv4.dns 192.168.139.2
34+
```
35+
36+
### 监听状态
37+
38+
`nmcli monitor` 相当于 `nmcli d monitor` + `nmcli c monitor`
39+
40+
### 如果有多个 connection 监听同一个网卡设备
41+
42+
假设你有两个连接 eth0-home 和 eth0-office 监听同一个网卡 eth0。可以通过 `connection.autoconnect-priority` 设置它们的优先级。
43+
数字越大,优先级越高。
44+
45+
```sh
46+
# 设置 'eth0-home' 的优先级为10
47+
sudo nmcli c mod eth0-home connection.autoconnect-priority 10
48+
# 设置 'eth0-office' 的优先级为1
49+
sudo nmcli c mod eth0-office connection.autoconnect-priority 1
50+
```
51+
52+
查看 autoconnect-priority 的值:`sudo nmcli con show $connection | grep autoconnect-priority`
53+
54+
connection 有重试机制,设置 `sudo nmcli c mod eth0-home connection.autoconnect-retries 1` 取消重试,如果失败则直接尝试下一个 connection。如果 `connection.autoconnect-retries=1`,则会永远重试下去。

linux/pam.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
1-
## PAM
1+
# PAM
22

33
插入式验证模块 (PAM, Pluggable Authentication Module) 是 Linux 系统级用户认证框架。
44

55
`/etc/pam.d/` 目录专门用于存放 PAM 配置。不同的安装包的配置文件都被放在该目录,在运行时被不同的应用程序加载。
66

77
`/etc/security` 包含了对认证方法参数的系统级配置。
88

9-
passwd、SSH 等程序都会用到 PAM。
9+
passwd、SSH、FTP 等程序都会用到 PAM。
1010

11-
### PAM 模块
11+
## PAM 模块
1212

1313
- pam_unix.so
1414
- pam_wheel.so 限制用户登录

linux/ssh.md

+17
Original file line numberDiff line numberDiff line change
@@ -94,3 +94,20 @@ ctl_cmd 取值:
9494
- `cancel` cancel forwardings
9595
- `exit` request the master to exit
9696
- `stop` request the master to stop accepting further multiplexing requests
97+
98+
## ssh 失败: Too many authentication failures
99+
100+
解决方法:`ssh -o IdentitiesOnly=yes $host`
101+
102+
`-o IdentitiesOnly=yes` 的作用是在尝试进行身份验证时,只使用在配置文件中指明的私钥。也就是说,ssh 客户端将不会尝试使用例如 ssh-agent 或者默认私钥这样的其他可能合法的公钥身份。
103+
104+
为什么要这么做?因为 ssh 客户端默认会用所有可用的私钥尝试登录,直到用完所有的私钥或者成功登录为止。
105+
而如果 ssh 服务端设置了最大重试次数,那么当你有很多私钥,ssh 服务端可能会在你找到正确的私钥之前因为太多失败的尝试而阻止你的 IP 地址。
106+
因此,通过使用 `-o IdentitiesOnly=yes` 选项,并在你的 SSH 命令或配置文件中指定一个密钥文件,你可以确保 SSH 只使用一个特定的私钥来尝试身份验证。
107+
108+
另外,推荐在 ~/.ssh/config 配置加上这个当作默认选项。
109+
110+
```
111+
Host *
112+
IdentitiesOnly=yes
113+
```

linux/systemd/systemd.md

+5-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,11 @@ systemctl 命令操作 systemd 来管理服务,取代了 systemV 的service、
5858

5959
## 编辑 unit 配置
6060

61-
`systemctl edit <unit>` 会创建 `<unit>.service.d/override.conf` 文件。并不会修改原本的 `<unit>.service` 文件。
61+
通过包管理器安装的服务,不建议直接修改包中的文件。因为当用包管理器更新服务版本。有可能会覆盖 unit 配置。
62+
63+
正确的做法是使用 `systemctl edit <unit>` 命令。它会创建 `<unit>.service.d/override.conf` 文件。并不会修改原本的 `<unit>.service` 文件。用户在 override.conf 填入的配置,会和 `<unit>.service` 的配置合并。
64+
65+
如果执行 `sudo systemctl edit` 使用了 nano 编辑器。可以 `sudo EDITOR=vim systemctl edit` 来切换成 vim 编辑器。
6266

6367
当修改 unit 配置,尤其是修改了依赖关系。必须执行 `systemctl daemon-reload` 来更新。
6468

linux/user-login-and-passwd.md

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# 用户登录与 passwd
2+
3+
`/etc/passwd` 显示某个用户 `/sbin/nologin` 或者 `/bin/false`,这个用户就不能登录了。
4+
5+
使用 `usermod -s /bin/bash $user` 或者 `chsh -s /bin/bash $user` 来把 shell 绑定给用户。这样用户就能正常登录了。注意 `/bin/bash` 只是个例子,你要自己确认当前主机支持哪些 shell,以及 shell 程序的真实路径。
6+
7+
如果当前主机没有 `usermod``chsh` 命令,你可以直接编辑 `/etc/passwd` 文件,把 `/sbin/nologin` 改成对应的 shell 就行了。
8+
9+
比如在 docker 容器中,你看 `/etc/passwd` 会发现都是 `root:x:0:0:root:/root:/sbin/nologin`。那为什么我还能用 `docker exec` 登录到容器?因为 docker exec 实际上没有登录用户,只是运行了一个进程罢了。
10+
11+
## passwd 命令
12+
13+
- `passwd -d $user` 用户密码重置为空。
14+
- `passwd -l $user` 锁定用户,禁止它登录。
15+
- `passwd -u $user` 解锁用户。
16+
- `passwd --status $user` 查看用户状态。这个参数不是每个 passwd 程序都支持。
17+
- `touch /etc/nologin`,除 root 以外的用户就不能登录了。

mac/remove-allow-in-background.md

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# Mac 删除允许在后台运行的设置
2+
3+
在这两个目录里删除对应的文件
4+
5+
- /Library/LaunchDaemons/
6+
- /Library/LaunchAgents/
7+
8+
有些特权软件安装在 /Library/PrivilegedHelperTools/ 目录下,自己判断要不要删除。

mac/weixin-backup-failed.md

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# Mac 微信备份显示不在同一网络
2+
3+
在 Mac 微信上备份手机的消息,当连接网络时会报错,Mac 电脑和手机不在同一 Wi-Fi 网络下。
4+
Mac 微信显示的网络连接是主机名,明显不对。
5+
6+
我尝试了[微信开放社区提供的方法](https://developers.weixin.qq.com/community/develop/doc/000cccdfccc4882747cbb4ad056800),都不行。
7+

network/network-storm.md

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# 网络风暴 (Network Storm)
2+
3+
网络风暴是指在计算机网络中由于某些原因导致的网络通信过载。以下是几种常见的网络风暴类型:
4+
5+
1. **广播风暴(Broadcast Storm)**:当网络中的设备发送大量广播消息时,这些消息会占用大量网络带宽,并可能导致其他设备处理这些广播消息时出现性能问题。
6+
7+
2. **多播风暴(Multicast Storm)**:当网络中的设备发送大量多播消息时,这些消息同样会占用大量的网络带宽,并可能导致其他设备处理这些多播消息时出现性能问题。
8+
9+
3. **单播风暴(Unicast Storm)**:当网络中的一台设备向另一台设备发送大量的单播消息时,这些消息会占用大量的网络带宽,并可能对接收设备造成压力。
10+
11+
4. **ARP风暴(ARP Storm)**:当网络中的设备发送大量ARP(地址解析协议)请求时,这也会占用大量的网络带宽,并可能扰乱正常的网络通信。
12+
13+
5. **ICMP风暴(ICMP Storm)**:当网络中的设备发送大量的ICMP(互联网控制消息协议)消息时,这将会吸引大量的网络带宽,并可能导致网络拥塞。
14+
15+
以上就是几种常见的网络风暴类型,防止或者制止网络风暴的产生是网络管理的重要工作之一。
16+
17+
## 排查方法
18+
19+
使用 tcpdump。
20+
以下假设外部流量经过 eth0 网卡。
21+
22+
- 排查 ARP 风暴 `sudo tcpdump -vpn -i eth0 arp`
23+
- 排查 ICMP 风暴 `sudo tcpdump -vpn -i eth0 icmp`

0 commit comments

Comments
 (0)