virt-clone과 virt-sysprep를 사용하여 Virt-Manager에서 VM 복제하기
VM 복제는 바이트를 복제할 뿐, 아이덴티티를 복제하지 않습니다.
Virt-Manager (libvirt GUI)은 KVM 디스크를 복사하고 클론에 UUID와 MAC 주소를 할당합니다. 게스트는 machine-id와 SSH 호스트 키를 유지하며, virt-sysprep가 이를 정리할 때까지 그대로 두게 됩니다.
이 안내서에는 Ubuntu 26.04 게스트와 /mnt/extra2/vms에 저장된 14 GB qcow2 이미지가 사용됩니다. 디스크 명령어는 다른 Linux 게스트에서도 동일하게 적용됩니다. virt-sysprep는 Windows 게스트에 대해 작동하지 않습니다.

호스트에는 이미 KVM과 libvirt가 설치되어 있어야 합니다. Ubuntu 24.04에 KVM 설치하기는 이러한 설정을 수행하는 것이며, virtinst를 함께 설치하여 virt-clone을 제공합니다. virt-sysprep, virt-customize, virt-cat, guestfish는 별도의 패키지에서 제공됩니다:
sudo apt install -y libguestfs-tools
VM을 실제로 클로닝하는 도구
libvirt는 이 작업을 세 가지 도구로 나누어 처리합니다. virt-clone은 디스크 이미지를 복사하고 동일한 가상 하드웨어를 가진 새 도메인을 정의합니다. 도메인 이름, UUID, 호스트 측 MAC 주소를 변경합니다. 비밀번호, 호스트 이름, 정적 주소, 게스트 내부 파일은 변경되지 않으며, 이는 virt-clone(1) 매뉴얼에 명시된 동작입니다.
virt-sysprep는 libguestfs로 디스크를 열어 게스트 파일 시스템을 편집합니다. virt-sysprep(1) 매뉴얼은 편집이 원 위치(in-place)라고 명확히 설명합니다. 출력 파일 플래그가 없으므로 -a에 전달하는 이미지가 변경되는 이미지입니다. 소스가 더 필요하면 먼저 복사하거나 클로닝해야 합니다.
qemu-img info는 해당 파일이 독립적인지Backing 체인의 최상위인지 보고합니다. qemu-img convert는 체인을 해결한 새로운 파일을 작성합니다.
Backing line이 존재하면 sysprep 전에 플랫닝(flat)을 수행하십시오. 복본에 sysprep을 적용한 후, 각 실행 중인 게스트를 해당 파일에서 파생하십시오.
Virt-Manager에서 디스크 클로닝
게스트를 종료하십시오. virt-clone은 실행 중인 도메인을 거부하며, 라이브 qcow2의 복사는 일관된 파일 시스템이 아닙니다.
Virt-Manager에서 게스트를 마우스 오른쪽 버튼으로 클릭하고 **Clone(클론)**을 선택하십시오. 새 이름을 설정하십시오. 스토리지 단계에서 각 디스크에 새로운 경로를 지정하십시오. 원래 경로를 그대로 두면 동일한 파일을 여는 두 번째 도메인이 정의되므로, 두 게스트가 동일한 블록을 작성하게 됩니다.
새 파일은 소스 옆에 배치됩니다. 기본 풀은 /var/lib/libvirt/images/를 사용합니다. /mnt/extra2/vms에 이미 존재하는 디스크는 해당 디렉터리로 클로닝됩니다. virt-clone이 출력하는 경로를 기록하거나 읽기:
virsh domblklist ubuntu26.04-base14gb-clone
명령줄 상에서는, 이름과 디스크 경로를 명시적으로 선택하여 다음과 같이 실행합니다:
virt-clone --original ubuntu26.04-base14gb \
--name ubuntu26.04-base14gb-clone \
--file /mnt/extra2/vms/ubuntu26.04-base14gb-clone.qcow2
--auto-clone은 이름과 디스크 경로를 자동으로 생성합니다. 일회성 복사에 편리합니다. --name과 --file을 직접 전달하면 템플릿 경로를 관리하기가 더 쉽습니다. --mac을 생략하거나 --mac RANDOM을 전달하면 virt-clone은 QEMU 범위 52:54:00:xx:xx:xx에서 주소를 생성합니다.
--reflink는 경량 복사를 요청합니다. Ubuntu 26.04 virt-clone 매뉴얼은 이 플래그를 동일한 btrfs 파일 시스템의 raw 이미지로 제한하므로, 이 qcow2 파일은 건너뜁니다. qcow2 오버레이는 별도의 설정이며, 아래에서 qemu-img create -b와 함께 다룹니다.
클론에 backing file이 있는가?
독립적인 것으로 취급하기 전에 새 디스크에서 다음을 실행하십시오:
qemu-img info --backing-chain /mnt/extra2/vms/ubuntu26.04-base14gb-clone.qcow2
독립적 이미지에는 file format, virtual size, disk size가 나열됩니다. 오버레이에는 backing file: 줄도 나열되며, 이를 통해 읽는 이미지를 가리킵니다. virtual size는 게스트의 디스크 크기이며, 여기서는 약 14 GB입니다. disk size는 파일이 현재 차지하는 공간이며, 새 오버레이의 경우 작고 게스트가 작성할수록 증가합니다.
virt-clone은 해당 줄의 일반적인 원인이 아닙니다. 오버레이는 qemu-img create -b, 디스크 전용 스냅샷, 또는 고의로 qcow2 델타를 만든 도구에서 비롯됩니다. info 체크는 이러한 경우를 전체 복사와 구분하는 데 도움이 됩니다.
기본 이미지가 제자리에 남아 다시 쓰이지 않을 경우에만 오버레이를 유지하십시오. 클론의 모든 쓰기는 작은 파일에 기록되고, 오버레이에 없는 읽기는 기본 이미지에서 가져옵니다. 기본 이미지를 이동하거나 편집하면 해당 이름을 지정한 모든 게스트가 손상됩니다.
독립적 파일을 만들려면 오버레이를 변환하십시오. -p는 진행 상황을 출력합니다. 대상은 새 파일이며, 오버레이와 기본 이미지는 그대로 유지됩니다:
qemu-img convert -p -O qcow2 \
/mnt/extra2/vms/ubuntu26.04-base14gb-clone.qcow2 \
/mnt/extra2/vms/ubuntu26.04-base14gb-flat.qcow2
플랫 파일에서 qemu-img info를 실행하여 backing file: 줄이 없음을 확인하십시오. 템플릿은 이러한 독립적 파일입니다. 오버레이는 나중에 이러한 파일에서 게스트를 찍어낼 방법이며, 템플릿 자체는 아닙니다.
btrfs reflink는 세 번째 경우입니다. cp --reflink=auto는 두 파일 간 물리적 블록(extents)을 공유할 수 있으며, qemu-img info는 backing file이 없는 것으로 표시됩니다. 각 경로가 완전한 이미지이기 때문입니다. 파일 시스템이 모든 블록을 복제하지 않았더라도, 이러한 복사는 qcow2 레이어에서 독립적입니다.
virt-sysprep: 아이덴티티 초기화
독립적 이미지를 복사한 후, 복본에 sysprep을 적용하십시오. --reflink=auto는 파일 시스템이 지원할 경우 블록을 공유하고, 그렇지 않으면 ext4 포함 일반 복사를 수행합니다. -n은 기록을 폐기하는 dry run입니다:
cp --reflink=auto \
/mnt/extra2/vms/ubuntu26.04-base14gb-flat.qcow2 \
/mnt/extra2/vms/ubuntu26.04-base14gb-clean.qcow2
virt-sysprep -n -a /mnt/extra2/vms/ubuntu26.04-base14gb-clean.qcow2
virt-sysprep -a /mnt/extra2/vms/ubuntu26.04-base14gb-clean.qcow2 \
--hostname ubuntu-template
기본 Ubuntu 풀에서 이미지는 주로 mode 0600이며 libvirt-qemu 소유입니다. 매뉴얼은 root로 실행하기보다 자신의 사용자에게 쓰기 액세스 권한을 부여하는 것을 권장합니다. qemu 사용자가 파일 소유자인 경우, sudo virt-sysprep -a ...가 이를 열 수 있는 호출 방식입니다. 게스트는 종료 상태여야 하며, 다른 어떤 프로세스도 이미지를 열어선 안 됩니다.
--hostname은 customize 옵션이며, customize는 기본 작업 집합의 일부이므로 같은 호출에서 실행됩니다. /etc/hostname만 단독으로 지우는 별도의 기본 작업은 없습니다. --operations는 전달 시 기본 집합을 대체하며, --operations defaults,-ssh-userdir은 기본값을 유지하고 하나의 작업을 끕니다.
다음은 클론이 원래와 충돌하는지 여부를 결정하는 작업들입니다. 목록은 최신 virt-sysprep 매뉴얼에 있는 것으로, 짧은 --operations 목록이 나머지를 은밀하게 제거할 수 있으므로 읽어볼 가치가 있습니다:
| Operation | Default | Effect on the guest |
|---|---|---|
| machine-id | yes | machine ID를 지웁니다. /etc/machine-id가 비어 있으면 다음 부팅 시 systemd가 새로 생성합니다. |
| ssh-hostkeys | yes | /etc/ssh/ssh_host_*를 제거합니다. 다음 부팅 시 새 호스트 키가 생성됩니다. |
| ssh-userdir | yes | /root와 /home/* 하위의 .ssh를 제거하며, 게스트에 저장된 authorized_keys 및 개인 키를 포함합니다. |
| dhcp-client-state | yes | DHCP 클라이언트 리스를 제거합니다. |
| udev-persistent-net | yes | eth0과 같은 고정 이름에 옛 MAC을 매핑하는 udev 규칙을 제거합니다. |
| net-hwaddr | yes | Fedora 및 RHEL ifcfg-* 파일의 HWADDR을 제거합니다. Ubuntu netplan은 편집하지 않습니다. |
| lvm-uuids, lvm-system-devices | yes | 새 LVM UUID를 할당하고 /etc/lvm/devices/system.devices를 제거합니다. 이 파일은 게스트를 소스 디스크의 WWID에 고정시키게 됩니다. |
| logfiles, bash-history, tmp-files | yes | 로그, 셸 히스토리, 임시 파일을 제거합니다. |
ssh-userdir은 아직 로그인 중인 머신을 클로닝하는 사람이 놀라게 되는 작업입니다. 템플릿은 소스의 개인 키를 유지해서는 안 되므로, 이 작업을 켜 두었다가 나중에 인스턴스마다 키를 주입하십시오. 기존 authorized_keys를 유지해야 하는 일회성 복사인 경우, --operations defaults,-ssh-userdir을 전달하십시오.
user-account는 기본 집합에 없으며, --password나 --root-password를 전달하지 않는 한 비밀번호는 유지됩니다. fs-uuids도 기본적으로 꺼져 있습니다. 매뉴얼은 /etc/fstab을 포함해 모든 참조를 업데이트하지 않으며, 활성화 시 게스트가 부팅 불가능해질 가능성이 높다고 명시합니다.
Ubuntu Server 이미지는 보통 cloud-init을 가지며, virt-sysprep에는 cloud-init 작업이 없습니다. /var/lib/cloud의 오래된 instance id는 클론이 첫 부팅 설정을 건너뛰게 만듭니다. 템플릿에서 이를 정리하고, cloud-init이 --hostname이 쓴 호스트 이름을 유지하도록 지정하십시오:
virt-customize -a /mnt/extra2/vms/ubuntu26.04-base14gb-clean.qcow2 \
--run-command 'if command -v cloud-init >/dev/null 2>&1; then cloud-init clean --logs --seed; fi' \
--write '/etc/cloud/cloud.cfg.d/99-preserve-hostname.cfg:preserve_hostname: true'
동일한 매뉴얼은 내부 전체 디스크 암호화를 사용하는 게스트를 배포용으로 클로닝하는 것을 경고합니다. 모든 복사가 볼륨 키를 공유하기 때문입니다. 또한 삭제된 파일은 unlink만 되고 scrub는 되지 않는다고 명시합니다. --scrub은 지정된 파일을 덮어쓰고, virt-sparsify는 이미지에서 해제된 공간을 제거할 수 있습니다.
클론이 IP 주소를 받는 방법
virt-sysprep에는 주소를 다시 작성하는 작업이 없습니다. DHCP를 사용하던 게스트는 다시 요청합니다. 클론은 새 MAC, 빈 machine-id, 옛 리스 파일이 없으므로 libvirt의 default 네트워크 DHCP 서버는 이를 새 클라이언트로 취급합니다.
netplan의 정적 addresses: 블록은 디스크와 함께 복사되며, 두 게스트가 이를 주장하게 됩니다. 첫 부팅 전에 파일을 읽으십시오. virt-ls와 virt-cat은 일회성 도구이며, guestfish --ro -a <disk> -i는 셸과 동일한 검사입니다. 이후 ls /etc/netplan과 cat은 게스트에 대해 실행됩니다:
virt-ls -a /mnt/extra2/vms/ubuntu26.04-base14gb-clean.qcow2 /etc/netplan
virt-cat -a /mnt/extra2/vms/ubuntu26.04-base14gb-clean.qcow2 \
/etc/netplan/00-installer-config.yaml
인스톨러 이미지는 주로 00-installer-config.yaml 또는 01-netcfg.yaml을 사용합니다. 클라우드 이미지는 50-cloud-init.yaml을 사용하며, 네트워크 구성이 비활성화되지 않으면 cloud-init이 다시 생성합니다. Netplan은 디렉터리 내 모든 YAML 파일을 병합하므로, DHCP 파일을 추가해도 남은 정적 파일이 여전히 적용됩니다.
템플릿을 DHCP 클라이언트로 만들려면 해당 파일을 삭제하고 대체 파일 하나를 업로드하십시오. virt-cat이 보여준 인터페이스 이름을 사용하십시오. KVM 아래 설치된 게스트에서는 이 이름이 ens3 또는 enp1s0인 경우가 많으며, virt-clone은 동일한 가상 PCI 슬롯을 유지하므로 이름이 유효하게 유지됩니다:
cat > /tmp/99-dhcp.yaml <<'EOF'
network:
version: 2
ethernets:
ens3:
dhcp4: true
EOF
virt-customize -a /mnt/extra2/vms/ubuntu26.04-base14gb-clean.qcow2 \
--delete '/etc/netplan/*.yaml' \
--upload /tmp/99-dhcp.yaml:/etc/netplan/99-dhcp.yaml \
--write '/etc/cloud/cloud.cfg.d/99-disable-network.cfg:network: {config: disabled}'
정적 주소, 게이트웨이, DNS를 사용할 경우, Ubuntu Server에서 정적 IP 주소 변경 방법의 YAML을 사용하여 동일한 업로드를 수행하십시오. 각 인스턴스는 템플릿이 아닌 인스턴스 디스크에 적용되는 자체 파일이 필요합니다.
YAML의 이름은 게스트 내부에 존재해야 합니다. 물리적 하드웨어에서 이동한 디스크는 NIC를 enp2s0 등으로 이름 붙이는 경우가 많은데, 동일한 시스템이 virtio 아래에서는 다른 이름을 표시하며, netplan은 존재하지 않는 인터페이스를 구성하려 합니다. 여러 기계 유형에서 부팅되어야 하는 템플릿인 경우, 커널을 eth0으로 고정하고 netplan에서 해당 키를 사용하십시오. Ubuntu는 grub.cfg를 빌드하면서 /etc/default/grub.d/*.cfg를 소싱합니다:
virt-customize -a /mnt/extra2/vms/ubuntu26.04-base14gb-clean.qcow2 \
--write '/etc/default/grub.d/99-eth0.cfg:GRUB_CMDLINE_LINUX="$GRUB_CMDLINE_LINUX net.ifnames=0 biosdevname=0"' \
--run-command 'update-grub'
update-grub은 libguestfs 가전(appliance) 내에서 실행됩니다. grub-probe가 그곳에서 부팅 디스크를 볼 수 없으면 명령이 실패하고 cmdline은 변경되지 않습니다. 이 경우, netplan의 인터페이스 이름을 게스트가 이미 사용하는 이름으로 설정하고 eth0 전환을 건너뛰십시오.
virt-customize를 이용한 인스턴스별 커스터마이징
클린 파일의 복사본에서 인스턴스를 부팅하십시오. 도메인을 템플릿 자체에 지정하지 마십시오.
전체 복사는 템플릿에 대한 런타임 의존성이 없습니다:
cp --reflink=auto \
/mnt/extra2/vms/ubuntu26.04-base14gb-clean.qcow2 \
/mnt/extra2/vms/ubuntu26.04-vm1.qcow2
오버레이는 vm1이 작성한 블록만 저장합니다. -F qcow2는 기본 형식을 기록하므로 QEMU가 탐색할 필요가 없습니다:
qemu-img create -f qcow2 \
-b /mnt/extra2/vms/ubuntu26.04-base14gb-clean.qcow2 \
-F qcow2 \
/mnt/extra2/vms/ubuntu26.04-vm1.qcow2
기본 경로는 오버레이 내부에 저장됩니다. 이러한 방식으로 빌드된 모든 게스트에 대해 해당 경로를 유지하고, 읽기 전용 상태를 유지해야 합니다.
virt-sysprep 보안 노트는 각 새 디스크에 대한 두 번째 패스를 설명합니다. Sysprep은 템플릿에 랜덤 시드를 기록합니다. 이 파일에서 클론된 게스트는 동일한 시드로 시작하게 되어, 첫 부팅 시 SSH 호스트 키와 TCP 시퀀스 번호가 예측 가능해집니다. --enable customize는 시드를 다시 작성합니다. --hostname과 --ssh-inject은 customize 옵션이므로 같은 명령에 속합니다. 이미지에서 실제로 존재하는 계정으로 ubuntu를 대체하십시오:
virt-sysprep --enable customize \
-a /mnt/extra2/vms/ubuntu26.04-vm1.qcow2 \
--hostname vm1 \
--ssh-inject "ubuntu:file:${HOME}/.ssh/id_ed25519.pub"
인스턴스 파일을 libvirt에 전달하고, 템플릿을 전달하지 마십시오. 스토리지 풀 바깥에서 자신의 사용자로 생성한 경우, libvirt-qemu에게 읽기 액세스 권한이 없으면 qcow2에 대한 권한 오류로 도메인이 시작에 실패합니다.
Virt-Manager에 가져오기
각 인스턴스 디스크에 대해 Virt-Manager를 열고 **New Virtual Machine(새 가상 머신)**을 선택한 후 **Import existing disk image(기존 디스크 이미지 가져오기)**를 선택하십시오. ubuntu26.04-vm1.qcow2를 지정하십시오. 호스트의 osinfo 데이터베이스에 Ubuntu 26.04 항목이 있으면 OS 항목은 Ubuntu 26.04여야 합니다.
해당 short id는 ubuntu26.04입니다. 신뢰하기 전에 호스트 데이터베이스를 확인하십시오:
osinfo-query os | grep ubuntu26
아무것도 출력되지 않으면, 설치된 데이터베이스가 26.04 항목보다 오래되었습니다. --os-variant ubuntu24.04도 이미 설치된 게스트에 대해 virtio 친화적 기계 유형을 선택합니다. --import는 virt-install에 디스크에 이미 OS가 포함되어 있음을 알려줍니다.
sudo virt-install --name ubuntu26.04-vm1 \
--memory 4096 --vcpus 2 \
--disk path=/mnt/extra2/vms/ubuntu26.04-vm1.qcow2,format=qcow2 \
--import \
--os-variant ubuntu26.04 \
--network network=default \
--noautoconsole
--network network=default는 DHCP 리스를 발급하는 dnsmasq 인스턴스를 가진 NAT 네트워크를 연결합니다. 부팅 후:
virsh domifaddr ubuntu26.04-vm1 --source lease
virsh dumpxml ubuntu26.04-vm1 | grep "<mac"
--source lease는 해당 dnsmasq 테이블을 읽습니다. 정적 주소, 브리지, libvirt 가상 네트워크에 없는 NIC의 경우 비어 있습니다. 이러한 게스트는 이미지에서 qemu-guest-agent가 필요하고 virsh domifaddr ubuntu26.04-vm1 --source agent를 사용하거나, --source arp로 ARP 조회를 수행해야 합니다. 풀 뷰를 원할 경우 virsh net-dhcp-leases default는 NAT 네트워크의 모든 리스를 나열합니다.
클론 전략 선택: 전체 복사, 오버레이, 또는 reflink
| Strategy | Space per VM | Time to create | Constraint | Use when |
|---|---|---|---|---|
Full copy, or cp --reflink=auto |
about 14 GB logical; reflink shares blocks until they change | minutes, or near-instant with reflink | reflink needs a filesystem that supports it, such as btrfs | a guest that should outlive the template |
| qcow2 overlay | megabytes at first | seconds | base path must remain, and the base must stay read-only | many similar guests from one sealed image |
virt-clone --reflink |
raw image, shared extents | near-instant | raw disks on the same btrfs filesystem; qcow2 is skipped | raw images already stored on btrfs |
수개월간 유지할 게스트는 전체 복사 또는 reflink입니다. 짧은 수명의 게스트는 기본 파일이 실행 시점에 여전히 존재하는 한 오버레이가 될 수 있습니다. Proxmox는 자체 웹 UI에서 데이터 센터 스타일 템플릿과 클론 모델을 원하는 경우 다른 자체 호스팅 경로입니다. Multipass는 단일 사용자를 위해 Ubuntu 클라우드 이미지를 시작하고 자체적으로 cloud-init을 적용하며, 이미 설치된 디스크를 밀봉하는 것과 다른 워크플로우입니다.
트러블슈팅: 클론이 부팅되지 않을 때
주소가 없습니다. netplan 파일을 virt-cat으로 확인하고 콘솔의 ip link와 인터페이스 키를 비교하십시오. 소스 MAC으로 설정된 match: macaddress 항목은 새 NIC를 떨어뜨립니다. 게스트가 없는 인터페이스 이름을 지정한 키도 동일한 결과를 냅니다. 디스크의 파일을 수정하거나, 위의 eth0 cmdline을 적용하고 템플릿에서 인스턴스를 다시 빌드하십시오.
주소는 올라왔지만 원래와 같습니다. 정적 addresses: 블록이 netplan 파일 중 하나에 여전히 있습니다. virt-sysprep가 이를 제거하지 않았습니다. 대체 파일을 업로드하고 /etc/netplan의 다른 YAML 파일을 삭제하십시오.
SSH가 호스트 키가 변경되었다고 하거나, 클론을 원래로 받아들입니다. 도메인이 여는 파일에서 ssh-hostkeys가 실행되지 않으면 호스트 키가 공유됩니다. virsh domblklist로 도메인이 sysprep된 디스크를 사용하는지 확인하고, qemu-img info를 확인하여 게스트가 다른 경로에서 부팅되는 동안 오버레이에 sysprep을 적용하지 않았는지 확인하십시오. 의도적으로 클론이 원래 IP를 유지한 경우, known_hosts에 옛 키를 저장한 클라이언트는 해당 줄이 제거될 때까지 경고를 표시합니다. 이 경보는 매뉴얼이 설명하는 재생성입니다.
이전에 접근할 수 있었던 머신의 클론에서 키 로그인이 실패합니다. 기본 sysprep이 홈 디렉터리에서 .ssh를 제거했습니다. --ssh-inject로 키를 주입하거나, 이 복사가 이를 유지해야 하는 경우 --operations defaults,-ssh-userdir로 다시 실행하십시오.
부팅 후 LVM 볼륨이 없습니다. 게스트가 소스에서 온 /etc/lvm/devices/system.devices를 가지고 있으며, 가상 디스크의 WWID가 변경되었습니다. 기본 lvm-system-devices 작업은 이 파일을 제거합니다. 수동으로 선택한 --operations 목록에는 이 항목과 게스트가 LVM을 사용하는 경우 lvm-uuids가 포함되어야 합니다.
단일 클론 또는 템플릿
추가 머신이 하나인 경우, virt-clone, backing file 체크, 새 디스크에 대한 virt-sysprep입니다. 플릿(fleet)은 밀봉된 독립적 파일 하나, 그리고 게스트마다 복사본 또는 오버레이, 그리고 부팅 전 그 게스트의 자체 디스크에 --enable customize가 필요합니다.
오버레이는 해당 이름을 지정한 모든 게스트의 런타임 경로에 밀봉된 파일을 포함시킵니다. 전체 복사와 reflink는 그렇지 않습니다. 그 의존성을 게스트의 수명과 함께 선택하고, 부팅 로더와 /etc/fstab가 파일 시스템과 일치하도록 fs-uuids를 꺼 두십시오.
유용한 링크
참고 자료
- Ubuntu 26.04의 virt-clone(1),
--auto-clone,--file,--reflink포함 - virt-sysprep(1) 작업, 원 위치 편집, 랜덤 시드 노트
--hostname,--ssh-inject,--upload,--run-command에 대한 virt-customize(1)- qemu-img
info,convert,create -b/-F --import와--os-variant에 대한 virt-install(1)- short id
ubuntu26.04인 osinfo-db Ubuntu 26.04 항목 - 빈
/etc/machine-id가 부팅 시 대체되는 방식에 대한 machine-id(5)