(점에 유의하시기 바랍니다이 질문LXC 1.x에 관한 반면이 하나LXC 2.x/LXD에 관한 것입니다)
나는 이에 대한 답변을 찾기 위해 웹을 샅샅이 뒤졌으나 합리적으로 해킹이 아닌 답변을 찾을 수 없었습니다.
내가 찾고 있는 것은 내가 원하는 방식으로 기존 템플릿을 만드는 접근 방식입니다. 특히 제가 원하는 것은 루트 FS를 다양하게 변경하고 구성을 추가/변경하여 업스트림 Ubuntu 클라우드 이미지를 사용자 정의하는 것입니다.
따라서 현재 접근 방식은 내가 작성한 스크립트를 실행 lxc launch ubuntu:lts CONTAINER
하여 lxc exec CONTAINER -- ...
(컨테이너에 푸시한 후) 사용자 지정을 수행하는 것입니다.
이 접근 방식을 사용하여 얻은 것은 합리적으로 사용자 정의된 컨테이너입니다. 아아, 문제가 있습니다. 이 시점의 컨테이너는 에 의해 프라이밍되었으며 cloud-init
이미지/템플릿이 아닌 컨테이너 인스턴스입니다.
그래서 저는 지금 헤매고 있습니다. 필요한 것은 내 컨테이너를 이미지로 다시 전환하고(를 사용하여 수행 가능해야 함 lxc publish
) 변경 사항을 실행 취소 cloud-init
하거나 적어도 cloud-init
다시 "콕"하여 다음에 이미지가 소스로 사용될 때 트리거되도록 하는 것입니다 lxc init
. lxc launch
. 아니면 업스트림 이미지에서 cloud-init
완전히 비활성화할 수 있는 방법이 있을까요 ?lxc launch
권위있는 방법이 있습니까? 각종 서류를 샅샅히 살펴봤음에도 불구하고LXD 저장소의 마크다운 문서Stéphane Graber(LXD 프로젝트 리더)의 블로그 시리즈도 있습니다.특히 [5/12], 적절한 접근 방식을 찾지 못했습니다. 어쩌면 제가 놓쳤을 수도 있습니다. 즉, 제가 필요한 것을 설명하는 문서를 알고 계시다면 기꺼이 더 많은 문서를 읽어보실 것입니다.
사용된 LXC 버전은 2.20입니다(즉, 저는 LXD 프런트엔드를 사용하고 있습니다).
답변1
링크된 곳에서페이지 [5/12]Stéphane Graber의 두 번째 접근 방식을 찾을 수 있습니다.
수동으로 이미지 구축
자신만의 이미지를 구축하는 것도 매우 간단합니다.
- 컨테이너 파일 시스템을 생성합니다. 이는 전적으로 사용 중인 배포판에 따라 다릅니다. Ubuntu와 Debian의 경우 debootstrap을 사용합니다.
- 컨테이너에서 배포가 제대로 작동하는 데 필요한 모든 항목을 구성합니다(필요한 경우).
- 해당 컨테이너 파일 시스템의 타르볼을 만들고 선택적으로 압축합니다.
- 위에서 설명한 내용을 기반으로 새 메타데이터.yaml 파일을 작성합니다.
- 해당 메타데이터.yaml 파일을 포함하는 또 다른 tarball을 만듭니다.
- 다음을 사용하여 두 개의 타르볼을 LXD 이미지로 가져옵니다.
이렇게 하면 이미지를 게시하기 전에 컨테이너를 시작할 필요가 없습니다. 기존 이미지로 시작할 수 있습니다.
$ lxc image copy ubuntu:16.04/amd64 local: --alias ubuntu
$ mkdir export-directory
$ lxc image export ubuntu export-directory
$ cd export-directory
$ ls
5f364e2e3f460773a79e9bec2edb5e993d236f035f70267923d43ab22ae3bb62.squashfs
meta-5f364e2e3f460773a79e9bec2edb5e993d236f035f70267923d43ab22ae3bb62.tar.xz
$ mkdir meta squashfs
$ tar -xf *.tar.xz -D meta
$ sudo unsquashfs -f -d squash/ *squashfs
이제 파일을 조정하거나 심지어 스쿼시 디렉터리로 루트를 이동할 수도 있습니다. 그런 다음 두 디렉토리를 모두 tar하고 다음을 사용하여 조정된 이미지를 가져올 수 있습니다.
lxc image import <metadata tarball> <rootfs tarball> --alias my-adjusted-image
답변2
건축을 위한 주요 도구lxd
건물 / lxc
이미지를디스트로빌더
이미지를 구성하는 현대적인 방법은클라우드 초기화
LXD/LXC 이미지를 사용자 정의하기 위해 다음과 같이 작성했습니다.
Distrobuilder에 대한 Python 콘솔 프런트엔드(둘 다 통합)
그것은 다음과 같습니다유사한 방법론Hashicorp Packer에 적용하고 레이어로 템플릿을 구축합니다.
base
템플릿 을 재정의하고 사용자 정의 및 기타 사용자 정의를standard
포함하는 이미지를 만듭니다.shell
custom
이미지 를 재정의하는 웹 서비스 등으로 이미지 재정의를 만듭니다base
. 즉,base
이미지 템플릿을SOURCE
를 생성할 때맞춤 템플릿사용자 정의 서비스 재정의/cloud-init 구성 사용)
권한이 없는 LXD 컨테이너를 구축하는 데 사용 dbmenu
하고 다음을 생성하기 위한 예제 구성을 추가(및 패키지)했습니다.
base
몇 가지 사용자 정의가 포함된 Alpine Linux/Ubuntu 이미지alpine-sdk
(&가cloud-init
처음 부팅 시 제거됨) 이 포함된 Alpine Linux 빌드 환경- 처음 부팅할 때 Gitlab을 설치하는 Ubuntu 컨테이너(cloud-init를 통해)
또한 내부에서 podman/docker를 dbmenu
실행하는 데 적합한 Ubuntu 이미지를 만드는 데 사용합니다.rootless
lxd
(작성 시점에는 아직예)
그만큼읽어보기이제 꽤 완성됐어
우분투의 LXD와 새로운
incus
포크는 모두 이미지 구축에 지원됩니다.참조종속성에 필요합니다
dbmenu
. ~ 안에2023년 10월최신 템플릿 형식을 작성하려면 최신git
버전이 필요합니다.distrobuilder
내부적으로는
dbmenu
Mike Farah를 사용하여 템플릿을 함께yq
병합하고 있습니다yaml
(yq
&distrobuilder
는 둘 다 작성되었으므로Go
둘 다 동일한 기본yaml
라이브러리를 사용하고 있습니다).병합을 사용하는 데 문제가 있었습니다. 읽기를 위해 구성을 매우 빠르게
PyYaml
읽고 씁니다.yaml
yaml.CSafeLoader
dbmenu
설치는 다음과 같이 간단합니다.pipx install distrobuilder-menu
(pypi - 최신 릴리스)pipx install git+https://github.com/itoffshore/distrobuilder-menu.git
(github 최신dev
/릴리스)