使用官方云镜像创建Debian 12 KVM 客户机

使用debian官方云镜像安装debian 12 KVM客户机

  1. 安装软件
1
$ sudo apt install virtinst libvirt-daemon-system libvirt-clients cloud-utils
  1. 下载官方镜像
1
2
3
$ sudo mkdir /var/lib/libvirt/images/templates
$ wget https://cdimage.debian.org/images/cloud/bookworm/latest/debian-12-nocloud-amd64.qcow2
$ sudo mv debian-12-nocloud-amd64.qcow2 /var/lib/libvirt/images/templates/
  1. 增加镜像文件系统空间

假设客户机标识为guest_name

1
2
3
$ sudo mkdir /var/lib/libvirt/images/guest_name
$ sudo cp /var/lib/libvirt/images/templates/debian-12-nocloud-amd64.qcow2 /var/lib/libvirt/images/guest_name/root-disk.qcow2
$ sudo qemu-img resize /var/lib/libvirt/images/guest_name/root-disk.qcow2 100G

qemu-img resize扩展镜像文件空间后,只是客户机的硬盘增大了,但客户机的分区和文件系统还是原来的样子,并没有得到自动扩展。
等客户机运行起来后可以使用growpart来在线扩展分区,再使用resize2fs在线扩展文件系统到分区大小。

  1. 生成云镜像初始化iso

cloud-init.cfg 为云镜像初始化文件,可以配置很多选项

1
2
3
4
5
6
7
$ sudo echo "#cloud-config
hostname: guest_name
" | sudo tee /var/lib/libvirt/images/guest_name/cloud-init.cfg

$ sudo cloud-localds \
/var/lib/libvirt/images/guest_name/cloud-init.iso \
/var/lib/libvirt/images/guest_name/cloud-init.cfg
  1. 创建客户机
1
2
$ sudo virsh net-start default
$ sudo virsh net-autostart default

先启动客户机默认网络并设置为自动启动,不然创建客户机时会报错误:

1
ERROR    Requested operation is not valid: network 'default' is not active

如果使用桥接网络不需要启动默认网络

1
2
3
4
5
6
7
8
9
10
$ sudo virt-install \
--name guest_name \
--memory 2048 \
--disk /var/lib/libvirt/images/guest_name/root-disk.qcow2,device=disk,bus=virtio \
--disk /var/lib/libvirt/images/guest_name/cloud-init.iso,device=cdrom \
--os-variant debian11 \
--virt-type kvm \
--graphics none \
--network bridge=br0,model=virtio \
--import

出现登录控制台后输入root进入系统,默认没有设置密码,退出控制台键入ctrl + ]

重新连接控制台

1
2
3
4
5
6
$ sudo virsh list --all
Id Name State
-----------------------------
1 guest_name running

$ sudo virsh console 1

管理客户机

1
2
$ sudo virsh shutdown guest_name
$ sudo virsh start guest_name
  1. 网络配置

客户机创建后可以通过virsh edit来修改客户机的网络及其他配置

1
$ sudo virsh edit guest_name

如果安装时使用的是默认网络,可以从默认网络

1
2
3
4
5
<interface type='network'>
<mac ***/>
<source network='default'/>
<address ***/>
</interface>

更改为桥接网络

1
2
3
4
5
<interface type='bridge'>
<mac ***/>
<source bridge='br0'/>
<address ***/>
</interface>

更改网络之前先安装上

1
$ sudo apt install openvswitch-switch

不然更改网络配置文件后netplan apply时会报错误:

Cannot call openvswitch: ovsdb-server.service is not running.

从debian 12 “Bookworm” 开始,云镜像默认网络配置工具为netplan
修改网络配置文件/etc/netplan/90-default.yaml

1
2
3
4
5
6
7
8
9
network:
version: 2
ethernets:
enp1s0:
dhcp4: no
addresses: [192.168.0.16/24]
gateway4: 192.168.0.1
nameservers:
addresses: [114.114.114.114]

然后执行# netplan apply

会有

1
2
`gateway4` has been deprecated, use default routes instead.
See the 'Default routes' section of the documentation for more details.

的过时告警,所以改用route来配置默认网关

1
2
3
4
5
6
7
8
9
10
11
12
13
network:
version: 2
ethernets:
enp1s0:
dhcp4: no
dhcp6: no
addresses:
- 192.168.0.16/24
routes:
- to: default
via: 192.168.0.1
nameservers:
addresses: [114.114.114.114]
  1. 扩展文件系统空间

安装growpart

1
$ sudo apt install cloud-guest-utils gdisk

查看客户机的块设备列表

1
2
3
4
5
6
$ sudo lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
vda 254:0 0 100G 0 disk
├─vda1 254:1 0 2.9G 0 part /
├─vda14 254:14 0 3M 0 part
└─vda15 254:15 0 124M 0 part /boot/efi

可以看到块设备vda有100G空间,但vda1只有2.9G大小

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$ sudo gdisk /dev/vda
gdisk /dev/vda
GPT fdisk (gdisk) version 1.0.9

Partition table scan:
MBR: protective
BSD: not present
APM: not present
GPT: present

Found valid GPT with protective MBR; using GPT.

Command (? for help): p
Disk /dev/vda: 209715200 sectors, 100.0 GiB
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): 9D6B96D0-7CEC-794F-B6FB-AF6C1DC25D0E
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 2048, last usable sector is 6291422
Partitions will be aligned on 2048-sector boundaries
Total free space is 2015 sectors (1007.5 KiB)

Number Start (sector) End (sector) Size Code Name
1 262144 6289407 2.9 GiB 8304
14 2048 8191 3.0 MiB EF02
15 8192 262143 124.0 MiB EF00

云镜像文件根分区在硬盘的最后一个分区,方便在线扩展
可以看到vda1分区也就是根分区在块设备的最后面,可以将其扩展到包含块设备剩余的全部空间

1
2
growpart /dev/vda 1
CHANGED: partition=1 start=262144 old: size=6027264 end=6289407 new: size=209453023 end=209715166

上面的命令将/dev/vda设备上的编号为1的分区自动扩展到最大剩余空间

然后将根分区上的文件系统扩展到整个分区

1
2
3
4
5
6
7
$ sudo resize2fs /dev/vda1
resize2fs 1.47.0 (5-Feb-2023)
Filesystem at /dev/vda1 is mounted on /; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 13
[74616.147208] EXT4-fs (vda1): resizing filesystem from 753408 to 26181627 blocks
[74617.899341] EXT4-fs (vda1): resized filesystem to 26181627
The filesystem on /dev/vda1 is now 26181627 (4k) blocks long.

再查看客户机的块设备列表

1
2
3
4
5
6
$ sudo lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
vda 254:0 0 100G 0 disk
├─vda1 254:1 0 99.9G 0 part /
├─vda14 254:14 0 3M 0 part
└─vda15 254:15 0 124M 0 part /boot/efi

可以看到根分区vda1已经扩展到接近100G的空间。

References:

[1] KVM

[2]libvirt

[3]Netplan

[4]NetworkConfiguration

[5] 虚拟化技术之kvm虚拟机创建工具virt-install

[6]/etc/netplan/network-manager-all.yaml 配置服务器ip

[7]KVM 通过virsh console连入虚拟机

[8]KVM虚拟机常用的一些命令