# 2. videó segédlet


## UNIX alapelvek

<Note type="tip" label="Magyarázat">

A Linux egy [UNIX-szerű](https://en.wikipedia.org/wiki/Unix-like) rendszer, ugyanazokra az alapelvekre épül, 
ezért beszélünk most róluk. Amiket ebben a fejezetben olvashattok egyaránt
vonatkozik a UNIX-ra és a Linux-ra is.

</Note>

Vannak különböző [elvek](https://en.wikipedia.org/wiki/Unix_philosophy), amik alapján egy UNIX operációs rendszert megalkotnak.
A Linux is ezen elvek alapján készült.

 - Moduláris szemlélet figyelembe vétele
 - Válaszd szét a működést az előírásoktól, szabályzatoktól
 - Egy program legyen kicsi, egyszerű, átlátható, mégis robosztus
 - Szükség esetén, inkább az adatstruktúra legyen összetettebb, ne a program
 - Számolj a potenciális felhasználók felkészültségével
 - Kerüld el a szükségtelen mellékhatásokat
 - Ha a program összeomlik, mérhető, elemezhető legyen
 - A fejlesztő ideje fontosabb a gép idejénél
 - A programok kézi kódolása helyett írj absztrakt programot, amely megalkotja a kódot
 - Írj rugalmas és nyílt programokat
 - A programok, protokollok bővíthetőek legyenek


### KISS (Keep it Simple, Stupid)

A legtöbb rendszer akkor működik a legjobban, ha azt egyszerűnek hagyják, 
és nem teszik egyre bonyolultabbá. 
Ezért az egyszerűségnek a tervezés egyik fő céljának kell lennie, 
és kerülni kell az olyan összetételeket, amelyekre nincs szükség.

### Everything is a file

Ez azt jelenti, hogy a felhasználó fájljai, a rendszer könyvtárkatalógusai
és a rendszerhez csatlakoztatott hardver eszközök, mint fájlok 
egységesen kezelhetőek.

Ezen megközelítés előnye, hogy ugyanazokat az eszközöket és API-kat
széles körben fel tudjuk használni. Többféle fájltípus van, de bármelyik 
megnyitásakor egy állományleíró, ún. file descriptor jön létre. Így a fájl útvonala 
használható egy címkezelő rendszerként, és a file descriptor pedig a bájtfolyam
I/O interfésze. De a file descriptor ugyanakkor létrehozható pipe 
és hálózati socketek megvalósítására is. Ennél fogva azt is mondhatnánk: 
Minden is egy file descriptor.

Kiegészítésképp, létezik egy sor pszeudo és virtuális fájlkezelő rendszer amelyek
képesek bizonyos folyamatokról, rendszer információkról adatokat 
megjeleníteni, hiszen ezek is egyetlen fájl hierarchiába vannak csatolva.

### Architektúra

A UNIX rendszereknél az operációs rendszer részei
jóval függetlenebbek egymástól, mint mondjuk egy Windows alapú rendszernél. 

*De mik is ezek a részek?*

#### Bootloader
Ez a legelső program, ami betöltődik, amikor a gépet bekapcsoljuk.
A feladata a kernel és pár [alapvető driver és program](https://en.wikipedia.org/wiki/Initial_ramdisk)
betöltése RAM-ba, majd a kernel elindítása.
Dual boot esetén lehetőséget ad arra, hogy kiválasszuk melyik OS-t
szeretnénk elindítani.  
*Az Ubuntu által használt bootloader a Grub.*

#### Kernel
A kernel feladata a hardverek bekurblizása és kezelése,
erőforrások szétosztása, jogosultságok behajtása
és sok gyakran használt,
hardverközeli teendőhöz függvényeket biztosítani
(pl: hálózati csomagküldés, adatblokk beolvasása lemezről, stb.).  
*Az Ubuntu által használt kernel a Linux.*

#### Init rendszer
Az init rendszer feladata az operációs rendszer szolgáltatásainak
elindítása, felügyelete és kezelése.
Ez indítja el a hálózatkezelőt és bejelentkezőablakot is például.  
*Az Ubuntu által használt init rendszer a systemd.*

#### Userland
A userland egy nehezen behatárolható dolog. Igazából minden,
az operációs rendszerrel jövő, nem kernelben élő szoftver a userland része.
Ebbe beletartozik az init rendszer is, de mégse venném ide, mivel
annak elég jól elkülönülő határai vannak.

Egy UNIX rendszer userland-ja alatt általában
az alapvető programokat értjük, amik a rendszer és rajta futó
programok használatához szükségesek.  
Ilyen pélául az `ls`, `cat`, `sh`, `cp`, `rm`, stb.  
*Az Ubuntu GNU userland-et használ.*


## A többfelhasználós rendszer működése, kezelése

https://linuxhint.com/ubuntu-user-management/

### Felhasználók kezelése

#### Létrehozás
A `useradd` parancs segítségével
hozzáadhatunk egy új felhasználót a rendszerhez.

`sudo useradd -G kszksok -s /bin/bash -m mike`
- `sudo`: mert root hozhat csak létre új usert
- `useradd`: ez a parancs hoz létre usert
- `-G kszksok`: a `kszksok` csoport tagja legyen az új user
- `-s /bin/bash`: a bash legyen a shellje a usernek
- `-m`: legyen home mappája
- `mike`: az új user neve

Ezután az új felhasználónak be kell állítani egy jelszót, ezt 
a `sudo passwd mike` parancs kiadása után állítható be.
<Note type="warning" label="Megjegyzés">
A `passwd` nem ír semmit a terminálra miközben írjuk a jelszót,
de ne kételkedjünk, hogy nem látunk semmit, attól még íródik.
</Note>

```
patrik@ubuntu:/home$ useradd -m -s /bin/bash mike 
useradd: Permission denied.
useradd: cannot lock /etc/passwd; try again later.
patrik@ubuntu:/home$ sudo useradd -m -s /bin/bash  mike
patrik@ubuntu:/home$ sudo passwd mike
New password: 
Retype new password: 
passwd: password updated successfully
patrik@ubuntu:/home$
```
#### Törlés
`sudo userdel <username>`parancs segítségével
eltávolíthatunk egy új felhasználót a rendszerből.
Azonban ez csak a felhasználót törli a hozzá tartozó `home` mappát
és egyéb fájlokat nem, ezt az `-r` kapcsoló megadásával tehetjük meg.

```
patrik@ubuntu:/home$ sudo userdel -r mike
[sudo] password for patrik: 
patrik@ubuntu:/home$
```

#### Jelszó megváltoztatása

`sudo passwd <username>` parancs segítségével megváltoztatható
egy-egy felhasználó jelszava. Akkor ha csak annyit írunk, hogy passwd, azzal
a bejelentkezett felhasználó jelszavát változtatjuk meg.

```
patrik@ubuntu:/home$ sudo passwd mike
[sudo] password for patrik: 
New password: 
Retype new password: 
passwd: password updated successfully
patrik@ubuntu:/home$ passwd
Changing password for patrik.
Current password: 
New password: 
Retype new password: 
passwd: password updated successfully
patrik@ubuntu:/home$ passwd
Changing password for patrik.
Current password: 
New password: 
Retype new password: 
Password unchanged
New password: 
Retype new password: 
You must choose a longer password
New password: 
Retype new password: 
Bad: new and old password are too similar
passwd: Authentication token manipulation error
passwd: password unchanged
patrik@ubuntu:/home$
```

A jelszó megadásánál van egy pár követelmény, 
aminek meg kell felelni. Ilyenek azok is, melyek fentebb láthatóak.
A jelszó nem egyezhet meg a korábbival, nem lehet ahhoz nagyon hasonló,
hosszúnak kell lennie, ha túl egyszerű
azt se engedi (1234, asdasd...stb.).

#### Root jog "szerzése"

`usermod -aG sudo <username>` parancs segítségével hozzáadjuk a 
megadott felhasználót a sudo nevű csoporthoz.
*Hint: `-aG`, mint add group.*
```
patrik@ubuntu:/home$ sudo usermod -aG sudo mike
``` 
Vagy a létrehozás során adjuk meg a plusz group-ot
```
patrik@ubuntu:/home$ useradd -m -G sudo -s /bin/bash mike
```

### Csoportok kezelése

`groups username` parancs megadásával megtudhatjuk egy felhasználó, 
mely csoportoknak a tagjai. A `groups` parancs önmagában a bejelentkezett felhasználó
csoportjait mutatja meg.

```
patrik@ubuntu:~$ groups mike
mike : mike sudo
patrik@ubuntu:~$ groups patrik
patrik : patrik adm cdrom sudo dip plugdev lpadmin lxd sambashare
patrik@ubuntu:~$ groups
patrik adm cdrom sudo dip plugdev lpadmin lxd sambashare
```

#### Létrehozás

`sudo groupadd <groupname>` parancs segítségével lehet létrehozni egy új
csoportot. 

```
patrik@ubuntu:~$ sudo groupadd almafa
[sudo] password for patrik: 
patrik@ubuntu:~$ sudo cat /etc/group | grep alma
almafa:x:1002:
patrik@ubuntu:~$ 
```

#### Törlés

`sudo groupdel <groupname>` parancs segítségével eltávolíthatunk egy csoportot.

```
patrik@ubuntu:~$ sudo groupdel almafa
patrik@ubuntu:~$ sudo cat /etc/group | grep alma
patrik@ubuntu:~$
```

#### Felhasználók hozzáadása

`sudo usermod -aG <groupname> <username>` parancs segítségével felhasználót
lehet hozzáadni a megadott csoporthoz.

```
patrik@ubuntu:~$ sudo usermod -aG almafa mike
patrik@ubuntu:~$ groups mike
mike : mike sudo almafa
patrik@ubuntu:~$ 
```

#### Felhasználók eltávolítása a csoportból

`gpasswd -d <groupname> <username>`

### Superuser

Kicsit bővebben azon kívül, amit eddig mondtunk.
Bár lehet, hogy a UNIX elvek után/ beleépítve is mehetne, hogy kb mi.

<!--
TODO: Ezt megírni, attól függ mit akarsz a videóba Mike.
-->

## Init rendszer

A UNIX operációs rendszerben vannak olyan feladatok, amiket a
háttérben (gyakran "észrevétlenül") futó folyamatok végeznek el. 
Ezeket a programokat daemon folyamatoknak is nevezik. 
Mivel ezeket a folyamatokat nem a terminálról indítják, 
általában a rendszerindításkor automatikusan indulnak el.

Egy szolgáltatás nem más, mint egy szerver alkalmazás vagy alkalmazások összesége , amelyek 
a háttérben futnak, és a feladatukra várnak, vagy már valamilyen fontos feladatot 
(taskot) látnak el. Őket gyakorlatilag csak processzek közti kommunikáció során 
hívják meg.

Manapság a démonok (daemon) és a szolgáltatások (service) alatt ugyanazt a 
fogalmat értjük, mivel ezek a programok egyszerre démonok és szolgáltatások is.

Az init rendszer a legelső (és egyetlen) program, démon, amelyet a kernel indulása után elindít.
Az ő feladata, hogy minden szükséges szolgáltatást, démont elindítson.

### systemd

A systemd egy init rendszer, 
amely nagyon elterjed Linux rendszereken, ma már szinte az 
összes disztribúció ezt használja, mivel számos előnye van elődeihez képest.

Feladata, hogy a Linux kernel 
indulása után előkészítse az induló szolgáltatásokat 
és a systemd felel nagyon
sok olyan háttérmunkáért, amiről sok esetben nem is tudunk,
de szükségesek a rendszerhez, vagy egy-egy feladat indításához.

Megjegyzés: a `.service`-t nem kötelező kiírni

Vannak olyan programok, amit szeretnénk, a rendszerrel együtt indítani,
a rendszerrel együtt szabályosan leállítani, valamint
igény szerint kézzel indítani, leállítani, újraindítani.

#### `systemctl`: a systemd-t piszkáló, vele kommunikáló eszköz

`systemctl status <service_neve.service>` Szolgáltatás indítása

`systemctl start <service_neve.service>` Szolgáltatás leállítása

`systemctl stop <service_neve.service>` Szolgáltatás újraindítása

`systemctl restart <service_neve.service>` Szolgáltatás státusza

`systemctl enable <service_neve.service>` Indítás a rendszerrel

`systemctl disable <service_neve.service>` Ne induljon a rendszerrel

#### `journalctl`: naplózó, logkezelő service

`journalctl` Naplók megjelenítése

`journalctl -xe` Hibák megjelenítése

`journalctl -u <service_neve>` Egy szolgáltatás logjainak megjelenítése

`journalctl --since "1 hour ago"` Egy időpont óta történt események



## Hálózat alapszintű konfigurálása

<Note type="tip" label>

Az esetek többségében ezt nem kell nekünk kézzel megcsinálni, 
hanem a network manager megoldja helyettünk (ezt rendesen át kell fogalmazni)

</Note>

Rövid szöveg

Példa 

## Távoli hozzáférés (SSH)

A rendszerhez hozzáférhetünk távolról is, így is megkönnyítve a munkánkat,
nem kell fizikailag az adott számítógépnél/szervernél lennünk. 
Erre többféle módszer is van, de a legbiztonságosabb és ma is leginkább használatos
az ssh (secure shell).

### Használata

 - `ssh a_távoligépen_lévő_felhasználónk_neve@a_távoli_gép_neve`
 - Megkérdezi a felhasználó nevünkhöz 
tartozó jelszót, ezt megadjuk ééééééééés bent is vagyunk

```shell
[patrik@patrik-laptop ~]$ whoami
patrik
[patrik@patrik-laptop ~]$ ssh hallgato@172.16.228.130                                                                                                                                       3944ms  2021. márc. 16., kedd, 20:41:28 CET
hallgato@172.16.228.130's password:
 
Welcome to Ubuntu 20.04.2 LTS (GNU/Linux 5.4.0-65-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage
Last login: Tue Mar 16 20:41:47 2021
hallgato@ubuntu:~$ whoami
hallgato
hallgato@ubuntu:~$
```
Ez mit is mutat?
 - `whoami` (ki vagyok én?) válaszol erre a kérdésre
   - Ezt a parancsot kiadom a saját gépemen és visszaadja, hogy `patrik`
 - `ssh hallgato@172.16.228.130 ` szeretnék belépni ssh-n keresztül
   a 172.16.228.130 ip címmel rendelkező gépre hallgato felhasználó névvel
 - `hallgato@172.16.228.130's password:` itt kell megadni a felhasználó jelszavát
    - Ha létezik a felhasználó és jó a megadott jelszó, akkor belépünk a rendszerbe
    - Ezután látható, hogy tényleg sikeresen beléptem, egy "üdvözlő üzenet" fogad,
    valamint a promt is megváltozott `hallgato@ubuntu:~$`-ra
 - `whoami` parancs kiadása a távoli gépem
    - Itt már a `hallgato` nevet kapom vissza, ebből is látszik, 
      hogy most egy másik felhasználóként használom a shell-t