Vserver

A Unix/Linux szerverek üzemeltetése wikiből
A lap korábbi változatát látod, amilyen KornAndras (vitalap | szerkesztései) 2007. január 12., 02:29-kor történt szerkesztése után volt.

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:
    1. Éles szervert leállítjuk ("egy pillanatra")
    2. Klónozzuk (gyorsan megy)
    3. Éles szervert újraindítjuk
    4. Klónt upgrade-eljük
    5. Éles szervert leállítjuk
    6. Upgrade-elt klónt elindítjuk
    7. 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)
      • Egyelőre (2006. december) minden mount, amit a vserverekhez tartozó fstab-ban adunk meg, megkapja a nodev opciót, így nem praktikus a vserver root fájlrendszerét is az ő namespace-ében mountolni (pl. nem fog tudni írni a /dev/null-ba), de ezt elvileg hamarosan kijavítják
    • 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.

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 vserverhez kapcsolódó config-fájlok a /etc/vservers könyvtárban laknak.

5.1 Globális 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...)

5.2 Egyes vserverek konfigurációja

  • /etc/vservers/vservernév/apps/init/cmd.start: a vserver "elindításakor" a vserver kontextusában lefuttatandó program. Ez "helyettesíti" az initet.
  • /etc/vservers/vservernév/apps/init/cmd.stop: a vserver leállításakor a vserver kontextusában lefuttatandó program. Ennek kell leállítania a vserverben futó programokat.

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

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 - amíg rá nem jövünk, hogy a vserverben nem fut saját init, és az 1-es PID, amit látunk, a hosztgép init folyamatáé.

A vserverben futó szolgáltatásokat alapértelmezés szerint nem a saját initje indítja el, hanem a cmd.startban megadott program, vagy, ha az nincs kitöltve, akkor egy szimulált System V init-szerű bootfolyamat (lényegében /etc/init.d/rc 2). Az "InitStyle" beállításával választhatunk más módszert is, ezek egész jól le vannak írva a [1] oldalon. A "plain" InitStyle-lal saját, 1-es PIDdel futó initet kapunk a vserverben a fejlesztők állítása szerint. Én még nem próbáltam, de hamarosan...

7 Ajánlott irodalom

Személyes eszközök