En ce qui concerne les périphériques branchables à chaud (je vais reprendre l'exemple du scanner), il peut y avoir un petit problème.
En cas de débranchement/rebranchement, sur l'hôte, le périphérique peut changer de numéros d'identification, au moins mineur.
Même si on utilise "--devnodes" au lieu de "--devices" avec vzctl, pour "démasquer" ce périphérique, si le nœud est déjà créé dans le conteneur, même en redémarrant ce dernier, il ne sera pas recréé... et puis, c'est moche de redémarrer un conteneur juste pour ça...
J'ai donc fait un petit script pour effacer les nœuds d'un conteneur, et les réassigner :
#!/bin/bash
#
# Script to remove DEVNODES from an OpenVZ VE and add them back then.
#
# Released under the WTFPL (http://sam.zoy.org/wtfpl/COPYING)
#
# Made to be run by a "+RUN" udev stanza on the HN ; let us call
# this a "hack-ish fractal udev for the VE, running on the HN" :p
#
# udev is generally ran as root, so the script should then have
# the permissions it needs
#
# It is a generic script : it picks the ID of the VE
# from its own name, ie "${ID}.dev"
#
# Particularly useful for hotplugable devices that may change of
# major/minor numbers on unplug/replug
#
# There is no need to restart the VE with this one
# This variable is going to be used in this script
# You should not use spaces in nodes names, as they are treated
# as separators... but you should not be able to do so in VE conf
# files anyway...
unset DEVNODES
# The ID of the VE, recovered from the name of this file
ID=`basename 0ドル|cut -d. -f1`
# Checks the VE configuration, so to pick the DEVNODES variable
source /etc/vz/conf/${ID}.conf
# If there are DEVNODES, remove those from the VE's private directory
# and add them back
if [[ ! -z "${DEVNODES}" ]]
then
for i in "${DEVNODES}"
do
if [[ -e "/var/lib/vz/private/${ID}/dev/`echo $i|cut -d: -f1`" ]]
then
rm "/var/lib/vz/private/${ID}/dev/`echo $i|cut -d: -f1`"
vzctl set ${ID} --devnodes $i --save
fi
done
fi
Veillez juste à le rendre exécutable, et à lui donner un nom correspondant à l'ID du conteneur ; j'ai pris ".dev" pour l'extension, mais a priori, l'extension, le script s'en fout.
Ensuite, j'inclus ce script dans la règle udev qui me permet de donner un symlink constant à mon scanner, par exemple :
Et ainsi, si je débranche la bête, dès qu'elle est de nouveau détectée, le nœud matériel accessible au conteneur est mis à jour, que celui-ci soit en train de fonctionner ou pas (dans ce cas, le nœud est juste effacé, et sera rajouté au conteneur dès son prochain démarrage).
Sinon, dernière astuce, si vous voulez regrouper les périphériques pour les conteneurs dans un sous-répertoire particulier de "/dev", comme je le fais avec mon "/dev/containers_dev", sachez que ça ne suffira pas pour les logiciels comme "saned", qui recherchent "/dev/bus/usb", à moins de directement partager ce qu'il y a dans ce dernier, et pas un simple "symlink" (même en le spécifiant dans "/etc/saned/snapscan.conf", par exemple, dans mon cas).
Ainsi, sur l'hôte, si avec ma règle "udev", "/dev/containers_dev/epson_1670" n'est qu'un symlink vers, en ce moment (mais ça change au moindre débranchement/rebranchement), "/dev/bus/usb/003/017", en partageant "/dev/containers_dev/epson_1670", ie le "symlink", ça ne suffit pas au conteneur pour voir ce qu'il faut. Pas grave - dans le conteneur, il suffit de faire un :
en créant à la main le répertoire "/dev/bus/usb/001", et "saned" n'y verra que du feu (par contre, ça ne suffit pas à faire marcher "lsusb" : il lui faut le vrai "/dev/bus/usb/...", et pas un "symlink" avec des répertoires, dans le conteneur).
# Petit complément
Posté par Aefron . En réponse au journal Debian, VServer & OpenVZ : les conteneurs. Évalué à 2.
En cas de débranchement/rebranchement, sur l'hôte, le périphérique peut changer de numéros d'identification, au moins mineur.
Même si on utilise "--devnodes" au lieu de "--devices" avec vzctl, pour "démasquer" ce périphérique, si le nœud est déjà créé dans le conteneur, même en redémarrant ce dernier, il ne sera pas recréé... et puis, c'est moche de redémarrer un conteneur juste pour ça...
J'ai donc fait un petit script pour effacer les nœuds d'un conteneur, et les réassigner :
#!/bin/bash
#
# Script to remove DEVNODES from an OpenVZ VE and add them back then.
#
# Released under the WTFPL (http://sam.zoy.org/wtfpl/COPYING)
#
# Made to be run by a "+RUN" udev stanza on the HN ; let us call
# this a "hack-ish fractal udev for the VE, running on the HN" :p
#
# udev is generally ran as root, so the script should then have
# the permissions it needs
#
# It is a generic script : it picks the ID of the VE
# from its own name, ie "${ID}.dev"
#
# Particularly useful for hotplugable devices that may change of
# major/minor numbers on unplug/replug
#
# There is no need to restart the VE with this one
# This variable is going to be used in this script
# You should not use spaces in nodes names, as they are treated
# as separators... but you should not be able to do so in VE conf
# files anyway...
unset DEVNODES
# The ID of the VE, recovered from the name of this file
ID=`basename 0ドル|cut -d. -f1`
# Checks the VE configuration, so to pick the DEVNODES variable
source /etc/vz/conf/${ID}.conf
# If there are DEVNODES, remove those from the VE's private directory
# and add them back
if [[ ! -z "${DEVNODES}" ]]
then
for i in "${DEVNODES}"
do
if [[ -e "/var/lib/vz/private/${ID}/dev/`echo $i|cut -d: -f1`" ]]
then
rm "/var/lib/vz/private/${ID}/dev/`echo $i|cut -d: -f1`"
vzctl set ${ID} --devnodes $i --save
fi
done
fi
Veillez juste à le rendre exécutable, et à lui donner un nom correspondant à l'ID du conteneur ; j'ai pris ".dev" pour l'extension, mais a priori, l'extension, le script s'en fout.
Ensuite, j'inclus ce script dans la règle udev qui me permet de donner un symlink constant à mon scanner, par exemple :
ATTRS{idVendor}=="04b8", ATTRS{idProduct}=="011f", SYMLINK+="containers_dev/scanner_1670", RUN+="/etc/vz/conf/1500.dev"Et ainsi, si je débranche la bête, dès qu'elle est de nouveau détectée, le nœud matériel accessible au conteneur est mis à jour, que celui-ci soit en train de fonctionner ou pas (dans ce cas, le nœud est juste effacé, et sera rajouté au conteneur dès son prochain démarrage).
Sinon, dernière astuce, si vous voulez regrouper les périphériques pour les conteneurs dans un sous-répertoire particulier de "/dev", comme je le fais avec mon "/dev/containers_dev", sachez que ça ne suffira pas pour les logiciels comme "saned", qui recherchent "/dev/bus/usb", à moins de directement partager ce qu'il y a dans ce dernier, et pas un simple "symlink" (même en le spécifiant dans "/etc/saned/snapscan.conf", par exemple, dans mon cas).
Ainsi, sur l'hôte, si avec ma règle "udev", "/dev/containers_dev/epson_1670" n'est qu'un symlink vers, en ce moment (mais ça change au moindre débranchement/rebranchement), "/dev/bus/usb/003/017", en partageant "/dev/containers_dev/epson_1670", ie le "symlink", ça ne suffit pas au conteneur pour voir ce qu'il faut. Pas grave - dans le conteneur, il suffit de faire un :
ln -s /dev/containers_dev/epson_1670 /dev/bus/usb/001/001"en créant à la main le répertoire "/dev/bus/usb/001", et "saned" n'y verra que du feu (par contre, ça ne suffit pas à faire marcher "lsusb" : il lui faut le vrai "/dev/bus/usb/...", et pas un "symlink" avec des répertoires, dans le conteneur).