Budapesti Műszaki és Gazdaságtudományi Egyetem Villamosmérnöki és Informatikai Kar
BÁNYÁSZ GÁBOR DÉVAI ISTVÁN KARDOS GERGELY SZÁNTAI ISTVÁN
LINUX ALAPÚ HÁLÓZATOK Jegyzet v1.0
Budapest, 2012. május 10.
Tartalomjegyzék 1. Bevezetés
1
1.1. A Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
1.1.1. A szabad szoftver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2
1.1.1.1. A Linux licence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2
1.2. A Linux rendszermag áttekintése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
1.2.1. A Linux-kernel felépítése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
1.3. Belépés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
1.4. Virtuális konzolok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
1.5. Grafikus felület . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
1.6. A jelszó beállítása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
1.7. A legfontosabb parancs: man . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
1.8. A parancsformátum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
1.9. Gyakran használt parancsok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
1.10. Szövegszerkesztők . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 1.10.1. A vi szövegszerkesztő . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 1.10.2. A nano szövegszerkesztő . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 1.10.3. A joe szövegszerkesztő . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2. Állományok, állományrendszerek
13
2.1. Állomány típusok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.2. Hierarchikus állományrendszer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.3. A könyvtárfa áttekintése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.4. Linkek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.5. Az eszközállományok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 2.6. Fájlrendszer típusok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 2.6.1. Minix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 2.6.2. Extended filesystems (ext, ext2, ext3, ext4) . . . . . . . . . . . . . . . . . . . . . . 18 2.6.3. Journaling állományrendszerek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 2.6.4. Más operációs rendszerek támogatása . . . . . . . . . . . . . . . . . . . . . . . . . 20 2.6.5. A CD állományrendszere: iso9660 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 2.6.6. Hálózati állományrendszerek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 2.6.7. Az állományrendszer paraméter használata . . . . . . . . . . . . . . . . . . . . . . 21 2.6.8. Fájlrendszer létrehozása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 2.7. Partíciók létrehozása, kezelése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 2.8. Állományrendszerek összekapcsolása és leválasztása . . . . . . . . . . . . . . . . . . . . . . 22 2.9. Partíció létrehozása, formázása, felcsatolása . . . . . . . . . . . . . . . . . . . . . . . . . . 23 2.10. A Linux állományrendszer megjavítása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 2.11. Rendszerpartíciók paramétereinek megadása . . . . . . . . . . . . . . . . . . . . . . . . . . 24 2.12. Ext2 állományrendszer konverziója ext3-ra . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
ii
2.13. A swap
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
2.13.1. Swap partíció hozzáadása a rendszerhez . . . . . . . . . . . . . . . . . . . . . . . . 27 2.13.2. Swap állomány hozzáadása a rendszerhez . . . . . . . . . . . . . . . . . . . . . . . 27 2.13.3. A swap eltávolítása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 3. Felhasználók adminisztrációja, quota, shell
29
3.1. Felhasználók adminisztrációja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 3.1.1. A felhasználói azonosítók . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 3.1.2. Felhasználók létrehozása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 3.1.3. Felhasználó letiltása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 3.1.4. Felhasználó törlése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 3.1.5. Csoportok adminisztrációja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 3.1.6. Az állományrendszer jogosultságai . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 3.1.6.1. A jogok megváltoztatása (szimbolikus jelekkel) . . . . . . . . . . . . . . . 34 3.1.6.2. A jogok állítása (oktális számokkal) . . . . . . . . . . . . . . . . . . . . . 35 3.1.6.3. Alapértelmezett állomány jogok . . . . . . . . . . . . . . . . . . . . . . . 36 3.1.7. Az ext2, ext3, etx4 állományrendszerek további jogosultságai . . . . . . . . . . . . 37 3.2. Quota . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 3.2.1. A quota bekapcsolása az állományrendszerre . . . . . . . . . . . . . . . . . . . . . 38 3.2.2. A quota táblázatok létrehozása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 3.2.3. A quota rendszer bekapcsolása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 3.2.4. A quota értékek beállítása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 3.2.5. A türelmi idő beállítása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 3.3. A parancsértelmező (shell) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 3.3.1. Parancssor értelmezés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 3.3.2. A shell beépített parancsai . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 3.3.3. Állománynév-helyettesítés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 3.3.4. Standard input/output átirányítás . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 3.3.5. Csővezeték . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 3.3.6. Parancshelyettesítés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 3.3.7. Parancssorozatok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 3.3.8. Szinkron és aszinkron folyamatok . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 3.3.9. Csoportosítás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 3.3.10. A Bash shell további funkciói . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 3.3.10.1. Változók kezelése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 3.3.10.2. Speciális változók . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 3.3.10.3. A shell indulási folyamata . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 3.3.10.4. Alias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 3.3.10.5. Parancs history
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
3.3.10.6. Parancsállományok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 3.3.10.7. Beépített parancsok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 iii
3.3.10.8. Feltételek kiértékelése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 3.3.10.9. Vezérlési szerkezetek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 3.3.10.9.1. If feltétel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 3.3.10.9.2. For ciklus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 3.3.10.9.3. While ciklus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 3.3.10.9.4. Until ciklus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 3.3.10.9.5. Case szerkezet . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 3.3.10.10.Shell szkript példa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 3.3.10.11.Erőforrás kontroll . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 4. Segédprogramok, folyamatok kezelése, chroot, a rendszer indulása, automatizált programindítás, log
55
4.1. Segédprogramok és szűrők . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 4.1.1. A find parancs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 4.1.2. A head és tail parancsok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 4.1.3. A sort parancs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 4.1.4. A uniq parancs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 4.1.5. A cmp és diff parancsok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 4.1.6. A patch parancs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 4.1.7. A grep parancs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 4.1.8. Egyszerű reguláris kifejezések . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 4.2. Folyamatok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 4.2.1. A folyamatok monitorozása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 4.2.2. Háttérfolyamatok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 4.2.3. Kommunikáció a folyamatokkal, megszüntetés . . . . . . . . . . . . . . . . . . . . . 64 4.2.4. Folyamat vezérlése a bash shellben . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 4.2.5. Prioritásállítás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 4.3. Chroot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 4.4. A rendszer elindulása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 4.4.1. GRUB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 4.4.1.1. GRUB telepítése merevlemezre . . . . . . . . . . . . . . . . . . . . . . . . 67 4.4.1.2. GRUB konfigurációs állomány . . . . . . . . . . . . . . . . . . . . . . . . 68 4.4.1.3. GRUB2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 4.4.2. Az inittab állomány . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 4.4.3. Upstart . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 4.4.3.1. Az Upstart működése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 4.4.3.2. Upstart események . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 4.4.3.3. Upstart jobok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 4.4.3.4. Kompatibilitás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 4.4.4. Leállítás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 4.4.5. Újraindítás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 iv
4.4.6. „Elfelejtettük a jelszót, nem probléma, törjük fel!”
. . . . . . . . . . . . . . . . . . 79
4.4.7. A futásszintek szolgáltatásai . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 4.4.7.1. Kezelés kézzel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 4.4.7.2. A chkconfig program . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 4.4.7.3. A sysv-rc-conf program . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 4.5. Automatizált programindítás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 4.5.1. Cron . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 4.5.1.1. Konfiguráció . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 4.5.1.2. Felhasználók lehetőségei . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 4.5.1.3. A hozzáférés szabályozása . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 4.5.1.4. A módosítások hatályba lépése . . . . . . . . . . . . . . . . . . . . . . . . 84 4.5.2. At . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 4.5.2.1. A hozzáférés szabályozása . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 4.5.3. Batch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 4.6. Log mechanizmus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 4.6.1. Rsyslog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 4.6.2. Log állományok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 4.6.3. Logrotate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 5. Csomagkezelés, X Window System, asztali környezetek
89
5.1. RPM csomagkezelés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 5.1.1. Az rpm használata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 5.1.1.1. Csomagok telepítése és eltávolítása . . . . . . . . . . . . . . . . . . . . . . 89 5.1.1.1.1.
Telepítés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
5.1.1.1.2.
Eltávolítás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
5.1.1.2. Frissítés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 5.1.1.3. Információk lekérdezése . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 5.1.2. Csomagok fordítása, készítése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 5.1.2.1. Forrás csomag lefordítása . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 5.1.2.2. Bináris RPM készítése forrás RPM-ből . . . . . . . . . . . . . . . . . . . 94 5.1.2.3. A spec fájl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 5.1.2.3.1.
A header szekció . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
5.1.2.3.2.
Prep . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
5.1.2.3.3.
A build szekció . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
5.1.2.3.4.
Az install szekció . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
5.1.2.3.5.
A clean szekció . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
5.1.2.3.6.
Opcionális telepítés, eltávolítás előtti és utáni szkriptek . . . . . 97
5.1.2.3.7.
A files szekció . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
5.1.2.3.8.
A changelog szekció . . . . . . . . . . . . . . . . . . . . . . . . . 98
5.1.2.4. Bináris RPM készítése tgz forrásból . . . . . . . . . . . . . . . . . . . . . 98 5.1.3. A yum használata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 v
5.1.3.1. Csomagok telepítése és eltávolítása . . . . . . . . . . . . . . . . . . . . . . 99 5.1.3.1.1.
Telepítés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
5.1.3.1.2.
Eltávolítás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
5.1.3.2. Frissítés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 5.1.3.3. A yum egyéb funkciói . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 5.1.3.4. Csomaginformációk lekérdezése, keresés . . . . . . . . . . . . . . . . . . . 101 5.2. Debian csomagkezelés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 5.2.1. A dpkg használata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 5.2.1.1. Csomagok telepítése és eltávolítása . . . . . . . . . . . . . . . . . . . . . . 103 5.2.1.1.1.
Telepítés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
5.2.1.1.2.
Eltávolítás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
5.2.1.2. Frissítés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 5.2.1.3. Csomaginformációk lekérése
. . . . . . . . . . . . . . . . . . . . . . . . . 106
5.2.2. Bináris Debian csomag készítése . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 5.2.2.1. Csomagszerkezet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 5.2.2.1.1.
A debian-binary fájl . . . . . . . . . . . . . . . . . . . . . . . . . 109
5.2.2.1.2.
data.tar.gz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
5.2.2.1.3.
A control.tar.gz fájl . . . . . . . . . . . . . . . . . . . . . . . . . 109
5.2.2.1.4.
A Debian control fájl . . . . . . . . . . . . . . . . . . . . . . . . 110
5.2.2.2. A csomag összeállítása és ellenőrzése . . . . . . . . . . . . . . . . . . . . . 112 5.2.2.2.1.
A helyi debian könyvtár előkészítése . . . . . . . . . . . . . . . . 112
5.2.2.2.2.
A szükséges fájlok . . . . . . . . . . . . . . . . . . . . . . . . . . 112
5.2.2.2.3.
A fájlok elhelyezése a helyi debian fa-struktúrában . . . . . . . . 112
5.2.2.2.4.
A Debian csomag elkészítése és ellenőrzése . . . . . . . . . . . . 113
5.2.3. Az apt használata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 5.2.3.1. Csomagok telepítése és eltávolítása . . . . . . . . . . . . . . . . . . . . . . 114 5.2.3.1.1.
Telepítés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
5.2.3.1.2.
Eltávolítás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
5.2.3.2. Frissítés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 5.2.3.3. Az apt-get egyéb funkciói . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 5.2.3.4. Csomaginformációk lekérdezése, keresés . . . . . . . . . . . . . . . . . . . 116 5.2.3.4.1.
Az apt-file program . . . . . . . . . . . . . . . . . . . . . . . . . 118
5.3. Átjárás az RPM és a Debian csomagkezelés között . . . . . . . . . . . . . . . . . . . . . . 119 5.4. X Window System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 5.4.1. X Window architektúra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 5.4.2. Ablakkezelők . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 5.4.3. Kliens alkalmazások . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 5.4.4. Asztali környezetek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 5.4.5. Az X elindítása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122 5.4.5.1. A startx működése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
vi
5.4.5.2. Az X session indulása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122 5.4.5.3. Az xorg.conf fájl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 5.4.6. Kliens futtatása távoli gépen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 5.4.6.1. Jogosultság beállítása az X szerveren . . . . . . . . . . . . . . . . . . . . 124 5.4.6.1.1.
Xhost . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
5.4.6.1.2.
Xauth . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
5.4.6.2. Az X kliens kimenetének átirányítása . . . . . . . . . . . . . . . . . . . . 125 5.4.6.3. SSH X forward . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 5.4.7. Grafikus konfigurációs eszközök . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 5.4.7.1. A felhasználók adminisztrálása . . . . . . . . . . . . . . . . . . . . . . . . 126 5.4.7.2. A folyamatok monitorozása . . . . . . . . . . . . . . . . . . . . . . . . . . 126 5.4.7.3. Futásszintek beállításai . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128 5.4.7.4. Log állományok tanulmányozása . . . . . . . . . . . . . . . . . . . . . . . 128 5.4.7.5. Rendszer csomagok telepítése és eltávolítása . . . . . . . . . . . . . . . . 129 6. Hálózat-konfiguráció, SSH, FTP, NFS, Samba 6.1. Röviden a TCP/IP hálózatokról
131
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
6.1.1. Kommunikáció a hálózaton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131 6.1.1.1. Lokális hálózat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131 6.1.1.2. Globális hálózat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 6.1.2. A TCP/IP protokoll ismertetése . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 6.1.2.1. Host to Network Layer . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 6.1.2.2. Internetwork Layer
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
6.1.2.2.1.
Internet Potocol . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
6.1.2.2.2.
Adress Resolution Protocol . . . . . . . . . . . . . . . . . . . . . 135
6.1.2.2.3.
Internet Control Message Protocol . . . . . . . . . . . . . . . . . 135
6.1.2.3. Transport Layer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 6.1.2.3.1.
Transmission Control Protocol . . . . . . . . . . . . . . . . . . . 135
6.1.2.3.2.
User Datagram Protocol . . . . . . . . . . . . . . . . . . . . . . 135
6.1.2.4. Application Layer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 6.2. Hálózati eszközök . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 6.3. A hálózati interfészek konfigurálása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 6.3.1. Red Hat konfigurációs szkriptek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138 6.3.2. Az /etc/network/interfaces állomány . . . . . . . . . . . . . . . . . . . . . . . . . . 138 6.3.3. Az Ethernet interfész . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138 6.3.4. Az Alias interfész . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 6.3.5. Egyéb interfészek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 6.3.6. Interfész kontroll szkriptek
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
6.3.7. Grafikus konfiguráció . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 6.4. Útválasztás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 6.5. Névleképezés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142 vii
6.6. A Network Configuration program . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142 6.7. Hálózati szolgáltatások automatikus indítása . . . . . . . . . . . . . . . . . . . . . . . . . 143 6.8. TCP Wrapper . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146 6.9. Távoli shell alapú elérés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 6.10. Állományok átvitele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148 6.11. Állományok megosztása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 6.11.1. FTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 6.11.2. NFS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 6.12. Samba . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 6.12.1. A működő szerver vizsgálata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 6.12.2. A konfiguráció . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 6.12.2.1. Alap szerver beállítások . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 6.12.2.2. Autentikációs beállítások . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 6.12.2.3. Felhasználók importálása az smbpasswd állományba . . . . . . . . . . . . 155 6.12.2.4. Megosztások . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 6.12.2.5. Konfiguráció ellenőrzése . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 6.12.3. Grafikus konfigurálás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 7. Webszerver, PHP, Drupal, AWStats
159
7.1. Webszerver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 7.1.1. Globális beállítások
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
7.1.1.1. Port és interfész használat . . . . . . . . . . . . . . . . . . . . . . . . . . 160 7.1.1.2. Server-Pool beállítások . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160 7.1.1.3. Dynamic Shared Object (DSO) . . . . . . . . . . . . . . . . . . . . . . . . 161 7.1.2. A fő szerver szekció
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
7.1.2.1. Jogosultság beállítások . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 7.1.2.2. Adminisztratív cím . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 7.1.2.3. A szerver azonosítása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 7.1.2.4. A dokumentum könyvtár . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 7.1.2.5. Könyvtár beállítások . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 7.1.2.6. Felhasználói könyvtárak . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 7.1.2.7. Az alapértelmezett index állomány . . . . . . . . . . . . . . . . . . . . . . 163 7.1.2.8. A .htaccess állomány . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 7.1.2.9. MIME típus beállítások . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 7.1.2.9.1.
Az alapértelmezett MIME típus . . . . . . . . . . . . . . . . . . 164
7.1.2.10. Logolás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 7.1.2.11. A dokumentum-könyvtáron kívüli könyvtárak elérése . . . . . . . . . . . 164 7.1.2.12. Átirányítás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 7.1.2.13. A szerver által generált index lista . . . . . . . . . . . . . . . . . . . . . . 164 7.1.2.14. Nyelvi beállítások . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 7.1.2.15. További kiterjesztés leképezések . . . . . . . . . . . . . . . . . . . . . . . 165 viii
7.1.2.16. Hibajelzések . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 7.1.2.17. Egyéni browser beállítások . . . . . . . . . . . . . . . . . . . . . . . . . . 165 7.1.2.18. Apache mint proxy szerver . . . . . . . . . . . . . . . . . . . . . . . . . . 165 7.1.3. Virtuális szerverek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 7.1.4. Védett könyvtár létrehozása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166 7.1.5. SSL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 7.1.6. Grafikus konfigurációs eszköz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 7.2. A PHP beállítása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 7.2.1. A mod_rewrite modul használata PHP esetén . . . . . . . . . . . . . . . . . . . . 169 7.2.2. A phpMyAdmin telepítése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 7.3. A Drupal tartalomkezelő rendszer telepítése . . . . . . . . . . . . . . . . . . . . . . . . . . 171 7.4. Az AWStats statisztikai programcsomag telepítése . . . . . . . . . . . . . . . . . . . . . . 171 8. Levelezés (protokollok, levelezőszerverek, spamszűrés)
175
8.1. SMTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 8.2. POP3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 8.3. IMAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176 8.4. A levelezőszerver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176 8.4.1. Sendmail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176 8.4.2. Postfix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 8.4.3. Dovecot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185 8.5. Procmail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187 8.6. Spamszűrés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187 8.7. Squirrelmail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 9. Hálózatdiagnosztika, hálózatok feltörése, Certificate Authority, snort
193
9.1. Hálózatdiagnosztika . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 9.1.1. Ping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 9.1.2. Traceroute . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 9.1.3. LFT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194 9.1.4. Netstat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194 9.1.5. Nmap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 9.1.6. Tcpdump . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 9.1.7. Wireshark . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 9.1.7.1. Egyszerű monitorozás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196 9.1.7.2. A TCP kommunikáció követése . . . . . . . . . . . . . . . . . . . . . . . . 198 9.1.8. Whois . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198 9.2. Hálózatok feltörése, avagy mennyire nyilvános a kommunikációnk . . . . . . . . . . . . . . 199 9.2.1. ARP poisoning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200 9.2.2. Ettercap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201 9.2.3. Aircrack-ng . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
ix
9.2.3.1. Az aircrack-ng alapszintű használata . . . . . . . . . . . . . . . . . . . . . 203 9.2.3.2. SSID rejtése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205 9.2.3.3. MAC szűrés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205 9.2.3.4. WEP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205 9.2.3.5. WPA/WPA2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207 9.2.3.6. Összegzés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208 9.3. Certificate Authority . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208 9.3.1. A valós élet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 9.3.2. OpenSSL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210 9.3.3. Az openssl.cnf állomány . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210 9.3.4. A CA segédprogram . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210 9.3.5. A Certificate Authority létrehozása . . . . . . . . . . . . . . . . . . . . . . . . . . . 210 9.3.6. A tanúsítvány lecsupaszítása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211 9.3.7. A szöveges információk megtekintése . . . . . . . . . . . . . . . . . . . . . . . . . . 211 9.3.8. Tanúsítványok létrehozása és aláírása . . . . . . . . . . . . . . . . . . . . . . . . . . 211 9.3.9. A jelszó eltávolítása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211 9.3.10. A tanúsítvány visszavonása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212 9.3.11. A tanúsítvány megújítása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212 10.Tűzfalak
213
11.Naplófeldolgozás
214
12.PAM, DNS, DHCP
215
12.1. PAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215 12.1.1. Konfigurációs állományok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215 12.1.2. A konfigurációs állományok szintaktikája . . . . . . . . . . . . . . . . . . . . . . . 215 12.1.3. Példa konfigurációs állomány . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216 12.1.4. Konzol jogosultságok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218 12.1.5. További beállítások . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218 12.2. DNS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219 12.2.1. A DNS feladata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219 12.2.2. Helyi feloldás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219 12.2.3. A névfeloldás folyamata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 12.2.4. BIND konfiguráció . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 12.2.5. A reverse DNS beállítása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224 12.2.6. BIND futtatása chroot környezetben . . . . . . . . . . . . . . . . . . . . . . . . . . 224 12.3. DHCP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225 12.3.1. A DCHP feladata
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
12.3.2. DCHP konfiguráció . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225 12.3.2.1. Dinamikus host . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226 12.3.2.2. Statikus hoszt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227 x
12.3.3. A dhcpd indítása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227 13.Verziókezelő rendszerek
228
13.1. CVS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228 13.2. Subversion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228 13.2.1. A Subversion beüzemelése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229 13.2.1.1. Szerver-beállítások . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229 13.2.1.1.1. SVN tároló létrehozása, fájlok importálása . . . . . . . . . . . . 230 13.2.1.2. Hozzáférés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230 13.2.1.2.1. Közvetlen hozzáférés . . . . . . . . . . . . . . . . . . . . . . . . . 230 13.2.1.2.2. Hozzáférés WebDAV protokollal . . . . . . . . . . . . . . . . . . 231 13.2.1.2.3. Hozzáférés SSL titkosított WebDAV protokollal . . . . . . . . . 232 13.2.1.2.4. Hozzáférés saját protokollal . . . . . . . . . . . . . . . . . . . . . 232 13.2.1.2.5. Hozzáférés SSL titkosított saját protokollal . . . . . . . . . . . . 233 13.3. Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233 13.3.1. A Git beüzemelése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233 13.3.2. Új projekt hozzáadása a tárolóhoz . . . . . . . . . . . . . . . . . . . . . . . . . . . 235 13.3.3. Az első projekt commitolása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236 13.3.4. Felhasználók hozzáadása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236 13.3.5. Elérés böngészőből . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237 13.3.6. Publikus tároló létrehozása . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239 13.3.7. A git daemon kezelése . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241 13.4. SVN vagy Git? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
xi
1.
Bevezetés
1.1.
A Linux
A Linux szónak több jelentése is van. Technikailag pontos definíciója a következő: A Linux szabadon terjeszthető, Unix-szerű operációs rendszer-kernel. A legtöbb ember a Linux szó hallatán azonban a Linuxkernelen alapuló teljes operációs rendszerre gondol. Így általában az alábbiakat értjük rajta: A Linux szabadon terjeszthető, Unix-szerű operációs rendszer, amely tartalmazza a kernelt, a rendszereszközöket, programokat, és a teljes fejlesztői környezetet. A továbbiakban mi is a második jelentését vesszük alapul, vagyis a Linuxot mint operációs rendszer mutatjuk be. A Linux kiváló, ingyenes platformot ad a programok fejlesztéséhez. Az alapvető fejlesztőeszközök a rendszer részét képezik. Unix-szerűségéből adódóan, programjainkat könnyen átvihetjük majdnem minden Unix- és Unix-szerű rendszerre. További előnyei: • a teljes operációs rendszer forráskódja szabadon hozzáférhető, használható, vizsgálható és szükség esetén módosítható; • ebbe a körbe bele tartozik a kernel is, így komolyabb, a kernel módosítását igénylő problémák megoldására is lehetőségünk nyílik; • mivel a stabil és a fejlesztői kernel vonala jól elkülönül, ezért célrendszerek készítésénél szabadon választhatunk, hogy stabil, vagy a legújabb fejlesztéseket tartalmazó rendszerre van szükségünk; • a Linux fejlesztése nem profitorientált fejlesztők kezében van, így fejlődésekor csak technikai szempontok döntenek, marketinghatások nem befolyásolják; • a Linux-felhasználók és -fejlesztők tábora széles és lelkes. Ennek következtében az interneten nagy mennyiségű segítség és dokumentáció lelhető fel. A Linux története 1991-re nyúlik vissza. Linus Torvalds a helsinki egyetem diákja ekkor kezdett bele a projektbe. Eredetileg az Andrew S. Tanenbaum által tanulmányi célokra készített Minix operációs rendszerét használta a gépén. A Minix az operációs rendszerek működését, felépítését volt hivatott bemutatni, ezért egyszerűnek, könnyen értelmezhetőnek kellett maradnia. Emiatt nem tudta kielégíteni Linus igényeit, aki ezért belevágott egy saját, Unix-szerű operációs rendszer fejlesztésébe. Eredetileg a Linux-kernelt gyenge licenccel látta el, amely csak annyi korlátozást tartalmazott, hogy a Linux-kernel nem használható fel üzleti célokra. Azonban ezt rövidesen GPL-re cserélte. A GPL feltételei lehetővé tették más fejlesztőknek is, hogy csatlakozzanak a projekthez, és segítsék munkáját. A GNU C-library projektje lehetővé tette alkalmazások fejlesztését is a rendszerre. Gyorsan követték ezeket a gcc, bash, Emacs programok portolt változatai. Így az 1992-es év elején már aránylag könnyen lehetett telepíteni a Linux 0.95-ös verzióját a legtöbb Intel-gépen. A Linux-projekt már a kezdetektől szorosan összefonódott a GNU-projekttel. A GNU-projekt forráskódjai fontosak voltak a Linux-közösség számára, rendszerük felépítéséhez. A rendszer további jelentős részletei a kaliforniai Berkley egyetem nyílt Unix forráskódjaiból, illetve az X konzorciumtól származnak. 1
A különböző Unix-fajták egységesített programozói felületének létrehozására született meg a C nyelven definiált POSIX (Portable Operating System Interface) szabvány. A szó végén az X a Unix világra utal, amit a Linux implementálásakor is messzemenőkig figyelembe vettek. Ahogy a Linux fejlődött, egyre többen foglalkoztak a telepítést és a használatot megkönnyítő disztribúciók készítésével. A Slackware volt az első olyan csomag, amelyet már komolyabb háttértudás nélkül is lehetett telepíteni és használni. Megszületése nagyban elősegítette a Linux terjedését, népszerűségének növekedését. A Red Hat a társaihoz képest viszonylag későn született, de napjaink egyik legnépszerűbb üzleti disztribúciója lett. Fejlesztőinek célja egy stabil, biztonságos, könnyen telepíthető és használható csomag készítése volt. A Red Hat cég termékeihez támogatást, tanfolyamokat, könyveket is nyújt. A fentieken kívül, megemlítjük még a Debiant, valamint a magyar nyelvű és magyarok által gondozott UHU Linuxot is. A Linux-disztribúciók általában a fejlesztői könyvtárakat, fordítókat, értelmezőket, parancsértelmezőket, alkalmazásokat, segédprogramokat, konfigurációs eszközöket és még sok más komponenst is tartalmaznak a Linux-kernel mellett. Napjainkban már sok Linux-disztribúcióval találkozhatunk. Mindegyiknek megvannak az előnyei, hátrányai, hívői. Azonban mindegyik ugyanazt a Linux-kernelt és ugyanazokat a fejlesztői alapkönyvtárakat tartalmazza. [1] 1.1.1.
A szabad szoftver
A számítástechnika hajnalán a cégek kis jelentőséget tulajdonítottak a szoftvereknek. Első sorban a hardvert szándékozták eladni, a szoftvereket csak járulékosan adták hozzá, üzleti jelentőséget nem tulajdonítottak neki. Ez azt eredményezte, hogy a forráskódok, algoritmusok szabadon terjedhettek. Azonban ez az időszak nem tartott sokáig, a gyártók hamar rájöttek a szoftverben rejlő üzleti lehetőségekre, és ezzel beköszöntött a zárt forráskódú programok korszaka. Az intellektuális eredményeket a cégek levédik, és szigorúan őrzik. Ezek a változások nem nyerték el Richard Stallman tetszését. Ennek hatására megalapította az FSF (Free Software Foundation) nevű szervezetet Cambridge-ben. Az FSF célja szabadon terjeszthető szoftverek fejlesztése. A kifejezésben a free szabadságot jelent, nem ingyenességet. Hite szerint a szoftvernek és a hozzátartozó dokumentációnak, forráskódnak szabadon hozzáférhetőnek és terjeszthetőnek kell lennie. Ennek elősegítésére megalkotta (némi segítséggel) a GPL-t (General Public License, magyarul általános felhasználói licenc). 1.1.1.1.
A Linux licence
A Linux kernelt a 2. verziójú GNU General Public License szerint licencelik. Ezt a licencet nem is akarják lecserélni a 2007. júniusában megszületett GNU GPLv3-ra, de nem is nagyon lehetne, mivel a Linux kernel készítésében eddig több száz ember közreműködött, akiknek a beleegyezése szükséges a licencváltáshoz, ami ezért ma már gyakorlatilag kivitelezhetetlen. Az alábbiakban a GPLv2 licenc magyar nyelvű fordításának egy részlete olvasható. [2]
2
1. A program forráskódja módosítás nélkül másolható és bármely adathordozón terjeszthető, feltéve, hogy minden egyes példányon pontosan szerepel a megfelelő szerzői jogi megjegyzés, illetve a garanciavállalás elutasítása; érintetlenül kell hagyni minden erre a szabályozásra és a garancia teljes hiányára utaló szöveget és a licencdokumentumot is el kell juttatni mindazokhoz, akik a programot kapják. Felszámítható díj a másolat fizikai továbbítása fejében, illetve ellenszolgáltatás fejében a programhoz garanciális támogatás is biztosítható. 2. A program vagy annak egy része módosítható, így a programon alapuló munka jön létre. A módosítás ezután az 1. szakaszban adott feltételek szerint tovább terjeszthető, ha az alábbi feltételek is teljesülnek: (a) A módosított fájlokat el kell látni olyan megjegyzéssel, amely feltünteti a módosítást végző nevét és a módosítások dátumát. (b) Minden olyan munkát, amely részben vagy egészben tartalmazza a programot vagy a programon alapul, olyan szabályokkal kell kiadni vagy terjeszteni, hogy annak használati joga harmadik személy részére licencdíjmentesen hozzáférhető legyen, a jelen dokumentumban található feltételeknek megfelelően. (c) Ha a módosított program interaktívan olvassa a parancsokat futás közben, akkor úgy kell elkészíteni, hogy a megszokott módon történő indításkor megjelenítsen egy üzenetet a megfelelő szerzői jogi megjegyzéssel és a garancia hiányára utaló közléssel (vagy éppen azzal az információval, hogy miként juthat valaki garanciához), illetve azzal az információval, hogy bárki terjesztheti a programot a jelen feltételeknek megfelelően, és arra is utalást kell tenni, hogy a felhasználó miként tekintheti meg a licenc egy példányát. (Kivétel: ha a program interaktív ugyan, de nem jelenít meg hasonló üzenetet, akkor a programon alapuló munkának sem kell ezt tennie.) Ezek a feltételek a módosított munkára, mint egészre vonatkoznak. Ha a munka azonosítható részei nem a programon alapulnak és független munkákként elkülönülten azonosíthatók, akkor ez a szabályozás nem vonatkozik ezekre a részekre, ha azok külön munkaként kerülnek terjesztésre. Viszont, ha ugyanez a rész az egész részeként kerül terjesztésre, amely a programon alapuló munka, akkor az egész terjesztése csak a jelen dokumentum alapján lehetséges, amely ebben az esetben a jogokat minden egyes felhasználó számára kiterjeszti az egészre tekintet nélkül arra, hogy melyik részt ki írta. E szövegrésznek tehát nem az a célja, hogy mások jogait elvegye vagy korlátozza a kizárólag saját maga által írt munkákra; a cél az, hogy a jogok gyakorlása szabályozva legyen a programon alapuló illetve a gyűjteményes munkák terjesztése esetében. Ezenkívül más munkáknak, amelyek nem a programon alapulnak, a programmal (vagy a programon alapuló munkával) közös adathordozón vagy adattárolón szerepeltetése nem jelenti a jelen szabályok érvényességét azokra is.
3
3. A program (vagy a programon alapuló munka a 2. szakasznak megfelelően) másolható és terjeszthető tárgykódú vagy végrehajtható kódú formájában az 1. és 2. szakaszban foglaltak szerint, amennyiben az alábbi feltételek is teljesülnek: (a) a teljes, gép által értelmezhető forráskód kíséri az anyagot, amelynek terjesztése az 1. és 2. szakaszban foglaltak szerint történik, jellemzően szoftverterjesztésre használt adathordozón; vagy, (b) legalább három évre szólóan írásban vállalja, hogy bármely külső személynek rendelkezésre áll a teljes gép által értelmezhető forráskód, a fizikai továbbítást fedező összegnél nem nagyobb díjért az 1. és 2. szakaszban foglaltak szerint szoftverterjesztésre használt adathordozón; vagy, (c) a megfelelő forráskód terjesztésére vonatkozóan megkapott tájékoztatás kíséri az anyagot. (Ez az alternatíva csak nem kereskedelmi terjesztés esetén alkalmazható abban az esetben, ha a terjesztő a programhoz a tárgykódú vagy forráskódú formájában jutott hozzá az ajánlattal együtt a fenti b. cikkelynek megfelelően.) Egy munka forráskódja a munkának azt a formáját jelenti, amelyben a módosításokat elsődlegesen végezni szokás. Egy végrehajtható program esetében a teljes forráskód a tartalmazott összes modul forráskódját jelenti, továbbá a kapcsolódó felületdefiníciós fájlokat és a fordítást vezérlő parancsfájlokat. Egy speciális kivételként a forráskódnak nem kell tartalmaznia normál esetben a végrehajtható kód futtatására szolgáló operációs rendszer főbb részeiként (kernel, fordítóprogram stb.) terjesztett részeit (forrás vagy bináris formában), kivéve, ha a komponens maga a végrehajtható állományt kíséri. Ha a végrehajtható program vagy tárgykód terjesztése a forráskód hozzáférését egy megadott helyen biztosító írásban vállalja, akkor ez egyenértékű a forráskód terjesztésével, bár másoknak nem kell a forrást lemásolniuk a tárgykóddal együtt.
1.2.
A Linux rendszermag áttekintése
Ebben a fejezetben a Linux-kernel egyes részeivel ismerkedünk meg. A következőkben leírtak elsajátítása nem elengedhetetlen a jegyzet további fejezeteinek megértéséhez, azonban megvilágítja, hogy mi zajlik le a programok futása közben a rendszer belső magjában, ezáltal hasznos háttérinformációkat szolgáltathat a fejlesztők és a rendszeradminisztrátorok számára. 1.2.1.
A Linux-kernel felépítése
Egy operációs rendszer magjának strukturális felépítésénél két alapvető választásunk van. Választhatunk a mikrokernel és monolitikus kernel struktúra közül. A mikrokernel struktúrában a kernelt több különálló, kernel módban futó processz alkotja, amelyek egymással kommunikálnak. Az igazi kernel csak a legszükségesebb funkciókat implementálja, úgymint a processzek közötti kommunikáció és a memóriakezelés. Ezek segítségével már megvalósítható a többi modul, és felépíthető a kernel. A mikrokernel egyik előnye a flexibilitása, az egyes modulok egymástól elkülönülten dolgoznak, könnyen lecserélhetőek akár menet közben is. Ebből adódik a másik előnye, hogy 4
csak az éppen szükséges kernelmodulokat kell a memóriában tartani. Hátránya, hogy az egyes modulok jól meghatározott interfészekkel kapcsolódnak, ezáltal lehetetlen bármilyen optimalizáció a modulok között. A monolitikus kernel a mikrokernellel szemben egyetlen nagy program, amely minden funkciót tartalmaz. Habár egyes részeit modulokra oszthatjuk, futás közben továbbra is csak egy nagy program. Ebből következően mikrokernelnél látható jól definiált kommunikációs vonalak helyett a kernel egyes részei közvetlenül hívhatják egymást. Így a monolitikus kernel a mikrokernellel szemben gyorsabb, jobban optimalizálható. Mint láthatjuk a mikrokernel képviseli a flexibilitást, a monolitikus kernel pedig a hatékonyságot. Az operációs rendszerek magjának jelenlegi fejlődési irányvonala a mikrokernelek irányába mutat, a fejlesztők általában ezt részesítik előnyben (pl. Microsoft Windows NT rendszerek), ezzel szemben a Linux a monolitikus irányvonalat képviseli. Ennek történelmi okai vannak. A kezdeti lépések a monolitikus kernel esetében jóval egyszerűbbek, nem igénylik a rendszer alapos megtervezését, mint mikrokernel struktúra esetén, így Linus számára a monolitikus kernel célszerűbb választásnak bizonyult. A másik ok, hogy a Linux először az aránylag lassú i386-os architektúrán jelent meg, ezért fontos volt a rendszer optimalizálása a megfelelő teljesítmény érdekében. A Linux-kernel amellett, hogy monolitikus, kellően moduláris felépítésű, hogy a fejlesztése, a változtatások ne okozzanak problémát. Továbbá a betölthető modulok révén lehetőségünk nyílik arra, hogy a kernel egyes részeit futás közben betöltsük, esetleg lecseréljük. Így a Linux kernel nem tisztán monolitikus, hanem többé-kevésbé tartalmazza a mikrokernelek előnyös vonásait is. A fejlesztők ezért nem látták szükségesnek, hogy az idők során valódi mikrokernel-struktúrára alakítsák át a rendszer magját. A struktúrák alapjainak megismerése után nézzük meg, milyen részekre oszthatjuk fel a Linux kernelt. (Az 1. ábrán látható felosztás vázlatos, a könnyebb megérhetőség érdekében nem tér ki a rendszer minden részletére.) A felhasználói programok a rendszerhívásokon keresztül kérhetik a kerneltől a kívánt szolgáltatásokat. Ezeket a rendszerhívásokat a programok általában a rendszerkönyvtárak segítségével érik el. A fájlrendszerek magasabb színtű absztrakciót nyújtanak a perifériák kezelésére. Ennek az alrendszernek a segítségével kezelhetünk állományokat, könyvtárakat az egyes eszközökön, de a fájlkezelés műveleteivel férhetünk hozzá például a soros portokhoz is. A hálózati réteg a különböző hálózati protokollok implementációját tartalmazza. A perifériakezelő alrendszer az eszközök alacsonyszintű kezelését valósítja meg. Hozzá tartozik a háttértárolók, I/O-eszközök, soros, párhuzamos és egyéb portok kezelése. A processzkezelő alrendszer több, a processzek kezelésével kapcsolatos funkciót valósít meg: • A Linux többfeladatos (multitask) rendszer, ami azt jelenti, hogy több processzt futtat párhuzamosan vagy majdnem párhuzamosan. Azt, hogy az egyes processzek mikor jussanak a processzorhoz, az ütemező dönti el. • A processzeknek általában szükségük van arra, hogy egymással kommunikáljanak. Ezt az IPC (Inter-process Communication, processzek közötti kommunikáció) alrendszer teszi lehetővé. • A fizikai memória kiosztását a processzek között a memóriakezelő alrendszer végzi el. [1]
5
Felhasználói processzek
Rendszerkönyvtárak Kernel
Rendszerhívások
Processzkezelés Fájlrendszerek
Ütemező Memóriakezelés
Hálózati réteg IPC
Perifériák kezelése
Hardver 1. ábra. A Linux kernel vázlatos felépítése
1.3.
Belépés
A szokásos bejelentkezés nem tér el a más rendszereknél is használt egyszerű felhasználónév, jelszó alapú azonosítástól. Azonban általában a Linux rendszerek egyszerre két felületet is nyújtanak a felhasználó felé. Egyrészt a szöveges, virtuális konzolokat, másrészt egy grafikus felületet (X Window System) 1 . Mivel a Linux nagymértékben konfigurálható, ezért az egyes rendszereknél a beállítások eltérhetnek. Mi a disztribúciók által általánosan használtakat tekintjük most át.
1.4.
Virtuális konzolok
A terminálok használata a korai időkre vezethető vissza. Eredetileg a Unix nagy számítógépek tipikus kezelői felületei a soros terminálok voltak, amelyek egyszerű karakterbevitelt, és a válaszkarakterek 1 A Linux rendszerek támogatják a hagyományos, soros portos terminálokat is, azonban a beágyazott rendszerek kivételével ezek használata manapság már nem tipikus.
6
megjelenítését tették lehetővé. Ez az idők folyamán fejlődött, és a terminál karakterek segítségével barátságosabb felületet nyújtottak. A személyi számítógépek, illetve a hálózatok fejlődése révén a soros terminálok használata háttérbe szorult, azonban egyszerűségük, uniformitásuk, elterjedtségük révén virtuális terminálokként tovább élnek. A Linux rendszerek a konzolon általában egyszerre hat ilyen virtuális terminált szimulálnak. Ezek között az Alt+F1–F6 gombokkal váltogathatunk. (Grafikus módról történő átváltás esetén: Ctrl+Alt+F1– F6.) Mindegyik egy teljes értékű szöveges terminál. Külön-külön mindegyiken bejelentkezhetünk valamely felhasználóként, és párhuzamosan dolgozhatunk. A később tárgyalt hálózaton keresztüli bejelentkezés esetén ugyanilyen szöveges terminál felületet kapunk. Egyes célrendszereknél grafikus kezelői felületet nem is telepítenek, mivel az csak az erőforrások pazarlása lenne. Ezért a szöveges felület kezelésének elsajátítása egy adminisztrátor számára alapvető.
Feladat 1. Lépjünk be! Red Hat Linux release 9 Kernel 2.4.18-14 on an i686 localhost login:
password: <jelszó> 2. Próbáljuk ki a következő parancsokat! pwd: Aktuális könyvtár. ls: Az aktuális könyvtár tartalma. echo: Kiírja a parancs után írt paramétert. exit: Kilépés.
1.5.
Grafikus felület
A rendszer indulásakor manapság elsőként a grafikus felülettel találjuk magunkat szembe. Azonban a virtuális konzolok használata után is visszakapcsolhatunk ide az Alt+F7 segítségével. Belépés után – más modern operációs rendszerekhez hasonlóan – egy grafikus ablakos felülettel találjuk magunkat szembe. Linuxnál az aktuális ablakozó rendszertől függően ez a felület változatos lehet. Jelenleg a legelterjedtebbek a Gnome és a KDE. Ezeknél a felületeknél, a más rendszereknél megszokott mechanizmusok ugyancsak használhatóak. Kisebb konfigurációk után a működést teljesen az általunk megszokott rendszerhez igazíthatjuk. A grafikus felületeken is elérhetjük a terminál emulációt. Ezt az xterm, kterm stb. programok teszik lehetővé. Így a terminál parancsokat itt is használhatjuk.
7
1.6.
A jelszó beállítása
Unix rendszereknél a jelszót a passwd parancs segítségével módosíthatjuk. A felhasználók csak a saját jelszavukat módosíthatják. Ehhez meg kell adniuk a régi jelszót (hogy egy magára hagyott terminálnál mások ne írhassák át), illetve kétszer az új jelszót.2 Rendszergazdaként bármelyik felhasználó jelszavát módosíthatjuk. Ilyenkor a passwd szintaxis a használatos.
1.7.
A legfontosabb parancs: man
A Linux (és Unix) elektronikus segítségnyújtó rendszerét a manuál oldalak adják. Ezeket az oldalakat a man paranccsal érhetjük el. Minden, a rendszerben található parancsról, segédprogramról, de még a függvényekről is az alábbi módon kérhetünk segítséget: man <parancs> Magáról a man parancsról is kaphatunk információt az alábbi módon: man man A leírások nyolc fejezetre (kötetre) oszlanak: 1. Általánosan használható programok 2. Rendszerhívások 3. Felhasználói szintű könyvtári függvények 4. Speciális állományok 5. Állományformátumok 6. Játékok 7. Különféle leírások 8. A rendszer karbantartásához szükséges információk Több fejezetben is lehetnek azonos nevű leírások. Például lehet azonos nevű program és rendszerfüggvény is. Ilyenkor az egyértelműség érdekében a fejezet számát is meg kell adni: man <parancs> Kulcsszavakra is kereshetünk: man -k
2 A rendszer a beállításától függően tesztelheti a megadott új jelszót és visszautasíthatja, ha túl „gyengének” találja. Linux alatt a legelterjedtebb a cracklib könyvtár alkalmazása, amely különböző szempontokból teszteli a megadott jelszót, illetve összehasonlítja a szóadatbázisával.
8
Feladat 1. Nézzük meg a man echo parancs által adott manuált! Vizsgáljuk meg milyen részekre oszlik! 2. Próbáljuk ki a man printf és a man 3 printf parancsokat! 3. Próbáljuk ki a man -k reset parancsot!
1.8.
A parancsformátum
A Linux parancsok a következő formátumot használják: parancs opció(k) argumentum(ok) A sor elején áll a parancs, vagy programnév. Ezt helyközzel elválasztva követik az opciók. Az opciók „-” jellel kezdődnek. Több opció is állhat egy „-” jel mögött, vagy megadhatjuk őket külön kötőjellel helyközökkel elválasztva. Időnként használatos a dupla kötőjel is. Az opciókat követik az argumentumok, szintén helyközzel elválasztva. Az argumentumok száma és sorrendje a parancstól függ. Például: ls -l /tmp
1.9.
Gyakran használt parancsok
Linux alatt a leggyakrabban a következő, egyszerű parancsokkal találkozhatunk. Fájlrendszer parancsok: cd: Könyvtárváltás. cmp: Bináris állományok összehasonlítása. cp: Állományok másolása. dd: Állományok konvertálása és másolása. diff: Szöveges állományok összehasonlítása. du: Lemezhasználat összegzése. find: Állományok keresése. ls: Könyvtár tartalmának listázása. mkdir: Új könyvtár létrehozása. mv: Állományok átnevezése vagy mozgatása. pwd: A munkakönyvtár elérési útjának kiírása.
9
rm: Állományok törlése. rmdir: Könyvtárak törlése. Szöveges állományok megtekintése: cat: Állományok kiírása, összefűzése, esetleg létrehozása. less: Állományok megjelenítése. (Görgethetjük, lapozhatjuk az állományt, és kereshetünk is benne.) more: Egyszerű program, amely a szöveges állományt oldalakra tördelve jeleníti meg.
1.10.
Szövegszerkesztők
A Linux története során leginkább az ebben a fejezetben tárgyalt eszközök terjedtek el. 1.10.1.
A vi szövegszerkesztő
A vi egy egyszerű szövegszerkesztő. Kezelését leginkább a gépelni tudók igényeihez alakították. A parancskészletét úgy állították össze, hogy a lehető legkevesebb kézmozgással használható legyen. Azonban egy tapasztalatlan felhasználó számára kezelése meglehetősen bonyolult lehet, ezért népszerűsége az utóbbi időben erősen megcsappant. 1.10.2.
A nano szövegszerkesztő
A nano egy egyszerű képernyő-orientált szövegszerkesztő. A legtöbb Linux rendszeren megtalálható. A nano a Pine levelező csomag részeként elterjedt pico leváltására született, ugyanis a pico lincence nem engedélyezte a módosított kód terjesztését. Elterjedten használják a kisebb szövegek gyors módosítására. Komolyabb feladatokra nem ajánlott, habár rendelkezik kódkiemelés funkcióval is. Ezekben az esetekben alkalmasabb a következő részben tárgyalt joe vagy egy a feladatnak megfelelően specializálódott szerkesztő. A program parancsai folyamatosan láthatók a képernyő alján (lásd 2. ábra). A „^” jel azt jelenti, hogy a billentyűt a Ctrl gomb nyomvatartása mellett kell használni. Ha ez esetleg a terminál típusa miatt nem működne, akkor a dupla Esc gombnyomást is alkalmazhatjuk helyette. Főbb funkciói és parancsai: Keresés: A keresés nem case szenzitív, valamint az aktuális kurzor pozíciótól kezdődik. Blokk „cut and paste”: Blokk műveleteket a kijelölés (Ctrl+^), a delete (Ctrl+K), és undelete (Ctrl+U) parancsokkal végezhetünk. Kreatív használat esetén mozgathatunk, másolhatunk, vagy törölhetünk részeket. Helyesírás-ellenőrző: A SPELL környezeti változóban, vagy programindításkor az -s kapcsoló után megadott helyesírás-ellenőrző programot használja.
10
Billentyűkombináció
Parancs
Ctrl+G
Segítség
Ctrl+X
Kilépés (módosítás esetén rákérdez a mentésre)
Ctrl+O
Az állomány kiírása
Ctrl+R
Állomány beolvasása és beillesztése a szerkesztett állományba
Ctrl+W
Szó keresése
Ctrl+Y
Ugrás az előző oldalra
Ctrl+V
Ugrás a övetkező oldalra
Ctrl+K
Szövegrész kivágása
Ctrl+U
Az utoljára kivágott rész beillesztése az adott kurzor pozícióra (többször is vissza lehet illeszteni, vagyis másolni lehet vele)
Ctrl+C
Aktuális kurzorpozíció kiírása
Ctrl+T
Helyesírás-ellenőrzés
1. táblázat. A nano leggyakoribb billentyűkombinációi
2. ábra. A nano felülete 1.10.3.
A joe szövegszerkesztő
A joe egy elterjedten használt szövegszerkesztő. Komolyabb feladatokra is alkalmas, mint a pico, vagy a nano. Egyszerre több állományt is megnyithatunk különböző opciókkal. Komolyságát a parancsok számából is láthatjuk, amelyek leírását a Ctrl+K+H gombokkal hozhatunk elő és tüntethetünk el. A „^” jel itt is azt jelenti, hogy a billentyűket a Ctrl gomb nyomva tartása mellett 11
kell használni. Mindazokra a funkciókra képes, amelyekre a pico és még sok továbbira is.
3. ábra. A joe felülete
Billentyűkombináció
Parancs
Ctrl+KF
Szöveg keresése
Ctrl+L
Ismételt keresés
Ctrl+KB
Blokk elejének kijelölése
Ctrl+KK
Blokk végének kijelölése
Ctrl+KM
Blokk mozgatása
Ctrl+KC
Blokk másolása
Ctrl+KY
Blokk törlése
Ctrl+Y
Sor törlése
Ctrl+_
Változtatás visszaléptetése
Ctrl+KD
Mentés
Ctrl+KX
Kilépés mentéssel
Ctrl+C
Kilépés mentés nélkül
2. táblázat. A joe leggyakoribb billentyűkombinációi
12
2. 2.1.
Állományok, állományrendszerek Állomány típusok
A Linux fájlrendszerében a következő állománytípusokat különböztetjük meg: Egyszerű állomány: Az egyszerű állományok azok, amelyekre először gondolnánk az állomány szó hallatán, vagyis bájtok sorozata, adatok, programok stb. A Linux minden állományt egyszerűen bájtok véletlenszerűen címezhető szekvenciájának tekinti. A rendszer eltakarja az állományt tároló fizikai eszköz tulajdonságait. Az állomány mérete az általa tartalmazott bájtok számával azonos. Könyvtár: A könyvtár speciális állomány, amely olyan információkat tartalmaz, amire a rendszernek szüksége van az állományok elérésére. A régi Unix rendszerekben az implementációk megengedték, hogy közvetlenül, állományként kezeljük a könyvtárakat, és megnézzük a tartalmukat. A Linux programok ezzel szemben hibával térnek vissza, ha ilyesmivel próbálkozunk. (Leszámítva a less parancsot, amely a könyvtárról egy olyan listát ad vissza, mintha az ls -l parancsot használtuk volna.) Eszközök: A legtöbb fizikai eszköz a Unix rendszereken, mint állomány jelenik meg. Ez azt jelenti, hogy ezekre az eszközökre állománynevekkel hivatkozhatunk, és ugyanúgy kezelhetjük őket, mint a közönséges állományokat. Írhatjuk, olvashatjuk, azonban ezeket a műveleteket természetesen az adott eszközre értelmezhető műveletre képezi le a kernel. (Például egy hangkártya eszköz olvasása a hang bedigitalizálását jelenti, az írása pedig a hang állomány lejátszását.) Két eszköztípust különböztetünk meg: blokk és karakter típusú eszközök. A blokkos eszköz állomány egy olyan hardver eszközt reprezentál, amelyet nem olvashatunk bájtonként, csak bájtok blokkjaiként. A blokkos eszközök leggyakrabban háttértárak, és fájlrendszert tartalmaznak. A karakteres eszköz bájtonként olvasható. A modemek, terminálok, printerek, hangkártyák és az egér mind-mind karakteres eszköz. Tradicionálisan az eszköz leíró speciális állományok a /dev könyvtárban találhatóak. Szimbolikus link: A szimbolikus link (röviden symlink ) egy speciális állomány, amely egy másik állomány elérési információit tartalmazza. Amikor megnyitjuk, a rendszer érzékeli, hogy szimbolikus link, kiolvassa az értékét, és megnyitja a hivatkozott állományt. Ezt a műveletet a szimbolikus link követésének hívjuk. A linkekre és használatukra még később visszatérünk. Csővezeték (pipe) és socket állományok: A csővezeték és a socket állományok a Unix két egyszerű IPC (Inter-process Communication, folyamatok közötti kommunikáció) mechanizmusát alkotják. Speciális állományok, amelyek egy kommunikációs csatornát írnak le a memóriában.
2.2.
Hierarchikus állományrendszer
A Linux operációs rendszernél egy kitüntetett alap állományrendszer van (root partíció), amely a merevlemezen helyezkedik el. Ez az állományrendszer tartalmazza a gyökér könyvtárat. A gyökér katalógus több alkatalógust tartalmaz, amelyek további alkatalógusokat tartalmaznak. Így egy hierarchikus fa struktúra 13
alakul ki. Az alkatalógusok nevének elválasztására a „/” jel szolgál. Az állománynevekre az egyetlen megkötés az, hogy a „/” jelet nem tartalmazhatják (illetve a különböző implementációknál eltérő megkötések vannak az állománynév hosszára). További merevlemez-partíciókat, és egyéb tárolóeszközöket (floppy, CD-ROM, pendrive-ok, memóriakártyák) hozzá kell fűznünk ehhez a fához (mount). Így a könyvtárfában az adott csomópont alatt található az eszköz tartalma.3 Ezzel a módszerrel a programok számára teljesen átlátszó módon oldható meg a könyvtárstruktúra széttördelése az egyes háttértárakra. A könyvtárakban a „.” karakterrel kezdődő bejegyzések rejtettek, vagyis az egyszerű könyvtárlistán nem szerepelnek. Teljes, a rejtett állományneveket is tartalmazó listát az ls -a paranccsal jeleníthetünk meg. Minden katalógus tartalmaz két speciális bejegyzést: „.”, „..”. A „.” magát az aktuális katalógust jelenti. A „..” az aktuális katalógus szülő katalógusát jelenti, vagyis azt a katalógust, amelyben az aktuális katalógust létrehozták. (A gyökérkatalógusnál a „.” és a „..” is a gyökérre mutat.)
2.3.
A könyvtárfa áttekintése
Ez a fejezet a Filesystems Hierarchy Standard (FHS) [3] – szabad – szabványon alapul, amely megkísérel létrehozni egy szabványt, amely szerint felépíthető egy könyvtárfa egy Linux-rendszerben. Egy ilyen szabványos felépítésnek az az előnye, hogy könnyebb lesz írni vagy áthozni programokat Linux alá, illetve adminisztrálni egy linuxos gépet, ha minden a szokásos helyén található. A gyökér fájlrendszernek általában kisméretűnek kell lennie, mivel a kritikus fájlokat tartalmazza, és egy kicsi, ritkán módosított fájlrendszernek jobb esélye van a sérülések elkerülésére. Egy sérült gyökér fájlrendszer általában azt jelenti, hogy a rendszer nem képes elindulni (boot), legfeljebb különleges segítséggel (például hajlékonylemezről), és ezt nem érdemes kockáztatni. A gyökérkönyvtár (/) általában nem tartalmaz fájlokat, legfeljebb a szabványos rendszerfájlt, melynek szokásos neve /vmlinuz. Minden más fájl a gyökérkönyvtár alkönyvtáraiban helyezkedik el: /bin: A rendszerindítás során szükséges parancsok, melyeket (a rendszerindítás után) a normál felhasználók is használhatnak. /boot: A rendszerbetöltő (bootstrap loader), például a GRUB által használt fájlok könyvtára. A rendszermag fájl (kernel image) is gyakran itt van, nem a gyökérkönyvtárban. Ha több rendszermag fájl is van, a könyvtár gyorsan megnőhet, ezért célszerű lehet külön fájlrendszerre rakni. /dev: Eszközmeghajtók. /etc: Gépspecifikus konfigurációs állományok. /home: A könyvtár tartalmazza a felhasználók home könyvtárait, azaz minden igazi adatot a rendszerben. A home könyvtárak külön fájlrendszerbe való elkülönítése megkönnyíti a biztonsági mentéseket; a többi részt általában nem, vagy csak ritkábban kell elmenteni, mivel ritkábban változnak. /lib: Megosztott könyvtárak a gyökér fájlrendszer programjaihoz. 3A
koncepció jelentősen eltér pl. a Microsoft Windowsnál megszokott címkék használatától, ahol az egyes eszközöket betűk jelölik.
14
/mnt: Felcsatolási pontok a rendszergazda által létrehozott ideiglenes csatlakozásokhoz. A programoktól nem várható el, hogy automatikusan felcsatolódjanak a /mnt alá. A /mnt felosztható további alkönyvtárakra (például a /mnt/dosa lehet az MS-DOS formátumú hajlékonylemezek csatlakozási pontja, a /mnt/exta pedig az ext2-es hajlékonylemezeké). /proc: A /proc könyvtár egy látszólagos katalógus. Nem is lemezen létezik, hanem a rendszermag hozza létre a memóriában. Arra használják, hogy a rendszerről (eredetileg a processzekről – innen a neve) adjon információkat. A legfontosabb fájlok és könyvtárak közül néhánynak a leírása megtalálható lentebb. Részletes leírást a proc kézikönyv oldal ad. /root: A root felhasználó home könyvtára. A rendszer többi felhasználója számára rendszerint nem elérhető. /sbin: Hasonló a /bin könyvtárhoz, de az ebben lévő parancsokat nem a normál felhasználóknak szánták, noha szükség esetén használhatják (ha van rá engedélyük). Az /sbin rendszerint nincs benne a normál felhasználók alapértelmezett elérési útvonalában, viszont a root felhasználóéban igen. /tmp: Ideiglenes fájlok. A rendszerindítás után futó programoknak inkább a /var/tmp használata ajánlott a /tmp helyett, mivel az előbbi valószínűleg egy nagyobb kapacitású lemezen van. A /tmp gyakran a /var/tmp könyvtárra mutató szimbolikus link (symbolic link). /usr: Az /usr fájlrendszer gyakran nagyon nagy, mert lényegében minden programot ide telepítünk. Az /usr összes fájlja rendszerint egy Linux disztribúcióból származik; a helyileg telepített programok és egyéb anyagok az /usr/local alá kerülnek. Ez a módszer lehetővé teszi, hogy a rendszert a terjesztés egy új változatával frissítsük, vagy akár egy teljesen új terjesztéssel, anélkül, hogy minden programot újra kellene telepítenünk. /var: Olyan adatokat tartalmaz, melyek a rendszer normális üzemelése során megváltoznak. Ez rendszerspecifikus, azaz nem osztható meg a hálózaton más számítógépekkel. Az FHS-től – nagyon alapos indok nélkül – nem jó ötlet eltérni, mivel az FHS megpróbálja a Unix szokásokat és az aktuális tendenciákat követni, így a Linux rendszer ismerős lesz a más Unix rendszereken gyakorlatot szerzettek számára is. [4, 5] Ez természetesen nem jelenti azt, hogy egyes disztribúciókban ne lenne némi eltérés a könyvtárfa felépítésében, de a terjesztők általában ragaszkodnak a korábban megszokott, szabad szabványban felsorolt irányelvekhez.
2.4.
Linkek
Sok operációs rendszerben egy az egyes összerendelés van az állományok és az állománynevek között. (Minden állománynak egy neve van, és minden állománynév egy állományt jelöl.) A Unix a nagyobb rugalmasság érdekében szakított ezzel a koncepcióval. Az állomány egyetlen egyedi azonosítója az inode-ja (information node). Az állomány inode-ja tartalmaz minden információt az állományról, beleértve a jogokat, a méretét, a hivatkozások számát. A 15
katalógusok csak egy fájlnév-inode összerendelést tartalmaznak, ezért lehetséges, hogy egy katalógusból több néven, vagy különböző katalógusokból hivatkozzunk ugyanarra az inode-ra. Ezt a Unixban link nek hívják. Amikor különböző névvel hivatkozunk egy inode-ra, azt hard link nek hívják. Ebben az esetben az állomány addig létezik, amíg van rá mutató bejegyzés. Hard linket csak egy köteten (egy partíción, egy eszközön) belül hozhatunk létre. Azonban lehetséges ún. szimbolikus link ek létrehozása is. Ilyenkor különböző nevekkel hivatkozhatunk egy katalógus bejegyzésre. Ilyen módon különböző kötetek között is létrehozhatunk linkeket. Azonban mivel a link csak egy katalógus bejegyzésre mutat, ezért ha a bejegyzés megszűnik, akkor a link nem működik többé. Amíg a hard linket katalógusokra nem szokás (de lehetséges4 ) használni, addig a szimbolikus linkeket igen gyakran alkalmazzák katalógusok között is. Hard linket két katalógusbejegyzés között az ln segédprogrammal lehet létrehozni: ln Szimbolikus linket két katalógusbejegyzés között az ln segédprogrammal és annak -s kapcsolójának használatával lehet létrehozni: ln -s
Feladat 1. Hozzunk létre szövegszerkesztővel egy állományt! 2. Csináljunk egy hard és egy szimbolikus link et az adott állományra! 3. Az ls -il paranccsal listázzuk ki a könyvtár tartalmát! (A -i opció hatására az első oszlopban láthatjuk minden állomány inode számát.) Vizsgáljuk meg ezeket a számokat! 4. A lista harmadik oszlopában az állományra való hivatkozások számát láthatjuk. 5. Mindkét linken keresztül nézzük meg az állomány tartalmát! 6. Módosítsuk a linkeken keresztül az állomány tartalmát és nézzük meg a hatását! 7. Töröljük le az eredeti állományt, majd próbáljuk meg a linkeken keresztül megnézni a tartalmát! 8. Az ls -ail paranccsal vizsgáljuk meg az aktuális könyvtárban a „.” és „..” könyvtárakat. Magyarázzuk meg a hivatkozások számát! 4 A könyvtárak közötti link létrehozására csak a super-usernek van joga, mivel ezzel a módszerrel hurkot lehet képezni a fában, ami viszont a programok hibás működését eredményezheti.
16
2.5.
Az eszközállományok
Ebben a fejezetben felsoroljuk a leggyakoribb eszközállományokat. Egyes eszközök némelyike csak akkor működik, ha a kernelbe fordítják a megfelelő támogatást. Egyegy adott eszközre vonatkozóan érdemes elolvasni a rendszermag dokumentációját. A következő lista semmiképp sem törekszik a teljességre, sem a maximális részletességre. /dev/dsp: Digitális jelprocesszor. Ez az alapvető felület, amelyen keresztül a hangkártya és a hangokat létrehozó program kommunikál. Karakteres eszköz. /dev/fd0: Ez az első hajlékonylemez meghajtó. Ha több is van, akkor folyamatos számozást kapnak. Blokkos eszköz. /dev/fb0: Az első framebuffer -eszköz. A framebuffer egy absztrakciós réteg a programok és a grafikus hardver között. Tehát az alkalmazásoknak nem kell tudniuk arról, hogy milyen a grafikus hardver; elég annyi, hogyan kommunikáljanak a framebuffer meghajtó jól definiált és szabványosított API-jával (Application Programming Interface). Karakteres eszköz. /dev/hda: A /dev/hda az elsődleges IDE vezérlőn (controller en) lévő master IDE meghajtó. A /dev/hdb a slave meghajtó ugyanitt. A /dev/hdc és a /dev/hdd a másodlagos vezérlőn lévő master és slave meghajtók (ebben a sorrendben). Minden lemez partíciókra tagolódik. Az 1-től 4-ig tartó partíciók az elsődleges partíciók, az ötödiktől kezdődően pedig a logikai partíciók vannak a kiterjesztett partíciókon belül. Ezért az egyes partíciókra hivatkozó eszközfájlok több részből állnak. Például a /dev/hdc9 a 9-es partíciót jelenti (logikai partíció egy kiterjesztetten belül) a másodlagos IDE vezérlő master IDE meghajtóján. Blokkos eszköz. /dev/null: A null eszköz egy speciális fájl, amely minden beleírt adatot elvet, miközben az írási művelet sikeres. Az eszközből való olvasás nem ad vissza semmilyen adatot. Felfogható adatnyelő eszközként. (Érdemes olyan programok kimenetét átirányítani a /dev/null -ba, amelyeknek kimenetére nem vagyunk kíváncsiak.) Karakteres eszköz. /dev/lp0: Az első párhuzamos nyomtató. A sorban következő nyomtatók a lp1, lp2 stb. neveket kapják. Karakteres eszköz. /dev/sda: Az első SCSI, SATA vagy USB meghajtó. A /dev/sdb3 a második SCSI vagy SATA merevlemez harmadik partícióját jelöli. Blokkos eszköz. /dev/random és /dev/urandom: Ezek a kernel véletlenszám-generátorai. A /dev/random nem-determinisztikus generátor, azaz a következő szám értékét nem lehet kitalálni az előzőekből. A rendszer hardverelemeinek entrópiáját használja fel a számok generálására. Ha elfogy a használható entrópia, akkor várnia kell, amíg újra összegyűlik annyi, hogy újabb számokat olvashasson ki belőle.
17
A /dev/urandom hasonló elv szerint működik. Kezdetben ez is a rendszerhardver entrópiáját használja, de ha ez elfogy, akkor is folytatja a számok küldését, egy ál-véletlenszám-generátor képlet segítségével. A /dev/urandom-ot kevésbé biztonságosnak tartják, ha olyan életbe vágóan fontos célokról van szó, mint például titkos kulcspárok generálása. Ha a biztonság az elsődleges szempont, akkor a /dev/random használata javasolt, ha viszont a gyorsaság fontosabb, akkor megteszi a /dev/urandom is. Mindkettő karakteres eszköz. /dev/zero: Ennek segítségével egyszerűen juthatunk sok nullához. Valahányszor ezt az eszközt olvassuk, 0-át ad vissza. Ez olyankor lehet hasznos, ha például fix hosszúságú fájlra van szükség, de nem számít, mi a tartalma. Karakteres eszköz. [4, 5]
2.6.
Fájlrendszer típusok
A Linux számos fájlrendszer típust támogat. Ezek egy része használható a rendszerállományok tárolására is, másik része pedig az egyéb operációs rendszerekkel való együttműködés érdekében került a rendszerbe (FAT, VFAT, NTFS).5 A következőkben – a teljesség igénye nélkül – végigtekintjük a Linux által támogatott állományrendszereket. 2.6.1.
Minix
A Linux születésének hajnalán a fejlesztés a Minix operációs rendszer alatt történt. Egyszerűbb volt megosztani a háttértárolót a két rendszer között, mint egy új állományrendszert kifejleszteni. Ezért legelőszőr ennek a fájlrendszernek a támogatása került bele a Linux-ba. Azonban a minix állományrendszer túl sok korlátozást tartalmazott, ezért a fejlesztők idővel szükségesnek látták a lecserélését, ezért fejlesztették ki az extended filesystems nevű állományrendszert. 2.6.2.
Extended filesystems (ext, ext2, ext3, ext4)
Az ext, ext2, ext3 és ext4 állományrendszerek elsősorban a Linux számára lettek kifejlesztve. Az ext a minix egy továbbfejlesztése. Azonban még így is számos hiányossággal rendelkezett, és teljesítmény problémái is voltak, ezért szükségessé vált egy új rendszer kifejlesztése, amely az ext2 nevet kapta. A minix, ext, ext2, ext3 és ext4 állományrendszerek korlátainak összehasonlításához nézzük meg a következő táblázatot! 5 Bár nincsen valójában megkötés, hogy milyen állományrendszert használhatunk a rendszerállományok tárolására, azonban célszerű olyat választani, amelyik kompatibilis a Unix védelmi rendszerével. Ellenkező esetben számos problémával kell megküzdenünk.
18
Minix
Ext
Ext2
Ext3
Ext4
Max. méret
64 MB–2 TB
2 GB
4 TB–32 TB
2 TB–32 TB
1 EB6
Max. állomány méret
64 MB
2 GB
16 GB–2 TB
16 GB–2 TB
16 GB–16 TB
Max.fájlnév hossz
14/30/60 bájt
255 bájt
255 bájt
255 bájt
256 bájt
Három idő támogatása
nem
nem
igen
igen
igen
Bővíthető
nem
nem
igen
igen
igen
3. táblázat. Állományrendszerek összehasonlítása
Az ext3 állományrendszer az ext2 továbbfejlesztése. Lényegében az ext2 kibővítése a journaling mechanizmussal. A létező ext3 fájlrendszerek néhány parancs lefuttatásával migrálhatók ext4 fájlrendszerre. Ez azt jelenti, hogy formázás vagy az operációs rendszer újratelepítése nélkül javítható a teljesítmény, emelhető a tárolási limit és egyéb funkciók is elérhetőek. Az ext4 fájlrendszer az új adatstruktúráját csak az új adatoknál fogja használni, a régi struktúra érintetlen marad. Ez azt jelenti,hogy a korábban ext4-re átkonvertált fájlrendszert csak úgy lehet ext3má visszaalakítani, hogy a meglévő ext4-es fájlrendszerünket a noextents kapcsoló segítségével csatoljuk fel, és az új struktúrájú fájlokról másolatot készítünk, majd a tune2fs program segítségével töröljük a INCOMPAT_EXTENTS flaget. Ezek után ismét ext3-as fájlrendszert kapunk. Ext3 fájlrendszer esetén az egy könyvtáron belül létrehozható az alkönyvtárak maximális száma 32 000 volt. Az ext4-nél nem áll fenn ez a limit, korlátlan számú alkönyvtára lehet egy könyvtárnak. Ext4 állományrendszer használata esetén az fsck program nem ellenőrzi a használatlan inode-okat, ezért fájlrendszer-ellenőrzés kevesebb ideig tart. Fontos megjegyezni, hogy az fsck hozza létre a használatlan inode-ok listáját, ezért csak az fsck soron következő futása lesz gyorsabb. (Ext3 fájlrendszerről ext4 fájlrendszerre történő átállás előtt az fsck programnak mindenképp sikeresen le kell futnia az ext3-as fájlrendszeren.) 2.6.3.
Journaling állományrendszerek
A komolyabb állományrendszerek adatainak frissítése, összetettségükből adódóan több különálló írás műveletből áll. Ahhoz, hogy az állományrendszer konzisztens maradjon az összes írás műveletnek végre kell hajtódnia. Ha eközben egy áramkimaradás miatt a rendszer összeomlik, akkor a fájlrendszer egy köztes állapotban maradhat. Ilyenkor a következő bootolásnál a rendszer végig ellenőrzi az állományrendszert és megpróbálja ezeket a hibákat kijavítani. Azonban ez egy nagyobb partíción nagyon sokáig eltarthat, és nem is jár mindig sikerrel, ha a helyreállításhoz nincsenek meg a szükséges információk. A journaling állományrendszer eken ennek a problémának a megoldására születtek. Az állomány rendszer tartalmaz egy elkerített területet, melyet journal nak, vagy lognak neveznek. Mielőtt az állományrendszerhez hozzányúlna a rendszer, hogy az egyik állapotból eljusson egy újabb állapotba, előtte a 61
exabájt = 1 048 576 TB = 1018 bájt.
19
műveleteket feljegyzi ebbe az elkerített területbe. Majd ezek után végrehajtja az utasítást. Ha eközben a rendszer összeomlana, akkor a journal tartalmazza a szükséges információkat, amely alapján a művelet visszajátszható. Természetesen, ha a journal terület írása közben omlana össze a rendszer, akkor az állományrendszer konzisztens állapotban van, ezért nem igényel beavatkozást. A journaling fájlrendszer hátránya, hogy a több írásműveletből adódóan valamennyivel lassabb, mint a könyvelés nélküli társai. A Linux alatt a következő journaling állományrendszer ek léteznek: JFS: az IBM által kifejlesztett, elsősorban az IBM Enterprise szerverekben használatos fájlrendszer. XFS: a Silicon Graphics által kifejlesztett és használt fájlrendszer. ext3: az ext2 fájlrendszer kiegészítése. ext4: a 2.6.28-as kernel óta stabil, az ext3 utódja. ReiserFS, Reiser4: a Namesys által fejlesztett általános célú fájlrendszer. 2.6.4.
Más operációs rendszerek támogatása
A Linux számos, más operációs rendszerek által használt állományrendszer típust is támogat: FAT12, FAT16, FAT32, VFAT: a DOS és Microsoft Windows rendszerek által bevezetett fájlrendszerek. NTFS: a Microsoft Windows NT vonal, illetve a Windows XP/Vista/7 által használt fájlrendszer. (Használata csak olvasható módban ajánlatos, mivel a Microsoft nem közli a specifikációját, és bármikor önhatalmúlag megváltoztathatja. A fejlesztők csak az állományrendszer elemzésével készítették a támogatást.) HFS, HFS+: a Macintosh rendszerek által használt fájlrendszer. HPFS: az OS/2 operációs rendszer által használt fájlrendszer. AFFS: az Amiga gépek támogatására. QNX4: a QNX operációs rendszer támogatására. 2.6.5.
A CD állományrendszere: iso9660
A CD-ROM állományrendszerének neve Linux alatt az iso9660, mivel ez a szabvány definiálja a működését. 2.6.6.
Hálózati állományrendszerek
A Linux három hálózati megosztásokra használatos állományrendszer támogat. A Unix rendszereknél használatos NFS-t (Network Filesystem), a Microsoft Windows család által bevezetett SMB (Server Message Block) protokoll, valamint a Novell Netware szerverek által használt ncpfs-t. 20
2.6.7.
Az állományrendszer paraméter használata
Az állományrendszer típusát a mount parancs -t opciója után kis betűkkel kell megadnunk. Az egyes állományrendszerekhez további, típus függő paramétereket is megadhatunk, amelyekről információ a mount manuál oldala tartalmaz. Amennyiben nem specifikáljuk az állományrendszert, vagy az auto típust adjuk meg, akkor a mount a partíció superblockját ellenőrzi és az alapján próbál választani. Ha ez sikertelen, akkor az /etc/filesystems állományt próbálja beolvasni és az abban szereplő lista alapján próbálgatja az egyes állományrendszer típusokat. Ha nem találja ezt az állományt, vagy már sikertelenül végigpróbálta a listát, és a lista végén egy „*” karakter szerepel, akkor a /proc/filesystems állomány alapján folytatja a tesztelgetést. Ez tulajdonképpen a kernel által támogatott állományrendszerek listája. A mount minden olyan sort végig próbál, amelyben nem szerepel a nodev kulcsszó. Az automatikus állományrendszer meghatározás hasznos lehet, amikor például a felhasználó egy pendrive-ot próbál felcsatolni. Azonban a tesztelés tévedhet, ami katasztrofális hatással lehet az állományrendszer tartalmára. Ezért fontos adatok esetén ne hagyjuk, hogy a mount találgasson! 2.6.8.
Fájlrendszer létrehozása
A Linux alatt az mkfs parancs használatos az állományrendszerek létrehozására: mkfs -t <eszköz állomány> Az eszköz állomány helyett esetleg megadhatunk könyvtárat is. Az mkfs parancs valójában egy front-end a különböző állományrendszereket elkészítő programoknak. Ezek a programok az /sbin könyvtárban találhatóak mkfs. néven. Az egyes állományrendszereknek eltérő beállításai lehetnek, ezért használatukkor tanulmányozzuk a hozzájuk tartozó manuál oldalakat!
Feladat Hozzunk létre FAT állományrendszert egy pendrive-on!
2.7.
Partíciók létrehozása, kezelése
A háttértárolót feloszthatjuk egy vagy több logikai részre, amelynek neve partíció. Ezeket az egységeket a partíciós tábla írja le. A Linux rendszert feltelepíthetjük egyetlen partícióra is, azonban teljesítmény szempontjából célszerű swap állomány helyett partíciót használni. Szerverek esetén a biztonság érdekében a rendszert is célszerű részekre bontani és külön partíciókra telepíteni. A partíciós tábla kezelésére a Linux rendszerek alatt az fdisk program használata javasolt. Bár egy régi eszközről van szó, ezért a felülete elsőre barátságtalannak tűnhet a később született társaihoz képest, azonban kis gyakorlással könnyű kezelni. Ugyanakkor az adminisztrátor számára ez a program nyújtja
21
a legtöbb állítási lehetőséget, szabadságot. Azonban ebből következően óvatosan kell bánnunk vele, éles rendszerek esetén pedig még fokozottabban kell ügyelnünk. A parancs leggyakrabban használt alakja a következő: fdisk <eszköz> Az eszköz neve általában a következő: /dev/hd[a–h] IDE lemezek esetén, vagy /dev/sd[a–p] SCSI, SATA, USB meghajtók esetén. Lefuttatás után a program egy prompt-ot ad és a parancsainkra vár. A parancsok listáját az „m” billentyűvel kérdezhetjük le. A leggyakrabban használt parancsok: Billentyű
Parancs
a
A boot partíció beállítása, illetve a jelzés törlése
d
Partíció törlése
l
A támogatott partíció típusok listázása
m
A segítség lista
n
Új partíció létrehozása
p
Az aktuális partíciós tábla megtekintése
q
Kilépés mentés nélkül
t
A partíció típusának módosítása
v
A partíciós tábla ellenőrzése
w
Kilépés mentéssel
x
további funkciók szigorúan csak tapasztalt felhasználó számára 4. táblázat. Az fdisk főbb parancsai
Mint látható a tábla módosítása után a „q” vagy „w” billentyűkkel léphetünk ki. Előbbi esetben mentés nélkül, utóbbi esetben a módosítások elmentésével. Az fdisk parancsot meghívhatjuk még a -l paraméterrel is, amikor csak kilistázza a partíciós tábla tartalmát: fdisk -l <eszköz>
2.8.
Állományrendszerek összekapcsolása és leválasztása
A Linux állományrendszere a root partíción elhelyezkedő gyökér könyvtárból indul ki. Innen kezdve épül fel a könyvtárak fa struktúrája. Ezt további blokk orientált készülékekkel bővíthetjük ki. A mount rendszerparanccsal egy már létező könyvtárat egy másik készüléken elhelyezkedő állományrendszerrel (esetleg ugyanazon eszközön lévő másik állományrendszerrel) kapcsolhatunk össze. Ezután a már meglévő könyvtárra való hivatkozások a másik állományrendszer gyökér könyvtárára fognak vonatkozni. Gyakorlatilag a mount parancs a hierarchia fa egy pontját egy teljesen új részfával cseréli fel. A lecserélt pont a kapcsolat megszüntetéséig (umount) elérhetetlenné válik. A mount parancs végrehajtása után lényegében nem 22
lesz különbség az eltávolítható köteten és a gyökér állományrendszerben található állományok között, egyformán kezelhetjük őket. Fájlrendszer hozzácsatolása a könyvtárfához: mount -t <eszköz állomány> A fájlrendszer lecsatolása két féle képpen is elvégezhető. Vagy az eszköz állományt adjuk meg mint csatolási pontot, vagy azt a könyvtárat, ahova felcsatoltuk a fájlrendszert: umount <eszköz állomány> umount A felcsatolt eszközökről, és a felcsatolás módjáról információkat kaphatunk a mount paraméter nélküli meghívásával. A felcsatolt eszközök kapacitását és a tárolt állományok helyfoglalását a df paranccsal kérdezhetjük le.
Feladat 1. Próbáljuk ki egy pendrive felcsatolását! mount /dev/sdb1 /mnt/tmp1 2. Vizsgáljuk meg mennyiben változott a könyvtárstruktúra! Majd csatoljuk le! umount /mnt/tmp1 3. Próbáljuk ki egy CD-vel is! mount -t iso9660 /dev/cdrom /mnt/cdrom 4. Próbáljuk ki mi történik akkor, ha olyan könyvtárat választunk csatolási pontnak, amelyben már vannak állományok! Vizsgáljuk meg a helyfoglalás változását a df paranccsal! Mi történik a lecsatolás után?
2.9.
Partíció létrehozása, formázása, felcsatolása
Feladat 1. A megismert fdisk program segítségével hozzunk létre egy új linux partíciót! 2. Az mkfs paranccsal hozzunk létre az új partíción egy ext2 állományrendszert! 3. A mount parancs segítségével csatoljuk fel a könyvtárstruktúrába!
23
4. Az umount paranccsal csatoljuk le! 5. Hozzunk létre egy új ext2 állományrendszert úgy, hogy ne legyen rajta a rendszergazda számára fenntartott terület! 6. A tune2fs program segítségével utólag módosítsuk az állományrendszer maximális mountszámát! 7. Próbáljuk ki mi történik ha felcsatolásokkal elérjük az előbb beállított maximális értéket!
2.10.
A Linux állományrendszer megjavítása
Az fsck program fő feladata, hogy rendszeres időközökkel ellenőrizze a Linux állományrendszerét, és szükség esetén automatikusan kijavítsa a hibákat. Amennyiben az automatikus ellenőrzés során túlságosan jelentős hibákat talál, akkor hibával tér vissza és a rendszer az adminisztrátor által futtatott interaktív javítást igényli. Ez az eset leggyakrabban akkor fordul elő, ha az állományrendszerünk nem journal típusú és a rendszer összeomlott (pl. áramszünet esetén). Azonban bármikor parancssorból ellenőrizhetünk állományrendszereket. Ehhez az állományrendszer ne legyen felcsatolva, hiszen egy ilyen folyamat aktív fájlrendszeren nem biztonságos. A parancs formája a következő: fsck -t <eszköz állomány> Az eszköz állomány helyett esetleg megadhatunk csatolási pontot is. Az fsck az mkfs-hez hasonlóan csupán egy front-end. Szintén az /sbin könyvtárból hívja meg az fsck. nevű programokat.
Feladat Ellenőrizzük a korábban létrehozott állományrendszerünket!
2.11.
Rendszerpartíciók paramétereinek megadása
A Linux rendszerben az /etc/fstab állomány tartalmazza az információkat az egyes, a rendszer által használt állományrendszerekről. Ennek az állománynak a karbantartása az adminisztrátor feladata. Kizárólag az adminisztrátor segédprogramjai módosíthatják. Minden állományrendszert egy sor ír le. Az egyes mezőket szóköz vagy tab karakterek választják el egymástól. Az egyes mezők jelentése sorrendben: 1. Az eszköz állomány neve. Hálózati állományrendszer esetén a távoli megosztás leírója (pl. NFS állományrendszer esetén a következő formában: <szerver>:). Ext2, ext3, ext4 állományrendszerek esetén az eszköz helyett a partíció címkéjét is megadhatjuk (pl. LABEL=/ ), de célszerűbb a partíció ún. UUID-ját megadni. (A blkid programot rendszergazdaként lefuttatva kapjuk meg az egyes partíciók UUID-ját.) 2. A csatolási pont. 24
3. Az állományrendszer típusa. Használható az auto kulcsszó is. Működése megegyezik a mount parancsnál tárgyalttal. 4. Az állományrendszer csatolási opciói vesszővel elválasztva. Az állományrendszer specifikus opciókat az állományrendszer manuál oldalán találhatjuk meg. A következő opciók minden állományrendszer esetén használhatóak: noauto: A rendszer indulásakor az állományrendszer ne csatolódjon fel. user: A felhasználók is felcsatolhassák az állományrendszert. (A felhasználó ilyenkor a mount parancsnak csak az eszközt, vagy a csatolási pontot adhatja meg. A felcsatolást a rendszer az fstab állományban meghatározott opciókkal végzi el.) owner: Az eszköz tulajdonosa csatolhatja fel az állományrendszert. _netdev: Az eszköz felcsatolásához hálózat működőképessége szükséges.) 5. A biztonsági mentés során a dump program az adott partíciót figyelembe vegye-e (1) vagy sem (0). 6. A rendszer indulásakor az automatikus állományrendszer-ellenőrzéskor (fsck) a sorrend megadása. A root állományrendszernél az 1-es érték beállítása javasolt. Egyéb állományrendszereknél a 2-es érték használható. Ebben az esetben egy meghajtón belül az ellenőrzések szekvenciálisan hajtódnak végre. Ha több meghajtón találhatóak a partíciók, akkor a rendszer párhuzamosítja az ellenőrzéseket. Ha a hatodik mezőt nem adjuk meg, vagy értéke 0, akkor a rendszer nem ellenőrzi az adott fájlrendszert.
Feladat 1. Tanulmányozzuk a rendszer /etc/fstab állományát! 2. Állítsuk be, hogy a korábban létrehozott állományrendszer induláskor automatikusan felcsatolódjon a /export csatolási pont alá! Az állományrendszer ellenőrzését is kapcsoljuk be, azonban a biztonsági mentés során hagyjuk figyelmen kívűl!
2.12.
Ext2 állományrendszer konverziója ext3-ra
Mivel az ext2 és az ext3 állományrendszerek között csak a journal mechanizmus támogatása jelenti a különbséget, ezért az utólagos konverzió könnyen megvalósítható.
Feladat 1. Csatoljuk le a korábban létrehozott ext2 állományrendszerünket! 2. A tune2fs -j <eszközállomány> paranccsal végezzük el a journal mechanizmus hozzáadását! (A parancsnak megadhatunk további paramétert, amellyel szabályozhatjuk a journal fájl méretét.) 25
3. Módosítsuk az /etc/fstab állományban a fájlrendszert ext2-ről ext3-ra! 4. Csatoljuk fel a partíciót! A tune2fs parancs a -j opcióval egy speciális attribútumokkal rendelkező rejtett állományt hoz létre, amelyet a műveletek könyvelésére használ majd az állományrendszer kezelő alrendszer. A konverzió visszafelé is lehetséges, az ext3 állományrendszerről ext2-re: 1. Az állományrendszer lecsatolása. 2. Az állományrendszert megszabadítása a journaling mechanizmustól: tune2fs -O ^has_journal <eszköz állomány> 3. Az állományrendszer ellenőrzése: e2fsck <eszköz állomány> 4. Módosítjuk az /etc/fstab állományt. 5. Felcsatoljuk az állományrendszert. 6. Töröljük le a .journal állományt az állományrendszerről. A tune2fs parancs letörli a journal fájl inode-ját, az e2fsck vagy fsck -t ext2 pedig befejezi a fájl eltávolítását.
2.13.
A swap
A kezdetek óta gyakran felmerül a probléma, hogy több memóriára lenne szükségünk, mint amennyi a gépünkben fizikailag rendelkezésünkre áll. Ugyanakkor felhasználhatjuk a merevlemezt, ami ugyan lassabban kezelhető, de jelentős kapacitással bír. Amikor kifutunk a szabad memóriaterületből, akkor a memória egyes nem használt részeit átmenetileg a merevlemezre helyezhetjük, így felszabadul a szükséges hely a programok számára. A Linux a virtuális memóriakezelés módszerét használja, amellyel ezt biztosítja számunkra. A memória és a merevlemez felhasználásával a processzek számára nagyobb memória terület elérését teszi lehetővé, mint amennyi szabad fizikai memóriánk valójában van. Mindezt ráadásul úgy oldja meg, hogy a processz számára az egész memóriaterület egységesen kezelhető és átlátszó. A Linux a virtuális memóriakezelés megvalósítására a memórialapozás technikáját alkalmazza. A rendszer memóriáját tartományokra, úgynevezett lapokra (page) osztja. Ezeket a lapokat egymástól függetlenül mozgatja a memória és a merevlemez között. Amikor a folyamatnak további memóriára van szüksége, de nincs már a memóriában szabad terület, akkor a Linux egyes, régebben használt lapokat kiír a lapcsere (swap) állományba vagy partícióra, és ezáltal helyet teremt. A swap terület lehet állomány, partíció, vagy állományok és partíciók kombinációja. Az ajánlott a külön partíció használata, mivel ez a megoldás nyújtja a legjobb teljesítményt.
26
2.13.1.
Swap partíció hozzáadása a rendszerhez
Előfordulhat, hogy kevésnek bizonyul a swap terület a rendszer számára, ezért újabb partíciókat szeretnénk hozzáadni. Ezt néhány lépésben megtehetjük:
Feladat 1. Létre kell hoznunk egy új partíciót a swap számára. 2. Meg kell formáznunk: mkswap <eszköz állomány> 3. Majd máris engedélyezhetjük a használatát a rendszer számára: swapon <eszköz állomány> 4. Már csak hozzá kell adnunk az fstab állományhoz, hogy a következő rendszerinduláskor használhassuk: <eszköz állomány> swap swap defaults 0
2.13.2.
Swap állomány hozzáadása a rendszerhez
Amennyiben nem tudunk egy partíciót felhasználni, a swap területhez, akkor még lehetőségünk van arra, hogy állományt hozzunk létre, és azt használjuk swapként.
Feladat 1. Létre kell hoznunk egy akkora állományt, amekkorát swap területnek szánunk: dd if=/dev/zero of=/swapfile bs=1024 count=<méret> A méretet kB-ban kell megadnunk. 2. Az állományt is a partícióhoz hasonlóan meg kell formáznunk: mkswap /swapfile 3. Majd engedélyeznünk kell: swapon /swapfile
27
4. Utolsó lépés, hogy hozzáadjuk az fstab állományhoz, hogy automatikusan használja a rendszer: /swapfile swap swap defaults 0
2.13.3.
A swap eltávolítása
A swap partíció vagy állomány eltávolításának menete: 1. A swap terület használatának kikapcsolása: swapoff <állomány> 2. El kell távolítani az eszköz vagy állomány sorát az fstab állományból.
28
3.
Felhasználók adminisztrációja, quota, shell
3.1. 3.1.1.
Felhasználók adminisztrációja A felhasználói azonosítók
A Unix rendszerek alatt minden felhasználó rendelkezik egy egyedi azonosító számmal (UID, vagy user identifier), és egy vagy több csoport azonosító számmal (GID, vagy group identifier). A felhasználók azonosítása a rendszerben a uid szám alapján történik. Bejelentkezéskor a rendszer a név alapján kikeresi az /etc/passwd állományból a felhasználó azonosítóját, és a későbbiekben ezt használja a rendszerben folytatott tevékenységünk során. A csoportokba sorolás segítségével a felhasználók egy csoportját összefoghatjuk és a rendszer egyes részeihez több jogot biztosíthatunk, mint a többieknek. Egy felhasználó több csoport tagja is lehet egyszerre. Ebből az egyik csoport szerepe megkülönböztetett. Ez az alapértelmezett, amelyet az állományok létrehozásakor használ a rendszer. A felhasználó azonosítója és az alapértelmezett csoport azonosítója az /etc/passwd állományban van eltárolva. A többi csoport azonosító az /etc/group állomány bejegyzései alapján rendelődik hozzá a felhasználóhoz. Ezekről az állományokról a man 5 passwd és a man group parancsokkal kaphatunk további információt. Létezik egy kitüntetett felhasználó, a rendszergazda (superuser, a felhasználóneve „root”). A rendszergazdára nem vonatkoznak a felhasználókra beállított hozzáférési jogok, a rendszer még az állományok tulajdonosánál is bővebb lehetőségeket engedélyez számára. A rendszer az alapján ismeri fel, hogy az uid je 0. Jogai gyakorlatilag korlátlanok, éppen ezért igen körültekintőnek kell lennünk, amikor rendszergazdaként jelentkezünk be, mert egyetlen rossz mozdulattal az egész rendszert tönkre lehet tenni. Ezért javasolt, hogy egészen addig egyszerű felhasználóként tevékenykedjünk a rendszerben, amíg valamelyik művelethez nem kellenek feltétlenül a rendszergazdai jogosultságok. Az Ubuntu disztribúciókban a root felhasználóhoz tartozó jelszó alapállapotban zárolva van. Ezért rootként nem is lehet bejelentkezni. Ez nem azt jelenti, hogy rendszergazdai jogosultságú műveletek elvégzésére nincs lehetőségünk. Ubuntu alatt sudo-t kell használnunk a rendszergazdai jogosultság eléréséhez. Azon felhasználók, akik használhatják a sudo parancsot az /etc/sudoers fájlban vannak felsorolva. Nagyon fontos, hogy a sudoers állományt tilos szerkeszteni. Erre külön program, a visudo szolgál, amely rendszergazdai jogosultságok mellett használható. (A visudo szövegszerkesztőjének átállításához az EDITOR környezeti változóban kell beállítani a használni kívánt szövegszerkesztőt, majd a változót exportálni kell, végül a visudo-t a sudo -E visudo paranccsal kell elindítani.)
Megjegyzés Mivel a rendszer a rendszergazdát valójában a 0-s uid alapján azonosítja, ezért minden felhasználó, akinek ez az azonosító van beállítva az /etc/passwd állományban az rendszergazda. A szerverek feltörése esetén szokott előfordulni, hogy a betörő létrehoz egy felhasználót, akinek 0-s azonosítót állít be. Így később is visszatérhet, és rendszergazdaként garázdálkodhat. Ezért egy ilyen esemény után célszerű ezt is ellenőrizni.
29
3.1.2.
Felhasználók létrehozása
Unix rendszereken az új felhasználó létrehozásához elegendő, ha egy rávonatkozó bejegyzést írunk az /etc/passwd állományba. Továbbá létre kell hoznunk neki egy home könyvtárat, amelyet a tulajdonába adunk, és bejegyzünk szintén a passwd állományba. Azonban léteznek segédprogramok is, amelyek ezeket a műveleteket elvégzik nekünk. Parancssoros programok közül ilyen a mindenhol megtalálható useradd. Alapvetően két működési módját különböztetjük meg. Az egyik feladata, hogy új felhasználókat hozzon létre. A másik módja a konfigurációs mód, amikor az alapértelmezett értékeket állítjuk be. A legegyszerűbb, és leggyakrabban használt formája a következő: useradd -c Alapértelmezett esetben bejegyzi a felhasználót a passwd állományba, majd létrehoz egy home könyvtárat, amelybe bemásolja az /etc/skel könyvtárban található állományokat. Mivel a létrehozott felhasználónak nem állítottunk be jelszót, ezért blokkolja a hozzáférését a rendszerhez. A jelszót utólag rendszergazdaként a passwd paranccsal adhatunk. Azonban nem csak valódi felhasználókat hozhatunk létre, hanem úgynevezett rendszer-felhasználókat is. Ezek jelszó nélküli, blokkolt felhasználók home könyvtár nélkül. Csak azért szükségesek, hogy egyes szolgáltatások ezeknek a virtuális felhasználóknak a nevében fussanak, és ez által a rendszer a hozzáférési jogosultságaikat szabályozhassa. Ezek a rendszer-felhasználók abban is különböznek a normál felhasználóktól, hogy az azonosítójuk általában kisebb. A useradd programmal a -r opcióval hozhatjuk létre őket. Az alapértelmezett paramétereket módosíthatjuk is a -D opció használatával: useradd -D A rendszer az alapértelmezett értékeket az /etc/default/useradd állományban tárolja.
Megjegyzés A Red Hat disztribúcióban a useradd program egy módosított változata található. Ez, ha nem definiáljuk a felhasználó csoportját, akkor figyelmen kívül hagyja az alapértelmezett értéket, és minden felhasználónak egy új csoportot hoz létre. Az újonnan létrehozott csoport lesz a felhasználó alapértelmezett csoportja. Ez a működési mód általában fölösleges pazarlás, ezért célszerű a useradd program használatakor a -g opcióval definiálni a felhasználó csoportját.
Megjegyzés Az Ubuntu disztribúcióban a root felhasználóhoz tartozó jelszó alapállapotban zárolva van. Ezért rootként nem is lehet bejelentkezni. Ehelyett sudo-t kell használnunk a rendszergazdai jogosultság eléréséhez. Ahhoz, hogy egy felhasználó használhassa a sudo-t, hozzá kell adnunk a /etc/sudoers állományhoz. Ez esetenként körülményes lehet, ugyanakkor létezik egy kényelmesebb, könnyebben
30
adminisztrálható megoldás, miszerint a felhasználót csak hozzá kell adnunk az admin csoporthoz. sudo adduser admin
Feladat Állítsuk át az alapértelmezett csoportot a users (100) csoportra, majd hozzunk létre felhasználókat! (Red Hat esetén a felhasználó létrehozásakor is meg kell adni a csoportot.)
3.1.3.
Felhasználó letiltása
A felhasználó hozzáférését számos okból letilthatjuk. Egyik szokásos eset, amikor csak egy bizonyos időszakra adjuk a hozzáférést. Ilyenkor már a felhasználó létrehozásánál a useradd parancs -e opciójával megadhatjuk a lejárati dátumot, amikortól nem férhet hozzá a rendszerhez. A másik szokásos eset az automatikus letiltásra, amikor kötelező érvényűvé tesszük, hogy a felhasználók bizonyos idő elteltével cseréljék a jelszavukat. Ezt a passwd parancs -x opciójával adhatjuk meg napokban. Az -i opcióval pedig azt állíthatjuk be, hogy ha elmulasztaná a felhasználó a jelszó megváltoztatását, akkor hány nap múlva tiltódjon le a hozzáférése. Adódhat olyan eset is, amikor manuálisan kell letiltanunk egy hozzáférést valamilyen oknál fogva. Ezt szintén a passwd paranccsal tehetjük meg. Az -l kapcsoló blokkolja, az -u opció pedig újra engedélyezi a hozzáférést. 3.1.4.
Felhasználó törlése
A felhasználó törlése történhet kézzel. Ilyenkor törölnünk kell a felhasználó bejegyzését az /etc/passwd állományból, továbbá shadow jelszó használata esetén az /etc/shadow állományból is. Amennyiben az /etc/group állomány tartalmaz rávonatkozó bejegyzéseket, akkor azt is el kell távolítanunk. Ezzel a felhasználó megszűnt létezni, azonban még további állományai lehetnek a rendszerben. Ez alapértelmezett esetben a /home/ könyvtár tartalma, és a levelesládája (általában /var/spool/mail/). De természetesen ezeket a műveleteket elvégezhetjük egyszerűbben is a userdel paranccsal: userdel -r Az -r paraméter használatával érhetjük el, hogy a felhasználó home könyvtára, és a levelesládája is törlődjön. 3.1.5.
Csoportok adminisztrációja
A felhasználókhoz hasonlóan a csoportok adminisztrálására is találhatunk segédprogramokat. Ilyen a groupadd és a groupdel, ami mint a felhasználóknál, itt is az új csoportok létrehozására, illetve törlésére szolgál. A groupadd program is rendelkezik egy -r kapcsolóval, amellyel rendszer-csoportokat hozhatunk létre, amely ebben az esetben csak azt jelenti, hogy a csoportazonosító kisebb lesz a normál azonosítóknál. 31
3.1.6.
Az állományrendszer jogosultságai
Mint minden többfelhasználós rendszer a Linux is védi az egyes felhasználók állományait és folyamatait a többi felhasználótól. A Linux és más Unix operációs rendszerek a felhasználói- és csoportazonosítókat használják a védelmi korlátozások meghatározására. A rendszer minden állománya egy tulajdonos és egy csoportazonosítóval rendelkezik: • A tulajdonosazonosító az állományt létrehozó felhasználó azonosítója. (A rendszergazda ezt a paramétert állíthatja a chown paranccsal.) • A csoportazonosító az állomány létrehozásakor a felhasználó alapértelmezett csoportja. Ez később a chgrp paranccsal állítható. Ezek az azonosítók szabályozzák, hogy az egyes folyamatok hozzáférhetnek-e az adott állományhoz és elvégezhetik-e a kérdéses műveleteket, vagy sem. A folyamat (felhasználó) és az állomány között három fajta reláció állhat fenn: • Azon felhasználó, akinek az azonosítója megegyezik az állomány azonosítójával, az a tulajdonos (owner). • Akinek a felhasználói azonosítója más, de valamelyik csoport azonosítója megegyezik a bejegyzés azonosítójával az a csoporttárs (group). • Akiknek pedig a felhasználói és csoport azonosítója egyaránt eltér a bejegyzés azonosítóitól, azok a többiek (others). Minden egyes relációra három féle jogosultsági engedélyt állíthatunk be: olvasás, írás, és végrehajtás (könyvtárak esetén ez utóbbi keresési jogot jelent). Nézzük, hogyan is néz ez ki! Az ls -l paranccsal részletes listát kérhetünk az adott könyvtár tartalmáról: drwxr-xr-x 2 root root 4096 Sep 23 23:24 dir1 -rw-r--r-- 1 root root
5 Sep 23 23:24 file1
A lista sorainak első mezője tartalmazza az adott állományra/könyvtárra érvényes jogokat a következők szerint: drwxrwxrwx Ahol az első karakter az állomány típusa:
32
Jelzés
Típus
b
a bejegyzés egy blokk-orientált speciális állomány
c
a bejegyzés egy karakter-orientált speciális állomány
d
a bejegyzés egy katalógus
l
a bejegyzés egy szimbolikus link
-
a bejegyzés egy egyszerű állomány 5. táblázat. Állománytípusok
A következő kilenc karakter hármas csoportokra osztható. Az első három az owner, a második a group, a harmadik pedig az other jogait jelenti. A hármas csoporton belül a három karakter sorrendben a következő lehet: „r”, „w” és „x”. ezek bármelyike helyén „-” is állhat. Jelentésük pedig rendre az olvasási (read), írási (write), végrehajtási (execution) jogot vagy „-” jel esetén annak hiányát jelenti. Az olvasási jogkör szabályozza, hogy van-e joga az adott felhasználónak az állomány tartalmának megtekintésére, illetve a katalógus tartalmának kilistázására. Ha egy felhasználó rendelkezik írási joggal egy bejegyzésre, akkor bővítheti, kicserélheti, megváltoztathatja az állomány tartalmát, illetve létrehozhat, törölhet bejegyzést katalógus esetén. A végrehajtási jog (amely csak állományra vonatkozhat, ha katalógusra vonatkozik, akkor keresési jognak nevezzük) azt jelzi, hogy az adott felhasználó futtathatja-e az állományt. Maga a végrehajthatósági jog önmagában még nem jelenti azt, hogy az állomány ténylegesen futtatható kódot tartalmaz. A katalógusokra vonatkozó keresési jog azt jelzi, hogy van-e jogunk a katalógus bejegyzéseinek eléréséhez, használatához. A tulajdonos lehetőségeit ismertető csoportban „x” helyén „s” áll, ha az állomány setuid módban van. Hasonlóképpen a csoporttárs lehetőségeit ismertető csoportban „x” helyén „s” áll, ha a bejegyzés setgid módú. Az ún. setuid mód lehetővé teszi, hogy a rendszer a programot futtató felhasználót saját uid je helyett a programállomány tulajdonosának uid jével azonosítsa (természetesen csak a program futásának időtartamára). Így a felhasználó által futtatott program mindazt végrehajthatja, amit a programállomány tulajdonosa végrehajthat. A setgid mód teljesen azonos a setuid móddal: a rendszer a felhasználó valódi gid je helyett a programállomány tulajdonosának gid jét (gid jeit) használja a hozzáférési jogok megállapításánál a program futásának időtartama alatt. A jogokat a chmod paranccsal módosíthatjuk. A parancsot kétféleképpen használhatjuk: egyrészt a jogok egzakt, oktális számokkal való megadásával, másrészt szimbolikus jelekkel. A chmod parancs használatának általános formája: chmod <mód> Azonban a rendszernek már az állományok létrehozásakor be kell állítania valamilyen engedélyeket. Lehetne szigorú és elvehetne minden jogot, de lehetne engedékeny is, és megadhatná őket. Azonban a 33
legjobb megoldás, ha a felhasználó megadhatja. Ezt meg is tehetjük az umask segítségével. Ez egy egész szám, amely azt tartalmazza, hogy mely biteket töröljön a rendszer az engedélyek közül. A legegyszerűbb, ha oktális számokkal adjuk meg. Ilyenkor lényegében a chmod parancsnál használt szám inverzét kell megadni: umask <mód inverze>
3.1.6.1.
A jogok megváltoztatása (szimbolikus jelekkel)
A mód szimbolikusan a következő módon adható meg: [kinek] op jogok [op jogok] ... Ahol a „kinek” a következő betűk kombinációja kehet: Jelzés
Kinek állítjuk a jogait?
u
a tulajdonosnak
g
a csoportnak
o
a többieknek
a
mindenkinek
6. táblázat. Jogosultsági csoportok
Ha a „kinek” elmarad, akkor az mindenkit jelöl (mint az „a”), de ilyenkor az aktuális umask ot figyelembe veszi, és azokra a bitekre, ahol a umask 1 az állítás nem hat. Az operátor +, -, vagy = lehet: Jelzés
Művelet
+
jogokat adunk hozzá az állomány jogaihoz
-
jogokat veszünk el az állomány jogaiból
=
pontosan ezt az értéket akarjuk beállítani
7. táblázat. A jogosultságokat állító operátorok
A jogok a következő betűk kombinációi lehetnek:
34
Jelzés
Jogok
r
olvasási jog
w
írási jog
x
végrehajtási jog
X
végrehajtási jog, de csak akkor, ha az állomány katalógus, vagy van már másik x bitje
s
setuid vagy setgid bit
t
sticky bit7
u
a tulajdonos mezőt az eredeti módból veszi
g
csoport mezőt az eredeti módból veszi többiek mezőt az eredeti módból veszi
o
8. táblázat. Hozzáférési jogok
Feladat 1. Hozzunk létre állományokat, vagy könyvtárakat, és gyakoroljuk a jogok beállítását! Pl. adjunk írás jogot a csoportnak, vegyük el a többiek olvasás jogát, adjunk a tulajdonosnak futtatási jogot, adjunk mindenkinek futtatási jogot, ha valakinek van, stb. 2. Adjunk írás jogot a teszt könyvtárunkra mindenkinek! Hozzunk létre benne egy állományt, amelyre levesszük az írási jogokat! Egy másik felhasználóval próbáljuk meg szerkeszteni, átnevezni, törölni az állományt! Próbáljuk meg ugyanezt, ha a sticky bitet beállítjuk a könyvtárra!
3.1.6.2.
A jogok állítása (oktális számokkal)
Az abszolút kód egy oktális szám, ami a következő kódok vagy kapcsolatával állítható elő: 7A
sticky bit állományok esetén nem értelmezett. Csak a régi Unix rendszerek használták, a Linux figyelmen kívül
hagyja. Könyvtárak esetén a jelentése, hogy a benne található állományokat csak a tulajdonos vagy a root nevezheti át vagy törölheti. Jellemzően a /tmp könyvtár használja ezt a jog bitet. Nélküle bárki átnevezhetné vagy törölhetné az állományokat.
35
Jelzés
Jogok
4000
setuid mód a végrehajtáskor
2000
setgid mód a végrehajtáskor
1000
sticky bit
0400
olvasás a tulajdonos által
0200
írás a tulajdonos által
0100
végrehajtás (keresés a katalógusban) a tulajdonos által
0040
olvasás a csoportnak
0020
írás a csoportnak
0010
futtatás a csoportnak
0004
olvasás a többieknek
0002
írás a többieknek
0001
futtatás a többieknek
9. táblázat. Jogosultságok oktális számokkal
User
Group
Other
Szimbolikus
rwx
r-x
--x
Bináris
111
101
001
Oktális
7
5
1
10. táblázat. Jogosultságok formátumai
Feladat Hozzunk létre állományokat és gyakoroljuk a jogok beállítását oktálisan!
3.1.6.3.
Alapértelmezett állomány jogok
Azok a programok, amelyek állományokat hoznak létre, a létrehozáskor beállítják a létrehozandó állomány védelmi kódját. Így történik ez akkor is, ha pl. szövegszerkesztővel létrehozunk egy új állományt. Ilyenkor a jogokat az umask beállítások alapján állítja be a rendszer. Mégpedig úgy, hogy azokat a védelmi biteket (csak az alsó 9 bitet), amelyek értéke 1 az umask ban, a létrehozandó állomány védelmi kódjából kitörli. Például a 002 umask érték azt jelenti, hogy állományok estén a jog 664 lesz, könyvtárak esetén 775. (Látható a fentiekből ez az alapértelmezett értéke az umask nak.) Állományok esetén futásjogot nem tudunk az umask kal adni.
36
3.1.7.
Az ext2, ext3, etx4 állományrendszerek további jogosultságai
Az eddig megismert általános Unix jogosultságokon kívül az ext2, ext3 és ext4 állományrendszerek további jogosultságok beállítását is támogatják. Ezek a jogosultság beállítások eltérően a Unix jogosultságokhoz nem a felhasználók közötti hozzáférést szabályozzák, hanem elsősorban a rendszergazda számára nyújtanak segítséget speciális esetekben. Egy adott könyvtárban a jogokat az lsattr programmal listázhatjuk ki. Az ls programhoz hasonlóan -R (rekurzív listázás), -a (rejtett állományok listázása), -d (könyvtár nevek listázása) opciókat is használhatjuk. A jogokat a chattr programmal állíthatjuk szimbolikusan: chattr +|-|=<jog> Jelzés
Jogok
A
Az atime érték nem módosul az állományhoz való hozzáféréskor.
a
Az állomány csak hozzáírásra nyitható meg. Törölni, felülírni nem lehet.
c
Az állomány automatikusan tömörítve tárolódik a lemezen. Olvasáskor a kernel kitömöríti.
D
Könyvtárak esetén az adatok kiírása szinkron módon történik.
d
Az állomány kimarad a biztonsági mentés készítésekor (dump).
i
Az állomány nem módosítható, törölhető, mozgatható, átnevezhető. Továbbá nem hozhatunk létre linket rá.
j
Ha az ext3 fájlrendszert nem journal módban csatoltuk fel, az adott állományra akkor is működik a journal mechanizmus. Normál esetben nincs hatása.
s
Az állomány törlésekor az adatok 0-val íródnak felül a meghajtón.
S
Az állomány esetén módosításkor az adatok szinkron módon íródnak ki a lemezre.
u
Az állomány törlésekor a tartalma elmentődik, így vissza lehet vonni a törlést.
11. táblázat. Az ext2, ext3, ext4 állományrendszerek további jogosultságai
Megjegyzés A 2.2-es és korábbi kernel verziók nem támogatják az összes állományrendszer opciót. Egyes betörők az „i” vagy „a” opciókkal levédhetik hátrahagyott állományaikat a tapasztalat-
37
lan rendszergazdákkal szemben. Ezért ha rendszergazdaként is problémánk adódik az állományok letörlésével, felülírásával, akkor gyanakodjunk ezen opciók használatára.
Feladat Próbáljuk ki egy tesztállományon az egyes opciók hatásait, hogy megismerjük az általuk okozott jelenséget!
3.2.
Quota
A quota rendszer segítségével szabályozhatjuk, hogy egyes felhasználók, vagy csoportok mennyi háttértároló kapacítást használhatnak el. Így megakadályozhatjuk, hogy a felhasználók teleírják a merevlemezt. A korlátozásokat megadhatjuk felhasználókra vagy csoportokra bontva is. A quota rendszer bekapcsolásához az alábbi teendőket kell végrehajtanunk: 1. A kernelben be kell kapcsolnunk a quota támogatást. (Ez modern disztribúciók esetén alapértelmezetten támogatott.) 2. Az /etc/fstab állományban meg kell adnunk a quota opciókat a felcsatolt állományrendszerekre. 3. Létre kell hoznunk quota táblázatokat, és az egyes felhasználóknak és csoportoknak meg kell adnunk az értékeket. 4. Be kell kapcsolnunk a rendszert. 3.2.1.
A quota bekapcsolása az állományrendszerre
A quota rendszer támogatásához az egyes felcsatolt állományrendszerekre be kell kapcsolnunk az usrquota vagy grpquota opciókat, attól függően, hogy a felhasználói, csoport, vagy mindkét beállítást használni szeretnénk. Ezt az /etc/fstab állományban tehetjük meg, ha azt szeretnénk, hogy minden induláskor automatikusan megtörténjen. Pl. /dev/hda2 /home ext2 defaults,usrquota,grpquota 1 1 Ha az állítás előtt is fel volt csatolva az állományrendszer, akkor mount-oljuk újra. 3.2.2.
A quota táblázatok létrehozása
Miután felcsatoltunk minden olyan állományrendszert, amelyre a quota opciókat bekapcsoltuk a quotacheck paranccsal le kell generálnunk az információs táblázatokat (aquota.user és aquota.group). Ezt a -c opció használatával tehetjük meg. Emellett meg kell adnunk, hogy a felhasználói (-u) vagy a csoport (-g) táblázatot szeretnénk legenerálni. Ha a /home partícióra szeretnénk legenerálni, akkor a következő parancsot kell kiadni:
38
quotacheck -acugm /home Az -a opció azt jelenti, hogy minden felcsatolt quota-t használó állományrendszert végignéz. A táblázatok legenerálása után az aktuális lemezhasználat információkat a következő paranccsal frissíthetjük: quotacheck -avugm Ezt akár crontabból is tehetjük: 0 3 * * 0 /sbin/quotacheck -avug
3.2.3.
A quota rendszer bekapcsolása
Miután a táblázatokat is legeneráltuk következő lépésként bekapcsolhatjuk a quota rendszert: /usr/sbin/quotaon -avug Azonban előfordulhat, hogy az adott rendszerben ez már szerepel az inicializációs szkriptekben, ezért nekünk már nem kell megadni. 3.2.4.
A quota értékek beállítása
A quota rendszer beüzemelése után állítsuk be a quota értékeket. Ezt az edquota paranccsal tehetjük meg. Egy felhasználó esetében: edquota A rendszer az EDITOR környezeti változó által meghatározott szövegszerkesztővel megnyit egy táblázatot, amelyben beállíthatjuk az értékeket az egyes kötetekre. Az oszlopok jelentése a következő: filesystem: A kötet neve. blocks: A jelenleg használt blokkok száma. soft: A soft limit a maximálisan használható blokkok számára. Ezt egy meghatározott türelmi időre átlépheti a felhasználó. hard: A hard limit a blokkok számára. Ezt semmiképpen nem lépheti át a felhasználó. inodes: A használt inode-ok száma. soft: A soft limit a maximálisan használható inode-ok számára. hard: A hard limit a maximálisan használható inode-ok számára. A quota használatát a következő paranccsal ellenőrizhetjük le: quota
39
A csoportok értékeinek beállítása hasonló. A következő paranccsal érhető el: edquota -g A megjelenő beállítások megegyeznek a felhasználóknál látottakkal, csak a csoportra értelmezendőek. A beállatásokat a következő paranccsal ellenőrizhetjük: quota -g Átfogó jelentést a következő paranccsal kaphatunk: repquota -avugs
3.2.5.
A türelmi idő beállítása
A soft limitek esetén szó esett egy türelmi időről. Ezt az értéket a következő paranccsal állíthatjuk: edquota -t
3.3.
A parancsértelmező (shell)
A Unix rendszerek és így a Linux egyik érdekessége, hogy a felhasználói felületet megvalósító parancsértelmező (shell) egy közönséges felhasználói program. Ez a parancsértelmező nem integráns része az operációs rendszernek, és nem élvez speciális megkülönböztetéseket. Így bárki lecserélheti a sajátját egy másik programra. A rendszerbe való bejelentkezéskor a rendszer a login-név (uid) és a jelszó alapján ellenőrzi a felhasználót, majd a password állomány hozzá tartozó sorának megfelelő mezőjében megadott programot elindítja. Ez rendszerint valamelyik shell (sh, csh, ksh, tcsh stb.), de lehet valami más program is. Mindegyik felhasználónak joga van ezt a programot lecserélni (chsh parancs). Az egyes shell változatok között a különböző kényelmi szolgáltatásokban, valamint a programozói felületükben van eltérés. Ugyanis a UNIX shellek nem csupán parancsértelmezők, hanem programozási nyelvek is egyben. A következőkben áttekintjük a bash (Bourne-again shell) különböző funkcióit. 3.3.1.
Parancssor értelmezés
A Unix shell lényegében egy parancsértelmező program, amely beolvassa a felhasználó által begépelt sorokat, és azt más programok végrehajtását előíró kérésekként értelmezi. Egy parancssor a legegyszerűbb esetben egy parancsból és a hozzá tartozó, szóközökkel elválasztott paraméterekből áll. parancs argl arg2 ... argn A parancsértelmező különálló karaktersorozatokká bontja fel a parancs nevét és argumentumait. Ezután egy beállítható keresési út (PATH) szerint a különböző katalógusokban megkeresi a „parancs” nevű állományt. Ha sikerült megtalálni, akkor azt végrehajtja. A parancs végrehajtásának befejezését a prompt kiírásával jelzi. 40
A parancssorban szereplő állománynév után következő argumentumok a következő négy kategória valamelyikébe esnek: • Egyszerű karakterlánc. • Állománynév, amit „<”, „>” vagy „>>” előz meg. • Egy karakterlánc, amely állománynév helyettesítő karaktert is tartalmaz. • „`. . . `”, vagy „$(. . . )” jelek közé zárt újabb parancs, ami ún. parancshelyettesítést eredményez. Az egyszerű argumentumokat a program string tömbjeként kapja meg. A shell állítja elő ezt a tömböt, ezáltal könnyebb és egységes a paraméter kezelés implementálása a programokban. 3.3.2.
A shell beépített parancsai
A shellek tartalmaznak néhány beépített parancsot. Ezek többnyire a shell működésével szorosan összefüggő parancsok, amelyeket nem érdemes más módon implementálni. Azonban léteznek olyan shellek, amelyek számos parancs megvalósítását integrálják magukba. Teszik ezt azért, hogy a rendszerhibák esetén is működhessenek, és ezáltal lehetőséget nyújtsanak az adminisztrátornak a nehéz helyzetből való kilábalásra. Ilyen shell program a sash (Stand-alone shell). Ez egy statikusan linkelt program, amely tartalmazza a legszükségesebb programok egyszerűsített változatait. Így akkor is működőképes, amikor az alap programkönyvtárak meghibásodása miatt a rendszer lényegében használhatatlan. Az ilyen shellek telepítése feltétlenül javasolt, hogy a problémás helyzeteket egyszerűbben megoldhassuk. 3.3.3.
Állománynév-helyettesítés
A parancs argumentumában megadott „*”, „?”, és „[. . . ]” jelek ún. állománynév-helyettesítő jelek. Ezek jelentése: Jel
Jelentés
*
Nulla vagy tetszőleges számú tetszőleges karakter.
?
Pontosan egy tetszőleges karakter.
[abc]
Az „a” vagy „b” vagy „c” karakter egyike.
[m-n]
m–n intervallumból egy karakter.
12. táblázat. Állománynév-helyettesítés reguláris kifejezésekkel
Az olyan argumentumok, amelyek állománynév-helyettesítő karaktereket tartalmaznak, állománynevekből álló egyszerű argumentumok sorozatára cserélődnek le. Például „*f”-ből azoknak az aktuális katalógusban található állományneveknek a sorozata lesz, amelyek az „f” karakterekre végződnek. A helyettesítő karakterek közül több is szerepelhet egyidejűleg ugyanabban az argumentumban. Pl. az „[a-z]*” a kisbetűvel kezdődő neveket jelenti. 41
Az, hogy a kifejtő metódust a shell tartalmazza, több előnnyel jár: • A kifejtést megvalósító program csak egyszer szerepel a rendszerben (helytakarékosság). • A programoknak a kifejtéssel nem kell foglalkozniuk. • A kifejtő algoritmus alkalmazása így bizonyosan mindig egységes lesz. 3.3.4.
Standard input/output átirányítás
A shell által végrehajtott programok eleve három megnyitott állománnyal indulnak. Ezek a 0, 1 és 2 állományleírókhoz vannak hozzárendelve. 0: Standard input. 1: Standard output. 2: Error output. Ezek alapértelmezésben a felhasználó termináljához vannak rendelve, de átirányíthatjuk őket. A „>” vagy „>>” jellel a standard kimenetet irányíthatjuk át. A parancs végrehajtása alatt az 1-es állományleíró a „>” jel után megadott nevű állományra mutat. A következő parancs létrehozza a „kimenet” nevű állományt és a listát abba írja: ls > kimenet Ha a „>>” jelet használjuk, akkor az ls parancs kimenetét a „kimenet” állomány végéhez fűzi: ls >> kimenet A hibakimenetet a „2>” jelöléssel irányíthatjuk át. Hasonlóan a standard input is átirányítható. Ezt a „<” jellel tehetjük meg. A „< bemenet” jelölés azt jelenti, hogy a standard input a „bemenet” nevű állományból jöjjön. 3.3.5.
Csővezeték
A Linuxban gyakran előfordul, hogy az egyik program kimenetét szeretnénk használni egy másik program bemeneteként. Például, ha egy program kimenetét szeretnénk megszűrni, rendezni, tördelni. Ezt megtehetjük az előző fejezetben ismertetett módon átmeneti állományok létrehozásával. Azonban a Linux tartalmaz egy sokkal hatékonyabb eszközt is, amelyet csővezetéknek (pipe) nevezünk. A csővezeték egy olyan speciális állomány, ami egy FIFO-t (First In First Out) valósít meg. Az érdekessége abban áll, hogy ez a FIFO állományként kezelhető. Két állományleíróval hivatkozhatunk rá, egyiken írhatunk bele, a másikon pedig a beírási sorrendben kiolvashatjuk a beírt adatokat. A csővezeték-szervezés lehetőségeinek előnyei: • Nincs szükség ideiglenes állományokra, amit később úgy is letörölnénk. • Mivel a folyamatok „párhuzamosan” futnak, a FIFO-nak nem kell nagynak lenni.
42
• A pipe használata gyorsabb, mivel az a memóriában keletkező állományként jelenik meg (egy FIFO csupán 8 kB). • Az eredmény a cső végén már azelőtt megjelenhet, mielőtt az első program az összes bemenetét feldolgozná. A csővezetéket a shell számára a „|” jellel adhatjuk meg. ls | grep "minta" | sort | more Ebben a példában az ls parancs kimenetéből a grep program kiszűri azokat, amelyekben szerepel a „minta” string, majd az eredményt rendezi, és oldalakra tördelve megjeleníti. 3.3.6.
Parancshelyettesítés
Igen hasznos és érdekes szolgáltatása a shelleknek az ún. parancshelyettesítés. Ez lehetővé teszi, hogy az egyik program kimenetét a másik program paraméter listájaként használjuk. Ilyenkor a megfelelő parancsargumentumot „`. . . `” (visszafelé dőlő aposztróf) párba vagy „$(. . . )” jelek közé kell zárni. du `cat parameters.txt` Például az iménti parancs esetén a du parancs megmondja azon fájlok méretét, amelyek a „parameters.txt” állományban fel vannak sorolva. 3.3.7.
Parancssorozatok
Ha a parancsokat egymás után pontosvesszővel elválasztva írjuk, akkor úgynevezett parancssorozathoz jutunk. Így például a következő parancs először kiírja az aktuális dátumot, majd kilistázza a pillanatnyi katalógust. date; ls Parancssorozatot nem csak pontosvessző segítségével alkothatunk, hanem a „||” és a „&&” jelekkel is. Ekkor egy feltételesen végrehajtódó sorozathoz jutunk. A „||” és a „&&” jelek jelentése azonos a C nyelvben megszokottal. parancs1 || parancs2 parancs3 && parancs4 Vagyis az előző parancssorozatból a parancs2 csak akkor fog végrehajtódni, ha a parancs1 hamis megállási státusszal állt meg. A parancs4 pedig csak akkor fog végrehajtódni, ha a parancs3 igaz megállási státusszal állt meg. 3.3.8.
Szinkron és aszinkron folyamatok
Az eddigi példákban az egymás utáni parancsok egymást követve szinkron módon hajtódtak végre. Lehetőség van azonban aszinkron végrehajtásra is. Ha egy parancsot az „&” jel követ, akkor a shell
43
nem várja meg a parancs befejeződését, hanem a prompt jel kiadásával újabb parancsra várva azonnal visszajelentkezik, miközben a kiadott parancs aszinkron módon a shelltől leválasztva fut tovább. Pl. find / -name 'core' > eredmeny & Ebben az esetben a shell azonnal visszatér és új parancsra vár. A fájlkeresés a háttérben fut és az eredményt az „eredmeny” állományba írja. (A háttérben futó folyamatok kimenetét érdemes fájlba irányítani, hogy ne keveredjen össze más parancsok kimenetével.) A parancs futtatásakor a rendszer kiír egy ún. processz ID-t (pid) amellyel hivatkozhatunk később a háttérben futó folyamatra. 3.3.9.
Csoportosítás
A parancsokat zárójelekkel is csoportosíthatjuk. ( parancs1 ; parancs2 ) (date; ls) > lista & Ez utóbbi parancs kiírja a dátumot és az állományok listáját a „lista” állományba, és mindezt a háttérben teszi. 3.3.10.
A Bash shell további funkciói
A következőkben röviden áttekintjük a bash további lehetőségeit, programozását. 3.3.10.1.
Változók kezelése
A shellek az eddig megismert funkciókon túl változók kezelésére is alkalmasak. A változókat egyszerű string típusú tárolóként kezeli. Értékadás shell változónak: változó=érték Az érték beállítása a „=” jellel történik. (Előtte és mögötte nem lehet üres hely.) kutya=ugat Ha már beállítottuk a változót, akkor a „$” jellel a változó neve előtt hivatkozhatunk az értékre. $ kutya=ugat $ echo $kutya ugat A példánkban az echo parancsot használtuk, amely kiírja a paraméterként kapott szöveget. Mint látható, a változó helyére a shell behelyettesíti a változó értékét. Az echo parancs már az értéket kapja meg, és azt írja ki. Előfordul, hogy közvetlenül a változó után kell írnunk valamit. Ebben az esetben meg kell határoznunk a shell számára, hogy meddig tart a változó neve. Ezt a „{” és „}” jelekkel tehetjük meg.
44
$ kati=zsuzsi $ echo ${kati}ka zsuzsika A set parancsot kiadva kiírathatjuk a beállított változók listáját. A változót az unset paranccsal törölhetjük. Ebben az esetben, ha továbbra is használjuk, akkor a shell egy üres stringet helyettesít be. Szükség lehet arra is, hogy a shell által indított programok is megkapják a környezeti változók értékét, mert a rendszerről, vagy a felhasználó preferenciájáról tudhatnak meg információkat. Ilyenkor az export kulcsszóval tesszük számukra elérhetővé. TERM="VT100" export TERM Az előző két sort összevonva: export TERM="VT100" A programok számára kiexportált környezeti változókat az env paranccsal listázhatjuk ki.
Feladat 1. Hozzunk létre változót, majd írassuk ki az értékét! 2. Keressük meg a set parancs által adott listában! Nézzük meg az env parancs listájában! 3. Exportáljuk ki a változót, hogy a programok számára is elérhető környezeti változó legyen! 4. Újra nézzük meg mind a set, mind az env parancs listájában! 5. Töröljük a változót!
Feladat 1. Az mc programmal nyissunk meg egy szövegállományt szerkesztésre! Jegyezzük meg, hogy mit látunk! 2. Állítsuk be az EDITOR változó értékét „ joe”-ra, és exportáljuk ki! 3. Az mc programmal újból nyissuk meg az állományt szerkesztésre! 4. Töröljük az EDITOR változót!
3.3.10.2.
Speciális változók
A shellek rendelkeznek néhány speciális változóval is. Ezen változók speciális szerepe abból adódik, hogy vagy automatikusan kapnak értéket, vagy értékük befolyásolja a shell működését.
45
Változó
Jelentés
$#
Argumentumok száma
$*
Az összes argumentum
$@
Ua. mint $*, ha nincs "" jelek között7
$-
A shell által adott opciók
$?
Az utolsó parancs visszatérési értéke
$$
Processz szám
$!
Utolsó háttérben indított folyamat azonosítója
$0
Parancsállomány neve
$HOME
Home könyvtár neve
$IFS
Input mezőhatároló karakter
$MAIL
Levelesláda állomány
$CDPATH
Keresési út a cd parancshoz
$PATH
Keresési út a programok indításához
$PS1
Elsődleges prompt
$PS2
Másodlagos prompt 13. táblázat. A bash shell speciális változói
Feladat 1. Futtassuk le a true programot, majd nézzük meg a $? változó értékét! 2. Ismételjük meg az előbbi műveletet a false programmal is! 3. Írjuk ki a shell processz azonosítóját ($$)! 4. Állítsuk át a PS1 változó értékét a következőre: [\A \h:\w]\$ és értékeljük a hatását! (Az eredeti érték Fedorán: [\u@\h \W]\$, míg Ubuntun: \[\e]0;\u@\h: \w\a\]$debian_chroot:+($debian_chroot)\u@\h:\w\$.) 5. Vizsgáljuk meg a PATH változó értékét! Fűzzük a lista végére az aktuális könyvtár jelzését, hogy a rendszer a lefuttatandó programot ott is keresse!
3.3.10.3.
A shell indulási folyamata
Az első fájl, amelyet a shell betölt a bejelentkezéskor az /etc/profile. Ez az állomány tartalmazza az alapvető változó beállításokat a folyamatokhoz, és csak a rendszeradminisztrátor módosíthatja. A változók beállításán kívül parancsokat is futtathat a felhasználók bejelentkezésekor. A $HOME/.bash_profile hasonló feladatokat lát el, mint az /etc/profile, azonban ezt a felhasználó is módosíthatja. A felhasználó ebben az állományban beállíthatja a saját környezetét. (Mint az a nevében 7 "$*"
== "$1 $2 . . . ", de "$@" == "$1" "$2" . . .
46
is szerepel ez az állomány csak a bash shell esetén funkcionál. Léteznek azonban más állományok is más shellekhez.) A $HOME/.bashrc olyan beállításokat tartalmaz, amelyeket nem exportálunk ki az alfolyamatok számára. Az /etc/bashrc a rendszer szintű beállításokra szolgál és csak a rendszeradminisztrátor módosíthatja. Az /etc/bashrc a $HOME/.bashrc állományból hívódik, ezért a felhasználó dönthet akár úgy is, hogy nem használja.
Feladat Vizsgáljuk meg az előbb a felsorolt állományokat!
3.3.10.4.
Alias
Az alias parancs segítségével a felhasználó saját parancsokat hozhat létre, vagy leegyszerűsíthet gyakran használt parancsokat. alias p='ps aux' alias l='ls -l' Az alias parancs argumentum nélkül kiírja az aliasok listáját az aktuális környezetben. Az unalias parancs segítségével pedig megszüntethetjük az alias-okat. 3.3.10.5.
Parancs history
A HISTSIZE változó által megadott számú utolsó parancsot eltárolja a rendszer a .bash_history állományban. A history parancs lehetővé teszi, hogy kilistázhassuk a megadott számú bejegyzést. $ history 6 501 pwd 502 touch file 503 l 504 rm -f file 505 l 506 history 6 Az fc -s parancs lehetővé teszi, hogy megint lefuttassunk egy parancsot a listából. Használhatjuk a sorszámát vagy a szöveg kezdetét is, de a fel és le nyíllal is választhatunk a parancsok közül. $ fc -s pw pwd /home/tomcat
47
3.3.10.6.
Parancsállományok
A legtöbb felhasználó azt hiszi, hogy a shell csak egy interaktív parancsértelmező, pedig a parancsértelmezés valójában egy programnyelv része. Mivel a parancsvégrehajtásnak az interaktív és a programozott módját egyaránt a shellnek kell végrehajtania, ezért furcsa nyelvvé vált. A Linux rendszerben gyakran találkozhatunk parancsállományokkal, más néven shell scriptekkel. Egyszerűbb feladatokat gyakran gyorsabban elvégezhetünk velük, mintha programot írnánk. A rendszeradminisztrátorok különösen sokszor használják őket egyes funkciók elvégzésére. A legegyszerűbb változata, amikor parancsokat egymás után egy szövegállományba írjuk. Ekkor a shell egymás után végrehajtja őket. Az állományt kétféle képpen futtathatjuk: • Meghívunk egy shellt és paraméterként átadjuk az állományt és a futtatási paramétereit: bash állomány [argumentum...] • Vagy adunk futás jogot az állományra (x bit) és csak futtatjuk az állományt: állomány [argumentum...]
3.3.10.7.
Beépített parancsok
Korábban már volt szó arról, hogy a shellek beépített parancsokat is tartalmaznak. Azonban ezeknek csak egy részét alkotják a shell működésével kapcsolatos parancsok. A másik csoportot azok a parancsok adják, amelyek a shell programnyelvét adják. A következőben a bash shell parancsait tekintjük át röviden.
48
Parancs
Jelentés
break[n]
Ciklus elhagyása
continue[n]
Továbblépés a következő ciklusra
cd arg
Könyvtár váltás
echo arg
Az argumentum kiírása
eval arg
Az argumentum végrehajtása
exec arg
Az argumentum végrehajtása, de nem indul új shell
exit[n]
Megállás n értékkel
export var
A var változó kiexportálása
pwd
Az aktuális könyvtár elérési útjának kiírása
read var. . .
A var változóba olvas a standard bemenetről
readonly var
Csak olvashatóvá teszi a var változót
return[n]
Visszatérés függvényből
set[kapcs[arg]]
Kapcsolók beállítása
shift[n]
Pozícionális paraméterek léptetése
test
Feltétel kiértékelése
ulimit[-fp][n]
Limit beállítás állományokra
umask[ddd]
Alapértelmezett jogok
unset var
Változó megszüntetése
wait[n]
Várakozás az n. folyamatra 14. táblázat. A bash shell beépített parancsai
A break, continue, exit, return parancsok funkciója megegyezik más programozási nyelveknél használtakkal. 3.3.10.8.
Feltételek kiértékelése
A programok visszatérési értéke alapján elágazásokat, ciklusokat szervezhetünk. A 0 az igaz értéket, a nem 0 a hamis értéket jelenti. Azonban a test parancs segítségével lehetőségünk nyílik arra, hogy feltételeket adhassunk meg, és ez szolgáljon alapként az elágazáshoz. A feltételeket három csoportra oszthatjuk. Az első csoport a stringeket vizsgálja: Parancs
Jelentés
test s
Igaz, ha s nem null szöveg
test -z s
Igaz, ha s nulla hosszúságú szöveg
test -n s
Igaz, ha s nem nulla hosszúságú szöveg
test s1 = s2
Igaz, ha s1 szöveg egyezik s2 szöveggel
test s1 != s2
Igaz, ha s1 szöveg nem egyezik s2 szöveggel 15. táblázat. Stringek kiértékelése
49
A feltételek második csoportja a numerikus értékeket vizsgálja: Parancs
Jelentés
test n1 -eq n2
Igaz, ha n1 szám egyenlő n2 -vel (numerikus =)
test n1 -ne n2
Igaz, ha n1 szám nem egyenlő n2 -vel (numerikus !=)
test n1 -lt n2
Igaz, ha n1 kisebb mint n2 (numerikus <)
test n1 -le n2
Igaz, ha n1 kisebb vagy egyenlő mint n2 (numerikus <=)
test n1 -gt n2
Igaz, ha n1 nagyobb mint n2 (numerikus >)
test n1 -ge n2
Igaz, ha n1 nagyobb vagy egyenlő mint n2 (numerikus >=)
16. táblázat. Numerikus kiértékelés
A feltételek harmadik csoportja az állományok tulajdonságainak ellenőrzésére szolgál: Parancs
Jelentés
test -f f
Igaz, ha f egy létező állomány vagy könyvtár
test -r f
Igaz, ha f olvasható
test -w f
Igaz, ha f írható
test -d f
Igaz, ha f könyvtár
test -s f
Igaz, ha f létezik, és nem nulla hosszúságú
test -t fd
Igaz, ha fd egy megnyitott állomány leírója, és az egyben egy terminál
17. táblázat. Állomány-tulajdonságok szerinti kiértékelés
Ezeket a műveleteket kombinálhatjuk is a ! (tagadás), -o (vagy), -a (és) logikai műveletekkel, továbbá zárójelekkel csoportosíthatjuk is. A test parancsot „[”, „]” jelekkel is helyettesíthetjük az alábbi módon: [ n1 -eq n2 ] A szögletes zárójelek használata esetén figyeljünk arra, hogy a szögletes zárójelek és a feltétel között egy-egy szóköz van.
50
3.3.10.9.
Vezérlési szerkezetek
A shell tartalmaz olyan eszközöket, amellyel elágazásokat és ciklusokat hozhatunk létre a parancsállományon belül (de akár egy parancssorban is a „;” jel használatával). Most ezeket vesszük sorra. 3.3.10.9.1.
If feltétel
Az if feltétel használata esetén, ha a feltétel teljesül, vagyis a parancs visszatérési értéke 0, akkor a then ág hajtódik végre. Ha a feltétel nem teljesül, vagyis a parancs visszatérési értéke nem 0, akkor az else ág hajtódik végre. if <parancs> then <parancsok> else <parancsok> fi if test $1 -eq 1 then echo 'egy' fi if [ $1 -eq 1 ] then echo 'egy' fi Általában a test szögletes zárójeles változatával találkozhatunk az if feltételeként, de használhatunk más programot is, ha követi a fenti visszatérési érték szabályokat. 3.3.10.9.2.
For ciklus
A for ciklus eltér a más programozási nyelvekben általában használt szintaktikától. Itt egy érték listát adunk meg, amelyen egyesével végigmegy a ciklus. A megadott változónak átadja az aktuális értéket és meghívja a do és done közötti parancsokat. for i in w1 w2 ... do <parancsok> done for i in egy ketto harom do echo $i done
3.3.10.9.3.
While ciklus
A while ciklus működése olyan, mint más programozási nyelvek esetén: amíg a feltétel igaz végrehajtja a do és done közti parancsokat.
51
while <parancs> do <parancsok> done while test $i -le 5 do i=`expr $i + 1` done while [ $i -le 5 ] do i=`expr $i + 1` done
3.3.10.9.4.
Until ciklus
Az until ciklus is úgy működik, ahogy már más programozási nyelvek esetén megszokhattuk, vagyis a while-hoz képest negált a feltétel vizsgálat. until <parancs> do <parancsok> done until test $i -le 5 do i=`expr $i + 1` done until [ $i -le 5 ] do i=`expr $i + 1` done
3.3.10.9.5.
Case szerkezet
A case szerkezet a változó értéke szerint kiválasztja az azzal megegyező minta ágát, és végrehajtja a parancsokat. A „*” minta az alapértelmezett. case word in minta1) <parancsok>;; minta2) <parancsok>;; minta3) <parancsok>;; esac case $1 in 1) echo egy;; 2) echo ketto;;
52
*) echo sok esac 3.3.10.10.
Shell szkript példa
Egy szkript amely megszámolja a könyvtárban található állományokat az alábbiak szerint néz ki: #!/bin/bash # # file szamlalo # n=0 for i in * do if [ -f $i ] then n=$(expr $n + 1) fi done A szkriptek első sorában mindig megadjuk a futtató shell nevét általában elérési úttal a következő formában: #!<shell> A kommenteket a „#” jellel kezdődően írhatunk az állományba. A példában az n változó értékét 0-ra állítottuk. Ez után a for ciklus végiglépked az adott könyvtár bejegyzésein (mivel a * helyére a shell behelyettesíti a könyvtár állományait és könyvtárait). Az if feltételében megvizsgáljuk, hogy a bejegyzés egy állomány-e. Ha igen, akkor a számláló értékét eggyel megnöveljük.
Feladat Módosítsa a scriptet úgy, hogy a könyvtárban található „a” vagy „b” betűvel kezdődő, illetve az „a” vagy „b” betűvel végződő, futtatható állományokat számolja össze!
3.3.10.11.
Erőforrás kontroll
Korábban a beépített parancsok listájában már találkozhattunk az ulimit paranccsal. Ez a parancs lehetővé teszi, hogy korlátozzuk a shell és az általa futtatott programok erőforrás felhasználását. A parancs formátuma: ulimit [-SH] [opció limit]
53
Az -S és a -H opció határozza meg, hogy soft limitet, vagy hard limitet állítunk. A hard limitet ha már egyszer beállítottuk, akkor nem lehet növelni. A soft limit ezzel szemben megnövelhető egészen a hard limit szintjéig. Amennyiben nem adjuk meg, hogy soft vagy hard limitet állítunk, akkor mindkettő állítódik. A limit értéke egy egész szám, amelynek mértékegysége az állított paramétertől függ. Ezen kívül használhatjuk a hard, soft, és unlimited kulcsszavakat is, amelyek a hard limit, a soft limit, vagy a nincs limit értékeket jelentik. Az állítható paraméterek: Paraméter
Leírás
-a
Az aktuális limit értékek kiírása
-c
A core állomány8 maximális mérete
-d
A folyamatok adatszegmensének maximális mérete
-f
A shell által létrehozható állományok maximális mérete
-l
A maximum méret ami a memóriába blokkolható
-m
A maximum memória rezidens rész mérete
-n
A nyitott állományleírók maximális száma
-p
A csővezetékek mérete 512 B blokkokban
-s
Maximum stack méret
-t
A maximum processzoridő másodpercben
-u
Az egy felhasználó által indítható maximális processzek száma
-v
A shell által használható maximális virtuális memóriaméret 18. táblázat. Az erőforrás kontroll opciói
A méretek, ahol nem emeltük ki külön, ott 1 kB-os egységekben értendő. Amennyiben nem adjuk meg egyik opciót sem, akkor a -f opció az alapértelmezett.
8A
core állomány a processzek összeomlásakor a rendszer által generált memória pillanatfelvétel, amely alapján a gdb
hibakereső a fejlesztő számára hasznos információkkal szolgálhat. Azonban ezek a pillanatfelvételek a folyamattól függően jelentős méretűek lehetnek, ezért érdemes a méretüket korlátozni a rendszer védelmében. Természetesen, ha a korlátozás által az állomány csonka lesz, akkor a hibakereső számára már használhatatlan.
54
4.
Segédprogramok, folyamatok kezelése, chroot, a rendszer indulása, automatizált programindítás, log
4.1. 4.1.1.
Segédprogramok és szűrők A find parancs
A find parancs rekurzívan végignézi az adott könyvtárból nyíló alkönyvtárakat. Keresi bennük a kifejezésnek megfelelő állományokat, majd kiírja a talált állományok listáját, vagy feladatokat hajt végre az adott állományokon. A parancs formája: find <elérési út> A leggyakrabban használt eset, amikor megadott nevű állományokat keresünk a könyvtárak sűrűjében. $ find . -name fontos ./doksik/fontos ./fontos Nézzünk meg még néhány opciót, amelyekkel összetettebb keresési feltételeket adhatunk meg. Paraméter
Leírás
-name
Az állomány megfelel, ha a neve a fájl paraméterrel egyezik. A shell által használt állománynév helyettesítő szintaxis használható, de idézőjelek közé kell tenni, hogy ne a shell értelmezze.
-type
Az állomány típusát specifikálhatjuk.9
-user
Az állomány megfelel, ha az állomány tulajdonosa megegyezik a felhasználónévvel.
-nouser
Az állomány megfelel, ha nincs tulajdonosa regisztrálva.
-group
Az állomány megfelel, ha az állomány csoportja a megadott.
-nogroup
Az állomány megfelel, ha az állomány csoportja nincs regisztrálva.
-perm <jogosultság>
Az állomány megfelel, ha a joga megegyeznek a megadottal.
-perm -<jogosultság>
Az állomány megfelel, ha a jogosultság minden 1-es bitje az állomány jogaiban is 1.
-perm +<jogosultság>
Az állomány megfelel, ha a jogosultság valamelyik 1-es bitje az állomány jogaiban is 1.
-size n
Az állomány megfelel, ha az állomány n blokk hosszúságú (egy blokk 512 bájt).
55
Paraméter
Leírás
-empty
Az állomány vagy könyvtár megfelel, ha üres.
-amin n
Az állomány megfelel, ha utoljára n perce fértek hozzá.
-atime n
Az állomány megfelel, ha utoljára n napja fértek hozzá.
-cmin n
Az állomány megfelel, ha utoljára n perce módosult a státusza.
-ctime n
Az állomány megfelel, ha utoljára n napja módosult a státusza.
-mmin n
Az állomány megfelel, ha utoljára n perce módosították.
-mtime n
Az állomány megfelel, ha utoljára n napja módosították.
-exec <parancs>
Az állomány megfelel, ha a végrehajtandó program 0 visszatérési értékkel tér vissza. A parancs végét egy pontosvessző „;” jelzi, amit a shell miatt idézőjelek közé kell zárni. Az állománynevet „{}” jelekkel helyettesíthetjük. Használhatjuk úgy is, hogy a talált állományokra a megadott parancsot végrehajtsa.
-ok <parancs>
Megegyezik az -exec kapcsolóval, de a parancs végrehajtása előtt jóváhagyást kér a felhasználótól.
-print
Hatására az aktuális állomány teljes nevét kiírja.
-xdev
Hatására a find nem megy át másik kötetre (csatolt eszközre). 19. táblázat. A find kapcsolói
Az opciókat a következő jelekkel kombinálhatjuk: ! (nem), -a (és), -o (vagy). Továbbá zárójelekkel csoportosíthatjuk, azonban a zárójeleket idézőjelekbe kell tenni, hogy a shell ne értelmezze. Az n értékek helyén a számok mellett használhatjuk a + és - jeleket: n: Pontosan az adott szám. +n: Több (nappal ezelőtt) mint n. -n: Kevesebb (nappal ezelőtt) mint n.
Feladat 1. Keressük meg az állományrendszeren az egyik felhasználó szimbolikus linkjeit! 2. Keressük meg az állományrendszeren a felhasználó azon állományait, amelyre valakinek végrehajtási joga van!
9 b:
blokk speciális állomány; c: karakter speciális állomány; d: könyvtár; f: normál állomány; l: szimbolikus link; p:
named pipe; s: socket.
56
3. Keressük meg az állományrendszeren azokat a rejtett állományokat és könyvtárakat, amelyeket kevesebb, mint egy napja módosítottak! A find parancs -exec paraméterével programokat is lefuttathatunk az egyes állományokra. Ez lehet a keresést szolgáló állomány tesztelő program, de ha egy -a paraméterrel illesztjük a keresés végére, akkor keresés eredményein végrehajtott művelet is. A find a „{}” jelek helyére a talált állományok nevét helyettesíti be, és így hajtja végre a parancsot minden állományra. A parancsot pontosvesszővel kell zárnunk. Hogy a shell ne értelmezze idézőjelbe kell tennünk, vagy „\” jelet kell tennünk elé. Nézzünk egy példát, ahol a program futtatása az állomány tesztelését szolgálja! find -exec grep -q "alma" {} ";" -a -print És egy másik példát, ahol az eredmény állományokon végzünk el műveletet. find -name "*fontos" -a -exec ls -l {} ";"
Feladat Minden „fontos” nevű állományt nevezzünk át „fontos.old”-ra! Ha nem vagyunk benne biztosak, hogy minden állományra szeretnénk végrehajtani a parancsot, akkor hasznos az -ok paraméter használata az -exec helyett. 4.1.2.
A head és tail parancsok
A head parancs a megadott állomány vagy a standard bemenet első néhány sorát írja ki: head <állomány> ... Ha -n <szám> argumentum meg van adva, akkor ennek megfelelő számú sort ír ki, egyébként tíz sort. head -n 5 myfile ls -l | head -n 12 A -c <szám> paraméterrel megadhatjuk, hogy hány bájtot írjon ki az állomány elejéről. A tail parancs a megadott állomány vagy a standard bemenet utolsó néhány sorát írja ki: tail <állomány> Az -n <szám> argumentummal megadhatjuk, hogy az állomány utolsó hány sorát írja ki. Ha szám helyett a -c +<szám> kifejezést használjuk, akkor az állomány elejétől számított megadott sortól írja ki a tartalmat. A -c <szám> hasonlóan az utolsó bájtokat adja meg. tail -n 20 myfile Az -f opcióval is használhatjuk a tail parancsot, amely azt eredményezi, hogy a program nem áll le az állomány végénél, hanem végtelen ideig próbálkozik tovább olvasni. Ezáltal folyamatosan követ57
hetjük a kimenet állományok vagy log állományok változását. Ilyenkor a Ctrl+C billentyűkombinációval állíthatjuk le. 4.1.3.
A sort parancs
A sort az összes megnevezett állomány sorait együtt sorba rendezi, és a rendezés eredményét kiírja a standard kimenetre: sort <állomány> ... Ha nem adunk meg állományt, vagy ez a „-” karakter, akkor a standard bemenetet használja bemenetként a program. Az opciók mezőben használható paraméterek: Paraméter
Leírás
-b
A kezdő szóközöket és tabulátorokat figyelmen kívül hagyja a mezők határának meghatározásánál. Szótárrendezés. Csak a betűk, számjegyek és szóközök számítanak az összehasonlításban.
-d -f
Kis és nagy betű figyelmen kívül hagyása.
-k pos1<,pos2>
A rendezendő mezők.
-n
Numerikus rendezés.
-r
Megfordítja a rendezés sorrendjét.
-t <mezőhatároló>
A mezőhatároló karaktert adhatjuk meg a szokásos szóköz és tab helyett. 20. táblázat. A sort kapcsolói
Nézzünk néhány példát a sort használatára! (A példaállomány az „autok”.) $ cat autok lamborghini:2 ferrari:4 porsche:10 lotus:5 Egyszerű rendezés az első karakter alapján: $ sort autok ferrari:4 lamborghini:2 lotus:5 porsche:10 Rendezés a sorok második karaktere alapján:
58
$ sort -k 1.2 autok lamborghini:2 ferrari:4 porsche:10 lotus:5 A -t paraméterrel megadjuk, hogy a mezőhatároló karakter a „:”. Ezután a második oszlop alapján rendezünk, de karakteresen: $ sort -t: -k 2 autok porsche:10 lamborghini:2 ferrari:4 lotus:5 Most ugyanezt elvégezzük numerikusan: $ sort -t: -n -k 2 autok lamborghini:2 ferrari:4 lotus:5 porsche:10
4.1.4.
A uniq parancs
A uniq egy nagyon egyszerű, de sokszor használt parancs. A sort paranccsal elvégzett rendezés után a duplikált sorokat eltávolíthatjuk. A -d paraméterrel csak a duplikált sorokat írja ki egy példányban, az -u paraméterrel pedig csak a nem duplikált sorokat. 4.1.5.
A cmp és diff parancsok
Mind a cmp, mind a diff parancs az állományok összehasonlítására szolgál. Azonban míg a cmp parancs csak egyszerű byte összehasonlítást végez, addig a diff parancs a szövegállományok sokkal komolyabb összevetésére képes. A cmp parancs két állományt binárisan hasonlít össze. Kiírja ha az állományok eltérnek, és megadja az eltérés pozícióját. Használata a következő: cmp <-ls> állomány1 állomány2 A diff parancs ennél sokkal komolyabb összehasonlítást végez. Értelmezi a szövegállományokat és megpróbálja megadni, hogy mely sorokat kell lecserélni, hogy az egyikből a másikat kapjuk. Törekszik arra, hogy úgy adja meg az eltéréseket, hogy a lista minimális legyen. Az alábbi módon használhatjuk. diff állomány1 állomány2
59
Ha mind a két paraméter katalógus, akkor a diff először névsorba rendezi a katalógusokban található állományneveket, majd azokra a szöveges állományokra, amelyek különböznek, a normál módon lefut a program. diff könyvtár1 könyvtár2 Különböző opciókkal megadhatjuk, hogy az összehasonlításnál milyen karaktereket vagy sorokat hagyjon figyelmen kívül, milyen legyen a kimenet formátuma. Az -u kapcsoló használatával megadható, hogy a nem egyező sorok környezetét (az előtte és utána következő sorokat) is írja ki a kimenetre, ezáltal a különbségek még pontosabb meghatározását téve lehetővé. Szoftverfejlesztés esetén a diff nagy segítséget jelenthet a verziók kezelésénél, vagy a patch-ek előállításánál. A nagyobb szoftverek (pl. a Linux kernel) esetén jól bevált gyakorlat, hogy a diff által generált különbség állományokat (patch fájl) is letölthetővé teszik. Így ha már rendelkezünk a forrás állományok korábbi verziójával, akkor nem szükséges az egész csomagot újból letölteni, elegendő a különbségfájlt. Majd ez alapján a patch programmal elvégeztethetjük a módosításokat, hogy a csomagunk az új verzió állapotába kerüljön. 4.1.6.
A patch parancs
A patch-csel és az előzőekben tárgyalt különbségfájlokkal (patch fájlokkal) lehetőségünk nyílik a eltérő verziójú állományok frissítésére, vagy reverse patch-elésére. patch <patchelendő fájl> -i -o A megfelelő különbségfájl birtokában akár egész könyvtárakat, azaz a könyvtárban levő összes állományt is frissíthetjük. Ez esetben azonban vigyázni kell, hogy különbségfájlban és a munkaállomásunkon a megfelelő könyvtárakat adjuk meg. Egy patch tényleges alkalmazása előtt a parancsot a --dry-run kapcsolóval futtassuk, amellyel a patch a megadott argumentumokkal lefut ugyan, de ténylegesen nem frissíti a fájlokat. Ezt a módszert a hibák elkerülése végett érdemes alkalmazni. A --reverse vagy a -R kapcsolók használatával egy már frissített, vagy a különbségfájllal azonos verziószámú állományt visszaalakíthatunk a különbségfájl által leírt korábbi verzióra. 4.1.7.
A grep parancs
A grep (Global Regular Expression Print) parancs a megadott mintát keresi az állományokban, és az illeszkedő sorokat kiírja a standard kimenetre. A minta lehet egy egyszerű szöveg, azonban a grep képes a reguláris kifejezésnek nevezett, speciális jelentésű karakterekkel kiegészülő szövegminta használatára is. grep minta <állomány >... Ha egynél több állománynevet adtunk meg, akkor a megtalált sorok elé kiírja azt is, hogy melyik állományban vannak. Az alábbi opciókkal befolyásolhatjuk a grep működését, a mintaillesztési szabályt (-i, -w), vagy az eredményként megjelenő információkat (-l, -n, -v).
60
Paraméter
Leírás
-i
A kis- és nagybetűket azonosnak tekinti.
-l
Csak az állományok nevét írja ki.
-n
Minden kiírt sor előtt a sorszám is szerepel.
-v
Inverz működés: a nem illeszkedő sorokat írja ki.
-w
A mintát, mint szót keresi. 21. táblázat. A grep kapcsolói
Létezik két módosult változata az alap grep utasításnak: • Az egrep mintaillesztője a kiterjesztett reguláris kifejezéseket is ki tudja értékelni. (Egyenértékű a grep -E utasítással.) • Az fgrep mintaillesztője csak egyszerű szöveget használ. (Egyenértékű a grep -F utasítással.) 4.1.8.
Egyszerű reguláris kifejezések
A szövegek feldolgozása során gyakori feladat a mintaillesztés. A minta megadására az egyszerűbb használhatóság érdekében közös szintaktikát használnak a programok. Ezt hívjuk reguláris kifejezésnek. Egy szövegmintában általában minden karakter önmagát jelenti, azaz a mintában az adott helyen elő kell fordulnia, de egyes karaktereknek speciális a jelentése, így adhatunk meg bonyolultabb mintát. Karakter
Jelentés
\
Az utána írt speciális karakter is karakterként kerül a mintába, kivéve: újsor-jel, számjegy, „(” vagy „)”.
^
Sor eleje.
$
Sor vége.
.
Egy darab valamilyen karakter.
*
Nulla vagy többször az előtte levő karakter.
.*
Nulla vagy több valamilyen karakter.
[abc]
Valamelyik karakter a listából, hasonlóan, mint a shell-nél. Használható pl. [a-c] módon is.
[^abc]
Bármely karakter, ami nem „a” vagy „b” vagy „c”. 22. táblázat. Egyszerű reguláris kifejezések
Ezen karakterek egy részét a shell is értelmezi. Hogy ez biztosan ne okozzon problémát a minta stringet egyszeres idézőjelek közé célszerű tenni. A reguláris kifejezések metakarakterei hasonlóak a shelléhez, azonban akad néhány eltérés. Továbbá a reguláris kifejezések jóval több speciális karaktert tartalmaznak. Ez a lista a fenti táblázatban megadottnál bővebb, azonban itt csak a legáltalánosabbak, a grep parancs által is értelmezhetőeket soroltuk
61
fel. Az egrep esetében lehetőségünk van a többi kifejezést is használni, azonban ezekre most nem térünk ki. grep "minta$" szoveg Azokat a sorokat írja ki a „szoveg” állományból, amelyeknek a végén a „minta” szó szerepel. cat szoveg | grep '[pt]i.os' Olyan sorokra illeszkedik, amelyekben szerepel egy szövegrészlet, ahol az első betű „p” vagy „t”, majd „i”, egy meghatározatlan karakter és „os”. Például piros vagy tilos. ls -l | grep "^d" A long listából azokat a sorokat írja ki, amelyek „d” betűvel kezdődnek, vagyis a könyvtárakat.
4.2.
Folyamatok
A programok elindításakor létrejön egy folyamat, amely tartalmazza a program kódját, adatait és a környezeti beállításokat is (munkakönyvtár, környezeti változók stb.). Minden folyamathoz az operációs rendszer egy egyedi folyamatazonosítót (process ID) és egy folyamat csoportazonosítót (process group ID) rendel. Egy folyamatot (kivéve a legelső folyamatot, az úgynevezett init-et) mindig egy másik folyamat hoz létre. A létrehozó folyamatot szülő folyamatnak (parent process), a létrehozott folyamatot gyermek folyamatnak (child process) nevezzük. Az init folyamatot kivéve minden folyamatnak van szülője. A gyermek a szülő másolata, csak az azonosítója különbözik. Így többek közt örökli a megnyitott állományok leíróit, az umask, ulimit értékeit, szignálok kezelésére vonatkozó beállításokat. A szülő-gyermek reláció alapján egy fa struktúrát is felrajzolhatunk. Ezt a pstree paranccsal nézhetjük meg. Amennyiben egy szülő folyamat előbb szűnik meg, mint annak gyermek folyamatai, a gyermek folyamatok árvákká (orphan) válnak, és szülőjük automatikusan az init folyamat lesz. A folyamatok továbbá tudnak még a szülő folyamat azonosítójáról (parent process ID) is. 4.2.1.
A folyamatok monitorozása
A folyamatokat a ps paranccsal listázhatjuk ki. ps Alapértelmezésben a ps parancs csak azokat a folyamatokat listázza ki, amelyeket az adott terminálról indítottunk. A listában csak a folyamat azonosítója, a terminál, a státusz, az eltelt idő, és a parancs neve szerepel. Azonban opciókkal nagyban befolyásolhatjuk a kilistázott folyamatokat és a megjelenített információkat.
62
Paraméter
Leírás
-A
Hatására az összes folyamatról információt kaphatunk.
-N
Negálja a folyamatválasztást.
-a
A terminálokhoz kapcsolódó összes folyamat listáját kapjuk, csak a shellek nem szerepelnek benne.
a
Az adott terminál folyamatait listázza ki.
r
Csak a futó folyamatokat írja ki.
-u
A megadott felhasználó folyamatait listázza ki.
x
Azokat a folyamatokat is kiírja, amelyek nem tartoznak terminálhoz. 23. táblázat. Folyamatok kiválasztása ps-sel
Paraméter
Leírás
-f
Ún. teljes listát ad.
-j
Kiírja az ún. job control információkat is.
-l
Hosszú listaformátummal jeleníti meg.
-o