0%

虚拟化入门笔记--kvmtool playaround

Kvmtool可以认为是一个极简版的qemu (所处软件层、功能都和qemu一样),只有几千行代码,便于学习虚拟化的原理。

前提 (0)

一台物理机,安装linux系统,并且安装了KVM.

1
2
3
4
5
uname -r
3.10.0-693.5.2.el7.x86_64

ls /dev/kvm
/dev/kvm

下载源码并编译 (1)

从github下载。当前git commit id是da4cfc3e540341b84c4bbad705b5a15865bc1f80.

1
git clone https://github.com/kvmtool/kvmtool.git

编译:

1
2
cd kvmtool
make -j8

编译完成之后,当前目录下生成可执行工具lkvm.

获取一个内核 (3)

编译 (3.1)

按kvmtool文档的要求,要设置编译选项:

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
27
28
29
30
31
32
33
34
35
36
- For the default console output:
CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y

- For running 32bit images on 64bit hosts:
CONFIG_IA32_EMULATION=y

- Proper FS options according to image FS (e.g. CONFIG_EXT2_FS, CONFIG_EXT4_FS).

- For all virtio devices listed below:
CONFIG_VIRTIO=y
CONFIG_VIRTIO_RING=y
CONFIG_VIRTIO_PCI=y

- For virtio-blk devices (--disk, -d):
CONFIG_VIRTIO_BLK=y

- For virtio-net devices ([--network, -n] virtio):
CONFIG_VIRTIO_NET=y

- For virtio-9p devices (--virtio-9p):
CONFIG_NET_9P=y
CONFIG_NET_9P_VIRTIO=y
CONFIG_9P_FS=y

- For virtio-balloon device (--balloon):
CONFIG_VIRTIO_BALLOON=y

- For virtio-console device (--console virtio):
CONFIG_VIRTIO_CONSOLE=y

- For virtio-rng device (--rng):
CONFIG_HW_RANDOM_VIRTIO=y

- For vesa device (--sdl or --vnc):
CONFIG_FB_VESA=y

直接使用虚拟机的内核 (3.2)

若购买过阿里云、腾讯云或者华为云的VM,可以直接使用VM的内核,厂家编译时做过配置。虽然配置和KVM文档要求不尽相同,但实测(阿里云)可以运行,可能有些特性不能使用。其配置是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y

CONFIG_IA32_EMULATION=y

CONFIG_VIRTIO=m
# CONFIG_VIRTIO_RING is not set
CONFIG_VIRTIO_PCI=m

CONFIG_VIRTIO_BLK=m

CONFIG_VIRTIO_NET=m

# CONFIG_NET_9P is not set
# CONFIG_NET_9P_VIRTIO is not set
# CONFIG_9P_FS is not set

CONFIG_VIRTIO_BALLOON=m

CONFIG_VIRTIO_CONSOLE=m

CONFIG_HW_RANDOM_VIRTIO=m

CONFIG_FB_VESA=y

从虚拟机拷贝/boot/vmlinuz-3.10.0-957.el7.x86_64/boot/initramfs-3.10.0-957.el7.x86_64.img到物理机kvmtool目录,待使用。

制作rootfs (4)

为了兼容,以3.2节中使用的VM当作模版来制作rootfs.

1
2
3
4
df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 20G 2.2G 17G 12% /
...

当前rootfs是2.2G,所以至少准备2.2G以上的空间,我这里分配3G。

1
truncate -s $(echo 1024*1024*1024*3|bc) rootfs-3.10.0-957.img

然后就是格式化,mount并拷贝数据:

1
2
3
4
5
mkfs.ext4 rootfs-3.10.0-957.img
mount -o loop rootfs-3.10.0-957.img /mnt/
cp -ax /{bin,dev,etc,lib,root,sbin,usr,var} /mnt
mkdir /mnt/{home,proc,opt,sys,tmp}
chmod 777 /mnt/tmp

修改/mnt/etc/fstab

1
2
cat /mnt/etc/fstab
/dev/vda / ext4 defaults 1 1

umount,就制作好了。也拷贝到物理机kvmtool目录。

1
umount /mnt/

运行 (5)

1
2
3
4
5
6
7
sudo ./lkvm run  \
--dev /dev/kvm \
--virtio-transport pci \
--loglevel debug \
--disk ./rootfs-3.10.0-957.img \
--kernel ./vmlinuz-3.10.0-957.el7.x86_64 \
--initrd ./initramfs-3.10.0-957.el7.x86_64.img

不出错的话,就会显示登陆提示。

常见错误1: Warning: /dev/vda does not exist. 可能内核不对,编译时没有配置CONFIG_VIRTIO=y|m(所以其它VIRTIO相关的配置不起作用?),所以也识别不到--disk ./rootfs-3.10.0-957.img指定的虚拟盘;它是通过virtio实现的。

常见错误2: systemctl/systemd相关的错误。可能rootfs的问题。因为systemd的配置在rootfs中,其中可能有些服务起不来。这也是第4节中我们以同一个VM为模版制作rootfs的原因。

小结 (6)

本文简单记录如何使用kvmtool启动虚拟机。下一篇研究PCI设备的虚拟化。

写的不错,有赏!