(참고하세요이 문제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 구성을 재정의합니다.)
나는 dbmenu
권한이 없는 LXD 컨테이너를 구축하고 다음을 생성하기 위한 예제 구성을 추가(및 패키징)했습니다.
base
일부 사용자 정의가 포함된 Alpine Linux/Ubuntu 이미지- Alpine Linux 빌드 환경
alpine-sdk
(&cloud-init
첫 번째 부팅 시 제거됨) - 처음 시작할 때 Gitlab의 Ubuntu 컨테이너 설치(cloud-init를 통해)
나는 또한 내부에서 podman/docker를 실행하는 데 적합한 Ubuntu 이미지를 dbmenu
생성하는 데 사용했습니다 (이 글을 쓰는 시점에는rootless
lxd
예)
이것읽어보기 파일이제 꽤 완성됐어
Ubuntu 및 신규용 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
/릴리스)