(Prezentace OpenOffice.org Impress)
Projekt Linux VServer umožňuje využít jeden hardwarový systém (počítač) jako více nezávislých systémů, které se pro koncové uživatele (včetně uživatele root) jeví, jako kdyby běžely na počítači dedikovaně. Této virtualizace hardwaru lze využít například pro tyto účely:
Jeden virtuální server se v terminologii VServeru nazývá kontext. Oddělení kontextů je realizováno čiště na logické úrovni kernelu metodou, která se nazývá soft-partitioning – všechny kontexty tedy sdílejí společný kernel a jeho základní nastavení, rootovský souborový systém atd. Neprovádí se žádná emulace instrukcí (privilegovaných či neprivilegovaných), pouze se kontroluje oprávnění přístupů k jednotlivých systémovým objektům z různých kontextů.
V jednotlivých kontextech může být nainstalovaný libovolný software, dokonce i zcela různé linuxové distribuce. Protože se veškerá virtualizace provádí na vysoké úrovni v kernelu, je VServer prakticky nezávislý na hardwarové platformě. Úspěšně je testován na těchto platformách: IA-32, IA-64, AMD-64 (EM64T), Alpha, MIPS, MIPS-64, PPC, PPC-64, Sparc, Sparc-64, S390, UML.
Linux VServer se skládá ze dvou základních částí:
Původní autor kernelového patche a správcovských utilit (v C++) je Jacques Gélinas, od roku 2003 je maintainer Herbert Pötzl. Enrico Scholz je autorem nových user-space utilit psaných v C.
Oddělení kontextů je realizováno pomocí několika prostředků:
/proc
, nelze jim posílat signály apod.).
Výjimkou je proces init
(8), který je volitelně viditelný ve všech kontextech (kvůli kompatibilitě s utilitami
ps
(1), pstree
(1) atd.), ovšem nelze mu posílat signály./vservers
) je chráněn tzv. chroot bariérou, která upravuje sémantiku kernelového
volání chroot
(2), aby nebylo možné chroot opustit./proc
atd.Po nabootování VServer kernelu se původní user-space systém nachází v tzv. host contextu s číslem 0. Ten je ekvivalentní s ostatními virtuálními servery, jen má ve výchozím nastavení neomezený přístup k hardwaru a prostředkům kernelu.
Speciální spectator context (číslo 1) slouží pro souhrnné sledování všech ostatních kontextů. Lze v něm tedy vidět procesy a prostředky všech ostatních kontextů. Do spectator contextu se může přepnout výhradně uživatel root z host contextu.
Aby nemusel každý virtuální server obsahovat svou kopii stejných souborů (obvykle binární soubory v /usr/bin
,
/usr/lib
apod.), lze použít metodu unifikace. Shodné soubory se změní na hardlinky (na společný i-node) a nastaví
se jim speciální příznak immutable-linkage-invert
, který způsobí, že v případě pokusu o změnu (nebo unlink) dojde
k vytvoření kopie souboru.
Tak lze snadno zajistit, že jednotlivé virtuální servery bude možné nezávisle modifikovat, ale v případě potřeby lze znovu
projít soubory na shodu a provést unifikaci. Příznak immutable-linkage-invert
je zatím implementován
pro ext2, ext3 a reiserfs.
Každý soubor lze přiřadit do jednoho kontextu pomocí atributu XID. Daný soubor je poté přístupný jen z příslušného kontextu. Takto lze použít sdílený souborový systém pro více kontextů a přitom zajistit bezpečnost, sledovat per-context diskové kvóty atd.
Na souborových systémech ext2 a ext3 je XID implementován jako nová položka i-nodu, což umožňuje zachovat plný rozsah
UID a GID atributů souborů. U ostatních souborových systémů lze vyhradit některé horní bity UID/GID pro kódování
XID (rozdělení 32:16, 16:32 nebo 24:24) – souborový systém je třeba připojit s parametrem tagxid
.
Kernel helpers jsou skripty emulující v kontextu 0 provádění syscallů z jiných kontextů. Nejpoužívanější je rebootmgr, který
se aktivuje po kernelovém volání reboot
(2) uvnitř jiného kontextu. Pomocí skriptů vreboot a vhalt se poté
provede zastavení nebo restart virtuálního serveru, jako by se jednalo o fyzický systém.
Instalace se provádí opatchováním zdrojáků kernelu příslušné verze (např. patch -p1 < patch-2.6.12.4-vs2.0.diff.bz2
).
V konfiguraci kernelu (typicky pomocí make menuconfig
) se objevi nová top-level polozka Linux VServer:
[*] Enable Legacy Kernel API [ ] Show a Legacy Version ID [ ] Disable Legacy Networking Kernel API [*] Enable Proc Security [ ] Enable Hard CPU Limits Persistent Inode Context Tagging (UID24/GID24) ---> [ ] Tag NFSD User Auth and Files [ ] VServer Debugging Code
Legacy Kernel API zapíná podporu API kompatibilního se staršími util-vserver. Enable Proc Security zapíná
podporu omezení položek v /proc
, Enable Hard CPU Limits umožňuje nastavit striktní limity využití CPU
jednotlivých kontextů. Persistent Inode Context Tagging umožňuje vybrat alokaci XID bitů z UID/GID bitů filesystému.
Tag NFSD User Auth and Files povoluje ukládání XID tagů kernelovým NFS daemonem. VServer Debugging Code povoluje
ladící výpisy.
Výše uvedená konfigurace je výchozí a doporučená. Po konfiguraci, přeložení a instalaci se kernel jednoduše nabootuje. Základní běh systému by měl být zcela shodný se standardním kernelem.
Pro zprovození virtuálních serverů je ještě nutné nainstalovat balík util-vserver. Nejlépe z distribučního balíčku, je-li k dispozici,
nebo stažením a překladem zdrojáků (klasická kombinace ./configure && make && make install
).
Adresáře s virtuálními servery jsou obvykle podadresáři adresáře /vservers
. Pro aktivaci chroot bariery je potřeba
použít chmod 0000 /vservers
.
chcontext [--cap <capability>] [--cap <!capability>] [--xid <context>] [--flag <flag>] [--secure] <prog>
Spustí proces <prog>
v novém kontextu. Uživatel root z kontextu 0 může pomocí parametru --xid
specifikovat číslo kontextu (v opačném případě je vytvořen vždy nový). Pomocí přepínačů --cap
lze nastavit capability
ceiling, přepínač --secure
odstraní z capability ceiling všechna potenciálně nebezpečná oprávnění.
Přepínač --flags
(lze použít vícekrát) umožňuje nastavit příznaky nového kontextu:
/sbin/init
(viz výše)--xid
nebude možné spustit v daném kontextu nový proces
(jinak než přímo uvnitř kontextu)vps, vpstree, vtop, vtop, vkill
Skripty, které může spustit root z kontextu 0 (host context) a uvnitř kontextu 1 (spectator context) spustí příslušné
utility jako ps
, pstree
atd. Zároveň upraví jejich výstup, aby obsahoval u každého procesu
číslo kontextu. Příklad výstupu:
PID CONTEXT TTY TIME CMD 1 0 MAIN ? 00:00:07 init 2 0 MAIN ? 00:00:02 migration/0 3 0 MAIN ? 00:00:00 ksoftirqd/0 4 0 MAIN ? 00:00:00 events/0 5 0 MAIN ? 00:00:01 khelper 6 0 MAIN ? 00:00:00 kthread 12 0 MAIN ? 00:00:00 kacpid 98 0 MAIN ? 00:00:41 kblockd/0 195 0 MAIN ? 00:00:00 aio/0 197 0 MAIN ? 00:01:10 xfslogd/0 199 0 MAIN ? 00:00:00 xfsdatad/0 960 0 MAIN ? 00:00:00 ata/0 1014 0 MAIN ? 00:00:00 exec-osm/0 1020 0 MAIN ? 00:00:00 block-osm/0 1026 0 MAIN ? 00:00:00 kcryptd/0 1028 0 MAIN ? 00:00:00 kmpathd/0 1030 0 MAIN ? 00:00:00 kmirrord/0 4544 0 MAIN ? 00:00:00 pdflush 102 0 MAIN ? 00:00:00 khubd 194 0 MAIN ? 00:12:14 kswapd0 201 0 MAIN ? 00:01:17 xfsbufd 801 0 MAIN ? 00:00:00 kseriod 965 0 MAIN ? 00:00:00 scsi_eh_0 1032 0 MAIN ? 00:00:01 kirqd 1035 0 MAIN ? 00:00:07 xfssyncd 1088 0 MAIN ? 00:00:00 udevd 1647 0 MAIN ? 00:00:01 irqbalance 5799 0 MAIN ? 00:00:00 xfssyncd 7586 0 MAIN ? 00:10:45 mysqld 7614 0 MAIN ? 00:19:48 mysqld 7615 0 MAIN ? 00:01:37 mysqld 7604 0 MAIN ? 00:00:09 sshd 11947 0 MAIN ? 00:00:00 sshd 11956 0 MAIN ? 00:00:00 sshd 11957 0 MAIN pts/0 00:00:00 bash 11997 0 MAIN pts/0 00:00:00 su 12014 0 MAIN pts/0 00:00:00 bash 12283 1 ALL_PROC pts/0 00:00:00 vps 12284 1 ALL_PROC pts/0 00:00:00 ps 8210 1000 artemis ? 00:00:00 apache 8214 1000 artemis ? 00:00:00 accesslog 8215 1000 artemis ? 00:00:14 apache 8216 1000 artemis ? 00:00:13 apachePro zobrazování souhrnných informací o kontextech lze použít
vserver-stat
:
CTX PROC VSZ RSS userTIME sysTIME UPTIME NAME 0 361 3.3G 1.6M 2d06h13 23h51m25 25d05h53 root server 1000 26 794.2M 59.5K 25m49s60 4m18s92 25d05h51 artemis
Pokud je potřeba spouštět síťové služby v kontextu 0 a zároveň nechceme, aby se takové složby nabindovaly na všechny virtuální síťové interfacy virtuálních serverů (tj. na adresu 0.0.0.0), lze použít utilitu
chbind [--ip <ip>[/<mask>]] [--bcast <broadcast>] [--] <command> <args>*
pro omezení procesu <command>
jen na určitý síťový inteface.
Konfigurace jednotlivých virtuálních serverů je uložena v souborech /etc/vservers/<name>.conf
:
S_CONTEXT=1000 IPROOT=62.24.85.244 IPROOTMASK=255.255.255.0 IPROOTBCAST=62.24.85.255 IPROOTDEV=eth0 ONBOOT=yes S_HOSTNAME=artemis S_DOMAINNAME=example.com S_NICE= S_FLAGS="lock nproc" ULIMIT="" S_CAPS="CAP_NET_RAW CAP_SYS_ADMIN" S_START="/sbin/rc default" S_STOP="/sbin/rc shutdown"
S_CONTEXT
určuje číslo kontextu virtuálního serveru, IPROOT
, IPROOTMASK
,
IPROOTBCAST
, S_HOSTNAME
, S_DOMAINNAME
parametry virtuálního síťového rozhraní,
IPROOTDEV
fyzické síťové rozhranní, na kterém se mají vytvářet virtuální aliasy. ONBOOT
určuje, zda se má
virtuální server spustit z init skriptu během bootu kontextu 0.
S_NICE
, S_FLAGS
, ULIMIT
, S_CAPS
omezují běh virtuálního serveru, S_START
a S_STOP
určují init skripty v rámci virtuálního serveru, které by byly v případě fyzického systému spouštěny
procesem init
(8) při bootování, resp. ukončování.
Pro správu virtuálních serverů se používá utilita vserver
:
vserver <name> start [--nodeps] <options>* vserver <name> stop [--nodeps] <options>* vserver <name> restart vserver <name> exec <command> <args>* vserver <name> enter vserver <name> status vserver <name> build <build-options>*
Pokud nechceme vytvářet celou konfiguraci virtuálního serveru ručně, můžeme využít sadu předpřipravených šablon pro některé známé distribuce:
vserver artemis build -M skeleton --context 1000 --initstyle fedora --hostname artemis --interface eth0:62.24.85.244 --flags lock
Příkazy start
, stop
, restart
slouží zřejmě ke spouštění, zastavování a restartování
virtuálních serverů (při tom se volají skripty S_START
a S_STOP
). Příkaz status
zobrazuje
informace o běžícím serveru:
Server artemis is running 26 processes running Vserver uptime: 25 days, 10:23
Příkaz exec
umožňuje spustit proces v rámci kontextu daného virtuálního serveru (cesta
<command>
je v rámci souborového systému virtuálního serveru). enter
spustí
v rámci daného virtuálního serveru interaktivní rootovský shell.