<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="https://riceball.com/wp-content/plugins/pretty-rss-feeds/xslt/pretty-feed.xsl" type="text/xsl" media="screen" ?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Linux - 🍙</title>
	<atom:link href="https://riceball.com/tag/linux/feed/" rel="self" type="application/rss+xml" />
	<link>https://riceball.com</link>
	<description></description>
	<lastBuildDate>Fri, 18 Sep 2026 04:33:40 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.4</generator>

<image>
	<url>https://riceball.com/wp-content/uploads/sites/2/2025/10/onigiri-150x150.png</url>
	<title>Linux - 🍙</title>
	<link>https://riceball.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Configuring Regolith to Send Windows to Workspaces (long)</title>
		<link>https://riceball.com/2026/09/17/configuring-regolith-to-send-windows-to-workspaces-long/</link>
					<comments>https://riceball.com/2026/09/17/configuring-regolith-to-send-windows-to-workspaces-long/#respond</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Fri, 18 Sep 2026 04:16:25 +0000</pubDate>
				<category><![CDATA[Human Learning]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[MINT]]></category>
		<category><![CDATA[Regolith]]></category>
		<guid isPermaLink="false">https://riceball.com/?p=30526</guid>

					<description><![CDATA[<p>This seemed simple enough, to set up the system to send windows to specific workspaces, and specific screens, but I ended up getting into C preprocessor headaches, and then eventually figured out how to name the workspaces, literally, and had a few problems after that. It&#8217;s not easy, but here&#8217;s what I&#8217;ve done so far, [&#8230;]</p>
<p>The post <a href="https://riceball.com/2026/09/17/configuring-regolith-to-send-windows-to-workspaces-long/">Configuring Regolith to Send Windows to Workspaces (long)</a> first appeared on <a href="https://riceball.com">🍙</a>.</p>]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">This seemed simple enough, to set up the system to send windows to specific workspaces, and specific screens, but I ended up getting into C preprocessor headaches, and then eventually figured out how to name the workspaces, literally, and had a few problems after that. It&#8217;s not easy, but here&#8217;s what I&#8217;ve done so far, and how I did it.</p>



<p class="wp-block-paragraph">So, here&#8217;s my current desktop layout. It&#8217;s a  laptop plugged into a HD monitor, for two screens.</p>



<figure class="wp-block-image size-full"><img fetchpriority="high" decoding="async" width="764" height="489" src="https://riceball.com/wp-content/uploads/sites/2/2026/09/Screenshot-from-2026-09-17-19-49-23.png?wsr" alt="" class="wp-image-30528" srcset="https://riceball.com/wp-content/uploads/sites/2/2026/09/Screenshot-from-2026-09-17-19-49-23.png 764w, https://riceball.com/wp-content/uploads/sites/2/2026/09/Screenshot-from-2026-09-17-19-49-23-300x192.png 300w" sizes="(max-width: 764px) 100vw, 764px" /></figure>



<p class="wp-block-paragraph">My system is MINT Linux Cinnamon, but with Regolith, a GNOME environment with the i3 full-screen/tiling window manager. Here&#8217;s a video about it:</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="Regolith Linux - Ubuntu with i3 Tiling Window Manager" width="500" height="281" src="https://www.youtube.com/embed/3x1CR5Q2rrY?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<p class="wp-block-paragraph">i3 uses <strong>named workspaces</strong> (also known as Desktops, Virtual Desktops, or Spaces in Windows and MacOS), numbered from 1 to 19, and you jump to them by pressing Win+1, Win+2&#8230; Win+Ctrl+1&#8230; etc. (Win can also be the Apple Key or &#8220;Super&#8221;)</p>



<p class="wp-block-paragraph">Normally, you have to press Win+Shift+1 to move a window to workspace 1.</p>



<p class="wp-block-paragraph">Starting up a session can be a pain, because  you bring up the apps you want, and they all show up in the current workspaces.</p>



<p class="wp-block-paragraph">I like to keep all my comms apps, like Signal, in workspace 1. I want my first browser to go to workspace 3.</p>



<p class="wp-block-paragraph">I also want all my odd-numbered workspaces on the big screen on the left, and even numbered workspace on the right, on the laptop screen.</p>



<p class="wp-block-paragraph">Here&#8217;s my config file: .config/regolith3/i3/config.d/workspace-to-display.config</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># mkdir -p  ~/.config/regolith3/i3/config.d
# vi ~/.config/regolith3/i3/config.d/workspace-to-display.config 
# Run xrandr --listmonitors to get the monitor names
#
# Sample output:
#
# Monitors: 2
# 0: +*HDMI-1 1920/509x1080/286+0+0  HDMI-1
# 1: +eDP-1 1920/309x1080/173+1920+0  eDP-1
#
# Paste the configs below in and edit to match your desired monitor setup

workspace "$ws1" output HDMI-1
workspace "$ws2" output eDP-1
workspace "$ws3" output HDMI-1
workspace "$ws4" output eDP-1
workspace "$ws5" output HDMI-1
workspace "$ws6" output eDP-1
workspace "$ws7" output HDMI-1
workspace "$ws8" output eDP-1
workspace "$ws9" output HDMI-1
workspace "$ws10" output eDP-1
workspace "$ws11" output HDMI-1
workspace "$ws12" output eDP-1
workspace "$ws13" output HDMI-1
workspace "$ws14" output eDP-1
workspace "$ws15" output HDMI-1
workspace "$ws16" output eDP-1
workspace "$ws17" output HDMI-1
workspace "$ws18" output eDP-1
workspace "$ws19" output HDMI-1

assign &#91;class="thunderbird"&#93; "$ws1"
assign &#91;class="proton-mail"&#93; "$ws1"
for_window &#91;class="Signal"&#93; move to workspace "$ws1"
# These don"t work
for_window &#91;class="Element *"&#93; move to workspace "$ws1"
for_window &#91;class="WhatsApp"&#93; move to workspace "$ws1"

assign &#91;class="firefox"&#93; "$ws3"</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4"># mkdir -p  ~/.config/regolith3/i3/config.d</span></span>
<span class="line"><span style="color: #D4D4D4"># vi ~/.config/regolith3/i3/config.d/workspace-to-display.config </span></span>
<span class="line"><span style="color: #D4D4D4"># Run xrandr --listmonitors to get the monitor names</span></span>
<span class="line"><span style="color: #D4D4D4">#</span></span>
<span class="line"><span style="color: #D4D4D4"># Sample output:</span></span>
<span class="line"><span style="color: #D4D4D4">#</span></span>
<span class="line"><span style="color: #D4D4D4"># Monitors: 2</span></span>
<span class="line"><span style="color: #D4D4D4"># 0: +*HDMI-1 1920/509x1080/286+0+0  HDMI-1</span></span>
<span class="line"><span style="color: #D4D4D4"># 1: +eDP-1 1920/309x1080/173+1920+0  eDP-1</span></span>
<span class="line"><span style="color: #D4D4D4">#</span></span>
<span class="line"><span style="color: #D4D4D4"># Paste the configs below in and edit to match your desired monitor setup</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">workspace &quot;$ws1&quot; output HDMI-1</span></span>
<span class="line"><span style="color: #D4D4D4">workspace &quot;$ws2&quot; output eDP-1</span></span>
<span class="line"><span style="color: #D4D4D4">workspace &quot;$ws3&quot; output HDMI-1</span></span>
<span class="line"><span style="color: #D4D4D4">workspace &quot;$ws4&quot; output eDP-1</span></span>
<span class="line"><span style="color: #D4D4D4">workspace &quot;$ws5&quot; output HDMI-1</span></span>
<span class="line"><span style="color: #D4D4D4">workspace &quot;$ws6&quot; output eDP-1</span></span>
<span class="line"><span style="color: #D4D4D4">workspace &quot;$ws7&quot; output HDMI-1</span></span>
<span class="line"><span style="color: #D4D4D4">workspace &quot;$ws8&quot; output eDP-1</span></span>
<span class="line"><span style="color: #D4D4D4">workspace &quot;$ws9&quot; output HDMI-1</span></span>
<span class="line"><span style="color: #D4D4D4">workspace &quot;$ws10&quot; output eDP-1</span></span>
<span class="line"><span style="color: #D4D4D4">workspace &quot;$ws11&quot; output HDMI-1</span></span>
<span class="line"><span style="color: #D4D4D4">workspace &quot;$ws12&quot; output eDP-1</span></span>
<span class="line"><span style="color: #D4D4D4">workspace &quot;$ws13&quot; output HDMI-1</span></span>
<span class="line"><span style="color: #D4D4D4">workspace &quot;$ws14&quot; output eDP-1</span></span>
<span class="line"><span style="color: #D4D4D4">workspace &quot;$ws15&quot; output HDMI-1</span></span>
<span class="line"><span style="color: #D4D4D4">workspace &quot;$ws16&quot; output eDP-1</span></span>
<span class="line"><span style="color: #D4D4D4">workspace &quot;$ws17&quot; output HDMI-1</span></span>
<span class="line"><span style="color: #D4D4D4">workspace &quot;$ws18&quot; output eDP-1</span></span>
<span class="line"><span style="color: #D4D4D4">workspace &quot;$ws19&quot; output HDMI-1</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">assign &#91;class=&quot;thunderbird&quot;&#93; &quot;$ws1&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">assign &#91;class=&quot;proton-mail&quot;&#93; &quot;$ws1&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">for_window &#91;class=&quot;Signal&quot;&#93; move to workspace &quot;$ws1&quot;</span></span>
<span class="line"><span style="color: #D4D4D4"># These don&quot;t work</span></span>
<span class="line"><span style="color: #D4D4D4">for_window &#91;class=&quot;Element *&quot;&#93; move to workspace &quot;$ws1&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">for_window &#91;class=&quot;WhatsApp&quot;&#93; move to workspace &quot;$ws1&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">assign &#91;class=&quot;firefox&quot;&#93; &quot;$ws3&quot;</span></span></code></pre></div>



<h2 class="wp-block-heading">Workspaces Associated with Displays</h2>



<p class="wp-block-paragraph">At the top of my config, I have some comments to remind me how I did it. You run xrandr &#8211;listmonitors to get the monitor names:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>xrandr --listmonitors</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">xrandr --listmonitors</span></span></code></pre></div>



<p class="wp-block-paragraph">Then you put these lines to assign a workspace to a display:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>workspace "$ws1" output HDMI-1
workspace "$ws2" output eDP-1
.
.
.
workspace "$ws18" output eDP-1
workspace "$ws19" output HDMI-1</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">workspace &quot;$ws1&quot; output HDMI-1</span></span>
<span class="line"><span style="color: #D4D4D4">workspace &quot;$ws2&quot; output eDP-1</span></span>
<span class="line"><span style="color: #D4D4D4">.</span></span>
<span class="line"><span style="color: #D4D4D4">.</span></span>
<span class="line"><span style="color: #D4D4D4">.</span></span>
<span class="line"><span style="color: #D4D4D4">workspace &quot;$ws18&quot; output eDP-1</span></span>
<span class="line"><span style="color: #D4D4D4">workspace &quot;$ws19&quot; output HDMI-1</span></span></code></pre></div>



<p class="wp-block-paragraph">Then, you assign windows to workspaces:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>assign &#91;class="thunderbird"&#93; "$ws1"
assign &#91;class="proton-mail"&#93; "$ws1"
for_window &#91;class="Signal"&#93; move to workspace "$ws1"
# These don"t work
for_window &#91;class="Element *"&#93; move to workspace "$ws1"
for_window &#91;class="WhatsApp"&#93; move to workspace "$ws1"

assign &#91;class="firefox"&#93; "$ws3"</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">assign &#91;class=&quot;thunderbird&quot;&#93; &quot;$ws1&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">assign &#91;class=&quot;proton-mail&quot;&#93; &quot;$ws1&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">for_window &#91;class=&quot;Signal&quot;&#93; move to workspace &quot;$ws1&quot;</span></span>
<span class="line"><span style="color: #D4D4D4"># These don&quot;t work</span></span>
<span class="line"><span style="color: #D4D4D4">for_window &#91;class=&quot;Element *&quot;&#93; move to workspace &quot;$ws1&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">for_window &#91;class=&quot;WhatsApp&quot;&#93; move to workspace &quot;$ws1&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">assign &#91;class=&quot;firefox&quot;&#93; &quot;$ws3&quot;</span></span></code></pre></div>



<p class="wp-block-paragraph">The first three lines work, and the last line works, but the lines for Element and WhatsApp don&#8217;t work. These config lines are tricky to figure out, because you don&#8217;t know what info the app is exposing to the window manager. Finding out is a pain in the butt, but here are instructions:</p>



<p class="wp-block-paragraph"><a href="https://stackoverflow.com/questions/65049414/in-i3wm-how-can-i-open-programs-on-another-workspace-at-startup">https://stackoverflow.com/questions/65049414/in-i3wm-how-can-i-open-programs-on-another-workspace-at-startup</a></p>



<p class="wp-block-paragraph">One of these days, I may update this with a bunch of programs configured to show up on specific workspaces.</p>



<h2 class="wp-block-heading">Errors</h2>



<p class="wp-block-paragraph">For a while, I had my own config in .config/regolith3/i3/config, which I think may have caused error messages and weird behavior. (I may be wrong, though.)</p>



<p class="wp-block-paragraph">The workspace names were causing problems. The &#8220;names&#8221; looked like HTML &#8211; because they were:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-Deja-Vu-Mono.ttf" style="font-size:.875rem;font-family:Code-Pro-Deja-Vu-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>1:&lt;span> &lt;/span>1 &lt;span foreground="#3584E4">&lt;/span>&lt;span> &lt;/span></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">1:&lt;span&gt; &lt;/span&gt;1 &lt;span foreground=&quot;#3584E4&quot;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;</span></span></code></pre></div>



<p class="wp-block-paragraph">That&#8217;s the name, with all the HTML in it. It gets rendered by Pango.</p>



<p class="wp-block-paragraph">However, when this line is expanded, it breaks:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-Deja-Vu-Mono.ttf" style="font-size:.875rem;font-family:Code-Pro-Deja-Vu-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># The original config line:
workspace "$ws1" output HDMI-1
# The line after the variable expansion:
workspace "1:&lt;span> &lt;/span>1 &lt;span foreground="#3584E4">&lt;/span>&lt;span> &lt;/span>" output HDMI-1</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4"># The original config line:</span></span>
<span class="line"><span style="color: #D4D4D4">workspace &quot;$ws1&quot; output HDMI-1</span></span>
<span class="line"><span style="color: #D4D4D4"># The line after the variable expansion:</span></span>
<span class="line"><span style="color: #D4D4D4">workspace &quot;1:&lt;span&gt; &lt;/span&gt;1 &lt;span foreground=&quot;#3584E4&quot;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&quot; output HDMI-1</span></span></code></pre></div>



<p class="wp-block-paragraph">The problem is the double quote within the double-quoted string. I got a ton of error messages.</p>



<p class="wp-block-paragraph">I thought, &#8220;this is easy. Try using single-quotes&#8221;:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-Deja-Vu-Mono.ttf" style="font-size:.875rem;font-family:Code-Pro-Deja-Vu-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly># The original config line:
workspace '$ws1' output HDMI-1
# The line after the variable expansion:
workspace '1:&lt;span> &lt;/span>1 &lt;span foreground='#3584E4'>&lt;/span>&lt;span> &lt;/span>' output HDMI-1</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4"># The original config line:</span></span>
<span class="line"><span style="color: #D4D4D4">workspace &#39;$ws1&#39; output HDMI-1</span></span>
<span class="line"><span style="color: #D4D4D4"># The line after the variable expansion:</span></span>
<span class="line"><span style="color: #D4D4D4">workspace &#39;1:&lt;span&gt; &lt;/span&gt;1 &lt;span foreground=&#39;#3584E4&#39;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&#39; output HDMI-1</span></span></code></pre></div>



<p class="wp-block-paragraph">OK, I don&#8217;t know what the hell was going on, but single quotes caused the variable expansion to also use <strong>single quotes</strong> inside the string.</p>



<p class="wp-block-paragraph">I tried it without any quotes at all, but that didn&#8217;t work, because variable expansions are done before the entire line is parsed. So all the spaces in the code would separate the name into words. That&#8217;s why the quotes were there.</p>



<p class="wp-block-paragraph">After reading a lot, and digging around, I found where these long, troublesome names were being generated: /usr/share/regolith-look/default/wm</p>



<p class="wp-block-paragraph">The code looks a little like this:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-Deja-Vu-Mono.ttf" style="font-size:.875rem;font-family:Code-Pro-Deja-Vu-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>#define Q(x) #x
#define QUOTE(x) Q(x)
#define glyph typeface_bar_glyph_workspace
#define WORKSPACE_NAME(INDEX, COLOR, GLYPH) INDEX:&lt;span> &lt;/span>INDEX &lt;span foreground=COLOR>GLYPH&lt;/span>&lt;span> &lt;/span>

wm.workspace.01.name: WORKSPACE_NAME(1, QUOTE(color_blue), glyph)
.
.
.</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">#define Q(x) #x</span></span>
<span class="line"><span style="color: #D4D4D4">#define QUOTE(x) Q(x)</span></span>
<span class="line"><span style="color: #D4D4D4">#define glyph typeface_bar_glyph_workspace</span></span>
<span class="line"><span style="color: #D4D4D4">#define WORKSPACE_NAME(INDEX, COLOR, GLYPH) INDEX:&lt;span&gt; &lt;/span&gt;INDEX &lt;span foreground=COLOR&gt;GLYPH&lt;/span&gt;&lt;span&gt; &lt;/span&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">wm.workspace.01.name: WORKSPACE_NAME(1, QUOTE(color_blue), glyph)</span></span>
<span class="line"><span style="color: #D4D4D4">.</span></span>
<span class="line"><span style="color: #D4D4D4">.</span></span>
<span class="line"><span style="color: #D4D4D4">.</span></span></code></pre></div>



<p class="wp-block-paragraph">Yes, those are C preprocessor (cpp) directives.</p>



<p class="wp-block-paragraph">For the 99% of people who don&#8217;t know what C or the C Preprocessor is: it&#8217;s a macro language. Here&#8217;s a video about it. Skip it if you know it.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="#30: Preprocesor and Macros | C Programming for Beginners" width="500" height="281" src="https://www.youtube.com/embed/cmGq62c1Ceg?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<p class="wp-block-paragraph">The obvious fix was to single-quote the color value, so the expansion would look like this:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-Deja-Vu-Mono.ttf" style="font-size:.875rem;font-family:Code-Pro-Deja-Vu-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>workspace "1:&lt;span> &lt;/span>1 &lt;span foreground='#3584E4'>&lt;/span>&lt;span> &lt;/span>" output HDMI-1</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">workspace &quot;1:&lt;span&gt; &lt;/span&gt;1 &lt;span foreground=&#39;#3584E4&#39;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&quot; output HDMI-1</span></span></code></pre></div>



<p class="wp-block-paragraph">I tried:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-Deja-Vu-Mono.ttf" style="font-size:.875rem;font-family:Code-Pro-Deja-Vu-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>#define SQ(X) 'X'</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">#define SQ(X) &#39;X&#39;</span></span></code></pre></div>



<p class="wp-block-paragraph">That didn&#8217;t work, because the X <strong>would not expand within a single (or double) quoted string.</strong> (This was one of the features of the cpp.)</p>



<p class="wp-block-paragraph">After an hour or two of reading, talking to AI, and looking for solutions, and failing to ever get it working with macros, I figured out something: I needed to run the cpp on the config files to get the computed config, because the workspace name definitions would be in there.</p>



<p class="wp-block-paragraph">The file at the top of all the configs, with all the #includes, was called root, and the command to spit out the config: </p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-Deja-Vu-Mono.ttf" style="font-size:.875rem;font-family:Code-Pro-Deja-Vu-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>cpp /usr/share/regolith-look/default/root</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">cpp /usr/share/regolith-look/default/root</span></span></code></pre></div>



<p class="wp-block-paragraph">That showed me the computed config:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-Deja-Vu-Mono.ttf" style="font-size:.875rem;font-family:Code-Pro-Deja-Vu-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>wm.workspace.01.name: 1:&lt;span> &lt;/span>1 &lt;span foreground="#3584E4">&lt;/span>&lt;span> &lt;/span>
wm.workspace.02.name: 2:&lt;span> &lt;/span>2 &lt;span foreground="#95E6CB">&lt;/span>&lt;span> &lt;/span>
wm.workspace.03.name: 3:&lt;span> &lt;/span>3 &lt;span foreground="#33D17A">&lt;/span>&lt;span> &lt;/span>
.
.
.</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">wm.workspace.01.name: 1:&lt;span&gt; &lt;/span&gt;1 &lt;span foreground=&quot;#3584E4&quot;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">wm.workspace.02.name: 2:&lt;span&gt; &lt;/span&gt;2 &lt;span foreground=&quot;#95E6CB&quot;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">wm.workspace.03.name: 3:&lt;span&gt; &lt;/span&gt;3 &lt;span foreground=&quot;#33D17A&quot;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">.</span></span>
<span class="line"><span style="color: #D4D4D4">.</span></span>
<span class="line"><span style="color: #D4D4D4">.</span></span></code></pre></div>



<p class="wp-block-paragraph">Now, we just need to be able to override what the macros produced.</p>



<p class="wp-block-paragraph">This can be done through Xresources.</p>



<p class="wp-block-paragraph">Here are the config lines that define the $ws1&#8230; variables:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-Deja-Vu-Mono.ttf" style="font-size:.875rem;font-family:Code-Pro-Deja-Vu-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>###############################################################################
# Workspace Names
# These are the labels which define each workspace.
###############################################################################

set_from_resource $ws1  wm.workspace.01.name "1"
set_from_resource $ws2  wm.workspace.02.name "2"
set_from_resource $ws3  wm.workspace.03.name "3"
.
.
.</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">###############################################################################</span></span>
<span class="line"><span style="color: #D4D4D4"># Workspace Names</span></span>
<span class="line"><span style="color: #D4D4D4"># These are the labels which define each workspace.</span></span>
<span class="line"><span style="color: #D4D4D4">###############################################################################</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">set_from_resource $ws1  wm.workspace.01.name &quot;1&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">set_from_resource $ws2  wm.workspace.02.name &quot;2&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">set_from_resource $ws3  wm.workspace.03.name &quot;3&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">.</span></span>
<span class="line"><span style="color: #D4D4D4">.</span></span>
<span class="line"><span style="color: #D4D4D4">.</span></span></code></pre></div>



<p class="wp-block-paragraph">set_from_resource sets a variable value, first looking for the value in Xresources, and if it&#8217;s not there, using the supplied default.</p>



<p class="wp-block-paragraph">The canonical way for end  users to configure Regolith is through the Xresources file.  (Having now tried to mess with the config files, I understand why: it&#8217;s easy to completely screw up the config files.)</p>



<p class="wp-block-paragraph">So setting the correct value was as simple as pasting this into the .config/regolith3/Xresources file:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-Deja-Vu-Mono.ttf" style="font-size:.875rem;font-family:Code-Pro-Deja-Vu-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>wm.workspace.01.name: 1:&lt;span> &lt;/span>1 &lt;span foreground='#3584E4'>&lt;/span>&lt;span> &lt;/span>
wm.workspace.02.name: 2:&lt;span> &lt;/span>2 &lt;span foreground='#95E6CB'>&lt;/span>&lt;span> &lt;/span>
wm.workspace.03.name: 3:&lt;span> &lt;/span>3 &lt;span foreground='#33D17A'>&lt;/span>&lt;span> &lt;/span>
wm.workspace.04.name: 4:&lt;span> &lt;/span>4 &lt;span foreground='#F6D32D'>&lt;/span>&lt;span> &lt;/span>
wm.workspace.05.name: 5:&lt;span> &lt;/span>5 &lt;span foreground='#FF7800'>&lt;/span>&lt;span> &lt;/span>
wm.workspace.06.name: 6:&lt;span> &lt;/span>6 &lt;span foreground='#E01B24'>&lt;/span>&lt;span> &lt;/span>
wm.workspace.07.name: 7:&lt;span> &lt;/span>7 &lt;span foreground='#75507B'>&lt;/span>&lt;span> &lt;/span>
wm.workspace.08.name: 8:&lt;span> &lt;/span>8 &lt;span foreground='#9141AC'>&lt;/span>&lt;span> &lt;/span>
wm.workspace.09.name: 9:&lt;span> &lt;/span>9 &lt;span foreground='#986A44'>&lt;/span>&lt;span> &lt;/span>
wm.workspace.10.name: 10:&lt;span> &lt;/span>10 &lt;span foreground='#3584E4'>&lt;/span>&lt;span> &lt;/span>
wm.workspace.11.name: 11:&lt;span> &lt;/span>11 &lt;span foreground='#95E6CB'>&lt;/span>&lt;span> &lt;/span>
wm.workspace.12.name: 12:&lt;span> &lt;/span>12 &lt;span foreground='#33D17A'>&lt;/span>&lt;span> &lt;/span>
wm.workspace.13.name: 13:&lt;span> &lt;/span>13 &lt;span foreground='#F6D32D'>&lt;/span>&lt;span> &lt;/span>
wm.workspace.14.name: 14:&lt;span> &lt;/span>14 &lt;span foreground='#FF7800'>&lt;/span>&lt;span> &lt;/span>
wm.workspace.15.name: 15:&lt;span> &lt;/span>15 &lt;span foreground='#E01B24'>&lt;/span>&lt;span> &lt;/span>
wm.workspace.16.name: 16:&lt;span> &lt;/span>16 &lt;span foreground='#75507B'>&lt;/span>&lt;span> &lt;/span>
wm.workspace.17.name: 17:&lt;span> &lt;/span>17 &lt;span foreground='#9141AC'>&lt;/span>&lt;span> &lt;/span>
wm.workspace.18.name: 18:&lt;span> &lt;/span>18 &lt;span foreground='#986A44'>&lt;/span>&lt;span> &lt;/span>
wm.workspace.19.name: 19:&lt;span> &lt;/span>19 &lt;span foreground='#3584E4'>&lt;/span>&lt;span> &lt;/span></textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">wm.workspace.01.name: 1:&lt;span&gt; &lt;/span&gt;1 &lt;span foreground=&#39;#3584E4&#39;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">wm.workspace.02.name: 2:&lt;span&gt; &lt;/span&gt;2 &lt;span foreground=&#39;#95E6CB&#39;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">wm.workspace.03.name: 3:&lt;span&gt; &lt;/span&gt;3 &lt;span foreground=&#39;#33D17A&#39;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">wm.workspace.04.name: 4:&lt;span&gt; &lt;/span&gt;4 &lt;span foreground=&#39;#F6D32D&#39;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">wm.workspace.05.name: 5:&lt;span&gt; &lt;/span&gt;5 &lt;span foreground=&#39;#FF7800&#39;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">wm.workspace.06.name: 6:&lt;span&gt; &lt;/span&gt;6 &lt;span foreground=&#39;#E01B24&#39;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">wm.workspace.07.name: 7:&lt;span&gt; &lt;/span&gt;7 &lt;span foreground=&#39;#75507B&#39;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">wm.workspace.08.name: 8:&lt;span&gt; &lt;/span&gt;8 &lt;span foreground=&#39;#9141AC&#39;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">wm.workspace.09.name: 9:&lt;span&gt; &lt;/span&gt;9 &lt;span foreground=&#39;#986A44&#39;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">wm.workspace.10.name: 10:&lt;span&gt; &lt;/span&gt;10 &lt;span foreground=&#39;#3584E4&#39;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">wm.workspace.11.name: 11:&lt;span&gt; &lt;/span&gt;11 &lt;span foreground=&#39;#95E6CB&#39;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">wm.workspace.12.name: 12:&lt;span&gt; &lt;/span&gt;12 &lt;span foreground=&#39;#33D17A&#39;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">wm.workspace.13.name: 13:&lt;span&gt; &lt;/span&gt;13 &lt;span foreground=&#39;#F6D32D&#39;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">wm.workspace.14.name: 14:&lt;span&gt; &lt;/span&gt;14 &lt;span foreground=&#39;#FF7800&#39;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">wm.workspace.15.name: 15:&lt;span&gt; &lt;/span&gt;15 &lt;span foreground=&#39;#E01B24&#39;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">wm.workspace.16.name: 16:&lt;span&gt; &lt;/span&gt;16 &lt;span foreground=&#39;#75507B&#39;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">wm.workspace.17.name: 17:&lt;span&gt; &lt;/span&gt;17 &lt;span foreground=&#39;#9141AC&#39;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">wm.workspace.18.name: 18:&lt;span&gt; &lt;/span&gt;18 &lt;span foreground=&#39;#986A44&#39;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">wm.workspace.19.name: 19:&lt;span&gt; &lt;/span&gt;19 &lt;span foreground=&#39;#3584E4&#39;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;</span></span></code></pre></div>



<p class="wp-block-paragraph">NOTE: the color values are single quoted. I copied this from the config dump above, and did a search-replace for &#8220;, replacing with &#8216;.</p>



<p class="wp-block-paragraph">That corrected the config file errors I was getting, and a few other problems I may have introduced.</p>



<h2 class="wp-block-heading">Conclusion</h2>



<p class="wp-block-paragraph">This was way more difficult than it needed to be.</p>



<p class="wp-block-paragraph">This workspace naming scheme seems like a bad idea, at least if the name is more than a single word. Rather than referring to a workspace by it&#8217;s fancy HTML code label, a named workspace should also have a &#8220;label&#8221; property, for this string to display.</p>



<p class="wp-block-paragraph">The cpp is kind of cool, but kind of a pain in the ass.</p>



<p class="wp-block-paragraph"></p><p>The post <a href="https://riceball.com/2026/09/17/configuring-regolith-to-send-windows-to-workspaces-long/">Configuring Regolith to Send Windows to Workspaces (long)</a> first appeared on <a href="https://riceball.com">🍙</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://riceball.com/2026/09/17/configuring-regolith-to-send-windows-to-workspaces-long/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Recovering Data from an Netgear SC101 NAS</title>
		<link>https://riceball.com/2026/07/16/recovering-data-from-an-netgear-sc101-nas/</link>
					<comments>https://riceball.com/2026/07/16/recovering-data-from-an-netgear-sc101-nas/#respond</comments>
		
		<dc:creator><![CDATA[admin]]></dc:creator>
		<pubDate>Thu, 16 Jul 2026 06:11:15 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Linux]]></category>
		<guid isPermaLink="false">https://riceball.com/?p=30073</guid>

					<description><![CDATA[<p>I haven&#8217;t been able to do it. The short version is, I had a good conversation with Thaura (aka Qwen) and it said the NAS uses a proprietary format, and requires software installed to use it. https://thaura.ai/?share=2aa94050-af42-4a00-95cc-8b4776ef65c4 Why? Because it doesn&#8217;t have a file system. The CS101 presents the disk as a block device over [&#8230;]</p>
<p>The post <a href="https://riceball.com/2026/07/16/recovering-data-from-an-netgear-sc101-nas/">Recovering Data from an Netgear SC101 NAS</a> first appeared on <a href="https://riceball.com">🍙</a>.</p>]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">I haven&#8217;t been able to do it.</p>



<p class="wp-block-paragraph">The short version is, I had a good conversation with Thaura (aka Qwen) and it said the NAS uses a proprietary format, and requires software installed to use it.</p>



<p class="wp-block-paragraph"><a href="https://thaura.ai/?share=2aa94050-af42-4a00-95cc-8b4776ef65c4">https://thaura.ai/?share=2aa94050-af42-4a00-95cc-8b4776ef65c4</a></p>



<p class="wp-block-paragraph">Why? Because it doesn&#8217;t have a file system. The CS101 presents the disk as a block device over ethernet. So it must get formatted by client software that runs on Windows.</p>



<p class="wp-block-paragraph">I did some xxd dumps to peek at different parts of the disk, and it was zeroes, excepting several bytes here and there that are probably a proprietary format used by the NAS.</p>


<pre class="wp-block-code"><span><code class="hljs">➜  testdisk-7.2 sudo xxd  -l 20512 /dev/sdc | less 
➜  testdisk-7.2 sudo xxd  -o 1000000 -l 20512 /dev/sdc | less
➜  testdisk-7.2 sudo xxd  -o 100000000 -l 20512 /dev/sdc | less
➜  testdisk-7.2 sudo xxd  -o 50000000 -l 20512 /dev/sdc | less
➜  testdisk-7.2 sudo xxd  -o 20000000 -l 20512 /dev/sdc | less
➜  testdisk-7.2 sudo xxd  -o 80000000 -l 20512 /dev/sdc | less
➜  testdisk-7.2 sudo xxd  -o 200000000 -l 20512 /dev/sdc | less
➜  testdisk-7.2 sudo xxd  -o 100000000 -l 20512 /dev/sdc | less
</code></span></pre>


<p class="wp-block-paragraph">I&#8217;m running PhotoRec file recovery software on it, but don&#8217;t have much hope of recovering anything.</p>



<h2 class="wp-block-heading">Update: Recovered!</h2>



<p class="wp-block-paragraph">So, photorec found a bunch of text files, but they were byte swapped. So I fixed a few with:</p>


<pre class="wp-block-code"><span><code class="hljs">dd conv=swab if=filename of=newfilname</code></span></pre>


<p class="wp-block-paragraph">That worked &#8211; and the files were HTML. It&#8217;s probably a copy or cache of a website.</p>



<p class="wp-block-paragraph">Photorec also found a few large files. One was a &#8220;.diskimage&#8221; and the other two were &#8220;.ab&#8221;. I was unable to mount any of them as a formatted disk with a file system. So I byteswapped them, and tried again, and failed again.</p>



<p class="wp-block-paragraph"><strong><em>So I went back into photorec and scanned each of the large files. The .diskimage file yielded 230MB+  of MMP3 and JPG files!</em></strong></p>



<p class="wp-block-paragraph">The others didn&#8217;t, or they yielded diskimage and ab files (maybe the recovery tool byteswaps internally).</p><p>The post <a href="https://riceball.com/2026/07/16/recovering-data-from-an-netgear-sc101-nas/">Recovering Data from an Netgear SC101 NAS</a> first appeared on <a href="https://riceball.com">🍙</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://riceball.com/2026/07/16/recovering-data-from-an-netgear-sc101-nas/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>The Best Way to Ease into Linux in 2026</title>
		<link>https://riceball.com/2026/03/09/the-best-way-to-ease-into-linux-in-2026/</link>
		
		<dc:creator><![CDATA[johnk]]></dc:creator>
		<pubDate>Mon, 09 Mar 2026 19:54:54 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Linux]]></category>
		<guid isPermaLink="false">https://externaldocuments.com/?p=29509</guid>

					<description><![CDATA[<p>Why: Linux is a good way to get more out of your hardware. It runs less &#8220;spyware&#8221; like monitoring. Itʻs a little less automated. You donʻt need to log into Microsoft or Apple to do things. How: create an external SSD disk connected over USB-3 to boot the machine. This way, you can reboot into [&#8230;]</p>
<p>The post <a href="https://riceball.com/2026/03/09/the-best-way-to-ease-into-linux-in-2026/">The Best Way to Ease into Linux in 2026</a> first appeared on <a href="https://riceball.com">🍙</a>.</p>]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">Why: Linux is a good way to get more out of your hardware. It runs less &#8220;spyware&#8221; like monitoring. Itʻs a little less automated. You donʻt need to log into Microsoft or Apple to do things.</p>



<p class="wp-block-paragraph">How: create an external SSD disk connected over USB-3 to boot the machine. This way, you can reboot into Windows (or MacOS) if you need to.</p>



<p class="wp-block-paragraph">What: you will need at least one SSD and USB-3 external disk enclosure. You may also need a backup disk, and spend time learning to back  up your system manually. You will also need a USB thumb drive to make a bootable disk &#8211; anything 8GB and up should be fine.</p>



<p class="wp-block-paragraph">When: plan to spend a few months to make the transition from Windows or MacOS to Linux. The hardware setup can operate for many years, and you donʻt really need to commit all your hardware to Linux.</p>



<h2 class="wp-block-heading">Make a Data Backup</h2>



<p class="wp-block-paragraph">This is a relatively difficult process, because you need to understand your file system. Newer users might not be used to managing files. You must learn (because, otherwise, you are dependent on the apps, and the companies that make the apps).</p>



<p class="wp-block-paragraph">If you use specialized applications for graphics, video, accounting, or anything but the most basic use, you might not want to switch to Linux.</p>



<p class="wp-block-paragraph">If most of your usage are basic 2000s era tasks, like &#8220;office&#8221; work (excluding PowerPoint), programming, and web browsing, youʻre a good candidate for transition.</p>



<p class="wp-block-paragraph">Next, you need to make a backup plan. This is on paper, or in a document, where you list the location of the data, and where it will be copied. If you know how to script this, so  you can automate the process, great (you can use a tool like XXCOPY).</p>



<p class="wp-block-paragraph">Data is typically stored in the Documents and Photos folder. They may also be stored in other folders, typically named after the application. Note all these locations.</p>



<p class="wp-block-paragraph">Some data is stored inside apps &#8211; a password manager, or a browerʻs bookmarks, or an auth appʻs keys, for example. You will need to learn to export that data.</p>



<p class="wp-block-paragraph">Some data inside apps are keys, passwords, names, paths, etc. You may need to copy-paste that data into a file, for your backup.</p>



<p class="wp-block-paragraph">(Some applications, like database servers, will need to be shut down before the files are copied. Note this in the backup plan.)</p>



<p class="wp-block-paragraph">Get a backup disk. What I use is a &#8220;disk caddy&#8221; and an old hard disk. Usually, Iʻll make two backups. </p>



<p class="wp-block-paragraph">Another option, if you have enough space on your computer, is to make a backup staging folder, and make the backup into a local folder. Then, copy that to the external disk.</p>



<p class="wp-block-paragraph">The first backup will take anywhere from a few minutes, to a few days, depending on how much data you have.</p>



<p class="wp-block-paragraph">When you start out, itʻs ok to base your backups on the plan, and using regular file copies.</p>



<p class="wp-block-paragraph">Subsequent backups will be faster, as long as you skip over duplicated files. You can also use a tool to perform &#8220;diffs&#8221; across folders, to find differences, and copy only the changed files. (I havenʻt used a diff tool in years, so I cannot recommend one. The main tools Iʻve used are rsync, or based on rsync.)</p>



<p class="wp-block-paragraph">After a few weeks, you should have a good backup system.</p>



<h2 class="wp-block-heading">Make the Disk</h2>



<p class="wp-block-paragraph">You can use a regular HDD and a USB2 external disk enclosure, but itʻll be noticeably slower than an SSD and USB3. In fact, itʻll feel slower than Windows or MacOS. With the faster hardware, itʻll feel almost as fast as having an internal SSD disk.</p>



<p class="wp-block-paragraph">Download an ISO of MINT Linux, and burn it to the USB thumb drive.</p>



<p class="wp-block-paragraph">(What to do to burn the ISO.)</p>



<p class="wp-block-paragraph">Boot into Linux, and then <a href="https://externaldocuments.com/technote/code/sysadmin/installing-mint-linux-on-an-external-ssd-with-usb3-and-booting-on-a-mac-mini/" data-type="page" data-id="22961">follow these instructions</a> to make a bootable disk.</p>



<p class="wp-block-paragraph">The system should now boot up from an external SSD.</p>



<h2 class="wp-block-heading">Starting Up With Linux</h2>



<p class="wp-block-paragraph">Mainly, this is installing application software. When Iʻm setting up more than one computer, I make a to-do-list with all the resources necessary to quickly set up the user environment.</p>



<p class="wp-block-paragraph">This is my latest setup script, which automates part of my process. This is just an example, and it wonʻt work for you, because itʻs missing some files.</p>



<p class="wp-block-paragraph">Itʻs just one way to document a setup. This way, itʻs easier to restore the system after an installation. You might want to use alternatives like Ansible.</p>



<pre class="wp-block-preformatted">#! /bin/bash<br><br># installing oh-my-zsh<br>sudo apt install zsh git -y<br>if [ -e ~/.oh-my-zsh ] ; then<br>    echo "Oh My Zsh installed, skipping"<br>else<br>    echo "Installing Oh My Zsh"<br>    sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"<br>fi<br><br># hook in the aliases<br>cp zsh-aliases ~/.zsh-aliases<br>if ( grep -q "source ~/.zsh-aliases" ~/.zshrc ) ; then<br>    echo "Aliases sourcing exists, skipping"<br>else<br>    echo "Adding alias sources to .zshrc"<br>    echo "source ~/.zsh-aliases" &gt;&gt; ~/.zshrc<br>fi<br><br># restore certs directory<br><br># increase file watchers for resilio sync<br>echo fs.inotify.max_user_watches=250000 | sudo tee -a /etc/sysctl.conf<br>sudo sysctl -p<br><br># install protonmail bridge<br>if [ -e /usr/bin/protonmail-bridge ] ; then<br>    echo "Protonmail Bridge installed."<br>else<br>    echo "Install Protonmail Bridge"<br>    firefox-bin https://proton.me/mail/bridge<br>fi<br><br>#cp -ar ~/certs certs<br>#cp -ar ~/.ssh ssh<br>if [ -e thunderbird ] ; then<br>  echo "Copying thunderbird directory"<br>  cp -ar thunderbird ~/.thunderbird<br>fi<br># cp -ar ~/bin bin<br></pre>



<p class="wp-block-paragraph">I also have a script apt-install.sh, that can install some software:</p>



<pre class="wp-block-preformatted">#!/bin/bash<br><br># apt-install.sh<br># Install several packages using APT or Flatpak.<br><br># Flatpak<br># This was created with:<br>#    flatpak list | cut -sf 2 | awk "{printf \"flatpak install %s\n\", \$1 }"<br># And then manually deleting things that didnʻt look like applications.<br><br>flatpak install com.strlen.TreeSheets<br>flatpak install org.asamk.SignalCli<br>flatpak install org.gimp.GIMP<br><br># APT<br># You can get some hints about what to put in the apt line<br># from this command:<br>#    sudo apt list --installed<br>#<br>sudo apt install libreoffice-writer libreoffice-calc libreoffice-draw libreoffice-impress firefox thunderbird okular vlc neovim-qt<br>sudo apt install sticky<br><br># Browswers<br># Google Chrome<br># Brave<br># Edge<br>#<br># Other<br># Zoom<br>#<br># A good way to install a deb package:<br>#    sudo gdebi ~/Downloads/&lt;the file downloaded.deb></pre>



<h2 class="wp-block-heading">Repairing Linux Boot</h2>



<p class="wp-block-paragraph">Sometimes, you have problems booting. This has less to do with the external disk, and more to do with the rapid pace of Linux updates, which sometimes break. Usually, they fix it quickly, but some people get caught up in the mess, and end up with a non-booting computer. This has happened to me twice in the past 10 years or so.</p>



<p class="wp-block-paragraph">The short answer is: use the bootable thumb drive. On it are recovery tools to repair the booting sequence.</p>



<p class="wp-block-paragraph">You can also <a href="https://externaldocuments.com/2026/02/11/fixing-broken-linux-mint-boot/" data-type="post" data-id="29433">do a manual repair</a>.</p>



<p class="wp-block-paragraph">After repairing, do a software update.</p>



<p class="wp-block-paragraph"></p><p>The post <a href="https://riceball.com/2026/03/09/the-best-way-to-ease-into-linux-in-2026/">The Best Way to Ease into Linux in 2026</a> first appeared on <a href="https://riceball.com">🍙</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Fixing Broken Linux MINT Boot</title>
		<link>https://riceball.com/2026/02/11/fixing-broken-linux-mint-boot/</link>
		
		<dc:creator><![CDATA[johnk]]></dc:creator>
		<pubDate>Thu, 12 Feb 2026 02:14:50 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Linux]]></category>
		<guid isPermaLink="false">https://externaldocuments.com/?p=29433</guid>

					<description><![CDATA[<p>Symptoms: rebooting immediately goes into the grub command line. The easiest way to fix this is to use a USB boot, and run tools to fix the boot. This page explains how to fix it from the command line. The following commands are how I fixed it. grub&#62; set root=/dev/sda2grub&#62; linux /boot/vmlinuz.old root=/dev/sda2grub&#62; initrd /boot/initrd.img.oldgrub&#62; [&#8230;]</p>
<p>The post <a href="https://riceball.com/2026/02/11/fixing-broken-linux-mint-boot/">Fixing Broken Linux MINT Boot</a> first appeared on <a href="https://riceball.com">🍙</a>.</p>]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">Symptoms: rebooting immediately goes into the grub command line. The easiest way to fix this is to use a USB boot, and run tools to fix the boot. This page explains how to fix it from the command line.</p>



<p class="wp-block-paragraph">The following commands are how I fixed it.</p>



<pre class="wp-block-preformatted">grub&gt; set root=/dev/sda2<br />grub&gt; linux /boot/vmlinuz.old root=/dev/sda2<br />grub&gt; initrd /boot/initrd.img.old<br />grub&gt; boot</pre>



<p class="wp-block-paragraph">That will boot the system into the previous kernel, which probably works. Presumably, the current kernel fails.</p>



<p class="wp-block-paragraph">Once it boots, open a terminal window and do the following:</p>



<pre class="wp-block-preformatted">sudo /sbin/update-grub</pre>



<p class="wp-block-paragraph">That will produce a fresh /boot/grub/grub.cfg file.</p>



<p class="wp-block-paragraph">Reboot the computer.</p>



<h2 class="wp-block-heading">Explanations</h2>



<p class="wp-block-paragraph">&#8220;set root=&#8221; isn&#8217;t strictly necessary, but I do it.</p>



<p class="wp-block-paragraph">&#8220;linux&#8221; sets a few things for the linux boot. The first parameter specifies the kernel. The &#8220;root=&#8221; sets the root directory during boot. You can use the UUID as well, but in my case, this is easier to type, and it&#8217;s how it works.</p>



<p class="wp-block-paragraph">&#8220;initrd&#8221; sets the initial ramdisk. This contains drivers to load the rest of the system. If you don&#8217;t specify a ramdisk, you can&#8217;t continue the boot. (I think you will be dropped into BusyBox.)</p>



<p class="wp-block-paragraph">Once you&#8217;re in the OS, you can run update-grub to fix the config file and run a lot of other programs that check things out.</p><p>The post <a href="https://riceball.com/2026/02/11/fixing-broken-linux-mint-boot/">Fixing Broken Linux MINT Boot</a> first appeared on <a href="https://riceball.com">🍙</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Getting Off of Big Tech</title>
		<link>https://riceball.com/2025/03/30/getting-off-of-big-tech/</link>
		
		<dc:creator><![CDATA[johnk]]></dc:creator>
		<pubDate>Sun, 30 Mar 2025 18:13:56 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Linux]]></category>
		<guid isPermaLink="false">https://externaldocuments.com/?p=14614</guid>

					<description><![CDATA[<p>Messaging Signal and Signal Groups Signal &#8211; a messaging app similar to Messenger, WhatsApp, SMS, Telegram, Line, KakaoTalk. Nonprofit based in the US. Telegram &#8211; business based in Russia. Others Matrix / Element &#8211; similar to Slack or Discord, but not as smooth. Alternatives to Google Docs CryptPad.fr &#8211; collaborative editing based in France Proton [&#8230;]</p>
<p>The post <a href="https://riceball.com/2025/03/30/getting-off-of-big-tech/">Getting Off of Big Tech</a> first appeared on <a href="https://riceball.com">🍙</a>.</p>]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">Messaging</h2>



<h3 class="wp-block-heading">Signal and Signal Groups</h3>



<p class="wp-block-paragraph"><a href="https://signal.org/download/">Signal</a> &#8211; a messaging app similar to Messenger, WhatsApp, SMS, Telegram, Line, KakaoTalk.  Nonprofit based in the US.</p>



<p class="wp-block-paragraph"><a href="https://telegram.org/">Telegram</a> &#8211; business based in Russia.</p>



<h3 class="wp-block-heading">Others</h3>



<p class="wp-block-paragraph"><a href="https://element.io/">Matrix / Element</a> &#8211; similar to Slack or Discord, but not as smooth. </p>



<h2 class="wp-block-heading">Alternatives to Google Docs</h2>



<p class="wp-block-paragraph"><a href="https://cryptpad.fr/">CryptPad.fr</a> &#8211; collaborative editing based in France</p>



<p class="wp-block-paragraph"><a href="https://pr.tn/ref/K4GDCYHB">Proton Drive, Proton Calendar</a> &#8211; file sharing and calendaring, based in Switzerland. (Affiliate link.)</p>



<p class="wp-block-paragraph">LibreOffice &#8211; this runs on your computer, not on the internet.</p>



<h2 class="wp-block-heading">Surveillance Reduction</h2>



<p class="wp-block-paragraph">Ad Blockers: AdBlock Extension, <a href="https://brave.com/download/">Brave Browser</a></p>



<p class="wp-block-paragraph">VPNs: I have no advice, as I do not use them. I have one included with my Proton suite.</p>



<p class="wp-block-paragraph"><a href="https://www.torproject.org/">Tor Browser</a></p>



<p class="wp-block-paragraph">(Personally, I still use <a href="https://www.mozilla.org/en-US/firefox/new/">Firefox</a>.)</p>



<h2 class="wp-block-heading">Search</h2>



<p class="wp-block-paragraph"><a href="https://duckduckgo.com/">DuckDuckGo</a></p>



<p class="wp-block-paragraph">(Personally, I use Bing, which is Microsoft. It&#8217;s not exiting big tech, but spreading my information away from Google.)</p>



<h2 class="wp-block-heading">Mail</h2>



<p class="wp-block-paragraph"><a href="https://pr.tn/ref/K4GDCYHB">ProtonMail</a>: the legendary one. They also have file sharing and calendaring. Based in Switzerland. (Affiliate Link)</p>



<p class="wp-block-paragraph"><a href="https://support.mozilla.org/en-US/kb/openpgp-thunderbird-howto-and-faq">Thunderbird with PGP</a> &#8211; a desktop email client from Mozilla, the nonprofit that produces Firefox, based in the US</p>



<p class="wp-block-paragraph"><a href="https://www.zoho.com/mail/login.html">ZohoMail</a> &#8211; part of the Zoho suite, based in India.</p>



<h2 class="wp-block-heading">Shopping</h2>



<p class="wp-block-paragraph">Craigslist &#8211; classified ads, and you can do things like porch dropoffs.</p>



<p class="wp-block-paragraph"><a href="https://www.paperbackswap.com/landing/">PaperBackSwap</a> &#8211; a &#8220;credits&#8221; based system where you can get books by paying a small fee per sale, and the postage for outgoing books. The site has a ton of ads, and you are not anoymous.</p>



<h2 class="wp-block-heading">Social Media and Sharing</h2>



<p class="wp-block-paragraph">All social media inherently provides surveillance data, particularly about the cloud of influence a person has. Avoid using it for all your social sharing desires.</p>



<p class="wp-block-paragraph">Find alternative methods that use other technologies, like messengers, mail, and file sharing.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Activity</th><th>Alternative Method</th></tr></thead><tbody><tr><td>Photo sharing</td><td>Messaging groups, email lists, even websites.</td></tr><tr><td>Music playlist sharing</td><td>File sharing</td></tr><tr><td>Home videos</td><td>File sharing</td></tr><tr><td>Social blogging</td><td>A private instance of WordPress, and a feed reader like InnoReader. Or just send a mass email.</td></tr><tr><td>Dating</td><td>???? niche apps?</td></tr><tr><td>Reading News</td><td>Feed readers apps. RSS aggregator sites like <a href="https://externaldocuments.com/feeds/" data-type="page" data-id="6465">this one</a>.</td></tr><tr><td>Events</td><td>Just put the event in your calendar.</td></tr><tr><td></td><td></td></tr></tbody></table></figure>



<h2 class="wp-block-heading"> More Intensive Advice</h2>



<p class="wp-block-paragraph"><a href="https://hackernoon.com/how-to-migrate-out-of-the-big-tech-ecosystem-j4233494">https://hackernoon.com/how-to-migrate-out-of-the-big-tech-ecosystem-j4233494</a></p>



<p class="wp-block-paragraph">Surveillance critic Yasha Levine, author of Surveillance Valley, is lukewarm to Signal, Tor, and other US tech, because some of it took some funding from the US DoD, or is somehow connected with the NSA. I think these are legitimate concerns.</p>



<p class="wp-block-paragraph">What are some big gaps in privacy/security?</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Product or Service</th><th>What&#8217;s bad about it?</th></tr></thead><tbody><tr><td>SMS texting</td><td>Every message is archived by the phone company.</td></tr><tr><td>WhatsApp, Facebook Messenger, Instagram chat</td><td>Meta gets the metadata about who you contact.</td></tr><tr><td>WeChat</td><td></td></tr><tr><td>iMessage, iOS Message</td><td>Apple gets your data if you back up to iCloud.</td></tr><tr><td>Google Chrome</td><td>Google reserves the right to know what you are browsing.</td></tr><tr><td>Google Search, Gmail, Google Workspace</td><td>Obviously, they know you, and know what you are searching for, know your emails, etc.</td></tr><tr><td>Outlook.com, Office 365</td><td>They know you, and know what you are working on.</td></tr><tr><td></td><td></td></tr><tr><td></td><td></td></tr><tr><td></td><td></td></tr></tbody></table></figure><p>The post <a href="https://riceball.com/2025/03/30/getting-off-of-big-tech/">Getting Off of Big Tech</a> first appeared on <a href="https://riceball.com">🍙</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Configuring Regolith i3xrocks</title>
		<link>https://riceball.com/2025/03/17/configuring-regolith-i3xrocks/</link>
					<comments>https://riceball.com/2025/03/17/configuring-regolith-i3xrocks/#respond</comments>
		
		<dc:creator><![CDATA[johnk]]></dc:creator>
		<pubDate>Mon, 17 Mar 2025 01:51:22 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[MINT]]></category>
		<category><![CDATA[Regolith]]></category>
		<guid isPermaLink="false">https://technote.fyi/?p=7531</guid>

					<description><![CDATA[<p>I upgraded my MINT 20 install to MINT 22, and everything ended up a bit of a mess, because so many things were updated. Normally, it&#8217;s easy to figure out the situation, but I couldn&#8217;t find docs to get my Regolith + i3xrocks working right. So here&#8217;s what I&#8217;m doing. First, create .config/regolith3/i3xrocks/conf.d Then, copy [&#8230;]</p>
<p>The post <a href="https://riceball.com/2025/03/17/configuring-regolith-i3xrocks/">Configuring Regolith i3xrocks</a> first appeared on <a href="https://riceball.com">🍙</a>.</p>]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">I upgraded my MINT 20 install to MINT 22, and everything ended up a bit of a mess, because so many things were updated.</p>



<p class="wp-block-paragraph">Normally, it&#8217;s easy to figure out the situation, but I couldn&#8217;t find docs to get my Regolith + i3xrocks working right. So here&#8217;s what I&#8217;m doing.</p>



<p class="wp-block-paragraph">First, create .config/regolith3/i3xrocks/conf.d</p>



<p class="wp-block-paragraph">Then, copy each file you want to alter, from .config/regolith/i3xrocks/conf.d into that directory you just created.</p>



<p class="wp-block-paragraph">If you want to copy them all:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>mkdir -p ~/.config/regolith3/i3xrocks/conf.d
cp /usr/share/i3xrocks/conf.d/* ~/.config/regolith3/i3xrocks/conf.d</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">mkdir</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">p</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">~/</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">config</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">regolith3</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">i3xrocks</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">conf</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">d</span></span>
<span class="line"><span style="color: #D8DEE9">cp</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">usr</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">share</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">i3xrocks</span><span style="color: #81A1C1">/</span><span style="color: #D8DEE9">conf</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">d</span><span style="color: #616E88">/* ~/.config/regolith3/i3xrocks/conf.d</span></span></code></pre></div>



<p class="wp-block-paragraph">Then look at the tail of /var/log/syslog to see the errors.</p>



<p class="wp-block-paragraph">I think the config file format changed, with many values being moved into Xresources.</p>



<h3 class="wp-block-heading">Configuring the i3xrocks time</h3>



<p class="wp-block-paragraph">The following configurations are done via a user&#8217;s local Xresources file.</p>



<p class="wp-block-paragraph">To create the file:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>cd ~/.config
mkdir regolith3; cd regolith3
vi Xresources</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">cd</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">~/</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">config</span></span>
<span class="line"><span style="color: #D8DEE9">mkdir</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">regolith3</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">cd</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">regolith3</span></span>
<span class="line"><span style="color: #D8DEE9">vi</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Xresources</span></span></code></pre></div>



<h4 class="wp-block-heading">Changing the Format</h4>



<p class="wp-block-paragraph">Paste the following into the Xresources file:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>i3xrocks.date.format2: %a %m/%d %I:%M%p</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">i3xrocks</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">date</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">format2</span><span style="color: #D8DEE9FF">: </span><span style="color: #81A1C1">%</span><span style="color: #D8DEE9">a</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">%</span><span style="color: #D8DEE9">m</span><span style="color: #81A1C1">/%</span><span style="color: #D8DEE9">d</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">%</span><span style="color: #D8DEE9FF">I</span><span style="color: #ECEFF4">:</span><span style="color: #81A1C1">%</span><span style="color: #D8DEE9">M</span><span style="color: #81A1C1">%</span><span style="color: #D8DEE9">p</span></span></code></pre></div>



<p class="wp-block-paragraph">Regolith&#8217;s time checks, first, for the Xresources configuration values, then the i3xrocks/conf.d/ config files. So, the Xresources values override the config files.</p>



<h4 class="wp-block-heading">Changing the Click Behavior to Paste the Date into the Clipboard</h4>



<p class="wp-block-paragraph">Paste the following into the Xresources file:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>i3xrocks.action.time: echo -n `date "+%Y-%m-%d"` | xclip -selection clipboard</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9">i3xrocks</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">action</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9">time</span><span style="color: #D8DEE9FF">: </span><span style="color: #D8DEE9">echo</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">n</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">`</span><span style="color: #A3BE8C">date &quot;+%Y-%m-%d&quot;</span><span style="color: #ECEFF4">`</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">|</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">xclip</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9">selection</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">clipboard</span></span></code></pre></div>



<p class="wp-block-paragraph">The default behavior is to open the Settings panel, but that can be overridden by setting i3rocks.action.time to a command that will do what you want.</p>



<p class="wp-block-paragraph">This command runs the date command, so it produces a date formatted like 2026-04-07.</p>



<p class="wp-block-paragraph">The echo -n command strips the trailing newline.</p>



<p class="wp-block-paragraph">xclip normally gets the string stdin, and puts it into the X clipboard. The &#8220;-selection clipboard&#8221; tells it to use the system clipboard, which is what GNOME uses.</p><p>The post <a href="https://riceball.com/2025/03/17/configuring-regolith-i3xrocks/">Configuring Regolith i3xrocks</a> first appeared on <a href="https://riceball.com">🍙</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://riceball.com/2025/03/17/configuring-regolith-i3xrocks/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Cascading Failures Due to Failing RAID1 on Linux</title>
		<link>https://riceball.com/2024/08/28/cascading-failures-due-to-failing-raid1-on-linux/</link>
		
		<dc:creator><![CDATA[johnk]]></dc:creator>
		<pubDate>Wed, 28 Aug 2024 10:24:18 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Linux]]></category>
		<guid isPermaLink="false">https://technote.fyi/?p=7417</guid>

					<description><![CDATA[<p>I recently had a partial server outage due to a failing RAID, but the problems were due to a cascade of software-based dependencies failing. I had a damage RAID1 array, and it resulted in a bootable system that would not run my software stack, rendering the server dead to most of the world. I run [&#8230;]</p>
<p>The post <a href="https://riceball.com/2024/08/28/cascading-failures-due-to-failing-raid1-on-linux/">Cascading Failures Due to Failing RAID1 on Linux</a> first appeared on <a href="https://riceball.com">🍙</a>.</p>]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">I recently had a partial server outage due to a failing RAID, but the problems were due to a cascade of software-based dependencies failing.</p>



<span id="more-21457"></span>



<p class="wp-block-paragraph">I had a damage RAID1 array, and it resulted in a bootable system that would not run my software stack, rendering the server dead to most of the world.</p>



<p class="wp-block-paragraph">I run some websites in Docker containers, on an Ubuntu server. The server runs LVM on top of software raid (mdadm).</p>



<p class="wp-block-paragraph">One day, it just wouldn&#8217;t start the containers. It complained that the overlay driver wasn&#8217;t available.</p>



<p class="wp-block-paragraph">It turned out that the server was running an old kernel, which was a kind of failsafe kernel. It wouldn&#8217;t load the current &#8220;overlay&#8221; kernel modules because they were a different format. </p>



<p class="wp-block-paragraph">GRUB had chosen that failsafe kernel.</p>



<p class="wp-block-paragraph">Why? Because the past two kernel packages didn&#8217;t install correctly. They installed, but couldn&#8217;t produce a good initramdisk (initial ramdisk for booting).</p>



<p class="wp-block-paragraph">This was because the failing RAID was causing a problem, manifesting as unavailable files during the initramdisk image creation. (The RAID contained a boot partition that was mounted at /boot. This way, the boot partition is mirrored, and bootable on both disks.)</p>



<p class="wp-block-paragraph">I also had a problem with a swap partition on the disk, because it was having bad reads. The system took this swap partition offline. I think it also <a href="https://stackoverflow.com/questions/10603104/the-difference-between-initrd-and-initramfs">caused problems during ramfs creation</a>.</p>



<p class="wp-block-paragraph">According to what I read, if the RAID could be re-synced, the files problem would  go away, and the kernel packages could be reinstalled, and all would be good. I re-added the disk to the array. (Really, readded the partition to the mirror.)</p>



<p class="wp-block-paragraph">The problem was, the disks were damaged enough that they caused problems. After syncing, they developed bad blocks, again.</p>



<p class="wp-block-paragraph">(The good news is, it didn&#8217;t seem to affect the file data. Hurrah for RAID1.)</p>



<p class="wp-block-paragraph">My fix was to install new disks. </p>



<h2 class="wp-block-heading">Linux Rocks</h2>



<p class="wp-block-paragraph">I drove to the computer. I removed the failing disk, and put a new one in. It was pre-partitoned similar to the original disk, but with larger partitions.</p>



<p class="wp-block-paragraph">I rebooted the computer, and this time around, I guess the kernel reinstall got farther, because the computer wouldn&#8217;t get past GRUB. So I booted from a USB live bootdisk/installer.</p>



<p class="wp-block-paragraph">The system saw the new partitions. I added it to the mirror. md immediately started to resync with the functional disk.</p>



<p class="wp-block-paragraph">It took around 90 minutes to sync 500GB.</p>



<p class="wp-block-paragraph">I re-installed the kernel, but got an error message about nonexistent swap partition.</p>



<p class="wp-block-paragraph">I re-enabled the swap partition on the new disk. (It has a useful option to set the disk UUID. With that, I don&#8217;t need to edit the /etc/fstab file, or mess with the kernel package&#8217;s installer&#8217;s options.)</p>



<p class="wp-block-paragraph">Re-installing the kernel, and the kernel modules, went smoothly after that.</p>



<p class="wp-block-paragraph">I rebooted, and it worked.</p>



<p class="wp-block-paragraph">I repeated the removal and reinstallation process with the second disk. Again, it went smoothly, syncing in under 40 minutes.</p>



<p class="wp-block-paragraph">At the end of the repair, I had a server with 2TB disks in a RAID1 array.</p>



<p class="wp-block-paragraph"><strong>I considered the repair complete!</strong></p>



<p class="wp-block-paragraph">So, while the system was offline a long time, data wasn&#8217;t lost. It could have been worse.</p>



<h2 class="wp-block-heading">Why Isn&#8217;t the Space Available?</h2>



<p class="wp-block-paragraph">It&#8217;s complicated, because there are a few layers to the system, and each needs to be resized.</p>



<p class="wp-block-paragraph">The bottom layer is the <strong>partition</strong>. Though it&#8217;s called &#8220;RAID&#8221;, where the &#8220;D&#8221; means disks, Linux software raid is mirroring a partition on my disk, creating an <strong>array</strong>.</p>



<p class="wp-block-paragraph">Then, the <strong>array</strong> needs to be enlarged, so all the new blocks in the new partition get mirrored.</p>



<p class="wp-block-paragraph">Then, the <strong>partition in the array</strong> needs to be resized, to use the new blocks.</p>



<p class="wp-block-paragraph">Then, the LVM <strong>physical volume</strong> needs to be enlarged, to use up the entire <strong>partition in the array</strong>. (LVM doesn&#8217;t automatically use all the space.)</p>



<p class="wp-block-paragraph">Then, the LVM <strong>logical volume</strong>, needs to be enlarged, to use the available space on the physical volume, or more volumes created, to be mounted in the filesystem.</p>



<p class="wp-block-paragraph">Then, the <strong>file system</strong> in the logical volume must be enlarged, to make the space available to users.</p>



<p class="wp-block-paragraph">I&#8217;ll train to do this, and then do it. I&#8217;ll practice on a regular external disk on my laptop.</p>



<h2 class="wp-block-heading">Resizing /boot</h2>



<p class="wp-block-paragraph">I am finding myself in a weird conundrum. I cannot resize the 500MB boot partition to something more appropriate for 2024, like 4GB. </p>



<p class="wp-block-paragraph">That&#8217;s because the boot partition is mirrored. I cannot move partitions inside the array. They can be grown into the new space, but I can&#8217;t take some of that new space, and give it to the boot partition.</p>



<p class="wp-block-paragraph">The partition must be a regular partition within the array, because the bootloader requires that.</p>



<p class="wp-block-paragraph">I think that I could use another disk and LVM to mirror data, and alter the partitions in the array, then restore the data.</p>



<p class="wp-block-paragraph">This all sounds pretty complicated, and it&#8217;s probably safer to build a completely separate array on two new disks, partition it in the desired sizes, and copy the data over, and then set the system to boot from the new partition.</p>



<p class="wp-block-paragraph"><strong>The <em>most realistic</em> solution is to build a completely new server</strong>, get it booting correctly, using current best practices, using <a href="https://en.wikipedia.org/wiki/UEFI">UEFI boot</a>. Then, improve on the existing file system arrangement*, and copy the data over. While this sounds drastic, it&#8217;s not: the disks on my server were last formatted in 2016, and it&#8217;s now 2024. The disks lasted 8 years. The market value of the server, which I paid 350 for, without good disks, was now around 150.</p>



<p class="wp-block-paragraph">The server is fast and functional, but obsolete, and increasingly at risk of failure.</p>



<h3 class="wp-block-heading">Leaving BIOS/MBR</h3>



<p class="wp-block-paragraph">The boot partition on my server, in a way, is more like &#8220;hardware&#8221; than the code in the rest of the system, because it&#8217;s the old <a href="https://askubuntu.com/questions/500359/efi-boot-partition-and-biosgrub-partition">MSDOS style BIOS and MBR boot sequence</a>.</p>



<p class="wp-block-paragraph">The current boot sequence is roughly: BIOS -&gt; MBR -&gt; GRUB -&gt; /boot partition in array loads kernel.</p>



<p class="wp-block-paragraph">The disk is using the old MSDOS partition table. The MBR is the first sector. GRUB is in empty sectors after the MBR. The /boot file system must be reachable by GRUB, to boot the initrd ramdisk, and then the kernel. So a partition is created (in /dev/md) for /boot, to keep that sector down in the lower part of the disk, in a legacy ext2 filesystem.</p>



<p class="wp-block-paragraph">The <a href="https://awwkl.github.io/linux_illustrated/boot/boot_UEFI.html">new server&#8217;s boot sequence</a> would be: EFI Boot Menu -&gt; UEFI GRUB Linux bootloader -&gt; /boot directory in main file partition.</p>



<p class="wp-block-paragraph">The EFI boot is done from a EFI System Partition, a small partition with a MSDOS fat file system, that contains bootloaders for different operating systems. EFI boot can work with GPT partition tables, and can address disks larger than 2TB, with many partitions. So you don&#8217;t need a boot partition. I might still make a boot partition, however, so it can use an ext2 filesystem.</p>



<h2 class="wp-block-heading">* Improving on the File System</h2>



<p class="wp-block-paragraph">LVM opens up possibilities for better backups, by using <a href="https://serverfault.com/questions/1146796/how-to-migrate-logical-volume-manager-lvm-configuration-to-a-new-drive">LVM tools to clone volumes</a>.</p>



<p class="wp-block-paragraph">For these kinds of backups to be practical, they need to be fast and small. Your file system can be sharded into application-specific logical volumes.</p>



<h2 class="wp-block-heading">Why Didn&#8217;t I Catch This?</h2>



<p class="wp-block-paragraph">I was using smartctl to look at the disk health. I&#8217;d log in, look at the disks.</p>



<p class="wp-block-paragraph">There were two remapped sectors on the failing disk.</p>



<p class="wp-block-paragraph">I didn&#8217;t think that was too serious. </p>



<p class="wp-block-paragraph">Had I been using the mdadm monitoring tools, I would have gotten earlier warning about disk problems.</p>



<p class="wp-block-paragraph">I should have learned those tools, and set them up to notify me of problems.</p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"></p><p>The post <a href="https://riceball.com/2024/08/28/cascading-failures-due-to-failing-raid1-on-linux/">Cascading Failures Due to Failing RAID1 on Linux</a> first appeared on <a href="https://riceball.com">🍙</a>.</p>]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
