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

相关推荐
Web3探索者7 小时前
可视化服务器管理和传统命令行区别是什么?新手教程:Linux 运维到底该用图形界面还是 SSH 命令行?
linux·ssh
zylyehuo9 小时前
Linux系统中网线与USB网络共享冲突
linux
荣--11 小时前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计
江华森11 小时前
动手实战学 Docker — 从零到集群编排完全指南
运维
Avan_菜菜1 天前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
Sokach10152 天前
Linux Shell 脚本从零到能用:一个新手的一天学习总结
linux
SelectDB2 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
AlfredZhao2 天前
Docker 容器时区不对,`timedatectl` 不存在怎么办?
linux·timezone
zzzzzz3104 天前
9K Star 炸裂开源!这个 C 语言写的代码知识图谱,把 Linux 内核索引压缩到了 3 分钟
linux·服务器·sql
XIAOHEZIcode4 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏