Ayrıcalıksız lxc kaplarını otomatik olarak nasıl başlatabilirim?


9

Ubuntu 14.04'te, el ile başlatabildiğim ve durdurabileceğim ayrıcalıklı bir kap oluşturdum.

Ancak bunun sistemle birlikte başlamasını ve durmasını istiyorum.

Kapsayıcı yapılandırmasına aşağıdakileri ekledim: lxc.start.auto = 1 lxc.start.delay = 5

Ancak, sistem komut dosyaları ayrıcalıklı kapsayıcılar seçmiyor gibi görünüyor.

Linuxcontainers.org'da bununla ilgili bir konu var , ancak çözüm rootkullanıcı ile sınırlı görünüyor .

Kök olmayan bir kullanıcı için bunu yapmanın temiz bir yolu var mı (kök kullanıcının rızasıyla)?

Yanıtlar:


3

Sanırım şu anda burada sunulanlardan daha iyi bir çözüm buldum. Kısmen, cgmanager'in öldüğünü söyleyebildiğim için, kısmen çözümüm çılgın bir çözüm gibi hissetmediği için, ancak çoğunlukla bu tartışma soruna bir çözüm ararken hala ortaya çıktığı için. Aslında oldukça basit: systemd kullanıcı modunu kullanın .

Systemd kullanmıyorsanız bu çözüm yardımcı olmayacaktır. Bu durumda, init sisteminizin ayrıcalıklı olmayan kullanıcıların önyükleme sırasında hizmetleri çalıştırmasına izin vermesinin bir yolu olup olmadığını anlamanız ve bunu bir başlangıç ​​noktası olarak kullanmanızı öneririm.

Ayrıcalıksız lxc kaplarını otomatik olarak başlatmak için systemd kullanıcı modunu kullanma

Ben düzgün çalışan lxc-autostartve kabın kullanıcı çalışır gibi çalışan ayrıcalıksız lxc kapsayıcılar olduğunu varsayalım . Öyleyse aşağıdakileri yapın:

  1. Dosyayı ~/.config/systemd/user/lxc-autostart.service, kullanıcının lxc kapsayıcılarına sahip olduğu herhangi bir evde oluşturun:
[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. Sonra bu kullanıcı koşarken:
systemctl --user enable lxc-autostart

( --userSeçenek, systemctl'e kullanıcı modunda kullandığınızı söyler. Normalde systemctl, start, stop, statuc, enable, vb. İle yaptığım her şey --user ile çalışır.)

  1. Sonra aşağıdakileri çalıştırın, burada $userlxc kapsayıcılarına sahip kullanıcının adı:
sudo loginctl enable-linger $user

Bu, systemd'nin $userönyükleme için bir systemd kullanıcı örneğini başlatması için gereklidir . Aksi takdirde $useroturum açtığında yalnızca bir tanesini başlatır .

Daha fazla bilgi için archlinux wiki systemd / timer sayfasını ve systemd man sayfalarını öneriyorum .

Bir kullanıcının systemd örneğine kök olarak erişme

Bir kullanıcının systemd hizmetini kök olarak gerçekten başlatabilir / durdurabilirsiniz / ancak XDG_RUNTIME_DIRortam değişkenini ayarlamanız gerekir . $user Örneğin, örneğine erişmek istediğiniz kullanıcı ve kullanıcı kimliği olduğunu varsayarsak , $uidyukarıda tanımlanan lxc-autostart.service'i şu şekilde başlatabilirsiniz:

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

Hatta systemd-runkullanıcı olarak lxc'yi bozmayacak şekilde rasgele komutlar çalıştırmak için de kullanabilirsiniz . Yedeklemeden önce / sonra $namekaplarımı durdurmak / başlatmak için aşağıdaki komutları kullanıyorum, yedeklenen lxc kapsayıcısının adı:

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

( --waitSystemd-run olmadan kap durduruluncaya kadar engellenmeyeceğini unutmayın.)


7

Çalıştırmak için Ubuntu'nun cronundaki kullanışlı @reboottakma adı kullanmanızı tavsiye ederim .lxc-autostart

Ayrıcalıklı kapsayıcıya sahip olan kullanıcı crontab -eolarak aşağıdaki satırı çalıştırın ve ekleyin:

@reboot lxc-autostart


Kulağa harika geliyor. Ancak, kapatma sırasında bir komut çalıştırmanın bir yolu yok gibi görünüyor (cron üzerinden). Herhangi bir fikir?
HRJ

Kapanışta bir iş çalıştırmanın basit yollarının farkında değilim. Muhtemelen, root olarak, kapsayıcılara sahip olan her kullanıcı için kapamaları kapatmak için bir uptart işi eklemeniz gerekir. /etc/init/lxc.confİşaretçiler için bakabilirsiniz . Ayrıcalıklı kapsayıcıları başlatan yeni başlayan iştir. Ayrıcalıklı kapsayıcıları kapatmak için kopyalamak ve değiştirmek çok zor olmamalıdır.
kodlanmış

1
Kapsayıcıdaki her işlem ana bilgisayardan görülebildiğinden, kabın büyük olasılıkla onu kapatmak için özel bir şeye ihtiyacı olmadığı için, her işlem ana bilgisayardan TERM sinyali almalıdır. Muhtemelen kapatma sırasında özel bir şey yapmanıza gerek yoktur. Kapatma sırasında bazı komut dosyaları veya başka şeyler çalıştırmak istiyorsanız, bu farklıdır, ancak işlemlerin çoğunun normal olarak kapatma şansı olmalıdır.
kodlanmış

Crontab yaklaşımı işe yarıyor mu? Ubuntu 14.04'te, PAM, yani libpam-systemd kullanıcı değiştirme işleminde yer almadığı için ortaya çıkan "cgmanager_move_pid_sync çağrısı başarısız oldu: geçersiz istek" hatası alıyorum. Bunun yerine /proc/self/cgroupdiziler içerdiğini görebilirsiniz/user/0.user/1.session/user/1000.user/1.session
Daniel Alder

3

Herkes bu q & a üzerinde ayrıcalıksız LXC kapları otomatik başlatma yanıt tökezlemek durumunda (Ben kesinlikle burada çok kontrol edin), İşte iyi çalışan ve hangi benim sunucu üzerinde çalışmak için takip etti:

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

Özetle, iki komut dosyası oluşturmayı içerir ve LXC'nin listelenen her kullanıcının ayrıcalıklı kapsayıcılarını kullanıcı hesabına gerçekten giriş yapmak zorunda kalmadan başlatmasına izin vermek için başlangıçta birlikte çalışırlar; diğer bir deyişle, komutu tüm CGroups magic bozulmamış olarak kullanıcı olarak yürütmek. SO en iyi uygulamalarına uygun olarak, burada kemiklerini alıntılayacağım ama orijinal makalesini okumaya değer.

Kullanıcı hesabımızın köprüyü kullanmasına izin ver…

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

Upstart komut dosyası oluştur… Ek olarak /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

[Kullanıcı] 'yı kullanıcı hesabınızla değiştirdiğinizden emin olun.

Kapsayıcı başlatma komut dosyasını oluşturun… Ek olarak /usr/local/bin/startunprivlxc

#!/bin/sh

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

… Ve çalıştırılabilir olmasını sağlayın…

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

Ben sadece güvenli, doğru çalışıyor gibi görünüyor ve diğer kullanıcı hesaplarına SSH kök gerektirmez vurgulamak istiyorum.

Konuyla ilgili daha fazla bilgi var (ilgili gotcha'lara dokunmak): https://gist.github.com/julianlam/4e2bd91d8dedee21ca6f, bunun neden böyle olduğunu anlamaya yardımcı olabilir.



0

ÜZGÜN: çok erken cevap verdi. Lxc-ls "AUTOSTART" ı "EVET" olarak göstermesine rağmen çalışmadı.

İşte çok daha yararlı bilgiler içeren bir bağlantı ve belki birileri bundan yararlanabilir: http://www.geeklee.co.uk/unprivileged-privileged-containers-ubuntu-14-04-lxc/

Aynı sorunu yaşadığım için bu sayfaya indim. Bu iş parçacığı okuduktan sonra, sx ile çalışmazsa lxc-create normal "/ var / lib / lxc /" dizinine yazamadığını fark ettim.

Etrafıma baktım ve "~ / .local / share / lxc" içindeki benim ayrıcalıklı olmayan kapsayıcı için rootfs buldum ve sorudaki iki satırı o dizindeki config'e koydum.

Kullandığım şablona baktım, ipucu için "lxc-download", ancak "lxc-download" çağrıldığında bu yolun geçtiğini düşünüyorum. Sistemin önyükleme sırasında ayrıcalıklı olmayan kapları nasıl aradığına bakmadım.


0

daha iyi yalıtım için aynı adlı bir kullanıcı ile her ayrıcalıklı kapsayıcı çalıştırıyorum ve bu nasıl yaparım:

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

Varsayalım (her şeyi berbat etmenin her yolunun annesi olan), ayrıcalıklı olmayan lxc konteynerinin "sahibi" olan kullanıcı olarak giriş yapıyorsunuz, o zaman aşağıdaki komut aradığınızı ele almalıdır ...

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

Bu, bash yoluyla giriş yaptığınızda yukarıdaki komutu çalıştırır. Bu aynı zamanda bash'ın giriş kabuğu olduğunu varsayar. Lütfen: LXC-CONTAINER-NAMEadını, başlatmak istediğiniz LXC konteynerinizin adıyla değiştirin .


-1

Farklı bir yaklaşım kullandım ve işe yarıyor

1º Container config dosyasına aşağıdaki girişleri ekleyin

OTOMATİK ÇALIŞTIRMA YAPILANDIRMASI

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

2º Aynı sunucuda kapsayıcı kullanıcısı ile kendisi arasında bir güven ilişkisi oluşturun

userlxc @ GEST-4: ~ $ ssh-keygen -t rsa Genel / özel rsa anahtar çifti oluşturuluyor. Anahtarın kaydedileceği dosyayı girin (/home/userlxc/.ssh/id_rsa): Parolayı girin (parola içermeyen boş): Aynı parolayı tekrar girin: Kimliğiniz /home/userlxc/.ssh/id_rsa içine kaydedildi. Genel anahtarınız /home/userlxc/.ssh/id_rsa.pub klasörüne kaydedildi. Anahtar parmak izi: c9: b4: e1: f3: bf: a3: 25: cc: f8: bc: be: b6: 80: 39: 59: 98 userlxc @ GEST-AMENCIA-4 Anahtarın rastgele resim: + - [RSA 2048] ---- + | | | | | o | | * + | | ES | | = * | | = o =. | | . +. +. | | oO = oo | + ----------------- +

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

Ssh bağlantısını kontrol edin, parola olmadan kullanabilirsiniz userlxc @ GEST-4: ~ $ ssh userlxc @ localhost "lxc-ls --fancy"

İSİM DEVLET IPV4 IPV6 AUTOSTART

EXTLXCCONT01 STOPPED - - EVET
UBUSER1404USERCONT01 testi STOPPED - - HAYIR
UBUSER1404USERLXCCONT01 STOPPED - - HAYIR

3º Konteyner sahibinde bir crontab girişi oluşturun

@reboot ssh userlxc @ localhost "lxc-autostart"

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.