Rozdělení disku na víc oddílů je na serveru téměř nezbytné – například usnadňuje práci a zlepšuje spolehlivost běžících služeb. Na závěr dnešního článku se podíváme také na praktické nastavení kvót.
17.5.2005 06:00 | Ondřej Čečák | přečteno 30154×
You can tune a filesystem, but you can't tune a fish.
-- man tunefs(8), sekce BUGS
Úvodem – vhodné rozdělení disku může být velmi prospěšné, ale přesto existují situace, kdy je skoro zbytečné. U jednoduchých embedded zařízení, routeru nebo firewallu to může být spíše komplikující.
Způsobů, jak rozdělit disk, je mnoho. Jako nejrelevantnější způsob dělení se zdá rozdělit diskový prostor na
/home
, /srv
– sdílená data,
data pro webserver, ftp server a podobně)/var
– logy, tisková a emailová fronta, zámky a
různé cache, ...)
Toto rozdělení se vyplatí z mnoha důvodů. Jedním z nich je snadná administrace
– například můžete jednoduše přeinstalovat systém, aniž byste se nějak
dotkli uživatelských dat v /home
. Dále si můžete zjednodušit
proces zálohování – oddělené svazky pak lze snadno zálohovat různými
způsoby. V neposlední řadě tak také zvýšíte bezpečnost a stabilitu; na zápis
do oddílu / (root) nebude mít nikdo kromě superuživatele právo a současně to bude
jediný svazek, který bude namountovaný bez voleb nosuid
a
nodev
. Stabilitě systému pomůže vhodné oddělení lepší kontrolou a jistou ochranou
před zaplněním svazku (uživatelé tak nebudou moci omylem způsobit pád mnoha
démonů, kteří potřebují určitý volný prostor pro zápis runtime dat). Rozdělení
prostoru je také vhodnější pro vytváření kvót.
Problém může nastat v případě, kdy špatně odhadnete velikost; pak bude někde volné místo chybět a jinde přebývat. I tato situace se dá řešit – předejít tomu můžete např. umístěním svazků na LVM. Pro začátek nastavíte oddílům malou velikost (a necháte si tak dostatečnou část disku nevyužitou) a pak postupně zvětšujete prostor dle potřeby. Tento postup je lepší než zmenšování; i když ho filesystém podporuje, tak je přece jenom více riskantní. Mimochodem, např. XFS a EXT3 mohou být zvětšovány přímo za chodu.
Začněme od rootu (/
). Na něm by nemělo být nic, co se za
normálního chodu mění, uživatelé by tam neměli mít možnost zápisu.
Všechny svazky kromě /
by se měly mountovat s volbami
nosuid
(znefunkční spouštění programů pod jiným uživatelem
nebo skupinou než je uživatel, který program spouští) a nodev
(na
filesystému nebudou interpretována bloková nebo znaková zařízení). Pokud si
nebudete jistí, jestli nejsou suid programy na jiných svazcích než na
/
, můžete použít příkaz find /home -type f -perm -4000
,
který prohledá adresář /home
a vypíše všechny programy s
příznakem SUID.
Určité místo by mělo být vyhrazeno pro swap. Ten se dá v Linuxu snadno přidávat a ubírat za chodu a může být případně pouze v souboru na nějakém existujícím filesystému. Swap může být umístěn na LVM; umisťovat byste ho ale neměli na softwarový RAID (kvůli možnosti deadlocku, který může nastat v případě, kdy bude systému docházet volná paměť).
Svazek /tmp
by měl být už z principu oddělen, právo k zápisu do tohoto
adresáře má obvykle každý a přesto je poměrně důležitý (pro běh různých služeb
apod.) – je rozumné, aby
na něm byly nastaveny kvóty nebo alespoň rezervované místo pro roota.
Adresáře s daty (/home
, /srv
) a podobně je vhodné
umístit na jeden oddíl. Pro vlastní realizaci adresářů můžete použít symlinků
a nebo mount
s parametrem --bind
, který
dokáže určitý adresář připojit na jiném místě. Jak už bylo zmíněno výše, tento
postup se vyplatí kvůli snadnějšímu zálohování nebo zásahům do systému.
Zvláštní oddíl by měl mít také adresář /var
, který je trochu problémový
– je životně důležitý pro mnoho démonů a uchovávají se v něm systémové
logy. Ve /var
je několik adresářů, kam má právo zápisu kdokoli
(např. /var/lock
) a proto by zde měli mít ti, kteří ve /var
nemají moc co
dělat, nastavenou nějakou kvótu. Přes všechna opatření ale musíte počítat
s tím, že pokud bude uživatel chtít, může tento svazek snadno zaplnil (např.
hromadou nedoručitelných emailů, které se budou hromadit ve frontě
MTA nebo přinucením logování nějakého démona).
Pro lokální zálohování je dobré vytvořit oddíl /backup
(ať už
dostupný uživatelům pouze pro čtení, nebo neveřejný). Jeho oddělení má smysl
už proto, že jeho obsah nebudete zálohovat. V případě, že se rozhodnete zálohy
zveřejnit, pořádně si tento krok promyslete, aby jste předešli situaci,
kdy se mohou nepovolaní snadno dostat k cizím datům (proto je lepší archivy se
zazálohovanými daty raději schovat, popř. ještě zašifrovat).
Užitečné bývá také vytvoření adresáře, který je dostatečně velký a dostupný
všem (podobně jako /tmp
), ovšem bez rizik plynoucích z jeho možného
přeplnění.
Úvodem – v Linuxu (a ostatně ve všech běžných unix-like systémech) je možné definovat kvóty dvěma způsoby a to sice per user/group a nebo per filesystem. V prvním případě můžete nastavovat pravidla pro uživatele nebo skupiny v rámci systému, v druhém pro celé souborové systémy.
Uživatelé můžou omylem a nebo svým nevhodných chováním snadno zaplnit přidělený
prostor, což může komplikovat práci dalším uživatelům a tak dále. Pomocí kvót můžete
definovat uživateli nebo skupině maximální možný limit diskového prostoru,
který svými daty může zabrat. Pro možnost práce s kvótami potřebujete podporu
filesystému a userspace nástroje (typicky
balíček quota
).
Před vlastním zavedením kvót bude ještě potřeba udělat pár úprav. Tou první je
dopsání volby usrquota
do /etc/fstab
. Část
fstab
u by pak mohla vypadat například takto:
# /etc/fstab: static file system information.
#
# <file system> <mount point> <type> <options> <dump> <pass>
# static
/dev/hda2 / ext3 defaults 0 0
/dev/hda3 none swap sw 0 0
/dev/hda4 /home ext3 defaults,usrquota 0 0
Poznámka: pokud chcete používat kvóty per group, doplňte či nahraďte
usrquota
o grpquota
.
Pokud na to nemáte distribuční skripty, bude nutné uvést kvótování do provozu
ručně pomocí příkazu quotacheck -avug
; nejspíš budete upozorněni, že
žádný svazek není namountován s volbou usrquota
. Pokud jste do
/etc/fstab
tuto volbu připsali, nezbývá než s touto volbou
filesystém připojit, v našem příkladu pomocí příkazu mount /home -o
remount
. Výše uvedený příkaz můžete zkusit znovu, odpoví vám, že
filesystém není připojen pouze pro čtení – buďto ho přemountujte a nebo
použijte parametr -m
(během testování by se na testovaný svazek
nemělo zapisovat). Po dokončení můžete kvótování aktivovat příkazem quotaon -avug
.
Tak, nyní zbývá už jenom omezení nastavit. S tím souvisí několik pojmů:
Hard limit je maximální možné obsazení diskového prostoru; nad tuto hranici si uživatel už nic neuloží. Soft limit je hranice nižší než u hard limitu, lze ji překročit, nicméně uživatel bude varován a poběží mu grace period, časový limit, po kterém už nebude moci ukládat přes soft limit. Kvótu lze nastavit na počet bloků (block) nebo inodů (inodes).
Známe-li už potřebné pojmy, můžeme se pustit do vlastní konfigurace:
linuxovy_server# edquota -F vfsv0 -f /home -t Grace period before enforcing soft limits for users: Time units may be: days, hours, minutes, or seconds Filesystem Block grace period Inode grace period /dev/hda4 7days 7days linuxovy_server# edquota -F vfsv0 -f /home -u uzivatel Disk quotas for user uzivatel (uid 501): Filesystem blocks soft hard inodes soft hard /dev/hda4 251664 0 0 11308 0 0
Pojďme si to postupně vysvětlit (modře obarvený text označuje zadané příkazy).
Nejprve jsme pomocí programu edquota
spustili editor nastavení,
kterým díky parametru -t
na konci nastavíme grace period.
Důležité je, že tento "časový limit" je možné nastavit pouze pro
určitý oddíl a ne pro jednotlivé uživatele/skupiny. Po zadání příkazu se
standardně spustí program vi
, v případě, že byste chtěli použít
něco jiného, nastavte proměnnou EDITOR (v BASHi např. export
EDITOR=pico
). V textovém editoru pak pouze nastavte místo nul
soft/hard limit pro bloky nebo inody (aktuální zabraný počet už máte
pro představu vyplněný).
Druhý zadaný příkaz už nastavuje kvótu uživateli uzivatel
. Ještě dodám, že
parametr -F
slouží pro určení verze kvóty 2 (s jiným typem formátu by to
nefungovalo), -f
určuje svazek.
Pokud budete chtít nastavit stejné limity i dalším uživatelům, můžete snadno
použít parametr -p
, který nastavení zkopíruje, např.:
edquota -p uzivatel uzivatel2 uzivatel3 uzivatel4 uzivatel5
.
Po našem úspěšném nastavení kvót se uživatel může podívat, jak na tom s místem na disku je:
uzivatel@linuxovy_server:~$ quota -v
Disk quotas for user uzivatel (uid 501):
Filesystem blocks quota limit grace files quota limit
/dev/hda4 251664* 250000 500000 7days 11308 0 0
Jak je asi zřejmé, uživatel uzivatel
překročil soft limit v blocích a má 7 dní
na to, aby to napravil.
XFS má oproti představeným souborovým systémům výhodu – při jeho návrhu se s
kvótami už počítalo, takže jsou informace o nich přímou součástí metadat a
nejsou potřeba speciální soubory (a)quota.user
a případně
(a)qouta.group
jako v předchozím případě. Také je pěkné, že
obslužné programy jako například xfsdump
a
xfsrestore
kvóty dokáží také zálohovat.
Před tím, než si začnete s kvótami na XFS hrát, musíte zapnout jejich podporu.
O to by se měly starat skripty při spouštění systému, spustit by měly příkaz
quotaon -a
.
Stejně jako v předchozím případě je nutné do /etc/fstab
připsat k
volbám mountovaného souborového systému usrquota
popřípadě
grpquota
.
Pomocí příkazu edquota opět můžete snadno definovat omezení:
linuxovy_server# edquota -f /srv -u uzivatel
Disk quotas for user uzivatel (uid 501):
Filesystem blocks soft hard inodes soft hard
/dev/scsi/host0/bus0/target1/lun0/part1 0 70000 80000 0 1500 2000
Stav kvót můžete otestovat jako superuživatel nebo i jako uživatel:
linuxovy_server# repquota /srv
*** Report for user quotas on device /dev/scsi/host0/bus0/target1/lun0/part1
Block grace time: 7days; Inode grace time: 7days
Block limits File limits
User used soft hard grace used soft hard grace
----------------------------------------------------------------------
root -- 25492 0 0 4 0 0
uzivatel -- 24000 60000 80000 1 1500 2000
Poznámka: v případě, že chcete nastavit kvóty na kořenovém svazku, musíte
postupovat trošku odlišně – nejprve je nutné zapnout kvótování pomocí
quotaon
a vlastní nastavení budete moci provést až po rebootu.
Mimochodem, vyplatí se spouštět periodicky nějaký skript, který otestuje stav
kvót a v případě překročení pošle administrátorovi třeba email. Použít k tomu
můžete třeba program warnquota
.
Vhodné rozdělení svazku a případně nastavené kvóty jsou rozhodně přínosem, a to jak pro vás, tak i pro uživatele.
Používáte také dělení disků na svých serverech? Dělíte je trochu jinak, máte na dělení jiný názor? Podělte se o své zkušenosti v diskuzi pod článkem.