Linux VServer

Martin Děcký

(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:

Linux VServer logo

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í:

Historie

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.

Soft-partitioning

Oddělení kontextů je realizováno pomocí několika prostředků:

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.

Sdílení částí souborového systému

Unifikace

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.

XID

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

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

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.

Použití

Základní práce s kontexty

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:

Zobrazování stavu

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     apache
Pro 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

Omezení sítě

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.

Správa virtuálních serverů

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.

Jiné možnosti virtualizace