80 lines
No EOL
20 KiB
HTML
80 lines
No EOL
20 KiB
HTML
<!DOCTYPE html><html><head><meta content="text/html; charset=utf-8" http-equiv="Content-Type" /><meta content="width=device-width, initial-scale=1" name="viewport" /><!--replace-start-0--><!--replace-start-5--><!--replace-start-8--><title>systemd - My Zettelkasten</title><!--replace-end-8--><!--replace-end-5--><!--replace-end-0--><link href="https://cdn.jsdelivr.net/npm/fomantic-ui@2.8.7/dist/semantic.min.css" rel="stylesheet" /><link href="https://fonts.googleapis.com/css?family=Merriweather|Libre+Franklin|Roboto+Mono&display=swap" rel="stylesheet" /><!--replace-start-1--><!--replace-start-4--><!--replace-start-7--><link href="https://raw.githubusercontent.com/srid/neuron/master/assets/neuron.svg" rel="icon" /><meta content="Once the boot process has completed and the bootloader has located the kernel and injected it into memory the first user space program runs: init (for initialisation). init is a daemon process that continues running until shutdown and is responsible for starting all the processes that are prerequisi" name="description" /><meta content="systemd" property="og:title" /><meta content="My Zettelkasten" property="og:site_name" /><meta content="article" property="og:type" /><meta content="systemd" property="neuron:zettel-id" /><meta content="systemd" property="neuron:zettel-slug" /><meta content="Linux" property="neuron:zettel-tag" /><meta content="operating-systems" property="neuron:zettel-tag" /><meta content="procedural" property="neuron:zettel-tag" /><meta content="systemd" property="neuron:zettel-tag" /><meta content="systems-programming" property="neuron:zettel-tag" /><script type="application/ld+json">[]</script><style type="text/css">body{background-color:#eeeeee !important;font-family:"Libre Franklin", serif !important}body .ui.container{font-family:"Libre Franklin", serif !important}body h1, h2, h3, h4, h5, h6, .ui.header, .headerFont{font-family:"Merriweather", sans-serif !important}body code, pre, tt, .monoFont{font-family:"Roboto Mono","SFMono-Regular","Menlo","Monaco","Consolas","Liberation Mono","Courier New", monospace !important}body div.z-index p.info{color:#808080}body div.z-index ul{list-style-type:square;padding-left:1.5em}body div.z-index .uplinks{margin-left:0.29999em}body .zettel-content h1#title-h1{background-color:rgba(33,133,208,0.1)}body nav.bottomPane{background-color:rgba(33,133,208,2.0e-2)}body div#footnotes{border-top-color:#2185d0}body p{line-height:150%}body img{max-width:100%}body .deemphasized{font-size:0.94999em}body .deemphasized:hover{opacity:1}body .deemphasized:not(:hover){opacity:0.69999}body .deemphasized:not(:hover) a{color:#808080 !important}body div.container.universe{padding-top:1em}body div.zettel-view ul{padding-left:1.5em;list-style-type:square}body div.zettel-view .pandoc .highlight{background-color:#ffff00}body div.zettel-view .pandoc .ui.disabled.fitted.checkbox{margin-right:0.29999em;vertical-align:middle}body div.zettel-view .zettel-content .metadata{margin-top:1em}body div.zettel-view .zettel-content .metadata div.date{text-align:center;color:#808080}body div.zettel-view .zettel-content h1{padding-top:0.2em;padding-bottom:0.2em;text-align:center}body div.zettel-view .zettel-content h2{border-bottom:solid 1px #4682b4;margin-bottom:0.5em}body div.zettel-view .zettel-content h3{margin:0px 0px 0.4em 0px}body div.zettel-view .zettel-content h4{opacity:0.8}body div.zettel-view .zettel-content div#footnotes{margin-top:4em;border-top-style:groove;border-top-width:2px;font-size:0.9em}body div.zettel-view .zettel-content div#footnotes ol > li > p:only-of-type{display:inline;margin-right:0.5em}body div.zettel-view .zettel-content aside.footnote-inline{width:30%;padding-left:15px;margin-left:15px;float:right;background-color:#d3d3d3}body div.zettel-view .zettel-content .overflows{overflow:auto}body div.zettel-view .zettel-content code{margin:auto auto auto auto;font-size:100%}body div.zettel-view .zettel-content p code, li code, ol code{padding:0.2em 0.2em 0.2em 0.2em;background-color:#f5f2f0}body div.zettel-view .zettel-content pre{overflow:auto}body div.zettel-view .zettel-content dl dt{font-weight:bold}body div.zettel-view .zettel-content blockquote{background-color:#f9f9f9;border-left:solid 10px #cccccc;margin:1.5em 0px 1.5em 0px;padding:0.5em 10px 0.5em 10px}body div.zettel-view .zettel-content.raw{background-color:#dddddd}body .ui.label.zettel-tag{color:#000000}body .ui.label.zettel-tag a{color:#000000}body nav.bottomPane ul.backlinks > li{padding-bottom:0.4em;list-style-type:disc}body nav.bottomPane ul.context-list > li{list-style-type:lower-roman}body .footer-version img{-webkit-filter:grayscale(100%);-moz-filter:grayscale(100%);-ms-filter:grayscale(100%);-o-filter:grayscale(100%);filter:grayscale(100%)}body .footer-version img:hover{-webkit-filter:grayscale(0%);-moz-filter:grayscale(0%);-ms-filter:grayscale(0%);-o-filter:grayscale(0%);filter:grayscale(0%)}body .footer-version, .footer-version a, .footer-version a:visited{color:#808080}body .footer-version a{font-weight:bold}body .footer-version{margin-top:1em !important;font-size:0.69999em}@media only screen and (max-width: 768px){body div#zettel-container{margin-left:0.4em !important;margin-right:0.4em !important}}body span.zettel-link-container span.zettel-link a{color:#2185d0;font-weight:bold;text-decoration:none}body span.zettel-link-container span.zettel-link a:hover{background-color:rgba(33,133,208,0.1)}body span.zettel-link-container span.extra{color:auto}body span.zettel-link-container.errors{border:solid 1px #ff0000}body span.zettel-link-container.errors span.zettel-link a:hover{text-decoration:none !important;cursor:not-allowed}body [data-tooltip]:after{font-size:0.69999em}body div.tag-tree div.node{font-weight:bold}body div.tag-tree div.node a.inactive{color:#555555}body .tree.flipped{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}body .tree{overflow:auto}body .tree ul.root{padding-top:0px;margin-top:0px}body .tree ul{position:relative;padding:1em 0px 0px 0px;white-space:nowrap;margin:0px auto 0px auto;text-align:center}body .tree ul::after{content:"";display:table;clear:both}body .tree ul:last-child{padding-bottom:0.1em}body .tree li{display:inline-block;vertical-align:top;text-align:center;list-style-type:none;position:relative;padding:1em 0.5em 0em 0.5em}body .tree li::before{content:"";position:absolute;top:0px;right:50%;border-top:solid 2px #cccccc;width:50%;height:1.19999em}body .tree li::after{content:"";position:absolute;top:0px;right:50%;border-top:solid 2px #cccccc;width:50%;height:1.19999em}body .tree li::after{right:auto;left:50%;border-left:solid 2px #cccccc}body .tree li:only-child{padding-top:0em}body .tree li:only-child::after{display:none}body .tree li:only-child::before{display:none}body .tree li:first-child::before{border-style:none;border-width:0px}body .tree li:first-child::after{border-radius:5px 0px 0px 0px}body .tree li:last-child::after{border-style:none;border-width:0px}body .tree li:last-child::before{border-right:solid 2px #cccccc;border-radius:0px 5px 0px 0px}body .tree ul ul::before{content:"";position:absolute;top:0px;left:50%;border-left:solid 2px #cccccc;width:0px;height:1.19999em}body .tree li div.forest-link{border:solid 2px #cccccc;padding:0.2em 0.29999em 0.2em 0.29999em;text-decoration:none;display:inline-block;border-radius:5px 5px 5px 5px;color:#333333;position:relative;top:2px}body .tree.flipped li div.forest-link{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}</style><script
|
||
async=""
|
||
id="MathJax-script"
|
||
src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"
|
||
></script>
|
||
<link
|
||
href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.23.0/themes/prism.min.css"
|
||
rel="stylesheet"
|
||
/><link rel="preconnect" href="https://fonts.googleapis.com" /><link
|
||
rel="preconnect"
|
||
href="https://fonts.gstatic.com"
|
||
crossorigin
|
||
/><link
|
||
href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;1,100;1,200;1,300;1,400;1,500;1,600;1,700&family=IBM+Plex+Sans+Condensed:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;1,100;1,200;1,300;1,400;1,500;1,600;1,700&family=IBM+Plex+Sans:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;1,100;1,200;1,300;1,400;1,500;1,600;1,700&family=IBM+Plex+Serif:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;1,100;1,200;1,300;1,400;1,500;1,600;1,700&display=swap"
|
||
rel="stylesheet"
|
||
/>
|
||
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.23.0/components/prism-core.min.js"></script>
|
||
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.23.0/plugins/autoloader/prism-autoloader.min.js"></script>
|
||
<style>
|
||
body .ui.container,
|
||
body ul {
|
||
font-family: "IBM Plex Sans" !important;
|
||
}
|
||
body blockquote {
|
||
border-left-width: 3px !important;
|
||
font-style: italic;
|
||
}
|
||
.headerFont,
|
||
.ui.header,
|
||
body h1,
|
||
h2,
|
||
h3,
|
||
h4,
|
||
h5,
|
||
h6 {
|
||
font-family: "IBM Plex Sans Condensed" !important;
|
||
}
|
||
body p {
|
||
line-height: 1.4;
|
||
}
|
||
.monoFont,
|
||
body code,
|
||
pre,
|
||
tt {
|
||
font-family: "IBM Plex Mono" !important;
|
||
font-size: 12px !important;
|
||
line-height: 1.4 !important;
|
||
}
|
||
</style>
|
||
<!--replace-end-7--><!--replace-end-4--><!--replace-end-1--></head><body><div class="ui fluid container universe"><!--replace-start-2--><!--replace-start-3--><!--replace-start-6--><div class="ui text container" id="zettel-container" style="position: relative"><div class="zettel-view"><article class="ui raised attached segment zettel-content"><div class="pandoc"><h1 id="title-h1">systemd</h1><p>Once the <span class="zettel-link-container cf"><span class="zettel-link" title="Zettel: The boot process"><a href="Boot_process.html">boot process</a></span></span> has completed and the bootloader has located the kernel and injected it into memory the first user space program runs: <code>init</code> (for <em>initialisation</em>). <code>init</code> is a <span class="zettel-link-container cf"><span class="zettel-link" title="Zettel: Daemons"><a href="Daemons.html">daemon</a></span></span> <a href="./Processes.md">process</a> that continues running until shutdown and is responsible for starting all the processes that are prerequisites for user space. For example: network connections, disk access, user logins etc. <code>init</code> is the parent of all processes: PID1. Whilst it does a lot of its work in quick succession at boot time it is not limited to the this stage of the lifescycle but runs continuously in reponse to new user events.</p><p>On Linux systems <code>systemd</code> is used to implement <code>init</code> and therefore <code>systemd</code> will always be listed as PID1.</p><p><code>systemd</code> is directly accessible from user space and provides a straightforward way to enable/disable, start/stop system level processes</p><blockquote><p><code>systemd</code> can track individual service daemons after they start, and group together multiple processes associated with a service, giving you more power and insight into exactly what is running on the system <em>How Linux Works: Third Edition</em>, Brian Ward 2021</p></blockquote><h2 id="how-systemd-works">How systemd works</h2><h3 id="goal-directed-units">Goal-directed units</h3><p><code>systemd</code> works on the basis of <em>goals</em>. Each goal is system task defined as a <strong>unit</strong>. A unit contains instructions and a specification of dependencies to other units.</p><p>When activating a unit, <code>systemd</code> first activates the dependencies and then moves onto the details of the unit itself. <code>init</code> as implemented by <code>systemd</code> does not follow a rigid sequence every time, initialising units in the same sequence and waiting for one to complete before starting another. Instead it activates units whenever they are ready. This, its parallelized nature, is one of the main advantages over previous programs that managed the <code>init</code> sequence on Linux (such as for example System V);</p><h3 id="unit-types">Unit types</h3><p>Units are organised into <strong>unit types</strong>. The main types that run at boot time are as follows:</p><ul><li>service units (<code>.service</code>)<ul><li>control service daemons</li></ul></li><li>socket units (<code>.socket</code>)<ul><li>handle incoming network connection request locations</li></ul></li><li>device units (<code>.device</code>)<ul><li>disks and other devices</li></ul></li><li>mount units (<code>.mount</code>)<ul><li>handle the attachment of filesystems to the system</li></ul></li><li>target units<ul><li>control other units by organising them into groups</li></ul></li></ul><p>For example, at boot, a target unit called <code>default.target</code> groups together a number of service and mount units as dependencies. These then run in a graph-like dependency structure where a unit that comes late in the boot process can depend on several previous units making earlier branches of a dependency tree join back together.</p><h2 id="systemd-configuration-files">systemd configuration files</h2><p>Units are managed via <code>systemd</code> configuration files.</p><h3 id="configuration-file-locations">Configuration file locations</h3><p>System level <code>systemd</code> config files are located in the <em>system unit directory</em> at <code>/usr/lib/systemd/system</code>. You shouldn’t change or manipulate these files or attempt to add new config files here since they will be overwritten by the system.</p><p><img src="/static/systemd-global-files.png" /> <em><code>systemd</code> global unit files</em></p><p>Local definitions that relate to the specific user and where the user herself can define units are located in the <em>system configuration</em> directory: <code>/etc/systemd/system</code>.</p><p><img src="/static/systemd-local-files.png" /></p><p><em><code>systemd</code> local unit files, specific to the currently logged-in user</em></p><h3 id="example-files">Example files</h3><p>Below is the systemd service file for the creation of UUIDs:</p><pre><code class="plain language-plain">[Unit]
|
||
Description=Daemon for generating UUIDs
|
||
Documentation=man:uuidd(8)
|
||
Requires=uuidd.socket
|
||
|
||
[Service]
|
||
ExecStart=/usr/sbin/uuidd --socket-activation
|
||
Restart=no
|
||
User=uuidd
|
||
Group=uuidd
|
||
ProtectSystem=strict
|
||
ProtectHome=yes
|
||
PrivateDevices=yes
|
||
PrivateUsers=yes
|
||
ProtectKernelTunables=yes
|
||
ProtectKernelModules=yes
|
||
ProtectControlGroups=yes
|
||
MemoryDenyWriteExecute=yes
|
||
ReadWritePaths=/var/lib/libuuid/
|
||
SystemCallFilter=@default @file-system @basic-io @system-service @signal @io-event @network-io
|
||
|
||
[Install]
|
||
Also=uuidd.socket</code></pre><ul><li>The <code>Unit</code> section provides metadata about the unit including which <code>systemd</code> dependencies it has</li><li><code>Service</code> constitutes the main specification for the unit</li><li><code>Install</code> is the call to set the dependencies running before the <code>Service</code> functions are accessible.</li></ul><h2 id="systemd-operations-systemctl">systemd operations: systemctl</h2><p>The <code>systemctl</code> command is the chief way of interacting with <code>systemd</code>. You use it to activate and deactivate services, list their status, reload the configuration and so.</p><h3 id="view-the-dependency-graph">View the dependency graph</h3><p><code>systemctl status</code> by itself will print a long list of units grouped by their dependency relations. It will also provide some metadata about the current systemd boot context.</p><h3 id="viewing-active-units">Viewing active units</h3><p>Below I have listed the running units pertaining to bluetooth:</p><pre><code class="language-none">$ systemctl list-units | grep bluetooth
|
||
sys-devices-pci0000:00-0000:00:14.0-usb3-3\x2d10-3\x2d10:1.0-bluetooth-hci0-hci0:3585.device loaded active plugged /sys/devices/pci0000:00/0000:00:14.0/usb3/3-10/3-10:1.0/bluetooth/hci0/hci0:3585
|
||
sys-devices-pci0000:00-0000:00:14.0-usb3-3\x2d10-3\x2d10:1.0-bluetooth-hci0.device loaded active plugged /sys/devices/pci0000:00/0000:00:14.0/usb3/3-10/3-10:1.0/bluetooth/hci0
|
||
sys-subsystem-bluetooth-devices-hci0.device loaded active plugged /sys/subsystem/bluetooth/devices/hci0
|
||
sys-subsystem-bluetooth-devices-hci0:3585.device loaded active plugged /sys/subsystem/bluetooth/devices/hci0:3585
|
||
bluetooth.service loaded active running Bluetooth service
|
||
bluetooth.target loaded active active Bluetooth Support</code></pre><h3 id="list-jobs">List jobs</h3><p>Requests to activate, reactivate and restart units are called <strong>jobs</strong> in <code>systemd</code>. They can be thought of as unit state changes. Current jobs can be listed with <code>systemctl list-jobs</code>.</p><p>This will most likely return <code>No jobs running</code> if the computer has been running for a while. Most jobs execute at boot.</p><h3 id="enabledisable-startstop-units">Enable/disable, start/stop units</h3><p>If a unit has dependencies it is necessary to <em>enable</em> it before starting it. This installs the dependencies.</p><pre><code class="bash language-bash">systemctl enable mongodb.service
|
||
Created symlink /etc/systemd/system/multi-user.target.wants/mongodb.service → /usr/lib/systemd/system/mongodb.service.</code></pre><p>Then we can start:</p><pre><code class="language-none">systemctl start mongodb.service</code></pre><p>To stop the service:</p><pre><code class="language-none">systemctl stop mongodb.service</code></pre><p>After this we should disable it, in order to remove any symbolic links it has created on the system as part of the install process:</p><pre><code class="bash language-bash">systemctl disable mongodb.service
|
||
Removed "/etc/systemd/system/multi-user.target.wants/mongodb.service".</code></pre><h2 id="why-use-systemd-over-cron-">Why use systemd over cron ?</h2><p><a href="https://mark.stosberg.com/2016-08-26-rsnapshot-and-systemd/">https://mark.stosberg.com/2016-08-26-rsnapshot-and-systemd/</a></p></div></article><nav class="ui attached segment deemphasized backlinksPane" id="neuron-backlinks-pane"><h3 class="ui header">Backlinks</h3><ul class="backlinks"><li><span class="zettel-link-container cf"><span class="zettel-link"><a href="journald.html">journald</a></span></span><ul class="context-list" style="zoom: 85%;"><li class="item"><div class="pandoc"><p><code>journald</code> is a program that comes as default with <span class="zettel-link-container cf"><span class="zettel-link" title="Zettel: systemd"><a href="systemd.html">systemd</a></span></span>. It is a service for collecting and storing system-level log data. I keeps a track of all <span class="zettel-link-container cf"><span class="zettel-link" title="Zettel: The kernel"><a href="The_kernel.html">kernel</a></span></span> processes. It is invaluable when tracing the source of problems and errors that may arise on the system level. It keeps a track of all kernal processes.</p></div></li></ul></li></ul></nav><nav class="ui attached segment deemphasized bottomPane" id="neuron-tags-pane"><div><span class="ui basic label zettel-tag" title="Tag">Linux</span><span class="ui basic label zettel-tag" title="Tag">operating-systems</span><span class="ui basic label zettel-tag" title="Tag">procedural</span><span class="ui basic label zettel-tag" title="Tag">systemd</span><span class="ui basic label zettel-tag" title="Tag">systems-programming</span></div></nav><nav class="ui bottom attached icon compact inverted menu blue" id="neuron-nav-bar"><!--replace-start-9--><!--replace-end-9--><a class="right item" href="impulse.html" title="Open Impulse"><i class="wave square icon"></i></a></nav></div></div><!--replace-end-6--><!--replace-end-3--><!--replace-end-2--><div class="ui center aligned container footer-version"><div class="ui tiny image"><a href="https://neuron.zettel.page"><img alt="logo" src="https://raw.githubusercontent.com/srid/neuron/master/assets/neuron.svg" title="Generated by Neuron 1.9.35.3" /></a></div></div></div></body></html> |