{"id":2627,"date":"2024-10-16T21:59:05","date_gmt":"2024-10-17T03:59:05","guid":{"rendered":"https:\/\/mrguitar.net\/?p=2627"},"modified":"2024-10-29T19:18:49","modified_gmt":"2024-10-30T01:18:49","slug":"bootc-for-desktops-tell-me-more","status":"publish","type":"post","link":"https:\/\/mrguitar.net\/?p=2627","title":{"rendered":"bootc for Desktops?? Tell me more!"},"content":{"rendered":"\n<p>bootc is ridiculously amazing for headless servers &#8211; everyone knows that! It&#8217;s also a great fit for appliance-style graphical kiosks. What about a daily driver like a desktop or laptop? The TL;DR is it&#8217;s amazing, and I thought I&#8217;d share my experience. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"662\" src=\"https:\/\/mrguitar.net\/wp-content\/uploads\/2024\/10\/PXL_20241024_180016544-1024x662.jpg\" alt=\"\" class=\"wp-image-2650\" srcset=\"https:\/\/mrguitar.net\/wp-content\/uploads\/2024\/10\/PXL_20241024_180016544-1024x662.jpg 1024w, https:\/\/mrguitar.net\/wp-content\/uploads\/2024\/10\/PXL_20241024_180016544-300x194.jpg 300w, https:\/\/mrguitar.net\/wp-content\/uploads\/2024\/10\/PXL_20241024_180016544-768x496.jpg 768w, https:\/\/mrguitar.net\/wp-content\/uploads\/2024\/10\/PXL_20241024_180016544-1536x993.jpg 1536w, https:\/\/mrguitar.net\/wp-content\/uploads\/2024\/10\/PXL_20241024_180016544-2048x1323.jpg 2048w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><figcaption class=\"wp-element-caption\">So clean. So organized. Pro tip: input-leap works great w\/ Wayland is seamless for using the same mouse and keyboard across all my systems.<\/figcaption><\/figure>\n\n\n\n<!--more-->\n\n\n\n<p>OK, it&#8217;s been about three months since I moved my <a href=\"https:\/\/mrguitar.net\/?p=2524\" data-type=\"post\" data-id=\"2524\">home server<\/a> to<a href=\"https:\/\/mrguitar.net\/?p=2579\" data-type=\"post\" data-id=\"2579\"> bootc<\/a> and<a href=\"https:\/\/mrguitar.net\/?p=2587\" data-type=\"post\" data-id=\"2587\"> setup Gitea<\/a> to automate everything, even my <a href=\"https:\/\/mrguitar.net\/?p=2605\" data-type=\"post\" data-id=\"2605\">Rasberry Pi<\/a>. OMG, I love it so much and the setup keeps expanding. I&#8217;ve added a number of additional containerized services on my server (photo prism, LMS, Navidrome, etc), upgraded my switches to 2.5Gb, and I have six bootc repos building nine images automatically for a number of different purposes. Anyway, a colleague at work, who&#8217;s a bad influence on me, convinced me I need a new desktop. He was so right. My old Intel i7-4770k (Haswell!!!) system was 10 years old and really showing it&#8217;s age. Rather than go down the ginormous rabbit hole of PC gear, I decided it was easier\/better to, more or less, copy his setup. Thanks Mark! :) I ended up getting:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>AMD Ryzen 9 9900x<\/li>\n\n\n\n<li>64G Ram @6000<\/li>\n\n\n\n<li>Asus x670e-f<\/li>\n\n\n\n<li>1TB fast NVME<\/li>\n\n\n\n<li>New power supply &amp; a USB C front panel for the case.<\/li>\n\n\n\n<li>and best of all a new ultra wide monitor (Samsung 34&#8243; S50GC)<\/li>\n<\/ul>\n\n\n\n<p>A quick aside, I take a lot of pride in being frugal, but my previous monitor was a good example of being <strong><em>too frugal.<\/em><\/strong> As soon as I plugged in the new screen, I felt my eyes &#8220;sigh&#8221; in relief. I never realized how hard my previous screen was on my eyes. This is why you should never repurpose a large, 1080p digital signage screen that you got for free as your main monitor. &#8230;.anyway back to the point of this blog.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Goal:<\/h2>\n\n\n\n<p>For some reason I enjoy GNOME on my laptop and KDE on my desktop, and I wanted to stick with this. I&#8217;m coming from the rpm-ostree world and essentially I just want the rpms of the OS to be versioned in the container. I rely heavily on flatpaks, toolbox, and podman for my applications and my system looks something like this diagram:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"485\" height=\"837\" src=\"https:\/\/mrguitar.net\/wp-content\/uploads\/2024\/10\/bootc-os-diagrams-1.jpg\" alt=\"\" class=\"wp-image-2638\" srcset=\"https:\/\/mrguitar.net\/wp-content\/uploads\/2024\/10\/bootc-os-diagrams-1.jpg 485w, https:\/\/mrguitar.net\/wp-content\/uploads\/2024\/10\/bootc-os-diagrams-1-174x300.jpg 174w\" sizes=\"auto, (max-width: 485px) 100vw, 485px\" \/><\/figure>\n\n\n\n<p>I&#8217;m using the default BTRFS partition layout w\/ subvolumes for root &amp; home. Basically, everything I need to persist in \/var &amp; \/home comes pre-configured so virtually no setup is required outside of installing the flatpaks and\/or containers and copying my old home directory over. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">It all starts with the Containerfile<\/h2>\n\n\n\n<p>I started by looking at the Kinoite and Aurora configs for how they were built. I copied a few things from their setups, but not much. As a rule I think it&#8217;s important to keep these builds simple, and I don&#8217;t need a lot of complexity for my setup. All I&#8217;m doing is adding the rpmfusion repos, KDE plus some additional software\/packages, and doing a little clean up per Kinoite, and running some of the rpmfusion multimedia setup instructions. It really didn&#8217;t take a lot of time. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>FROM quay.io\/fedora\/fedora-bootc:40\n\n#copy configs\nCOPY etc etc\nRUN mkdir -p \/var\/roothome \/data\n\n#install rpmfusion\nRUN dnf install -y https:\/\/mirrors.rpmfusion.org\/free\/fedora\/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm https:\/\/mirrors.rpmfusion.org\/nonfree\/fedora\/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm\n\n#install &amp; configure packages\nRUN dnf groupinstall -y \"KDE Plasma Workspaces\" &amp;&amp; \\\n\tdnf install -y bash-completion bcache-tools bwm-ng cockpit cockpit-podman cockpit-storaged cockpit-ws cockpit-pcp cockpit-podman cockpit-machines cockpit-selinux cups cups-browsed dmraid ethtool firefox firewalld fuse-exfat fwupd gamemode gdb git htop input-leap kamera k3b libvirt-daemon lm_sensors nfs-utils nss-mdns pcp pcp-selinux powertop qemu-kvm samba sysstat thermald tuned vim-enhanced virt-install virt-manager vulkan-tools xdpyinfo wget &amp;&amp; \\\n\tdnf remove -y plasma-discover-offline-updates plasma-discover-packagekit plasma-pk-updates tracker tracker-miners plasma-x11 plasma-workspace-x11 &amp;&amp; \\\n\tdnf swap -y ffmpeg-free ffmpeg --allowerasing &amp;&amp; dnf update -y @multimedia --setopt=\"install_weak_deps=False\" --exclude=PackageKit-gstreamer-plugin &amp;&amp; dnf groupinstall -y \"Sound and Video\" &amp;&amp; dnf swap -y mesa-va-drivers mesa-va-drivers-freeworld &amp;&amp; dnf swap -y mesa-vdpau-drivers mesa-vdpau-drivers-freeworld\n\n#configure unit files\nRUN systemctl enable lm_sensors sysstat tuned fstrim.timer podman.socket podman-auto-update.timer cockpit.socket libvirtd.socket &amp;&amp; \\\nsystemctl set-default graphical.target<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Build &amp; Test<\/h2>\n\n\n\n<p>It took me about four builds to land on the set of packages, and it was really easy to deploy a VM to give it a quick sanity test. This helped speed up the real install and pass the time while Amazon shipped the hardware. Dropping it into a Gitea repo and scheduling regular builds was a breeze. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"390\" src=\"https:\/\/mrguitar.net\/wp-content\/uploads\/2024\/10\/Screenshot_20241015_200119-1024x390.png\" alt=\"\" class=\"wp-image-2634\" srcset=\"https:\/\/mrguitar.net\/wp-content\/uploads\/2024\/10\/Screenshot_20241015_200119-1024x390.png 1024w, https:\/\/mrguitar.net\/wp-content\/uploads\/2024\/10\/Screenshot_20241015_200119-300x114.png 300w, https:\/\/mrguitar.net\/wp-content\/uploads\/2024\/10\/Screenshot_20241015_200119-768x292.png 768w, https:\/\/mrguitar.net\/wp-content\/uploads\/2024\/10\/Screenshot_20241015_200119.png 1314w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><figcaption class=\"wp-element-caption\">Notice the insane performance increase when the new system is used for container builds. Amazing!!<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Anaconda \u2764\ufe0f Bare metal <\/h2>\n\n\n\n<p>Just like with my server I decided to use Anaconda to provision the container. What I learned from the last attempt is that if you supply a kickstart with <strong>only<\/strong> the <code>ostreecontainer<\/code> command, then you get a perfect interactive installation experience. My kickstart was one line:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ostreecontainer --url &#91;my_registry]\/workstation-bootc:latest<\/code><\/pre>\n\n\n\n<p>This is ideal for one-off systems like this where it doesn&#8217;t makes sense to iron out things like partitioning details. After following the basic anaconda spokes for users, disks, &amp; networking, my system was up and running very fast.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"771\" src=\"https:\/\/mrguitar.net\/wp-content\/uploads\/2024\/10\/PXL_20241014_132352951-1024x771.jpg\" alt=\"\" class=\"wp-image-2633\" srcset=\"https:\/\/mrguitar.net\/wp-content\/uploads\/2024\/10\/PXL_20241014_132352951-1024x771.jpg 1024w, https:\/\/mrguitar.net\/wp-content\/uploads\/2024\/10\/PXL_20241014_132352951-300x226.jpg 300w, https:\/\/mrguitar.net\/wp-content\/uploads\/2024\/10\/PXL_20241014_132352951-768x578.jpg 768w, https:\/\/mrguitar.net\/wp-content\/uploads\/2024\/10\/PXL_20241014_132352951-1536x1157.jpg 1536w, https:\/\/mrguitar.net\/wp-content\/uploads\/2024\/10\/PXL_20241014_132352951-2048x1542.jpg 2048w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><figcaption class=\"wp-element-caption\">I forgot to take a final picture. This is the old power supply that worked for ~4 hours on the new mobo\/CPU before it gave up and died. <\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Final Thoughts<\/h2>\n\n\n\n<p>If you&#8217;re wondering if you should do this for your setup, the answer is a solid maybe. For a lot of people, I suspect they will be better served by &#8220;outsourcing&#8221; a lot of this to their OS vendor. This is basically the goal of all the Fedora Atomic Desktops and\/or Universal Blue. If you like the idea of an immutable desktop, I recommend most people start there. Those also allow containerfile semantics to augment the images. With my experiment, I wanted to answer the &#8220;can I?&#8221; &#8220;should I?&#8221; questions, and for me, this is a no-brainer. A lot of that comes down to just how easy this is to pull off, automate w\/ git, and change\/adapt the setup as my needs change. So if you have access to github, gitlab, etc and you like this idea, then you can &amp; should check it out. <\/p>\n\n\n\n<p>Miscellaneous thoughts in no particular order:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>bootc and git SCALE. I know I only have ~6 repos building, but all the work is done by robots and I literally don&#8217;t think about it. <\/li>\n\n\n\n<li>After doing this for a brief time on my desktop, I would be completely comfortable using the same setup on my work laptop.<\/li>\n\n\n\n<li>I expect to periodically add\/change the RPMs and I love the fact that I&#8217;ll have a complete GIT audit trail. Another bonus is I can easily just &#8220;move&#8221; this setup to any system (thank you borg+vorta for handling my \/home dir).<\/li>\n\n\n\n<li>I&#8217;ve never had a system this fast &amp; powerful and I absolutely love it. I don&#8217;t feel the need to upgrade to every CPU generation, but I&#8217;m starting to think 5-6 years is the sweet spot for me. Waiting 10 year was a mistake. <\/li>\n\n\n\n<li>Ultra-wide monitors are where it&#8217;s at &#8211; what have I been doing with my life!!!!!<\/li>\n\n\n\n<li>I hate thermal paste and seating heat syncs<\/li>\n\n\n\n<li>I like that gamers keep PC going and keep aesthetics in mind, but &#8230;..do we really need LEDs on everything here? Let me answer that. We don&#8217;t! <\/li>\n<\/ul>\n\n\n\n<p>Thanks for hanging out; I hope this is helpful\/interesting to others. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">UPDATE to Fedora 41 October 29th 2024<\/h2>\n\n\n\n<p>OK, so I&#8217;ve been loving this setup for a couple weeks and Fedora 41 just shipped today. I was hoping that all I would have to change in my containerfile was the image tag to :41. DNF5 didn&#8217;t like a couple of my commands and cockpit-pcp isn&#8217;t in the repos anymore. It was super fast to update my commands. Once those ran fine inside a container, I just committed\/pushed my changes and ran <code>sudo bootc upgrade --apply<\/code> for a flawless upgrade. It&#8217;s amazing!<\/p>\n\n\n\n<p>Here&#8217;s the updated file &#8211; I want to stress it was really easy to get here. Enjoy!<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>FROM quay.io\/fedora\/fedora-bootc:41\n\n#copy configs\nCOPY etc etc\nRUN mkdir -p \/var\/roothome \/data\n\n#install rpmfusion\nRUN dnf install -y https:\/\/mirrors.rpmfusion.org\/free\/fedora\/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm https:\/\/mirrors.rpmfusion.org\/nonfree\/fedora\/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm\n\n#install &amp; configure packages\nRUN dnf group install -y \"KDE Plasma Workspaces\" &amp;&amp; \\\n\tdnf install -y --skip-unavailable bash-completion bcache-tools bwm-ng cockpit cockpit-podman cockpit-storaged cockpit-ws cockpit-pcp cockpit-podman cockpit-machines cockpit-selinux cups cups-browsed dmraid ethtool firefox firewalld fuse-exfat fwupd gamemode gdb git htop input-leap kamera k3b libvirt-daemon lm_sensors nfs-utils nss-mdns pcp pcp-selinux powertop qemu-kvm samba sysstat thermald tuned vim-enhanced virt-install virt-manager vulkan-tools xdpyinfo wget &amp;&amp; \\\n\tdnf remove -y plasma-discover-offline-updates plasma-discover-packagekit plasma-pk-updates tracker tracker-miners plasma-x11 plasma-workspace-x11 &amp;&amp; \\\n\tdnf swap -y ffmpeg-free ffmpeg --allowerasing &amp;&amp; dnf update -y @multimedia --setopt=\"install_weak_deps=False\" --exclude=PackageKit-gstreamer-plugin &amp;&amp; dnf group install -y sound-and-video\" &amp;&amp; dnf swap -y mesa-va-drivers mesa-va-drivers-freeworld &amp;&amp; dnf swap -y mesa-vdpau-drivers mesa-vdpau-drivers-freeworld\n\n#configure unit files\nRUN systemctl enable lm_sensors sysstat tuned fstrim.timer podman.socket podman-auto-update.timer cockpit.socket libvirtd.socket &amp;&amp; \\\nsystemctl set-default graphical.target<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>bootc is ridiculously amazing for headless servers &#8211; everyone knows that! It&#8217;s also a great fit for appliance-style graphical kiosks. What about a daily driver like a desktop or laptop? The TL;DR is it&#8217;s amazing, and I thought I&#8217;d share my experience.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[6],"tags":[126,125,130],"class_list":["post-2627","post","type-post","status-publish","format-standard","hentry","category-open-sourcenerd-stuff","tag-bootc","tag-fedora-bootc","tag-image-mode"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/mrguitar.net\/index.php?rest_route=\/wp\/v2\/posts\/2627","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mrguitar.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mrguitar.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mrguitar.net\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/mrguitar.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2627"}],"version-history":[{"count":4,"href":"https:\/\/mrguitar.net\/index.php?rest_route=\/wp\/v2\/posts\/2627\/revisions"}],"predecessor-version":[{"id":2653,"href":"https:\/\/mrguitar.net\/index.php?rest_route=\/wp\/v2\/posts\/2627\/revisions\/2653"}],"wp:attachment":[{"href":"https:\/\/mrguitar.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2627"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mrguitar.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2627"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mrguitar.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2627"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}