Linux入门攻坚——79、XEN虚拟化-2

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

\访问权限,ro,r:只读;rw,w:读写

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

相关推荐
磊 子1 小时前
C++仿函数以及STL内置仿函数
开发语言·c++
AOwhisky1 小时前
学习自测(MySQL系列第一期、第二期)
linux·运维·数据库·学习·mysql·云计算
0x3F(小茶)1 小时前
嵌入式C设计模式完全指南(基于《C嵌入式编程设计模式》)
c语言·开发语言·单片机·嵌入式硬件·设计模式
灰鲸广告联盟1 小时前
新老用户广告价值不同?差异化策略如何实现收益最大化
android·开发语言·flutter·ios
周杰伦fans1 小时前
C# CAD 二次开发:无需启动 AutoCAD 实现 DWG 转 DXF 的完整技术指南
开发语言·c#
Kyrie_Li1 小时前
Kafka-基础知识总结
运维·分布式·kafka
qq_283720051 小时前
2026 最新 Python+AI 零基础入门全教程 :从零搭建人工智能完整项目
开发语言·人工智能·python
OpsEye2 小时前
一次SSH暴力破解后的安全复盘
运维·服务器·ssh