# 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