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@";
其他还有devid、mtu、backend、type、gatewaydev;
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 | 说明 |
| 0 | poweroff.target | 关机 |
| 1 | rescue.target | 单用户模式(救援模式) |
| 2 | multi-user.target | 多用户模式(通常等同于3) |
| 3 | multi-user.target | 多用户文本模式(大多数服务器默认) |
| 4 | multi-user.target | 未使用/自定义(通常等同于3) |
| 5 | graphical.target | 图形界面多用户模式 |
| 6 | reboot.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启动的作用。

2256

被折叠的 条评论
为什么被折叠?



