25 Ví dụ về lệnh DNF hữu ích để quản lý gói trong Linux

Tác giả sysadmin, T.M.Hai 25, 2022, 02:44:19 CHIỀU

« Chủ đề trước - Chủ đề tiếp »

0 Thành viên và 1 Khách đang xem chủ đề.

25 Ví dụ về lệnh DNF hữu ích để quản lý gói trong Linux


Dandified Yum (DNF) là trình quản lý gói dựa trên RPM được sử dụng để cài đặt và cập nhật các gói trong các bản phân phối Linux khác nhau bao gồm CentOS, RHEL và Fedora.

DNF là phiên bản chính tiếp theo của Yum và do đó, nó nhằm mục đích duy trì khả năng tương thích CLI với Yum, do đó, nhiều thông tin ở đây sẽ giống với các lệnh yum của chúng tôi.

Giống như Yum, DNF khá mạnh vì nó có khả năng tự động giải quyết các vấn đề phụ thuộc và tương tự như các trình quản lý gói khác, chẳng hạn như 'apt-get' trong các bản phân phối dựa trên Debian.

Những ví dụ này sẽ đóng vai trò là nguồn giới thiệu, hướng dẫn hoặc tài nguyên phong cách bảng gian lận hữu ích về cách sử dụng lệnh dnf trong Linux.

Nếu DNF chưa được sử dụng theo mặc định trong bản phân phối của bạn nhưng bạn muốn cài đặt nó, hãy xem hướng dẫn cài đặt DNF của chúng tôi.

1. Cài đặt gói mới từ kho lưu trữ

Lệnh dnf có thể được sử dụng để cài đặt các gói từ kho lưu trữ với đối số 'cài đặt', theo sau là tên gói. Trong ví dụ bên dưới, chúng tôi đang cài đặt Apache, được cung cấp trong gói 'httpd'.

Mã nguồn [Chọn]
[root@centos7 ~]# dnf install httpd
Using metadata from Thu Dec 29 21:31:01 2016
Dependencies resolved.
===========================================================
 Package    Arch     Version              Repository   Size
===========================================================
Installing:
 httpd      x86_64   2.4.6-45.el7.centos  base        2.7 M

Transaction Summary
===========================================================
Install  1 Package

Total download size: 2.7 M
Installed size: 9.4 M
Is this ok [y/N]: y
Downloading Packages:
httpd-2.4.6-45.el7.centos.x86_64.rpm         4.3 MB/s | 2.7 MB     00:00
------------------------------------------------------------------------
Total                                        1.6 MB/s | 2.7 MB     00:01
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Installing  : httpd-2.4.6-45.el7.centos.x86_64              1/1
  Verifying   : httpd-2.4.6-45.el7.centos.x86_64              1/1

Installed:
  httpd.x86_64 2.4.6-45.el7.centos

Complete!

Lưu ý rằng sau khi xác nhận các gói sẽ được cài đặt, bạn sẽ được yêu cầu cung cấp đầu vào. Trong trường hợp này, chúng tôi đã nhập 'y' cho có để tiến hành cài đặt, sau đó quá trình cài đặt đã hoàn tất thành công.

2. Tuỳ chọn Yes

Trong ví dụ đầu tiên, chúng tôi được nhắc nhấn phím 'y' để tiến hành cài đặt. Thay vì được nhắc mỗi lần nhập dữ liệu của người dùng, chúng ta chỉ cần chỉ định tùy chọn '-y' trong lệnh của mình để giả sử có. Bằng cách này, chúng tôi sẽ không được nhắc nhập bất kỳ thông tin đầu vào nào và dnf sẽ cho rằng mọi thứ sẽ được trả lời là có.

Mã nguồn [Chọn]
[root@centos7 ~]# dnf install httpd-manual -y
Using metadata from Thu Dec 29 21:31:01 2016
Dependencies resolved.
======================================================================
 Package           Arch       Version                Repository   Size
======================================================================
Installing:
 httpd-manual      noarch     2.4.6-45.el7.centos    base        1.3 M

Transaction Summary
======================================================================
Install  1 Package

Total download size: 1.3 M
Installed size: 5.5 M
Downloading Packages:
httpd-manual-2.4.6-45.el7.centos.noarch.rpm      2.6 MB/s | 1.3 MB     00:00
----------------------------------------------------------------------------
Total                                            796 kB/s | 1.3 MB     00:01
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Installing  : httpd-manual-2.4.6-45.el7.centos.noarch             1/1
  Verifying   : httpd-manual-2.4.6-45.el7.centos.noarch             1/1

Installed:
  httpd-manual.noarch 2.4.6-45.el7.centos

Complete!

Lưu ý rằng trong ví dụ này, chúng tôi không được nhắc nhập dữ liệu, vì giả sử có đã được cung cấp, vì vậy gói đã được cài đặt đầy đủ mà không cần thêm bất kỳ tương tác nào của người dùng.

3. Kiểm tra các bản cập nhật có sẵn

Chúng tôi có thể chạy dnf với đối số 'kiểm tra cập nhật' sẽ kiểm tra với các kho lưu trữ đã bật của chúng tôi để biết bất kỳ bản cập nhật nào có thể có sẵn cho các gói mà chúng tôi đã cài đặt. Điều này không thực sự thực hiện bất kỳ cập nhật nào, nó chỉ cung cấp cho chúng tôi một danh sách các gói có sẵn các bản cập nhật để cài đặt.

Mã nguồn [Chọn]
[root@centos7 ~]# dnf check-update
bash.x86_64                             4.2.46-20.el7_2        updates
dbus.x86_64                             1:1.6.12-14.el7_2      updates
dbus-libs.x86_64                        1:1.6.12-14.el7_2      updates
device-mapper-persistent-data.x86_64    0.6.2-1.el7_2          updates
glibc.x86_64                            2.17-106.el7_2.8       updates
glibc-common.x86_64                     2.17-106.el7_2.8       updates
initscripts.x86_64                      9.49.30-1.el7_2.3      updates
kernel.x86_64                           3.10.0-327.28.3.el7    updates
kernel-tools.x86_64                     3.10.0-327.28.3.el7    updates
kernel-tools-libs.x86_64                3.10.0-327.28.3.el7    updates
...

4. Cập nhật gói mới từ kho lưu trữ

Trong ví dụ trước, chúng tôi đã được cung cấp một danh sách các gói hiện có sẵn các bản cập nhật gói. Chúng tôi có thể thực hiện cập nhật cho một gói cụ thể bằng cách chỉ định gói đó sau đối số 'cập nhật', như minh họa bên dưới.

Mã nguồn [Chọn]
[root@centos7 ~]# dnf update bash -y
Resolving Dependencies
--> Running transaction check
---> Package bash.x86_64 0:4.2.46-19.el7 will be updated
---> Package bash.x86_64 0:4.2.46-20.el7_2 will be an update
--> Finished Dependency Resolution

Dependencies Resolved

=================================================================
 Package         Arch       Version             Repository   Size
=================================================================
Updating:
 bash            x86_64     4.2.46-20.el7_2     updates     1.0 M

Transaction Summary
=================================================================
Upgrade  1 Package

Total download size: 1.0 M
Downloading packages:
Delta RPMs disabled because /usr/bin/applydeltarpm not installed.
bash-4.2.46-20.el7_2.x86_64.rpm        | 1.0 MB  00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Updating   : bash-4.2.46-20.el7_2.x86_64            1/2
  Cleanup    : bash-4.2.46-19.el7.x86_64              2/2
  Verifying  : bash-4.2.46-20.el7_2.x86_64            1/2
  Verifying  : bash-4.2.46-19.el7.x86_64              2/2

Updated:
  bash.x86_64 0:4.2.46-20.el7_2

Complete!

Lưu ý rằng chúng tôi không phải chạy cập nhật kiểm tra trước đó.

    Mặc dù chúng tôi có thể cập nhật các gói được chỉ định theo cách này, nhưng việc áp dụng tất cả các bản cập nhật có sẵn cho tất cả các gói trên hệ thống bằng 'cập nhật dnf' sẽ dễ dàng hơn.

5. Tải xuống tệp RPM của gói

Thay vì cài đặt gói từ kho lưu trữ như đã trình bày trước đây, chúng tôi có thể tùy chọn tải xuống tệp.rpm từ kho lưu trữ bằng plugin tải xuống DNF.

Đây là một ví dụ về những gì sẽ xảy ra nếu bạn cố gắng thực hiện một hành động mà không có plugin thích hợp.

Mã nguồn [Chọn]
[root@centos7 ~]# dnf download httpd
No such command: download. Please use /usr/bin/dnf --help
It could be a DNF plugin command.

Plugin này là một phần của dnf-plugins-core mà trước tiên chúng ta phải cài đặt.

Mã nguồn [Chọn]
[root@centos7 ~]# dnf install dnf-plugins-core
Bây giờ chúng ta có thể tải tệp RPM xuống hệ thống cục bộ.

Mã nguồn [Chọn]
[root@centos7 ~]# dnf download httpd
Using metadata from Thu Dec 29 21:31:01 2016
httpd-2.4.6-45.el7.centos.x86_64.rpm                               4.5 MB/s | 2.7 MB     00:00

[root@centos7 ~]# ls -la httpd-2.4.6-45.el7.centos.x86_64.rpm
-rw-r--r--. 1 root root 2827204 Dec 29 22:53 httpd-2.4.6-45.el7.centos.x86_64.rpm

6. Thực hiện cài đặt cục bộ tệp RPM

Trong ví dụ này, chúng tôi sẽ cài đặt tệp.rpm mà chúng tôi vừa tải xuống bằng plugin tải xuống dnf. Mặc dù chúng ta có thể vừa cài đặt gói này trực tiếp từ kho lưu trữ bằng 'dnf install', nhưng đôi khi bạn có thể được cung cấp trực tiếp các tệp.rpm để cài đặt, vì vậy bạn nên biết cách cài đặt chúng.

Mặc dù các tệp.rpm có thể được cài đặt bằng lệnh 'rpm', nhưng việc sử dụng dnf có lợi thế là tự động phát hiện và cài đặt bất kỳ gói phụ thuộc nào khác cũng có thể được yêu cầu.

Mã nguồn [Chọn]
[root@centos7 ~]# dnf install unbound-1.4.20-28.el7.x86_64.rpm
Using metadata from Thu Dec 29 21:31:01 2016
Dependencies resolved.
=================================================================
 Package         Arch       Version          Repository      Size
=================================================================
Installing:
 ldns            x86_64     1.6.16-10.el7    base           476 k
 libevent        x86_64     2.0.21-4.el7     base           214 k
 unbound         x86_64     1.4.20-28.el7    @commandline   473 k
 unbound-libs    x86_64     1.4.20-28.el7    base           296 k

Transaction Summary
=================================================================
Install  4 Packages

Total size: 1.4 M
Total download size: 985 k
Installed size: 4.4 M
Is this ok [y/N]: y
Downloading Packages:
(1/3): libevent-2.0.21-4.el7.x86_64.rpm       1.7 MB/s | 214 kB     00:00
(2/3): ldns-1.6.16-10.el7.x86_64.rpm          3.4 MB/s | 476 kB     00:00
(3/3): unbound-libs-1.4.20-28.el7.x86_64.rpm  2.0 MB/s | 296 kB     00:00
-------------------------------------------------------------------------
Total                                         965 kB/s | 985 kB     00:01
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Installing  : libevent-2.0.21-4.el7.x86_64                  1/4
  Installing  : ldns-1.6.16-10.el7.x86_64                     2/4
  Installing  : unbound-libs-1.4.20-28.el7.x86_64             3/4
  Installing  : unbound-1.4.20-28.el7.x86_64                  4/4
  Verifying   : unbound-1.4.20-28.el7.x86_64                  1/4
  Verifying   : ldns-1.6.16-10.el7.x86_64                     2/4
  Verifying   : libevent-2.0.21-4.el7.x86_64                  3/4
  Verifying   : unbound-libs-1.4.20-28.el7.x86_64             4/4

Installed:
  ldns.x86_64 1.6.16-10.el7          unbound.x86_64 1.4.20-28.el7
  unbound-libs.x86_64 1.4.20-28.el7  libevent.x86_64 2.0.21-4.el7

Complete!

Chúng ta có thể thấy rằng nguồn của gói không liên kết được liệt kê dưới dạng dòng lệnh, vì chúng ta có tệp cục bộ để cài đặt. Tuy nhiên, các gói khác được cài đặt dưới dạng phụ thuộc được liệt kê là đến từ kho lưu trữ cơ sở.

7. Gỡ cài đặt gói

Các gói có thể được gỡ cài đặt bằng đối số 'xóa', như được hiển thị bên dưới.

Mã nguồn [Chọn]
[root@centos7 ~]# dnf remove httpd
Using metadata from Thu Dec 29 21:31:01 2016
Dependencies resolved.
===================================================================
 Package         Arch       Version               Repository   Size
===================================================================
Removing:
 httpd           x86_64     2.4.6-45.el7.centos   @System     9.4 M
 httpd-manual    noarch     2.4.6-45.el7.centos   @System     5.5 M

Transaction Summary
===================================================================
Remove  2 Packages

Installed size: 15 M
Is this ok [y/N]: y
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Erasing     : httpd-manual-2.4.6-45.el7.centos.noarch                 1/2
  Erasing     : httpd-2.4.6-45.el7.centos.x86_64                        2/2
  Verifying   : httpd-2.4.6-45.el7.centos.x86_64                        1/2
  Verifying   : httpd-manual-2.4.6-45.el7.centos.noarch                 2/2

Removed:
  httpd.x86_64 2.4.6-45.el7.centos    httpd-manual.noarch 2.4.6-45.el7.centos

Complete!

Lưu ý rằng để xóa một gói, tất cả các gói khác phụ thuộc vào gói đó cũng sẽ bị xóa. Vì lý do đó, bạn không nên sử dụng tùy chọn -y cho 'assumeyes' khi xóa một gói để bạn có cơ hội đọc những gì sẽ bị xóa trước khi tiếp tục, vì nó có thể nhiều hơn bạn mong đợi.

Trong ví dụ trên, gói thủ công httpd mà chúng tôi đã cài đặt trước đó yêu cầu gói httpd. Do đó, khi chúng tôi xóa gói httpd, httpd-manual cũng phải hoạt động.

8. Cài đặt lại gói

Nếu gặp sự cố với một gói, bạn có thể dễ dàng cài đặt lại gói đó bằng đối số 'cài đặt lại'.

Mã nguồn [Chọn]
[root@centos7 ~]# dnf reinstall httpd -y
Using metadata from Thu Dec 29 21:31:01 2016
Dependencies resolved.
==================================================================
 Package         Arch     Version               Repository    Size
==================================================================
Reinstalling:
 httpd           x86_64   2.4.6-45.el7.centos   base         2.7 M

Transaction Summary
==================================================================

Total download size: 2.7 M
Downloading Packages:
httpd-2.4.6-45.el7.centos.x86_64.rpm  8.6 MB/s | 2.7 MB     00:00
-----------------------------------------------------------------
Total                                 1.9 MB/s | 2.7 MB     00:01
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Reinstalling: httpd-2.4.6-45.el7.centos.x86_64              1/2
error: httpd-2.4.6-45.el7.centos.x86_64: erase failed
  Verifying   : httpd-2.4.6-45.el7.centos.x86_64              1/2
  Verifying   : httpd-2.4.6-45.el7.centos.x86_64              2/2

Reinstalled:
  httpd.x86_64 2.4.6-45.el7.centos

Complete!

Điều này tương tự như thực hiện 'xóa dnf', sau đó là 'cài đặt dnf', tuy nhiên, ở đây nó được thực hiện trong một lệnh và cấu hình tùy chỉnh không bị xóa, vì 'xóa dnf' sẽ xóa tất cả các tệp cấu hình do gói quản lý.

9. Xem thông tin kho lưu trữ

Theo mặc định, chúng tôi có nhiều kho lưu trữ được định cấu hình trong thư mục /etc/yum.repos.d/ mà dnf đọc, chúng có thể được xem bằng các đối số 'repolist' và 'repoinfo'.

Mã nguồn [Chọn]
[root@centos7 ~]# dnf repolist
Using metadata from Thu Dec 29 21:31:01 2016
repo id          repo name                                          status
base             CentOS-7 - Base                                     9,363
epel             Extra Packages for Enterprise Linux 7 - x86_64     10,976
extras           CentOS-7 - Extras                                     435
updates          CentOS-7 - Updates

Theo mặc định, 'repolist' chỉ hiển thị thông tin cho các kho lưu trữ đã bật, tuy nhiên, chúng tôi có thể chỉ định 'tất cả' sau đó để liệt kê ngay cả các kho lưu trữ bị vô hiệu hóa.

Mã nguồn [Chọn]
[root@centos7 ~]# dnf repolist all

repo id                repo name                       status
C7.0.1406-base         CentOS-7.0.1406 - Base          disabled
C7.0.1406-centosplus   CentOS-7.0.1406 - CentOSPlus    disabled
C7.0.1406-extras       CentOS-7.0.1406 - Extras        disabled
C7.0.1406-fasttrack    CentOS-7.0.1406 - CentOSPlus    disabled
C7.0.1406-updates      CentOS-7.0.1406 - Updates       disabled
C7.1.1503-base         CentOS-7.1.1503 - Base          disabled
...

10. Thêm kho lưu trữ mới

Chúng ta có thể chỉ định kho lưu trữ mới bằng cách chỉnh sửa thủ công hoặc tạo tệp.repo mới trong thư mục /etc/yum.repos.d, tuy nhiên, chúng ta có thể tạo kho lưu trữ liên tục dễ dàng hơn nhiều bằng lệnh 'dnf config-manager'.

Mã nguồn [Chọn]
[root@centos7 ~]# dnf config-manager --add-repo="https://mirror.aarnet.edu.au/pub/centos/7"
Adding repo from: https://mirror.aarnet.edu.au/pub/centos/7

[root@centos7 ~]# cat /etc/yum.repos.d/mirror.aarnet.edu.au_pub_centos_7.repo
[mirror.aarnet.edu.au_pub_centos_7]
name=created by dnf config-manager from https://mirror.aarnet.edu.au/pub/centos/7
baseurl=https://mirror.aarnet.edu.au/pub/centos/7
enabled=1

Chúng tôi chỉ cung cấp một URL kho lưu trữ đã biết trong tùy chọn –add-repo và điều này tạo ra một tệp.repo dựa trên tên của URL kho lưu trữ được chỉ định. Trong trường hợp này, /etc/yum.repos.d/mirror.aarnet.edu.au_pub_centos_7.repo đã được tạo với nội dung được chỉ định ở trên trong đầu ra của lệnh. Bây giờ chúng ta có thể cài đặt hoặc cập nhật các gói từ máy nhân bản mới được chỉ định này.

11. Kích hoạt hoặc vô hiệu hóa kho lưu trữ cụ thể

Có thể đôi khi chúng ta muốn thực hiện một hành động trong khi bật hoặc tắt một kho lưu trữ cụ thể. Ví dụ: nếu chúng tôi muốn cài đặt một gói cụ thể, chúng tôi có thể muốn đảm bảo rằng gói đó đến từ một máy nhân bản cụ thể.

Mã nguồn [Chọn]
dnf --enablerepo=disabled-repo install package-example
Điều này sẽ kích hoạt một repo đã bị vô hiệu hóa trước đó có tên là 'repo bị vô hiệu hóa' để cài đặt 'ví dụ về gói' từ nó.

Nếu chúng tôi có sẵn các gói giống nhau tại nhiều kho lưu trữ, chúng tôi có thể muốn vô hiệu hóa một gói và cập nhật hoặc cài đặt từ một kho lưu trữ cụ thể. Điều này có thể được thực hiện bằng cách vô hiệu hóa kho lưu trữ với --disablerepo.

Mã nguồn [Chọn]
dnf --disablerepo=enabled-repo install package-example
12. Tìm kiếm các gói trong kho lưu trữ

Đối số 'tìm kiếm' là một tính năng dnf rất hữu ích, vì nó cho phép chúng tôi tìm kiếm thông qua các gói trên kho lưu trữ, điều này có thể hữu ích nếu chúng tôi không biết chính xác những gì chúng tôi đang muốn cài đặt.

Mã nguồn [Chọn]
[root@centos7 ~]# dnf search php
Using metadata from Thu Dec 29 21:31:01 2016
====================== N/S Matched: php ==========================
php.x86_64 : PHP scripting language for creating dynamic web sites
php-punic.noarch : PHP-Unicode CLDR
geos-php.x86_64 : PHP modules for GEOS
php-pluf.noarch : PHP WebApp Framework
php-idn.x86_64 : PHP API for GNU LibIDN
php-jsonlint.noarch : JSON Lint for PHP
php-common.x86_64 : Common files for PHP
...

Trong ví dụ này, chúng tôi tìm kiếm tên gói và phần tóm tắt cho thuật ngữ "PHP" và thấy một số gói có sẵn tại kho sẵn sàng để chúng tôi cài đặt hoặc tải xuống.

13. Tìm gói nào cung cấp thứ gì đó

Đây là một trong những tính năng yêu thích của tôi về lệnh dnf vì nó rất hữu ích. Bạn đã bao giờ muốn chạy một lệnh, nhưng bạn không chắc gói nào là cần thiết cho nó? Đây là nơi đối số 'cung cấp' được sử dụng.

Trong ví dụ này, chúng tôi muốn tạo một bộ khởi tạo iSCSI, việc này được thực hiện bằng lệnh 'iscsiadm'. Chúng tôi có thể sử dụng 'cung cấp' theo sau tên của lệnh để tìm kiếm các gói cung cấp lệnh này.

Mã nguồn [Chọn]
[root@centos7 ~]# dnf provides */iscsiadm
Using metadata from Thu Dec 29 21:31:01 2016
iscsi-initiator-utils-6.2.0.873-35.el7.x86_64 : iSCSI daemon and utility programs
Repo        : @System

Như được hiển thị, gói 'iscsi-initiator-utils' có thể được cài đặt để cung cấp lệnh 'iscsiadm'.

Điều này cũng có thể được sử dụng đối với một tệp trên hệ thống tệp để kiểm tra xem gói nào cung cấp tệp đó.

Mã nguồn [Chọn]
[root@centos7 ~]# dnf provides /etc/httpd/conf/httpd.conf
Using metadata from Thu Dec 29 21:31:01 2016
httpd-2.4.6-45.el7.centos.x86_64 : Apache HTTP Server
Repo        : @System

Trong ví dụ này, chúng ta có thể thấy rằng tệp /etc/httpd/conf/httpd.conf đến từ gói 'httpd'.

14. Xem thông tin gói

Thông tin chi tiết hơn về gói có thể được xem bằng đối số 'thông tin'. Như được hiển thị bên dưới, điều này cung cấp cho chúng tôi thông tin hữu ích như kiến ��trúc, số phiên bản, số phát hành, tổng kích thước cũng như mô tả về chức năng thực sự của gói.

Mã nguồn [Chọn]
[root@centos7 ~]# dnf info httpd
Using metadata from Thu Dec 29 21:31:01 2016
Installed Packages
Name        : httpd
Arch        : x86_64
Epoch       : 0
Version     : 2.4.6
Release     : 45.el7.centos
Size        : 9.4 M
Repo        : @System
Summary     : Apache HTTP Server
URL         : http://httpd.apache.org/
License     : ASL 2.0
Description : The Apache HTTP Server is a powerful, efficient, and extensible
            : web server.

Điều này có thể được sử dụng trước khi cài đặt gói hoặc sau khi cài đặt, thông tin giống nhau sẽ được cung cấp trong cả hai trường hợp.

15. Xem lịch sử giao dịch

Lịch sử dnf chứa tất cả các hành động đã được thực hiện bởi lệnh dnf. Điều này cho phép chúng tôi xem điều gì đã xảy ra với hệ thống Linux của mình theo thời gian và thậm chí hoàn tác, làm lại hoặc khôi phục giao dịch.

Mã nguồn [Chọn]
[root@centos7 ~]# dnf history
Using metadata from Thu Dec 29 21:31:01 2016
ID     | Command line             | Date a | Action | Altere
---------------------------------------------------------------------------
    14 | reinstall httpd -y       | 2016-12-29 23:02 | Reinstall  |    1 E<
    13 | remove httpd             | 2016-12-29 23:00 | Erase      |    2 >
    12 | install httpd httpd-manu | 2016-12-29 23:00 | Install    |    2
    11 | remove httpd             | 2016-12-29 23:00 | Erase      |    1
    10 | install unbound-1.4.20-2 | 2016-12-29 22:58 | Install    |    4  <
     9 | install unbound-1.4.20-2 | 2016-12-29 22:57 | Install    |    1 >
     8 | install httpd-2.4.6-45.e | 2016-12-29 22:55 | Install    |    1
     7 | remove httpd -y          | 2016-12-29 22:55 | Erase      |    2
     6 | install dnf-plugins-core | 2016-12-29 22:52 | Install    |    1
     5 | install httpd-manual -y  | 2016-12-29 22:46 | Install    |    1
     4 | install httpd            | 2016-12-29 22:44 | Install    |    1
     3 | remove httpd -y          | 2016-12-29 22:43 | Erase      |    2  <
     2 | update                   | 2016-12-29 21:57 | Update     |    1 >
     1 | install httpd-2.4.6-45.e | 2016-12-29 21:34 | E, I       |    2

Các giao dịch mới nhất xuất hiện ở đầu danh sách và chúng tôi có thể xem thêm thông tin về giao dịch bằng cách chỉ định ID của giao dịch đó, như được hiển thị bên dưới.

Mã nguồn [Chọn]
[root@centos7 ~]# dnf history info 13
Using metadata from Thu Dec 29 21:31:01 2016
Transaction ID : 13
Begin time     : Thu Dec 29 23:00:49 2016
Begin rpmdb    : 1336:80339f63f7d0b0833cb3f3a9561ded593a1181d6
End time       :            23:00:50 2016 (1 seconds)
End rpmdb      : 1334:21298913a58dbd9d10ea424fd201cf2e29a183fa
User           : root
Return-Code    : Success
Command Line   : remove httpd
Transaction performed with:
    Installed     dnf-0.6.4-2.el7.noarch   (unknown)
    Installed     rpm-4.11.3-21.el7.x86_64 (unknown)
Packages Altered:
    Erase httpd-2.4.6-45.el7.centos.x86_64        @base
    Erase httpd-manual-2.4.6-45.el7.centos.noarch @base

Vì vậy, giao dịch có ID là 13 đã được sử dụng để xóa gói httpd. Bây giờ chúng tôi có thể hoàn tác giao dịch này nếu muốn, thao tác này sẽ cài đặt lại gói httpd vì điều này sẽ hoàn tác việc xóa.

Mã nguồn [Chọn]
[root@centos7 ~]# dnf history undo 13 -y
Using metadata from Thu Dec 29 21:31:01 2016
Undoing transaction 13, from Thu Dec 29 23:00:49 2016
    Erase httpd-2.4.6-45.el7.centos.x86_64        @base
    Erase httpd-manual-2.4.6-45.el7.centos.noarch @base
=====================================================================
 Package          Arch       Version                Repository   Size
=====================================================================
Installing:
 httpd            x86_64     2.4.6-45.el7.centos    base        2.7 M
 httpd-manual     noarch     2.4.6-45.el7.centos    base        1.3 M

Transaction Summary
=====================================================================
Install  2 Packages

Total size: 4.0 M
Installed size: 15 M
Downloading Packages:
[SKIPPED] httpd-manual-2.4.6-45.el7.centos.noarch.rpm: Already downloaded
[SKIPPED] httpd-2.4.6-45.el7.centos.x86_64.rpm: Already downloaded
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Installing  : httpd-2.4.6-45.el7.centos.x86_64              1/2
  Installing  : httpd-manual-2.4.6-45.el7.centos.noarch       2/2
  Verifying   : httpd-manual-2.4.6-45.el7.centos.noarch       1/2
  Verifying   : httpd-2.4.6-45.el7.centos.x86_64              2/2

Installed:
  httpd.x86_64 2.4.6-45.el7.centos   httpd-manual.noarch 2.4.6-45.el7.centos

Complete!

Sau đó, chúng tôi có thể chạy lại quá trình xóa bằng 'làm lại lịch sử dnf'.

Mã nguồn [Chọn]
[root@centos7 ~]# dnf history redo 13 -y
Using metadata from Thu Dec 29 21:31:01 2016
Repeating transaction 13, from Thu Dec 29 23:00:49 2016
    Erase httpd-2.4.6-45.el7.centos.x86_64        @base
    Erase httpd-manual-2.4.6-45.el7.centos.noarch @base
=========================================================================
 Package             Arch       Version               Repository     Size
=========================================================================
Removing:
 httpd               x86_64     2.4.6-45.el7.centos   @System       9.4 M
 httpd-manual        noarch     2.4.6-45.el7.centos   @System       5.5 M

Transaction Summary
=========================================================================
Remove  2 Packages

Installed size: 15 M
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Erasing     : httpd-manual-2.4.6-45.el7.centos.noarch         1/2
  Erasing     : httpd-2.4.6-45.el7.centos.x86_64                2/2
  Verifying   : httpd-2.4.6-45.el7.centos.x86_64                1/2
  Verifying   : httpd-manual-2.4.6-45.el7.centos.noarch         2/2

Removed:
  httpd.x86_64 2.4.6-45.el7.centos             httpd-manual.noarch 2.4.6-45.el7.centos

Complete!

Cũng cần lưu ý rằng các gói cài đặt, cập nhật hoặc xóa cũng được ghi vào tệp /var/log/dnf.log, đây là một ví dụ về nội dung được ghi tại đây.

Mã nguồn [Chọn]
[root@centos7 ~]# tail /var/log/dnf.log
Dec 29 23:21:29 INFO =========================================================
 Package               Arch        Version                 Repository    Size
==============================================================================
Removing:
 httpd                 x86_64      2.4.6-45.el7.centos     @System      9.4 M
 httpd-manual          noarch      2.4.6-45.el7.centos     @System      5.5 M

Transaction Summary
==============================================================================
Remove  2 Packages

Dec 29 23:21:29 INFO Installed size: 15 M

16. Xóa thông tin đã lưu trong bộ nhớ cache

Theo mặc định, dnf sẽ lưu trữ dữ liệu vào thư mục /var/cache/dnf, chẳng hạn như gói và dữ liệu kho lưu trữ. Điều này tăng tốc dnf để nó không phải tiếp tục truy vấn thông tin này từ Internet.

Đôi khi bạn có thể muốn xóa dữ liệu đã lưu trong bộ nhớ cache này, chẳng hạn như nếu một kho lưu trữ có các gói được cập nhật nhưng hệ thống Linux của bạn có dữ liệu đã lưu trong bộ nhớ cache không chính xác hoặc cũ, điều này có thể gây ra nhiều sự cố khác nhau khi cố gắng cài đặt một gói.

Mã nguồn [Chọn]
[root@centos7 ~]# dnf clean all
Cleaning repos: epel base updates extras
Cleaning up Everything

Thao tác này sẽ xóa tất cả các mục đã lưu trong bộ nhớ cache, có thể chỉ định các thành phần cụ thể cần xóa (chẳng hạn như gói, siêu dữ liệu, bộ đệm hết hạn, rpmdb hoặc plugin) tuy nhiên, điều này sẽ tiết kiệm rất nhiều thời gian nếu bạn không chắc chắn nên xóa những gì.

17. Xây dựng bộ đệm

Bộ nhớ đệm dnf sẽ được tự động xây dựng theo thời gian khi bạn thực hiện các truy vấn dnf khác nhau, chẳng hạn như cài đặt hoặc cập nhật gói, tuy nhiên, chúng tôi có tùy chọn tạo bộ nhớ đệm theo cách thủ công để các hành động trong tương lai sẽ nhanh hơn với đối số 'makecache'.

Mã nguồn [Chọn]
[root@centos7 ~]# time dnf makecache
Extra Packages for Enterprise Linux 7 - x86_64     10 MB/s |  12 MB     00:01
CentOS-7 - Base                                   9.9 MB/s | 9.2 MB     00:00
CentOS-7 - Updates                                7.4 MB/s | 1.5 MB     00:00
CentOS-7 - Extras                                 2.4 MB/s | 636 kB     00:00
Metadata cache created.

real    0m16.491s
user    0m9.307s
sys     0m1.198s

18. Liệt kê các gói đã cài đặt

Chúng tôi có khả năng liệt kê tất cả các gói hiện đang được cài đặt trên hệ thống Linux của chúng tôi với 'danh sách dnf đã cài đặt'. Tôi chưa bao gồm đầu ra đầy đủ ở đây vì tôi có hàng trăm gói được cài đặt trên hệ thống của mình, tuy nhiên đoạn trích nhỏ này sẽ cho bạn ý tưởng về những gì sẽ xảy ra.

Mã nguồn [Chọn]
[root@centos7 ~]# dnf list installed
Using metadata from Fri Dec 30 00:39:53 2016
Installed Packages
GConf2.x86_64                         3.2.6-8.el7            @System
GeoIP.x86_64                          1.5.0-11.el7           @System
ModemManager.x86_64                   1.6.0-2.el7            @System
ModemManager-glib.x86_64              1.6.0-2.el7            @System
NetworkManager.x86_64                 1:1.4.0-13.el7_3       @System
NetworkManager-adsl.x86_64            1:1.4.0-13.el7_3       @System
NetworkManager-bluetooth.x86_64       1:1.4.0-13.el7_3       @System
NetworkManager-glib.x86_64            1:1.4.0-13.el7_3       @System
NetworkManager-libnm.x86_64           1:1.4.0-13.el7_3       @System
NetworkManager-team.x86_64            1:1.4.0-13.el7_3       @System
...

Khi được đưa vào lệnh grep, điều này trở nên cực kỳ mạnh mẽ vì nó cho phép chúng tôi tìm kiếm một gói cụ thể để xem nó đã được cài đặt chưa.

Mã nguồn [Chọn]
[root@centos7 ~]# dnf list installed | grep httpd
httpd.x86_64                  2.4.6-45.el7.centos            @System
httpd-tools.x86_64            2.4.6-45.el7.centos            @System

19. Liệt kê các gói có sẵn

Trong ví dụ trên, chúng tôi đã học cách liệt kê các gói hiện được cài đặt trên hệ thống Linux của chúng tôi bằng lệnh dnf, bây giờ chúng tôi muốn có thể truy vấn một kho lưu trữ và thay vào đó liệt kê các gói có sẵn của nó.

Điều này khá giống nhau, ngoại trừ việc chúng tôi thay thế 'đã cài đặt' bằng 'có sẵn' để thay vào đó liệt kê tất cả các gói có sẵn.

Mã nguồn [Chọn]
[root@centos7 ~]# dnf list installed | wc -l
1336

[root@centos7 ~]# dnf list available | wc -l
19212

Như chúng ta có thể thấy, chúng tôi hiện có hơn 1.300 gói được cài đặt, tuy nhiên trong kho lưu trữ có tổng cộng hơn 19.000 gói để chúng tôi cài đặt.

Chúng tôi cũng có thể chạy 'danh sách dnf tất cả' để liệt kê cả gói đã cài đặt và gói có sẵn cùng nhau hoặc 'danh sách cập nhật danh sách dnf' để chỉ liệt kê các gói hiện có bản cập nhật, đầu ra tương tự như lệnh 'cập nhật kiểm tra dnf' được đề cập trước đây.
 
20. Nhóm gói

Các gói có liên quan với nhau có thể được nhóm lại với nhau thành một nhóm gói. Điều này cho phép chúng tôi cài đặt, cập nhật hoặc xóa nhóm gói thực sự được tạo thành hoặc nhiều gói riêng lẻ khác.

Ví dụ: chúng tôi có thể chạy 'danh sách nhóm dnf' để xem các nhóm có sẵn để chúng tôi sử dụng theo mặc định.

Mã nguồn [Chọn]
[root@centos7 ~]# dnf grouplist
Using metadata from Fri Dec 30 00:39:53 2016
Available environment groups:
   Minimal Install
   Compute Node
   Infrastructure Server
   File and Print Server
   MATE Desktop
   Basic Web Server
   Virtualization Host
   Server with GUI
   GNOME Desktop
   KDE Plasma Workspaces
   Development and Creative Workstation
...

Khi chúng tôi có danh sách các nhóm khả dụng, chúng tôi có thể sử dụng 'dnf groupinfo' trên bất kỳ nhóm nào trong số đó để biết các gói được đưa vào như một phần của nhóm.

Mã nguồn [Chọn]
[root@centos7 ~]# dnf groupinfo "Basic Web Server"
Environment Group: Basic Web Server
 Description: Server for serving static and dynamic internet content.
 Mandatory Groups:
   Base
   Core
   Web Server
   
[root@centos7 ~]# dnf groupinfo "Web Server"
Group: Web Server
 Description: Allows the system to act as a web server, and run Perl and Python web applications.
 Mandatory Packages:
   httpd
 Default Packages:
   crypto-utils
   httpd-manual
   mod_fcgid
   mod_ssl

Ở đây chúng ta có thể thấy nhóm "Basic Web Server" thực sự được tạo thành từ ba nhóm khác là Base, Core và Web Server. Nếu chúng ta xem xét kỹ hơn nhóm Máy chủ Web, chúng ta có thể thấy rằng nó sử dụng gói httpd cũng như một số gói bổ sung mà chúng ta chưa cài đặt nhưng có sẵn.

Cuối cùng, chúng ta có thể cài đặt nhóm bằng lệnh 'dnf groupinstall', như hình bên dưới.

Mã nguồn [Chọn]
[root@centos7 ~]# dnf groupinstall "Web Server" -y
Using metadata from Fri Dec 30 00:39:53 2016
Dependencies resolved.
===================================================================================
 Group                  Packages
===================================================================================
Marking installed:
 Web Server           mod_security_crs      mod_auth_mellon        mod_auth_kerb
                      squid                 mod_auth_openidc       perl-CGI-Session
                      mod_revocator         plone                  mod_fcgid
                      httpd                 mod_ssl                cherokee
                      zope                  memcached              libmemcached
                      mod_security          certmonger             crypto-utils
                      moin                  Pound                  mod_nss
                      perl-CGI              python-memcached       httpd-manual
====================================================================================
 Package                 Arch       Version                  Repository     Size
====================================================================================
Installing:
 crypto-utils            x86_64     2.4.1-42.el7             base           78 k
 httpd-manual            noarch     2.4.6-45.el7.centos      base          1.3 M
 mod_fcgid               x86_64     2.3.9-4.el7              base           79 k
 mod_ssl                 x86_64     1:2.4.6-45.el7.centos    base          105 k
 perl-Newt               x86_64     1.08-36.el7              base           64 k

Transaction Summary
====================================================================================
Install  5 Packages

Total download size: 1.7 M
Installed size: 6.2 M
Downloading Packages:
(1/5): mod_ssl-2.4.6-45.el7.centos.x86_64.rpm            958 kB/s | 105 kB     00:00
(2/5): crypto-utils-2.4.1-42.el7.x86_64.rpm              506 kB/s |  78 kB     00:00
(3/5): mod_fcgid-2.3.9-4.el7.x86_64.rpm                  742 kB/s |  79 kB     00:00
(4/5): perl-Newt-1.08-36.el7.x86_64.rpm                  599 kB/s |  64 kB     00:00
(5/5): httpd-manual-2.4.6-45.el7.centos.noarch.rpm       4.8 MB/s | 1.3 MB     00:00
------------------------------------------------------------------------------------
Total                                                    1.3 MB/s | 1.7 MB     00:01
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Installing  : perl-Newt-1.08-36.el7.x86_64                          1/5
  Installing  : crypto-utils-2.4.1-42.el7.x86_64                      2/5
  Installing  : mod_fcgid-2.3.9-4.el7.x86_64                          3/5
  Installing  : mod_ssl-1:2.4.6-45.el7.centos.x86_64                  4/5
  Installing  : httpd-manual-2.4.6-45.el7.centos.noarch               5/5
  Verifying   : httpd-manual-2.4.6-45.el7.centos.noarch               1/5
  Verifying   : crypto-utils-2.4.1-42.el7.x86_64                      2/5
  Verifying   : mod_ssl-1:2.4.6-45.el7.centos.x86_64                  3/5
  Verifying   : mod_fcgid-2.3.9-4.el7.x86_64                          4/5
  Verifying   : perl-Newt-1.08-36.el7.x86_64                          5/5

Installed:
  crypto-utils.x86_64 2.4.1-42.el7     httpd-manual.noarch 2.4.6-45.el7.centos
  mod_fcgid.x86_64 2.3.9-4.el7         mod_ssl.x86_64 1:2.4.6-45.el7.centos
  perl-Newt.x86_64 1.08-36.el7

Complete!

Nhóm cũng có thể được cập nhật bằng 'cập nhật nhóm dnf' hoặc xóa tất cả các gói trong nhóm bằng 'xóa nhóm dnf'.

21. Loại trừ gói cụ thể

Chúng tôi có thể tùy ý loại trừ một gói cụ thể khỏi quá trình cập nhật, cài đặt hoặc gỡ bỏ bằng lệnh -x sẽ loại trừ gói đó. Trong ví dụ này, chúng tôi thực hiện 'cập nhật kiểm tra dnf' và xác nhận rằng có bản cập nhật kernel, tuy nhiên chúng tôi không muốn cài đặt gói này vào lúc này. Với sự trợ giúp của -x, chúng tôi bỏ qua cập nhật kernel và thay vào đó thực hiện 'cập nhật dnf' cho biết rằng nó sẽ cập nhật mọi thứ ngoại trừ kernel, không được liệt kê.

Mã nguồn [Chọn]
[root@centos7 ~]# dnf check-update

device-mapper-persistent-data.x86_64      0.6.2-1.el7_2                updates
initscripts.x86_64                        9.49.30-1.el7_2.3            updates
kernel.x86_64                     3.10.0-327.28.3.el7          updates
kernel-tools.x86_64                       3.10.0-327.28.3.el7          updates
kernel-tools-libs.x86_64                  3.10.0-327.28.3.el7          updates
microcode_ctl.x86_64                      2:2.1-12.el7_2.1             updates
python-perf.x86_64                        3.10.0-327.28.3.el7          updates

[root@centos7 ~]# dnf update -x kernel
Resolving Dependencies
--> Running transaction check
---> Package device-mapper-persistent-data.x86_64 0:0.5.5-1.el7 will be updated
---> Package device-mapper-persistent-data.x86_64 0:0.6.2-1.el7_2 will be an update
---> Package initscripts.x86_64 0:9.49.30-1.el7_2.2 will be updated
---> Package initscripts.x86_64 0:9.49.30-1.el7_2.3 will be an update
---> Package kernel-tools.x86_64 0:3.10.0-327.22.2.el7 will be updated
---> Package kernel-tools.x86_64 0:3.10.0-327.28.3.el7 will be an update
---> Package kernel-tools-libs.x86_64 0:3.10.0-327.22.2.el7 will be updated
---> Package kernel-tools-libs.x86_64 0:3.10.0-327.28.3.el7 will be an update
---> Package microcode_ctl.x86_64 2:2.1-12.el7 will be updated
---> Package microcode_ctl.x86_64 2:2.1-12.el7_2.1 will be an update
---> Package python-perf.x86_64 0:3.10.0-327.22.2.el7 will be updated
---> Package python-perf.x86_64 0:3.10.0-327.28.3.el7 will be an update
--> Finished Dependency Resolution

Dependencies Resolved

===================================================================================
 Package                         Arch    Version                Repository     Size
===================================================================================
Updating:
 device-mapper-persistent-data   x86_64  0.6.2-1.el7_2          updates        366 k
 initscripts                     x86_64  9.49.30-1.el7_2.3      updates        429 k
 kernel-tools                    x86_64  3.10.0-327.28.3.el7    updates        2.4 M
 kernel-tools-libs               x86_64  3.10.0-327.28.3.el7    updates        2.3 M
 microcode_ctl                   x86_64  2:2.1-12.el7_2.1       updates        535 k
 python-perf                     x86_64  3.10.0-327.28.3.el7    updates        2.4 M

Transaction Summary
====================================================================================
Upgrade  6 Packages

Total download size: 8.4 M
Is this ok [y/d/N]:

22. Thêm thời gian chờ ngẫu nhiên

Để sử dụng chức năng thời gian chờ ngẫu nhiên, trước tiên chúng ta phải cài đặt gói tự động dnf. Công cụ này được sử dụng cho các tác vụ tự động như cập nhật thường xuyên thông qua các công việc định kỳ.

Mã nguồn [Chọn]
[root@centos7 ~]# dnf install dnf-automatic -y
Theo mặc định, dnf-auto có thời gian ngủ ngẫu nhiên là 300 giây, đây là độ trễ tối đa sẽ diễn ra trước khi tải xuống. Điều này có thể hữu ích nếu bạn quản lý nhiều máy cố gắng cập nhật cùng một lúc và phá vỡ kho lưu trữ hoặc sử dụng hết băng thông mạng có sẵn khiến quá trình diễn ra rất chậm.

Có thể điều chỉnh mặc định 300 giây bằng cách thêm 'random_sleep' vào tệp cấu hình /etc/dnf/automatic.conf.

23. Chỉ cài đặt các bản cập nhật bảo mật

Mặc dù chúng tôi có thể chỉ cần thực hiện 'cập nhật dnf' để cập nhật tất cả các gói đã cài đặt của mình lên phiên bản mới nhất, nhưng điều này có thể không lý tưởng trong môi trường sản xuất. Có thể cài đặt các bản cập nhật chỉ bảo mật trong quá trình vá lỗi có thể là một yêu cầu trong môi trường của bạn.

Mã nguồn [Chọn]
[root@centos7 ~]# dnf updateinfo list sec
Với dnf-automatic, chúng ta cũng có thể sửa đổi tệp /etc/dnf/automatic.conf. Theo mặc định, upgrade_type được đặt thành mặc định sẽ cập nhật tất cả các gói có sẵn, tuy nhiên, điều này có thể được thay đổi thành bảo mật để chỉ các bản cập nhật bảo mật được cài đặt.

24. Ẩn tất cả đầu ra

Như bạn đã thấy trong các ví dụ trên, lệnh dnf có thể cung cấp khá nhiều đầu ra. Nếu chúng tôi không muốn hiển thị các thông báo đầu ra, chúng tôi chỉ cần chỉ định tùy chọn -q cho silent, tùy chọn này sẽ ẩn tất cả đầu ra. Trong ví dụ bên dưới, chúng tôi gỡ cài đặt hoàn toàn gói có dnf và không có thông báo nào xuất ra.

Mã nguồn [Chọn]
[root@centos7 ~]# dnf install httpd -y -q
[root@centos7 ~]#

25. Hiển thị thông tin chi tiết

Ngoài ra, nếu bạn đang khắc phục sự cố, bạn có thể chỉ định tùy chọn -v để bật đầu ra dài dòng. Trong ví dụ chi tiết dưới đây, chúng ta có thể thấy thông tin bổ sung trong đầu ra không có sẵn trước đó.

Mã nguồn [Chọn]
[root@centos7 ~]# dnf remove httpd -y -v
cachedir: /var/cache/dnf/x86_64/7/x86_64/7
Loaded plugins: builddep, config-manager, debuginfo-install, download, generate_completion_cache, kickstart, needs-restarting, noroot, protected_packages, Query, reposync
DNF version: 0.6.4
repo: using cache for: epel
not found deltainfo for: Extra Packages for Enterprise Linux 7 - x86_64
repo: using cache for: base
not found deltainfo for: CentOS-7 - Base
not found updateinfo for: CentOS-7 - Base
repo: using cache for: updates
not found updateinfo for: CentOS-7 - Updates
repo: using cache for: extras
not found updateinfo for: CentOS-7 - Extras
Using metadata from Fri Dec 30 00:39:53 2016
--> Starting dependency resolution
--> Finding unneeded leftover dependencies
---> Package httpd.x86_64 2.4.6-45.el7.centos will be erased
--> Finished dependency resolution
Dependencies resolved.
========================================================================
 Package           Arch      Version                 Repository     Size
========================================================================
Removing:
 httpd             x86_64    2.4.6-45.el7.centos     @System       9.4 M

Transaction Summary
========================================================================
Remove  1 Package

Installed size: 9.4 M
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Erasing     : httpd-2.4.6-45.el7.centos.x86_64             1/1
  Verifying   : httpd-2.4.6-45.el7.centos.x86_64             1/1

Removed:
  httpd.x86_64 2.4.6-45.el7.centos

Completion plugin: Generating completion cache...
Complete!

Hướng dẫn này đã trình bày cách sử dụng dnf với 25 ví dụ khác nhau, trong đó bạn có thể thực tế đặt lệnh dnf để sử dụng trong Linux.