![i-love-linux](https://viblo.asia/uploads/0bfc8566-bb1f-4e8e-8fe0-bd537a86d500.jpeg) # Index - [Unix vs Linux. Nguồn gốc và sự khác biệt](https://viblo.asia/thangtd90/posts/rNkKxxMAKlm) - Debian vs Redhat: Package Management System # Lời mở đầu Như trong bài viết trước, tôi đã đề cập đến khái niệm Linux Distribution, hay Linux Distro, với 2 nhánh chính mà các bạn nên biết, đó là **Debian** và **Redhat**. Có khá nhiều điểm khác biệt giữa hai nhánh này, và bài viết này sẽ tập trung vào một trong số đó. Một trong những điểm bạn sẽ dễ dàng nhận ra ngay khi tiếp xúc với các Distro thuộc Debian hay Redhat: đó chính là **package management**. ***Chú ý: Trong bài viết này, khi đề cập đến Debian, ta sẽ hiểu là Debian và các distro được xây dựng dựa trên Debian (Ubuntu, Linux Mint, Kali Linux ...), còn khi đề cập đến Redhat, ta sẽ hiểu là các Distro được xây dựng dựa trên các thành phần mà Redhat cung cấp (như Ret Hat Enterprise Linux, Fedora, CentOS ...)*** # Package Management là gì? Trước đây, phần lớn các chương trình chạy trên Linux đều được phân phối dưới dạng source code, và người dùng sẽ cần phải tải chúng về, rồi build các file source code đó thành các chương trình, hay một số các chương trình cần thiết, với đầy đủ các trang documents, hay các configuration files ... Điều này đã gây ra ít nhiều khó khăn cho những người không quá quen thuộc với Linux. Hiện tại thì hầu hết các nhà phát triển đều cung cấp các chương trình của mình dưới dạng **prebuilt**, với rất nhiều những config được thiết lập sẵn, và đã ở trạng thái sẵn sàng để có thể cài đặt trên Linux Distribution một cách dễ dàng, nhanh chóng. Những phần mềm (hay set các phần mềm), được cung cấp dưới dạng một file đóng gói duy nhất như vậy được gọi là **package**. **Package Management System** hiểu đơn giản là một công cụ, hay hệ thống các công cụ, giúp người quản trị hệ thống có thể **tìm kiếm**, **cài đặt**, **truy vấn** và **gỡ bỏ** các packages một cách dễ dàng. Các Distro Debian với các distro Redhat sử dụng các hệ thống **package management** khác biệt hoàn toàn với nhau. Nhìn chung thì những gì bạn có thể làm được với công cụ package manager trên Debian, thì bạn cũng có thể làm được với package manager trên Redhat. Tuy nhiên mỗi công cụ cũng có những đặc thù riêng, và không phải option nào cũng giống như nhau, sẽ trả ra kết quả như nhau. Trên [trang chủ của project Debian](https://wiki.debian.org/Apt), có một đoạn miêu tả về package management như sau: > Much of why Debian is a strong Linux distribution comes from the core of Debian namely its package management. Everything in Debian – every application, every component – everything – is built into a package, and then that package is installed onto your system (either by the Installer, or by you). Vâng, package management chính là thứ tạo nên sức mạnh của Debian (cũng như Redhat), là thứ khiến chúng trở nên phổ biến, và khiến vô vàn các distro khác chọn Debian (hay Redhat) làm nền tảng. Hãy cùng tìm hiểu sâu về các hệ thống quản lý package, để thấy rõ hơn về sự khác biệt giữa **Debian** và **Redhat** nhé. # Debian Package Management Hệ thống **package management** trên Debian gồm một số câu lệnh, hay các tools khác nhau, mà bạn nên biết đến như sau: - `dpkg` - `dpkg-reconfigure` - `apt-get` - `apt-cache` - `apt` - `aptitude` ### Tìm hiểu về `dpkg` Hãy bắt đầu bằng một câu chuyện như thế này. Bạn đang sử dụng máy bàn với hệ điểu hành là Ubuntu. Bạn cần cài đặt Chrome, và khi vào trang chủ của Chrome để tải file về cài đặt, bạn chọn "Download Chrome for Linux". Đây sẽ là hình ảnh bạn thấy: ![chrome-for-linux](https://viblo.asia/uploads/5eca9d69-be7c-4d8a-b98b-8bc0677055fc.png) Vâng, để cài đặt cho **Debian/Ubuntu** bạn sẽ cần tải về một file. Còn để cài đặt cho **Fedora/openSUSE**, bạn cần một file khác. Lý do thì rất đơn giản thôi, mặc dù cùng là Linux, nhưng chúng sử dụng 2 hệ thống quản lý package khác nhau. File dành cho Debian sẽ có phần mở rộng là `.deb` (có lẽ là viết tắt của chữ *debian*). Còn file dành cho Redhat (Fedora) sẽ có phần mở rộng là `.rpm` (có lẽ là viết tắt của chữ *Redhat Package Manager*) OK, đó là câu chuyện về cách phân biệt package cho Debian với Redhat. Còn giờ hãy quay trở lại với `dpkg`. Rốt cuộc thì `dpkg` là công cụ gì? Hiểu một cách đơn giản là `dpkg`, theo mình đoán là viết tắt của **debian package**, là công cụ cho phép bạn quản lý (cài đặt, tìm kiếm, xem thông tin, xoá) các file packages (`.deb`) ở local. Dưới đây là một số câu lệnh `dpkg` hay được sử dụng: - `-i` or `–install` : Cài đặt file `.deb` - `-r` or `–remove` : Gỡ bỏ (uninstall) một package, nhưng **giữ lại các file configuration** của package đó - `-P` or `–purge` : Gỡ bỏ package và các file configuration của nó - `-I` or `–info` : Truy vấn thông tin về một file `.deb` hay một package đã được cài đặt - `-l` or `–list` : Truy vấn danh sách các packages đã được cài đặt - `-L` or `–listfiles` : Truy vấn danh sách các files thuộc về các packages đã được cài đặt - `-S` or `–search` : Tìm package mà một file thuộc về - `-s` or `--status` : Hiện thị các thông tin về trạng thái của một package - `--help` : Xem thông tin về các câu lệnh khác :v Ví dụ ```bash ~$ dpkg --version Debian 'dpkg' package management program version 1.18.4 (amd64). This is free software; see the GNU General Public License version 2 or later for copying conditions. There is NO warranty. ~$ dpkg -L apache2 /. /etc /etc/logrotate.d /etc/logrotate.d/apache2 /etc/apache2 /etc/apache2/sites-enabled /etc/apache2/apache2.conf /etc/apache2/mods-enabled /etc/apache2/mods-available /etc/apache2/mods-available/ssl.load /etc/apache2/mods-available/ldap.load /etc/apache2/mods-available/proxy_fcgi.load /etc/apache2/mods-available/file_cache.load ... more ... ~$ dpkg -S /lib/systemd colord, policykit-1, apache2, udev, systemd, uuid-runtime, rsync, plymouth, hdparm, friendly-recovery, ufw, rsyslog, ureadahead, cron, openssh-server, resolvconf, unattended-upgrades, php7.0-fpm, php-common, accountsservice, sudo, mysql-server-5.7, keyboard-configuration, console-setup-linux, ifupdown, dbus, apt: /lib/systemd ~$ dpkg -s apache2 Package: apache2 Status: install ok installed Priority: optional Section: httpd Installed-Size: 488 Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> Architecture: amd64 Version: 2.4.18-2ubuntu3.1 Replaces: apache2.2-bin, apache2.2-common Provides: httpd, httpd-cgi Depends: lsb-base, procps, perl, mime-support, apache2-bin (= 2.4.18-2ubuntu3.1), apache2-utils (>= 2.4), apache2-data (= 2.4.18-2ubuntu3.1) Pre-Depends: dpkg (>= 1.17.14) Recommends: ssl-cert ... more ... ~$ dpkg -I composer_1.0.0~beta2-1_all.deb new debian package, version 2.0. size 282670 bytes: control archive=8741 bytes. 1011 bytes, 17 lines control 23351 bytes, 260 lines md5sums Package: composer Version: 1.0.0~beta2-1 Architecture: all Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> Original-Maintainer: Debian PHP PEAR Maintainers <pkg-php-pear@lists.alioth.debian.org> Installed-Size: 1618 Depends: ca-certificates, php-symfony-console (>= 2.5), php-symfony-filesystem (>= 2.5), php-symfony-finder (>= 2.4), php-symfony-process (>= 2.4), php-cli, php-common, php-json-schema (>= 1.6), php-json-schema (<< 2~~), php-composer-spdx-licenses (>= 1.0), php-composer-spdx-licenses (<< 2~~), php-composer-semver (>= 1.0), php-composer-semver (<< 2~~), jsonlint (>= 1.4), jsonlint (<< 2~~), php-cli-prompt (>= 1.0), php-cli-prompt (<< 2~~) Recommends: git, mercurial Suggests: php-zip Section: php Priority: optional Homepage: https://getcomposer.org/ Description: dependency manager for PHP Composer helps you declare, manage and install dependencies of PHP projects, ensuring you have the right stack everywhere. It behaves like Bundler (Ruby), npm (Node), etc. ``` Sau khi cài đặt xong một package bằng `dpkg`, chúng ta có thể dùng lệnh `dpkg-reconfigure` để thay đổi các tuỳ chọn đã thiết lập trong lúc cài đặt. ### Tìm hiểu về `apt` Như các bạn thấy, `dpkg` chính là công cụ để cài đặt package `.deb`, nhưng chắc hẳn bạn đang thắc mắc là trước nay có cần dùng đến câu lệnh đó đâu mà vẫn cài được phần mềm đó thôi. Và câu trả lời là bạn đã sử dụng những phần mềm được xây dựng dựa trên `dpkg` để giúp cho công việc được dễ dàng hơn. `apt` là một trong số đó. > apt is a commandline package manager and provides commands for searching and managing as well as querying information about packages. It provides the same functionality as the specialized APT tools, like apt-get and apt-cache, but enables options more suitable for interactive use by default. Một số câu lệnh `apt` thường dùng - `list` Liệt kê danh sách các packages dựa trên tên package - `search` Tìm kiếm thông qua - search in package descriptions - `show` Hiển thị thông tin chi tiết về package - `install` Cài đặt package - `remove` Xoá bỏ package - `autoremove` Tự động xoá bỏ tất cả các package không được sử dụng - `update` Update package - `upgrade` Upgrade hệ thống bằng cách cài đặt, upgrade packages - `full-upgrade` Upgrade hệ thống bằng cách xoá bỏ, cài đặt, upgrade packages - `edit-sources` Chỉnh sửa file thông tin source ***Chú ý: Hiện nay, ở các phiên bản Debian/Ubuntu mới, câu lệnh `apt` có thể được sử dụng thay thế cho `apt-get`, `apt-cache`, và nó ngày được ưa chuộng và sử dụng rộng rãi hơn. Bài viết này cũng sẽ đề cập đến `apt` là chính :D*** Điểm khác biệt lớn nhất giữa `dpkg` và `apt` nằm ở chỗ, `dpkg` chỉ có thể cài đặt file `.deb` khi bạn đã có file đó ở trong máy (bằng một cách nào đó :v), còn `apt` sẽ tìm kiếm package từ trong một loại các **repositories** (hiểu đơn giản là các *kho chứa package*), tải package về rồi tiến hành cài đặt cho chúng ta. `apt` còn mạnh mẽ hơn ở điểm nó biết cách resolve các **dependencies** của một package, và tiến hành cài đặt các **dependencies** đó nếu chúng chưa được cài đặt từ trước. Chẳng hạn một package A của bạn cần các package B1, B2, B3, B4 ... khác để chạy. Nếu bạn cài đặt bằng `dpkg` khi có file `.deb` của package A thì có thể bạn sẽ thất bại nếu các package B1, B2, B3, B4 kia chưa có. Ngược lại, nếu dùng `apt install` thì các package B1, B2, B3, B4 cũng sẽ được tự động cài đặt trước, để phục vụ cho việc cài đặt package A. Nếu như trên Debian, `apt` được gọi là **main package manager** thì `dpkg` được coi là **medium-level (hay low-level) package manager**. Bởi `apt` thực tế gọi đến `dpkg` để thực hiện các công việc thao tác với package, hay nói cách khác, `dpkg` thực hiện công việc ở cấp thấp hơn so với `apt`. Danh sách các **repositories** mà `apt` quản lý được lưu trong file `/etc/apt/sources.list`, hoặc tại các file trong thư mục `/etc/apt/sources.list.d`. Các bạn có thể check danh sách các repositories thông qua câu lệnh `apt policy` (hay `apt-cache policy`) Ngoài `apt` và `dpkg`, các bạn có thể tìm hiểu về những công cụ package manager khác của Debian, ví dụ như là: - [aptitude](https://wiki.debian.org/Aptitude) Một công cụ được xây dựng trên `apt`, - [synaptic](https://wiki.debian.org/Synaptic) Một công cụ khác được tạo nên dựa trên `apt`. Điều đặc biệt của `synaptic` là nó có GUI :D - `gdebi` - Ubuntu Software Center =)) # Redhat Package Management Nếu như bên Debian có `dpkg` và `apt` thì bên Redhat có `rpm` và `yum`. `rpm` sẽ có chức năng tương tự như `dpkg` vậy (cài đặt package từ file local), còn `yum` sẽ có chức năng tương tự như `apt` (resolve dependencies và tìm kiếm, cài đặt từ các repository). ### Tìm hiểu về `rpm` `rpm` là viết tắt của **Red Hat Package Manager**. Cái tên nói lên tất cả, đây là công cụ để quản lý package cho các distro thuộc họ hàng nhà Redhat. Nếu như file package trên Debian có đuôi mở rộng là `.deb`, thì file package trên Redhat có đuôi mở rộng là `.rpm`, trùng với tên công cụ cài đặt luôn :D Các câu lệnh `rpm`, cũng giống với `dpkg`, đòi hỏi bạn phải sử dụng `-`. Chẳng hạn: - `-i` hay `--install` Cài đặt (install) - `-q` hay `--query` Truy vấn (query) - `-e` hay `--erase` Xoá (erase, uninstall) package - `-U` hay `--upgrade` Update một package đã cài đặt - `-V` hay `--verify` Kiểm tra package Ngoài ra, còn có vô số các options tương ứng với từng câu lệnh nữa. Bạn có thể gõ `rpm --help` ra, và sẽ thấy cả một đống các option chia ra theo các loại như - Query/Verify package selection options - Query options - Verify options - Install/Upgrade/Erase options - Common options for all rpm modes and executables - Options implemented via popt alias/exec - ... Thực sự để làm việc quen với `rpm` thì khá là khó khăn, đòi hỏi bạn phải thực hành và nhớ khá nhiều đấy :v Ví dụ một số câu lệnh cơ bản: ```bash // Install + Verbose + Print hash marks as package installs rpm -ivh package_name // query: Check a package is installed or not rpm -q package_name // query + list: List all the files of an installed package rpm -ql package_name // query + all + last: List all the recently installed packages rpm -qa --last // query + file: List all packages that contain the file rpm -qf package_name // query + info: Show the information of the installed package rpm -qi package_name // query + info + package: Show the information of a package (that not installed) rpm -qip package_name ``` ### Tìm hiểu về `yum` `yum`, viết tắt của từ **Yellowdog Updater, Modified**, là công cụ build trên `rpm`, và được cài đặt mặc định trên những hệ thống sử dụng `rpm`. Và cũng giống như những gì `apt` làm với `dpkg`, `yum` cũng giúp việc cài đặt các package `rpm` được đơn giản hơn, với các chức năng như tải về package từ các **repositories**, hay tự động resolve các dependencies mà package cần. Một số câu lệnh `yum` cơ bản: - `install` - `update` - `remove` - `list` Tìm kiếm packages theo tên chính xác - `search` Tìm kiếm packages có tên hay description chứa từ khoá - `info` - `check-update` Kiểm tra xem có những packages nào có thể được update - `update` Update hệ thống - `repolist` Hiển thị danh sách các **repositories** đang được sử dụng để tải packages # Lời kết Trên đây là các kiến thức cơ bản về **package management** trên hệ thống Debian cũng như Redhat. Hy vọng rằng các bạn sẽ có được cái nhìn tổng thể về các công cụ như `apt` hay `yum`, để từ đó làm việc với hệ thống Linux của mình một cách hiệu quả hơn :D Xin cảm ơn các bạn đã theo dõi, và xin hẹn gặp lại trong những bài viết theo trong serie **"Become A SuperUser"** này trên [Viblo](https://viblo.asia) nhé. # References - https://en.wikipedia.org/wiki/Package_manager - https://en.wikipedia.org/wiki/Advanced_Packaging_Tool - https://en.wikipedia.org/wiki/Yellowdog_Updater,_Modified - https://www.ibm.com/developerworks/library/l-lpic1-102-4/ - https://www.theurbanpenguin.com/1024-use-debian-package-management/ - https://www.theurbanpenguin.com/1025-use-rpm-and-yum-package-management/ - http://youngjourney.today/lpic-102-4-use-debian-package-management/ - [Yum Command Cheat Sheet for Red Hat Enterprise Linux](https://access.redhat.com/articles/yum-cheat-sheet)