{"id":47366,"date":"2022-06-27T20:02:18","date_gmt":"2022-06-27T20:02:18","guid":{"rendered":"https:\/\/linuxiac.com\/?p=47366"},"modified":"2023-04-24T22:26:26","modified_gmt":"2023-04-24T22:26:26","slug":"dnf-command-linux","status":"publish","type":"post","link":"https:\/\/linuxiac.com\/dnf-command-linux\/","title":{"rendered":"DNF Command-Line Package Manager in Linux: A Complete Guide"},"content":{"rendered":"\n<div class=\"wp-block-ultimate-post-table-of-content ultp-block-46f424\"><div class=\"ultp-block-wrapper\"><div class=\"ultp-block-toc\"><div class=\"ultp-toc-header\"><div class=\"ultp-toc-heading\">Table of Contents<\/div><div class=\"ultp-collapsible-toggle  ultp-collapsible-right\"><a class=\"ultp-collapsible-text ultp-collapsible-open\" href=\"javascript:;\">[Open]<\/a><a class=\"ultp-collapsible-text ultp-collapsible-hide\" href=\"javascript:;\">[Close]<\/a><\/div><\/div><div class=\"ultp-block-toc-style1 ultp-block-toc-body\" style=\"display:block;\"><ul class=\"ultp-toc-lists\"><li><a href=\"#What_is_DNF_Package_Manager?\">What is DNF Package Manager?<\/a><\/li><li><a href=\"#Differences_Between_DNF_and_YUM\">Differences Between DNF and YUM<\/a><\/li><li><a href=\"#Check_for_Updates\">Check for Updates<\/a><\/li><li><a href=\"#Update_Packages\">Update Packages<\/a><ul class=\"ultp-toc-lists\"><li><a href=\"#Full_System_Update\">Full System Update<\/a><\/li><li><a href=\"#Update_Certain_Packages_Only\">Update Certain Packages Only<\/a><\/li><li><a href=\"#Exclude_Package_from_Being_Updated\">Exclude Package from Being Updated<\/a><\/li><\/ul><\/li><li><a href=\"#Search_Packages\">Search Packages<\/a><\/li><li><a href=\"#Install_Packages\">Install Packages<\/a><\/li><li><a href=\"#Reinstall_Packages\">Reinstall Packages<\/a><\/li><li><a href=\"#Local_Install_of_RPM_File\">Local Install of RPM File<\/a><\/li><li><a href=\"#Download_Package_RPM_File\">Download Package RPM File<\/a><\/li><li><a href=\"#Remove_Packages\">Remove Packages<\/a><\/li><li><a href=\"#Remove_Unnecessary_Packages\">Remove Unnecessary Packages<\/a><\/li><li><a href=\"#Downgrade_Packages\">Downgrade Packages<\/a><\/li><li><a href=\"#DNF_Software_Groups\">DNF Software Groups<\/a><ul class=\"ultp-toc-lists\"><li><a href=\"#List_Software_Groups\">List Software Groups<\/a><\/li><li><a href=\"#List_Software_Groups_Packages\">List Software Groups&#8217; Packages<\/a><\/li><li><a href=\"#Install_Software_Groups\">Install Software Groups<\/a><\/li><li><a href=\"#Remove_Software_Group\">Remove Software Group<\/a><\/li><\/ul><\/li><li><a href=\"#List_Packages\">List Packages<\/a><ul class=\"ultp-toc-lists\"><li><a href=\"#List_All_Packages\">List All Packages<\/a><\/li><li><a href=\"#List_All_Installed_Packages\">List All Installed Packages<\/a><\/li><li><a href=\"#List_All_Installed_Packages_from_the_Particular_Repo\">List All Installed Packages from the Particular Repo<\/a><\/li><li><a href=\"#Find_Installed_Packages\">Find Installed Packages<\/a><\/li><\/ul><\/li><li><a href=\"#View_Package_Information\">View Package Information<\/a><\/li><li><a href=\"#Clear_Caches\">Clear Caches<\/a><\/li><li><a href=\"#Manage_Software_Repositories\">Manage Software Repositories<\/a><ul class=\"ultp-toc-lists\"><li><a href=\"#List_Installed_Repositories\">List Installed Repositories<\/a><\/li><li><a href=\"#Adding_Repositories\">Adding Repositories<\/a><\/li><li><a href=\"#Enable_Repository\">Enable Repository<\/a><\/li><li><a href=\"#Disable_Repository\">Disable Repository<\/a><\/li><\/ul><\/li><li><a href=\"#DNF_Transactions_History\">DNF Transactions History<\/a><\/li><li><a href=\"#Revert_and_Repeat_Transactions\">Revert and Repeat Transactions<\/a><\/li><li><a href=\"#Conclusion\">Conclusion<\/a><\/li><\/ul><\/div><\/div><\/div><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"What_is_DNF_Package_Manager?\">What is DNF Package Manager?<\/h2>\n\n\n\n<p>DNF (Dandified YUM) is a package manager for RPM-based Linux distributions, including RHEL, Fedora, CentOS, AlmaLinux, Rocky Linux, and Oracle Linux. It was initially introduced in Fedora 18 in 2013.<\/p>\n\n\n\n<p>DNF simplifies package maintenance by automatically checking for dependencies and determining the actions needed to install, remove, update, or perform any other operation on your Linux system&#8217;s package base.<\/p>\n\n\n\n<p>Furthermore, the DNF package manager allows you to manage and collect information about software repositories on your Linux system.<\/p>\n\n\n\n<p>Many of you are likely familiar with its predecessor, YUM. So, before we go any further, let&#8217;s look over the benefits of DNF over YUM.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Differences_Between_DNF_and_YUM\">Differences Between DNF and YUM<\/h2>\n\n\n\n<p>Like the DNF, YUM (YellowDog Updater Modified) is a package manager used to manage the software packages&#8217; installation, update, and removal in an RPM-based Linux system.<\/p>\n\n\n\n<p>Unfortunately, YUM has some issues, the most severe of which are poor performance, excessive memory utilization, and dependency resolution delay. All of this led to the development of a superior version of YUM, resulting in DNF&#8217;s emergence.<\/p>\n\n\n\n<p>With that said, we can outline the following most essential advantages of DNF over YUM:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>DNF utilizes the&nbsp;<a href=\"https:\/\/github.com\/openSUSE\/libsolv\" target=\"_blank\" rel=\"noreferrer noopener\">libsolv<\/a>&nbsp;(created and maintained by&nbsp;<a href=\"https:\/\/linuxiac.com\/opensuse\/\" target=\"_blank\" rel=\"noreferrer noopener\">openSUSE<\/a>) to resolve dependencies, which is a more efficient dependency resolution library.<\/li>\n\n\n\n<li>Because DNF was developed in C, C++, and Python, it is fast and light on memory. In contrast, YUM was written entirely in Python.<\/li>\n\n\n\n<li>DNF&#8217;s API is fully documented. In contrast, because the YUM&#8217;s API is not properly documented, it is challenging to add new functionality.<\/li>\n\n\n\n<li>YUM only supports Python extensions, whereas DNF supports many extensions.<\/li>\n<\/ul>\n\n\n\n<p>Now that you know what DNF is and why it is superior to YUM let&#8217;s get into this guide: how to use DNF to manage software packages in RPM-based Linux distributions.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Check_for_Updates\">Check for Updates<\/h2>\n\n\n\n<p>One of the most commonly used DNF commands is the check for available software package updates.<\/p>\n\n\n\n<p>Using the command below, you can obtain a list of all packages from your enabled software repositories that are available for updating your existing packages on your system.<\/p>\n\n\n\n<p>The command checks for updates but does not download or install the packages.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code lang=\"bash\" class=\"hljs language-bash\">sudo dnf check-update<\/code><\/span><\/pre>\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-updates.png\"><img decoding=\"async\" width=\"960\" height=\"222\" src=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-updates.png\" alt=\"Check for updates\" class=\"wp-image-47378\" srcset=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-updates.png 960w, https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-updates-380x88.png 380w, https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-updates-768x178.png 768w\" sizes=\"(max-width: 960px) 100vw, 960px\" \/><\/a><\/figure>\n\n\n\n<p>In our case, no packages are available for updating, but if any are, they will be listed.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Update_Packages\">Update Packages<\/h2>\n\n\n\n<p>The most commonly used actions are update operations on currently installed packages. They help to ensure the security and seamless operation of your Linux system. So let&#8217;s have a look at them now.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"Full_System_Update\">Full System Update<\/h3>\n\n\n\n<p>If any updates are available, use the following command to install them all.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code lang=\"bash\" class=\"hljs language-bash\">sudo dnf update<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\" id=\"Update_Certain_Packages_Only\">Update Certain Packages Only<\/h3>\n\n\n\n<p>Alternatively, use the following command to update only the selected packages, for example, <code>nginx<\/code> and <code>mariadb<\/code>.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code lang=\"bash\" class=\"hljs language-bash\">sudo dnf update nginx mariadb<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\" id=\"Exclude_Package_from_Being_Updated\">Exclude Package from Being Updated<\/h3>\n\n\n\n<p>Sometimes, you may decide that specific packages should not be updated. The <code>-x<\/code> (<code>--exclude<\/code>) options come in handy in this situation.<\/p>\n\n\n\n<p>The following example shows how to update the entire system while explicitly excluding the <code>nginx<\/code> and <code>mariadb<\/code> packages from being updated.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code lang=\"bash\" class=\"hljs language-bash\">sudo dnf update --exclude nginx mariadb<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\" id=\"Search_Packages\">Search Packages<\/h2>\n\n\n\n<p>Another basic DNF functionality that is widely used is packet search. For example, if we want to see whether the <code>nginx<\/code> package is available in one of the software repositories, type the following command:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code lang=\"bash\" class=\"hljs language-bash\">sudo dnf search nginx<\/code><\/span><\/pre>\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-search.png\"><img decoding=\"async\" width=\"962\" height=\"389\" src=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-search.png\" alt=\"Search packages\" class=\"wp-image-47381\" srcset=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-search.png 962w, https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-search-380x154.png 380w, https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-search-768x311.png 768w\" sizes=\"(max-width: 962px) 100vw, 962px\" \/><\/a><\/figure>\n\n\n\n<p>As you can see, the command lists all packages that match the word &#8220;nginx.&#8221;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Install_Packages\">Install Packages<\/h2>\n\n\n\n<p>To install a new package using the <code>dnf<\/code> command, for example,&nbsp;<code>nginx<\/code>, run:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code lang=\"bash\" class=\"hljs language-bash\">sudo dnf install nginx<\/code><\/span><\/pre>\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-install.png\"><img decoding=\"async\" width=\"960\" height=\"492\" src=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-install.png\" alt=\"Install packages\" class=\"wp-image-47384\" srcset=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-install.png 960w, https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-install-380x195.png 380w, https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-install-768x394.png 768w\" sizes=\"(max-width: 960px) 100vw, 960px\" \/><\/a><\/figure>\n\n\n\n<p>You will be prompted for confirmation during the command execution and need to type <code>y<\/code> to proceed with the installation. However, you can suppress this confirmation prompt by adding <code>-y<\/code> to the end of the command.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code lang=\"bash\" class=\"hljs language-bash\">sudo dnf install nginx -y<\/code><\/span><\/pre>\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>To install multiple packages simultaneously, line up the package names one after the other, separated by a space.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code lang=\"bash\" class=\"hljs language-bash\">sudo dnf install nginx mariadb<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\" id=\"Reinstall_Packages\">Reinstall Packages<\/h2>\n\n\n\n<p>Unfortunately, a package can cause an error during installation and fail installation. In this situation, we can try reinstalling it using the <code>reinstall<\/code> option.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code lang=\"bash\" class=\"hljs language-bash\">sudo dnf reinstall nginx<\/code><\/span><\/pre>\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-reintall.png\"><img decoding=\"async\" width=\"957\" height=\"406\" src=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-reintall.png\" alt=\"Reinstall packages\" class=\"wp-image-47393\" srcset=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-reintall.png 957w, https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-reintall-380x161.png 380w, https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-reintall-768x326.png 768w\" sizes=\"(max-width: 957px) 100vw, 957px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Local_Install_of_RPM_File\">Local Install of RPM File<\/h2>\n\n\n\n<p>Sometimes we need to install a previously downloaded RPM installation file locally. To do so, run the <code>dnf<\/code> command with the <code>install<\/code> option followed by the complete path to the RPM package.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code lang=\"bash\" class=\"hljs language-bash\">sudo dnf install \/home\/linuxiac\/nginx-1.20.1-10.el9.alma.x86_64.rpm<\/code><\/span><\/pre>\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-localinstall.png\"><img decoding=\"async\" width=\"961\" height=\"513\" src=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-localinstall.png\" alt=\"Local install of RPM file\" class=\"wp-image-47390\" srcset=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-localinstall.png 961w, https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-localinstall-380x203.png 380w, https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-localinstall-768x410.png 768w\" sizes=\"(max-width: 961px) 100vw, 961px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Download_Package_RPM_File\">Download Package RPM File<\/h2>\n\n\n\n<p>Rather than installing a package, we can optionally only download the <code>.rpm<\/code> installation file from the repository. By default, the package is downloaded to the current working directory.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code lang=\"bash\" class=\"hljs language-bash\">sudo dnf download nginx<\/code><\/span><\/pre>\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-download.png\"><img decoding=\"async\" width=\"960\" height=\"408\" src=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-download.png\" alt=\"Download package RPM installation file\" class=\"wp-image-47387\" srcset=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-download.png 960w, https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-download-380x162.png 380w, https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-download-768x326.png 768w\" sizes=\"(max-width: 960px) 100vw, 960px\" \/><\/a><\/figure>\n\n\n\n<p>However, if you want to download the installation <code>.rpm<\/code> file to a directory other than the current one, use the <code>--destdir<\/code> option followed by the directory path.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code lang=\"bash\" class=\"hljs language-bash\">sudo dnf download nginx --destdir \/tmp\/<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\" id=\"Remove_Packages\">Remove Packages<\/h2>\n\n\n\n<p>Another commonly used functionality of the DNF package manager is package removal\/uninstallation. The <code>remove<\/code> parameter can be used to uninstall packages.<\/p>\n\n\n\n<p>For example, to uninstall the <code>nginx<\/code> package, you should run:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code lang=\"bash\" class=\"hljs language-bash\">sudo dnf remove nginx<\/code><\/span><\/pre>\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-remove.png\"><img decoding=\"async\" width=\"961\" height=\"426\" src=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-remove.png\" alt=\"Remove packages\" class=\"wp-image-47396\" srcset=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-remove.png 961w, https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-remove-380x168.png 380w, https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-remove-768x340.png 768w\" sizes=\"(max-width: 961px) 100vw, 961px\" \/><\/a><\/figure>\n\n\n\n<p>If you want to uninstall multiple packages from your Linux system, type their names one after the other, separated by a space.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code lang=\"bash\" class=\"hljs language-bash\">sudo dnf remove nginx mysql<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\" id=\"Remove_Unnecessary_Packages\">Remove Unnecessary Packages<\/h2>\n\n\n\n<p>Removing unneeded packages helps to reduce disk usage and potential issues. For example, the <code>autoremove<\/code> option removes from the system all &#8220;leaf&#8221; packages installed as dependencies of user-installed packages but no longer required by any such package.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code lang=\"bash\" class=\"hljs language-bash\">sudo dnf autoremove<\/code><\/span><\/pre>\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-autoremove.png\"><img decoding=\"async\" width=\"959\" height=\"427\" src=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-autoremove.png\" alt=\"Remove unnecessary packages\" class=\"wp-image-47399\" srcset=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-autoremove.png 959w, https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-autoremove-380x169.png 380w, https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-autoremove-768x342.png 768w\" sizes=\"(max-width: 959px) 100vw, 959px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Downgrade_Packages\">Downgrade Packages<\/h2>\n\n\n\n<p>In some cases, you may want to revert to the previously updated version of a package. For example, if an undetected bug in the updated version is causing an error in your system.<\/p>\n\n\n\n<p>So, to downgrade a previously updated package, for example, <code>nginx<\/code>, use the following command:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code lang=\"bash\" class=\"hljs language-bash\">sudo dnf downgrade nginx<\/code><\/span><\/pre>\n\n\n<h2 class=\"wp-block-heading\" id=\"DNF_Software_Groups\">DNF Software Groups<\/h2>\n\n\n\n<p>The software groups are a well-known feature of the <code>dnf<\/code> command that allows you to group many packages under a single name. In other words, they are a collection of packages that all serve the same goal, for example, &#8220;Development Tools.&#8221;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"List_Software_Groups\">List Software Groups<\/h3>\n\n\n\n<p>Using the software  groups dramatically simplifies the software installation process. For example, if you want to install the whole set of development tools, including compilers, libraries, and so on, you&#8217;ll have to install dozens, if not hundreds, of packages individually.<\/p>\n\n\n\n<p>Fortunately, this problem is easily solved by using predefined software groups. So, if you want to list all available software groups, you will achieve this task as shown below:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code lang=\"bash\" class=\"hljs language-bash\">sudo dnf grouplist<\/code><\/span><\/pre>\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-grouplist.png\"><img decoding=\"async\" width=\"961\" height=\"682\" src=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-grouplist.png\" alt=\"List software groups\" class=\"wp-image-47402\" srcset=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-grouplist.png 961w, https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-grouplist-380x270.png 380w, https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-grouplist-768x545.png 768w\" sizes=\"(max-width: 961px) 100vw, 961px\" \/><\/a><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"List_Software_Groups_Packages\">List Software Groups&#8217; Packages<\/h3>\n\n\n\n<p>Once we&#8217;ve figured out how to view the list of available software groups, we should know what packages they contain. So, to view the available packages in the &#8220;Development Tools&#8221; group, for example, type:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code lang=\"bash\" class=\"hljs language-javascript language-bash\">sudo dnf groupinfo <span class=\"hljs-string\">\"Development Tools\"<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-groupinfo.png\"><img decoding=\"async\" width=\"958\" height=\"640\" src=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-groupinfo.png\" alt=\"List software groups' packages\" class=\"wp-image-47405\" srcset=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-groupinfo.png 958w, https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-groupinfo-380x254.png 380w, https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-groupinfo-768x513.png 768w\" sizes=\"(max-width: 958px) 100vw, 958px\" \/><\/a><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"Install_Software_Groups\">Install Software Groups<\/h3>\n\n\n\n<p>Using the <code>groupinstall<\/code> option makes installing a software group a breeze. For example, if you want to install the &#8220;Development Tools&#8221; group, you will achieve this task as shown below:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code lang=\"bash\" class=\"hljs language-javascript language-bash\">sudo dnf groupinstall <span class=\"hljs-string\">\"Development Tools\"<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-groupinstall.png\"><img decoding=\"async\" width=\"959\" height=\"659\" src=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-groupinstall.png\" alt=\"Install software groups\" class=\"wp-image-47408\" srcset=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-groupinstall.png 959w, https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-groupinstall-380x261.png 380w, https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-groupinstall-768x528.png 768w\" sizes=\"(max-width: 959px) 100vw, 959px\" \/><\/a><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"Remove_Software_Group\">Remove Software Group<\/h3>\n\n\n\n<p>Similar to installation, uninstalling an entire software group is simple by using the <code>groupremove<\/code> option.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code lang=\"bash\" class=\"hljs language-javascript language-bash\">sudo dnf groupremove <span class=\"hljs-string\">\"Development Tools\"<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-groupremove.png\"><img decoding=\"async\" width=\"1002\" height=\"683\" src=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-groupremove.png\" alt=\"Remove software group\" class=\"wp-image-47411\" srcset=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-groupremove.png 1002w, https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-groupremove-380x259.png 380w, https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-groupremove-768x523.png 768w\" sizes=\"(max-width: 1002px) 100vw, 1002px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"List_Packages\">List Packages<\/h2>\n\n\n\n<p>When we are looking for a package or want to check if a package is already installed on our system, displaying a list of packages can be pretty helpful. So let&#8217;s look at how to get this information using the <code>dnf<\/code> command.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"List_All_Packages\">List All Packages<\/h3>\n\n\n\n<p>To see a list of all available packages, run the command below. Again, we clarify that it will output a massive list of packages. These include all packages installed locally on your system and all packages available for installation in your system&#8217;s available and allowed repositories.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code lang=\"bash\" class=\"hljs language-php language-bash\">sudo dnf <span class=\"hljs-keyword\">list<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\" id=\"List_All_Installed_Packages\">List All Installed Packages<\/h3>\n\n\n\n<p>The command below will return a complete list of all RPM packages installed locally on your Linux system.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code lang=\"bash\" class=\"hljs language-php language-bash\">sudo dnf <span class=\"hljs-keyword\">list<\/span> installed<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\" id=\"List_All_Installed_Packages_from_the_Particular_Repo\">List All Installed Packages from the Particular Repo<\/h3>\n\n\n\n<p>If you want to see a list of packages installed on your system from a particular repository, for example, those from the EPEL repo, type:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code lang=\"bash\" class=\"hljs language-php language-bash\">sudo dnf repository-packages epel <span class=\"hljs-keyword\">list<\/span> installed<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-list-installed-by-repo.png\"><img decoding=\"async\" width=\"956\" height=\"361\" src=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-list-installed-by-repo.png\" alt=\"List all installed packages from the particular repository.\" class=\"wp-image-53899\" srcset=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-list-installed-by-repo.png 956w, https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-list-installed-by-repo-380x143.png 380w, https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-list-installed-by-repo-768x290.png 768w\" sizes=\"(max-width: 956px) 100vw, 956px\" \/><\/a><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"Find_Installed_Packages\">Find Installed Packages<\/h3>\n\n\n\n<p>Using the <code>dnf list installed<\/code> command is one of the most valuable and practical. You can use it to see if a package is installed on your system.<\/p>\n\n\n\n<p>For example, to see if the <code>nginx<\/code> package is installed, run the <code>dnf list installed<\/code> command and <a href=\"https:\/\/linuxiac.com\/how-to-use-pipes-and-named-pipes-in-linux-explained-with-examples\/\">pipe the result<\/a> to the <code>grep<\/code> command, followed by the name of the package you&#8217;re looking for.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code lang=\"bash\" class=\"hljs language-php language-bash\">sudo dnf <span class=\"hljs-keyword\">list<\/span> installed | grep nginx<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-check-installed.png\"><img decoding=\"async\" width=\"1001\" height=\"199\" src=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-check-installed.png\" alt=\"Find installed packages\" class=\"wp-image-47414\" srcset=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-check-installed.png 1001w, https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-check-installed-380x76.png 380w, https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-check-installed-768x153.png 768w\" sizes=\"(max-width: 1001px) 100vw, 1001px\" \/><\/a><\/figure>\n\n\n\n<p>As we can see, the command returns information on the package (if it is locally installed), its version, and the repository to which it belongs.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"View_Package_Information\">View Package Information<\/h2>\n\n\n\n<p>The <code>info<\/code> option can be used to view more detailed information about a package. This gives us helpful information such as the architecture, version number, release number, total size, and a description of what the package actually performs.<\/p>\n\n\n\n<p>For example, to see the <code>nginx<\/code> package info, run the command below:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code lang=\"bash\" class=\"hljs language-bash\">sudo dnf info nginx<\/code><\/span><\/pre>\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-info.png\"><img decoding=\"async\" width=\"971\" height=\"512\" src=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-info.png\" alt=\"View package information\" class=\"wp-image-47417\" srcset=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-info.png 971w, https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-info-380x200.png 380w, https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-info-768x405.png 768w\" sizes=\"(max-width: 971px) 100vw, 971px\" \/><\/a><\/figure>\n\n\n\n<p>It is important to note that the command will return information about the package, whether or not it is installed locally on your Linux system.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Clear_Caches\">Clear Caches<\/h2>\n\n\n\n<p>The DNF package manager caches files in the <code>\/var\/cache\/dnf<\/code> directory. This includes any such data left over from disabled or removed repositories and for various distribution release versions.<\/p>\n\n\n\n<p>Of course, manually <a href=\"https:\/\/linuxiac.com\/delete-files-and-directories-in-linux\/\">deleting files or directories<\/a> under \/var\/cache\/dnf is not recommended. So, to remove them use the command shown below.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code lang=\"bash\" class=\"hljs language-bash\">sudo dnf clean all<\/code><\/span><\/pre>\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-clear-cache.png\"><img decoding=\"async\" width=\"990\" height=\"200\" src=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-clear-cache.png\" alt=\"Clear caches\" class=\"wp-image-47426\" srcset=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-clear-cache.png 990w, https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-clear-cache-380x77.png 380w, https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-clear-cache-768x155.png 768w\" sizes=\"(max-width: 990px) 100vw, 990px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Manage_Software_Repositories\">Manage Software Repositories<\/h2>\n\n\n\n<p>A package repository (in the context of DNF) is a repository for storing and managing RPM software installation packages. It supports clients such as DNF and YUM, which are used to manage binary packages in RHEL-based Linux distributions such as CentOS, AlmaLinux, Rocky Linux, and Oracle Linux.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"List_Installed_Repositories\">List Installed Repositories<\/h3>\n\n\n\n<p>The following command will display all (enabled and disabled) package repositories available on your Linux system:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code lang=\"bash\" class=\"hljs language-bash\">sudo dnf repolist --all<\/code><\/span><\/pre>\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><a href=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-repolist-all.png\"><img decoding=\"async\" width=\"1024\" height=\"931\" src=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-repolist-all-1024x931.png\" alt=\"List installed repositories\" class=\"wp-image-47420\" srcset=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-repolist-all-1024x931.png 1024w, https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-repolist-all-380x346.png 380w, https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-repolist-all-768x698.png 768w, https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-repolist-all.png 1048w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Furthermore, if you just want a list of allowed repositories only, type:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code lang=\"bash\" class=\"hljs language-bash\">sudo dnf repolist<\/code><\/span><\/pre>\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-repolist-enabled.png\"><img decoding=\"async\" width=\"1003\" height=\"241\" src=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-repolist-enabled.png\" alt=\"List installed repositories\" class=\"wp-image-47423\" srcset=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-repolist-enabled.png 1003w, https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-repolist-enabled-380x91.png 380w, https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-repolist-enabled-768x185.png 768w\" sizes=\"(max-width: 1003px) 100vw, 1003px\" \/><\/a><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"Adding_Repositories\">Adding Repositories<\/h3>\n\n\n\n<p>A new repository can be added by manually editing or creating a new <code>.repo<\/code> file in the <code>\/etc\/yum.repos.d<\/code> directory. However, the DNF package manager makes it significantly easier to add a software repository so you can install or update packages from it.<\/p>\n\n\n\n<p>The <code>dnf config-manager<\/code> command can be used to add a persistent repository. Provide a known repository URL after the <code>--add-repo<\/code> option and a <code>.repo<\/code> file based on the name of the specified repository URL will be created.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code lang=\"bash\" class=\"hljs language-javascript language-bash\">sudo dnf config-manager --add-repo https:<span class=\"hljs-comment\">\/\/rpms.remirepo.net\/enterprise\/9\/remi\/x86_64\/<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><a href=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-add-repo.png\"><img decoding=\"async\" width=\"1024\" height=\"245\" src=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-add-repo-1024x245.png\" alt=\"Adding repositories\" class=\"wp-image-47429\" srcset=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-add-repo-1024x245.png 1024w, https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-add-repo-380x91.png 380w, https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-add-repo-768x184.png 768w, https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-add-repo.png 1099w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"Enable_Repository\">Enable Repository<\/h3>\n\n\n\n<p>To enable a particular repository, type the following command, where the last argument is the repository ID. For example, the output of the <code>dnf repolist --all<\/code> command provides you with the repositories IDs.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code lang=\"bash\" class=\"hljs language-css language-bash\"><span class=\"hljs-selector-tag\">sudo<\/span> <span class=\"hljs-selector-tag\">dnf<\/span> <span class=\"hljs-selector-tag\">config-manager<\/span> <span class=\"hljs-selector-tag\">--set-enabled<\/span> <span class=\"hljs-selector-tag\">rpms<\/span><span class=\"hljs-selector-class\">.remirepo<\/span><span class=\"hljs-selector-class\">.net_enterprise_9_remi_x86_64_<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\" id=\"Disable_Repository\">Disable Repository<\/h3>\n\n\n\n<p>Alternatively, you can disable a software package repository, such as running:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code lang=\"bash\" class=\"hljs language-css language-bash\"><span class=\"hljs-selector-tag\">sudo<\/span> <span class=\"hljs-selector-tag\">dnf<\/span> <span class=\"hljs-selector-tag\">config-manager<\/span> <span class=\"hljs-selector-tag\">--set-disabled<\/span> <span class=\"hljs-selector-tag\">rpms<\/span><span class=\"hljs-selector-class\">.remirepo<\/span><span class=\"hljs-selector-class\">.net_enterprise_9_remi_x86_64_<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\" id=\"DNF_Transactions_History\">DNF Transactions History<\/h2>\n\n\n\n<p>The <code>dnf history<\/code> command lets users view a DNF transactions timeline, including the dates and times they happened.<\/p>\n\n\n\n<p>Additionally, the command provides the number of packages involved, whether transactions succeeded or were canceled, and whether the RPM database was altered between transactions.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code lang=\"bash\" class=\"hljs language-bash\">sudo dnf history<\/code><\/span><\/pre>\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><a href=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-history.png\"><img decoding=\"async\" width=\"1024\" height=\"405\" src=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-history-1024x405.png\" alt=\"DNF transactions history\" class=\"wp-image-47432\" srcset=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-history-1024x405.png 1024w, https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-history-380x150.png 380w, https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-history-768x304.png 768w, https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-history.png 1032w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Furthermore, the <code>dnf history<\/code> command can also be used to undo or redo certain transactions.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Revert_and_Repeat_Transactions\">Revert and Repeat Transactions<\/h2>\n\n\n\n<p>In addition to reviewing the transaction history, the <code>dnf history<\/code> command allows you to roll back or repeat a specific transaction.<\/p>\n\n\n\n<p>To revert (undo) a transaction, for example, with ID 6 (install nginx) from the table above, type the following:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code lang=\"bash\" class=\"hljs language-bash\">sudo dnf history undo 6<\/code><\/span><\/pre>\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-undo.png\"><img decoding=\"async\" width=\"981\" height=\"471\" src=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-undo.png\" alt=\"DNF undo transaction\" class=\"wp-image-47435\" srcset=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-undo.png 981w, https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-undo-380x182.png 380w, https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-undo-768x369.png 768w\" sizes=\"(max-width: 981px) 100vw, 981px\" \/><\/a><\/figure>\n\n\n\n<p>Similarly, to repeat (redo) a particular transaction, type:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code lang=\"bash\" class=\"hljs language-bash\">sudo dnf history redo 6<\/code><\/span><\/pre>\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-redo.png\"><img decoding=\"async\" width=\"978\" height=\"469\" src=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-redo.png\" alt=\"DNF redo transaction\" class=\"wp-image-47438\" srcset=\"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-redo.png 978w, https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-redo-380x182.png 380w, https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-redo-768x368.png 768w\" sizes=\"(max-width: 978px) 100vw, 978px\" \/><\/a><\/figure>\n\n\n\n<p>It is important to note that the <code>undo<\/code> and <code>redo<\/code> commands revert or repeat the steps taken during a transaction and will fail if the required packages are unavailable.<\/p>\n\n\n\n<p>In other words, if the transaction installs a new package, the <code>undo<\/code> command will remove it and attempt to downgrade all updated packages to their prior version. Still, the command will fail if the relevant packages are not available.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Conclusion\">Conclusion<\/h2>\n\n\n\n<p>This was our complete DNF package manager guide with examples. It can also be used as a quick reference for the <code>dnf<\/code> command. It gives you the information you need to manage the software on your Linux RPM-based system.<\/p>\n\n\n\n<p>Of course, the DNF package manager provides even more options. However, we strongly advise you to familiarize yourself with them from <a href=\"https:\/\/dnf.readthedocs.io\/en\/latest\/index.html\" target=\"_blank\" rel=\"noreferrer noopener\">the official DNF documentation<\/a>.<\/p>\n\n\n\n<p>Hopefully, this guide was helpful in your DNF journey with RPM-based Linux distros. Any suggestions and comments are welcome in the section below.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This article is a complete guide on using the DNF command in Linux to manage and maintain the software package base.<\/p>\n","protected":false},"author":10,"featured_media":47369,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8,4417],"tags":[3248,3242,1484,4749,2089,2016,3138,3254,4746],"class_list":["post-47366","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tips","category-linux-knowledge","tag-almalinux","tag-centos","tag-commands","tag-dnf","tag-oracle-linux","tag-package-manager","tag-rhel","tag-rocky-linux","tag-yum"],"blocksy_meta":{"post_title_panel":"","has_hero_section":"default","42f7b397491934acd5c8c4decd6c5cf0":"","hero_section":"type-2","hero_elements":[{"id":"custom_title","enabled":true,"heading_tag":"h1","title":"Home","__id":"S0VelBivUfzvYe4WNhODv"},{"id":"custom_description","enabled":false,"description_visibility":{"desktop":true,"tablet":true,"mobile":false},"__id":"wjjiuYmsi-uyCk73M3KX5"},{"id":"custom_meta","enabled":true,"meta_elements":[{"id":"author","enabled":true,"label":"By","has_author_avatar":"no","avatar_size":50,"__id":"fsD3z_YSO1tblYykdiGIe"},{"id":"post_date","enabled":false,"label":"On","date_format_source":"default","date_format":"M j, Y","__id":"Q9wDnUv5dwHJQvYTI1hak"},{"id":"updated_date","enabled":true,"label":"Updated","date_format_source":"default","date_format":"M j, Y","__id":"La6kCTRFu7DFXQk6uzYc9"},{"id":"categories","enabled":false,"label":"In","style":"simple","__id":"xEb98BIMmMjQxSO8HRKXa"},{"id":"comments","enabled":true,"__id":"FLu_fO3FFYTWWjHbgcG9Y"}],"page_meta_elements":{"joined":true,"articles_count":true,"comments":true},"__id":"hm7azXf281V674ypdA9vS","meta_divider":"circle","meta_type":"label"},{"id":"breadcrumbs","enabled":false,"__id":"L_dyIkT3hAt-Nli7dZRJj"}],"77f28c81a9cc3d0517c9f8f873f23f08":"","hero_alignment1":"CT_CSS_SKIP_RULE","hero_margin":40,"hero_alignment2":"center","hero_vertical_alignment":"center","d8323e90619cd85fdeacba82839340b3":"","hero_structure":"normal","2e691913f530a01b5e8e71c758eb8fbd":"","page_title_bg_type":"custom_image","custom_hero_background":{"attachment_id":47372,"url":"https:\/\/linuxiac.com\/wp-content\/uploads\/2022\/06\/dnf-header-1024x237.jpg"},"page_title_image_size":"full","parallax":{"desktop":false,"tablet":false,"mobile":false},"37e3d472caba35540884748af1e4375c":"","hero_height":"250px","pageTitleFont":{"family":"Default","variation":"Default","size":{"desktop":"2.8em","tablet":"2.8em","mobile":"2.8em","__changed":[]},"line-height":"CT_CSS_SKIP_RULE","letter-spacing":"CT_CSS_SKIP_RULE","text-transform":"CT_CSS_SKIP_RULE","text-decoration":"CT_CSS_SKIP_RULE"},"pageTitleFontColor":{"default":{"color":"CT_CSS_SKIP_RULEDEFAULT"}},"pageMetaFont":{"family":"Default","variation":"n6","size":"12px","line-height":"1.3","letter-spacing":"CT_CSS_SKIP_RULE","text-transform":"uppercase","text-decoration":"CT_CSS_SKIP_RULE"},"pageMetaFontColor":{"default":{"color":"CT_CSS_SKIP_RULEDEFAULT"},"hover":{"color":"CT_CSS_SKIP_RULEDEFAULT"}},"page_meta_button_type_font_colors":{"default":{"color":"CT_CSS_SKIP_RULEDEFAULT"},"hover":{"color":"CT_CSS_SKIP_RULEDEFAULT"}},"page_meta_button_type_background_colors":{"default":{"color":"CT_CSS_SKIP_RULEDEFAULT"},"hover":{"color":"CT_CSS_SKIP_RULEDEFAULT"}},"pageExcerptFont":{"family":"Default","variation":"Default","size":"CT_CSS_SKIP_RULE","line-height":"CT_CSS_SKIP_RULE","letter-spacing":"CT_CSS_SKIP_RULE","text-transform":"CT_CSS_SKIP_RULE","text-decoration":"CT_CSS_SKIP_RULE"},"pageExcerptColor":{"default":{"color":"CT_CSS_SKIP_RULEDEFAULT"}},"breadcrumbsFont":{"family":"Default","variation":"Default","size":"CT_CSS_SKIP_RULE","line-height":"CT_CSS_SKIP_RULE","letter-spacing":"CT_CSS_SKIP_RULE","text-transform":"CT_CSS_SKIP_RULE","text-decoration":"CT_CSS_SKIP_RULE"},"breadcrumbsFontColor":{"default":{"color":"CT_CSS_SKIP_RULEDEFAULT"},"initial":{"color":"CT_CSS_SKIP_RULEDEFAULT"},"hover":{"color":"CT_CSS_SKIP_RULEDEFAULT"}},"pageTitleOverlay":{"background_type":"color","background_pattern":"type-1","background_image":{"attachment_id":null,"x":0,"y":0},"gradient":"linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%)","background_repeat":"repeat","background_size":"auto","background_attachment":"scroll","patternColor":{"default":{"color":"#e5e7ea"}},"overlayColor":{"default":{"color":"CT_CSS_SKIP_RULE"}},"backgroundColor":{"default":{"color":"CT_CSS_SKIP_RULE"}}},"pageTitleBackground":{"background_type":"color","background_pattern":"type-1","background_image":{"attachment_id":null,"x":0,"y":0},"gradient":"linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%)","background_repeat":"repeat","background_size":"auto","background_attachment":"scroll","patternColor":{"default":{"color":"#e5e7ea"}},"overlayColor":{"default":{"color":"CT_CSS_SKIP_RULE"}},"backgroundColor":{"default":{"color":"var(--theme-palette-color-6)"}}},"pageTitlePadding":{"top":"50px","bottom":"50px","left":"auto","right":"auto","linked":true},"c580edbc4b18e941caefcab76c2477cc":"","page_structure_type":"default","f6c402808516407b5c7a2b9f56576e65":"","content_style_source":"inherit","content_style":"wide","8dce9be8459f723d30016acf2286dc2c":"","vertical_spacing_source":"inherit","content_area_spacing":"both","background":{"background_type":"color","background_pattern":"type-1","background_image":{"attachment_id":null,"x":0,"y":0},"gradient":"linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%)","background_repeat":"repeat","background_size":"auto","background_attachment":"scroll","patternColor":{"default":{"color":"#e5e7ea"}},"overlayColor":{"default":{"color":"CT_CSS_SKIP_RULE"}},"backgroundColor":{"default":{"color":"CT_CSS_SKIP_RULE"}}},"content_background":{"background_type":"color","background_pattern":"type-1","background_image":{"attachment_id":null,"x":0,"y":0},"gradient":"linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%)","background_repeat":"repeat","background_size":"auto","background_attachment":"scroll","patternColor":{"default":{"color":"#e5e7ea"}},"overlayColor":{"default":{"color":"CT_CSS_SKIP_RULE"}},"backgroundColor":{"default":{"color":"var(--theme-palette-color-8)"}}},"content_boxed_shadow":{"inherit":false,"blur":18,"spread":-6,"v_offset":12,"h_offset":0,"inset":false,"enable":true,"color":{"color":"rgba(34, 56, 101, 0.04)"}},"content_boxed_border":{"width":1,"style":"none","color":{"color":"rgba(44,62,80,0.2)"}},"content_boxed_radius":{"top":"3px","bottom":"3px","left":"3px","right":"3px","linked":true},"boxed_content_spacing":{"desktop":{"top":"40px","bottom":"40px","left":"40px","right":"40px","linked":true},"tablet":{"top":"35px","bottom":"35px","left":"35px","right":"35px","linked":true},"mobile":{"top":"20px","bottom":"20px","left":"20px","right":"20px","linked":true}},"ac916d36807eceee314a6a358396eecf":"","disable_featured_image":"no","disable_post_tags":"no","disable_share_box":"no","disable_author_box":"no","disable_posts_navigation":"no","disable_subscribe_form":"no","12788f70dba4af293d884cbf9f2fecf1":"","disable_related_posts":"no","disable_header":"no","disable_footer":"no","ce3ab9a5cf0811a3f0ff639d10ee17d0":"","header_footer_scripts_panel":"","header_scripts":"","0b2783bfc4306319edfc18f28bf95553":"","header_after_body_scripts":"","89cbdb65b2aba971a93da694c71d3e5c":"","footer_scripts":"","styles_descriptor":{"styles":{"desktop":"","tablet":"","mobile":""},"google_fonts":[],"version":6},"40db39bd68295f3c1d05b2ad7bc42425":"","a8aee1d20f6633fbc8f5e3cb7cde9db3":"","63dab989ff692dfee846ffebaeef8a9c":"","4df70b30860f5928e53f76fca4ec8f18":"","25e84671529546dd529042e0ba7f730b":"","dad2868b07f5ac5c9b183fed71f99744":"","12ca6fc1247804c966fe142b75aa0964":"","bcb85dc398e4361eb3a90f034e24594c":"","bfb11d035855a76c63dc16be8eeeac54":"","92210492cdaacf7a1d3fa325a946717c":"","006348cb3d4bf0f3f61ae6c08a3258b4":"","07e0e7fc88f180f20cfe4d11b0c3d801":"","24b39a5f3b94aaeb49a45debca4d7fcc":""},"_links":{"self":[{"href":"https:\/\/linuxiac.com\/wp-json\/wp\/v2\/posts\/47366","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/linuxiac.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/linuxiac.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/linuxiac.com\/wp-json\/wp\/v2\/users\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/linuxiac.com\/wp-json\/wp\/v2\/comments?post=47366"}],"version-history":[{"count":0,"href":"https:\/\/linuxiac.com\/wp-json\/wp\/v2\/posts\/47366\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/linuxiac.com\/wp-json\/wp\/v2\/media\/47369"}],"wp:attachment":[{"href":"https:\/\/linuxiac.com\/wp-json\/wp\/v2\/media?parent=47366"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/linuxiac.com\/wp-json\/wp\/v2\/categories?post=47366"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/linuxiac.com\/wp-json\/wp\/v2\/tags?post=47366"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}