<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>DevSensation</title><link href="https://avisiedo.github.io/blog/" rel="alternate"/><link href="https://avisiedo.github.io/blog/feeds/all.atom.xml" rel="self"/><id>https://avisiedo.github.io/blog/</id><updated>2026-03-16T21:04:00+01:00</updated><entry><title>Disabling application in macOS</title><link href="https://avisiedo.github.io/blog/disabling-application-in-macos.html" rel="alternate"/><published>2026-03-16T21:04:00+01:00</published><updated>2026-03-16T21:04:00+01:00</updated><author><name>Alejandro Visiedo</name></author><id>tag:avisiedo.github.io,2026-03-16:/blog/disabling-application-in-macos.html</id><summary type="html">&lt;p&gt;Disabling applications to reduce surface attacks.&lt;/p&gt;</summary><content type="html">&lt;h1&gt;Disabling application in macOS&lt;/h1&gt;
&lt;p&gt;In macOS systems I would like to totally disable some
applications which have been in focus because of
security flaws, such as FaceTime, Messages and Phone.
Personally I do not use any of them, and that makes me
think, why not reduce the attack surface by preventing them from
being executed?&lt;/p&gt;
&lt;h2&gt;Searching information about .mobileconfig&lt;/h2&gt;
&lt;p&gt;It has been very tough to find information about
.mobileconfig examples to disable those applications.
Indeed I am surprised that AI could help me more than
trying to find specific information, because it used to
be the scenario where AI starts to hallucinate.&lt;/p&gt;
&lt;h2&gt;What I found&lt;/h2&gt;
&lt;p&gt;I found an example in an AI prompt which was showing
the example below (it was extending even for Chess.app;
which indeed is not used normally).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;/span&gt;
&lt;span class="cp"&gt;&amp;lt;!DOCTYPE plist PUBLIC &amp;quot;-//Apple//DTD PLIST 1.0//EN&amp;quot; &amp;quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&amp;quot;&amp;amp;gt;&lt;/span&gt;
&lt;span class="cp"&gt;&amp;lt;plist version=&amp;quot;1.0&amp;quot;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;dict&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;PayloadIdentifier&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;com.company.mcx.blockapps&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;PayloadRemovalDisallowed&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;true/&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;PayloadScope&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;System&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;PayloadType&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;Configuration&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;PayloadUUID&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;9c24d6b3-6233-4a08-a48d-9068f4f76cf0&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;PayloadOrganization&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;Company&lt;span class="w"&gt; &lt;/span&gt;Name&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;PayloadVersion&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;integer&amp;gt;&lt;/span&gt;1&lt;span class="nt"&gt;&amp;lt;/integer&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;PayloadDisplayName&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;Application&lt;span class="w"&gt; &lt;/span&gt;Restrictions&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;PayloadContent&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;array&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;dict&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;PayloadType&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;com.apple.applicationaccess.new&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;PayloadVersion&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;integer&amp;gt;&lt;/span&gt;1&lt;span class="nt"&gt;&amp;lt;/integer&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;PayloadIdentifier&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;MCXToProfile.9c24d6b3-6233-4a08-a48d-9068f4f76cf0.alacarte.customsettings.2476221c-1870-4f3e-8c52-52386029c4cf&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;PayloadEnabled&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;true/&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;PayloadUUID&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;2476221c-1870-4f3e-8c52-52386029c4cf&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;PayloadDisplayName&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;Block&lt;span class="w"&gt; &lt;/span&gt;Specified&lt;span class="w"&gt; &lt;/span&gt;Applications&lt;span class="w"&gt; &lt;/span&gt;From&lt;span class="w"&gt; &lt;/span&gt;Launching&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;familyControlsEnabled&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;true/&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;pathBlackList&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;array&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;/Applications/FaceTime.app/&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;/Applications/Phone.app/&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;/Applications/Messages.app/&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/array&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;pathWhiteList&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;array&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;/&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/array&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;whiteList&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;array&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/array&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/dict&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/array&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/dict&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/plist&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I tried a few examples before validating this one, and the result
seems to be good. The important part is &lt;code&gt;pathBlackList&lt;/code&gt; and
&lt;code&gt;pathWhiteList&lt;/code&gt;. On the first we specify the path to the applications
we want to avoid executing; the second is a whitelist for
well-known applications. I am against the second, because it
is too broad, and I prefer the system, so in my personal
&lt;code&gt;.mobileconfig&lt;/code&gt; I have removed the &lt;code&gt;pathWhiteList&lt;/code&gt; section.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;BE AWARE that sometimes after applying the .mobileconfig and
accepting the file had to be installed, I did not get the
message forbidding the launch of the applications.
&lt;strong&gt;After a reboot, the profile works as expected&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Wrap up!&lt;/h2&gt;
&lt;p&gt;We have seen an example of disabling macOS applications to reduce
the attack surface on them, by using deny lists and allow lists.&lt;/p&gt;
&lt;p&gt;Hope this helps!
Cheers!&lt;/p&gt;</content><category term="macos"/><category term="security"/><category term="macos"/></entry><entry><title>Customizing shell on macOS</title><link href="https://avisiedo.github.io/blog/customizing-shell-on-macos.html" rel="alternate"/><published>2026-03-06T08:17:00+01:00</published><updated>2026-03-06T08:17:00+01:00</updated><author><name>Alejandro Visiedo</name></author><id>tag:avisiedo.github.io,2026-03-06:/blog/customizing-shell-on-macos.html</id><summary type="html">&lt;p&gt;A macOS shell customization for developers&lt;/p&gt;</summary><content type="html">&lt;h1&gt;Customizing shell on macOS&lt;/h1&gt;
&lt;p&gt;I use to develop on Linux systems, but I do from a VM, and I was wondering how
to customize in similar way for zsh in macOS. If you want to set up a shell
environment similar to Linux using powerline, this article is for you.&lt;/p&gt;
&lt;p&gt;The contents are the below:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Installing "0xProto nerd fonts mono".&lt;/li&gt;
&lt;li&gt;Custom prompt by using starship.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Pre-requisites&lt;/strong&gt;: brew is installed in your system&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Installing "0xProto nerd fonts mono"&lt;/h2&gt;
&lt;p&gt;This font or another font for developing is necessary to print out properly the
prompt. Below are the steps to install the font in the system.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Download font&lt;/span&gt;
curl&lt;span class="w"&gt; &lt;/span&gt;-L&lt;span class="w"&gt; &lt;/span&gt;-O&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;https://github.com/ryanoasis/nerd-fonts/releases/download/v3.4.0/0xProto.zip&amp;quot;&lt;/span&gt;

&lt;span class="c1"&gt;# unpack the fonts at 0xProto/ directory&lt;/span&gt;
unzip&lt;span class="w"&gt; &lt;/span&gt;0xProto.zip&lt;span class="w"&gt; &lt;/span&gt;-d&lt;span class="w"&gt; &lt;/span&gt;0xProto

&lt;span class="c1"&gt;# Install the fonts in the system&lt;/span&gt;
cp&lt;span class="w"&gt; &lt;/span&gt;-vf&lt;span class="w"&gt; &lt;/span&gt;0xProto/*.ttf&lt;span class="w"&gt; &lt;/span&gt;~/Library/Fonts

&lt;span class="c1"&gt;# Reboot if you don&amp;#39;t see the new fonts&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Additionally I added the font to my VSCode IDE, so the embedded terminal
experience is the same as my system terminal.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open the VSCode settings.&lt;/li&gt;
&lt;li&gt;Select User tab.&lt;/li&gt;
&lt;li&gt;Search for 'Text Editor &amp;gt; Font : Font Family'&lt;/li&gt;
&lt;li&gt;Add at the beginning: "0xProto Nerd Font Mono"&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Custom prompt by using starship&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Install starship by: &lt;code&gt;brew install starship&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Configure your starship by:
  &lt;code&gt;starship preset gruvbox-rainbow -o ~/.config/starship.toml&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Now we want to make effective the prompt configuration so we add the below
  to our .zshrc file or similar. In my case I have &lt;code&gt;.profile.d/starship.zsh&lt;/code&gt;
  that is included from the &lt;code&gt;.zshrc&lt;/code&gt; file:&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;sh
  if command -v starship &amp;amp;&amp;gt;/dev/null; then
    if tty -s &amp;amp;&amp;gt;/dev/null; then
      source &amp;lt;(starship init zsh)
    fi
  fi&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Finally, close your terminal, and re-open again, and you will see your prompt
  shell customized.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Wrap up!&lt;/h2&gt;
&lt;p&gt;To have a prompt that display useful information for the developer is important
to avoid human mistakes, and already is cool to have a prompt shell that display
such information.&lt;/p&gt;
&lt;p&gt;Hope this help!&lt;/p&gt;
&lt;p&gt;See you on the next article!&lt;/p&gt;</content><category term="macos"/><category term="shell"/><category term="starship"/><category term="nerd fonts"/></entry><entry><title>Run windows powershell scripts</title><link href="https://avisiedo.github.io/blog/run-windows-powershell-scripts.html" rel="alternate"/><published>2026-02-13T10:00:00+01:00</published><updated>2026-02-13T10:00:00+01:00</updated><author><name>Alejandro Visiedo</name></author><id>tag:avisiedo.github.io,2026-02-13:/blog/run-windows-powershell-scripts.html</id><summary type="html">&lt;p&gt;Hot to get your $PROFILE signed and running&lt;/p&gt;</summary><content type="html">&lt;h1&gt;Run windows powershell scripts&lt;/h1&gt;
&lt;p&gt;I have not used windows from a while, and several things that I use to do in
Linux systems, are different in Windows. One of this things are customize my
Windows terminal session by using an init script ($PROFILE) so I can define
useful aliases (or functions in this case). But when I tried to use $PROFILE
I realized that to allow it I had to degrade the &lt;code&gt;ExecutionPolicy&lt;/code&gt; to be
extremaly permissive, and setting the &lt;code&gt;Scope&lt;/code&gt; to the &lt;code&gt;Process&lt;/code&gt;, everytime I
open a terminal, is tedious. So I have tried to sign my script so the
&lt;code&gt;ExecutionPolicy&lt;/code&gt; can be set to &lt;code&gt;AllSigned&lt;/code&gt; and do not loose too much on the
security levels. The steps could breakdown as below:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Define the initial content for the &lt;code&gt;$PROFILE&lt;/code&gt; file.&lt;/li&gt;
&lt;li&gt;Create a self-signed certificate.&lt;/li&gt;
&lt;li&gt;Sign the &lt;code&gt;$PROFILE&lt;/code&gt; file.&lt;/li&gt;
&lt;li&gt;Verify we can run &lt;code&gt;$PROFILE&lt;/code&gt; with no issues, and the function &lt;code&gt;dotfiles&lt;/code&gt; is
  available.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Define the initial content&lt;/h2&gt;
&lt;p&gt;The initial $PROFILE content is only the below content (once it works we can
add whatever we could need).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;dotfiles&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-git-dir&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;$HOME/.dotfiles/&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-work-tree&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;$HOME&amp;quot;&lt;/span&gt; &lt;span class="nv"&gt;@args&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Create a self-signed certificate&lt;/h2&gt;
&lt;p&gt;We have to create a self-signed certificate, store it in our local
certificate storage (no system, so no privileges are needed).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;$certName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Alejandro Visiedo&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;$dnsName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;PowerShellLocal&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;$cert&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;New-SelfSignedCertificate&lt;/span&gt; &lt;span class="n"&gt;-Type&lt;/span&gt; &lt;span class="n"&gt;CodeSigningCert&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
                                  &lt;span class="n"&gt;-Subject&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;CN=$certName&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
                                  &lt;span class="n"&gt;-DnsName&lt;/span&gt; &lt;span class="nv"&gt;$dnsName&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
                                  &lt;span class="n"&gt;-CertStoreLocation&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Cert:\CurrentUser\My&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
                                  &lt;span class="n"&gt;-NotAfter&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Get-Date&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;AddYears&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
                                  &lt;span class="n"&gt;-KeyExportPolicy&lt;/span&gt; &lt;span class="n"&gt;NonExportable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-Type CodeSigningCert&lt;/code&gt;: We indicate we want a certificate to sign code as
  we want to sign our scripts.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-Subject "CN=$certName"&lt;/code&gt;: We inform the value for the Subject of the
  certificate. As it is a self-signed, this value will be used to for the
  &lt;code&gt;-Issuer&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-DnsName $dnsName&lt;/code&gt;: This value is not importante, just using a common
  value that is broadly used. It is important on the scope of TLS
  certificates.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-CertStoreLocation "Cert:\CurrentUser\My"&lt;/code&gt;: Indicate the store where the
  certificates and key pair will be stored. As we are using the user store,
  we don't need elevate privileges.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-NotAfter (Get-Date).AddYears(5)&lt;/code&gt;: The certificate will outdate in five
  years.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-KeyExportPolicy NonExportable&lt;/code&gt;: This argument indicate that the key stored
  are not exportable.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;We can check the certificate by running &lt;code&gt;certmgr.msc&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And now configure the trust on the new certificate by:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;$stores&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Root&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;TrustedPublisher&amp;quot;&lt;/span&gt;
&lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$storeName&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nv"&gt;$stores&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$store&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;New-Object&lt;/span&gt; &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Security&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Cryptography&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;X509Certificates&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;X509Store&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$storeName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;CurrentUser&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nv"&gt;$store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ReadWrite&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nv"&gt;$store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$cert&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nv"&gt;$store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nb"&gt;Write-Host&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Added to: $storeName&amp;quot;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Sign the &lt;code&gt;$PROFILE&lt;/code&gt; file&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(!(&lt;/span&gt;&lt;span class="nb"&gt;Test-Path&lt;/span&gt; &lt;span class="nv"&gt;$PROFILE&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
    &lt;span class="nb"&gt;New-Item&lt;/span&gt; &lt;span class="n"&gt;-Path&lt;/span&gt; &lt;span class="nv"&gt;$PROFILE&lt;/span&gt; &lt;span class="n"&gt;-Type&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="n"&gt;-Force&lt;/span&gt; 
    &lt;span class="nb"&gt;Add-Content&lt;/span&gt; &lt;span class="nv"&gt;$PROFILE&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;# File $PROFILE signed&amp;quot;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;$status&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Set-AuthenticodeSignature&lt;/span&gt; &lt;span class="n"&gt;-FilePath&lt;/span&gt; &lt;span class="nv"&gt;$PROFILE&lt;/span&gt; &lt;span class="n"&gt;-Certificate&lt;/span&gt; &lt;span class="nv"&gt;$cert&lt;/span&gt;
&lt;span class="nv"&gt;$status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Status&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Verify&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;Get-AuthenticodeSignature&lt;/span&gt; &lt;span class="nv"&gt;$PROFILE&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;Select-Object&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Hash&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Final script&lt;/h2&gt;
&lt;p&gt;Before to enable $PROFILE you have to run:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;Set-ExecutionPolicy&lt;/span&gt; &lt;span class="n"&gt;-Scope&lt;/span&gt; &lt;span class="n"&gt;CurrentUser&lt;/span&gt; &lt;span class="n"&gt;-ExecutionPolicy&lt;/span&gt; &lt;span class="n"&gt;AllSigned&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;As we can see, we shrink the scope to the current user only, and the execution
policy will be applied to all signed scripts.&lt;/p&gt;
&lt;p&gt;Any script from other user that we don't trust or not signed scripts
will be rejected its execution.&lt;/p&gt;
&lt;p&gt;Finally all the above together could be joined in the script below:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Configure names&lt;/span&gt;
&lt;span class="nv"&gt;$certName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Alejandro Visiedo&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;$dnsName&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;PowerShellLocal&amp;quot;&lt;/span&gt;

&lt;span class="nb"&gt;Write-Host&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;--- Generating Certificate ---&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;-ForegroundColor&lt;/span&gt; &lt;span class="n"&gt;Yellow&lt;/span&gt;
&lt;span class="nv"&gt;$cert&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;New-SelfSignedCertificate&lt;/span&gt; &lt;span class="n"&gt;-Type&lt;/span&gt; &lt;span class="n"&gt;CodeSigningCert&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
                                  &lt;span class="n"&gt;-Subject&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;CN=$certName&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
                                  &lt;span class="n"&gt;-DnsName&lt;/span&gt; &lt;span class="nv"&gt;$dnsName&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
                                  &lt;span class="n"&gt;-CertStoreLocation&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Cert:\CurrentUser\My&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
                                  &lt;span class="n"&gt;-NotAfter&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Get-Date&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;AddYears&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;`&lt;/span&gt;
                                  &lt;span class="n"&gt;-KeyExportPolicy&lt;/span&gt; &lt;span class="n"&gt;NonExportable&lt;/span&gt;

&lt;span class="nb"&gt;Write-Host&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Certificate create with Thumbprint: &lt;/span&gt;&lt;span class="p"&gt;$(&lt;/span&gt;&lt;span class="nv"&gt;$cert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Thumbprint&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;

&lt;span class="c"&gt;# 2. Trust on the certificate (Move to root and trusted editors)&lt;/span&gt;
&lt;span class="nb"&gt;Write-Host&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;--- Configuring trust ---&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;-ForegroundColor&lt;/span&gt; &lt;span class="n"&gt;Yellow&lt;/span&gt;
&lt;span class="nv"&gt;$stores&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Root&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;TrustedPublisher&amp;quot;&lt;/span&gt;
&lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$storeName&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nv"&gt;$stores&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$store&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;New-Object&lt;/span&gt; &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Security&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Cryptography&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;X509Certificates&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;X509Store&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$storeName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;CurrentUser&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nv"&gt;$store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;ReadWrite&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nv"&gt;$store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$cert&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nv"&gt;$store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nb"&gt;Write-Host&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Added to: $storeName&amp;quot;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;# 3. Sign $PROFILE&lt;/span&gt;
&lt;span class="nb"&gt;Write-Host&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;--- Signing $PROFILE ---&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;-ForegroundColor&lt;/span&gt; &lt;span class="n"&gt;Yellow&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(!(&lt;/span&gt;&lt;span class="nb"&gt;Test-Path&lt;/span&gt; &lt;span class="nv"&gt;$PROFILE&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
    &lt;span class="nb"&gt;New-Item&lt;/span&gt; &lt;span class="n"&gt;-Path&lt;/span&gt; &lt;span class="nv"&gt;$PROFILE&lt;/span&gt; &lt;span class="n"&gt;-Type&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="n"&gt;-Force&lt;/span&gt; 
    &lt;span class="nb"&gt;Add-Content&lt;/span&gt; &lt;span class="nv"&gt;$PROFILE&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;# File $PROFILE signed&amp;quot;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;$status&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Set-AuthenticodeSignature&lt;/span&gt; &lt;span class="n"&gt;-FilePath&lt;/span&gt; &lt;span class="nv"&gt;$PROFILE&lt;/span&gt; &lt;span class="n"&gt;-Certificate&lt;/span&gt; &lt;span class="nv"&gt;$cert&lt;/span&gt;
&lt;span class="nv"&gt;$status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Status&lt;/span&gt;

&lt;span class="nb"&gt;Write-Host&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;--- Verification ---&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;-ForegroundColor&lt;/span&gt; &lt;span class="n"&gt;Yellow&lt;/span&gt;
&lt;span class="nb"&gt;Get-AuthenticodeSignature&lt;/span&gt; &lt;span class="nv"&gt;$PROFILE&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;Select-Object&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Hash&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Signing another script&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c"&gt;# the long hash is the fingerprint for the certificate&lt;/span&gt;
&lt;span class="nv"&gt;$cert&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Get-Item&lt;/span&gt; &lt;span class="n"&gt;-Path&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Cert:\CurrentUser\My\ea9a1d609c091bb023c1ccd54261e4982d747047&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;$status&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Set-AuthenticodeSignature&lt;/span&gt; &lt;span class="n"&gt;-FilePath&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;myscript.ps1&amp;quot;&lt;/span&gt; &lt;span class="n"&gt;-Certificate&lt;/span&gt; &lt;span class="nv"&gt;$cert&lt;/span&gt;
&lt;span class="nv"&gt;$status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Status&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Wrap up!&lt;/h2&gt;
&lt;p&gt;We have seen how to prepare our environment to run powershell scripts without
relaxing the execution policy, and how to add a customization for our
environment by defining the &lt;code&gt;dotfiles&lt;/code&gt; function. Now we can extend this for
additional helper scripts we could want to create in our environment.&lt;/p&gt;
&lt;p&gt;What's the next? IMHO use a hardware key increase the security, so instead of
having a certificate in the system certificate storage, I'd rather to have
the private key stored in a cryptographic device (one ring to govern all the
realms).&lt;/p&gt;
&lt;p&gt;Another question is, how to rotate the certificate? What happen after 5 years?&lt;/p&gt;
&lt;p&gt;But that will be another story.&lt;/p&gt;
&lt;p&gt;See you on the next article!&lt;/p&gt;</content><category term="Windows"/><category term="windows"/><category term="powershell"/><category term="profile"/></entry><entry><title>Disable wsdd service</title><link href="https://avisiedo.github.io/blog/disable-wsdd-service.html" rel="alternate"/><published>2025-11-23T13:11:00+01:00</published><updated>2025-11-23T13:11:00+01:00</updated><author><name>Alejandro Visiedo</name></author><id>tag:avisiedo.github.io,2025-11-23:/blog/disable-wsdd-service.html</id><summary type="html">&lt;p&gt;Disable Web Search Discovery host Daemon.&lt;/p&gt;</summary><content type="html">&lt;h1&gt;Disable wsdd service&lt;/h1&gt;
&lt;p&gt;The Web Search Discovery host Daemon allow to discover hosts in a windows
network. It uses ports 3702/udp and 5357/tcp. But this service reveals
information that we could want to void, because it makes easier the discovery
and recognition in a network.&lt;/p&gt;
&lt;p&gt;This service is not managed by systemd, but exists a way to disable it, by
using &lt;code&gt;gsettings&lt;/code&gt; command.&lt;/p&gt;
&lt;p&gt;So to disable the service run:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;gsettings&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;org.gnome.system.wsdd&lt;span class="w"&gt; &lt;/span&gt;display-mode&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;disabled&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;You could need to reboot, but after that, you should not see the service
listening on port 3702/udp and 5357/tcp.&lt;/p&gt;
&lt;p&gt;See you on the next post!&lt;/p&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;p&gt;https://github.com/christgau/wsdd
https://gitlab.gnome.org/GNOME/gvfs/-/issues/753&lt;/p&gt;</content><category term="Linux"/><category term="linux"/><category term="services"/><category term="administration"/></entry><entry><title>Passwordless environment</title><link href="https://avisiedo.github.io/blog/passwordless.html" rel="alternate"/><published>2025-10-31T01:00:00+01:00</published><updated>2026-03-13T20:00:00+01:00</updated><author><name>Alejandro Visiedo</name></author><id>tag:avisiedo.github.io,2025-10-31:/blog/passwordless.html</id><summary type="html">&lt;p&gt;Quick steps to get passwordless working in Silverblue&lt;/p&gt;</summary><content type="html">&lt;h1&gt;Passwordless environment&lt;/h1&gt;
&lt;p&gt;The below are the steps I have followed to get passwordless on
a Silverblue 43 distro with yubico. It is based in the steps found at the
references.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I recommend to try in a VM before use in your primary system,
and then extend to it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Requirements&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Install the required packages: &lt;code&gt;rpm-ostree install pam-u2f pamu2fcfg&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Reboot to get the packages available: &lt;code&gt;systemctl reboot&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Create directory where store the configuration for your account:
  &lt;code&gt;mkdir ~/.config/Yubico&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Add the configuration line by: &lt;code&gt;pamu2fcfg --username=$USER &amp;gt;&amp;gt; ~/.config/Yubico/u2f_keys&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Shrink permissions: &lt;code&gt;chmod 0400 ~/.config/Yubico/u2f_keys&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Copy u2f_keys to a the global location below by:
  &lt;code&gt;cat ~/.config/Yubico/u2f_keys | run0 tee -a /etc/u2f_mappings&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Set up passwordless&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;run0&lt;span class="w"&gt; &lt;/span&gt;authselect&lt;span class="w"&gt; &lt;/span&gt;enable-feature&lt;span class="w"&gt; &lt;/span&gt;with-pam-u2f
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Set up 2FA&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;run0&lt;span class="w"&gt; &lt;/span&gt;authselect&lt;span class="w"&gt; &lt;/span&gt;enable-feature&lt;span class="w"&gt; &lt;/span&gt;with-pam-u2f-2fa
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;hr&gt;
&lt;p&gt;Notes about &lt;code&gt;pamu2fcfg&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;For the yubikey I am using, I required to use the &lt;code&gt;--username=$USER&lt;/code&gt; argument
  or I got &lt;code&gt;error: fido_dev_make_cred (63) FIDO_ERR_UV_INVALID&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Setup Git signing&lt;/h2&gt;
&lt;p&gt;Generate the key pair as below:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ssh-keygen&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;ed25519-sk&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;-O&lt;span class="w"&gt; &lt;/span&gt;resident&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;-O&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;application&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ssh:&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;-O&lt;span class="w"&gt; &lt;/span&gt;verify-required&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;~/.ssh/id_ed25519_sk_rk
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-O resident&lt;/code&gt; indicate to generate a resident key.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-O application=ssh:&lt;/code&gt; set the application namespace associated to the
  handler key. By default it is &lt;code&gt;ssh:&lt;/code&gt;, and we need to prefix it always with
  &lt;code&gt;ssh:&lt;/code&gt; if we want to generate a different key for different purposes.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-O verify-required&lt;/code&gt; indicates to verify (by PIN or biometrics) the user
  when the key is going to be used.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;OR (if you are moving your keys to another machine)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# The below will extract the resident key to use the private key stored&lt;/span&gt;
&lt;span class="c1"&gt;# inside the crypto device (the private key never is disclosed from the&lt;/span&gt;
&lt;span class="c1"&gt;# device). The below will extract all the resident keys (if you had&lt;/span&gt;
&lt;span class="c1"&gt;# one tagged `ssh:` and another `ssh:fedora`, both redident keys would&lt;/span&gt;
&lt;span class="c1"&gt;# be extracted.&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;~/.ssh
ssh-keygen&lt;span class="w"&gt; &lt;/span&gt;-K
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;NOTE: In macOS requires to install ssh from homebrew, because the openssh
installed by the system does not have support for &lt;strong&gt;secret keys&lt;/strong&gt; (physical
security key) nor &lt;strong&gt;resident key&lt;/strong&gt; (stored in the device internal memory).&lt;/p&gt;
&lt;p&gt;I moved the identities from one system to another without compromise them.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Configure Git for SSH Signing:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;git&lt;span class="w"&gt; &lt;/span&gt;config&lt;span class="w"&gt; &lt;/span&gt;--global&lt;span class="w"&gt; &lt;/span&gt;gpg.format&lt;span class="w"&gt; &lt;/span&gt;ssh
git&lt;span class="w"&gt; &lt;/span&gt;config&lt;span class="w"&gt; &lt;/span&gt;--global&lt;span class="w"&gt; &lt;/span&gt;user.signingkey&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;~/.ssh/id_ed25519_sk_rk.pub&amp;quot;&lt;/span&gt;
git&lt;span class="w"&gt; &lt;/span&gt;config&lt;span class="w"&gt; &lt;/span&gt;--global&lt;span class="w"&gt; &lt;/span&gt;commit.gpgSign&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
git&lt;span class="w"&gt; &lt;/span&gt;config&lt;span class="w"&gt; &lt;/span&gt;--global&lt;span class="w"&gt; &lt;/span&gt;tag.forceSignAnnotated&lt;span class="w"&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;Configure SSH (the key to identify does not match the defaults that try SSH, so
we need to let it know to SSH by adding the content below to &lt;code&gt;.ssh/config&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;IdentityFile ~/.ssh/id_ed25519_sk_rk
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;This was detected in macOS system when verifying the connection by
&lt;code&gt;ssh -T git@github.com&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Create and configure the allowed signers file.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;touch&lt;span class="w"&gt; &lt;/span&gt;~/.ssh/allowed_signers
&lt;span class="nv"&gt;EMAIL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;git&lt;span class="w"&gt; &lt;/span&gt;config&lt;span class="w"&gt; &lt;/span&gt;--global&lt;span class="w"&gt; &lt;/span&gt;user.email&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;PUB_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;cat&lt;span class="w"&gt; &lt;/span&gt;~/.ssh/id_ed25519_sk_rk.pub&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;awk&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;{ print $2 }&amp;#39;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="nb"&gt;printf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;%s namespaces=&amp;quot;git&amp;quot; ssh-ed25519 %s Git signing key %s\n&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;EMAIL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PUB_KEY&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;EMAIL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;~/.ssh/allowed_signers
&lt;span class="nb"&gt;unset&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;PUB_KEY&lt;span class="w"&gt; &lt;/span&gt;EMAIL
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Tell git where to find the allowed signers:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;git&lt;span class="w"&gt; &lt;/span&gt;config&lt;span class="w"&gt; &lt;/span&gt;--global&lt;span class="w"&gt; &lt;/span&gt;gpg.ssh.allowedSignersFile&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;~/.ssh/allowed_signers&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;Don't forget to add your public key to yout github, gitlab or another
SCM where you push your commits.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Unlock LUKS using FIDO2&lt;/h2&gt;
&lt;p&gt;I tried in a VM several configurations, and the one that fit well
in terms of security and usability was the below one:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;run0&lt;span class="w"&gt; &lt;/span&gt;systemd-cryptenroll&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--fido2-device&lt;span class="o"&gt;=&lt;/span&gt;auto&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--fido2-with-client-pin&lt;span class="o"&gt;=&lt;/span&gt;no&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--fido2-with-user-presence&lt;span class="o"&gt;=&lt;/span&gt;yes&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;--fido2-with-user-verification&lt;span class="o"&gt;=&lt;/span&gt;yes&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;/dev/sdXY
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Edit &lt;code&gt;/etc/crypttab&lt;/code&gt; and add to your LUKS device entry: &lt;code&gt;- fido2-device=auto&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Verify enrollment by: &lt;code&gt;run0; cryptsetup luksDump /dev/sdXY&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Reboot your system: &lt;code&gt;systemctl reboot&lt;/code&gt; and now you should be prompted for
touching your FIDO 2 device.&lt;/p&gt;
&lt;p&gt;If you want to only unlock the disk by using your FIDO2 device you can remove
the password slot with the following command:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;WARNING: Before run this command, check you can boot and unlock LUKS by
using your FIDO2 device.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;run0&lt;span class="w"&gt; &lt;/span&gt;systemd-cryptenroll&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;--wipe-slot&lt;span class="o"&gt;=&lt;/span&gt;password&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;/dev/sdXY
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;Update &lt;code&gt;/dev/sdXY by your LUKS partition;&lt;/code&gt;lsblk` should help you.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Reboot your system: &lt;code&gt;systemctl reboot&lt;/code&gt; and now you should be
able to unlock your LUKS partition using your FIDO2 device and
touching it.&lt;/p&gt;
&lt;h2&gt;Lock screen on extracting token&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Create the file &lt;code&gt;/usr/local/bin/lockcomputer.sh&lt;/code&gt;:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Create /usr/local/bin/lockcomputer.sh&lt;/span&gt;
cat&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt;EOF | run0 tee /usr/local/bin/lockcomputer.sh&lt;/span&gt;
&lt;span class="s"&gt;#!/bin/sh&lt;/span&gt;

&lt;span class="s"&gt;# Inspired by: https://gist.github.com/jhass/070207e9d22b314d9992&lt;/span&gt;

&lt;span class="s"&gt;# INFO This script lock the screen and disconnect network when it is invoked&lt;/span&gt;

&lt;span class="s"&gt;lockscreen() {&lt;/span&gt;
&lt;span class="s"&gt;  busctl call org.freedesktop.login1 /org/freedesktop/login1 org.freedesktop.login1.Manager LockSessions&lt;/span&gt;
&lt;span class="s"&gt;}&lt;/span&gt;

&lt;span class="s"&gt;disconnect-network() {&lt;/span&gt;
&lt;span class="s"&gt;  devices=$(nmcli --fields DEVICE,TYPE,STATE device status | grep ethernet | grep connected | awk &amp;#39;{ print $1 }&amp;#39;)&lt;/span&gt;
&lt;span class="s"&gt;  for device in $devices; do&lt;/span&gt;
&lt;span class="s"&gt;    nmcli device down &amp;quot;$device&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;  done&lt;/span&gt;
&lt;span class="s"&gt;}&lt;/span&gt;

&lt;span class="s"&gt;main() {&lt;/span&gt;
&lt;span class="s"&gt;  echo &amp;quot;lockcomputer.sh: $*&amp;quot; &amp;gt;&amp;gt; /tmp/lockcomputer.log&lt;/span&gt;
&lt;span class="s"&gt;  disconnect-network&lt;/span&gt;
&lt;span class="s"&gt;  lockscreen&lt;/span&gt;
&lt;span class="s"&gt;}&lt;/span&gt;

&lt;span class="s"&gt;main &amp;quot;$@&amp;quot;&lt;/span&gt;

&lt;span class="s"&gt;EOF&lt;/span&gt;

&lt;span class="c1"&gt;# Change permissions&lt;/span&gt;
run0&lt;span class="w"&gt; &lt;/span&gt;chmod&lt;span class="w"&gt; &lt;/span&gt;u+x&lt;span class="w"&gt; &lt;/span&gt;/usr/local/bin/lockcomputer.sh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Create udev rule file to lock the computer on removing the key event.
  This rule is generic, and it likely works for any fido device.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;cat&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt;EOF | run0 tee /etc/udev/rules.d/20-yubico.rules&lt;/span&gt;
&lt;span class="s"&gt;ACTION==&amp;quot;remove&amp;quot;, ENV{ID_FIDO_TOKEN}==&amp;quot;1&amp;quot;, RUN+=&amp;quot;/usr/local/bin/lockcomputer.sh&amp;quot;&lt;/span&gt;
&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Reload udev rules by: &lt;code&gt;run0 udevadm control -R&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Wrap up&lt;/h2&gt;
&lt;p&gt;So far we set up our login, gdm, git commits and tags, LUKS and lockcomputer
on key extraction by using our passwordkey token. This is a step forward to
keep your environment safer.&lt;/p&gt;
&lt;p&gt;Stay tuned and see you on the next post!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UPDATE&lt;/strong&gt;: Added &lt;code&gt;Unlock LUKS using FIDO2&lt;/code&gt; section.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UPDATE&lt;/strong&gt;: Fix the &lt;code&gt;lockcomputer.sh&lt;/code&gt; script and udev rules&lt;/p&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://fedoramagazine.org/how-to-use-a-yubikey-with-fedora-linux/"&gt;How to use yubikey with fedora linux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.yubico.com/pam-u2f/"&gt;pam-u2f&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.fedoraproject.org/en-US/quick-docs/using-yubikeys/"&gt;Using Yubikeys&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/bashbunni/set-up-yubikey-for-passwordless-sudo-authentication-4h5o"&gt;Set up Yubikey for Passwordless Sudo Authentication&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/Fedora/comments/akck9m/authenticating_with_gdm_and_sudo_with_a_u2f/"&gt;Authenticating with GDM and sudo with a U2F security key&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="security"/><category term="silverblue"/><category term="yubico"/><category term="gdm"/><category term="ssh"/><category term="login"/><category term="fido2"/><category term="passkey"/></entry><entry><title>Grow logical volume</title><link href="https://avisiedo.github.io/blog/grow-logical-volume.html" rel="alternate"/><published>2025-10-22T17:52:00+02:00</published><updated>2025-10-22T17:52:00+02:00</updated><author><name>Alejandro Visiedo</name></author><id>tag:avisiedo.github.io,2025-10-22:/blog/grow-logical-volume.html</id><summary type="html">&lt;p&gt;Quick steps that I followed to extend the logical volume to the whole disk in a fedora system.&lt;/p&gt;</summary><content type="html">&lt;h1&gt;Grow logical volume&lt;/h1&gt;
&lt;p&gt;Sometimes I had been the scenario where I needed to extend the
logical volume of my system such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A VM which required more space and after increase the available disk
  I had to extend the logical volume.&lt;/li&gt;
&lt;li&gt;A raspy using not the usual distros.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The same steps worked for me in a fedora system. I won't extend
and I will go straight to the point.&lt;/p&gt;
&lt;p&gt;In this steps I am using &lt;code&gt;/dev/sda3&lt;/code&gt; update it for your scenario:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Increase the physical partition: &lt;code&gt;fdisk /dev/sda3&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Increase the physical volume: &lt;code&gt;pvresize /dev/sda3&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Increase logical volume: &lt;code&gt;/dev/mapper/systemVG-LVRoot -L+100%FREE&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Grow filesystem: &lt;code&gt;xfs_growfs /dev/mapper/systemVG-LVRoot&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Hope this helps you in similar scenario, take the above steps at your
own risk and create a backup before run them if you are not sure
what your are running. Be warned that something wrong could
state in a broken system.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;See you on the next post!&lt;/p&gt;</content><category term="misc"/><category term="raspi"/><category term="fedora"/></entry><entry><title>Running LLM locally</title><link href="https://avisiedo.github.io/blog/running-llm-locally.html" rel="alternate"/><published>2025-08-20T14:22:00+02:00</published><updated>2025-08-20T14:22:00+02:00</updated><author><name>Alejandro Visiedo</name></author><id>tag:avisiedo.github.io,2025-08-20:/blog/running-llm-locally.html</id><summary type="html">&lt;p&gt;Getting started to run a LLM model locally, and using Hardware acceleration with Asahi Linux.&lt;/p&gt;</summary><content type="html">&lt;h1&gt;Running LLM locally&lt;/h1&gt;
&lt;p&gt;IA is an amazing new field, but we have to take it carefully. And one of the
things rolling my mind is about keep prompts privates, so I was wondering to run
it locally, so it can help me even with no Internet connection.&lt;/p&gt;
&lt;p&gt;In my opinion, IA works as an assistant, not as a new developer that make the
work for us, but helps a lot to get things, even new ideas that we didn't
consider; also it can provide wrong responses, so we need to review carefully
the responses.&lt;/p&gt;
&lt;h2&gt;Trying ollama&lt;/h2&gt;
&lt;p&gt;I move from one system to another, I like to test things, and at the moment of
trying this I was using an Asahi Linux with Arch Linux.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I installed ollama by: &lt;code&gt;run0 pacman -Sy extra/ollama&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Start the systemd service by: &lt;code&gt;run0 systemctl start ollama.service&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And I searched for some model at: https://ollama.com/models&lt;/p&gt;
&lt;p&gt;And I pulled a model from it: &lt;code&gt;ollama pull deepseek-coder&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;I started the LLM by: &lt;code&gt;ollama run deepseek-coder:33b&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This github thread was helpful to avoid to download twice the model
because at the beginning I started it only for my user by &lt;code&gt;ollama serve &amp;amp;&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Positive things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I install the LLM by using the package manager.&lt;/li&gt;
&lt;li&gt;I can start to use quickly just starting the service, pulling a model, and
  starting to use that model.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Negative things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;After checking some models, the ones that works better (it is not a statement
  that accomplish, as it depends the data used for the training) are the one
  which size is bigger, so it takes time to download them, and you require
  a lot of memory to run them.&lt;/li&gt;
&lt;li&gt;For Asahi Linux, it was not accelerating the process by using the GPU, so
  I could see how my workstation was about to take off.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Trying ramalama&lt;/h2&gt;
&lt;p&gt;After try ollama, I was worried about get it working with GPU acceleration, and
googling a little I found ramalama, which provide that GPU acceleration, and
pack the model ready to use for it in a container. The idea is great, and we can
use the same models we found at ollama web page.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create a directory: &lt;code&gt;mkdir ramalama; cd ramalama&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Create a virtual environment: &lt;code&gt;python3 -m venv .venv &amp;amp;&amp;amp; source .venv/bin/activate&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Install ramalama by: &lt;code&gt;pip install ramalama&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Download a model by: &lt;code&gt;ramalama pull deepseek-coder:33b&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Run the model by: &lt;code&gt;ramalama run deepseek-coder:33b&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Positive things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;All the workload is moved to the GPU.&lt;/li&gt;
&lt;li&gt;It is easy to install and use models.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Negative things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I dislike to install it by using pip; I rather to install it from official
  distro packages, but I didn't find it at Arch Linux for Asahi Linux.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Wrap up&lt;/h2&gt;
&lt;p&gt;My first contact for running local LLM has not been bad, and I think is a
powerful tool for the day to day; both tools helps on quickly start using a
LLM model. If you are using an Asahi Linux, then your bet for ramalama will be
the right option, in terms of performance. I would like to have more hardware to
test more different scenarios.&lt;/p&gt;
&lt;p&gt;I like the idea that ramalama has containers per gpu/llm-model so you get
something ready to use and optimized quickly. I like it is running isolated,
even without network access, so all the information is processed locally (when
running by &lt;code&gt;ramalama&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;So, if you have the resources, now you have the way to use your local assistant
to help you into your day to day.&lt;/p&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;https://ollama.com/models&lt;/li&gt;
&lt;li&gt;https://github.com/ollama/ollama&lt;/li&gt;
&lt;li&gt;https://github.com/containers/ramalama&lt;/li&gt;
&lt;/ul&gt;</content><category term="IA"/><category term="ia"/><category term="llm"/></entry><entry><title>Using SSH through proxy</title><link href="https://avisiedo.github.io/blog/using-ssh-through-proxy.html" rel="alternate"/><published>2025-06-11T10:39:00+02:00</published><updated>2025-06-11T10:39:00+02:00</updated><author><name>Alejandro Visiedo</name></author><id>tag:avisiedo.github.io,2025-06-11:/blog/using-ssh-through-proxy.html</id><summary type="html">&lt;p&gt;Quick configuration when you only can do outgoing connections by
using a proxy.&lt;/p&gt;</summary><content type="html">&lt;h1&gt;Using SSH through proxy&lt;/h1&gt;
&lt;p&gt;If the system that you are using use a local proxy for the outgoing connections,
your SSH connections will be rejected without any additional configuration.&lt;/p&gt;
&lt;p&gt;In my case I would like to use github and gitlab upstreams through the SSH
connection, so I can push my changes.&lt;/p&gt;
&lt;p&gt;It could be more solutions, but the one indicated here require &lt;code&gt;nc&lt;/code&gt; tool
installed in your system, and some changes to &lt;code&gt;~/.ssh/config&lt;/code&gt; file.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Install &lt;code&gt;nc&lt;/code&gt; in fedora by: &lt;code&gt;run0 dnf install -y nc&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Open &lt;code&gt;~/.ssh/config&lt;/code&gt; and add the configuration below:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nx"&gt;Host&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;github&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;com&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;ProxyCommand&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nx"&gt;nc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;host&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;or&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;:&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;

&lt;span class="nx"&gt;Host&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;gitlab&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;com&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;ProxyCommand&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nx"&gt;nc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;host&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;or&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;:&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;proxy&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;port&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;NOTE Change &lt;code&gt;&amp;lt;proxy-host-or-ip&amp;gt;&lt;/code&gt; by the address of your proxy, and
&lt;code&gt;&amp;lt;proxy-port&amp;gt;&lt;/code&gt; by the port where your proxy is listening.&lt;/p&gt;
&lt;p&gt;If the number of hosts is small, I recommend to keep the list specific
so you can block any outgoing connection to other hosts you don't know
that your system is connecting to.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Wrap up!&lt;/h2&gt;
&lt;p&gt;We have have seen how we can use &lt;code&gt;nc&lt;/code&gt; to use proxy connections to our git
repositories when we have network restrictions.&lt;/p&gt;
&lt;p&gt;Happy coding! :)&lt;/p&gt;</content><category term="system"/><category term="ssh"/><category term="proxy"/><category term="linux"/></entry><entry><title>proxy on rpm-ostree</title><link href="https://avisiedo.github.io/blog/proxy-on-rpm-ostree.html" rel="alternate"/><published>2025-06-04T15:43:00+02:00</published><updated>2025-06-04T15:43:00+02:00</updated><author><name>Alejandro Visiedo</name></author><id>tag:avisiedo.github.io,2025-06-04:/blog/proxy-on-rpm-ostree.html</id><summary type="html">&lt;p&gt;Make rpm-ostree works with our proxy could be not trivial.
This article describe how I did (or what I missed).&lt;/p&gt;</summary><content type="html">&lt;h1&gt;proxy on rpm-ostree&lt;/h1&gt;
&lt;p&gt;Hi there! if you are here, probably are facing similar situation
than me today! I installed Fedora Silverblue in a fresh VM, and
I use a proxy to reach out Internet, so how to make the things
work in Silverblue? I am going to enumerate the failed intents,
before the final solution.&lt;/p&gt;
&lt;h2&gt;Failed intents&lt;/h2&gt;
&lt;p&gt;The first thing I thought was, well just setup the http in the
system and that will make everything. Yeah! I did it, and I rebooted
even several times, but no connection was happening through the
proxy. It makes things like &lt;code&gt;curl&lt;/code&gt; works from my terminal, but
for any reason, not for &lt;code&gt;rpm-ostree&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Secondly, I thought "well, maybe I have to indicate that information
into the repo files". So I edited every &lt;code&gt;.repo&lt;/code&gt; file at
&lt;code&gt;/etc/yum.repos.d/*.repo&lt;/code&gt; and I realoaded rpm-ostree by&lt;/p&gt;
&lt;p&gt;&lt;code&gt;run0 systemctl daemon-reload; run0 systemctl restart rpm-ostreed.service&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Even I tried to reboot, but still rpm-ostree was failing and the
request didn't go through my proxy.&lt;/p&gt;
&lt;p&gt;Later, I tried googling about it, and I found the below reference
which was really helpful:&lt;/p&gt;
&lt;p&gt;https://github.com/coreos/rpm-ostree/issues/762#issuecomment-434256478&lt;/p&gt;
&lt;p&gt;I did the change by: &lt;code&gt;run0 systemctl edit --full rpm-ostreed.service&lt;/code&gt;,
and adding the change below:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[Service]&lt;/span&gt;
&lt;span class="n"&gt;Environment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;http_proxy=http://&amp;lt;ip-for-my-proxy&amp;gt;:&amp;lt;port&amp;gt;&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I run &lt;code&gt;run0 systemctl daemon-reload; run0 systemctl restart rpm-ostreed.service&lt;/code&gt;,
but surprise, still not working! And I rebooted and nothing changed.&lt;/p&gt;
&lt;h2&gt;Final change&lt;/h2&gt;
&lt;p&gt;Finally, I realized that I could require another environment variable, and that
was the key in case for it, so I added &lt;code&gt;HTTPS_PROXY&lt;/code&gt; and I run
&lt;code&gt;run0 systemctl daemon-reload; run0 systemctl restart rpm-ostreed.service&lt;/code&gt; and
finally, it started to work.&lt;/p&gt;
&lt;h2&gt;Wrap up!&lt;/h2&gt;
&lt;p&gt;If you are using a proxy in your system, and you want to use Silverblue
or other rpm-ostree based distribution, you will need to add manually the
&lt;code&gt;http_proxy&lt;/code&gt; and &lt;code&gt;HTTPS_PROXY&lt;/code&gt; to the rpm-ostreed.service configuration.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;run0&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;edit&lt;span class="w"&gt; &lt;/span&gt;--full&lt;span class="w"&gt; &lt;/span&gt;rpm-ostreed.service
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Add the environment variables:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[Service]&lt;/span&gt;
&lt;span class="n"&gt;Environment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;http_proxy=http://&amp;lt;ip-for-my-proxy&amp;gt;:&amp;lt;port&amp;gt;&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;Environment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;HTTPS_PROXY=http://&amp;lt;ip-for-my-proxy&amp;gt;:&amp;lt;port&amp;gt;&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Reload the configuration and restart the service by:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;run0&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;daemon-reload
run0&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;restart&lt;span class="w"&gt; &lt;/span&gt;rpm-ostreed.service
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And finally upgrade your system:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;run0&lt;span class="w"&gt; &lt;/span&gt;rpm-ostree&lt;span class="w"&gt; &lt;/span&gt;upgrade
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="system"/><category term="os"/><category term="linux"/><category term="system"/></entry><entry><title>Welcome</title><link href="https://avisiedo.github.io/blog/welcome.html" rel="alternate"/><published>2025-03-28T12:24:00+01:00</published><updated>2025-03-28T12:24:00+01:00</updated><author><name>Alejandro Visiedo</name></author><id>tag:avisiedo.github.io,2025-03-28:/blog/welcome.html</id><summary type="html">&lt;p&gt;Welcome to the site article&lt;/p&gt;</summary><content type="html">&lt;h1&gt;Welcome&lt;/h1&gt;
&lt;p&gt;DevSensation is a space where I will publish all my nerd stuff.&lt;/p&gt;
&lt;p&gt;Starting by creating a static site by using python3-pelican, and
the sky is the limit.&lt;/p&gt;</content><category term="misc"/></entry><entry><title>Configuring OCP for user namespaces</title><link href="https://avisiedo.github.io/blog/configuring-ocp-for-user-namespace.html" rel="alternate"/><published>2022-01-31T10:45:58+01:00</published><updated>2022-01-31T10:45:58+01:00</updated><author><name>Alejandro Visiedo</name></author><id>tag:avisiedo.github.io,2022-01-31:/blog/configuring-ocp-for-user-namespace.html</id><summary type="html">&lt;p&gt;Preparing an OpenShift cluster for using namespaces&lt;/p&gt;</summary><content type="html">&lt;p&gt;Preparing an OpenShift cluster for using user namespaces involves
several steps and hands-over. To simplify the process we are using
some configurations at &lt;a href="https://github.com/freeipa/freeipa-kustomize"&gt;freeipa-kustomize&lt;/a&gt;
that make easier that task.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pre-requisites&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A 4.9 or 4.10 OpenShift cluster.&lt;/li&gt;
&lt;li&gt;You are logged in the cluster and you have cluster-admin privileges.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Out of scope&lt;/strong&gt;: Build the runc and cri-o rpm packages.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Setting the configuration node&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Clone freeipa-kustomize repository:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;sh
  git clone https://github.com/freeipa/freeipa-kustomize.git&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Retrieve the machine config pools by:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;sh
  oc get mcp&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Set the POOL environment variables with the names of the machine config pool
  that are going to be configured:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;sh
  export POOL="worker"&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;if you want to specify more than one:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sh
  export POOL="worker master"&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Install some custom RPMs by:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;sh
  export RPM_PACKAGES="https://ftweedal.fedorapeople.org/runc-1.0.3-992.rhaos4.10.el8.x86_64.rpm https://ftweedal.fedorapeople.org/cri-o-1.23.0-990.rhaos4.10.git8c7713a.el8.x86_64.rpm"&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The RPMs above are experimental and will become obsolete. This show
how you can customize the ocp node environment easily by using this
configuration. Keep in mind that if they become a lower version than
the version that ships in the cluster release, the RPM package
will not be installed. Credits and thanks to
&lt;a href="https://frasertweedale.github.io/blog-redhat/"&gt;Fraser Tweedale&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Now we just run:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;sh
  make -C config/static/nodes/userns configure
  kustomize build config/static/nodes/userns | oc create -f -&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Finally await the node state is updated by:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;sh
  oc wait mcp/worker --for condition=updated --timeout=-1s&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It will take a few minutes (5-10minutes) as the configuration is applied node by node,
evacuate the node, restart the node, and make it available. This
process is repeated for all impacted nodes. Eventually all the nodes will get a
Ready state and they could be used.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;How is it structured?&lt;/h2&gt;
&lt;p&gt;The main overlay at &lt;code&gt;config/static/nodes/userns&lt;/code&gt; is a composition of smaller
ones, that are divided on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;config/static/nodes/cgroup-v2&lt;/code&gt;: Configure cgroup-v2 into the node, enabling
  to mount cgroup v2 filessytem into the node.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;config/static/nodes/userns-subid&lt;/code&gt;: Configure the necessary subid for the
  user namespaces. Different files can be found at
  &lt;code&gt;config/static/nodes/userns-subid/files&lt;/code&gt; to spicify the subuid and subgid
  information.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;99-crio-userns.conf&lt;/code&gt;: Enable the &lt;code&gt;io.kubernetes.cri-o.userns-mode&lt;/code&gt; annotation
    into the PodSpec.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;subuid&lt;/code&gt; and &lt;code&gt;subgid&lt;/code&gt;: Configure the subordinate ids to be used by the user namespace.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;config/static/nodes/rpm-overrides&lt;/code&gt;: This configuration handle the RPM
  package installation. This is made by creating a systemd unit, and executing
  the command that install the RPM package. It is generated a resource for each
  RPM and POOL. The package installation is checked before launch the RPM
  command, so that future reboots does not try to install the RPM package
  again. Here this is used for custom runc and cri-o rpm packages, but this
  configuration could work for any RPM that we want to quickly test into our
  OCP &lt;strong&gt;development&lt;/strong&gt; cluster.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Checking that the configuration was applied&lt;/h2&gt;
&lt;p&gt;Here you will find several commands that are executed from the node. If you
are using CodeReadyContainers you can directly use a ssh command such as:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ssh&lt;span class="w"&gt; &lt;/span&gt;-i&lt;span class="w"&gt; &lt;/span&gt;~/.crc/machines/crc/id_ecdsa&lt;span class="w"&gt; &lt;/span&gt;core@192.168.130.11
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;This could be helpful when the KAS communication is not available.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Or you can just open a terminal into the node and run the command there by:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Retrieve node list by:&lt;/span&gt;
oc&lt;span class="w"&gt; &lt;/span&gt;get&lt;span class="w"&gt; &lt;/span&gt;nodes
&lt;span class="c1"&gt;# Open the terminal by:&lt;/span&gt;
oc&lt;span class="w"&gt; &lt;/span&gt;debug&lt;span class="w"&gt; &lt;/span&gt;node/NODE
chroot&lt;span class="w"&gt; &lt;/span&gt;/host
&lt;span class="c1"&gt;# Now run your commands here&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;For the RPM packages check from the node:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;sh
  runc --version&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;raw
  runc version 1.0.3
  spec: 1.0.2-dev
  go: go1.17.2
  libseccomp: 2.5.1&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sh
  # If you are using code ready containers, you can directly do the below
  ssh -i ~/.crc/machines/crc/id_ecdsa core@192.168.130.11 journalctl -u install-runc.service
  # Or using the oc adm command
  oc adm node-logs -u install-runc.service NODE&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;raw
  -- Logs begin at Sat 2021-12-11 13:38:56 UTC, end at Wed 2022-01-26 07:12:23 UTC. --
  Jan 26 06:50:13 crc-hsl9k-master-0 bash[1658]: package runc-1.0.3-992.rhaos4.10.el8.x86_64 is not installed
  Jan 26 06:50:13 crc-hsl9k-master-0 systemd[1]: Started Install custom runc.
  Jan 26 06:50:14 crc-hsl9k-master-0 bash[1658]: Downloading 'https://ftweedal.fedorapeople.org/runc-1.0.3-992.rhaos4.10.el8.x86_64.rpm'... done!
  Jan 26 06:50:16 crc-hsl9k-master-0 bash[1658]: Checking out tree 26d80bc...done
  Jan 26 06:50:16 crc-hsl9k-master-0 bash[1658]: No enabled rpm-md repositories.
  Jan 26 06:50:16 crc-hsl9k-master-0 bash[1658]: Importing rpm-md...done
  Jan 26 06:50:16 crc-hsl9k-master-0 bash[1658]: Resolving dependencies...done
  Jan 26 06:50:16 crc-hsl9k-master-0 bash[1658]: Applying 1 override and 5 overlays
  Jan 26 06:50:16 crc-hsl9k-master-0 bash[1658]: Processing packages...done
  Jan 26 06:50:16 crc-hsl9k-master-0 bash[1658]: Running pre scripts...done
  Jan 26 06:50:16 crc-hsl9k-master-0 bash[1658]: Running post scripts...done
  Jan 26 06:50:17 crc-hsl9k-master-0 bash[1658]: Running posttrans scripts...done
  Jan 26 06:50:17 crc-hsl9k-master-0 bash[1658]: Writing rpmdb...done
  Jan 26 06:50:18 crc-hsl9k-master-0 bash[1658]: Writing OSTree commit...done
  Jan 26 06:50:19 crc-hsl9k-master-0 bash[1658]: Staging deployment...done
  Jan 26 06:50:20 crc-hsl9k-master-0 systemd[1]: Stopping Install custom runc...
  Jan 26 06:50:20 crc-hsl9k-master-0 systemd[1]: install-runc.service: Succeeded.
  Jan 26 06:50:20 crc-hsl9k-master-0 systemd[1]: Stopped Install custom runc.
  Jan 26 06:50:20 crc-hsl9k-master-0 systemd[1]: install-runc.service: Consumed 94ms CPU time
  -- Reboot --
  Jan 26 06:51:10 crc-hsl9k-master-0 bash[1656]: runc-1.0.3-992.rhaos4.10.el8.x86_64
  Jan 26 06:51:09 crc-hsl9k-master-0 systemd[1]: Started Install custom runc.
  Jan 26 06:51:09 crc-hsl9k-master-0 systemd[1]: install-runc.service: Succeeded.
  Jan 26 06:51:09 crc-hsl9k-master-0 systemd[1]: install-runc.service: Consumed 11ms CPU time&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;For the cgroup2, run the below from the node:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;sh
  mount | grep cgroup2&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;raw
  cgroup2 on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime,seclabel)
  cgroup on /var/lib/containers/storage/overlay/1ec73edf3e99a0772aaab2ba0f27110bb879a9fe86f607acc9de822489a4a9e1/merged/sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime,seclabel)&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;For the kernelarguments, run the below from the node:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;sh
  # check kernel args in the node boot
  cat /proc/cmdline&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;raw
  BOOT_IMAGE=(hd0,gpt3)/ostree/rhcos-36fd944867b0e491991a65f6f3b7209c937fe3bd7cdbd855c7c5d5a7070ce570/vmlinuz-4.18.0-305.28.1.el8_4.x86_64 random.trust_cpu=on console=tty0 console=ttyS0,115200n8 ignition.platform.id=qemu ostree=/ostree/boot.1/rhcos/36fd944867b0e491991a65f6f3b7209c937fe3bd7cdbd855c7c5d5a7070ce570/0 root=UUID=91ba4914-fd2b-4a7c-b498-28585a80a40e rw rootflags=prjquota systemd.unified_cgroup_hierarchy=1 cgroup_no_v1=all psi=1&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;For the subid configuration we run the below from the node:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;sh
  cat /etc/subuid
  cat /etc/subgid&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;raw
  core:100000:65536
  containers:200000:268435456&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;raw
  core:100000:65536
  containers:200000:268435456&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;And we can observe that entries for container user and group exists too:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sh
  getent passwd containers
  getent group containers&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;raw
  containers:x:1001:995:User for housing the sub ID range for containers:/var/home/containers:/sbin/nologin&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;raw
  containers:x:995:&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;For the cri-o configuration we run the below from the node:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;sh
  cat /etc/crio/crio.conf.d/99-crio-userns.conf&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;raw
  # https://github.com/cri-o/cri-o/blob/main/docs/crio.conf.5.md#crioruntimeruntimes-table
  [crio.runtime.runtimes.runc]
  allowed_annotations=["io.kubernetes.cri-o.userns-mode"]&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Now we can use the annotation below to enable user namespaces for a particular Pod:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;yaml
  apiVersion: v1
  kind: Pod
  metadata:
    name: test-userns
    annotations:
      io.kubernetes.cri-o.userns-mode: "auto:size=65536"
  spec:
    serviceAccountName: test-userns
    containers:
    - name: userns-test
      image: quay.io/fedora/fedora:35
      command: ["sleep", "3600"]&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Let's try quickly with the below:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sh
  # Create a namespace
  oc new-project test-userns
  # Create the 'test-userns' service account to be used
  oc create sa test-userns
  # Add edit role to the sa
  oc adm policy add-role-to-user edit -z test-userns
  # Add anyuid security context constraint to the sa
  oc adm policy add-scc-to-user anyuid -z test-userns
  # We create the service
  oc create -f pod.yaml --as system:serviceaccount:$( oc project -q ):test-userns&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;When the pod is ready, we check the user namespace by:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sh
  oc exec pod/test-userns -- cat /proc/1/uid_map&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;raw
           0     200000      65536&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This means that the [0..65535] uids inside the container are mapped to
  [200000..265535] into the parent container.&lt;/p&gt;
&lt;p&gt;When the user namespace is not used, the content of this file will be:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;raw
           0          0 4294967295&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;Wrap-up&lt;/h2&gt;
&lt;p&gt;With this configuration we can quickly set up our OCP cluster to quickly
experiment with and investigate user namespace.&lt;/p&gt;
&lt;h2&gt;Knowledgements&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Thanks to &lt;a href="https://frasertweedale.github.io/blog-redhat"&gt;Fraser Tweedale&lt;/a&gt;
  for his sessions to understand better the user namespaces.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://frasertweedale.github.io/blog-redhat/posts/2021-07-22-openshift-systemd-workload-demo.html"&gt;Fraser's blog - Demo: namespaced systemd workloads on OpenShift&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://static.sched.com/hosted_files/devconfcz2022/d5/%5BDevConf.CZ%2022%5D%20SCCs%20Presentation.pdf"&gt;Introduction to Security Context Constraints&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</content><category term="kubernetes"/><category term="kubernetes"/><category term="OpenShift"/></entry><entry><title>Stopping systemd workloads in OpenShift</title><link href="https://avisiedo.github.io/blog/stopping-systemd-workloads-in-openshift.html" rel="alternate"/><published>2021-11-29T17:00:00+01:00</published><updated>2026-02-13T10:00:00+01:00</updated><author><name>Alejandro Visiedo</name></author><id>tag:avisiedo.github.io,2021-11-29:/blog/stopping-systemd-workloads-in-openshift.html</id><summary type="html">&lt;p&gt;How to integrate systemd workloads in OpenShift&lt;/p&gt;</summary><content type="html">&lt;p&gt;Are you using systemd workloads? Then this article could be of interest.
In this article we are going to see how workloads based on systemd
can be stopped gracefully on OpenShift.&lt;/p&gt;
&lt;p&gt;We are going to do hands-on activities, using a simple systemd workload
which runs an nginx service. We will see the differences between using the
workload in Podman and using the workload in OpenShift. Finally we will see
how to overcome the limitation in OpenShift by using container lifecycle hooks.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Prerequisites&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://podman.io/"&gt;Podman&lt;/a&gt; is installed in your environment.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.openshift.com/container-platform/4.9/cli_reference/openshift_cli/getting-started-cli.html#installing-openshift-cli"&gt;OpenShift client&lt;/a&gt; is installed into your environment.&lt;/li&gt;
&lt;li&gt;You have access to an OpenShift cluster.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;You can install a single node OpenShift using
&lt;a href="https://github.com/karmab/kcli"&gt;kcli&lt;/a&gt; or
&lt;a href="https://github.com/code-ready/crc"&gt;Code Ready Containers&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Updates&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;This is happening in OpenShift but it will be fixed in 4.10 (verified on
  OpenShift 4.10.0-ci-20220107).&lt;/li&gt;
&lt;li&gt;Here is the change at cri-o that fix this situation:
  https://github.com/cri-o/cri-o/pull/5366&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Defining the workload&lt;/h2&gt;
&lt;p&gt;We are going to use the following simple &lt;code&gt;Dockerfile.stopsignal-systemd&lt;/code&gt; Dockerfile to build our workload.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;quay.io/fedora/fedora:35&lt;/span&gt;
&lt;span class="k"&gt;RUN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dnf&lt;span class="w"&gt; &lt;/span&gt;-y&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;procps&lt;span class="w"&gt; &lt;/span&gt;nginx&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;dnf&lt;span class="w"&gt; &lt;/span&gt;clean&lt;span class="w"&gt; &lt;/span&gt;all&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;systemctl&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;nginx
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;80&lt;/span&gt;
&lt;span class="c"&gt;# https://docs.docker.com/engine/reference/builder/#stopsignal&lt;/span&gt;
&lt;span class="c"&gt;# https://www.freedesktop.org/software/systemd/man/systemd.html#SIGRTMIN+3&lt;/span&gt;
&lt;span class="k"&gt;STOPSIGNAL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;SIGRTMIN+3&lt;/span&gt;
&lt;span class="k"&gt;ENTRYPOINT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/sbin/init&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;The &lt;code&gt;STOPSIGNAL&lt;/code&gt; instruction is not needed by podman as it detects that
the signal to be sent by &lt;code&gt;podman stop&lt;/code&gt; should be &lt;code&gt;SIGRTMIN+3&lt;/code&gt;,
because the container process is systemd.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Now we build:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;IMG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;quay.io/avisied0/demos:stopsignal-systemd&amp;quot;&lt;/span&gt;
podman&lt;span class="w"&gt; &lt;/span&gt;build&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;IMG&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;Dockerfile.stopsignal-systemd&lt;span class="w"&gt; &lt;/span&gt;.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Runnning container with podman&lt;/h2&gt;
&lt;p&gt;Firstly, let's see what happens with the workload when running with podman or
docker:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;CONTAINER_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;podman&lt;span class="w"&gt; &lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;-it&lt;span class="w"&gt; &lt;/span&gt;-d&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;IMG&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
podman&lt;span class="w"&gt; &lt;/span&gt;logs&lt;span class="w"&gt; &lt;/span&gt;--follow&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CONTAINER_ID&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;
podman&lt;span class="w"&gt; &lt;/span&gt;stop&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CONTAINER_ID&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And we get a result like the below:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;[&lt;span class="w"&gt;  &lt;/span&gt;OK&lt;span class="w"&gt;  &lt;/span&gt;]&lt;span class="w"&gt; &lt;/span&gt;Removed&lt;span class="w"&gt; &lt;/span&gt;slice&lt;span class="w"&gt; &lt;/span&gt;Slice&lt;span class="w"&gt; &lt;/span&gt;/system/getty.
[&lt;span class="w"&gt;  &lt;/span&gt;OK&lt;span class="w"&gt;  &lt;/span&gt;]&lt;span class="w"&gt; &lt;/span&gt;Removed&lt;span class="w"&gt; &lt;/span&gt;slice&lt;span class="w"&gt; &lt;/span&gt;Slice&lt;span class="w"&gt; &lt;/span&gt;/system/modprobe.
[&lt;span class="w"&gt;  &lt;/span&gt;OK&lt;span class="w"&gt;  &lt;/span&gt;]&lt;span class="w"&gt; &lt;/span&gt;Stopped&lt;span class="w"&gt; &lt;/span&gt;target&lt;span class="w"&gt; &lt;/span&gt;Graphical&lt;span class="w"&gt; &lt;/span&gt;Interface.
[&lt;span class="w"&gt;  &lt;/span&gt;OK&lt;span class="w"&gt;  &lt;/span&gt;]&lt;span class="w"&gt; &lt;/span&gt;Stopped&lt;span class="w"&gt; &lt;/span&gt;target&lt;span class="w"&gt; &lt;/span&gt;Multi-User&lt;span class="w"&gt; &lt;/span&gt;System.
[&lt;span class="w"&gt;  &lt;/span&gt;OK&lt;span class="w"&gt;  &lt;/span&gt;]&lt;span class="w"&gt; &lt;/span&gt;Stopped&lt;span class="w"&gt; &lt;/span&gt;target&lt;span class="w"&gt; &lt;/span&gt;Login&lt;span class="w"&gt; &lt;/span&gt;Prompts.
[&lt;span class="w"&gt;  &lt;/span&gt;OK&lt;span class="w"&gt;  &lt;/span&gt;]&lt;span class="w"&gt; &lt;/span&gt;Stopped&lt;span class="w"&gt; &lt;/span&gt;target&lt;span class="w"&gt; &lt;/span&gt;Timer&lt;span class="w"&gt; &lt;/span&gt;Units.
[&lt;span class="w"&gt;  &lt;/span&gt;OK&lt;span class="w"&gt;  &lt;/span&gt;]&lt;span class="w"&gt; &lt;/span&gt;Stopped&lt;span class="w"&gt; &lt;/span&gt;dnf&lt;span class="w"&gt; &lt;/span&gt;makecache&lt;span class="w"&gt; &lt;/span&gt;--timer.
[&lt;span class="w"&gt;  &lt;/span&gt;OK&lt;span class="w"&gt;  &lt;/span&gt;]&lt;span class="w"&gt; &lt;/span&gt;Stopped&lt;span class="w"&gt; &lt;/span&gt;Daily&lt;span class="w"&gt; &lt;/span&gt;rotation&lt;span class="w"&gt; &lt;/span&gt;of&lt;span class="w"&gt; &lt;/span&gt;log&lt;span class="w"&gt; &lt;/span&gt;files.
[&lt;span class="w"&gt;  &lt;/span&gt;OK&lt;span class="w"&gt;  &lt;/span&gt;]&lt;span class="w"&gt; &lt;/span&gt;Stopped&lt;span class="w"&gt; &lt;/span&gt;Daily&lt;span class="w"&gt; &lt;/span&gt;Cleanup&lt;span class="w"&gt; &lt;/span&gt;of&lt;span class="w"&gt; &lt;/span&gt;Temporary&lt;span class="w"&gt; &lt;/span&gt;Directories.
.
.
.
[&lt;span class="w"&gt;  &lt;/span&gt;OK&lt;span class="w"&gt;  &lt;/span&gt;]&lt;span class="w"&gt; &lt;/span&gt;Stopped&lt;span class="w"&gt; &lt;/span&gt;target&lt;span class="w"&gt; &lt;/span&gt;Swaps.
[&lt;span class="w"&gt;  &lt;/span&gt;OK&lt;span class="w"&gt;  &lt;/span&gt;]&lt;span class="w"&gt; &lt;/span&gt;Reached&lt;span class="w"&gt; &lt;/span&gt;target&lt;span class="w"&gt; &lt;/span&gt;System&lt;span class="w"&gt; &lt;/span&gt;Shutdown.
[&lt;span class="w"&gt;  &lt;/span&gt;OK&lt;span class="w"&gt;  &lt;/span&gt;]&lt;span class="w"&gt; &lt;/span&gt;Reached&lt;span class="w"&gt; &lt;/span&gt;target&lt;span class="w"&gt; &lt;/span&gt;Unmount&lt;span class="w"&gt; &lt;/span&gt;All&lt;span class="w"&gt; &lt;/span&gt;Filesystems.
[&lt;span class="w"&gt;  &lt;/span&gt;OK&lt;span class="w"&gt;  &lt;/span&gt;]&lt;span class="w"&gt; &lt;/span&gt;Reached&lt;span class="w"&gt; &lt;/span&gt;target&lt;span class="w"&gt; &lt;/span&gt;Late&lt;span class="w"&gt; &lt;/span&gt;Shutdown&lt;span class="w"&gt; &lt;/span&gt;Services.
&lt;span class="w"&gt;         &lt;/span&gt;Starting&lt;span class="w"&gt; &lt;/span&gt;System&lt;span class="w"&gt; &lt;/span&gt;Halt...
Sending&lt;span class="w"&gt; &lt;/span&gt;SIGTERM&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;remaining&lt;span class="w"&gt; &lt;/span&gt;processes...
Sending&lt;span class="w"&gt; &lt;/span&gt;SIGKILL&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;remaining&lt;span class="w"&gt; &lt;/span&gt;processes...
All&lt;span class="w"&gt; &lt;/span&gt;filesystems,&lt;span class="w"&gt; &lt;/span&gt;swaps,&lt;span class="w"&gt; &lt;/span&gt;loop&lt;span class="w"&gt; &lt;/span&gt;devices,&lt;span class="w"&gt; &lt;/span&gt;MD&lt;span class="w"&gt; &lt;/span&gt;devices&lt;span class="w"&gt; &lt;/span&gt;and&lt;span class="w"&gt; &lt;/span&gt;DM&lt;span class="w"&gt; &lt;/span&gt;devices&lt;span class="w"&gt; &lt;/span&gt;detached.
Halting&lt;span class="w"&gt; &lt;/span&gt;system.
Exiting&lt;span class="w"&gt; &lt;/span&gt;container.

[1]+&lt;span class="w"&gt;  &lt;/span&gt;Done&lt;span class="w"&gt;                    &lt;/span&gt;podman&lt;span class="w"&gt; &lt;/span&gt;logs&lt;span class="w"&gt; &lt;/span&gt;--follow&lt;span class="w"&gt; &lt;/span&gt;&amp;quot;&lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;CONTAINER_ID&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;What about OpenShift?&lt;/h2&gt;
&lt;p&gt;Let's try now our workload on OpenShift; you will need an OpenShift cluster
or a single node OpenShift (you can get one by using
&lt;a href="https://github.com/karmab/kcli"&gt;kcli&lt;/a&gt; or
&lt;a href="https://github.com/code-ready/crc"&gt;Code Ready Containers&lt;/a&gt;).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Push the image to your image registry:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;sh
  # Previously IMG was defined as below:
  # export IMG="quay.io/avisied0/demos:stopsignal-systemd"
  podman push "${IMG}"&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ensure the repository is public so that the cluster can pull
the image.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Access your cluster as a cluster admin and create a new project:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;sh
  oc login -u kubeadmin https://api.crc.testing:6443
  oc new-project stopsignal&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create a serviceaccount with the necessary permissions for creating and
  running the workload; this is, edit role and anyuid
  SecurityContextConstraint:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;sh
  oc create serviceaccount runasanyuid
  oc adm policy add-scc-to-user anyuid -z runasanyuid --as system:admin
  oc adm policy add-role-to-user edit -z runasanyuid --as system:admin&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create the Pod from the following &lt;code&gt;pod-stopsignal-systemd.yaml&lt;/code&gt; file:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;yaml
  apiVersion: v1
  kind: Pod
  metadata:
    name: stopsignal-systemd
    labels:
      app: nginx
  spec:
    serviceAccountName: runasanyuid
    automountServiceAccountToken: false
    containers:
    - name: nginx
      image: quay.io/avisied0/demos:stopsignal-systemd
      imagePullPolicy: Always
      command: ["/sbin/init"]
      tty: true
      privileged: false&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Create the workload using the new serviceaccount:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;sh
  oc create -f pod-stopsignal-systemd.yaml --as system:serviceaccount:stopsignal:runasanyuid
  oc get all&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Print out and follow the logs in the background.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;sh
  oc logs pod/stopsignal-systemd -f --as system:serviceaccount:stopsignal:runasanyuid &amp;amp;&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Try to stop the workload.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;sh
  oc delete -f pod-stopsignal-systemd.yaml --as system:serviceaccount:stopsignal:runasanyuid&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;We get something like the below in the log output, but systemd and
the pod are still running:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pod &amp;quot;systemd-nginx&amp;quot; deleted
systemd-nginx login: systemd v249.7-2.fc35 running in system mode (+PAM +AUDIT +SELINUX -APPARMOR +IMA +SMACK +SECCOMP +GCRYPT +GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN +IPTC +KMOD +LIBCRYPTSETUP +LIBFDISK +PCRE2 +PWQUALITY +P11KIT +QRENCODE +BZIP2 +LZ4 +XZ +ZLIB +ZSTD +XKBCOMMON +UTMP +SYSVINIT default-hierarchy=unified)
Detected virtualization podman.
Detected architecture x86-64.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;We can see that systemd does not begin the stop sequence as was the
case with podman. This is because OpenShift did not translate the
&lt;code&gt;STOPSIGNAL&lt;/code&gt; instruction specified in the Dockerfile (this will be fixed
at OpenShift 4.10). To work around this situation we will
use &lt;a href="https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/"&gt;container lifecycle hooks&lt;/a&gt;,
to explicitly send &lt;code&gt;SIGRTMIN+3&lt;/code&gt; to PID 1 (systemd).&lt;/p&gt;
&lt;h2&gt;Trying more isolated&lt;/h2&gt;
&lt;p&gt;Let's see if this happens only for &lt;code&gt;SIGRTMIN+3&lt;/code&gt; or for any signal
specified via the &lt;code&gt;STOPSIGNAL&lt;/code&gt; instruction. To investigate that, we
will use the following &lt;code&gt;Dockerfile.stopsignal-demo&lt;/code&gt; Dockerfile:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;quay.io/fedora/fedora:35&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;demo-signal.sh&lt;span class="w"&gt; &lt;/span&gt;/demo-signal.sh
&lt;span class="k"&gt;RUN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;chmod&lt;span class="w"&gt; &lt;/span&gt;a+x&lt;span class="w"&gt; &lt;/span&gt;/demo-signal.sh
&lt;span class="k"&gt;STOPSIGNAL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;SIGINT&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/demo-signal.sh&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code&gt;demo-signal.sh&lt;/code&gt; should have execute permission. The content is:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/bin/bash&lt;/span&gt;

&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;trap_signal&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;signal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-e&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;\nExiting by &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;signal&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;exit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;signal&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;SIGINT&lt;span class="w"&gt; &lt;/span&gt;SIGTERM&lt;span class="w"&gt; &lt;/span&gt;SIGUSR1&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;SIGRTMIN+3&amp;quot;&lt;/span&gt;
&lt;span class="k"&gt;do&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nb"&gt;trap&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;trap_signal &amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;signal&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;signal&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;

&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;true&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;do&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-n&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;sleep&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;Update: Script updated based on PR at:
  https://github.com/avisiedo/freeipa-kustomize/blob/idmocp-331-stopping-with-kind-and-podman/incubator/013-signalstop/demo-signal.sh&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Finally we define a workload with the following &lt;code&gt;pod-stopsignal-demo.yaml&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;v1&lt;/span&gt;
&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Pod&lt;/span&gt;
&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;stopsignal-demo&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;stopsignals&lt;/span&gt;
&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;automountServiceAccountToken&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;false&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;containers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;main&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;quay.io/avisied0/demos:stopsignal-demo&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;imagePullPolicy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;Always&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p p-Indicator"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;/demo-signal.sh&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;tty&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;privileged&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Build the image and push:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;IMG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;quay.io/avisied0/demos:stopsignal-demo&amp;quot;&lt;/span&gt;
podman&lt;span class="w"&gt; &lt;/span&gt;build&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;IMG&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;Dockerfile.stopsignal-demo&lt;span class="w"&gt; &lt;/span&gt;.
podman&lt;span class="w"&gt; &lt;/span&gt;push&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;IMG&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And we try the scenario by:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;oc&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;pod-stopsignal-demo.yaml&lt;span class="w"&gt; &lt;/span&gt;--as&lt;span class="w"&gt; &lt;/span&gt;system:serviceaccount:stopsignal:runasanyuid
oc&lt;span class="w"&gt; &lt;/span&gt;logs&lt;span class="w"&gt; &lt;/span&gt;pod/stopsignal-demo&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;--as&lt;span class="w"&gt; &lt;/span&gt;system:serviceaccount:stopsignal:runasanyuid&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;
oc&lt;span class="w"&gt; &lt;/span&gt;delete&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;pod-stopsignal-demo.yaml&lt;span class="w"&gt; &lt;/span&gt;--as&lt;span class="w"&gt; &lt;/span&gt;system:serviceaccount:stopsignal:runasanyuid
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Getting the output below:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;pod&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;stopsignal-demo&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;deleted&lt;/span&gt;
&lt;span class="o"&gt;............&lt;/span&gt;
&lt;span class="n"&gt;Exiting&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;by&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SIGINT&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;When the &lt;code&gt;SIGINT&lt;/code&gt; is specified into the STOPSIGNAL instruction in the Dockerfile
OpenShift is sending SIGINT signal to the pod when we delete the resource.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When the &lt;code&gt;STOPSIGNAL 37&lt;/code&gt; (&lt;code&gt;RTMIN+3&lt;/code&gt;) is specified as a numeric value, OpenShift
is sending SIGTERM instead of the expected &lt;code&gt;SIGRTMIN+3&lt;/code&gt; indicated into the
Dockerfile file.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Another test was made in OpenShift 4.10 ci build on Wed Jan 5, 2022 and it worked
as expected, by sending the &lt;code&gt;SIGRTMIN+3&lt;/code&gt; to the container workload. So this will
be fixed in future releases.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Solution: container lifecycle hooks&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Create &lt;code&gt;pod-stopsignal-lifecycle.yaml&lt;/code&gt; with the content below:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;yaml
  apiVersion: v1
  kind: Pod
  metadata:
    name: stopsignal-lifecycle
    labels:
      app: nginx
  spec:
    serviceAccount: runasanyuid
    containers:
    - name: nginx
      image: quay.io/avisied0/demos:stopping-systemd
      imagePullPolicy: Always
      command: ["/sbin/init"]
      tty: true
      privileged: false
      lifecycle:  # (1)
        preStop:  # (2)
          exec:   # (3)
            command: ["kill", "-RTMIN+3", "1"]   # (4)&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;(1) The lifecycle hooks for that container.&lt;/li&gt;
&lt;li&gt;(2) A &lt;code&gt;preStop&lt;/code&gt; hook is called before stopping the container.&lt;/li&gt;
&lt;li&gt;(3) It will be an &lt;code&gt;exec&lt;/code&gt; command.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;(4) The command to be executed; the executable must exist in the container.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And we try again by:&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;sh
  oc create -f pod-stopsignal-lifecycle.yaml --as=system:serviceaccount:stopsignal:runasanyuid
  oc logs pod/stopsignal-lifecycle -f --as=system:serviceaccount:stopsignal:runasanyuid &amp;amp;
  oc delete -f pod-stopsignal-lifecycle.yaml --as=system:serviceaccount:stopsignal:runasanyuid&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;And the log output immediately shows the below:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;pod&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;systemd-nginx&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;deleted&lt;/span&gt;
&lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;nginx&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;login&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;  OK  &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Removed&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;slice&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Slice&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;system&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;getty&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;  OK  &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Removed&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;slice&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Slice&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;system&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;modprobe&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;  OK  &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Stopped&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Graphical&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Interface&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;  OK  &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Stopped&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Multi&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;User&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;  OK  &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Stopped&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Login&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Prompts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;  OK  &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Stopped&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Timer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Units&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;  OK  &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Stopped&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dnf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;makecache&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;timer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;  OK  &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Stopped&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Daily&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rotation&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;  OK  &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Stopped&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Daily&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Cleanup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Temporary&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Directories&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;  OK  &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Closed&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Process&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Core&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Dump&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;Stopping&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Getty&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;Stopping&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;The&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;nginx&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;HTTP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;reverse&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;proxy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;Stopping&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;User&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Login&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Management&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;  OK  &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Stopped&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Getty&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;Stopping&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Permit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;User&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Sessions&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;  OK  &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Stopped&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;User&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Login&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Management&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;  OK  &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Stopped&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Permit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;User&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Sessions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;systemd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;v249&lt;/span&gt;&lt;span class="mf"&gt;.7&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;2.&lt;/span&gt;&lt;span class="n"&gt;fc35&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;running&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;system&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mode&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;PAM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;AUDIT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;SELINUX&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;APPARMOR&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;IMA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;SMACK&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;SECCOMP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;GCRYPT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;GNUTLS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;OPENSSL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;ACL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;BLKID&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;CURL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;ELFUTILS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;FIDO2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;IDN2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;IDN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;IPTC&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;KMOD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;LIBCRYPTSETUP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;LIBFDISK&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;PCRE2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;PWQUALITY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;P11KIT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;QRENCODE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;BZIP2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;LZ4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;XZ&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;ZLIB&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;ZSTD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;XKBCOMMON&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;UTMP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;SYSVINIT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;hierarchy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;unified&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;Detected&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;virtualization&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;podman&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;Detected&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;architecture&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;x86&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;64.&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;  OK  &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Stopped&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;The&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;nginx&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;HTTP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;reverse&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;proxy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;  OK  &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Stopped&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Network&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;is&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Online&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;  OK  &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Stopped&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Host&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Network&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Lookups&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;  OK  &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Stopped&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Remote&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;File&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Systems&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;Stopping&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Home&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Area&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Activation&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;Stopping&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Network&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Resolution&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;  OK  &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Stopped&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Network&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Resolution&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;  OK  &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Stopped&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Home&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Area&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Activation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;Stopping&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Home&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Area&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Manager&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;  OK  &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Stopped&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Home&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Area&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Manager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;  OK  &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Stopped&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Basic&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;  OK  &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Stopped&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Units&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;  OK  &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Stopped&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Dispatch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Password&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;…&lt;/span&gt;&lt;span class="n"&gt;ts&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Directory&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Watch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;  OK  &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Stopped&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Forward&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Password&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;R&lt;/span&gt;&lt;span class="err"&gt;…&lt;/span&gt;&lt;span class="n"&gt;uests&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Wall&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Directory&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Watch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;  OK  &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Stopped&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Slice&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Units&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;  OK  &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Removed&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;slice&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;User&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Session&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Slice&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;  OK  &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Stopped&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Socket&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Units&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;Stopping&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;D&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Bus&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;System&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Bus&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;  OK  &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Stopped&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;D&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Bus&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;System&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Bus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;  OK  &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Closed&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;D&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Bus&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;System&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Bus&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;  OK  &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Stopped&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;System&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Initialization&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;  OK  &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Stopped&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Verity&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Protected&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Volumes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;  OK  &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Stopped&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Update&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;is&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Completed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;  OK  &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Stopped&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Rebuild&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Dynamic&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Linker&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Cache&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;  OK  &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Stopped&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Rebuild&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Journal&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Catalog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;Stopping&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Record&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;System&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Boot&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;Shutdown&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;UTMP&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;  OK  &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Stopped&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Record&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;System&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Boot&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;Shutdown&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;UTMP&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;  OK  &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Stopped&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Create&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Volatile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Files&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Directories&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;  OK  &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Stopped&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;File&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Systems&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;Unmounting&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;Unmounting&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;hosts&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;Unmounting&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;resolv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;Unmounting&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lock&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;Unmounting&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;secrets&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;kubernetes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;serviceaccount&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;Unmounting&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Temporary&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Directory&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;Unmounting&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nf"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;journal&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;  OK  &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Stopped&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Create&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;System&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;FAILED&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Failed&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;unmounting&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;hosts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;FAILED&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Failed&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;unmounting&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;lock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;FAILED&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Failed&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;unmounting&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;sec&lt;/span&gt;&lt;span class="err"&gt;…&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;kubernetes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;serviceaccount&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;Unmounting&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;secrets&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;FAILED&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Failed&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;unmounting&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;resolv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;FAILED&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Failed&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;unmounting&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Temporary&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Directory&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tmp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;FAILED&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Failed&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;unmounting&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nf"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;journal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;FAILED&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Failed&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;unmounting&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;FAILED&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Failed&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;unmounting&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;secrets&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;  OK  &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Stopped&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Swaps&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;  OK  &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Reached&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;System&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Shutdown&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;  OK  &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Reached&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Unmount&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;All&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Filesystems&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;  OK  &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Reached&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Late&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;Shutdown&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="w"&gt;         &lt;/span&gt;&lt;span class="n"&gt;Starting&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;System&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Halt&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;Sending&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SIGTERM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;remaining&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;processes&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;Sending&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SIGKILL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;remaining&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;processes&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="ow"&gt;All&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;filesystems&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;swaps&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;loop&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;devices&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MD&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;devices&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;and&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;DM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;devices&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;detached&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;Halting&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;system&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="n"&gt;Exiting&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Wrap up&lt;/h2&gt;
&lt;p&gt;In this article we have seen that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;systemd workloads need &lt;code&gt;SIGRTMIN+3&lt;/code&gt; for stopping the workload gracefully.&lt;/li&gt;
&lt;li&gt;OpenShift does not send the signal specified in the container
  image (via the &lt;code&gt;STOPSIGNAL&lt;/code&gt; instruction). It does starting in OpenShift 4.10.&lt;/li&gt;
&lt;li&gt;We can use a container lifecycle hook to
  interact with the workload when stopping the container until the fix is
  available. For this scenario, we can use the &lt;code&gt;kill&lt;/code&gt; binary (which must exist in the
  container) to send &lt;code&gt;SIGRTMIN+3&lt;/code&gt; to PID 1 (systemd).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Updates&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The reason the STOPSINAL instruction is not interpreted in OpenShift is
  because the signal name RTMIN+3 is not properly parsed. Actually there
  are a fix for this situation (&lt;a href="https://github.com/cri-o/cri-o/pull/5366"&gt;this PR&lt;/a&gt;),
  that has been seen that will be included in OpenShift 4.10. Until this
  version is released, the solution above could make the works.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developers.redhat.com/blog/2019/04/24/how-to-run-systemd-in-a-container?source=sso#other_cool_features_about_podman_and_systemd"&gt;How to run systemd in a container&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.freedesktop.org/software/systemd/man/systemd.html#SIGRTMIN+3"&gt;Systemd SIGRTMIN+3&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.docker.com/engine/reference/builder/#stopsignal"&gt;Dockerfile - STOPSIGNAL&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/"&gt;Container Lifecycle Hooks&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/"&gt;Attach Handlers to Container Lifecycle Events&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UPDATE&lt;/strong&gt;: &lt;a href="https://bugzilla.redhat.com/show_bug.cgi?id=2000877"&gt;BZ 2000877&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;</content><category term="kubernetes"/><category term="kubernetes"/><category term="OpenShift"/><category term="cri-o"/><category term="sigstop"/></entry></feed>