userns container không khởi động, làm thế nào để theo dõi lý do?


8

Khi tạo một thùng chứa LXC (không có đặc quyền) trên Ubuntu 14.04 với dòng lệnh sau:

lxc-create -n test1 -t download -- -d $(lsb_release -si|tr 'A-Z' 'a-z') -r $(lsb_release -sc) -a $(dpkg --print-architecture)

và (không chạm vào tệp cấu hình đã tạo) sau đó thử khởi động nó bằng:

lxc-start -n test1 -l DEBUG

nó thất bại. Tệp nhật ký hiển thị cho tôi:

lxc-start 1420149317.700 INFO     lxc_start_ui - using rcfile /home/user/.local/share/lxc/test1/config
lxc-start 1420149317.700 INFO     lxc_utils - XDG_RUNTIME_DIR isn't set in the environment.
lxc-start 1420149317.701 INFO     lxc_confile - read uid map: type u nsid 0 hostid 100000 range 65536
lxc-start 1420149317.701 INFO     lxc_confile - read uid map: type g nsid 0 hostid 100000 range 65536
lxc-start 1420149317.701 WARN     lxc_log - lxc_log_init called with log already initialized
lxc-start 1420149317.701 INFO     lxc_lsm - LSM security driver AppArmor
lxc-start 1420149317.701 INFO     lxc_utils - XDG_RUNTIME_DIR isn't set in the environment.
lxc-start 1420149317.702 DEBUG    lxc_conf - allocated pty '/dev/pts/2' (5/6)
lxc-start 1420149317.702 DEBUG    lxc_conf - allocated pty '/dev/pts/7' (7/8)
lxc-start 1420149317.702 DEBUG    lxc_conf - allocated pty '/dev/pts/8' (9/10)
lxc-start 1420149317.702 DEBUG    lxc_conf - allocated pty '/dev/pts/10' (11/12)
lxc-start 1420149317.702 INFO     lxc_conf - tty's configured
lxc-start 1420149317.702 DEBUG    lxc_start - sigchild handler set
lxc-start 1420149317.702 DEBUG    lxc_console - opening /dev/tty for console peer
lxc-start 1420149317.702 DEBUG    lxc_console - using '/dev/tty' as console
lxc-start 1420149317.702 DEBUG    lxc_console - 14946 got SIGWINCH fd 17
lxc-start 1420149317.702 DEBUG    lxc_console - set winsz dstfd:14 cols:118 rows:61
lxc-start 1420149317.905 INFO     lxc_start - 'test1' is initialized
lxc-start 1420149317.906 DEBUG    lxc_start - Not dropping cap_sys_boot or watching utmp
lxc-start 1420149317.906 INFO     lxc_start - Cloning a new user namespace
lxc-start 1420149317.906 INFO     lxc_cgroup - cgroup driver cgmanager initing for test1
lxc-start 1420149317.907 ERROR    lxc_cgmanager - call to cgmanager_create_sync failed: invalid request
lxc-start 1420149317.907 ERROR    lxc_cgmanager - Failed to create hugetlb:test1
lxc-start 1420149317.907 ERROR    lxc_cgmanager - Error creating cgroup hugetlb:test1
lxc-start 1420149317.907 INFO     lxc_cgmanager - cgroup removal attempt: hugetlb:test1 did not exist
lxc-start 1420149317.908 INFO     lxc_cgmanager - cgroup removal attempt: perf_event:test1 did not exist
lxc-start 1420149317.908 INFO     lxc_cgmanager - cgroup removal attempt: blkio:test1 did not exist
lxc-start 1420149317.908 INFO     lxc_cgmanager - cgroup removal attempt: freezer:test1 did not exist
lxc-start 1420149317.909 INFO     lxc_cgmanager - cgroup removal attempt: devices:test1 did not exist
lxc-start 1420149317.909 INFO     lxc_cgmanager - cgroup removal attempt: memory:test1 did not exist
lxc-start 1420149317.909 INFO     lxc_cgmanager - cgroup removal attempt: cpuacct:test1 did not exist
lxc-start 1420149317.909 INFO     lxc_cgmanager - cgroup removal attempt: cpu:test1 did not exist
lxc-start 1420149317.910 INFO     lxc_cgmanager - cgroup removal attempt: cpuset:test1 did not exist
lxc-start 1420149317.910 INFO     lxc_cgmanager - cgroup removal attempt: name=systemd:test1 did not exist
lxc-start 1420149317.910 ERROR    lxc_start - failed creating cgroups
lxc-start 1420149317.910 INFO     lxc_utils - XDG_RUNTIME_DIR isn't set in the environment.
lxc-start 1420149317.910 ERROR    lxc_start - failed to spawn 'test1'
lxc-start 1420149317.910 INFO     lxc_utils - XDG_RUNTIME_DIR isn't set in the environment.
lxc-start 1420149317.910 INFO     lxc_utils - XDG_RUNTIME_DIR isn't set in the environment.
lxc-start 1420149317.910 ERROR    lxc_start_ui - The container failed to start.
lxc-start 1420149317.910 ERROR    lxc_start_ui - Additional information can be obtained by setting the --logfile and --logpriority options.

Bây giờ tôi thấy hai lỗi ở đây, lỗi sau có lẽ là kết quả của lỗi trước, đó là:

lxc_start - không tạo được cgroups

Tuy nhiên, tôi thấy /sys/fs/cgroupgắn kết:

$ mount|grep cgr
none on /sys/fs/cgroup type tmpfs (rw)

cgmanagerđược cài đặt:

$ dpkg -l|awk '$1 ~ /^ii$/ && /cgmanager/ {print $2 " " $3 " " $4}'
cgmanager 0.24-0ubuntu7 amd64
libcgmanager0:amd64 0.24-0ubuntu7 amd64

Lưu ý: Máy chủ của tôi mặc định vẫn còn upstart.

Trong trường hợp có bất kỳ nghi ngờ nào, hỗ trợ kernel cgroups:

$ grep CGROUP /boot/config-$(uname -r)
CONFIG_CGROUPS=y
# CONFIG_CGROUP_DEBUG is not set
CONFIG_CGROUP_FREEZER=y
CONFIG_CGROUP_DEVICE=y
CONFIG_CGROUP_CPUACCT=y
CONFIG_CGROUP_HUGETLB=y
CONFIG_CGROUP_PERF=y
CONFIG_CGROUP_SCHED=y
CONFIG_BLK_CGROUP=y
# CONFIG_DEBUG_BLK_CGROUP is not set
CONFIG_NET_CLS_CGROUP=m
CONFIG_NETPRIO_CGROUP=m

Lưu ý: Máy chủ của tôi mặc định vẫn còn upstart.

Câu trả lời:


7

Hóa ra, ngạc nhiên ngạc nhiên, đây là một điều cụ thể của Ubuntu.


Nguyên nhân

Vấn đề: mặc dù kernel đã cgroupskích hoạt (kiểm tra grep CGROUP /boot/config-$(uname -r)) và cgmanagerđang chạy, nhưng không có nhóm cụ thể nào cho người dùng của tôi. Bạn có thể kiểm tra xem với:

$ cat / Proc / self / cgroup
11: hugetlb: /
10: hoàn hảo: /
9: blkio: /
8: tủ đông: /
7: thiết bị: /
6: bộ nhớ: /
5: cpuacct: /
4: CPU: /
3: tên = hệ thống: /
2: cpuset: /

nếu UID của bạn được cung cấp trong mỗi dòng có liên quan thì không sao, nhưng nếu không có nhóm nào được xác định thì sẽ chỉ có dấu gạch chéo sau dấu hai chấm trên mỗi dòng.

Vấn đề của tôi là cụ thể để bắt đầu một container không có đặc quyền. Tôi có thể bắt đầu các container đặc quyền tốt.

Hóa ra vấn đề của tôi liên quan mật thiết đến chủ đề này trong lxc-usersdanh sách gửi thư .

Biện pháp khắc phục

Trên Ubuntu 14.04 upstartlà mặc định, trái ngược với systemd. Do đó, một số thành phần nhất định sẽ được cài đặt trên một bản phân systemdphối dựa trên cơ sở không được cài đặt theo mặc định.

Ngoài ra, có hai gói cgmanagermà tôi phải cài đặt để vượt qua lỗi hiển thị trong câu hỏi của tôi: cgroup-binlibpam-systemd. Thành thật mà nói tôi không chắc chắn 100% rằng trước đây là rất cần thiết, vì vậy bạn có thể cố gắng để nó ra và bình luận ở đây.

Sau khi cài đặt các gói và khởi động lại, bạn sẽ thấy UID của mình ( id -u, ở đây 1000) trong đầu ra:

$ cat / Proc / self / cgroup
11: hugetlb: /user/1000.user/1.session
10: perf_event: /user/1000.user/1.session
9: blkio: /user / 1000.user / 1.session
8: tủ đông: /user / 1000.user / 1.session
7: thiết bị: /user/1000.user/1.session
6: bộ nhớ: /user/1000.user/1.session
5: cpuacct: /user/1000.user/1.session
4: cpu: /user / 1000.user / 1.session
3: tên = systemd: /user/1000.user/1.session
2: cpuset: /user/1000.user/1.session

Sau đó, lỗi khi cố gắng khởi động bộ chứa khách trở thành (được cắt bớt cho ngắn gọn):

lxc-start 1420160065.383 INFO lxc_cgroup - cgmanager trình điều khiển cgroup đang thử nghiệm1
lxc-start 1420160065.419 ERROR lxc_start - không thể tạo mạng được định cấu hình
lxc-start 1420160065.446 ERROR lxc_start - không thể sinh ra 'test1'
lxc-start 1420160065.451 ERROR lxc_start_ui - Container không khởi động được.

Vì vậy, vẫn không có thành công, nhưng chúng ta một bước gần hơn.

Các liên kết ở trên lxc-usersđiểm thread để /etc/systemd/logind.confkhông nhắc đến ba điều khiển: net_cls, net_priodebug. Đối với tôi chỉ có người cuối cùng bị mất tích. Tuy nhiên, sau khi thay đổi, bạn sẽ phải đăng nhập lại, vì những thay đổi có hiệu lực khi tạo phiên đăng nhập của bạn.

Bài đăng trên blog này của một trong những tác giả của LXC đưa ra bước tiếp theo:

Người dùng của bạn, trong khi nó có thể tạo các không gian tên người dùng mới, trong đó nó sẽ là 0 và sẽ có một số đặc quyền gốc đối với các tài nguyên gắn với không gian tên đó rõ ràng sẽ không được cấp bất kỳ đặc quyền bổ sung nào trên máy chủ.

Một điều như vậy là tạo các thiết bị mạng mới trên máy chủ hoặc thay đổi cấu hình cầu. Để giải quyết vấn đề đó, chúng tôi đã viết một công cụ có tên là Lxc-user-nic, đây là phần nhị phân SETUID duy nhất của LXC 1.0 và thực hiện một nhiệm vụ đơn giản. Nó phân tích tệp cấu hình và dựa trên nội dung của nó sẽ tạo ra các thiết bị mạng cho người dùng và kết nối chúng. Để tránh lạm dụng, bạn có thể hạn chế số lượng thiết bị mà người dùng có thể yêu cầu và họ có thể thêm cầu nối nào.

Một ví dụ là tập tin / etc / lxc / lxc-usernet của riêng tôi:

stgraber veth lxcbr0 10

Điều này tuyên bố rằng người dùng có thể sử dụng và cài đặt tối đa 10 thiết bị loại veth để tạo và thêm vào cây cầu có tên lxcbr0.

Giữa những gì được cung cấp bởi không gian tên người dùng trong kernel và công cụ setuid đó, chúng tôi có tất cả những gì cần thiết để chạy hầu hết các bản phân phối không có đặc quyền.

Nếu người dùng của bạn có sudoquyền và bạn đang sử dụng Bash, hãy sử dụng điều này:

echo "$(whoami) veth lxcbr0 10"|sudo tee -a /etc/lxc/lxc-usernet

và đảm bảo loại ( veth) khớp với loại trong cấu hình bộ chứa và cầu ( lxcbr0) được cấu hình và lên.

Và bây giờ chúng ta nhận được một bộ lỗi khác:

lxc-start 1420192192.775 INFO lxc_start - Nhân bản một không gian tên người dùng mới
lxc-start 1420192192.775 INFO lxc_cgroup - trình điều khiển cgroup cgmanager đang thử nghiệm1
lxc-start 1420192192.923 THÔNG BÁO lxc_start - chuyển sang gid / uid 0 trong không gian tên người dùng mới
lxc-start 1420192192.923 ERROR lxc_start - Quyền bị từ chối - không thể truy cập / nhà / người dùng. Vui lòng cấp quyền truy cập 'x' hoặc thêm ACL cho thư mục gốc.
lxc-start 1420192192.923 LRI lxc_sync - số thứ tự không hợp lệ 1. dự kiến ​​2
lxc-start 1420192192.954 ERROR lxc_start - không thể sinh ra 'test1'
lxc-start 1420192192.959 ERROR lxc_start_ui - Container không khởi động được.

Rực rỡ, có thể được sửa chữa. Một lxc-userschủ đề khác của các nhân vật chính giống như trong các chủ đề đầu tiên mở đường.

Bây giờ một bài kiểm tra nhanh sudo chmod -R o+X $HOMEsẽ phải làm, nhưng ACL cũng là một lựa chọn khả thi ở đây. YMMV.


Tôi vẫn bị mắc kẹt bởi thực tế là nếu tôi muốn chạy container LXC với tư cách là người dùng khác, nó đã thất bại. Sáng tạo hoạt động (với một cảnh báo WARN: could not reopen tty: Permission denied:). Nhưng bắt đầu sudo -H -i -u database lxc-start -n mysql -dthất bại như trong câu hỏi của bạn. Cùng một lỗi. Tuy nhiên, sửa chữa của bạn không làm việc với sudo. Nếu tôi làm, sudo -H -i -u database cat /proc/self/cgrouptôi nhận được đầu ra chính xác giống như khi tôi chạy nó với tư cách là người dùng gọi điện của mình. Vì vậy, rõ ràng, khi cố gắng khởi động container bằng sudo, nó sẽ cố gắng khi người dùng khác viết vào nhóm của tôi mà không thành công ... :-( Có cái nhìn sâu sắc nào không?
Huygens
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.