LXC 컨테이너와 호스트간에 디렉토리를 공유하려면 어떻게합니까?


15

호스트 시스템 (ubuntu 14.04)과 우분투 lxc 컨테이너간에 폴더를 공유하려면 어떻게해야합니까?

호스트에 폴더를 마운트하려고했습니다.

sudo mount --bind /media/data/share /media/data/container/name/rootfs/share

하지만 파일이 보이지 않습니다.

동일하다 :

sudo ln -s /media/data/share /media/data/container/name/rootfs/share

공유 폴더에 대한 권한을 변경해야합니까?

답변:


13

LXC 문서 에 따르면 권한있는 컨테이너를 통해이를 수행 할 수 있습니다.

lxc launch ubuntu priv -c security.privileged=true
lxc config device add priv homedir disk source=/home/$USER path=/home/ubuntu

LXC가 아니라 LXD 문서입니다. LXD를 설치하지 않으면 lxc 명령이 작동하지 않습니다.
Sam Bull

@SamBull은 LXC / LXD 팀이 자체적으로 감염시킵니다. LXC는 lxd이 답변에 사용 된 liblxc (기본 라이브러리) 또는 LXD 클라이언트 (이름이 지정된 ) 또는 LXC ( lxc-*이름 이 지정된 도구가 있는 소프트웨어 및 "이전"툴셋 ) 또는 프로젝트 (여기서 LXC)를 참조하는 데 사용할 수 있습니다. LinuX 컨테이너의 약자). 이것이 제가 Unix.SE 메타 에서이 질문 을 한 이유 입니다.
0xC0000022L

12

openSUSE 위키에서 기사를 찾았습니다 : https://en.opensuse.org/User:Tsu2/LXC_mount_shared_directory

나는 단계를 밟았으며 지금은 효과가 있습니다.

호스트 디렉토리를 작성하십시오.

mkdir /media/data/share && chmod 7777 /media/data/share

lxc 컨테이너에 디렉토리를 만듭니다 :

mkdir /share

호스트에서 lxc 구성 파일을 편집하십시오.

nano /var/lib/lxc/containername/config
lxc.mount.entry = /media/data/share share none ro,bind 0.0

해당 마운트 항목을 읽기 전용으로 정의한 이유가 있습니까? 컨테이너가 공유 파일 시스템에 데이터를 다시 쓰는 것을 피하는 좋은 보안 관행입니까?
jgomo3

1
나를 위해 일했다. share에서 사용되는 상대 경로 lxc.mount.entry는 매우 중요합니다.
HRJ

1
'bind'다음에 ', create = dir'을 추가하면 마운트 지점을 만들 필요가 없습니다. 나는 또한 'ro'부분을 제거했으며 제대로 작동하는 것 같습니다.
Sam Bull

4

아래는 호스트 디렉토리 중 하나를 컨테이너에 마운트하기 위해 수행 한 작업입니다. 우리가 달성하고 싶기 때문에 이것은 소리보다 까다 롭습니다.

  • 컨테이너 내부에서 디렉토리에 쓸 수 있어야합니다.
  • 컨테이너 외부에서 컨테이너 내부에 생성 된 파일과 디렉토리에 쓸 수 있어야합니다.

다양한 기사를 온라인으로 읽은 후 (가장 유용한 기사는 이 github 문제입니다 ) 다음은이를 해결하는 방법입니다. 트릭은 호스트 사용자의 uid와 gid를 컨테이너 내 사용자의 uid와 gid에 매핑하는 것입니다.

/home/breakds/projects컨테이너의 동일한 위치에 마운트한다고 가정 해보십시오 . 외부 디렉토리는 breakdsuid와 gid가 있는 사용자가 소유합니다 1000.

그런 다음 컨테이너라는 사용자를 만들었습니다. debian그의 uid와 gid도 1000루트 사용자가 아니기 때문에 발생했습니다. 그런 다음 호스트에서 (lxc) 프로파일을 작성합니다.

lxc profile edit breakds

그리고 아래는 프로파일의 내용입니다 (yaml 형식이라고 생각합니다).

name: breakds
config:
    raw.lxc: |
        lxc.id_map =
        lxc.id_map = u 0 165536 999
        lxc.id_map = g 0 165536 999
        lxc.id_map = u 1000 1000 1
        lxc.id_map = g 1000 1000 1
        lxc.id_map = u 1001 166537 64535
        lxc.id_map = g 1001 166537 64535
    user.vendor-data: |
        packages:
            - bash
description: allow home dir mounting for breakds
devices:
eth0:
    name: eth0
    nictype: bridged
    parent: lxdbr0
    type: nic
projects:
    path: /home/breakds/projects
    source: /home/debian/projects
    type: disk

그런 다음이 프로파일을 해당 컨테이너에 영구적으로 적용하십시오.

$ lxc profile apply <my container> breakds

이것은 트릭을해야합니다.

참고 :이 프로파일로 전환하기 전에 소유자 / 그룹이 debian 인 모든 디렉토리 나 파일을 삭제해야합니다 (그리고 전환 후에 다시 생성해야 함). 이는 uid 및 gid 매핑 후 소유권이 유효하지 않기 때문입니다. 원래 1000 ~ 1000을 매핑 한 이후로 모든 것이 잘되어야한다고 생각했지만 여기에 뭔가 빠진 것으로 생각되며 해킹 없이이 문제를 해결하는 방법에 대한 조언을 얻을 수 있다면 좋을 것입니다.


그러나 당신은 항상 chown호스트에서 할 수 있습니다 .
iBug

1

LXC 구성 파일을 직접 편집하여 LXD없이이 작업을 수행 할 수도 있습니다.

# Container specific configuration
lxc.idmap = u 0 165536 1000
lxc.idmap = g 0 165536 1000
lxc.idmap = u 1000 1000 1
lxc.idmap = g 1000 1000 1
lxc.idmap = u 1001 166536 64535
lxc.idmap = g 1001 166536 64535

또한 / etc / subuid 및 / etc / subgid를 편집하여 컨테이너의 사용자 계정에 호스트의 uid / gid 1000에 매핑 할 수있는 권한이 부여되어 있는지 확인해야합니다.

containeruser:165536:65536
containeruser:1000:1

어떤 시스템 프로세스 / 만들기 / etc / subuid? Openwrt에는 없습니다.
mcr
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.