Thêm thư mục máy chủ được chia sẻ vào Container LXC / LXD


19

Tôi đã thử nghiệm với LXC / LXD trên Ubuntu 14.04 và tất cả đều hoạt động rất tốt. Tôi chỉ cần tìm ra cách để các thư mục được chia sẻ hoạt động giữa máy chủ của tôi và một thùng chứa để tôi có thể bỏ Virtualbox một lần và mãi mãi.

Tôi đã thấy trang này: https://wiki.gentoo.org/wiki/LXD

Cung cấp hướng dẫn, nhưng tôi cứ bị lỗi.

Có ai biết bất kỳ hướng dẫn đơn giản, rõ ràng để làm việc này không? Bất kỳ trợ giúp nhiều đánh giá cao.


2
Tôi đã quản lý để gắn kết một thư mục máy chủ bằng cách sử dụng : lxc config device add confexample sharedtmp disk path=/tmp source=/tmp/shared. Nhưng nhìn vào thư mục trên container, chủ sở hữu và nhóm cho các tệp trong đó được đặt thành 'none' và 'nogroup' và mount chỉ được đọc.
dùng47227

Bạn có thể vui lòng thêm một chút chi tiết? Có gì chính xác bạn đã làm, những gì đã làm bạn muốn đạt được và những gì đã xảy ra để thay thế? Bạn có gặp phải bất kỳ thông báo cảnh báo hoặc lỗi? Vui lòng sao chép toàn bộ chúng trong câu hỏi của bạn. Bạn có thể chọn, sao chép và dán nội dung đầu cuối và hầu hết các tin nhắn đối thoại trong Ubuntu. (xem Làm thế nào để tôi hỏi một câu hỏi hay? )
David Foerster

Giả sử bạn đang sử dụng một bộ chứa không có đặc quyền và ánh xạ UID / GID là vấn đề, hãy xem phần này của bài viết về ánh xạ userns với LXD. Tuy nhiên, điều này có thể đã được thêm vào cách LXD sau khi bạn đặt câu hỏi.
0xC0000022L

Tôi không biết phiên bản nào đã thêm phiên bản này (Tôi vào ngày 2.18) nhưng nếu có thể, bạn cũng có thể sử dụng lxc fileđể chuyển tệp giữa máy chủ và vùng chứa, sử dụng pushpull.
code_dredd

Câu trả lời:


21

Các hướng dẫn trên https://wiki.gentoo.org/wiki/LXD mà bạn đề cập là chính xác nhưng có thể cần giải thích thêm một chút.

Trên máy chủ, trước tiên bạn kiểm tra quyền sở hữu của thư mục chứa dữ liệu chứa. Chạy

sudo ls -l /var/lib/lxd/containers

và kiểm tra chủ sở hữu của container bạn muốn chia sẻ thư mục với. Trong trường hợp của tôi uidgidcả hai đều là 100000.

Tiếp theo, sử dụng chúng để thay đổi quyền sở hữu của thư mục bạn muốn chia sẻ:

sudo chown 100000:100000 /tmp/share_on_host

Chia sẻ thư mục với container theo cách bạn đã chỉ ra trong nhận xét của mình:

lxc config device add mycontainer sharedtmp disk \
                  path=/tmp/share_on_guest source=/tmp/share_on_host

Bây giờ, trong vùng chứa, bạn sẽ thấy rằng thư mục /tmp/share_on_guest(tôi không khuyên bạn nên gắn thư mục của mình /tmpvì nó được hệ thống sử dụng cho các nội dung khác và có quyền đặc biệt) được sở hữu bởi root. Từ đây, bạn có thể sử dụng chowntrong vùng chứa để thay đổi quyền sở hữu cho phù hợp uidgidcho người dùng của bạn trong vùng chứa.

Như một lưu ý phụ, sau khi thay đổi quyền sở hữu trong vùng chứa thành ví dụ: người dùng có uid33 bạn sẽ thấy trên máy chủ hiện uidcó 100033, điều này hoàn toàn có ý nghĩa.


Không chắc đó có phải là thiết lập của tôi không, nhưng với LXD v3.0.3 LTS (Ubuntu 18.04 LTS) tôi không tìm thấy gì ngoài các liên kết tượng trưng trong /var/lib/lxd/containersđó được chỉ ra /var/lib/lxd/storage-pools/lxd/containers(trong trường hợp này, lxdbit cuối cùng là tên của nhóm lưu trữ ZFS của tôi). Tất cả các container ở đó dường như có cùng 165536 uid / gid khi chạy và sở hữu root:rootkhi tắt.
deoren

1
Tôi nhận ra đây là một câu hỏi cũ + câu trả lời, nhưng trong Ubuntu 18.04, tôi không phải gặp rắc rối với bất kỳ sự cho phép nào. Chỉ cần thêm thư mục với lxc configvà nó hoạt động như một nét duyên dáng!
Apache

4

Đây là một câu trả lời cập nhật cho câu hỏi này.

Gắn thư mục máy chủ /var/wwwnhư /var/testtrong container.

lxc config device add mycontainer vartest disk source=/var/www path=/var/test

Chào mừng bạn đến hỏi Ubuntu! Tôi khuyên bạn nên chỉnh sửa câu trả lời này để mở rộng nó với các chi tiết cụ thể về cách thực hiện việc này. (Xem thêm Làm thế nào để viết một câu trả lời tốt? Cho lời khuyên chung về những gì sắp xếp các câu trả lời được coi là có giá trị nhất trên AskUbuntu.)
David Foerster

3

Bạn có thể chỉ định các thiết bị bổ sung cho vùng chứa và đây có thể là các thư mục có thể truy cập máy chủ.

$ lxc config ## display help
...
lxc config device add [<remote>:]<container> <device> <type> [key=value...]
    Add a device to a container.
...

Lưu ý rằng đó <device>chỉ là một tên tùy ý mà bạn gán, sẽ được sử dụng làm ID cho quản lý thiết bị tiếp theo.

Ví dụ: để gắn thư mục máy chủ "./host" dưới dạng "/ mnt / host" trong vùng chứa ...

lxc config device add mycontainer vartest disk source=$(pwd)/host path=/mnt/host

Vẫn còn một vấn đề - nếu bạn muốn thư mục này có thể ghi được bởi cả máy chủ và vùng chứa, quyền sở hữu và quyền cần phải được cấu hình tương ứng. Điều này phức tạp bởi chế độ mặc định của LXD, ảo hóa các phạm vi số cho idcác giá trị người dùng và nhóm . Tuy nhiên, có một giải pháp dễ dàng : bỏ qua việc ảo hóa này bằng cách định cấu hình bộ chứa để chạy với các đặc quyền tương đương với máy chủ ...

lxc config set <container> security.privileged true

Ý nghĩa bảo mật máy chủ đầy đủ của phương pháp này không rõ ràng đối với tôi tại thời điểm này, nhưng dường như sẽ bị "chứa" phần nào bởi ảo hóa. Rủi ro thực tế phụ thuộc vào cách thức và lý do bạn sẽ sử dụng container. Xem ghi chú kỹ thuật tại https://insights.ubfox.com/2017/06/15/custom-user-mappings-in-lxd-containers

Lưu ý thêm rằng phương pháp này có thể hoạt động tốt nhất nếu bạn thường hoạt động trong vùng chứa dưới dạng người dùng không phải root, chẳng hạn như nếu bạn đính kèm với ...

lxc exec zesty -- su --login ubuntu

Có một vấn đề với đăng nhập không root: Cụ thể envlà khác nhau http_proxy. Một ví dụ giải pháp : sudo http_proxy=http://[fe80::1%eth0]:13128 apt-get update.
tộc

Về http_proxy, tôi nghĩ giải pháp dễ dàng hơn có lẽ là kích hoạt IPV4 như được thảo luận ở đây .
tộc

... theo sau sudo dhclienttrong container - hoặc thay đổi manualthành dhcptrong 50-cloud-init.cfg. Những manh mối tuyệt vời ở đây: github.com/lxc/lxd/issues/1298
nobar

1
Đây là một ý tưởng tồi tệ . Khuyến nghị chuyển sang các container đặc quyền sẽ thay đổi một trong những tiến bộ mà LXD mang lại. Mặc dù LXC 1.x cũng cung cấp khả năng sử dụng các container không có đặc quyền (và có, ngay cả khi đã root), nhưng việc sắp xếp các chi tiết lại hơi phức tạp hơn một chút. Với LXD, điều này giờ đã là quá khứ. Bên cạnh đó, có gì phức tạp khi đặt ACL trên một số thư mục để cho phép UID phía máy chủ truy cập được yêu cầu hoặc sử dụng phương pháp được nêu ở đây ? Yeah ánh xạ UID / GID không phải là cách duy nhất!
0xC0000022L

1

Dựa trên câu trả lời tuyệt vời của ph0t0nix , tôi đề xuất cách tiếp cận từng bước sau cho máy chủ Ubuntu 18.04 của tôi:

  1. Trong máy chủ xác định UID của chủ sở hữu rootfs:

    sudo ls -l /var/lib/lxd/storage-pools/lxd/containers/webserver/rootfs  
    id -u root    100000
  2. Trong vùng chứa xác định UID của ubfox (tức là người dùng trong vùng chứa):

    id -u ubuntu    1000
  3. Tạo thư mục chia sẻ trong máy chủ và thêm nó vào thùng chứa:

    lxc config device add webserver mydevicename disk path=/home/share_on_guest source=/home/share_on_host
  4. Điều chỉnh trong UID máy chủ của thư mục dùng chung (UID = máy chủ UID + khách UID):

    sudo chown 101000:101000 /home/share_on_host
  5. Khách (người dùng Ubuntu) hiện có quyền truy cập vào thư mục dùng chung và có thể điều chỉnh trong quyền truy cập vùng chứa vào thư mục dùng chung chmod.


0

Bây giờ tôi có một giải pháp an toàn, hiệu quả cho vấn đề này, sử dụng các cấu hình LXD để xử lý ánh xạ giữa UID và GID trong vùng chứa và trên máy chủ.

Một ý chính rất hữu ích có thể được tìm thấy ở đây:

https://gist.github.com/bloodearnest/ebf044476e70c4baee59c5000a10f4c8


5
Lưu ý rằng làm cho mọi thứ có thể ghi được trên thế giới thường là một ý tưởng tồi từ quan điểm bảo mật. Có lẽ bạn nên xem xét việc sử dụng POSIX ACL trên đường dẫn máy chủ, cấp quyền truy cập cho người dùng của bộ chứa bằng cách thêm một ACL cụ thể cho uid đó, và sau đó cho bất kỳ người dùng máy chủ nào khác cũng cần quyền truy cập ghi.
stgraber

1
@stgraber trong khi tôi đồng ý với những gì bạn nói, tôi không biết làm thế nào để thiết lập nó. Một số liên kết sẽ hữu ích.
s3v3n

Vui lòng không đề xuất 0777hay còn gọi là các quyền xin vui lòng hack-hack-my-system-and-hủy-my-data của tôi mà không có lý do rõ ràng! Hầu như không bao giờ có lý do cho điều đó bởi vì nó có thể tránh được với các sửa đổi hợp lý hơn như thay đổi quyền sở hữu (nhóm). -1
David Foerster

Tôi nêu quan điểm của bạn, nhưng tôi chỉ sử dụng nó như một cách giải quyết tạm thời trên một máy phát triển người dùng duy nhất, trong trường hợp không có cách nào khác để làm cho nó hoạt động. Kể từ đó tôi đã phát hiện ra rằng sử dụng hồ sơ là cách để xử lý việc này, hãy xem câu trả lời được chỉnh sửa của tôi ở trên!
dùng47227

1
Có gì khó khăn khi sử dụng ACL hoặc phương pháp được nêu ở đây ?
0xC0000022L
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.