Posts Firefox en una jaula chroot
Post
Cancel

Firefox en una jaula chroot

El propósito de esta chroot no es la seguridad, es tener múltiples versiones instaladas simultáneamente y aisladas del sistema principal. Este mismo procedimiento se puede aplicar a cualquier jaula para aplicaciones gráficas (eg Steam;).

Contenido


Chroot

Creamos el directorio del chroot.

# mkdir /usr/local/firefox
# cd /usr/local/firefox

Descargamos el tarball y lo extraemos.

# wget http://distfiles.gentoo.org/releases/amd64/autobuilds/20180624T214502Z/stage3-amd64-20180624T214502Z.tar.xz
# tar xvJpf stage3-amd64-20180624T214502Z.tar.xz

Copiamos los DNS

# cp -L /etc/resolv.conf etc 

Creamos el directorio de portage y montamos los sistemas de fichero.

# chroot_dir="/usr/local/firefox"
# mkdir "${chroot_dir}/usr/portage"
# mount -R /dev "${chroot_dir}/dev"
# mount -R /run "${chroot_dir}/run"
# mount -R /sys "${chroot_dir}/sys"
# mount -t proc proc "${chroot_dir}/proc"
# mount -R /usr/portage "${chroot_dir}/usr/portage"

Cambiamos de root y creamos un nuevo usuario.

# chroot .
# env-update && source /etc/profile
# export PS1="(chroot) ${PS1}"
# useradd -m firefox

Se modifica el fichero make.conf según el handbook y por último se instala Firefox.

Aceleración gráfica

Esto es opcional y solo necesario si queremos aceleración gráfica en la chroot. Se instala la misma versión de los drivers compilados contra el mismo kernel del host(mount -R /usr/src/linux "${chroot_dir}/usr/src/linux").

Se añade firefox al grupo video.

# usermod -aG video firefox

PulseAudio

Este paso es también completamente opcional y solo necesario si se quiere tener audio. Necesitamos instalar PulseAudio si no se instaló como dependencia de Firefox y PulseAudio en el host.

Configuración en el host 1

ACLs en el kernel.

File systems  --->
   Pseudo filesystems  --->
      [*] Tmpfs virtual memory file system support (former shm fs)
      [*]    Tmpfs POSIX Access Control Lists

ConsoleKit (sys-auth/consolekit) instalado con la USE acl y PAM (sys-auth/pambase) con consolekit. Añadimos consolekit al inicio y lo iniciamos.

# rc-update add consolekit default
# rc-service consolekit start

Es importante que ningún usuario pertenezca al grupo audio.

# gpasswd -d <user> audio

Configuramos sudo para que conserve el XDG_RUNTIME_DIR. 2

$ sudo visudo

Defaults env_keep +="XDG_RUNTIME_DIR"

Script

#!/bin/sh

# chroot directory
chroot_dir="/usr/local/gentoo-64_Firefox"
chroot_user="firefox"

# check if firefox is already running
if pgrep -x "firefox" > /dev/null; then
	chroot "${chroot_dir}" su ${chroot_user} -c "dbus-launch firefox ${@}"
	exit
fi

# use this if running multiple instances in different roots
# for ROOT in /proc/*/root; do
#	LINK=$(readlink $ROOT)
#    if [ "x$LINK" != "x" ]; then
#        if [ "x${LINK:0:${#chroot_dir}}" = "x$chroot_dir" ]; then
#			PID=$(basename $(dirname "$ROOT"))
#			NAME=$(cat /proc/${PID}/status |grep Name|cut -d':' -f2 |sed 's/ //g')
#			if [ $NAME = "firefox" ]; then
#				chroot "${chroot_dir}" su ${chroot_user} -c "dbus-launch firefox ${@}"
#				exit
#			fi
#        fi
#    fi
# done

# mount directories
mount -R /dev "${chroot_dir}/dev"
mount -R /home/christian/.config/pulse "${chroot_dir}/home/${chroot_user}/.config/pulse"
mount -R /run "${chroot_dir}/run"
mount -R /sys "${chroot_dir}/sys"
mount -R /usr/portage "${chroot_dir}/usr/portage"
mount -R /var/lib/dbus "${chroot_dir}/var/lib/dbus"
mount -t proc proc "${chroot_dir}/proc"

# check dbus session
if [ -z "${DBUS_SESSION_BUS_ADDRESS}" ] ; then
  chroot "${chroot_dir}" dbus-launch
fi
# chroot
chroot "${chroot_dir}" su ${chroot_user} -c "dbus-launch firefox ${@}"

# kill any running process
for ROOT in /proc/*/root; do
	LINK=$(readlink $ROOT)
    if [ "x$LINK" != "x" ]; then
        if [ "x${LINK:0:${#chroot_dir}}" = "x$chroot_dir" ]; then
            PID=$(basename $(dirname "$ROOT"))
            kill -9 "$PID"
        fi
    fi
done

# unmount directories
umount -l "${chroot_dir}/dev"
umount -l "${chroot_dir}/home/${chroot_user}/.config/pulse"
umount -l "${chroot_dir}/proc"
umount -l "${chroot_dir}/run"
umount -l "${chroot_dir}/sys"
umount -l "${chroot_dir}/usr/portage"
umount -l "${chroot_dir}/var/lib/dbus"

sudo

Creamos un enlace al script.

# ln -s /path/to/script.sh /usr/local/bin/firefox

Permitimos que el grupo wheel pueda ejecutarlo como root.

# visudo

%wheel ALL=(ALL) NOPASSWD: /usr/local/bin/firefox

urxvt y perl-matcher

La extensión perl-matcher (y otros programas que usen XDG) no funciona a no ser que tengamos un MIME registrado.

Copiamos el fichero firefox.desktop que se debería haber instalado en la chroot a ~/.local/share/applications y modificamos Exec= para que inicie el script con privilegios.

$ cp /usr/local/firefox/usr/share/applications/firefox.desktop ~/.local/share/applications/
$ vim ~/.local/share/applications/firefox.desktop
Exec=sudo firefox %u 

Creamos un enlace al script y añadimos firefox.desktop como navegador por defecto.3

$ vim ~/.local/share/applications/mimeapps.list

[Default Applications]
x-scheme-handler/http=firefox.desktop
x-scheme-handler/https=firefox.desktop

Fuentes:

OLDER POST NEWER POST

Comments powered by Disqus.

Search Results