Danh sách bài viết

Bài 11: Cài Rust Trên Linux Bằng rustup

Bài 11 của series Rust Cơ Bản — hướng dẫn cài Rust trên Linux bằng rustup chính thức cho cả 3 họ distro (Ubuntu/Debian, Fedora/RHEL, Arch). Đi từ lý do nên tránh apt install rustc, cài build-essential cho linker, chạy script rustup-init, cấu hình PATH theo shell, verify, build hello world. Kèm lưu ý đặc biệt cho Alpine (musl), WSL2 và Docker base image.

09/06/2026
10 phút đọc
2 lượt xem
1

Mục Tiêu Bài Học

Sau bài học, bạn sẽ:

  • Hiểu vì sao nên cài Rust bằng rustup thay vì apt install rustc / dnf install rust / pacman -S rust.
  • Cài được build dependencies cần thiết (GCC/Clang + pkg-config + openssl-dev) cho 3 họ distro phổ biến: Ubuntu/Debian, Fedora/RHEL, Arch Linux.
  • Chạy đúng lệnh rustup-init chính thức từ sh.rustup.rs và hiểu từng flag của curl.
  • Chọn đúng option lúc cài (default / customize / cancel) cho người mới.
  • Cấu hình PATH qua ~/.cargo/env cho bash, zsh, và fish; verify bằng rustc, cargo, rustup show.
  • Biên dịch và chạy được chương trình Rust đầu tiên qua cargo new + cargo run.
  • Biết các lưu ý đặc biệt khi cài trong Docker, Alpine (musl libc), và WSL2.

Bài này áp dụng cho cả x86_64 (host triple x86_64-unknown-linux-gnu) và ARM64/aarch64 (host triple aarch64-unknown-linux-gnu, dùng cho Raspberry Pi 4/5, AWS Graviton, Ampere Altra server). rustup tự detect kiến trúc, bạn không phải chọn thủ công.

2

Tại Sao Không Dùng apt/dnf/pacman Cài Rust

Trên Linux, hầu hết distro đều có gói rustc trong repository chính (Ubuntu/Debian apt, Fedora dnf, Arch pacman). Cài bằng package manager nghe có vẻ "đúng cách Linux", nhưng có một vấn đề lớn: version trong repo distro luôn cũ hơn upstream nhiều tháng đến vài năm.

Ví dụ thực tế tại thời điểm viết bài (Rust stable đã ở 1.83+):

  • Ubuntu 22.04 LTS (Jammy) — apt install rustc cho ra rustc 1.75, cách bản mới nhất gần 1 năm. Thiếu nhiều API stdlib và không hỗ trợ Rust 2024 edition.
  • Debian 12 (Bookworm) — còn cũ hơn, rustc 1.63.
  • Fedora 39rustc 1.74, đỡ hơn nhưng vẫn không phải mới nhất.
  • Arch — đặc biệt: gói rust trong repo extra khá mới (Arch là rolling release), thường chỉ chậm vài ngày so với upstream. Nhưng vẫn không có cơ chế switch toolchain.

rustup giải quyết toàn bộ vấn đề trên. Đây là toolchain manager chính thức của Rust team, vai trò tương tự nvm cho Node hay pyenv cho Python. Cụ thể, rustup cho phép:

  • Luôn có version stable mới nhất, update qua 1 lệnh rustup update.
  • Cài song song nhiều channel: stable, beta, nightly. Switch qua lại bằng một lệnh.
  • Pin version Rust riêng cho từng project (file rust-toolchain.toml).
  • Thêm component bổ trợ: clippy (lint), rustfmt (format), rust-analyzer (LSP), llvm-tools-preview.
  • Thêm target cross-compile, ví dụ wasm32-unknown-unknown để build WebAssembly hay aarch64-unknown-linux-musl để build cho ARM server.

Khuyến nghị tuyệt đối là dùng rustup; chỉ dùng gói distro khi đang đóng gói Rust làm dependency của package OS (rất hiếm cho dev thông thường). Arch có gói AUR tên rustup wrap installer chính thức — vẫn nên dùng script official để đồng nhất với hướng dẫn trong tài liệu Rust.

3

Cài Đặt Build Essentials

Trước khi cài rustup, máy cần có linker C để bước cuối của rustc link object file thành binary. rustc tự không kèm linker — nó gọi cc (GCC hoặc Clang) làm việc đó. Ngoài ra, rất nhiều crate phổ biến trên crates.io (ví dụ openssl, reqwest với native TLS, libsqlite3-sys) cần header của C library hệ thống lúc build, nên ta cài luôn pkg-config + openssl-dev.

Ubuntu / Debian (apt):

sudo apt update
sudo apt install -y build-essential pkg-config libssl-dev curl

Gói build-essential là meta-package gom gcc, g++, make, libc6-dev. curl cài kèm để chạy script rustup ở bước sau.

Fedora / RHEL / CentOS Stream / Rocky Linux (dnf):

sudo dnf install -y gcc gcc-c++ make openssl-devel pkgconfig curl

Hoặc gọn hơn dùng group: sudo dnf groupinstall -y "Development Tools" rồi cài thêm openssl-devel pkgconfig.

Arch Linux / Manjaro / EndeavourOS (pacman):

sudo pacman -Syu --needed base-devel openssl pkgconf curl

base-devel là group chứa gcc, make, binutils, fakeroot... tương đương build-essential của Debian.

Verify đã có linker bằng cách hỏi cc version:

cc --version
pkg-config --version

Cả hai in ra version là OK — sang bước tiếp theo.

4

Chạy Lệnh Cài rustup

Mở terminal và chạy lệnh chính thức từ rust-lang.org:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

Giải thích từng flag của curl:

  • --proto '=https': chỉ cho phép protocol HTTPS. Nếu server redirect sang HTTP, curl từ chối. Chặn downgrade attack.
  • --tlsv1.2: ép TLS phiên bản 1.2 trở lên, không chấp nhận SSL/TLS cũ.
  • -s (silent): không in progress bar.
  • -S (show-error): vẫn in lỗi khi -s bật.
  • -f (fail): exit non-zero khi HTTP status >= 400 (không in trang lỗi HTML).

Phần | sh nghĩa là pipe nội dung trả về (một shell script tên rustup-init.sh) thẳng vào shell để thực thi. Đây là pattern phổ biến nhưng có vẻ "đáng sợ" với người mới — bạn đang download và chạy script ngay. Bộ Rust team ký + serve qua HTTPS với certificate verify được.

Nếu paranoid về security, hai cách an toàn hơn:

  • Tải về file rồi đọc trước khi chạy:
    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs -o rustup-init.sh
    less rustup-init.sh    # đọc nội dung
    sh rustup-init.sh      # chạy khi đã ưng
  • Tải binary rustup-init đã build sẵn theo platform từ Other Installation Methods và verify checksum SHA-256.

Tuyệt đối không chạy sudo curl ... | sudo sh. Rustup được thiết kế cài vào ~/.cargo~/.rustup trong home directory của user thường, không động vào system path. Chạy với sudo sẽ cài vào /root/.cargo và biến rustup thành unusable với user thường — sai pattern, dễ hỏng permission về sau.

5

Chọn Cấu Hình Lúc Cài

Sau khi lệnh trên chạy, installer in ra welcome message rồi hỏi:

Current installation options:

   default host triple: x86_64-unknown-linux-gnu
     default toolchain: stable (default)
               profile: default
  modify PATH variable: yes

1) Proceed with standard installation (default - just press enter)
2) Customize installation
3) Cancel installation
>

Ba lựa chọn:

  • 1 — Proceed with standard installation: cài toolchain stable mới nhất, profile default (gồm rustc, cargo, rust-std, rust-docs, rustfmt, clippy), tự thêm vào PATH. Người mới chọn 1 — nhấn Enter.
  • 2 — Customize installation: cho phép chọn host triple khác, đổi toolchain (beta/nightly), đổi profile (minimal bỏ docs/clippy, complete thêm mọi thứ), tắt sửa PATH. Chỉ cần khi bạn biết mình muốn gì.
  • 3 — Cancel installation: thoát.

Phần default host triple rustup tự detect dựa trên uname -m:

  • Server / desktop / laptop x86_64 thông thường: x86_64-unknown-linux-gnu.
  • ARM64 SBC, AWS Graviton, Ampere server, Raspberry Pi 4/5 64-bit: aarch64-unknown-linux-gnu.
  • 32-bit ARM (Raspberry Pi cũ, embedded board): armv7-unknown-linux-gnueabihf.
  • Alpine Linux: x86_64-unknown-linux-musl (vì Alpine dùng musl libc thay glibc — xem bước 9).

Sau khi chọn 1, installer download rustc + cargo + toolchain stable (khoảng 200-300MB), mất 1-3 phút tuỳ tốc độ mạng. Khi xong sẽ thấy:

Rust is installed now. Great!

To get started you may need to restart your current shell.
This would reload your PATH environment variable to include
Cargo's bin directory ($HOME/.cargo/bin).

To configure your current shell, you need to source
the corresponding env file under $HOME/.cargo/env.

This is usually done by running one of the following (note the leading DOT):
. "$HOME/.cargo/env"            # For sh/bash/zsh/ash/dash/pdksh
source "$HOME/.cargo/env.fish"  # For fish
6

Cấu Hình PATH Theo Shell

Installer phát hiện shell hiện tại của bạn (qua biến $SHELL) rồi tự ghi một dòng . "$HOME/.cargo/env" vào file profile tương ứng:

  • bash (default trên Ubuntu/Debian/Fedora) — ghi vào ~/.bashrc~/.profile.
  • zsh (default trên một số distro mới, nhiều dev đổi sang) — ghi vào ~/.zshenv hoặc ~/.zshrc.
  • fish — installer ghi vào ~/.config/fish/conf.d/rustup.fish nếu phát hiện được.

File ~/.cargo/env đơn giản chỉ thêm $HOME/.cargo/bin vào $PATH — nơi chứa các binary cargo, rustc, rustup, clippy-driver, rustfmt.

Có hai cách để PATH có hiệu lực ngay:

Cách 1 — source thủ công cho shell hiện tại:

source $HOME/.cargo/env

Cách 2 — đóng terminal và mở terminal mới: shell mới đọc lại profile, tự pick up PATH.

Verify PATH đã có ~/.cargo/bin:

echo $PATH | tr ':' '\n' | grep cargo

Output mong đợi:

/home/<username>/.cargo/bin

Lưu ý cho fish shell: nếu installer không tự ghi được (ví dụ bạn chạy installer khi shell mặc định là bash rồi mới đổi sang fish), thêm thủ công:

set -U fish_user_paths $HOME/.cargo/bin $fish_user_paths

Biến fish_user_paths là universal — chỉ cần set 1 lần, tồn tại qua mọi session fish sau đó.

7

Verify Cài Đặt

Chạy lần lượt 4 lệnh sau, đối chiếu output:

rustc --version
cargo --version
rustup --version
rustup show

Output mẫu (version thực tế có thể mới hơn):

$ rustc --version
rustc 1.83.0 (90b35a623 2024-11-26)

$ cargo --version
cargo 1.83.0 (5ffbef321 2024-10-29)

$ rustup --version
rustup 1.27.1 (54dd3d00f 2024-04-24)
info: This is the version for the rustup toolchain manager, not the rustc compiler.
info: The currently active `rustc` version is `rustc 1.83.0 (90b35a623 2024-11-26)`

$ rustup show
Default host: x86_64-unknown-linux-gnu
rustup home:  /home/<username>/.rustup

installed toolchains
--------------------
stable-x86_64-unknown-linux-gnu (active, default)

active toolchain
----------------
name: stable-x86_64-unknown-linux-gnu
active because: it's the default toolchain
installed targets:
  x86_64-unknown-linux-gnu

Nếu cả 4 lệnh trả về kết quả tương tự (số version có thể khác — Rust release stable mới mỗi 6 tuần), cài đặt thành công. Nếu lệnh báo command not found, kiểm tra lại bước 6 (PATH chưa có hiệu lực — chạy source $HOME/.cargo/env hoặc mở terminal mới).

Để ý dòng Default host trong output rustup show — xác nhận rustup detect đúng kiến trúc. Trên AWS Graviton hoặc Raspberry Pi 64-bit, dòng đó sẽ là aarch64-unknown-linux-gnu.

8

Compile "Hello Rust"

Verify cuối cùng — build và chạy một chương trình thật. Cargo (đi kèm rustup) là build system + package manager all-in-one của Rust:

cargo new hello && cd hello && cargo run

Lệnh này làm 3 việc:

  • cargo new hello: tạo folder hello/ với Cargo.toml (manifest) + src/main.rs (entry point) + khởi tạo git repo.
  • cd hello: chuyển vào folder vừa tạo.
  • cargo run: biên dịch src/main.rs ra binary trong target/debug/hello rồi chạy nó.

Nội dung src/main.rs mặc định:

fn main() {
    println!("Hello, world!");
}

Output mong đợi:

$ cargo run
   Compiling hello v0.1.0 (/home/<username>/hello)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 1.23s
     Running `target/debug/hello`
Hello, world!

Thấy dòng Hello, world! nghĩa là toàn bộ pipeline đã chạy: rustc compile được, ld (từ build-essential / gcc) link được, cargo chạy được binary. Lần build đầu tiên chậm (~1-3 giây cho project rỗng); các lần sau gần như instant nhờ incremental compilation.

Bonus: thử cargo run --release để build optimized (chậm hơn lần đầu, binary nhanh hơn nhiều). Output binary nằm ở target/release/hello.

9

Lưu Ý Cho Docker / Alpine / WSL2

Ba môi trường "Linux nhưng có gì đó khác" thường gặp:

Docker — không cần cài thủ công. Docker Hub có image chính thức rust:1.83-slim (hoặc bất kỳ version nào) đã có sẵn rustup + cargo + toolchain stable, dựa trên Debian slim. Dùng trong Dockerfile:

FROM rust:1.83-slim AS builder
WORKDIR /app
COPY . .
RUN cargo build --release

FROM debian:bookworm-slim
COPY --from=builder /app/target/release/myapp /usr/local/bin/myapp
CMD ["myapp"]

Pattern multi-stage này tạo image runtime nhỏ (~80MB) vì image cuối không kèm toolchain Rust. Nếu muốn nhỏ hơn nữa, dùng FROM gcr.io/distroless/cc-debian12 hoặc Alpine + musl (xem dưới).

Alpine Linux — dùng musl libc thay vì glibc như Debian/Ubuntu/Fedora. Nghĩa là binary built cho x86_64-unknown-linux-gnu không chạy trên Alpine. Bạn cần target musl:

# Trên máy dev (glibc), cài Alpine packages cần thiết để cross-build
apk add --no-cache musl-dev gcc

# Hoặc dùng rustup thêm target musl
rustup target add x86_64-unknown-linux-musl

# Build static binary cho Alpine
cargo build --release --target x86_64-unknown-linux-musl

Binary kết quả ở target/x86_64-unknown-linux-musl/release/myappstatic (link tất cả thư viện vào), copy thẳng vào image Alpine chạy được, không cần install dependency.

WSL2 (Windows Subsystem for Linux) — về bản chất là một VM Linux chạy trong Hyper-V, distro mặc định thường là Ubuntu. Cài Rust trong WSL2 hoàn toàn giống cài trên Ubuntu thật — chạy lệnh ở các bước 3-8 trong terminal WSL. Không dùng installer Windows (rustup-init.exe) cho code chạy trong WSL — đó là build dành cho Windows, sinh ra binary .exe không native trên WSL filesystem.

Mẹo nhỏ cho WSL2: lưu code project trong filesystem Linux của WSL (ví dụ ~/projects/) chứ không phải trong /mnt/c/Users/.... Cargo build trên /mnt/c chậm gấp 5-10 lần do overhead của 9P filesystem bridge.

10

Tổng Kết

  • Tránh cài Rust qua apt / dnf / pacman — version trong repo distro luôn cũ hơn upstream (Ubuntu 22.04 còn rustc 1.75 khi stable đã 1.83+). Dùng rustup để luôn có version mới và switch toolchain dễ.
  • Trước khi cài rustup, cài build deps cho từng distro family: build-essential pkg-config libssl-dev (apt), gcc gcc-c++ openssl-devel pkgconfig (dnf), base-devel openssl pkgconf (pacman).
  • Lệnh cài: curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh. Không dùng sudo — rustup cài vào ~/.cargo~/.rustup của user thường.
  • Người mới chọn option 1 (Proceed with standard installation). rustup tự detect host triple x86_64-unknown-linux-gnu hoặc aarch64-unknown-linux-gnu tuỳ kiến trúc.
  • PATH cấu hình tự động qua ~/.cargo/env, source vào ~/.bashrc / ~/.zshrc. Fish shell cần thêm thủ công bằng set -U fish_user_paths $HOME/.cargo/bin $fish_user_paths.
  • Verify: rustc --version, cargo --version, rustup --version, rustup show.
  • Hello world: cargo new hello && cd hello && cargo run.
  • Docker: dùng image rust:1.83-slim có sẵn rustup. Alpine: cần target x86_64-unknown-linux-musl + apk add musl-dev gcc. WSL2: cài như Ubuntu thường, để code trong filesystem Linux của WSL chứ không phải /mnt/c.
11

Bài Tập Củng Cố

Tự trả lời, đáp án ở cuối:

  1. Trên Ubuntu 22.04, apt install rustc cho ra version bao nhiêu, và vì sao điều này có thể là vấn đề khi học Rust theo tài liệu mới?
  2. Trước khi cài rustup, vì sao cần cài build-essential (Ubuntu) / base-devel (Arch)? Nếu bỏ qua bước này, lỗi sẽ xuất hiện ở giai đoạn nào trong quá trình build?
  3. Vì sao không nên chạy lệnh cài rustup với sudo? Giả sử lỡ chạy, hậu quả là gì?
  4. Trên AWS Graviton EC2 (ARM64), output rustup show sẽ in Default host là gì? Khác với máy x86_64 thông thường ở chỗ nào?
  5. Bạn cần build một binary Rust để chạy trên Alpine Linux image (musl). Lệnh nào để thêm target tương ứng và build?
Đáp án
  1. Ubuntu 22.04 LTS có rustc 1.75 trong repo, cách stable upstream (1.83+) gần 1 năm. Vấn đề: nhiều API stdlib và crate mới yêu cầu MSRV (Minimum Supported Rust Version) cao hơn — code mẫu trong sách Rust mới hoặc trên crates.io có thể không compile. Quan trọng hơn, Rust 2024 edition cần rustc 1.85+, không có sẵn trong gói distro.
  2. rustc không kèm linker — bước cuối cần cc (gcc/clang) để link object file thành executable. Nếu thiếu, lệnh cargo build chạy được phần compile nhưng fail ở bước link với message kiểu linker `cc` not found hoặc error: linking with `cc` failed. Cài build-essential / base-devel đem theo gcclibc6-dev, fix triệt để.
  3. Rustup được thiết kế cài vào ~/.cargo + ~/.rustup của user thường, không phải hệ thống. Chạy sudo sẽ cài vào /root/.cargo, user thường không thấy được, PATH không đúng. Tệ hơn: file owned bởi root, sau này user thường muốn rustup update sẽ báo permission denied; fix phải chown lại hoặc xoá rồi cài lại đúng cách.
  4. Trên Graviton: Default host: aarch64-unknown-linux-gnu. Khác máy x86_64 (x86_64-unknown-linux-gnu) ở phần kiến trúc CPU. Binary build trên Graviton mặc định là ARM64 native, không chạy được trên Intel/AMD x86_64 và ngược lại. Muốn cross-compile cần rustup target add target khác rồi cargo build --target=....
  5. rustup target add x86_64-unknown-linux-musl để thêm target, sau đó cargo build --release --target x86_64-unknown-linux-musl. Trên Ubuntu/Debian có thể cần thêm sudo apt install musl-tools để có linker musl. Binary output là static, copy thẳng vào Alpine image (hoặc scratch) chạy được mà không cần install gì thêm.
12

Bài Tiếp Theo

Bài 12: Cài Rust Trên Windows: rustup-init.exe + MSVC — chuyển sang Windows: download rustup-init.exe từ rustup.rs, chọn host triple x86_64-pc-windows-msvc, cài Visual Studio 2022 Build Tools (Desktop development with C++) làm linker, verify qua PowerShell, và so sánh nhanh với phương án WSL alternative.