LXC / LXD 컨테이너에 공유 호스트 디렉토리 추가


19

우분투 14.04에서 LXC / LXD를 실험 해왔으며 모두 훌륭하게 작동합니다. Virtualbox를 한 번에 모두 버릴 수 있도록 호스트 컴퓨터와 컨테이너 사이에서 공유 디렉토리를 작동시키는 방법을 알아야합니다.

이 페이지를 보았습니다 : https://wiki.gentoo.org/wiki/LXD

어느 지시 사항을 제공하지만 오류가 계속 발생합니다.

누구 든지이 작업을 수행하기위한 간단하고 명확한 지침을 알고 있습니까? 도움을 주시면 감사하겠습니다.


2
다음을 사용하여 호스트 디렉토리를 마운트했습니다 lxc config device add confexample sharedtmp disk path=/tmp source=/tmp/shared. 그러나 컨테이너의 디렉토리를 보면 파일의 소유자 및 그룹이 'nobody'및 'nogroup'으로 설정되어 있으며 마운트는 읽기 전용입니다.
user47227

좀 더 자세히 설명해 주시겠습니까? 정확히 무엇을 했으며, 무엇을 달성하고 싶었고 대신에 무슨 일이 있었습니까? 경고 또는 오류 메시지가 나타 났습니까? 귀하의 질문에 그것들을 완전히 재생산하십시오. Ubuntu에서 터미널 내용과 대부분의 대화 메시지를 선택, 복사 및 붙여 넣기 할 수 있습니다. (참조 내가 좋은 질문을 물어 어떻게해야합니까? )
데이비드 푀르 스터에게

권한이없는 컨테이너를 사용하고 UID / GID 매핑이 문제라고 가정하면 LXD와의 사용자 매핑에 대한 기사 의이 섹션 을 살펴보십시오 . 그러나 이것은 아마도 질문을 한 후에 LXD 방식으로 추가되었을 것입니다.
0xC0000022L

난이 추가 된 버전을 모른다 (I가 2.18에있어)하지만 가능하다면, 당신은 또한 사용할 수 lxc file호스트와 용기, 사용간에 파일을 전송 push하고 pull.
code_dredd

답변:


21

언급 한 https://wiki.gentoo.org/wiki/LXD 의 지침 은 정확하지만 약간 더 자세한 설명이 필요할 수 있습니다.

호스트에서 먼저 컨테이너 데이터가 저장된 디렉토리의 소유권을 확인하십시오. 운영

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

디렉토리를 공유하려는 컨테이너의 소유자를 확인하십시오. 내 경우에서 uidgid모두 100,000이었다.

다음을 사용하여 공유하려는 디렉토리의 소유권을 변경하십시오.

sudo chown 100000:100000 /tmp/share_on_host

주석에 표시된 방식으로 컨테이너와 디렉토리를 공유하십시오.

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

이제 컨테이너에서 디렉토리가 /tmp/share_on_guest( /tmp다른 것들을 위해 시스템에서 사용하고 특별한 권한을 가지고 있기 때문에 디렉토리를 마운트하지 않는 것이 좋습니다) 루트가 소유하고 있음을 알 수 있습니다. 여기에서 chown컨테이너에서 사용하여 소유권을 컨테이너의 적절한 사용자 uidgid사용자 로 변경할 수 있습니다 .

참고로 컨테이너의 소유권을 예를 들어 uid33 명의 사용자로 변경 한 후에 는 호스트에 uid100033이 있음을 알 수 있습니다.


그것이 내 설정인지 확실하지 않지만 LXD v3.0.3 LTS (Ubuntu 18.04 LTS) /var/lib/lxd/containers를 사용하면 그 안에 있는 심볼릭 링크 만 찾지 못했습니다 /var/lib/lxd/storage-pools/lxd/containers(이 경우 마지막 lxd비트는 내 ZFS 스토리지 풀의 이름입니다). 거기에있는 모든 컨테이너는 실행시 동일한 165536 uid / gid를 가지고 있었고 root:root꺼져있을 때 소유했습니다 .
deoren

1
나는 이것이 오래된 질문 + 답변이라는 것을 알고 있지만 우분투 18.04에서는 어떤 권한도 엉망으로 만들 필요가 없었습니다. 폴더를 추가하면 lxc config매력처럼 작동합니다!
아파치

4

이 질문에 대한 업데이트 된 답변입니다.

컨테이너 /var/www와 같이 호스트 폴더 를 마운트하십시오 /var/test.

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

Ask Ubuntu에 오신 것을 환영합니다! 이를 수행하는 방법에 대한 특정 세부 사항으로 확장 하려면 이 답변을 편집 하는 것이 좋습니다 . ( AskUbuntu에서 어떤 종류의 답변이 가장 가치있는 것으로 간주되는지에 대한 일반적인 조언은 좋은 답변을 작성하는 방법 도 참조하십시오 .)
David Foerster

3

컨테이너에 추가 장치 를 할당 할 수 있으며 이러한 장치는 호스트 액세스 가능 폴더 일 수 있습니다.

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

참고 <device> 다음 장치 관리를위한 ID로 사용됩니다 당신이 할당하는 것이 단지 임의의 이름입니다.

예를 들어, 컨테이너에 호스트 폴더 "./host"를 "/ mnt / host"로 마운트하려면 ...

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

한 가지 문제가 남아있다 -이 폴더는 호스트와 용기 모두 쓰기 권한을하려는 경우, 소유권과 권한이 적절하게 구성해야합니다. 이는 사용자 및 그룹 id값 의 숫자 범위를 가상화하는 LXD의 기본 모드로 인해 복잡 합니다. 그러나 쉬운 해결책 이 있습니다. 호스트와 동등한 권한으로 실행되도록 컨테이너를 구성 하여이 가상화를 우회하십시오 ...

lxc config set <container> security.privileged true

이 접근 방식의 전체 호스트 보안 영향은 현재 명확하지 않지만 가상화에 의해 다소 "포함 된"것 같습니다. 실제 위험은 컨테이너를 어떻게 어떻게 사용할 지에 달려 있습니다. 기술 노트 참조https://insights.ubuntu.com/2017/06/15/custom-user-mappings-in-lxd-containers 참조

또한이 접근 방식은 일반적으로 컨테이너에서 루트가 아닌 사용자로 컨테이너에서 작업하는 경우 가장 효과적입니다.

lxc exec zesty -- su --login ubuntu

루트가 아닌 로그인에 문제가 있습니다 . env특히 다릅니다 http_proxy. 해결 방법 예 : sudo http_proxy=http://[fe80::1%eth0]:13128 apt-get update.
nobar

이에 관해서는 http_proxy, 더 쉬운 해결책은 여기 에서 논의 된 것처럼 IPV4를 가능하게하는 것입니다 .
nobar

... 다음 sudo dhclient용기에 - 또는 변경 manualdhcp에서 50-cloud-init.cfg. 여기에 좋은 단서가 있습니다 : github.com/lxc/lxd/issues/1298
nobar

1
이것은 특허 적으로 나쁜 생각입니다. 권한있는 컨테이너로 전환 할 것을 권장하면 LXD가 가져 왔던 발전 중 하나가 파괴됩니다. LXC 1.x는 권한이없는 컨테이너를 사용할 수있는 가능성을 제공했지만 (루트로도), 세부 사항을 정리하는 것이 좀 더 복잡했습니다. LXD와 함께라면 이것은 이제 과거의 일입니다. 또한 호스트 측 UID에 필요한 액세스를 허용 하거나 여기에 설명 된 방법 을 사용하기 위해 일부 폴더에서 ACL을 설정하는 것이 너무 복잡 합니까? 예, UID / GID 매핑이 유일한 방법은 아닙니다!
0xC0000022L

1

ph0t0nix탁월한 답변을 바탕으로 Ubuntu 18.04 서버에 대해 다음과 같은 단계별 접근 방식을 제안합니다.

  1. 호스트에서 rootfs 소유자의 UID를 결정하십시오.

    sudo ls -l /var/lib/lxd/storage-pools/lxd/containers/webserver/rootfs  
    id -u root    100000
  2. 컨테이너에서 우분투의 UID를 결정하십시오 (즉 컨테이너의 사용자).

    id -u ubuntu    1000
  3. 호스트에서 공유 폴더를 작성하고 컨테이너에 추가하십시오.

    lxc config device add webserver mydevicename disk path=/home/share_on_guest source=/home/share_on_host
  4. 공유 폴더의 호스트 UID에서 조정합니다 (UID = UID 호스트 + UID 게스트).

    sudo chown 101000:101000 /home/share_on_host
  5. 게스트 (사용자 우분투)는 이제 공유 폴더에 액세스 할 수 있으며 컨테이너 액세스 내에서을 사용하여 공유 폴더에 대한 액세스를 조정할 수 있습니다 chmod.


0

이제 컨테이너와 호스트에서 UID와 GID 간의 매핑을 처리하기 위해 LXD 프로필을 사용하여이 문제에 대한 안전하고 효과적인 솔루션을 얻었습니다.

매우 유용한 요지가 여기에 있습니다.

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


5
세상에 쓸 수있는 것을 만드는 것은 보통 보안 관점에서 나쁜 생각입니다. 호스트 경로에서 POSIX ACL을 사용하여 해당 uid에 대한 특정 ACL을 추가하여 컨테이너 사용자에게 액세스 권한을 부여한 다음 쓰기 액세스가 필요한 다른 호스트 사용자에 대한 액세스 권한을 부여해야합니다.
stgraber

1
@stgraber 당신이 말한 것에 동의하는 동안 어떻게 설정 해야할지 모르겠습니다. 일부 링크가 도움이 될 것입니다.
s3v3n

0777명백한 이유없이 일명“Please-hack-my-system-and-destroy-my-data”권한을 권장하지 마십시오 ! (그룹) 소유권 변경과 같은보다 현명한 수정으로 피할 수 있기 때문에 그 이유는 거의 없습니다. -1
David Foerster '

나는 당신의 요점을 취하지 만 다른 방법이없는 한 단일 사용자 개발 시스템의 임시 해결 방법으로 만 사용했습니다. 그때부터 프로파일을 사용하는 것이 이것을 처리하는 방법이라는 것을 알게되었습니다. 위의 편집 된 답변을 참조하십시오!
user47227

1
ACL이나 여기에 설명방법을 사용하는 것이 어려운 이유는 무엇입니까 ?
0xC0000022L
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.