Vse je datoteka – in kaj to pomeni :)

Na Linux sistemu (kot na UNIX) je vse datoteka.

  • datoteka je datoteka
  • nastavitve so v tekstovnih datotekah (npr. /etc/ za celoten sistem in ~/.config/ za uporabnika)
  • statistika in sistemske informacije so tekstovne (kvazi)datoteke (npr. v /proc/ in /sys/)
  • celo naprave (v /dev/) so datoteke (npr. /dev/nvme0 je SSD v prvi NVME reži)

Kaj to pomeni v praksi?

Nastavitve so datoteke

Kar se tiče nastavitev, jih lahko urejaš v kateremkoli urejevalniku besedil. Super praktično! Lahko tudi enostavno kopiraš od drugih, če najdeš kaj kar ti ustreza, pa je že nekdo drug naredil.

Ker so navadne tekstovne datoteke, lahko tudi enostavno iščeš po njih. Če npr. veš, da nekaj ne štima v nastavitvah, pa veš cca. kaj je narobe, lahko preiščeš celotne svoje nastavitve, da najdeš kje je napaka.

Kot primer, pred kratkim sem dodal nov SSD v svoj laptop in ga postavil v LUKS + Btrfs RAID1, kar je še kar zahtevna postavitev, in sem pozabil nekaj spremenit v boot loader (GRUB). Videl sem, da se GRUB pritožuje čez disk z UUID 2d90af35-7e6a-40f8-8353-f20433d0f994, ki ga sedaj ni bilo več, zato sem enostavno poiskal kje vse se skriva v /etc/ (rabiš sudo, ker navaden uporabnik zaradi varnosti nima vpogleda do vsega /etc/):

sudo grep --recursive 2d90af35-7e6a-40f8-8353-f20433d0f994 /etc/

/etc/crypttab:luks-2d90af35-7e6a-40f8-8353-f20433d0f994   UUID=2d90af35-7e6a-40f8-8353-f20433d0f994       /crypto_keyfile.bin     luks
/etc/fstab:/dev/mapper/luks-2d90af35-7e6a-40f8-8353-f20433d0f994   swap              swap    defaults                               0 0
/etc/default/grub:GRUB_CMDLINE_LINUX_DEFAULT='nowatchdog nvme_load=YES rd.luks.uuid=1a45a072-e9ed-4416-ac7e-04b69f11a9cc rd.luks.uuid=c82fca05-59d3-4595-969b-c1c4124d8559 rd.luks.uuid=2d90af35-7e6a-40f8-8353-f20433d0f994 rd.luks.uuid=2e91342f-3d19-4f75-a9a6-fc3f9798cb30 resume=/dev/mapper/luks-2d90af35-7e6a-40f8-8353-f20433d0f994 loglevel=3 splash quiet'
/etc/dracut.conf.d/calamares-luks.conf:add_device+=" /dev/disk/by-uuid/2d90af35-7e6a-40f8-8353-f20433d0f994 "

Sistemske informacije in signali so datoteke

Kar se tiče sistemskih informacij je podobno praktično, da lahko tako iščeš z grep ali drugače dostopaš do sistemskih informacij v /proc/ in /sys/ mapah.

Na primer, cat /proc/cpuinfo bo izpisal ogromno informacij o CPU, ki se uporablja.

Kot drug primer, lahko pogledam kako so schedulerji nastavljeni v mojem trenutnem Linux jedru, tako da zaženem samo zgrep /proc/config.gz (namesto zgrep lahko tudi odzippaš config in potem uporabiš navaden grep), in dobim naslednji seznam:

CONFIG_SCHED_CORE=y
CONFIG_HAVE_SCHED_AVG_IRQ=y
CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y
CONFIG_CGROUP_SCHED=y
CONFIG_FAIR_GROUP_SCHED=y
# CONFIG_RT_GROUP_SCHED is not set
CONFIG_SCHED_MM_CID=y
CONFIG_SCHED_AUTOGROUP=y
CONFIG_SCHED_OMIT_FRAME_POINTER=y
CONFIG_SCHED_CLUSTER=y
CONFIG_SCHED_SMT=y
CONFIG_SCHED_MC=y
CONFIG_SCHED_MC_PRIO=y
CONFIG_SCHED_HRTICK=y
CONFIG_CPU_FREQ_DEFAULT_GOV_SCHEDUTIL=y
CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y
CONFIG_MQ_IOSCHED_DEADLINE=y
CONFIG_MQ_IOSCHED_KYBER=y
CONFIG_IOSCHED_BFQ=y
CONFIG_BFQ_GROUP_IOSCHED=y
CONFIG_NET_SCHED=y
CONFIG_DRM_SCHED=m
CONFIG_USB_EHCI_TT_NEWSCHED=y
CONFIG_SCHED_STACK_END_CHECK=y
CONFIG_SCHED_DEBUG=y
CONFIG_SCHED_INFO=y
CONFIG_SCHEDSTATS=y
CONFIG_SCHED_TRACER=y

Še več! Ker je so sistemski statusi datoteke, lahko z njimi manipuliram! :supervillain:

Na mojem sistemu, na primer, lahko takole nastavim vse CPU procesorje, da gredo v »performance« mode (sudo tee, da zapiše “performance” kot root v vse te datoteke):

echo "performance" | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor

Pa kaj, če so datoteke?

Malo za hec, pa še kako predvajaš random zvok…

aplay -c 2 -f S16_LE -r 44100 /dev/random

Pri tem je /dev/random »naprava«, ki proizvaja (kvazi)naključen signal. In ker je datoteka, če rečeš programu za predvajanje aplay naj predvaja to datoteko, jo pač bo. (Deluje tudi direktno z aplay /dev/random, ampak je bolj nadležen zvok).

Podobne hecne naprave na Linuxu so še:

  • /dev/null – vgrajena »črna luknja«, praktična, da kadar ne rabiš nekega outputa, pošlješ vanjo
  • /dev/full – večen signal, da je »naprava polna«, uporabno za testiranje
  • /dev/zero – neskončnen signal ničel, uporaben npr. za brisanje
  • /dev/random – proizvaja (kvazi)naključen signal
  • /dev/urandom – proizvaja (bolj) naključen signal, ki ga dodatno razsuje z branjem raznih drugih naprav

Več takih zanimivih:

2 všečka

Toliko za uvod.

Kdor ima kako vprašanje, le na plan z njim.

Staroste, pa prosim, da dodajo še kak fin primer, kako se to lepo lahko uporablja za razne namene. (npr. lahko bi kdo kak dober primer cevovodov / piping prikazal in razložil)