web-dev-qa-db-fra.com

Comment rendre un fichier de périphérique de disque dur / dev / sdxY disponible dans le conteneur lxc?

J'ai créé un conteneur lxc avec Sudo lxc-create -n ubuntu-trusty-AMD64 -t ubuntu -- --Arch AMD64 --release trusty sur Ubuntu 14.04 avec lxc 1.0.5-0ubuntu0.1 et me suis rendu compte qu'il n'existait aucun fichier de périphérique dans /dev/ pour mes disques durs. Comment puis-je les rendre disponibles (via un fichier de périphérique ou une solution de contournement similaire) dans lxc afin de pouvoir monter le périphérique?

J'ai pensé (avec le lien de Muru dans les commentaires) que l'ajout

lxc.hook.autodev = /path/to/script

dans un fichier de configuration (qui BTW?) est nécessaire et script contient une instruction mknod, mais je ne comprends pas l'utilisation de mknod.

ls -a /dev/ dans le lxc donne

.         dsp1   loop3   midi03      port   ram15   rmidi0     stderr  tty7
..        dsp2   loop4   midi1       ptmx   ram16   rmidi1     stdin   tty8
agpgart   dsp3   loop5   midi2       pts    ram2    rmidi2     stdout  tty9
audio     fd     loop6   midi3       ram    ram3    rmidi3     tty     urandom
audio1    full   loop7   mixer       ram0   ram4    sequencer  tty0    zero
audio2    kmem   lxc     mixer1      ram1   ram5    shm        tty1
audio3    kmsg   mem     mixer2      ram10  ram6    smpte0     tty2
audioctl  log    midi0   mixer3      ram11  ram7    smpte1     tty3
console   loop0  midi00  mpu401data  ram12  ram8    smpte2     tty4
core      loop1  midi01  mpu401stat  ram13  ram9    smpte3     tty5
dsp       loop2  midi02  null        ram14  random  sndstat    tty6

J'ai essayé de monter le fichier de périphérique (même si cela semble étrange). Par conséquent, le point de montage sous /var/lib/lxc/<name>/rootfs/dev/ doit être créé. La création d'un fichier avec touch ne fonctionne pas car l'hôte ne peut pas monter un fichier de périphérique sous un fichier. La création d'un répertoire avec mkdir sur l'hôte fonctionne, mais ne permet pas de le monter dans lxc car il est reconnu en tant que répertoire.

Il devrait être possible de créer une image dd du périphérique à l'aide du fichier de périphérique à l'intérieur lxc, par exemple.

3
Karl Richter

option fstab

Vous voulez probablement utiliser le fichier fstab:

$ cat /var/lib/lxc/ubuntu-trusty-AMD64/fstab
/dev/sdc1   mnt/sdc ext4    noatime 0 0

Il est important que le point de montage (2ème argument) ne commence pas par une barre oblique, sinon le script LXC tente de monter le système de fichiers dans le système d'exploitation hôte.

Sur Ubuntu, le fichier devrait déjà exister mais être vide. Sinon, créez-le et assurez-vous d'avoir la ligne suivante dans votre fichier de configuration:

$ grep fstab /var/lib/lxc/ubuntu-trusty-AMD64/config
lxc.mount = /var/lib/lxc/ubuntu-trusty-AMD64/fstab

option de l'appareil

Si vous avez vraiment besoin d'accéder à votre appareil, vous pouvez le rendre disponible dans votre conteneur:

$ grep devices /var/lib/lxc/ubuntu-trusty-AMD64/config
lxc.cgroup.devices.allow = b 8:1 rwm

Cela rendra/dev/sda1 disponible dans votre conteneur (8: 1 est le périphérique de bloc majeur: mineur).

Mais cela ne suffira pas. Votre conteneur n’a normalement pas l’autorisation de monter un système de fichiers. Vous devrez également utiliser la ligne suivante ou une astuce similaire:

$ grep profile /var/lib/lxc/ubuntu-trusty-AMD64/config
lxc.aa_profile = unconfined

Attention: cela permet bien plus que le montage

option de répertoire partagé

Si vous souhaitez accéder à vos données à partir de plusieurs conteneurs (et de l'hôte OS), vous pouvez utiliser la solution la plus courante: similaire à la première option, utilisez fstab pour lier-monter un répertoire déjà monté à votre conteneur:

$ cat /var/lib/lxc/ubuntu-trusty-AMD64/fstab
/mnt/mydata mnt/mydata  none bind 0 0

Encore une fois: le premier argument est la source, le répertoire de votre système hôte. Le deuxième argument est le répertoire de votre conteneur, par rapport à sa racine. Encore une fois: NE PAS METTRE UN CACHE DEVANT LE DEUXIÈME ARGUMENT.

Si vous ne souhaitez pas créer le répertoire dans votre conteneur, vous pouvez le faire automatiquement en utilisant les options bind,create=dir au lieu de simplement bind

2
Daniel Alder

Il y a deux méthodes. Je ne mentionne que le plus facile. Tout est fait dans l'hôte mais vous trouverez votre appareil monté dans le conteneur!

Montez le périphérique quelque part dans l'hôte comme d'habitude, par exemple, utilisez la commande suivante pour monter /dev/sdb1 dans /mnt/myharddisk:

mount /dev/sdb1 /mnt/myharddisk

Créer un point de montage du conteneur dans l'hôte:

mkdir /var/lib/lxc/ubuntu-trusty-AMD64/rootfs/media/myfiles

Pour le monter dans un conteneur, utilisez-le temporairement dans l'hôte:

mount -o bind /mnt/myharddisk /var/lib/lxc/ubuntu-trusty-AMD64/rootfs/media/myfiles

Pour le monter de manière permanente, ajoutez la ligne suivante à la fin du fichier fstab du conteneur (/var/lib/lxc/ubuntu-trusty-AMD64/fstab):

/mnt/myharddisk /var/lib/lxc/ubuntu-trusty-AMD64/rootfs/media/myfiles none bind 0 0
0
SuB