#!/usr/bin/bash set -xe # HACK # Use hosts's /dev to see new devices and allow macvtap mkdir /dev.container && { mount --rbind /dev /dev.container mount --rbind /host/dev /dev # Keep some devices from the containerinal /dev keep() { mount --rbind /dev.container/$1 /dev/$1 ; } keep shm keep mqueue # Keep ptmx/pts for pty creation keep pts mount --rbind /dev/pts/ptmx /dev/ptmx # Use the container /dev/kvm if available [[ -e /dev.container/kvm ]] && keep kvm } mkdir /sys.net.container && { mount --rbind /sys/class/net /sys.net.container mount --rbind /host/sys/class/net /sys/class/net } mkdir /sys.devices.container && { mount --rbind /sys/devices /sys.devices.container mount --rbind /host/sys/devices /sys/devices } # load modules modprobe ip6_tables -d /host # enable nested virtualzation modprobe kvm_intel nested=1 -d /host # If no cpuacct,cpu is present, symlink it to cpu,cpuacct # Otherwise libvirt and our emulator get confused if [ ! -f "/host/sys/fs/cgroup/cgroup.controllers" ]; then if [ ! -d "/host/sys/fs/cgroup/cpuacct,cpu" ]; then echo "Creating cpuacct,cpu cgroup symlink" mount -o remount,rw /host/sys/fs/cgroup cd /host/sys/fs/cgroup ln -s cpu,cpuacct cpuacct,cpu mount -o remount,ro /host/sys/fs/cgroup fi fi mount --rbind /host/sys/fs/cgroup /sys/fs/cgroup mkdir -p /var/log/libvirt touch /var/log/libvirt/qemu.log chown qemu:qemu /var/log/libvirt/qemu.log # clean previously configured value into /etc/libvirt/libvirtd.conf sed -i 's/^log_level.*//g' /etc/libvirt/libvirtd.conf sed -i 's/^log_outputs.*//g' /etc/libvirt/libvirtd.conf # replace commented default value to appropriate configuration sed -i "s/^#log_level.*/log_level = $LOG_LEVEL/g" /etc/libvirt/libvirtd.conf sed -i "s/^#log_outputs.*/log_outputs=\"$LOG_LEVEL:file:\/var\/log\/libvirt\/libvirtd.log\"/g" /etc/libvirt/libvirtd.conf sed -i "s/^#tcp_port.*/tcp_port=\"$LIBVIRTD_TCP_PORT\"/g" /etc/libvirt/libvirtd.conf # clean previously configured value into /etc/libvirt/virtlogd.conf sed -i 's/^log_level.*//g' /etc/libvirt/virtlogd.conf sed -i 's/^log_outputs.*//g' /etc/libvirt/virtlogd.conf # replace commented default value to appropriate configuration sed -i "s/^#log_level.*/log_level = $LOG_LEVEL/g" /etc/libvirt/virtlogd.conf sed -i "s/^#log_outputs.*/log_outputs=\"$LOG_LEVEL:file:\/var\/log\/libvirt\/libvirtd.log\"/g" /etc/libvirt/virtlogd.conf # We create the network on a file basis to not # have to wait for libvirtd to come up if [[ -n "$LIBVIRTD_DEFAULT_NETWORK" ]]; then mkdir -p /etc/libvirt/qemu/networks/autostart cat > /etc/libvirt/qemu/networks/default.xml < default EOX ln -s /etc/libvirt/qemu/networks/default.xml /etc/libvirt/qemu/networks/autostart/default.xml fi # We create the storage pool on a file basis to not # have to wait for libvirtd to come up if [[ -n "$LIBVIRTD_DEFAULT_POOL_PATH" ]]; then mkdir -p /etc/libvirt/storage/autostart cat > /etc/libvirt/storage/pool_1.xml < pool_1 $LIBVIRTD_DEFAULT_POOL_PATH EOX ln -s /etc/libvirt/storage/pool_1.xml /etc/libvirt/storage/autostart/pool_1.xml fi echo "cgroup_controllers = []" >> /etc/libvirt/qemu.conf echo "namespaces = []" >> /etc/libvirt/qemu.conf /usr/sbin/virtlogd & #Define cleanup procedure cleanup() { echo "Container stopped, performing cleanup..." if [[ -n "$LIBVIRTD_DEFAULT_NETWORK" ]]; then echo "Container stopped, destroy default network ..." virsh net-destroy default fi } #Trap SIGTERM trap 'cleanup' SIGTERM #Execute command # "${@}" & /usr/sbin/libvirtd -ld #Wait wait $! #Cleanup cleanup