ऑटो-स्टार्टेड अनप्रोसेस्ड lxc कंटेनरों को कैसे शुरू करें?


9

उबंटू 14.04 पर, मैंने एक अनपेक्षित कंटेनर बनाया है जिसे मैं मैन्युअल रूप से शुरू और बंद कर सकता हूं।

लेकिन मैं चाहूंगा कि यह प्रणाली के साथ शुरू और बंद हो।

मैंने कंटेनर के कॉन्फ़िगरेशन में निम्नलिखित शामिल किया है: lxc.start.auto = 1 lxc.start.delay = 5

हालाँकि, सिस्टम स्क्रिप्ट अनपेक्षित कंटेनर लेने के लिए प्रतीत नहीं होते हैं।

नहीं है एक धागा linuxcontainers.org पर इस से संबंधित है, लेकिन समाधान के लिए प्रतिबंधित किया जा रहा है rootउपयोगकर्ता।

क्या एक गैर-रूट उपयोगकर्ता (रूट उपयोगकर्ता की सहमति के साथ) के लिए ऐसा करने का एक साफ तरीका है?

जवाबों:


3

मुझे लगता है कि मैंने वर्तमान में यहां प्रस्तुत किए गए लोगों की तुलना में बेहतर समाधान पाया है। भाग में क्योंकि जहां तक ​​मैं बता सकता हूं कि cgmanager मर चुका है, भाग में, क्योंकि मेरा समाधान हैकसी वर्कअराउंड की तरह महसूस नहीं करता है, लेकिन ज्यादातर क्योंकि यह चर्चा अभी भी समस्या का समाधान खोजते समय दिखाई देती है। यह वास्तव में बहुत आसान है: systemd उपयोगकर्ता मोड का उपयोग करें

यदि आप सिस्टमड का उपयोग नहीं करते हैं तो यह समाधान मदद करने वाला नहीं है। उस स्थिति में मैं आपको यह पता लगाने की सलाह दूंगा कि यदि आपके init सिस्टम में अप्रभावी उपयोगकर्ताओं को बूट पर सेवाएं चलाने और शुरुआती बिंदु के रूप में उपयोग करने की अनुमति देने का कोई तरीका है।

सिस्टम रहित उपयोगकर्ता मोड का उपयोग अनप्रोविलेड एलएनजी कंटेनर को ऑटोस्टार्ट करने के लिए

मैं मान रहा हूँ कि आपके पास अनपेक्षित 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विकल्प बताता है कि आप इसे उपयोगकर्ता मोड में उपयोग कर रहे हैं।

  1. फिर निम्नलिखित को चलाएँ, जहाँ $userउस उपयोगकर्ता का नाम है जिसमें lxc कंटेनर हैं:
sudo loginctl enable-linger $user

सिस्टमड के लिए $userबूट पर सिस्टमड यूजर उदाहरण शुरू करना आवश्यक है । अन्यथा यह केवल एक ही समय में $userलॉग इन शुरू करेगा ।

अधिक जानकारी के लिए मैं आर्चलिनक्स विकी सिस्टेम / टाइमर पेज और सिस्टेम मैन पेज की सिफारिश करूंगा ।

उपयोगकर्ता के सिस्टमड उदाहरण को रूट के रूप में एक्सेस करना

आप वास्तव में उपयोगकर्ता की systemd सेवा को रूट के रूप में शुरू / रोक सकते हैं / कर सकते हैं, हालाँकि इसके लिए आपको 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 को नहीं तोड़ता है। मैं बैकअप से पहले / बाद में अपने कंटेनरों को रोकने / शुरू करने के लिए निम्नलिखित कमांड का उपयोग कर रहा हूं, जहां $namelxc कंटेनर का नाम है जिसे बैकअप किया जा रहा है:

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 में आसान उपनाम का उपयोग करने की सलाह दूंगाlxc-autostart

उपयोगकर्ता के रूप में जो अनपेक्षित कंटेनर का मालिक है, crontab -eनिम्न पंक्ति को चलाएं और जोड़ें:

@reboot lxc-autostart


यह बहुत अच्छा लग रहा है। हालाँकि, शटडाउन (क्रोन के माध्यम से) पर कमांड चलाने का कोई तरीका प्रतीत नहीं होता है। कोई विचार?
एचआरजे

मुझे शटडाउन पर नौकरी चलाने के किसी भी सरल तरीके की जानकारी नहीं है। आपको संभवतः रूट के रूप में, प्रत्येक उपयोगकर्ता के लिए कंटेनर बंद करने के लिए एक अपस्टार्ट कार्य जोड़ना होगा जो उनका मालिक है। आप /etc/init/lxc.confसंकेत के लिए देख सकते हैं । यह ऊपरवाला काम है जो विशेषाधिकार प्राप्त कंटेनरों को शुरू करता है। इसे कॉपी करने और अनपेक्षित कंटेनरों को बंद करने के लिए इसे संशोधित करना बहुत कठिन नहीं होना चाहिए।
एनकोडेड

1
यह मेरे लिए होता है, क्योंकि कंटेनर में प्रत्येक प्रक्रिया होस्ट से दिखाई देती है, कंटेनर को संभवतः इसे बंद करने के लिए कुछ विशेष की आवश्यकता नहीं होती है, प्रत्येक प्रक्रिया को होस्ट से TERM सिग्नल प्राप्त करना चाहिए। संभावना है कि आपको शटडाउन पर कुछ विशेष करने की आवश्यकता नहीं है। यदि आप शटडाउन पर कुछ स्क्रिप्ट या अन्य ऐसी चीजें चलाना चाहते हैं, तो यह अलग है, लेकिन अधिकांश प्रक्रियाओं में सामान्य रूप से शटडाउन करने का मौका होना चाहिए।
एनकोडेड

क्या क्रेस्टब दृष्टिकोण काम करता है? उबंटू 14.04 पर, मुझे "कॉल करने के लिए cgmanager_move_pid_sync विफल: अमान्य अनुरोध" त्रुटि होती है, जो इसलिए होती है क्योंकि PAM, अर्थात् libpam-systemd उपयोगकर्ता बदलने की प्रक्रिया में शामिल नहीं है। आप में देख सकते हैं /proc/self/cgroupकि यह की तरह दृश्यों में शामिल है /user/0.user/1.sessionके बजाय/user/1000.user/1.session
डैनियल एल्डर

3

अगर कोई इस q & पर ठोकर खाने के जवाब के लिए unprivileged LXC कंटेनरों (मैं निश्चित रूप से यहां बहुत जाँच करता हूं) के लिए ठोकर खाता हूं, तो यहां एक समाधान है जो अच्छी तरह से काम करता है और जिसे मैंने अपने सर्वर पर काम करने के लिए पीछा किया है।

http://blog.lifebloodnetworks.com/?p=2118 द्वारा निकोलस जे इंगलासेलिनो।

संक्षेप में, इसमें दो स्क्रिप्ट्स बनाना शामिल है, और वे LXC को प्रत्येक सूचीबद्ध उपयोगकर्ता के अनपेक्षित कंटेनरों को शुरू करने की अनुमति देने के लिए स्टार्टअप पर एक साथ काम करते हैं, वास्तव में उपयोगकर्ता खाते में लॉग इन किए बिना; दूसरे शब्दों में, सभी CGroups जादू बरकरार के साथ उपयोगकर्ता के रूप में कमांड निष्पादित। एसओ सर्वोत्तम अभ्यास को ध्यान में रखते हुए, मैं इसकी हड्डियों को यहाँ उद्धृत करूँगा लेकिन यह उनके मूल लेख को पढ़ने के लायक है।

हमारे उपयोगकर्ता खाते को पुल का उपयोग करने की अनुमति दें ...

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

अपस्टार्ट स्क्रिप्ट बनाएं… /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

[उपयोगकर्ता] को अपने उपयोगकर्ता खाते से बदलना सुनिश्चित करें।

कंटेनर स्टार्ट स्क्रिप्ट बनाएं ... /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

मैं केवल इस बात पर जोर देना चाहूंगा कि यह सुरक्षित रूप से, सही ढंग से काम करने के लिए प्रकट होता है, और रूट को अन्य उपयोगकर्ता खातों में एसएसएच की आवश्यकता नहीं है।

विषय पर भी अधिक है (संबंधित गोत्रों को छूते हुए) यहां: https://gist.github.com/julianlam/4e2bd91d8dedee21ca6f जो यह समझने में उपयोगी हो सकता है कि यह ऐसा क्यों है।



0

सूरी: बहुत जल्द जवाब दिया। हालांकि यह काम नहीं किया, हालांकि lxc-ls "AUTOSTART" को "YES" के रूप में दिखाता है।

यहाँ एक बहुत अधिक उपयोगी जानकारी के साथ एक लिंक है, और शायद कोई इसका उपयोग कर सकता है: http://www.geeklee.co.uk/unprivileged-privileged-containers-ubuntu-14-04-lxc/

मैं इस पृष्ठ पर उतरा क्योंकि मेरे पास एक ही मुद्दा था। इस सूत्र को पढ़ने के बाद, मुझे एहसास हुआ कि lxc-create सामान्य "/ var / lib / lxc /" निर्देशिका में नहीं लिख सकता है अगर यह sudo के साथ नहीं चलाया जाता है।

मैंने "~ / .local / share / lxc" में अपने अनपेक्षित कंटेनर के लिए रूट्स को चारों ओर देखा, और उस निर्देशिका में प्रश्न में दो पंक्तियों को डाल दिया।

मैंने क्लू के लिए उपयोग किए गए टेम्पलेट, "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

जब आप बैश के माध्यम से लॉग इन करेंगे तो यह उपरोक्त कमांड को चलाएगा। यह भी मान लिया गया है कि बैश लॉगिन शेल है। कृपया नाम बदलें: LXC-CONTAINER-NAMEअपने LXC कंटेनर के नाम के साथ जिसे आप शुरू करना चाहते हैं।


-1

मैंने एक अलग दृष्टिकोण का उपयोग किया है और यह काम कर रहा है

1 at कंटेनर कॉन्फ़िगरेशन फ़ाइल में निम्न प्रविष्टियाँ जोड़ें

ऑटो स्टार्ट 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 कुंजी की यादृच्छिक छवि है: + - [आरएसए 2048] ---- + | | | | | ओ | | * + | | ईएस | | = * | | = ओ =। | | । +। +। | | oO = oo | + ----------------- +

userlxc @ GEST-4: ~ $ cat .shsh / id_rsa.pub >> .ssh / अधिकृत_केक्स userlxc @ GEST-4: ~ $ ls -lrt .ssh / अधिकृत_keys -rw-rw-r-- 1 userlxc userlxc 404 Nov 19 19। 17:23। Ssh / अधिकृत_की

Ssh कनेक्शन की जांच करें, आपको इसे पासवर्ड userlxc @ GEST-4 के बिना उपयोग करने में सक्षम होना चाहिए: ~ $ ssh userlxc @ localhost "lxc-ls --fancy"

NAME STATE IPV4 IPV6 AUTOSTART

EXTLXCCONT01 STOPPED - - YES
UBUSER1404USERCONT01-परीक्षण STOPPED - - NO
UBUSER1404USERLXCC0101 STOPPED - NO

3 कंटेनर मालिक में एक क्रेस्टैब प्रविष्टि बनाएं

@reboot ssh userlxc @ localhost "lxc-autostart"

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.