<?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 wporter.org</title>
    <link>https://wporter.org/categories/linux/</link>
    <description>Recent content in Linux on wporter.org</description>
    <generator>Hugo</generator>
    <language>en-US</language>
    <lastBuildDate>Sat, 13 Jun 2026 20:00:00 +0000</lastBuildDate>
    <atom:link href="https://wporter.org/categories/linux/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Attach a physical disk to a QEMU VM</title>
      <link>https://wporter.org/attach-a-physical-disk-to-a-qemu-vm/</link>
      <pubDate>Sat, 13 Jun 2026 20:00:00 +0000</pubDate>
      <guid>https://wporter.org/attach-a-physical-disk-to-a-qemu-vm/</guid>
      <description>&lt;p&gt;My desktop&amp;rsquo;s Windows install broke today. As I already had a Fedora install on another disk, it was simplest to boot the Windows install as a VM and fix it that way.&lt;/p&gt;&#xA;&lt;p&gt;Write a Libvirt-format XML device definition, e.g., in the file &amp;ldquo;nvme1n1.xml&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;Note the &lt;code&gt;bus=&#39;sata&#39;&lt;/code&gt;. I&amp;rsquo;m booting a Windows VM from a second disk in the system that doesn&amp;rsquo;t have VirtIO drivers.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tee nvme1n1.xml &lt;span class=&#34;s&#34;&gt;&amp;lt;&amp;lt; EOT&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;&amp;lt;disk type=&amp;#39;block&amp;#39; device=&amp;#39;disk&amp;#39;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;    &amp;lt;driver name=&amp;#39;qemu&amp;#39; type=&amp;#39;raw&amp;#39;/&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;    &amp;lt;source dev=&amp;#39;/dev/disk/by-id/nvme-Samsung_SSD_980_PRO_2TB_S6B0NL0T921654N&amp;#39;/&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;    &amp;lt;target dev=&amp;#39;vda&amp;#39; bus=&amp;#39;sata&amp;#39;/&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;&amp;lt;/disk&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;EOT&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then, attach the disk to the VM:&lt;/p&gt;</description>
    </item>
    <item>
      <title>RHCSA: Pass!</title>
      <link>https://wporter.org/rhcsa-pass/</link>
      <pubDate>Mon, 25 May 2026 14:30:00 +0000</pubDate>
      <guid>https://wporter.org/rhcsa-pass/</guid>
      <description>&lt;p&gt;Been quiet for the past few weeks because I&amp;rsquo;ve been busy with work and studying for my RHCSA. Took it today, 5/25. Wound up being easier than I thought. PASS, with 300/300. On to the next one!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Managing password aging with /etc/login.defs, passwd, and chage</title>
      <link>https://wporter.org/managing-password-aging-with-/etc/login.defs-passwd-and-chage/</link>
      <pubDate>Mon, 11 May 2026 19:15:00 +0000</pubDate>
      <guid>https://wporter.org/managing-password-aging-with-/etc/login.defs-passwd-and-chage/</guid>
      <description>&lt;p&gt;We can use the &lt;code&gt;/etc/login.defs&lt;/code&gt; file and &lt;code&gt;chage&lt;/code&gt; command to manage password aging for users on an EL system.&lt;/p&gt;&#xA;&lt;p&gt;The &lt;code&gt;/etc/login.defs&lt;/code&gt; controls defaults for new users - namely, the &lt;code&gt;PASS_MAX_DAYS&lt;/code&gt;, &lt;code&gt;PASS_MIN_DAYS&lt;/code&gt;, &lt;code&gt;PASS_MIN_LEN&lt;/code&gt;, and &lt;code&gt;PASS_WARN_AGE&lt;/code&gt; parameters:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Password aging controls:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#&#x9;PASS_MAX_DAYS&#x9;Maximum number of days a password may be used.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#&#x9;PASS_MIN_DAYS&#x9;Minimum number of days allowed between password changes.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#&#x9;PASS_MIN_LEN&#x9;Minimum acceptable password length.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#&#x9;PASS_WARN_AGE&#x9;Number of days warning given before a password expires.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;PASS_MAX_DAYS&#x9;99999&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;PASS_MIN_DAYS&#x9;0&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;PASS_WARN_AGE&#x9;7&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# this is in here too, but is generally ignored &amp;amp; controlled by PAM&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;PASS_MIN_LEN&#x9;8&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;These values are added to the user&amp;rsquo;s &lt;code&gt;/etc/shadow&lt;/code&gt; entry at creation time.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Determining which filesystems are present on mounted or unmounted volumes</title>
      <link>https://wporter.org/determining-which-filesystems-are-present-on-mounted-or-unmounted-volumes/</link>
      <pubDate>Sat, 09 May 2026 22:30:00 +0000</pubDate>
      <guid>https://wporter.org/determining-which-filesystems-are-present-on-mounted-or-unmounted-volumes/</guid>
      <description>&lt;h2 id=&#34;lsblk&#34;&gt;lsblk&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;lsblk -f&lt;/code&gt; will show you a list of devices, partitions, their corresponding filesystem type, available/used space, and mountpoints.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ lsblk -f&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;NAME FSTYPE FSVER LABEL  UUID                                 FSAVAIL FSUSE% MOUNTPOINTS&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sda&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├─sda1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├─sda2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│    vfat   FAT16        2205-C8D2                               191M     4% /boot/efi&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├─sda3&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;│    xfs                 6df325af-1779-4165-a6cd-78fe83c18aab    745M    22% /boot&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;└─sda4&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     xfs                 99bf1bf0-97c8-472e-9e64-fc4fee387b2b    7.4G    15% /&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sr0  iso966 Jolie cidata 2026-04-09-17-29-07-00&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;file&#34;&gt;file&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;file --special-files --dereference&lt;/code&gt; (&lt;code&gt;-sL&lt;/code&gt;) will give you information on a partition/LV&amp;rsquo;s filesystem or the MBR on a disk. Can be used on mounted or unmounted partitions.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Setting default file permissions with umask</title>
      <link>https://wporter.org/setting-default-file-permissions-with-umask/</link>
      <pubDate>Sat, 09 May 2026 22:30:00 +0000</pubDate>
      <guid>https://wporter.org/setting-default-file-permissions-with-umask/</guid>
      <description>&lt;p&gt;&lt;code&gt;umask&lt;/code&gt; is a shell command that sets the value that controls which file permissions are set by default.&lt;/p&gt;&#xA;&lt;p&gt;The OS starts with the set of maximum allowed permissions (&lt;code&gt;777&lt;/code&gt; for directories, &lt;code&gt;666&lt;/code&gt; for files, as the execute bit is required to traverse directories, but is only required to execute files - something you probably don&amp;rsquo;t want by default) and the umask bitmask is applied to remove permissions.&lt;/p&gt;&#xA;&lt;p&gt;For example:&lt;/p&gt;&#xA;&lt;p&gt;The default &lt;code&gt;umask&lt;/code&gt; is 022, which means files are created with mode 644 by default (and directories are created with mode 755).&lt;/p&gt;</description>
    </item>
    <item>
      <title>NTP - chrony and timedatectl</title>
      <link>https://wporter.org/ntp-chrony-and-timedatectl/</link>
      <pubDate>Sat, 09 May 2026 20:15:00 +0000</pubDate>
      <guid>https://wporter.org/ntp-chrony-and-timedatectl/</guid>
      <description>&lt;p&gt;On EL systems, the &lt;code&gt;chrony&lt;/code&gt; NTP client and server is used to synchronize the system&amp;rsquo;s time.&lt;/p&gt;&#xA;&lt;p&gt;The configuration file is &lt;code&gt;/etc/chrony.conf&lt;/code&gt;; the &lt;code&gt;chronyc&lt;/code&gt; and &lt;code&gt;timedatectl&lt;/code&gt; commands can be used to monitor the chrony daemon and configure the system clock, respectively.&lt;/p&gt;&#xA;&lt;p&gt;The default configuration typically point chrony at a NTP pool (distro-specific). Pools are defined with the &lt;code&gt;pool&lt;/code&gt; configuration line:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ cat /etc/chrony.conf &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep pool&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Use public servers from the pool.ntp.org project.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Please consider joining the pool (https://www.pool.ntp.org/join.html).&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pool 2.almalinux.pool.ntp.org iburst&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Servers are defined with the &lt;code&gt;server&lt;/code&gt; configuration line instead.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Archival/compression utilities on Linux</title>
      <link>https://wporter.org/archival/compression-utilities-on-linux/</link>
      <pubDate>Sat, 09 May 2026 20:10:00 +0000</pubDate>
      <guid>https://wporter.org/archival/compression-utilities-on-linux/</guid>
      <description>&lt;p&gt;There are five main archival utilities available on most Linux systems:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;tar&lt;/li&gt;&#xA;&lt;li&gt;gzip&lt;/li&gt;&#xA;&lt;li&gt;xz&lt;/li&gt;&#xA;&lt;li&gt;bzip2&lt;/li&gt;&#xA;&lt;li&gt;zip&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;tar creates uncompressed archives; it was originally intended for use creating tape backups, but now finds usage anywhere you&amp;rsquo;d like to turn a bunch of files into one file. Files are stored linearly in the tarball, so it&amp;rsquo;s very cheap (computationally) to work with tar archives.&lt;/p&gt;&#xA;&lt;p&gt;tar archives are often combined with a compression utility, which is where the &lt;code&gt;tar.xz&lt;/code&gt;, &lt;code&gt;tar.gz&lt;/code&gt;, &lt;code&gt;tar.bz2&lt;/code&gt; files come from. On *nix platforms we tend to have separate archival utilities (like tar, used for turning a set of files or directory into a single file) and compression utilities (e.g., gzip, bzip2, xz, used to reduce the amount of disk space a file uses), in contrast to the Windows approach of a single tool for both (e.g., &lt;code&gt;zip&lt;/code&gt;, &lt;code&gt;rar&lt;/code&gt;, &lt;code&gt;7z&lt;/code&gt;).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Working with SELinux (RHCSA-level)</title>
      <link>https://wporter.org/working-with-selinux-rhcsa-level/</link>
      <pubDate>Sat, 09 May 2026 18:15:00 +0000</pubDate>
      <guid>https://wporter.org/working-with-selinux-rhcsa-level/</guid>
      <description>&lt;h2 id=&#34;references&#34;&gt;References&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/using_selinux/index&#34;&gt;The Red Hat SELinux documentation&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.fedoraproject.org/en-US/quick-docs/selinux-getting-started/&#34;&gt;The Fedora SELinux documentation&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://opensourcewatch.beehiiv.com/p/everything-wanted-know-selinux-afraid-run&#34;&gt;Open Source Watch SELinux primer&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://wiki.gentoo.org/wiki/SELinux&#34;&gt;The Gentoo SELinux documentation&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;RHCSA v10 EX-200 exam objectives:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Manage security (5 of 8)&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Set enforcing and permissive modes for SELinux&lt;/li&gt;&#xA;&lt;li&gt;List and identify SELinux file and process context&lt;/li&gt;&#xA;&lt;li&gt;Restore default file contexts&lt;/li&gt;&#xA;&lt;li&gt;Manage SELinux port labels&lt;/li&gt;&#xA;&lt;li&gt;Use boolean settings to modify system SELinux settings&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;We&amp;rsquo;re going to go a bit past this and touch on users, roles, and senstivity in addition to managing file contexts.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Working with journald</title>
      <link>https://wporter.org/working-with-journald/</link>
      <pubDate>Mon, 20 Apr 2026 22:15:00 +0000</pubDate>
      <guid>https://wporter.org/working-with-journald/</guid>
      <description>&lt;p&gt;Let&amp;rsquo;s briefly dig into &lt;code&gt;systemd-journald&lt;/code&gt; and go over the what, the why, and the how!&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-is-journald&#34;&gt;What is journald?&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;systemd-journald&lt;/code&gt; is a logging service bundled with &lt;code&gt;systemd&lt;/code&gt;. It provides a number of nice extra features past simple plaintext log entries (a la syslog) including, but not limited to:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;journald uses binary storage, with fully indexed data for better (much faster) search&lt;/li&gt;&#xA;&lt;li&gt;supports compression&amp;hellip; though it&amp;rsquo;s per entry, so it&amp;rsquo;s pretty useless&#xA;&lt;ul&gt;&#xA;&lt;li&gt;per-entry compression is fine for large individual entries, but Linux log messages are typically quite small and small strings don&amp;rsquo;t compress nearly as well as a large block of text, made up of, say, mostly redundant log entries would.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;structured logging is enforced&lt;/li&gt;&#xA;&lt;li&gt;access control, by default&lt;/li&gt;&#xA;&lt;li&gt;automatic log rotation&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Generally, the output of any systemd unit is sent to the journal.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Links and inodes!</title>
      <link>https://wporter.org/links-and-inodes/</link>
      <pubDate>Sun, 19 Apr 2026 19:00:00 +0000</pubDate>
      <guid>https://wporter.org/links-and-inodes/</guid>
      <description>&lt;p&gt;Let&amp;rsquo;s talk about links!&lt;/p&gt;&#xA;&lt;h2 id=&#34;inodes&#34;&gt;inodes&lt;/h2&gt;&#xA;&lt;p&gt;But first, we&amp;rsquo;ll need to go over the concept of &lt;strong&gt;inodes&lt;/strong&gt;. These are an essential data structure Unix filesystems that store the attributes (metadata, permissions) and block locations for a particular file or directory.&lt;/p&gt;&#xA;&lt;p&gt;These &amp;ldquo;index&amp;rdquo; nodes allow the kernel to find the file contents from the inode number - conceptually, think of reading memory from a memory address. An inode contains a &amp;ldquo;disk address&amp;rdquo; in an easily parsable data structure, with metadata information slapped on. The kernel can read the inode and quickly figure out where to go to read the contents of a file off the disk.&lt;/p&gt;</description>
    </item>
    <item>
      <title>RHCSA/EL10 - bootloader, initramfs, kernel arguments, resetting the root password, oh my</title>
      <link>https://wporter.org/rhcsa/el10-bootloader-initramfs-kernel-arguments-resetting-the-root-password-oh-my/</link>
      <pubDate>Sat, 18 Apr 2026 15:00:00 +0000</pubDate>
      <guid>https://wporter.org/rhcsa/el10-bootloader-initramfs-kernel-arguments-resetting-the-root-password-oh-my/</guid>
      <description>&lt;p&gt;RHCSA study part 1: the bootloader, initramfs, and the first problem! Let&amp;rsquo;s reset a root password! Don&amp;rsquo;t worry. We won&amp;rsquo;t get too distracted&amp;hellip; I promise&amp;hellip;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;The lab environment used in this post consists of GenericCloud AlmaLinux 10 machine(s) running on a Proxmox VE cluster.&#xA;For info about the environment, &lt;a href=&#34;https://wporter.org/pve/ceph-hyperconverged-cluster-build/ceph-performance-tuning/&#34;&gt;see the build log&lt;/a&gt;.&#xA;To get your hands on the GenericCloud base images, &lt;a href=&#34;https://repo.almalinux.org/almalinux/10/cloud/x86_64/images/&#34;&gt;go to repo.almalinux.org&lt;/a&gt;.&#xA;To set up a Proxmox VE template from a GenericCloud base image as I&amp;rsquo;ve done here, &lt;a href=&#34;https://wporter.org/creating-a-cloud-init-vm-template-for-almalinux-10-on-proxmox-ve/&#34;&gt;see this post&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Linux md RAID benchmarks on 4 Kioxia PM5s</title>
      <link>https://wporter.org/linux-md-raid-benchmarks-on-4-kioxia-pm5s/</link>
      <pubDate>Sat, 18 Apr 2026 14:30:00 +0000</pubDate>
      <guid>https://wporter.org/linux-md-raid-benchmarks-on-4-kioxia-pm5s/</guid>
      <description>&lt;p&gt;I had access to some machines with a load of brand new Kioxia PM5 (read-intensive SAS3) SSDs, so after finishing my production benchmarking I decided to grab some academic numbers to follow up on &lt;a href=&#34;https://wporter.org/linux-md-raid-layouts/&#34;&gt;my prior &lt;code&gt;md&lt;/code&gt; RAID layouts writeup&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ll be benchmarking just four drives here, as the PCIE 3.0x8 HBA they&amp;rsquo;re hooked up to is a limiting factor for anything wider. These drives really could use a NVME interface (that&amp;rsquo;s what the CM5 is!)&lt;/p&gt;</description>
    </item>
    <item>
      <title>Linux md RAID layouts</title>
      <link>https://wporter.org/linux-md-raid-layouts/</link>
      <pubDate>Sat, 11 Apr 2026 21:15:00 +0000</pubDate>
      <guid>https://wporter.org/linux-md-raid-layouts/</guid>
      <description>&lt;p&gt;I was working on setting up some big mdadm RAID arrays, so I had to do some reading up on RAID layouts to make sure I was setting them up correctly. The result? This nice (if I say so myself) write-up! Yes, I went a little overboard.&lt;/p&gt;&#xA;&lt;p&gt;If you&amp;rsquo;re &lt;em&gt;not&lt;/em&gt; familiar with RAID levels, let&amp;rsquo;s go just deep enough:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;RAID 0 = &lt;strong&gt;blocks &amp;ldquo;striped&amp;rdquo; across all drives for best performance, no redundancy&lt;/strong&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Calling this RAID isn&amp;rsquo;t strictly accurate.. it&amp;rsquo;s not redundant at all!&lt;/li&gt;&#xA;&lt;li&gt;Blocks of data are distributed between all member disks. This means excellent performance (both writes and reads can be highly parallelized).&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;RAID 1 = &lt;strong&gt;blocks &amp;ldquo;mirrored&amp;rdquo; between all drives for redundancy&lt;/strong&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Mirrors one drive to n replicas. As such, you only get the capacity of a single drive.&lt;/li&gt;&#xA;&lt;li&gt;Dumb mirror. Very simple, very fast reads (if you throw enough threads at it, you can read from n drives simultaneously), but writes will never be faster than one drive.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;RAID 4 = &lt;strong&gt;one dedicated parity (redundancy) drive, data striped between the rest of the drives.&lt;/strong&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;One drive is reserved for redundancy. Parity data is all kept on one drive.&lt;/li&gt;&#xA;&lt;li&gt;Parity bytes are an XOR combination of data bytes (e.g., P = a XOR b XOR c XOR d XOR e - you can figure out what &amp;ldquo;a&amp;rdquo; was given b, c, d, e and P) which is how you get redundancy without a mirror. This is called &amp;ldquo;erasure coding&amp;rdquo; - you can reconstruct missing data if you know exactly which blocks are gone. If a drive fails, you know which blocks are gone.&lt;/li&gt;&#xA;&lt;li&gt;As parity data lives on one dedicated drive, performance of the array is limited by that drive.&lt;/li&gt;&#xA;&lt;li&gt;Because RAID4 (and 5, and 6) rely on parity, small I/O is punished. If you write a small chunk, you can&amp;rsquo;t just write. You have to read the old data block, read the old parity block, XOR old data, new data, old parity to get your new parity value, write the new data block, then write the new parity block.&lt;/li&gt;&#xA;&lt;li&gt;Large sequential writes are less affected, because you don&amp;rsquo;t need to read old data - you can just dump a new set of data blocks and parity block to disk all at once.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;RAID 5 = &lt;strong&gt;single set of parity data distributed across the array, data striped between all drives&lt;/strong&gt;.&#xA;&lt;ul&gt;&#xA;&lt;li&gt;The equivalent of one drive&amp;rsquo;s capacity is reserved for redundancy. Parity data is distributed across the array.&lt;/li&gt;&#xA;&lt;li&gt;Like RAID4, but, as the parity blocks are distributed between all members, RAID5 allows more parallelism (all drives store parity and data blocks).&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;RAID 6 = &lt;strong&gt;two sets of parity data distributed across the array, data striped between all drives&lt;/strong&gt;.&#xA;&lt;ul&gt;&#xA;&lt;li&gt;The equivalent of two drives&amp;rsquo; capacity is reserved for redundancy. Parity data is distributed across the array.&lt;/li&gt;&#xA;&lt;li&gt;While RAID5 offers just one set of parity blocks, RAID 6 has traditional XOR parity blocks (the &amp;ldquo;P&amp;rdquo; parity data) &lt;em&gt;and&lt;/em&gt; a second set of parity data that&amp;rsquo;s reversible with some more advanced algebra (&amp;ldquo;Q&amp;rdquo; parity data). If you want to read about how that second set of parity data works, &lt;a href=&#34;https://igoro.com/archive/how-raid-6-dual-parity-calculation-works/&#34;&gt;check out Igor Ostrovsky&amp;rsquo;s blog post on the topic&lt;/a&gt;. He does an excellent job at explaining it.&lt;/li&gt;&#xA;&lt;li&gt;The result is that your machine can solve for the missing values using the two parity equations and live data, so you can always figure out what bytes you had on the two disks you&amp;rsquo;re able to lose.&lt;/li&gt;&#xA;&lt;li&gt;If two drives are lost and you need to use the Q parity to reconstruct, performance will suffer significantly, as every read will require reading from all surviving drives and doing relatively expensive calculations.&lt;/li&gt;&#xA;&lt;li&gt;However, if you only lose one drive and can reconstruct the missing data from the P parity algorithm or live data (e.g., only had one drive failure) the array will continue to perform relatively well.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;RAID 10 = &lt;strong&gt;striped mirrors = pairs of two drives are mirrored, then the mirrored pairs are all striped together.&lt;/strong&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Half of your drives are used for redundancy. Data is mirrored across a configurable number of members of the array (by default, 2). As such, you&amp;rsquo;ll lose at least 50% of your disk space.&lt;/li&gt;&#xA;&lt;li&gt;Simpler than erasure coding. Very fast. Works just like you&amp;rsquo;d think it does with &amp;ldquo;near&amp;rdquo; distribution, which is what is typically used. More on that later.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;ZFS and LVM support some other fun things like linear volumes or triple parity, but those are different beasts entirely.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Creating a cloud-init VM template for AlmaLinux 10 on Proxmox VE</title>
      <link>https://wporter.org/creating-a-cloud-init-vm-template-for-almalinux-10-on-proxmox-ve/</link>
      <pubDate>Thu, 26 Feb 2026 22:30:00 +0000</pubDate>
      <guid>https://wporter.org/creating-a-cloud-init-vm-template-for-almalinux-10-on-proxmox-ve/</guid>
      <description>&lt;p&gt;Just a quick example.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;vmid&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;9001&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;image_name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;AlmaLinux-10-GenericCloud-latest.x86_64.qcow2&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;storage&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;local-lvm&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;wget https://repo.almalinux.org/almalinux/10/cloud/x86_64/images/AlmaLinux-10-GenericCloud-latest.x86_64.qcow2 -O &lt;span class=&#34;nv&#34;&gt;$image_name&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;qemu-img resize &lt;span class=&#34;nv&#34;&gt;$image_name&lt;/span&gt; 32G&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;qm create &lt;span class=&#34;nv&#34;&gt;$vmid&lt;/span&gt; --name &lt;span class=&#34;s2&#34;&gt;&amp;#34;almalinux-10-genericcloud&amp;#34;&lt;/span&gt; --ostype l26 &lt;span class=&#34;se&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;  --memory &lt;span class=&#34;m&#34;&gt;2048&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;&#x9;--agent &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;&#x9;--bios ovmf --machine q35 --efidisk0 &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$storage&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;:0,pre-enrolled-keys&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;&#x9;--cpu host --socket &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; --cores &lt;span class=&#34;m&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;&#x9;--net0 virtio,bridge&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;bridge0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;qm &lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$vmid&lt;/span&gt; --sata0 local-lvm:cloudinit&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;qm importdisk &lt;span class=&#34;nv&#34;&gt;$vmid&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$image_name&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$storage&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;qm &lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$vmid&lt;/span&gt; --scsihw virtio-scsi-single --scsi0 local-lvm:vm-&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;vmid&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;-disk-2,discard&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;on,cache&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;writeback,iothread&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;1,ssd&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;qm &lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$vmid&lt;/span&gt; --boot &lt;span class=&#34;nv&#34;&gt;order&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;scsi0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;qm template &lt;span class=&#34;nv&#34;&gt;$vmid&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Regenerating HTTP certs in an Elasticsearch cluster</title>
      <link>https://wporter.org/regenerating-http-certs-in-an-elasticsearch-cluster/</link>
      <pubDate>Mon, 23 Feb 2026 20:35:00 +0000</pubDate>
      <guid>https://wporter.org/regenerating-http-certs-in-an-elasticsearch-cluster/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://www.elastic.co/docs/deploy-manage/security/set-up-basic-security&#34;&gt;Docs&lt;/a&gt;. This requires the &amp;ldquo;minimum security setup&amp;rdquo; to be complete (Elasticsearch security must be running for SSL to be in use). The automatic initialization will do this for you.&lt;/p&gt;&#xA;&lt;p&gt;By default, initializing an Elasticsearch cluster will automatically generate some certificates for the transport and HTTP components of the Elastic application:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-txt&#34; data-lang=&#34;txt&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[root@es9-1 elasticsearch]# ls -l certs&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;total 24&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-rw-rw----. 1 root elasticsearch  1939 Dec 12 16:49 http_ca.crt&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-rw-rw----. 1 root elasticsearch 10077 Dec 12 16:49 http.p12&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-rw-rw----. 1 root elasticsearch  5838 Dec 12 16:49 transport.p12&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[root@es9-1 elasticsearch]# pwd&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/etc/elasticsearch&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;After changing a node&amp;rsquo;s IP (use DNS, gosh darn it!) or hostname, you may need to regenerate its HTTP certificates, or things will permanently cease to function (Elastic uses mTLS for authentication for the cluster&amp;rsquo;s transport layer and HTTP REST API - no REST API, Elastic is very unhappy).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Performing a partial or full restore of an Elasticsearch cluster from a snapshot</title>
      <link>https://wporter.org/performing-a-partial-or-full-restore-of-an-elasticsearch-cluster-from-a-snapshot/</link>
      <pubDate>Mon, 23 Feb 2026 20:30:00 +0000</pubDate>
      <guid>https://wporter.org/performing-a-partial-or-full-restore-of-an-elasticsearch-cluster-from-a-snapshot/</guid>
      <description>&lt;p&gt;See the docs at &lt;a href=&#34;https://www.elastic.co/docs/deploy-manage/tools/snapshot-and-restore&#34;&gt;elastic.co/docs&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;m starting with a three-node cluster (see &lt;a href=&#34;https://wporter.org/building-out-a-test-3-node-elasticsearch-9-cluster-on-almalinux-9&#34;&gt;Deploying a three-node HA Elasticsearch 9 cluster on AlmaLinux 9&lt;/a&gt;). It consists of:&lt;/p&gt;&#xA;&lt;p&gt;3x KVM VM (4 vCPU, 16 GiB RAM, 128 GB of SSD)&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;es9-1&lt;/li&gt;&#xA;&lt;li&gt;es9-2&lt;/li&gt;&#xA;&lt;li&gt;es9-3&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;DNS is working.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve loaded the Flights &lt;a href=&#34;https://www.elastic.co/docs/manage-data/ingest/sample-data&#34;&gt;sample dataset&lt;/a&gt; to the cluster with Kibana just to have something to look at.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;m adding:&lt;/p&gt;&#xA;&lt;p&gt;1x KVM VM (2 vCPU, 4 GiB RAM, 128 GB of SSD), for a snapshot repository (NFS server):&lt;/p&gt;</description>
    </item>
    <item>
      <title>Building out a test 3-node Elasticsearch 9 cluster on AlmaLinux 9</title>
      <link>https://wporter.org/building-out-a-test-3-node-elasticsearch-9-cluster-on-almalinux-9/</link>
      <pubDate>Mon, 23 Feb 2026 20:00:00 +0000</pubDate>
      <guid>https://wporter.org/building-out-a-test-3-node-elasticsearch-9-cluster-on-almalinux-9/</guid>
      <description>&lt;h2 id=&#34;intro&#34;&gt;Intro&lt;/h2&gt;&#xA;&lt;p&gt;We&amp;rsquo;ll be configuring a (test) three-node Elasticsearch cluster, then installing and joining Kibana, on Alma 9 hosts.&lt;/p&gt;&#xA;&lt;p&gt;Hardware:&lt;/p&gt;&#xA;&lt;p&gt;3x KVM VM (4 vCPU, 16 GiB RAM, 128 GB of SSD):&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;es9-1&lt;/li&gt;&#xA;&lt;li&gt;es9-2&lt;/li&gt;&#xA;&lt;li&gt;es9-3&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;installing-elasticsearch&#34;&gt;Installing Elasticsearch&lt;/h2&gt;&#xA;&lt;p&gt;Read the docs: &lt;a href=&#34;https://www.elastic.co/docs/deploy-manage/deploy/self-managed/installing-elasticsearch&#34;&gt;installing Elasticsearch&lt;/a&gt;, &lt;a href=&#34;https://www.elastic.co/docs/deploy-manage/deploy/self-managed/install-elasticsearch-with-rpm&#34;&gt;installing Elasticsearch with RPM&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Add the Elastic signing key to your system:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Add the Elasticsearch 9.x repository to the system:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo tee /etc/yum.repos.d/elasticsearch.repo &amp;gt; /dev/null &lt;span class=&#34;s&#34;&gt;&amp;lt;&amp;lt; &amp;#39;EOT&amp;#39;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;[elasticsearch]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;name=Elasticsearch repository for 9.x packages&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;baseurl=https://artifacts.elastic.co/packages/9.x/yum&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;gpgcheck=1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;enabled=0&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;type=rpm-md&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;EOT&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Note that the repo&amp;rsquo;s &lt;code&gt;enabled&lt;/code&gt; property is set to &lt;code&gt;0&lt;/code&gt; so you don&amp;rsquo;t inadvertantly update Elastic.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Migrating Libvirt VMs to Proxmox VE by importing qcow2 disks to Ceph</title>
      <link>https://wporter.org/migrating-libvirt-vms-to-proxmox-ve-by-importing-qcow2-disks-to-ceph/</link>
      <pubDate>Sun, 22 Feb 2026 23:00:00 +0000</pubDate>
      <guid>https://wporter.org/migrating-libvirt-vms-to-proxmox-ve-by-importing-qcow2-disks-to-ceph/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m migrating from a Libvirt hypervisor (AlmaLinux 10) to Proxmox VE.&lt;/p&gt;&#xA;&lt;p&gt;In my case, my images are backed by a cloud-init template:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-txt&#34; data-lang=&#34;txt&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[root@3060t0 ~]# qemu-img info --backing-chain /var/lib/libvirt/images/UniFi_OS.qcow2 &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;image: /var/lib/libvirt/images/UniFi_OS.qcow2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;file format: qcow2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;virtual size: 32 GiB (34359738368 bytes)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;disk size: 5.09 GiB&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cluster_size: 65536&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;backing file: /srv/iso/AlmaLinux-10-GenericCloud-10.0-20250528.0.x86_64.qcow2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;backing file format: qcow2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Format specific information:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    compat: 1.1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    compression type: zlib&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    lazy refcounts: true&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    refcount bits: 16&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    corrupt: false&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    extended l2: false&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Child node &amp;#39;/file&amp;#39;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    filename: /var/lib/libvirt/images/UniFi_OS.qcow2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    protocol type: file&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    file length: 6.51 GiB (6987579392 bytes)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    disk size: 5.09 GiB&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;image: /srv/iso/AlmaLinux-10-GenericCloud-10.0-20250528.0.x86_64.qcow2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;file format: qcow2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;virtual size: 10 GiB (10737418240 bytes)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;disk size: 439 MiB&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cluster_size: 65536&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Format specific information:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    compat: 1.1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    compression type: zlib&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    lazy refcounts: false&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    refcount bits: 16&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    corrupt: false&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    extended l2: false&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Child node &amp;#39;/file&amp;#39;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    filename: /srv/iso/AlmaLinux-10-GenericCloud-10.0-20250528.0.x86_64.qcow2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    protocol type: file&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    file length: 439 MiB (460062720 bytes)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    disk size: 439 MiB&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So, before I move the VMs off this host (with the backing file on it) I had to rebase them (consolidate the backing file and changes to a new QCOW). This can be done by &amp;ldquo;converting&amp;rdquo; the current VM disk with &lt;code&gt;qemu-img&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>PVE/Ceph hyperconverged cluster build/Ceph performance tuning</title>
      <link>https://wporter.org/pve/ceph-hyperconverged-cluster-build/ceph-performance-tuning/</link>
      <pubDate>Sun, 22 Feb 2026 22:00:00 +0000</pubDate>
      <guid>https://wporter.org/pve/ceph-hyperconverged-cluster-build/ceph-performance-tuning/</guid>
      <description>&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;This is a continuation of (and hopefully the final rebuild for) my &amp;ldquo;2025 Q4&amp;rdquo; cluster build project (yeah, I went a little past my deadline there).&lt;/p&gt;&#xA;&lt;p&gt;Long story short, I&amp;rsquo;ve been looking to eliminate single points of failure in my infrastructure (at least, where they&amp;rsquo;re easy to fix), so I wound up with three HP Z2 G4 SFF workstations (LGA 1151) and started trying to build a Proxmox (as I&amp;rsquo;m now responsible for supporting it professionally and do not have the time to figure out the perfect hypervisor That Is Not Proxmox) cluster out of them.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Failing to build a Proxmox &#43; LINSTOR (DRBD) HCI cluster (ft. RDMA and ewaste!)</title>
      <link>https://wporter.org/failing-to-build-a-proxmox--linstor-drbd-hci-cluster-ft.-rdma-and-ewaste/</link>
      <pubDate>Mon, 02 Feb 2026 22:00:00 +0000</pubDate>
      <guid>https://wporter.org/failing-to-build-a-proxmox--linstor-drbd-hci-cluster-ft.-rdma-and-ewaste/</guid>
      <description>&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;I had a machine go down the other day. It was my sole &amp;ldquo;production&amp;rdquo; hypervisor (an old crappy Optiplex) running all my stuff. Yes, my redundant DNS&amp;hellip; on one machine.&lt;/p&gt;&#xA;&lt;p&gt;So I set about fixing it. I did some reading on distributed storage (because who do you think I am? I&amp;rsquo;m not going to waste machines on making my own SAN.. at least, I won&amp;rsquo;t if I have to pay for power), scrounged through the drawers for RAM and SSDs, ordered some modest hardware, and here we are. This is (supposedly) my new production hypervisor cluster!&lt;/p&gt;</description>
    </item>
    <item>
      <title>PowerShell Core (Microsoft Graph and Az) in a toolbox container on your Linux box</title>
      <link>https://wporter.org/powershell-core-microsoft-graph-and-az-in-a-toolbox-container-on-your-linux-box/</link>
      <pubDate>Sun, 24 Aug 2025 22:00:00 +0000</pubDate>
      <guid>https://wporter.org/powershell-core-microsoft-graph-and-az-in-a-toolbox-container-on-your-linux-box/</guid>
      <description>&lt;p&gt;If you&amp;rsquo;re like me (god, for your sake I hope you aren&amp;rsquo;t) you love PowerShell and use Linux.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;m also super lazy. And I don&amp;rsquo;t like Microsoft adding 5,000 repositories to my system to keep PowerShell updated. The solution? A container!&lt;/p&gt;&#xA;&lt;p&gt;Toolbox lets you very easily jump into a podman container for a development environment. In this container, you can typically install whatever you&amp;rsquo;d need as if it was on a bare metal install - no special anything required. Since all I need is PowerShell, we&amp;rsquo;ll keep things simple.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Setting up Cockpit with Certbot and a private CA with an ACME endpoint</title>
      <link>https://wporter.org/setting-up-cockpit-with-certbot-and-a-private-ca-with-an-acme-endpoint/</link>
      <pubDate>Wed, 09 Jul 2025 21:35:00 +0000</pubDate>
      <guid>https://wporter.org/setting-up-cockpit-with-certbot-and-a-private-ca-with-an-acme-endpoint/</guid>
      <description>&lt;p&gt;This is an excerpt from &lt;a href=&#34;https://wporter.org/building-out-a-signing-certificate-authority-that-supports-acme-with-step-ca-and-an-openssl-root/&#34;&gt;my &lt;code&gt;step-ca&lt;/code&gt; post&lt;/a&gt; that I felt is useful enough to have its own post.&lt;/p&gt;&#xA;&lt;p&gt;I have a server running Cockpit that I&amp;rsquo;d like to use a valid SSL certificate from my CA. I&amp;rsquo;d like it to renew its own certificate. Let&amp;rsquo;s do that.&lt;/p&gt;&#xA;&lt;p&gt;First, be sure to install the root certificate on the system. Since this is a machine running AlmaLinux 10, that looks something like this:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Building out a signing certificate authority that supports ACME with step-ca and an OpenSSL root</title>
      <link>https://wporter.org/building-out-a-signing-certificate-authority-that-supports-acme-with-step-ca-and-an-openssl-root/</link>
      <pubDate>Sun, 06 Jul 2025 21:35:00 +0000</pubDate>
      <guid>https://wporter.org/building-out-a-signing-certificate-authority-that-supports-acme-with-step-ca-and-an-openssl-root/</guid>
      <description>&lt;p&gt;This is part two of a multi-part series. Today, I&amp;rsquo;ll be configuring an intermediate CA under the root CA I set up &lt;a href=&#34;https://wporter.org/using-openssl-to-generate-a-root-certificate-using-openssl-on-a-linux-server-as-a-root-certificate-authority/&#34;&gt;in this article&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;step-ca&lt;/code&gt; is a modern online CA for automated certificate management. It&amp;rsquo;s got reasonable defaults and is fairly easy to use as an intermediate CA for smaller environments.&lt;/p&gt;&#xA;&lt;p&gt;To learn more about &lt;code&gt;step-ca&lt;/code&gt; itself I recommend a trip over to &lt;a href=&#34;https://smallstep.com/docs/step-ca/&#34;&gt;the step-ca docs at smallstep.com&lt;/a&gt;, but the highlights are the simple nature of the tool and the variety of built-in automated provisioners you can use (like OIDC SSO tokens, ACME challenges, identity documents, and JWK tokens). It&amp;rsquo;s also a decent SSH CA.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Using OpenSSL to generate a root certificate (using OpenSSL on a Linux server as a root certificate authority)</title>
      <link>https://wporter.org/using-openssl-to-generate-a-root-certificate-using-openssl-on-a-linux-server-as-a-root-certificate-authority/</link>
      <pubDate>Wed, 02 Jul 2025 21:35:00 +0000</pubDate>
      <guid>https://wporter.org/using-openssl-to-generate-a-root-certificate-using-openssl-on-a-linux-server-as-a-root-certificate-authority/</guid>
      <description>&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;Certificates are often viewed as &amp;ldquo;black magic&amp;rdquo; - and, as with any cryptographic topic, that&amp;rsquo;s entirely true! Cryptography is great.&lt;/p&gt;&#xA;&lt;p&gt;Thankfully, you don’t need to be a cryptographer to use public key infrastructure (PKI) to establish trust between systems.&lt;/p&gt;&#xA;&lt;p&gt;If you’ve ever created an SSH key pair, you&amp;rsquo;re already familiar with the fundamentals! SSH key pairs and SSL certificates are extremely similar.&lt;/p&gt;&#xA;&lt;p&gt;In a typical PKI setup, certificate authorities (CAs) act as the trust anchors. You can think of a certificate like an SSH public key: you distribute your public key, and devices that have it can verify that you - holding the corresponding private key - are who you say you are.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Installing Wiki.js (PostgreSQL, NGINX) on AlmaLinux 10</title>
      <link>https://wporter.org/installing-wiki.js-postgresql-nginx-on-almalinux-10/</link>
      <pubDate>Mon, 30 Jun 2025 19:35:00 +0000</pubDate>
      <guid>https://wporter.org/installing-wiki.js-postgresql-nginx-on-almalinux-10/</guid>
      <description>&lt;p&gt;This guide demonstrates installing Wiki.js, the NGINX reverse proxy, Certbot (an ACME client that we&amp;rsquo;ll use for automated SSL certificate renewal), a backing PostgreSQL database, and a supporting Elasticsearch container on an AlmaLinux 10 server.&lt;/p&gt;&#xA;&lt;p&gt;Wiki.js is a Node.js application that relies on a database - we&amp;rsquo;ll be using PostgreSQL.&lt;/p&gt;&#xA;&lt;p&gt;We&amp;rsquo;ll put a NGINX reverse proxy in front of the Wiki.js web application to handle SSL, and configure Wiki.js to listen on only localhost (127.0.0.1:3000) so that only NGINX is exposed to the outside world.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Changing a Linux username</title>
      <link>https://wporter.org/changing-a-linux-username/</link>
      <pubDate>Sat, 07 Jun 2025 20:30:00 +0000</pubDate>
      <guid>https://wporter.org/changing-a-linux-username/</guid>
      <description>&lt;p&gt;Super easy:&lt;/p&gt;&#xA;&lt;p&gt;First, call usermod -l (change login) with the -d (home) and -m (move home) args.&#xA;This changes the username, moves the old home directory to the new home directory:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo usermod -l new_name -d /home/new_name -m old_name&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next, call groupmod &amp;ndash;new-name to rename the user&amp;rsquo;s group.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo groupmod --new-name new_group_name old_group_name&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Annd.. you&amp;rsquo;re done! See? Super easy.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Performing an in-place upgrade from Alma 9 to Alma 10 with LEAPP and ELevate</title>
      <link>https://wporter.org/performing-an-in-place-upgrade-from-alma-9-to-alma-10-with-leapp-and-elevate/</link>
      <pubDate>Sat, 07 Jun 2025 20:00:00 +0000</pubDate>
      <guid>https://wporter.org/performing-an-in-place-upgrade-from-alma-9-to-alma-10-with-leapp-and-elevate/</guid>
      <description>&lt;p&gt;That time of year again! Time to break all my stuff!&lt;/p&gt;&#xA;&lt;h2 id=&#34;x86-64-v2-systems&#34;&gt;x86-64-v2 systems&lt;/h2&gt;&#xA;&lt;p&gt;Quick aside about x86-64-v2 systems (generally these are processors Ivy Bridge and earlier - 3000 series Intel, E3/E5/E7 v2 or older).&lt;/p&gt;&#xA;&lt;p&gt;EL10 does NOT normally support older processors that do not implement AVX2.&lt;/p&gt;&#xA;&lt;p&gt;Most notably, this excludes some fairly recent embedded/low power SKUs (any Intel &amp;ldquo;small cores&amp;rdquo; prior to &lt;a href=&#34;https://en.wikipedia.org/wiki/Gracemont_(microarchitecture)&#34;&gt;Gracemont&lt;/a&gt;, introduced in 2021, like &lt;a href=&#34;https://en.wikipedia.org/wiki/Tremont_(microarchitecture)&#34;&gt;Tremont&lt;/a&gt; in the Lakefield or Jasper Lake products that were sold until quite recently) and Ivy Bridge (the Intel Core 3rd generation SKUs, or Xeon E3/E5/E7 v2 chips like the E5-2680 v2) processors.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Updating the osinfo database on a Linux hypervisor</title>
      <link>https://wporter.org/updating-the-osinfo-database-on-a-linux-hypervisor/</link>
      <pubDate>Sat, 07 Jun 2025 17:00:00 +0000</pubDate>
      <guid>https://wporter.org/updating-the-osinfo-database-on-a-linux-hypervisor/</guid>
      <description>&lt;p&gt;The osinfo database provides &amp;ldquo;all the information about an operating system that is required in order to provision and manage it in a virtualized environment.&amp;rdquo; (&lt;a href=&#34;https://libosinfo.org/&#34;&gt;libosinfo.org&lt;/a&gt;)&lt;/p&gt;&#xA;&lt;p&gt;In a nutshell, it&amp;rsquo;s metadata about guest OSes for use by hypervisors. I haven&amp;rsquo;t poked at it more than this, but I like it when my guest OSes are recognized, there are two that I now use commonly that are not recognized: Windows Server 2025 and AlmaLinux 10.&lt;/p&gt;</description>
    </item>
    <item>
      <title>SSH agent forwarding</title>
      <link>https://wporter.org/ssh-agent-forwarding/</link>
      <pubDate>Tue, 03 Jun 2025 19:00:00 +0000</pubDate>
      <guid>https://wporter.org/ssh-agent-forwarding/</guid>
      <description>&lt;p&gt;SSH agent forwarding allows you to use a local SSH agent (your local keys, 1Password, etc) on a remote machine.&lt;/p&gt;&#xA;&lt;p&gt;You can use this to &amp;ldquo;pass&amp;rdquo; authentication requests made by you on a remote session back to your local machine, or &amp;ldquo;delegate&amp;rdquo; authentication requests from your workstation to a jumpbox, depending on how you look at it.&lt;/p&gt;&#xA;&lt;p&gt;To enable agent forwarding to a remote host, all you have to do is edit your local &lt;code&gt;~/.ssh/config&lt;/code&gt; (or &lt;code&gt;~\.ssh\config&lt;/code&gt;) file on your workstation with the keys, and add a &lt;code&gt;Host&lt;/code&gt; declaration:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Listing and removing RPM GPG (PGP) keys</title>
      <link>https://wporter.org/listing-and-removing-rpm-gpg-pgp-keys/</link>
      <pubDate>Tue, 03 Jun 2025 18:30:00 +0000</pubDate>
      <guid>https://wporter.org/listing-and-removing-rpm-gpg-pgp-keys/</guid>
      <description>&lt;h2 id=&#34;list-keys&#34;&gt;List keys&lt;/h2&gt;&#xA;&lt;p&gt;Our first goal will be to list the installed PGP public keys in the format we need, with a human-readable summary, as follows:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# structure:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;gpg-pubkey-version-release My Organization &amp;lt;email@address.org&amp;gt; public key&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# ex:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;gpg-pubkey-105ef944-65ca83d1 Fedora &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;42&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; &amp;lt;fedora-42-primary@fedoraproject.org&amp;gt; public key&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To do so, you can use the &lt;code&gt;rpm&lt;/code&gt; command with arguments &amp;lsquo;&lt;code&gt;--query --queryformat&lt;/code&gt;&amp;rsquo; (this may be abbreviated to &amp;lsquo;&lt;code&gt;-q --qf&lt;/code&gt;&amp;rsquo;).&lt;/p&gt;&#xA;&lt;p&gt;We&amp;rsquo;ll be querying RPM for &lt;code&gt;gpg-pubkey&lt;/code&gt;(s), and we&amp;rsquo;ll need to specify a queryformat that will get us the rpm-format shorthand identifier for a key:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Configuring LACP bonds &amp; VLAN bridges with nmcli</title>
      <link>https://wporter.org/configuring-lacp-bonds-vlan-bridges-with-nmcli/</link>
      <pubDate>Sat, 03 May 2025 18:30:00 +0000</pubDate>
      <guid>https://wporter.org/configuring-lacp-bonds-vlan-bridges-with-nmcli/</guid>
      <description>&lt;p&gt;LACP is awesome if you&amp;rsquo;re not terminating L3 on your servers. It&amp;rsquo;s also super easy to configure bonds with NetworkManager.&lt;/p&gt;&#xA;&lt;h2 id=&#34;configuring-lacp-8023ad-bonds-with-nmcli&#34;&gt;Configuring LACP (802.3ad) bonds with nmcli&lt;/h2&gt;&#xA;&lt;p&gt;To configure a bond, you&amp;rsquo;ll need to:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Create the bond interface&lt;/li&gt;&#xA;&lt;li&gt;Assign connections as slaves to the bond&lt;/li&gt;&#xA;&lt;li&gt;Bring the bond up&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;This is pretty simple:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-txt&#34; data-lang=&#34;txt&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[liam@t3 ~]$ nmcli con add type bond con-name bond0 ifname bond0 bond.options &amp;#34;mode=802.3ad&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This will create a &lt;code&gt;bond0&lt;/code&gt; device, and a &lt;code&gt;bond0&lt;/code&gt; connection - you can see them in the output of &lt;code&gt;nmcli con&lt;/code&gt; or &lt;code&gt;nmcli dev&lt;/code&gt;:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Installing Ninja Remote (NinjaRMM remote session utility) on Linux with Wine</title>
      <link>https://wporter.org/installing-ninja-remote-ninjarmm-remote-session-utility-on-linux-with-wine/</link>
      <pubDate>Sat, 26 Apr 2025 18:30:00 +0000</pubDate>
      <guid>https://wporter.org/installing-ninja-remote-ninjarmm-remote-session-utility-on-linux-with-wine/</guid>
      <description>&lt;p&gt;&lt;del&gt;NinjaRMM sucks. Here&amp;rsquo;s how to run its terrible little connection tool on a proper OS.&lt;/del&gt;&lt;/p&gt;&#xA;&lt;p&gt;Update: as of August 2026, NinjaOne have released a native Linux &amp;ldquo;Ninja Remote&amp;rdquo; connection utility. This is no longer needed! Yay!&lt;/p&gt;&#xA;&lt;p&gt;First, install a user-agent spoofer in your preferred browser - Ninja&amp;rsquo;s site won&amp;rsquo;t even show the connection button without this nowadays. Set it to Windows something.&lt;/p&gt;&#xA;&lt;p&gt;Here are links to a user agent spoofer-manager thing:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Looking at filesystem types on disks from Linux</title>
      <link>https://wporter.org/looking-at-filesystem-types-on-disks-from-linux/</link>
      <pubDate>Sun, 30 Mar 2025 12:13:59 +0000</pubDate>
      <guid>https://wporter.org/looking-at-filesystem-types-on-disks-from-linux/</guid>
      <description>&lt;p&gt;Not sure why I went through so many ways to do this. But I did. Was slightly curious about how I might go about this.. guess I&amp;rsquo;m happy now.&lt;/p&gt;&#xA;&lt;h2 id=&#34;unmounted&#34;&gt;Unmounted&lt;/h2&gt;&#xA;&lt;h3 id=&#34;parted&#34;&gt;parted&lt;/h3&gt;&#xA;&lt;p&gt;&lt;code&gt;parted /device print&lt;/code&gt; will give you a nice list of partitions, name, and filesystem.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-txt&#34; data-lang=&#34;txt&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[liam@800g4m0 ~]$ sudo parted /dev/sda print&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Model: ATA WDC WDS100T2B0A (scsi)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Disk /dev/sda: 1000GB&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Sector size (logical/physical): 512B/512B&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Partition Table: gpt&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Disk Flags:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Number  Start   End     Size    File system  Name                          Flags&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; 1      1049kB  274MB   273MB   fat32        EFI system partition          boot, esp&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; 2      274MB   290MB   16.8MB               Microsoft reserved partition  msftres&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; 3      290MB   1000GB  999GB   ntfs         Basic data partition          msftdata&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; 4      1000GB  1000GB  631MB   ntfs                                       hidden, diag&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can also &lt;code&gt;parted /device print all&lt;/code&gt; to get &lt;code&gt;parted&lt;/code&gt; to look at every disk.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The setuid, setgid, and sticky special file permissions bits</title>
      <link>https://wporter.org/the-setuid-setgid-and-sticky-special-file-permissions-bits/</link>
      <pubDate>Sun, 30 Mar 2025 12:12:59 +0000</pubDate>
      <guid>https://wporter.org/the-setuid-setgid-and-sticky-special-file-permissions-bits/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://www.redhat.com/en/blog/suid-sgid-sticky-bit&#34;&gt;Red Hat blog&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;These are the leading zero!&lt;/p&gt;&#xA;&lt;p&gt;The setuid and setgid properties are used to allow a trusted executable to be run with elevated permissions (either can do this - as user, or as group respectively) or to control the group assigned to newly created children of a directory (setgid).&lt;/p&gt;&#xA;&lt;p&gt;The setuid and setgid bits can be set with either &lt;code&gt;chmod (u|g)+s&lt;/code&gt; or a leading digit, when using three-digit-style permissions (possibly platform-dependent).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Snippet: unlock a SSH key for use with Ansible</title>
      <link>https://wporter.org/snippet-unlock-a-ssh-key-for-use-with-ansible/</link>
      <pubDate>Sun, 15 Dec 2024 12:34:56 +0000</pubDate>
      <guid>https://wporter.org/snippet-unlock-a-ssh-key-for-use-with-ansible/</guid>
      <description>&lt;p&gt;Pulled out of a readme.md, since it&amp;rsquo;s easier for me to keep it in one place (here.)&lt;/p&gt;&#xA;&lt;p&gt;To unlock a protected SSH key for use by Ansible:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-txt&#34; data-lang=&#34;txt&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ eval &amp;#34;$(ssh-agent -s)&amp;#34;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Agent pid 5695&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ ssh-add&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Enter passphrase for /home/user/.ssh/id_ed25519:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Identity added: /home/user/.ssh/id_ed25519 (/home/user/.ssh/id_ed25519)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ansible-playbook -i host configure.yaml&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Snippet: Disable max vCPUs eq phys. threads restriction in Proxmox VE 8.3</title>
      <link>https://wporter.org/snippet-disable-max-vcpus-eq-phys.-threads-restriction-in-proxmox-ve-8.3/</link>
      <pubDate>Wed, 27 Nov 2024 12:34:56 +0000</pubDate>
      <guid>https://wporter.org/snippet-disable-max-vcpus-eq-phys.-threads-restriction-in-proxmox-ve-8.3/</guid>
      <description>&lt;h1 id=&#34;source&#34;&gt;Source:&lt;/h1&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://forum.proxmox.com/threads/override-max-vcpu-allowed-per-vm.39363/post-194758&#34;&gt;jknight comment on Proxmox forums&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h1 id=&#34;problem&#34;&gt;Problem:&lt;/h1&gt;&#xA;&lt;p&gt;Needed to assign more than 64 threads to a VM for testing (just needed more than 64 threads, don&amp;rsquo;t care about performance or lack of it.)&lt;/p&gt;&#xA;&lt;p&gt;This was helpful and took a little bit of digging to find.&lt;/p&gt;&#xA;&lt;h1 id=&#34;solution&#34;&gt;Solution:&lt;/h1&gt;&#xA;&lt;p&gt;Open &lt;code&gt;/usr/share/perl5/PVE/QemuServer.pm&lt;/code&gt; with your favorite text editor.&lt;/p&gt;&#xA;&lt;p&gt;Remove lines 3772 - 3776 (if you&amp;rsquo;re /ing around afterwards or have an otherwise modified config file, this will be right after line 3770: &lt;code&gt;my $vcpus = $conf-&amp;gt;{vcpus} ? $conf-&amp;gt;{vcpus} : maxcpus;&lt;/code&gt;)&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
