Vserver
Tartalomjegyzék |
1 Áttekintés
- Izoláció, nem virtualizáció
- Pehelysúlyú megoldás
- Egy virtuális gépben futó apache pontosan ugyanannyi erőforrást igényel, mintha a hosztgépen futna
- A vserverek hardlinkek segítségével osztozhatnak a fájlokon (így a második ugyanolyan már szinte ingyen van)
- De: a hardlinkek normális fájlokká válnak, ha a vservert módosítjuk, tehát lehet önállóan upgrade-elni
- Aztán újra összehardlinkelhetjük, ha megint megegyeznek a fájlok
- A hardlinkelés miatt a cache-ben is csak egy példányban lesz benne ugyanaz a libc6, nem annyiszor, ahány vserverünk van
- Csak egy kernel fut
- De a virtuális gépek mindegyikében lehet pl. más disztribúció
- Sőt, 64 bites hoszton futtathatunk 32 bites disztribúciót guestként
- A hoszt elvileg teljesen el van szigetelve a vserverektől, a feltört vserver nem okoz gondot máshol
- Ráadásul a hoszt segítségével biztonságosan megvizsgálhatjuk, mi változott benne (így pl. honeypotnak is jó)
- Könnyű migrálni, mivel egy vserverben semmi gépspecifikus konfiguráció (pl. fstab) nincs
2 Felhasználási lehetőségek
- Főként a "Gép, Ami Sokmindent Csinál" problémájára megoldás
- De: az egyik vserver rootjelszavát akár meg is mondhatjuk a kollégának
- Úgyhogy akár kereskedelmi hosztingra is jó (használják is)
- (Az OpenVZ lehet, hogy erre jobb)
- Rollback - jobb, mint az LVM:
- Éles szervert leállítjuk ("egy pillanatra")
- Klónozzuk (gyorsan megy)
- Éles szervert újraindítjuk
- Klónt upgrade-eljük
- Éles szervert leállítjuk
- Upgrade-elt klónt elindítjuk
- Ha kell, csiki-csukizunk
- Sőt, ha LVM-ünk is van, akkor az éles szervert a klónozáshoz le se kell állítani - egy LVM snapshot lehet a klón.
- (Régebbi kernelekkel óvatosan: 2.6.11.9+xfs+lvm snapshot -> adatvesztés)
- Játék: Ki szeretnénk próbálni a legújabb, rendkívül divatos disztribúciót
- "Dual Seat": egy gép, két egér, két billentyűzet, két X, "két Linux"
3 Fogalmak
- "context"
- context0: a hoszt
- context1: "spectator" context
- chcontext --xid 1 -- ps axfu mutatja az összes processzt, a guestekben futókat is; a hoszt kontextusában ezek nem látszanak
- "namespace"
- Minden vserver automatikusan kap sajátot
- Amit az egyikben mountolunk, az a másikban nincs mountolva
- Így pl. a hosztgép /proc/mounts fájlja nincs tele a vserverekben mountolt /proc-példányokkal (kozmetika)
- A biztonságot is javítja: a vserverben a / egy rbind mount lesz ("mount --rbind /var/lib/vserver/foo /" jelleggel), így még nehezebb kijönni belőle (bár a barrier is elég)
4 Telepítés
Szakácskönyv itt: http://oldwiki.linux-vserver.org/Step-by-Step+Guide+2.6 - mi csak összefoglaljuk.
- Kernelforrás+patch (http://linux-vserver.org/Downloads - kísérleti patchek itt: http://vserver.13thfloor.at/Experimental/)
- Van olyan verzió is, amibe integrálták a grsecurity-t
- 2006. december 22-én az ajánlott verzió a 2.6.19.1-es kernel a 2.2.0-rc6-os vserver patch-csel
- Vagy: apt-get install linux-image-2.6.18-3-vserver-k7 (bár tegnap kijött a 2.6.19, hol késnek? :)
- Van linux-image-2.6.18-3-xen-vserver-686.deb is
- apt-get install util-vserver (Ubuntu feisty és edgy bugos, Debian sidből érdemes)
4.1 A kernel beállítása
- CONFIG_VSERVER_PROC_SECURE
- Ha beállítjuk, a /proc egyes részeit elrejthetjük a vserverek elől
- CONFIG_VSERVER_HARDCPU
- Ha egy context elhasználja a CPU-tokenjeit, nem kap több CPU-t, amíg össze nem gyűlik neki megint néhány (enélkül az opció nélkül csak a prioritása lesz alacsony)
- CONFIG_VSERVER_COWBL
- Ha immutable+iunlink egy fájl, akkor felülírható, és felülíráskor másolat jön létre róla, amely már sem immutable, sem iunlink attribútummal nem rendelkezik majd. Ha szeretnénk az azonos tartalmú fájlokat megosztani a vservereink között, kapcsoljuk be.
- CONFIG_BLK_DEV_VROOT
- Lehetővé teszi a virtuális szerverek számára, hogy saját fájlrendszer-kvótákat használjanak.
4.2 A /proc kezelése
- Információ szivároghat a hosztból a vserverekbe
- Megoldás: CONFIG_VSERVER_PROC_SECURE+setattr
- Minden /proc bejegyzéshez van három jelzőbit: admin, watch, hide.
- Ha a hide nincs beállítva, az adott /proc-bejegyzés minden vserverben látszik
- Ha a hide be van állítva, az adott /proc-bejegyzés nem látszik a vserverekben
- Ha az admin be van állítva, akkor a context0-ban azért látszik
- Ha a watch be van állítva, akkor a context1-ben azért látszik
- Ha se az admin, se a watch nincs beállítva, akkor az adott bejegyzést teljesen eltüntettük
5 Konfiguráció
A /etc/vservers/.defaults könyvtárban lehet egy csomó mindent állítani:
vservers/.defaults# ls -la total 16 drwxr-xr-x 4 root root 4096 Nov 29 16:57 . drwxr-xr-x 4 root root 4096 Nov 29 16:57 .. drwxr-xr-x 3 root root 4096 Nov 29 16:57 apps lrwxrwxrwx 1 root root 19 Nov 29 16:57 cachebase -> /var/cache/vservers drwxr-xr-x 2 root root 4096 Nov 28 11:52 files lrwxrwxrwx 1 root root 21 Nov 29 16:57 run.rev -> /var/run/vservers.rev lrwxrwxrwx 1 root root 17 Nov 29 16:57 vdirbase -> /var/lib/vservers
Ebből a run.rev csak a 2.4-es kernelekhez kellett.
A vdirbase symlink mondja meg a vserver parancsnak, hogy mi a vserverek gyökérkönyvtárai fölötti könyvtár. Nem biztos, hogy elég itt átírni, állítólag a kódba néhány helyen be van drótozva - a fejlesztők szerint talán ez már elmúlt :)
(To be continued...)
6 Segédprogramok
- /usr/sbin/lsxid: megmutatja, melyik kontextushoz tartoznak a fájlok
- /usr/sbin/chxid: egy kontextus tulajdonába helyezi a fájlokat
- /usr/sbin/vps: olyan ps, ami mutatja az összes kontextus összes processzét, és azt is, melyik melyik kontextusban fut
- /usr/sbin/showattr: a setattr által beállított attribútumokat mutatja meg (l. később)
- /usr/sbin/reducecap: gyermekfolyamatot indít csökkentett capability-készlettel
- /usr/sbin/vattribute: capabilityket lehet vele elvenni a vserverektől (?)
- és még sok másik, amit sajnos nem volt időm megnézni. :(
6.1 setattr
Speciális fájlrendszer-attribútumokat állít.
setattr [-Rx] [--[~](iunlink|admin|watch|hide|barrier|iunlink-but-not-immutable)]* [--] <file>
- -R: rekurzív
- -x: nem lép át másik fs-re
- ~ negálja a flaget
- flagek:
- iunlink: invertálja az unlink() szemantikáját; ha a file immutable és iunlink, akkor unlinkelhető, ha csak iunlink, akkor nem. Alapértelmezés szerint az immutable flaget is beállítja.
- Azért jó, mert így a több vserver számára megosztott fájlokat az immutable attribútum miatt nem lehet módosítani, de letörölni le lehet, úgyhogy lehet pl. upgrade-elni.
- barrier: chroot-védelem; a chroot feletti directoryra beállítva megakadályozza a chrootból való kiszökést, de csak xid > 0 esetén
- admin, watch, hide: l. a /proc-nál; csak a proc filerendszeren állítható
- iunlink-but-not-immutable: csak az iunlink flaget állítja be, az immutable-t nem.
- iunlink: invertálja az unlink() szemantikáját; ha a file immutable és iunlink, akkor unlinkelhető, ha csak iunlink, akkor nem. Alapértelmezés szerint az immutable flaget is beállítja.
6.2 vnamespace
# váltsunk a myserver namespace-ébe: vnamespace -e myvserver bash # vagy mountoljunk be ide egy új fájlrendszert (xid=0, mindent látunk): vnamespace -e myvserver mount /dev/somenode /path/to/mount/point # vagy umountoljunk valamit: vnamespace -e myserver umount /path/to/mount/point # vagy nézzük meg, mi van ide bemountolva: vnamespace -e myvserver cat /proc/mounts
6.3 vserver
Ez a "fő" eszköz.
A következő műveleteket tudja:
- build, start, stop, enter, status, ...
- vserver szervernév build -m <method> [options] [cfg-options] [--] [method-args]
- Csinál egy új vservert; tartalommal is megtölti
- Pár lehetséges method:
- rsync: a megadott helyről (pl. a hosztról) másolja a file-okat
- apt-rpm, yum, rpm: rpm-alapú disztribúciók bootstrapeléséhez
- skeleton: csak minimális fájlrendszert csinál
- debootstrap: Debiant (vagy Ubuntut) csinál
Pl:
# We build a guest named "DebianSid", and use the debootstrap method to set it up. # Everything after the first -- is an argument for the debootstrap method, not for build itself. # So we tell it that we want the sid distribution, and it should use ftp.at.debian.org # as mirror, instead of the default one. # Everything after the second -- is interpreted as an argument to debootstrap itself. # --resolve-deps is required to directly bootstrap testing and unstable those days. vserver proba build -m debootstrap -- -d sid -m ftp://ftp.hu.debian.org/debian/ -- --resolve-deps # A --resolve-deps már a debootstrapnek szóló opció
Takarítsuk ki, ami nem kell bele:
ln -s /var/lib/vservers / cd /vservers/proba/etc/rc0.d rm K20makedev K25hwclock.sh S30urandom S31umountnfs.sh S35networking S36ifupdown S40umountfs S90halt K89klogd cd /vservers/proba/etc/rc6.d rm K20makedev K25hwclock.sh S30urandom S31umountnfs.sh S35networking S36ifupdown S40umountfs S90reboot K89klogd cd /vservers/proba/etc/rcS.d rm S05keymap.sh S48console-screen.sh S50hwclock.sh S40networking S45mountnfs.sh S10checkroot.sh S02mountvirtfs rm S30procps.sh S35mountall.sh S36mountvirtfs S39ifupdown S30checkfs.sh S18ifupdown-clean S18hwclockfirst.sh cd /vservers/proba/etc/rc2.d rm S20makedev S11klogd # esetleg chroottal: chroot /vservers/proba update-rc.d -f klogd remove [...] exit
Ennek a proba nevű vservernek nem adtunk hálókártyát; másoljuk le proba2 néven, és kapjon hálózatot is:
# vserver proba2 build -m rsync -n proba2 --interface proba2=eth0:1.2.3.4/32 --hostname proba2 --netdev eth0 --context 3 -- --source /vservers/proba
Indítsuk el:
# vserver proba2 start
Váltsunk bele:
# vserver proba2 enter
Ekkor mondjuk egy ps fuxa csak az adott contextben futó processzeket listázza, és az initnek 1-es PID-je, úgyhogy örülhetünk.
7 Ajánlott irodalom
- Secure chroot Barrier: A barrier flag leírása és néhány chroot-elkerülő módszer bemutatása
- Namespaces: leírás a namespace-rendszerről
- Virtualizing for Fun & Profit: Kicsit régi szakácskönyv egy meglevő gép vserveresítéséhez
- http://people.linux-vserver.org/~dhozac/p/uv/experimental/configuration.html: A /etc/vservers könyvtár (nem túl bőbeszédű) leírása