Mục lục
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
rustupthay 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-initchính thức từ sh.rustup.rs và hiểu từng flag củacurl. - Chọn đúng option lúc cài (default / customize / cancel) cho người mới.
- Cấu hình PATH qua
~/.cargo/envcho bash, zsh, và fish; verify bằngrustc,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.
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 rustccho rarustc 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 39 —
rustc 1.74, đỡ hơn nhưng vẫn không phải mới nhất. - Arch — đặc biệt: gói
rusttrong 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
stablemới nhất, update qua 1 lệnhrustup 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 hayaarch64-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.
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.
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-sbậ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 và ~/.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.
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
stablemới nhất, profiledefault(gồmrustc,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 (
minimalbỏ docs/clippy,completethê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
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
~/.bashrcvà~/.profile. - zsh (default trên một số distro mới, nhiều dev đổi sang) — ghi vào
~/.zshenvhoặc~/.zshrc. - fish — installer ghi vào
~/.config/fish/conf.d/rustup.fishnế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 đó.
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.
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 folderhello/vớiCargo.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ịchsrc/main.rsra binary trongtarget/debug/hellorồ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.
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/myapp là static (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.
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ònrustc 1.75khi stable đã1.83+). Dùngrustupđể 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ùngsudo— rustup cài vào~/.cargovà~/.rustupcủ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-gnuhoặcaarch64-unknown-linux-gnutuỳ 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ằngset -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-slimcó sẵn rustup. Alpine: cần targetx86_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.
Bài Tập Củng Cố
Tự trả lời, đáp án ở cuối:
- Trên Ubuntu 22.04,
apt install rustccho 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? - 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? - 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ì? - Trên AWS Graviton EC2 (ARM64), output
rustup showsẽ inDefault hostlà gì? Khác với máy x86_64 thông thường ở chỗ nào? - 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
- Ubuntu 22.04 LTS có
rustc 1.75trong 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ầnrustc 1.85+, không có sẵn trong gói distro. rustckhông kèm linker — bước cuối cầncc(gcc/clang) để link object file thành executable. Nếu thiếu, lệnhcargo buildchạy được phần compile nhưng fail ở bước link với message kiểulinker `cc` not foundhoặcerror: linking with `cc` failed. Càibuild-essential/base-develđem theogccvàlibc6-dev, fix triệt để.- Rustup được thiết kế cài vào
~/.cargo+~/.rustupcủa user thường, không phải hệ thống. Chạysudosẽ 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ốnrustup updatesẽ báo permission denied; fix phảichownlại hoặc xoá rồi cài lại đúng cách. - 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ầnrustup target addtarget khác rồicargo build --target=.... 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êmsudo apt install musl-toolsđể có linker musl. Binary output là static, copy thẳng vào Alpine image (hoặcscratch) chạy được mà không cần install gì thêm.
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.
