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ể:
Kiểm tra tính xác thực và toàn vẹn của package Một repository chứa:
Các package được đóng gói (.deb) File index (danh mục) mô tả package có sẵn 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ư:
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 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 Phân tích danh sách package cần upgrade 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 update và upgrade 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: