인스턴스를 한 번 이상 실행한 후 일부 기존 LXC 템플릿을 기반으로 사용자 지정 템플릿 생성

인스턴스를 한 번 이상 실행한 후 일부 기존 LXC 템플릿을 기반으로 사용자 지정 템플릿 생성

(점에 유의하시기 바랍니다이 질문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의 두 번째 접근 방식을 찾을 수 있습니다.

수동으로 이미지 구축

자신만의 이미지를 구축하는 것도 매우 간단합니다.

  1. 컨테이너 파일 시스템을 생성합니다. 이는 전적으로 사용 중인 배포판에 따라 다릅니다. Ubuntu와 Debian의 경우 debootstrap을 사용합니다.
  2. 컨테이너에서 배포가 제대로 작동하는 데 필요한 모든 항목을 구성합니다(필요한 경우).
  3. 해당 컨테이너 파일 시스템의 타르볼을 만들고 선택적으로 압축합니다.
  4. 위에서 설명한 내용을 기반으로 새 메타데이터.yaml 파일을 작성합니다.
  5. 해당 메타데이터.yaml 파일을 포함하는 또 다른 tarball을 만듭니다.
  6. 다음을 사용하여 두 개의 타르볼을 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 콘솔 프런트엔드(둘 다 통합)

LXD 및 LXC용 Distrobuilder 메뉴


그것은 다음과 같습니다유사한 방법론Hashicorp Packer에 적용하고 레이어로 템플릿을 구축합니다.

  1. base템플릿 을 재정의하고 사용자 정의 및 기타 사용자 정의를 standard포함하는 이미지를 만듭니다.shell
  2. 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 이미지를 만드는 데 사용합니다.rootlesslxd (작성 ​​시점에는 아직)


  • 그만큼읽어보기이제 꽤 완성됐어

  • 우분투의 LXD와 새로운incus포크는 모두 이미지 구축에 지원됩니다.

  • 참조종속성에 필요합니다 dbmenu. ~ 안에2023년 10월최신 템플릿 형식을 작성하려면 최신 git버전이 필요합니다.distrobuilder

  • 내부적으로는 dbmenuMike Farah를 사용하여 템플릿을 함께 yq병합하고 있습니다 yaml( yq& distrobuilder는 둘 다 작성되었으므로 Go둘 다 동일한 기본 yaml라이브러리를 사용하고 있습니다).

  • 병합을 사용하는 데 문제가 있었습니다. 읽기를 위해 구성을 매우 빠르게 PyYaml읽고 씁니다.yamlyaml.CSafeLoader

  • dbmenu설치는 다음과 같이 간단합니다.

  • pipx install distrobuilder-menu(pypi - 최신 릴리스)

  • pipx install git+https://github.com/itoffshore/distrobuilder-menu.git(github 최신 dev/릴리스)

관련 정보