<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: ChienPang Lee</title>
    <description>The latest articles on DEV Community by ChienPang Lee (@chienpang_lee_f5d1ce793ef).</description>
    <link>https://dev.to/chienpang_lee_f5d1ce793ef</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3911331%2F04428831-4267-49d6-bbee-dfe150680abe.png</url>
      <title>DEV Community: ChienPang Lee</title>
      <link>https://dev.to/chienpang_lee_f5d1ce793ef</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/chienpang_lee_f5d1ce793ef"/>
    <language>en</language>
    <item>
      <title>Copying fail</title>
      <dc:creator>ChienPang Lee</dc:creator>
      <pubDate>Tue, 12 May 2026 14:30:03 +0000</pubDate>
      <link>https://dev.to/chienpang_lee_f5d1ce793ef/copying-fail-jn0</link>
      <guid>https://dev.to/chienpang_lee_f5d1ce793ef/copying-fail-jn0</guid>
      <description>&lt;p&gt;Copy Fail (CVE-2026-31431) has started a fierce fire that's gone rampant in the Linux woods. Are we exploitable? The answer is almost certain because pretty much every actively maintained enterprise distribution has it. While folks are anxiously looking for a way to put it out, Dirty Frag and Copy Fail 2: Electric Boogaloo have caught up to the game, spilling oil on the flame. The correct way to address these is to upgrade your kernel to new versions that have the fixes merged. That's, however, easier said than done. Unless you're dealing with your own laptop where you're already on a relatively modern distro version, it's more complicated than "apt update &amp;amp;&amp;amp; apt install &amp;amp;&amp;amp; reboot". You have a service running on a certain vendor's Linux. The vendor needs weeks, likely months, to get you a release. You have your own company policy and concerns to schedule a widespread kernel rollout that would likely incur service interruptions. The reasons for procrastination go on and on, except that the risk stays high, as well as client inquiry. If the ideal solution is not going to happen soon, what're the mitigations we can do now? Be warned! The commonly-known kernel module suppression may not work, even if your overall services and OS operations could not be guaranteed. Here I'm proposing an addition to the short-term mitigation actions - monitor if your system is exploited by privilege escalations.&lt;/p&gt;

&lt;p&gt;Take &lt;strong&gt;Copy Fail&lt;/strong&gt; for example. It has to do with the Linux kernel's internal crypto API, managing functions like kTLS and IPsec. kernel’s internal cryptographic subsystem and may be impacted if the algif_aead module is disabled or restricted as a mitigation. Common features are KTLS (Knernel TLS), IPsec (Internet Protocol Security), Disk Encryption (dm-crypt/LUKS), User-space Crypto Offloading and Zero-Copy Networking: Functions like splice() and sendmsg().&lt;br&gt;
One of the concrete recommendation to mitigate this CVE is to disable &lt;strong&gt;algif_aead&lt;/strong&gt; module and restrict it from being loaded.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"install algif_aead /bin/false"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /etc/modprobe.d/disable-algif.conf
rmmod algif_aead 2&amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The fake module installation works on my Ubuntu 24.04 LTS (kernel 6.18-7) but not one another Linux platform of Centos9 (kernel 6.12.74-1).&lt;/p&gt;

&lt;p&gt;Here is a working example with a happy ending on my laptop.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;chien-pang@pop-os:~/Downloads$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/modprobe.d/disable-copyfail.conf
&lt;span class="go"&gt;install algif_aead /bin/true
&lt;/span&gt;&lt;span class="gp"&gt;chien-pang@pop-os:~/Downloads$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;lsmod | egrep &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"algif|aead"&lt;/span&gt;
&lt;span class="go"&gt;algif_hash             16384  1
algif_skcipher         12288  1
af_alg                 32768  6 algif_hash,algif_skcipher
&lt;/span&gt;&lt;span class="gp"&gt;chien-pang@pop-os:~/Downloads$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;lsmod | &lt;span class="nb"&gt;grep &lt;/span&gt;algif_aead
&lt;span class="gp"&gt;chien-pang@pop-os:~/Downloads$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;modprobe algif_aead &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$?&lt;/span&gt;
&lt;span class="go"&gt;0
&lt;/span&gt;&lt;span class="gp"&gt;chien-pang@pop-os:~/Downloads$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;lsmod | &lt;span class="nb"&gt;grep &lt;/span&gt;algif_aead
&lt;span class="gp"&gt;chien-pang@pop-os:~/Downloads$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;./copyFail30.py
&lt;span class="go"&gt;Traceback (most recent call last):
&lt;/span&gt;&lt;span class="gp"&gt;  File "/home/chien-pang/Downloads/./copyFail30.py", line 36, in &amp;lt;module&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;    while i&amp;lt;len(e):c(f,i,e[i:i+4]);&lt;/span&gt;i+&lt;span class="o"&gt;=&lt;/span&gt;4
&lt;span class="go"&gt;                   ^^^^^^^^^^^^^^^
  File "/home/chien-pang/Downloads/./copyFail30.py", line 30, in c
&lt;/span&gt;&lt;span class="gp"&gt;    a=s.socket(38,5,0);&lt;/span&gt;a.bind&lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="s2"&gt;"aead"&lt;/span&gt;,&lt;span class="s2"&gt;"authencesn(hmac(sha256),cbc(aes))"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nv"&gt;h&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;279&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nv"&gt;v&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;a.setsockopt&lt;span class="p"&gt;;&lt;/span&gt;v&lt;span class="o"&gt;(&lt;/span&gt;h,1,d&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'0800010000000010'&lt;/span&gt;+&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="gp"&gt;'0'*64));&lt;/span&gt;v&lt;span class="o"&gt;(&lt;/span&gt;h,5,None,4&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;u,_&lt;span class="o"&gt;=&lt;/span&gt;a.accept&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nv"&gt;o&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;t+4&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="nv"&gt;i&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;d&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'00'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;u.sendmsg&lt;span class="o"&gt;([&lt;/span&gt;b&lt;span class="s2"&gt;"A"&lt;/span&gt;&lt;span class="k"&gt;*&lt;/span&gt;4+c],[&lt;span class="o"&gt;(&lt;/span&gt;h,3,i&lt;span class="k"&gt;*&lt;/span&gt;4&lt;span class="o"&gt;)&lt;/span&gt;,&lt;span class="o"&gt;(&lt;/span&gt;h,2,b&lt;span class="s1"&gt;'\x10'&lt;/span&gt;+i&lt;span class="k"&gt;*&lt;/span&gt;19&lt;span class="o"&gt;)&lt;/span&gt;,&lt;span class="o"&gt;(&lt;/span&gt;h,4,b&lt;span class="s1"&gt;'\x08'&lt;/span&gt;+i&lt;span class="k"&gt;*&lt;/span&gt;3&lt;span class="o"&gt;)&lt;/span&gt;,]&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="gp"&gt;,32768);&lt;/span&gt;r,w&lt;span class="o"&gt;=&lt;/span&gt;g.pipe&lt;span class="o"&gt;()&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;splice&lt;span class="o"&gt;(&lt;/span&gt;f, w, o, &lt;span class="nv"&gt;offset_src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;splice&lt;span class="o"&gt;(&lt;/span&gt;r, u.fileno&lt;span class="o"&gt;()&lt;/span&gt;, o&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory
&lt;/span&gt;&lt;span class="gp"&gt;chien-pang@pop-os:~/Downloads$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;
&lt;span class="go"&gt;uid=1000(chien-pang) gid=1000(chien-pang) groups=1000(chien-pang),4(adm),27(sudo),107(lpadmin)
&lt;/span&gt;&lt;span class="gp"&gt;chien-pang@pop-os:~/Downloads$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; /root
&lt;span class="go"&gt;ls: cannot open directory '/root': Permission denied
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On the contrary, the same mitigation doesn't work on another system. Blacklisting it from grub menu did not help.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;[cc2 ~]$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; /proc/cmdline
&lt;span class="go"&gt;BOOT_IMAGE=/Part2/bzImage root=UUID=571ee1af-1421-479d-845d-ea6b4f97292f ro net.ifnames=0 acpi=force intel_iommu=on amd_iommu=on iommu=pt console=ttyS0 console=tty0 initcall_blacklist=algif_aead_init
&lt;/span&gt;&lt;span class="gp"&gt;cc2 ~]#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;su - nova
&lt;span class="go"&gt;Last login: Tue May 12 12:15:09 CST 2026 on pts/2
&lt;/span&gt;&lt;span class="gp"&gt;[nova@cc2 ~]$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;
&lt;span class="go"&gt;uid=116(nova) gid=124(nova) groups=124(nova),123(libvirt),64055(qemu)
&lt;/span&gt;&lt;span class="gp"&gt;[nova@cc2 ~]$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; /root &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$?&lt;/span&gt;
&lt;span class="go"&gt;ls: cannot open directory '/root': Permission denied
2
&lt;/span&gt;&lt;span class="gp"&gt;[nova@cc2 ~]$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;lsmod | egrep &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s2"&gt;"algif|aead"&lt;/span&gt;
&lt;span class="gp"&gt;[nova@cc2 ~]$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/tmp/copyFail30.py
&lt;span class="gp"&gt;[cc2 /var/lib/nova]#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;
&lt;span class="go"&gt;uid=0(root) gid=124(nova) groups=124(nova),123(libvirt),64055(qemu)
&lt;/span&gt;&lt;span class="gp"&gt;[cc2 /var/lib/nova]#&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;span class="gp"&gt;[cc2 /var/lib/nova]#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; /root &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$?&lt;/span&gt;
&lt;span class="go"&gt;0
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The exploitation works like a charm. This is also what makes "Copy Fail" notorious as the exploit script would work as is without further dependencies or complex preparations. Note the empty output of lsmod | egrep -i "algif|aead". The subsystem is still up though it's never loaded. It turns out the kernel has it compiled as built-in.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;[cc2 /var/lib/nova]#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;grep  &lt;/span&gt;af_alg /proc/kallsyms | &lt;span class="nb"&gt;tail&lt;/span&gt;
&lt;span class="go"&gt;ffffffff98d52d20 r __ksymtab_af_alg_release_parent
ffffffff98d52d2c r __ksymtab_af_alg_sendmsg
ffffffff98d52d38 r __ksymtab_af_alg_unregister_type
ffffffff98d52d44 r __ksymtab_af_alg_wait_for_data
ffffffff98d52d50 r __ksymtab_af_alg_wmem_wakeup
ffffffff99f33ff0 t __pfx_af_alg_init
ffffffff99f34000 t af_alg_init
ffffffff9a185a10 d __initcall__kmod_af_alg__884_1325_af_alg_init6
ffffffff9a35b420 t __pfx_af_alg_exit
ffffffff9a35b430 t af_alg_exit
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;AF_ALG symbols exist in kernel memory which makes the likely-hood high that kernel was compiled with &lt;strong&gt;CONFIG_AF_ALG=y&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In any way, you still have to worry about breaking existing features or functionalities even if the path of blacklisting modules works. And then what about "Dirty Frag" and "Copy Fail 2"?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Remediations takes long&lt;/li&gt;
&lt;li&gt;Rolling-out new kernel is a painful operation&lt;/li&gt;
&lt;li&gt;Mitigation recommendations may not work&lt;/li&gt;
&lt;li&gt;Mitigation recommendations could break features&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Given the challenges, what else can we do to reduce risks? My other piece of advice is to reduce attack surface but that'd be another story because they usually involve modifications of existing configurations or account setups.&lt;br&gt;
What I find helpful is implementing a scanning tool (script) that can tell me if my system has obviously been compromised? Combining it with an event/alert notification system would immediately boost our confidence level while pending on remediations.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/bin/bash                                                                                                                                                                                                                                                                                                              &lt;/span&gt;

Fmt&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s2"&gt;"%-8s %-8s %-8s %-8s %-16s %-12s %s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
           &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;PID&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;2&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;PPID&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;3&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;UID&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;4&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;EUID&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;5&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;CapEff&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;6&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;ParentUID&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;7&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;CMD&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

FmtHeader&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"------------------------------------------------------------------------------------------"&lt;/span&gt;
    Fmt
&lt;span class="o"&gt;}&lt;/span&gt;
FmtContent&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;o
    Fmt &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$pid&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$ppid&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$uid&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$euid&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$capeff&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$parent_uid&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$cmd&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

FmtHeader
&lt;span class="k"&gt;for &lt;/span&gt;pid &lt;span class="k"&gt;in&lt;/span&gt; /proc/[0-9]&lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
    &lt;/span&gt;&lt;span class="nv"&gt;pid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;pid&lt;/span&gt;&lt;span class="p"&gt;#/proc/&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;

    &lt;span class="nv"&gt;status&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/proc/&lt;/span&gt;&lt;span class="nv"&gt;$pid&lt;/span&gt;&lt;span class="s2"&gt;/status"&lt;/span&gt;
    &lt;span class="nv"&gt;cmdline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/proc/&lt;/span&gt;&lt;span class="nv"&gt;$pid&lt;/span&gt;&lt;span class="s2"&gt;/cmdline"&lt;/span&gt;

    &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$status&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="k"&gt;continue

    &lt;/span&gt;&lt;span class="nv"&gt;uid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'/^Uid:/ {print $2}'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$status&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
    &lt;span class="nv"&gt;euid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'/^Uid:/ {print $3}'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$status&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
    &lt;span class="nv"&gt;capeff&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'/^CapEff:/ {print $2}'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$status&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
    &lt;span class="nv"&gt;ppid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'/^PPid:/ {print $2}'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$status&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

    &lt;span class="c"&gt;# read parent UID safely                                                                                                                                                                                                                                                                                                 &lt;/span&gt;
    &lt;span class="nv"&gt;parent_uid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"NA"&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s2"&gt;"/proc/&lt;/span&gt;&lt;span class="nv"&gt;$ppid&lt;/span&gt;&lt;span class="s2"&gt;/status"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;&lt;span class="nv"&gt;parent_uid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'/^Uid:/ {print $2}'&lt;/span&gt; &lt;span class="s2"&gt;"/proc/&lt;/span&gt;&lt;span class="nv"&gt;$ppid&lt;/span&gt;&lt;span class="s2"&gt;/status"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;fi&lt;/span&gt;

    &lt;span class="c"&gt;# command name                                                                                                                                                                                                                                                                                                           &lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$cmdline&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;&lt;span class="nv"&gt;cmd&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;tr&lt;/span&gt; &lt;span class="s1"&gt;'\0'&lt;/span&gt; &lt;span class="s1"&gt;' '&lt;/span&gt; &amp;lt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$cmdline&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
        &lt;span class="nv"&gt;cmd&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;cmd&lt;/span&gt;:0:80&lt;span class="k"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;else
        &lt;/span&gt;&lt;span class="nv"&gt;cmd&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"?"&lt;/span&gt;
    &lt;span class="k"&gt;fi

    if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$capeff&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s2"&gt;"000001ffffffffff"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$parent_uid&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"NA"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        continue
    else
        &lt;/span&gt;&lt;span class="nv"&gt;parent_cmdline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"/proc/&lt;/span&gt;&lt;span class="nv"&gt;$ppid&lt;/span&gt;&lt;span class="s2"&gt;/cmdline"&lt;/span&gt;
        &lt;span class="nv"&gt;pcmd&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;tr&lt;/span&gt; &lt;span class="s1"&gt;'\0'&lt;/span&gt; &lt;span class="s1"&gt;' '&lt;/span&gt; &amp;lt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$parent_cmdline&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
        &lt;span class="nv"&gt;pcmd&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;pcmd&lt;/span&gt;:0:80&lt;span class="k"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;fi

    if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$uid&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"0"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$parent_uid&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s2"&gt;"0"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;FmtContent
        &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[!] ALERT: process (&lt;/span&gt;&lt;span class="nv"&gt;$pid&lt;/span&gt;&lt;span class="s2"&gt;[&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="nt"&gt;-nu&lt;/span&gt; &lt;span class="nv"&gt;$uid&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;]) spawned from non-root parent (&lt;/span&gt;&lt;span class="nv"&gt;$ppid&lt;/span&gt;&lt;span class="s2"&gt;[&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="nt"&gt;-nu&lt;/span&gt; &lt;span class="nv"&gt;$parent_uid&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;] &lt;/span&gt;&lt;span class="nv"&gt;$pcmd&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;ps &lt;span class="nt"&gt;-o&lt;/span&gt; etime &lt;span class="nv"&gt;$ppid&lt;/span&gt; | &lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-1&lt;/span&gt; | xargs&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;)"&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$parent_uid&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s2"&gt;"0"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;FmtContent
        &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[!] WARN: capabilities detected in non-root lineage (PID &lt;/span&gt;&lt;span class="nv"&gt;$pid&lt;/span&gt;&lt;span class="s2"&gt;[&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="nt"&gt;-nu&lt;/span&gt; &lt;span class="nv"&gt;$uid&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;])"&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$uid&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$parent_uid&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$uid&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"0"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;FmtContent
        &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[!] INFO: UID escalation detected (PID &lt;/span&gt;&lt;span class="nv"&gt;$pid&lt;/span&gt;&lt;span class="s2"&gt;[&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="nt"&gt;-nu&lt;/span&gt; &lt;span class="nv"&gt;$uid&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;])"&lt;/span&gt;
    &lt;span class="k"&gt;fi
done&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Saving it as /tmp/copying-fail-detect.sh that attempts to detect "Copy Fail" in action. This is an effective detector that looks into all running privileged processes that have their user IDs different from those of their parents. On the same system, the execution looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;[cc2 ~]#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;bash /tmp/copying-fail-detect.sh
&lt;span class="go"&gt;------------------------------------------------------------------------------------------
PID      PPID     UID      EUID     CapEff           ParentUID    CMD
2988938  2988937  0        0        000001ffffffffff 116
[!] ALERT: process (2988938[root]) spawned from non-root parent (2988937[nova] python3 /tmp/copyFail30.py  36:16)
...(truncated)...
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The alert provides us with a vital message and details in good depth. There is a process with pid 2988938, running &lt;strong&gt;root&lt;/strong&gt; privilege. This process was invoked by its parent 2988937 whose user was &lt;strong&gt;nova&lt;/strong&gt;. The actual command of the parent process was "python3 /tmp/copyFail30.py" and till now it has run this much time &lt;strong&gt;36:16&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The detection has its short-coming of only checking the overall system process status at that second it's executed. On the flip side, it's a short and simple script. What else do you expect? Making it a scheduled job together with your notification or monitoring systems would serve you well when asked about your risk management and confidence level in the perspective of process privilege escalations.&lt;/p&gt;

&lt;p&gt;Often times, I found the results of executing this "copying-fail-detect.sh" hilarious in that the very first wave of attackers are usually not actual hackers from the other end of the earth but the internal employees who found the exploit program and gave it a shot on the internal systems. Some of them, me included, are from security IT sector doing risk assessments and evaluating how much harm the CVE can do. Whatever conclusion they have reached, they were either too tired (rushing back home) or too excited (presenting to the team) and never came back to wipe their ass clean. As soon as the audit took place, the red records needed to be justified with embarrassments.&lt;/p&gt;

&lt;p&gt;That'd better be my first thing in the morning tomorrow.&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>linux</category>
      <category>news</category>
      <category>security</category>
    </item>
    <item>
      <title>Jenkins nodes are offline</title>
      <dc:creator>ChienPang Lee</dc:creator>
      <pubDate>Mon, 11 May 2026 08:58:43 +0000</pubDate>
      <link>https://dev.to/chienpang_lee_f5d1ce793ef/jenkins-nodes-are-offline-7i1</link>
      <guid>https://dev.to/chienpang_lee_f5d1ce793ef/jenkins-nodes-are-offline-7i1</guid>
      <description>&lt;p&gt;Lab had a re-arrangement. We had decided to add a few new machines, sort the inventory and consolidate resources such as NIC cards, hard drives, memory dimms, etc. This also triggered a conscious decision of moving Jenkins service (the Jenkins master) to a new server which was new on pretty much every aspect, including OS. When all power was resumed and CI jobs kicked off, they hung.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqz76s7csjcrg8mp4404c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqz76s7csjcrg8mp4404c.png" alt=" " width="800" height="361"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I have a stage “hex” that was supposed to run some tests, estimated to be completed within 15 min. After the lab updates, a job was kicked off; it took around 7 hours without ending. As a result of that I blindly aborted it and gave it another shot, hoping it was only a glitch of CI flows. Another hour passed with the latest job while there’s still no good news. It’s a trouble-shooting task then.&lt;/p&gt;

&lt;p&gt;Scrolling down to the bottom of job log, I saw:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Still waiting to schedule task
All nodes of label ‘bldsrv_private_200.13_centos9￼’ are offline
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As I looked into the status of the mentioned node of that label, I ran into numerous unsuccessful executions: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2kit96t0zr4txhz5cvtm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2kit96t0zr4txhz5cvtm.png" alt=" " width="800" height="237"&gt;&lt;/a&gt;&lt;br&gt;
Clicking one of the failed executions gave me further information:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F94a684p6r5whtl0ljvzx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F94a684p6r5whtl0ljvzx.png" alt=" " width="800" height="380"&gt;&lt;/a&gt;&lt;br&gt;
The error of executing agent indicated something wrong with the docker container.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Docker Agent [localhost:5000/centos9-jail:latest on tcp://10.32.200.13:4243 ID 7076e0254ff86c26e7d9c6a8b3762fff5d6ae11401d96349e358570234942068]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Indeed we do use Docker Clouds. The configurations were double-checked as mentioned in previous post &lt;a href="https://chienpanglee.github.io/posts/jenkins-ci-unseen-building-bricks-of-parallelization/" rel="noopener noreferrer"&gt;Jenkins CI the unseen building bricks of parallelization&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[root@bldsrv-200-13 jenkins]# systemctl status docker
● docker.service - Docker Application Container Engine
     Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; preset: disabled)
     Active: active (running) since Mon 2026-05-04 19:50:42 CST; 2h 2min ago
TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com
   Main PID: 2170586 (dockerd)
      Tasks: 179
     Memory: 837.3M
     CGroup: /system.slice/docker.service
             ├─2170586 /usr/bin/dockerd -H tcp://10.32.200.13:4243 -H unix:///var/run/docker.sock --containerd=/run/containerd/containerd.sock
             ├─2171095 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 5000 -container-ip 172.17.0.2 -container-port 5000 -use-listen-fd
             ├─2171103 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 5000 -container-ip 172.17.0.2 -container-port 5000 -use-listen-fd
             ├─2207093 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 3128 -container-ip 172.17.0.3 -container-port 3128 -use-listen-fd
             ├─2207101 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 3128 -container-ip 172.17.0.3 -container-port 3128 -use-listen-fd
             ├─2207395 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 32768 -container-ip 172.17.0.4 -container-port 22 -use-listen-fd
             ├─2207403 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 32768 -container-ip 172.17.0.4 -container-port 22 -use-listen-fd
             ├─2207411 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 32769 -container-ip 172.17.0.4 -container-port 443 -use-listen-fd
             ├─2207420 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 32769 -container-ip 172.17.0.4 -container-port 443 -use-listen-fd
             ├─2207428 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 32770 -container-ip 172.17.0.4 -container-port 6900 -use-listen-fd
             └─2207437 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 32770 -container-ip 172.17.0.4 -container-port 6900 -use-listen-fd

May 04 21:52:56 bldsrv-200-13 dockerd[2170586]: time="2026-05-04T21:52:56.996976118+08:00" level=info msg="Container failed to exit within 10s of signal 37 - using the force" container=c3dfb867eb11eebeecc524654357fbdaa9e7ffef1192c603a9e5ee2e45da887e
May 04 21:52:57 bldsrv-200-13 dockerd[2170586]: time="2026-05-04T21:52:57.010293297+08:00" level=info msg="ignoring event" container=deba996363cb8b8e3fb6fa29d6a5fb6546bd4cd69f38ffdca4ea25db8cf14467 module=libcontainerd namespace=moby topic=/tasks/delete type="*events.TaskDelete"
May 04 21:52:57 bldsrv-200-13 dockerd[2170586]: time="2026-05-04T21:52:57.020578385+08:00" level=info msg="Container failed to exit within 10s of signal 37 - using the force" container=efe16ccd188d15c25840ec693db96fdd09e519fb3ee1795b0f96e364f5df29c6
May 04 21:52:57 bldsrv-200-13 dockerd[2170586]: time="2026-05-04T21:52:57.029078650+08:00" level=info msg="ignoring event" container=a569e6c24e8d3080a8205583587ea84137a1988126181029e659e4cb263b48c2 module=libcontainerd namespace=moby topic=/tasks/delete type="*events.TaskDelete"
May 04 21:52:57 bldsrv-200-13 dockerd[2170586]: time="2026-05-04T21:52:57.062594392+08:00" level=info msg="ignoring event" container=c3dfb867eb11eebeecc524654357fbdaa9e7ffef1192c603a9e5ee2e45da887e module=libcontainerd namespace=moby topic=/tasks/delete type="*events.TaskDelete"
May 04 21:52:57 bldsrv-200-13 dockerd[2170586]: time="2026-05-04T21:52:57.071636945+08:00" level=info msg="ignoring event" container=efe16ccd188d15c25840ec693db96fdd09e519fb3ee1795b0f96e364f5df29c6 module=libcontainerd namespace=moby topic=/tasks/delete type="*events.TaskDelete"
May 04 21:52:59 bldsrv-200-13 dockerd[2170586]: time="2026-05-04T21:52:59.609183494+08:00" level=warning msg="Error getting v2 registry: Get \"https://localhost:5000/v2/\": http: server gave HTTP response to HTTPS client"
May 04 21:52:59 bldsrv-200-13 dockerd[2170586]: time="2026-05-04T21:52:59.609542011+08:00" level=info msg="Attempting next endpoint for pull after error: Get \"https://localhost:5000/v2/\": http: server gave HTTP response to HTTPS client"
May 04 21:53:09 bldsrv-200-13 dockerd[2170586]: time="2026-05-04T21:53:09.611275126+08:00" level=warning msg="Error getting v2 registry: Get \"https://localhost:5000/v2/\": http: server gave HTTP response to HTTPS client"
May 04 21:53:09 bldsrv-200-13 dockerd[2170586]: time="2026-05-04T21:53:09.611553781+08:00" level=info msg="Attempting next endpoint for pull after error: Get \"https://localhost:5000/v2/\": http: server gave HTTP response to HTTPS client"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Docker daemon was running, listening on correct port which could be connected by Jenkins Clouds config. Note there were errors in the status:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;May 04 21:56:09 bldsrv-200-13 dockerd[2170586]: time="2026-05-04T21:56:09.617075720+08:00" level=warning msg="Error getting v2 registry: Get \"https://localhost:5000/v2/\": http: server gave HTTP response to HTTPS client"
May 04 21:56:09 bldsrv-200-13 dockerd[2170586]: time="2026-05-04T21:56:09.617843533+08:00" level=info msg="Attempting next endpoint for pull after error: Get \"https://localhost:5000/v2/\": http: server gave HTTP response to HTTPS client"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Jenkins Clouds to work, it relies on a docker image that has to be pulled and run. In our case, we organized our local image and push it into a local registry.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[root@bldsrv-200-13 jenkins]# docker images
REPOSITORY                            TAG       IMAGE ID       CREATED        SIZE
localhost:5000/centos9-jail           latest    3b5e86b7aa54   9 hours ago    5.84GB
registry                              2         26b2eb03618e   2 years ago    25.4MB

[root@bldsrv-200-13 jenkins]# docker ps | grep registry
8fccbf02c57e   registry:2                           "/entrypoint.sh /etc…"   10 days ago          Up 2 hours          0.0.0.0:5000-&amp;gt;5000/tcp, [::]:5000-&amp;gt;5000/tcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We did have our jail image, tagged ‘localhost:5000/centos9-jail’ Meanwhile, the “registry” service was running. Let’s see if our jail image was actually pushed into ‘registry’.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[root@bldsrv-200-13 jenkins]# curl http://localhost:5000/v2/_catalog
{"repositories":["app-jail","centos9-jail"]}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Right on! It’s there, sitting the the belly of registry service. Next question. Can the image be used?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[root@bldsrv-200-13 ~]# docker run --rm -ti localhost:5000/centos9-jail cat /etc/os-release
NAME="CentOS Stream"
VERSION="9"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="9"
PLATFORM_ID="platform:el9"
PRETTY_NAME="CentOS Stream 9"
ANSI_COLOR="0;31"
LOGO="fedora-logo-icon"
CPE_NAME="cpe:/o:centos:centos:9"
HOME_URL="https://centos.org/"
BUG_REPORT_URL="https://issues.redhat.com/"
REDHAT_SUPPORT_PRODUCT="Red Hat Enterprise Linux 9"
REDHAT_SUPPORT_PRODUCT_VERSION="CentOS Stream"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Looked all good. As a matter of fact, Jenkins could also pull and run the image and it’s been attempting to do so, as shown below&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;root@bldsrv-200-13 jenkins]# docker ps
CONTAINER ID   IMAGE                                COMMAND                  CREATED              STATUS              PORTS                                                                                                                                   NAMES
f771b48b1fb6   localhost:5000/centos9-jail:latest   "supervisord"            6 seconds ago        Up 5 seconds        22/tcp, 443/tcp, 6900/tcp                                                                                                               inspiring_noether
ed50f88e0e1e   localhost:5000/centos9-jail:latest   "supervisord"            16 seconds ago       Up 15 seconds       22/tcp, 443/tcp, 6900/tcp                                                                                                               jovial_hawking
3c6cce9c417e   localhost:5000/centos9-jail:latest   "supervisord"            26 seconds ago       Up 25 seconds       22/tcp, 443/tcp, 6900/tcp                                                                                                               boring_liskov
21ceedb00793   localhost:5000/centos9-jail:latest   "supervisord"            36 seconds ago       Up 35 seconds       22/tcp, 443/tcp, 6900/tcp                                                                                                               musing_rubin
0d60e410ad0c   localhost:5000/centos9-jail:latest   "supervisord"            46 seconds ago       Up 45 seconds       22/tcp, 443/tcp, 6900/tcp                                                                                                               vigilant_ptolemy
083a0201dc5b   localhost:5000/centos9-jail:latest   "supervisord"            56 seconds ago       Up 55 seconds       22/tcp, 443/tcp, 6900/tcp                                                                                                               flamboyant_benz
3271582c18d4   localhost:5000/centos9-jail:latest   "supervisord"            About a minute ago   Up About a minute   22/tcp, 443/tcp, 6900/tcp                                                                                                               heuristic_elion
72372f1a4869   localhost:5000/centos9-jail:latest   "supervisord"            About a minute ago   Up About a minute   22/tcp, 443/tcp, 6900/tcp                                                                                                               optimistic_chebyshev
0f87f9209861   localhost:5000/centos9-jail:latest   "supervisord"            About a minute ago   Up About a minute   22/tcp, 443/tcp, 6900/tcp                                                                                                               fervent_mayer
2542392eacd1   localhost:5000/centos9-jail:latest   "supervisord"            About a minute ago   Up About a minute   22/tcp, 443/tcp, 6900/tcp                                                                                                               admiring_satoshi
0eef81092693   localhost:5000/centos9-jail:latest   "supervisord"            About a minute ago   Up About a minute   22/tcp, 443/tcp, 6900/tcp                                                                                                               nice_hellman
bed3885c4c43   localhost:5000/centos9-jail:latest   "supervisord"            About a minute ago   Up About a minute   22/tcp, 443/tcp, 6900/tcp                                                                                                               vigorous_haibt
bf755d1e458d   localhost:5000/centos9-jail:latest   "supervisord"            2 minutes ago        Up 2 minutes        22/tcp, 443/tcp, 6900/tcp                                                                                                               stupefied_hawking
99df541b4c70   localhost:5000/centos9-jail:latest   "supervisord"            2 minutes ago        Up 2 minutes        22/tcp, 443/tcp, 6900/tcp                                                                                                               musing_jackson
0a0737b47f4c   localhost:5000/centos9-jail:latest   "supervisord"            2 minutes ago        Up 2 minutes        22/tcp, 443/tcp, 6900/tcp                                                                                                               eager_wescoff
19a58b56547a   localhost:5000/centos9-jail:latest   "supervisord"            2 minutes ago        Up 2 minutes        22/tcp, 443/tcp, 6900/tcp                                                                                                               stoic_mayer
7ac55893caaa   localhost:5000/centos9-jail:latest   "supervisord"            2 minutes ago        Up 2 minutes        22/tcp, 443/tcp, 6900/tcp                                                                                                               great_jang
1a507b140b72   localhost:5000/centos9-jail:latest   "supervisord"            2 minutes ago        Up 2 minutes        22/tcp, 443/tcp, 6900/tcp                                                                                                               eloquent_bardeen
51276557fda2   localhost:5000/centos9-jail:latest   "supervisord"            3 minutes ago        Up 3 minutes        22/tcp, 443/tcp, 6900/tcp                                                                                                               busy_perlman
44847b167803   localhost:5000/centos9-jail:latest   "supervisord"            3 minutes ago        Up 3 minutes        22/tcp, 443/tcp, 6900/tcp                                                                                                               recursing_saha
979b9a80d68a   localhost:5000/centos9-jail:latest   "supervisord"            3 minutes ago        Up 3 minutes        22/tcp, 443/tcp, 6900/tcp                                                                                                               mystifying_hodgkin
5707acd16c39   localhost:5000/centos9-jail:latest   "supervisord"            3 minutes ago        Up 3 minutes        22/tcp, 443/tcp, 6900/tcp                                                                                                               intelligent_shtern
0ee9f3464321   localhost:5000/centos9-jail:latest   "supervisord"            3 minutes ago        Up 3 minutes        22/tcp, 443/tcp, 6900/tcp                                                                                                               exciting_mcclintock
7121a36795c5   localhost:5000/centos9-jail:latest   "supervisord"            3 minutes ago        Up 3 minutes        22/tcp, 443/tcp, 6900/tcp                                                                                                               optimistic_diffie
b5a6bd81a5fe   localhost:5000/centos9-jail:latest   "supervisord"            4 minutes ago        Up 4 minutes        22/tcp, 443/tcp, 6900/tcp                                                                                                               upbeat_wilson
718a423f9a48   localhost:5000/centos9-jail:latest   "supervisord"            4 minutes ago        Up 4 minutes        22/tcp, 443/tcp, 6900/tcp                                                                                                               unruffled_boyd
bbddb26e1f10   localhost:5000/centos9-jail:latest   "supervisord"            4 minutes ago        Up 4 minutes        22/tcp, 443/tcp, 6900/tcp                                                                                                               angry_cohen
85ce490a3c81   localhost:5000/centos9-jail:latest   "supervisord"            4 minutes ago        Up 4 minutes        22/tcp, 443/tcp, 6900/tcp                                                                                                               adoring_chandrasekhar
961a1450dd79   localhost:5000/centos9-jail:latest   "supervisord"            4 minutes ago        Up 4 minutes        22/tcp, 443/tcp, 6900/tcp                                                                                                               sleepy_wing
dfc296d708f6   localhost:5000/centos9-jail:latest   "supervisord"            4 minutes ago        Up 4 minutes        22/tcp, 443/tcp, 6900/tcp                                                                                                               distracted_pascal
ce7ed1b4ae53   localhost:5000/centos9-jail:latest   "supervisord"            5 minutes ago        Up 5 minutes        22/tcp, 443/tcp, 6900/tcp                                                                                                               kind_mclaren
241bb3ffa64f   localhost:5000/centos9-jail:latest   "supervisord"            5 minutes ago        Up 5 minutes        22/tcp, 443/tcp, 6900/tcp                                                                                                               gallant_ramanujan
d62e31687600   localhost:5000/centos9-jail:latest   "supervisord"            5 minutes ago        Up 5 minutes        22/tcp, 443/tcp, 6900/tcp                                                                                                               adoring_greider
1da6532c8f20   localhost:5000/centos9-jail:latest   "supervisord"            5 minutes ago        Up 5 minutes        22/tcp, 443/tcp, 6900/tcp                                                                                                               sleepy_black
cbf98eb3fcf4   localhost:5000/centos9-jail:latest   "supervisord"            5 minutes ago        Up 5 minutes        22/tcp, 443/tcp, 6900/tcp                                                                                                               goofy_sanderson
4e65eebe1e50   localhost:5000/centos9-jail:latest   "supervisord"            5 minutes ago        Up 5 minutes        22/tcp, 443/tcp, 6900/tcp                                                                                                               serene_turing
36d67da7a5f2   localhost:5000/centos9-jail:latest   "supervisord"            6 minutes ago        Up 6 minutes        22/tcp, 443/tcp, 6900/tcp                                                                                                               zealous_bose
9a286435dc64   localhost:5000/centos9-jail:latest   "supervisord"            6 minutes ago        Up 6 minutes        22/tcp, 443/tcp, 6900/tcp                                                                                                               inspiring_franklin
2e91567b689e   localhost:5000/centos9-jail:latest   "supervisord"            6 minutes ago        Up 6 minutes        22/tcp, 443/tcp, 6900/tcp                                                                                                               clever_swanson
f42d26c35459   localhost:5000/centos9-jail:latest   "supervisord"            6 minutes ago        Up 6 minutes        22/tcp, 443/tcp, 6900/tcp                                                                                                               jolly_wozniak
aae69071cf05   localhost:5000/centos9-jail:latest   "supervisord"            6 minutes ago        Up 6 minutes        22/tcp, 443/tcp, 6900/tcp                                                                                                               sweet_swirles
66d94d544711   localhost:5000/centos9-jail:latest   "supervisord"            6 minutes ago        Up 6 minutes        22/tcp, 443/tcp, 6900/tcp                                                                                                               stoic_mclaren
2b84df260fd8   localhost:5000/centos9-jail:latest   "supervisord"            7 minutes ago        Up 7 minutes        22/tcp, 443/tcp, 6900/tcp                                                                                                               confident_agnesi
d93c712cc0db   localhost:5000/centos9-jail:latest   "supervisord"            7 minutes ago        Up 7 minutes        22/tcp, 443/tcp, 6900/tcp                                                                                                               flamboyant_goodall
3c82531ce7c1   localhost:5000/centos9-jail:latest   "supervisord"            7 minutes ago        Up 7 minutes        22/tcp, 443/tcp, 6900/tcp                                                                                                               mystifying_newton
ba44f12b9a35   localhost:5000/centos9-jail:latest   "supervisord"            7 minutes ago        Up 7 minutes        22/tcp, 443/tcp, 6900/tcp                                                                                                               eager_gauss
8b8518ed60da   localhost:5000/centos9-jail:latest   "supervisord"            7 minutes ago        Up 7 minutes        22/tcp, 443/tcp, 6900/tcp                                                                                                               nervous_pike
4e99a80bb0f0   localhost:5000/centos9-jail:latest   "supervisord"            7 minutes ago        Up 7 minutes        22/tcp, 443/tcp, 6900/tcp                                                                                                               cool_hypatia
d76c8e79f357   localhost:5000/centos9-jail:latest   "supervisord"            8 minutes ago        Up 8 minutes        22/tcp, 443/tcp, 6900/tcp                                                                                                               kind_curie
569d813a33e3   localhost:5000/centos9-jail:latest   "supervisord"            8 minutes ago        Up 8 minutes        22/tcp, 443/tcp, 6900/tcp                                                                                                               relaxed_darwin
f8e51f13c4ce   localhost:5000/centos9-jail:latest   "supervisord"            8 minutes ago        Up 8 minutes        22/tcp, 443/tcp, 6900/tcp                                                                                                               lucid_visvesvaraya4
33aee7bf5b58   localhost:5000/centos9-jail:latest   "supervisord"            8 minutes ago        Up 8 minutes        22/tcp, 443/tcp, 6900/tcp                                                                                                               nice_lovelace
8d93a012dbf5   localhost:5000/centos9-jail:latest   "supervisord"            8 minutes ago        Up 8 minutes        22/tcp, 443/tcp, 6900/tcp                                                                                                               magical_curie
90c14aebb7ee   localhost:5000/centos9-jail:latest   "supervisord"            8 minutes ago        Up 8 minutes        22/tcp, 443/tcp, 6900/tcp                                                                                                               cool_mirzakhani
f083bbad20f3   localhost:5000/centos9-jail:latest   "supervisord"            9 minutes ago        Up 9 minutes        22/tcp, 443/tcp, 6900/tcp                                                                                                               thirsty_faraday
087195cae4ad   localhost:5000/centos9-jail:latest   "supervisord"            9 minutes ago        Up 9 minutes        22/tcp, 443/tcp, 6900/tcp                                                                                                               suspicious_boyd
f7bdc9eb5218   localhost:5000/centos9-jail:latest   "supervisord"            9 minutes ago        Up 9 minutes        22/tcp, 443/tcp, 6900/tcp                                                                                                               lucid_germain
24a2e44056e0   localhost:5000/centos9-jail:latest   "supervisord"            9 minutes ago        Up 9 minutes        22/tcp, 443/tcp, 6900/tcp                                                                                                               gracious_vaughan
65f0a0f24e30   localhost:5000/centos9-jail:latest   "supervisord"            9 minutes ago        Up 9 minutes        22/tcp, 443/tcp, 6900/tcp                                                                                                               wizardly_proskuriakova
a23734fa562c   localhost:5000/centos9-jail:latest   "supervisord"            9 minutes ago        Up 9 minutes        22/tcp, 443/tcp, 6900/tcp                                                                                                               musing_cannon
a249f9cd2e1c   localhost:5000/centos9-jail:latest   "supervisord"            10 minutes ago       Up 10 minutes       22/tcp, 443/tcp, 6900/tcp                                                                                                               xenodochial_greider
81ab4f2c90f7   localhost:5000/centos9-jail:latest   "supervisord"            10 minutes ago       Up 10 minutes       22/tcp, 443/tcp, 6900/tcp                                                                                                               agitated_poitras
a100b4aef1bf   localhost:5000/centos9-jail          "/sbin/init"             2 hours ago          Up 2 hours          0.0.0.0:32768-&amp;gt;22/tcp, [::]:32768-&amp;gt;22/tcp, 0.0.0.0:32769-&amp;gt;443/tcp, [::]:32769-&amp;gt;443/tcp, 0.0.0.0:32770-&amp;gt;6900/tcp, [::]:32770-&amp;gt;6900/tcp   centos9_cubecos_chienpang_200.13
f9683335cda9   ubuntu/squid:latest                  "entrypoint.sh -f /e…"   2 hours ago          Up 2 hours          0.0.0.0:3128-&amp;gt;3128/tcp, [::]:3128-&amp;gt;3128/tcp                                                                                             squid
8fccbf02c57e   registry:2                           "/entrypoint.sh /etc…"   10 days ago          Up 2 hours          0.0.0.0:5000-&amp;gt;5000/tcp, [::]:5000-&amp;gt;5000/tcp                                                                                             registry
[root@bldsrv-200-13 jenkins]#
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The numerous attempts of container processes matched what we have seen in the above snapshot of Jenkins agents. So far we had a direction that Jenkins Clouds did not work. The backend services, images, registry and Jenkins configurations all seemed to work. Moreover, Jenkins started the containers (many of them) but none could make him happy.&lt;/p&gt;

&lt;p&gt;Without further clues, I turned my attention to Jenkins logs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6wh5gf9bg0ujn9c37i4k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6wh5gf9bg0ujn9c37i4k.png" alt=" " width="800" height="164"&gt;&lt;/a&gt;&lt;br&gt;
At this point, we finally knew what Jenkins did not like - the Java versions&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Caused by: java.lang.UnsupportedClassVersionError: hudson/slaves/SlaveComputer$SlaveVersion has been compiled by a more recent version of the Java Runtime (class file version 65.0), this version of the Java Runtime only recognizes class file versions up to 61.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We had a new server, with newly-installed OS (Ubuntu 24.04.4 LTS). Jenkins server itself is also a container service. I have organized it as one of our Makefile target that it’d pull latest jenkins image from Docker hub upon execution.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;root@bldsrv-200-10:~# docker exec -ti jenkins ls -lt /usr/share/jenkins/ref/init.groovy.d/
total 0
root@bldsrv-200-10:~# docker ps
CONTAINER ID   IMAGE                        COMMAND                  CREATED        STATUS        PORTS                                                                                          NAMES
d3bfdf795397   danieldent/nginx-ssl-proxy   "/init"                  11 hours ago   Up 11 hours   80/tcp, 0.0.0.0:443-&amp;gt;443/tcp, [::]:443-&amp;gt;443/tcp                                                nginx-proxy
33b482e7e628   jenkins/jenkins:lts          "/usr/bin/tini -- /u…"   11 hours ago   Up 11 hours   0.0.0.0:8080-&amp;gt;8080/tcp, [::]:8080-&amp;gt;8080/tcp, 0.0.0.0:50000-&amp;gt;50000/tcp, [::]:50000-&amp;gt;50000/tcp   jenkins
dd02cbd4bf72   aheimsbakk/munin-alpine      "/usr/bin/dumb-init …"   5 weeks ago    Up 11 hours   0.0.0.0:80-&amp;gt;80/tcp, [::]:80-&amp;gt;80/tcp                                                            munin-server
d9734f81f8d5   registry:2                   "/entrypoint.sh /etc…"   5 weeks ago    Up 3 days     0.0.0.0:5000-&amp;gt;5000/tcp, [::]:5000-&amp;gt;5000/tcp                                                    registry
root@bldsrv-200-10:~# docker inspect --format ''  jenkins
2.555.1

root@bldsrv-200-10:~# docker exec -ti jenkins java --version
openjdk 21.0.10 2026-01-20 LTS
OpenJDK Runtime Environment Temurin-21.0.10+7 (build 21.0.10+7-LTS)
OpenJDK 64-Bit Server VM Temurin-21.0.10+7 (build 21.0.10+7-LTS, mixed mode)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And here is the culprit, the Java version of latest Jenkins image on &lt;a href="https://hub.docker.com/r/jenkins/jenkins" rel="noopener noreferrer"&gt;https://hub.docker.com/r/jenkins/jenkins&lt;/a&gt; is 2.555.1, exactly what we have currently. However, the Java version 21 of Jenkins master does not match that of our agent (jail image Java version 17). See below in our worker nodes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[root@bldsrv-200-13 jenkins]# docker run --rm -ti localhost:5000/centos9-jail:latest java --version
openjdk 17.0.18 2026-01-20 LTS
OpenJDK Runtime Environment (Red_Hat-17.0.18.0.8-2) (build 17.0.18+8-LTS)
OpenJDK 64-Bit Server VM (Red_Hat-17.0.18.0.8-2) (build 17.0.18+8-LTS, mixed mode, sharing)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As the cause becomes clear so is the fix. Either keeping lowering the Java version in jail or bumping it up in the Docker image launched by Jenkins Clouds. For the develop wheel to move forward, the later is preferred.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RUN dnf install -y java-21-openjdk java-21-openjdk-devel
RUN alternatives --set java java-21-openjdk.x86_64
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The final dockerfile was updated with an additional line to adhere it to version 21 because other packages, such as maven, in my relatively old Centos8 base image requres Java 17. We’d end up having multiple versions of Java SDK, not obvious which would be the default one.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frgl26438iwjl2b8mssov.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frgl26438iwjl2b8mssov.png" alt=" " width="800" height="478"&gt;&lt;/a&gt;&lt;br&gt;
Four days later, we had a green pipeline again. The impairment was cleared such that dev work could move forward. Agile enough? Not in my eyes. Tech enough? I’d say so.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2lfy8ytnj0r7ecet3kkb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2lfy8ytnj0r7ecet3kkb.png" alt=" " width="800" height="255"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Read the full technical article here: &lt;a href="https://chienpanglee.github.io/posts/jenkins-node-are-offline/" rel="noopener noreferrer"&gt;Jenkins nodes are offline&lt;/a&gt;&lt;/p&gt;

</description>
      <category>jenkins</category>
      <category>cicd</category>
    </item>
    <item>
      <title>Jenkins CI the unseen building bricks of parallelization</title>
      <dc:creator>ChienPang Lee</dc:creator>
      <pubDate>Mon, 11 May 2026 08:40:25 +0000</pubDate>
      <link>https://dev.to/chienpang_lee_f5d1ce793ef/jenkins-ci-the-unseen-building-bricks-of-parallelization-226m</link>
      <guid>https://dev.to/chienpang_lee_f5d1ce793ef/jenkins-ci-the-unseen-building-bricks-of-parallelization-226m</guid>
      <description>&lt;p&gt;One of my Jenkins pipelines was set up and, without further scrutiny, it just worked. It ran multiple stages that took several hours and eventually ended in green — the kind of result that contributes to a bright, sunny day. Though it was just past lunchtime, I cracked open a bottle of Gösser and called it a day.&lt;/p&gt;

&lt;p&gt;These small rewards in the middle of routine work feel deserved, especially when you’re the one making the calls. There’s a subtle but important connection between ownership and responsibility — when things succeed, you feel it; when they fail, you own that too.&lt;/p&gt;

&lt;p&gt;But celebration often are followed by reflection. The next step. What could be improved?&lt;/p&gt;

&lt;p&gt;Given our quick observation, one obvious area is reducing total pipeline execution time. That naturally leads to parallelization. Jenkins, our most senior and tireless employee ,“Jenkins”, has a firm grip on this as well. In a Jenkins Pipeline, parallel execution is achieved through the parallel block (in Groovy), allowing independent stages and steps (like system tests and end-to-end tests) to run simultaneously.&lt;/p&gt;

&lt;p&gt;However, digging deeper into parallelization reveals that it’s not just a switch you flip and expect light. For parallel execution to be reliable and scalable, certain foundational bricks have to be in place. Two key bricks are:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Environment Reusability
Environment Isolation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;In my pipelines are the followings stages: source → jail → build → unit → system → e2e → publish&lt;/p&gt;

&lt;p&gt;Each stage depends on the outputs of previous one. This falls intuitively into reusability category. For example, source (code) is fetched once and reused multiple times later. Same thing goes to jail and build. The stages take place in sequence.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;BLDSRV&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"bldsrv_"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;BUILD_TYPE&lt;/span&gt;
&lt;span class="n"&gt;lock&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"${BLDSRV}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"${BLDSRV}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'source'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"checkout source"&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'jail'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"prepare build env. jail"&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'build'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"build, compile and generate firmware"&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'unit'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"run unit tests"&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'system'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"run system tests"&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'e2e'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"run e2e tests"&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'publish'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"publish and deploy artifacts"&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The stages enclosed within the node block would execute on the build server defined by the BLDSRV variable, which maps to nodes configured in Jenkins. Additionally, the lock block ensures that only one job at a time can occupy a given node (resource label), preventing interference from other jobs running concurrently on the same resource. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsfv9fr8slv8jrdb5abyj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsfv9fr8slv8jrdb5abyj.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Besides, inside each stage we’d like steps to run in parallel. build, unit, system and e2e are good fits for implementing parallelization. Take e2e test as an example. It needs to use disk which is installed with previouly built firmware from system stage which in turn relies on the firmware from build stage and as well as green results of unit test. The goal of e2e is to boot from the installed firmware and perform tasks such as configuration and executing test suites against it.&lt;/p&gt;

&lt;p&gt;This is where another key Jenkins feature steps up. The parallel block.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;BLDSRV&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"bldsrv_"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;BUILD_TYPE&lt;/span&gt;
&lt;span class="n"&gt;lock&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"${BLDSRV}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"${BLDSRV}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'source'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"checkout source"&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'jail'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"prepare fake root build env."&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'build'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"build, compile and generate firmware"&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'unit'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"run unit tests"&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'system'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"run system tests"&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'e2e'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;e2etest&lt;/span&gt;&lt;span class="o"&gt;=[:]&lt;/span&gt;
            &lt;span class="n"&gt;e2etest&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"test_suite1"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"run e2e test suite 1"&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
            &lt;span class="n"&gt;e2etest&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"test_suite2"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"run e2e test suite 2"&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
            &lt;span class="n"&gt;parallel&lt;/span&gt; &lt;span class="n"&gt;e2etest&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'publish'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"publish and deploy artifacts"&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This basic pipeline would work in a quick demo but it’d fall short with our end to end testing goal — validating a fully-deployed, networked, configured cloud platform, consisting of multiple nodes, running the firmware(Operating System) produced in our build stage.&lt;/p&gt;

&lt;p&gt;To address this, I leveraged another powerful capability, Jenkins Clouds. Underneath the surface it is backed by Docker containerization technology.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;[root@localhost workspace]#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; /usr/lib/systemd/system/docker.service
&lt;span class="go"&gt;[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target nss-lookup.target docker.socket firewalld.service containerd.service time-set.target
Wants=network-online.target containerd.service
Requires=docker.socket
StartLimitBurst=3
StartLimitIntervalSec=60

[Service]
Type=notify
&lt;/span&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;the default is not to use systemd &lt;span class="k"&gt;for &lt;/span&gt;cgroups because the delegate issues still
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;exists and systemd currently does not support the cgroup feature &lt;span class="nb"&gt;set &lt;/span&gt;required
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for &lt;/span&gt;containers run by docker
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;ExecStart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/bin/dockerd &lt;span class="nt"&gt;-H&lt;/span&gt; fd:// &lt;span class="nt"&gt;--containerd&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/run/containerd/containerd.sock
&lt;span class="go"&gt;ExecStart=/usr/bin/dockerd -H tcp://10.32.200.13:4243 -H unix:///var/run/docker.sock --containerd=/run/containerd/containerd.sock
&lt;/span&gt;&lt;span class="gp"&gt;ExecReload=/bin/kill -s HUP $&lt;/span&gt;MAINPID
&lt;span class="go"&gt;TimeoutStartSec=0
RestartSec=2
Restart=always

&lt;/span&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Having non-zero Limit&lt;span class="k"&gt;*&lt;/span&gt;s causes performance problems due to accounting overhead
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in &lt;/span&gt;the kernel. We recommend using cgroups to &lt;span class="k"&gt;do &lt;/span&gt;container-local accounting.
&lt;span class="go"&gt;LimitNPROC=infinity
LimitCORE=infinity

&lt;/span&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Comment TasksMax &lt;span class="k"&gt;if &lt;/span&gt;your systemd version does not support it.
&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Only systemd 226 and above support this option.
&lt;span class="go"&gt;TasksMax=infinity

&lt;/span&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;set &lt;/span&gt;delegate &lt;span class="nb"&gt;yes &lt;/span&gt;so that systemd does not reset the cgroups of docker containers
&lt;span class="go"&gt;Delegate=yes

&lt;/span&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;kill &lt;/span&gt;only the docker process, not all processes &lt;span class="k"&gt;in &lt;/span&gt;the cgroup
&lt;span class="go"&gt;KillMode=process
OOMScoreAdjust=-500

[Install]
WantedBy=multi-user.target
&lt;/span&gt;&lt;span class="gp"&gt;[root@localhost workspace]#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; /etc/docker/daemon.json
&lt;span class="go"&gt;{
  "storage-driver": "overlay2",
  "data-root": "/var/lib/docker",
  "features": {
    "buildkit": true
  },
  "exec-opts": ["native.cgroupdriver=cgroupfs"]
}

&lt;/span&gt;&lt;span class="gp"&gt;[root@localhost workspace]#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;systemctl status docker &lt;span class="nt"&gt;-l&lt;/span&gt;
&lt;span class="go"&gt;● docker.service - Docker Application Container Engine
&lt;/span&gt;&lt;span class="gp"&gt;     Loaded: loaded (/usr/lib/systemd/system/docker.service;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;enabled&lt;span class="p"&gt;;&lt;/span&gt; preset: disabled&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;     Active: active (running) since Fri 2026-04-24 15:04:23 CST;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;5 days ago
&lt;span class="go"&gt;TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com
   Main PID: 987664 (dockerd)
      Tasks: 887
     Memory: 10.9G
     CGroup: /system.slice/docker.service
             ├─ 987664 /usr/bin/dockerd -H tcp://10.32.200.13:4243 -H unix:///var/run/docker.sock --containerd=/run/containerd/containerd.sock

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The above are the docker settings on worker node. Jenkins Clouds needs to be able to communicate and control it. Make sure Jenkins sees and can talk to your docker daemon of worker node by having a successful &lt;strong&gt;Test Connection&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe78nj1nt3v3krepf1unj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe78nj1nt3v3krepf1unj.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With these in place, our pipeline evolves into:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;BLDSRV&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"bldsrv_"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;BUILD_TYPE&lt;/span&gt;
&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;CLOUD_NODE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BLDSRV&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;"_"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;PLATFORM&lt;/span&gt;
&lt;span class="n"&gt;lock&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"${BLDSRV}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"${BLDSRV}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'source'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"checkout source"&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'jail'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"prepare fake root build env."&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'build'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"build, compile and generate firmware"&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'unit'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"run unit tests"&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'system'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"run system tests"&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'e2e'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;e2etest&lt;/span&gt;&lt;span class="o"&gt;=[:]&lt;/span&gt;
            &lt;span class="n"&gt;e2etest&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"test_suite1"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"${CLOUD_NODE}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"run e2e test suite 1"&lt;/span&gt;
                &lt;span class="o"&gt;}&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
            &lt;span class="n"&gt;e2etest&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"test_suite2"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"${CLOUD_NODE}"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"run e2e test suite 2"&lt;/span&gt;
                &lt;span class="o"&gt;}&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
            &lt;span class="n"&gt;parallel&lt;/span&gt; &lt;span class="n"&gt;e2etest&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'publish'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"publish and deploy artifacts"&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, each e2e test suite runs in parallel within its own containerized environment. These environments are fully isolated, with separate networking and filesystems. At the same time, shared data (such as build artifacts) is made available through volume mapping, ensuring reusability. All we’ve gone through this far is, nonetheless, still not the full story of the challenges I had. My e2e test construct is huge. The bootable drive and required data drives themselves take 100+ GB. The initial configuration alone took long time, which is another piece I had to optimize and made it reusable. Some long running steps can be started and put into background while letting other executiions take off. Not to mention the management of locally-hosted Docker registry where localhost:5000/centos9-jail resides. The fun never really ends. But anyhow, it’s another time to have a toast.&lt;/p&gt;

&lt;p&gt;Read the full technical article here: &lt;a href="https://chienpanglee.github.io/posts/jenkins-ci-unseen-building-bricks-of-parallelization/" rel="noopener noreferrer"&gt;Jenkins CI the unseen building bricks of parallelization&lt;/a&gt;&lt;/p&gt;

</description>
      <category>jenkins</category>
      <category>cicd</category>
    </item>
    <item>
      <title>Small footprint of a power editor in initramfs</title>
      <dc:creator>ChienPang Lee</dc:creator>
      <pubDate>Mon, 04 May 2026 11:15:17 +0000</pubDate>
      <link>https://dev.to/chienpang_lee_f5d1ce793ef/small-footprint-of-a-power-editor-in-initramfs-5gkc</link>
      <guid>https://dev.to/chienpang_lee_f5d1ce793ef/small-footprint-of-a-power-editor-in-initramfs-5gkc</guid>
      <description>&lt;p&gt;Have you ever found yourself trapped in a restricted root filesystem where every megabyte has to be weighed? For most people, this is a rarity, but when working with &lt;strong&gt;initramfs&lt;/strong&gt;—the transient filesystem used by the Linux kernel during the boot process—space is everything.&lt;/p&gt;

&lt;p&gt;A text mode editor is a vital tool for navigating filesystem, debugging problems and changing configurations. However, as a dedicated &lt;strong&gt;Emacs&lt;/strong&gt; user, the standard lightweight alternatives like &lt;code&gt;vi&lt;/code&gt;, &lt;code&gt;nano&lt;/code&gt;, or &lt;code&gt;pico&lt;/code&gt; is not in the favored list. In such an extreme environment where I from time to time have to handle critical boot issues, a working, light, and powerful editor is to me not just a vital tool but a luxury.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Challenge: Why Not &lt;code&gt;emacs-nox&lt;/code&gt;?
&lt;/h3&gt;

&lt;p&gt;Navigating a filesystem without a proper editor is like living in a read-only world. While &lt;code&gt;echo&lt;/code&gt; redirection and &lt;code&gt;sed&lt;/code&gt; can handle simple tasks, complex configuration changes become a painful exercise in precision.&lt;/p&gt;

&lt;p&gt;Normally, I would reach for &lt;code&gt;emacs-nox&lt;/code&gt; (the full Emacs experience without the X11 overhead). But in an initramfs environment, adding &lt;code&gt;emacs-nox&lt;/code&gt; and its dependencies can balloon the image size by over 100MB. For a system that needs to be lean and fast, that’s simply not an option.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Solution: &lt;code&gt;mg&lt;/code&gt; (Micro GNU Emacs)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;mg&lt;/code&gt;&lt;/strong&gt; is a microscopic editor that maintains Emacs keybindings while remaining incredibly lightweight. On a standard Ubuntu system, it’s a tiny footprint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# apt show mg
Package: mg
Version: 20230501-1
Priority: optional
Section: universe/editors
Origin: Ubuntu
Maintainer: Ubuntu Developers &amp;lt;ubuntu-devel-discuss@lists.ubuntu.com&amp;gt;
Original-Maintainer: Harald Dunkel &amp;lt;harri@afaics.de&amp;gt;
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 273 kB
Provides: editor
Depends: libbsd0 (&amp;gt;= 0.5.0), libc6 (&amp;gt;= 2.38), libtinfo6 (&amp;gt;= 6)
Homepage: https://homepage.boetes.org/software/mg/
Download-Size: 121 kB
APT-Manual-Installed: yes
APT-Sources: http://mirror.math.princeton.edu/pub/ubuntu noble/universe amd64 Packages
Description: microscopic GNU Emacs-style editor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On a standard Linux operating system like Ubuntu, it is as simple as&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;root@frad:~/Workspace/# &lt;span class="c"&gt;# apt-get install mg&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nonetheless, we are dealing with a mimimized distroless rootfilesystem that doen't come with package managers of any sort. To get mg to work inside mini rootfs, assuming you're on a Ubuntu, install mg with the above. After installation, the binary can be located with&lt;/p&gt;

&lt;p&gt;All that is still on host system. To get mg working in initramfs, we have to perform a manual port.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Binary Placement
&lt;/h2&gt;

&lt;p&gt;First, we locate the binary on the host and copy it into our target initramfs directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;root@frad:~/Workspace/# &lt;span class="c"&gt;# which mg&lt;/span&gt;
/usr/bin/mg
root@frad:~/Workspace/# &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="nt"&gt;-D&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt; 0755 /usr/bin/mg ~/Workspace/img/mini_initramfs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let take a peek how it'd work inside the rootfs&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;root@frad:~/Workspace/# &lt;span class="nb"&gt;chroot&lt;/span&gt; ~/Workspace/img/mini_initramfs
/ &lt;span class="c"&gt;# echo $PATH&lt;/span&gt;
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
/ &lt;span class="c"&gt;# mg&lt;/span&gt;
/bin/sh: mg: not found
/ &lt;span class="c"&gt;# ls -lt /bin/mg&lt;/span&gt;
&lt;span class="nt"&gt;-rwxr-xr-x&lt;/span&gt;    1 0        0           231080 Apr 20 06:48 /bin/mg
/ &lt;span class="c"&gt;#&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Invoking md command inside the mini initramfs came back with an error that "mg" was not found. Further commands confirmed that the binary was there and path was also correct. The installed mg turned out to be a dynamically-linked binary so the shared libraries also need to be copied.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Resolving Dependencies
&lt;/h2&gt;

&lt;p&gt;To fix this, we use ldd to identify the shared library dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;root@frad:~/Workspace/# ldd /usr/bin/mg
    libtinfo.so.6 &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; /lib/x86_64-linux-gnu/libtinfo.so.6
    libbsd.so.0 &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; /lib/x86_64-linux-gnu/libbsd.so.0
    libc.so.6 &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; /lib/x86_64-linux-gnu/libc.so.6
    /lib64/ld-linux-x86-64.so.2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We must replicate this structure inside our initramfs:&lt;/p&gt;

&lt;h1&gt;
  
  
  Create directory structure and symlinks
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;root@frad:~/Workspace/# &lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/Workspace/img/mini_initramfs/usr/lib/x86_64-linux-gnu
root@frad:~/Workspace/# &lt;span class="nb"&gt;ln&lt;/span&gt; &lt;span class="nt"&gt;-sf&lt;/span&gt; usr/lib ~/Workspace/img/mini_initramfs/lib
root@frad:~/Workspace/# &lt;span class="nb"&gt;ln&lt;/span&gt; &lt;span class="nt"&gt;-sf&lt;/span&gt; ../lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 ~/Workspace/img/mini_initramfs/lib64/
root@frad:~/Workspace/# ldd /usr/bin/mg | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"=&amp;gt;"&lt;/span&gt; | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{print $3}'&lt;/span&gt; | xargs &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="nb"&gt;cp&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt; ~/Workspace/img/mini_initramfs&lt;span class="o"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 3: Solving the "Terminal Panic"
&lt;/h2&gt;

&lt;p&gt;After this, give it another try!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;root@frad:~/Workspace/# &lt;span class="nb"&gt;chroot&lt;/span&gt; ~/Workspace/img/mini_initramfs
/ &lt;span class="c"&gt;# mg&lt;/span&gt;
panic: Terminal setup failed
/ &lt;span class="c"&gt;# echo $TERM&lt;/span&gt;
xterm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;mg was launched with previous errors gone. But there appeared to be a new error about terminal panic. The terminal is "xterm". With some more digging it pointed to missing data/db of xterm capabilities. As such, I copied xterm pertinent data into rootfs&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/bin/bash ~/Workspace/scripts/install ~/Workspace/img/mini_initramfs /usr/share/terminfo/x/xterm usr/share/terminfo/x

root@frad:~/Workspace/# &lt;span class="nb"&gt;chroot&lt;/span&gt; ~/Workspace/img/mini_initramfs
/ &lt;span class="c"&gt;# ls -lt /usr/share/terminfo/x/&lt;/span&gt;
total 4
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt;    1 0        0             3991 Apr  8  2024 xterm
/ &lt;span class="c"&gt;# mg&lt;/span&gt;
/ &lt;span class="c"&gt;#&lt;/span&gt;
/ &lt;span class="c"&gt;# ls -lt /lib/x86_64-linux-gnu/ /lib64&lt;/span&gt;
lrwxrwxrwx    1 0        0                9 Apr 20 08:19 /lib64 -&amp;gt; usr/lib64

/lib/x86_64-linux-gnu/:
total 2652
&lt;span class="nt"&gt;-rwxr-xr-x&lt;/span&gt;    1 0        0           236616 Apr 20 08:19 ld-linux-x86-64.so.2
&lt;span class="nt"&gt;-rwxr-xr-x&lt;/span&gt;    1 0        0             3632 Apr 20 08:19 ld-linux-x86-64.so.2.debug
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt;    1 0        0            80888 Apr 20 08:19 libbsd.so.0
&lt;span class="nt"&gt;-rwxr-xr-x&lt;/span&gt;    1 0        0          2125328 Apr 20 08:19 libc.so.6
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt;    1 0        0            55536 Apr 20 08:19 libmd.so.0
&lt;span class="nt"&gt;-rw-r--r--&lt;/span&gt;    1 0        0           208328 Apr 20 08:19 libtinfo.so.6
/ &lt;span class="c"&gt;# du -hsc /lib/x86_64-linux-gnu/ /lib64 /bin/mg&lt;/span&gt;
2.6M    /lib/x86_64-linux-gnu/
0   /lib64
228.0K  /bin/mg
2.8M    total
/ &lt;span class="c"&gt;# mg /lib/x86_64-linux-gnu/&lt;/span&gt;
/ &lt;span class="c"&gt;#&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Result
&lt;/h2&gt;

&lt;p&gt;And there we go: a functional, Emacs-style editor with small footprint (2.8M in total) in a distroless, customized and size-critical filesystem. I'd play a mission-critical role when it comes to future trouble-shooting during bootstrapping, expecially when kernel panics.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnv9p44yh8ena9cspjbf2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnv9p44yh8ena9cspjbf2.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>initramfs</category>
      <category>emacs</category>
      <category>linux</category>
      <category>kernel</category>
    </item>
  </channel>
</rss>
