Làm thế nào để tự động khởi động các thùng chứa lxc không có đặc quyền?


9

Trên Ubuntu 14.04, tôi đã tạo một thùng chứa không có đặc quyền mà tôi có thể tự khởi động và dừng.

Nhưng tôi muốn điều này bắt đầu và dừng lại cùng với hệ thống.

Tôi đã thêm các mục sau vào cấu hình của bộ chứa: lxc.start.auto = 1 lxc.start.delay = 5

Tuy nhiên, các tập lệnh hệ thống dường như không chọn các container không có đặc quyền.

một chủ đề liên quan đến điều này trên linuxcontainers.org, nhưng giải pháp dường như bị hạn chế cho rootngười dùng.

Có cách nào rõ ràng để làm điều này cho người dùng không root (có sự đồng ý của người dùng root) không?

Câu trả lời:


3

Tôi nghĩ rằng tôi đã tìm thấy một giải pháp tốt hơn so với những giải pháp hiện đang trình bày ở đây. Một phần vì theo như tôi có thể nói với cgmanager đã chết, một phần vì giải pháp của tôi không cảm thấy như một cách giải quyết khó khăn, nhưng chủ yếu là vì cuộc thảo luận này vẫn xuất hiện khi tìm kiếm giải pháp cho vấn đề. Thực ra nó khá đơn giản: sử dụng chế độ người dùng systemd .

Cấp nếu bạn không sử dụng systemd giải pháp này sẽ không giúp đỡ. Trong trường hợp đó, tôi khuyên bạn nên tìm hiểu xem hệ thống init của bạn có cách nào đó cho phép người dùng không có khả năng chạy các dịch vụ khi khởi động và sử dụng đó làm điểm khởi đầu.

Sử dụng chế độ người dùng systemd để tự động khởi động các thùng chứa lxc không có đặc quyền

Tôi giả sử rằng bạn có các thùng chứa lxc không có đặc quyền hoạt động đúng và hoạt động lxc-autostartnhư người dùng của bộ chứa hoạt động. Nếu vậy, hãy làm như sau:

  1. Tạo tệp ~/.config/systemd/user/lxc-autostart.servicetrong nhà của bất kỳ người dùng nào có các thùng chứa 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. Sau đó, khi người dùng đó chạy:
systemctl --user enable lxc-autostart

(Lưu ý, --usertùy chọn cho biết systemctl bạn đang sử dụng nó trong chế độ người dùng. Tất cả những điều tôi thường làm với systemctl, start, stop, statuc, enable, v.v., làm việc với --user.)

  1. Sau đó chạy như sau, $usertên của người dùng có các thùng chứa lxc:
sudo loginctl enable-linger $user

Điều này là cần thiết cho systemd để bắt đầu một cá thể người dùng systemd $userkhi khởi động. Nếu không, nó sẽ chỉ bắt đầu một tại thời điểm $userđăng nhập.

Để biết thêm thông tin, tôi muốn giới thiệu trang hệ thống / bộ đếm thời gian wiki archlinux và các trang man systemd .

Truy cập một cá thể systemd của người dùng như root

Bạn thực sự có thể bắt đầu / dừng / bất cứ dịch vụ systemd nào của người dùng làm root, tuy nhiên điều này đòi hỏi bạn phải đặt XDG_RUNTIME_DIRbiến môi trường. Giả sử $user là người dùng có phiên bản bạn muốn truy cập và $uidđó là uid, thì đây là cách bạn bắt đầu lxc-autostart.service được xác định ở trên:

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

Bạn thậm chí có thể sử dụng systemd-runđể chạy các lệnh tùy ý như người dùng đó theo cách không phá vỡ lxc. Tôi đang sử dụng các lệnh sau để dừng / khởi động các container của mình trước / sau khi sao lưu, $nametên của container lxc đang được sao lưu:

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

(Lưu ý rằng không có --waitsystemd-run sẽ không chặn cho đến khi container bị dừng.)


7

Tôi khuyên bạn nên sử dụng @rebootbí danh tiện dụng trong cron của Ubuntu để chạy lxc-autostart.

Là người dùng sở hữu vùng chứa không có đặc quyền, hãy chạy crontab -evà thêm dòng sau:

@reboot lxc-autostart


Nghe thật tuyệt. Tuy nhiên, dường như không có cách nào để chạy lệnh tắt máy (thông qua cron). Có ý kiến ​​gì không?
HRJ

Tôi không biết bất kỳ cách đơn giản nào để điều hành công việc khi tắt máy. Bạn có thể phải, với quyền root, thêm một công việc mới bắt đầu để tắt các container cho mỗi người dùng sở hữu chúng. Bạn có thể nhìn vào /etc/init/lxc.confcon trỏ. Đó là công việc mới nhất bắt đầu các container đặc quyền. Không nên quá khó để sao chép và sửa đổi nó để tắt các container không có đặc quyền.
được mã hóa vào

1
Tôi nhận thấy rằng, vì mỗi quá trình trong vùng chứa có thể nhìn thấy từ máy chủ, nên container có thể không cần bất cứ điều gì đặc biệt để tắt nó, mỗi quá trình sẽ nhận được tín hiệu TATE từ máy chủ. Có thể bạn không cần phải làm gì đặc biệt khi tắt máy. Nếu bạn muốn chạy một số tập lệnh hoặc những thứ khác khi tắt máy, điều đó khác, nhưng hầu hết các quy trình nên có cơ hội tắt máy bình thường.
được mã hóa vào

Phương pháp crontab có hoạt động không? Trên Ubuntu 14.04, tôi gặp lỗi "gọi tới cgmanager_move_pid_sync không thành công: yêu cầu không hợp lệ" xảy ra do PAM, cụ thể là libpam-systemd không liên quan đến quá trình thay đổi người dùng. Bạn có thể thấy trong /proc/self/cgroupđó có các chuỗi như /user/0.user/1.sessionthay vì/user/1000.user/1.session
Daniel Alder

3

Trong trường hợp bất kỳ ai vấp phải câu hỏi này để có câu trả lời cho việc tự động khởi động các container LXC không có đặc quyền (tôi chắc chắn kiểm tra lại ở đây rất nhiều), đây là một giải pháp hoạt động tốt và tôi đã làm theo để nó hoạt động trên máy chủ của mình:

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

Tóm lại, nó liên quan đến việc tạo hai tập lệnh và chúng hoạt động cùng nhau khi khởi động để cho phép LXC khởi động các thùng chứa không có đặc quyền của mỗi người dùng được liệt kê mà không cần phải đăng nhập vào tài khoản người dùng; nói cách khác, thực thi lệnh với tư cách là người dùng với tất cả các phép thuật Cgroup còn nguyên vẹn. Để phù hợp với thực tiễn tốt nhất của SO, tôi sẽ trích dẫn cốt lõi của nó ở đây nhưng nó đáng để đọc bài viết gốc của anh ấy.

Cho phép tài khoản người dùng của chúng tôi sử dụng cầu nối

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

Tạo kịch bản khởi động mới /etc/init/lxc-unprivileged.confThêm vào Thêm

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

Đảm bảo thay thế [người dùng] bằng tài khoản người dùng của bạn.

Tạo tập lệnh bắt đầu chứa container /usr/local/bin/startunprivlxc Thêm vào Thêm

#!/bin/sh

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

Càng và làm cho nó thực thi được

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

Tôi chỉ muốn nhấn mạnh rằng nó dường như hoạt động an toàn, chính xác và không yêu cầu root để SSH vào các tài khoản người dùng khác.

Ngoài ra còn có nhiều hơn về chủ đề (chạm vào gotchas liên quan) ở đây: https://gist.github.com/julianlam/4e2bd91d8dedee21ca6f có thể hữu ích trong việc hiểu tại sao nó lại như vậy.



0

SORRY: trả lời quá sớm. Nó không hoạt động ngay cả khi lxc-ls hiển thị "AUTOSTART" là "CÓ".

Đây là một liên kết với nhiều thông tin hữu ích hơn và có lẽ ai đó có thể sử dụng nó: http://www.geeklee.co.uk/unprivileged-privileged-containers-ubfox-14-04-lxc/

Tôi đã đến trang này vì tôi có cùng một vấn đề. Sau khi đọc chủ đề này, tôi nhận ra rằng lxc-created không thể ghi vào thư mục "/ var / lib / lxc /" thông thường nếu nó không chạy với sudo.

Tôi nhìn xung quanh và tìm các rootfs cho vùng chứa không có đặc quyền của mình trong "~ / .local / share / lxc", và đặt hai dòng trong câu hỏi vào cấu hình trong thư mục đó.

Tôi đã xem mẫu mà tôi đã sử dụng, "lxc-download" để tìm manh mối, nhưng tôi nghĩ rằng đường dẫn đó đã được thông qua khi "lxc-download" được gọi. Tôi đã không nhìn vào cách hệ thống tìm kiếm các container không có đặc quyền trong khi khởi động.


0

tôi đang chạy từng container không có đặc quyền với cùng một người dùng được đặt tên để cách ly tốt hơn và đây là cách tôi làm điều đó:

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

Giả sử (là mẹ của tất cả các cách để giải quyết vấn đề), bạn đang đăng nhập với tư cách là người dùng "sở hữu" bộ chứa lxc không có đặc quyền, thì lệnh sau sẽ giải quyết những gì bạn đang tìm kiếm ...

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

Điều này chỉ đơn giản là chạy lệnh trên khi bạn đăng nhập thông qua bash. Điều này cũng giả sử rằng bash là vỏ đăng nhập. Vui lòng thay thế tên: LXC-CONTAINER-NAMEbằng tên của thùng chứa LXC mà bạn muốn bắt đầu.


-1

Tôi đã sử dụng một cách tiếp cận khác và nó đang hoạt động

1º Thêm các mục sau vào tập tin cấu hình container

TỰ ĐỘNG BẮT ĐẦU CONFIG

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

2º Tạo mối quan hệ tin cậy giữa người dùng container và chính anh ta tại cùng một máy chủ

userlxc @ GEST-4: ~ $ ssh-keygen -t rsa Tạo cặp khóa rsa công khai / riêng tư. Nhập tệp để lưu khóa (/home/userlxc/.ssh/id_rsa): Nhập cụm mật khẩu (trống để không có cụm mật khẩu): Nhập lại cụm mật khẩu: Nhận dạng của bạn đã được lưu trong /home/userlxc/.ssh/id_rsa. Khóa công khai của bạn đã được lưu trong /home/userlxc/.ssh/id_rsa.pub. Dấu vân tay chính là: c9: b4: e1: f3: bf: a3: 25: cc: f8: bc: be: b6: 80: 39: 59: 98 userlxc @ GEST-AMENCIA-4 Hình ảnh ngẫu nhiên của khóa là: + - [RSA 2048] ---- + | | | | | o | | * + | | ES | | = * | | = o =. | | . +. +. | | oO = oo | + ----------------- +

userlxc @ GEST-4: ~ $ cat .ssh / id_rsa.pub >> .ssh / ủy quyền_key userlxc @ GEST-4: ~ $ ls -lrt .ssh / ủy quyền_keys -rw-rw-r-- 1 userlxc userlxc 17:23 .ssh / ủy quyền

Kiểm tra kết nối ssh, bạn phải có thể sử dụng nó mà không cần mật khẩu userlxc @ GEST-4: ~ $ ssh userlxc @ localhost "lxc-ls --fancy"

TÊN NHÀ NƯỚC IPV4 IPV6 AUTOSTART

EXTLXCCONT01 STOPPED - - CÓ
UBUSER1404USERCONT01-test STOPPED - - KHÔNG
UBUSER1404USERLXCCONT01 STOPPED - - KHÔNG

3º Tạo một mục crontab tại chủ sở hữu container

@reboot ssh userlxc @ localhost "lxc-autostart"

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.