<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Linux on Sysadmin Tales</title>
    <link>https://blog.ssb-tech.net/tags/linux/</link>
    <description>Recent content in Linux on Sysadmin Tales</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Fri, 02 Oct 2026 21:39:10 -0400</lastBuildDate>
    <atom:link href="https://blog.ssb-tech.net/tags/linux/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Linux on an Asus CR11 Chromebook</title>
      <link>https://blog.ssb-tech.net/posts/linux-on-a-chromebook/</link>
      <pubDate>Sat, 13 Dec 2025 15:52:08 -0500</pubDate>
      <guid>https://blog.ssb-tech.net/posts/linux-on-a-chromebook/</guid>
      <description>&lt;h2 id=&#34;in-which-i-have-zero-self-control&#34;&gt;In which I have zero self control&lt;/h2&gt;&#xA;&lt;p&gt;While browsing the Amazon Black Friday sales a few weeks ago, a particular deal caught my eye.&lt;/p&gt;&#xA;&lt;p&gt;An ASUS Chromebook CR11 ruggedized laptop for around $130.&lt;/p&gt;&#xA;&lt;p&gt;Now, I have enough laptops, but I&amp;rsquo;ve always wanted to try and hack Linux onto one, and this one was attractive due to its ruggedized nature as well as a full blown Intel N100 CPU.&lt;/p&gt;&#xA;&lt;p&gt;I purchased the laptop and once it arrived, I began poking around the internet to see how I could get regular Linux on this thing.&lt;/p&gt;&#xA;&lt;h2 id=&#34;installing-linux-part-1&#34;&gt;Installing Linux, Part 1&lt;/h2&gt;&#xA;&lt;p&gt;I have no desire to use Google&amp;rsquo;s spyware filled ChromeOS, so if I couldn&amp;rsquo;t find a way to get Linux on this machine, it was going back to Amazon.&lt;/p&gt;&#xA;&lt;p&gt;A few searches guided me to &lt;a href=&#34;https://docs.mrchromebox.tech/&#34;&gt;mrchromebox.tech&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;This specific model I had was very similar to a few other builds that show full compatibility, so my hopes were raised.&lt;/p&gt;&#xA;&lt;p&gt;I went through their &lt;a href=&#34;https://docs.mrchromebox.tech/docs/getting-started.html&#34;&gt;Getting Started&lt;/a&gt; guide, which helped me get Developer Mode enabled, and I found my device ID.&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;ANRAGGAR&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;This HWID showed full compatibility with the full UEFI replacement firmware, which is exactly what I wanted.&lt;/p&gt;&#xA;&lt;p&gt;However, on most ChromeOS devices, it&amp;rsquo;s a requirement to &lt;a href=&#34;https://docs.mrchromebox.tech/docs/firmware/wp/disabling.html&#34;&gt;disable hardware write protection&lt;/a&gt; in order to flash the replacement firmware.&lt;/p&gt;&#xA;&lt;p&gt;This particular model had a Ti50 security chip, so the only method of disabling write protection was to use Closed Case Debugging (CCD). This process requires a &amp;ldquo;SuzyQ&amp;rdquo; ChromeOS debug board.&lt;/p&gt;&#xA;&lt;p&gt;A little bit annoying, but not the end of the world.&lt;/p&gt;&#xA;&lt;p&gt;I went on eBay and found the debug board listed &lt;a href=&#34;https://www.ebay.com/itm/316024978790&#34;&gt;here.&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;It took around a week to get to my house, and with that in hand, I tried again.&lt;/p&gt;&#xA;&lt;h2 id=&#34;installing-linux-part-2&#34;&gt;Installing Linux, Part 2&lt;/h2&gt;&#xA;&lt;p&gt;I followed the steps listed &lt;a href=&#34;https://docs.mrchromebox.tech/docs/firmware/wp/disabling.html#using-closed-case-debugging-ccd-using-a-suzyqable&#34;&gt;here&lt;/a&gt; to disable hardware write protection.&lt;/p&gt;&#xA;&lt;div class=&#34;callout callout-note&#34; role=&#34;note&#34;&gt;&lt;div class=&#34;callout-title&#34;&gt;Note&lt;/div&gt;&lt;div class=&#34;callout-content&#34;&gt;&lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;A SuzyQ cable is not like a typical USB-C connected device, where it is reversible. If you look closely at the board, one will be labeled side A, the other is side B. On the board that I received, side A needed to be facing up.&lt;/li&gt;&#xA;&lt;li&gt;I had plugged it into the top left USB-C port on my laptop, I&amp;rsquo;m not sure if it will work when plugged into the other one. However, I did power the board by plugging it into the other available USB-C port.&lt;/li&gt;&#xA;&lt;li&gt;The MrChromebox documentation says that it takes 2-3 minutes of pressing the physical presence sensor to enable CCD. In reality, it was more like 5. It paused several times during the process, and it rebooted without ever showing me the &amp;ldquo;PP Done!&amp;rdquo; message that the docs suggest. However, the steps there did work fine.&lt;/li&gt;&#xA;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;Once I had gone through the steps and verified that hardware write protection was indeed disabled, I proceeded to the next step, which was flashing the firmware.&lt;/p&gt;&#xA;&lt;p&gt;I used the provided &lt;a href=&#34;https://docs.mrchromebox.tech/docs/fwscript.html&#34;&gt;firmware utility script&lt;/a&gt; to flash the firmware.&lt;/p&gt;&#xA;&lt;p&gt;Generally I don&amp;rsquo;t recommend running scripts blindly from the internet, but it truly does make this process a ton easier, and if you wish, you can review the script yourself. (And I recommend doing so before you run it!)&lt;/p&gt;&#xA;&lt;p&gt;First, I backed up the existing ChromeOS firmware to a USB stick. Handy, in case I ended up needing to return this laptop.&lt;/p&gt;&#xA;&lt;p&gt;Then, I proceeded to flash the Coreboot UEFI firmware.&lt;/p&gt;&#xA;&lt;p&gt;It took a few minutes, but once done I was able to boot into the &lt;a href=&#34;https://fedoraproject.org/spins/sway/download&#34;&gt;Fedora 43 Sway Spin&lt;/a&gt; installer.&lt;/p&gt;&#xA;&lt;h2 id=&#34;some-problems&#34;&gt;Some problems&lt;/h2&gt;&#xA;&lt;p&gt;I noticed right away that the touchpad didn&amp;rsquo;t work in the installer, but I proceeded anyway. I could have grabbed a mouse, but being the lazy person I am, I just navigated the installation with the keyboard instead.&lt;/p&gt;&#xA;&lt;p&gt;Once installed, it took me a few minutes to figure out where all the needed buttons were.&lt;/p&gt;&#xA;&lt;p&gt;Linux maps the Chromebook Search key to Super_L, which I needed to open the default &lt;code&gt;drun&lt;/code&gt; menu. Can&amp;rsquo;t do much in &lt;a href=&#34;https://swaywm.org/&#34;&gt;Sway&lt;/a&gt; without being able to open &lt;code&gt;drun&lt;/code&gt; or a similar launcher!&lt;/p&gt;&#xA;&lt;p&gt;The touchpad still didn&amp;rsquo;t work, and neither did sound. However, everything else worked a treat.&lt;/p&gt;&#xA;&lt;p&gt;It was a bit strange, since the touchpad appeared normally in &lt;code&gt;libinput --list-devices&lt;/code&gt;, and the sound driver appeared normally in &lt;code&gt;pavucontrol&lt;/code&gt;, however, neither of them worked at all, and there were a TON of errors in &lt;code&gt;dmesg&lt;/code&gt; regarding the sound driver.&lt;/p&gt;&#xA;&lt;p&gt;I did some searching on the &lt;a href=&#34;https://forum.chrultrabook.com/&#34;&gt;chultrabook forums&lt;/a&gt;, and I was able to find solutions for both issues.&lt;/p&gt;&#xA;&lt;h3 id=&#34;fixing-the-audio-problem&#34;&gt;Fixing the audio problem&lt;/h3&gt;&#xA;&lt;p&gt;The &lt;a href=&#34;https://docs.chultrabook.com&#34;&gt;chultrabook docs&lt;/a&gt; contained a &amp;ldquo;Post-Install&amp;rdquo; FAQ that was very helpful - I found their &lt;a href=&#34;https://github.com/WeirdTreeThing/chromebook-linux-audio&#34;&gt;audio script&lt;/a&gt; which was all I needed to get sound working.&lt;/p&gt;&#xA;&lt;h3 id=&#34;fixing-the-touchpad-problem&#34;&gt;Fixing the touchpad problem&lt;/h3&gt;&#xA;&lt;p&gt;The touchpad issue was a bit trickier to pin down.&lt;/p&gt;&#xA;&lt;p&gt;Eventually I found &lt;a href=&#34;https://forum.chrultrabook.com/t/no-touchpad-multitouch-on-asus-chromebook-cx9-drobit/3606&#34;&gt;this post&lt;/a&gt; that pointed me in the right direction.&lt;/p&gt;&#xA;&lt;p&gt;The answer was to configure a &lt;code&gt;libinput&lt;/code&gt; quirk:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo vim /etc/libinput/local-overrides.quirks&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Enter the following content:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[PNP Touchpad]&#xA;MatchName=*PNP*Touchpad*&#xA;AttrResolutionHint=31x31&#xA;AttrPressureRange=10:8&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Replace &lt;code&gt;PNP&lt;/code&gt; with your touchpad model as it shows up in &lt;code&gt;libinput --list-devices&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Once you&amp;rsquo;ve done so, write and quit the file, then reboot your Chromebook.&lt;/p&gt;&#xA;&lt;p&gt;Success! The touchpad now works!&lt;/p&gt;&#xA;&lt;h2 id=&#34;final-thoughts&#34;&gt;Final Thoughts&lt;/h2&gt;&#xA;&lt;p&gt;The Chromebook performs very well under Fedora, but I&amp;rsquo;m also not running a full on desktop environment.&lt;/p&gt;&#xA;&lt;p&gt;If KDE is your preferred environment, you may run into more issues, especially since this device only has 4GB of onboard memory, and a relatively weak Intel CPU.&lt;/p&gt;&#xA;&lt;p&gt;I haven&amp;rsquo;t used Gnome in quite some time, but I expect it would run into similar limitations.&lt;/p&gt;&#xA;&lt;p&gt;The screen isn&amp;rsquo;t fantastic, but it&amp;rsquo;s good enough for what I&amp;rsquo;m planning on using this laptop for - effectively just tossing it in my bag when I need a super small and light laptop for travelling, or when I want to sit on the couch and chat on Discord while watching TV.&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;Do I recommend buying this specifically to run Linux?&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;No, not really.&lt;/p&gt;&#xA;&lt;p&gt;It works great once you get it going, especially for the price, but you can likely find better laptops on eBay.&lt;/p&gt;&#xA;&lt;p&gt;Used ThinkPads are the way to go for cheap laptops.&lt;/p&gt;&#xA;&lt;p&gt;This was just a fun little &amp;ldquo;I wonder if I can do this&amp;rdquo; project.&lt;/p&gt;&#xA;&lt;p&gt;That said, if you already have one of these devices? I &lt;em&gt;highly&lt;/em&gt; recommend installing regular Linux on it.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Setting up brscan-skey with the Brother DS-940DW on Ubuntu</title>
      <link>https://blog.ssb-tech.net/posts/linux-scanning-ds940dw/</link>
      <pubDate>Fri, 13 Jun 2025 18:58:09 -0400</pubDate>
      <guid>https://blog.ssb-tech.net/posts/linux-scanning-ds940dw/</guid>
      <description>&lt;h1 id=&#34;setting-up-brscan-skey-with-the-brother-ds-940dw-on-ubuntu&#34;&gt;Setting up brscan-skey with the Brother DS-940DW on Ubuntu&lt;/h1&gt;&#xA;&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;&#xA;&lt;p&gt;The Brother DS-940DW is a little handheld mobile scanner. Getting it working on Linux in a way where you can actually use the Start/Stop button on the scanner to scan things was a bit of a bear, so I thought I&amp;rsquo;d document how I did it.&lt;/p&gt;&#xA;&lt;p&gt;Part of the issue is that brscan-skey depends on the old version of &lt;code&gt;libsane&lt;/code&gt;, and does not work with &lt;code&gt;libsane1&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;solving-the-dependency-problem&#34;&gt;Solving the dependency problem&lt;/h2&gt;&#xA;&lt;p&gt;First, install the provided driver from the &lt;a href=&#34;https://support.brother.com/g/b/downloadlist.aspx?c=us&amp;amp;lang=en&amp;amp;prod=ds940dw_us_eu_as&amp;amp;os=128&#34;&gt;support page for the DS-940DW&lt;/a&gt;&#xA;You can grab the scan-key-tool deb package from &lt;a href=&#34;https://download.brother.com/welcome/dlf006652/brscan-skey-0.3.4-0.amd64.deb&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Going by &lt;a href=&#34;https://support.brother.com/g/b/faqend.aspx?c=as_ot&amp;amp;lang=en&amp;amp;prod=dcpl2600d_eu_as&amp;amp;faqid=faq00100811_000&#34;&gt;this Brother support article&lt;/a&gt;, I was able to get brscan-skey installed.&lt;/p&gt;&#xA;&lt;h3 id=&#34;steps&#34;&gt;Steps&lt;/h3&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo su&#xA;apt update&#xA;apt install sane libsane1 sane-utils imagemagick&#xA;wget -c http://jp.archive.ubuntu.com/ubuntu/pool/universe/s/sane-backends/libsane_1.1.1-5_amd64.deb&#xA;dpkg -i libsane_1.1.1-5_amd64.deb&#xA;apt install evince&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;configure-scanning&#34;&gt;Configure scanning&lt;/h2&gt;&#xA;&lt;p&gt;I had all sorts of fun figuring out how this all works, and honestly it&amp;rsquo;s pretty simple.&lt;/p&gt;&#xA;&lt;p&gt;Pressing the Start/Stop button on the scanner while brscan-skey is running calls this shell script:&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;/opt/brother/scanner/brscan-skey/script/scantofile.sh&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;You can have it do whatever you want by editing the script.&lt;/p&gt;&#xA;&lt;p&gt;By default it uses psutils and pod2pdf, and a bunch of other utilities to scan first to PostScript, then convert it to PDF.&lt;/p&gt;&#xA;&lt;p&gt;I don&amp;rsquo;t often have the need to scan complex documents, so I simplified this quite a bit, as I&amp;rsquo;ll show you here in second.&lt;/p&gt;&#xA;&lt;p&gt;But before we do anything, we need to add some udev rules.&lt;/p&gt;&#xA;&lt;p&gt;Create a file at &lt;code&gt;/etc/udev/rules.d/NN-brother-mfp-brscan5-1.0.2-2.rules&lt;/code&gt; with the following content:&lt;/p&gt;&#xA;&lt;h3 id=&#34;udev-rules&#34;&gt;udev rules&lt;/h3&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;ACTION!=&amp;#34;add&amp;#34;, GOTO=&amp;#34;brother_mfp_end&amp;#34;&#xA;SUBSYSTEM==&amp;#34;usb&amp;#34;, GOTO=&amp;#34;brother_mfp_udev_1&amp;#34;&#xA;SUBSYSTEM!=&amp;#34;usb_device&amp;#34;, GOTO=&amp;#34;brother_mfp_end&amp;#34;&#xA;LABEL=&amp;#34;brother_mfp_udev_1&amp;#34;&#xA;&#xA;ATTRS{idVendor}==&amp;#34;04f9&amp;#34;, GOTO=&amp;#34;brother_mfp_udev_2&amp;#34;&#xA;GOTO=&amp;#34;brother_mfp_end&amp;#34;&#xA;LABEL=&amp;#34;brother_mfp_udev_2&amp;#34;&#xA;&#xA;ATTRS{bInterfaceClass}!=&amp;#34;0ff&amp;#34;, GOTO=&amp;#34;brother_mfp_end&amp;#34;&#xA;ATTRS{bInterfaceSubClass}!=&amp;#34;0ff&amp;#34;, GOTO=&amp;#34;brother_mfp_end&amp;#34;&#xA;ATTRS{bInterfaceProtocol}!=&amp;#34;0ff&amp;#34;, GOTO=&amp;#34;brother_mfp_end&amp;#34;&#xA;&#xA;MODE=&amp;#34;0666&amp;#34;&#xA;GROUP=&amp;#34;scanner&amp;#34;&#xA;ENV{libsane_matched}=&amp;#34;yes&amp;#34;&#xA;LABEL=&amp;#34;brother_mfp_end&amp;#34;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Reload udev rules:&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;sudo udevadm control --reload &amp;amp;&amp;amp; sudo udevadm trigger&lt;/code&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;scanner-group&#34;&gt;Scanner group&lt;/h3&gt;&#xA;&lt;p&gt;You&amp;rsquo;ll also want to add the user you want doing the scanning to the scanner group.&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;sudo usermod -aG scanner &amp;lt;username&amp;gt;&lt;/code&gt;&lt;/p&gt;&#xA;&lt;h3 id=&#34;systemd-service&#34;&gt;Systemd service&lt;/h3&gt;&#xA;&lt;p&gt;I created a systemd service to run brscan-skey at boot.&lt;/p&gt;&#xA;&lt;p&gt;Create the following at &lt;code&gt;/etc/systemd/system/brscan-skey.service&lt;/code&gt;&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[Unit]&#xA;Description=Brother scan-key-tool&#xA;&#xA;[Service]&#xA;User=scott&#xA;Type=forking&#xA;ExecStart=/opt/brother/scanner/brscan-skey/brscan-skey&#xA;ExecStop=/opt/brother/scanner/brscan-skey/brscan-skey --terminate&#xA;&#xA;[Install]&#xA;WantedBy=multi-user.target&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Run the following commands:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo systemctl daemon-reload&#xA;sudo systemctl enable --now brscan-skey.service&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You may need to reboot. I did.&lt;/p&gt;&#xA;&lt;h3 id=&#34;simple-scantofilesh-script&#34;&gt;Simple scantofile.sh script&lt;/h3&gt;&#xA;&lt;p&gt;First make a backup of the existing script, just in case.&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;sudo mv /opt/brother/scanner/brscan-skey/script/scantofile.sh /opt/brother/scanner/brscan-skey/script/scantofile.sh.bak&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;Now we create our own version:&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;sudo vim /opt/brother/scanner/brscan-skey/script/scantofile.sh&lt;/code&gt;&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#! /bin/sh&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set +o noclobber&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;BASE&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;$HOME/brscan&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pdf_name&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;date | sed s/&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt;/&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;_&amp;#39;&lt;/span&gt;/g | sed s/&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;\:&amp;#39;&lt;/span&gt;/&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;_&amp;#39;&lt;/span&gt;/g&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;output_full&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$BASE&lt;span style=&#34;color:#e6db74&#34;&gt;/&lt;/span&gt;$pdf_name&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# scan the image in using scanimage&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;scanimage -x 215.9 -y 279.4 --format&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;png &amp;gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$output_full&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;.png&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Convert to PDF using imagemagick&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;convert &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$output_full&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;.png &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$output_full&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;.pdf&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;echo &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Created file &lt;/span&gt;$output_full&lt;span style=&#34;color:#e6db74&#34;&gt;.pdf&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Cleanup&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rm &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$output_full&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;.png&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;My script assumes a lot of things. It assumes that you&amp;rsquo;re using letter size paper, for one. This was a really quick and dirty hack - maybe I&amp;rsquo;ll refactor this in the future.&lt;/p&gt;&#xA;&lt;h2 id=&#34;future-goals&#34;&gt;Future goals&lt;/h2&gt;&#xA;&lt;p&gt;My goal for getting this working was to have a small, low power x86 PC that just runs this and nothing else. It&amp;rsquo;s connected via WiFi so I can put it anywhere, and hopefully make it so that I &lt;em&gt;actually use it&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I have it exposing an NFS share that I&amp;rsquo;m going to mount as an ingestion folder for &lt;a href=&#34;https://docs.paperless-ngx.com/&#34;&gt;Paperless-NGX&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Maybe I&amp;rsquo;ll create another blog post soon showing how I got that set up.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Fedora 41 and ZFS</title>
      <link>https://blog.ssb-tech.net/posts/fedora41-and-zfs/</link>
      <pubDate>Mon, 09 Dec 2024 20:40:18 -0500</pubDate>
      <guid>https://blog.ssb-tech.net/posts/fedora41-and-zfs/</guid>
      <description>&lt;div class=&#34;callout callout-note&#34; role=&#34;note&#34;&gt;&lt;div class=&#34;callout-title&#34;&gt;Note&lt;/div&gt;&lt;div class=&#34;callout-content&#34;&gt;ZFS 2.2.7 has been released with up to Linux kernel 6.12 support, so this workaround is no longer necessary.&#xA;I&amp;rsquo;ll leave the post up in case this is ever useful in the future.&lt;/div&gt;&lt;/div&gt;&#xA;&lt;p&gt;I previously posted about how to &lt;a href=&#34;https://blog.ssb-tech.net/posts/building-fedora-server-into-a-desktop/&#34;&gt;build a desktop OS from the Fedora Server installer&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;This is a bit of a follow up to that post.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve now been running Fedora 41 for a few days and it&amp;rsquo;s been a mostly pleasant experience.&lt;/p&gt;&#xA;&lt;p&gt;However, I am also an avid ZFS user, and the current stable release of OpenZFS &lt;a href=&#34;https://github.com/openzfs/zfs/issues/16590&#34;&gt;does not support Linux kernel 6.11 yet&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;So, being the enterprising fellow that I am, I chose to build ZFS 2.3.0 RC3 from source using the &lt;a href=&#34;https://openzfs.github.io/openzfs-docs/Developer%20Resources/Building%20ZFS.html&#34;&gt;official instructions&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;That went well, but one thing that tripped me up (and caused some issues for specific applications like syncthing, which keeps it&amp;rsquo;s local database in the user&amp;rsquo;s home directory) is that when you do this, unlike when you install &lt;code&gt;zfsutils-linux&lt;/code&gt; on Ubuntu, it doesn&amp;rsquo;t set up the automatic import and mounting of your pool.&lt;/p&gt;&#xA;&lt;p&gt;It took some digging around to find the correct process, because it seems to be a bit different between the official ZFS source and the one that ships with Ubuntu, but here&amp;rsquo;s what wound up working for me:&lt;/p&gt;&#xA;&lt;p&gt;First, go through and enable the following services:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo systemctl enable zfs.target zfs-mount.target zfs-import.target zfs-import-cache.service&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;There are plenty of posts online telling you that you should create your cache file in &lt;code&gt;/etc/zfs/zfs-list-cache/&lt;/code&gt;, but this is wrong (or at least outdated. I’m not sure if that location is Ubuntu specific?)&lt;/p&gt;&#xA;&lt;p&gt;The ACTUAL location of the cache file (which you can see if you actually read through the systemd unit file for zfs-import-cache.service) is &lt;code&gt;/usr/local/etc/zfs&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;If the file doesn&amp;rsquo;t exist, create it.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo touch /usr/local/etc/zfs/zpool.cache&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Import your pool.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo zpool import poolname&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you print out the cache file now it should no longer be empty.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cat /usr/local/etc/zfs/zpool.cache&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next time you reboot your pools should automatically mount and mount all filesystems.&lt;/p&gt;&#xA;&lt;p&gt;And yes, I did cross post this over on the &lt;a href=&#34;https://discourse.practicalzfs.com/t/psa-zfs-automount-when-building-from-source/1970/1&#34;&gt;PracticalZFS forum.&lt;/a&gt;&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>How to build up Fedora Server Edition to a desktop</title>
      <link>https://blog.ssb-tech.net/posts/building-fedora-server-into-a-desktop/</link>
      <pubDate>Sun, 08 Dec 2024 16:44:53 -0500</pubDate>
      <guid>https://blog.ssb-tech.net/posts/building-fedora-server-into-a-desktop/</guid>
      <description>&lt;h1 id=&#34;how-to-build-up-fedora-server-edition-to-a-desktop&#34;&gt;How to build up Fedora Server Edition to a desktop&lt;/h1&gt;&#xA;&lt;p&gt;In this article I&amp;rsquo;ll go over how to take the Fedora Server Edition image and build it up into a full desktop.&lt;/p&gt;&#xA;&lt;h2 id=&#34;1-download-the-fedora-server-edition-iso&#34;&gt;1. Download the Fedora Server Edition ISO.&lt;/h2&gt;&#xA;&lt;p&gt;Download the latest .iso (DVD) release from &lt;a href=&#34;https://fedoraproject.org/server/download&#34;&gt;here.&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;Burn it to a USB stick using whichever method you prefer, and boot into it.&lt;/p&gt;&#xA;&lt;h2 id=&#34;2-set-software-selections-to-custom&#34;&gt;2. Set Software Selections to custom&lt;/h2&gt;&#xA;&lt;p&gt;Once in the Fedora installer, the first step we want to take is to go into &amp;ldquo;Software Selections&amp;rdquo; and set it to &amp;ldquo;custom&amp;rdquo; instead of the Server Edition.&lt;/p&gt;&#xA;&lt;p&gt;The &amp;ldquo;Server Edition&amp;rdquo; option will install the Cockpit web management package along with the OS. Not something I want installed on my desktop, personally, but if you think that&amp;rsquo;s something you&amp;rsquo;d like to have, go for it. It will make no difference to the rest of the process.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Fedora Software Selections&#34; loading=&#34;lazy&#34; src=&#34;https://blog.ssb-tech.net/posts/building-fedora-server-into-a-desktop/images/fedora-software-selections.png&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;3-create-disk-partitions&#34;&gt;3. Create disk partitions.&lt;/h2&gt;&#xA;&lt;p&gt;Enter the partition layout editor and select &amp;ldquo;custom&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Custom partition layout&#34; loading=&#34;lazy&#34; src=&#34;https://blog.ssb-tech.net/posts/building-fedora-server-into-a-desktop/images/fedora-custom-part.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;For the &amp;ldquo;New mount points&amp;rdquo; dropdown, pick btrfs.&lt;/p&gt;&#xA;&lt;p&gt;Click the plus button to create a new partition.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;BTRFS dropdown&#34; loading=&#34;lazy&#34; src=&#34;https://blog.ssb-tech.net/posts/building-fedora-server-into-a-desktop/images/fedora-btrfs-drop.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;We will create a single partition of 1GB for the EFI bootloader, leaving the rest for the OS and user data.&lt;/p&gt;&#xA;&lt;p&gt;Set the mountpoint of this partition to &lt;code&gt;/boot/efi&lt;/code&gt;, and check the box to reformat the disk.&#xA;This will allow you to select the &amp;ldquo;EFI System Partition&amp;rdquo; type.&lt;/p&gt;&#xA;&lt;p&gt;For the rest of the disk, create a single btrfs partition.&lt;/p&gt;&#xA;&lt;p&gt;We will subdivide this using btrfs subvolumes.&lt;/p&gt;&#xA;&lt;p&gt;Use the + button to create 4 more &amp;ldquo;partitions&amp;rdquo;, though since we&amp;rsquo;ve already occupied the entire disk these will be subvolumes instead of partitions. You can see this by looking on the right side under the &amp;ldquo;Volume&amp;rdquo; dropdown. By default the btrfs volume name is &amp;ldquo;fedora&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;There&amp;rsquo;s no real reason to change this, so we&amp;rsquo;ll leave it alone.&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;For the first subvolume, give it a mount point of &lt;code&gt;/&lt;/code&gt; and change the name from &lt;code&gt;root&lt;/code&gt; to &lt;code&gt;@&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;For the second subvolume, the mount point will be &lt;code&gt;/home&lt;/code&gt; and the name will be &lt;code&gt;@home&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Subvolume 3 will be mounted at &lt;code&gt;/var/log&lt;/code&gt; and called &lt;code&gt;@log&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Subvolume 4 will be mounted at &lt;code&gt;/.snapshots&lt;/code&gt; and called &lt;code&gt;@.snapshots&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Following these naming conventions will allow us to use the &lt;code&gt;timeshift&lt;/code&gt; snapshotting tool, as it expects the Ubuntu btrfs naming conventions, as I&amp;rsquo;ve used here.&lt;/p&gt;&#xA;&lt;p&gt;If you wish to create any more subvolumes, you can do so now, but that&amp;rsquo;s enough for me.&lt;/p&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s what it should look like at the end:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Final partition layout&#34; loading=&#34;lazy&#34; src=&#34;https://blog.ssb-tech.net/posts/building-fedora-server-into-a-desktop/images/fedora-final-layout.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Keep in mind that if you&amp;rsquo;d like to use a different layout than the one I used here, or if you&amp;rsquo;d like to put your &lt;code&gt;/home&lt;/code&gt; partition on a different disk entirely, that&amp;rsquo;s entirely OK.&lt;/p&gt;&#xA;&lt;p&gt;Just keep in mind - you need &lt;em&gt;at least&lt;/em&gt; a root partition &lt;code&gt;/&lt;/code&gt; and an EFI partition &lt;code&gt;/boot/efi&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;4-create-a-user&#34;&gt;4. Create a user&lt;/h2&gt;&#xA;&lt;p&gt;I recommend creating a user at this point with superuser privileges. You can also, if you wish, enable the root account and give it a password, but I won&amp;rsquo;t bother.&lt;/p&gt;&#xA;&lt;h2 id=&#34;5-finish-the-installation&#34;&gt;5. Finish the installation&lt;/h2&gt;&#xA;&lt;p&gt;At this point you can proceed with installing the OS.&lt;/p&gt;&#xA;&lt;p&gt;Once the installation is done, reboot your machine and log into your new operating system.&lt;/p&gt;&#xA;&lt;h2 id=&#34;6-install-updates&#34;&gt;6. Install updates&lt;/h2&gt;&#xA;&lt;p&gt;You&amp;rsquo;ll be greeted with a command line only interface. Don&amp;rsquo;t worry, we&amp;rsquo;ll fix that in a moment.&lt;/p&gt;&#xA;&lt;p&gt;First, run the below command and get any pending updates out of the way.&lt;/p&gt;&#xA;&lt;p&gt;Reboot may or may not be necessary if there&amp;rsquo;s not a new kernel.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo dnf upgrade &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo reboot now&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;7-install-software&#34;&gt;7. Install software.&lt;/h2&gt;&#xA;&lt;p&gt;I don&amp;rsquo;t use a typical desktop environment, I use SwayWM, but I do use GDM as my display manager, so we&amp;rsquo;ll be installing a few Gnome packages.&lt;/p&gt;&#xA;&lt;p&gt;If you wish to install Gnome instead of Sway, you can use the following command:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo dnf group install gnome&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;install-swaywm&#34;&gt;Install SwayWM&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo dnf group install swaywm&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;install-the-gnome-display-manager-gdm&#34;&gt;Install the Gnome Display Manager (GDM)&lt;/h3&gt;&#xA;&lt;p&gt;This package will handle our login sessions and give us the nice login screen to log into Sway with.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo dnf install gdm&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;set-default-systemd-target&#34;&gt;Set default systemd target&lt;/h3&gt;&#xA;&lt;p&gt;Right now, the multi-user.target is the default systemd target on login.&lt;/p&gt;&#xA;&lt;p&gt;If we want our GUI to start upon boot, we need to make this &lt;code&gt;graphical.target&lt;/code&gt; instead.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo systemctl set-default graphical.target&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;install-recommended-packages&#34;&gt;Install recommended packages&lt;/h3&gt;&#xA;&lt;p&gt;These packages can be useful if we need to build anything from source, or if you use anything like Neovim with &lt;code&gt;nvim-treesitter&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo dnf install make automake gcc gcc-c++ kernel-devel tar unzip&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;install-the-rpmfusion-repos-and-media-codecs&#34;&gt;Install the RPMFusion repos and media codecs.&lt;/h3&gt;&#xA;&lt;p&gt;Red Hat does not bundle these codecs with Fedora, so if you want hardware decoding for H264 and H265 (and you do), run this command to take care of all of that.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo dnf install https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;rpm -E %fedora&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;.noarch.rpm https://mirrors.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-&lt;span style=&#34;color:#66d9ef&#34;&gt;$(&lt;/span&gt;rpm -E %fedora&lt;span style=&#34;color:#66d9ef&#34;&gt;)&lt;/span&gt;.noarch.rpm&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo dnf group install multimedia sound-and-video&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If the above command doesn&amp;rsquo;t work for some reason, try running another &lt;code&gt;sudo dnf upgrade&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;For some reason the first time I added the rpmfusion repos, the multimedia group wasn&amp;rsquo;t available until after I ran that.&lt;/p&gt;&#xA;&lt;h3 id=&#34;extra-goodies&#34;&gt;Extra Goodies&lt;/h3&gt;&#xA;&lt;p&gt;Set dark GTK theme by default:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gsettings set org.gnome.desktop.interface color-scheme &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;prefer-dark&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Most GTK applications will respect this and avoid the eye-rending white backgrounds.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Update 2024/12/24&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;You probably also want to install some fonts. After writing this post, I discovered that Fedora Server is missing a &lt;code&gt;Dingbats&lt;/code&gt; font that contains specific symbols.&lt;/p&gt;&#xA;&lt;p&gt;You can get this by installing a font like &lt;a href=&#34;https://fontlibrary.org/en/font/symbola&#34;&gt;Symbola&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I also recommend installing a Nerd Font like FiraCode from &lt;a href=&#34;https://www.nerdfonts.com/font-downloads&#34;&gt;the Nerd Font website.&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;You can put them in a few different locations:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;/usr/share/fonts&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;/usr/local/share/fonts&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;~/.local/share/fonts&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Personally, I like installing them to &lt;code&gt;/usr/local/share/fonts&lt;/code&gt; so that they&amp;rsquo;re available to all users on the system. (Even though I&amp;rsquo;m typically the only user on my systems.)&lt;/p&gt;&#xA;&lt;p&gt;Download the font zip file.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo unzip font.zip -d /usr/local/share/fonts/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo chown root:root /usr/local/share/fonts/font*.ttf&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;start-and-enable-gdm&#34;&gt;Start and enable GDM&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo systemctl enable gdm &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo systemctl start gdm&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This will kick you over to the Gnome Display Manager and allow you to log into any desktop environments or Wayland compositors you may have installed.&lt;/p&gt;&#xA;&lt;p&gt;If you&amp;rsquo;re using Gnome, it will be a very basic installation without any packages to speak of besides the absolute necessities, but this is why we install things from the server edition - to get a more minimal install without bloat.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve also created a script to make the process of getting things to a full desktop simpler - feel free to use it as a base!&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://gist.github.com/BladeWDR/e9c4d794458ec7715133f25a4318ed4e&#34;&gt;Fedora setup script gist&lt;/a&gt;&lt;/p&gt;&#xA;</description>
    </item>
  </channel>
</rss>
