Как запустить openvpn в контейнере LXC внутри хоста Debian?

2737
omega

Я запускаю debian stretch на своем хосте и пытаюсь настроить openvpn внутри гостевой системы Ubuntu xenial LXC.

Поскольку openvpn требуется устройство tun, я следовал инструкциям, таким как http://heider.io/blog/2013/10/26/openvpn-in-a-lxc-container/, чтобы разрешить создание устройства tun внутри контейнера.

К сожалению, установка lxc.cgroup.devices.allow = c 10:200 rwmв конфигурационном файле контейнера дает мне эту ошибку:

 lxc-start ERROR lxc_cgfsng - cgroups/cgfsng.c:cgfsng_setup_limits:1949 - No such file or directory - Error setting devices.allow to c 10:200 rwm for ubuntu lxc-start ERROR lxc_start - start.c:lxc_spawn:1236 - Failed to setup the devices cgroup for container "ubuntu". lxc-start ERROR lxc_start - start.c:__lxc_start:1346 - Failed to spawn container "ubuntu". 

редактировать

Я пытаюсь добиться этого в непривилегированном контейнере LXC, вот полная конфигурация этого контейнера:

# Distribution configuration lxc.include = /usr/share/lxc/config/ubuntu.common.conf lxc.include = /usr/share/lxc/config/ubuntu.userns.conf lxc.arch = x86_64  # Container specific configuration lxc.id_map = u 0 100000 65536 lxc.id_map = g 0 100000 65536 lxc.rootfs = /home/myuser/.local/share/lxc/ubuntu/rootfs lxc.rootfs.backend = dir lxc.utsname = ubuntu  # Network configuration lxc.network.type = veth lxc.network.flags = up lxc.network.link = br0 lxc.network.hwaddr = 00:11:22:aa:bb:cc lxc.network.ipv4 = 192.168.1.101/24 lxc.network.ipv4.gateway = 192.168.1.1  # trying to get /dev/net/tun inside container lxc.cgroup.devices.allow = c 10:200 rwm 

Когда я не устанавливаю параметр devices.allow, чтобы иметь возможность запускать контейнер, я вижу, что процессы внутри контейнера находятся в cgroup /sys/fs/cgroup/devices/user.slice(их PID, видимый снаружи контейнера, фактически находится в cgroup.procsфайле этого подкаталога) и отсюда:

$ cat devices.list  a *:* rwm 

но изнутри контейнера

# mknod /dev/net/tun c 10 200 mknod: /dev/net/tun: Operation not permitted 
2
Возможно, вам не хватает поддержки ядра для групп управления «устройствами». Daniel B 7 лет назад 0
Почему именно вы хотите сделать это в контейнере? Это можно сделать проще, настроив второе пространство имен сети, что аналогично тому, что делает контейнер, за исключением того, что нет никаких накладных расходов контейнера. MariusMatutiae 7 лет назад 0
@MariusMatutiae: Это для целей тестирования, я хочу полностью функциональный контейнер Linux без необходимости запуска виртуальной машины. omega 7 лет назад 0
@DanielB: Как я могу это проверить? Что я мог сделать для? omega 7 лет назад 0
Таким образом, я установил текущий Debian с нуля, и опция работает отлично. Убедитесь, что все файловые системы cgroup (cpuset, cpu / cpuacct, устройства, морозильник, net_cls / net_prio, blkio и perf_event) правильно смонтированы в `/ sys / fs / cgroup`. Если нет, то может быть ошибка где-то в вашей конфигурации загрузки. Вы используете systemd? Ваша установка Debian устарела и обновлена? Daniel B 7 лет назад 0
@DanielB: Спасибо за ваше время, хотя все эти cgroups правильно смонтированы. Это чистая установка Debian с использованием systemd (SMD Debian 4.9.1-2-1 amd64 # 1 # 4.9.18-1 (2017-03-30) x86_64 GNU / Linux). omega 7 лет назад 0
Гектометр Возможно, вы пытаетесь запустить контейнер при входе в учетную запись без полномочий root? Когда я запускаю контейнер (с указанным параметром конфигурации или без него), его cgroup доступна по адресу `/ sys / fs / cgroup / devices / lxc /`. `devices.allow` есть. Daniel B 7 лет назад 0
@DanielB Я понимаю, что не упомянул об этом, но у меня запущен непривилегированный контейнер, поэтому я запускаю контейнер, когда он зарегистрирован как учетная запись без полномочий root. У меня нет cgroup для устройства, но я получаю cgroup `freezer`,` memory` и `systemd` в` / sys / fs / cgroup / freezer / user / ghost / 0 / lxc / ubuntu`, ` / sys / fs / cgroup / memory / user / ghost / 0 / lxc / ubuntu`, `/ sys / fs / cgroup / systemd / user.slice / user-1000.slice / session-1.scope / lxc / ubuntu` omega 7 лет назад 0

1 ответ на вопрос

1
omega

Добавление

lxc.mount.entry = /dev/net/tun dev/net/tun none bind,create=file 

в конфигурационном файле контейнера bind-mount устройство tun char внутри контейнера, которое решает проблему.

Похожие вопросы