uutils coreutils: bản viết lại GNU coreutils bằng Rust
uutils coreutils là bản viết lại từ đầu bộ GNU coreutils bằng Rust, chạy cùng một bộ ls, cp, sort trên Linux, macOS, *BSD, Windows và WASI từ một codebase. Dự án coi bất kỳ khác biệt output nào so với GNU là một bug cần sửa, không phải tính năng — đúng tư duy của một bản thay thế trực tiếp. Đáng dùng nhất khi GNU coreutils không phải mặc định; thay nó trên một Linux GNU đã trưởng thành thì lợi ích nhỏ hơn, vì khoảng cách hành vi chưa về 0.
Bản viết lại GNU coreutils đa nền tảng bằng Rust
uutils coreutils viết lại toàn bộ các chương trình trong GNU coreutils bằng Rust, biên dịch phần lớn thành một binary multicall kiểu BusyBox có tên coreutils. Nó nhắm tới Linux, macOS, các bản BSD, Windows và WASI từ cùng một codebase, nên script viết cho nền tảng này chạy được trên nền tảng khác mà không cần sửa. Theo README của dự án, Ubuntu đã dùng nó làm mặc định kể từ phiên bản 25.10.
Tính năng nổi bật của uutils coreutils
- ✓Đóng gói thành một binary multicall duy nhất (kiểu BusyBox), tự chọn đúng tiện ích dựa trên argv[0] hoặc subcommand — bên cạnh đó vẫn có thể build từng binary riêng lẻ nếu muốn.
- ✓Mục tiêu là khớp chính xác stdout và exit code của GNU, nên script đang kiểm tra exit code hay parse output thường không cần sửa gì.
- ✓Build và chạy trên Linux, macOS, các bản BSD, Windows và WASI (kể cả bản WebAssembly có thể thử ngay trên trình duyệt) từ cùng một codebase Rust.
- ✓Có thể bật backend băm dựa trên OpenSSL cho md5sum, sha1sum, sha224sum, sha256sum, sha384sum, sha512sum và cksum, mặc định static-link, giúp nhanh hơn trên CPU không có SHA-NI.
- ✓Build theo feature flag cho phép chỉ compile những tiện ích cần dùng, ví dụ cargo build --features "base32 cat echo rm" --no-default-features, thay vì build toàn bộ.
- ✓chcon và runcon hỗ trợ SELinux có sẵn sau một feature flag riêng, khi máy build có libselinux và libclang.
- ✓Đi kèm shell completions (bash, fish, zsh qua make; elvish và powershell qua công cụ uudoc) và manpage cùng các binary.
Cài đặt uutils coreutils
Có thể tải binary dựng sẵn từ trang GitHub releases của dự án: tag latest-commit bám theo nhánh main và là bản mà người báo bug nên dùng để test, còn tag latest là bản ổn định, tái lập được, dành cho packager. Nếu bản coreutils-*-gnu (link glibc) không chạy được trên máy bạn, README gợi ý dùng bản coreutils-*-musl thay thế — phiên bản glibc tối thiểu mà dự án nhắm tới khớp với glibc trên runner ubuntu-latest của GitHub Actions. Build từ source cần Rust (cargo, rustc) và tùy chọn thêm GNU Make. cargo build --release compile bộ tiện ích cốt lõi thành một binary multicall tên coreutils; thêm --profile=release-small để giảm kích thước, hoặc --features windows / --features unix để build thêm các tiện ích riêng cho từng nền tảng. cargo install --path . --locked cài vào thư mục bin của Cargo ($HOME/.cargo/bin) nhưng không cài manpage hay shell completion — muốn có các thứ đó thì dùng make install (hoặc sudo -E make install), lệnh này cũng cài sẵn completion cho bash, fish và zsh. README không nhắc tới trình quản lý gói hệ điều hành như apt, Homebrew hay một installer riêng cho Windows — cách cài chỉ gồm binary dựng sẵn, Cargo, hoặc Make.
Dùng uutils như một thay thế trực tiếp cho GNU
Sau khi cài, mỗi tiện ích hoạt động giống hệt bản GNU cùng tên — ls, cp, sort... nhận cùng flag và cho ra cùng stdout, cùng exit code, đúng mục tiêu mà README nêu ra (bất kỳ sai khác nào cũng bị coi là bug). Nếu chưa muốn ghi đè lên binary GNU sẵn có trên hệ thống trong lúc thử nghiệm, make PROG_PREFIX=uu- install sẽ cài mọi thứ dưới tên như uu-ls, uu-cp; còn make MULTICALL=y install cài một binary multicall duy nhất, tự phân luồng theo cách nó được gọi, kiểu BusyBox. Dự án cũng ghi rõ một số extension có chủ đích vượt ra ngoài phạm vi khớp GNU — --progress là ví dụ được nêu — cho những trường hợp bám sát GNU tuyệt đối sẽ bỏ lỡ một tính năng hữu ích.
Ưu điểm của bản triển khai bằng Rust
- ✓Một codebase Rust duy nhất chạy giống hệt trên Linux, macOS, các bản BSD, Windows và WASI — không cần nhánh script riêng cho GNU, BSD hay Windows.
- ✓Các crate theo từng tiện ích, build theo feature flag, cho phép chỉ compile base32 cat echo rm mà bỏ qua các tiện ích còn lại.
- ✓Static linking, kể cả backend băm OpenSSL tùy chọn, giữ bản triển khai gọn trong một binary nhỏ, không phải lùng thư viện runtime.
- ✓Các đảm bảo an toàn bộ nhớ của Rust loại trừ hẳn một nhóm lỗi như tràn bộ đệm và use-after-free, những thứ mà coreutils viết bằng C phải tự canh gác thủ công.
- ✓Đủ trưởng thành để trở thành coreutils mặc định của Ubuntu kể từ bản 25.10, theo README của dự án.
Hạn chế hiện tại và tính năng còn thiếu
- △Chính README thừa nhận "một số option có thể còn thiếu hoặc hành vi có thể khác" so với GNU — độ khớp hành vi tuyệt đối với mọi flag chưa đạt được.
- △README không nêu con số phần trăm test suite GNU đã pass, nên không thể kiểm chứng độ khớp hiện tại chỉ từ trang repo — nên tự kiểm tra trang test-coverage trong user manual trước khi phụ thuộc vào nó cho production.
- △cargo install không cài manpage hay shell completion — muốn có cần dùng make install riêng hoặc thao tác thủ công qua uudoc.
- △Hỗ trợ SELinux (chcon, runcon) cần có libselinux và libclang trên máy build, thêm bước setup mà người không dùng SELinux sẽ không muốn bận tâm.
- △Tăng tốc checksum bằng OpenSSL là tùy chọn lúc build chứ không phải mặc định, và README ghi rõ nó không có tác dụng trên Windows.
Lựa chọn thay thế đáng cân nhắc
Khi nào nên chọn uutils coreutils
Chọn uutils coreutils khi bạn cần cùng một bộ tiện ích Unix cốt lõi hoạt động giống hệt nhau trên Linux, macOS, Windows và WASI từ một toolchain duy nhất — pipeline CI, script build đa nền tảng, hay target nhúng khó cross-compile toolchain C của GNU là những trường hợp hợp lý nhất. Nếu bạn chỉ chạy Linux với GNU coreutils có sẵn và không có nhu cầu đa nền tảng hay nhúng gì, thì đổi sang uutils gần như chẳng có lý do ngoài tò mò hoặc muốn binary multicall gọn hơn.
Câu hỏi thường gặp
uutils coreutils đã triển khai đầy đủ các chương trình chuẩn của GNU coreutils, dù README ghi rõ một số option có thể còn thiếu hoặc hành vi khác với bản gốc GNU. Việc Ubuntu dùng nó làm mặc định từ bản 25.10 là tín hiệu đã dùng thực tế trong production, nhưng nên kiểm tra hành vi từng flag cụ thể trước khi phụ thuộc vào nó cho automation quan trọng.
uutils coreutils chạy trên Linux, macOS, các bản BSD, Windows và WASI từ cùng một codebase Rust, và dự án còn phát hành bản WebAssembly có thể thử ngay trên trình duyệt mà không cần cài gì.
uutils coreutils có sẵn dưới dạng binary dựng sẵn từ trang GitHub releases (tag latest-commit bám nhánh main, tag latest là bản ổn định), hoặc bạn tự build bằng cargo build --release hay cargo install --path . --locked, cần có cargo và rustc của Rust.
Đó chính là mục tiêu của dự án: uutils coreutils nhắm khớp chính xác stdout và exit code của GNU, và bất kỳ khác biệt nào so với GNU đều bị coi là bug chứ không phải chủ đích thiết kế. Tuy vậy độ khớp tuyệt đối cho mọi flag và edge case thì chưa được đảm bảo.
uutils coreutils đã trở thành mặc định trên Ubuntu kể từ phiên bản 25.10, theo README của dự án, thay thế vị trí của GNU coreutils trong bản phát hành đó.
uutils coreutils dùng giấy phép MIT. Đây là giấy phép thoáng hơn so với GNU coreutils gốc, vốn dùng giấy phép GPL 3.0 trở lên — đáng lưu ý nếu khả năng tương thích giấy phép ảnh hưởng tới cách bạn phân phối dự án của mình.
Vấn đề mà uutils coreutils giải quyết
ls, cp, sort... của GNU coreutils là chương trình C gắn chặt với glibc và các API đặc thù Unix, nên một script chạy tốt trên Linux thường cần công cụ khác, một lớp tương thích, hoặc WSL mới chạy tương tự trên Windows; còn cross-compile toolchain C đó cho WASI hay các target lạ là cả một bài toán riêng. uutils coreutils sinh ra để lấp đúng khoảng trống đó: một codebase Rust, một hệ build, output và exit code khớp với GNU, chạy nguyên bản trên những nền tảng mà GNU coreutils chưa từng được build cho.
Trường hợp sử dụng tốt nhất
- •Dựng image Docker tối giản hoặc hệ Linux nhúng, nơi một binary multicall nhỏ gọn có lợi hơn cài cả gói GNU đầy đủ.
- •Chạy cùng một shell script không sửa đổi trên Linux, macOS và Windows mà không cần đổi sang tiện ích riêng của từng nền tảng.
- •Cross-compile userland cho target WASI hoặc WebAssembly — nơi toolchain C của GNU coreutils khó khớp vào.
- •Chọn dự án này làm đóng góp Rust đầu tiên — mỗi tiện ích nằm trong một crate uu_UTILNAME nhỏ riêng biệt.
Repo liên quan
coreutils có đáng để bạn bỏ thời gian?
ChatGPT, Claude và Perplexity đều đọc được trang này. Hỏi thử xem họ nghĩ gì về coreutils.
