Xen的工具栈:
xm/xend:在高版本中已经不被建议使用
xl:对于xl而言,其创建DomU使用的配置指令可通过man xl.cfg获取
xl语法及子命令:使用xl help查看
Usage: xl -vfN <subcommand> args
xl full list of subcommands:
|----------|-----------------------------------------------|
| create | Create a domain from config file <filename> |
| list | List information about all/some domains |
| destroy | Terminate a domain immediately |
| shutdown | Issue a shutdown signal to a domain |
| reboot | Issue a reboot signal to a domain |
| console | Attach to domain's console |
| info | Get information about Xen host |
xl list

Name:域唯一的名称;
ID:域的ID,一旦分配出去,即使停止运行,也不会收回;
State:状态;xen虚拟机状态有以下几种
r:running,正处于运行中
b:阻塞,block
p:暂停,pause
s:停止,stop
c:崩溃
d:dying,正在关闭的过程中
创建xen虚拟机,即创建DomU,pv模式,需要的步骤:
1)kernel,完全可以放在Dom0中
2)initrd或initramfs
3)DomU内核模块
4)根文件系统
5)swap设备
上述内容定义在DomU的配置文件中;
配置文件xl.cfg是xl命令启动DomU时,DomU的配置文件,而xl.conf是xl命令本身的配置文件。
xl.cfg中常用指令 :
name:name="NAME",域唯一的名称
builder:builder=" ",指明虚拟机的类型:generic表示pv,hvm表示hvm;高版本中用type=
vcpus:分配给虚拟机的虚拟cpu个数;
maxvcpus:最大虚拟cpu个数;
cpus:vcpu,即虚拟cpu可以运行其上的物理cpu列表;
cpu_weight:权重
memory:内存大小;
maxmem:最大内存大小;
on_poweroff:指明虚拟机关机时采取的action:destroy、restart、preserve等;
on_reboot:指明虚拟机重启时采取的action;
on_crash:虚拟机意外崩溃时采取的action;
uuid:DomU的唯一标识;
disk:指明磁盘设备列表,disk= "DISK_SPEC_STRING", "DISK_SPEC_STRING", ...;
vif:指明网络接口列表,vif= "NET_SPEC_STRING", "NET_SPEC_STRING", ...;
vfb:指明virtual frame buffer,列表;
pci:pci设备列表,pci= "PCI_SPEC_STRING", "PCI_SPEC_STRING", ... ;
PV模式专用指令:
kernel:内核文件路径,此为Dom0中的路径,kernel="PATHNAME";
ramdisk:为kernel指定内核提供的ramdisk文件路径,ramdisk="PATHNAME";
root:指明根文件系统,root="STRING";
extra:额外传递给内核引导时使用的参数;
bootloader:如果DomU使用自己的kernel及ramdisk,此时需要一个Dom0中的应用程序来实现其bootloader功能;
关于disk:
一般有两种类型,一种是磁盘映像文件,一种是直接在Dom0中指定一个磁盘分区;
磁盘参数指定方式:\
<target>表示磁盘映像文件或设备文件路径:/images/xen/linux.img,/dev/myvg/linux
<format>表示磁盘格式,如果为映像文件,有多种格式,如raw,qcow,qcow2。。。
raw其实就是dd命令创建的映像文件, 这个格式参考qemu-img命令所能支持的格式。
<vdev>此设备在DomU中被识别为硬件设备类型,支持hdx,sdx或xvdx
\
disk="/imgages/xen/linux.img,raw,xvda,rw","第二块"
高版本中:disk="raw:/imgages/xen/linux.img,xvda,rw","第二块"
使用qemu-img命令创建磁盘映像文件,qemu-img-xen是一个指向qemu-img的链接
qemu-img语法:
qemu-img command command options
Command syntax:
check -q -f fmt --output=ofmt -r \[leaks \| all] -T src_cache filename
create -q -f fmt -o options filename size
commit -q -f fmt -t cache filename
compare -f fmt -F fmt -T src_cache -p -q -s filename1 filename2
convert -c -p -q -n -f fmt -t cache -T src_cache -O output_fmt -o options -s snapshot_name -S sparse_size filename filename2 \[...] output_filename
info -f fmt --output=ofmt --backing-chain filename
map -f fmt --output=ofmt filename
snapshot -q -l \| -a snapshot \| -c snapshot \| -d snapshot filename
rebase -q -f fmt -t cache -T src_cache -p -u -b backing_file -F backing_fmt filename
resize -q filename + \| -size
amend -q -f fmt -t cache -o options filename
实操:使用qemu-img管理磁盘影响
qemu-img create -f raw -o size=2G /images/xen/busybox.img

可以看到创建的文件大小为2G,但真正的占用空间是0,这是sparse格式的磁盘映像文件,即稀疏格式映像文件。
格式化:将刚创建的映像文件作为一个分区直接格式化
mke2fs -t ext4 busybox.img

此时就可以挂载这个分区了:
mout -o loop busybox.img /mnt

要作为一个DomU的根文件系统,还需要对应的目录和文件,如/boot,/usr等,就相当于在其上安装系统。
安装busybox:下载wget https://busybox.net/downloads/busybox-1.38.0.tar.bz2
tar xf busybox-1.38.0.tar.bz2
make menuconfig # 选择build options,选择静态链接库
make # 对于1.38.0版本,在CentOS7.9下编译警告比较多,最后还有错误,改为了1.25.0
make install # 默认安装在当前目录下的子目录_install\下
查看安装文件:ls _install:

将_install下的所有文件拷贝到做好的磁盘映像中,保持原有属性:
cp -a _install/* /mnt
手工创建其他必须的目录:
mkdir proc sys dev etc var boot home

测试一下,手工切换:
chroot /mnt /bin/sh

目标系统的根文件系统已经准备就绪,现在就缺少引导内核和引导临时根文件系统,使用CentOS7.9的3.10.0版本的,其支持运行于DomU中:

创建链接:ln -sv vmlinuz-3.10.0-1160.71.1.el7.x86_64 vmlinuz-busybox
ln -sv initramfs-3.10.0-1160.71.1.el7.x86_64.img initramfs-busybox.img
xl命令管理的DomU虚拟机的配置文件,在/etc/xen下:

xl.conf是xl命令本身的配置文件,xlexample.hvm和xlexample.pvlinux是DomU运行于hvm或pv模式下的配置文件模版,拷贝xlexample.pvlinux,修改作为busybox虚拟机的配置文件:
cp xlexample.pvlinux busybox.cfg
vim busybox.cfg

创建新的虚拟机实例,使用xl create命令:
xl -vfN create <ConfigFile> options vars
xl -v create busybox.cfg -n #预运行,不会创建真实实例
xl -v create busybox.cfg
在查看:xl list ,已经有另一个虚拟机busybox-01运行了。

连接虚拟机:
xl console busybox-01
结果出现错误:

就是根文件系统所在设备找不到。原因很可能是引导内核没有对应的驱动,无法识别img文件。
查看临时根文件系统,就是内核vmlinuz-4.9.241-37.el7.x86_64配套的initrd文件initramfs-4.9.241-37.el7.x86_64.img中是否存在相应的驱动,这里因为使用的是qemu-img生成的raw格式文件,是块设备,在xen中,在DomU中应该有xen-blkfront驱动,对应的后端,即Dom0中应该有xen-blkback驱动。
找不到boot的核心原因:initramfs 缺少 xen-blkfront 驱动。这是最常见的原因。你使用的内核 /boot/vmlinuz-4.9.241-37.el7.x86_64 虽然支持 Xen,但其配套的 initramfs 可能是在非 Xen 环境下生成的,或者没有显式包含 xen-blkfront模块。解决方法:在宿主机上重建带 Xen驱动的 initramfs。
使用lsmod | grep xen查看Dom0加载的驱动:

后端加载了驱动,再看前端是否有xen-blkfront,查看initramfs-4.9.241-37.el7.x86_64.img中的文件:lsinitrd initramfs-4.9.241-37.el7.x86_64.img | grep xen

发现确实没有xen-blkfront驱动,需要添加进去。
使用:modprobe xen-blkfront 加载驱动,如果成功,说明有这个驱动,那就把这个驱动添加到initrd文件中。如果加载不成功,那需要安装相应的软件包。
使用:dracut --force --add-drivers "xen-blkfront" initramfs-4.9.241-37.el7.x86_64.img 4.9.241-37.el7.x86_64 命令来添加驱动
语法为:dracut --force --add-drivers "驱动名1,驱动名2" 输出文件路径 内核版本
请注意区分:
宿主机 (Domain-0):需要加载 xen-blkback (后端) 来提供磁盘服务。
虚拟机 (Domain-U):需要加载 xen-blkfront (前端) 来识别磁盘。
xl shutdown box01
xl destroy box01
然后重新启动虚拟机:
xl -v create /etc/xen/box01.cfg
此时再次连接虚拟机box01:xl console box01

已经找到了xvda设备,但是在mount /sysroot使出错,但是说明虚拟机已经运行起来了。
继续排错,首先是配置文件中disk配置项要显示指定raw,否则xen可能无法正确识别

这个确定正确,然后就是extra配置项,这里最重要的就是指定root,可以使用
root=/dev/xvda 形式,也可使用 root=UUID=xxxx 形式,后边可以跟rootfstype,指定文件系统类型。
获取UUID,使用 blkid /xen/box01.img
最终的格式:

最终解决:一开始qemu-img生成的box01.img,格式化使用的是ext2,这个格式估计xen不认,重新格式化为ext4,再次加载就成功了。


Xen基本组件:
xen Hypervisor,Dom0(Privileged Domain),DomU(Unprivileged Domain)
netdev-frontend,netdev-backend
blkdev-frontend,blkbackend