chroot
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:
/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
/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:
/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]
- 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.
- 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.
- 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
- Project:X86/Chroot Guide — provides instructions on how to create a fresh Gentoo installation inside a chroot to assist in testing Gentoo packages for stabilization and for other sundry testing.
- Knowledge Base:Chrooting returns exec format error
- Chrooting proxy services
- Chrooting and virtual servers
- PRoot — a user-space implementation of chroot, mount --bind, and binfmt_misc.
Külső források
- chroot az Arch Linux Wikipédia oldalán
Hivatkozások
- ↑ https://wayland-book.com/protocol-design/wire-protocol.html
- ↑ So if DISPLAY=:12, then Xorg will listen on localhost TCP port 6012