RHEL7 安装KVM 及 PCI直通

| 分类 linux  | 标签 linux KVM 

REHEL7的安装

因为安装RHEL7是为了安装KVM,并且讲我们的存储安装在虚拟机中,其中为了提升存储的性能,需要讲RAID卡直通给KVM虚拟机。 因为RAID卡需要直通给虚拟机,因此,系统盘不应该在RAID卡上,否则RAID卡直通,会导致RHEL7无法进入系统。

首先我从RAID组中取出一块SATA盘,放入主机机箱中,通过SAS线直接和主板相连,除此SATA盘外,还组建了3个RAID分别是10T 8T和一个400G的SSD,通过RAID卡和主板相连。

image

image

image

image

上述步骤中,有两个部分值得注意:

  • 软件包部分我选择了 Virtualization Host。
  • 分区方式选择默认即可

默认情况下,约有50G的启动分区,其它所有空间除了少量分给swap和boot外,基本都分配给了/home分区。对于我的情况而言,/home所在地分区越有2.5T左右。这没有关系,因为后面我们完全可指定 KVM的image文件的路径。

设置软件仓库

我们采用yum install的方式安装相关的Packages,因此,需要设置软件仓库repo。当然首当其冲的是设置网络。

我用手动修改配置文件的方式:关键在于IPADDR/NETMASK/GATEWAY/DNS1 .

[root@localhost sysconfig]# cat /etc/sysconfig/network-scripts/ifcfg-enp6s0f0 
HWADDR="60:EB:69:9B:54:1C"
TYPE="Ethernet"
BOOTPROTO="static"
IPADDR="10.16.17.196"
NETMASK="255.255.255.0"
GATEWAY="10.16.17.254"
DNS1="114.114.114.114"
IPV4_FAILURE_FATAL="no"
NAME="enp6s0f0"
UUID="569b59ae-0201-41b3-96ee-2cfd063485ae"
ONBOOT="yes"

网络设置好后,不妨通过ping baidu来确认能够联通外网。

确保能连通外网后,首先下载epel这个RPM。

[root@localhost ~]# wget https://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-6.noarch.rpm
--2016-04-21 18:19:23--  https://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-6.noarch.rpm
Resolving dl.fedoraproject.org (dl.fedoraproject.org)... 209.132.181.26, 209.132.181.23, 209.132.181.24, ...
Connecting to dl.fedoraproject.org (dl.fedoraproject.org)|209.132.181.26|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 14432 (14K) [application/x-rpm]
Saving to: ‘epel-release-7-6.noarch.rpm.1’

100%[===================================================================================================================>] 14,432      37.2KB/s   in 0.4s   

2016-04-21 18:19:26 (37.2 KB/s) - ‘epel-release-7-6.noarch.rpm.1’ saved [14432/14432]

[root@localhost ~]# rpm -ivh epel-release-7-6.noarch.rpm
warning: epel-release-7-6.noarch.rpm: Header V3 RSA/SHA256 Signature, key ID 352c64e5: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:epel-release-7-6                 ################################# [100%]

安装好该RPM后,事实上我们已经有了第一个软件仓库,我们还需要一个。

手工创建并编辑/etc/yum.repo.d/CentOS-base.repo,并将如下内容写入该文件:

[base]
name=CentOS-5-Base
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever5&arch=$basearch&repo=os
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
baseurl=http://ftp.sjtu.edu.cn/centos/7/os/$basearch/
gpgcheck=0
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-7
#released updates
[updates]
name=CentOS-$releasever – Updates
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates
baseurl=http://ftp.sjtu.edu.cn/centos/7/updates/$basearch/
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
[extras]
name=CentOS-$releasever – Extras
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras
baseurl=http://ftp.sjtu.edu.cn/centos/7/extras/$basearch/
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
[centosplus]
name=CentOS-$releasever – Plus
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus
baseurl=http://ftp.sjtu.edu.cn/centos/7/centosplus/$basearch/
gpgcheck=0
enabled=0

编辑完该文件后,可以执行如下命令,导入相关的key

rpm --import http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-7

至此创建软件仓库的任务完成,不妨执行以下命令检验下效果:

yum install -y atop screen 

安装KVM相关的Packages

安装包之前,不妨检查是否打开VT-D,CPU不支持,安装后面的包也只能徒劳无功,方法如下:

[root@localhost mirror]# cat /proc/cpuinfo |grep -Ei "vmx|svm" | wc -l
24

- vmx is for Intel processors 
- svm is for AMD processors 

intel的CPU,cpuinfo中会输出vmx,而AMD的CPU会输出svm,如果并没有任何信息出现,那么,需要从BIOS中打开 VT-D(Intel Virtualization Technology for Directed I/O)。

接下来,我们可以安装KVM虚拟化相关的包了。

yum install -y  lvm2 qemu-kvm libvirt virt-install bridge-utils virt-install
yum -y install kvm virt-manager   xauth dejavu-lgc-sans-fonts
yum  -y install   libvirt-python libguestfs-tools l virt-viewer

包安装完毕后,启动libvirtd服务,并将该服务放入开机启动选项:

systemctl start libvirtd
systemctl enable libvirtd

安装好之后,不妨执行如下命令来检查相关的包确实已经安装完毕:

[root@localhost network-scripts]# sudo virsh -c qemu:///system list
 Id    Name                           State
----------------------------------------------------

设置网络

默认情况下,创建出来的虚拟机只能访问同一个Server上的其它虚拟机,如果向让VM跳出这个限制,访问自己的LAN,必须设置Network Bridge。

我们第一步设置的网络就要修改:

修改前,网络如下:

[root@localhost sysconfig]# cat /etc/sysconfig/network-scripts/ifcfg-enp6s0f0 
HWADDR="60:EB:69:9B:54:1C"
TYPE="Ethernet"
BOOTPROTO="static"
IPADDR="10.16.17.196"
NETMASK="255.255.255.0"
GATEWAY="10.16.17.254"
DNS1="114.114.114.114"
IPV4_FAILURE_FATAL="no"
NAME="enp6s0f0"
UUID="569b59ae-0201-41b3-96ee-2cfd063485ae"
ONBOOT="yes"

调整之后:

[root@localhost network-scripts]# cat ifcfg-enp6s0f0 
HWADDR="60:EB:69:9B:54:1C"
TYPE="Ethernet"
BOOTPROTO="static"
#IPADDR="10.16.17.196"
#NETMASK="255.255.255.0"
#GATEWAY="10.16.17.254"
#DNS1="114.114.114.114"
IPV4_FAILURE_FATAL="no"
NAME="enp6s0f0"
UUID="569b59ae-0201-41b3-96ee-2cfd063485ae"
ONBOOT="yes"
BRIDGE=kvmbr0

[root@localhost network-scripts]# cat ifcfg-kvmbr0 
DEVICE="kvmbr0"
#HWADDR="60:EB:69:9B:54:1C"
TYPE="BRIDGE"
BOOTPROTO="static"
IPADDR="10.16.17.196"
NETMASK="255.255.255.0"
GATEWAY="10.16.17.254"
DNS1="114.114.114.114"
IPV4_FAILURE_FATAL="no"
ONBOOT=yes

添加网路转发功能:

[root@localhost ~]# echo "net.ipv4.ip_forward = 1"|sudo tee /etc/sysctl.d/99-ipforward.conf
net.ipv4.ip_forward = 1
[root@localhost ~]# sudo sysctl -p /etc/sysctl.d/99-ipforward.conf

创建KVM虚拟机

首先是准备存放ISO的路径和存放虚拟机的路径,因为/home/目录最大,有2T的空间,因此不妨将虚拟机存放在该路径。事实上可以存放你希望存放的位置,只要空间足够即可。

mkdir /home/ISO/
mkdir /home/VM/
chmod 0777 /home/ISO
chmod 0777 /home/VM

将镜像文件上传到/home/ISO

将镜像文件放到/home/ISO/
[root@localhost home]# cd ISO/
[root@localhost ISO]# ll
total 1662448
-rwxr--r--. 1 qemu qemu 1702346752 Apr 21 18:37 VirtualStor Scaler-v6.1-210~201603211641~ecbe1bb.iso

接下来,就可以安装虚拟机了,我选择用命令行的方式

virt-install --network bridge:kvmbr0  --name VirtualStor_Scaler_6.1 --ram=32768 --vcpus=16 --disk path=/home/VM/bean_scaler_6.1,size=60  --graphics vnc,listen=0.0.0.0,port=5950  --cdrom=/home/ISO/VirtualStor\ Scaler-v6.1-210~201603211641~ecbe1bb.iso
  • –name 指定虚拟机的名字
  • –ram 指定内存大小,单位是MB
  • –vcps 指定CPU的核数
  • –disk path 指定虚拟机文件存放的位置, size为虚拟机的大小,单位是GB
  • –graphics 需要图像化界面,因此使用vnc以及后面的参数
  • –cdrom 指定安装镜像的路径

执行完上述命令后,你就看到了我们产品 VirutalStor Scaler的安装画面:

image

接下来的事情,就比较简单了,就是安装我们的VirtualStor Scaler,我就不赘述了,最终的结果一定是 image

PCI直通(pass through)准备工作

事实上,安装VirtualStor Scaler需要花费很长的时间,我们可以利用这段时间来做PCI设备的直通,当虚拟机安装好了之后,重启RHEL物理机来设置PCI直通。

直通之前,我们不妨先看下我们要直通的设备,目标是RAID卡。我们的RHEL物理机上有以下块设备

[root@localhost ISO]# lsbk
NAME            MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda               8:0    0  10.9T  0 disk 
└─sda1            8:1    0     5T  0 part 
sdb               8:16   0   8.2T  0 disk 
sdc               8:32   0   372G  0 disk 
├─sdc1            8:33   0   500M  0 part 
└─sdc2            8:34   0 371.5G  0 part 
  ├─rhel00-root 253:2    0    50G  0 lvm  
  ├─rhel00-home 253:3    0 297.9G  0 lvm  
  └─rhel00-swap 253:4    0  23.6G  0 lvm  
sdd               8:48   0   2.7T  0 disk 
├─sdd1            8:49   0     1M  0 part 
├─sdd2            8:50   0   500M  0 part /boot
└─sdd3            8:51   0   2.7T  0 part 
  ├─rhel-root   253:0    0    50G  0 lvm  /
  ├─rhel-swap   253:1    0  23.6G  0 lvm  [SWAP]
  └─rhel-home   253:5    0   2.7T  0 lvm  /home

其中sdd是我们RHEL系统盘,(其中sdc看到也有rhel的启动信息,这是安装过程中,我曾误安装到SSD上,不要管它),其余的10.9T的RAID5和8.2T的RAI5,以及372G的SSD RAID,在通过RAID与主板相连。这是我们直通的目标,我们希望KVM虚拟机可以直接操作这三组RAID。

要想直通,需要修改grub信息,修改/etc/default/grub的GRUB_CMDLINE_LINUX

image

[root@localhost default]# cat /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="rd.lvm.lv=rhel/root crashkernel=auto  rd.lvm.lv=rhel/swap vconsole.font=latarcyrheb-sun16 vconsole.keymap=us rhgb quiet intel_iommu=on vfio_iommu_type1.allow_unsafe_interrupts=1  pci-stub.ids=1000:0079"
GRUB_DISABLE_RECOVERY="true"

注意,反色的部分,都是新加入的内容。首先,Intel设备为了支持Pass Through需要首先设置

intel_iommu=on vfio_iommu_type1.allow_unsafe_interrupts=1

这部分内容相对是死的,比较好。最后面的pci-stub.ids=后面的数字需要和真正的PCI设备对应上。

我们以RAID卡为例

lspci -vvvnn |less

从中搜索RAID可以得到如下内容:

04:00.0 RAID bus controller [0104]: LSI Logic / Symbios Logic MegaRAID SAS 2108 [Liberator] [1000:0079] (rev 05)
        Subsystem: Dell PERC H700 Adapter [1028:1f16]
        Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr+ Stepping- SERR+ FastB2B- DisINTx+
        Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
        Latency: 0, Cache Line Size: 256 bytes
        Interrupt: pin A routed to IRQ 30
        Region 0: I/O ports at a000 [size=256]
        Region 1: Memory at df47c000 (64-bit, non-prefetchable) [size=16K]
        Region 3: Memory at df4c0000 (64-bit, non-prefetchable) [size=256K]
        Expansion ROM at df480000 [disabled] [size=256K]
        Capabilities: [50] Power Management version 3
                Flags: PMEClk- DSI- D1+ D2+ AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-)
                Status: D0 NoSoftRst+ PME-Enable- DSel=0 DScale=0 PME-
        Capabilities: [68] Express (v2) Endpoint, MSI 00
                DevCap: MaxPayload 4096 bytes, PhantFunc 0, Latency L0s <64ns, L1 <1us
                        ExtTag+ AttnBtn- AttnInd- PwrInd- RBE+ FLReset+
                DevCtl: Report errors: Correctable+ Non-Fatal+ Fatal+ Unsupported-
                        RlxdOrd+ ExtTag- PhantFunc- AuxPwr- NoSnoop+ FLReset-
                        MaxPayload 128 bytes, MaxReadReq 512 bytes

注意第一行的[1000:0079]就是需要添加到/etc/default/grub中神秘数字pci-stub.ids=1000:0079。

同时也要注意04:00.0这个指引了PCI设备的标号,通过它,我们也可以得到pci设备更多信息


[root@localhost ~]# virsh nodedev-list | grep pci
pci_0000_00_00_0
pci_0000_00_01_0
pci_0000_00_02_0
pci_0000_00_03_0
pci_0000_00_07_0
pci_0000_00_09_0
pci_0000_00_13_0
pci_0000_00_14_0
pci_0000_00_14_1
pci_0000_00_14_2
pci_0000_00_14_3
pci_0000_00_1a_0
pci_0000_00_1a_1
pci_0000_00_1a_2
pci_0000_00_1a_7
pci_0000_00_1c_0
pci_0000_00_1d_0
pci_0000_00_1d_1
pci_0000_00_1d_2
pci_0000_00_1d_7
pci_0000_00_1e_0
pci_0000_00_1f_0
pci_0000_00_1f_2
pci_0000_00_1f_3
pci_0000_04_00_0
pci_0000_05_00_0

[root@localhost ~]#  virsh nodedev-dumpxml   pci_0000_04_00_0 
<device>
  <name>pci_0000_04_00_0</name>
  <path>/sys/devices/pci0000:00/0000:00:07.0/0000:04:00.0</path>
  <parent>pci_0000_00_07_0</parent>
  <driver>
    <name>megaraid_sas</name>
  </driver>
  <capability type='pci'>
    <domain>0</domain>
    <bus>4</bus>
    <slot>0</slot>
    <function>0</function>
    <product id='0x0079'>MegaRAID SAS 2108 [Liberator]</product>
    <vendor id='0x1000'>LSI Logic / Symbios Logic</vendor>
    <pci-express>
      <link validity='cap' port='0' speed='5' width='8'/>
      <link validity='sta' speed='5' width='8'/>
    </pci-express>
  </capability>
</device>

从描述device的xml中不难看出,1000是vendor信息,即设备提供商的标号,0x0079是产品标号,这两个结合在一起,标示了LSI公司的MegaRAID SAS 2108这个PCI设备。

/etc/default/grub仅仅是grub配置文件的模版,需要执行如下命令修改真正的grub文件

[root@localhost default]# grub2-mkconfig -o /boot/grub2/grub.cfg 
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-123.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-123.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-91af03da51e94cbebc9957e0fcba297b
Found initrd image: /boot/initramfs-0-rescue-91af03da51e94cbebc9957e0fcba297b.img
Found Red Hat Enterprise Linux Server release 7.0 (Maipo) on /dev/mapper/rhel00-root
done

执行完毕之后,需要等待VirtualStor的虚拟机安装完毕,待其安装完毕后,重启机器,是grub配置生效,从而开始直通PCI设备。

reboot

注意,本小节是PCI设备直通的必须要做的动作,如果不做这些动作,添加PCI设备之后,启动KVM虚拟机就会有如下的报错信息:

image

曾经花费了很多的力气解决这个vfio-pic could not be initialized的错误。

PCI设备直通给虚拟机

系统重启完毕后,需要首先调用virt-manager,调出图形化界面,暂时先不要启动虚拟机,先添加PCI设备RAID卡。

virt-manager

image

image

image

image

注意第三张图中的MegaRAID SAS前面的标号0000:04:00:0和lspci -vvvnn行首的标号一致,第四张图中,添加完毕,在左边栏,看到的PCI 0000:04:00.0也是同一个标号。

这时候,就可以点击启动虚拟机了,虚拟机启动之后,就可以看到直通进去的3个RAID了:

image


上一篇     下一篇