Göm menyn

TDDI41 Grundläggande systemadministration

Grunderna i UNIX och Linux

Väldigt mycket av världens serverdrift och datoradministration sköts i Linux- och UNIX-system. Linux är rent formellt inte en UNIX, fast ur alla praktiska vinklar är Linux en UNIX. Den här labben går igenom
  • Grunderna om kommandoraden
  • Filer och sökvägar
  • Miljövariabler

Första delen (Kort om kommandoraden) är en grundläggande introduktion för de vilka knappt använt UNIX innan. Andra delen (För systemadministratörer) är tyngre, och kommer troligen introducera fler nya koncept.

Kort om kommandoraden

Nedan följer en snabbgenomgång av vanliga kommand och idéer från kommandoraden. Om man är bekväm med dem sen innan finns det inte mycket nytt.
Är allting trasigt?
  • ^C (CTRL och C) dödar nuvarande process. Flera klick i snabb följd kan behövas.
  • ^Z "Placerar" nuvarande program i bakgrunden. Kan stoppa program när ^C inte vill fungera
  • kommandot reset lagar terminalen när den fått udda inställningar
Som ett alternativ till en "vanlig" grafisk miljö För dagligt bruk är det inget fel på "vanliga" grafiska program. Terminalen har dock fördelarna:
  • mycket enklare att berätta hur man gör någonting
  • finns tillgängligt på mycket mer (tänk webbservrar, kaffebryggare, ...)
  • Mycket större möjlighet att kjedja samman program, t.ex:
    shuf --random-source=/dev/urandom /usr/share/dict/words \ # Läs in en ordlista och slumpa ordningen på raderna
    	| head -n6 \ # Ta de sex första raderna
    	| tr '\n' '-' \ # Byt ut radbrotten mellan orden till bindessträck
    	| head -c-1 # Släng bort det sista tecknet, vilket är ett bindessträck vi inte vill ha
    		

Prompten

Ens prompt kan se ut på många sätt. Skapligt vanligt är dock någonting i stil med den nedan.
hugho26Användarnamn@thinlincVärdnamn [~/DocumentsSökväg] $

Ert användarnamn är vem ni är inloggad som. På den (fysiska) maskin ni sitter vid just nu är det troligen ert LiU-id eller namn. Värdnamnet är vad maskinen heter. LiU:s maskiner har i regel namn efter vart de är placerade. Sökvägen är vilken mapp som är er nuvarande arbetsmapp. Om ni skriver en fils namn utan att ge dess kompletta sökväg (så som /usr/bin/cowsay) så kommer den slås relativt den.

Absoluta grunderna

För att köra ett kommando, skriv dess namn i prompten och tryck enter. T.ex.
$ lsKommandot att köra -lFlagga

I exempel skrivs ens prompt ofta inte ut, eller kortas ner till bara ett dollartecken ($).
ls
Listar filer i nuvarande mapp
mkdir1
skapar en ny mapp (make directory)
cd
Byter nuvarande mapp (change directory)
pwd
Skriver ut nuvarande mapp (print working directory
cat
Skriver ut inehållet i en fil (och konkatenerar ihop flera filer)
less
Liknande cat, men scrollar inte saker av skärmen utan låter en skrolla fritt själv. Har vi-bindingar. Kan även ses som en simpel textredigerare utan redigeringsdelen. Är väldigt bra som mål för ett rör, se nedan.

Kommandoradsflaggor (i det här fallet -l är hur man i regel skickar med argument till processer. Jämför med argument till en funktion). Ett annat exempel är -r i scp -r (från QEMU-labben), där -r står för rekursivt.

Dokumentation

Att veta var man hittar dokumentation och hur man läser det är extremt viktigt.
programnamn --help
Hjälputskrift inbyggt i själva programmet. Varierar mycket i format och användbarhet, men brukar få fram de vanligaste flaggorna
man
Standardmanualen för unix. Kör t.ex. man ls för att se manualen för ls. Kommer troligen ha vim bindningar. Det finns 9 olika avsnitt av manualsidor, där t.ex. glob(7) indikerar avsnitt 7 i glob-manualen.
info
En del program kommer med en längre manualer. Ofta formaterade som info sidor. Info-sidor är någonstanns mellan en PDF och en webbsida. har i regel Emacs-bindningar. Som standard är i bundet till indexsökning. Använd det!
Läs man:s man-sida (man man) och svara på följande:
  • Vilka är de 9 avsnitten?
  • Vilket avsnitt dokumenterar kommandoradsverktyg så som cat eller ls?
Inlämning: kort svar på ovanstående punkter.

Rör (pipe)

En av de absolut starkaste funktionerna i skalet är möjligheten att kedja samman program genom "rör". Där man låter outputen från et program aggera inputen till nästa. Några vanliga kommandon att "pipea" till är bland annat less, som ger en scrollbar output, head och tail, vilken ger en början respektive slutet av texten, sort vilket sorterar ens rader, och många fler.
program_med_väldigt_mycket_output.sh | less # Exempel på inmatning till less
Kör journalctl, och med hjälp av tail visa bara de sista 5 raderna.

Output redirection

Output kan även skrivas till fil med högerpil (>). En enkler högerpil skriver över filen om den redan finns. Dubbel pil lägger till i slutet. Oavsätt skapas filen.
kommand > fil-som-skrivs-över
kommand >> fil-som-skrivs-till-slutet-av

Globbing och grepping

Ofta vill man söka efter någonting, men vet inte exakt vad. Två primära "språk" för det är globs (glob(7)) samt Regex (regex(7)).

Globs är väldigt simpla, och framförallt användbara för wildcards. T.ex. ls *.pdf visar alla filer i nuvarande mapp vars namn slutar på ".pdf". Globs är inbyggda i ens skal (bash).

Regex är istället ett ytterst kraftfullt språk för att söka i text. Från skalet används ofta grep för att hitta saker, samt sed för att ersätta text.

cat /etc/passwd | grep -E '(nologin|false)$' Hitta alla lokala vars loginskal är nologin eller false 2

En bra interaktiv miljö att leka runt i är Regex 101

Sökvägar

Alla filer i Unix världen är placerade någonstans i ens ända filträd (till skillnad från Windows som kan ha flera (C:\ D:\)). Trädets rot är /. Sökvägar till filer kan antingen anges absolut, där man utgår från roten, t.ex. /etc/passwd pekar alltid på samma fil. Bara passwd däremot refererar till filen "passwd" relativt den mappen där man frågade efter den (kör pwd för att se nuvarande mapp). Även relativa sökvägar kan ha flera delar, t.ex. Documents/uppsats.pdf refererar till den Documents-mappen som finns i nuvarande mapp.

Varje mapp har två speciella undermappar, vilka är '.' och '..' (enkle och dubbel punkt). '.' är nuvarande mapp, '..' är mappen ovanför en. Så passwd, ./passwd, och undermapp/../passwd refererar alla till samma fil.

Ibland skrivs en sökväg ut med ett snedstreck på slutet (/usr/lib/). Exakt innebörd beror per program, men som regel innebär det att man bara vill referera till en mapp och inte en "vanlig" fil (mappar är också filer).

Filrättigheter

Varje har en ägare och en grupp den tillhör. Utöver det har den rättighetsväxlar för läsning, skrivning, och exekevering för ägaren, gruppen samt allmänheten. ls -l skriver ut en fil med all den här inforamtionen.
$ ls -l /bin/bash
-rwxr-xr-x 1 root root 1113504 Jun  7  2019 /bin/bash
|\ /\ /\ / | \ _/ \ _/ \__ __/ \__________/ \_______/
| V  V  V     V    V      V         V        Filnamn
| |  |  |   Ägare  |      |    Senast ändrad
| |  |  |          | Filstorlek
| |  |  |     Grupptilhörighet
| |  |  +-- växlar för Övriga
| |  +-- växlar för Gruppen
| +-- växlar för Ägaren
+-- Filtyp

Notera att filrättigheterna i era hemkataloger på LiU:s system (SU-salssystemet) inte fungerar som förväntat. *Mummel* *mummel*, Windows.
  1. Hur byter man ägare på en fil?
  2. Hur gör man en fil körbar enbart för dess grupp? [markering tillagd 230918]
Inlämning: kort svar på ovanstående punkter.

Textredigerare

Vad man använder för att redigera råtext spelar i slutändan väldigt liten roll. Det finns dock tre man bör ha lite koll på. Vim och Emacs för att de är absolut störst och mängder av program har bindningar vilka efterliknar dem. Nano för att det nästan alltid finns, och är lättanvänt.

Nano

Kör som ett "grafiskt" programm i ens terminal. Ofta satt som default då den är ytterst lättanvänd. Se längst ner på skärmen hur man använder det.

Vim

Vim bygger på modbaserad redigering, vilket innebär att man antingen är i redigeringsläget, där man kan flytta runt text, klippa, klistra med mera. Eller så är man i inmatningsläget, där man kan skriva text. (finns även ibland andra lägen). Absoluta grunderna man behöver veta är:
  • i för att gå in i inmatningsläget
  • Esc för att återgå till redigeringsläget
  • I redigeringsläget: h, j, k och l för att flytta sig höger, ner, up respektive vänster.
  • I rl: :waq! För att spara spara alla ändringar och stänga vim
  • I rl: :qa! För att slänga alla ändringar och stänga vim.
Programmet vimtutor går igenom mer.

Emacs

  • C-p och C-n för att gå uppåt och neråt (previous respektive next).
  • C-x följt av C-c för att spara och stänga
Emacs learning by doing: C-h t

Processer

Kommer snart

Signaler & processer

  • ps aux
  • kill -signal pid
  • pkill program name

Jobbkontroll

Ens skal har rudimentära möjligheter för att köra flera program samtidigt.

Ett 'och-tecken', &, efter ett kommando kör det kommandot i bakgrunden.

Jobb i bakgrunden kan listas med jobs kommandot. Nuvarande jobb kan tillfällit stoppas med ^Z, efter vilket det kan köras vidare i för- eller bakgrunden med kommandona fg och bg respektive.

Övrigt smått och gått

Multiplexing

Om man tycker det är jobbigt att koppla flera fjärrsessioner till sin VM, eller sitter direkt i terminalen (utan möjlighet att öppna fler fönster), men ändå vill köra flera processer samtidigt är en terminalmultiplexer är bra lösning. En sån är Tmux. Tmux låter en skapa flera "fönster" och flikar i en och samma terminal.

Arkiv & komprimering

Att packa många filer i en arkiv-fil, samt att komprimera en fil ses ofta som samma operation, t.ex. med zip. Kutymen i UNIX-världen är istället att man är explicit med att det är två delar. Ofta hittar man .tar.gz filer. Vilket då ska läsas som att det är en .tar fil, man har gzippat (komprimerat med gzip).
  1. Hur packar man upp en .tar.gz fil?
  2. Hur packar man ner en mapp i en .tar.xz fil?
Inlämning: kort svar på ovanstående punkter.

Miljövariabler

Miljövaribaler är globala variabler vilka tillhör en process, och ärvs av ens barnprocesser. Hur man kommer åt dem beror på språk. För att läsa samt sätta i Bash (Varje variabelreferens i Bash påbörjas med ett dollar-tecken, miljövariabler och "vanliga" variabler finns fritt blandade):
echo $PATH
 
export PATH=new-value
respektive Python:
import os
os.getenv("PATH")

os.putenv("PATH", "new value")
Några spännande miljövaribaler är:
PATH
Kolonsepparerad lista över vart körbara program letas efter. Tidigare element i listan kollas först, så ens egna mappar bör läggas till i början.
LC_ALL
Vilket språk program ska vara på
På LiU's system (altså inte i VM:en):
  1. Lägg till /courses/TDDI41 i er PATH, pröva kör start_single.sh utan att ange sökväg.
  2. Gör ändringen permanent
  3. Sätt LC_ALL till sv_SE.utf-8 och öppna man(1). Vad händer?
Inlämning: kort beskrivning hur ni genomförde ovanstående punkter.

Filhierarki

  • /
    • binKörbara filer som behövs vid boot
    • bootSaker som behövs vid boot
    • devDevice-filer. Access till hårdvara
    • etcKonfigurationsfiler
    • homeAnvändares hemkataloger
    • libBibliotek att länka sin kod mot
    • tmpTemorära filer, tas oftast bort vid boot
    • usrMinikopia av roten, det mesta placeras här.
      • bin
      • include
      • lib
      • local
      • share
    • varVarierande data
      • libPrograms variabla data
      • logLogfiler
Mer info finns i hier(7).

För systemadministratörer

Exakt hur en dator bootar är krångligt, och dess helhet utelämnas ur den här kursen. Vi tar istället vid när Linux-kärnan startat. Ett operativsystems kärna är i sig ett program, inte allt för olikt vilket annat program som. Stora skillnaden är att operativsystemet har direkt tillgång till hårdvaran, vilket övriga program inte har utan måste gå genom operativsytemet.

Således kan kommandoradsparametrar ges, vilka i Linux (oftast) kan ses på ett körande system genom filen /proc/cmdline. Filen kan t.ex. innehålla

BOOT_IMAGE=/boot/vmlinuz-4.15.0-117-genericLinux root=UUID=166b2172-c55c-410d-9f7b-dbc1e4f99db2Tidigare rootfilsystemet roRead Only by default

BOOT_IMAGE's exakta funktion beror på bootloadern, men är i regel ens kärna. root är sedan vilken ens tidiga root-filsystem är (det som kommer monteras in som /). I det här fallet anges ett UUID, vilket unikt pekar ut en disk. ro markerar att filsystemet ska monteras för enbart läsning.

När kärnan väl kommit igång tar en användarymdsprocess över och agerar init. Om inget annat anges kommer /sbin/init användas, vilket på många system är en symlänk till /lib/systemd/systemd.

Om annan tillfälligt önskas kan en init= flagga skickas till kärnan.

Om man vill kan man läsa mera i Linux-kärnans dokumentation. Dock är den ytterst grötig och teknisk. The Linux/X86 Boot Protocol, 1.7. The Kernel Commmand Line och framåt (kernel.org)

systemd

Till vardags behöver man nästan aldrig tänka på allt det ovan. Istället har man fokus på sitt init-system, vilket håller reda på att sätta igång allting. De flesta Linuxsystem kör numera systemd.

Bra ställen att börja läsa är systemds startsida, samt systemd(1). Om man vill ha mer bakgrund finns en bloggartikelt av skaparen Pottering själv.

  1. Hur får man en lista över alla systemd-enheter (units)?
  2. Hur startar man om sin ssh-server?
Inlämning: kort svar på ovanstående punkter.

Andra initsystem

Utöver systemd finns ett antal andra system, där systemv är det klassiska. En lista finns på Wikipedia (Init).

Systemloggar

Loggar om vart som händer skrivs till ett antal olika ställen. Systemd tillhandahåller systemloggar genom programmet journalctl. Många andra program skriver vanliga textloggar till filer i mappen /var/log. Även andra ställen kan förekomma.
SSH:a in i er VM (om ni inte redan är in-ssh:ade). Leta rätt på sshd (ssh-serverns) logg, och visa den posten där det står att ni loggade in.

Övriga länkar

Varför skalet fungerar som det gör, och varför man pratar om terminal-emulatorer. The TTY demystified

Fotnötter

  1. Finns en hel grupp av mk* samt ls* kommand, vilka skapar respektive listar olika saker. Pröva t.ex. mkfifo eller lsblk. return
  2. passwd-filen är standarddatabasen för användare. Se passwd(5) för mer info. return

Sidansvarig: Anders Fröberg
Senast uppdaterad: 2023-12-11