<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>jutty.dev - operating-systems</title>
    <subtitle>Computer nerd memory leaks</subtitle>
    <link rel="self" type="application/atom+xml" href="https://blog.jutty.dev/tags/operating-systems/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://blog.jutty.dev"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2024-06-30T00:00:00+00:00</updated>
    <id>https://blog.jutty.dev/tags/operating-systems/atom.xml</id>
    <entry xml:lang="en">
        <title>Introducing tori</title>
        <published>2024-06-30T00:00:00+00:00</published>
        <updated>2024-06-30T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Juno Takano
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.jutty.dev/posts/introducing-tori/"/>
        <id>https://blog.jutty.dev/posts/introducing-tori/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/posts/introducing-tori/">&lt;p&gt;&lt;strong&gt;&lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;tori.jutty.dev&#x2F;&quot;&gt;tori&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; is a tool to track your personal systems’ configurations and replicate them.&lt;&#x2F;p&gt;
&lt;p&gt;For the past 5 months, I’ve been simultaneously using and writing it to manage my main machine’s configuration. By “manage the configuration” what I mean is keeping track of installed packages, configuration files, symlinks, and other settings that can be queried and set through command line interfaces.&lt;&#x2F;p&gt;
&lt;p&gt;After installing a given system, I wanted to get it to the same configuration state I was used to, or to a certain configuration specific to its purpose. Just copying backups would certainly be a very manual task, namely because:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Not all settings live in &lt;code&gt;&#x2F;etc&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Some settings must be set using a specific CLI utility&lt;&#x2F;li&gt;
&lt;li&gt;Backups usually carry an overwhelming amount of redundant default configuration you never even touched&lt;&#x2F;li&gt;
&lt;li&gt;It does not track what is changing as you are still using the system&lt;&#x2F;li&gt;
&lt;li&gt;I actually wanted to &lt;em&gt;know&lt;&#x2F;em&gt; what I was tracking&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Configuring a system can become a very vague process as you start to lose track of where the changes are being made and what is the specific configuration needed for something to work.&lt;&#x2F;p&gt;
&lt;p&gt;Every time you change some configuration file, every time you create a symlink somewhere, that’s all having effects on the system that you may expect to be there in the future, but you may not remember how to accomplish that. This drift between what you have and what you are able to replicate only grows as you keep using your system.&lt;&#x2F;p&gt;
&lt;p&gt;To get a better idea, see the code snippet below. It’s from the main file that I use to manage all function calls:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;  xbps_get_many&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; packages&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;  check_service&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; dbus&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;  check_group&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; audio&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;  check_group&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; video&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;  copy&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; dhcpcd.conf &#x2F;etc&#x2F;dhcpcd.conf&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;  place&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; kernel-cmd-line.conf &#x2F;etc&#x2F;dracut.conf.d&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;  check_link&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; &#x2F;etc&#x2F;localtime &#x2F;usr&#x2F;share&#x2F;zoneinfo&#x2F;America&#x2F;Sao_Paulo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;  get_nix&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; tailspin tspin&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;  get_cargo&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; taplo-cli taplo&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-other&quot;&gt; --locked&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;  get_bun&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; bash-language-server&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;  get_bin&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted&quot;&gt;https:&#x2F;&#x2F;raw.githubusercontent.com&#x2F;hackerb9&#x2F;lsix&#x2F;master&#x2F;lsix&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; lsix&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;  check_gsettings&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; gtk-theme&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted&quot;&gt;Plata-Noir&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-entity z-name z-function&quot;&gt;  check_gsettings&lt;&#x2F;span&gt;&lt;span class=&quot;z-string&quot;&gt; font-name&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted&quot;&gt;Mononoki Nerd Font Regular&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;What is happening here:&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;A file named &lt;code&gt;packages&lt;&#x2F;code&gt; containing package names is parsed and all packages are queried and installed by the &lt;code&gt;xbps&lt;&#x2F;code&gt; package manager, if not already installed&lt;&#x2F;li&gt;
&lt;li&gt;Service &lt;code&gt;dbus&lt;&#x2F;code&gt; is enabled if not already enabled&lt;&#x2F;li&gt;
&lt;li&gt;The user is added to groups &lt;code&gt;audio&lt;&#x2F;code&gt; and &lt;code&gt;video&lt;&#x2F;code&gt;, unless already in them&lt;&#x2F;li&gt;
&lt;li&gt;File &lt;code&gt;dhcpcd.conf&lt;&#x2F;code&gt; from the configuration directory’s &lt;code&gt;base&lt;&#x2F;code&gt; directory is checked against the one in the passed path and overwrites it if the user chooses to do so&lt;&#x2F;li&gt;
&lt;li&gt;File &lt;code&gt;kernel-cmd-line.conf&lt;&#x2F;code&gt; from the configuration directory’s &lt;code&gt;base&lt;&#x2F;code&gt; directory is copied into the passed path. If the file already exists or differs, tori will present an error&lt;&#x2F;li&gt;
&lt;li&gt;A symlink is checked to be on &lt;code&gt;&#x2F;etc&#x2F;localtime&lt;&#x2F;code&gt; pointing to the passed path. If it doesn’t, it is created or fixed&lt;&#x2F;li&gt;
&lt;li&gt;If not installed, a few packages are installed using different package managers: &lt;code&gt;tailspin&lt;&#x2F;code&gt;, &lt;code&gt;taplo&lt;&#x2F;code&gt; and &lt;code&gt;bash-language-server&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;If absent, an executable for &lt;code&gt;lsix&lt;&#x2F;code&gt; is downloaded from a URL and placed at &lt;code&gt;~&#x2F;.local&#x2F;bin&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;Some &lt;code&gt;gsettings&lt;&#x2F;code&gt; values are read and set if they differ: &lt;code&gt;gtk-theme&lt;&#x2F;code&gt; and &lt;code&gt;font-name&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;Notice how everything is conditioned to the system not already presenting that state? tori aims to be idempotent. Running it twice should do nothing the second time it runs so you can run it multiple times while making changes without any doubled effects.&lt;&#x2F;p&gt;
&lt;p&gt;I mentioned a &lt;code&gt;base&lt;&#x2F;code&gt; directory. This is what a sample tori directory would look like in its present state:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo z-code&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── base&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   ├── dhcpcd.conf&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   ├── kernel-cmd-line.conf&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   ├── packages&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   └── vars.sh&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── .bkp&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   ├── canonical&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   │   ├── etc&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   │   └── opt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   └── ephemeral&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│       └── etc&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── src&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   ├── checks.sh&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   ├── copy.sh&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   └── get.sh&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;└── strap&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;What you are seeing in this sample of the directory are the following files and directories:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;base&lt;&#x2F;code&gt;: Where you place the configuration files that functions like &lt;code&gt;copy&lt;&#x2F;code&gt; and &lt;code&gt;place&lt;&#x2F;code&gt; will look for and copy into the desired locations&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;.bkp&#x2F;canonical&lt;&#x2F;code&gt;: Where tori will look for initial backups and create them if none exists&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;.bkp&#x2F;ephemeral&lt;&#x2F;code&gt;: Where tori will place timestamped backups every time a file is modified or overwritten&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;src&lt;&#x2F;code&gt;: Where the source files live, mostly containing function definitions&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;strap&lt;&#x2F;code&gt;: The main file used to call the functions&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Because I developed tori for my own purposes initially, I didn’t really care to separate the actual source files from the context-sensitive data. While a mistake from a higher level, it allowed me to just keep developing the whole system configuration and the code that tracked it from a single, version-controlled location, amounting to very little complexity. I can’t deny to have enjoyed it so far, but going forward that is going to change.&lt;&#x2F;p&gt;
&lt;p&gt;Currently, tori is able to install several package managers and their packages, including xbps, apt, nix, opam, stack, cargo, go, sdkmanager, npm, flatpak and pipx.&lt;&#x2F;p&gt;
&lt;p&gt;It can also perform several other tasks:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;setup programming runtimes for OCaml, Scala (via Coursier), Go, JavaScript (node and bun), Rust (via rustup)&lt;&#x2F;li&gt;
&lt;li&gt;generate GPG certificates&lt;&#x2F;li&gt;
&lt;li&gt;query and set options with &lt;code&gt;update-alternatives&lt;&#x2F;code&gt; and &lt;code&gt;gsettings&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;change the user shell&lt;&#x2F;li&gt;
&lt;li&gt;check and enable services (systemd and runit)&lt;&#x2F;li&gt;
&lt;li&gt;download pre-built binaries from tarballs and (g)zip files, unpacking and making them executable&lt;&#x2F;li&gt;
&lt;li&gt;get files through the network using rsync&lt;&#x2F;li&gt;
&lt;li&gt;several other things likely not worth mentioning&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The application slowly grew to accommodate many of my needs, but I also made it very hard to share with the world in the process, since I never really meant to go public with it.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;portability-issues&quot;&gt;Portability issues
 &lt;a class=&quot;zola-anchor&quot; href=&quot;#portability-issues&quot; aria-label=&quot;Anchor link for: portability-issues&quot;&gt;#&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Despite it being very useful to me in its current state and still being something I actively use every day, a lot of it is hard-coded for my very personal use. It was not written with portability in mind and therefore requires a lot of source-code editing to use in a different system.&lt;&#x2F;p&gt;
&lt;p&gt;For instance, when I switched from Debian to Void Linux, most of it broke. I certainly would not expect the package list to be compatible between them, but I realized at that point how tightly it was coupled to Debian.&lt;&#x2F;p&gt;
&lt;p&gt;When I started delving deeper into FreeBSD and setting up the system, I kept reaching out to something like tori. But it wasn’t there, and it wouldn’t work even if it were.&lt;&#x2F;p&gt;
&lt;p&gt;Something that certainly influenced my desire to write tori was my experience using NixOS, which was full of mixed feelings, but undeniably had good feelings that stuck.&lt;&#x2F;p&gt;
&lt;p&gt;I really liked being able to manage the system configuration and packages from a single file. But, at the same time, I felt it was overkill. It was limiting because most of the time you were &lt;strong&gt;forced&lt;&#x2F;strong&gt; to configure things through its interfaces. It was basically incompatible with what every other Unix system expects, and therefore what people who write software for these systems also expect.&lt;&#x2F;p&gt;
&lt;p&gt;I appreciated bringing the system configuration to a centralized file, but I certainly did not want to manage all my &lt;code&gt;~&#x2F;.config&lt;&#x2F;code&gt; configuration files from that same place. After writing tori, I can choose what to place under its tracking and what not to. Third-party software still works as both me and its creators expect it to, instead of my system breaking things and needing them to work the way &lt;em&gt;it&lt;&#x2F;em&gt; expects.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;glad-to-reinvent-the-wheel&quot;&gt;Glad to reinvent the wheel
 &lt;a class=&quot;zola-anchor&quot; href=&quot;#glad-to-reinvent-the-wheel&quot; aria-label=&quot;Anchor link for: glad-to-reinvent-the-wheel&quot;&gt;#&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;While I understand there are very mature and powerful tools to manage a system’s state and reproduce it, I am aiming here for a much simpler use case. I have no intention to see it used in enterprise or distributed systems. It is all about managing how your personal computing is set up and having a backup of how you did it.&lt;&#x2F;p&gt;
&lt;p&gt;What I need is not a tool that can orchestrate a fleet of containers running a given configuration. What I need is a tool that can run in a bare system that just got installed and get it to a state that feels useful to me. I do not want it to run instructions over a range of IPs, I just want to be able to check at any time if the system state has diverged from the configuration I am using to track it. I wanted a tool that would help me develop a different habit when I need to make system-level changes.&lt;&#x2F;p&gt;
&lt;p&gt;And finally, I suppose I just really wanted to build this. I really enjoy the process of configuring operating systems and learning how they work and differ. And I really wanted to learn more about portable, POSIX-compatible shell scripting.&lt;&#x2F;p&gt;
&lt;p&gt;So I decided to rewrite it with portability in mind. I am doing this rewrite in FreeBSD, to put the portability to the test. Once some basic functionality is done, the next step will be bringing it to Void Linux, Debian and NetBSD.&lt;&#x2F;p&gt;
&lt;p&gt;tori is a bird that has just hatched, so everything is still very, very crude. At this stage, the docs often show intentions rather than implemented functionality. Still, because it is something I’ve come to depend on, it has this rewarding sense of usefulness behind it.&lt;&#x2F;p&gt;
&lt;p&gt;If it sounds interesting to you, take a look. You can follow development at the &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;codeberg.org&#x2F;tori&#x2F;tori&quot;&gt;main repository at Codeberg&lt;&#x2F;a&gt; or through its mirrors on &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;tori-nest&#x2F;tori&quot;&gt;GitHub&lt;&#x2F;a&gt; and &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;tori.jutty.dev&#x2F;code&quot;&gt;elsewhere&lt;&#x2F;a&gt;. Going forward, I will also probably be talking a lot about it on my &lt;a class=&quot;out-link&quot; rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;mastodon.bsd.cafe&#x2F;@jutty&quot;&gt;Mastodon profile&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Meeting the BSD family</title>
        <published>2024-05-20T00:00:00+00:00</published>
        <updated>2024-05-20T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Juno Takano
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://blog.jutty.dev/posts/meeting-the-bsd-family/"/>
        <id>https://blog.jutty.dev/posts/meeting-the-bsd-family/</id>
        
        <content type="html" xml:base="https://blog.jutty.dev/posts/meeting-the-bsd-family/">&lt;p&gt;During this year I have been delving deeper and deeper in the BSD realm. Switching my home server to FreeBSD, trying NetBSD and OpenBSD on my backup machine, getting a cheap SSD to see how they’d all run on my main one, all beaming with the joy of tinkering and learning.&lt;&#x2F;p&gt;
&lt;p&gt;As a nerd who delights in reading documentation, manuals and handbooks, I feel like I have found a gigantic library to lose myself in. And to me the delight of such reading is in that it’s never a passive learning experience, but something you can act on and bring to fruition yourself.&lt;&#x2F;p&gt;
&lt;p&gt;While Linux-based operating systems, with all the popularity they have gained, have developed into a complex and extremely active ecosystem, the BSD operating systems feel less bloated and more focused on whatever their specialty is.&lt;&#x2F;p&gt;
&lt;p&gt;You can’t really complain about software availability, given the amount of pre-packaged binaries you will find. When trying FreeBSD, I could not miss anything I needed. More recently, on NetBSD, I also found most of the tools I reached for.&lt;&#x2F;p&gt;
&lt;p&gt;Though I have a mostly text-driven workflow, doing almost all things with a browser and a terminal alone – which certainly helps in making your stack more portable – I do rely on some GUI applications for the domains where they excel.&lt;&#x2F;p&gt;
&lt;p&gt;What you might experience is a slower pace of change for major things, such as on Wayland adoption, which like it or not is coming for all of us with X deprecation looming.&lt;&#x2F;p&gt;
&lt;p&gt;Running BSD is an incredible opportunity to really learn about UNIX-like systems and operating systems in general.&lt;&#x2F;p&gt;
&lt;p&gt;Recently, I’ve been learning more about NetBSD after spending some time with FreeBSD. And this inner diversity of fully-independent operating systems with their own kernels and perks keeps multiplying the learning opportunities.&lt;&#x2F;p&gt;
&lt;p&gt;If you already learned a lot about whatever OS you currently use, I’d say particularly if that OS is Linux-based, when you start to play with a BSD system you are able to realize what is similar and what is not.&lt;&#x2F;p&gt;
&lt;p&gt;Whatever is different is likely teaching you the more portable, UNIX way of doing things. Even if it isn’t, it’s teaching you how a different OS is designed and behaves.&lt;&#x2F;p&gt;
&lt;p&gt;Things that are the same, which are not few, also offer learning opportunities. You get to see what parts of a Linux-based OS perhaps didn’t really originate there, or aren’t in any way an exclusive feature of it.&lt;&#x2F;p&gt;
&lt;p&gt;Now, to lay any zealousness aside and not make this a saccharine one-sided tale, I’d also like to mention a certain social phenomenon that this endeavour reminded me of.&lt;&#x2F;p&gt;
&lt;p&gt;This is certainly not something specific to BSD, but because it has such an engaged and savvy community, you definitely get to notice it sometimes. I’m talking about the tendency to identify with and then indiscriminately defend the software you use.&lt;&#x2F;p&gt;
&lt;p&gt;One common meme you’ll find is people complaining about lack of hardware support, especially wifi. In response, I’ve seen people stating with little nuance that any difficulty to getting your hardware to work on &lt;code&gt;&amp;lt;insert a BSD OS here&amp;gt;&lt;&#x2F;code&gt; is to be explained by poor skills or lack of dedication in reading the documentation.&lt;&#x2F;p&gt;
&lt;p&gt;I see that as denial. When everyone around is just defending something to no end, no critiques allowed, it starts to feel… awkward, to say the least.&lt;&#x2F;p&gt;
&lt;p&gt;Conversely, when I see people openly pointing out weaknesses in something I value and that I can tell they also care for, I feel relief and admiration for that person and that community at large. And thankfully I have also found a lot of this among the BSD folks.&lt;&#x2F;p&gt;
&lt;p&gt;Because running a given operating system on a machine you rely on is such a big commitment, it intensifies this phenomenon where users start to identify with the software they use and defend it beyond reason.&lt;&#x2F;p&gt;
&lt;p&gt;It happens with frameworks, desktop environments and window managers, but operating systems require you to commit even more because you can’t just swap them as easily, so my guess is we identify to compensate this sense of being tied to it. And from this identification comes an urge to deny any defect.&lt;&#x2F;p&gt;
&lt;p&gt;If you are cognizant of the perils, identifying with something is not necessarily a bad thing, though. To some extent, it is inevitable, and being really into something, caring about it, nurturing immense curiosity and a desire to discuss it, are all sources of pleasure I do not excuse myself from.&lt;&#x2F;p&gt;
&lt;p&gt;Software wars aside, getting to know this family of operating systems better has been a joy. It opened up whole new avenues and perspectives to understanding operating systems as a whole, and how beyond Linux-based OSs there are numerous other free and open source operating systems that strengthen the diversity in this field.&lt;&#x2F;p&gt;
</content>
        
    </entry>
</feed>
