J'essaie de configurer un serveur MaaS dans un conteneur LXC.
Lorsque j'importe les fichiers PXE, il doit être capable de monter des périphériques en boucle.
J'ai défini les options suivantes dans le fichier de configuration du conteneur pour permettre le montage en boucle, mais quelque chose me manque.
lxc.cgroup.devices.allow = b 7:* rwm
lxc.cgroup.devices.allow = c 10:237 rwm
Je reçois le message d'erreur suivant parce que le script ne peut pas monter en boucle un fichier:
mount: cannot mount block device /dev/loop0 read-only
Wed, 13 Nov 2013 07:26:41 +0000: failed to mount /var/lib/maas/ephemeral/precise/ephemeral/i386/20131010/disk.img
Traceback (most recent call last):
File "/usr/sbin/maas-import-ephemerals", line 26, in <module>
main(args)
File "/usr/lib/python2.7/dist-packages/provisioningserver/import_images/ephemerals_script.py", line 428, in main
target.sync(source, args.path)
File "/usr/lib/python2.7/dist-packages/simplestreams/mirrors/__init__.py", line 85, in sync
return self.sync_index(reader, path, data, content)
File "/usr/lib/python2.7/dist-packages/simplestreams/mirrors/__init__.py", line 237, in sync_index
self.sync(reader, path=epath)
File "/usr/lib/python2.7/dist-packages/simplestreams/mirrors/__init__.py", line 83, in sync
return self.sync_products(reader, path, data, content)
File "/usr/lib/python2.7/dist-packages/simplestreams/mirrors/__init__.py", line 315, in sync_products
self.insert_item(item, src, target, pgree, ipath_cs)
File "/usr/lib/python2.7/dist-packages/provisioningserver/import_images/ephemerals_script.py", line 251, in insert_item
self.extract_item(path, flat)
File "/usr/lib/python2.7/dist-packages/provisioningserver/import_images/ephemerals_script.py", line 295, in extract_item
tarball, target_dir, temp_location=self._simplestreams_path())
File "/usr/lib/python2.7/dist-packages/provisioningserver/import_images/ephemerals_script.py", line 124, in extract_image_tarball
call_uec2roottar(image, os.path.join(target_dir, 'dist-root.tar.gz'))
File "/usr/lib/python2.7/dist-packages/provisioningserver/import_images/ephemerals_script.py", line 97, in call_uec2roottar
subprocess.check_call(["uec2roottar"] + list(args))
File "/usr/lib/python2.7/subprocess.py", line 540, in check_call
raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '[u'uec2roottar', u'/var/lib/maas/ephemeral/precise/ephemeral/i386/20131010/disk.img', u'/var/lib/maas/ephemeral/precise/ephemeral/i386/20131010/dist-root.tar.gz']' returned non-zero exit status 1
root@maaslxc2:~# mount /dev/loop0 /mnt
mount: block device /dev/loop0 is write-protected, mounting read-only
mount: cannot mount block device /dev/loop0 read-only
Alors, que dois-je changer dans la configuration du conteneur pour lui permettre de monter des périphériques en boucle? Il semble que ce ne soit pas simplement un problème MaaS, mais une restriction qui poserait problème pour tout ce qui (pas seulement MaaS) a besoin de monter en boucle un fichier dans un conteneur LXC.
Le problème que vous rencontriez est avec apparmor. 'dmesg'
vous aurait probablement montré quelque chose comme:
[ 4822.366235] type=1400 audit(1384973058.254:52): apparmor="DENIED" operation="mount"
info="failed type match" error=-13 parent=1272 profile="lxc-container-default"
name="/mnt/" pid=1273 comm="mount" fstype="ext4" srcname="/dev/loop0/" flags="ro"
Vous pouvez autoriser votre conteneur lxc à effectuer des montages de systèmes de fichiers ext2, ext3 ou ext4 de deux manières. Le simpliste consiste simplement à ajouter ce qui suit à la configuration de lxc (/var/lib/lxc/$NAME/config
):
lxc.aa_profile = unconfined
lxc.cgroup.devices.allow = b 7:* rwm
lxc.cgroup.devices.allow = c 10:237 rwm
Une solution beaucoup plus restrictive qui accorde toujours les autorisations nécessaires consiste à effectuer les opérations suivantes:
$ Sudo tee /etc/apparmor.d/lxc/lxc-custom-mounts <<EOF
# copied and modified from /etc/apparmor.d/lxc/lxc-default
profile lxc-container-extx-mounts flags=(attach_disconnected,mediate_deleted) {
#include <abstractions/lxc/container-base>
mount fstype=ext4 -> /**,
mount fstype=ext3 -> /**,
mount fstype=ext2 -> /**,
}
EOF
# reload the lxc-containers profile
$ Sudo apparmor_parser --replace /etc/apparmor.d/lxc-containers
$ Sudo lxc-create -t ubuntu-cloud -n source-saucy-AMD64 -- --release=saucy --Arch=AMD64
$ name="test1"
$ cfg=/var/lib/lxc/$name/config;
$ Sudo lxc-clone -o source-saucy-AMD64 -n "$name"
## modify the config to use the profile created above
$ Sudo grep "#allow-loop" "$cfg" || Sudo tee -a "$cfg" <<EOF
#allow-loop
lxc.aa_profile = lxc-container-extx-mounts
lxc.cgroup.devices.allow = b 7:* rwm
lxc.cgroup.devices.allow = c 10:237 rwm
EOF
Vous pouvez ensuite vérifier que cela fonctionne dans le conteneur avec quelque chose d'aussi simple que:
$ truncate --size 100M my.img
$ mkfs.ext4 -F my.img
$ Sudo mount -o loop,ro my.img /mnt
$ ls /mnt
lost+found
$ Sudo umount /mnt
Je viens d'ouvrir bug 1257389 pour résoudre ce problème. Espérons que bientôt, maas-import-ephemerals fonctionnera dans un conteneur.