# 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. Ezen elvek közül néhány: - 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 hozhatunk létre új felhasználót. `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> <Note type="tip" label="Extra infó"> Ubuntun és egyéb Debian alapú disztrókon megtalálható egy `adduser` script is, ami szintén userek létrehozására van. Használata kicsit egyszerűbb, azonban nincs minden rendszeren. Használata: ```shell-session mike@mike-elementary:~$ sudo adduser patrik [sudo] password for mike: Adding user `patrik' ... Adding new group `patrik' (1001) ... Adding new user `patrik' (1001) with group `patrik' ... Creating home directory `/home/patrik' ... Copying files from `/etc/skel' ... Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully Changing the user information for patrik Changing the user information for patrik Enter the new value, or press ENTER for the default Full Name []: Fodor Patrik Room Number []: 6969 Work Phone []: +36306942069 Home Phone []: Other []: Jógyerek amúgy chfn: 'Jógyerek amúgy' contains non-ASCII characters Is the information correct? [Y/n] y mike@mike-elementary:~$ sudo adduser patrik sudo Adding user `patrik' to group `sudo' ... Adding user patrik to group sudo Done. mike@mike-elementary:~$ ``` </Note> ```shell-session 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. ```shell-session patrik@ubuntu:/home$ sudo userdel -r mike [sudo] password for patrik: patrik@ubuntu:/home$ ``` <Note type="tip" label="Extra infó"> A `userdel` Debian-os párja a `deluser`. </Note> #### 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. ```shell-session 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.* ```shell-session patrik@ubuntu:/home$ sudo usermod -aG sudo mike ``` Vagy a létrehozás során adjuk meg a plusz group-ot ```shell-session 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. ```shell-session 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. ```shell-session patrik@ubuntu:~$ sudo groupadd almafa [sudo] password for patrik: patrik@ubuntu:~$ sudo cat /etc/group | grep alma almafa:x:1002: patrik@ubuntu:~$ ``` <Note type="tip" label="Extra infó"> Debian alapú disztrókon a `sudo addgroup almafa` is működik. </Note> A `/etc/group` fájlban található a csoportok listája és azok tulajdonságai. sudo cat /etc/group | grep alma: - `sudo` csak root joggal olvasható vagy írható a `group` fájl - 'cat' kiírja egy fájl tartalmát, ez most a group, vagyis a csoportok listája - a `|` segítségével a `cat` kimenetét odaadjuk egy másik program bemenetének (jelen esetben a `grep`) - a `grep` a bemenetére kapott szövegből az `"alma"` (rész)szót tartalmazókra fog szűrni Ennek a segítségével leellenőrézhetó egy a csoport valóban létrejött. #### Törlés `sudo groupdel <groupname>` parancs segítségével eltávolíthatunk egy csoportot. ```shell-session patrik@ubuntu:~$ sudo groupdel almafa [sudo] password for patrik: patrik@ubuntu:~$ sudo cat /etc/group | grep alma patrik@ubuntu:~$ ``` <Note type="tip" label="Extra infó"> Debian alapú disztrókon a `sudo delgroup almafa` is működik. </Note> Hasonlóan az előző ellenőrzéshez itt is ellenőrizhető, hogy valóban eltávolításra került-e a csoport. Mivel a kimeneten nem jelent meg semmi, megállapítható, hogy nincs alma szót tartalmazó group. #### 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. A `groups` parancs segítségével megnézhetjük, hogy tényleg megtörténik a hozzáadás. ```shell-session patrik@ubuntu:~$ sudo usermod -aG almafa mike [sudo] password for patrik: patrik@ubuntu:~$ groups mike mike : mike sudo almafa patrik@ubuntu:~$ ``` Hozzáadni egy felhasználót egy csoporthoz nem csak a `usermod` segítségével lehet, hanem a `gpasswd` paranccsal is. ``` patrik@ubuntu:~$ groups mike mike : mike sudo patrik@ubuntu:~$ sudo gpasswd -a mike almafa [sudo] password for patrik: Adding user mike to group almafa patrik@ubuntu:~$ groups mike mike : mike sudo almafa patrik@ubuntu:~$ ``` `sudo gpasswd -a <username> <groupname>`: - A `gpasswd` egy parancs, mely segítségével különböző műveleteket lehet végrehajtani a csoportokon. - `-a` kapcsoló, mely megadja, hogy hozzáadni szeretnénk egy felhasználót. (add) - `username` a felhasználó, akit szeretnénk Hozzáadni - `groupname` a csoport, amelyikhez szeretnénk hoozáadni a felhasználót <Note type="tip" label="Extra infó"> Debian alapú disztrókon a `sudo adduser mike almafa` is működik. </Note> #### Felhasználók eltávolítása a csoportból `sudo gpasswd -d <groupname> <username>` parancs segítségével törölhetünk egy felhasználót a csoportból. ``` patrik@ubuntu:~$ sudo gpasswd -d mike almafa [sudo] password for patrik: Removing user mike from group almafa patrik@ubuntu:~$ groups mike mike : mike sudo ``` <Note type="tip" label="Extra infó"> Debian alapú disztrókon a `sudo deluser mike almafa` is működik. </Note> Pontosan ugyanazt kell itt csinálni, mint amikor a `gpasswd` segítségével hozzáadunk egy felhasználót, csupán a kapcsoló eltérő `-d`. ### [Superuser](https://en.wikipedia.org/wiki/Superuser#Unix_and_Unix-like) Ez az oldal is jó: https://mediatemple.net/community/products/dv/204643890/an-introduction-to-the-root-user The root is the user name or account that by default has access to all commands and files on a Linux or other Unix-like operating system. It is also referred to as the root account , root user, and the superuser. In computing, the superuser is a special user account used for system administration. Depending on the operating system (OS), the actual name of this account might be root, administrator, admin or supervisor. In some cases, the actual name of the account is not the determining factor; on Unix-like systems, the user with a user identifier (UID) of zero is the superuser, regardless of the name of that account and in systems which implement a role based security model, any user with the role of superuser can carry out all actions of the superuser account. The principle of least privilege recommends that most users and applications run under an ordinary account to perform their work, as a superuser account is capable of making unrestricted, potentially adverse, system-wide changes. In Unix-like computer OSes (such as Linux), root is the conventional name of the user who has all rights or permissions (to all files and programs) in all modes (single- or multi-user). ## 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 elterjedt 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 #### Saját program használata szolgáltatásként ## 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-session [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