Linux入门攻坚——80、XEN虚拟化-3

DomU虚拟机添加网卡

在DomU配置文件xl.cfg中,通过vif选项进行网络接口配置:
vif = [ '<vifspec>', '<vifspec>', ... ]
其中vifspec格式为:[<key>=<value>|<flag>,],key主要有mac、model、bridge
例如:'mac=00:16:3E:74:3d:76,model=rtl8139,bridge=xenbr0'
vif = [ 'mac=00:16:3E:74:34:32', 'mac=00:16:3e:5f:48:e4,bridge=xenbr1' ]
常用的key:
  mac=:指定mac地址,xen一般要以“00:16:3e”开头
  bridge=<bridge>:指定此网络接口在Dom0中被关联至哪个桥设备上;
  model=<MODEL>:网卡的型号,4.15版本中默认为rtl8139;
  vifname=:接口名称,在Dom0中显示的名称,一般是vifDOMID.DEVID-emu;
  script=:执行的脚本;
  ip=:指定ip地址,会注入到DomU中;
  rate=:指明设备传输速率,格式可以是"/s"或"/s@";
  其他还有devidmtubackendtypegatewaydev

Dom0中创建桥设备

两种方式,其一是使用brctl命令创建网桥,然后将本地网卡接口桥接到此网桥,使用ifconfig命令配置网卡及网桥的ip,此种方法前面已用过;其二是使用直接配置网卡配置文件的方式创建桥设备,并将本地物理网卡桥接到此网桥;此处使用测试这种方法。进入网卡配置文件目录:/etc/sysconfig/network-scripts

拷贝ifcfg-ens33为ifcfg-xenbr0:cp ifcfg-ens33 ifcfg-xenbr0
 编辑ifcfg-xenbr0:

编辑ifcfg-ens33:

桥接后,本地物理网卡不需要IP及相关配置,关键是绑定到网桥上,即BRIDGE配置项。
对于以前版本,不能启动NetworkManager,否则会有冲突,一般使用
chkconfig --list NetworkManager   查看系统启动时服务的运行状态
CentOS7.X使用systemd作为初始化系统。systemctl 是推荐的管理工具,它融合了旧版 service(运行时控制)和 chkconfig(启动项控制)的功能。

任务 旧命令 (SysV) 新命令 (Systemd)
设置开机自启 chkconfig httpd on systemctl enable httpd.service
取消开机自启 chkconfig httpd off systemctl disable httpd.service
启动服务 service httpd start systemctl start httpd.service
停止服务 service httpd stop systemctl stop httpd.service
查看状态 service httpd status systemctl status httpd.service
查看所有服务 chkconfig --list systemctl list-unit-files --type=service

传统运行级别与 Systemd Target 的对应关系:

传统 Runlevel Systemd Target 说明
0poweroff.target 关机
1rescue.target 单用户模式(救援模式)
2multi-user.target 多用户模式(通常等同于3)
3multi-user.target 多用户文本模式(大多数服务器默认)
4multi-user.target 未使用/自定义(通常等同于3)
5graphical.target 图形界面多用户模式
6reboot.target 重启

  看当前系统状态:用 systemctl list-units --type=target --state=active。
  看默认启动设置:用 systemctl get-default。
  看服务属于哪个级别:用 systemctl list-dependencies <服务名> 查看它被哪个 Target 拉起。
这里使用的是xen的高版本,试着不去管它。

配置后重启不好用,最后修改成:

是IPV6的原因吗?还是dhcp的原因?
测试将static改为dhcp,无法连接。继续使用静态测试。

查看管理桥设备:

在DomU虚拟机中添加网卡:

先进DomU中看一下网卡信息:
xl create box01.cfg -c

没有物理网卡。

解决一个前面的问题,就是在xen Hypervisor启动时,显示黑屏,无法在终端登录的问题:
修改:/etc/default/grub
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap quiet "
一开始的设置时,采用了默认,其中有rhgb quiet配置内容,rhgb表示用图形动画替代剩余的文本输出,实验本就是在文本模式下,不需要这一项,quiet是减少屏幕输出的日志数量(只显示严重错误)。

系统启动时提示有模块加载失败,可以使用下列命令查看模块信息:
lsmod 命令查看已经加载的模块
modinfo 命令,查看模块的详细信息
modprobe xxx,加载xxx模块,modprobe -r xxx,卸载已加载的xxx模块

使用brctl命令来添加桥设备
取消物理网卡的IP地址:
ifconfig ens33 0
添加桥设备,并将ens33物理网卡添加到桥上:

配置桥地址:
ifconfig xenbr0 192.168.147.140/24 up
ifconfig

此时,Dom0中的桥设备配置完成。

DomU的配置文件中,启用vif配置项:
vif = [ 'bridge=xenbr0' ]
重启启动DomU,ifconfig -a发现还是没有网卡,这是因为busybox中没有相应的网卡驱动。
将创建的DomU虚拟机根系统,即/xen/box01.img挂载,拷贝网卡驱动:
mount -o loop /xen/box01.img /mnt
mkdir /mnt/lib/modules
cd /lib/modules/4.9.241-37.el7.x86_64/kernel/drivers/net/


拷贝xen-netfront.ko到busybox系统中:
cp xen-netfront.ko /mnt/lib/modules
cp mii.ko /mnt/lib/modules

然后拷贝 ethernet/realtek/目录下的8139too.ko、8139cp.ko到busybox中

 cp ethernet/realtek/{8139cp.ko,8139too.ko} /mnt/lib/modules/ 
虚拟机一般使用rtl8139网卡作为虚拟的物理网卡,mii.ko是rtl8139网卡驱动的依赖模块。

完成上述步骤,重新启动DomU虚拟机,在DomU虚拟机中,安装对应模块:
insmod xen-netfront

虚拟机中有网卡了。

此时,在Dom0中查看网卡:

Dom0中增加了vif4.0网卡。

对于xen设备,在基于半虚拟化,即PV模式下,其IO设备是分为前后两部分,前面部分,即是DomU中的,如这里的网卡,驱动是xen-netfront,后半部分在Dom0中,驱动是xen-netback,相应的前半部分创建的网卡eth0,驱动xen-netfront,后半部分创建的网卡vifx.y,驱动xen-netback,前后部分通信就不是通过协议栈,而是前面部分通过xen-netfront直接与后半部分xen-netback通信,各自外在表现就是网卡eth0和vifx.y,其中vifx.y中的x对应BomU虚拟机ID,在xl list中能够看到,而y则代表第几块网卡,domU中的第一块网卡,对应的就是0,第二块对应1,以此类推。
其他IO设备的通信模型也是如此,如磁盘块设备。
测试,如果关闭DomU虚拟机:

Dom0中的vif网卡也没有了,重新启动DomU:

此时虚拟机的ID变为了5,则Dom0中的vif也变为了vif5.0
因为DomU虚拟机的vif配置时桥接到了xenbr0,所以,此时查看桥接设备:

桥设备上已经桥接了两个网卡了。也就是说,DomU中的桥接配置,其实是后端,即xen-netback驱动进程创建的虚拟接口vif5.0桥接到了桥接设备上。

配置虚拟机eth0网卡:
ifconfig eth0 192.168.147.30 up
然后测试连通性:

网络联通。

再启动一个DomU,配置其IP:

查看Dom0中网络:

通过上面brctl show可以看出,ens33、vif2.0、Vif3.0都桥接在网桥上,所以只要他们的IP在同一网段,就能够互相访问。

此时再理解虚拟机中的网络模型:


以上的模型可以叠加在一起,如在桥接模式下,在增加一个网桥设备xenbr1,然后将DomU都桥接到这个网桥,则DomU之间可以通信,与外部及Dom0都无法通信,相当于叠加了伪网桥模式。

现在再来看Xen基本组件:
  xen Hypervisor,Dom0(Privileged Domain),DomU(Unprivileged Domain)
  netdev-frontend,netdev-backend
  blkdev-frontend,blkbackend
此时对frontend和backend就有更深的理解了。

xl常用命令

pci-list:查看DomU中的pci设备;
pci-attach:热插拔一个pci设备;
pci-detach:拆除一个pci设备;
pause:暂停一个DomU的运行;
unpause:暂停的DomU继续运行;
save:将DomU的内存中的数据转存至指定的磁盘文件中;
restore:从指定的磁盘文件中恢复DomU内存数据;
cd-insert:插入光驱;
cd-eject:弹出光驱;
vcpu-list:显示虚拟机cpu运行信息;
vcpu-pin:虚拟cpu固定到物理cpu;
vcpu-set:设置活动vcpu;
info:查看xen Hypervisor信息;
domid:DomU的id;
domname:DomU的name;
dmesg:DomU的引导信息;
top:查看Domain资源占用排序状态;
network-list:查看指定域使用的网络及接口;
network-attach:热插入一块网卡;
network-detach:拆除网卡;
block-list:查看指定域使用的块设备;
block-attach:热插入一块磁盘;
block-detach:拆除一块磁盘;

使用DomU自有kernel来启动运行DomU

1、创建磁盘映像文件:
qemu-img create -f qcow2 -o size=5G,preallocation=metadata /xen/box03.img

2、磁盘映像文件分区、格式化:
losetup,挂载磁盘映像文件到loop设备,只有挂载后才能做分区
  losetup -a: 显示所有已用的loop设备相关信息;
  losetup -f:显示第一个空闲的loop设备文件;
losetup /dev/loop0  /xen/box03.img
没有格式化的文件无法挂载,如直接:mount -o loop /xen/box03.img /mnt


分区后,执行kpartx:

kpartx命令的核心功能是:‌读取磁盘(或磁盘镜像文件)的分区表,并在 /dev/mapper/ 下为每个分区创建独立的设备映射文件‌。

这使得你可以像操作普通硬盘分区一样,直接挂载和操作磁盘镜像文件中的特定分区,而无需将整个镜像写入物理磁盘。
核心应用场景:
    ‌处理磁盘镜像文件‌:如 .img, .raw, .qcow2 (需转换) 等虚拟机磁盘镜像。
    ‌访问 LVM 分区‌:当磁盘内部包含 LVM 逻辑卷时,kpartx 可以协助识别。
    ‌多路径设备管理‌:在 SAN 存储环境中,管理多路径设备的分区。

格式化:
mke2fs -t ext4 /dev/mapper/loop0p1
mke2fs -t ext4 /dev/mapper/loop0p2

挂载这两个分区,进行格式化:
在/mnt目录下创建boot和sysroot子目录,然后将刚刚创建的分区挂载到对应的子目录上:
mount /dev/mapper/loop0p1 /mnt/boot
mount /dev/mapper/loop0p2 /mnt/sysroot

安装内核:拷贝相应的内核文件vmlinuz和临时根文件系统到/boot下

安装grub:
grub2-install --boot-directory=/mnt/boot /dev/loop0


grub2目录创建完成。

创建引导文件grub.cfg:

拷贝busybox相关文件到/mnt/sysroot,/mnt/sysroot下创建必要的目录,拷贝网络、块设备驱动到对应目录:

cp /lib/modules/3.10.0-1160.71.1.el7.x86_64/kernel/drivers/net/xen-netfront.ko.xz lib/modules/
cp /lib/modules/3.10.0-1160.71.1.el7.x86_64/kernel/fs/ext4/ext4.ko.xz lib/modules/
cp /lib/modules/3.10.0-1160.71.1.el7.x86_64/kernel/drivers/block/xen-blkfront.ko.xz lib/modules/

拆除loop0设备:
umount /mnt/root
umount /mnt/sysroot
kpartx -d /dev/loop0
losetup -d /dev/loop0

配置DomU虚拟机配置文件:
因为是使用自己的内核和根文件系统,所以只需要配置以下几项:
name = "box03"
memory = 256
vcpus = 4
vif = [ 'bridge=xenbr0' ]
disk = [ 'qcow2:/xen/box03.img,xvda,rw' ]
bootloader = 'pygrub'
最关键的一项就是最后的bootloader
pygrub:bootloader,是一个基于 Python 的引导加载程序,仅支持 GRUB Legacy,不支持 GRUB 2。它无法识别 menuentry、linux 等 GRUB 2 语法。必须使用 title、kernel、initrd。
所以启动后:

使用xl命令进行创建虚拟机并完成CentOS安装,基于yum源

安装linux,需要启动一个安装引导环境,也就是一个小的linux,这一般在系统盘的isolinux目录下,有vmlinuz和initrd.img,主要就是这个两个文件。

1)拷贝安装光盘中ioslinux下的两个文件vmlinuz和initrd.img到/images目录下;
2)创建虚拟机磁盘映像文件:qemu-img create -f qcow2 /xen/centos7.qcow2
3)创建虚拟机配置文件:centos7.cfg
name = "centos7.9-01"
kernel = "/images/vmlinuz"
ramdisk = "/images/initrd.img"
memory = 2048
vcpus = 4
vif = [ 'bridge=xenbr0' ]
disk = [ 'file:/xen/centos7.qcow2,xvda,w' ]

正常就应该显示启动画面。测试一直出现错误


无法解决了。下一话题。

使用光盘安装,配合vnc

拷贝安装光盘到/images/CentOS-7-x86_64-DVD-2009.iso
创建虚拟机磁盘映像文件:qemu-img create -f raw /xen/centos7.img
虚拟机配置文件:
name = "centos7.9-01"
builder = "hvm"
memory = 2048
vcpus = 4
vif = [ 'bridge=xenbr0' ]
disk = [ 'raw:/xen/centos7.img,xvda,w','file:/images/CentOS-7-x86_64-DVD-2009.iso,hdc:cdrom,r' ]
boot = 'd'
vnc = 1
vnclisten = "0.0.0.0"
vncpasswd = "123456"  
vncdisplay = 1      
 
serial = "pty"  

创建虚拟机:xl create 
启动windows宿主机中的vnc viewer:

看到了安装启动画面。
其中,boot =‘d’代表从光驱启动
以vnc开头的是配置虚拟机vfb为vnc时的配置,可以使用vfb=[],但是大多数情况下,你不需要直接编写 vfb 数组,而是使用 Xen 提供的快捷参数。

虚拟机配置文件中的vfb选项:启动图形窗口
 1)vfb = [ 'sdl=1' ]
  2)vfb = [ 'vnc=1' ]       安装tigervnc:yum install tigervnc
    vnc监听的端口为5900,相应的DISPLAYNUM为0

vnc=1‌:‌远程访问‌。通过 TCP 网络协议,允许你从另一台电脑(Windows/Mac/Linux)使用 VNC 客户端连接查看虚拟机画面。‌这是服务器环境的标准做法。‌
sdl=1‌:‌本地显示‌。直接利用宿主机(Dom0)的物理显卡和显示器显示虚拟机画面。‌这需要宿主机安装了图形界面(X11/GNOME/KDE等),服务器通常不具备此条件。

直接定义 vfb 列表。
vfb = [ 'type=vnc,vncunused=1,vnclisten=0.0.0.0,vncpasswd=secret,keymap=en-us',]

参数     说明     示例值
‌type‌         显示后端类型     vnc, sdl, spice
‌vncdisplay‌         VNC 显示编号     0 (端口 5900), 1 (端口 5901)
‌vncunused‌         自动寻找空闲端口     1 (自动), 0 (使用指定端口)
‌vnclisten‌         监听地址     127.0.0.1 (仅本地), 0.0.0.0 (所有接口)
‌vncpasswd‌         VNC 访问密码     "your_password"
‌keymap‌         键盘布局映射     en-us, zh-cn, de, fr
‌address‌         Spice 监听地址     0.0.0.0 (仅当 type=spice 时有效)
‌port‌         Spice 端口     5900 (仅当 type=spice 时有效)

测试中出现问题:只要是使用vfb=[]配置,vnc总是监听在127.0.0.1:5900,使用 Xen 提供的快捷参数时,如直接vnclisten=0.0.0.0才起作用。

上面一直使用的是磁盘映像文件作为存储介质,也可以使用Dom0中的物理分区作为虚拟机的磁盘,缺点是此虚拟机就无法迁移了。

使用libvirt实现xen虚拟机管理
libvirt是虚拟机管理的工具栈,需要启动libvirtd守护进程。
包括了图像的virt-manager,启动界面:

非常类似vmware Workstation的样子。

virsh:命令行模式的虚拟机管理,另一套管理工具,与xl类似

xen虚拟机学的很狼狈,很多测试都不成功,也就大体上了解了一些原理性的东西。

xen技术涉及到的需要深入了解的知识:
qemu-img创建磁盘映像文件,语法,及各种不同格式的区别及应用;
loop设备理解及与磁盘映像文件关联使用的方法,mount -o loop ,mount --bind的理解;
kpartx的作用及用法,losetup的作用及用法;
grub的引导过程理解,grub2形成引导文件的过程,涉及的配置文件,如/etc/default/grub,grub2-mkconfig的过程,如何在磁盘映像文件中安装grub2,grub-install的使用,如何创建其引导文件。
内核加载模块的配置,即systemd-modules-load服务,如何配置加载,如何阻止加载,所在的配置文件,如/etc/modules,/etc/modules-load.d/,/etc/modprobe.d/,/usr/lib/modules-load.d/等,模块文件的保存位置/usr/lib/modules,如果这些模块被打包在 initramfs 中(启动初期就需要),修改参数后必须重建 initramfs,否则重启后参数不生效。
initrawfs文件的查看修改,重建initrawfs文件,需要dracut --force命令,查看initrawfs.img文件中包含什么文件,使用lsinitrd命令,查看具体文件的内容,lsinitrd xx.img -f filename,为其添加驱动模块文件,使用dracut --force --add-drivers "驱动名1,驱动名2" [输出文件路径] [内核版本],查看 initramfs(初始 RAM 文件系统)的内容,本质上就是‌解压一个压缩归档文件‌。initramfs 通常是一个 ‌cpio‌ 归档文件,并经过 ‌gzip‌、‌lzma‌ 或 ‌xz‌ 压缩。需要了解cpio命令及归档过程过程,可以手动重新打包为img文件,查看img文件是否使用压缩和什么压缩算法,使用file命令。为什么要查看 initramfs? ‌排查驱动缺失‌:检查 lib/modules/$(uname -r)/kernel/drivers/... 下是否包含必要的存储驱动(如 raid, lvm, ext4, xfs)。 ‌调试启动脚本‌:查看 init 或 usr/lib/dracut/hooks/ 下的脚本,理解启动流程为何卡住。  ‌自定义修复‌:如果系统无法启动,可以解压 initramfs,修改其中的配置文件(如 etc/fstab 或驱动黑名单),然后重新打包。
系统加载模块的查看,手动加载、卸载,lsmod,modprobe,insmod等;
内核启动时可传递的参数的详细配置信息,如rhgb,quiet,root=等;
blkid获取UUID,UUID的使用等;
设置服务在系统启动时是否自动运行‌,以及指定在哪些“运行级别”(Runlevel)下启动,chkconfig及systemctl,/etc/rc.d中各目录文件的作用,/etc/systemd目录及其下的文件、子目录对于systemd启动的作用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kaoa000

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值