chroot

From Gentoo Wiki
Jump to:navigation Jump to:search
This page is a translated version of the page Chroot and the translation is 100% complete.
Resources

A chroot (Change root) egy Unix rendszereszköz, amely lehetővé teszi látszólagosan a gyökérkönyvtár (a root mappa) helyének a megváltoztatását. Ezáltal egy új környezetet hoz létre (egy másik mappában mint ha az lenne a root mappa), amely logikailag elkülönül a rendszerünk igazi (fő) gyökérkönyvtárától. Ez az új környezet "chroot börtön" néven ismert. Egy felhasználó, aki ezen az újonnan létrehozott területen dolgozik, nem látja és nem fér hozzá a környezeten kívüli fájlokhoz, mivel be van zárva az újonnan létrehozott környezetébe.

Az egyik fő felhasználási terület a chroot esetében az, hogy egy külön Linux rendszert hozzunk létre a meglévő rendszer tetején tesztelés vagy szoftverkompatibilitás céljából. A chroot gyakran könnyű alternatívaként jelenik meg a virtualizációval szemben, mivel a hipervizor által okozott terhelés nélkül képes működni.

Előfeltételek

A környezet felállítása

Új chroot beállítás létrehozásakor először egy könyvtárra van szükség, amelyben a chroot elhelyezkedhet. Például egy chroot létrehozható a /mnt/mychroot helyen:

root #mkdir /mnt/mychroot
root #cd /mnt/mychroot

Az alábbi parancsot futtatni lehet egy már meglévő rendszertelepítés felcsatolásának érdekében ami egy másik partíción van. Feltétlenül cserélje ki a <DEVICE> karakterláncot az alábbi példában a meglévő rendszertelepítés meghajtójára és partíciójára:

root #mkdir /mnt/mychroot
root #mount /dev/<DEVICE> /mnt/mychroot

Ha egy rendszertelepítés már korábban létre lett hozva a jelenlegi gyökér fájlrendszer egyik alkönyvtárában, akkor az előző lépéseket nem kell megismételni.

A rendszerfájlok kicsomagolása

Amikor Ön új rendszertelepítést hajt végre, akkor a következő lépés a stage3 tömörített tarball fájl letöltése és kicsomagolása a chroot helyre. Az ide vonatkozó további információért kérjük, olvassa el a Gentoo Kézikönyv, A stage tarball letöltése és A stage tarball kibontása című leírásokat.

root #links http://distfiles.gentoo.org/releases/amd64/autobuilds/
root #tar xpvf stage3-*.tar.xz --xattrs-include='*.*' --numeric-owner -C /mnt/mychroot

Kérjük, vegye figyelembe, hogy a kibontást root felhasználóként kell végrehajtani. Ellenkező esetben rendszerfrissítéskor a következő hibaüzenetet kapja: /proc: mount failed.

Konfiguráció

A chroot környezetbe való belépés előtt Önnek még számos könyvtárat fel kell csatolnia:

root #mount --rbind /dev /mnt/mychroot/dev
root #mount --make-rslave /mnt/mychroot/dev
root #mount -t proc /proc /mnt/mychroot/proc
root #mount --rbind /sys /mnt/mychroot/sys
root #mount --make-rslave /mnt/mychroot/sys
root #mount --rbind /tmp /mnt/mychroot/tmp
root #mount --bind /run /mnt/mychroot/run

Néhány alapvető konfigurációs fájlt át kell másolni a gazdagépről a chroot kornyezetbe. Kérjük, ne másolja át az /etc/portage/make.conf fájlt egy már meglévő rendszertelepítés használatakor.

root #cp /etc/portage/make.conf /mnt/mychroot/etc/portage # When using an existing installation, skip this command.
root #cp /etc/resolv.conf /mnt/mychroot/etc

Használat

Miután ezzel végzett, lépjen be a chroot környezetbe a következő parancsok végrehajtásával:

root #chroot /mnt/mychroot /bin/bash
root #. /etc/profile
root #export PS1="(chroot) $PS1"

Ennek megtartásához hozzáadhatja őket a .bashrc fájlhoz:

FILE /root/.bashrc
. /etc/profile
export PS1="(chroot) $PS1"

Ha olyan hibaüzenetet kap, mint például Error opening terminal: xterm-kitty, akkor adja hozzá a következő sorokat a .bashrc fájlhoz

FILE /root/.bashrc
export TERM=xterm

Az új rendszertelepítés létrehozását követően szinkronizálni kell a Portage programcsomag-kezelőt annak érdekében, hogy minden naprakész legyen a rendszeren.

(chroot) root #emerge-webrsync
(chroot) root #emerge --sync

A rendszer most már készen áll a használatra. Nyugodtan telepíthet szoftvereket, módosíthat beállításokat, tesztelhet kísérleti programcsomagokat és konfigurációkat – mindezt anélkül, hogy bármilyen hatással lenne a fő rendszerre. A chroot környezet elhagyásához egyszerűen írja be az exit parancsot, vagy nyomja meg a Ctrl+d billentyűkombinációt. Ezzel a parancssor visszatér a normál környezetbe. Ne felejtse el leválasztani az umount segítségével azokat a könyvtárakat, amelyeket felcsatolt.

systemd-nspawn

Ha a rendszerünk systemd init rendszert használ, akkor a systemd-nspawn alkalmazható, amely automatikusan kezelheti a chroot-ok adminisztrálásához szükséges sok alapvető lépést. Például, ha a systemd-nspawn segítségével kíván belépni egy chroot környezetbe a Konfiguráció részben megadott beállításokkal, akkor egyszerűen futtassa a következő parancsot:

root #cp /etc/portage/make.conf /mnt/mychroot/etc/portage
root #systemd-nspawn -D /mnt/mychroot --bind=/tmp --resolv-conf=/etc/resolv.conf

Az init szkriptek

Ha a chroot-ok beállítását gyakran kell elvégezni, akkor lehetőség van a könyvtárak felcsatolásának felgyorsítására egy init szkript használatával. A szkript hozzáadható az alapértelmezett futási szinthez, és így automatikusan beállítható a rendszer indításakor:

FILE /etc/init.d/mychroot
#!/sbin/openrc-run
 
depend() {
   need localmount
   need bootmisc
}
 
start() {
     ebegin "Mounting chroot directories"
     mount -o rbind /dev /mnt/mychroot/dev > /dev/null &
     mount -t proc none /mnt/mychroot/proc > /dev/null &
     mount -o bind /sys /mnt/mychroot/sys > /dev/null &
     mount -o bind /tmp /mnt/mychroot/tmp > /dev/null &
     eend $? "An error occurred while mounting chroot directories"
}
 
stop() {
     ebegin "Unmounting chroot directories"
     umount -f /mnt/mychroot/dev > /dev/null &
     umount -f /mnt/mychroot/proc > /dev/null &
     umount -f /mnt/mychroot/sys > /dev/null &
     umount -f /mnt/mychroot/tmp > /dev/null &
     eend $? "An error occurred while unmounting chroot directories"
}

Ha másik könyvtárat vagy partíciót használ, adja hozzá a szükséges csatolási parancsokat a start() függvényben, és cserélje ki a /mnt/chroot könyvtárat a megfelelő névre.

Hang és grafika

A chroot környezetben futó szoftver alapértelmezés szerint nem fog hozzáférni a rendszer hang és kijelző szerveréhez. Ennek megoldására két módszer létezik: a socket megosztása vagy a kommunikáció futtatása TCP-n keresztül localhost használatával.

Wayland

A Wayland egy socket-et használ arra, hogy az ügyfeleket összekapcsolja a kompozitorral. Ezt a socket-et meg kell osztani a chroot környezettel ahhoz, hogy a grafikus alkalmazások működjenek. Az általános eljárás ennek a socket-nek a megtalálásához a következő:[1]

  1. Ha a WAYLAND_SOCKET beállított értékkel rendelkezik, akkor azt fájlleíró számként kell értelmezni, amelyen a kapcsolat már létre van hozva, feltételezve, hogy a szülő folyamat konfigurálta a kapcsolatot számunkra.
  2. Ha a WAYLAND_DISPLAY beállított értékkel rendelkezik, akkor fűzze össze az XDG_RUNTIME_DIR értékkel az Unix socket-hez vezető út kialakításához.
  3. Tegyük fel, hogy a socket neve wayland-0, és fűzze össze az XDG_RUNTIME_DIR-rel, hogy megkapja a Unix socket elérési útját. Íme egy példa:

A WAYLAND_DISPLAY és a XDG_RUNTIME_DIR beállítások használata a legtöbb esetben megfelelő, és itt is ezek lesznek alkalmazva. Alapértelmezés szerint az XDG_RUNTIME_DIR a /run/user/$(uid) könyvtárra van beállítva. Ez a könyvtár nem lesz elérhető a chroot környezetben, mert a #Konfiguráció utasítások nem rekurzívan csatolják a /run könyvtárat. Feltételezve, hogy a felhasználó azonosítója /run/user/1000, ezt a következő módon lehet megoldani:

root #mkdir -p /mnt/mychroot/run/user/1000
root #mount --bind /run/user/1000 /mnt/mychroot/run/user/1000

vagy egyszerűen rekurzívan csatolja fel a /run könyvtárat:

root #mount --rbind /run /mnt/mychroot/run

A Wayland könyvtár (dev-libs/wayland) ugyanazt az eljárást használja a socket megtalálására, mint amit fent leírtunk. Tehát ahhoz, hogy a socket-et megosszuk a chroot környezettel, mindössze annyit kell tennie, hogy meghatározza az XDG_RUNTIME_DIR és a WAYLAND_DISPLAY változókat. Itt feltételezzük, hogy a Wayland socket WAYLAND_DISPLAY neve wayland-0.

(chroot) root #useradd -m user
(chroot) root #su -l user
(chroot) user $export XDG_RUNTIME_DIR=/run/user/1000
(chroot) user $export WAYLAND_DISPLAY=wayland-0
(chroot) user $MOZ_ENABLE_WAYLAND=1 firefox-bin

Jogosultsági hibák fordulhatnak elő, ha a chroot környezetben lévő felhasználónak nincs hozzáférése a Wayland sockethez. Ezt a problémát meg lehet oldani névtér újratérképezéssel vagy ACL-ek (hozzáférés-szabályozási listák) használatával. A legegyszerűbb megoldás az, ha biztosítja, hogy a felhasználói azonosítók megegyezzenek. A useradd -u, --uid UID opció használható felhasználó létrehozásakor.

PipeWire

Mint a Wayland esetében, a PipeWire is socket-et használ arra, hogy a klienseket összekapcsolja a PipeWire szolgáltatással.

Az alkalmazások feltételezik, hogy a PipeWire socket a ${XDG_RUNTIME_DIR}/pipewire-0 helyen található, így a PipeWire kliensek csatlakoztatásához a hoszt daemonhoz csak annyi szükséges, hogy az XDG_RUNTIME_DIR-t kiterjesszük a chroot környezetre. Ez a folyamat azonos a #Wayland részben leírtakkal. Az XDG_RUNTIME_DIR, gyakran a /run/user/$(uid) kiterjesztéséhez a következő parancsokat használja:

root #mkdir -p /mnt/mychroot/run/user/1000
root #mount --bind /run/user/1000 /mnt/mychroot/run/user/1000

Az XDG_RUNTIME_DIR nem lesz beállítva, amikor a chroot környezetben jelentkezik be, ezért azXDG_RUNTIME_DIR-t exportálni kell, hogy a PipeWire kliens megtalálja a socket-et:

(chroot) user $export XDG_RUNTIME_DIR=/run/user/1000
(chroot) user $pw-cli

Xorg

Az Xorg alapértelmezés szerint a /tmp/.X11-unix/X${DISPLAY} helyen elérhető socketen hallgat, valamint a localhost TCP 6000 + ${DISPLAY} portján[2]. A #Konfiguráció utasításai szerint van csatolva a /tmp könyvtár, ezért nincs szükség további konfigurációra, kivéve a DISPLAY változó beállítását a grafikus alkalmazás futtatása előtt:

(chroot) user $DISPLAY=:0 firefox-bin

Ha a chroot környezetben lévő felhasználó azonosítója (uid) nem egyezik meg a chrooton kívüli felhasználó azonosítójával, akkor az xhost használatával kell jogosultságokat beállítani. Az összes helyi kapcsolat engedélyezéséhez a chrooton kívül futtassa a következő parancsot:

user $xhost +local:

További olvasnivaló a témában

Külső források

  • chroot az Arch Linux Wikipédia oldalán

Hivatkozások

  1. https://wayland-book.com/protocol-design/wire-protocol.html
  2. So if DISPLAY=:12, then Xorg will listen on localhost TCP port 6012