wadah userns gagal memulai, bagaimana melacak alasannya?

8

Saat membuat wadah LXC userns (unprivilegeged) di Ubuntu 14.04 dengan baris perintah berikut:

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

dan (tanpa menyentuh file konfigurasi yang dibuat) kemudian mencoba memulainya dengan:

lxc-start -n test1 -l DEBUG

itu gagal. File log menunjukkan kepada saya:

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.

Sekarang saya melihat dua kesalahan di sini, yang terakhir mungkin akibat dari yang pertama, yaitu:

lxc_start - gagal membuat cgroup

Namun, saya melihat /sys/fs/cgroupmount:

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

dan cgmanagerdiinstal:

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

Catatan: Host saya defaultnya masih upstart.

Jika ada keraguan, dukungan 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

Catatan: Host saya defaultnya masih upstart.

0xC0000022L
sumber

Jawaban:

7

Ternyata, kejutan, ini adalah hal khusus Ubuntu.


Penyebab

Masalahnya: meskipun kernel telah cgroupsdiaktifkan (periksa dengan grep CGROUP /boot/config-$(uname -r)) dan cgmanagersedang berjalan, tidak ada grup khusus untuk pengguna saya. Anda dapat memeriksanya dengan:

$ cat / proc / self / cgroup
11: hugetlb: /
10: perf_event: /
9: blkio: /
8: freezer: /
7: perangkat: /
6: memori: /
5: cpuacct: /
4: cpu: /
3: name = systemd: /
2: cpuset: /

jika UID Anda diberikan di masing-masing baris yang relevan, tidak apa-apa, tetapi jika tidak ada cgroup yang telah ditentukan, hanya akan ada garis miring setelah titik dua di setiap baris.

Masalah saya khusus untuk memulai wadah yang tidak terjangkau. Saya bisa memulai wadah istimewa dengan baik.

Ternyata masalah saya terkait erat dengan utas ini di lxc-usersmilis .

Obat

Di Ubuntu 14.04 upstartadalah default, yang bertentangan dengan systemd. Karenanya komponen tertentu yang akan diinstal pada systemddistro berbasis tidak diinstal secara default.

Ada dua paket selain cgmanageryang harus saya instal untuk mengatasi kesalahan yang ditunjukkan dalam pertanyaan saya: cgroup-bindan libpam-systemd. Sejujurnya saya tidak 100% yakin bahwa yang pertama benar-benar diperlukan, jadi Anda bisa mencoba untuk meninggalkannya dan berkomentar di sini.

Setelah instalasi paket dan reboot, Anda akan melihat UID Anda ( id -u, di sini 1000) di output:

$ 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: freezer: /user/1000.user/1.session
7: perangkat: /user/1000.user/1.session
6: memory: /user/1000.user/1.session
5: cpuacct: /user/1000.user/1.session
4: cpu: /user/1000.user/1.session
3: name = systemd: /user/1000.user/1.session
2: cpuset: /user/1000.user/1.session

Setelah itu, kesalahan saat mencoba memulai wadah tamu menjadi (dipangkas untuk singkatnya):

lxc-start 1420160065.383 INFO lxc_cgroup - driver cgroup cgmanager initing untuk test1
lxc-start 1420160065.419 ERROR lxc_start - gagal membuat jaringan yang dikonfigurasi
lxc-start 1420160065.446 ERROR lxc_start - gagal menelurkan 'test1'
lxc-start 1420160065.451 ERROR lxc_start_ui - Wadah gagal untuk memulai.

Jadi tetap tidak berhasil, tapi kita selangkah lebih dekat.

The terkait di atas lxc-userspoin thread untuk /etc/systemd/logind.conftidak menyebutkan tiga pengendali: net_cls, net_priodan debug. Bagi saya hanya yang terakhir yang hilang. Namun, setelah perubahan, Anda harus login ulang, karena perubahan tersebut akan berpengaruh pada pembuatan sesi login Anda.

Posting blog ini oleh salah satu penulis LXC memberikan langkah selanjutnya:

Pengguna Anda, sementara itu dapat membuat ruang nama pengguna baru di mana itu akan menjadi 0 dan akan memiliki beberapa hak root terhadap sumber daya terkait dengan namespace itu jelas tidak akan diberikan hak istimewa tambahan pada host.

Satu hal seperti itu adalah membuat perangkat jaringan baru di host atau mengubah konfigurasi jembatan. Untuk mengatasinya, kami menulis alat yang disebut "lxc-user-nic" yang merupakan satu-satunya bagian biner SETUID dari LXC 1.0 dan yang melakukan satu tugas sederhana. Ini mem-parsing file konfigurasi dan berdasarkan kontennya akan membuat perangkat jaringan untuk pengguna dan menjembatani mereka. Untuk mencegah penyalahgunaan, Anda dapat membatasi jumlah perangkat yang dapat diminta pengguna dan untuk menjembatani apa yang mungkin ditambahkan.

Contohnya adalah file / etc / lxc / lxc-usernet saya sendiri:

stgraber veth lxcbr0 10

Ini menyatakan bahwa pengguna "stgraber" diizinkan hingga 10 jenis perangkat yang akan dibuat dan ditambahkan ke jembatan yang disebut lxcbr0.

Antara apa yang ditawarkan oleh namespace pengguna di kernel dan alat setuid itu, kami memiliki semua yang diperlukan untuk menjalankan sebagian besar distribusi yang tidak terjangkau.

Jika pengguna Anda memiliki sudohak dan Anda menggunakan Bash, gunakan ini:

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

dan pastikan jenis ( veth) cocok dengan yang ada di konfigurasi wadah dan jembatan ( lxcbr0) dikonfigurasi dan naik.

Dan sekarang kita mendapatkan satu set kesalahan:

lxc-start 1420192192.775 INFO lxc_start - Mengkloning namespace pengguna baru
lxc-start 1420192192.775 INFO lxc_cgroup - driver cgroup cgmanager initing untuk test1
lxc-start 1420192192.923 PEMBERITAHUAN lxc_start - beralih ke gid / uid 0 di namespace pengguna baru
lxc-start 1420192192.923 ERROR lxc_start - Izin ditolak - tidak dapat mengakses / home / pengguna. Harap berikan akses 'x', atau tambahkan ACL untuk akar wadah.
lxc-start 1420192192.923 ERROR lxc_sync - nomor urut tidak valid 1. diharapkan 2
lxc-start 1420192192.954 ERROR lxc_start - gagal menelurkan 'test1'
lxc-start 1420192192.959 ERROR lxc_start_ui - Wadah gagal untuk memulai.

Cemerlang, itu bisa diperbaiki. Utas lainlxc-users oleh protagonis yang sama seperti pada utas pertama membuka jalan.

Untuk saat ini tes cepat sudo chmod -R o+X $HOMEharus dilakukan, tetapi ACL adalah opsi yang layak di sini juga. YMMV.

0xC0000022L
sumber
Saya masih terjebak oleh kenyataan bahwa jika saya ingin menjalankan wadah LXC pengguna sebagai pengguna lain, itu gagal. Penciptaan bekerja (dengan satu peringatan:) WARN: could not reopen tty: Permission denied. Tetapi memulai sudo -H -i -u database lxc-start -n mysql -dgagal seperti dalam pertanyaan Anda. Kesalahan yang sama. Namun perbaikan Anda tidak berhasil sudo. Jika saya melakukannya, sudo -H -i -u database cat /proc/self/cgroupsaya mendapatkan output yang sama persis seperti jika saya menjalankannya sebagai pengguna panggilan saya. Jadi jelas, ketika mencoba untuk memulai wadah menggunakan sudo, itu akan mencoba sebagai pengguna lain untuk menulis di cgroup saya yang gagal ... :-( Ada wawasan?
Huygens