Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Thiết lập Linux đầy đủ cho lập trình viên

Hướng dẫn đưa máy Ubuntu Desktop mới đến môi trường làm việc có shell, Git, container, IDE, runtime và công cụ cloud. Các lệnh APT áp dụng cho Ubuntu; Fedora, Arch và các distro khác cần dùng package manager tương ứng. Phần Wayland dành riêng cho GNOME, có ghi rõ những khác biệt với KDE.

Chọn công cụ theo dự án: không cần cài mọi IDE hoặc mọi runtime. Đọc yêu cầu phiên bản trong repository trước khi cài. Các khối lệnh chạy trong Bash hoặc Zsh, trừ khối cấu hình được ghi tên riêng. Biến HOME và USER dùng giá trị của phiên đăng nhập; không thay chúng bằng một tài khoản cố định.

1. Chuẩn bị hệ điều hành

Tải ISO từ Ubuntu Desktop, kiểm tra checksum theo hướng dẫn Ubuntu, rồi tạo USB cài đặt. Sao lưu dữ liệu trước khi chia lại phân vùng; chọn mã hóa đĩa nếu cần bảo vệ máy khi thất lạc. Sau cài đặt, kiểm tra Wi-Fi, âm thanh, màn hình ngoài và driver qua Software & Updates → Additional Drivers. Kết nối nguồn trước khi cập nhật firmware hoặc nâng cấp hệ điều hành.

cat /etc/os-release
uname -r
dpkg --print-architecture
printf '%s\n' "$XDG_SESSION_TYPE"
df -h
free -h
sudo apt update
sudo apt upgrade

Hướng dẫn tải binary phía dưới có lựa chọn amd64 hoặc arm64; chọn theo kết quả dpkg --print-architecture. Khởi động lại nếu hệ thống yêu cầu. Trong Settings, chọn múi giờ, bố cục bàn phím, khóa màn hình và chế độ tiết kiệm pin phù hợp.

2. Công cụ CLI và thư viện nền

Nhóm này phục vụ tải file, đọc tài liệu, biên dịch và chẩn đoán mạng. Giữ dấu \ ở cuối dòng; đặt chú thích ngoài danh sách package để lệnh nhiều dòng chạy đúng.

sudo apt install -y \
  ca-certificates curl wget gnupg lsb-release software-properties-common \
  git git-lfs openssh-client unzip zip tar gzip bzip2 xz-utils p7zip-full \
  vim nano build-essential cmake pkg-config \
  net-tools iputils-ping dnsutils nmap traceroute \
  htop ncdu tmux tree jq fzf ripgrep fd-find bat httpie autossh \
  desktop-file-utils fontconfig wl-clipboard xdg-utils

sudo apt install -y \
  python3-dev libssl-dev libffi-dev libbz2-dev libreadline-dev \
  libsqlite3-dev zlib1g-dev liblzma-dev libxml2-dev libxslt1-dev

Nếu package không có candidate, xem apt-cache policy PACKAGE, kiểm tra codename và repository hỗ trợ release đang dùng. Không đổi codename sang release khác để ép cài.

Ubuntu đặt tên executable của bat là batcat, của fd là fdfind. Có thể dùng alias trong phần Zsh cuối bài. Dùng rg, jq, tree, ncdu và tmux để làm việc với codebase lớn; http là executable của HTTPie.

Just, eza và tldr

Just chạy recipe trong justfile. Installer chính thức cho phép cài vào thư mục người dùng:

mkdir -p "$HOME/.local/bin"
curl -fsSL https://just.systems/install.sh -o /tmp/install-just.sh
less /tmp/install-just.sh
bash /tmp/install-just.sh --to "$HOME/.local/bin"
export PATH="$HOME/.local/bin:$PATH"
just --version

eza thêm màu, icon và chế độ cây. Nếu apt-cache policy eza có candidate, dùng sudo apt install eza; nếu chưa có, cài cargo install eza sau phần Rust hoặc theo repository được upstream công bố. Tránh thêm repository không cần thiết chỉ để thay một lệnh liệt kê file.

Sau khi cài Node.js, npm install -g tldr cung cấp ví dụ lệnh ngắn: tldr tar, tldr git. Công cụ hiển thị thông tin hệ thống như Neofetch/Fastfetch là tùy chọn; dùng cat /etc/os-release và uname -r vẫn đủ để xác định môi trường.

3. Zsh, Oh My Zsh, theme và font

sudo apt install -y zsh
zsh --version
chsh -s "$(command -v zsh)"

Đăng xuất rồi đăng nhập để shell mặc định có hiệu lực. Cài Oh My Zsh bằng installer đã đọc:

curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh \
  -o /tmp/install-oh-my-zsh.sh
less /tmp/install-oh-my-zsh.sh
sh /tmp/install-oh-my-zsh.sh

Cài Powerlevel10k và plugin bổ sung. Chạy các lệnh clone một lần; nếu thư mục đã tồn tại thì cập nhật bản đang có.

git clone --depth=1 https://github.com/romkatv/powerlevel10k.git \
  "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k"
git clone --depth=1 https://github.com/zsh-users/zsh-autosuggestions \
  "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/plugins/zsh-autosuggestions"
git clone --depth=1 https://github.com/zsh-users/zsh-syntax-highlighting.git \
  "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting"
git clone --depth=1 https://github.com/zsh-users/zsh-completions \
  "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/plugins/zsh-completions"

Tải JetBrainsMono hoặc Meslo từ Nerd Fonts, giải nén các file font vào ~/.local/share/fonts, rồi chạy fc-cache -fv. Trong terminal chọn font có hậu tố Nerd Font Mono. Với Powerlevel10k, chạy p10k configure sau khi cấu hình theme ở phần 12. Icon ô vuông thường là font chưa được chọn trong profile terminal.

4. SSH và Git

Tạo key và chọn đúng danh tính

Dùng key riêng cho từng tài khoản. Tên dưới đây là nhãn trung tính; đặt passphrase khi ssh-keygen hỏi. Không ghi đè key đã tồn tại.

mkdir -p "$HOME/.ssh"
chmod 700 "$HOME/.ssh"
ssh-keygen -t ed25519 -C "dev-workstation" -f "$HOME/.ssh/id_ed25519_dev"
eval "$(ssh-agent -s)"
ssh-add "$HOME/.ssh/id_ed25519_dev"
ssh-add -l
touch "$HOME/.ssh/config"
chmod 600 "$HOME/.ssh/config"

Thêm block sau vào ~/.ssh/config. Alias giúp chọn key khi có nhiều tài khoản trên cùng dịch vụ:

Host github-dev
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_dev
    IdentitiesOnly yes
    AddKeysToAgent yes

Copy public key bằng wl-copy < ~/.ssh/id_ed25519_dev.pub trên Wayland hoặc đọc file .pub rồi dán vào phần SSH Keys của dịch vụ. Xác minh host fingerprint theo nhà cung cấp trước khi chấp nhận lần kết nối đầu. Kiểm tra bằng ssh -T git@github-dev; GitHub có thể trả exit code 1 dù thông báo xác thực thành công vì không cung cấp shell. Xem GitHub SSH và GitLab SSH.

Private key luôn nằm ngoài repository. Với server cũ cần RSA, tạo key RSA riêng và giới hạn thay đổi thuật toán trong đúng block host; không bật ssh-rsa cho mọi host.

Cấu hình Git

Nhập tên và email mà bạn muốn xuất hiện trong commit, có thể dùng địa chỉ noreply từ dịch vụ Git. Thay hai giá trị mẫu trước khi chạy:

git config --global user.name "TEN_HIEN_THI"
git config --global user.email "DIA_CHI_COMMIT"
git config --global init.defaultBranch main
git config --global core.editor "code --wait"
git config --global push.autoSetupRemote true
git lfs install
git --version
git config --global --list --show-origin

Nếu chưa cài VS Code, dùng vim hoặc nano cho core.editor. Với tài khoản riêng theo dự án, đặt user.name/user.email ở phạm vi repository hoặc dùng includeIf; xem Git setup. Không bật tối ưu fsmonitor hoặc thay compression toàn máy khi chưa đo nhu cầu.

5. Docker và Compose

Docker Engine chạy container trực tiếp trên Linux. Docker Desktop là lựa chọn có GUI và môi trường riêng; chọn một workflow và kiểm tra docker context ls khi dùng nhiều engine. Các lệnh dưới dành cho Engine mới theo Docker Ubuntu.

Nếu máy đã có docker.io, docker-compose, docker-compose-v2, docker-doc, docker-buildx, podman-docker, containerd hoặc runc, đối chiếu gói xung đột và sao lưu dữ liệu trước khi chuyển sang repository Docker. Không gỡ container runtime đang phục vụ workload khác một cách tự động.

sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
  -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
sudo tee /etc/apt/sources.list.d/docker.sources > /dev/null <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo systemctl enable --now docker
sudo docker run --rm hello-world
docker compose version

Nếu chấp nhận quyền quản trị tương đương root của nhóm docker, chạy sudo usermod -aG docker "$USER", đăng xuất/đăng nhập rồi kiểm tra docker run --rm hello-world. Máy cần cách ly quyền có thể chọn rootless Docker. Với Podman, xem cài đặt Podman; kiểm tra khả năng tương thích Compose của dự án trước khi thay runtime.

6. IDE và ứng dụng làm việc

VS Code

Chọn APT hoặc Snap. Với APT, tải .deb đúng kiến trúc từ VS Code Linux, lưu thành ~/Downloads/code.deb, rồi chạy sudo apt install "$HOME/Downloads/code.deb". Package có thể thiết lập repository Microsoft để cập nhật qua APT. Với Snap:

sudo snap install code --classic
code --version

Cài extension theo ngôn ngữ và workflow; ví dụ:

code --install-extension ms-python.python
code --install-extension charliermarsh.ruff
code --install-extension rust-lang.rust-analyzer
code --install-extension esbenp.prettier-vscode
code --install-extension dbaeumer.vscode-eslint
code --install-extension ms-vscode-remote.remote-ssh
code --install-extension ms-vscode-remote.remote-containers

Chọn thêm Pylance, LLDB, GitLens, Git Graph, Material Icon Theme, GitHub Theme và extension container/Kubernetes khi cần. Dùng Settings Sync nếu muốn đồng bộ cấu hình giữa máy.

JetBrains Toolbox và ứng dụng GUI

Công cụCài đặt và cấu hìnhKiểm tra
JetBrains ToolboxTải archive Linux đúng kiến trúc, giải nén trong thư mục riêng rồi chạy Toolbox. Chọn IntelliJ IDEA, PyCharm, WebStorm, GoLand, CLion, Rider hoặc DataGrip theo dự án và giấy phépMở IDE, chọn SDK/interpreter và kiểm tra terminal tích hợp
Postmansudo snap install postman hoặc archive Linux từ nhà cung cấpGửi request đến API thử nghiệm của bạn
DBeaver Community.deb từ nhà cung cấp hoặc sudo snap install dbeaver-ceKết nối database thử nghiệm, chạy truy vấn chỉ đọc
NavicatTải AppImage chính thức, cần giấy phép phù hợpMở app và kiểm tra connection thử nghiệm
Beekeeper Studio / SQLToolsChọn client phù hợp với workflow file .sql và Git; SQLTools cần driver extension tương ứngLưu query vào file, kiểm tra encoding UTF-8

Với AppImage, đặt file đã tải vào ~/.local/bin/navicat, chạy chmod +x và thêm launcher. desktop-file-utils cung cấp công cụ kiểm tra launcher:

mkdir -p "$HOME/.local/share/applications"
cat > "$HOME/.local/share/applications/navicat.desktop" <<EOF
[Desktop Entry]
Type=Application
Name=Navicat
Exec="$HOME/.local/bin/navicat" %U
Terminal=false
Categories=Development;Database;
EOF
desktop-file-validate "$HOME/.local/share/applications/navicat.desktop"
update-desktop-database "$HOME/.local/share/applications"

Có thể trích xuất icon bằng --appimage-extract trong một thư mục tạm riêng rồi thêm Icon= vào launcher. Nếu AppImage báo thiếu FUSE, xem AppImage troubleshooting cho release Ubuntu đang dùng; không gỡ FUSE hiện có để thử sửa.

7. Ngôn ngữ lập trình

Python: uv và pyenv

uv quản lý dependency, virtual environment và Python. Không thay /usr/bin/python3 của Ubuntu bằng runtime dự án.

curl -fsSL https://astral.sh/uv/install.sh -o /tmp/install-uv.sh
less /tmp/install-uv.sh
sh /tmp/install-uv.sh
export PATH="$HOME/.local/bin:$PATH"
uv --version
uv python install 3.14

Trong dự án có pyproject.toml, dùng uv sync, uv run python --version, uv run pytest. uv python pin VERSION ghi phiên bản vào .python-version; chọn phiên bản theo dự án.

Nếu cần build nhiều Python từ source, dùng pyenv. Cài thêm libncurses-dev tk-dev libxmlsec1-dev, tải installer từ https://pyenv.run, đọc nội dung rồi chạy bằng Bash. Thêm pyenv vào Zsh theo phần 12. Sau đó:

pyenv install --list
pyenv install 3.14
pyenv versions
pyenv local 3.14
python --version

Chọn uv-managed Python hoặc pyenv theo nhu cầu; không cần để cả hai tranh quyền chọn interpreter cho cùng dự án. Mỗi bản Python mới là một cài đặt riêng; kiểm thử trước khi xóa runtime cũ.

PHP và Composer

Dùng sudo apt install php-cli php-fpm php-curl php-mbstring php-xml php-zip php-bcmath php-intl php-sqlite3 nếu phiên bản Ubuntu đáp ứng dự án. Cần nhiều phiên bản thì đối chiếu release được hỗ trợ tại PPA PHP, rồi:

sudo add-apt-repository ppa:ondrej/php
sudo apt update
PHP_VERSION=8.3
sudo apt install -y \
  "php${PHP_VERSION}-cli" "php${PHP_VERSION}-fpm" "php${PHP_VERSION}-common" \
  "php${PHP_VERSION}-mysql" "php${PHP_VERSION}-pgsql" "php${PHP_VERSION}-sqlite3" \
  "php${PHP_VERSION}-curl" "php${PHP_VERSION}-gd" "php${PHP_VERSION}-mbstring" \
  "php${PHP_VERSION}-xml" "php${PHP_VERSION}-zip" "php${PHP_VERSION}-bcmath" \
  "php${PHP_VERSION}-intl" "php${PHP_VERSION}-redis"
sudo update-alternatives --config php
php --version
php -m

8.3 chỉ là lựa chọn minh họa, cần thay theo project và vòng đời PHP supported versions. update-alternatives đổi CLI; PHP-FPM cho web server có service/socket riêng. Xdebug là tùy chọn khi cần debug, không bật mặc định cho mọi workload.

Cài Composer bằng installer được xác minh như hướng dẫn Composer:

COMPOSER_SIG="$(curl -fsSL https://composer.github.io/installer.sig)"
curl -fsSL https://getcomposer.org/installer -o /tmp/composer-setup.php
COMPOSER_ACTUAL="$(php -r "echo hash_file('sha384', '/tmp/composer-setup.php');")"
if [ "$COMPOSER_SIG" = "$COMPOSER_ACTUAL" ]; then
  php /tmp/composer-setup.php --install-dir="$HOME/.local/bin" --filename=composer
else
  printf '%s\n' 'Checksum Composer không khớp; dừng cài đặt.'
fi
composer --version

Node.js, NVM, pnpm và Yarn

NVM quản lý Node trong tài khoản người dùng. Xem tag installer hiện hành trong README upstream; ví dụ đã đối chiếu:

curl -fsSL https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.8/install.sh \
  -o /tmp/install-nvm.sh
less /tmp/install-nvm.sh
bash /tmp/install-nvm.sh
export NVM_DIR="$HOME/.nvm"
[ ! -s "$NVM_DIR/nvm.sh" ] || . "$NVM_DIR/nvm.sh"
nvm install --lts
nvm alias default 'lts/*'
node --version
npm --version
npm install -g pnpm
pnpm --version

Với dự án có .nvmrc, chạy nvm install rồi nvm use. Theo pnpm installation, pin phiên bản khớp trường packageManager; không nâng major package manager giữa chừng chỉ để setup máy. Dự án dùng Yarn cần cài đúng dòng phiên bản theo Yarn installation, thay vì cài Yarn global để thay pnpm trong mọi dự án. Không dùng sudo npm với Node do NVM quản lý.

Go

Từ Go downloads, tải archive linux-amd64 hoặc linux-arm64, kiểm tra SHA-256 công bố, lưu thành ~/Downloads/go-linux.tar.gz. Với máy mới chưa có /usr/local/go:

sudo tar -C /usr/local -xzf "$HOME/Downloads/go-linux.tar.gz"
export PATH="/usr/local/go/bin:$HOME/go/bin:$PATH"
go version
go env GOPATH

Khi nâng cấp, làm theo Go install: thay toàn bộ cây Go cũ, không giải nén chồng lên cây hiện có. GOPATH mặc định là ~/go; repository dùng module không cần nằm trong GOPATH.

Rust

curl --proto '=https' --tlsv1.2 -fsSL https://sh.rustup.rs -o /tmp/install-rust.sh
less /tmp/install-rust.sh
sh /tmp/install-rust.sh
. "$HOME/.cargo/env"
rustup component add rustfmt clippy rust-analyzer
rustc --version
cargo --version
rustup toolchain list

rustup quản lý toolchain. Chỉ cài nightly khi dự án yêu cầu; rust-toolchain.toml pin toolchain của repository. Nếu chưa có Just hoặc eza, có thể cài bằng cargo install just eza.

8. AWS và công cụ IaC

AWS CLI, SSO và Session Manager

Tải và xác minh installer theo AWS CLI v2. Ví dụ dưới dùng x86_64; ARM dùng archive awscli-exe-linux-aarch64.zip:

AWS_SETUP_DIR="$(mktemp -d)"
curl -fsSL https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip \
  -o "$AWS_SETUP_DIR/awscliv2.zip"
unzip -q "$AWS_SETUP_DIR/awscliv2.zip" -d "$AWS_SETUP_DIR"
sudo "$AWS_SETUP_DIR/aws/install"
aws --version

Chọn --update khi cập nhật cài đặt CLI đã tồn tại. Nếu tổ chức dùng IAM Identity Center, thiết lập bằng aws configure sso --profile dev, đăng nhập với aws sso login --profile dev, rồi xác nhận aws sts get-caller-identity --profile dev. Lệnh identity in ra metadata tài khoản của bạn, không dán kết quả vào tài liệu công khai. Xem SSO profiles.

Cần truy cập máy qua SSM thì tải .deb đúng kiến trúc theo Session Manager Plugin, cài bằng sudo apt install ./session-manager-plugin.deb, kiểm tra session-manager-plugin --version. Cài CLI không tự tạo quyền IAM hoặc mở phiên tới máy.

CDK, OpenTofu/Terraform và Terragrunt

npm install -g aws-cdk
cdk --version

Trong CDK, cdk synth tạo template và cdk diff xem thay đổi. Bootstrap/deploy tạo tài nguyên và có thể phát sinh chi phí; chỉ chạy khi đã chọn đúng account, region và profile.

Chọn engine theo project: OpenTofu có executable tofu, Terraform có executable terraform. Cài từ package/binary chính thức đúng kiến trúc và kiểm tra phiên bản dự án pin. Với Terraform qua repository HashiCorp:

curl -fsSL https://apt.releases.hashicorp.com/gpg \
  | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
printf 'deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com %s main\n' \
  "$(lsb_release -cs)" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update
sudo apt install terraform
terraform version

Nếu repository chưa hỗ trợ codename hiện tại, dùng binary được upstream xác minh thay vì đổi codename. Terragrunt cần bản tương thích với engine; tải binary và checksum cho linux_amd64/linux_arm64, kiểm tra rồi dùng install -m 0755 FILE "$HOME/.local/bin/terragrunt". Kiểm tra bằng tofu version hoặc terraform version, rồi terragrunt --version.

Ansible

Ansible cần môi trường Python riêng. Có thể dùng package Ubuntu (sudo apt install ansible) hoặc cài tool qua uv, chọn một phương pháp. Theo Ansible installation:

uv tool install --with ansible-core ansible
ansible --version
ansible-galaxy collection install community.general amazon.aws community.docker

Dự án có requirements.yml thì dùng ansible-galaxy collection install -r requirements.yml để giữ version đã pin. Không đưa inventory, private key hoặc vault password vào wiki.

9. Kubernetes: kubectl, Helm, k9s và Minikube

kubectl cần phiên bản tương thích cluster, không chỉ là bản mới nhất. Theo kubectl Linux, với môi trường thử nghiệm mới có thể lấy stable; môi trường có cluster thì đặt KUBECTL_VERSION theo version được phép trước khi tải:

KUBECTL_VERSION="$(curl -fsSL https://dl.k8s.io/release/stable.txt)"
KUBECTL_ARCH="$(dpkg --print-architecture)"
KUBECTL_DIR="$(mktemp -d)"
curl -fsSL "https://dl.k8s.io/release/$KUBECTL_VERSION/bin/linux/$KUBECTL_ARCH/kubectl" \
  -o "$KUBECTL_DIR/kubectl"
curl -fsSL "https://dl.k8s.io/release/$KUBECTL_VERSION/bin/linux/$KUBECTL_ARCH/kubectl.sha256" \
  -o "$KUBECTL_DIR/kubectl.sha256"
if (cd "$KUBECTL_DIR" && printf '%s  kubectl\n' "$(cat kubectl.sha256)" | sha256sum --check); then
  install -m 0755 "$KUBECTL_DIR/kubectl" "$HOME/.local/bin/kubectl"
fi
kubectl version --client

Kubeconfig chứa quyền truy cập cluster, giữ ngoài Git và kiểm tra context trước mọi thao tác. kubectl config current-context cho biết đích hiện tại; client cài được không đồng nghĩa đã có cluster.

Helm có installer theo major version. Chọn major khớp chart và pipeline; bản mới không tự chứng minh tương thích với project cũ. Ví dụ installer Helm 4:

curl -fsSL https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-4 \
  -o /tmp/install-helm.sh
less /tmp/install-helm.sh
bash /tmp/install-helm.sh
helm version --short

k9s là TUI quản lý cluster: tải release đúng kiến trúc và checksum, cài binary vào ~/.local/bin, kiểm tra k9s version. Kiểm tra context trước khi mở vì giao diện có thao tác sửa/xóa tài nguyên.

Minikube tạo cluster local, cần tài nguyên RAM/ CPU và driver. Tải binary đúng kiến trúc và checksum theo trang cài đặt, rồi:

minikube version
minikube start --driver=docker
kubectl config current-context
kubectl get nodes
minikube stop

minikube stop giữ dữ liệu cluster; minikube delete xóa cluster local nên chỉ dùng khi đã không cần dữ liệu. Cluster local giúp kiểm chart/deploy mà không đụng môi trường cloud.

10. Tiếng Việt trên GNOME và Wayland

Trước tiên thử bộ gõ sẵn có trong Settings → Keyboard. Nếu chọn Fcitx5/Unikey trên GNOME, thiết lập theo Fcitx5 setup và Fcitx5 Wayland. GNOME và KDE có cơ chế input method khác nhau; không áp cùng bộ biến môi trường cho cả hai.

sudo apt install -y fcitx5 fcitx5-unikey fcitx5-config-qt fcitx5-frontend-all im-config
im-config -n fcitx5
fcitx5-configtool

Trong config tool, thêm Keyboard - English (US) và Unikey, chọn Telex/VNI tùy thói quen, kiểm tra phím chuyển Việt/Anh. Layout Keyboard - Vietnamese không thay thế engine Telex. Nếu Fcitx không tự chạy sau login, thêm XDG autostart:

mkdir -p "$HOME/.config/autostart"
cat > "$HOME/.config/autostart/fcitx5.desktop" <<'EOF'
[Desktop Entry]
Type=Application
Name=Fcitx 5
Exec=fcitx5
Icon=org.fcitx.Fcitx5
Terminal=false
EOF

Với ứng dụng XWayland hoặc Qt trên GNOME chưa nhận bộ gõ, có thể thêm các giá trị sau vào ~/.config/environment.d/im.conf, rồi đăng xuất/đăng nhập. Sao lưu file hiện có trước khi chỉnh; cấu hình session cụ thể quyết định có cần thêm GTK_IM_MODULE=fcitx hay không:

XMODIFIERS=@im=fcitx
QT_IM_MODULE=fcitx

Với KDE native Wayland, chọn Fcitx5 trong Virtual Keyboard theo upstream; không ép GTK_IM_MODULE/QT_IM_MODULE toàn session theo cấu hình GNOME. Với Chrome/VS Code/Electron, thử XWayland trước nếu native Wayland gặp lỗi. Khi compositor và application hỗ trợ text-input-v3, có thể thử riêng app:

code --ozone-platform=wayland --enable-wayland-ime --wayland-text-input-version=3

Khả năng hỗ trợ flag phụ thuộc phiên bản Electron/Chromium. Kiểm tra pgrep -a fcitx5, fcitx5-diagnose và gõ tiếng Việt có dấu trong terminal, trình duyệt, editor. Preedit có gạch chân khi đang nhập là bình thường; dấu bị nhân đôi, mất ký tự hoặc lag cần điều tra. Nếu chuyển từ ibus-bamboo, chỉ gỡ engine cũ sau khi bộ gõ mới hoạt động; giữ core IBus mà desktop còn sử dụng.

11. Khắc phục lỗi desktop thường gặp

Clipboard UTF-8 và drag-and-drop của JetBrains

Ghi lại IDE, JetBrains Runtime, session Wayland/X11, compositor và scaling. Cập nhật IDE/ runtime trước; sao lưu Help → Edit Custom VM Options rồi thử thay đổi từng IDE. JetBrains Wayland giải thích cách chọn native Wayland và xem toolkit trong Help → About.

Triệu chứngThử nghiệm có kiểm soátNghiệm thu và hoàn tác
Copy tiếng Việt từ IDE sang Chrome/editor bị vỡNếu native Wayland gây lỗi, thử XWayland bằng -Dawt.toolkit.name=sun.awt.X11.XToolkit; xem thêm JBR-9149Copy cả hai chiều, kiểm dấu và xuống dòng; bỏ override khi bản runtime mới đã sửa
Rider không kéo tab hoặc fileThử native Wayland bằng -Dawt.toolkit.name=WLToolkit nếu runtime hỗ trợKéo tab, chia cửa sổ, kéo file, kiểm cả clipboard; bỏ override nếu phát sinh lỗi khác
IDE mờ ở scaling lẻSo sánh native Wayland và XWayland, thử scaling 100%/200%Chọn cấu hình cân bằng hiển thị và input trên máy của bạn

Hai toolkit là hai lựa chọn thay thế, chỉ giữ một override mỗi IDE. Không suy ra cấu hình Rider đúng cho mọi IDE. Các cờ encoding như -Dfile.encoding=UTF-8 không thay thế việc kiểm clipboard thực tế và không tự chứng minh nguyên nhân lỗi MIME.

file:// có thể được desktop xử lý qua scheme handler thay vì MIME của nội dung. Xem xdg-mime query default x-scheme-handler/file; với file đã biết, dùng code --goto ./FILE:LINE để mở đúng dòng. Fragment dạng #L42 cần wrapper chuyển sang cú pháp --goto; VS Code không tự xử lý mọi kiểu fragment.

Nếu đăng ký wrapper cho scheme file, phải giao thư mục lại file manager và giải mã URI đúng cách. Không đặt VS Code làm handler toàn bộ file:// chỉ để sửa một link trong terminal. Kiểm thử file có khoảng trắng, thư mục và hoàn tác handler trước đó khi cần.

Video H.264, VLC và MIME

Khi player mặc định không giải mã được video, cài VLC hoặc codec GStreamer cần thiết theo Ubuntu restricted formats.

sudo apt install vlc
xdg-mime default vlc.desktop video/mp4
xdg-mime default vlc.desktop video/x-matroska
xdg-mime default vlc.desktop video/webm
xdg-mime default vlc.desktop video/vnd.avi
xdg-mime query default video/mp4

Dùng xdg-mime query filetype FILE để biết MIME thật của video. Nếu tiếp tục dùng player GStreamer, kiểm tra gói gstreamer1.0-libav phù hợp với distro. Không cần gỡ player mặc định chỉ để đổi ứng dụng mở video.

12. Cấu hình Zsh tổng hợp

Sao lưu ~/.zshrc trước khi chỉnh. Đây là cấu hình ghép các tool đã chọn, không bắt buộc ghi đè toàn bộ file. Theme và plugin chỉ bật sau khi đã cài ở phần 3.

typeset -U path PATH
path=("$HOME/.local/bin" "$HOME/go/bin" /usr/local/go/bin $path)
export ZSH="$HOME/.oh-my-zsh"
ZSH_THEME="powerlevel10k/powerlevel10k"
plugins=(git docker kubectl aws zsh-autosuggestions zsh-completions zsh-syntax-highlighting)
[[ ! -f "$ZSH/oh-my-zsh.sh" ]] || source "$ZSH/oh-my-zsh.sh"

export PYENV_ROOT="$HOME/.pyenv"
[[ ! -d "$PYENV_ROOT/bin" ]] || path=("$PYENV_ROOT/bin" $path)
if command -v pyenv >/dev/null; then
  eval "$(pyenv init - zsh)"
fi
export NVM_DIR="$HOME/.nvm"
[[ ! -s "$NVM_DIR/nvm.sh" ]] || source "$NVM_DIR/nvm.sh"
[[ ! -f "$HOME/.cargo/env" ]] || source "$HOME/.cargo/env"
[[ ! -f "$HOME/.p10k.zsh" ]] || source "$HOME/.p10k.zsh"

command -v batcat >/dev/null && alias bat=batcat
command -v fdfind >/dev/null && alias fd=fdfind
command -v eza >/dev/null && alias ll='eza -la --icons'
alias ..='cd ..'
alias dc='docker compose'
alias gs='git status'
alias gd='git diff'
alias ports='ss -tulanp'

Kiểm tra cú pháp bằng zsh -n ~/.zshrc, mở terminal mới rồi command -v TOOL. Giữ lệnh chuẩn như cat, grep, find, python để tránh alias làm đổi hành vi bất ngờ; dùng tên tool mới hoặc alias riêng. Không đưa secret vào shell config, history hoặc prompt.

13. Checklist nghiệm thu và bảo trì

NhómKiểm traKết quả cần thấy
Hệ điều hành/etc/os-release, df -h, cập nhật, reboot nếu cầnĐúng distro/kiến trúc, đủ dung lượng, phần cứng hoạt động
Shellzsh --version, zsh -n ~/.zshrc, terminal mớiKhông lỗi startup, font/icon đúng
CLIgit --version, jq --version, rg --version, just --versionCó executable và chạy được
SSH/Gitssh-add -l, kết nối dịch vụ, cấu hình danh tínhChọn đúng public key và tài khoản
Containerdocker version, docker compose version, hello-worldKết nối được daemon/context dự định
Pythonuv --version, interpreter và test của dự ánĐúng runtime, dependency khớp lockfile
Node/PHP/Go/RustVersion command của tool đã chọnĐúng phiên bản dự án và toolchain
Cloud/IaCVersion command; đăng nhập profile nếu dùngĐúng CLI, profile và engine; chưa tự apply
KubernetesClient version, context, cluster local nếu càiĐúng context, node sẵn sàng ở lab
GUI/inputGõ tiếng Việt, copy/paste, drag/drop, videoHoạt động trong từng ứng dụng thực tế

Kiểm nhanh executable mà không cài hay chạy workload:

for tool in git curl jq rg fzf just zsh code docker uv node pnpm go rustc cargo php composer aws tofu terraform terragrunt ansible kubectl helm k9s minikube; do
  if command -v "$tool" >/dev/null 2>&1; then
    printf 'Có: %s\n' "$tool"
  else
    printf 'Chưa cài hoặc chưa có trong PATH: %s\n' "$tool"
  fi
done

Tool tùy chọn chưa cài không phải lỗi setup. Sau kiểm executable, chạy version command và test của dự án bạn thực sự làm; script kiểm PATH không xác nhận hoạt động của daemon, database, tài khoản cloud hay GUI.

Định kỳ cập nhật APT/Snap và toolchain đã chọn; đọc danh sách package trước khi sudo apt autoremove. Nâng major runtime trong nhánh kiểm thử, giữ lockfile và bản cũ cho đến khi dự án pass. Sao lưu dotfiles đã loại secret; giữ SSH key, credentials và database backup ở nơi riêng có mã hóa. Khi nâng Ubuntu, sao lưu trước, kiểm repository bên thứ ba có hỗ trợ release đích, rồi chạy lại checklist.

Nếu máy thường xuyên thiếu RAM, đo bằng free -h, htop, journalctl và hạn mức container trước khi bổ sung daemon bảo vệ tài nguyên. Xem Mem Guardian: bảo vệ RAM và CPU để hiểu tín hiệu PSI, ngưỡng can thiệp, bảo vệ tiến trình và cách vận hành watchdog. Shell plugin, script mở URI hay daemon tùy biến cần quy trình cài/gỡ riêng; chúng không phải điều kiện để Ubuntu workstation hoạt động.