summaryrefslogtreecommitdiff
path: root/doc/overview.html
diff options
context:
space:
mode:
Diffstat (limited to 'doc/overview.html')
-rw-r--r--doc/overview.html220
1 files changed, 220 insertions, 0 deletions
diff --git a/doc/overview.html b/doc/overview.html
new file mode 100644
index 0000000..fd544a7
--- /dev/null
+++ b/doc/overview.html
@@ -0,0 +1,220 @@
+<html>
+ <head>
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+ <meta http-equiv="Content-Language" content="en" />
+ <title>s6-rc: an overview</title>
+ <meta name="Description" content="s6-rc: an overview" />
+ <meta name="Keywords" content="s6-rc overview" />
+ <!-- <link rel="stylesheet" type="text/css" href="http://skarnet.org/default.css" /> -->
+ </head>
+<body>
+
+<p>
+<a href="index.html">s6-rc</a><br />
+<a href="http://skarnet.org/software/">Software</a><br />
+<a href="http://skarnet.org/">skarnet.org</a>
+</p>
+
+<h1> An overview of s6-rc </h1>
+
+<h2> A manager for <em>services</em> </h2>
+
+<p>
+ s6-rc is a service manager, or, in other words, a
+<em>machine state manager</em>: given a database of services,
+with dependencies between them, it can safely bring the
+<em>global machine state</em>, or <em>live state</em>, to
+the desired point, making sure dependencies are never
+broken.
+</p>
+
+<h3> The live state </h3>
+
+<p>
+ The <em>live state</em>, by definition, is the tuple of
+all service states on the machine. Changing the live state
+means bringing services up, or bringing services down.
+</p>
+
+<h3> 2.5 kinds of services </h3>
+
+<p>
+ Supervision suites manage <em>long-lived processes</em>, a.k.a
+<em>daemons</em>, and sometimes call them <em>services</em>.
+With s6-rc, those things are different: a long-lived process is
+also called a <em>longrun</em> and is a service, but a service
+does not have to be a longrun. There is a second kind of service,
+which is called a <em>oneshot</em>, and which represents a change
+of system state that is not embodied by the presence of a
+long-lived process. For instance, "mounting a filesystem" is a
+system state change, but in most cases there is no process hanging
+around while the filesystem is mounted.
+</p>
+
+<p>
+ s6-rc handles both oneshots and longruns.
+</p>
+
+<ul>
+ <li> A <em>longrun</em> is the exact equivalent of a <em>service</em>
+in the supervision sense. It is defined by a
+<a href="http://skarnet.org/software/s6/servicedir.html">service
+directory</a>, with a run script and optional other data. The
+service is considered <em>up</em> as long as the long-lived
+process is alive and, for daemons that support it, has
+<a href="http://skarnet.org/software/s6/notifywhenup.html">notified
+its readiness</a>. It is considered <em>down</em> otherwise. </li>
+ <li> A <em>oneshot</em>, on the other hand, is totally unknown
+from supervision suites, because there is no daemon to manage.
+A oneshot is represented by two short-lived scripts, <em>up</em>
+and <em>down</em>, used to bring the service respectively up and
+down. The service is considered up when the <em>up</em>
+program has exited successfully, and until the <em>down</em>
+program has exited successfully. </li>
+</ul>
+
+<p>
+ Services can depend on one another.
+If service <em>A</em> has been declared as
+depending on service <em>B</em>, then s6-rc will make sure to
+never start <em>A</em> until it knows that <em>B</em> is up,
+and will make sure to never stop <em>B</em> until it knows that
+<em>A</em> is down. This works whether <em>A</em> and <em>B</em>
+are both oneshots, both longruns, or a oneshot and a longrun.
+</p>
+
+<p>
+ s6-rc also handles an additional kind of service: a <em>bundle</em>.
+A bundle is just a collection of oneshots or longruns, described
+under a single name. A bundle definition can even contain other
+bundles, but ultimately a bundle will always represent a set of one
+or more oneshots or longruns. A oneshot or longrun is called an
+<em>atomic service</em>.
+Bundle names can be used anywhere with the s6-rc user
+interface, and they will internally be converted to a set of
+atomic services. An atomic service can depend on a bundle: it will
+simply depend on all the atomic services represented by the bundle.
+A bundle, however, cannot have dependencies.
+</p>
+
+<h2> A two-part operation </h2>
+
+<p>
+ Unlike other service managers such as
+<a href="http://jjacky.com/anopa/">anopa</a>, s6-rc separates the
+work of analyzing a set of service definitions, resolving
+dependencies, and so on, from the work of actually applying the
+dependency graph to perform live state changes. The former is
+the <em>compilation</em> phase, and is done offline; the latter is
+the <em>live</em> phase, and is of course done online - it impacts
+the actual state of the machine.
+</p>
+
+<h3> The compilation phase </h3>
+
+<ul>
+ <li> Users are expected to write their service definitions - be it
+oneshots, longruns or bundles - in one ore more
+<em>source directories</em>, in the s6-rc
+<a href="s6-rc-compile.html#source">source format</a>.
+The source format is simple to parse automatically - which is
+one of the main reasons why it has been designed that way - and
+it is also simple to generate automatically: it is easy to write
+converters from a given service definition format to the s6-rc
+source format. </li>
+ <li> Users then run the
+<a href="s6-rc-compile.html">s6-rc-compile</a> program, that takes
+a set of service definitions in one or more source directories
+and makes a <em>compiled service database</em>, abbreviated as
+<em>compiled</em>. This <em>compiled</em> should be stored by the
+administrator on the root filesystem. </li>
+ <li> The <a href="s6-rc-db.html">s6-rc-db</a> tool can be used
+to examine compiled service databases and extract information from
+them in a human-friendly format. </li>
+</ul>
+
+<h3> The live phase </h3>
+
+<p>
+ When the machine boots up:
+</p>
+
+<ul>
+ <li> First, the chosen init should make sure that a
+<a href="http://skarnet.org/software/s6/">s6</a>
+supervision tree is up and running. s6-rc will only work
+if there is an active
+<a href="http://skarnet.org/software/s6/s6-svscan.html">s6-svscan</a>
+process monitoring a
+<a href="http://skarnet.org/software/s6/scandir.html">scan</a>
+directory. On Linux, for instance, it is possible to achieve such a state
+by using an init created by the
+<a href="http://skarnet.org/software/s6-linux-init/s6-linux-init-maker.html">s6-linux-init-maker</a>
+tool: when control reaches stage 2, s6-svscan is guaranteed to run,
+so using s6-rc in the stage 2 script is the way to go. </li>
+ <li> The boot process, let's name it <em>stage2</em>, should then call the
+<a href="s6-rc-init.html">s6-rc-init</a> program. This program
+will set up an area for s6-rc in a writable directory (which can
+be on a RAM filesystem such as tmpfs) to host its live information
+such as the machine state, a working copy of all service directories
+for longruns, and a link to the current compiled state database.
+<a href="s6-rc-init.html">s6-rc-init</a> initializes the machine state
+as "every declared service is down". </li>
+ <li> <em>stage2</em> should then invoke the
+<a href="s6-rc.html">s6-rc</a> program with the names of the services that
+should be brought up given as arguments. Of course, bundles can be used
+for shortcuts. </li>
+ <li> That's it, the services are up and the initialization should be
+over. If the service database has been properly written, a <em>stage2</em>
+script can actually be really short: an invocation of
+<a href="s6-rc-init.html">s6-rc-init</a> and an invocation of
+<a href="s6-rc.html">s6-rc</a>. </li>
+</ul>
+
+<h3> Other state changes and shutdown </h3>
+
+<p>
+ The administrator can make changes to the live state of the machine
+by manually calling <a href="s6-rc.html">s6-rc</a> again with the
+proper arguments. This is more powerful than the old
+<a href="http://www.tldp.org/LDP/sag/html/run-levels-intro.html">runlevels</a>:
+it is possible to change the live state to <em>any</em> set of
+services, not only predefined ones. The only thing that s6-rc will
+not allow is a state that would break service dependencies; it
+will always respect the dependency graph.
+</p>
+
+<p>
+ The s6-rc command is the central for machine state changes, and it is
+also true for shutdown. When shutting a machine down, all the services
+managed by s6-rc should be brought down in the proper order (via the
+<tt>s6-rc -da change</tt> command). Once all those services have been
+brought down successfully, the final shutdown procedure can take place;
+for instance, if s6-svscan is running as process 1 with the
+<a href="http://skarnet.org/software/s6-linux-init/">s6-linux-init</a>
+defaults, <tt>s6-svscanctl -t /run/service</tt> will kill the
+supervision tree and call <tt>/etc/rc.shutdown reboot</tt>, which should
+reboot the machine.
+</p>
+
+<h2> Live updates to the service database </h2>
+
+<p>
+The s6-rc command is a one-stop shop for service management as long as
+the compiled database doesn't change. If an administrator wishes to
+make a new compiled database the current live one, without rebooting
+the machine, a bit more work is needed, and that's the job of the
+<a href="s6-rc-update.html">s6-rc-update</a> command. This command
+has been specifically written with Unix distributions in mind: when
+new packages ship, they come with new service definitions, or upgraded
+ones, and it is necessary to compile a new service database and update
+the live state so it matches; if source definitions for s6-rc are
+provided in the packages, an invocation of
+<a href="s6-rc-compile.html">s6-rc-compile</a> followed by an invocation of
+<a href="s6-rc-update.html">s6-rc-update</a> should be all it takes to
+keep the live state up to date.
+</p>
+
+</body>
+</html>