Autoinstall Ubuntu20.04 KVM Instance (by quqi99)
作者张华 发表于2020-07-04版权声明可以任意转载转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明问题我们将使用 non-GUI (text or console)的方式尽可能的自动通过KVM安装Ubuntu20.04虚机目前Ubuntu20.04已经默认使用subiquity作为安装工具了 (之前使用debian-installer使用preseed机制进行自动安装subiquity使用cloud-init进行自动安装wget http://cdimage.ubuntu.com/ubuntu/releases/20.04/release/ubuntu-20.04-live-server-arm64.iso wget http://cdimage.ubuntu.com/ubuntu-legacy-server/releases/20.04/release/ubuntu-20.04-legacy-server-amd64.iso注有个问题, 就是国内的网速太慢了(出口带宽有QoS限制), 采用console方式安装的话基本上就得走网络, 如果再遇到要下载snap就太慢了. 慢得无法忍受, 放弃. 最终采用GUI/vnc模式安装. 不过这种console方式可以方便我们在没有网络问题的国外机器上远程远程安装虚机.准备打开硬件虚拟化及安装KVM相关包sudo apt install cpu-checker -y sudo kvm-ok #remember to enable VT-x and VT-d in BIOS sudo apt install qemu qemu-kvm libvirt-daemon libvirt-clients bridge-utils virt-manager libosinfo-bin sudo systemctl status libvirtd lsmod |grep -i kvm egrep -c (vmx|svm) /proc/cpuinfo osinfo-query os|grep ubuntuvirt-install console only模式安装kvm虚机sudo virt-install --namedemo --ram8192 --vcpus2 --hvm --virt-typekvm \ --connectqemu:///system --os-variantubuntu20.04 --os-typelinux --accelerate \ --disk/game/demo.qcow2,busvirtio,formatqcow2,cachenone,sparsetrue,size32 \ --networkbridgevirbr0,modelrtl8139 --nographics -v \ --location http://mirrors.cloud.tencent.com/ubuntu/dists/focal/main/installer-amd64/ --extra-argsconsolettyS0,115200n8 serial或sudo mkdir /mnt/rootfs sudo chown -R $USER /mnt/rootfs/ sudo mount -o ro /images/iso/ubuntu-20.04-legacy-server-amd64.iso /mnt/rootfs cd /mnt/rootfs sudo virt-install --namei2 --ram4096 --vcpus1 --hvm --virt-typekvm \ --connectqemu:///system --os-variantubuntu20.04 --accelerate \ --disk/images/i2.qcow2,busvirtio,formatqcow2,cachenone,sparsetrue,size8 \ --networkbridgevirbr1,modelrtl8139 --nographics -v \ --hostdev07:10.2 --hostdev07:10.3 \ --cdrom /images/iso/ubuntu-20.04-legacy-server-amd64.iso \ --boot kernel./install/netboot/ubuntu-installer/amd64/linux,initrd./install/netboot/ubuntu-installer/amd64/initrd.gz,kernel_argsconsolettyS0正常情况下上面使用–extra-args‘consolettyS0,115200n8 serial’参数应该就能自动通过console连接的(sudo virsh console demo), 但暂不清楚为什么不行 (实际上在后来调试时发现上面命令其实已经将下列内容添加到了虚机内部的/etc/default/grub文件).注 可试试–extra-args‘consoletty0,consolettyS0,115200n8’GRUB_TERMINALserial GRUB_SERIAL_COMMANDserial --unit0 --speed115200 --word8 --parityno --stop1OK, 我们可以继续采用下列两种方法之一在虚机内部enable console, 方法一如下$ arp -an |grep $(sudo virsh domiflist demo |awk /default/ {print $5}) ? (192.168.122.62) at 52:54:00:e8:fb:47 [ether] on virbr0 ssh demo192.168.122.62 sudo vim /etc/default/grub GRUB_CMDLINE_LINUX_DEFAULTquiet splash consolettyS0 sudo update-grub init 6方法二如下sudo virsh destroy demo sudo guestmount -d demo -i /mnt $ sudo cat /mnt/etc/default/grub |tail -n2 GRUB_TERMINALserial GRUB_SERIAL_COMMANDserial --unit0 --speed115200 --word8 --parityno --stop1 # but above GRUB_SERIAL_COMMAND doesnt work, so remove them and use the following sudo vim /mnt/etc/default/grub #GRUB_CMDLINE_LINUX GRUB_CMDLINE_LINUXconsoletty0 consolettyS0,19200n8 sudo vim /mnt/boot/grub/grub.cfg menuentry Ubuntu --class ubuntu --class gnu-linux --class gnu ... ... #linux /boot/vmlinuz-5.4.0-40-generic rootUUID646ea42b-f96e-465a-b20a-546ba34b03d6 ro quiet splash $vt_handoff linux /boot/vmlinuz-5.4.0-40-generic rootUUID646ea42b-f96e-465a-b20a-546ba34b03d6 ro consolettyS0,19200 earlyprintserial,ttyS0,19200 quiet splash $vt_handoff sudo guestunmount /mnt sudo virsh start demo sudo virsh --connect qemu:///system console demo基于legacy d-i/preseed机制自动安装# NOTE: we use legacy iso (legacy way uses debian-installer preseed, new way uses subiquity init-cloud) # for new way pls refer - https://ubuntu.com/server/docs/install/autoinstall-quickstart # wget http://releases.ubuntu.com/20.04/ubuntu-20.04-live-server-amd64.iso wget http://cdimage.ubuntu.com/ubuntu-legacy-server/releases/20.04/release/ubuntu-20.04-legacy-server-amd64.iso wget http://mirrors.cloud.tencent.com/ubuntu/dists/focal/main/installer-amd64/current/legacy-images/netboot/ubuntu-installer/amd64/initrd.gz wget http://mirrors.cloud.tencent.com/ubuntu/dists/focal/main/installer-amd64/current/legacy-images/netboot/ubuntu-installer/amd64/linux wget https://help.ubuntu.com/lts/installation-guide/example-preseed.txt sed -e s/#.*//g example-preseed.txt |awk {if (length!0) print $0} preseed.cfg sed -i s/archive.ubuntu.com/mirrors.cloud.tencent.com/g preseed.cfg sed -i s/unassigned-hostname/openstack/g preseed.cfg sed -i s/unassigned-domain/lan/g preseed.cfg sed -i s/US\/Eastern/Asia\/Shanghai/g preseed.cfg sed -i s/ubuntu-desktop/standard, ubuntu-server/g preseed.cfg sed -i /ubuntu-server/a\d-i pkgsel\/include string openssh-server preseed.cfg #append a line after the matched line sed -i /openssh-server/a\d-i pkgsel\/upgrade select none preseed.cfg sed -i /confirm_nooverwrite/a\d-i passwd\/user-fullname string demo preseed.cfg #create a new user demo sed -i /demo/a\d-i passwd\/user-password password password preseed.cfg sed -i /user-password/a\d-i passwd\/user-password-again password password preseed.cfg sed -i /user-password-again/a\d-i user-setup\/allow-password-weak boolean true preseed.cfg sudo python -m http.server #http://localhost:8000/preseed.cfg sudo mount -o ro /bak/images/ubuntu-20.04-legacy-server-amd64.iso /mnt/ sudo virt-install --name demo --ram 8192 --vcpus 2 --virt-type kvm \ --connectqemu:///system --os-variantubuntu20.04 --os-typelinux --accelerate \ --disk/game/demo.qcow2,busvirtio,formatqcow2,cachenone,sparsetrue,size32 \ --network bridgevirbr0 --graphics none --force --debug \ --cdrom/bak/images/ubuntu-20.04-legacy-server-amd64.iso \ --boot kernel./linux,initrd./initrd.gz,kernel_argsconsolettyS0 urlhttp://192.168.99.135:8080/preseed.cfg debian-installer/allow_unauthenticated_ssltrue NOTE: 实际安装中报找不着http://192.168.99.135:8080/preseed.cfg以致无法自动安装奇怪基于subiquity/cloud-init新机制自动安装参考 - https://ubuntu.com/server/docs/install/autoinstall-quickstart# The crypted password is just ubuntu. cat user-data EOF #cloud-config autoinstall: version: 1 identity: hostname: openstack password: $6$exDY1mhS4KUYCE/2$zmn9ToZwTKLhCw.b4/b.ZRTIZM30JZ4QrOQ2aOXJ8yk96xpcCof0kxKwuX1kqLG/ygbJ1f8wxED22bTL4F46P0 username: ubuntu EOF touch meta-data sudo python -m http.server # Install ubuntu 20.04 with subiquity/cloud-init sudo umount /mnt sudo mount -o ro /bak/images/ubuntu-20.04-live-server-amd64.iso /mnt/ #remember to use live rather than legacy truncate -s 20G /game/demo.img sudo qemu-system-x86_64 -cdrom /bak/images/ubuntu-20.04-live-server-amd64.iso -bios /usr/share/qemu/OVMF.fd -nographic -serial mon:stdio -m 8096 -kernel /mnt/casper/vmlinuz -initrd /mnt/casper/initrd -append autoinstall dsnocloud-net;shttp://localhost:8000/ consolettyS0,115200n8 -hda /game/demo.img # Boot the installed system kvm -no-reboot -m 8092 -drive file/game/demo.img,formatraw,cachenone,ifvirtioHack Ubiquity’s source codesee - https://blog.csdn.net/quqi99/article/details/7655340420251025 - virt-install user-data下面使用virt-install的方式直接用cloud image, 测试速度更快:sudo chown -R $USER /var/lib/libvirt/ cd /var/lib/libvirt/images wget https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img -O jammy.qcow2 cat user-data EOF #cloud-config user: ubuntu password: password chpasswd: { expire: False } ssh_pwauth: True package_update: true packages: - qemu-guest-agent EOF cat meta-data EOF instance-id: i1 local-hostname: i1 EOF genisoimage -output seed.iso -volid cidata -joliet -rock user-data meta-data sudo virt-install --name i1 --vcpus 2 --memory 8192 \ --disk path/var/lib/libvirt/images/jammy.qcow2 \ --disk path/var/lib/libvirt/images/seed.iso \ --import --os-type linux --os-variant ubuntu22.04 \ --network networkdefault \ --graphics none --console pty,target_typeserial cp /var/lib/libvirt/images/jammy.qcow2 /var/lib/libvirt/images/i2.qcow2 cp /var/lib/libvirt/images/seed.iso /var/lib/libvirt/images/seed_i2.iso sudo virt-install --name i2 --vcpus 2 --memory 8192 \ --disk path/var/lib/libvirt/images/i2.qcow2 \ --disk path/var/lib/libvirt/images/seed_i2.iso \ --import --os-type linux --os-variant ubuntu22.04 \ --network networkdefault \ --graphics none --console pty,target_typeserial sudo virsh console i1 --force sudo virsh domblklist i120251029 - 用virt-install实现vagrant的做法注意, 下列的命令可以正确运行, 注意两点: 1) 在输入用户名和密码ubuntu/password登录之后要等一会cloud-init才会运行完. 2) 通过netplan设置network不行的是之前用了eth0, 它实际上是enp1s0#create a virtual machine with cloud image and cloud-init config using qemu/kvm #https://arianfm.medium.com/create-virtual-machine-with-cloud-image-and-cloud-init-config-using-qemu-kvm-8080ee6e7f05 sudo apt install libvirt-daemon-system virtinst bridge-utils cloud-utils yamllint -y cd /bak/images/ wget https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img mkdir -p bastion cat ./bastion/user-data EOF2 #cloud-config users: - name: ubuntu plain_text_passwd: password lock_passwd: false ssh_pwauth: true sudo: ALL(ALL) NOPASSWD:ALL package_update: true packages: - qemu-guest-agent write_files: - path: /etc/netplan/01-netcfg.yaml permissions: 0600 content: | network: version: 2 renderer: networkd ethernets: enp1s0: dhcp4: false dhcp6: false addresses: [192.168.122.11/24] nameservers: addresses: [192.168.122.1] enp2s0: dhcp4: false addresses: [172.16.0.11/24] enp3s0: dhcp4: false addresses: [172.16.1.11/24] enp4s0: dhcp4: false addresses: [172.16.2.11/24] enp5s0: dhcp6: false addresses: [2001:192:168:99::11/64] runcmd: - netplan apply - systemctl restart systemd-networkd || true - mkdir -p /home/ubuntu/.ssh - chown ubuntu:ubuntu /home/ubuntu/.ssh - su - ubuntu -c ssh-import-id-lp zhhuabj || true - echo VM ready! EOF2 yamllint ./bastion/user-data cat ./bastion/meta-data EOF instance-id: bastion local-hostname: bastion EOF sudo chown -R $USER . #genisoimage -output ./bastion/seed.iso -volid cidata -joliet -rock ./bastion/user-data ./bastion/meta-data cloud-localds ./bastion/seed.iso ./bastion/user-data ./bastion/meta-data qemu-img create -f qcow2 -o backing_filejammy-server-cloudimg-amd64.img,backing_fmtqcow2 bastion.qcow2 20G #sudo virsh destroy bastion sudo virsh undefine bastion sudo virt-install --name bastion --ram 4096 --vcpus 2 \ --disk pathbastion.qcow2,formatqcow2 --cdrom ./bastion/seed.iso \ --os-type linux --os-variant ubuntu22.04 --import \ --network networkdefault \ --network bridgevsw0,modelvirtio \ --network bridgevsw1,modelvirtio \ --network bridgevsw2,modelvirtio \ --network bridgevsw3,modelvirtio \ --graphics none --console pty,target_typeserial20251029 - virt-install创建虚机时通过dnsmasq固定IP#Enable iommu and run apt upgrade echo GRUB_CMDLINE_LINUXintel_iommuon iommupt |sudo tee -a /etc/default/grub echo precedence ::ffff:0:0/96 100 |sudo tee -a /etc/gai.conf echo Acquire::ForceIPv4 true; | sudo tee /etc/apt/apt.conf.d/99force-ipv4 #ensure to use https instead of http in /etc/apt/sources.list sudo apt update sudo apt upgrade -y sudo reboot #Since lxd does not recognize bridges created via virsh, the bridge must be configured through netplan instead cat EOF |sudo tee /etc/netplan/br-phy.yaml network: bridges: br-phy: addresses: - 10.168.144.1/24 version: 2 EOF sudo chmod 600 /etc/netplan/*.yaml sudo netplan apply cat EOF | sudo tee /usr/local/sbin/dnsmasq-br-phy.sh #!/bin/bash exec /usr/sbin/dnsmasq \ --except-interfacelo \ --bind-dynamic \ --interfacebr-phy \ --dhcp-range10.168.144.100,10.168.144.200,24 \ --dhcp-host52:54:00:11:22:11,bastion,10.168.144.11 \ --dhcp-host52:54:00:11:22:12,controller,10.168.144.12 \ --log-dhcp \ --no-daemon EOF cat EOF |sudo tee /etc/systemd/system/dnsmasq-br-phy.service [Unit] Descriptiondnsmasq DHCP for br-phy Afternetwork.target Wantsnetwork.target [Service] Typesimple ExecStartPre/bin/sh -c \ /usr/sbin/iptables -t nat -C POSTROUTING -s 10.168.144.0/24 ! -d 10.168.144.0/24 -j MASQUERADE 2/dev/null || \ /usr/sbin/iptables -t nat -A POSTROUTING -s 10.168.144.0/24 ! -d 10.168.144.0/24 -j MASQUERADE \ #Avoid setting the gateway 10.168.144.1 in cloud-init, it produces an incomplete default route (default via 10.168.144.1 dev eth0) #instead of the correct one (default via 10.168.144.1 dev eth0 proto dhcp src 10.168.144.11). #ExecStartPre/usr/sbin/iptables -F FORWARD ExecStart/usr/local/sbin/dnsmasq-br-phy.sh Restartalways RestartSec5s [Install] WantedBymulti-user.target EOF sudo chmod x /usr/local/sbin/dnsmasq-br-phy.sh sudo systemctl daemon-reload sudo systemctl restart dnsmasq-br-phy.service sudo systemctl enable dnsmasq-br-phy.service #Create two VMs for bastion and juju controller sudo apt install libvirt-daemon-system virtinst bridge-utils cloud-utils yamllint -y wget https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img #HOSTNAMEbastion IMAGEjammy-server-cloudimg-amd64.img IMAGE_VERSION22.04 SSH_KEY$(cat ~/.ssh/id_rsa.pub) #Write user data (note not to add single quotes before EOF, so $SSH_KEY will be expanded) cat /tmp/user-data EOF #cloud-config ssh_pwauth: true users: - name: ubuntu plain_text_passwd: password lock_passwd: false sudo: ALL(ALL) NOPASSWD:ALL ssh_authorized_keys: - $SSH_KEY runcmd: - echo VM ready! EOF #yamllint /tmp/user-data VMs(bastion controller) declare -A VM_MACS( [bastion]52:54:00:11:22:11 [controller]52:54:00:11:22:12 ) for HOSTNAME in ${VMs[]}; do MAC${VM_MACS[$HOSTNAME]} echo Creating VM: $HOSTNAME (MAC: $MAC) cat /tmp/meta-data_${HOSTNAME} EOF instance-id: $HOSTNAME local-hostname: $HOSTNAME EOF sudo chown $USER /tmp/seed_${HOSTNAME}.iso 2/dev/null sudo rm -rf ${HOSTNAME}.qcow2 2/dev/null #genisoimage -output seed.iso -volid cidata -joliet -rock user-data meta-data cloud-localds /tmp/seed_${HOSTNAME}.iso /tmp/user-data /tmp/meta-data_${HOSTNAME} qemu-img create -f qcow2 -o backing_file${IMAGE},backing_fmtqcow2 ${HOSTNAME}.qcow2 20G sudo virsh destroy $HOSTNAME 2/dev/null sudo virsh undefine $HOSTNAME 2/dev/null virt-install \ --name $HOSTNAME \ --mac $MAC \ --ram 4096 \ --vcpus 2 \ --disk path${HOSTNAME}.qcow2,formatqcow2 \ --cdrom /tmp/seed_${HOSTNAME}.iso \ --os-type linux \ --os-variant ubuntu${IMAGE_VERSION} \ --import \ --network bridgebr-phy,modelvirtio \ --graphics none \ --console pty,target_typeserial \ --noautoconsole echo VM $HOSTNAME created and started. virsh autostart $HOSTNAME #virsh console $HOSTNAME #ps -ef |grep virsh console |head -n1 |awk {print $2} |xargs -i kill -9 {} done virsh list --all --autostart #sudo virsh destroy bastion sudo virsh start bastion #sudo nmap -sn 10.168.144.0/24 /dev/null 21 #ip neigh show dev br-phy20251119 - virt-install with netplan with 4 NICs可以将maas就安装在bastion里(enp1s0来自有dhcp的br-phy, enp7s0来自无dhcp的vsw0, 最终会maas-dhcp为vsw0也会enable dhcp), 有两个dhcp需配置br-phy与vsw0的两个subnet在不同的spaces中.但我们还是将maas安装在一个单独的VM中吧. 由于vsw0没有dhcp所以需要使用netplan来静态设置IP, 另外也需要为vsw0 enable SNAT (在/etc/systemd/system/dnsmasq-br-phy.service), host也需要: net.ipv4.ip_forward1由于vsw0没有dhcp, 所以VM刚开始没有IP要等到超时后才会通过iso设置下列user-data, 最后要等会设置完netplan apply之后才work注: 下面的netplan部分只测了vsw0 (vsw1, vsw2, vsw3还未测试), 是通过这样加的:#sudo virsh attach-interface --domain maas --type bridge --source vsw1 --model virtio --live --configsudo apt install libvirt-daemon-system virtinst bridge-utils cloud-utils yamllint -y cd /bak/images/ wget https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img #[ -f ~/.ssh/id_rsa ] || ssh-keygen -b 2048 -t rsa -N -f ~/.ssh/id_rsa SSH_KEY$(cat ~/.ssh/id_rsa.pub) #Write user data (note not to add single quotes before EOF, so $SSH_KEY will be expanded) cat /tmp/user-data EOF #cloud-config ssh_pwauth: true users: - name: ubuntu plain_text_passwd: password lock_passwd: false sudo: ALL(ALL) NOPASSWD:ALL shell: /bin/bash ssh_authorized_keys: - $SSH_KEY write_files: - path: /etc/netplan/01-netcfg.yaml content: | network: version: 2 renderer: networkd ethernets: vsw0: match: macaddress: 52:54:00:11:22:13 set-name: enp1s0 dhcp4: false addresses: [172.16.0.253/24] routes: - to: default via: 172.16.0.1 nameservers: addresses: [192.168.99.1] vsw1: match: macaddress: 52:54:00:11:22:14 set-name: enp7s0 dhcp4: false addresses: [172.16.1.253/24] vsw2: match: macaddress: 52:54:00:11:22:15 set-name: enp8s0 dhcp4: false addresses: [172.16.2.253/24] vsw3: match: macaddress: 52:54:00:11:22:16 set-name: enp9s0 dhcp4: false addresses: [198.51.100.253/24] runcmd: - rm -f /etc/netplan/50-cloud-init.yaml - chmod 600 /etc/netplan/01-netcfg.yaml - netplan apply - echo Static IP ready! EOF yamllint /tmp/user-data HOSTNAMEmaas IMAGEjammy-server-cloudimg-amd64.img IMAGE_VERSION22.04 VMs(maas) declare -A VM_MACS( [maas]52:54:00:11:22:13 ) for HOSTNAME in ${VMs[]}; do BASE${VM_MACS[$HOSTNAME]} P${BASE%:*}; L${BASE##*:} echo Creating VM: $HOSTNAME (MAC: $MAC) cat /tmp/meta-data_${HOSTNAME} EOF instance-id: $HOSTNAME local-hostname: $HOSTNAME EOF sudo chown $USER /tmp/seed_${HOSTNAME}.iso 2/dev/null sudo rm -rf ${HOSTNAME}.qcow2 2/dev/null #genisoimage -output seed.iso -volid cidata -joliet -rock user-data meta-data cloud-localds /tmp/seed_${HOSTNAME}.iso /tmp/user-data /tmp/meta-data_${HOSTNAME} qemu-img create -f qcow2 -o backing_file${IMAGE},backing_fmtqcow2 ${HOSTNAME}.qcow2 20G sudo virsh destroy $HOSTNAME 2/dev/null sudo virsh undefine $HOSTNAME 2/dev/null virt-install \ --name $HOSTNAME \ --mac $MAC \ --ram 4096 \ --vcpus 2 \ --disk path${HOSTNAME}.qcow2,formatqcow2 \ --cdrom /tmp/seed_${HOSTNAME}.iso \ --os-type linux \ --os-variant ubuntu${IMAGE_VERSION} \ --import \ --network bridgevsw0,modelvirtio,mac$P:$(printf %02x $((0x$L 0))) \ --network bridgevsw1,modelvirtio,mac$P:$(printf %02x $((0x$L 1))) \ --network bridgevsw2,modelvirtio,mac$P:$(printf %02x $((0x$L 2))) \ --network bridgevsw3,modelvirtio,mac$P:$(printf %02x $((0x$L 3))) \ --graphics none \ --console pty,target_typeserial \ --noautoconsole echo VM $HOSTNAME created and started. virsh autostart $HOSTNAME done virsh list --all --autostart #virsh console maas #ps -ef |grep virsh console |head -n1 |awk {print $2} |xargs -i kill -9 {} #sudo virsh destroy maas sudo virsh start mass #sudo nmap -sn 172.16.0.0/24 /dev/null 21 #ip neigh show dev br-phy #snap debug connectivity20260720 - create a VM with virsh-install quicklywget https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img cd /bak/images/sunbeam qemu-img create -f qcow2 ceph1.qcow2 10G qemu-img create -f qcow2 ceph2.qcow2 10G qemu-img create -f qcow2 ceph3.qcow2 10G cat user-data EOF #cloud-config password: password chpasswd: { expire: False } ssh_pwauth: True package_update: true packages: - qemu-guest-agent EOF cat meta-data EOF instance-id: sunbeam local-hostname: sunbeam EOF genisoimage -output seed.iso -volid cidata -joliet -rock user-data meta-data #sudo virsh undefine sunbeam #如果没有IP是因为sunbeam.img被污染过了(cloud-init每次用上次的old mac)所以删除重新拷贝 rm -rf /bak/images/sunbeam/sunbeam.img cp /bak/images/noble-server-cloudimg-amd64.img /bak/images/sunbeam/sunbeam.img sudo virt-install --name sunbeam --vcpus 8 --memory 16384 \ --disk path/bak/images/sunbeam/sunbeam.img,busvirtio \ --disk path/bak/images/sunbeam/seed.iso,devicecdrom \ --disk path/bak/images/sunbeam/ceph1.qcow2,busvirtio \ --disk path/bak/images/sunbeam/ceph2.qcow2,busvirtio \ --disk path/bak/images/sunbeam/ceph3.qcow2,busvirtio \ --import --os-variant ubuntu24.04 \ --network bridgebr-phy \ --graphics none --console pty,target_typeserial sudo virsh domiflist sunbeam

相关新闻