运维123 - linux
type: channel
link: https://www.sddts.cn/index.php/tag/linux/
items: Linux 安装配置 Rime 输入法指南
items: Linux 字体安装与默认字体配置
items: Mac Pro 垃圾桶安装 Ubuntu 24.04/Kubuntu 24.04 GPU 配置指南
items: Mac Pro 垃圾桶 Kubuntu 24.04 显卡黑屏问题诊断与修复
items: Rime 输入法在 Kubuntu 24.04 上的安装与配置
items: Linux 应用开发基础教程
items: SamWaf开源轻量级网站防火墙介绍
items: eBPF/XDP 构建二层直接服务器返回负载均衡器教程
items: Guix System First Impressions as a Nix User
items: Linux环境变量问题技术分析

Linux 安装配置 Rime 输入法指南
type: item
date: 2026-04-06T07:36:55+00:00
description: Linux 安装配置 Rime 输入法指南一、概述1. 简介A. 是什么Rime（中州韵）是一个开源的中文输入法引擎，支持多种拼音方案、五笔、仓颉等输入方式。它具有高度可定制性，可满足不同用户的输入习惯。B. 为什么选择 Rime开源免费，无广告干扰支持多种输入方案，灵活切换词库可自定义，词频自动学习跨平台支持（Linux、macOS、Windows）C. 安装后能做什么使用拼音输入中文自定义词库和词频切换不同输入方案（如五笔、仓颉）调整输入法外观和行为2. 前置知识A. 必备技能基本命令行操作了解软件包管理器（apt）B. 推荐知识了解输入法框架概念（fcitx vs ibus）了解环境变量配置二、环境准备1. 系统要求Linux 发行版：Ubuntu 20.04+、Debian 10+、或其他基于 Debian 的系统桌面环境：KDE Plasma、GNOME、XFCE 等输入法框架：fcitx5（推荐）或 fcitx2. 检测现有输入法框架检查系统中已安装的输入法框架：which ibus fcitx fcitx5根据输出判断：仅显示 fcitx5：使用 fcitx5 配置仅显示 fcitx：使用 fcitx 配置显示多个：建议选择 fcitx5（现代化、性能更好）无输出：需要先安装输入法框架3. 检测桌面环境echo $XDG_CURRENT_DESKTOP常见输出：KDE：KDE Plasmaubuntu：GNOME（Ubuntu 默认）XFCE：XFCE 桌面三、安装 Rime1. 安装 fcitx5 和 RimeUbuntu/Debian 系统：sudo apt update sudo apt install fcitx5 fcitx5-rime librime-data-luna-pinyin参数说明：fcitx5：输入法框架主程序fcitx5-rime：Rime 输入法引擎的 fcitx5 适配librime-data-luna-pinyin：朙月拼音词库可选词库包：# 五笔 sudo apt install rime-data-wubi # 仓颉 sudo apt install rime-data-cangjie5 # 地球拼音 sudo apt install rime-data-terra-pinyin2. 工作原理graph TB A[用户按键] --> B[fcitx5 框架] B --> C{选择输入法} C -->|Rime| D[Rime 引擎] D --> E[词库匹配] E --> F[候选项生成] F --> G[显示候选框] G --> H[用户选择] H --> I[上屏至应用]3. 验证安装检查 Rime 组件是否安装成功：dpkg -l | grep rime应显示 fcitx5-rime 和相关词库包。四、配置环境变量1. 环境变量的作用输入法框架需要环境变量告知应用程序使用哪个输入法后端。缺少这些变量会导致输入法无法正常工作。2. 创建环境变量文件# 创建配置目录 mkdir -p ~/.config/fcitx5 # 写入环境变量 cat > ~/.config/fcitx5/env.sh << 'EOF' # Input method framework - fcitx5 export GTK_IM_MODULE=fcitx export QT_IM_MODULE=fcitx export XMODIFIERS=@im=fcitx # For Wayland export INPUT_METHOD=fcitx EOF3. 使环境变量生效添加到 shell 配置文件：# bash 用户 echo 'source ~/.config/fcitx5/env.sh' >> ~/.bashrc # zsh 用户 echo 'source ~/.config/fcitx5/env.sh' >> ~/.zshrc立即生效：source ~/.config/fcitx5/env.sh五、启用 Rime 输入法1. 方法一：使用配置工具（推荐）如果已安装配置工具：sudo apt install fcitx5-configtool fcitx5-configtool在配置工具中：点击左下角 + 按钮取消勾选 "Only Show Current Language"搜索 "Rime" 或 "Luna Pinyin"添加并提升到列表顶部2. 方法二：手动配置创建 fcitx5 配置文件：mkdir -p ~/.local/share/fcitx5 cat > ~/.local/share/fcitx5/profile.ini << 'EOF' [Groups/0] Name=Default …

Linux 字体安装与默认字体配置
type: item
date: 2026-03-30T08:30:48+00:00
description: Linux 字体安装与默认字体配置一、概述1. 简介A. 是什么本文介绍在 Linux 系统上安装字体文件，并通过 fontconfig 配置系统默认字体的完整流程。B. 为什么需要Linux 系统默认缺少部分中文字体（如宋体、仿宋等）部分场景需要特定的英文字体（如 Times New Roman）统一字体设置可以提升文档阅读和编辑体验C. 学完能做什么安装用户级别的 TTF/TTC 字体文件更新系统字体缓存配置 fontconfig 设置默认字体2. 前置知识A. 必备技能基本 Linux 命令操作了解目录结构概念B. 推荐知识了解 XML 配置文件格式二、环境准备1. 系统要求Linux 发行版：Ubuntu、Debian、Kubuntu 等已安装 fontconfig 包（默认通常已安装）2. 字体文件中文字体：TTF 或 TTC 格式英文字体：TTF 格式三、核心概念1. 基本术语fontconfig：Linux 系统的字体配置框架fc-cache：字体缓存更新工具fc-list：字体列表查询工具fc-match：字体匹配查询工具2. 字体目录结构graph TD A[字体目录] --> B[用户级别] A --> C[系统级别] B --> D[~/.local/share/fonts] C --> E[/usr/share/fonts] D --> F[chinese] D --> G[english] E --> H[truetype] E --> I[opentype]3. 工作原理fontconfig 通过以下步骤管理字体：扫描字体目录构建字体缓存根据配置文件匹配字体返回最佳匹配结果四、安装步骤1. 创建字体目录mkdir -p ~/.local/share/fonts/chinese mkdir -p ~/.local/share/fonts/english2. 复制字体文件将中文字体复制到 chinese 目录：cp /path/to/simsun.ttc ~/.local/share/fonts/chinese/ cp /path/to/simhei.ttf ~/.local/share/fonts/chinese/ cp /path/to/simfang.ttf ~/.local/share/fonts/chinese/将英文字体复制到 english 目录：cp /path/to/times.ttf ~/.local/share/fonts/english/3. 更新字体缓存fc-cache -fv ~/.local/share/fonts/成功输出示例：/home/lab/.local/share/fonts/chinese: caching, new cache contents: 6 fonts, 0 dirs /home/lab/.local/share/fonts/english: caching, new cache contents: 1 fonts, 0 dirs fc-cache: succeeded五、配置默认字体1. 创建配置文件mkdir -p ~/.config/fontconfig2. 编辑配置文件创建 ~/.config/fontconfig/fonts.conf 文件：<?xml version="1.0"?> <fontconfig> <alias> <family>serif</family> <prefer> <family>Times New Roman</family> </prefer> </alias> <match> <test name="lang"> <string>zh-cn</string> </test> <test name="family"> <string>serif</string> </test> <edit name="family" mode="prepend" binding="strong"> <string>SimSun</string> </edit> </match> </fontconfig>3. 配置说明fontconfig 配置文件结构：graph LR A[fontconfig] --> B[alias 别名] A --> C[match 匹配规则] B --> D[family 字体族] B --> E[prefer 优先级] C --> F[test 条件] C --> G[edit 编辑动作]六、验证安装1. 查看已安装字体# 查看所有中文字体 fc-list :lang=zh-cn # 查看特定字体 fc-list | grep -i "simsun" fc-list | grep -i "times …

Mac Pro 垃圾桶安装 Ubuntu 24.04/Kubuntu 24.04 GPU 配置指南
type: item
date: 2026-03-30T07:42:03+00:00
description: Mac Pro 垃圾桶安装 Ubuntu 24.04/Kubuntu 24.04 GPU 配置指南一、概述1. 简介A. 硬件背景Mac Pro 垃圾桶（Late 2013/2014，代号 MacPro6,1）是苹果设计的经典工作站，配备双 AMD FirePro D500 显卡（基于 Tahiti LE 核心）。这款机器至今仍有不少用户将其改造为 Linux 工作站。B. 为何需要配置Ubuntu 24.04/Kubuntu 24.04 使用较新的内核（6.x 系列），对 AMD 旧架构 GPU 的驱动支持存在一些兼容性问题。默认配置可能导致：偶发性黑屏PCIe 总线错误驱动加载异常C. 配置目标确保双 GPU 正常工作使用稳定的 radeon 驱动优化电源管理以减少错误提供自动化配置脚本2. 前置知识A. 必备技能基本 Linux 命令操作能够使用文本编辑器（nano/vim）了解如何重启系统和进入 GRUB 菜单B. 硬件信息组件规格GPU双 AMD FirePro D500 (Tahiti LE)架构CIK/SI 系列显存3GB GDDR5 × 2二、问题分析1. 驱动选择困境AMD 对旧架构 GPU 有两套驱动：graph TB A[AMD GPU 驱动] --> B[radeon] A --> C[amdgpu] B --> D[传统驱动] B --> E[稳定但功能旧] C --> F[新一代驱动] C --> G[功能完善但支持有限] H[Tahiti 架构] --> I[默认使用 radeon] I --> J[amdgpu 支持不完善]2. 遇到的问题A. amdgpu 驱动尝试失败在 6.17 内核上尝试切换到 amdgpu 驱动时：amdgpu 0000:02:00.0: probe with driver amdgpu failed with error -22错误代码 -22 (EINVAL) 表示驱动初始化参数无效，amdgpu 对 Tahiti 的支持仍处于实验阶段。B. PCIe 总线错误使用 radeon 驱动时，系统日志中可能出现：radeon 0000:06:00.0: PCIe Bus Error: severity=Correctable, type=Data Link Layer这可能导致长期使用后出现黑屏。C. 内核参数冲突GRUB 配置中的参数设置不当可能导致：radeon.cik_support=0 阻止了驱动加载amdgpu 参数与实际硬件不匹配三、解决方案1. 驱动策略经过测试，在 Ubuntu 24.04/Kubuntu 24.04 上：推荐使用 radeon 驱动：稳定且功能完整不推荐 amdgpu：对 Tahiti 支持不完善，可能导致黑屏2. 配置参数说明A. radeon 驱动参数options radeon si_support=1 # 启用 SI 架构支持 options radeon cik_support=1 # 启用 CIK 架构支持 options radeon audio=1 # 启用 HDMI 音频 options radeon dynclks=1 # 动态时钟调节 options radeon rlc_enable=1 # 启用 RLC 固件B. GRUB 内核参数radeon.si_support=1 # 启用 SI 支持 radeon.cik_support=1 # 启用 CIK 支持 intel_iommu=off # 禁用 Intel IOMMU（可能影响 GPU） pci=realloc # PCI 资源重新分配四、自动化配置脚本1. 一键配置脚本将以下脚本保存为 setup-macpro-gpu.sh：#!/bin/bash # Mac Pro 垃圾桶 Ubuntu 24.04/Kubuntu 24.04 GPU 配置脚本 # 适用于双 AMD FirePro D500 (Tahiti LE) set -e SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" BACKUP_DIR="$SCRIPT_DIR/backups-$(date +%Y%m%d-%H%M%S)" LOG_FILE="$SCRIPT_DIR/setup-gpu.log" # 颜色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # 日志函数 log() { echo -e "${GREEN}[$(date '+%Y-%m-%d %H:%M:%S')]${NC} $1" | tee -a "$LOG_FIL…

Mac Pro 垃圾桶 Kubuntu 24.04 显卡黑屏问题诊断与修复
type: item
date: 2026-03-30T06:28:27+00:00
description: Mac Pro 垃圾桶 Kubuntu 24.04 显卡黑屏问题诊断与修复一、事件概述1. 事件背景用户在 Mac Pro 垃圾桶（Late 2013/2014）上安装 Kubuntu 24.04 系统，配备双 AMD FirePro D500 显卡。系统运行基本正常，但偶尔在长时间使用后出现黑屏现象。2. 影响范围A. 影响用户数单用户环境，个人工作站B. 影响时长间歇性发生，无固定时间模式，主要出现在长时间使用后C. 影响功能显示输出中断，需重启系统恢复3. 严重程度P2 级问题（影响用户体验，但可临时恢复）二、事件时间线1. 问题发现（时间：用户报告时）A. 现象描述系统运行正常，偶尔出现黑屏无明显预兆，可能发生在长时间使用后重启后可恢复正常B. 初步检查系统为 Kubuntu 24.04，内核版本 6.17.0-19-generic硬件为双 AMD FirePro D500（Tahiti LE 架构）OpenGL 渲染正常工作2. 系统诊断（时间：诊断阶段）A. 发现途径通过系统性调试流程，收集系统证据B. 诊断过程检查硬件状态：lspci 显示双 GPU 设备正常识别温度传感器显示 51-58°C，温度正常OpenGL 渲染器显示 TAHITI (radeonsi)，工作正常检查驱动状态：两块 GPU 都绑定到 radeon 驱动内核参数设置了 amdgpu.cik_support=1，但未生效amdgpu 模块已加载但引用数为 0（未使用）radeon 模块有 93 个引用（正在使用）检查系统日志：发现频繁的 PCIe Bus Error错误信息：radeon 0000:06:00.0: PCIe Bus Error: severity=Correctable, type=Data Link Layer错误代码：00000040（TLP 错误）3. 根因确认（时间：分析阶段）A. 问题定位虽然内核参数设置了 amdgpu.cik_support=1，但 radeon 模块仍在先加载并接管 GPU 设备。旧的 radeon 驱动对 Tahiti（CIK）架构的 PCIe 处理不如新的 amdgpu 驱动完善，导致频繁的 PCIe 总线错误。这些错误长期累积可能触发黑屏问题。B. 证据链graph LR A[内核参数设置] -->|期望| B[amdgpu 加载] C[radeon 模块] -->|实际| D[先加载并绑定 GPU] D --> E[旧驱动 PCIe 处理不完善] E --> F[频繁 PCIe 错误] F --> G[长期累积导致黑屏]三、问题分析1. 直接原因双 AMD FirePro D500 GPU 使用的是旧的 radeon 驱动，而不是更新的 amdgpu 驱动。2. 根本原因（5 Whys 分析）A. 为什么使用旧驱动？尽管内核参数设置了 amdgpu.cik_support=1，但模块加载顺序导致 radeon 先加载并绑定设备。B. 为什么 radeon 先加载？modprobe 配置中没有明确阻止 radeon 加载，模块在 initramfs 阶段就决定了加载顺序。C. 为什么内核参数未生效？内核参数可以启用 amdgpu 对 CIK 的支持，但不能阻止 radeon 同时加载并抢先绑定设备。D. 为什么会导致黑屏？radeon 驱动对 Tahiti 架构的 PCIe 错误处理不如 amdgpu 完善，频繁的总线错误累积可能导致 GPU 挂起或显示中断。E. 深层反思CIK（Tahiti）架构是 AMD GPU 的旧架构，amdgpu 驱动从 Linux 4.15 开始添加对其支持，但默认行为仍倾向使用 radeon。需要明确配置才能强制使用 amdgpu。3. 技术背景Mac Pro 垃圾桶（2013/2014）配备的 FirePro D500 基于 AMD Tahiti LE 核心（Radeon HD 7870 XT），属于 CIK（Core Islands Kitchen）架构系列。这是 AMD GPU 架构发展中的一个重要节点：radeon 驱动：传统驱动，功能完善但更新缓慢amdgpu 驱动：新一代驱动，更好的电源管理和错误处理四、解决方案1. 临时方案A. 实施措施无需临时方案，可直接进行永久修复B. 风险评估驱动切换有风险，需准备回滚方案2. 永久方案A. 改进措施创建 modprobe 配置文件，强制使用 amdgpu 驱动：创建 /etc/modprobe.d/amd-gpu.conf添加 blacklist radeon 阻止旧驱动加载配置 amdgpu 选项启用 CIK 支持更新 initramfs 使配置生效重启系统验证B. 实施步骤步骤 1：备份现有配置s…

Rime 输入法在 Kubuntu 24.04 上的安装与配置
type: item
date: 2026-03-30T05:53:55+00:00
description: Rime 输入法在 Kubuntu 24.04 上的安装与配置一、概述1. 简介A. 是什么Rime（中州韵输入法引擎）是一款跨平台的输入法框架，支持拼音、双拼、五笔等多种输入方案。它以高度可定制和优秀的中文输入体验著称。B. 为什么选择 Rime开源免费，无广告干扰支持多种输入方案，可高度定制跨平台支持，配置可在不同系统间同步词库丰富，输入准确率高C. 学完能做什么在 Kubuntu 系统上安装并使用 Rime 输入法掌握 Fcitx5 输入法框架的配置方法自定义 Rime 输入方案和词库2. 前置知识A. 必备技能基本 Linux 命令行操作了解软件包管理器 apt 的使用B. 推荐知识了解输入法框架概念（IBus、Fcitx 等）了解 Linux 环境变量配置二、环境准备1. 系统要求操作系统：Kubuntu 24.04 或其他 Ubuntu 24.04 衍生版本桌面环境：KDE Plasma权限：sudo 访问权限用于安装软件包2. 输入法框架选择Linux 上的输入法框架主要有 IBus 和 Fcitx5 两种。对于 Rime 输入法，推荐使用 Fcitx5，原因如下：输入法框架优点缺点推荐度IBus系统默认集成对 Rime 支持一般，配置复杂一般Fcitx5轻量高效，Rime 支持完善需手动安装强烈推荐3. 安装步骤A. 更新软件包索引sudo apt updateB. 安装 Fcitx5 和 Rimesudo apt install -y fcitx5 fcitx5-rime fcitx5-chinese-addons fcitx5-frontend-gtk3 fcitx5-frontend-gtk4 fcitx5-frontend-qt5各组件说明：fcitx5：核心框架fcitx5-rime：Rime 输入法引擎fcitx5-chinese-addons：中文相关增强功能fcitx5-frontend-*：各应用的前端支持库C. 安装配置工具（可选但推荐）sudo apt install -y fcitx5-config-qt4. 验证安装# 检查 Fcitx5 版本 fcitx5 --version # 检查 Rime 是否安装 dpkg -l | grep fcitx5-rime三、核心概念1. 基本术语Fcitx5：Free Chinese Input Toy for X，新一代输入法框架Rime：输入法引擎，负责将拼音转换为汉字输入法前端：Fcitx5 与应用程序之间的桥梁（GTK/Qt 前端）输入方案：Rime 的输入规则配置，如朙月拼音、地球拼音等2. 工作原理graph TB A[用户按键] --> B[Fcitx5 框架] B --> C{输入法类型} C -->|英文| D[直接输出] C -->|中文| E[Rime 引擎] E --> F[词库匹配] F --> G[候选词生成] G --> H[前端显示] H --> I[用户选择] I --> J[应用程序]3. 配置架构graph LR A[环境变量配置] --> B[Fcitx5 配置] B --> C[Rime 方案配置] C --> D[用户自定义] E[~/.config/environment.d] --> A F[~/.config/fcitx5] --> B G[~/.local/share/fcitx5/rime] --> C四、快速上手1. 环境变量配置A. 创建环境变量文件mkdir -p ~/.config/environment.d cat > ~/.config/environment.d/im.conf << 'EOF' GTK_IM_MODULE=fcitx QT_IM_MODULE=fcitx XMODIFIERS=@im=fcitx INPUT_METHOD=fcitx EOFB. 添加到 bashrc（当前会话生效）cat >> ~/.bashrc << 'EOF' # Fcitx5 Input Method export GTK_IM_MODULE=fcitx export QT_IM_MODULE=fcitx export XMODIFIERS=@im=fcitx EOF # 立即生效 source ~/.bashrcC. 配置自动启动mkdir -p ~/.config/autostart cat > ~/.config/autostart/fcitx5.desktop << 'EOF' [Desktop Entry] Name=Fcitx 5 Comment=Input Method Framework Exec=fcitx5 Icon=fcitx Type=Application Cat…

Linux 应用开发基础教程
type: item
date: 2026-03-22T04:02:24+00:00
description: Linux 应用开发基础教程一、概述1. 简介A. 是什么《Linux Application Development By Example - The Fundamental APIs》是由 Arnold Robbins 编写的 Linux 应用程序开发教程书籍，第二版于 2026 年出版。本书通过大量示例代码，系统介绍 Linux 系统编程的核心 API 和开发技巧。B. 为什么学掌握 Linux 系统编程基础，理解操作系统工作原理学习 POSIX 标准 API，提升跨平台开发能力通过实例代码快速掌握复杂的系统调用概念培养底层思维，为学习高级框架打下坚实基础C. 学完能做什么开发 Linux 命令行工具和系统程序处理文件 I/O、进程管理、信号处理等系统级任务进行网络编程和国际化应用开发使用调试工具分析和修复程序问题2. 前置知识A. 必备技能C 语言基础：指针、结构体、内存管理基本 Linux 操作：命令行使用、文件系统概念编译工具使用：gcc、makeB. 推荐知识操作系统基础概念：进程、线程、虚拟内存POSIX 标准了解Git 版本控制二、书籍结构1. 内容组织本书共 17 章，涵盖 Linux 应用开发的各个方面：mindmap root((Linux 应用开发)) 基础入门 第1章 简介 第2章 命令行 第3章 内存 文件操作 第4章 文件IO 第5章 文件信息 第7章 ls 实现 进程管理 第9章 进程 第10章 信号 第12章 资源限制 系统功能 第6章 通用工具1 第8章 挂载 第13章 通用工具2 高级主题 第14章 网络 第15章 国际化 第16章 扩展属性 第17章 调试2. 章节概览章节目录主题第 1 章ch-01-intro入门示例，数学计算程序第 2 章ch-02-cmdline命令行参数处理，环境变量第 3 章ch-03-memory动态内存分配，地址空间第 4 章ch-04-fileio文件 I/O，系统调用与库函数第 5 章ch-05-fileinfo文件元数据，stat 系统调用第 6 章ch-06-general1通用工具：时间、用户信息第 7 章ch-07-ls实现 ls 命令第 8 章ch-08-mounting文件系统挂载第 9 章ch-09-processes进程创建与管理第 10 章ch-10-signals信号处理第 12 章ch-12-limits系统资源限制第 13 章ch-13-general2更多通用工具第 14 章ch-14-networking网络编程基础第 15 章ch-15-i18n国际化与本地化第 16 章ch-16-extended扩展属性第 17 章ch-17-debugging调试技巧与工具三、核心概念1. 系统调用与库函数Linux 编程中区分两类函数：A. 系统调用直接进入内核态执行开销较大，需要上下文切换提供核心功能：文件操作、进程管理、网络通信B. 库函数在用户态执行通常封装系统调用，提供更友好的接口标准 C 库函数：printf、malloc、fopengraph TB A[应用程序] --> B{函数类型} B -->|库函数| C[glibc 等] B -->|系统调用| D[内核] C --> D D --> E[硬件资源]2. Linux 编程模型A. 一切皆文件普通文件、目录、设备、套接字都通过文件描述符访问标准 I/O：stdin（0）、stdout（1）、stderr（2）B. 进程模型进程是资源分配的基本单位fork + exec 创建新进程父子进程关系与等待机制C. 权限模型用户 ID 和组 ID文件权限：rwx 权限位setuid/setgid 机制四、快速上手1. 获取代码克隆本书的代码仓库：git clone https://github.com/arnoldrobbins/LinuxByExample-2e.git cd LinuxByExample-2e2. 编译示例各章节目录包含独立的示例程序，使用 gcc 编译：cd ch-01-intro gcc -o sindegrees ch-intro-sindegrees.c -lm ./sindegrees3. 代码风格说明命名规范：ch-<章节名>-<功能描述>.c头文件：ch-<章节名>-<功能描述>.h测试程序：ch-<章节名>-<功能>-test*.c脚本文件：功能描述.sh五、重点章节解析1. 第 1 章：入门示例A. 数学计算程序该章实现一个角度与弧度转换的程序，展示基本的 C 程序结构和数学库使用。核心代码结构：主程序：ch-intro-sindegrees.c头文件：ch-intro-sindegrees.h测试程序：多个测试版本2. 第 2 章：…

SamWaf开源轻量级网站防火墙介绍
type: item
date: 2026-02-09T00:44:46+00:00
description: SamWaf开源轻量级网站防火墙介绍一、新闻概述1. 标题SamWaf：面向小企业和个人站点的开源轻量级网站防火墙2. 发布时间2025年12月25日（最近更新）3. 来源GitHub 开源仓库二、核心内容1. 事件摘要A. 主要内容SamWaf 是一款开源轻量级的网站应用防火墙（WAF），专为小公司、工作室和个人网站设计，支持完全私有化部署。B. 核心亮点完全开源代码，支持私有化部署独立防护引擎，不依赖 Nginx、Apache、IIS数据本地加密存储，隐私保护到位一键启动，支持 Linux 和 Windows 64位、Arm64 平台支持 IPv6 和自动 SSL 证书申请续签2. 关键信息A. 版本状态GitHub Stars：1344+Fork：154+支持平台：Linux、Windows 64位、Arm64B. 代码仓库GitHub：https://github.com/samwafgo/SamWafGitee：https://gitee.com/samwaf/SamWafAtomGit：https://atomgit.com/SamSafe/SamWafC. 主要特性OWASP CRS 规则集支持CC 防护和 IP 黑白名单自定义防护规则日志加密存储管理端通信加密三、详细报道1. 主要功能A. 防护能力支持 OWASP CRS 规则集SQL 注入、XSS、RCE、扫描等攻击检测CC 攻击频率限制Bot 检测自定义规则脚本支持B. 访问控制IP 黑白名单URL 黑白名单白名单访问模式分网站单独防护策略C. 安全特性日志加密保存通讯日志加密信息脱敏保存数据本地化存储D. SSL 证书管理自动 SSL 证书申请（支持 Let's Encrypt 和 ZeroSSL）自动续签证书到期批量检测支持多云账号配置2. 架构设计graph TB Client[客户端] --> SamWaf[SamWaf 引擎] SamWaf --> WafEngine[WAF 防护引擎] WafEngine --> RuleEngine[规则匹配引擎] RuleEngine --> OWASP[OWASP CRS] RuleEngine --> Custom[自定义规则] SamWaf --> LogSystem[日志系统] LogSystem --> Encrypt[加密存储] WafEngine -.允许请求.-> Backend[后端服务] WafEngine -.拦截请求.-> Block[拦截页面] LogSystem --> Notify[告警通知] Notify -.邮件/企业微信.-> Admin[管理员]A. 工作原理SamWaf 采用反向代理架构，部署在客户端和后端服务之间：请求接收：SamWaf 监听 80/443 端口接收 HTTP/HTTPS 请求规则匹配：通过内置规则引擎对请求进行安全检测处理决策：根据匹配结果决定放行或拦截日志记录：所有请求经加密后存储到本地告警通知：触发告警条件时发送通知B. 核心组件WAF 防护引擎：核心防护逻辑规则引擎：OWASP CRS + 自定义规则日志系统：加密存储和查询SSL 模块：自动证书申请和管理通知模块：邮件、企业微信告警3. 技术细节A. 技术栈开发语言：Go 语言Web 框架：自研引擎前端：Vue.js数据存储：本地加密文件B. 部署方式Windows 系统# 直接启动 SamWaf64.exe # 服务模式安装 SamWaf64.exe install SamWaf64.exe startLinux 系统# 一键安装脚本 curl -sSO http://update.samwaf.com/latest/install_samwaf.sh && bash install_samwaf.sh install # 一键卸载脚本 curl -sSO http://update.samwaf.com/latest/install_samwaf.sh && bash install_samwaf.sh uninstallDocker 部署docker run -d --name=samwaf-instance \ -p 26666:26666 \ -p 80:80 \ -p 443:443 \ -v /path/to/your/conf:/app/conf \ -v /path/to/your/data:/app/data \ -v /path/to/your/logs:/app/logs \ -v /path/to/your/ssl:/app/ssl \ samwaf/samwafC. 访问配置管理界面：http://127.0.0.1:26666默认账号：admin默认密码：adm…

eBPF/XDP 构建二层直接服务器返回负载均衡器教程
type: item
date: 2026-02-06T07:33:24+00:00
description: eBPF/XDP 构建二层直接服务器返回负载均衡器教程一、概述1. 简介A. 是什么本教程讲解如何使用 eBPF/XDP 技术从零开始构建一个二层 Direct Server Return（DSR）负载均衡器。DSR 是一种高级负载均衡模式，允许后端服务器直接响应客户端请求，无需通过负载均衡器回传响应流量。B. 为什么学解决 NAT 模式负载均衡器的性能瓶颈问题掌握 eBPF/XDP 在网络编程中的实际应用理解 DSR 架构在云原生环境中的价值C. 学完能做什么使用 eBPF/XDP 实现二层 DSR 负载均衡理解虚拟 IP（VIP）的工作原理和配置方法掌握 MAC 地址重写技术在数据平面加速中的应用2. 前置知识A. 必备技能Linux 网络基础（IP、MAC、ARP 协议）基本的 C/Go 编程能力了解 eBPF/XDP 基本概念B. 推荐知识完成前序教程：NAT 模式 XDP 负载均衡器了解网络协议栈的分层模型二、背景知识1. NAT 模式的局限性在之前的教程中，我们构建了基于 NAT 的 XDP 负载均衡器。虽然该方案可以正常工作，但存在以下问题：A. 资源消耗负载均衡器需要处理双向流量（请求和响应），这会导致：更高的 CPU 和内存占用可能成为系统瓶颈B. 流量不对称入站流量通常远小于出站流量：搜索查询或 AI 提示只有几字节搜索结果或 AI 响应可能有数千字节C. 客户端信息丢失由于 NAT 负载均衡器重写了数据包头，后端服务器：无法感知真实客户端 IP难以维护用户会话无法按源 IP 记录请求日志2. Direct Server Return 概念DSR 通过让后端服务器直接响应客户端来解决上述问题。有多种 DSR 实现方式：Layer 2 DSR（本教程重点）IP-in-IP 封装GRE 隧道基于 IP 或 TCP 头部字段的变体三、实验环境1. 网络拓扑实验环境包含 5 个节点，分布在两个网络中：节点网络IP 地址lb192.168.178.0/24192.168.178.10/24backend-01192.168.178.0/24192.168.178.11/24backend-02192.168.178.0/24192.168.178.12/24client10.0.0.0/1610.0.0.20/16gateway跨网络192.168.178.2/24 + 10.0.0.2/162. DSR 原理与传统 NAT 负载均衡不同，DSR 保留原始客户端 IP，并允许后端直接响应客户端，在回程路径上绕过负载均衡器。核心问题：后端如何看到客户端 IP（数据包经过了负载均衡器）？后端知道响应哪个客户端吗？如何确保客户端从同一 IP 收到响应？简而言之，二层 DSR 通过在负载均衡器上仅重写数据包的 MAC 地址（保持 IP 头不变），并依靠负载均衡器和后端服务器之间的虚拟 IP 来实现。四、核心概念1. 虚拟 IP（VIP）在任何网络设置中，当客户端向特定端点发送请求时，期望响应来自相同的 IP 地址。如果响应来自不同的 IP，客户端网络栈会认为出错并丢弃数据包。在 NAT 负载均衡中，这会造成问题，因为客户端请求总是通过负载均衡器，后者将其转发给具有不同 IP 的后端节点。A. VIP 解决方案为了解决这个问题，负载均衡器和后端节点需要共享相同的 IP，确保客户端始终认为响应来自其最初联系的地址。这个共享 IP 就是虚拟 IP（VIP）。B. VIP 特性与物理 IP 不同，VIP 不绑定到特定接口或节点。相反，它是由多个节点使用的共享地址，用于处理同一服务的流量。2. VIP 配置A. 负载均衡器配置在负载均衡器的主接口（eth0）上配置 VIP：sudo ip addr add 192.168.178.15/32 dev eth0B. 后端服务器配置在两个后端服务器上，在环回接口（lo）上配置 VIP：sudo ip addr add 192.168.178.15/32 dev loC. ARP 隔离两个节点具有相同 IP 会引起混乱。因此，我们将 VIP 分配给后端节点的 lo 接口。我们不希望后端通过 ARP 广告虚拟 IP。网络中没有人应该知道后端上存在 VIP，否则客户端可能绕过负载均衡器直接连接。为防止后端节点响应 lo 接口上 VIP 地址的 ARP 请求（即广告），在每个后端节点上运行以下命令：# 仅当目标 IP 分配给接收请求的接口时才响应 ARP 请求 # （防止在 eth0 上广告 VIP） sudo sysctl -w net.ipv4.conf.eth0.arp_ignore=1 # 发送 ARP 请求时，仅使用分配给出站接口的地址 # （防止节点在 ARP 中泄露 VIP 作为源 …

Guix System First Impressions as a Nix User
type: item
date: 2026-02-01T05:58:39+00:00
description: Guix System First Impressions as a Nix UserTable of ContentsMy Journey to Guix SystemInstaller ImpressionsI Can't Find my Way-landSympathy for the DevilGoalsResultsOverallNotes1. My Journey to Guix SystemI've been a Linux-only user for about ten years now and, like many others, I too embarked on the arduous journey of distro-hopping. I started with Mint and when that felt too slow, I switched to Ubuntu. When Ubuntu felt too handholdy, I switched to Arch, which proved to be my main driver for well over five or so years. And when I couldn't resist the Siren's call, I moved on to Gentoo, thinking surely "harder is better". Which resulted in severe burnout in a few months, so I capitulated and switched to Fedora, which was very stable and honestly an all around excellent system. But once more, my interest was piqued, and (before today's adventure) I finally switched to NixOS.I've always had a passing interest towards Nix ever since I've first heard about it, but until fairly recently, I always dismissed it as a tool for DevOps guys. The syntax was weird, the need for reproducible environments seemingly irrelevant, and stuff like the oft-recommended Nix Pills seemed anything but newbie-friendly.So then why would someone like me, who's so adamant about not needing Nix eventually choose to go all-in? I guess it was at first less about Nix being better and just the rest being worse.Of the two big reasons for the switch, one was that I realized that having per-directory environments for your projects is actually a very handy thing to do when you like to toy around with many technologies. I used to generate my other blog using Jekyll and, no matter which distro I used, it was always a pain in the neck to have a good Ruby environment set up. bundler install didn't really want to work without privileges and I wasn't really a fan of unleashing sudo on it, but usually that was the only way I could get things to work.With Nix, however, it was a matter of just describing a few pack…

Linux环境变量问题技术分析
type: item
date: 2026-01-30T13:53:13+00:00
description: Linux环境变量问题技术分析一、概述1. 问题背景在日常Linux运维和开发工作中，环境变量相关的问题是导致脚本执行失败的主要原因之一。这类问题通常表现为：命令在交互式终端中正常执行，但通过 crontab、SSH 远程执行或自动化工具执行时却报错找不到命令。2. 核心问题脚本在命令行测试正常，放入 crontab 后报错找不到命令SSH 远程执行命令时环境变量与本地登录不同Docker 容器中环境变量传递问题Bash 与 Sh 语法兼容性问题3. 影响范围自动化脚本执行失败定时任务无法正常运行容器化应用启动异常跨平台脚本兼容性问题二、问题分析1. Login Shell 与 Non-Login ShellA. 核心区别Linux Shell 分为两种模式：Login Shell（登录式 Shell）和 Non-Login Shell（非登录式 Shell），它们加载环境变量的顺序不同。B. 环境变量加载顺序graph TD subgraph Login Shell A1["/etc/profile"] --> A2["~/.bash_profile"] A2 --> A3["~/.bashrc"] A3 --> A4["/etc/bashrc"] end subgraph Non-Login Shell B1["~/.bashrc"] --> B2["/etc/bashrc"] end C["用户登录"] --> Login D["SSH远程执行命令"] --> Non-Login E["Crontab执行"] --> Non-Login F["脚本调用"] --> Non-LoginC. 关键差异Login Shell 加载顺序：① /etc/profile ② ~/.bash_profile ③ ~/.bashrc ④ /etc/bashrcNon-Login Shell 加载顺序：① ~/.bashrc ② /etc/bashrc/etc/profile 中包含 pathmunge 函数，负责将 /usr/sbin、/usr/local/sbin 等路径添加到 PATH 变量中。Non-Login Shell 由于跳过了 /etc/profile 的加载，导致这些路径缺失。2. 实际场景分析A. SSH 远程执行命令# 直接登录后执行（Login Shell） ssh user@ip ip a # 正常执行 # 远程直接执行命令（Non-Login Shell） ssh user@ip "ip a" # 报错：bash: ip: command not found原因分析：Login Shell：PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbinNon-Login Shell：PATH=/usr/local/bin:/usr/binip 命令位于 /usr/sbin 下，Non-Login Shell 的 PATH 中不包含该路径。B. Crontab 定时任务脚本在命令行测试正常，放入 crontab 后报错找不到命令。这是因为：命令行执行使用当前用户的完整环境变量Crontab 执行时的环境变量被 sudo 修改（如果使用 sudo）sudo 默认会重置环境变量3. Bash 与 Sh 的区别A. 命令差异命令/特性BashSh (POSIX)source内建命令不支持（用 . 代替）语法扩展支持数组等仅 POSIX 标准 B. 系统链接差异CentOS：/usr/bin/sh → /usr/bin/bash（sh 等同于 bash）Ubuntu：/usr/bin/sh → /usr/bin/dash（sh 是独立的 dash）这就是为什么在 CentOS 上用 sh 执行的脚本在 Ubuntu 上可能报语法错误。三、解决方案1. Crontab 环境变量问题A. 使用 sudo -E 参数# 在 crontab 中使用 sudo -E /path/to/script.sh-E 参数（--preserve-env）可以保留当前用户的环境变量。B. 脚本中显式加载环境变量#!/bin/bash # 在脚本开头添加 source /etc/profile source ~/.bashrcC. 脚本使用 login shell#!/bin/bash --login2. SSH 远程执行问题A. 创建全局环境变量文件在 /etc/profile.d/ 下创建自定义环境变量文件：# /etc/profile.d/my_bashenv.sh pathmunge () { if ! echo $PATH | /bin/egrep -q "(^|:)$1($|:)" ; …