Chroot
Chroot (Change root) är ett Unix-systemverktyg som används för att ändra den uppfattade rotkatalogen, för att skapa en logisk åtskilld miljö från huvudsystemets rotkatalog. Den här nya miljön kallas även för "chroot fängelse". En användare som arbetar inuti fängelset kan inte se eller komma åt filer utanför miljön som denne blivit inlåst i.
En av de huvudsakliga användningsområden för chroot är att skapa ett separat Linux-system ovanpå ett befintligt system, med ändamålet att testa mjukvaran eller mjukvaru kompatibilitet. Chroot brukar ses som ett lättare alternativ till virtualisering eftersom det kan köras utan belastningen av en hypervisor.
Förberedelser
Uppsättning av miljön
När man skapar en ny chroot-uppsättning är det första man behöver en katalog i vilken den nya roten ska bo i.
user $
mkdir /mnt/minchroot
user $
cd /mnt/minchroot
För att montera en befintlig installation från en partition kan det här kommandot köras. Se till att byta ut <ENHET>
strängen i exemplet nedanför med den enheten och partitionen som det befintliga systemet befinner sig i.
user $
mkdir /mnt/minchroot
user $
mount /dev/<ENHET> /mnt/minchroot
Om en installation tidigare skapats i en underkatalog av det aktuella rotfilsystemet kan stegen ovanför förbigås.
Packa upp systemfiler och Portage-trädet (nya installationer)
När man sätter upp en ny installation är nästa steg att ladda ner stage3- och Portage-arkiven, och därefter packa upp dem i det nya chroot-platsen. För mer information om denna process, vänligen se Ladda ner stage-arkivet och Packa upp stage-arkivet i Gentoo-manualen.
root #
links http://distfiles.gentoo.org/releases/amd64/autobuilds/
root #
tar xvjpf stage3-*.tar.bz2 -C /mnt/minchroot
Konfiguration
Innan man går in i chroot:en måste en del kataloger monteras först:
root #
mount --rbind /dev /mnt/minchroot/dev
root #
mount --make-rslave /mnt/minchroot/dev
root #
mount -t proc /proc /mnt/minchroot/proc
root #
mount --rbind /sys /mnt/minchroot/sys
root #
mount --make-rslave /mnt/minchroot/sys
root #
mount --rbind /tmp /mnt/minchroot/tmp
Några grundläggande konfigurationsfiler måste kopieras från värdmaskinen, kopiera inte över make.conf när du använder en befintlig installation.
user $
cp /etc/portage/make.conf /mnt/minchroot/etc/portage # När man använder en befintlig installation, hoppa över detta kommando.
user $
cp /etc/resolv.conf /mnt/minchroot/etc
Användning
När det är färdigt, gå in i chroot-miljön med hjälp av följande kommandon:
root #
chroot /mnt/minchroot /bin/bash
root #
env-update && . /etc/profile
root #
export PS1="(chroot) $PS1"
När man skapar en ny installation borde man synkronisera Portage för att hålla allt uppdaterat.
(chroot) root #
emerge-webrsync
(chroot) root #
emerge --sync
Systemet är nu redo; känn dig fri att installera mjukvara, justera inställningar, testa experimentella paket och konfigurationer utan att det påverkar huvudsystemet. För att lämna chroot-miljön, skriv exit eller tryck på Ctrl+d. På det sättet återvänder du konsollen till den normala miljön. Glöm inte att avmontera (umount) katalogerna som tidigare monterats.
systemd-nspawn
If the system uses systemd, systemd-nspawn can be used, which can automatically handle much of the boilerplate required in administering chroots. For example, to enter a chroot via systemd-nspawn with the same configuration as specified in the Configuration section, simply run:
root #
cp /etc/portage/make.conf /mnt/mychroot/etc/portage
root #
systemd-nspawn -D /mnt/mychroot --bind=/tmp --resolv-conf=/etc/resolv.conf
Init-skripter
Om sätta upp en chroot-miljö är en ofta förekommande uppgift är det möjligt att påskynda monteringsprocessen med hjälp av init-skripter. Skriptet borde läggas till på standard runlevel och därför sättas up automatiskt på systemstart.
#!/sbin/openrc-run
depend() {
need localmount
need bootmisc
}
start() {
ebegin "Monterar chroot-kataloger"
mount -o rbind /dev /mnt/minchroot/dev > /dev/null &
mount -t proc none /mnt/minchroot/proc > /dev/null &
mount -o bind /sys /mnt/minchroot/sys > /dev/null &
mount -o bind /tmp /mnt/minchroot/tmp > /dev/null &
eend $? "Ett fel uppstod vid montering av chroot-kataloger"
}
stop() {
ebegin "Avmonterar chroot-kataloger"
umount -f /mnt/minchroot/dev > /dev/null &
umount -f /mnt/minchroot/proc > /dev/null &
umount -f /mnt/minchroot/sys > /dev/null &
umount -f /mnt/minchroot/tmp > /dev/null &
eend $? "Ett fel uppstod vid avmontering av chroot-kataloger"
}
När man använder en annan katalog eller partition, lägg till de nödvändiga monteringskommandon i start()
-funktionen och ändra /mnt/minchroot till passande namn.
Sound and graphics
The software running inside the chroot will by default not have access to the system sound- and display-server. Fixing this is done by either sharing a socket, or by running the communication with TCP over localhost.
Wayland
Wayland uses a socket to connect clients with the compositor. This socket needs to be shared with the chroot to make graphical applications work. The general procedure for finding this socket is:[1]
- If WAYLAND_SOCKET is set, interpret it as a file descriptor number on which the connection is already established, assuming that the parent process configured the connection for us.
- If WAYLAND_DISPLAY is set, concat with XDG_RUNTIME_DIR to form the path to the Unix socket.
- Assume the socket name is
wayland-0
and concat with XDG_RUNTIME_DIR to form the path to the Unix socket.
Using WAYLAND_DISPLAY and XDG_RUNTIME_DIR is fine in most cases and will be used here. By default XDG_RUNTIME_DIR is set to /run/user/$(uid). This directory will not be available in the chroot because the #Configuration instructions bind mounts /run non-recursively. Assuming the user's uid is 1000, this can be solved by either bind-mounting /run/user/1000 with:
root #
mkdir -p /mnt/mychroot/run/user/1000
root #
mount --bind /run/user/1000 /mnt/mychroot/run/user/1000
or by simply recursively bind mounting /run with:
root #
mount --rbind /run /mnt/mychroot/run
The Wayland library dev-libs/wayland uses the same procedure for finding out the socket as listed above. So to share the socket with the chroot, the only thing that's needed to do is defining XDG_RUNTIME_DIR and WAYLAND_DISPLAY. Here it is assumed that the Wayland socket name WAYLAND_DISPLAY is 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
Permission errors will occur if the user in the chroot does not have permissions to access the Wayland socket. This can be solved by using user namespace remapping or ACLs. The easiest solution is to just make sure that the user ids match. The useradd -u, --uid UID option can be used when creating a user.
PipeWire
Like Wayland, PipeWire uses a socket to connect clients to the PipeWire daemon.
Applications assume that the PipeWire socket will be located in ${XDG_RUNTIME_DIR}/pipewire-0
,
so the only thing that's needed to get PipeWire clients to connect to the host's daemon is to expose
XDG_RUNTIME_DIR to the chroot. This process is identical to the one described in #Wayland.
To expose XDG_RUNTIME_DIR, often /run/user/$(uid), the following commands are used:
root #
mkdir -p /mnt/mychroot/run/user/1000
root #
mount --bind /run/user/1000 /mnt/mychroot/run/user/1000
XDG_RUNTIME_DIR will not be set when logging in inside the chroot, therefore XDG_RUNTIME_DIR needs to exported so the PipeWire client can find the socket:
(chroot) user $
export XDG_RUNTIME_DIR=/run/user/1000
(chroot) user $
pw-cli
Xorg
Xorg by default listens on a socket located in /tmp/.X11-unix/X${DISPLAY}
, as well as on localhost TCP port 6000 + ${DISPLAY}
[2]. The instructions in #Configuration bind mounts /tmp, and therefore no additional configuration is needed except setting the DISPLAY variable before running a graphical application:
(chroot) user $
DISPLAY=:0 firefox-bin
If the uid of the user inside the chroot does not match the uid outside the chroot, then setting permissions with xhost will be needed. To allow all local connections, run outside the chroot:
user $
xhost +local:
Se även
- 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.
- Chroot:a proxy-tjänster
- Chroot:ing och virtuella servrar
External resources
- chroot on Archlinux's wiki
References
- ↑ https://wayland-book.com/protocol-design/wire-protocol.html
- ↑ So if DISPLAY=:12, then Xorg will listen on localhost TCP port 6012