Page MenuHomec4science

No OneTemporary

File Metadata

Created
Fri, Apr 19, 04:30
diff --git a/assets/incident.png b/assets/incident.png
new file mode 100644
index 0000000..c4c9fba
Binary files /dev/null and b/assets/incident.png differ
diff --git a/assets/mount.svg b/assets/mount.svg
new file mode 100644
index 0000000..2ee197d
--- /dev/null
+++ b/assets/mount.svg
@@ -0,0 +1,2 @@
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="661px" height="291px" viewBox="-0.5 -0.5 661 291" content="&lt;mxfile modified=&quot;2019-01-15T20:48:51.544Z&quot; host=&quot;www.draw.io&quot; agent=&quot;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36&quot; version=&quot;10.0.41&quot; etag=&quot;PH30YfowH-HbxvlUZqgt&quot; type=&quot;google&quot;&gt;&lt;diagram id=&quot;AV7xGsnJl9lvWWj9r5ga&quot;&gt;7VlLj9sgEP41OW5k8CPe4+bVHrbSSntoe6qITWxabFJMEru/vmDj+JlVpLUTNdtcAh/DwMx8A0wyMRdR+omjXfiF+ZhOoOGnE3M5gRBY0JFfCskKxAVGAQSc+FqoAl7JH6zBUmxPfJw0BAVjVJBdE/RYHGNPNDDEOTs2xbaMNlfdoQB3gFcP0S76lfgi1FbYRoV/xiQIy5WBoUciVAprIAmRz441yFxNzAVnTBStKF1gqpxX+qWYtz4zetoYx7G4ZAIsJhwQ3WvbJtChcurcJwe1P5Fpo53fe7WpucCpeECUBPHEfFI+lithXo3LVqC/cz3JDsW9irYsFg9JHlulR+467WpZE4qTLBE4kiKg1CntKdQ2l5JwvusShY11IWf72MfKcEMOH0Mi8OsOeWr0KHkqsVBEVPaAbB4wF0RG/KmwdCmYEqBog+kLS4ggTKHa+Er8uSUQEd9X68+1x5YUb7VXPBIHz3lv6Sh3EEoXjDKeb1ZiK3u9Ppmh9OP0bJDBiToy5zCLsOCZFNETSrJlJzoW/WPFXcfRWFjjLXzUINL5EpxUV5SSDc2qfoaZ/xLD4Adi2Ho9t+e2khSc/cK1EX/2uDGMYbhnArtBPmh0yQdNu0s+4AxAPuss+RQ3LiIN7CON2kBFiULXEJxohWi7xY7njR6i9vkAuyGyeo4Ha4AA2SMFSF3p+ZlxhRht4ZkYORvHdoaJEWjFqC+N3JFi5HT8hX35HNJdxkXIAhYjuqrQedOjNe/hlIhvCp7auve9NrJM9Yy8k5WdWO64Nkl1v9fHqml5r5z3EwuR6dcj2gsmoWq3z0ydt/nKhX3KqEZ0ErbnnoZm+pWJeIDLgM0uDiLHFAlyaKp/T0hmI6UNipkIMf9xb+ljuq30sbrpA/qeQEPkj3ul/HkjSwbMBKubCfbtEuHx3n07wiGTT33iHGU1gR0jsUhqml8UUMsgq/VIcFuFZUvect6Ul41iB1WUT6ZcFPiyhvnQtxIAXcIA93bZWO5n8Hsp2W/u7UqyWzeS23MjwZFuJACHTJ4BCW338Plyzw7P5/M/XryzPCFy1hWo7NvY9a0+KrtwYzpDFSft19VVuWzd1ROgLwPMG2bAWAX6dDq90lkuP30JYOSfgc7ydgJcsToH1yrPb/YEBjesL8DolfZd3QTtOtvsSYTR6uzy5fv/rHorRLNWhHp+CRnoqJLd6o/MosSr/g42V38B&lt;/diagram&gt;&lt;/mxfile&gt;" style="background-color: rgb(255, 255, 255);"><defs/><rect x="0" y="0" width="660" height="290" fill="#d6e5ff" stroke="#000000" pointer-events="none"/><g transform="translate(8.5,7.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="112" height="22" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 113px; white-space: nowrap; overflow-wrap: normal;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><div style="text-align: center"><span style="font-size: 20px">Filesystem 1</span></div></div></div></foreignObject><text x="56" y="17" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><rect x="295" y="90" width="235" height="160" fill="#ffb5b5" stroke="#d79b00" pointer-events="none"/><g transform="translate(303.5,97.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="112" height="22" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 113px; white-space: nowrap; overflow-wrap: normal;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><div style="text-align: center"><span style="font-size: 20px">Filesystem 2</span></div></div></div></foreignObject><text x="56" y="17" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><rect x="300" y="10" width="40" height="40" fill="#ffe6cc" stroke="#d79b00" pointer-events="none"/><g transform="translate(316.5,17.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="6" height="24" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 8px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><font style="font-size: 22px">/</font></div></div></foreignObject><text x="3" y="18" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><rect x="100" y="90" width="80" height="40" fill="#fff2cc" stroke="#d6b656" pointer-events="none"/><g transform="translate(111.5,97.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="56" height="24" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 56px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><font style="font-size: 22px">folder</font></div></div></foreignObject><text x="28" y="18" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><path d="M 440 170 L 440 183.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 440 188.88 L 436.5 181.88 L 440 183.63 L 443.5 181.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><rect x="360" y="130" width="160" height="40" fill="#fff2cc" stroke="#d6b656" pointer-events="none"/><g transform="translate(368.5,137.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="142" height="24" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 142px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><font style="font-size: 22px">another_folder</font></div></div></foreignObject><text x="71" y="18" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">&lt;font style="font-size: 22px"&gt;another_folder&lt;/font&gt;</text></switch></g><path d="M 320 50 L 320 70 L 140 70 L 140 83.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 140 88.88 L 136.5 81.88 L 140 83.63 L 143.5 81.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 320 50 L 320 70 L 440 70 L 440 123.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 440 128.88 L 436.5 121.88 L 440 123.63 L 443.5 121.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 90 210 L 90 223.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 90 228.88 L 86.5 221.88 L 90 223.63 L 93.5 221.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><rect x="30" y="170" width="120" height="40" fill="#fff2cc" stroke="#d6b656" pointer-events="none"/><g transform="translate(44.5,177.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="90" height="24" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 92px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><font style="font-size: 22px">subfolder</font></div></div></foreignObject><text x="45" y="18" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><path d="M 140 130 L 140 150 L 90 150 L 90 163.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 90 168.88 L 86.5 161.88 L 90 163.63 L 93.5 161.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><rect x="160" y="170" width="120" height="40" fill="#d5e8d4" stroke="#82b366" pointer-events="none"/><g transform="translate(205.5,177.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="28" height="24" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 30px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><font style="font-size: 22px">file</font></div></div></foreignObject><text x="14" y="18" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><path d="M 140 130 L 140 150 L 220 150 L 220 163.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 220 168.88 L 216.5 161.88 L 220 163.63 L 223.5 161.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><rect x="560" y="90" width="80" height="40" fill="#ffffff" stroke="#000000" pointer-events="none"/><g transform="translate(590.5,97.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="18" height="24" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 20px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><font style="font-size: 22px">...</font></div></div></foreignObject><text x="9" y="18" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><path d="M 320 50 L 320 70 L 600 70 L 600 83.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><path d="M 600 88.88 L 596.5 81.88 L 600 83.63 L 603.5 81.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="none"/><rect x="360" y="190" width="160" height="40" fill="#d5e8d4" stroke="#82b366" pointer-events="none"/><g transform="translate(382.5,197.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="114" height="24" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 116px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><font style="font-size: 22px">another_file</font></div></div></foreignObject><text x="57" y="18" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><rect x="50" y="230" width="80" height="40" fill="#ffffff" stroke="#000000" pointer-events="none"/><g transform="translate(80.5,237.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="18" height="24" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 20px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;"><font style="font-size: 22px">...</font></div></div></foreignObject><text x="9" y="18" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g></svg>
\ No newline at end of file
diff --git a/assets/sandwich.png b/assets/sandwich.png
new file mode 100644
index 0000000..d148872
Binary files /dev/null and b/assets/sandwich.png differ
diff --git a/assets/server_problem.png b/assets/server_problem.png
new file mode 100644
index 0000000..c754244
Binary files /dev/null and b/assets/server_problem.png differ
diff --git a/assets/universal_install_script.png b/assets/universal_install_script.png
new file mode 100644
index 0000000..15aeefd
Binary files /dev/null and b/assets/universal_install_script.png differ
diff --git a/css/common.css b/css/common.css
index b912405..4c5d015 100644
--- a/css/common.css
+++ b/css/common.css
@@ -1,149 +1,183 @@
@import url(https://fonts.googleapis.com/css?family=Yanone+Kaffeesatz);
@import url(https://fonts.googleapis.com/css?family=Droid+Serif:400,700,400italic);
@import url(https://fonts.googleapis.com/css?family=Ubuntu+Mono:400,700,400italic);
body { font-family: 'Droid Serif'; }
h1, h2, h3 {
font-family: 'Yanone Kaffeesatz';
font-weight: normal;
}
.remark-code, .remark-inline-code { font-family: 'Ubuntu Mono'; }
.remark-code-line .hljs-constant { color: #5BFF68 }
.remark-slide-content { font-size: 24px; }
table.stack {
border-collapse: collapse;
table-layout: fixed;
width: 100%;
margin: auto;
}
.stack tr td:first-child {
border: 1px black solid;
height: 3em;
width: 60%;
}
.stack .bluebg {
background: SkyBlue
}
table.quiz {
width: 100%;
margin: auto;
}
.quiz td {
border: 1px black solid;
padding-top: 0.4em;
padding-bottom: 0.4em;
}
.quiz .clicked.Y {
background: #CCFFCC;
}
.quiz .clicked.N {
background: #FFCCCC;
}
.two-columns table {
table-layout: fixed;
}
.two-columns td {
width: 50%;
}
.mnemonic {
border: 1px solid firebrick;
border-radius: 0.3em;
margin-bottom: 0.5em;
}
.mnemonic::before {
content: "Mnemonic:";
margin-left: 0.25em;
font-style: italic;
color: firebrick;
}
.mnemonic p {
margin: 0.5em;
}
.acronym {
border: 1px solid #007b37;
border-radius: 0.3em;
margin-bottom: 0.5em;
}
.acronym::before {
content: "Acronym:";
margin-left: 0.25em;
font-style: italic;
color: #007b37;
}
.acronym p {
margin: 0.5em;
}
+.advice {
+ border: 1px solid #00027b;
+ border-radius: 0.3em;
+ margin-bottom: 0.5em;
+}
+
+.advice::before {
+ content: "Advice:";
+ margin-left: 0.25em;
+ font-style: italic;
+ color: #00027b;
+}
+
+.advice p {
+ margin: 0.5em;
+}
+
+.note {
+ border: 1px solid #694d00;
+ border-radius: 0.3em;
+ margin-bottom: 0.5em;
+}
+
+.note::before {
+ content: "Note:";
+ margin-left: 0.25em;
+ font-style: italic;
+ color: #694d00;
+}
+
+.note p {
+ margin: 0.5em;
+}
+
.exercise {
border: 1px solid blue;
border-radius: 0.3em;
margin-bottom: 0.5em;
}
.exercise::before {
content: "Exercise:";
margin-left: 0.25em;
font-style: italic;
color: blue;
}
.exercise p {
margin: 0.5em;
}
.highlight {
color: red;
font-weight: bold;
}
.middle img {
vertical-align: middle;
}
.small {
font-size: smaller;
}
.minusmargin {
margin-left: -10%;
margin-right: -10%;
}
div.blinking {
-webkit-animation: 1s blink step-end infinite;
-moz-animation: 1s blink step-end infinite;
-ms-animation: 1s blink step-end infinite;
-o-animation: 1s blink step-end infinite;
animation: 1s blink step-end infinite;
display: inline-block;
}
@-webkit-keyframes blink {
0% { opacity: 1.0; }
50% { opacity: 0.0; }
100% { opacity: 1.0; }
}
@keyframes blink {
0% { opacity: 1.0; }
50% { opacity: 0.0; }
100% { opacity: 1.0; }
}
\ No newline at end of file
diff --git a/linux_owners.html b/linux_owners.html
new file mode 100644
index 0000000..317e8c2
--- /dev/null
+++ b/linux_owners.html
@@ -0,0 +1,1175 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <title>Linux for Owners</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+ <link rel="stylesheet" type="text/css" href="css/common.css">
+ </head>
+ <body>
+<textarea id="source">
+
+class: center, middle
+
+# Linux for Owners
+
+`https://goo.gl/auQmRB`
+
+---
+
+# Agenda
+
+1. Owning a Linux system
+2. Course expectations
+3. Linux landscape
+4. Accessing `root`
+5. Linux filesystem structure
+6. Mounting filesystems
+7. Working with the package manager
+
+
+---
+
+# Owning a Linux system
+
+## What do we mean by that?
+
+--
+
+.highlight[Administrative privileges] vs a normal account only.
+
+--
+
+ Symptoms:
+
+* access to the `root` user, or
+* access to `sudo` (or `su`) commands
+* having installed the system yourself (optional)
+* physical access to the machine (optional)
+
+--
+
+Having admin access usually means you are responsible for
+.highlight[maintenance and configuration] of the system.
+
+For that, you need a deeper knowledge of how it works.
+
+---
+
+# Typical ownership scenarios
+
+--
+
+* Linux installed as main OS on a desktop or laptop machine
+
+ * Scenarios: work requirement, curiosity, alternative OS
+ * Typically means a graphical environment
+
+--
+
+* Linux used as a virtual machine guest
+
+ * Scenarios: experimentation, sandbox, development
+ * Safe way to try OSes and configurations
+
+--
+
+* Linux used as a server
+
+ * Can be bare-metal or virtualized
+ * Typically means a CLI environment (over SSH)
+
+--
+
+* Linux appliance / IoT
+
+* Android (which you usually don't own!)
+
+---
+
+# Typical responsibilities
+
+--
+
+* Installing new software as needed
+
+* Configuring software and access to hardware
+
+* Updating software & OS
+
+* Securing the system and installed software
+
+* Solving problems as they appear
+
+---
+
+# Course expectations
+
+This is a crash-course limited to one day.
+
+* You are expected to know the basics of working with Linux.
+ At a minimum, working with command line and editing files from it.
+
+* You were asked to prepare a VM with Linux, that way you can
+ safely try admin commands and reboot the OS without affecting
+ your main system.
+
+* Some commands can differ per Linux "flavour". The course sticks
+ to Ubuntu / Debian, and may need to be adapted to other
+ distributions.
+
+* The course is intended to be an introduction; to dig deeper
+ into topics you'll need to do your own research.
+
+---
+
+# Linux landscape: What's a distribution?
+
+"Linux" is the name of the OS kernel, and needs a lot of other software
+ to be a functional operating system.
+
+One can, in principle, assemble this collection of software themselves:
+ such an approach is called Linux From Scratch.
+
+--
+
+It's long, requires in-depth knowledge of the system and most importantly
+ leaves keeping the system up to date to the user.
+
+A better approach is to use a .highlight[distribution], which offers:
+
+* A curated collection of software tested to work together.
+* A .highlight[package manager] to automate software install tasks.
+* Pre-compiled software for faster installation.
+* Security updates and fixes for critical bugs.
+* Varying balance between stability and faster updates.
+* _Optional:_ paid support.
+
+---
+
+# Linux landscape: Popular distributions
+
+There are many families of distributions, sharing package managers
+ and maybe parts of the package collection.
+--
+
+* Debian (package manager: `apt` / .deb packages)
+ * Ubuntu
+ * Kubuntu, Lubuntu, ...
+ * Linux Mint
+ * Kali, Tails, Devuan
+--
+
+* RHEL (package manager: `yum` / .rpm packages)
+ * Fedora
+ * CentOS, Scientific Linux
+ * SUSE, OpenSUSE
+--
+
+* Arch Linux (package manager: `pacman`)
+ * Manjaro Linux
+* Gentoo (package manager: Portage / `emerge`)
+ * Chrome OS
+* Alpine Linux
+* ...
+
+---
+
+# Linux landscape: Rolling / Static / LTS
+
+Various Linux distributions take different approaches to software updates.
+
+Programs update at their own pace, called "upstream".
+
+--
+
+.highlight[Rolling distributions] try to keep up with upstream version
+ updates, with minimal changes to keep it compatible with
+ the rest of the software stack.
+
+--
+
+.highlight[Static distributions] lock down software versions at the time
+ of release, in order to provide more testing and stability.
+
+--
+
+However, critical bugfixes and security patches have to be ported back
+ "downstream" to those "frozen" versions.
+
+Some static distributions have .highlight[Long Term Support] releases that
+ guarantee longer availability of such patches.
+
+---
+
+# Assuming superpowers
+
+How do administrative powers work in Linux?
+
+Compared to regular users, the user with ID 0, or .highlight[`root`],
+ is treated as .highlight[superuser]: it has the ability
+ to bypass all usual access restrictions.
+
+--
+
+In some Linux distributions a password for `root` is set
+ at install time and can be used to log in directly.
+
+However, most of the time users with administrative privileges
+ will have access to use .highlight[`sudo` command].
+
+.mnemonic[
+`sudo` stands for ".highlight[su]peruser .highlight[do]", because it executes some
+ other command as superuser instead of current user.
+]
+
+---
+
+# Assuming superpowers: `sudo`
+
+.center[
+ ![XKCD on sudo](assets/sandwich.png)
+]
+
+_Image credit:_ [XKCD #149](https://xkcd.com/149/)
+
+---
+
+# Assuming superpowers: `sudo`
+
+`sudo [command]` executes the command as `root` instead of the current user:
+
+```
+owner@linux:~$ whoami
+owner
+owner@linux:~$ sudo whoami
+[sudo] password for owner:
+```
+
+--
+
+Normally, `sudo` asks for authentication: it requires you to supply
+ .highlight[your own] password (not the `root` password!).
+
+```
+owner@linux:~$ sudo whoami
+[sudo] password for owner: <type in owner's password>
+root
+owner@linux:~$
+```
+
+---
+
+# Assuming superpowers: `sudo`
+
+`sudo` remembers that you have authenticated,
+ and subsequent commands do not require password for 15 minutes:
+
+```
+owner@linux:~$ sudo whoami
+root
+owner@linux:~$
+```
+
+--
+
+If you need to do a lot of stuff as root, you can use `sudo -i`
+to start a login shell as `root`:
+
+```
+owner@linux:~$ sudo -i
+root@linux:~# whoami
+root
+root@linux:~#
+```
+
+.mnemonic[
+`-i` is short for .highlight[interactive]
+]
+
+_Reference:_ `man sudo_root`
+
+---
+
+# To root or not to root
+
+Forgetting `sudo` before a command that requires it
+ can be jarring. Therefore, there is great temptation
+ to use a `root` shell when mostly admin tasks are involved.
+
+--
+
+Problem is, there are no "handrails" on what the `root` user can do.
+ It's far too easy to shoot oneself in the foot.
+
+An error in a program run under `root` can break critical parts
+ of the system, which won't happen under a regular user.
+
+--
+
+From a security perspective, running complex, or untrusted,
+ programs under `root` opens you up for malicious actions as well.
+
+---
+
+# To root or not to root: a horror story
+
+Running this command as a `root` is a classic mean prank:
+
+```
+root@linux:~# rm -rf /
+rm: it is dangerous to operate recursively on '/'
+rm: use --no-preserve-root to override this failsafe
+```
+
+Fortunately, as written it doesn't work, there's a failsafe.
+
+--
+
+However, consider this line:
+
+```
+(DO NOT RUN THIS)
+root@linux:~# rm -rf $FOLDER/*
+```
+
+This is supposed to delete everything in folder `$FOLDER`.
+
+But in case that variable is unset, it will happily destroy everything on the system &mdash; if run as `root`.
+
+---
+
+# To root or not to root
+
+In addition, if files are created while running as `root`
+ it usually leads to them being inaccessible by normal users.
+
+This can lead to errors when running the same commands later
+ as a normal user.
+
+--
+
+Most workflows are a mixture of commands that require superuser and those that don't.
+
+It's good practice to be aware of it and run only those parts that need it with `sudo`.
+
+--
+
+It's not a hard rule. Running a set of commands as `root` has its place,
+ but one needs to be careful and mindful of the above nuances.
+
+---
+
+# root and SSH
+
+By default, even if you set a password for the `root` user,
+ you won't be able to connect via SSH with this password.
+
+This is done to discourage brute-forcing the `root` password.
+
+--
+
+This encourages people to connect as their user and elevate
+ with `sudo` if necessary. This creates more meaningful logs.
+
+
+Also, if your SSH key is compromised but your user password is not,
+ the attacker won't be able to elevate to `root` even if
+ they can connect.
+
+--
+
+It's still possible to connect directly as `root` by weakening
+ the security (bad idea) or adding an SSH key to the `root`
+ account. However, previous warnings apply.
+
+---
+
+# How is `sudo` configured?
+
+What enables certain users to use `sudo`?
+
+By default, members of a specific group
+ (e.g. `sudo`, `admin`, `wheel`)
+ are allowed all `root` privileges after verifying their password.
+
+--
+
+There's a `/etc/sudoers` file describing the system policy.
+
+It can be fine-tuned to allow some users access only to
+ specific commands, or dropping the password requirement.
+
+.advice[
+ When editing `sudoers` file, always use the `visudo` script.
+ It sanity-checks changes so that you don't lock yourself out.
+]
+
+_References:_ `man sudoers`,
+ [Understanding the sudoers file](https://medium.com/@viraj.khatavkar/understanding-the-sudoers-file-8d71961b28ac)
+
+---
+
+# Exercise: inspect the `sudoers` file
+
+.exercise[
+1. Try examining the contents of `/etc/sudoers` file:
+
+ ```
+ owner@linux:~$ less /etc/sudoers
+ ```
+
+2. Explain the problem
+
+3. Fix the problem (using `sudo`)
+]
+
+---
+
+# Bonus: violating the `sudoers` policy
+
+.center[ ![](assets/incident.png) ]
+
+_Image credit:_ [XKCD #838](https://xkcd.com/838/)
+
+---
+
+# Linux filesystem map: what goes where?
+
+Before we proceed, it's important to understand
+ common filesystem locations in Linux.
+
+It differs a little from distribution to distribution,
+ but generally systems adhere to the
+ .highlight[Filesystem Hierarcy Standard], or FHS (3.0 currently).
+
+Not every entry in the standard will be explained, but "points of interest"
+ will be shown.
+
+_References:_
+ [Wikipedia entry on FHS](https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard),
+ [FHS 3.0 specification](http://refspecs.linuxfoundation.org/FHS_3.0/fhs-3.0.html)
+
+---
+
+# Linux filesystem: a common tree
+
+Under UNIX conventions, there's only a single filesystem tree visible in the system.
+
+There can be multiple disks, or multiple partitions on those disks, each with its
+ own filesystem trees, but to be usable they are inserted in the common file tree
+ as subtrees:
+
+.center[ ![](assets/mount.svg) ]
+
+---
+
+# Linux filesystem: a common tree
+
+.center[ ![](assets/mount.svg) ]
+
+This process is called .highlight[mounting].
+You can examine currently mounted filesystems with the `mount` command:
+
+```
+owner@linux:~$ mount
+sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
+proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
+[...]
+```
+
+---
+
+# Linux filesystem: `/home` sweet home
+
+As a user, you're probably familiar with .highlight[`/home`].
+
+Home directories for each user are usually stored there:
+
+```
+owner@linux:~$ echo $HOME
+/home/owner
+owner@linux:~$ ls -l /home/
+total 6
+drwxr-xr-x 4 owner owner 4096 Jan 14 00:03 owner
+drwxr-xr-x 2 user user 4096 Jan 15 18:31 user
+```
+
+The `root` user is an exception:
+
+```
+owner@linux:~$ sudo -i
+root@linux:~# echo $HOME
+/root
+```
+
+This is done to help with troubleshooting, if `/home` is a separate filesystem
+ and something goes wrong with it.
+
+---
+
+# Linux filesystem: configuration, _et cetera_
+
+We have already saw .highlight[`/etc`] mentioned
+ when we looked at `sudoers` policy.
+
+In fact, by convention all .highlight[system-wide configuration] files
+ are stored there, often grouped into folders by topic/program.
+
+Most files are only writable by `root`, and some highly-sensitive
+ ones, like `/etc/sudoers`, are not readable by anyone else.
+
+.note[
+ User-specific configuration (and persistent state) is usually stored
+ in the user's home folder as hidden files/folders,
+ e.g. `/home/owner/.bashrc`
+
+```
+owner@linux:~$ ls -a ~
+. .. .bash_history .bash_logout .bashrc .cache .gnupg .local .ssh ...
+```
+]
+
+---
+
+# Linux filesystem: where software lives
+
+Executable (.highlight["binary"]) files for software installed system-wide is read-only
+ for regular users and is organized in (up to) 3 tiers of hierarchy of .highlight[`sbin`/`bin`] folders:
+
+* .highlight[`/`]`sbin`, .highlight[`/`]`bin` - essential system software
+
+--
+* .highlight[`/usr/`]`sbin`, .highlight[`/usr/`]`bin` - more software that's part of the OS
+
+--
+* .highlight[`/usr/local/`]`sbin`, .highlight[`/usr/local/`]`bin` - additional software
+
+--
+
+These locations can have `lib` and `include` folders
+ for library and header files, and `share` folders
+ for program data.
+
+--
+
+Finally, .highlight[`/opt`] provides a location for installing extra
+ software without interfering with `/usr`.
+
+--
+
+In practice, the difference between these locations is not very well
+ defined. Some distributions don't differentiate at all.
+
+---
+
+# Linux filesystem: not-quite-files
+
+Several locations on the filesystem contain virtual "files"
+ that can be read and/or written to, but represent something else.
+
+--
+
+* .highlight[`/dev`] contains .highlight[device] files that serve
+ as interfaces to hardware that the kernel sees and has drivers for;
+
+--
+
+* .highlight[`/proc`] contains information and interfaces to control
+ running .highlight[processes] and some kernel systems;
+
+--
+
+* .highlight[`/sys`] contains kernel and .highlight[system] information
+ and interfaces to control it. It's a newer method than `/proc`.
+
+Those locations are, again, usually read-only (or not accessible)
+ to regular users.
+
+---
+
+# Linux filesystem: variable and temporary
+
+Besides fixed program data, the filesystem has locations for
+ .highlight[variable] data, like temporary files and persistent state.
+
+--
+
+* .highlight[`/var`] represents variable data. A couple notable folders:
+ * .highlight[`/var/log`] for system logs
+ * .highlight[`/var/lib`] for data modified by programs, e.g. databases
+
+
+--
+
+* .highlight[`/run`] contains state information since startup.
+* .highlight[`/tmp`] is for temporary data, and is user-writable.
+
+Both `/run` and `/tmp` locations are emptied on boot, and in fact usually exist only in memory.
+
+--
+
+* .highlight[`/var/tmp`] is also for temporary data, but it survives reboot.
+
+---
+
+# Linux filesystem: other storage
+
+When extra storage is connected to the system, there are conventional
+ places to add it to the filesystem.
+
+--
+
+* .highlight[`/media`] is populated with filesystems from removable storage
+ added to the system: USB drives, CD disks, etc.
+
+ Often, such devices are added to `/media` automatically.
+
+--
+
+* .highlight[`/mnt`] is the traditional place to mount additional filesystems
+ temporarily.
+
+---
+
+# Linux filesystem: where everything starts
+
+Last but not least, .highlight[`/boot`] contains essential files to initialize Linux
+ when the computer starts up.
+
+Typical contents:
+
+* `/boot/grub/` contains .highlight[bootloader] components
+* `/boot/vmlinuz*` files are compressed Linux kernels
+* `/boot/initrd*` files are initial filesystems that are used until "real" root becomes available
+
+--
+
+.note[
+ On some OS configurations, `/boot` is a small separate filesystem. Since it usually contains
+ several versions of the kernel as a backup, in worst case it can run out of space.
+
+ In that case, you'll need to clean up older kernels before installing new versions.
+]
+
+---
+
+# Linux filesystem: parts, assemble!
+
+As mentioned, the .highlight[`mount`] command can be used to list currently-mounted filesystems.
+
+--
+
+To mount a filesystem, .highlight[`mount [WHAT] [WHERE]`] format is used.
+
+Here, `[WHAT]` identifies where the filesystem can be accessed (e.g. a physical drive partition),
+ and `[WHERE]` identifies the directory where its contents should be mapped.
+
+--
+
+To unmount a filesystem, .highlight[`umount [WHAT]`] (or `umount [WHERE]`) command can be used.
+Typically, only `root` can mount or unmount.
+
+--
+
+For permanent mount rules, e.g. what gets mounted on boot, see the .highlight[`/etc/fstab`] file.
+
+_References:_ `man mount`, `man umount`, `man fstab`
+
+---
+
+# Exercise: adding a filesystem
+
+Let's see `mount` and `fstab` in action. We'll create a file that holds a small
+ filesystem, mount it, and then set it up to mount automatically at boot.
+
+Let's create a 100MB file and an ext4 filesystem on it:
+
+```
+owner@linux:~$ truncate -s 100m loop_file
+owner@linux:~$ mkfs.ext4 loop_file
+```
+
+Then, let's create a mount point (where the filesystem will be mapped):
+
+```
+owner@linux:~$ sudo mkdir /mnt/tiny
+owner@linux:~$ ls -la /mnt/tiny/
+total 8
+drwxr-xr-x 2 root root 4096 Jan 16 09:50 .
+drwxr-xr-x 3 root root 4096 Jan 16 09:50 ..
+```
+
+---
+
+# Exercise: mounting a filesystem
+
+Let's mount our tiny filesystem.
+
+```
+owner@linux:~$ sudo mount /home/owner/loop_file /mnt/tiny
+owner@linux:~$ mount | grep tiny
+/home/owner/loop_file on /mnt/tiny type ext4 (rw,relatime,data=ordered)
+```
+
+As a regular user, we can't write to it:
+```
+owner@linux:~$ touch /mnt/tiny/test
+touch: cannot touch '/mnt/tiny/test': Permission denied
+```
+
+Let's make it writable:
+```
+owner@linux:~$ sudo chmod a+w /mnt/tiny/
+owner@linux:~$ touch /mnt/tiny/test
+owner@linux:~$ ls -la /mnt/tiny/
+total 17
+drwxrwxrwx 3 root root 1024 Jan 16 10:56 ./
+drwxr-xr-x 3 root root 4096 Jan 16 09:50 ../
+drwx------ 2 root root 12288 Jan 16 09:49 lost+found/
+-rw-r--r-- 1 owner owner 0 Jan 16 10:56 test
+```
+
+---
+
+# Exercise: unmounting a filesystem
+
+```
+owner@linux:~$ ls -la /mnt/tiny/
+total 17
+drwxrwxrwx 3 root root 1024 Jan 16 10:56 ./
+drwxr-xr-x 3 root root 4096 Jan 16 09:50 ../
+drwx------ 2 root root 12288 Jan 16 09:49 lost+found/
+-rw-r--r-- 1 owner owner 0 Jan 16 10:56 test
+```
+
+Let's unmount the filesystem and examine the situation again:
+
+```
+owner@linux:~$ sudo umount /mnt/tiny/
+owner@linux:~$ ls -la /mnt/tiny/
+total 8
+drwxr-xr-x 2 root root 4096 Jan 16 09:50 .
+drwxr-xr-x 3 root root 4096 Jan 16 09:50 ..
+```
+
+Our file is not there.
+
+Note that the mount point is not writable by all,
+ as our `chmod` command affected the tiny filesystem's root folder
+ and not the mount point.
+
+---
+
+# Exercise: add to `fstab`
+
+Let's add our mount to `fstab`.
+
+.advice[
+ You can edit configuration files with `sudo nano <FILENAME>` (or other editor),
+ but it's better to use `sudoedit <FILENAME>`.
+
+ See [sudoedit: why use it over sudo vi?](https://superuser.com/questions/785187/sudoedit-why-use-it-over-sudo-vi) for an explanation.
+]
+
+```
+owner@linux:~$ sudoedit /etc/fstab
+```
+
+It opens a file with already one or more records present.
+We need to add one.
+
+---
+
+# Exercise: `fstab` format
+
+An `fstab` record contains whitespace-separated fields:
+
+* [file system] - where to find the filesystem
+* [mount point] - where to map it in the system
+* [type] - what type of filesystem it is (`-t` flag)
+* [options] - various settings you can tweak (`-o` flag)
+* [dump] - 0/1, setting for a very old backup solution
+ **In practice, always 0**
+* [pass] - order to check the filesystem for errors on boot
+
+Let's add our filesystem, at the end of the file:
+
+```
+/home/owner/loop_file /mnt/tiny ext4 defaults 0 2
+```
+
+Take care not to modify other entries. Save and exit.
+
+---
+
+# Exercise: filesystem in `fstab`
+
+Now that our example is in `fstab`, we can mount it easier:
+
+```
+owner@linux:~$ sudo mount /mnt/tiny/
+owner@linux:~$ ls /mnt/tiny
+lost+found test
+```
+
+You can mount all filesystems in `fstab` at once with `mount -a`.
+
+Further, our example should now be accessible after a reboot.
+To prevent automatic mounting at boot time, use `noauto` option.
+
+.note[
+ To be able to mount a filesystem, corresponding drivers/utilities need
+ to be installed. If you fail to mount something, like a network drive,
+ check installed packages.
+]
+
+---
+
+# Working with the package manager
+
+To simplify software installation, updates and removal,
+ distributions provide a .highlight[package manager]
+ and a collection of "official" packages.
+
+Command examples for `apt`, Debian/Ubuntu package manager,
+ will be shown, but principles apply to other managers.
+
+---
+
+# Packages: software sources
+
+To install software, `apt` needs up-to-date information
+ about packages that are available.
+
+.highlight[`/etc/apt/sources.list`] contains the information
+ on .highlight[repositories] to get information from for system packages.
+
+--
+
+A command needs to be run to update a local catalog
+ of package information:
+
+```
+owner@linux:~ $ sudo apt update
+[...]
+Get:8 http://ch.archive.ubuntu.com/ubuntu bionic-security/universe amd64 Packages [112 kB]
+Fetched 1798 kB in 1s (1768 kB/s)
+Reading package lists... Done
+Building dependency tree
+Reading state information... Done
+12 packages can be upgraded. Run 'apt list --upgradable' to see them.
+```
+
+---
+
+# Packages: upgrading installed packages
+
+Use .highlight[`apt upgrade`] command to install updates `apt` is aware of.
+
+--
+
+```
+owner@linux:~$ apt upgrade
+Reading package lists... Done
+Building dependency tree
+Reading state information... Done
+Calculating upgrade... Done
+The following packages will be upgraded:
+ gjs gnome-software gnome-software-common gnome-software-plugin-snap gvfs
+ gvfs-backends gvfs-bin gvfs-common gvfs-daemons gvfs-fuse gvfs-libs libgjs0g
+ libsmbclient libwbclient0 linux-firmware samba-libs ubuntu-software
+17 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
+Need to get 71.6 MB/74.6 MB of archives.
+After this operation, 3'258 kB of additional disk space will be used.
+Do you want to continue? [Y/n]
+```
+
+After confirmation, `apt` will download and apply updates.
+
+--
+
+.note[
+ Sometimes, an upgrade needs to remove some (replaced) packages.
+ In that case, `apt dist-upgrade` is used.
+]
+
+---
+
+# Packages: to upgrade or not to upgrade?
+
+Static distributions like Ubuntu only update packages
+ when serious bugfixes or security fixes are needed,
+ with little to no functionality changes.
+
+As such, it's usually safe to upgrade OS-provided packages.
+
+--
+
+If you're using a rolling distribution, or a third-party
+ repository, they can introduce breaking changes.
+Be prepared and read available changelogs to determine when to upgrade.
+
+--
+
+If you need to stop a particular package from upgrading,
+ you can put it on .highlight[hold]:
+
+```
+owner@linux:~$ sudo apt-mark hold bash
+bash set on hold.
+owner@linux:~$ sudo apt-mark unhold bash
+Canceled hold on bash.
+```
+
+---
+
+# Packages: when to upgrade?
+
+For most updates, upgrades will not disrupt normal workflow
+ and can be applied at any time.
+
+Note that upgrading running services (e.g. a web server)
+ requires them to restart, briefly becoming unavailable.
+ You may need to plan your maintenance in advance.
+
+--
+
+Some upgrades (mostly kernel updates) can't be applied without
+ a reboot. The system will nag you about it, but you won't
+ be forced to reboot.
+
+--
+
+General advice for any software updates: be prepared
+ to spend some time dealing with unexpected problems.
+
+---
+
+# Packages: Finding system packages
+
+If you're missing some software and it's available
+ in OS repositories, it's very easy to install.
+
+The shell can even .highlight[suggest the package] you're missing:
+
+```
+owner@linux:~$ fortune
+
+Command 'fortune' not found, but can be installed with:
+
+sudo apt install fortune-mod
+```
+
+Otherwise, you can .highlight[search known packages] by package name or description
+ with .highlight[`apt search`]:
+
+```
+owner@linux:~$ apt search cow
+[..long list..]
+owner@linux:~$ apt search --names-only cow
+[..shorter list..]
+```
+
+---
+
+# Packages: Installing system packages
+
+Once you know the name of the package(s), you can install them with
+ .highlight[`apt install`]:
+
+```
+owner@linux:~$ sudo apt install fortune-mod cowsay
+Reading package lists... Done
+Building dependency tree
+Reading state information... Done
+The following additional packages will be installed:
+ fortunes-min librecode0
+Suggested packages:
+ filters cowsay-off fortunes
+The following NEW packages will be installed:
+ cowsay fortune-mod fortunes-min librecode0
+0 upgraded, 4 newly installed, 0 to remove and 0 not upgraded.
+Need to get 638 kB of archives.
+After this operation, 2'220 kB of additional disk space will be used.
+Do you want to continue? [Y/n]
+```
+
+After confirmation, `apt` will download and install them.
+
+---
+
+# Bonus: just what did we just install?!
+
+Let's test the software we just installed.
+
+```
+owner@linux:~$ fortune | cowsay
+
+ _____________________________________
+/ Truth is the most valuable thing we \
+| have -- so let us economize it. |
+| |
+\ -- Mark Twain /
+ -------------------------------------
+ \ ^__^
+ \ (oo)\_______
+ (__)\ )\/\
+ ||----w |
+ || ||
+```
+
+.exercise[
+ This could look better: we're missing some pretty colors.
+
+ Find the package that provides the `lolcat` application,
+ install it and pipe the output through it.
+]
+
+---
+
+# Packages: dependency resolution
+
+Let's look at that `apt install` output again.
+
+```
+The following additional packages will be installed:
+ fortunes-min librecode0
+Suggested packages:
+ filters cowsay-off fortunes
+The following NEW packages will be installed:
+ cowsay fortune-mod fortunes-min librecode0
+0 upgraded, 4 newly installed, 0 to remove and 0 not upgraded.
+```
+
+Often, packages require other packages (e.g. libraries, data files)
+ to be installed to function. The package manager's job is to find
+ and install everything that's needed.
+
+.note[
+ Rarely, a package is incompatible with already installed ones.
+ You will then be offered to remove packages to resolve this.
+ In that case, proceed with caution.
+]
+
+---
+
+# Packages: getting rid of them
+
+If you no longer need a package, you can use .highlight[`apt remove`]:
+
+```
+owner@linux:~$ sudo apt remove fortune-mod
+Reading package lists... Done
+Building dependency tree
+Reading state information... Done
+The following packages were automatically installed and are no longer required
+ fortunes-min librecode0
+Use 'sudo apt autoremove' to remove them.
+The following packages will be REMOVED:
+ fortune-mod
+0 upgraded, 0 newly installed, 1 to remove and 12 not upgraded.
+After this operation, 110 kB disk space will be freed.
+Do you want to continue? [Y/n]
+```
+
+After confirmation, the program will be removed,
+ but its configuration files will remain in case you reinstall.
+
+--
+
+If you want to completely clean up the package, use .highlight[`apt purge`]:
+
+```
+owner@linux:~$ sudo apt purge fortune-mod
+```
+
+---
+
+# Packages: orphaned dependencies
+
+Take note of these lines in `apt remove` output:
+
+```
+The following packages were automatically installed and are no longer required
+ fortunes-min librecode0
+```
+
+`apt` is informing you that `fortunes-min` and `librecode0` were installed
+ as dependencies, but .highlight[nothing requires them anymore].
+
+Therefore, it's highly likely that they can be removed without affecting anything.
+ However, `apt` does not do that automatically.
+
+To allow `apt` to do that, use .highlight[`apt autoremove`]:
+
+```
+owner@linux:~$ sudo apt autoremove
+[...]
+```
+
+---
+
+# Bonus: Universal Install Script
+
+.center[
+ ![:scale 50%](assets/universal_install_script.png)
+]
+
+_Image credit:_ [XKCD #1654](https://xkcd.com/1654/)
+
+---
+
+class: middle, center
+
+# The Great TODO Gap
+
+\*crickets\*
+
+<!-- ############################################################################################ -->
+
+---
+
+# Where to get help?
+
+If you know the command, or the config file that you're trying to use, .highlight[`man`] is your friend.
+
+--
+
+Also, Google is your friend! There's no shame in learning what you don't know yet or looking up
+ what you don't remember.
+
+--
+
+Some notable sites that are very helpful:
+
+* StackExchange network: https://stackoverflow.com/, https://superuser.com/, https://askubuntu.com/, https://unix.stackexchange.com/, https://serverfault.com/
+* DigitalOcean tutorials: https://www.digitalocean.com/community/tutorials/
+* nixCraft tutorials: https://www.cyberciti.biz/
+
+--
+
+When searching for solutions, specifying your OS version is helpful.
+ Old advice sometimes does not apply to newer systems!
+
+---
+
+class: center
+
+# That's it!
+
+## Go forth and administrate!
+
+--
+
+..try not to break stuff, though.
+
+![](assets/server_problem.png)
+Image credit: [XKCD #1084](https://xkcd.com/1084/)
+
+</textarea>
+ <script src="js/vendor/remark.min.js"></script>
+ <script src="js/vendor/jquery-3.2.1.min.js"></script>
+ <script src="js/terminal.language.js"></script>
+ <script src="js/common.js"></script>
+ </body>
+</html>
\ No newline at end of file

Event Timeline