问题导读
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服务器端的安装
yum -y install rpcbind nfs-utils 复制代码
NFS服务器端的配置
NFS服务器端的配置比较简单,基本只涉及/etc/exports文件的修改,配置内容如下:
/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服务的启动
service rpcbind start
service nfs start
service nfslock start
chkconfig rpcbind on
chkconfig nfs on
chkconfig nfslock on 复制代码
NFS服务验证
服务器端使用showmount命令查询NFS的共享状态
# showmount-e //默认查看自己共享的服务,前提是要DNS能解析自己,不然容易报错
# showmount-a //显示已经与客户端连接上的目录信息 复制代码
客户端使用showmount命令查询NFS的共享状态
复制代码
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命令来使改动立刻生效
复制代码
Cinder节点NFS客户端配置
安装相关软件
yum install rpcbindnfs-utils 复制代码
启动相关服务
servicerpcbind start
servicenfslock start
chkconfigrpcbind on
chkconfignfs on
chkconfignfslock on 复制代码
检查NFS服务器端的共享信息
NFS服务器的IP为192.168.40.107
[root@controllernodeimages(keystone_admin)]# showmount -e 192.168.40.107
Exportlist for 192.168.40.107:
/home/nfsshare 192.168.40.0/255.255.255.0 复制代码
挂载到本地目录
cd /root
mkdir nfsshare
mount -tnfs 192.168.40.107:/home/nfsshare /root/nfsshare/ 复制代码
查看挂载结果
[root@controllernode~(keystone_admin)]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 97G 4.8G 87G 6% /
tmpfs 3.9G 4.0K 3.9G 1% /dev/shm
/srv/loopback-device/swift_loopback 1.9G 67M 1.8G 4% /srv/node/swift_loopback
192.168.40.107:/home/nfsshare 444G 1.4G 420G 1% /root/nfsshare 复制代码
需要注意的是,如果此时NFS服务器出现故障,或者是客户端不能连接到服务端,由于该命令要等待文件系统查找超时后才返回结果,所以该操作会变的很慢,该原理是用于所有针对文件系统的命令,例如 df,ls,cp等
Cinder节点NFS后端存储配置
创建/etc/cinder/nfsshares文件,并编辑内容如下
192.168.40.107:/home/nfsshare 复制代码
设置配置文件的权限
[root@controllernode~]# chown root:cinder /etc/cinder/nfsshares
[root@controllernode~]# chmod 0640 /etc/cinder/nfsshares 复制代码
配置cinder的volume 服务是用NFS
修改/etc/cinder/cinder.conf中的值为/etc/cinder/nfsshares,可执行下面的命令
openstack-config --set /etc/cinder/cinder.conf \
DEFAULT nfs_shares_config /etc/cinder/nfsshares 复制代码
配置cinder的volume使用的驱动,可使用以下命令
openstack-config --set /etc/cinder/cinder.conf \
DEFAULT volume_driver cinder.volume.drivers.nfs.NfsDriver 复制代码
重新启动服务
service openstack-cinder-volume restart<span style="font-size:14px;">
</span> 复制代码
查看客户端上磁盘的情况
添加了最后一条记录
创建一个虚拟机,网络硬盘,并将网络硬盘挂载到主机上
控制台:
虚拟机:
在虚拟机中挂载硬盘
先使用下面的命令格式化
复制代码
再以此执行下面的命令
问题
挂载的过程中,nova/compute.log中出现以下异常
2014-10-2312:23:28.193 1747 INFO urllib3.connectionpool [-] Starting new HTTP connection(1): 192.168.40.248
2014-10-2312:23:28.395 1747 WARNING nova.virt.libvirt.utils[req-5bf92b88-6d15-4c41-8ed7-3325fdea0dcf 5832a2295dc14de79522ee8b42e7daac9207105ae2ac4ef3bdf5dfe40d99fd8d] systool is not installed
2014-10-2312:23:28.449 1747 WARNING nova.virt.libvirt.utils[req-5bf92b88-6d15-4c41-8ed7-3325fdea0dcf 5832a2295dc14de79522ee8b42e7daac9207105ae2ac4ef3bdf5dfe40d99fd8d] systool is not installed
2014-10-2312:23:28.451 1747 INFO urllib3.connectionpool [-] Starting new HTTP connection(1): 192.168.40.248
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
2014-10-2312:23:28.960 1747 TRACE nova.virt.block_device [instance:eb1742c6-1e73-4656-b646-ca8442519e7a] Traceback (most recent call last):
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
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)
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
2014-10-2312:23:28.960 1747 TRACE nova.virt.block_device [instance:eb1742c6-1e73-4656-b646-ca8442519e7a] disk_dev)
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__
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)
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
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)
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
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)
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
2014-10-2312:23:28.960 1747 TRACE nova.virt.block_device [instance:eb1742c6-1e73-4656-b646-ca8442519e7a] rv = execute(f, *args, **kwargs)
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
2014-10-2312:23:28.960 1747 TRACE nova.virt.block_device [instance:eb1742c6-1e73-4656-b646-ca8442519e7a] six.reraise(c, e, tb)
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
2014-10-2312:23:28.960 1747 TRACE nova.virt.block_device [instance:eb1742c6-1e73-4656-b646-ca8442519e7a] rv = meth(*args, **kwargs)
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
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)
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
/usr/sbin/getseboolvirt_use_nfs 复制代码
如果是off,做以下设置
/usr/sbin/setsebool -P virt_use_nfs on 复制代码