Direktorijumi i fajlovi Linux sistema

Na Windowsu imaš C:\, D:\ i svaki disk svoje slovo. Na Linuxu postoji samo jedno stablo koje počinje od korena, oznake /. Svi diskovi, particije, USB uređaji i mrežni deljeni direktorijumi ubacuju se negde u to stablo.

Ta razlika je prva stvar koja zbunjuje, a druga je što svaki direktorijum u korenu ima tačno određenu svrhu. To nije stvar navike nego standarda koji se zove FHS — Filesystem Hierarchy Standard.

Zato se, kad naučiš ovu strukturu, snalaziš na svakom Linux sistemu na svetu, bez obzira na distribuciju.

Pogled na koren

$ ls /
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr

Deluje kao gomila skraćenica, ali svaka ima logiku. Podeliću ih po tome koliko ćeš ih često koristiti.

Direktorijumi koje ćeš koristiti svakog dana

/etc — konfiguracija

Ovde je podešavanje celog sistema i svih servisa. Sve su to obični tekstualni fajlovi koje uređuješ editorom.

/etc/passwd              korisnički nalozi
/etc/shadow              lozinke (samo root ih čita)
/etc/group               grupe
/etc/fstab               šta se montira pri butovanju
/etc/hosts               ručno mapiranje imena na IP adrese
/etc/resolv.conf         DNS serveri
/etc/ssh/sshd_config     podešavanje SSH servera
/etc/httpd/              konfiguracija Apache-a (RHEL porodica)
/etc/apache2/            isto to na Debian porodici
/etc/cron.d/             zakazani poslovi

Kad god negde piše „izmeni konfiguraciju", odgovor je gotovo uvek negde u /etc. To je i prvi direktorijum koji treba da uđe u tvoj backup.

Činjenica da je sve u čitljivom tekstu je velika prednost — konfiguraciju možeš pregledati, uporediti sa diff-om i čuvati u sistemu za verzionisanje.

/home — korisnički fajlovi

/home/alen/
/home/marko/

Svaki korisnik ima svoj direktorijum i u njemu puna prava. Tu su dokumenti, preuzimanja i lična podešavanja programa.

Prečica je tilda:

$ cd ~
$ cd ~/Documents
$ ls ~/.ssh

Fajlovi koji počinju tačkom su skriveni — to je sve što treba da ih sakrije, nema posebnog atributa. Tu žive lična podešavanja:

$ ls -a ~
.bashrc  .bash_history  .ssh  .config  .local

Zato ls u home direktorijumu deluje prazno, a ls -a pokaže desetine stavki.

/var — podaci koji rastu

Sve što se menja tokom rada sistema.

/var/log/           logovi
/var/log/messages   opšti sistemski log
/var/log/secure     prijave i autentikacija
/var/log/httpd/     logovi Apache-a
/var/www/html/      sadržaj veb sajta
/var/lib/mysql/     podaci baze
/var/spool/         redovi čekanja (štampa, mejl)
/var/cache/         keš paketa i aplikacija

Kad nešto ne radi, put te vodi u /var/log. Danas veći deo toga čitaš kroz journalctl, ali servisi i dalje pišu i sopstvene fajlove.

Ovo je i direktorijum koji najčešće napuni disk. Log koji niko ne rotira ume da pojede stotine gigabajta. Zato se /var na serverima često stavlja na zasebnu particiju — ako se napuni, ne obori ceo sistem.

/tmp — privremeni fajlovi

Prostor u koji svako sme da piše. Sadržaj se briše pri restartu ili posle nekoliko dana, u zavisnosti od podešavanja.

Dobro za raspakivanje nečega na brzinu. Loše za bilo šta što ti treba sutra — sistem sme da ga obriše bez najave.

Gde su programi

Ova četiri direktorijuma sadrže izvršne fajlove i razlikuju se po tome ko ih i kada koristi.

DirektorijumŠta sadrži
/binosnovne komande dostupne svim korisnicima — ls, cp, bash
/sbinadministratorske komande — fdisk, mkfs, ip
/usr/binnajveći deo instaliranih programa
/usr/sbinadministratorski servisni programi

Na modernim distribucijama /bin i /sbin su samo simbolički linkovi na odgovarajuće u /usr. Vidi se odmah:

$ ls -l /bin
lrwxrwxrwx. 1 root root 7 Apr 12 09:31 /bin -> usr/bin

Gde je konkretna komanda:

$ which ls
/usr/bin/ls

$ which fdisk
/usr/sbin/fdisk

Šta je zapravo /usr

Skraćenica ne znači „user" nego Unix System Resources. Tu je najveći deo instaliranog sistema:

/usr/bin/        programi
/usr/lib/        biblioteke
/usr/share/      podaci nezavisni od arhitekture — man stranice, ikone, dokumentacija
/usr/local/      ono što si sam instalirao, mimo menadžera paketa

/usr/local/bin je pravo mesto za tvoje skripte koje treba da budu dostupne svima na sistemu. Menadžer paketa tu ništa ne dira, pa ti nadogradnja neće prepisati fajl.

/opt

Za softver koji se instalira kao celina, u svoj direktorijum — tipično komercijalne aplikacije koje ne dolaze iz repozitorijuma.

/opt/google/chrome/
/opt/moja-aplikacija/

Sistemski direktorijumi

/boot

Kernel, initramfs i butloader. Sve što je potrebno da se sistem digne, opisano u lekciji Proces butovanja Linuxa.

$ ls /boot
vmlinuz-6.12.0-211.el10.x86_64
initramfs-6.12.0-211.el10.x86_64.img
grub2/

Ovaj direktorijum je obično na zasebnoj, maloj particiji. Ume da se napuni starim kernelima posle više nadogradnji — čest uzrok neuspele nadogradnje.

/dev — uređaji

Na Linuxu je i hardver predstavljen kao fajl.

/dev/sda        prvi disk
/dev/sda1       prva particija na njemu
/dev/null       "kanta" — sve što tu upišeš nestaje
/dev/zero       beskonačan izvor nula
/dev/random     izvor slučajnih podataka

/dev/null ćeš sretati stalno, kad hoćeš da se izlaz komande ne prikazuje:

$ komanda > /dev/null 2>&1

/proc i /sys

Ovo nisu pravi direktorijumi na disku nego prozor u kernel. Fajlovi se stvaraju u trenutku kad ih pročitaš.

$ cat /proc/cpuinfo
$ cat /proc/meminfo
$ cat /proc/uptime
$ cat /proc/1234/status

Svaki pokrenut proces ima svoj direktorijum sa brojem PID-a. Odatle komande poput ps i top i vuku podatke.

/sys je sličan, ali za hardver i drajvere. Kroz njega se podešavaju parametri kernela u radu.

/run

Podaci o trenutnom stanju sistema — PID fajlovi, soketi, lock fajlovi. Živi u memoriji i prazan je posle svakog restarta.

/root

Home direktorijum administratora. Nije isto što i / — zbunjujuće ime, ali su to dve različite stvari.

/mnt i /media

/media je mesto gde sistem sam montira USB i optičke uređaje. /mnt je za ručno montiranje, kad ti zatreba privremeno.

# mount /dev/sdb1 /mnt

Više o tome u lekciji Upravljanje particijama i mauntovanje.

/srv i /lib

/srv je predviđen za podatke servisa, ali ga u praksi mnogi preskaču u korist /var/www. /lib i /lib64 sadrže deljene biblioteke i njih ne diraš ručno.

Putanje

Putanja je adresa fajla u stablu. Postoje dva načina da je zapišeš.

Apsolutna

Kreće od korena i uvek znači isto, bez obzira gde se nalaziš:

/etc/ssh/sshd_config
/home/alen/Documents/plan.txt
/var/log/messages

Relativna

Kreće od direktorijuma u kom si trenutno:

Documents/plan.txt
../marko/
./skripta.sh
OznakaZnačenje
.trenutni direktorijum
..direktorijum iznad
~tvoj home
-prethodni direktorijum u kom si bio
$ cd /var/log
$ cd /etc
$ cd -
/var/log

Poslednja prečica je zgodna kad skačeš između dva mesta.

Kada koju koristiti

Relativne su kraće za kucanje. Apsolutne su obavezne u skriptama — skripta koju pokreće cron ne kreće iz direktorijuma iz kog misliš, pa relativna putanja pokazuje na pogrešno mesto ili nikuda.

Sve je fajl

Ovo je osnovna ideja Unixa, i vredi je razumeti jer objašnjava mnogo toga. Fajl nije samo dokument — fajl je i disk, i tastatura, i mrežna konekcija, i proces.

Zato iste komande rade nad svim:

$ cat /etc/hostname        tekstualni fajl
$ cat /proc/cpuinfo        podatak iz kernela
$ cat /dev/urandom         izvor slučajnih bajtova

Tip stavke vidiš po prvom znaku u ispisu:

$ ls -l /
drwxr-xr-x.  2 root root  4096 Aug 19 11:04 bin
lrwxrwxrwx.  1 root root     7 Apr 12 09:31 lib -> usr/lib
brw-rw----.  1 root disk  8, 0 Aug 21 09:12 /dev/sda
ZnakŠta je
-običan fajl
ddirektorijum
lsimbolički link
bblok uređaj (disk)
cznakovni uređaj (terminal)

Ostatak reda su dozvole, tema zasebne lekcije.

Nema ekstenzija — bar ne za sistem

Na Windowsu .exe znači program. Na Linuxu ekstenzija je samo deo imena; sistem je ne gleda. Da li je fajl izvršan određuje dozvola, a šta je zapravo unutra otkriva:

$ file /usr/bin/ls
/usr/bin/ls: ELF 64-bit LSB pie executable, x86-64

$ file /etc/passwd
/etc/passwd: ASCII text

Zato skripta ne mora imati .sh u imenu, i zato fajl sa nastavkom .txt može biti bilo šta.

Kako se snaći na tuđem sistemu

Ovih nekoliko komandi daju ti sliku za pola minuta:

$ df -h                       koje particije postoje i koliko su pune
$ du -sh /var/log             koliko zauzimaju logovi
$ ls -la /etc | head -30      šta je sve konfigurisano
$ find /etc -name "*.conf" -newer /etc/fstab   šta je skoro menjano

A kad tražiš konkretan fajl a ne znaš gde je:

$ find / -name "httpd.conf" 2>/dev/null
$ locate httpd.conf

Dodatak 2>/dev/null sakriva poruke o direktorijumima u koje nemaš pristup, pa ispis ostaje čitljiv.

Vežba

  1. Izlistaj koren i pogledaj koji od direktorijuma su simbolički linkovi (ls -l /)
  2. Pronađi u /etc fajl koji definiše DNS servere
  3. Proveri koliko zauzima /var/log
  4. Pogledaj koliko jezgara ima tvoj procesor, kroz /proc
  5. Pređi u /var/log, pa u /etc, pa se vrati jednim potezom
  6. Sazna gde se nalazi izvršni fajl komande systemctl
  7. Izlistaj skrivene fajlove u svom home direktorijumu i pogledaj .bashrc

Povezano: ls · find · df · Linux osnove

Comments

Popular posts from this blog

Početak u Linuxu — šta je i zašto se uči

Konverzija tipova podataka u Pythonu

groupadd