인스턴스를 한 번 이상 실행한 후 일부 기존 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 파일이 포함된 또 다른 타르볼을 생성합니다.
  6. 다음 명령을 사용하여 이 두 개의 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 콘솔 프런트엔드(둘 다 포함)

LXD 및 LXC용 Distro 메뉴


그것은 다음을 따른다유사한 방법Hashicorp Packer로 이동하여 템플릿을 레이어로 구축하세요.

  1. base오버레이 standard템플릿을 만들고 사용자 shell정의 이미지와 기타 사용자 정의 이미지를 포함하세요.
  2. custom웹 서비스 등을 사용하여 이미지 오버레이를 생성하여 이미지를 오버레이합니다 (예: base이미지 생성 시 base이미지 템플릿을 템플릿으로 사용).SOURCE맞춤 템플릿사용자 정의 서비스로 /cloud-init 구성을 재정의합니다.)

나는 dbmenu권한이 없는 LXD 컨테이너를 구축하고 다음을 생성하기 위한 예제 구성을 추가(및 패키징)했습니다.

  • base일부 사용자 정의가 포함된 Alpine Linux/Ubuntu 이미지
  • Alpine Linux 빌드 환경 alpine-sdk(& cloud-init첫 번째 부팅 시 제거됨)
  • 처음 시작할 때 Gitlab의 Ubuntu 컨테이너 설치(cloud-init를 통해)

나는 또한 내부에서 podman/docker를 실행하는 데 적합한 Ubuntu 이미지를 dbmenu생성하는 데 사용했습니다 (이 글을 쓰는 시점에는rootlesslxd)


  • 이것읽어보기 파일이제 꽤 완성됐어

  • Ubuntu 및 신규용 LXDincus포크는 이미지 구축을 지원합니다.

  • 보다종속성dbmenu니드인2023년 10월최신 템플릿 형식을 구축 git하려면 최신 버전이 필요합니다.distrobuilder

  • 뒤에서는 dbmenuMike Farah를 사용하여 템플릿을 함께 병합합니다( yq& 는 모두 동일한 기본 라이브러리로 작성되므로 둘 다 동일한 기본 라이브러리를 사용합니다).yamlyqdistrobuilderGoyaml

  • 병합을 사용하면 문제가 발생합니다. 구성을 매우 빠르게 PyYaml읽고 씁니다.yamlyaml.CSafeLoader

  • dbmenu설치는 매우 간단합니다.

  • pipx install distrobuilder-menu(pypi - 최신 버전)

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

관련 정보