Aller au contenu principal

Distrobox une alternative à Vagrant ?

· 4 minutes de lecture
Stéphane ROBERT
Consultant DevOps

Distrobox annonce qu'il permet de lancer n’importe quelle distribution Linux sur nos machines Linux. Il utilise des containers qui s'intègre totalement dans l'os hôte, en montant tous les filesystems, même les clés usb. Il promet même de pouvoir lancer des environnementgraphiqueses X11 et Wayland.

Installation de distrobox

Distrobox s'installe sur toutes machines et impose simplement la présence de docker ou de podman. Pour l'installer un curl suffit :

# en mode sudo
curl -s https://raw.githubusercontent.com/89luca89/distrobox/main/install | sudo sh
# sans sudo
curl -s https://raw.githubusercontent.com/89luca89/distrobox/main/install | sh -s -- --prefix ~/.local

Par défaut, il utilise le répertoire home de l'utilisateur qui lance la box. Mais il est possible de changer ce comportement soit en créant un fichier de configuration créé dans un de ces répertoires :

/usr/share/distrobox/distrobox.conf
/etc/distrobox/distrobox.conf
${HOME}/.config/distrobox/distrobox.conf
${HOME}/.distroboxrc

avec ce contenu :

container_user_custom_home="/home/.local/share/container-home-test"
container_image="registry.opensuse.org/opensuse/toolbox:latest"
container_manager="docker"
container_name="test-name-1"
non_interactive="1"

soit via des variables d'environnement :

DBX_CONTAINER_MANAGER
DBX_CONTAINER_IMAGE
DBX_CONTAINER_NAME
DBX_NON_INTERACTIVE

Les commandes distrobox

Distrobox utilise toute une série de commandes pour gérer ses box :

Nous allons créer une nouvelle box :

distrobox create -n test

Pour entrer dans la box créée :

distrobox enter test

Pour lancer une commande, c'est la même commande, mais en ajoutant :

Exécutez une commande dans une boîte de distribution :

distrobox enter test -- command-to-execute

Pour lister les boxes en cours :

distrobox list

Pour l'arrêter :

distrobox stop test

Et pour la supprimer :

distrobox rm test

Quelques tests

attention

Si vous utilisez docker, le démon s’exécutant en tant que root par défaut, il est donc possible de modifier des éléments du système hôte. L'alternative passer à podman qui est lui rootless. Le mode rootless de docker ne fonctionne pas pour le moment. Pour info, les dévs du projet sont en train de créer un mode sandbox

Je crée ma box et je me connecte dessus :

distrobox create -n test
distrobox enter test

/usr/bin/sh: warning: setlocale: LC_ALL: cannot change locale (fr_FR.UTF-8)
/usr/bin/sh: warning: setlocale: LC_ALL: cannot change locale (fr_FR.UTF-8)
/usr/bin/sh: warning: setlocale: LC_ALL: cannot change locale (fr_FR.UTF-8)
/home/vagrant/.oh-my-zsh/oh-my-zsh.sh:126: compinit: function definition file not found
/home/vagrant/.oh-my-zsh/lib/completion.zsh:78: bashcompinit: function definition file not found
/home/vagrant/.oh-my-zsh/lib/directories.zsh:32: command not found: compdef
/home/vagrant/.oh-my-zsh/lib/termsupport.zsh:108: add-zsh-hook: function definition file not found
/home/vagrant/.oh-my-zsh/lib/termsupport.zsh:109: add-zsh-hook: function definition file not found
/home/vagrant/.oh-my-zsh/lib/theme-and-appearance.zsh:2: colors: function definition file not found

/home/vagrant/.zshrc:120: command not found: zplug
/home/vagrant/.zshrc:121: command not found: zplug
(anon):8: is-at-least: function definition file not found
➜  test-nixos who

Cela confirme bien qu'il utilise que le user qui lance la box avec ses paramètres dont son shell et sa configuration de la home directory. Si on veut modifier le shell il faut ajouter ceci à la commande create :

distrobox create -n test SHELL=/bin/zsh

Il faudra donc bien modifier cela via le fichier de configuration.

On est qui dans le container et qu'est qui est monté dessus ?

➜  test-nixos id
uid=1000(vagrant) gid=1000(vagrant) groups=1000(vagrant)

➜  test-nixos ls $HOME
Projets  my-vagrant-box  sources.list

➜  test-nixos mount

overlay on / type overlay (rw,relatime,lowerdir=/var/lib/docker/overlay2/l/BX5NTRHCZ2IVDGRFR6A2TD7TGC:/var/lib/docker/overlay2/l/YWY2NLDQFVHTVVDVXDIZFJ673V:/var/lib/docker/overlay2/l/GZSSHXSYI6ISQTJFC6SA2GVHCL,upperdir=/var/lib/docker/overlay2/a24ecf6aa0d6a033dadd26f4a09196411eb7b744a53b78db734e2f81465d4798/diff,workdir=/var/lib/docker/overlay2/a24ecf6aa0d6a033dadd26f4a09196411eb7b744a53b78db734e2f81465d4798/work)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
cgroup on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime,nsdelegate,memory_recursiveprot)
udev on /dev type devtmpfs (rw,nosuid,relatime,size=1972988k,nr_inodes=493247,mode=755,inode64)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev,size=2008784k,nr_inodes=502196,inode64)
hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime,pagesize=2M)
mqueue on /dev/mqueue type mqueue (rw,nosuid,nodev,noexec,relatime)
/dev/mapper/ubuntu--vg-ubuntu--lv on /tmp type ext4 (rw,relatime)
/dev/mapper/ubuntu--vg-ubuntu--lv on /nix type ext4 (rw,relatime)
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
cgroup2 on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime,nsdelegate,memory_recursiveprot)
pstore on /sys/fs/pstore type pstore (rw,nosuid,nodev,noexec,relatime)
none on /sys/fs/bpf type bpf (rw,nosuid,nodev,noexec,relatime,mode=700)
...

Tous les fs sont présent ! Mince pas forcément ce que j'aimerais. Dans la FAQ je ne vois rien permettant de modifier ce comportement. J'arrête donc les tests !

Conclusion

Cela ne correspond pas du tout à ce que je cherche à faire avec Vagrant. Je cherche à créer des machines vierges de toute installation. Donc non distrobox dans l'état actuel n'est pas une alternative à vagrant.

Vivement le mode sandbox, car pour le moment je trouve même ca dangereux avec docker !

Plus d'infos