Рекомендуємо, 2024

Вибір Редакції

Як запускати декілька дистрибутивів одночасно з використанням контейнерів Linux

Контейнери Linux (LXC) - це легка технологія віртуалізації, і вони використовуються у різних цілях. Вона є частиною ядра Linux і може дозволити вам емулювати один або кілька дистрибутивів Linux на одному хості Linux. Подумайте про це як про посередництво між chroot та повними технологіями віртуалізації, такими як VirtualBox, KVM або Xen. Аналогічна технологія, що існує в світі BSD, - це фріланси FreeBSD.

Наприклад, машина, на якій я пишу, - це ноутбук під управлінням Linux Mint 18, який працює на процесорі Intel Atom і має мізерні 2 Гб оперативної пам'яті. Тим не менш, я керую трьома контейнерами Linux, кожен з яких працює на веб-сервері Apache, без великого успіху. Це було б немислимо з традиційною віртуальною машиною, такою як VirtualBox. Отже, якщо ви бажаєте запустити декілька дистрибутивів у вашій системі Linux, контейнери для Linux повинні виконати цю роботу просто для вас.

Встановлення та налаштування контейнерів Linux

Ми налаштовуємо LXC на Linux Mint 18 64-bit. Інструкції з інсталяції, наведені тут, також будуть працювати без змін на Ubuntu 16.04 і вище. Якщо ви використовуєте інший дистрибутив, будь ласка, зверніться до офіційної документації вашого дистрибутива, якщо щось не працює, як очікувалося. Також передбачається знайомство з командним рядком та загальним усуненням несправностей.

Передумови

Нижче наведено кілька речей, які потрібно налаштувати для початку використання декількох дистрибутивів:

1. Встановіть LXC та інше необхідне програмне забезпечення, використовуючи:

sudo apt install lxc lxc-templates uidmap [/ sourcecode]

2. Тепер потрібно налаштувати профіль . Введіть такі команди для налаштування:

[вихідний код] mkdir -p ~ / .config / lxc
echo "lxc.id_map = u 0 100000 65536" & amp; gt; ~ / .config / lxc / default.conf
echo "lxc.id_map = g 0 100000 65536" & amp; gt; & amp; gt; ~ / .config / lxc / default.conf
echo "lxc.network.type = veth" & amp; gt; & amp; gt; ~ / .config / lxc / default.conf
echo "lxc.network.link = lxcbr0" & amp; gt; & amp; gt; ~ / .config / lxc / default.conf
echo "$ USER veth lxcbr0 2" | sudo tee -a / etc / lxc / lxc-usernet [/ sourcecode]

3. Потім потрібно налаштувати права користувача наступним чином:

[вихідний код] sudo usermod -add-subuids 100000-165536 $ USER
sudo usermod -add-subgids 100000-165536 $ USER

sudo cgm створює всіх користувачів
sudo cgm chown всі користувачі $ (id -u) $ (id -g)
cgm movepid весь користувач $$ [/ sourcecode]

Налаштування контейнера

Тепер, коли контейнер LXC встановлено разом з іншим необхідним програмним забезпеченням, наведемо кроки для налаштування контейнера:

1. У цьому прикладі ми налаштуємо контейнер Ubuntu, названий ubu1 . Для цього виконайте таку команду:

[вихідний код] lxc-create - шаблон завантаження - ім'я ubu1 [/ sourcecode]

2. Тут параметр –template повідомляє lxc про завантаження попередньо налаштованого зображення з Інтернету, тоді як параметр –name вказує назву контейнера - ubu1 у цьому випадку. Ви можете використовувати будь-яке ім'я, яке вам подобається.

3. Тепер ви побачите список підтримуваних зображень :

4. Введіть специфікацію дистрибутива, який ви бажаєте встановити. Тут я встановлюю 64-розрядну версію Ubuntu 16.04 (кодове ім'я xenial):

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

[sourcecode] lxc-create -t ​​завантаження -n ubu1 - –dist ubuntu –реліз xenial –arch amd64 [/ sourcecode]

6. LXC тепер завантажить і встановить мінімальне зображення Ubuntu xenial на хост-системі. Завантаження та встановлення можуть зайняти трохи часу, залежно від вашого підключення до Інтернету та швидкості вашого комп'ютера. Після встановлення ви побачите такий екран:

Тепер ви готові використовувати свій нещодавно створений контейнер Ubuntu.

Використання кількох дистрибутивів з контейнерами Linux

Запуск контейнера

Запустіть контейнер за допомогою команди lxc-start :

[вихідний код] lxc-start -n ubu1 -d [/ sourcecode]

Тут параметр -n вказує ім'я контейнера, який ви хочете запустити ( ubu1 у цьому випадку), а параметр -d робить його запущеним у фоновому режимі .

Можна переконатися, що контейнер запущено за допомогою команди lxc-ls :

[sourcecode] lxc-ls -f [/ sourcecode]

Параметр -f дає змогу створювати фантастичні звіти. Тут ви можете побачити, що у мене є два контейнера - один Debian (зупинений) і один Ubuntu (запущений).

Доступ та використання контейнера

Доступ до консолі контейнера можна отримати за допомогою команди lxc-attach :

[вихідний код] lxc-attach -n ubu1 [/ sourcecode]

Тепер у вашому контейнері є коренева оболонка . Рекомендується встановити пароль для користувача root і створити звичайний обліковий запис користувача :

[вихідний код] passwd
adduser beebom [/ sourcecode]

Звичайно, замінити beebom на потрібне ім'я користувача. Потім ви можете встановити програмне забезпечення та налаштувати контейнер, як це робите на звичайній системі. Наприклад, у контейнері Debian або Ubuntu:

[sourcecode] apt встановити wget openssh-сервер htop tmux nano iptables [/ sourcecode]

Зупинка контейнера

Після того, як ви закінчите грати з контейнером, або скористайтеся командою exit щоб повернутися до хост-системи . Тепер використовуйте команду lxc-stop щоб зупинити контейнер :

[вихідний код] lxc-stop -n ubu1 [/ sourcecode]

Це зробить контейнер чисто закритим, і він не буде споживати більше ресурсів у вашій системі, за винятком дискового простору.

Клонування та знімки

Клони

Після інсталяції програм у контейнері та налаштування його за власним бажанням, ви можете створити його або кілька копій для легкого надання. Ви можете зробити це, створивши клон, який є точною копією контейнера.

Наприклад, щоб створити клон контейнера ubu1 (назвемо його ubu2 ), спочатку зупиніть контейнер за допомогою lxc-stop, потім скористайтеся командою lxc-copy :

[вихідний код] lxc-stop -n ubu

lxc-copy -n ubu1-ubu2 [/ sourcecode]

Тут опція -n визначає вихідний контейнер, а опція -N вказує назву клону . Щоб перевірити, що контейнер було клоновано, скористайтеся командою lxc-ls :

Знімки

Припустимо, ви збираєтеся зробити деякі потенційно небезпечні або важкі для відновлення зміни в контейнері, наприклад, повторне налаштування веб-сервера. Щоб звести до мінімуму пошкодження, можна створити знімок контейнера перед тим, як внести такі зміни. У разі помилки під час конфігурації можна просто зупинити контейнер і відновити його до попереднього робочого стану, відновивши знімок.

Щоб створити знімок, спочатку зупиніть контейнер :

[вихідний код] lxc-stop -n ubu1 [/ sourcecode]

Потім створіть знімок за допомогою команди lxc-snapshot :

[sourcecode] lxc-snapshot -n ubu1 [/ sourcecode]

Це створює знімок під назвою snap0 . Будь-які наступні знімки, створені за допомогою цієї команди, будуть називатися snap1, snap2 і т.д.

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

[sourcecode] lxc-snapshot -r snap0 -n ubu1 [/ sourcecode]

Це поверне знімок snap0 до контейнера ubu1 .

Автозапуск контейнерів при завантаженні

Ви можете зробити контейнер, наприклад, контейнер веб-сервера, запускатися автоматично при завантаженні системи. Для цього перейдіть до конфігураційного файлу контейнера, розташованого в конфігурації $HOME/.local/share/lxc//config, і додайте наступні рядки :

[вихідний код] lxc.start.auto = 1
lxc.start.delay = 5 [/ sourcecode]

Перший рядок вказує, що контейнер повинен бути запущений під час завантаження. Другий повідомляє системі чекати 5 секунд перед початком наступного контейнера, якщо такий є.

Вирішення проблем

Якщо у вас виникли проблеми з запуском контейнерів, перше, що потрібно спробувати - це запустити команду lxc-start у передньому плані. Наприклад:

[вихідний код] lxc-start -n ubu1 -F [/ sourcecode]

Це покаже вам помилки на поточній консолі, що є дуже корисним для визначення характеру проблеми.

Проблеми з запуском декількох контейнерів одночасно

Якщо ви спробуєте запустити кілька контейнерів одночасно, ви можете побачити такі помилки, як "Досягнута квота" або "не вдалося створити налаштовану мережу". Це пояснюється тим, що ви використовуєте більше мережевих інтерфейсів, ніж вам надано. Можна збільшити кількість мережевих мостів, які користувач може запустити, змінивши файл /etc/lxc/lxc-usernet як root . Це може виглядати приблизно так:

[sourcecode] # USERNAME TYPE BRIDGE COUNT
beebom veth lxcbr0 5 [/ sourcecode]

Ви можете змінити число в кінці (5 у цьому прикладі) на більшу кількість, наприклад, 10. Це дозволить вам запускати до 10 контейнерів одночасно.

Інші використання контейнерів Linux

Контейнери Linux мають різне використання. Ви можете використовувати їх як поле для полегшеного тестування, наприклад, для тестування різних конфігурацій веб-сервера або сервера баз даних, перш ніж здійснювати їх на виробничому сервері. Іншим випадком використання є тестування того, як програма працює на різних версіях різних дистрибутивів.

Ви також можете використовувати їх для ізоляції додатків, яким ви не довіряєте - будь-який збиток, який таке додаток робить, буде обмежений його власним контейнером і не вплине на хост-систему. Зверніть увагу, що, хоча можна запускати графічні програми в контейнері, це займає значну кількість часу і зусиль, і тому не рекомендується. Якщо ви бажаєте запускати графічні програми в пісочниці, зверніться до нашої статті про те, як застосувати пісочниці в Linux.

Запускати декілька дистрибутивів одночасно з контейнерами Linux

Таким чином закінчується наш How-To для запуску декількох дистрибутивів Linux на одному комп'ютері, без накладних витрат повнорозмірної віртуальної машини. Корисність цієї технології обмежується лише вашою творчістю, тому не соромтеся експериментувати і з'ясувати нові випадки використання. Якщо у вас виникли проблеми з встановленням контейнерів, не соромтеся задати нам питання в розділі коментарів.

Top