<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[The Experimentalist: The Laboratory]]></title><description><![CDATA[Turn curiosity into mastery. This series walks you through setting up a personal lab environment for deep, hands-on learning that covers everything from essential tools and workflows to hosting and fine-tuning your own LLMs.]]></description><link>https://substack.the-experimentalist.com/s/the-laboratory</link><image><url>https://substackcdn.com/image/fetch/$s_!0yut!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba6cba4c-0a9a-477b-a6d1-af81556e2fa5_1280x1280.png</url><title>The Experimentalist: The Laboratory</title><link>https://substack.the-experimentalist.com/s/the-laboratory</link></image><generator>Substack</generator><lastBuildDate>Wed, 08 Apr 2026 07:44:02 GMT</lastBuildDate><atom:link href="https://substack.the-experimentalist.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[CodeKami Consulting LLC]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[rmpinchback@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[rmpinchback@substack.com]]></itunes:email><itunes:name><![CDATA[Reid M. Pinchback]]></itunes:name></itunes:owner><itunes:author><![CDATA[Reid M. Pinchback]]></itunes:author><googleplay:owner><![CDATA[rmpinchback@substack.com]]></googleplay:owner><googleplay:email><![CDATA[rmpinchback@substack.com]]></googleplay:email><googleplay:author><![CDATA[Reid M. Pinchback]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Phase 1: Credentials Management and Bootstrapping]]></title><description><![CDATA[Bootstrapping a little security into the new experimental platform]]></description><link>https://substack.the-experimentalist.com/p/phase-1-credentials-management-and-bootstrapping</link><guid isPermaLink="false">https://substack.the-experimentalist.com/p/phase-1-credentials-management-and-bootstrapping</guid><dc:creator><![CDATA[Reid M. Pinchback]]></dc:creator><pubDate>Wed, 13 Aug 2025 18:16:26 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!epao!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80c2175c-fe31-4cbf-9fb7-0ebe4e11f6e8_781x641.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!epao!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80c2175c-fe31-4cbf-9fb7-0ebe4e11f6e8_781x641.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!epao!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80c2175c-fe31-4cbf-9fb7-0ebe4e11f6e8_781x641.png 424w, https://substackcdn.com/image/fetch/$s_!epao!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80c2175c-fe31-4cbf-9fb7-0ebe4e11f6e8_781x641.png 848w, https://substackcdn.com/image/fetch/$s_!epao!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80c2175c-fe31-4cbf-9fb7-0ebe4e11f6e8_781x641.png 1272w, https://substackcdn.com/image/fetch/$s_!epao!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80c2175c-fe31-4cbf-9fb7-0ebe4e11f6e8_781x641.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!epao!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80c2175c-fe31-4cbf-9fb7-0ebe4e11f6e8_781x641.png" width="781" height="641" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/80c2175c-fe31-4cbf-9fb7-0ebe4e11f6e8_781x641.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:641,&quot;width&quot;:781,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:152750,&quot;alt&quot;:&quot;Block diagram of the Experimentalist Laboratory&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://substack.the-experimentalist.com/i/170849842?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80c2175c-fe31-4cbf-9fb7-0ebe4e11f6e8_781x641.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Block diagram of the Experimentalist Laboratory" title="Block diagram of the Experimentalist Laboratory" srcset="https://substackcdn.com/image/fetch/$s_!epao!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80c2175c-fe31-4cbf-9fb7-0ebe4e11f6e8_781x641.png 424w, https://substackcdn.com/image/fetch/$s_!epao!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80c2175c-fe31-4cbf-9fb7-0ebe4e11f6e8_781x641.png 848w, https://substackcdn.com/image/fetch/$s_!epao!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80c2175c-fe31-4cbf-9fb7-0ebe4e11f6e8_781x641.png 1272w, https://substackcdn.com/image/fetch/$s_!epao!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80c2175c-fe31-4cbf-9fb7-0ebe4e11f6e8_781x641.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>When you first start setting up the compute nodes you may have no meaningful infrastructure in place. There are steps to the sequence of bootstrapping from nothing and ending up with the nodes in a consistent state. You won&#8217;t be able to use PXE to do network-based installations. You also won&#8217;t have anything like an LDAP server to integrate via PAM to handle server authentication and authorization. Down the road maybe, but on day one, no.</p><div><hr></div><p><strong>Prev:</strong> <strong><a href="https://substack.the-experimentalist.com/p/phase-1-just-a-bunch-of-storage">Phase 1: Just a Bunch of Storage</a></strong></p><div><hr></div><p>When you begin the process you&#8217;ll have placed a bootable ISO image on a USB drive for the operating system you&#8217;ve chosen. I would recommend preparing a second USB drive with any firmware updates your particular compute node hardware model may be due. Update the firmware first, and then install the O/S via the ISO image. If you want to be extra careful, make sure you have a copy of the existing firmware version before performing the update, in case you have to revert to your starting point.</p><p>Make life easier on yourself and put some visible external labels on those USB sticks. If you have multiple compute nodes to set up, you&#8217;ll be following the same process over and over. Start taking notes as you go through the setup the first time.</p><p>As the installer runs you&#8217;ll be asked a number of questions. Some will relate to disk partitioning, for which <a href="https://substack.the-experimentalist.com/p/phase-1-just-a-bunch-of-storage">the previous article</a> will give you guidance. A few will relate to specifying a non-root user, to complement the root user which is always installed. Once the installation completes, you have the starting point from which you need to bootstrap a little security.</p><p>The initial security work won&#8217;t be all you&#8217;ll ever want to do, not by a long shot, but you need a baseline that will support routine remote access and running Infrastructure as Code (IaC) jobs that will progressively establish the full functionality of your platform. The first pass is only what you can&#8217;t or shouldn&#8217;t avoid. It is not enough to consider the environment as being secure. You&#8217;re establishing connectivity, and as part of that connectivity you will need credentials to support authentication.</p><h2>Managing Credentials</h2><p>Credentials like SSH keys, TLS certificates, and GPG keys become your first intellectual property assets that you don&#8217;t want to lose. The point of them is that you should be unable to perform operations or connect to systems that use those credentials to control access or certify identity. The more secure your platform, the harder it would be to recover functionality if those credentials were lost.</p><p>Preserving credentials is one area of functionality for which you should consider using a remote service vendor. Any passwords, keys, and certificates should be immediately preserved in the remote service. Assuming you are doing your cluster work as a solo experimenter, you won&#8217;t need to care about establishing any kind of-group permission structure, which will make things easier.</p><p>Credential automation is much tougher, and for &#8220;Phase 1&#8221; you probably need to be realistic about how much of that you can pull off. As an example I only know of one remote credential manager that has substantial Linux Pluggable Authentication Module (PAM) support &#8212; <a href="https://www.keepersecurity.com/">Keeper Security</a> &#8212; and largely that is to use their Privileged Access Management product. Yes, I know, two entirely different uses of the acronym PAM, as if computer security wasn&#8217;t a strange enough world. I haven&#8217;t worked with Keeper myself, but from what I can tell the functionality somewhat overlaps on LDAP.</p><h2>The Bootstrapping</h2><p>My initial &#8220;good enough for now&#8221; bootstrapping is to use Bash scripts that I run on each compute node after the O/S install finishes. The complete process looks like:</p><ol><li><p>Attach a monitor and keyboard to the uninitialized box.</p></li><li><p>Install the firmware USB, boot the box, then install any firmware.</p></li><li><p>Install the ISO image USB, boot the box again, then install the O/S (which will request the password for the non-root user it creates).</p></li><li><p>On whatever host you use for other work, such as your laptop, create an SSH key pair that will be used for authenticating as that user. Since &#8220;you&#8221; are &#8220;you&#8221; all the time, you use the same key pair for all the compute nodes. NOTE AGAIN, this is not a final security posture for the cluster, we&#8217;re just bootstrapping.</p></li><li><p>Save both halves of the SSH key to the remote vendor service you selected for preserving credentials, so you don&#8217;t lose them.</p></li><li><p>Configure your network router to recognize the MAC address for the new box and assign a static IP. You aren&#8217;t running a big company, I wouldn&#8217;t sweat DHCP for the experimentation platform until you find you need it, particularly since <strong>ssh</strong> would complain on every change to an IP address.</p></li><li><p>Using your working (e.g. laptop) host, connect remotely to the compute node via that static IP to supply the user and password. These are the non-root credentials you specified when the O/S was installing.</p></li><li><p>Copy-paste the bootstrapping Bash script that configures the user account.</p></li><li><p>Run the script. You should have designed it to ask you for the public half of the SSH key pair you created, which it will install in <strong>~/.ssh</strong> and update <strong>~/.ssh/authorized_keys</strong> to know about the new key.</p></li><li><p>If you have root-level changes to make (e.g. to configure <strong>sshd</strong> and <strong>sudo</strong>), copy-paste the Bash script for that.</p></li><li><p>Run the second script via <strong>sudo</strong>.</p></li><li><p>Don&#8217;t <strong>logout</strong> yet, but start a second terminal session and verify that you can login. If not, you have a mistake somewhere and you want to get that fixed before you lose viable access (else you may have to install the node from scratch).</p></li><li><p>As a final step I would recommend completely power-cycling the node. If you&#8217;re going to have any problems, you may as well find out now.</p></li></ol><p>There are assorted refinements you can make to the instructions above, like:</p><ul><li><p>Remove password access to an account once the public SSH key is in place.</p></li><li><p>Have separate accounts for human-user access versus automation-user access (a need that will become clearer in a future article).</p></li><li><p>Ensure the <strong>~/.ssh</strong> directory and file permissions meet the requirements that <strong>sshd</strong> will enforce.</p></li><li><p>Inform the compute node of its intended host name, as it probably won&#8217;t pick that up from the router.</p></li><li><p>Make the script behaviors idempotent so that re-running them isn&#8217;t harmful. Until you&#8217;ve going through the process a couple of times you&#8217;ll keep adding tweaks as you figure out exactly what bootstrap steps you need.</p></li></ul><p>The options are only constrained by your Bash skills. Later on we&#8217;ll be doing proper IaC automation, so the primary purpose of any bootstrapping is to get us just to that stage.</p><h2>Script Samples</h2><p>My own bootstrapping is split into files for particular features, which currently are all for Ubuntu 22.04. Here is an example for ensuring <strong>git</strong> is installed:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!sBYT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffd51a65-a52f-4ce1-abb6-0dc9003856b6_1214x922.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!sBYT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffd51a65-a52f-4ce1-abb6-0dc9003856b6_1214x922.png 424w, https://substackcdn.com/image/fetch/$s_!sBYT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffd51a65-a52f-4ce1-abb6-0dc9003856b6_1214x922.png 848w, https://substackcdn.com/image/fetch/$s_!sBYT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffd51a65-a52f-4ce1-abb6-0dc9003856b6_1214x922.png 1272w, https://substackcdn.com/image/fetch/$s_!sBYT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffd51a65-a52f-4ce1-abb6-0dc9003856b6_1214x922.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!sBYT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffd51a65-a52f-4ce1-abb6-0dc9003856b6_1214x922.png" width="1214" height="922" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ffd51a65-a52f-4ce1-abb6-0dc9003856b6_1214x922.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:922,&quot;width&quot;:1214,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:135727,&quot;alt&quot;:&quot;script for git install function&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://substack.the-experimentalist.com/i/170849842?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffd51a65-a52f-4ce1-abb6-0dc9003856b6_1214x922.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="script for git install function" title="script for git install function" srcset="https://substackcdn.com/image/fetch/$s_!sBYT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffd51a65-a52f-4ce1-abb6-0dc9003856b6_1214x922.png 424w, https://substackcdn.com/image/fetch/$s_!sBYT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffd51a65-a52f-4ce1-abb6-0dc9003856b6_1214x922.png 848w, https://substackcdn.com/image/fetch/$s_!sBYT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffd51a65-a52f-4ce1-abb6-0dc9003856b6_1214x922.png 1272w, https://substackcdn.com/image/fetch/$s_!sBYT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fffd51a65-a52f-4ce1-abb6-0dc9003856b6_1214x922.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>and to install pip for Python 3 (which isn&#8217;t automatically installed on Ubuntu 22.04):</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!d07E!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F133ed59b-a3ea-44ce-a92d-67f66ee7c907_1434x922.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!d07E!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F133ed59b-a3ea-44ce-a92d-67f66ee7c907_1434x922.png 424w, https://substackcdn.com/image/fetch/$s_!d07E!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F133ed59b-a3ea-44ce-a92d-67f66ee7c907_1434x922.png 848w, https://substackcdn.com/image/fetch/$s_!d07E!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F133ed59b-a3ea-44ce-a92d-67f66ee7c907_1434x922.png 1272w, https://substackcdn.com/image/fetch/$s_!d07E!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F133ed59b-a3ea-44ce-a92d-67f66ee7c907_1434x922.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!d07E!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F133ed59b-a3ea-44ce-a92d-67f66ee7c907_1434x922.png" width="1434" height="922" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/133ed59b-a3ea-44ce-a92d-67f66ee7c907_1434x922.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:922,&quot;width&quot;:1434,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:146910,&quot;alt&quot;:&quot;script for pip3 install function&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://substack.the-experimentalist.com/i/170849842?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F133ed59b-a3ea-44ce-a92d-67f66ee7c907_1434x922.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="script for pip3 install function" title="script for pip3 install function" srcset="https://substackcdn.com/image/fetch/$s_!d07E!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F133ed59b-a3ea-44ce-a92d-67f66ee7c907_1434x922.png 424w, https://substackcdn.com/image/fetch/$s_!d07E!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F133ed59b-a3ea-44ce-a92d-67f66ee7c907_1434x922.png 848w, https://substackcdn.com/image/fetch/$s_!d07E!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F133ed59b-a3ea-44ce-a92d-67f66ee7c907_1434x922.png 1272w, https://substackcdn.com/image/fetch/$s_!d07E!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F133ed59b-a3ea-44ce-a92d-67f66ee7c907_1434x922.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>and to upgrade the Ansible installation (the default for Ubuntu 22.04 is ancient):</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!sc9S!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabae3632-17a3-4c61-8ce0-2e546f3feb5d_2048x2484.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!sc9S!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabae3632-17a3-4c61-8ce0-2e546f3feb5d_2048x2484.png 424w, https://substackcdn.com/image/fetch/$s_!sc9S!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabae3632-17a3-4c61-8ce0-2e546f3feb5d_2048x2484.png 848w, https://substackcdn.com/image/fetch/$s_!sc9S!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabae3632-17a3-4c61-8ce0-2e546f3feb5d_2048x2484.png 1272w, https://substackcdn.com/image/fetch/$s_!sc9S!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabae3632-17a3-4c61-8ce0-2e546f3feb5d_2048x2484.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!sc9S!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabae3632-17a3-4c61-8ce0-2e546f3feb5d_2048x2484.png" width="1456" height="1766" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/abae3632-17a3-4c61-8ce0-2e546f3feb5d_2048x2484.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1766,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:579888,&quot;alt&quot;:&quot;script for ansible update function&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://substack.the-experimentalist.com/i/170849842?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabae3632-17a3-4c61-8ce0-2e546f3feb5d_2048x2484.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="script for ansible update function" title="script for ansible update function" srcset="https://substackcdn.com/image/fetch/$s_!sc9S!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabae3632-17a3-4c61-8ce0-2e546f3feb5d_2048x2484.png 424w, https://substackcdn.com/image/fetch/$s_!sc9S!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabae3632-17a3-4c61-8ce0-2e546f3feb5d_2048x2484.png 848w, https://substackcdn.com/image/fetch/$s_!sc9S!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabae3632-17a3-4c61-8ce0-2e546f3feb5d_2048x2484.png 1272w, https://substackcdn.com/image/fetch/$s_!sc9S!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fabae3632-17a3-4c61-8ce0-2e546f3feb5d_2048x2484.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I like putting each feature function in a separate script, because then within a user or root bootstrapping script all I need is:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!OEaT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd35c18bc-37a4-4be0-ab57-345835b0b68b_1316x602.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!OEaT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd35c18bc-37a4-4be0-ab57-345835b0b68b_1316x602.png 424w, https://substackcdn.com/image/fetch/$s_!OEaT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd35c18bc-37a4-4be0-ab57-345835b0b68b_1316x602.png 848w, https://substackcdn.com/image/fetch/$s_!OEaT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd35c18bc-37a4-4be0-ab57-345835b0b68b_1316x602.png 1272w, https://substackcdn.com/image/fetch/$s_!OEaT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd35c18bc-37a4-4be0-ab57-345835b0b68b_1316x602.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!OEaT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd35c18bc-37a4-4be0-ab57-345835b0b68b_1316x602.png" width="1316" height="602" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d35c18bc-37a4-4be0-ab57-345835b0b68b_1316x602.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:602,&quot;width&quot;:1316,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:91057,&quot;alt&quot;:&quot;script for bootstrap that loads functions&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://substack.the-experimentalist.com/i/170849842?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd35c18bc-37a4-4be0-ab57-345835b0b68b_1316x602.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="script for bootstrap that loads functions" title="script for bootstrap that loads functions" srcset="https://substackcdn.com/image/fetch/$s_!OEaT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd35c18bc-37a4-4be0-ab57-345835b0b68b_1316x602.png 424w, https://substackcdn.com/image/fetch/$s_!OEaT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd35c18bc-37a4-4be0-ab57-345835b0b68b_1316x602.png 848w, https://substackcdn.com/image/fetch/$s_!OEaT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd35c18bc-37a4-4be0-ab57-345835b0b68b_1316x602.png 1272w, https://substackcdn.com/image/fetch/$s_!OEaT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd35c18bc-37a4-4be0-ab57-345835b0b68b_1316x602.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>and then I can invoke the functions that make sense for either a non-root or a root user. The function files are just functions so they don&#8217;t take action until they are explicitly called.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://substack.the-experimentalist.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">The Experimentalist is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p><a href="https://substack.the-experimentalist.com/p/phase-1-credentials-management-and-bootstrapping">The Experimentalist : Phase 1: Credentials Management and Bootstrapping</a> &#169; 2025 by <a href="https://www.linkedin.com/in/reidmpinchback/">Reid M. Pinchback</a> is licensed under <a href="https://creativecommons.org/licenses/by-sa/4.0/">CC BY-SA 4.0</a></p>]]></content:encoded></item><item><title><![CDATA[Phase 1: Just a Bunch of Storage]]></title><description><![CDATA[Experimentation laboratories need operational and data store capacity]]></description><link>https://substack.the-experimentalist.com/p/phase-1-just-a-bunch-of-storage</link><guid isPermaLink="false">https://substack.the-experimentalist.com/p/phase-1-just-a-bunch-of-storage</guid><dc:creator><![CDATA[Reid M. Pinchback]]></dc:creator><pubDate>Tue, 12 Aug 2025 22:54:38 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Sc7G!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde50c832-5a42-4bfa-a32f-90e530309c77_781x641.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Sc7G!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde50c832-5a42-4bfa-a32f-90e530309c77_781x641.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Sc7G!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde50c832-5a42-4bfa-a32f-90e530309c77_781x641.png 424w, https://substackcdn.com/image/fetch/$s_!Sc7G!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde50c832-5a42-4bfa-a32f-90e530309c77_781x641.png 848w, https://substackcdn.com/image/fetch/$s_!Sc7G!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde50c832-5a42-4bfa-a32f-90e530309c77_781x641.png 1272w, https://substackcdn.com/image/fetch/$s_!Sc7G!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde50c832-5a42-4bfa-a32f-90e530309c77_781x641.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Sc7G!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde50c832-5a42-4bfa-a32f-90e530309c77_781x641.png" width="781" height="641" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/de50c832-5a42-4bfa-a32f-90e530309c77_781x641.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:641,&quot;width&quot;:781,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:132309,&quot;alt&quot;:&quot;Block diagram of the Experimentalist Laboratory&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://substack.the-experimentalist.com/i/170808266?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde50c832-5a42-4bfa-a32f-90e530309c77_781x641.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Block diagram of the Experimentalist Laboratory" title="Block diagram of the Experimentalist Laboratory" srcset="https://substackcdn.com/image/fetch/$s_!Sc7G!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde50c832-5a42-4bfa-a32f-90e530309c77_781x641.png 424w, https://substackcdn.com/image/fetch/$s_!Sc7G!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde50c832-5a42-4bfa-a32f-90e530309c77_781x641.png 848w, https://substackcdn.com/image/fetch/$s_!Sc7G!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde50c832-5a42-4bfa-a32f-90e530309c77_781x641.png 1272w, https://substackcdn.com/image/fetch/$s_!Sc7G!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fde50c832-5a42-4bfa-a32f-90e530309c77_781x641.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Planning for storage in your newly-constructed lab has several elements to it:</p><ul><li><p>Hardware considerations.</p></li><li><p>Filesystem considerations.</p></li><li><p>Use-case considerations.</p></li></ul><div><hr></div><p><strong>Prev:</strong> <strong><a href="https://substack.the-experimentalist.com/p/phase-1-just-a-bunch-of-compute">Phase 1: Just a Bunch of Compute</a> | Next: <a href="https://substack.the-experimentalist.com/p/phase-1-credentials-management-and-bootstrapping">Phase 1: Credentials Management and Bootstrapping</a></strong></p><div><hr></div><p>First a little terminology:</p><ul><li><p><strong>Drive:</strong> a physical device you buy and mount in or attach to a computing node.</p></li><li><p><strong>Partition:</strong> a subdivision of the space available on the drive. There are two partitioning approaches, with GUID Partition Table (GPT) being what you&#8217;ll usually see, but Master Boot Record (MBR) partitions may exist on older systems. When picking compute nodes to buy, I would suggest not getting anything so old it doesn&#8217;t support UEFI, and any UEFI system should allow GPT. GPT gives you more flexibility on partition creation and supports larger drives.</p></li><li><p><strong>Volume:</strong> a logical construct that presents available storage space to the operating system. Historically a volume usually fit within a partition, but Logical Volume Management (LVM) can present a volume that spans partitions and drives. It does this in terms of &#8220;extents,&#8221; which it uses to associate physical to logical storage.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!q5Yp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99cf2b83-9794-4f01-8816-76b3977f92af_811x581.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!q5Yp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99cf2b83-9794-4f01-8816-76b3977f92af_811x581.png 424w, https://substackcdn.com/image/fetch/$s_!q5Yp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99cf2b83-9794-4f01-8816-76b3977f92af_811x581.png 848w, https://substackcdn.com/image/fetch/$s_!q5Yp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99cf2b83-9794-4f01-8816-76b3977f92af_811x581.png 1272w, https://substackcdn.com/image/fetch/$s_!q5Yp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99cf2b83-9794-4f01-8816-76b3977f92af_811x581.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!q5Yp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99cf2b83-9794-4f01-8816-76b3977f92af_811x581.png" width="811" height="581" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/99cf2b83-9794-4f01-8816-76b3977f92af_811x581.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:581,&quot;width&quot;:811,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:107674,&quot;alt&quot;:&quot;Disk vs Partition vs Volume for storage&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://substack.the-experimentalist.com/i/170808266?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99cf2b83-9794-4f01-8816-76b3977f92af_811x581.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Disk vs Partition vs Volume for storage" title="Disk vs Partition vs Volume for storage" srcset="https://substackcdn.com/image/fetch/$s_!q5Yp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99cf2b83-9794-4f01-8816-76b3977f92af_811x581.png 424w, https://substackcdn.com/image/fetch/$s_!q5Yp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99cf2b83-9794-4f01-8816-76b3977f92af_811x581.png 848w, https://substackcdn.com/image/fetch/$s_!q5Yp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99cf2b83-9794-4f01-8816-76b3977f92af_811x581.png 1272w, https://substackcdn.com/image/fetch/$s_!q5Yp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F99cf2b83-9794-4f01-8816-76b3977f92af_811x581.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>There is some hand-waving simplification in those explanations as partitions can be primary, extended, or logical, but those distinctions apply to using MBR.</p><h2>Local Physical Storage Use Cases</h2><p>Each compute node will have storage needs to account for. For simplicity I&#8217;ll assume a Linux variant is your goal.</p><ul><li><p><strong>EFI System Partition (ESP):</strong> This provides space for boot loaders and kernel images. I plan a 1/4gb for this, but if you knew you intended to do a lot of experimenting with different kernels you could make it bigger to house more kernel images.</p></li><li><p><strong>Swap Partition:</strong> You may read online content or hear discussions that advocate against swap due to performance concerns. As a database guy there are reasons why I disagree with the position. You don&#8217;t have to allocate a physical partition as you can add swap files later. I prefer to allocate the partition and size it according to the amount of RAM I installed on the compute node. You could use a smaller amount, but the less you allocate the more you need monitoring on swap activity, which is a discussion for future articles. Obviously if you have more than 64gb of RAM, you won&#8217;t want to size swap as the entire memory footprint unless you have a strong reason to support a virtual memory space that large.</p></li><li><p><strong>Root Partition:</strong> This will contain the volume that the boot loader establishes as your running root filesystem. When you size this allow for the fact that package updates, run-time log files, applications, and the runtime needs of those applications will all require storage.</p></li><li><p><strong>Other Linux Partitions:</strong> While not required, you may decide that for system stability you want some of the application, app data, and logging activity go to a separate physical partition. That would ensure the O/S itself doesn&#8217;t fall over due to the root partition filling up. The likely mount points for a volume would be <strong>/var</strong> or <strong>/opt</strong>. If you want both in a common partition, LVM can achieve that.</p></li></ul><ul><li><p><strong>Maintenance Partition:</strong> Depending on the BIOS features, I&#8217;ve found it handy to add a small additional partition to write to. Sometimes when working in the BIOS you can record configuration snapshot images to remember what you changed. This relates to the <a href="https://substack.the-experimentalist.com/p/phase-1-just-a-bunch-of-compute">&#8220;Make notes and take pictures&#8220; advice from the previous article</a>. When you set up many nodes, sometimes one or two will not behave consistently with the others, and knowing your BIOS setup without having to boot into it can be useful. Maybe give it 1-2 gig if your BIOS saves config snapshots as actual image-formatted (e.g. BMP, PNG) files. You may find that this needs to be formatted as FAT32, which will be reported by &#8220;<strong>fsdisk -f</strong>&#8221; on a UEFI/GPT setup as &#8220;Microsoft basic data.&#8221;</p></li><li><p><strong>Data Partitions:</strong> If you know you&#8217;ll be working with large volumes of data, it is worth planning data partitions. By having separate data partitions you protect the O/S from data filling up the root filesystem. It&#8217;s also the usage pattern that may later motivate you to add additional or replace with larger drives. It&#8217;s less disruptive to do that with clearly-segregated data than it usually is for a large filesystem muddling everything together.</p></li></ul><p>An obvious question is whether all these partitions should be on the same drive or across multiple drives. This mostly relates to the root filesystem versus everything else, although for database purists there are other scenarios.</p><p>The most direct reason for multiple drives is protecting the ability to boot from the root filesystem. There can be performance benefits to multiple drives, although it is easy to overstate the potential for non-RAID performance parallelism unless you are spec&#8217;ing out compute nodes with 2 or more CPUs, 2 or more RAID cards, and NUMA memory configuration to channel memory transfers separately. Write traffic across multiple SSDs may hold up better as a performance story without that level of hardware due to how IOPS could get batch flushed to on-SSD SRAM cache.</p><p>In the case of some database architectures there are fault-tolerance scenarios around directing Write-Ahead Log (WAL) to separate disks. Again this story holds up better when you have multiple RAID cards, preferably cards with battery backup for ensuring completed flushes on a power outage. The goal here would be to approximate the theoretical concept &#8220;stable storage,&#8221; which forms the backbone for how we reason about database transactions and database recovery.</p><h2>Remote Storage Use Cases</h2><p>It is important to keep in mind that you&#8217;re creating an experimental lab platform. You should be able to set up and tear down compute nodes at will, or alter some aspect of their current application provisioning and configuration.</p><p>This will push you towards having externalized storage so that any data you care about will live across those major system alterations.</p><p>You are also going to run into cases where you want the same data available across multiple compute nodes. Having multiple nodes mount the same remote volume is useful for allowing tasks to run anywhere and be matched up to the data required.</p><p>The straightforward solution to remote storage is Network Attached Storage (NAS). I want to dig into NAS solutions more in later articles, but for now the outline is:</p><ul><li><p>You can either build your own, or buy a NAS. If you&#8217;re thinking about lab creation like a small startup business, you probably want to just buy something so you can focus your time elsewhere. Pick a reliable, established vendor and product line.</p></li></ul><ul><li><p>You want your NAS to support the protocols you intend to use for file sharing. The two most likely are Server Message Block (SMB) and Network File System (NFS). There are others, but those are what you&#8217;ll typically use. Use the most recent stable version of a protocol available.</p></li><li><p>The bulk of the storage should be in a RAID configuration that helps preserve your data. I prefer RAID 6 plus a hot spare, because I&#8217;m willing to trade the cost of some storage for increased protection against disk failure. Investigate RAID options and pick the configuration that suits your situation.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pIJM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c4528c6-0c7f-4972-be04-d15060e8b6cd_781x521.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pIJM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c4528c6-0c7f-4972-be04-d15060e8b6cd_781x521.png 424w, https://substackcdn.com/image/fetch/$s_!pIJM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c4528c6-0c7f-4972-be04-d15060e8b6cd_781x521.png 848w, https://substackcdn.com/image/fetch/$s_!pIJM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c4528c6-0c7f-4972-be04-d15060e8b6cd_781x521.png 1272w, https://substackcdn.com/image/fetch/$s_!pIJM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c4528c6-0c7f-4972-be04-d15060e8b6cd_781x521.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pIJM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c4528c6-0c7f-4972-be04-d15060e8b6cd_781x521.png" width="781" height="521" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7c4528c6-0c7f-4972-be04-d15060e8b6cd_781x521.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:521,&quot;width&quot;:781,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:124939,&quot;alt&quot;:&quot;Local vs Remote storage&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://substack.the-experimentalist.com/i/170808266?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c4528c6-0c7f-4972-be04-d15060e8b6cd_781x521.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Local vs Remote storage" title="Local vs Remote storage" srcset="https://substackcdn.com/image/fetch/$s_!pIJM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c4528c6-0c7f-4972-be04-d15060e8b6cd_781x521.png 424w, https://substackcdn.com/image/fetch/$s_!pIJM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c4528c6-0c7f-4972-be04-d15060e8b6cd_781x521.png 848w, https://substackcdn.com/image/fetch/$s_!pIJM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c4528c6-0c7f-4972-be04-d15060e8b6cd_781x521.png 1272w, https://substackcdn.com/image/fetch/$s_!pIJM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c4528c6-0c7f-4972-be04-d15060e8b6cd_781x521.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>There are distributed filesystem technologies like Ceph, but as the discussion here is about &#8220;phase 1&#8221; planning for the lab platform, I don&#8217;t think that worth getting into. It is family of options can be pretty heavy-weight as a learning curve and maintenance responsibility. You may only want to head down that path if one of your goals from your cluster was hands-on experience with distributed filesystems.</p><h2>Economic Considerations</h2><p>You have three possible optimization outcomes:</p><ul><li><p>Low cost.</p></li><li><p>High reliability.</p></li><li><p>High performance.</p></li></ul><p>You can only pick at most 2 out of the 3 if you push to the extremes, but sometimes you can balance a little in the middle. When it comes to storage, no matter the use case, I see absolutely no win in giving up on high reliability. You&#8217;re trying to accomplish things, and having storage fail underneath you does not accomplish things.</p><p>That leaves you to decide when to aim for low cost, versus when to emphasize high performance.</p><p>I lean towards the following:</p><ul><li><p>The NAS box itself should be capable of high performance. You already have the handicap of data traveling over the network. Just get a good box in the first place.</p></li><li><p>The drives in the NAS are where you have have more flexibility. If you want a lot of storage, you really can&#8217;t beat the price point of most good-quality HDDs. If you prefer fast storage then you&#8217;ll want to get good-quality SSDs. Your bill and final storage capacity will differ between those choices, just don&#8217;t buy junk. This does not mean that you must buy drives marketed as &#8220;enterprise grade.&#8221; The price points on most of those are stupid. If you have a decent RAID setup, the entire point was to allow RAID to be your source of resilience. While I&#8217;m personally not a user of hybrid drives, hybrids could be a reasonable option for a NAS.</p></li><li><p>For local storage your choice is between HDD and SSD. I use one of each in my compute nodes. The HDD is used for the basic O/S and for the activity that experiences the most churn like swap and logging traffic. The SSD is used for application data. This setup protects the operating system itself from the risk of lockup due to NAND burn on the SSD, or SSDs failing due to bad firmware (several SSD vendors have had issues). My SSD selection criteria is definitely performance and reliability. HDD purchases have emphasized quality, and sometimes you can luck out with finding unused batches of older product lines where you hit a nice sweet spot that balances good quality, very decent (but not best-of-breed) performance, and fair price.</p></li><li><p>We won&#8217;t get into the meat of disaster recovery during phase 1 &#8212; there isn&#8217;t any intellectual property to protect yet &#8212; but for initial economic planning it is worth considering if you want a spare drive of each kind you use. Both my NAS and the compute nodes use the same model of SSD so I keep one idle SSD in the NAS as a hot spare for a RAID rebuild, but in a pinch I could swap that into a compute node for a failed data drive. I also have a couple of spares of the HDD models used in the compute nodes in case a root volume fails. You&#8217;re trying to run a business, and downtime means impaired operations. When you are bootstrapping your lab as a side project, parts delays interleaved with life scheduling may interrupt your plans for weeks.</p></li></ul><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://substack.the-experimentalist.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">The Experimentalist is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p><a href="https://substack.the-experimentalist.com/p/phase-1-just-a-bunch-of-storage">The Experimentalist : Phase 1: Just a Bunch of Storage</a> &#169; 2025 by <a href="https://www.linkedin.com/in/reidmpinchback/">Reid M. Pinchback</a> is licensed under <a href="https://creativecommons.org/licenses/by-sa/4.0/">CC BY-SA 4.0</a></p>]]></content:encoded></item><item><title><![CDATA[Phase 1: Just a Bunch of Compute]]></title><description><![CDATA[Plan the hardware for your SWE experimentation laboratory]]></description><link>https://substack.the-experimentalist.com/p/phase-1-just-a-bunch-of-compute</link><guid isPermaLink="false">https://substack.the-experimentalist.com/p/phase-1-just-a-bunch-of-compute</guid><dc:creator><![CDATA[Reid M. Pinchback]]></dc:creator><pubDate>Tue, 12 Aug 2025 03:47:52 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!dp8L!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06b3b0da-c942-4f45-a1ae-78f0027eac1c_781x621.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!dp8L!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06b3b0da-c942-4f45-a1ae-78f0027eac1c_781x621.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!dp8L!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06b3b0da-c942-4f45-a1ae-78f0027eac1c_781x621.png 424w, https://substackcdn.com/image/fetch/$s_!dp8L!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06b3b0da-c942-4f45-a1ae-78f0027eac1c_781x621.png 848w, https://substackcdn.com/image/fetch/$s_!dp8L!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06b3b0da-c942-4f45-a1ae-78f0027eac1c_781x621.png 1272w, https://substackcdn.com/image/fetch/$s_!dp8L!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06b3b0da-c942-4f45-a1ae-78f0027eac1c_781x621.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!dp8L!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06b3b0da-c942-4f45-a1ae-78f0027eac1c_781x621.png" width="781" height="621" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/06b3b0da-c942-4f45-a1ae-78f0027eac1c_781x621.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:621,&quot;width&quot;:781,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:85957,&quot;alt&quot;:&quot;Block diagram of the Experimentalist Laboratory&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://substack.the-experimentalist.com/i/170729988?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06b3b0da-c942-4f45-a1ae-78f0027eac1c_781x621.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Block diagram of the Experimentalist Laboratory" title="Block diagram of the Experimentalist Laboratory" srcset="https://substackcdn.com/image/fetch/$s_!dp8L!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06b3b0da-c942-4f45-a1ae-78f0027eac1c_781x621.png 424w, https://substackcdn.com/image/fetch/$s_!dp8L!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06b3b0da-c942-4f45-a1ae-78f0027eac1c_781x621.png 848w, https://substackcdn.com/image/fetch/$s_!dp8L!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06b3b0da-c942-4f45-a1ae-78f0027eac1c_781x621.png 1272w, https://substackcdn.com/image/fetch/$s_!dp8L!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06b3b0da-c942-4f45-a1ae-78f0027eac1c_781x621.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Time to get down to business. Phase 1 of the plan is the rudimentary layer to building your own home-brew &#8220;mad scientist&#8221; lab for software engineering experimentation. JBoC &#8212; Just a Bunch of Compute &#8212; is about deciding the physical portion of the platform.</p><div><hr></div><p><strong>Prev:</strong> <strong><a href="https://substack.the-experimentalist.com/p/building-a-swe-experimentation-platform">Building a SWE Experimentation Platform</a></strong> <strong>| Next: <a href="https://substack.the-experimentalist.com/p/phase-1-just-a-bunch-of-storage">Phase 1: Just a Bunch of Storage</a></strong></p><div><hr></div><p>I&#8217;ll be describing this in terms of what&#8217;s most typical for backend and data engineers, but don&#8217;t view that as limiting your options. If you&#8217;re interested more in the front-end, you might make slightly different choices. If you&#8217;ve been dreaming of building a thousand-node Raspberry PI supercluster, have at it!  Honestly if some board manufacturer would underwrite the work, I&#8217;d do a supercluster in a heartbeat.</p><h2>The Outline</h2><p>Money only goes so far. There is benefit to planning purchases much the same way a cash-strapped company might. The heuristic I&#8217;m using is:</p><ul><li><p>75% of purchases will go to lower-cost hardware.</p></li><li><p>20% will be the mid-tier cost range.</p></li><li><p>5% go to the very infrequent budget-busters you have decided you must say yes to.</p></li></ul><p>The percentages are ballparks in number of units purchased, not in dollars. That 5% top-end units may very well end up 75% of your spend if you&#8217;ve decided you absolutely must have that Nvidia H100 card, for example. More commonly it&#8217;ll be the monster laptop rig that you talk yourself into once every 5 years.</p><p>The goal in experimentation with distributed computing is to have hardware to distribute work over. The per-node computational muscle may not be that important. It&#8217;s the distribution of function that you are exercising, not whether each and every node can supply a water-cooled 100 FPS while playing Cyberpunk 2077.</p><h2>Lower-Tier Nodes</h2><p>Used, open-box, and unused-but-discontinued hardware is a great way to build out a cluster. Product lines in the range of 3-6 years old can have provide a lot of bang for the buck. We pay an insane premium in order to get the newest thing with a 50% performance bump when operated flat out. Most of the time we aren&#8217;t using server compute anywhere near full load, particularly in a home lab.</p><p>Think of your lab like you&#8217;re setting up a business. Fund the work you are going to do, not the work that somebody, somewhere, in a big wide world might conceive of doing. Someday.</p><p>Having headroom for maximum performance is great&#8230; if you&#8217;re using it. Save that for the high-end 5% of purchases. If it turns out to have been a vanity purchase, at least you&#8217;ll understand where the motivation came from.</p><p>Try to identify a single hardware model that you will stick to. There are two reasons for this:</p><ol><li><p>When you have many different hardware variations, it becomes more challenging to reason about behavior like performance and fault rates. The differences become primary variables instead of your chosen computational activity.</p></li><li><p>Maintenance is harder because you&#8217;ll have different issues arise with every kind of different hardware. Firmware patch issues will differ, BIOS configuration will differ, supported memory chips or SSDs can differ. By sticking to a single model you gain leverage on any learning curve: solve a problem once, then copy-paste to all the other nodes of the same model.</p></li></ol><p>Here are the characteristics I look for in lower-cost nodes.</p><ul><li><p>The BIOS and motherboard features must support whatever operating system and O/S features I intend to use, and supply the connectivity I&#8217;ve decided I need for any hardware that will be mounted directly on or cabled to the motherboard. More than anything else, this draws a line for &#8220;too old to use&#8221;.</p></li><li><p>The model must be easily available. There&#8217;s no point in picking something you rarely see available on the major reseller web sites.</p></li><li><p>There should be a decent amount of internet history on experiences with hardware quality for that model. You want hardware that has been reliable, both in initial assembly and in use over time. The model might not house the fastest and hottest-running components as of when it was made, because heat means thermal stress. Find a reliable workhorse, not an older Ferrari.</p></li><li><p>The physical size of the model must suit the location where it is going to live. If you have an unused (and dry!) basement with ample space for racks and 1U &#8220;pizza boxes&#8221; then the width and depth of those nodes might be fine. If you have a half dozen square feet on a couple of home-office shelves, then small form-factor PCs may be what you&#8217;re looking for: I use SFFs myself for exactly that reason.</p></li><li><p>You need to be able to support the power requirements of that model. You don&#8217;t want the circuit breaker tripping all the time because you tried to run too many nodes with 1200w power supplies.</p></li><li><p>The models must run cool enough for the environment where they are going to live. Obviously you may be able to improve on the situation with various cooling solutions, but the end result establishes your thermal constraints.</p></li><li><p>CPUs won&#8217;t be the best possible but should be acceptable in terms of their performance, their heat generation, and any history related to reliability. As an example, you may decide to take a pass on Intel Raptor Lake 13900K and 14900K CPUs because of their voltage-related stability problems, but on the other hand I wouldn&#8217;t rush to anything in the i3 product line either because it&#8217;s just too low-powered.</p></li><li><p>RAM capacity matters for almost everything. Unless you&#8217;re doing the Raspberry PI supercluster, I wouldn&#8217;t bother with anything that doesn&#8217;t have at least 32gb of RAM per node, and preferably at least 64gb. Note that sometimes the manufacturer information will suggest 32gb when 64gb was possible if you had the right RAM sticks, so do your homework online by tracking down posts from modders and happy owners of a particular node model. Be aware that some motherboards with 4 sockets for RAM may not operate with maximum memory performance in that configuration; if speed is your goal you may be limited to a single pair of DIMMS.</p></li><li><p>I personally prefer to buy bare-bone boxes that have any CPU, GPU, Wi-Fi, Bluetooth, and wired network support components mounted&#8230; but not the RAM or SSD. That lets me pick a consistent model for RAM and SSD hardware without feeling like I wasted any money. If you aren&#8217;t super-fussy about performance testing, then I wouldn&#8217;t worry as much about that. Keeping the Wi-Fi / Bluetooth / Network cards consistent though is likely to save you a lot of headaches. There&#8217;s more than enough room for configuration-related ick around those as it is.</p></li></ul><h2>Middle-Tier Nodes</h2><p>The process here is much the same as that for the low-cost tier. The difference is you may know you want to perform work that requires physical capabilities your lower-end nodes will lack.</p><p>An obvious example would be if the lower-tier nodes don&#8217;t have any Nvidia GPU cards in them, and you need something that would let you work with CUDA. The node models will be a bit newer and components slightly higher-end, but you don&#8217;t have to break the bank. What you likely care about are which versions of CUDA are supported by a particular GPU card model. <a href="https://en.wikipedia.org/wiki/List_of_Nvidia_graphics_processing_units">The Wikipedia page on Nvidia card features</a> can be a handy resource for looking at API support.</p><p>Avoiding the RTX cards that end in &#8220;80&#8221; or &#8220;90&#8221; can provide you with some affordable options. Obviously lower-end GPUs wouldn&#8217;t cut it for somebody training a 100B-parameter base LLM, but we&#8217;re not trying to spec out hardware for an activity that runs with budgets in the 10&#8217;s of millions USD. I&#8217;m not going to get into AI details further now, they&#8217;ll be &#8220;Cheapskate AI&#8221; material in future articles.</p><p>Another kind of node warrants consideration as a possible mid-tier expense, and that is a good-quality NAS (Network Attached Storage). That&#8217;ll be discussed more in <a href="https://substack.the-experimentalist.com/p/phase-1-just-a-bunch-of-storage">the next article on JBoS (Just a Bunch of Storage)</a>. </p><h2>Higher-Tier Nodes</h2><p>Not much to explicitly plan here except to note that this can be a disproportionate hunk of your budget. Avoid it if you can, but make the money count if you do it.</p><p>My personal inclination is towards these being the periodic upgrade to a really good laptop, since even when you have a compute cluster you&#8217;ll behave like any developer and work on it remotely.</p><p>If you have big plans in the ML and GenAI space, you might instead opt for a desktop box with whatever you can afford in the way of GPU cards and the most VRAM you decide you can fund.</p><h2>Power Planning</h2><p>This is a big area and I&#8217;m not the person to do full justice to it, but as you have more money in hardware you&#8217;ll want to learn about:</p><ul><li><p>Surge protectors</p></li><li><p>Surge arrestors/limiters</p></li><li><p>Power/line conditioners</p></li><li><p>Uninterruptible Power Supplies (UPS) and their common architectural variants: standby, line-interactive, and online</p></li></ul><p>I have seen a rack taken out by a lightning strike, so learning about the relevant power-handling hardware and how to set it up properly is something to have on your radar for some stage of the evolution of your lab.</p><p>Until then, at least consider surge protection. To be extra safe, power down and unplug everything whenever you hear about an incoming electrical storm, or when notified that the utility company is going to be doing work in your area.</p><p>One point of this lab-building exercise is to treat it as though you are running a business, not playing computer games, so safeguard that investment.</p><h2>Other Parts</h2><p>Buying compute nodes will not be the only purchase. You&#8217;ll need to allow for:</p><ul><li><p>RAM sticks of the appropriate size and part numbers.</p></li><li><p>Drives (whether HDD, SSD, or hybrid).</p></li><li><p>Network cables with shielding appropriate to the speed and length until you can connect to a router or switch.</p></li><li><p>A network switch.</p></li><li><p>Some USB sticks for doing initial O/S installations or for firmware updates.</p></li><li><p>Anything you need for interacting with nodes, such as a monitor and keyboard.</p></li><li><p>If the motherboard or node case have vendor-specific parts, like fan housings or heat shield armor, consider picking up a few spares while you can get them.</p></li><li><p>Add any cooling supplies or spare fan parts you want quickly available.</p></li><li><p>Add any tools you want for assembling hardware like Torx screwdrivers, anti-static mats and wrist straps, magnifier and lighting for viewing small parts in tight quarters, etc.</p></li><li><p>If you went the route of rack-mount hardware, then depending on your plan either full-sized or table-top sized racks and all their supporting hardware pieces; alternatively if you need any office furniture like shelving then allow for that.</p></li><li><p>Storage bins for bits and pieces, because you&#8217;ll definitely collect bits and pieces.</p></li></ul><p>Add or remove as appropriate. It&#8217;s your lab for your experiments.</p><h2>The Process</h2><p>I would suggest some habits around how you acquire and integrate hardware.</p><ol><li><p><strong>Learn which vendor sources you find reliable</strong>, and mostly stick to them. You&#8217;ll have enough going wrong as it is. Sometimes your compatibility homework on a RAM part number won&#8217;t turn out as you had hoped. Sometimes the wrong part will get shipped. The universe introduces enough chaos so knowing which vendors are more reliable can save you a lot of grief.</p></li><li><p><strong>Don&#8217;t rush to buy multiple units</strong> of a compute node or expensive part until you&#8217;ve bought and tried the very first one. It&#8217;s not hard to trip over something that will be show-stopping for your plans, and you have to send that item back and start again on your homework for the alternative. Buy one, put it to some use, and then if your plan was to buy more you can proceed.</p></li><li><p><strong>Don&#8217;t buy until you have time to install and test</strong>, particularly when it isn&#8217;t a brand-new shrink-wrapped product. Schedule the time for the work. Not only will that help you catch bad parts fast enough to return them, it will also help you spot when somebody sends you a part that is not what was advertised. Even the shrink-wrapped products are better to be able to test quickly, but anything used or open-box you want to make sure you didn&#8217;t waste your money or were scammed.</p></li><li><p><strong>Make notes and take pictures</strong> if those might be helpful later. Setting up a compute cluster has a lot of repeat work, and you will find yourself routinely wishing you remembered exactly what steps you took on a previous node. Capture the information while it is fresh. Even a day later you&#8217;ll forget something.</p></li><li><p><strong>Budget for a cost 10% above what you planned.</strong> You&#8217;ll discover you need something that you didn&#8217;t realize would be important until opening up a case, or after realizing half your network cables aren&#8217;t being recognized by the switch.</p></li><li><p><strong>Expect to do operating system installations frequently at first.</strong> Not only are there many flavors to choose from &#8212; even just in the Unix/Linux world &#8212; but you&#8217;ll find yourself grappling with questions on specific O/S version numbers, desktop vs server variants, disk layout for the installation, and sometimes BIOS configuration. You <strong>will</strong> change your mind, and discover why keeping notes comes in handy. Don&#8217;t be emotionally wedded to any initial set-up. Learn to feel comfortable tearing down anything that isn&#8217;t exactly as you want it to be.</p></li></ol><h2>A Living Example</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vlxH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f776306-4a6d-4efe-b19f-a4aeadebc8d0_514x400.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vlxH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f776306-4a6d-4efe-b19f-a4aeadebc8d0_514x400.jpeg 424w, https://substackcdn.com/image/fetch/$s_!vlxH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f776306-4a6d-4efe-b19f-a4aeadebc8d0_514x400.jpeg 848w, https://substackcdn.com/image/fetch/$s_!vlxH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f776306-4a6d-4efe-b19f-a4aeadebc8d0_514x400.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!vlxH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f776306-4a6d-4efe-b19f-a4aeadebc8d0_514x400.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vlxH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f776306-4a6d-4efe-b19f-a4aeadebc8d0_514x400.jpeg" width="514" height="400" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9f776306-4a6d-4efe-b19f-a4aeadebc8d0_514x400.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:400,&quot;width&quot;:514,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:96720,&quot;alt&quot;:&quot;Small Form-Factor PC Cluster&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://substack.the-experimentalist.com/i/170729988?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f776306-4a6d-4efe-b19f-a4aeadebc8d0_514x400.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Small Form-Factor PC Cluster" title="Small Form-Factor PC Cluster" srcset="https://substackcdn.com/image/fetch/$s_!vlxH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f776306-4a6d-4efe-b19f-a4aeadebc8d0_514x400.jpeg 424w, https://substackcdn.com/image/fetch/$s_!vlxH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f776306-4a6d-4efe-b19f-a4aeadebc8d0_514x400.jpeg 848w, https://substackcdn.com/image/fetch/$s_!vlxH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f776306-4a6d-4efe-b19f-a4aeadebc8d0_514x400.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!vlxH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f776306-4a6d-4efe-b19f-a4aeadebc8d0_514x400.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Here are the low-tier nodes for my SFF cluster.</p><ul><li><p>Intel NUCs, all but one are the same model; the exception is my Kubernetes control plane. It has a small keyboard and monitor if for some reason I can&#8217;t get to the cluster remotely, e.g. due to a flubbed network configuration experiment.</p></li><li><p>Each node has 64gb of RAM, an HDD, and an SSD.</p></li><li><p>Cooling isn&#8217;t too much of a concern as Intel made these from CPUs intended for the mobile market, but I keep a fan at one end to circulate the air just to be safe. </p></li><li><p>The nodes connect to a network switch positioned on the shelf above.</p></li></ul><p>All of these were bought after Intel had moved on to the next couple of series in the NUC product line. Fortunately I avoided the Raptor Lake debacle. At this point I think about 3/4ths of the Intel NUC lines are aging out as an option for those starting in 2025 on their own cluster. There are many other SFF vendors that have taken up the baton, so I expect SFFs to remain a viable approach for those not wanting to go in the direction of rack-mount hardware.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://substack.the-experimentalist.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">The Experimentalist is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p><a href="https://substack.the-experimentalist.com/p/phase-1-just-a-bunch-of-compute">The Experimentalist : Phase 1: Just a Bunch of Compute</a> &#169; 2025 by <a href="https://www.linkedin.com/in/reidmpinchback/">Reid M. Pinchback</a> is licensed under <a href="https://creativecommons.org/licenses/by-sa/4.0/">CC BY-SA 4.0</a></p>]]></content:encoded></item><item><title><![CDATA[Building a SWE Experimentation Platform]]></title><description><![CDATA[Gain the skills GenAI benefits from, but job opportunities may not provide]]></description><link>https://substack.the-experimentalist.com/p/building-a-swe-experimentation-platform</link><guid isPermaLink="false">https://substack.the-experimentalist.com/p/building-a-swe-experimentation-platform</guid><dc:creator><![CDATA[Reid M. Pinchback]]></dc:creator><pubDate>Sat, 09 Aug 2025 05:17:19 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Xrgb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5becbcf6-68fe-431b-b08a-9773f9c9bd3f_781x641.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Xrgb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5becbcf6-68fe-431b-b08a-9773f9c9bd3f_781x641.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Xrgb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5becbcf6-68fe-431b-b08a-9773f9c9bd3f_781x641.png 424w, https://substackcdn.com/image/fetch/$s_!Xrgb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5becbcf6-68fe-431b-b08a-9773f9c9bd3f_781x641.png 848w, https://substackcdn.com/image/fetch/$s_!Xrgb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5becbcf6-68fe-431b-b08a-9773f9c9bd3f_781x641.png 1272w, https://substackcdn.com/image/fetch/$s_!Xrgb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5becbcf6-68fe-431b-b08a-9773f9c9bd3f_781x641.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Xrgb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5becbcf6-68fe-431b-b08a-9773f9c9bd3f_781x641.png" width="781" height="641" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5becbcf6-68fe-431b-b08a-9773f9c9bd3f_781x641.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:641,&quot;width&quot;:781,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:55919,&quot;alt&quot;:&quot;Block diagram of the Experimentalist Laboratory&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://substack.the-experimentalist.com/i/170317139?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5becbcf6-68fe-431b-b08a-9773f9c9bd3f_781x641.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Block diagram of the Experimentalist Laboratory" title="Block diagram of the Experimentalist Laboratory" srcset="https://substackcdn.com/image/fetch/$s_!Xrgb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5becbcf6-68fe-431b-b08a-9773f9c9bd3f_781x641.png 424w, https://substackcdn.com/image/fetch/$s_!Xrgb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5becbcf6-68fe-431b-b08a-9773f9c9bd3f_781x641.png 848w, https://substackcdn.com/image/fetch/$s_!Xrgb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5becbcf6-68fe-431b-b08a-9773f9c9bd3f_781x641.png 1272w, https://substackcdn.com/image/fetch/$s_!Xrgb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5becbcf6-68fe-431b-b08a-9773f9c9bd3f_781x641.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><a href="https://substack.the-experimentalist.com/p/karl-marx-would-buy-gpus">My "Karl Marx Would Buy GPUs" article concluded</a> how, with ever-concentrating corporate and personal wealth, GenAI vendors will push that disparity further. Our finances whether as employee, solo entrepreneur, or small-company founder, are facing similar forces. The choices on strategy to overcome the slow squeeze boil down to combinations of:</p><ol><li><p>Find a way to be more capable than the big GenAI vendors and identify opportunities to beat them at some piece of their own game. Challenging, but not impossible as big companies aren&#8217;t as nimble as individuals or small companies. Expect to change direction rapidly as LLM capabilities evolve.</p></li><li><p>Find something your market wants that is grounded in novelty or uniqueness or deep insight, or at least with a provenance that communicates value.  If you were part of the reason for the transaction, that edge can&#8217;t be instantly prompted away.</p></li></ol><div><hr></div><p><strong>Next: <a href="https://substack.the-experimentalist.com/p/phase-1-just-a-bunch-of-compute">Phase 1: Just a Bunch of Compute</a></strong></p><div><hr></div><h2>Skill Building</h2><p>My own focus is the world of software engineering so I&#8217;ve been trying to navigate a path that is about 5% of the first option, and 95% of the second. A day may come when technical domain expertise ceases to be a thing, but I believe we&#8217;re a long way from that. The strongest reason I have was explored in <a href="https://substack.the-experimentalist.com/p/on-the-turn-of-a-phrase">On the Turn of a Phrase</a>:</p><blockquote><p><em>We cannot think thoughts for which we lack the language.</em></p></blockquote><p>Within software engineering &#8212; or frankly any deep-knowledge career path &#8212; that suggests a couple of observations:</p><ul><li><p>If you aren&#8217;t invested in the GenAI world then you need a deep understanding of the detailed workings of a domain. You&#8217;re competing against an ever-changing LLM knowledgebase. Surface knowledge won&#8217;t cut it.</p></li><li><p>If you are invested in the GenAI world then your ability to generate quality outcomes improves greatly if you have deep knowledge of a domain. Surface knowledge has too little selective power in prompts to generate the strongest results out of an infinite universe of choices. You need to know what to ask for.</p></li></ul><p>Either way you land in a similar place as a SWE. Deep skill has moved from being an eventual nice-to-have to now being a key factor in your relevance.</p><p>You can&#8217;t just read a book for deep skill:</p><ul><li><p>You have to be in a position to actively experiment as you drill down.</p></li><li><p>We learn from a mix of positive and negative experiences.</p></li><li><p>These shape both what connects in our memory and the boundary on what is appropriate to generalize.</p></li></ul><p>Those of us who have already been in software engineering (or adjacent field) for a couple of decades already had opportunities to do all that. We&#8217;ve built layers of foundation skills. I&#8217;m concerned that more recent graduates, junior, and even senior engineers are going to find themselves denied a similar learning process.</p><h2>The Strategy</h2><p>To help fill the gap I&#8217;m rolling out a series of articles on the approach I have used myself for many years. I&#8217;m in the midst of updating it for life in an LLM world.</p><p>The idea is simple. Nothing teaches you how things work, like having to actually make them work by yourself. The effort to create comprehensive infrastructure from scratch will teach you far more than a hundred LeetCode exercises.</p><p>If you follow along and attempt any of this, in essence you&#8217;ll be building the scaffolding for your own startup. Whether you have a great business idea or not, at a minimum you&#8217;ll be faced with how pre-seed tech startups start to stitch themselves together and you&#8217;ll see why they have so many rough edges. There is only so much time, only so much money, only so much energy, and you learn that the only way you say &#8220;yes&#8221; to important tasks is by saying &#8220;no&#8221; or &#8220;not yet&#8221; to unimportant ones.</p><p>Even if you aren&#8217;t in an early phase of your career perhaps you&#8217;ve experienced what many of us do: an industry of ever-broadening technology choices we often bounce between at increasingly shallow levels of understanding. If you haven&#8217;t built a proper experimental playground before, this may increase your motivation so that you can dig into all the high-leverage details that the day job may not enable.</p><p>There is another theme to this. Cloud compute and GenAI vendor APIs have something in common. Both have ways they tax you for experimentation, and can punish you badly for expensive mistakes in establishing budget guardrails.</p><h2>The Experimentalist Laboratory</h2><p>The approach here is to mostly run on hardware you&#8217;ve purchased for yourself.  Obviously many things can be moved to the cloud, and some of them should, but there is nothing quite like the freedom to make any purchase choice that makes sense to you, apply any configuration that helps you, and throw away anything you later discover does not server you.</p><p>Technology should be about <strong>YOU</strong>, and not the other way around. The process here will very much be one of making, and revising as necessary, decisions that place <strong>YOU</strong> at the center of what happens, and keeps <strong>YOU</strong> as the primary decider of pretty much everything.</p><p>A side benefit is that, other than the initial hardware purchases, you aren&#8217;t constantly feeding mega-corps more money just to have permission to learn and push the envelope. Stop acting like their favorite flavor of catnip. They have an ample supply. </p><p>The essence of building your own laboratory for experimentation is straightforward:</p><ul><li><p>The economics of the platform should be approachable.</p></li><li><p>Hardware, software, and some external services will be involved.</p></li><li><p>It likely takes more than a laptop; you&#8217;ll want something that surfaces real challenges and provides the growth potential of actual distributed systems.</p></li><li><p>There will be many moving parts, so tackle the assembly in bite-sized pieces.</p></li><li><p>Optionally include LLMs. If you do, the same hardware you use for other experiments can be used for self-hosting some LLMs.</p></li></ul><p>Including LLMs opens up more avenues for learning and &#8212; if this happens to be your goal &#8212; you were never going to avoid self-hosting experiments with the strategy &#8220;beat GenAI vendors at their own game&#8221; as your objective.</p><p>Assembling the laboratory is broken into two major sections and an optional third.</p><ul><li><p><strong>Phase 1:</strong> the basic foundation of hardware plus minimal software tooling for rolling out system configuration and application installation. It also covers ensuring that your work gets protected somewhere remote.</p></li><li><p><strong>Phase 2:</strong> an ever-growing collection of technology artifacts or progress on procedural efforts so that, in time, you can build pretty much anything you wish.</p></li><li><p><strong>Cheapskate AI:</strong> optionally, run LLM tooling locally to experiment with, tune, and control the behavior of the AI tools you use. The tools should behave as you wish, not as an outside vendor decides for you.</p></li></ul><p>The to-do list can be as long as your interests drive it, but for those earlier in their career you should come out of this with a gut-level understanding of what drives many decisions at the intersection of technology and business. That awareness can become one of your selling points in a career role or a new business.</p><p>In future articles I&#8217;ll start breaking down the laboratory assembly in detail.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://substack.the-experimentalist.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">The Experimentalist is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p><a href="https://substack.the-experimentalist.com/p/building-a-swe-experimentation-platform">The Experimentalist : Building a SWE Experimentation Platform</a> &#169; 2025 by <a href="https://www.linkedin.com/in/reidmpinchback/">Reid M. Pinchback</a> is licensed under <a href="https://creativecommons.org/licenses/by-sa/4.0/">CC BY-SA 4.0</a></p>]]></content:encoded></item></channel></rss>