<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>A Geek with Guns - Dinosaur OS</title>
    <link rel="self" type="application/atom+xml" href="https://www.christopherburg.com/tags/dinosaur-os/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://www.christopherburg.com"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-02-13T13:00:00-06:00</updated>
    <id>https://www.christopherburg.com/tags/dinosaur-os/atom.xml</id>
    <entry xml:lang="en">
        <title>Disabling Homebrew in Dinosaur OS</title>
        <published>2026-02-13T13:00:00-06:00</published>
        <updated>2026-02-13T13:00:00-06:00</updated>
        
        <author>
          <name>
            Christopher Burg
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.christopherburg.com/blog/disabling-homebrew-in-dinosaur-os/"/>
        <id>https://www.christopherburg.com/blog/disabling-homebrew-in-dinosaur-os/</id>
        
        <content type="html" xml:base="https://www.christopherburg.com/blog/disabling-homebrew-in-dinosaur-os/">&lt;p&gt;Since I &lt;a href=&quot;&#x2F;blog&#x2F;introducing-dinosaur-os&#x2F;&quot;&gt;released Dinosaur OS&lt;&#x2F;a&gt; last September, I&#x27;ve had to make very few changes to my image. This is a testament to the overall stability of Bluefin, the image upon which Dinosaur OS is based. But I started receiving error notifications a couple of weeks ago whenever the automatic update service ran. The initial error was actually due to a Flatpak problem. The developer of a package I installed uploaded a new version with the same version number as my currently installed version. This cause the Flatpak update program to fail. I managed to fix that, but the service was still displaying an error because it wasn&#x27;t able to update Homebrew.&lt;&#x2F;p&gt;
&lt;p&gt;Homebrew is a package manager that was originally written for macOS. It was released back when I used macOS so I tried it and discovered that it was a train wreck and opted to use &lt;a href=&quot;https:&#x2F;&#x2F;www.macports.org&#x2F;&quot;&gt;MacPorts&lt;&#x2F;a&gt; instead. Homebrew had a number of bizarre design decisions. The biggest was it wanted to install packages at a system level. Normally that&#x27;s not a problem with a package manager, but Homebrew tied the system level directory to your user account&#x27;s user ID number. Effectively Homebrew installed packages at a system level that only a single user account to use or modify. There was an option to install packages into your home directory, but a number of packages failed to run when you did that.&lt;&#x2F;p&gt;
&lt;p&gt;When it was announced that Homebrew was available for Linux, I dismissed it entirely. Why would I want a poorly designed package manager on a system that already has a plethora of very good package managers? My experience with Homebrew was so bad that I initially intended to remove it from Dinosaur OS. I ultimately decided that enough time had passed that I should give Homebrew another chance. My latest experience mirrored my previous experience.&lt;&#x2F;p&gt;
&lt;p&gt;Homebrew on Linux suffers the same problem as it does on macOS. It doesn&#x27;t support systems with multiple user accounts well. When Bluefin installs Homebrew, it creates the &lt;code&gt;&#x2F;home&#x2F;linuxbrew&#x2F;&lt;&#x2F;code&gt; directory and sets its user and group IDs to 1000. Bluefin is based on Fedora and by default the first user account created on a Fedora system has the user and group IDs of 1000. All packages installed with Homebrew are installed into the &lt;code&gt;&#x2F;home&#x2F;linuxbrew&#x2F;&lt;&#x2F;code&gt; directory. This means Homebrew on Bluefin is configured so that only the very first user account created on the system can use it.&lt;&#x2F;p&gt;
&lt;p&gt;This is fine for most users, but I&#x27;m not most users. I have two user accounts on my system. The first is my administrator account, the second is a regular user account that I use for my day to day tasks. Administrator rights are required to create new user accounts so obviously I create my administrator account first. This means the actual account I use day to day, which has the user and group IDs of 1001 (the default on Fedora systems for the second user account created), can&#x27;t use Homebrew.&lt;&#x2F;p&gt;
&lt;p&gt;There are ways around this. I could change the owner permissions on &lt;code&gt;&#x2F;home&#x2F;linuxbrew&#x2F;&lt;&#x2F;code&gt; to 1001. Homebrew on Bluefin is setup using the &lt;code&gt;brew-setup.service&lt;&#x2F;code&gt; systemd service, which sets the permissions. I could change that unit file in my image to set the user and group IDs to 1001. Either option would allow my day to day user account to use Homebrew installed packages, but would prevent my administrator account from using them. The bottom line is Homebrew is a poorly designed package manager.&lt;&#x2F;p&gt;
&lt;p&gt;I chose a third option: ignore Homebrew entirely. There was no downside to this option at first, but a few weeks ago changes were made to Bluefin&#x27;s automatic updater that caused me to reexamine my decision. As noted at the beginning of this article, I started receiving notifications that the automatic update service failed. Checking journalctl showed me the source of the error was that the update utility, &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ublue-os&#x2F;uupd&quot;&gt;UUPD&lt;&#x2F;a&gt;, was unable to upgrade Homebrew. This failure was caused by &lt;code&gt;&#x2F;home&#x2F;linuxbrew&#x2F;&lt;&#x2F;code&gt;, which normally contains the brew executable used to install and update packages, being empty (I didn&#x27;t investigate why it was empty since I was already done with Homebrew).&lt;&#x2F;p&gt;
&lt;p&gt;Fortunately disabling and removing Homebrew from Bluefin is straight forward. Homebrew is installed by the &lt;code&gt;brew-setup.service&lt;&#x2F;code&gt; systemd service, which is enabled by default on Bluefin. Disabling the service prevents it from automatically installing Homebrew so Dinosaur OS disables it. I also add a script, &lt;code&gt;&#x2F;usr&#x2F;libexec&#x2F;remove-brew&lt;&#x2F;code&gt;, to the image, which removes Homebrew from a system if it&#x27;s already installed. This makes Dinosaur OS nondestructive in that it won&#x27;t automatically remove Homebrew from a system where it&#x27;s already installed. Removing Homebrew requires manual work. It also means Homebrew can be installed again by either starting or enabling &lt;code&gt;brew-setup.service&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;I still had the problem where UUPD would throw an error because it was unable to update Homebrew (which was now missing entirely). UUPD on Bluefin accepts arguments that disable update modules though. The final change I made to Dinosaur OS is adding &lt;code&gt;--disable-module-brew&lt;&#x2F;code&gt; to the ExecStart line of &lt;code&gt;uupd.service&lt;&#x2F;code&gt;, which is activated by a timer periodically. &lt;code&gt;uupd.service&lt;&#x2F;code&gt; is a system file, which means the user cannot edit it. Therefore, if you&#x27;re running Dinosaur OS and install Homebrew, your Homebrew packages won&#x27;t be automatically updated by &lt;code&gt;uupd.service&lt;&#x2F;code&gt;. The best way to change this behavior is to copy &lt;code&gt;&#x2F;usr&#x2F;lib&#x2F;systemd&#x2F;system&#x2F;brew-update.service&lt;&#x2F;code&gt; to &lt;code&gt;&#x2F;etc&#x2F;systemd&#x2F;system&#x2F;uupd.service&lt;&#x2F;code&gt; and remove &lt;code&gt;--disable-module-brew&lt;&#x2F;code&gt; from the ExecStart line.&lt;&#x2F;p&gt;
&lt;p&gt;Overall I still like Bluefin a lot. I agree with most of the design decisions and appreciate that it&#x27;s been easy for me to change the decisions I dislike. I continue to run Dinosaur OS on my desktop systems and haven&#x27;t faced any catastrophic problems. If you want to create your own image based on Bluefin and want an example image to get started, check the &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ChristopherBurg&#x2F;dinosaur-os&quot;&gt;Dinosaur OS repository&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Introducing Dinosaur OS</title>
        <published>2025-09-05T12:00:00+00:00</published>
        <updated>2025-09-05T12:00:00+00:00</updated>
        
        <author>
          <name>
            Christopher Burg
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.christopherburg.com/blog/introducing-dinosaur-os/"/>
        <id>https://www.christopherburg.com/blog/introducing-dinosaur-os/</id>
        
        <content type="html" xml:base="https://www.christopherburg.com/blog/introducing-dinosaur-os/">&lt;p&gt;Along with &lt;a href=&quot;&#x2F;blog&#x2F;the-thinkpad-t16-gen-4-amd-accepts-96-gb-of-ram&#x2F;&quot;&gt;my new laptop&lt;&#x2F;a&gt;, I decided to try a new operating system. I&#x27;ve been running Fedora Workstation since I bought my ThinkPad P52s in 2018. It&#x27;s a great distribution. However, I&#x27;ve been interested in immutable Linux distributions for a long time. Unfortunately, getting the proprietary Nvidia driver (the P52s has an Nvida GPU) working on Fedora Silverblue without having to disable SecureBoot was a hurdle I didn&#x27;t want to jump over. Fortunately, my new laptop has an AMD processor and integrated GPU so I don&#x27;t have to deal with Nvidia&#x27;s shenanigans anymore. I originally intended to run Fedora Silverblue, but then I came across &lt;a href=&quot;https:&#x2F;&#x2F;projectbluefin.io&#x2F;&quot;&gt;Bluefin&lt;&#x2F;a&gt;, which is a &lt;a href=&quot;https:&#x2F;&#x2F;universal-blue.org&#x2F;&quot;&gt;Universal Blue&lt;&#x2F;a&gt; image, which is a Silverblue based image meant to be a foundation for building images.&lt;&#x2F;p&gt;
&lt;p&gt;Immutable Linux distributions differ from typical distributions in a number of ways. The biggest difference, which is in the name, is that the base system is immutable. This means you can&#x27;t install packages in the normal manner. Silverblue has support for overlay packages, but installing overlay packages on an immutable distribution can cause headaches down the road (especially when performing major version upgrades). The advantage is that upgrades are simple and rolling back to a previous version is as simple as rebooting. Rebasing to other immutable images is also simple (as is rolling back if you decide you don&#x27;t like the new image).&lt;&#x2F;p&gt;
&lt;p&gt;I chose Bluefin over Silverblue for a few reasons. First, Silverblue uses the Fedora flatpak repository by default and all of the included flatpaks are sourced from that repository. I prefer to use Flathub because the packages are up-to-date. Bluefin uses Flathub. Second, Bluefin includes &lt;a href=&quot;https:&#x2F;&#x2F;distrobox.it&#x2F;&quot;&gt;Distrobox&lt;&#x2F;a&gt;. Silverblue includes Toolbox, which I find inferior to Distrobox. Third, Bluefin includes Bazaar as its graphical Flatpak manager. Silverblue, like Fedora Workstation, still uses GNOME Software, which is so buggy that I end up managing flatpaks via the command line when I use Workstation. Fourth, dinosaurs. Bluefin&#x27;s theme involves dinosaurs and dinosaurs are cool (hence the name of my modification of Bluefin).&lt;&#x2F;p&gt;
&lt;p&gt;There&#x27;s just one problem with Bluefin (Silverblue has this problem too). It doesn&#x27;t include libvirt. I rely heavily on libvirt. It&#x27;s my virtual machine manager of choice. Installing libvirt on Fedora Workstation was a simple dnf command away. But Bluefin is immutable so dnf isn&#x27;t a lot of help. Bluefin does offer a solution out of the box in the form of the Bluefin Developer Experience (DX). Bluefin includes an easy way to rebase to Bluefin DX. The problem with Bluefin DX is that it includes a lot of tools I don&#x27;t want to use such as Docker, Visual Studio Code, and Incus. This lead me down a rabbit hole of learning how to make my own modified version of Bluefin.&lt;&#x2F;p&gt;
&lt;p&gt;Modifying Bluefin or any other Universal Blue image is dead simple. There&#x27;s a &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ublue-os&#x2F;image-template&quot;&gt;handy template&lt;&#x2F;a&gt; that you can fork to get started. From there you can modify the Bluefin build process to add, remove, or modify whatever you want. The result of my efforts is &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ChristopherBurg&#x2F;dinosaur-os&quot;&gt;Dinosaur OS&lt;&#x2F;a&gt;. Dinosaur OS is basically Bluefin with libvirt added. There are a few other minor modification too, but the inclusion of libvirt is the main difference. Switching from Bluefin to Dinosaur OS is as simple as issuing the &lt;code&gt;sudo bootc switch ghcr.io&#x2F;christopherburg&#x2F;dinosaur-os&lt;&#x2F;code&gt; command. Once it completes downloading and staging the image, reboot your computer and you&#x27;ll be in my modified version of Bluefin.&lt;&#x2F;p&gt;
&lt;p&gt;The instructions to get started are all in the template&#x27;s README.md file. But there are two files that will contain a lion&#x27;s share of your changes. The first is Containerfile. The second is &#x2F;build_files&#x2F;build.sh. I&#x27;ve organized my repository since my initial release, but most of the changes are made by the shell scripts in &#x2F;build_files&#x2F;. For example, &#x2F;build_files&#x2F;base&#x2F;00-install-libvirt.sh executes dnf to install the libvirt packages. It also adds the libvirt group to the image so you can add user accounts to the group. It also enables a systemd service that fixes some SELinux permission issues. None of this was my original idea. I pieces together how &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;ublue-os&#x2F;bluefin&quot;&gt;Bluefin DX&lt;&#x2F;a&gt; installs libvirt and made those modification in my image.&lt;&#x2F;p&gt;
&lt;p&gt;Now that it&#x27;s configured, my GitHub repository rebuilds the image once a day. This pulls in the updates from Bluefin, which in turn pulls in the updates from its base Universal Blue image. Dinosaur OS downloads new images automatically so when I reboot my computer, I boot into the latest image.&lt;&#x2F;p&gt;
&lt;p&gt;I don&#x27;t expect anybody to run Dinosaur OS themselves. It&#x27;s custom tailored to my use case. My hope is that it can work as a template or example for anybody who wants to make their own image. The coolest thing about image based distributions is that it&#x27;s trivial to make a bespoke image that fits your use cases. The coolest thing about using Universal Blue as the foundation is that it automates most of the work.&lt;&#x2F;p&gt;
</content>
        
    </entry>
</feed>
