如何创建华为HCS中可用的Ubuntu Qcow2镜像

以下所有操作均基于Ubuntu 24.10桌面版。

1.安装相关包。

sudo apt install guestfs-tools virt-manager cloud-utils

2.下载Ubuntu Cloud Image,以Ubuntu 24.04版本为例。

wget https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img

3.将下载的img转换为qcow2格式,华为HCS建议Linux磁盘大小不低于20G。

qemu-img convert -f qcow2 -O qcow2 noble-server-cloudimg-amd64.img root-disk.qcow2

qemu-img resize root-disk.qcow2 20G

4.编写cloud-init配置,并另存为cloud-init.cfg,以下配置的主要含义是:

  • 自动更新软件包,自动重启。
  • apt安装x11-utils、hwinfo(检测分辨率)包,snap安装vmagent包。
  • 设置ubuntu用户默认密码为ubuntu。
  • 软件源修改为中科大源,并使用deb 822格式。
  • ssh认证允许使用密码认证。 
  • datasource使用OpenStack类型。
  • 如果配置manage_etc_hosts: localhost,将为/etc/hosts文件添加以下记录,而且每次启动都会自动更新hostname。
    127.0.1.1       ubuntu  ubuntu

#cloud-config
package_reboot_if_required: True
package_update: True
package_upgrade: True
apt_preserve_sources_list: True
packages:
- snap:
  - vmagent
- apt:
  - x11-utils
  - hwinfo

system_info:
  default_user:
    name: ubuntu
    home: /home/ubuntu

datasource:
  OpenStack:
    metadata_urls: ["http://169.254.169.254"]
    max_wait: 120
    timeout: 5
    apply_network_config: False

apt:
  sources_list: |
    Types: deb
    URIs: https://mirrors.ustc.edu.cn/ubuntu
    Suites: $RELEASE $RELEASE-updates $RELEASE-backports
    Components: main restricted universe multiverse
    Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

    Types: deb
    URIs: https://mirrors.ustc.edu.cn/ubuntu
    Suites: $RELEASE-security
    Components: main restricted universe multiverse
    Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg


password: "WJLwjl123"
chpasswd: { expire: False }

ssh_pwauth: True

final_message: |
  cloud-init has finished
  version: $version
  timestamp: $timestamp
  datasource: $datasource
  uptime: $uptime

5.将cloud-init.cfg文件封装成iso文件。

cloud-localds cloud-init.iso cloud-init.cfg

6.创建虚拟机,虚机名字使用“noble”,首先测试graphics参数和ideo参数对最终虚机的影响,网卡采用默认的NAT方式。

方式一: graphics参数配置为none,这种方式创建的虚机相当于不需要使用VGA、HDMI等视频连接线与显示器进行连接,虚机提供一个串口,而用户使用计算机+串口线连接虚机,可以想象串口线调试交换机等网络设备的场景,因此配套参数可以设置波特率之类的也就可以理解了。

这种方式创建的虚机开机过程会直接显示在运行命令的终端内,可以使用virsh console noble命令进入虚机。

这种方式的缺点在于创建出来的虚机分辨率特别低,而且无法修改,使用stty size命令可以看到结果为:24 80。

virt-install \
  --name noble \
  --memory 4096 \
  --disk root-disk.qcow2,device=disk,bus=virtio \
  --disk cloud-init.iso,device=cdrom \
  --os-variant ubuntu24.04 \
  --virt-type kvm \
  --graphics none \
  --network network=default,model=virtio \
  --import


 

方式二:graphics参数配置为vnc,使用stty size命令可以看到结果为:25 80,使用全屏也只会将文字拉伸到全屏,显示效果很差。

virt-install \
  --name noble \
  --memory 4096 \
  --disk root-disk.qcow2,device=disk,bus=virtio \
  --disk cloud-init.iso,device=cdrom \
  --os-variant ubuntu24.04 \
  --virt-type kvm \
  --graphics vnc \
  --network network=default,model=virtio \
  --import

上图相当于使用以下命令:

virt-viewer --connect qemu:///system --wait noble

上图是华为云创建虚机后的界面,可以看到,分辨率太低了。

方式三:graphics参数配置为spice,等价于以下参数,推荐采用这种方式,这种方式安装x11-utils和hwinfo后,分辨率选项更多。

--video qxl --channel spicevmc

  virt-install \
  --name noble \
  --memory 4096 \
  --disk root-disk.qcow2,device=disk,bus=virtio \
  --disk cloud-init.iso,device=cdrom \
  --os-variant ubuntu24.04 \
  --virt-type kvm \
  --graphics spice \
  --network network=default,model=virtio \
  --import

方式四:video参数配置为virtio,创建出来的虚机分辨率明显提升,使用stty size命令测试结果为50 160。

  virt-install \
  --name noble \
  --memory 4096 \
  --disk root-disk.qcow2,device=disk,bus=virtio \
  --disk cloud-init.iso,device=cdrom \
  --os-variant ubuntu24.04 \
  --virt-type kvm \
  --video=virtio \
  --network network=default,model=virtio \
  --import

7.使用hwinfo命令查看支持的分辨率。

sudo hwinfo --framebuffer

注:方式一安装的虚机运行以上命令结果为空,因此无法提升分辨率。

8.选择1280x1024作为新分辨率。

sudo vim /etc/default/grub

GRUB_GFXMODE=1280x1024x24
GRUB_GFXPAYLOAD_LINUX=1280x1024

sudo update-grub

9.在虚机中安装vmtools,从而使得OC可以监控虚机CPU、内存等资源使用情况。

sudo snap install vmagent

10.在宿主机中执行以下命令,清理相关资源。

sudo virt-sysprep -d noble

11.把镜像压缩一下,一般可以压缩至500M左右。

qemu-img convert -f qcow2 -O qcow2 -c root-disk.qcow2 noble.qcow2

参考文章:

1.https://waynerv.com/posts/create-out-of-box-ubuntu-qcow2-image/

2.https://unix.stackexchange.com/questions/17027/how-to-set-the-resolution-in-text-consoles-troubleshoot-when-any-vga-fail

3.https://linux.die.net/man/1/virt-install

评论

此博客中的热门博文

Clash Verge全局扩展配置及脚本

ShadowRocket懒人配置