# 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.

Ezek közül néhány:

 - Build modular programs
 - Write readable programs
 - Use composition
 - Separate mechanisms from policy 
 - Write simple programs
 - Write small programs
 - Write transparent programs
 - Write robust programs
 - Make data complicated when required, not the program
 - Build on potential users' expected knowledge
 - Avoid unnecessary output
 - Write programs which fail in a way that is easy to diagnose
 - Value developer time over machine time
 - Write abstract programs that generate code instead of writing code by hand
 - Prototype software before polishing it
 - Write flexible and open programs
 - Make the program and protocols extensible


### 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.

The advantage of this approach is that the same set of tools, 
utilities and APIs can be used on a wide range of resources. 
There are a number of file types. When a file is opened, 
a file descriptor is created. The file path becoming the addressing 
system and the file descriptor being the byte stream I/O interface. 
But file descriptors are also created for things like anonymous pipes 
and network sockets via different methods. Therefore a more accurate
description of this feature is Everything is a file descriptor.

Additionally, a range of pseudo and virtual filesystems exists 
which exposes information about processes and other system information 
in a hierarchical file-like structure. 
These are mounted into the single file hierarchy.

### 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

`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
`useradd -m -G additional_groups -s login_shell username`

### 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

### 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.

## 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.

A Service is a server application or set of applications that runs
in the background waiting to be used, or carrying out essential task. 
They are basically called in inter-process communication.

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.

A systemd 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.

szolgáltatások, démonok, konfigfájlok

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