Як автозапустити непривілейовані контейнери lxc?


9

У Ubuntu 14.04 я створив непривілейований контейнер, який можна вручну запускати та зупиняти.

Але я хотів би, щоб це почалося і припинилося разом із системою.

До конфігурації контейнера я додав наступне: lxc.start.auto = 1 lxc.start.delay = 5

Однак системні сценарії, схоже, не вибирають непривілейовані контейнери.

На цьому linuxcontainers.org є нитка, пов’язана з цим, але, здається, рішення обмежене rootкористувачем.

Чи є чистий спосіб зробити це для не-root користувача (за згодою користувача root)?

Відповіді:


3

Я думаю, що я знайшов краще рішення, ніж ті, які представлені тут. Частково тому, що наскільки я можу сказати, що cgmanager мертвий, частково тому, що моє рішення не схоже на хитре вирішення проблеми, а здебільшого тому, що ця дискусія все ще з'являється під час пошуку рішення проблеми. Насправді це досить просто: використовуйте системний режим користувача .

Звичайно, якщо ви не використовуєте systemd, це рішення не допоможе. У такому випадку я б порадив вам розібратися, чи є у вашій системі init якийсь спосіб дозволяти непривіреним користувачам запускати сервіси під час завантаження та використовувати це як вихідну точку.

Використання системного режиму користувача для автоматичного запуску непривілейованих контейнерів lxc

Я припускаю, що у вас непривілейовані контейнери lxc працюють належним чином і працюють lxc-autostartяк користувач контейнера. Якщо так, зробіть наступне:

  1. Створіть файл ~/.config/systemd/user/lxc-autostart.serviceу будинку будь-якого користувача, який має контейнери lxc:
[Unit]
Description="Lxc-autostart for lxc user"

[Service]
Type=oneshot
ExecStart=/usr/bin/lxc-autostart
ExecStop=/usr/bin/lxc-autostart -s
RemainAfterExit=1

[Install]
WantedBy=default.target
  1. Потім, як цей користувач запустіть:
systemctl --user enable lxc-autostart

(Зауважте, --userопція повідомляє systemctl, що ви використовуєте його в режимі користувача. Усі речі, які я зазвичай роблю з systemctl, start, stop, statuc, enable тощо, працюю з --user.)

  1. Потім запустіть наступне, де $userім'я користувача, у якого є контейнери lxc:
sudo loginctl enable-linger $user

Це необхідно для systemd для запуску екземпляра користувача systemd для $userпід час завантаження. В іншому випадку він розпочне лише один на даний момент $userвхід у систему.

Для отримання додаткової інформації я б порекомендував сторінку wiki systeml / timeer від archlinux та сторінок systemd man .

Доступ до системного екземпляра користувача як корінь

Ви можете фактично запустити / зупинити / будь-яку системну службу користувача як root, однак для цього потрібно встановити XDG_RUNTIME_DIRзмінну середовища. Припустимо, $user це користувач, до якого екземпляр ви хочете отримати доступ, і $uidце uid, то саме так ви запустили б визначений вище lxc-autostart.service:

sudo -u $user XDG_RUNTIME_DIR=/run/user/$uid systemctl --user start lxc-autostart

Ви навіть можете використовувати systemd-runдля запуску довільних команд як цього користувача таким чином, що не порушує lxc. Я використовую наступні команди, щоб зупинити / запустити свої контейнери до / після резервного копіювання, звідки $nameім'я контейнера lxc, який резервного копіювання:

sudo -u $user XDG_RUNTIME_DIR=/run/user/$uid systemd-run --user --wait lxc-stop -n $name
sudo -u $user XDG_RUNTIME_DIR=/run/user/$uid systemd-run --user --scope lxc-start -n $name

(Зверніть увагу, що без --waitзапуску системи не блокується, поки контейнер не зупинений.)


7

Я рекомендую використовувати для запуску зручний @rebootпсевдонім у Cron Ubuntulxc-autostart .

Як користувач, який володіє непривілейованим контейнером, запустіть crontab -eі додайте наступний рядок:

@reboot lxc-autostart


Це звучить чудово. Однак, здається, немає способу запустити команду на вимкнення (через cron). Будь-які ідеї?
HRJ

Мені невідомі прості прості способи ведення роботи при відключенні. Вам, напевно, доведеться додати як початкове завдання для запуску контейнерів для кожного закритого користувача. Ви можете подивитися на /etc/init/lxc.confпокажчики. Це запущена робота, яка запускає пільгові контейнери. Копіювати та модифікувати його також не слід надто важко, щоб закрити непривілейовані контейнери.
закодовано

1
Мені здається, що, оскільки кожен процес у контейнері видно з хоста, контейнеру, ймовірно, не потрібно нічого особливого для його закриття, кожен процес повинен отримувати сигнал TERM від хоста. Швидше за все, вам не потрібно робити нічого особливого при відключенні. Якщо ви хочете запустити деякі сценарії чи інші подібні речі при відключенні, це інакше, але в більшості процесів має бути шанс нормально відключитись.
закодовано

Чи працює підхід crontab? У Ubuntu 14.04 я отримую помилку "виклику cgmanager_move_pid_sync не вдалося: недійсний запит", яка виникає через те, що PAM, а саме libpam-systemd не бере участь у процесі зміни користувача. Ви бачите, /proc/self/cgroupщо вона містить такі послідовності, як /user/0.user/1.sessionзамість/user/1000.user/1.session
Даніель Олдер

3

Якщо хтось наткнеться на це питання і відповідь про автоматичну запуск непривілейованих контейнерів LXC (я, звичайно, тут багато перевіряю), ось рішення, яке добре працює, і яке я дотримувався, щоб його працювати на моєму сервері:

http://blog.lifebloodnetworks.com/?p=2118 Nicholas J Ingrassellino.

У двох словах, це передбачає створення двох сценаріїв, і вони працюють разом при запуску, щоб LXC запустив непривілейовані контейнери кожного перерахованого користувача, не маючи фактичного входу в обліковий запис користувача; іншими словами, виконайте команду як користувача із усіма магіями CGroups неушкодженими. Відповідно до найкращої практики ТА, я процитую тут кістки, але варто прочитати його оригінальну статтю.

Дозволити нашому обліковому запису користувача використовувати міст ...

echo "$USER veth lxcbr0 1024" | sudo tee -a /etc/lxc/lxc-usernet

Створити сценарій Upstart… Додано /etc/init/lxc-unprivileged.conf

description "LXC Unprivileged Containers"
author "Mike Bernson <mike@mlb.org>"

start on started lxc

script
    USERS="[user]"

    for u in $USERS; do
        cgm create all lxc$u
        cgm chown all lxc$u $(id -u $u) $(id -g $u)
        lxc-autostart -L -P /home/$u/.local/share/lxc | while read line;
        do
            set -- $line
            /usr/local/bin/startunprivlxc lxc$u $u $1
            sleep $2
        done
    done
end script

Обов’язково замініть [user] на ваш обліковий запис користувача.

Створіть сценарій запуску контейнера… /usr/local/bin/startunprivlxc Додайте…

#!/bin/sh

cgm movepid all $1 $$
sudo -iH -u $2 -- lxc-start -n $3 -d

… І зробити його виконуваним…

sudo chmod +x /usr/local/bin/startunprivlxc

Я хотів би лише підкреслити, що воно, здається, працює безпечно, правильно, і не вимагає кореня до SSH для інших облікових записів користувачів.

Тут також можна прочитати більше про цю тему (торкаючись пов’язаних сторінок): https://gist.github.com/julianlam/4e2bd91d8dedee21ca6f, яка може бути корисною для розуміння того, чому це так.



0

SORRY: відповів занадто рано. Це не спрацювало, хоча lxc-ls показує "AUTOSTART" як "ТАК".

Ось посилання з набагато кориснішою інформацією, і, можливо, хтось може скористатися нею: http://www.geeklee.co.uk/unprivileged-privileged-containers-ubuntu-14-04-lxc/

Я приземлився на цій сторінці, тому що у мене був той самий випуск. Прочитавши цей потік, я зрозумів, що lxc-create не може записатись у звичайний каталог "/ var / lib / lxc /", якщо він не працює з sudo.

Я озирнувся і розмістив поріжки для мого непривілейованого контейнера в "~ / .local / share / lxc" і поставив два рядки в питанні в config у цьому каталозі.

Я переглянув шаблон, який я використовував, "lxc-download" для підказки, але думаю, що цей шлях був пройдений, коли викликається "lxc-download". Я не дивився, як система шукає непривілейовані контейнери під час завантаження.


0

Я запускаю кожен непривілейований контейнер з одним іменем користувача для кращої ізоляції, і ось як це зробити:

#!/bin/bash

LXC_CONTAINERS="container1 container2"

for LXC_CONTAINER in $LXC_CONTAINERS; do
 su - $LXC_CONTAINER -c "lxc-start -n $LXC_CONTAINER --logfile /home/$LXC_CONTAINER/.local/share/lxc/lxc-$LXC_CONTAINER.log --logpriority DEBUG"
done

-1

Якщо припустити (що є основою всіх способів викрутити речі), ви входите в систему як користувач, який "володіє" непривілейованим контейнером lxc, тоді наступна команда повинна відповідати тому, що ви шукаєте ...

$ echo "lxc-start -n LXC-CONTAINER-NAME -d" >> .bashrc

Це просто запустить вищевказану команду, коли ви входите через bash. Це також передбачає, що bash - оболонка для входу. Будь ласка, замініть ім'я: LXC-CONTAINER-NAMEна ім'я вашого контейнера LXC, який ви хочете запустити.


-1

Я використав інший підхід, і він працює

1º Додайте наступні записи у файл конфігурації контейнера

AUTO START CONFIG

lxc.start.auto = 1 lxc.start.delay = 5

2º Створіть довірчі відносини між користувачем контейнера та ним самим на одному сервері

userlxc @ GEST-4: ~ $ ssh-keygen -t rsa Генерування публічної / приватної пари ключів rsa. Введіть файл, у якому потрібно зберегти ключ (/home/userlxc/.ssh/id_rsa): Введіть парольну фразу (порожню для без парольної фрази): знову введіть ту саму парольну фразу: ваша ідентифікація збережена в /home/userlxc/.ssh/id_rsa. Ваш відкритий ключ збережено в /home/userlxc/.ssh/id_rsa.pub. Ключовий відбиток ключа: c9: b4: e1: f3: bf: a3: 25: cc: f8: bc: be: b6: 80: 39: 59: 98 userlxc @ GEST-AMENCIA-4 Випадкове зображення ключа: + - [RSA 2048] ---- + | | | | | о | | * + | | ES | | = * | | = о =. | | . +. +. | | oO = oo | + ----------------- +

userlxc @ GEST-4: ~ $ кат .ssh / id_rsa.pub >>. 17:23 .ssh / санкціоновані_кейси

Перевірте ssh-з'єднання. Ви можете мати його без пароля userlxc @ GEST-4: ~ $ ssh userlxc @ localhost "lxc-ls --fancy"

ІМ’ЯТИ ДЕРЖАВИ IPV4 IPV6 AUTOSTART

EXTLXCCONT01 ЗАСТАНОВЕНО - - ТАК
UBUSER1404USERCONT01-тест ВИПУСКОВАНО - - НЕ
UBUSER1404USERLXCCONT01 ЗАСТАНОВЕНО - - НІ

3º Створіть запис власника контейнера на кроні

@reboot ssh userlxc @ localhost "lxc-автозапуск"

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.