youhoc
Linux

icon picker
Day 4: Package Management

Quản lý các Package và Repo phần mềm trên Linux

4.1. Giới thiệu chung về Hệ thống Quản lý Package

Các khái niệm cơ bản

Package (Gói phần mềm)

Package trong Linux là một tập hợp các file đóng gói được thiết kế để cài đặt một phần mềm cụ thể. Nó giống như một "hộp đóng gói" chứa:
Binary executables: File thực thi của chương trình
Configuration files: File cấu hình mặc định
Documentation: Tài liệu hướng dẫn sử dụng
Dependencies information: Thông tin về các package khác mà nó cần
Scripts: Script cài đặt, gỡ bỏ, và các thao tác khác
Metadata: Thông tin về version, maintainer, mô tả, v.v.
Trong Ubuntu/Debian, package có định dạng .deb (tương tự như .rpm trong CentOS/Fedora). Một package .deb là một file lưu trữ đặc biệt có thể được giải nén và cài đặt bởi hệ thống quản lý package.
Ví dụ: nginx_1.18.0-0ubuntu1_amd64.deb là một package chứa web server Nginx, phiên bản 1.18.0, đóng gói cho Ubuntu, dành cho kiến trúc amd64.

Repository (Kho lưu trữ)

Repository (thường được gọi tắt là "repo") là một kho lưu trữ online chứa nhiều package. Nó giống như một "siêu thị" package, nơi hệ thống APT của bạn có thể:
Tìm kiếm package
Download package
Kiểm tra tính xác thực và toàn vẹn của package
Quản lý dependencies
Một repository chứa:
Các package được đóng gói (.deb)
File index (danh mục) mô tả package có sẵn
Các file metadata khác
Signature keys để xác thực
Các loại repository trong Ubuntu
Main repositories: Kho chính thức của Ubuntu
Main: Package được Ubuntu hỗ trợ chính thức, open-source
Universe: Package open-source do cộng đồng duy trì
Restricted: Driver độc quyền và firmware
Multiverse: Package bị hạn chế bởi copyright hoặc vấn đề pháp lý
PPA (Personal Package Archives): Repositories nhỏ do cá nhân duy trì, thường dùng để cung cấp version mới hơn hoặc package không có trong repo chính thức
Third-party repositories: Repository của bên thứ ba, ví dụ như repository của MongoDB, Docker, PHP, v.v.

Mối quan hệ giữa Package và Repository

Mối quan hệ giữa package và repository tương tự như:
Repository = Siêu thị
Package = Sản phẩm trong siêu thị
Khi bạn chạy apt update, hệ thống sẽ:
Kết nối đến tất cả repositories được cấu hình
Download danh sách package có sẵn (file index)
Cập nhật database local về package có sẵn
Khi bạn chạy apt install nginx:
APT tìm trong database local xem nginx có sẵn không và ở repository nào
Xác định các dependencies cần thiết
Download tất cả package cần thiết từ repositories
Cài đặt chúng theo thứ tự phù hợp
Việc hiểu rõ khái niệm package và repository sẽ giúp em quản lý hệ thống Linux hiệu quả hơn, đặc biệt khi cần cài đặt phần mềm mới hoặc cập nhật hệ thống.

Giới thiệu APT

APT (Advanced Package Tool) là hệ thống quản lý package mạnh mẽ của Debian/Ubuntu. Nó hoạt động theo nguyên tắc:
Theo dõi tất cả package đã cài đặt trong database
Quản lý các dependencies (phụ thuộc) giữa các package
Lấy package từ các repositories (kho lưu trữ) đã cấu hình
Xác minh tính toàn vẹn và bảo mật của package

Các công cụ APT

Ubuntu/Debian có nhiều lệnh liên quan đến APT:
apt: Công cụ hiện đại, thân thiện với người dùng, kết hợp các tính năng hay dùng từ apt-get và apt-cache
apt-get: Công cụ truyền thống để cài đặt/gỡ bỏ package
apt-cache: Dùng để tìm kiếm và hiển thị thông tin package
aptitude: Giao diện cao cấp hơn cho APT, có thể dùng cả command line và giao diện text-based
APT hiện là công cụ được khuyến nghị sử dụng vì nó kết hợp các tính năng của apt-get và apt-cache với giao diện thân thiện hơn.

Cấu trúc file và directory của APT

/etc/apt/sources.list: Danh sách các repository chính
/etc/apt/sources.list.d/: Directory chứa các file cấu hình repository bổ sung
/var/lib/apt/: Chứa database về trạng thái package
/var/cache/apt/archives/: Lưu trữ các package đã download

4.2. Cài đặt và quản lý package

Cập nhật danh sách package

Lệnh này cập nhật thông tin về các package có sẵn từ tất cả các repository được cấu hình, nhưng không cài đặt hay upgrade bất kỳ package nào.

Tìm kiếm package

Cài đặt package

Upgrade package

Remove package

Dọn dẹp hệ thống

Danh sách package

4.3. Quản lý Repository và PPA

Cấu trúc của sources.list

Mỗi dòng trong file /etc/apt/sources.list có định dạng:
Ví dụ:
deb: Loại repository (deb là binary package, deb-src là source code)
repository_url: URL của repository
distribution: Tên phiên bản (focal, bionic, etc.)
components: Các thành phần repository (main, restricted, universe, multiverse)

Thêm PPA (Personal Package Archives)

PPA là repository do cá nhân duy trì, thường cung cấp version mới hơn hoặc package không có trong repository chính thức.

Thêm repository thủ công

Disable repository

GPG keys và security

GPG keys đóng vai trò thiết yếu trong bảo mật của hệ thống quản lý package.

GPG Keys là gì?

GPG (GNU Privacy Guard) keys là cặp khóa mật mã bao gồm:
Public key: Khóa công khai - dùng để xác minh chữ ký số
Private key: Khóa riêng tư - dùng để tạo chữ ký số
Trong context của APT, GPG keys được sử dụng để:
Authenticate: Xác thực nguồn gốc của repository
Verify integrity: Đảm bảo package không bị sửa đổi kể từ khi được tạo ra
Establish trust: Thiết lập niềm tin giữa máy chủ repository và hệ thống của bạn

Tại sao cần GPG Keys?

Khi bạn cài đặt package từ repositories, bạn đang thực thi code từ nguồn bên ngoài trên hệ thống của mình. Điều này tiềm ẩn rủi ro bảo mật:
Man-in-the-middle attack: Kẻ tấn công có thể chặn kết nối và cung cấp package độc hại
Repository compromise: Repository có thể bị hack và chứa malware
Spoofing: Kẻ tấn công có thể giả mạo một repository hợp pháp
GPG keys giúp ngăn chặn các cuộc tấn công này bằng cách đảm bảo rằng chỉ package từ nguồn tin cậy mới được cài đặt.

Cách hoạt động của GPG Keys trong APT

Signing repositories: Maintainer của repository ký các file index (Release) bằng private key của họ, tạo ra file Release.gpg
Distributing public keys: Public key được phân phối cho người dùng
Verification during updates: Khi bạn chạy apt update, APT sẽ:
Download file Release và Release.gpg
Sử dụng public key để xác minh chữ ký trong Release.gpg
Nếu xác minh thành công, tiếp tục quá trình update
Nếu xác minh thất bại, hiển thị warning và từ chối update từ repository đó

Khi nào cần thêm GPG Keys?

Bạn cần thêm GPG keys trong các trường hợp sau:
Thêm third-party repository: Khi thêm repository không thuộc Ubuntu (như MongoDB, Docker, Elasticsearch)
Thêm PPA: Hầu hết PPA yêu cầu thêm key (mặc dù add-apt-repository thường làm tự động)
Cài đặt package từ bên ngoài: Khi tải package trực tiếp từ website của nhà phát triển
Warning từ APT: Khi thấy thông báo "NO_PUBKEY" hoặc "GPG error" khi chạy apt update

Ví dụ thực tế: Thêm repository Docker

Các lệnh quản lý GPG Keys

Việc hiểu và quản lý GPG keys là một phần quan trọng của bảo mật hệ thống. Nó đảm bảo rằng phần mềm bạn cài đặt đến từ nguồn đáng tin cậy và không bị sửa đổi.

4.4. Kỹ thuật nâng cao và troubleshooting

Sự khác nhau giữa apt update và apt upgrade

apt update
Chức năng: Cập nhật danh sách package có sẵn từ tất cả repositories được cấu hình
Quá trình:
Kết nối đến các repositories (từ sources.list và sources.list.d/*)
Download các file index mới nhất (Packages.gz, Sources.gz, Release, v.v.)
Cập nhật database local (/var/lib/apt/lists/)
Kết quả: Hệ thống biết được package nào có phiên bản mới, package nào có thể cài đặt
Chú ý: Lệnh này KHÔNG cài đặt hay nâng cấp bất kỳ package nào
Tương tự như: "Cập nhật danh mục sản phẩm" từ các siêu thị
apt upgrade
Chức năng: Nâng cấp tất cả package đã cài đặt lên phiên bản mới nhất có sẵn
Điều kiện tiên quyết: Phải chạy apt update trước để biết phiên bản mới nhất
Quá trình:
Phân tích danh sách package cần upgrade
Tính toán dependencies
Download các package mới
Cài đặt chúng thay thế phiên bản cũ
Giới hạn: Chỉ upgrade package đã cài đặt, KHÔNG cài đặt package mới hoặc xóa bất kỳ package nào
Tương tự như: "Nâng cấp các sản phẩm đã mua" lên phiên bản mới nhất
Ví dụ thực tế
Nếu bạn muốn upgrade toàn diện hơn, có thể sử dụng:
Lệnh này không chỉ upgrade các package hiện có mà còn có thể thêm package mới hoặc xóa package cũ để giải quyết dependencies.
Hiểu rõ sự khác biệt giữa updateupgrade là nền tảng quan trọng khi quản lý package trên Ubuntu/Debian!

Cài đặt từ file .deb

Fix broken dependencies

Hold package version

Để ngăn một package được upgrade:
Để bỏ hold:

Xem history cài đặt

Tìm package chứa một file cụ thể

Cài đặt non-interactive

Thực hành

Update hệ thống:
Tìm và cài đặt một web server:
Kiểm tra status service:
Thêm một PPA và cài đặt package từ đó:
Remove một package:
Clean up hệ thống:
Want to print your doc?
This is not the way.
Try clicking the ⋯ next to your doc name or using a keyboard shortcut (
CtrlP
) instead.