TDDI41 Grundläggande systemadministration
Eventuell changelog finns längst ned på sidan
OBS! Som alltid, följ de allmänna instruktionerna kring inlämning, och kopiera in vad ni gjorde och utdata. Se exempel på sidan.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.- ^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
- 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
mkdir
1- 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örls
. 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!
man man
) och svara på följande:
- Vilka är de 9 avsnitten?
- Vilket avsnitt dokumenterar kommandoradsverktyg så som
cat
ellerls
?
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 annatless
, 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
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 +-- FiltypNotera att filrättigheterna i era hemkataloger på LiU:s system (SU-salssystemet) inte fungerar som förväntat. *Mummel* *mummel*, Windows.
- Hur byter man ägare på en fil?
- Hur gör man en fil körbar enbart för dess grupp? [markering tillagd 230918]
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.
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
Processer
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
).
- Hur packar man upp en
.tar.gz
fil? - Hur packar man ner en mapp i en
.tar.xz
fil?
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-valuerespektive 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å
- Testa
echo $USER
ochecho Hej $USER
- Lägg till
/courses/TDDI41
i erPATH
, pröva körstart_single.sh
utan att ange sökväg. OBS! Använd variabeln $PATH (inte det den råkar innehålla för ögonblicket). - Gör ändringen permanent
- Sätt LC_ALL till
sv_SE.utf-8
och öppna man(1). Vad händer?
Filhierarki
/
bin
Körbara filer som behövs vid bootboot
Saker som behövs vid bootdev
Device-filer. Access till hårdvaraetc
Konfigurationsfilerhome
Användares hemkatalogerlib
Bibliotek att länka sin kod mottmp
Temorära filer, tas oftast bort vid bootusr
Minikopia av roten, det mesta placeras här.bin
include
lib
local
share
var
Varierande datalib
Programs variabla datalog
Logfiler
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 operativsystemet.
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
.
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.
- Hur får man en lista över alla systemd-enheter (units)?
- Hur startar man om sin ssh-server (starta systemtjänsten)?
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 programmetjournalctl
. Många andra program skriver vanliga textloggar till filer i mappen /var/log
. Även andra ställen kan förekomma.
sshd
(ssh-serverns) logg, och visa
den posten där det står att ni loggade in.
Autentisering med SSH-nycklar
När ni loggar in i ert system per SSH behöver ni ange användarnamn och lösenord. I detta avsnitt skapar vi nycklar för autentisering. Denna metod är inte sårbar mot bruteforceattacker på det sätt lösenord är, och är smidigt i många sammanhang. Till senare labbar kommer vi att vilja röra oss smidigt mellan maskiner utan att behöva ange detta hela tiden. Vi vill också kunna köra tester utan att behöva ange namn/lösen eller hårdkoda det. Att ni låter en nyckel logga in som er betyder såklart att ni behöver hålla den säker (och välja någon bra kryptografisk lösning). I denna del av labben kommer ni att generera nycklar som ni sparar (lösenordsskyddade) i er hemkatalog, som ni kommer åt genom vanlig inloggning. Ni kommer inte att försöka tillåta inloggning till ert LiU-konto, utan bara till era labb-VM:ar i kursen.3
En notering: här sparar vi nycklarna på disk och litar i någon mening på att filerna är säkra där och ingen avlyssnar era lösenord när de slås in. Ni kan också komma att se autentiserings- och signeringslösningar som involverar hårdvarutokens, där man lyfter ut denna bit till en helt separat (liten) dator. Ett par exempel är Yubikey och Tillitis. Det bör sägas att dessa lösningar rör mycket mer än bara vårt enkla SSH-nyckel-exempel.
Det finns mycket skrivet om detta. En koncis källa till information är Arch Wikis SSH-keys-sida. Skumläs åtminstone avsnitt 1, 2 (inledningen), 2.1.3 (ed25519), 3 (om kopiering), inledningen till 4 samt 4.1 (ssh-agent).
- På LiU-system (alltså inte inuti VM): skapa en ed25519-nyckel
som ni ger ett namn i stil
med
~/.ssh/id-sysadminkurs-ed25519
. Ge den ett bra och unikt lösenord. Nyckeln bör bara användas till den här kursen, och för att ansluta till era VM:ar. - Ange vilken fil som innehåller den publika delen av nyckeln.
- Se till att man kan använda den för att logga in som root inuti VM:en. Visa upp relevant authorized_keys-fil
- Starta en ssh-agent och ladda in nyckeln. Ni kan skapa ett skript med detta för enkelhets skull.
- Visa vilka ssh-nycklar som är inladdade genom
ssh-add -L
. - ssh:a in utan att ange lösenord för att visa att det fungerar
Inlämning: visa hur du gjorde detta. Kopiera och klistra in från terminalen/terminalerna.
Changelog innevarande termin
- 241111: Lade till understrykande av att de allmänna instruktionerna ska följas.
Sidansvarig: Anders Fröberg
Senast uppdaterad: 2024-12-12