#file-path #process-file #linux-process

nightly linux-support

提供对命名空间、cgroups、进程、调度、解析/proc、解析/sys、信号、超线程、CPU、NUMA节点、不寻常的文件描述符、PCI设备以及更多功能的全面Linux支持

22个版本

0.0.25 2021年5月28日
0.0.24 2021年5月27日
0.0.21 2021年4月29日
0.0.12 2021年3月1日
0.0.0 2020年4月30日

#366 in Unix APIs

Download history 144/week @ 2024-03-31

52 每月下载次数

AGPL-3.0

6.5MB
113K SLoC

linux-support

linux-support 是一个 Rust 库,提供了对 Linux 命名空间、cgroups、进程、调度、解析/proc 和/sys 中的大量文件、信号、超线程、CPU、NUMA 节点、io-uring、io 调度优先级、不寻常的文件描述符(包括 pid 描述符和 userfaultfd)、seccomp BPF 过滤器(包括 Rust 抽象)、PCI 设备、原子文件重命名等功能的支持。

它旨在成为一个全面、强类型且模型良好的库,用于处理 Linux 的非 POSIX 功能,尤其关注作为我开发的一个安全根守护进程的用户空间网络堆栈的支持库。因此,它非常具有倾向性;它乐于使用不安全代码、nightly 功能和 uninitialized()

文件描述符、进程和向量IO紧密集成。

它替代了几个C和Rust库,包括:

它不打算替代 nix,但可以作为 Linux 特定应用程序的替代方案。

支持的功能

  • 汇编代码以获取当前 NUMA 节点和超线程。
  • 能力和权限
  • Cgroups 版本 2
  • 处理CPU和超线程,包括解析 /proc/sys 文件以确定可用性
    • 获取当前超线程和 NUMA 节点
  • 干净的环境变量
    • 解析 /proc//cmdline/proc//environ
    • 支持具有重复名称的环境和环境变量中没有等号的情况。
  • 文件系统
  • inode
  • 解析和验证 Linux 内核命令行(引导命令行)
  • 与 Linux 内核模块协同工作
  • 使用 Syslog 记录日志
    • 例如:将标准错误重定向到 syslog!
  • 内存
    • NUMA,包括 libnuma 的替代品和全面的 NUMA 信息及操作
    • 全面支持超大和巨大页面
    • 快速且与 const 友好的逻辑来获取页面大小,即不是 sysconf(_SC_PAGE_SIZE)
    • 解析 vmstat、numastat 和 meminfo 文件
    • 页面映射洞察
    • 内存映射洞察
    • 虚拟到物理映射和页面映射的解析
    • 读取和写入进程的虚拟内存(参见下面的进程)。
  • 文件系统
    • 挂载和卸载
    • 冻结和解冻
    • Trim
    • 元数据
  • 文件描述符
    • 包括字符设备、目录、epoll、signalfd、eventfd、userfaultfd、路径、pidfd、timerfd、inotify、memfd、POSIX 消息队列、管道、套接字、终端等。
    • 使用 dirfd 和 at() 系统调用执行广泛的目录操作。
    • 原子重命名
    • 内存映射。
    • 写时复制克隆和去重。
    • 为数据和空洞添加扩展查找。
    • 查找文件扩展和稀疏性(例如,用于高效复制)
    • 三种不同的建议文件锁(整个文件、按进程记录以及较新的、更好的按打开文件描述符记录)。
    • copy_file_range.
    • 文件租约。
    • 从仅仅是一个范围到每个文件系统的全面文件同步。
  • Linux 性格
    • 获取任何进程以及当前的。
    • 执行域(旧功能)。
  • 命名空间
  • 优雅和自分组
  • PCI Express
    • 查找设备
    • 甚至与寄存器协同工作
  • 进程、进程组等
    • 解析 /proc/<N>/stat/proc/<N>/statm/proc/<N>/status
    • Linux 特定的 get_program_name
    • 获取会话标识符。
    • 获取进程组标识符。
    • 读取和写入进程的内存。
  • 资源限制
  • SecComp
  • 信号
    • 包括一个健壮、经过深思熟虑的信号处理器,实际上解决了 Linux 设计中的弱点,并将其转换为强类型、正确枚举的变体。
    • 对机器检查异常的支持。
  • 字符串
    • 旨在使与非 UTF8、字节(可能是 ASCII)字符串协同工作更加容易。
    • 对 Linux 程式,如奇怪转义字符串的支持。
    • 对 Linux 字符串数组(如在 /proc/<N>/environ 中找到的)的支持。
    • 主要用于库内部使用。
    • 支持解析和格式化 Linux 在 /proc/sys 中表示数字的多种方式。
  • 尽可能强类型的 syscall 包装器。
  • 全面的终端包装器。
  • 用户和组
    • 包括支持与进程可以拥有的所有 4 个用户标识符和所有 4 个组标识符协同工作(即旧文件系统用户和组 ID)。
    • 初始组
    • 在有需要的地方通过文档化的断言检查 root。
  • 向量
    • 适当的向量 IO,包括文件。
    • 将向量 IO 集成到进程内存中。

目前仅测试了使用 musl libc 的 Linux 系统,但对于 Android、Fuschia 和 Emscripten,支持应通过少量更改成为可能。

crate 的主要架构是 64 位系统,其中 x86-64 是一级架构。然后对 aarch64 和 riscv64 的支持是次要的,对于 powerpc64、mips64 和 sparc64,则是“尽力而为”。

没有计划支持任何 32 位系统。

使用 nightly,因为 Rust 在 4 年后仍然没有稳定重要的功能。

文件描述符模块

这是一个Rust模块,它使用安全的抽象封装了各种类型的文件描述符,包括IPv4 / IPv6套接字、Unix域套接字、epoll、timerfd、signalfd、eventfd、POSIX消息队列、管道、FIFOs、终端(以及串行端口)、字符设备、inotify、fanotify和文件。

信号和终端特别提供了一种广泛且安全的封装。

支持的文件描述符

  • 字符设备。
  • 目录
    • 创建FIFOs、Unix域套接字、字符设备和块设备。
  • epoll。
  • eventfd。
  • fanotify。
  • 文件扩展名用于
    • POSIX和非POSIX分配
    • 文件租约
    • 建议性的整个文件锁
    • 建议性的进程文件记录锁
    • 建议性的打开文件描述符文件记录锁
    • 同步文件范围
    • 复制文件范围
    • 仅同步数据
    • 同步文件系统
    • 预读
  • inotify。
  • memfd(匿名内存支持的文件)。
    • 请参阅file模块。
  • POSIX消息队列(https://linux.die.net/man/7/mq_overview)。
  • 管道和FIFOs(匿名和命名的FIFOs),包括对splice、vmsplice和tee的支持。
  • 进程文件描述符(pidfd,Linux 5.2中新增)。
  • 套接字(TCP、UDP以及Unix域套接字上的等效协议;使用Rust的std::file::File支持sendfile())。
  • 终端(串行端口和调制解调器)。
  • timerfd。
  • std::fs::File的扩展:-
    • SendFile
    • SpliceRecipient
    • SpliceSender
    • memfd
      • 内存映射文件。

此外,还实现了Rust的File的扩展(SendFileSpliceRecipientSpliceSender)。

Unix域套接字

当使用文件路径时

  • 将尽力创建干净的网络套接字文件路径;
  • 确保所有父目录存在;
  • 确保父目录权限设置正确;
  • 删除任何过时的文件;
  • 在释放时(关闭)删除套接字文件路径。

seccomp用于锁定系统调用(尤其是尝试在关闭时删除套接字文件路径)后,上述功能可能无法正确工作。

管道

  • 支持对所有可能的文件描述符使用splice()vmsplice()tee()(包括Rust的std::fs::File)。
  • 为了能够使用epoll与标准输入(stdin),使用pipes_and_fifos::ReceivePipeFileDescriptor::standard_in()
  • 为了能够使用epoll与标准输出(stdout),使用pipes_and_fifos::SendPipeFileDescriptor::standard_out()
  • 为了能够使用epoll与标准错误(stderr),使用pipes_and_fifos::SendPipeFileDescriptor::standard_error()

目前不支持

  • Linux 零拷贝发送(MSG_ZEROCOPY)和接收(SO_ZEROCOPY),主要是因为它们有一个糟糕、漏洞百出的 API。
  • 使用 autobind 的 Unix 域套接字;设置 SO_PASSCRED 套接字选项。
  • 通过 recvmsg() 在 Unix 域套接字上接收凭证。
  • infiniband 套接字。
  • canbus(SocketCAN 套接字和 can4linux http://can-wiki.info/can4linux/man/can4linux_8h_source.html 字符设备驱动程序)。

许可协议

本项目的许可协议为 AGPL-3.0。

依赖关系