news 2026/9/12 4:05:29

Rust Coreutils 0.1.0 里程碑发布解析:SELinux 集成、性能优化与 GNU 兼容性跃升

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Rust Coreutils 0.1.0 里程碑发布解析:SELinux 集成、性能优化与 GNU 兼容性跃升

Rust Coreutils 0.1.0 里程碑发布解析:SELinux 集成、性能优化与 GNU 兼容性跃升

【免费下载链接】coreutilsCross-platform Rust rewrite of the GNU coreutils项目地址: https://gitcode.com/GitHub_Trending/co/coreutils

Rust Coreutils(uutils/coreutils)是 GNU coreutils 的跨平台 Rust 重写实现,0.1.0 是该项目第一个 0.1 里程碑版本,发布于 2025 年 5 月 24 日。该版本的核心主题可概括为三件事:cplsmkdirmknodmkfifoinstallstat等命令引入 SELinux 安全上下文支持catlswctailseq等高频命令进行性能优化,以及进一步逼近 GNU coreutils 行为(GNU 测试套件通过率提升至 84.46%)。读完本文,你将掌握 0.1.0 的功能全景、SELinux 的底层实现链路(以uucore::selinux模块为核心)、各命令的优化手段与可复现的基准测试方法,并能依据 GNU 测试数据客观评估兼容性进展。

版本概览与发布背景

Rust Coreutils 0.1.0 于 2025-05-24T22:00:55Z 发布(见 release-notes/0.1.0.md),距离上一版本 0.0.30(2025 年 3 月发布)约两个半月。这一周期内项目合并了843 个提交,由60+ 位贡献者共同完成,其中包含40 位首次贡献者,社区参与规模显著放大。

三个高亮主题贯穿整个版本:

  • SELinux 支持:新增 SELinux 集成覆盖cplsmkdirmknodmkfifoinstallstat七个命令,并同步上线了 SELinux 感知的 CI 测试任务。
  • 性能提升catlswctailseq等命令获得显著提速,多项基准已持平或超过 GNU 实现。
  • 生态影响力:Ubuntu 社区开始评估将 Rust Coreutils 引入基础系统(即社区所称的 “Oxidizing Ubuntu” 计划),这一外部动向在发布说明中被正式提及。

GNU 测试套件兼容性数据

0.1.0 发布说明给出了与 0.0.30 的 GNU 测试套件对比数据,这是评估兼容性进展最客观的指标:

Result0.0.300.1.0变化% Total 0.0.30% Total 0.1.0百分比变化
Pass507522+1582.17%84.46%+2.29%
Skip4131-106.65%5.02%-1.63%
Fail6965-411.18%10.52%-0.66%
Total617618+1(新增测试)

解读要点:

  • 通过数净增 15 个、失败数减少 4 个,跳过数减少 10 个,说明本版本不仅修复了既有失败用例,还将一部分原本跳过的测试转为通过。
  • 总数增加 1 个,意味着 GNU 上游新增了测试用例(该版本同时将 GNU coreutils 参考版本升级到了 9.7,见发布说明中的 CI 条目 “upgrade to GNU coreutils 9.7 as ref”)。
  • 该数据的可视化演进曲线(SVG 图)由 docs/src/test_coverage.md 中的自动化每日更新机制支撑,仓库内也保留了完整的 GNU 结果分析脚本 util/analyze-gnu-results.py 与 util/compare_test_results.py,读者可以据此复现同类对比。

SELinux 支持:实现原理与命令覆盖

SELinux(Security-Enhanced Linux)是 0.1.0 最重量级的新功能。本版本在7 个命令中落地了 SELinux 集成:cplsmkdirmknodmkfifoinstallstat,并配套实现了chcon(修改安全上下文)与runcon(在指定上下文中运行程序)的相关支持。

底层支撑:uucore::selinux 模块

所有命令共享同一套底层抽象,位于 src/uucore/src/lib/features/selinux.rs,并通过 src/uucore/src/lib/features.rs 中的条件编译暴露(仅在feature = "selinux"且目标系统为 Linux/Android 时启用)。该模块核心 API 包括:

  • is_selinux_enabled():检测内核是否启用了 SELinux(内部借助 libselinux 的kernel_support(),其结果会被 libselinux 缓存)。
  • set_selinux_security_context(path, context):为指定路径设置安全上下文;contextNone时按策略默认上下文设置。
  • get_selinux_security_context(path, follow_symbolic_links):读取路径的安全上下文,无上下文时返回空字符串。
  • contexts_differ(from, to):比较两个路径的上下文是否不同(用于cp判断是否需要重新打标)。
  • preserve_security_context(from, to):把源路径的上下文复制到目标路径(用于cp/install保留上下文)。
  • FsCreateContext:RAII 守卫类型,通过setfscreatecon让内核在对象创建瞬间就打上正确标签,避免先创建后打标导致的短暂错误上下文窗口;Drop时自动恢复策略默认值。

错误处理统一收敛到SeLinuxError枚举(SELinuxNotEnabledFileOpenFailureContextRetrievalFailureContextSetFailureContextConversionFailureOperationNotSupported),每个变体映射到独立的退出码(1–6)并接入UErrortrait,保证与 GNU 错误消息风格趋同(发布说明中专门有 “selinux: get closer to the GNU error msgs” 的 PR)。

值得注意的是absolute_for_policy_lookup()的设计:策略的file_contexts只包含绝对路径,因此相对路径会被转换为绝对路径再进行策略匹配,且只解析目录部分(保留最后一个路径分量不解析),确保...不会干扰策略匹配。

cp:-Z/--context 与 FsCreateContext 的应用

cp是 SELinux 集成最深入的命令。从 src/uu/cp/src/cp.rs 的源码看:

  • 新增-Z(长选项--context=CTX)参数(pub const SELINUX: &str = "Z",约 cp.rs#L504),-Z无参数时按默认策略上下文打标,--context=CTX指定显式上下文;若同时指定-Z--context会报冲突错误。
  • 在复制目录时(copy_dir流程),通过set_selinux_context()(cp.rs#L1779-L1792)在创建对象时应用FsCreateContextOperationNotSupported(如文件系统不支持)被当作可忽略错误。
  • -Z模式下会跳过复制security.selinux扩展属性(copy_xattrs_skip_selinux),因为新上下文由-Z决定而非继承源文件。

ls / stat:上下文展示

  • ls的 SELinux 支持体现在-Z输出列(默认启用时在长格式中显示安全上下文),相关实现分布在 src/uu/ls/src/ls.rs、src/uu/ls/src/config.rs 与 src/uu/ls/src/display.rs。
  • stat增加%C格式符输出 SELinux 上下文,见 src/uu/stat/src/stat.rs。
  • mkdir/mknod/mkfifo均支持-Z参数:在创建目录/设备节点/FIFO 的瞬间通过FsCreateContext::new()应用上下文,实现“创建即正确打标”。
  • install在 0.1.0 中开始了 SELinux 支持(见发布说明 “selinux: start the support of install”),同样采用-Z参数。

测试与 CI

发布说明显示,0.1.0 期间新增了 SELinux 感知的 CI 任务(CI: add a new job to test with Selinux),并运行 GNU 的 SELinux 相关测试(selinux: run the GNU test too)。在 src/uucore/src/lib/features/selinux.rs 的单元测试中,针对absolute_for_policy_lookup、上下文设置/读取、符号链接跟随(follow_symbolic_links参数决定是否解析链接)、FIFO 上下文获取、上下文比较与保留等场景均有覆盖;当 SELinux 未启用时这些测试会走“期望报SELinuxNotEnabled错误”的分支,保证非 SELinux 系统上测试不炸。

性能优化:命令级优化手段

0.1.0 中“多数命令已达或超过 GNU 性能”并非空话,仓库源码揭示了具体优化手法。

cat:格式化路径缓冲与 fast_inc 复用

cat的多个 PR(cat: Improve performance of formattingcat: Formatting performance improvementcat: Performance improvement when printing line numbers)聚焦于带-n/-T等格式化选项时的输出路径。核心手段(见 src/uu/cat/src/cat.rs):

  • 将输出包装为 32 KiB 的BufWriterBufWriter::with_capacity(32 * 1024, stdout)),大幅减少系统调用次数;
  • 行号递增复用了uucore::fast_inc::fast_inc_one(该函数由seqfast_inc提取到uucore后供cat使用,对应发布说明 “Move seq'sfast_inctouucore, use it incat”),直接在字节缓冲区上做增量计算,避免格式化与分配开销;
  • 对非可 seek 输入(管道/FIFO)重做了处理逻辑(head: rework handling of non-seekable files同源思路),并修复了-T选项下的输出 bug。

wc:bytecount 加速与泛型特化

wc的提速依赖bytecountcrate(wc: Perf gains with the bytecount crate)。从 src/uu/wc/src/wc.rs 的源码结构看,统计逻辑被拆分为count_fastcountableword_count子模块,count_bytes_fastcount_bytes_chars_and_lines_fast为 SIMD 友好的快速路径;同时通过word_count_from_reader_specialized-l/-w/-c/-m的组合做泛型布尔特化,避免运行时分支开销。后续 PRwc: Speed optimization进一步压缩了热路径。

seq:缓冲写入与快速递增

seq的优化(seq: Buffer writes to stdoutseq: Directly write separator string)体现在 src/uu/seq/src/seq.rs:用BufWriter包住标准输出;整数序列走fast_print_seq快速路径——在单块缓冲区中原地递增数字并整块写出;分隔符直接以字节串写出而非经过格式化。配套约束还包括:-w-f互斥(seq: Do not allow -w and -f to be specified at the same time)、修正默认浮点精度%f与 0 的科学计数打印。

其他命令亮点

  • ls:多轮打印优化与去重(ls: More performance optimizationsls: Print optimizations),并新增-T(按列制表)支持。
  • tailtail: Performance improvementstail: fix issue with -v flag and stdin
  • more:只保留屏幕行在内存中,降低内存占用与初始化开销。
  • echo:移除 clap 依赖(Remove clap for echo),减少启动开销。
  • shred:增加 4K 数据对齐与随机遍数文档化。

正确性修复与边界行为

性能之外,0.1.0 修复了大量影响日常使用的正确性问题,按命令列举如下:

  • cp:修复更新提示逻辑;-P下硬链接到符号链接的幂等行为;拒绝将符号链接复制到自身;源路径以.结尾时复制目录;使用 LinuxFICLONEioctl 常量实现 reflink。
  • date:支持负的日期偏移量;补充相对星期测试与%q/%#z支持。
  • printf:修复八进制转义解析、数值前导空白、负宽度/精度一致性、无符号/十六进制格式下负值回绕、多字节字符打印、格式字符串索引等一大批边界问题,并启用 fuzz 目标(见 fuzz/fuzz_targets/fuzz_printf.rs)。
  • expr:重构 AST 求值避免栈溢出;修复正则锚点^/$行为、否定字符类[^a]、锚点字符转义、REGEX_OPTION_SINGLELINE语义。
  • seq:默认浮点精度修正、-w-f互斥、空白与+号处理。
  • du:block-size 为 0 时不再 panic。
  • dd:解析优化与 bugfix。
  • sort:整行可解析为数字时立即整体比较(sort: immediately compare whole lines if they parse as numbers),绕过逐词比较。
  • split:修复竞态条件;mktemp:防止设置临时目录权限时的竞态。
  • chroot:修复试图进入不存在目录的问题;rm:stdin 非交互时跳过确认提示。
  • head:修复溢出错误;touch:修复-t两位数年份 YY > 68 的语义。

工程质量与工具链演进

0.1.0 同时是一次大规模工程重构:

  • Rust 版本与 edition:升级到 Rust edition 2024,最低 Rust 版本提升到 1.85。
  • 错误处理统一:大规模从手写错误类型迁移到thiserrordfprenv等多个命令,见Move more programs to thiserror)。
  • workspace 整合:使用authors.workspace = true、统一 crate 配置与 lint 管理(Consolidate crate config in workspace),并将 clippy lints 从 CI 迁移到Cargo.toml
  • 测试基础设施:测试基础设施被移入独立 crate(Move our tests infra into a dedicated crate),tests/by-util/下每个命令对应一个测试文件(如 tests/by-util/test_cp.rs)。
  • Fuzzing:新增uufuzzcrate 汇集通用 fuzz 函数并启用printf等目标的 fuzz 测试(见 fuzz/uufuzz/)。
  • 性能工程:新增profilingprofile(release 优化 + 调试符号),用于 docs/src/performance.md 中介绍的 samply/hyperfine 分析工作流;PGO 构建由 util/build-pgo.sh 驱动。
  • 依赖与 CI:升级 GNU coreutils 参考版本到 9.7;为 musl 启用feature_require_crate_cpputmpx;修复 Android CI;覆盖 CI 增加libselinux1-dev安装。

如何构建、验证与复现基准

构建

0.1.0 要求 Rust ≥ 1.85(edition 2024)。启用 SELinux 功能并构建:

# 构建带 SELinux 特性的 coreutils(Linux/Android 生效) cargo build --features unix,selinux # 性能评测请使用 profiling profile(release 优化 + 调试符号) cargo build --features unix --profile profiling

运行与验证

cp -Z为例,在启用 SELinux 的系统上:

# 按默认策略上下文打标复制 ./target/debug/coreutils cp -Z source.txt dest.txt # 指定显式上下文复制 ./target/debug/coreutils cp --context=system_u:object_r:user_home_t:s0 source.txt dest.txt

查看ls -Zstat -c %C的输出确认上下文,亦可使用getfattr -n security.selinux验证(uucore 的get_getfattr_output测试辅助函数即基于此命令)。

复现性能基准

按 docs/src/performance.md 的推荐流程做三方对比(GNU / 改前 / 改后):

hyperfine --warmup 3 \ "/usr/bin/wc -l big.txt" \ "./target/profiling/coreutils.prev wc -l big.txt" \ "./target/profiling/coreutils wc -l big.txt" # 提高可复现性:固定 CPU taskset -c 0 hyperfine --warmup 3 \ -L wc /usr/bin/wc,"./target/profiling/coreutils.prev wc","./target/profiling/coreutils wc" \ "{wc} -l big.txt"

运行测试

# 运行指定命令的集成测试 cargo test --test tests -- test_cp # 运行 GNU 测试套件对比(需先获取 GNU 测试源码,见 util/fetch-gnu.sh) ./util/run-gnu-test.sh

从 0.0.30 到 0.1.0:里程碑意义小结

0.1.0 之于 Rust Coreutils 的意义在于:它第一次以“0.1”为名确立了项目的成熟度坐标——SELinux 让核心文件命令在强制访问控制环境下可用,性能优化让高频命令具备与 GNU 抗衡的实测基准,GNU 测试通过率跃升至 84.46% 则为兼容性提供了可量化的证据。对于开发者,本版本同时给出了一个高质量参考:uucore的模块化抽象、thiserror错误统一、泛型特化热路径与 RAII 资源管理(FsCreateContext)都是值得借鉴的 Rust 工程范式。对于使用者,在 Ubuntu 等发行版逐步评估 Rust coreutils 的背景下,0.1.0 是值得实测验证的关键起点。

说明:本文数据与结论均以 docs/src/release-notes/0.1.0.md 为骨架,并结合本仓库 src/uucore/src/lib/features/selinux.rs、src/uu/cp/src/cp.rs、src/uu/cat/src/cat.rs、src/uu/seq/src/seq.rs、docs/src/performance.md 等源码与文档佐证;性能与兼容性数据均来自发布说明原文,未经独立基准复现的结论已按原文档口径转述。

【免费下载链接】coreutilsCross-platform Rust rewrite of the GNU coreutils项目地址: https://gitcode.com/GitHub_Trending/co/coreutils

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/12 4:05:22

LunaTranslator:3条命令跑通日文视觉小说实时翻译

LunaTranslator:3条命令跑通日文视觉小说实时翻译 【免费下载链接】LunaTranslator 视觉小说翻译器 / Visual Novel Translator 项目地址: https://gitcode.com/GitHub_Trending/lu/LunaTranslator LunaTranslator 是一个视觉小说翻译器,直接Hook…

作者头像 李华
网站建设 2026/9/12 4:02:52

Python数据处理与分析:从基础到实战技巧

1. Python数据处理与分析的核心价值在当今数据驱动的时代,高效处理和分析数据已成为各行业从业者的必备技能。Python凭借其丰富的生态系统和易用性,已经成为数据处理领域的首选工具。我使用Python处理数据已有8年时间,从最初的几MB CSV文件到…

作者头像 李华
网站建设 2026/9/12 4:02:45

App内测分发效率提升与蒲公英平台实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/12 4:01:02

Hunyuan3D-2:3步从一张图片到高保真带纹理3D资产

Hunyuan3D-2:3步从一张图片到高保真带纹理3D资产 【免费下载链接】Hunyuan3D-2 High-Resolution 3D Assets Generation with Large Scale Hunyuan3D Diffusion Models. 项目地址: https://gitcode.com/GitHub_Trending/hu/Hunyuan3D-2 做游戏、搭VR场景时&am…

作者头像 李华
网站建设 2026/9/12 4:00:13

BLE主机调试实战:芯科EFR32日志打印踩坑与异步化改造

前阵子调一个基于芯科 EFR32BG22 的 BLE 主机项目,功能本身不算复杂:扫描外设、发起连接、读特征值、接收通知。真正让我头疼的不是协议栈,而是调试过程——每次插上调试器打开 LOG,设备就像被下了咒一样乱套;关掉 LOG…

作者头像 李华