FreeBSD jails
1. sor: | 1. sor: | ||
===Bevezetés=== |
===Bevezetés=== |
||
+ | A FreeBSD jails egy operációs rendszer szintű virtualizációt megvalósító eszköz, |
||
+ | amely a FreeBSD 4-es verziója óta elérhető. |
||
+ | |||
+ | Az OS szintű virtualizáció a mi választásunk, ha megfelel, hogy a guest gépek és a |
||
+ | host közös kernelen osztozzon, így nem kell virtuális hardvert biztosítanunk, elég |
||
+ | ha az alkalmazások szintjén tudunk virtuális környezetet biztosítani. |
||
+ | |||
+ | A jails eredete, hogy a chroot alkalmazást akarták kiváltani, mert az nem volt |
||
+ | kellően rugalmas, csak a fájlrendszer szintjén biztosította a szegmentálást, de ki |
||
+ | lehetett jutni a chroot-olt alkalmazásokból. Továbbá a chroot-olt processzek |
||
+ | számára továbbra is láthatóak maradtak a rendszer komponensei (IPC, |
||
+ | felhasználók, kernel adatszerkezetek, device-ok). |
||
+ | |||
+ | A jail-ben futó processzek nem tudnak interakcióba lépni a jail-en kívűli |
||
+ | processzekkel ( Ez nem teljesen igaz, mert a shared memory elkülönítése még |
||
+ | nem megvalósított), továbbá tilos a globális rendszerállapot megváltoztatása a |
||
+ | jail-en belülről, még az ottani rootnak is. |
||
+ | |||
+ | Egy jail-t négy elem határoz meg: |
||
+ | *egy könyvtárfa ( lásd chroot) |
||
+ | *hostnév |
||
+ | *IP cím (a jail élettartama során nem lehet megváltoztatni) |
||
+ | *parancs, amit a jailben futtatni szeretnénk |
||
+ | Két típusát különböztetik meg: |
||
+ | *complete jail (egy teljes disztribúció, akár linux alapú is lehet ) |
||
+ | *service jail ( egy alkalmazás, vagy szolgáltatás futtatása) |
||
+ | |||
===Alkalmazási terület=== |
===Alkalmazási terület=== |
||
+ | Fő alkalmazása : service jailek, különböző alkalmazás szerver szoftver |
||
+ | konfigurációk használata, anélkül, hogy a hostoló rendszerünket kéne kitenni az |
||
+ | telepítés viszontagságainak. Egy rosszul sikerült telepítés után a problémás jail |
||
+ | könyvtárszerkezete könnyen eltávolítható, míg a hostoló rendszerünk |
||
+ | konfigurációja érintetlen marad. |
||
+ | |||
+ | Mivel az Oracle adatbázis hivatalosan nem támogatott a FreeBSD-n, a gyakorlatban még arra is használják, hogy engedélyezik a Linux binary compatibility-t a FreeBSD kernelben, és egy jailbe |
||
+ | telepítenek egy linux disztribúció userland-jét, ahová aztán telepítik az Oracle adatbázist. |
||
+ | |||
===Jail létrehozása=== |
===Jail létrehozása=== |
||
− | ===Jailutils=== |
+ | A létrehozás folyamata: |
+ | *setenv D /a/jail/konyvtara |
||
+ | *mkdir -p $D |
||
+ | *cd /usr/src |
||
+ | *make buildworld (a felhasználói állományok fordítása,csak ha még nem volt, |
||
+ | vagy csak update esetén kell futtatni) |
||
+ | *make installworld DESTDIR=$D (A célkönyvtár feltöltése a binárisokkal,man |
||
+ | page-ekkel stb) |
||
+ | *make distribution DESTDIR=$D ( a /usr/src/etc másolása a $D/etc -be) |
||
+ | Ha szükséges, akkor a devfs-t is felcsatolhatjuk a $D/dev alá |
||
+ | *mount -t devfs devfs $D/dev (ha szeretnénk, hogy reboot után is |
||
+ | mountolódjon, akkor fstab-ba is be kell írni) |
||
+ | |||
+ | A devfs-hez való hozzáférést a devfs.conf és a devfs.rules fájlokkal manipulálhatjuk, ahol az egyes eszközökhöz |
||
+ | linkkeket hozhatunk létre, amikhez aztán különböző hozzáférési jogosultágokat |
||
+ | adhatunk meg a szabályokkal. |
||
+ | |||
+ | A jogosultságok finomhangolása a sysctl-en keresztül valósítható meg különböző |
||
+ | változókkal, amelyek például meghatározzák a maximális gyermekfolyamatok |
||
+ | számát a jailen belül, a SystemV IPC mechanizmus használatát, a mountolás |
||
+ | jogát, a hostnév megváltoztathatóságát és így tovább ( man 8 jail ). |
||
+ | |||
+ | A fájlrendszeren lehetőség van beállítani kvótarendszert, melyet mountoláskor kell |
||
+ | jeleznük az opciók között ( userquota,groupquota ), majd ezután az egyes |
||
+ | könyvtárakra van lehetőségünk méret- és inodeszámbeli megkötéseket adnunk, |
||
+ | melyek így az egyes jail-ek könyvtárára beállítva biztosítják a méret- és |
||
+ | mennyiségkorlátozást. |
||
+ | |||
+ | A fentiek majdnem teljesen lefedik az erőforrások kiosztásának lehetőségeit a jail-ek használata esetén. Sajnos a cpu, a ram és a hálózati |
||
+ | sávszélesség kiosztásáról nem rendelkezhetünk. |
||
+ | |||
===Hálózati konfiguráció=== |
===Hálózati konfiguráció=== |
||
+ | A hálózati alkalmazások konfigurációjánál ügyelni kell arra, hogy a jailben és a |
||
+ | hoston is használt hálózati alkalmazást úgy állítsuk be, hogy alapból ne a 0.0.0.0 |
||
+ | (any) címen fogadja a kapcsolatokat, mert akkor a hostoló gép fogja kiszolgálni a |
||
+ | kérést a jail helyett. |
||
+ | A hálózati konfigurációnál választhatunk, hogy vagy hozzáadjuk a jailnek beállított |
||
+ | IP címet aliasként egy fizikai interfészhez, így a jailünk IP címéről szóló ARP |
||
+ | kérésre válaszol a MAC címével, és ezután amíg érvényes a bejegyzés, a |
||
+ | jailünknek szánt csomagot a hoszt gép fogadja, és a routing tábla alapján |
||
+ | továbbítja a loopback interfészre, ahol az egyes jailek fogadni tudják a nekik szóló |
||
+ | csomagot, gyakorlatilag ez analóg, a platformvirtualizációnál megismert bridgelt |
||
+ | megoldással. |
||
+ | |||
+ | <pre> |
||
+ | freebsdvmware# ifconfig em0 alias 192.168.2.199 netmask 255.255.255.0 |
||
+ | em0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 |
||
+ | options=9b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM> |
||
+ | ether 00:0c:29:a0:22:c9 |
||
+ | inet 192.168.2.107 netmask 0xffffff00 broadcast 192.168.2.255 |
||
+ | inet 10.0.0.2 netmask 0xff000000 broadcast 10.255.255.255 |
||
+ | inet 192.168.2.199 netmask 0xffffff00 broadcast 192.168.2.255 |
||
+ | media: Ethernet autoselect (1000baseTX <fullduplex>) |
||
+ | status: active |
||
+ | </pre> |
||
+ | |||
+ | A másik esetben a local loopback interfészre konfigurálunk aliast, és a jailünknek |
||
+ | a privát címtartományból választunk címet, majd a natd beállításával tudunk |
||
+ | hozzáférni a hálózatról. ( port forwarding ) Ez utóbbi tipikusan a webkiszolgálók |
||
+ | alkalmazása esetén áll fent, amikor a host gépen az apache-on bekonfiguráljuk a |
||
+ | Virtual Hostokat, és a kiszolgálóhoz történő továbbítás a domain név alapján |
||
+ | történik. |
||
+ | <pre> |
||
+ | freebsdvmware# ifconfig lo0 alias 127.0.0.100 netmask 255.0.0.0 |
||
+ | lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384 |
||
+ | inet6 fe80::1%lo0 prefixlen 64 scopeid 0x3 |
||
+ | inet6 ::1 prefixlen 128 |
||
+ | inet 127.0.0.1 netmask 0xff000000 |
||
+ | inet 127.0.0.100 netmask 0xff000000 |
||
+ | </pre> |
||
+ | Ha a host gépen létrehozunk különböző loopback interfészeket, classless |
||
+ | címzéssel, akkor megoldható, hogy az egyes jailek ne lássák egymást, vagy csak |
||
+ | az egy hálózatban lévők tudjanak kommunikáni egymással ( pl. adatbázis jail + |
||
+ | webkiszolgáló jail közös loopback hálózaton) |
||
+ | |||
+ | ===Jailutils=== |
||
===Jail indítása=== |
===Jail indítása=== |
||
===Telepítés a jailben=== |
===Telepítés a jailben=== |
A lap 2010. november 28., 19:35-kori változata
Tartalomjegyzék |
1 Bevezetés
A FreeBSD jails egy operációs rendszer szintű virtualizációt megvalósító eszköz, amely a FreeBSD 4-es verziója óta elérhető.
Az OS szintű virtualizáció a mi választásunk, ha megfelel, hogy a guest gépek és a host közös kernelen osztozzon, így nem kell virtuális hardvert biztosítanunk, elég ha az alkalmazások szintjén tudunk virtuális környezetet biztosítani.
A jails eredete, hogy a chroot alkalmazást akarták kiváltani, mert az nem volt kellően rugalmas, csak a fájlrendszer szintjén biztosította a szegmentálást, de ki lehetett jutni a chroot-olt alkalmazásokból. Továbbá a chroot-olt processzek számára továbbra is láthatóak maradtak a rendszer komponensei (IPC, felhasználók, kernel adatszerkezetek, device-ok).
A jail-ben futó processzek nem tudnak interakcióba lépni a jail-en kívűli processzekkel ( Ez nem teljesen igaz, mert a shared memory elkülönítése még nem megvalósított), továbbá tilos a globális rendszerállapot megváltoztatása a jail-en belülről, még az ottani rootnak is.
Egy jail-t négy elem határoz meg:
- egy könyvtárfa ( lásd chroot)
- hostnév
- IP cím (a jail élettartama során nem lehet megváltoztatni)
- parancs, amit a jailben futtatni szeretnénk
Két típusát különböztetik meg:
- complete jail (egy teljes disztribúció, akár linux alapú is lehet )
- service jail ( egy alkalmazás, vagy szolgáltatás futtatása)
2 Alkalmazási terület
Fő alkalmazása : service jailek, különböző alkalmazás szerver szoftver konfigurációk használata, anélkül, hogy a hostoló rendszerünket kéne kitenni az telepítés viszontagságainak. Egy rosszul sikerült telepítés után a problémás jail könyvtárszerkezete könnyen eltávolítható, míg a hostoló rendszerünk konfigurációja érintetlen marad.
Mivel az Oracle adatbázis hivatalosan nem támogatott a FreeBSD-n, a gyakorlatban még arra is használják, hogy engedélyezik a Linux binary compatibility-t a FreeBSD kernelben, és egy jailbe telepítenek egy linux disztribúció userland-jét, ahová aztán telepítik az Oracle adatbázist.
3 Jail létrehozása
A létrehozás folyamata:
- setenv D /a/jail/konyvtara
- mkdir -p $D
- cd /usr/src
- make buildworld (a felhasználói állományok fordítása,csak ha még nem volt,
vagy csak update esetén kell futtatni)
- make installworld DESTDIR=$D (A célkönyvtár feltöltése a binárisokkal,man
page-ekkel stb)
- make distribution DESTDIR=$D ( a /usr/src/etc másolása a $D/etc -be)
Ha szükséges, akkor a devfs-t is felcsatolhatjuk a $D/dev alá
- mount -t devfs devfs $D/dev (ha szeretnénk, hogy reboot után is
mountolódjon, akkor fstab-ba is be kell írni)
A devfs-hez való hozzáférést a devfs.conf és a devfs.rules fájlokkal manipulálhatjuk, ahol az egyes eszközökhöz linkkeket hozhatunk létre, amikhez aztán különböző hozzáférési jogosultágokat adhatunk meg a szabályokkal.
A jogosultságok finomhangolása a sysctl-en keresztül valósítható meg különböző változókkal, amelyek például meghatározzák a maximális gyermekfolyamatok számát a jailen belül, a SystemV IPC mechanizmus használatát, a mountolás jogát, a hostnév megváltoztathatóságát és így tovább ( man 8 jail ).
A fájlrendszeren lehetőség van beállítani kvótarendszert, melyet mountoláskor kell jeleznük az opciók között ( userquota,groupquota ), majd ezután az egyes könyvtárakra van lehetőségünk méret- és inodeszámbeli megkötéseket adnunk, melyek így az egyes jail-ek könyvtárára beállítva biztosítják a méret- és mennyiségkorlátozást.
A fentiek majdnem teljesen lefedik az erőforrások kiosztásának lehetőségeit a jail-ek használata esetén. Sajnos a cpu, a ram és a hálózati sávszélesség kiosztásáról nem rendelkezhetünk.
4 Hálózati konfiguráció
A hálózati alkalmazások konfigurációjánál ügyelni kell arra, hogy a jailben és a hoston is használt hálózati alkalmazást úgy állítsuk be, hogy alapból ne a 0.0.0.0 (any) címen fogadja a kapcsolatokat, mert akkor a hostoló gép fogja kiszolgálni a kérést a jail helyett. A hálózati konfigurációnál választhatunk, hogy vagy hozzáadjuk a jailnek beállított IP címet aliasként egy fizikai interfészhez, így a jailünk IP címéről szóló ARP kérésre válaszol a MAC címével, és ezután amíg érvényes a bejegyzés, a jailünknek szánt csomagot a hoszt gép fogadja, és a routing tábla alapján továbbítja a loopback interfészre, ahol az egyes jailek fogadni tudják a nekik szóló csomagot, gyakorlatilag ez analóg, a platformvirtualizációnál megismert bridgelt megoldással.
freebsdvmware# ifconfig em0 alias 192.168.2.199 netmask 255.255.255.0 em0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 options=9b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM> ether 00:0c:29:a0:22:c9 inet 192.168.2.107 netmask 0xffffff00 broadcast 192.168.2.255 inet 10.0.0.2 netmask 0xff000000 broadcast 10.255.255.255 inet 192.168.2.199 netmask 0xffffff00 broadcast 192.168.2.255 media: Ethernet autoselect (1000baseTX <fullduplex>) status: active
A másik esetben a local loopback interfészre konfigurálunk aliast, és a jailünknek a privát címtartományból választunk címet, majd a natd beállításával tudunk hozzáférni a hálózatról. ( port forwarding ) Ez utóbbi tipikusan a webkiszolgálók alkalmazása esetén áll fent, amikor a host gépen az apache-on bekonfiguráljuk a Virtual Hostokat, és a kiszolgálóhoz történő továbbítás a domain név alapján történik.
freebsdvmware# ifconfig lo0 alias 127.0.0.100 netmask 255.0.0.0 lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384 inet6 fe80::1%lo0 prefixlen 64 scopeid 0x3 inet6 ::1 prefixlen 128 inet 127.0.0.1 netmask 0xff000000 inet 127.0.0.100 netmask 0xff000000
Ha a host gépen létrehozunk különböző loopback interfészeket, classless címzéssel, akkor megoldható, hogy az egyes jailek ne lássák egymást, vagy csak az egy hálózatban lévők tudjanak kommunikáni egymással ( pl. adatbázis jail + webkiszolgáló jail közös loopback hálózaton)