全部 Rust 文章

文章配图:介绍如何用 Rust、RemoteFs 和 FUSE 把 SFTP、S3、WebDAV、Kubernetes 等远程存储挂载成本地文件系统,以及 UID、GID 和权限映射中的实际问题。

用 Fusibile 把远程文件系统挂载到本地

介绍如何用 Rust、RemoteFs 和 FUSE 把 SFTP、S3、WebDAV、Kubernetes 等远程存储挂载成本地文件系统,以及 UID、GID 和权限映射中的实际问题。

SFTP 客户端可以下载文件,S3 客户端可以列出对象,WebDAV 客户端可以创建 目录。但如果我只想运行下面这条命令呢?ls ~/remote

发布于 · 约 6 分钟阅读

文章配图:从 Future、Pin、Poll、Context 和 Waker 入手,亲手实现两个简易运行时,理解异步 Rust 的执行与唤醒机制。

异步 Rust 原理:从 Future 到简易运行时

从 Future、Pin、Poll、Context 和 Waker 入手,亲手实现两个简易运行时,理解异步 Rust 的执行与唤醒机制。

很多 Rust 开发者每天都会写异步代码:给函数加上 async,在调用处写下 .await,再把程序交给 Tokio。不过,这些语法背后究竟发生了什么?这篇文章不从运行时的完整工程实现讲起,而是沿着

发布于 · 约 9 分钟阅读

文章配图:用 GlobalAlloc 实现可嵌入 Rust 应用的内存泄漏追踪器,讲清递归防护、调用符号归因,以及它为何只适合调试。

用 Leaktracer 追踪 Rust 内存分配

用 GlobalAlloc 实现可嵌入 Rust 应用的内存泄漏追踪器,讲清递归防护、调用符号归因,以及它为何只适合调试。

前几天,我在一个 Rust 应用里碰到了内存问题。项目很大,进程占用的内存 不断增长,累计分配量甚至到了数百 GB,我却一直找不到泄漏来自哪里。我当然知道 valgrind、heaptrack 这类工具。不过这次我更想要一个能直接 嵌进应用、接入成本又很低的方案。既然 Rust 允许我们实现自己的分配器, 不妨从这里下手。

发布于 · 约 11 分钟阅读

文章配图:在 Rust 结构体中存放不同 trait 实现时,比较 Box<dyn Trait>、泛型和枚举封装在条件类型、性能与库 API 上的取舍。

Rust 结构体中该用 trait 对象还是泛型

在 Rust 结构体中存放不同 trait 实现时,比较 Box<dyn Trait>、泛型和枚举封装在条件类型、性能与库 API 上的取舍。

假设我们有一个 Greet trait,以及两种不同的实现:

发布于 · 约 5 分钟阅读

文章配图:一次 Solana 验证器内存优化带来的 Rust 实战经验:如何用 Arc、切片和 Bytes 避免 Vec<u8> 深拷贝。

Rust 内存瘦身:别再随手克隆 Vec<u8>

一次 Solana 验证器内存优化带来的 Rust 实战经验:如何用 Arc、切片和 Bytes 避免 Vec<u8> 深拷贝。

我也参与 Solana 验证器的开发,主要为 Solana RPC 节点编写一些定制模块。 先别因为 Solana 就关掉页面:这篇文章讨论的是 Rust,而不是区块链。前段时间,一位同事给我看了一条 X 帖子。帖子介绍了 Solana 验证器的一次 大幅优化:QUIC 传输层的内存占用从 2.6 GB 降到了 124 MB。

发布于 · 约 7 分钟阅读

文章配图:逐个认识 Rust std::mem 模块中的内存工具,从 drop、swap 和判别值,到 transmute、zeroed 与 MaybeUninit 的安全边界。

Rust std::mem 模块漫游

逐个认识 Rust std::mem 模块中的内存工具,从 drop、swap 和判别值,到 transmute、zeroed 与 MaybeUninit 的安全边界。

一个不太常用的模块Rust 的 std::mem 总让我觉得有点 神秘。一天晚上十点,我随手翻起标准库文档,想看看当前都有哪些主要模块,结果在 其中发现了

发布于 · 约 10 分钟阅读

文章配图:用 CMake、include_bytes! 和 libloading,把 C 共享库嵌入 Rust 二进制,并在运行时提取和加载。

在 Rust 二进制中嵌入共享库并动态加载

用 CMake、include_bytes! 和 libloading,把 C 共享库嵌入 Rust 二进制,并在运行时提取和加载。

为什么要这样做前一篇文章里,我写过如何在 Rust 项目中 内置 C/C++ 依赖: 先构建静态库,再把它链接进 Rust 库。

发布于 · 约 10 分钟阅读

文章配图:从 src crate、build.rs 到静态库打包,完整讲解如何在 Rust 项目中内置 C/C++ 依赖,并处理只生成动态库的复杂场景。

Rust 项目如何内置 C/C++ 依赖

从 src crate、build.rs 到静态库打包,完整讲解如何在 Rust 项目中内置 C/C++ 依赖,并处理只生成动态库的复杂场景。

如果你用过 native-tls,大概已经间接接触过 vendoring。这个 crate 为 Rust 提供了一层 TLS 抽象;因为它比 rustls 出现得早, 在 Linux 上必须依赖 OpenSSL。麻烦在于,OpenSSL 是 C 库,而 C 项目通常依靠动态链接。Rust 开发者却更愿意把 依赖静态链接进二进制:动态库会让程序换一台机器就可能无法运行,发布可执行文件也

发布于 · 约 11 分钟阅读

文章配图:从匹配优先级、逐行分词到 Include 指令,记录我用 Rust 和 nom 实现 SSH 配置解析器时踩过的坑。

用 Rust 写 SSH 配置解析器,没那么简单

从匹配优先级、逐行分词到 Include 指令,记录我用 Rust 和 nom 实现 SSH 配置解析器时踩过的坑。

你有没有过这种经历:刚开一个项目时觉得没什么难的,真正动手以后, 才发现自己把问题想简单了?这篇文章讲的就是 ssh2-config 的实现过程。 它是一个用 Rust 解析 SSH 配置文件的库,这一路还会碰到 nom 以及 SSH 配置本身那些不那么符合直觉的规则。我为什么要写它?因为很多

发布于 · 约 10 分钟阅读

文章配图:在 Rust 中手动构建 Tokio 多线程运行时,并用 core_affinity 将工作线程绑定到指定 CPU 核心。

用 core_affinity 为 Tokio 运行时指定 CPU 核心

在 Rust 中手动构建 Tokio 多线程运行时,并用 core_affinity 将工作线程绑定到指定 CPU 核心。

有些应用把性能压到极致时,不能再把线程调度完全交给操作系统, 而是需要明确指定进程可以使用哪些 CPU 核心。比如,我们可能想为某个进程 预留一组核心,也可能希望按服务拆分服务器上的核心资源。在 Tokio 应用里,可以借助 Rust crate core_affinity 完成这件事。配置依赖

发布于 · 约 4 分钟阅读

文章配图:从一个看似简单的范围字符串解析需求出发,拆解 Rust 泛型 trait 约束,并比较两种绕过不稳定 Step 的实现。

Rust 泛型范围解析器:绕过不稳定的 Step

从一个看似简单的范围字符串解析需求出发,拆解 Rust 泛型 trait 约束,并比较两种绕过不稳定 Step 的实现。

简单需求,复杂解法前几天,我需要写一个看起来很简单的函数:接收用字符串表示的范围, 返回一个包含范围内所有元素的 Vec。我希望它能支持任意原生数值类型,于是先写出了下面这个函数签名:

发布于 · 约 8 分钟阅读

文章配图:从 windows-sys 依赖配置到连接清理,介绍如何借助 Windows API 连接 SMB 共享,再用 Rust 标准库访问其中的文件。

用 Rust 在 Windows 上访问 SMB 共享

从 windows-sys 依赖配置到连接清理,介绍如何借助 Windows API 连接 SMB 共享,再用 Rust 标准库访问其中的文件。

我开发了 termscp,这是一个功能比较完整的终端文件传输与文件浏览工具, 支持 SCP、SFTP、FTP、S3,现在也支持 SMB。不过,SMB 支持并没有想象中 那么容易实现。在 Linux 和 macOS 上,我已经让 libsmbclient 的 Rust 接口跑了起来,相关实现 可以看 pavao。到了 Windows,我却一直没找到 一份真正说明该怎么做的指南。我在 Stack

发布于 · 约 4 分钟阅读

文章配图:用 rig 在 Rust 里统一 Anthropic、OpenAI、Gemini、Ollama 等多个 LLM 提供商,并在此基础上加上用户和会话记忆。

用 Rust 和 rig 打造与提供商无关的 LLM 层

用 rig 在 Rust 里统一 Anthropic、OpenAI、Gemini、Ollama 等多个 LLM 提供商,并在此基础上加上用户和会话记忆。

每个提供商都有一套自己的客户端这个项目从一开始就有个硬性要求:同时支持多个提供商的模型。大部分和 LLM 打交道的项目,迟早都要面对同时对接多个提供商的问题——比如 Anthropic 和 OpenAI 都得支持,才能满足用户的需求。一旦要支持不止一个 LLM 提供商,问题就不再是“怎么调用这个 API”,而是变成了 “怎么才能不让提供商的细节到处泄漏”。在 s

发布于 · 约 11 分钟阅读

文章配图:一个专门聊 Rust 的中文博客,记录开发经验、踩过的坑,还有一些忍不住想说的看法。

你好,我是春晏。这里聊 Rust。

一个专门聊 Rust 的中文博客,记录开发经验、踩过的坑,还有一些忍不住想说的看法。

你好,我是春晏,也就是 Christian Visintin。我住在意大利,写代码,也做开源项目。之前一直在 blog.veeso.dev 写博客,现在想用中文聊聊 Rust, 于是有了 chunyan.dev。这里专门写 Rust:实际项目里遇到的问题、踩过的坑、折腾出来的东西, 还有一些可能没必要、但我还是想说的看法。

发布于 · 约 1 分钟阅读