{"id":135456,"date":"2025-12-31T08:00:00","date_gmt":"2025-12-31T08:00:00","guid":{"rendered":"https:\/\/fedoramagazine.org\/?p=42813&amp;preview=true&amp;preview_id=42813"},"modified":"2025-12-31T08:00:00","modified_gmt":"2025-12-31T08:00:00","slug":"introducing-the-new-bootc-kickstart-command-in-anaconda","status":"publish","type":"post","link":"https:\/\/sickgaming.net\/blog\/2025\/12\/31\/introducing-the-new-bootc-kickstart-command-in-anaconda\/","title":{"rendered":"Introducing the new bootc kickstart command in Anaconda"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"127\" src=\"https:\/\/sickgaming.net\/blog\/wp-content\/uploads\/2025\/12\/introducing-the-new-bootc-kickstart-command-in-anaconda.jpg\" class=\"webfeedsFeaturedVisual wp-post-image\" alt=\"\" style=\"margin: auto;margin-bottom: 5px;max-width: 100%\" \/><\/p>\n<p>Anaconda installer now supports installation of bootc based bootable container images using the new <kbd>bootc<\/kbd> command. It has supported several types of payload to populate the root file system during installation. These include <em>RPM packages<\/em> (likely the most widely used option), <em>tarball images<\/em> you may know from Fedora Workstation, <em>ostree<\/em>, and <em>rpm-ostree containers<\/em>. The <a href=\"https:\/\/github.com\/rhinstaller\/anaconda\/pull\/6298\">newest addition<\/a> to the family, from a couple of weeks ago, is <em>bootc-based bootable containers<\/em>.<\/p>\n<p> <span id=\"more-42813\"><\/span> <\/p>\n<h2 class=\"wp-block-heading\">The difference is under the hood<\/h2>\n<p>We have added a new <a href=\"https:\/\/pykickstart.readthedocs.io\/en\/latest\/kickstart-docs.html#bootc\" target=\"_blank\" rel=\"noreferrer noopener\">bootc<\/a> kickstart command to Anaconda to support the new feature. This is very similar to the <a href=\"https:\/\/pykickstart.readthedocs.io\/en\/latest\/kickstart-docs.html#ostreecontainer\" target=\"_blank\" rel=\"noreferrer noopener\">ostreecontainer<\/a> command that has been present for some time. From the user&#8217;s perspective the two are very similar. The main difference, however, is under the hood. <\/p>\n<p>One of the most important setup steps for a deployment is to create a requested partitioning in both cases. When the partitioning is ready, the ostreecontainer command makes Anaconda deploy the image onto the root filesystem using the ostree tool. It also executes the bootupctl tool to install and set up the bootloader. By contrast, with bootc containers installed using the <kbd>bootc<\/kbd> kickstart command, both the filesystem population and bootloader configuration is performed via the bootc tool. This makes the deployment process even more integrated.<\/p>\n<p>The content of the container images used for installation is another difference. The bootc-enabled images are somewhat more versatile. Apart from installation using Anaconda, they provide a self-installing option via the bootc command executed from within a running container.<\/p>\n<p>On the other hand, both options provide you with a way to install an immutable system based on a container image. This option may be useful for particular use cases where regular installation from RPM packages is not desired. This might be due to potentially lower deployment speed or inherent mutability of the resulting system.<\/p>\n<h2 class=\"wp-block-heading\">A simple how-to<\/h2>\n<p>In practice, you\u2019d likely use a custom container with pre-configured services, user accounts and other configuration bits and pieces. However, if you want to quickly try out how the new Anaconda\u2019s feature works, you just need to follow a few simple steps. Starting with a <a href=\"https:\/\/dl.fedoraproject.org\/pub\/fedora\/linux\/development\/rawhide\/Server\/x86_64\/iso\/\" target=\"_blank\" rel=\"noreferrer noopener\">Fedora Rawhide ISO<\/a>:<\/p>\n<p>First, take an existing container from a registry and create a minimal <a href=\"https:\/\/pykickstart.readthedocs.io\/en\/latest\/kickstart-docs.html\" target=\"_blank\" rel=\"noreferrer noopener\">kickstart file<\/a> instructing Anaconda to install the bootable container image:<\/p>\n<pre class=\"wp-block-preformatted\"># Beware that this kickstart file will wipe out the existing disk partitions.\n# Use it only in an experimental\/isolated environment or edit it accordingly!\nzerombr\nclearpart --all --initlabel\nautopart lang en_US.UTF-8\nkeyboard us timezone America\/New_York --utc\nrootpw changeme bootc --source-imgref=registry:quay.io\/fedora\/fedora-bootc:rawhide<\/pre>\n<p>As a next step, place the kickstart file in some reachable location (e. g. HTTP server), point Anaconda to it by appending the following on the kernel command line:<\/p>\n<pre class=\"wp-block-preformatted\">inst.ks=http:\/\/url\/to\/kickstart <\/pre>\n<p>Now start the installation. <\/p>\n<p>Alternatively, you may use the <kbd>mkksiso<\/kbd> tool provided by the <kbd>lorax<\/kbd> package to embed the kickstart file into the installation ISO.<\/p>\n<p>When installation and reboot is complete, you are presented with an immutable Fedora Rawhide system. It will be running on your hardware (or VM) installed from a bootable container image.<\/p>\n<h2 class=\"wp-block-heading\">Is there anything more about bootc in Anaconda?<\/h2>\n<p>You may ask if this option is limited to Fedora Rawhide container images. Technically speaking, you can use the Fedora Rawhide installation ISO to install, for instance, a CentOS Stream container image:<\/p>\n<pre class=\"wp-block-preformatted\">bootc --source-imgref=registry:quay.io\/centos-bootc\/centos-bootc:stream10<\/pre>\n<p>Nevertheless, keep in mind that for now Anaconda will handle it as Fedora installation in such a case. This is because it runs from a Fedora Rawhide boot ISO. This may result in unforeseen problems, such as getting a btrfs-based partitioning that CentOS Stream won\u2019t be able to boot from. This particular issue is easily overcome by explicitly telling Anaconda to use some different partitioning type, e. g. autopart &#8211;fstype=xfs. We would like to address the lack of container images handling based on the contained operating system or flavour in the future. For now, one just needs to take the current behavior into consideration when using the bootc command.<\/p>\n<p>There are a couple more known limitations in Anaconda or bootc at this point in time. These include lack of support for partitioning setups spanning multiple disks, support for arbitrary mount points, or for installation from authenticated registries. But we hope it won\u2019t take long to solve those shortcomings. There are also plans to make the new bootc command available even on the RHEL-10 platform.<\/p>\n<p>We invite you to try out this new feature and share your experience, ideas or comments with the Installer team. We are looking forward to hearing from you in a thread on <a href=\"http:\/\/discussion.fedoraproject.org\" target=\"_blank\" rel=\"noreferrer noopener\">discussion.fedoraproject.org<\/a>!<\/p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Anaconda installer now supports installation of bootc based bootable container images using the new bootc command. It has supported several types of payload to populate the root file system during installation. These include RPM packages (likely the most widely used option), tarball images you may know from Fedora Workstation, ostree, and rpm-ostree containers. The newest [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":135457,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[48],"tags":[45,61,43,46,75,47],"class_list":["post-135456","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-fedora-os","tag-fedora","tag-fedora-project-community","tag-for-system-administrators","tag-magazine","tag-new-in-fedora","tag-news"],"_links":{"self":[{"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/posts\/135456","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/comments?post=135456"}],"version-history":[{"count":0,"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/posts\/135456\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/media\/135457"}],"wp:attachment":[{"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/media?parent=135456"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/categories?post=135456"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sickgaming.net\/blog\/wp-json\/wp\/v2\/tags?post=135456"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}