第一章:Golang安装权威手册导论
Go 语言以其简洁语法、原生并发支持与高效编译能力,成为云原生基础设施、CLI 工具及微服务开发的首选之一。一套稳定、可复现且符合生产规范的 Go 环境,是所有后续开发工作的基石——它不仅影响构建速度与依赖管理准确性,更直接关系到交叉编译、模块校验(go.sum)及 GOPROXY 行为的一致性。
安装过程需兼顾操作系统适配性、版本可控性与环境隔离能力。官方推荐方式包括:直接下载预编译二进制包、使用系统包管理器(如 apt/brew)、或借助版本管理工具(如 gvm 或 goenv)。其中,手动安装最具透明性与教学价值,适用于从零构建可信开发环境的场景。
下载与解压官方二进制包
访问 https://go.dev/dl/ 获取最新稳定版(例如 go1.22.5.linux-amd64.tar.gz),执行以下命令(以 Linux/macOS 为例):
# 下载并解压至 /usr/local(需 sudo 权限)
curl -OL https://go.dev/dl/go1.22.5.linux-amd64.tar.gz
sudo rm -rf /usr/local/go
sudo tar -C /usr/local -xzf go1.22.5.linux-amd64.tar.gz
# 验证完整性(可选但推荐)
sha256sum go1.22.5.linux-amd64.tar.gz # 对比官网发布的 checksum
配置核心环境变量
将 /usr/local/go/bin 加入 PATH,并设置 GOPATH(默认为 $HOME/go,可自定义):
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
echo 'export GOPATH=$HOME/go' >> ~/.bashrc
source ~/.bashrc
验证安装结果
运行以下命令确认版本、编译器及基础工具链可用:
go version # 输出:go version go1.22.5 linux/amd64
go env GOROOT # 应返回 /usr/local/go
go env GOPATH # 应返回 $HOME/go(或自定义路径)
go run -c 'print("Hello, Go!")' # 快速验证 runtime 是否就绪
| 关键目录 | 默认路径 | 说明 |
|---|---|---|
GOROOT |
/usr/local/go |
Go 标准库与工具链根目录 |
GOPATH |
$HOME/go |
工作区,含 src/pkg/bin 子目录 |
GOBIN |
$GOPATH/bin |
go install 生成的可执行文件存放处 |
安装完成后,建议立即配置 GOPROXY 以加速模块拉取:
go env -w GOPROXY=https://proxy.golang.org,direct
# 国内用户可替换为:https://goproxy.cn
第二章:Linux平台Go环境部署与内核级权限验证
2.1 Linux发行版差异与内核版本兼容性分析
不同发行版对内核的定制策略显著影响驱动兼容性。Ubuntu 偏向 LTS 内核(如 5.15.x)并叠加 Canonical 补丁;RHEL/CentOS Stream 则基于上游稳定分支深度裁剪,启用 CONFIG_MODULE_SIG_FORCE=y 强制模块签名。
内核 ABI 稳定性边界
- 主版本号变更(如
6.x → 7.x)通常伴随 syscall 接口重构 - 次版本升级(如
6.6 → 6.8)保证内核模块 ABI 向后兼容
典型发行版内核特性对比
| 发行版 | 默认内核版本 | 模块签名策略 | CONFIG_DEBUG_INFO_BTF |
|---|---|---|---|
| Ubuntu 24.04 | 6.8 | 可选(禁用默认) | 启用 |
| RHEL 9.4 | 5.14 | 强制启用 | 禁用 |
| Arch Linux | 6.9 (滚动) | 不启用 | 启用 |
# 检查当前内核是否支持 BTF 调试信息
zcat /proc/config.gz | grep CONFIG_DEBUG_INFO_BTF
# 输出:CONFIG_DEBUG_INFO_BTF=y → 支持 eBPF 程序类型安全校验
# 参数说明:BTF 提供类型元数据,使 eBPF verifier 能精确验证内存访问合法性
graph TD
A[用户空间程序] -->|ioctl/syscall| B(内核接口层)
B --> C{内核版本 ≥ 5.8?}
C -->|是| D[启用 BPF_PROG_TYPE_TRACING]
C -->|否| E[仅支持 BPF_PROG_TYPE_SOCKET_FILTER]
2.2 非root用户下通过源码编译实现无sudo安装实践
在受限环境中,普通用户需绕过系统级权限完成软件部署。核心思路是重定向安装路径至用户可写目录(如 $HOME/local),并精准控制编译链路。
构建前环境准备
mkdir -p $HOME/local/{bin,lib,include,share}
export PREFIX="$HOME/local"
export PATH="$PREFIX/bin:$PATH"
export LD_LIBRARY_PATH="$PREFIX/lib:$LD_LIBRARY_PATH"
此段初始化本地安装根目录,并注入环境变量:
PREFIX统一指定安装前缀;PATH和LD_LIBRARY_PATH确保后续编译器与运行时能定位到自建工具链与库。
编译安装典型流程
- 解压源码包(如
nginx-1.25.3.tar.gz) - 进入源码目录执行:
./configure --prefix="$PREFIX" --without-http_rewrite_module make && make install--prefix强制所有文件写入用户空间;--without-*减少对系统库(如 PCRE、OpenSSL)的隐式依赖,避免链接失败。
关键路径映射表
| 组件 | 默认系统路径 | 用户空间路径 |
|---|---|---|
| 可执行文件 | /usr/bin/ |
$HOME/local/bin/ |
| 动态库 | /usr/lib/ |
$HOME/local/lib/ |
| 头文件 | /usr/include/ |
$HOME/local/include/ |
graph TD
A[下载源码] --> B[配置--prefix=$HOME/local]
B --> C[编译生成目标文件]
C --> D[安装至用户目录]
D --> E[更新PATH/LD_LIBRARY_PATH]
2.3 systemd服务封装与cgroup资源隔离配置实操
创建带资源限制的systemd服务单元
# /etc/systemd/system/nginx-limited.service
[Unit]
Description=NGINX with cgroup limits
After=network.target
[Service]
Type=notify
ExecStart=/usr/sbin/nginx -g 'daemon off;'
Restart=on-failure
# cgroup v2 资源限制(需系统启用 unified cgroup hierarchy)
MemoryMax=512M
CPUQuota=50%
IOWeight=50
LimitNOFILE=8192
[Install]
WantedBy=multi-user.target
该配置将服务纳入默认system.slice,由systemd自动创建对应cgroup路径(如/sys/fs/cgroup/system.slice/nginx-limited.service),MemoryMax硬限内存、CPUQuota按比例分配CPU时间片,IOWeight影响blkio权重调度。
验证cgroup生效路径
| 资源类型 | cgroup v2 控制文件路径 | 查看命令示例 |
|---|---|---|
| 内存 | /sys/fs/cgroup/system.slice/nginx-limited.service/memory.max |
cat memory.current memory.max |
| CPU | /sys/fs/cgroup/system.slice/nginx-limited.service/cpu.weight |
cat cpu.weight cpu.max |
启动与监控流程
graph TD
A[启用服务] --> B[systemd 创建 cgroup 目录]
B --> C[写入 memory.max / cpu.weight 等参数]
C --> D[启动 nginx 进程并加入该 cgroup]
D --> E[通过 systemd-cgtop 实时观测资源占用]
2.4 SELinux/AppArmor策略适配与安全上下文验证
现代容器运行时需在强制访问控制(MAC)框架下精确映射进程与资源的安全上下文。
安全上下文校验流程
# 检查容器进程的SELinux上下文
ps -eZ | grep containerd | head -1
# 输出示例:system_u:system_r:container_t:s0:c123,c456
该命令提取containerd守护进程的完整上下文,其中s0为MLS级别,c123,c456为类别集,确保容器隔离域不越权访问主机敏感资源。
策略适配关键字段对比
| 机制 | 类型强制字段 | 上下文继承方式 |
|---|---|---|
| SELinux | type=container_t |
由security_context字段显式声明 |
| AppArmor | profile /usr/bin/containerd |
通过/proc/<pid>/attr/current动态读取 |
策略加载验证逻辑
graph TD
A[加载策略模块] --> B{上下文匹配?}
B -->|是| C[允许exec权限]
B -->|否| D[拒绝并记录avc denail]
C --> E[验证文件标签一致性]
2.5 内核模块加载检测与/proc/sys/fs/binfmt_misc动态注册验证
内核模块加载过程可通过 kprobe 或 tracepoint 实时捕获,而 binfmt_misc 的动态注册则依赖于 /proc/sys/fs/binfmt_misc/register 接口。
模块加载检测示例
# 监控模块加载事件(需 root)
echo 'p:kprobes/module_load do_init_module' > /sys/kernel/debug/tracing/kprobe_events
echo 1 > /sys/kernel/debug/tracing/events/kprobes/module_load/enable
cat /sys/kernel/debug/tracing/trace_pipe
该命令在
do_init_module入口处设置 kprobe,捕获所有模块初始化调用;trace_pipe实时输出含 PID、模块名及寄存器快照,适用于安全审计场景。
binfmt_misc 动态注册验证流程
graph TD
A[写入 register 文件] --> B{格式校验}
B -->|成功| C[创建 /proc/sys/fs/binfmt_misc/<name>]
B -->|失败| D[返回 -EINVAL]
C --> E[内核注册新二进制格式处理函数]
验证状态关键字段
| 字段 | 含义 | 示例值 |
|---|---|---|
| enabled | 是否启用 | Y |
| interpreter | 解释器路径 | /usr/bin/qemu-x86_64 |
| flags | 标志位(如 F 表示强制) |
F |
第三章:macOS平台Go安装与SIP机制深度协同
3.1 SIP保护机制对/usr/local与/Library路径写入的拦截原理剖析
SIP(System Integrity Protection)通过内核级策略限制对受保护路径的写入,/usr/local 和 /Library(部分子目录)被纳入 protected_paths 列表。
核心拦截时机
写入操作在 VFS 层触发 vnode_authorize() 调用链,最终由 sips_check_path() 判定是否属于 SIP 保护范围:
// XNU 源码片段(简化)
boolean_t sips_check_path(const char *path) {
if (strncmp(path, "/usr/local", 10) == 0 ||
strncmp(path, "/Library", 8) == 0) {
return TRUE; // 触发 kauth 权限拒绝
}
return FALSE;
}
该函数在 kauth_authorize_vnode() 中被调用;若返回 TRUE 且进程未持有 CS_VALID + CS_DISABLE_LIBRARY_VALIDATION 特权,则 EACCES 错误立即返回。
受保护子路径示例
| 路径 | 是否默认受 SIP 保护 | 说明 |
|---|---|---|
/usr/local/bin |
✅ | 全路径匹配生效 |
/Library/Extensions |
✅ | 内核扩展专属保护区 |
/Library/Caches |
❌ | 缓存目录豁免 |
graph TD
A[open/write syscall] --> B[VFS vnode_create/vnode_get]
B --> C[vnode_authorize → kauth]
C --> D{sips_check_path?}
D -->|YES| E[deny with EACCES]
D -->|NO| F[proceed normally]
3.2 使用Homebrew Cask与自签名pkg包绕过SIP限制的合规方案
macOS 系统完整性保护(SIP)默认阻止对 /usr/bin、/System 等受保护路径的写入,但允许通过 Apple 认证的安装器(.pkg)以 root 权限部署至 /usr/local 或 /opt 等白名单路径。
自签名 pkg 构建流程
使用 productbuild 创建带开发者证书签名的分发包:
# 生成带标识符的pkg(需提前配置Developer ID Installer证书)
productbuild \
--identifier "io.example.cli-tool" \
--sign "Developer ID Installer: Example Inc." \
--root ./payload/ \
--install-location "/usr/local/bin" \
cli-tool.pkg
--identifier必须全局唯一,用于 Gatekeeper 信任链验证;--sign指向已导入钥匙串的发行证书;--install-location限定在 SIP 允许写入的路径,规避/usr/bin限制。
Homebrew Cask 集成策略
Cask 支持 installer script 块调用自签名 pkg:
cask "cli-tool" do
installer script: {
executable: "cli-tool.pkg",
args: ["--target", "/"],
sudo: true
}
end
| 组件 | 作用 | SIP 兼容性 |
|---|---|---|
/usr/local |
Homebrew 默认前缀 | ✅ 允许写入 |
| Developer ID | 启用 Gatekeeper 自动信任 | ✅ 需 Apple 审核 |
--target / |
指定根卷安装(非系统卷) | ✅ 安全沙箱内 |
graph TD
A[用户执行 brew install –cask cli-tool] –> B{Cask 解析 installer script}
B –> C[调用 productbuild 签名 pkg]
C –> D[Gatekeeper 验证签名 + SIP 检查路径]
D –> E[静默安装至 /usr/local/bin]
3.3 Xcode Command Line Tools依赖链验证与SDK路径自动修复
依赖链完整性校验
使用 xcode-select -p 获取当前工具链路径,再通过 pkgutil --pkg-info 验证其完整性:
# 检查是否指向有效安装路径
xcode-select -p 2>/dev/null | grep -q "CommandLineTools" || echo "⚠️ 未配置CLT"
# 验证核心包注册状态
pkgutil --pkg-info 'com.apple.pkg.CLTools_Executables' 2>/dev/null \
&& echo "✅ CLT 已正确注册" \
|| echo "❌ 缺失执行组件"
该脚本先确认 xcode-select 指向有效路径,再通过 macOS 包管理器验证 CLTools_Executables 是否注册——这是 clang、git 等命令可用的前提。
SDK路径自动修复逻辑
当 xcrun --sdk macosx --show-sdk-path 返回空时,触发重置:
# 自动重置为最新可用SDK
sudo xcode-select --install 2>/dev/null || true
sudo xcode-select --reset
修复流程概览
graph TD
A[检测 xcode-select 路径] --> B{是否指向 /Library/Developer/CommandLineTools?}
B -->|否| C[执行 --reset]
B -->|是| D[验证 pkgutil 注册状态]
D -->|缺失| E[触发 --install]
| 场景 | 检测命令 | 修复动作 |
|---|---|---|
| CLT 未安装 | xcode-select -p 失败 |
xcode-select --install |
| SDK 路径为空 | xcrun --sdk macosx --show-sdk-path 为空 |
xcode-select --reset |
第四章:Windows平台Go安装与Defender实时防护兼容性工程
4.1 Windows Defender SmartScreen与Go二进制签名信任链构建
Windows Defender SmartScreen 不仅校验证书链,更依赖应用声誉(reputation)与签名完整性双重信号。Go 编译生成的静态二进制默认无嵌入签名,需显式调用 signtool.exe 签署:
signtool sign /fd SHA256 /tr http://timestamp.digicert.com /td SHA256 /sha1 <CERT_THUMBPRINT> myapp.exe
/fd SHA256: 指定文件摘要算法,SmartScreen 要求 SHA256 或更高强度/tr: 使用 RFC 3161 时间戳服务,确保签名长期有效(避免证书过期导致验证失败)/sha1: 证书指纹,需预先导入受信根证书至“受信任的发布者”存储区
关键信任要素对比
| 要素 | Go 默认行为 | SmartScreen 信任要求 |
|---|---|---|
| 嵌入签名 | ❌ 无 | ✅ 必须存在有效 Authenticode 签名 |
| 时间戳 | ❌ 无 | ✅ 强烈推荐 RFC 3161 时间戳 |
| 发布者声誉 | ⚠️ 新证书初始低分 | ✅ 需持续分发积累信誉 |
graph TD
A[Go build → myapp.exe] --> B[Authenticode 签名]
B --> C[上传至 Microsoft SmartScreen 云服务]
C --> D{声誉评分 ≥ 阈值?}
D -->|是| E[显示“已验证发布者”]
D -->|否| F[警告“未知发布者”]
4.2 PowerShell执行策略(ExecutionPolicy)与Go模块缓存目录白名单配置
PowerShell 默认阻止未签名脚本执行,而CI/CD流水线常需动态加载Go构建脚本,需协调安全策略与自动化需求。
执行策略分级控制
PowerShell 提供五级策略(Restricted, AllSigned, RemoteSigned, Unrestricted, Bypass),生产环境推荐 RemoteSigned:
- 本地脚本无需签名,远程脚本必须可信签名
- 通过
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser作用于当前用户,避免提权风险
Go模块缓存白名单适配
当PowerShell策略限制脚本执行时,go build 若依赖 $env:GOMODCACHE 中含未签名初始化脚本的模块,会触发策略拦截。需将缓存路径加入白名单:
# 将Go模块缓存目录添加为PowerShell信任路径(仅限CurrentUser)
$goCache = Join-Path $env:USERPROFILE "go\pkg\mod"
if (Test-Path $goCache) {
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Force
# 注:PowerShell无原生“目录白名单”,此处通过策略+路径隔离实现逻辑白名单
}
逻辑分析:
Set-ExecutionPolicy不支持路径粒度控制,故采用“策略放宽 + 作用域最小化(CurrentUser)+ 缓存路径本地化”三重保障。-Force跳过确认提示,适配自动化场景;Join-Path确保跨系统路径兼容性。
| 策略类型 | 远程脚本 | 本地脚本 | 推荐场景 |
|---|---|---|---|
RemoteSigned |
需签名 | 允许执行 | CI/CD构建节点 |
Bypass |
无限制 | 无限制 | 临时调试(不推荐) |
graph TD
A[PowerShell脚本调用go build] --> B{ExecutionPolicy检查}
B -->|RemoteSigned| C[本地go.mod脚本:放行]
B -->|RemoteSigned| D[远程模块init.ps1:拒绝]
C --> E[读取GOMODCACHE中已缓存模块]
E --> F[构建成功]
4.3 Windows Subsystem for Linux(WSL2)中Go交叉编译环境双栈验证
在 WSL2 中构建 Go 交叉编译环境需同时支持 linux/amd64(宿主目标)与 windows/amd64(跨平台输出),实现 IPv4/IPv6 双栈兼容性验证。
构建双目标二进制
# 启用 CGO 并指定双栈网络行为
CGO_ENABLED=1 GOOS=windows GOARCH=amd64 \
go build -ldflags="-w -s -H windowsgui" \
-o hello-win.exe main.go
-H windowsgui 确保生成 GUI 子系统二进制,避免控制台窗口干扰;CGO_ENABLED=1 启用 netgo 外部解析器,保障 net.Listen("tcp", ":8080") 自动绑定双栈套接字。
验证流程关键指标
| 检查项 | IPv4 结果 | IPv6 结果 | 说明 |
|---|---|---|---|
netstat -an \| findstr :8080 |
✅ LISTENING | ✅ LISTENING | :::8080 表明双栈监听 |
curl http://localhost:8080 |
✅ | ✅ | loopback 均可达 |
双栈监听逻辑
// main.go 中启用双栈监听
ln, _ := net.Listen("tcp", ":8080") // Go 运行时自动调用 setsockopt(IPV6_V6ONLY, 0)
Go 1.19+ 默认对 ":port" 地址启用 IPV6_V6ONLY=0,使单个 :::8080 监听器同时接受 IPv4-mapped IPv6 和原生 IPv6 连接。
graph TD
A[Go build with CGO_ENABLED=1] –> B[Link netgo resolver]
B –> C[Listen on \”tcp :8080\”]
C –> D{Kernel binds ::8080
with IPV6_V6ONLY=0}
D –> E[Accepts IPv4 & IPv6]
4.4 Microsoft Intune策略组策略(GPO)下Go工具链静默部署脚本开发
Intune原生不支持直接部署Go SDK,需通过Win32应用封装+PowerShell静默安装实现策略化分发。
部署架构设计
# Install-Golang.ps1 —— Intune Win32应用主入口
$goVersion = "1.22.5"
$msiPath = "$env:TEMP\go$goVersion.amd64.msi"
Invoke-WebRequest -Uri "https://dl.google.com/go/go$goVersion.windows-amd64.msi" -OutFile $msiPath
Start-Process msiexec.exe -ArgumentList "/i `"$msiPath`" /qn ADDLOCAL=GoRuntime,GoCompiler,GoDocumentation" -Wait
Remove-Item $msiPath
逻辑分析:脚本采用
/qn静默模式避免UI交互;ADDLOCAL精确控制组件安装(跳过无关的VS集成),适配终端无GUI环境。$env:TEMP确保非管理员权限下可写。
关键参数对照表
| 参数 | 说明 | Intune约束 |
|---|---|---|
/qn |
全静默,无UI、无日志提示 | 必选,否则部署失败 |
ADDLOCAL=... |
仅安装运行时与编译器 | 避免触发UAC或依赖弹窗 |
执行流程
graph TD
A[设备接收Intune策略] --> B[下载Win32应用包]
B --> C[执行Install-Golang.ps1]
C --> D[静默安装MSI]
D --> E[验证go version输出]
第五章:跨平台安装一致性验证与生产就绪标准总结
验证矩阵驱动的多环境比对流程
为确保 macOS、Ubuntu 22.04 LTS 和 Windows Server 2022 上的 Python 3.11 环境行为一致,我们构建了 4×3 验证矩阵(覆盖 pip、conda、system package manager、自定义 installer 四类安装方式 × 三类操作系统)。每项组合执行标准化校验脚本,输出包含 hashlib.sha256(__file__).hexdigest() 校验值、importlib.metadata.version("requests") 版本号、sysconfig.get_platform() 平台标识及 subprocess.run(["ldd", "libpython3.11.so"], capture_output=True)(Linux/macOS)或 dumpbin /dependents python311.dll(Windows)的二进制依赖快照。该矩阵在 CI/CD 流水线中自动生成 HTML 报告,差异项自动标红并触发人工复核。
生产就绪的七项硬性指标
| 指标类别 | Linux/WSL 要求 | macOS 要求 | Windows 要求 |
|---|---|---|---|
| 启动延迟 | ≤120ms(time python -c "pass") |
≤180ms(含 Rosetta 2 开销) | ≤350ms(PowerShell + venv 激活后) |
| 证书信任链 | 系统 CA 存储同步更新(update-ca-certificates) |
Keychain Access 导入 ISRG Root X1 |
本地机器存储导入 DST Root CA X3 失效前备份 |
| 日志路径规范 | /var/log/myapp/(SELinux context: system_u:object_r:var_log_t:s0) |
/opt/myapp/logs/(ACL: group:admin:allow:read,write,append) |
%ProgramData%\MyApp\Logs\(ACL: BUILTIN\Users:RX) |
| 内存泄漏阈值 | 连续运行 72h 后 RSS 增长 ≤0.3MB/h | 同左,但需监控 vmmap -w python 中 __DATA_CONST 区域 |
使用 ETW 事件跟踪 Process/HeapAllocation |
实际故障复盘:Windows DLL 地址空间冲突
某金融客户在 Windows Server 2022 上部署时,Python 进程在加载 pywin32 后随机崩溃。通过 gflags.exe /i python.exe +ust 启用用户态堆栈跟踪,结合 WinDbg 分析 .dump 文件,定位到 msvcp140.dll(VC++ 2015 运行库)被两个不同版本的第三方包分别静态链接,导致 ASLR 基址重叠。解决方案强制统一使用 vcpkg install python3:x64-windows 构建的 ABI 兼容版本,并在 pyproject.toml 中声明 requires-python = ">=3.11,<3.12" 与 build-backend = "setuptools.build_meta" 锁定构建链。
自动化验证流水线设计
flowchart LR
A[Git Tag v2.4.0] --> B[Build Docker Image\nubuntu:22.04 + py311]
B --> C[Run Cross-Platform Test Suite]
C --> D{All Hashes Match?}
D -->|Yes| E[Deploy to Staging Cluster]
D -->|No| F[Generate Diff Report\n+ Slack Alert]
F --> G[Block Release Pipeline]
安全基线强制检查项
- 所有平台必须禁用
python -m http.server默认绑定至0.0.0.0:8000,通过--bind 127.0.0.1:8000显式约束; - macOS 上
codesign --verify --deep --strict --verbose=4 MyApp.app必须返回 exit code 0; - Windows 的
signtool verify /pa MyApp.exe需校验时间戳服务器响应(/tr http://timestamp.digicert.com); - 所有平台安装包必须通过
sha256sum -c SHA256SUMS校验,且SHA256SUMS文件本身由硬件安全模块(HSM)签名(gpg --verify SHA256SUMS.gpg); - Ubuntu 镜像需运行
trivy image --severity CRITICAL,HIGH myapp:2.4.0扫描,零高危漏洞为发布前提; - Windows 安装器必须通过 Microsoft SmartScreen 提交并通过
Application Verifier启用Heaps和TLS检查。
可观测性嵌入规范
每个平台安装后自动注入轻量级探针:Linux 使用 bpftrace 监控 openat() 系统调用路径白名单;macOS 通过 oslog 创建 com.myorg.runtime subsystem 记录模块加载事件;Windows 利用 ETW Provider Microsoft-Windows-Python 发送 ModuleLoad 事件。所有探针数据统一接入 OpenTelemetry Collector,经 resource_detection processor 补充 os.type, os.version, platform.architecture 属性后转发至 Loki。
