分享

Openstack存储总结之:详解如何使用NFS作为Cinder的后端存储

问题导读
1、你如何理解NFS服务?
2、如果libvirt环节发生错误,怎么设置解决?
3、Cinder节点NFS客户端需要作何配置?





NFS服务简单描述
NFS是Network File System的缩写,即网络文件系统。一种使用于分散式文件系统的协定,由Sun公司开发,于1984年向外公布。功能是通过网络让不同的机器、不同的操 作系统能够彼此分享个别的数据,让应用程序在客户端通过网络访问位于服务器磁盘中的数据,是在类Unix系统间实现磁盘文件共享的一种方法。

NFS的基本原则是“容许不同的客户端及服务端通过一组RPC分享相同的文件系统”,它是独立于操作系统,容许不同硬件及操作系统的系统共同进行文件的分享。

NFS在文件传送或信息传送过程中依赖于RPC协议。RPC,远程过程调用(Remote Procedure Call) 是能使客户端执行其他系统中程序的一种机制。NFS本身是没有提供信息传输的协议和功能的,但NFS却能让我们通过网络进行资料的分享,这是因为NFS使 用了一些其它的传输协议。而这些传输协议用到这个RPC功能的。可以说NFS本身就是使用RPC的一个程序。或者说NFS也是一个RPC SERVER。所以只要用到NFS的地方都要启动RPC服务,不论是NFS SERVER或者NFS CLIENT。这样SERVER和CLIENT才能通过RPC来实现PROGRAM PORT的对应。可以这么理解RPC和NFS的关系:NFS是一个文件系统,而RPC是负责负责信息的传输。


NFS服务器端
NFS服务器端的安装
  1. yum -y install rpcbind nfs-utils
复制代码



NFS服务器端的配置
NFS服务器端的配置比较简单,基本只涉及/etc/exports文件的修改,配置内容如下:
  1. /home/nfsshare 192.168.40.0/255.255.255.0(rw,sync)  
复制代码


以上配置标示"192.168.40.0/255.255.255.0"这个网段的用户可以挂载NFS服务器上的/home/nfsshare目录,挂载后具有读写权限,由于没有指定压缩用户权限的方式,所以就算以root身份登录,也会被降级为nobody
NFS服务的启动
  1. service  rpcbind  start  
  2. service  nfs  start  
  3. service  nfslock  start  
  4. chkconfig  rpcbind  on  
  5. chkconfig  nfs  on  
  6. chkconfig  nfslock  on
复制代码



NFS服务验证
服务器端使用showmount命令查询NFS的共享状态
  1. # showmount-e    //默认查看自己共享的服务,前提是要DNS能解析自己,不然容易报错  
  2.   
  3. # showmount-a    //显示已经与客户端连接上的目录信息   
复制代码


客户端使用showmount命令查询NFS的共享状态
  1. # showmount -e NFS服务器IP  
复制代码



NFS系统守护进程
nfsd:它是基本的NFS守护进程,主要功能是管理客户端是否能够登录服务器;
mountd:它是RPC安装守护进程,主要功能是管理NFS的文件系统。当客户端顺利通过nfsd登录NFS服务器后,在使用NFS服务所提供的文件前,还必须通过文件使用权限的验证。它会读取NFS的配置文件/etc/exports来对比客户端权限。
portmap:主要功能是进行端口映射工作。当客户端尝试连接并使用RPC服务器提供的服务(如NFS服务)时,portmap会将所管理的与服务对应的端口提供给客户端,从而使客户可以通过该端口向服务器请求服务。
NFS的常用目录
/etc/exports                          NFS服务的主要配置文件
/usr/sbin/exportfs                  NFS服务的管理命令
/usr/sbin/showmount             客户端的查看命令
/var/lib/nfs/etab                     记录NFS分享出来的目录的完整权限设定值
/var/lib/nfs/xtab                     记录曾经登录过的客户端信息

NFS目录的重新挂载
如果我们在启动了NFS之后又修改了/etc/exports,是不是还要重新启动nfs呢?这个时候我们就可以用exportfs命令来使改动立刻生效
  1. exportfs -arv
复制代码



Cinder节点NFS客户端配置
安装相关软件
  1. yum install rpcbindnfs-utils
复制代码


启动相关服务
  1. servicerpcbind start  
  2. servicenfslock start  
  3. chkconfigrpcbind on  
  4. chkconfignfs on  
  5. chkconfignfslock on  
复制代码



检查NFS服务器端的共享信息
NFS服务器的IP为192.168.40.107
  1. [root@controllernodeimages(keystone_admin)]# showmount -e 192.168.40.107  
  2.   
  3. Exportlist for 192.168.40.107:  
  4. /home/nfsshare 192.168.40.0/255.255.255.0
复制代码


挂载到本地目录
  1. cd /root  
  2.   
  3. mkdir nfsshare  
  4.   
  5. mount -tnfs 192.168.40.107:/home/nfsshare /root/nfsshare/  
复制代码



查看挂载结果
  1. [root@controllernode~(keystone_admin)]# df -h  
  2.   
  3. Filesystem                           Size  Used Avail Use% Mounted on  
  4.   
  5. /dev/sda1                             97G  4.8G  87G   6% /  
  6.   
  7. tmpfs                                3.9G  4.0K 3.9G   1% /dev/shm  
  8.   
  9. /srv/loopback-device/swift_loopback  1.9G  67M  1.8G   4% /srv/node/swift_loopback  
  10.   
  11. 192.168.40.107:/home/nfsshare           444G 1.4G  420G   1% /root/nfsshare
复制代码


需要注意的是,如果此时NFS服务器出现故障,或者是客户端不能连接到服务端,由于该命令要等待文件系统查找超时后才返回结果,所以该操作会变的很慢,该原理是用于所有针对文件系统的命令,例如 df,ls,cp等


Cinder节点NFS后端存储配置
创建/etc/cinder/nfsshares文件,并编辑内容如下
  1. 192.168.40.107:/home/nfsshare  
复制代码



设置配置文件的权限
  1. [root@controllernode~]# chown root:cinder /etc/cinder/nfsshares  
  2.   
  3. [root@controllernode~]# chmod 0640 /etc/cinder/nfsshares  
复制代码



配置cinder的volume 服务是用NFS
修改/etc/cinder/cinder.conf中的值为/etc/cinder/nfsshares,可执行下面的命令
  1. openstack-config --set /etc/cinder/cinder.conf \  
  2. DEFAULT nfs_shares_config /etc/cinder/nfsshares
复制代码



配置cinder的volume使用的驱动,可使用以下命令
  1. openstack-config --set /etc/cinder/cinder.conf \  
  2. DEFAULT volume_driver cinder.volume.drivers.nfs.NfsDriver
复制代码



重新启动服务
  1. service openstack-cinder-volume restart<span style="font-size:14px;">   
  2. </span>
复制代码



查看客户端上磁盘的情况
1.png


添加了最后一条记录
创建一个虚拟机,网络硬盘,并将网络硬盘挂载到主机上
控制台:
2.png


虚拟机:
3.png


在虚拟机中挂载硬盘
先使用下面的命令格式化
  1. mkfs.ext4 /dev/vdb
复制代码

再以此执行下面的命令

问题
挂载的过程中,nova/compute.log中出现以下异常
  1. 2014-10-2312:23:28.193 1747 INFO urllib3.connectionpool [-] Starting new HTTP connection(1): 192.168.40.248  
  2.   
  3. 2014-10-2312:23:28.395 1747 WARNING nova.virt.libvirt.utils[req-5bf92b88-6d15-4c41-8ed7-3325fdea0dcf 5832a2295dc14de79522ee8b42e7daac9207105ae2ac4ef3bdf5dfe40d99fd8d] systool is not installed  
  4.   
  5. 2014-10-2312:23:28.449 1747 WARNING nova.virt.libvirt.utils[req-5bf92b88-6d15-4c41-8ed7-3325fdea0dcf 5832a2295dc14de79522ee8b42e7daac9207105ae2ac4ef3bdf5dfe40d99fd8d] systool is not installed  
  6.   
  7. 2014-10-2312:23:28.451 1747 INFO urllib3.connectionpool [-] Starting new HTTP connection(1): 192.168.40.248  
  8.   
  9. 2014-10-2312:23:28.960 1747 ERROR nova.virt.block_device[req-5bf92b88-6d15-4c41-8ed7-3325fdea0dcf 5832a2295dc14de79522ee8b42e7daac9207105ae2ac4ef3bdf5dfe40d99fd8d] [instance:eb1742c6-1e73-4656-b646-ca8442519e7a] Driver failed to attach volume a1862c54-0671-4cc5-9fce-5e5f8485c21fat /dev/vdb  
  10.   
  11. 2014-10-2312:23:28.960 1747 TRACE nova.virt.block_device [instance:eb1742c6-1e73-4656-b646-ca8442519e7a] Traceback (most recent call last):  
  12.   
  13. 2014-10-2312:23:28.960 1747 TRACE nova.virt.block_device [instance:eb1742c6-1e73-4656-b646-ca8442519e7a]  File"/usr/lib/python2.6/site-packages/nova/virt/block_device.py", line239, in attach  
  14.   
  15. 2014-10-2312:23:28.960 1747 TRACE nova.virt.block_device [instance:eb1742c6-1e73-4656-b646-ca8442519e7a]    device_type=self['device_type'], encryption=encryption)  
  16.   
  17. 2014-10-2312:23:28.960 1747 TRACE nova.virt.block_device [instance:eb1742c6-1e73-4656-b646-ca8442519e7a]  File"/usr/lib/python2.6/site-packages/nova/virt/libvirt/driver.py", line1267, in attach_volume  
  18.   
  19. 2014-10-2312:23:28.960 1747 TRACE nova.virt.block_device [instance:eb1742c6-1e73-4656-b646-ca8442519e7a]    disk_dev)  
  20.   
  21. 2014-10-2312:23:28.960 1747 TRACE nova.virt.block_device [instance:eb1742c6-1e73-4656-b646-ca8442519e7a]  File"/usr/lib/python2.6/site-packages/nova/openstack/common/excutils.py",line 68, in __exit__  
  22.   
  23. 2014-10-2312:23:28.960 1747 TRACE nova.virt.block_device [instance:eb1742c6-1e73-4656-b646-ca8442519e7a]    six.reraise(self.type_, self.value, self.tb)  
  24.   
  25. 2014-10-2312:23:28.960 1747 TRACE nova.virt.block_device [instance:eb1742c6-1e73-4656-b646-ca8442519e7a]  File"/usr/lib/python2.6/site-packages/nova/virt/libvirt/driver.py", line1254, in attach_volume  
  26.   
  27. 2014-10-2312:23:28.960 1747 TRACE nova.virt.block_device [instance:eb1742c6-1e73-4656-b646-ca8442519e7a]    virt_dom.attachDeviceFlags(conf.to_xml(), flags)  
  28.   
  29. 2014-10-2312:23:28.960 1747 TRACE nova.virt.block_device [instance:eb1742c6-1e73-4656-b646-ca8442519e7a]  File "/usr/lib/python2.6/site-packages/eventlet/tpool.py",line 183, in doit  
  30.   
  31. 2014-10-2312:23:28.960 1747 TRACE nova.virt.block_device [instance:eb1742c6-1e73-4656-b646-ca8442519e7a]    result = proxy_call(self._autowrap, f, *args, **kwargs)  
  32.   
  33. 2014-10-2312:23:28.960 1747 TRACE nova.virt.block_device [instance:eb1742c6-1e73-4656-b646-ca8442519e7a]  File "/usr/lib/python2.6/site-packages/eventlet/tpool.py",line 141, in proxy_call  
  34.   
  35. 2014-10-2312:23:28.960 1747 TRACE nova.virt.block_device [instance:eb1742c6-1e73-4656-b646-ca8442519e7a]    rv = execute(f, *args, **kwargs)  
  36.   
  37. 2014-10-2312:23:28.960 1747 TRACE nova.virt.block_device [instance:eb1742c6-1e73-4656-b646-ca8442519e7a]  File "/usr/lib/python2.6/site-packages/eventlet/tpool.py",line 122, in execute  
  38.   
  39. 2014-10-2312:23:28.960 1747 TRACE nova.virt.block_device [instance:eb1742c6-1e73-4656-b646-ca8442519e7a]    six.reraise(c, e, tb)  
  40.   
  41. 2014-10-2312:23:28.960 1747 TRACE nova.virt.block_device [instance:eb1742c6-1e73-4656-b646-ca8442519e7a]  File "/usr/lib/python2.6/site-packages/eventlet/tpool.py",line 80, in tworker  
  42.   
  43. 2014-10-2312:23:28.960 1747 TRACE nova.virt.block_device [instance:eb1742c6-1e73-4656-b646-ca8442519e7a]    rv = meth(*args, **kwargs)  
  44.   
  45. 2014-10-2312:23:28.960 1747 TRACE nova.virt.block_device [instance:eb1742c6-1e73-4656-b646-ca8442519e7a]  File "/usr/lib64/python2.6/site-packages/libvirt.py", line419, in attachDeviceFlags  
  46.   
  47. 2014-10-2312:23:28.960 1747 TRACE nova.virt.block_device [instance:eb1742c6-1e73-4656-b646-ca8442519e7a]    if ret == -1: raise libvirtError ('virDomainAttachDeviceFlags() failed',dom=self)  
  48.   
  49. 2014-10-2312:23:28.960 1747 TRACE nova.virt.block_device [instance:eb1742c6-1e73-4656-b646-ca8442519e7a] libvirtError: internal error unable toexecute QEMU command '__com.redhat_drive_add': Device 'drive-virtio-disk1'could not be initialized
复制代码



解决方法
这个错来自libvirt,做以下设置即可,先察看virt_use_nfs是off还是on
  1. /usr/sbin/getseboolvirt_use_nfs  
复制代码


如果是off,做以下设置
  1. /usr/sbin/setsebool -P virt_use_nfs on  
复制代码





没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条