Bagaimana cara memulai secara otomatis kontainer lxc yang tidak terjangkau?


9

Di Ubuntu 14.04, saya telah membuat sebuah wadah yang tidak terjangkau yang dapat saya mulai dan hentikan secara manual.

Tapi saya ingin ini mulai dan berhenti bersama dengan sistem.

Saya telah menambahkan yang berikut ini ke konfigurasi penampung: lxc.start.auto = 1 lxc.start.delay = 5

Namun, skrip sistem sepertinya tidak memilih wadah yang tidak terjangkau.

Ada utas yang terkait dengan ini di linuxcontainers.org, tetapi solusinya tampaknya terbatas pada rootpengguna.

Apakah ada cara bersih untuk melakukan ini untuk pengguna non-root (dengan persetujuan pengguna root)?

Jawaban:


3

Saya pikir saya telah menemukan solusi yang lebih baik daripada yang saat ini disajikan di sini. Sebagian karena sejauh yang saya tahu cgmanager sudah mati, sebagian karena solusi saya tidak terasa seperti solusi yang buruk, tetapi sebagian besar karena diskusi ini masih muncul ketika mencari solusi untuk masalah tersebut. Sebenarnya cukup sederhana: gunakan mode pengguna systemd .

Memang jika Anda tidak menggunakan systemd solusi ini tidak akan membantu. Dalam hal ini saya akan menyarankan Anda untuk mencari tahu apakah sistem init Anda memiliki beberapa cara untuk memungkinkan pengguna yang tidak terdaftar untuk menjalankan layanan saat boot dan menggunakannya sebagai titik awal.

Menggunakan mode pengguna systemd untuk melakukan autostart wadah lxc yang tidak terjangkau

Saya berasumsi Anda memiliki kontainer lxc yang tidak bekerja dan berfungsi dengan baik dan berfungsi lxc-autostartsebagai pengguna kontainer. Jika demikian, lakukan hal berikut:

  1. Buat file ~/.config/systemd/user/lxc-autostart.servicedi rumah pengguna apa pun yang memiliki wadah 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. Kemudian saat pengguna menjalankan:
systemctl --user enable lxc-autostart

(Catatan, --useropsi memberi tahu systemctl Anda menggunakannya dalam mode pengguna. Semua hal yang biasanya saya lakukan dengan systemctl, mulai, berhenti, statuc, aktifkan, dll, bekerja dengan --user.)

  1. Kemudian jalankan yang berikut ini, di mana $usernama pengguna yang memiliki kontainer lxc:
sudo loginctl enable-linger $user

Ini diperlukan bagi systemd untuk memulai instance pengguna systemd $userketika boot. Kalau tidak, itu hanya akan mulai satu saat $userlogin.

Untuk informasi lebih lanjut, saya akan merekomendasikan halaman archlinux wiki systemd / timer dan halaman manual systemd .

Mengakses instance systemd pengguna sebagai root

Anda benar-benar dapat memulai / menghentikan / apa pun layanan systemd pengguna sebagai root, namun ini mengharuskan Anda untuk mengatur XDG_RUNTIME_DIRvariabel lingkungan. Asumsikan $user adalah pengguna yang instansinya ingin Anda akses dan $uiditu adalah uid, maka ini adalah cara Anda memulai lxc-autostart.service yang ditentukan di atas:

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

Anda bahkan dapat menggunakan systemd-rununtuk menjalankan perintah sewenang-wenang sebagai pengguna dengan cara yang tidak merusak lxc. Saya menggunakan perintah berikut untuk menghentikan / memulai wadah saya sebelum / sesudah pencadangan, di mana $namenama wadah lxc yang didukung:

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

(Perhatikan bahwa tanpa --waitsystemd-run tidak akan memblokir sampai wadah dihentikan.)


7

Saya akan merekomendasikan menggunakan @rebootalias praktis di cron Ubuntu untuk menjalankan lxc-autostart.

Sebagai pengguna yang memiliki wadah tidakrivil, jalankan crontab -edan tambahkan baris berikut:

@reboot lxc-autostart


Ini kedengarannya bagus. Namun, sepertinya tidak ada cara untuk menjalankan perintah shutdown (via cron). Ada ide?
HRJ

Saya tidak mengetahui adanya cara sederhana untuk menjalankan pekerjaan saat shutdown. Anda mungkin harus, sebagai root, menambahkan pekerjaan pemula ke wadah penonaktifan untuk setiap pengguna yang memilikinya. Anda bisa mencari /etc/init/lxc.confpetunjuk. Ini adalah pekerjaan pemula yang memulai wadah istimewa. Seharusnya tidak terlalu sulit untuk menyalinnya dan memodifikasinya untuk mematikan wadah yang tidak terjangkau juga.
disandikan

1
Terpikir oleh saya bahwa, karena setiap proses dalam wadah terlihat dari tuan rumah, wadah kemungkinan tidak memerlukan sesuatu yang istimewa untuk mematikannya, setiap proses harus menerima sinyal TERM dari tuan rumah. Kemungkinannya adalah Anda tidak perlu melakukan sesuatu yang istimewa pada shutdown. Jika Anda ingin menjalankan beberapa skrip atau hal-hal lain seperti itu pada shutdown, itu berbeda, tetapi sebagian besar proses harus memiliki kesempatan untuk shutdown secara normal.
disandikan

Apakah pendekatan crontab berfungsi? Pada Ubuntu 14.04, saya mendapatkan "panggilan ke cgmanager_move_pid_sync gagal: permintaan tidak valid" kesalahan yang terjadi karena PAM, yaitu libpam-systemd tidak terlibat dalam proses perubahan pengguna. Anda dapat melihat di /proc/self/cgroupdalamnya berisi urutan seperti /user/0.user/1.sessionbukannya/user/1000.user/1.session
Daniel Alder

3

Jika ada yang menemukan q & a ini untuk jawaban atas autostarting wadah LXC yang tidak terjangkau (saya pasti sering memeriksa kembali di sini), berikut adalah solusi yang bekerja dengan baik dan yang saya ikuti untuk membuatnya bekerja di server saya:

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

Singkatnya, ini melibatkan pembuatan dua skrip, dan mereka bekerja bersama saat permulaan untuk memungkinkan LXC untuk memulai wadah tidak terprivat dari setiap pengguna yang terdaftar tanpa harus benar-benar masuk ke akun pengguna; dengan kata lain, menjalankan perintah sebagai pengguna dengan semua sihir CGroups utuh. Sesuai dengan praktik terbaik SO, saya akan mengutip tulang-tulangnya di sini tapi ada baiknya membaca artikel aslinya.

Izinkan akun pengguna kami menggunakan jembatan ...

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

Buat skrip pemula ... Di /etc/init/lxc-unprivileged.conftambah ...

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

Pastikan untuk mengganti [pengguna] dengan akun pengguna Anda.

Buat skrip mulai wadah ... /usr/local/bin/startunprivlxc Tambah ...

#!/bin/sh

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

... dan membuatnya bisa dieksekusi ...

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

Saya hanya ingin menekankan bahwa itu tampaknya berfungsi dengan aman, benar, dan tidak memerlukan root untuk SSH ke akun pengguna lain.

Ada juga lebih banyak tentang subjek (menyentuh pada gotcha terkait) di sini: https://gist.github.com/julianlam/4e2bd91d8dedee21ca6f yang dapat berguna dalam memahami mengapa ini seperti ini.



0

MAAF: menjawab terlalu cepat. Itu tidak berfungsi meskipun lxc-ls memperlihatkan "AUTOSTART" sebagai "YA".

Berikut ini tautan dengan info yang jauh lebih bermanfaat, dan mungkin seseorang dapat memanfaatkannya: http://www.geeklee.co.uk/unprivileged-privileged-privileged-containers-ubuntu-14-04-lxc/

Saya mendarat di halaman ini karena saya memiliki masalah yang sama. Setelah membaca utas ini, saya menyadari bahwa lxc-create tidak dapat menulis ke direktori "/ var / lib / lxc /" yang biasa jika tidak dijalankan dengan sudo.

Saya melihat sekeliling dan menemukan rootfs untuk wadah saya yang tidak memiliki hak istimewa di "~ / .local / share / lxc", dan memasukkan kedua baris dalam pertanyaan ke dalam config di direktori itu.

Saya melihat templat yang saya gunakan, "lxc-download" untuk petunjuk, tapi saya pikir path dilewatkan ketika "lxc-download" dipanggil. Saya belum melihat bagaimana sistem mencari wadah yang tidak terjangkau selama boot.


0

saya menjalankan setiap wadah yang tidak memiliki hak pribadi dengan nama pengguna yang sama untuk isolasi yang lebih baik dan ini adalah bagaimana saya melakukannya:

#!/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

Dengan asumsi (yang merupakan induk dari semua cara untuk mengacaukan segalanya), Anda masuk sebagai pengguna yang "memiliki" wadah lxc yang tidak terjangkau, maka perintah berikut harus membahas apa yang Anda cari ...

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

Ini hanya akan menjalankan perintah di atas saat Anda masuk melalui bash. Ini juga mengasumsikan bahwa bash adalah shell login. Silakan ganti nama: LXC-CONTAINER-NAMEdengan nama wadah LXC Anda yang ingin Anda mulai.


-1

Saya telah menggunakan pendekatan yang berbeda dan ini berhasil

1º Tambahkan entri berikut di file konfigurasi wadah

CONFIG MULAI OTOMATIS

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

2º Buat hubungan kepercayaan antara pengguna kontainer dan dirinya sendiri di server yang sama

userlxc @ GEST-4: ~ $ ssh-keygen -t rsa Menghasilkan pasangan kunci publik / pribadi rsa. Masukkan file untuk menyimpan kunci (/home/userlxc/.ssh/id_rsa): Masukkan frasa sandi (kosong tanpa frasa sandi): Masukkan frasa sandi yang sama lagi: Identifikasi Anda telah disimpan di /home/userlxc/.ssh/id_rsa. Kunci publik Anda telah disimpan di /home/userlxc/.ssh/id_rsa.pub. Sidik jari kunci adalah: c9: b4: e1: f3: bf: a3: 25: cc: f8: bc: be: b6: 80: 39: 59: 98 userlxc @ GEST-AMENCIA-4 Gambar randomart kunci adalah: + - [RSA 2048] ---- + | | | | | o | | * + | | ES | | = * | | = o =. | | . +. +. | | oO = oo | + ----------------- +

userlxc @ GEST-4: ~ $ cat .ssh / id_rsa.pub >> .ssh / official_keys userlxc @ GEST-4: ~ $ ls -lrt .ssh / official_keys -rw-rw-r-- 1 userlxc userlxc 404 Nov 19 17:23 .ssh / official_keys

Periksa koneksi ssh, Anda harus dapat menggunakannya tanpa kata sandi userlxc @ GEST-4: ~ $ ssh userlxc @ localhost "lxc-ls --fancy"

NAMA NEGARA IPV4 IPV6 AUTOSTART

EXTLXCCONT01 STOPPED - - YA
UBUSER1404USERCONT01-test STOPPED - - NO
UBUSER1404USERLXCCONT01 STOPPED - - NO

3º Buat entri crontab di pemilik wadah

@reboot ssh userlxc @ localhost "lxc-autostart"

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.