Linux 网络管理:Netplan 配置文件与网络管理器

要确认系统当前使用的是 networkd(systemd-networkd)还是 NetworkManager 作为网络渲染器(renderer),可以通过以下方法检查: 方法 1:查看 Netplan 配置文件 Netplan 的配置文件(通常在 /etc/netplan/ 目录下)中会明确指定 renderer 字段。例如: cat /etc/netplan/*.yaml 如果显示 renderer: networkd → 使用 systemd-networkd。 如果显示 renderer: NetworkManager → 使用 NetworkManager。 如果未指定 renderer,默认根据系统类型选择: Ubuntu Server:默认 networkd。 Ubuntu Desktop:默认 NetworkManager。 方法 2:检查活跃的网络管理服务 运行以下命令查看哪个服务正在管理网络: systemctl status systemd-networkd NetworkManager --no-pager 结果解读: systemd-networkd 活跃: 会显示 active (running),且可能标注为 enabled(开机自启)。 对应的日志会显示接口管理记录。 ● systemd-networkd.service - Network Service Loaded: loaded (/lib/systemd/system/systemd-networkd.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2024-02-01 12:00:00 UTC; 1h ago NetworkManager 活跃: ...

February 1, 2024 · 2 min · 245 words

Linux脚本监控

#!/usr/bin/env bash set -eo pipefail # 启用严格错误检查 # ---------------------------------- # 全局配置 (提升可维护性) # ---------------------------------- ```bash #!/usr/bin/env bash set -eo pipefail # 启用严格错误检查 # ---------------------------------- # 全局配置 (提升可维护性) # ---------------------------------- ANALYSIS_DIR="/home/username/analysis" # 统一管理路径 S3_DB_PATH="s3.db" LOG_DIR="log" TMP_DB="db.tmp" # 防止直接修改原db文件 LOCK_TIMEOUT=10 # 文件锁超时秒数 # ---------------------------------- # 功能函数 # ---------------------------------- # 初始化环境 (规范命名) init_environment() { WORK_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) cd "${WORK_DIR}" || exit 1 } # 原子化更新数据库 (添加文件锁) update_task_db() { local batch_id db_path="${1:-db}" [[ -f "${db_path}" ]] || touch "${db_path}" # 使用 pgrep 精准获取进程信息 while read -r batch_id; do if ! grep -q "^${LOG_DIR}/${batch_id}.log" "${db_path}"; then echo "${LOG_DIR}/${batch_id}.log" >> "${TMP_DB}" fi done < <(pgrep -f "run_batch_analysis.*todo/torun" | xargs -I{} -- ps -p {} -o args= | awk '{print $NF}' | sed 's@.*/@@') # 原子化替换原数据库文件 ( flock -w "${LOCK_TIMEOUT}" 200 || exit 1 mv "${TMP_DB}" "${db_path}" ) 200>"${db_path}.lock" } # 耗时计算兼容性增强 (支持 macOS 和 Linux) calculate_duration() { local start_sec end_sec diff_sec start_sec=$(date -j -f "%Y-%m-%d %H:%M:%S" "$1" "+%s" 2>/dev/null || date -d "$1" "+%s") end_sec=$(date -j -f "%Y-%m-%d %H:%M:%S" "$2" "+%s" 2>/dev/null || date -d "$2" "+%s") diff_sec=$((end_sec - start_sec)) printf "%02d:%02d\n" $((diff_sec/3600)) $(( (diff_sec%3600)/60 )) } # ---------------------------------- # 主监控逻辑重构 # ---------------------------------- main() { init_environment local stages=('split' 'whole-set' 'merge_sample' 'post_sample' 'merge_region' 'post_region' 'publish' 'Done') while :; do update_task_db # 通过文件描述符高效逐行读取 while IFS= read -r -u9 line; do [[ "${line}" =~ ^# || "${line,,}" == *error* ]] && continue log_path="${ANALYSIS_DIR}/${line}" [[ -f "${log_path}" ]] || continue # 使用关联数组存储关键信息 (需 Bash 4+) declare -A log_info=( [key_lines]="$(grep -m1 'All tasks completed' "${log_path}")" [fcid]="$(grep -oE '[^/]*[0-9]+' <<< "${log_path}")" ) # 复杂逻辑拆分函数... process_log_line "${log_path}" "${log_info[@]}" done 9< <(grep -iv -e 'done' -e '^#' "${db}") sleep 30 clear done } # 处理单条日志行 (功能模块化) process_log_line() { local log_path="$1" key_lines="$2" fcid="$3" # 上报逻辑实现... } # ---------------------------------- # 执行入口 # ---------------------------------- main "$@"

July 17, 2023 · 2 min · 291 words

Linux networkctl reload 命令详解

networkctl reload 命令会重新加载 systemd-networkd 的所有配置文件,具体路径和加载逻辑如下: 1. 配置文件的默认路径 systemd-networkd 从以下目录按优先级加载配置: (1)主配置文件目录 /etc/systemd/network/ 用户自定义配置(优先级最高,覆盖其他目录)。 /run/systemd/network/ 临时运行时配置(重启后丢失)。 /usr/lib/systemd/network/ 系统默认配置(优先级最低)。 (2)配置文件类型 .network:定义接口的网络参数(IP、路由、DNS 等)。 示例:/etc/systemd/network/10-static-eth0.network .link:物理/虚拟设备属性(MAC 地址、MTU 等)。 示例:/usr/lib/systemd/network/99-default.link .netdev:创建虚拟设备(如 VLAN、VPN)。 示例:/etc/systemd/network/20-vlan.netdev 2. reload 的具体行为 当执行 networkctl reload 时: 重新加载所有 .network、.link、.netdev 文件(包括上述三个目录中的配置)。 动态应用新配置(无需重启服务或接口): 如果接口的配置文件被修改,会根据新配置重新生效。 如果删除了某个配置文件,相关接口会恢复为 unmanaged 状态。 日志记录: 通过 journalctl -u systemd-networkd 可查看重载过程中的错误或警告。 3. 验证配置文件的路径 方法 1:通过 networkctl status 查看 sudo networkctl status eth0 | grep "Network File" 输出示例: Network File: /etc/systemd/network/10-static-eth0.network 方法 2:列出所有活动配置 sudo networkctl list | grep -i configured 输出中会显示哪些接口已被配置,并说明它们由哪个文件管理。 ...

July 12, 2023 · 1 min · 133 words

Linux 中的 networkctl 命令

networkctl 是一个用于管理和监控网络接口和连接状态的命令行工具,它是 systemd-networkd 服务的一部分。systemd-networkd 是一个网络管理工具,用于配置和管理网络接口,而 networkctl 提供了查看和管理这些接口的命令行接口。 1. 安装 networkctl 是 systemd-networkd 提供的命令行工具,用于管理和监控由 systemd-networkd 管理的网络接口和连接状态。它提供了接口状态查看、配置重载、连接控制等功能,适合在基于 systemd 的 Linux 发行版(如 Ubuntu Server、Debian、Fedora 等)中使用。 1. 基本命令 (1)列出所有网络接口 networkctl list 输出示例: IDX LINK TYPE OPERATIONAL SETUP 1 lo loopback carrier unmanaged 2 eth0 ether routable configured 3 wlan0 wlan no-carrier configuring IDX:接口索引号。 LINK:接口名称(如 eth0、wlan0)。 TYPE:接口类型(ethernet、wlan、loopback 等)。 OPERATIONAL:当前操作状态: routable:已配置并可路由(正常工作)。 no-carrier:无物理连接。 degraded:部分功能不可用(如 DHCP 失败)。 off/unmanaged:未管理。 SETUP:配置状态: configured:已通过 networkd 配置。 unmanaged:不由 networkd 管理。 configuring:正在配置(如 DHCP 获取中)。 (2)查看单个接口的详细信息 networkctl status eth0 输出示例: ...

July 10, 2023 · 2 min · 272 words

Linux 命令行:`flock` 文件锁

一、flock 基础命令格式 flock [选项] <文件|文件描述符> <命令> # 或 flock [选项] <文件|文件描述符> -c <命令字符串> 二、核心选项及示例说明 1. -s (共享锁 Shared Lock) 作用 获取共享锁(读锁),允许多进程同时读取,但阻止排他锁。 场景 需要多个进程同时读取某个文件,但要求写入操作互斥。 示例 # 两个终端同时运行此命令不会阻塞 flock -s data.lock -c "cat data.txt; sleep 5" 2. -x (排他锁 Exclusive Lock ) 作用 获取排他锁(写锁),禁止其他进程获取任何类型的锁。 场景 需要对文件进行写入操作时,保证数据一致性。 示例 # 第二个进程会阻塞直到第一个完成 flock -x log.lock -c "echo 'New log entry' >> app.log; sleep 3" 3. -n (非阻塞 Non-blocking) 作用 非阻塞模式。若无法立即获取锁,立即失败并退出,不会等待。 场景 快速判断资源是否可用,无需等待。 示例 if flock -n 200; then echo "Got lock, doing work..." sleep 2 else echo "Resource busy, exiting." fi 200>data.lock 4. -w <秒数> (超时等待 Timeout) 作用 指定等待锁的超时时间。超过设定时间仍无法获取锁则放弃。 ...

July 3, 2023 · 2 min · 308 words

Linux 网络配置:Netplan

以下是使用 Netplan 将 eth0 和 eth1 配置为静态 IP 地址的详细步骤(假设你的系统为 Ubuntu/Debian,使用 Netplan 作为网络管理工具): 1. 确认当前 Netplan 配置文件 通常 Netplan 的配置文件位于 /etc/netplan/ 目录下,文件名可能为: 00-installer-config.yaml (Ubuntu Server 安装时生成) 01-netcfg.yaml 或其他以 .yaml 结尾的文件。 查看现有配置: ls /etc/netplan/ 2. 编辑 Netplan 配置文件 使用文本编辑器(如 nano)修改配置文件: sudo nano /etc/netplan/00-installer-config.yaml 静态 IP 配置示例 将以下内容粘贴到文件中(注意 缩进必须使用空格,不能使用 Tab): network: version: 2 renderer: networkd # 或 networkd(Ubuntu Server 默认) ethernets: eth0: addresses: - 192.168.1.8/24 routes: - to: default via: 192.168.1.1 # 替换为你的网关地址 nameservers: addresses: [8.8.8.8, 1.1.1.1] # DNS 服务器 eth1: addresses: - 192.168.10.4/24 # 如果 eth1 不需要默认网关,则省略 routes 部分 关键参数说明 参数 作用 addresses 指定静态 IP 和子网掩码(如 192.168.1.8/24)。 routes 默认路由(网关),via 后填你的路由器 IP(如 192.168.1.1)。 nameservers DNS 服务器列表(如 [8.8.8.8, 1.1.1.1])。 renderer networkd(Server 版常用)或 NetworkManager(桌面版常用)。 3. 应用配置 保存文件后(Ctrl+O → 回车 → Ctrl+X),执行以下命令使配置生效: ...

June 19, 2023 · 1 min · 210 words

深入解析 Linux 中的 TTY 设备文件

深入解析 Linux 中的 TTY 设备文件:配置与调试技巧 对于资深管理员,/dev 目录下的 TTY 设备文件不仅是终端交互的核心,更是系统调试和管理的利器。以下将深入解析这些设备文件,并结合实际配置和调试技巧,帮助你在复杂环境中高效解决问题。 1. /dev/tty 核心概念:当前进程的控制终端(Controlling Terminal)。 技术细节: 它是一个虚拟设备,指向当前进程关联的终端。 对于交互式 Shell,/dev/tty 指向用户正在使用的终端。 对于后台任务,/dev/tty 可能无效。 典型用途: 将输出定向到当前终端:echo "Hello" > /dev/tty。 在脚本中判断是否运行在终端环境:[ -t 0 ]。 配置与调试技巧: 使用 stty 动态调整终端设置:stty -a 查看当前设置,stty sane 恢复默认设置。 在多任务环境中,通过 /dev/tty 确保输出不会被重定向。 2. /dev/tty0 核心概念:当前活动的虚拟控制台(Virtual Console)。 技术细节: 指向当前正在使用的虚拟控制台。 只有 root 用户或具有 CAP_SYS_ADMIN 权限的进程可以写入 /dev/tty0。 典型用途: 在内核调试中,将日志输出到控制台。 在系统启动时,/dev/console 可能被重定向到 /dev/tty0。 配置与调试技巧: 通过内核参数指定默认控制台:console=tty0。 使用 dmesg 查看内核日志时,确保日志输出到正确的控制台。 动态切换虚拟控制台:chvt 2(切换到 tty2)。 3. /dev/ttyX(X 为 1 到 63) 核心概念:虚拟终端(Virtual Terminal)设备。 技术细节: 每个 /dev/ttyX 对应一个虚拟终端。 默认启用 6 个虚拟终端(tty1 到 tty6),可扩展到 63 个。 典型用途: 多用户环境中,为每个用户分配独立的虚拟终端。 配置与调试技巧: 配置内核参数调整虚拟终端数量:vga=extended。 使用 openvt 启动程序到指定虚拟终端:openvt -s 3 /bin/bash。 4. /dev/ttySX(串行端口) 核心概念:串行端口终端(Serial Port Terminal)。 技术细节: 每个 /dev/ttySX 对应一个物理串行端口。 典型用途: 连接外部设备(如调制解调器、嵌入式设备)。 配置与调试技巧: 使用 stty 配置波特率:stty -F /dev/ttyS0 115200。 使用 screen 或 minicom 管理串口通信:screen /dev/ttyS0 115200。 配置内核参数将控制台定向到串口:console=ttyS0,115200。 5. /dev/ttyUSBX 和 /dev/ttyACMX 核心概念:USB 串行设备(USB Serial Device)。 技术细节: /dev/ttyUSBX 对应 USB 转串口设备。 /dev/ttyACMX 对应 USB CDC ACM 设备。 典型用途: 连接嵌入式设备进行调试。 配置与调试技巧: 通过 udev 规则为设备分配固定名称: SUBSYSTEM=="tty", ATTRS{idVendor}=="1234", ATTRS{idProduct}=="5678", SYMLINK+="mydevice" 配置权限以允许普通用户访问设备:chmod 666 /dev/ttyUSB0。 6. /dev/pts/* 核心概念:伪终端(Pseudo Terminal)。 技术细节: 每个 /dev/pts/X 对应一个伪终端,由 PTY 子系统管理。 典型用途: 远程访问时,为每个 SSH 会话分配伪终端。 配置与调试技巧: 使用 ptsname 和 grantpt 管理伪终端。 通过 TIOCSTI 或 TIOCLINUX 进行终端注入。 检查伪终端会话:w 或 who。 7. /dev/console 核心概念:系统控制台(System Console)。 技术细节: console 设备指向系统的控制台。 典型用途: 系统启动时查看内核输出。 配置与调试技巧: 配置多控制台:console=tty0 console=ttyS0。 使用 dmesg 动态查看和控制内核日志。 8. /dev/null 核心概念:黑洞设备(Null Device)。 技术细节: 写入 /dev/null 的数据被丢弃,读取时返回 EOF。 典型用途: 丢弃不需要的输出。 配置与调试技巧: 在脚本中丢弃输出:command > /dev/null 2>&1。 手动创建 /dev/null:mknod /dev/null c 1 3。

2 min · 217 words

设置代理

是的,Rustup 可以通过代理服务器进行网络连接,以下是设置方法及注意事项: 一、通过环境变量设置代理 大多数命令行工具(包括 rustup)会自动识别系统代理的环境变量,按需设置以下变量: 通用代理设置 # HTTP 代理 export http_proxy="http://代理服务器IP:端口" export HTTP_PROXY="$http_proxy" # HTTPS 代理 export https_proxy="http://代理服务器IP:端口" # 注意此处协议可能根据代理类型调整 export HTTPS_PROXY="$https_proxy" # 全局代理(部分工具识别) export ALL_PROXY="$http_proxy" 示例 # 假设代理地址为 127.0.0.1:7890 export http_proxy="http://127.0.0.1:7890" export https_proxy="http://127.0.0.1:7890" 二、针对 SOCKS5 代理 若使用 SOCKS5 协议(如 Shadowsocks/V2Ray),需通过工具(如 proxychains)转换或直接支持 SOCKS 的客户端: 方法 1:使用 proxychains (Linux/macOS) # 安装 proxychains sudo apt install proxychains # Debian/Ubuntu brew install proxychains-ng # macOS # 修改配置文件 /etc/proxychains.conf socks5 127.0.0.1 1080 # 按需填写 SOCKS5 代理地址 # 通过 proxychains 运行 rustup proxychains rustup update 方法 2:设置 https_proxy 为 SOCKS 地址(部分工具支持) export https_proxy="socks5://127.0.0.1:1080" 三、Windows 系统设置代理 方法 1:PowerShell 临时环境变量 # 设置环境变量 $env:HTTP_PROXY = "http://127.0.0.1:7890" $env:HTTPS_PROXY = "http://127.0.0.1:7890" # 验证 rustup rustup update 方法 2:通过系统设置全局代理 打开 设置 → 网络和 Internet → 代理。 在 手动代理设置 中填写地址和端口。 重启命令行工具生效。 四、验证代理生效 1. 检查下载速度 运行以下命令观察是否通过代理加速: ...

1 min · 176 words