{"id":4030,"date":"2025-07-25T07:42:00","date_gmt":"2025-07-25T06:42:00","guid":{"rendered":"https:\/\/www.my-it-brain.de\/wordpress\/?p=4030"},"modified":"2025-01-04T19:00:01","modified_gmt":"2025-01-04T18:00:01","slug":"wie-dnf-8-gz-in-den-container-kam","status":"publish","type":"post","link":"https:\/\/www.my-it-brain.de\/wordpress\/wie-dnf-8-gz-in-den-container-kam\/","title":{"rendered":"Wie dnf.8.gz in den Container kam"},"content":{"rendered":"\n<p>Die folgende Geschichte soll mir zur Erinnerung und euch zur Unterhaltung dienen. Sie handelt von CentOS Stream 10, Containern und der <a href=\"https:\/\/de.wikipedia.org\/wiki\/Manpage\">Manpage<\/a> <code>dnf(8)<\/code>. Aber lest selbst.<\/p>\n\n\n\n<p>Es war einmal ein Systemadministrator, der beim Training einige Subkommandos von <code>dnf updateinfo<\/code> kennenlernte, von deren Existenz er bislang nichts wusste. Und diese Subkommandos hei\u00dfen <code>list<\/code>, <code>info<\/code> und <code>summary<\/code>. Neugierig schaute er in die Manpage <code>dnf(8)<\/code>, doch zu seinem Erstaunen schwieg sich diese zu diesen Subkommandos aus.<\/p>\n\n\n\n<p>Wut stieg in unserem Sysadmin auf. Wieder einmal haben sich die Entwickler keine M\u00fche gegeben, die Funktionalit\u00e4t ihrer Anwendung vern\u00fcnftig zu dokumentieren. Die Qualit\u00e4tssicherung hat geschlafen. So kann man doch nicht arbeiten. Doch nach dem ersten Wutanfall beschloss der Sysadmin, der Sache in Ruhe auf den Grund zu gehen, bevor er diesen Misstand anprangern w\u00fcrde.<\/p>\n\n\n\n<p>Die Distribution des Sysadmins ist daf\u00fcr bekannt, dass unter bestimmten Umst\u00e4nden Funktionalit\u00e4t von Upstream zur\u00fcckportiert wird. Vielleicht hatte sich hier eine Diskrepanz eingeschlichen. Vielleicht war dieser Fehler in einer neueren Version ausgemerzt. Um dies schnell zu \u00fcberpr\u00fcfen, wollte unser Sysadmin einen Blick in <code>dnf(8)<\/code> in Centos 10 Stream werfen. Dazu f\u00fchrte er folgende Befehle in einer Kommandozeile aus:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ podman run --rm -it centos:stream10\n&#91;root@01ede4521839 \/]# man 8 dnf\nbash: man: command not found\n&#91;root@01ede4521839 \/]#<\/code><\/pre>\n\n\n\n<p>Mit einem Augenrollen erinnerte sich unser Sysadmin daran, dass Container-Images nur das absolut Notwendige enthalten, um m\u00f6glichst wenig Speicherplatz auf der Festplatte zu belegen. Dar\u00fcber, was absolut notwendig ist, werden seit anbeginn des Containerzeitalters philosophische Streitgespr\u00e4che gef\u00fchrt. Also pr\u00fcfte unser Sysadmin, ob es einen vertrauten Paketmanager gab, um die Manpages nachzuinstallieren:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;root@01ede4521839 \/]# dnf in man-db man-pages\nCentOS Stream 10 - BaseOS                       2.6 MB\/s | 6.2 MB     00:02    \nCentOS Stream 10 - AppStream                    1.5 MB\/s | 2.4 MB     00:01    \nCentOS Stream 10 - Extras packages              3.3 kB\/s | 3.5 kB     00:01    \nDependencies resolved.\n================================================================================\n Package             Architecture   Version                Repository      Size\n================================================================================\nInstalling:\n man-db              x86_64         2.12.0-8.el10          baseos         1.3 M\n man-pages           noarch         6.06-3.el10            baseos         3.7 M\nInstalling dependencies:\n groff-base          x86_64         1.23.0-10.el10         baseos         1.1 M\n less                x86_64         661-3.el10             baseos         191 k\n libpipeline         x86_64         1.5.7-7.el10           baseos          53 k\n\nTransaction Summary\n================================================================================\nInstall  5 Packages\n\nTotal download size: 6.4 M\nInstalled size: 9.9 M\nIs this ok &#91;y\/N]:\n\u2026\nInstalled:\n  groff-base-1.23.0-10.el10.x86_64          less-661-3.el10.x86_64              \n  libpipeline-1.5.7-7.el10.x86_64           man-db-2.12.0-8.el10.x86_64         \n  man-pages-6.06-3.el10.noarch             \n\nComplete!\n&#91;root@01ede4521839 \/]# mandb\nProcessing manual pages under \/usr\/share\/man...\nUpdating index cache for path `\/usr\/share\/man\/man7'. Wait...mandb: can't resolve man7\/groff_man.7\nmandb: warning: \/usr\/share\/man\/man7\/man.7.gz: bad symlink or ROFF `.so' request\nmandb: can't resolve man7\/groff_man.7\nmandb: warning: \/usr\/share\/man\/man7\/man.man-pages.7.gz: bad symlink or ROFF `.so' request\nUpdating index cache for path `\/usr\/share\/man\/man3type'. Wait...done.\nChecking for stray cats under \/usr\/share\/man...\nChecking for stray cats under \/var\/cache\/man...\nProcessing manual pages under \/usr\/local\/share\/man...\nUpdating index cache for path `\/usr\/local\/share\/man\/mann'. Wait...done.\nChecking for stray cats under \/usr\/local\/share\/man...\nChecking for stray cats under \/var\/cache\/man\/local...\n45 man subdirectories contained newer manual pages.\n2701 manual pages were added.\n0 stray cats were added.\n0 old database entries were purged.\n&#91;root@01ede4521839 \/]# man 8 dnf\nNo manual entry for dnf in section 8<\/code><\/pre>\n\n\n\n<p>Resultat: Kein <code>which<\/code>-Befehl verf\u00fcgbar. Diese Container-Image-Kurat\u00f6re sparten aber wirklich an allem. Doch der obige Codeblock enth\u00fcllt noch mehr. Zwar war der Paketmanager <code>dnf<\/code> installiert, auch die Manpages waren nun vorhanden, nur die Manpage <code>dnf(8)<\/code> fehlte immer noch. Und so bem\u00fchte der Sysadmin wieder die Tastatur, um zu pr\u00fcfen, ob die entsprechende Datei tats\u00e4chlich fehlt, welches Paket sie bereitstellt und um das Problem zu l\u00f6sen. Sehet und staunet:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;root@01ede4521839 \/]# stat \/usr\/share\/man\/man8\/dnf.8.gz\nstat: cannot statx '\/usr\/share\/man\/man8\/dnf.8.gz': No such file or directory\n&#91;root@01ede4521839 \/]# dnf provides \/usr\/share\/man\/man8\/dnf.8.gz\n\u2026    \ndnf-4.20.0-9.el10.noarch : Package manager\nRepo        : baseos\nMatched from:\nFilename    : \/usr\/share\/man\/man8\/dnf.8.gz\n&#91;root@01ede4521839 \/]# dnf reinstall dnf\nLast metadata expiration check: 0:01:01 ago on Wed Jan  1 14:31:37 2025.\nDependencies resolved.\n================================================================================\n Package       Architecture     Version                  Repository        Size\n================================================================================\nReinstalling:\n dnf           noarch           4.20.0-9.el10            baseos           478 k\n\nTransaction Summary\n================================================================================\n\nTotal download size: 478 k\nInstalled size: 2.5 M\nIs this ok &#91;y\/N]:y\n\u2026\nReinstalled:\n  dnf-4.20.0-9.el10.noarch                                                      \n\nComplete!\n&#91;root@01ede4521839 \/]# stat \/usr\/share\/man\/man8\/dnf.8.gz\n  File: \/usr\/share\/man\/man8\/dnf.8.gz -&gt; dnf4.8.gz\n  Size: 9         \tBlocks: 8          IO Block: 4096   symbolic link\nDevice: 0,111\tInode: 6118189     Links: 1\nAccess: (0777\/lrwxrwxrwx)  Uid: (    0\/    root)   Gid: (    0\/    root)\nAccess: 2024-10-28 20:00:00.000000000 -0400\nModify: 2024-10-28 20:00:00.000000000 -0400\nChange: 2025-01-01 14:32:59.692356995 -0500\n Birth: 2025-01-01 14:32:59.691356987 -0500<\/code><\/pre>\n\n\n\n<p>\u00dcberzeugt, dass der Spuk nun ein Ende habe, versuchte es unser Sysadmin erneut:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;root@01ede4521839 \/]# man 8 dnf\nNo manual entry for dnf in section 8<\/code><\/pre>\n\n\n\n<p>Moment! Die Datei ist da, die Manpage jedoch nicht? Sind hier dunkle M\u00e4chte am Werke? Nein, denn wie die folgenden Befehle offenbarten, lag die Ursache lediglich in kaputten Symlinks und fehlenden Paketen:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;root@01ede4521839 \/]# ls -l \/usr\/share\/man\/man8\/dnf.8.gz\nlrwxrwxrwx. 1 root root 9 Oct 28 20:00 \/usr\/share\/man\/man8\/dnf.8.gz -&gt; dnf4.8.gz\n&#91;root@01ede4521839 \/]# ls -l \/usr\/share\/man\/man8\/dnf4.8.gz\nls: cannot access '\/usr\/share\/man\/man8\/dnf4.8.gz': No such file or directory\n&#91;root@01ede4521839 \/]# dnf provides \/usr\/share\/man\/man8\/dnf4.8.gz\nLast metadata expiration check: 0:05:59 ago on Wed Jan  1 14:31:37 2025.\n\u2026\npython3-dnf-4.20.0-9.el10.noarch : Python 3 interface to DNF\nRepo        : baseos\nMatched from:\nFilename    : \/usr\/share\/man\/man8\/dnf4.8.gz\n\n&#91;root@01ede4521839 \/]# dnf list python3-dnf\nLast metadata expiration check: 0:06:16 ago on Wed Jan  1 14:31:37 2025.\nInstalled Packages\npython3-dnf.noarch                     4.20.0-9.el10                     @System<\/code><\/pre>\n\n\n\n<p>Getrieben von Ungeduld und etwas Frust installierte unser Sysadmin nun auch das Paket <code>python3-dnf.noarch<\/code> neu, in einem letzten, verzweifelten Versuch, endlich die lang ersehnte Manpage zu erhalten.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;root@01ede4521839 \/]# dnf reinstall python3-dnf.noarch\n\u2026\nReinstalled:\n  python3-dnf-4.20.0-9.el10.noarch                                              \n\nComplete!\n&#91;root@01ede4521839 \/]# man 8 dnf\nDNF4(8)                               DNF                              DNF4(8)\n\nNAME\n       dnf4 - DNF Command Reference\n\nSYNOPSIS\n       dnf &#91;options] &lt;command&gt; &#91;&lt;args&gt;...]\n\nDESCRIPTION\n       DNF  is  the  next upcoming major version of YUM, a package manager for\n       RPM-based Linux distributions. It roughly maintains  CLI  compatibility\n       with YUM and defines a strict API for extensions and plugins.<\/code><\/pre>\n\n\n\n<p>Na endlich! Da war sie, die so lang ersehnte und schmerzlich vermisste Manpage. Und die M\u00fche unseres Sysadmins wurde mit der Erkenntnis belohnt, dass die gesuchte Information auch in dieser Version von <code>dnf(8)<\/code> nicht enthalten war. Zufrieden wandte sich der Sysadmin nun dem Ticketsystem zu, um zu erfragen, warum die gesuchten Informationen nicht vorhanden sind und um eine Erg\u00e4nzung anzuregen.<\/p>\n\n\n\n<p>Und wenn er nicht gestorben ist, wartet er noch immer auf eine Antwort.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Und die Moral von der Geschichte?<\/h2>\n\n\n\n<p>Erwarte nicht Manpages in Container-Images zu finden. Unser Sysadmin w\u00e4re deutlich schneller am ZIel angelangt, h\u00e4tte er direkt in den Quelltext geschaut: <a href=\"https:\/\/github.com\/rpm-software-management\/dnf\/blob\/master\/doc\/command_ref.rst\">https:\/\/github.com\/rpm-software-management\/dnf\/blob\/master\/doc\/command_ref.rst<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die folgende Geschichte soll mir zur Erinnerung und euch zur Unterhaltung dienen. Sie handelt von CentOS Stream 10, Containern und der Manpage dnf(8). Aber lest selbst. Es war einmal ein Systemadministrator, der beim Training einige Subkommandos von dnf updateinfo kennenlernte, von deren Existenz er bislang nichts wusste. Und diese Subkommandos hei\u00dfen list, info und summary.<span class=\"continue-reading\"> <a href=\"https:\/\/www.my-it-brain.de\/wordpress\/wie-dnf-8-gz-in-den-container-kam\/\">[Weiterlesen&#8230;]<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_metis_text_type":"standard","_metis_text_length":8225,"_post_count":0,"footnotes":""},"categories":[51],"tags":[592,863,430,305],"class_list":["post-4030","post","type-post","status-publish","format-standard","hentry","category-linux","tag-dnf","tag-manpage","tag-osbn","tag-planet"],"public_identification_id":"591870356a0547ec8c1aa7591b44a1b1","private_identification_id":"2a5804c7dd0146cf934814e6ec1a5231","_links":{"self":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts\/4030","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/comments?post=4030"}],"version-history":[{"count":2,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts\/4030\/revisions"}],"predecessor-version":[{"id":4037,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/posts\/4030\/revisions\/4037"}],"wp:attachment":[{"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/media?parent=4030"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/categories?post=4030"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.my-it-brain.de\/wordpress\/wp-json\/wp\/v2\/tags?post=4030"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}