Vegova Delavnice 2022 - Linux

Virtualka

Da si skrajšamo čas priprave je na voljo Ubuntu Server 20.04 VM slika, ki jo bomo uvozili v VirtualBox.

1. Odpri VirtualBox in pritisni na gumb Import
1. import appliance
2. Pritisni na gumb za izbiro datoteke
2. open file selector
3. Izberi prenešeno datoteko
3. select file
4. Pritisni Next
4. press next
5. Pusti privzete nastavitve in pritisni Import
5. import image
6. Počakaj da se VM slika uvozi
6. wait for import
7. Zaženi VM s pritiskom na gumb Start
7. start vm
8. Počakaj dokler ne prideš do prijavnega zaslona
8. wait till login screen

Informacije o VM

Ukazna lupina

Ukazna lupina oz. shell je program, ki uporabniku omogoča osnovno delo, ki je lahko interaktivno ali neinteraktivno.

Poznamo 2 vrsti lupin:

Bash
bash
Fish
fish
CMD
cmd
Powershell
powershell
Explorer
explorer
GNOME
gnome

Ukazna vrstica

V ukazno vrstico vnašamo ukaze, ki se nato izvedejo.

Ukazna vrstica se začne s pozivnikom (prompt) student@stroj:~>, kjer student predstavlja ime uporabnika (ki je odprl lupino), stroj predstavlja ime naprave, ~ pa predstavlja pot, kjer se trenutno nahajamo (~ je okrajšava za /home/<ime-uporabnika>).

Pogosto za prikaz vnašanja ukaza v ukazno vrstico pred ukazom vidimo kar skrajšan prompt in sicer simbol > ali $. Enako bo v tem dokumentu. Se pravi, če vidimo ukaz ki se začne s simbolom >, pomeni, da ga vnesemo v ukazno vrstico, simbol # predstavlja komentar, besedilo brez simbola pa predstavlja odgovor, ki ga vrne ukaz. Ko ukaz vnesemo v ukazno vrstico, simbola > ne napišemo, ta je tukaj le za ilustracijo primera.

Ukazne vrstice lahko avtomatično dopolnjujemo s pomočjo pritiskom tipke Tab.

Ukazna lupina shranjuje zgodovino izvedenih ukaznih vrstic:

Ostale pomembne tipke:

Primer dopolnjevanja besedila vrstice
GNOME Terminal - ukazna vrstica

Ukaz: echo (dokumentacija)

Z ukazom echo izpišemo podane parametre na zaslon. Z stikali lahko spremenimo stil izpisa.

# Primer izpisa besedila
> echo "Besedilo"

# Primer izpisa brez končnega prehoda v novo vrstico
> echo -n "Brez nove vrstice"

Ukaz: man

Eden izmed bolj uporabnih programov, ki pride privzeto na vseh Linux distribucijah je man, kar je okrajšava za manual oz. navodila. Le-ta lahko prikaže navodila (skoraj) vsakega programa, ki je nameščen na sistemu, pa tudi navodila za uporabo C knjižnic in drugih funkcij, ki jih Linux ponuja.

Za začetek lahko pogledamo navodila za uporabo kar man programa samega, in sicer z ukazom man man.

Poglavja:

Primeri ukazov:

# Izpis doumentacije za ukaz printf
> man printf

# Izpis določenega poglavja dokumentacije
> man 2 intro

# Izpis vseh dokumentacij, ki so na voljo za ukaz
> man -a intro

# Iskanje ključne besede po vseh dokumentacijah
> man -k cd

# Izpis lokacije, kjer se nahaja dokumentacija
> man -w ls

# Prikaz dokumentacije s tem, da pri imenu upošteva velikost črk
> man -I printf

man man

Za izhod iz programa pritisnemo na tipko q (piše tudi levo spodaj).

Če ne vemo točno kateri program želimo, lahko uporabimo argument za iskanje: -k (npr. man -k git)

Dodatna dokumentacija:

Drevesna struktura datotek

Iz Windowsa smo navajeni poti kot je C:\Users\Uporabik\Documents, pri Linuxu je stvar podobna (npr. /home/uporabnik/Documents v tem primeru).

Drevesna struktura datotek

Ker se želimo bolje naučiti uporabljati Linux, si bomo o Linux drevesni strukturi prebrali kar iz prej omenjenega man in sicer z ukazom man hier. Najpomembnejši direktoriji so /, /bin, /boot, /dev, /etc, /home, /lib, /media, /proc in /root:

Pot Opis
/ Korenski direktorij
/bin Izvršljivi programi
/boot Datoteke za bootloader
/dev Poti za priklopljene naprave (diski, kamere, …)
/etc Konfiguracijske datoteke
/home Uporabniške datoteke
/lib Sistemske knjižnice
/media USB ključki in druge zunanje naprave
/proc Informacije o sistemu
/root Datoteke uporabnika root

Ukaz: pwd

pwd (print working directory) je program, za izpis poti trenutnega direktorija. Večina lupin podpira uporabo spremenljivke $PWD, ki vrne isto pot, a brez izvajanja zunanjega programa.

# Primer: Poženemo ukaz pwd
student@stroj:~/delavnice2022$ pwd
/home/student/delavnice2022

# Primer: Izpišemo vsebino okoljske spremenljivke PWD
student@stroj:~/delavnice2022$ echo $PWD
/home/student/delavnice2022

Ukaz: ls (dokumentacija)

ls (list directory contents) je program za izpis datotek v trenutnem ali želenem direktoriju. Če ga zaženemo brez argumentov bo izpisal vsebino trenutnega direktorija, če pa mu na konec dodamo še ime nekega direktorija, pa bo izpisal vsebino le-tega. Ker pogosto o izpisanih datotekah želimo vedeti več kot le ime, ls ponuja veliko koristnih argumentov.

Primer le nekaterih:

# Izpis vsebine mape v kateri se trenutno nahajamo
> ls

# Izpis vseh datotek z dodatnimi informacijimi napisanimi na lepši način
> ls -lah

# Izpis druge mape
> ls /etc

Ukaz: cd (dokumentacija, primeri uporabe)

cd (change directory) se uporablja za premik med mapami, tako kot se v grafičnem vmesniku premaknemo v mapo z dvojnim klikom.

Posebne okrajšave poti:

Pri ukazu lahko podamo dva tipa poti:

V kolikor ne vemo celotne poti, si lahko pomagamo s tabulatorjem, ki nam bo pokazal možnosti za dokončanje poti.

Primeri:

# Premik v korensko mapo
> cd /

# Premik v domačo mapo trenutnega uporabnika
> cd ~

# Premik eno mapo višje
> cd ..

# Premik v sosednjo mapo
> cd ../sosednjaMapa

Ker je ukaz ugrajen v samo lupino, se do njegove dokumentacije pride z ukazom man builtins.

Ukaz: touch (dokumentacija)

touch se uporablja za ustvarjanje praznih datotek, tako kot lahko v grafičnem vmesniku z desnim klikom ustvarimo novo datoteko.

Primeri:

# Ustvarimo datoteko
> touch datoteka1

Ukaz: tree (dokumentacija)

tree se uporablja kot alternativa programa ls, saj tudi izpiše seznam datotek, a na hierarhičen način z zamaknjenimi vrsticami glede na globino direktorija.

Primeri:

# Preprost izpis
> tree mapa

# Izpis tudi skritih datotek/map
> tree -a mapa

# Izpis zgolj map
> tree -d mapa

# Izpis celotne (relativne) poti do datotek
> tree -f mapa

# Izpis brez zamikov in drevesne strukture
> tree -i mapa

# Izpis datotek in map, ki ustrezajo vzorcu
> tree -P vzorec mapa

# Izpis pravic poleg imen datotek in map
> tree -p mapa

# Izpis z velikostjo datotek
> tree -s mapa
> tree -h mapa # Bolj pregleden izpis

# Izpis do določene globine
> tree -L globina mapa

Ukaz: nano (dokumentacija, bližnjice)

Ukaz nano uporabimo, da uredimo vsebino tekstovne datoteke v terminalu.

Bližnjice:

Primeri:

# Uredimo vsebino datoteke
> nano datoteka.txt

Ukaz: cat (dokumentacija - cat, dokumentacija - tac)

Ukaz cat (concatenate) se uporablja za združitev vsebine datotek in izpis na standardni izhod.

Primeri;

# Izpis vsebine datoteke
> cat datoteka.txt

# Izpis datoteke v obratnem vrstnem redu vrstic
> tac datoteka.txt

Ukaz: grep (dokumentacija)

Z ukazom grep izpišemo vrstice v datoteki, ki se ujemajo v našem vzorcu. Velikokrat ga uporabimo v kombinaciji z drugimi ukazi, kjer iščemo po standardnem vhodu namesto po datoteki.

Operatorji za ponovitev, ki se uporabljajo pri definiciji vzorca:

Definicije množice znakov:

Primeri:

# Iskanje vrstic v datoteki, ki vsebujejo ključno besedo
> grep KljucnaBeseda datoteka.txt

# Kombinacija z ukazom cat
> cat datoteka.txt | grep KljucnaBeseda

# Iskanje vzorca v datiteju
> grep -E vzore+c datoteka.txt

Ukaz: sudo (dokumentacija)

Z uporabo ukaza sudo lahko določen ukaz izvedemo kot, če bi ga izvedel drugi uporabnik ali pa superuser (root).

Primeri:

# Poženemo ukaz kot administrator
> sudo cat datoteka.txt

# Poženemo ukaz kot drug uporabnik
> sudo -u user2 -g usergroup2 cat datoteka.txt

Ukaz: wget (dokumentacija)

Z ukazom wget lahko prenesemo datoteko iz spletnega ali FTP strežnika.

Primeri:

# Prenos datoteke s spletnega strežnika
> wget https://example.org/File.txt

# Prenos, kjer določimo ime ciljne datoteke
> wget -O File.txt https://example.org/File.txt

# Izpis statusa prenosa
> wget --progress=bar https://example.org/File.txt

# Timeout
> wget --connect-timeout=10 https://example.org/File.txt

Ukaz: apt (dokumentacija)

Ukaz apt se uporablja za upravljanje programov na distribuciji Ubuntu (in nekaterih drugih).

Primeri:

# Preverjanje posodobitev
> sudo apt update

# Posodabljanje programov
> sudo apt upgrade

# Odstranjevanje odvečnih programov (sirot - orphans)
> sudo apt autoremove

# Iskanje programa
> apt search imeprograma

# Nameščanje programa
> sudo apt install imeprograma

# Odstranjevanje programa
> sudo apt remove imeprograma # Odstrani samo program
> sudo apt autoremove imeprograma # Odstrani program in sirote
> sudo apt purge imeprograma # Odstrani program in sistemske konfiguracijske datoteke

# Posodabljanje sistema (preveri za posodobitve, naredi popolno nadgradnjo in odstrani sirote)
> sudo apt update && sudo apt full-upgrade -y && sudo apt autoremove -y

Za vajo uporabimo zadnji primer, da posodobimo sistem in na koncu po potrebi ponovno zaženemo VM (ukaz reboot).

Okoljske spremenljivke

Okoljske spremenljivke so podobne spremenljivkam v programskih jezikih, njihov namen je da na krajši način zapišemo neko informacijo. Eno okoljsko spremenljivko smo že spoznali pri poglavju o pwd. Za prikaz okoljske spremenljivke lahko uporabimo kar ukaz echo: echo $PWD, kar nam bo vrnilo pot do trenutnega direktorija. Dve pogosti okoljski spremenljivki sta še $HOME, ki se razširi v /home/<uporabniško ime> in $PATH, ki vsebuje poti do vseh izvedljivih programov v sistemu.

Primer:

# Izpis spremenljivke
> echo $HOME
/home/vegovec

# Definiranje svoje spremenljivke
> ime=vsebina
> echo $ime
vsebina

Datoteke in pravice

Pogosto želimo dostop do nekaterih datotek ali direktorijev omejiti na določene uporabnike. Privzeto ima vsak uporabnik na Linux distribucijah dostop samo do svojih datotek, datotek drugih uporabnikov pa ne more videti.

Obstajajo tri vrste pravic: bralne (r - read), pisalne (w - write) in izvajalne (x - execte za datoteke, d za direktorije), vsaki datoteki (ali direktoriju) pa lahko določimo te pravice za tri skupine uporabnikov: *lastnik (u - user), skupina (g - group) in ostali (o - others).

Če zaženemo ukaz ls -lah v nekem direktoriju bomo dobili nekaj takega:

erazemk@t540p ~> ls -lah
total 0
drwx------.  5 erazemk erazemk 160 mar 21 19:27 .
drwxrwxrwt. 25 root    root    580 mar 21 19:27 ..
-rw-r--r--.  1 erazemk erazemk   0 mar 21 19:27 datoteka1
-rw-r--r--.  1 erazemk erazemk   0 mar 21 19:27 datoteka2
-rwxr-xr-x.  1 erazemk erazemk   0 mar 21 19:27 datoteka3
drwxr-xr-x.  2 erazemk erazemk  40 mar 21 19:27 mapa1
drwxr-xr-x.  2 erazemk erazemk  40 mar 21 19:27 mapa2
drwxr-xr-x.  2 erazemk erazemk  40 mar 21 19:27 mapa3

Vidimo lahko, da ima vsaka datoteka kot prvi stolpec zaporedje znakov (npr. -rw-r--r--.). Le-te si lahko predstavljamo kot stolpce v tabeli.

Poglejmo si za primer vrstico datoteke 1.

Znak 1 (-) pove, da datoteka ni direktorij (so pa direktoriji vse mape).

Znaki 2-4 (rw-) se nanašajo na lastnika (prvi erazemk) in povejo, da ima ta bralne (r) in pisalne (w), ne pa izvajalnih (-) pravic (datoteko 3 pa lahko tudi izvaja).

Znaki 5-7 (r--) se nanašajo na skupino (drugi erazemk), in povejo, da lahko ta datoteko samo bere.

Znaki 8-10 (r--) se nanašajo na ostale uporabnike in povejo, da lahko tudi te datoteko samo berejo.

Znak 11 (.) je uporabljen za druge lastnosti, v katere se ne bomo spuščali.

Vidimo lahko, da imajo vse tri mape omogočeno izvajanje za vse tri skupine uporabnikov. V Linux sistemih je odpiranje mape ekvivalentno izvajanju, zato moramo direktorijem nujno pustiti izvajalne pravice, če jih želimo odpreti.

Ukaz: whoami (dokumentacija)

Ukaz whoami uporabimo za izpis uporabniškega imena trenutnega uporabnika.

Primer:

> whoami
vegovec

Ukaz: chown (dokumentacija)

Ukaz chown se uporablja za spreminjanje lastništva datoteke ali direktorija. Spremenimo lahko tako lastnika kot tudi skupino.

Primeri:

# Dodeljevanje lastništva datoteke imedatoteke uporabniku in skupini vegovec
> chown vegovec:vegovec imedatoteke

# Dodeljevanje lastništva direktorija in vseh poddirektorijev
> chown -R vegovec:vegovec direktorij

Za vajo lahko pogledamo vsebino datotek /etc/passwd, /etc/group in /etc/shadow.

Ukaz: chmod (dokumentacija)

Ukaz chmod se uporablja za spreminjanje pravic dostopa do datoteke ali direktorija.

Poleg določanja pravic z uporabo črk, lahko na krajši način določimo pravice za vse skupine uporabnikov za datoteko s števili. Tako skrajšamo zapis na le tri števke, prva za lastnika, druga za skupino, tretja pa za ostale uporabnike. Da izračunamo katere pravice bi dodelili datoteki moramo vrste pravic sešteti. Branje je vredno 4, pisanje 2 in izvajanje 1.

Tako na primer za branje in pisanje dobimo število 6 (4 + 2), za branje, pisanje in izvajanje 7 (4 + 2 + 1), za pisanje in izvajanje 3 (2 + 1) itd.

Da bi nastavili pravice za določene skupine uporabnikov to storimo tako, da jih zapišemo zaporedno: 644. To pomeni da bo lastnik lahko datoteko bral in vanjo pisal (6), skupina in ostali pa jo bojo lahko samo brali (4).

# Nastavi pravice izvajanja za lastnika datoteke
> chmod u+x imedatoteke # + pomeni dodaj, - pa odvzemi

# Odvzemi pravico izvajanja za skupino datoteke
> chmod g-x imedatoteke

# Nastavi pravice branja in pisanja datoteke lastniku in skupini, a samo branja ostalim
> chmod 644 imedatoteke

# Nastavi pravice izvajanja, branja in pisanja lastniku in skupini, a samo branja in izvajanja ostalim
> chmod 755 imedatoteke

# Nastavi pravice na direktoriju in vseh poddirektorijih
> chmod -R 755 mapa # <-- PAZI! - če direktorij nima pravice izvajanja, ga ne moremo odpreti

Privzeto imajo direktoriji pravice 755, datoteke pa 644.

Namestitev Minecraft strežnika

  1. Namestimo Javo: sudo apt install -y openjdk-17-jre-headless
  2. Ustvarimo novega uporabnika: sudo useradd -m -r -d /opt/minecraft minecraft
  3. Premaknemo se v /opt/minecraft: cd /opt/minecraft
  4. Obiščemo https://www.minecraft.net/en-us/download/server in prenesemo najnovejšo verzijo serverja (preko brskalnika ali pa z wget): sudo -u minecraft -g minecraft wget http://s.dagarin.si/mc-server
  5. Zaženemo server, da zgeneriramo začetno konfiguracijo: sudo -u minecraft -g minecraft java -Xmx2048M -Xms2048M -jar server.jar nogui
  6. Potrdimo strinjanje z EULA: sudo nano eula.txt (eula=true)
  7. Server nastavimo na offline način: sudo nano server.properties (online-mode=false)

Ker želimo server avtomatsko pognati ob ponovnem zagonu moramo za to uporabiti systemd storitve.

Konfiguracija strežnika kot storitve: systemd

Systemd (system daemon) je administratorsko orodje, ki skrbi za izvajanje storitev na večini Linux distribucij. Storitve lahko zažene, ustavi ali ponovno zažene, ponuja pa še množico drugih možnosti. Zaradi kompleksnosti sistema se vanj ne bomo spuščali.

Vedeti moramo le, da če želimo upravljati Minecraft strežnik s pomočjo Systemd (kar je koristno, ker se lahko avtomatsko zažene ko ponovno zaženemo VM), moramo zanj ustvariti konfiguracijsko datoteko, ki jo Systemd zna brati.

Ustvarimo datoteko minecraft.service: sudo nano /etc/systemd/system/minecraft.service

Vanjo zapišemo sledeče:

[Unit]
Description=Minecraft Server
After=network.target

[Service]
WorkingDirectory=/opt/minecraft
User=minecraft
Group=minecraft
Restart=always
ExecStart=/usr/bin/java -Xmx2048M -Xms2048M -jar server.jar nogui

[Install]
WantedBy=multi-user.target

Ko datoteko shranimo, lahko s strežnikom upravljamo s sledečimi ukazi:

# Omogočimo zagon strežnika ob vklopu naprave (naredimo ob namestitvi)
> sudo systemctl enable minecraft

# Zaženemo Minecraft strežnik
> sudo systemctl start minecraft

# Preverimo stanje strežnika
> sudo systemctl status minecraft

Požarni zid ufw (dokumentacija)

Privzeto ob namestitvi Ubuntu serverja ni nameščenega požarnega zidu, za to ga moramo namestiti sami.

Firewall oz. požarni zid je skupek programske opreme, ki skrbi za zaščito pri komunikaciji po omrežju. Ločuje dva odseka omrežij in med njima prepušča zgolj dovoljen promet, drug promet pa zavrne. V našem primeru ščiti aplikacije, ki tečejo na računalniku pred zunanjim nedovoljenim dosotopom.

Da zaščitimo naš strežnik bomo uporabili ufw (Uncomplicated firewall), saj omogoča enostaven konfiguracijski vmesnik.

# Namestitev
> sudo apt install ufw

# Pregled statusa
> sudo ufw status verbose
# icoming: promet od zunaj, ki dostopa do aplikacij
# routed: promet, ki potuje čez napravo do "drugih naprav" (naprava se obnaša kot usmerjevalnik)
# outgoing: promet, k ga ustvarjajo aplikacije na napravi, ko dostopajo do spleta

# Odpremo port za MineCraft server
> sudo ufw allow 25565/tcp

# Primer: Omogoči tcp in udp
> sudo ufw allow 53

# Primer: Omogoči promet določeni storitvi (/etc/services)
> sudo ufw allow SERVICENAME

# Primer: Onemogoči promet
> sudo ufw deny 53
> sudo ufw deny 53/udp

# Pregled statusa
> sudo ufw status verbose

# Omogoči požarni zid
> sudo ufw enable

Konfiguracijske datoteke se nahajajo na /etc/ufw.

Povezovanje na Minecraft server

Ker smo server nastavili na offline način, se lahko nanj povežemo tudi brez plačljivega Minecraft računa, kar bomo storili s pomočjo aplikacije TLauncher.

1. Obišči TLauncher spletno stran, prenesi aplikacijo in jo zaženi
Screenshot from 2022-03-21 18-32-52
Screenshot from 2022-03-21 18-33-06
2. Vpiši želeno uporabniško ime (ni važno katero) in pritisni na gumb Install
Screenshot from 2022-03-21 18-34-07

Ko se bo Minecraft uspešno prenesel se bo avtomatsko zagnal, od tam naprej pa se verjetno že znate povezati na server.