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

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文件的修改,配置内容如下:

/nfs/shared192.168.40.0/255.255.255.0(rw,sync)

以上配置标示"192.168.40.0/255.255.255.0"这个网段的用户可以挂载NFS服务器上的/nfs/shared目录,挂载后具有读写权限,由于没有指定压缩用户权限的方式,所以就算以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的共享状态

# 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命令来使改动立刻生效

exportfs -arv

Cinder节点NFS客户端配置

安装相关软件

yum install rpcbindnfs-utils

启动相关服务

servicerpcbind start
servicenfslock start
chkconfigrpcbind on
chkconfignfs on
chkconfignfslock on

检查NFS服务器端的共享信息

NFS服务器的IP为192.168.40.107

[[email protected](keystone_admin)]# showmount -e 192.168.40.107

Exportlist for 192.168.40.107:

/nfs/shared192.168.40.0/255.255.255.0

挂载到本地目录

cd /root

mkdir nfsshare

mount -tnfs 192.168.40.107:/nfs/shared /root/nfsshare/

查看挂载结果

[[email protected]~(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:/nfs/shared           444G 1.4G  420G   1% /root/nfsshare

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

Cinder节点NFS后端存储配置

创建/etc/cinder/nfsshares文件,并编辑内容如下

192.168.40.107:/home/nfsshare

设置配置文件的权限

[[email protected]~]# chown root:cinder /etc/cinder/nfsshares

[[email protected]~]# 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>

查看客户端上磁盘的情况

添加了最后一条记录

创建一个虚拟机,网络硬盘,并将网络硬盘挂载到主机上

控制台:

虚拟机:

在虚拟机中挂载硬盘

先使用下面的命令格式化

mkfs.ext4 /dev/vdb

再以此执行下面的命令

问题

挂载的过程中,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
时间: 2024-10-08 21:17:08

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

Android Preference存储、res/raw、asset、openFileOutput、sdcard存储、Cache详解

*res/raw.assets.其它存储的相同点: 两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制. 两者都是只读,是不能存储数据的目录. 相同都可以放文件. *res/raw.assets.其它存储的不同点: res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename:assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类. res/raw不可以有目录结构,而assets则可以有目

线性表链式存储的实现详解

本文原创,转载请注明:http://blog.csdn.net/j903829182/article/details/38173681 #include<stdio.h> #include<malloc.h> //线性表的链式存储和实现,带头点 #define true 1 #define false 0 typedef int DataType;//定义抽象数据类型 //节点的结构体 typedef struct Node{ DataType data;//节点的数据域 stru

面试 -- Java内存布局【图】以及java各种存储区【详解】

一.Java内存布局浅谈 1. 总述 我们知道,线程是操作系统调度的基本单元.所有线程共享父进程的堆空间,而每个线程都有自己的栈空间和程序计数器.所以,Java虚拟机也看以看作是一个独立的进程,里面的内存空间分为线程共享空间和线程独有空间.Java虚拟机内存布局如下: 2. 所有线程共享的内存空间 (1)堆空间:JVM规范中规定,所有对象实例以及数组都要在堆上进行分配.一般来说,堆空间都有一个默认大小,取决于JVM实现,而且可以根据需要动态扩展.当创建对象需要在堆上分配空间,而且堆本身的空间不够

Android开发数据存储之ContentProvider详解

转载:十二.ContentProvider和Uri详解 一.使用ContentProvider(内容提供者)共享数据 ContentProvider在android中的作用是对外共享数据,也就是说你可以通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider对你应用中的数据进行添删改查.关于数据共享,以前我们学习过文件操作模式,知道通过指定文件的操作模式为Context.MODE_WORLD_READABLE或Context.MODE_W

存储基础知识详解

一. 硬盘接口类型 1.并行接口还是串行接口(1) 并行接口 指的是并行传输的接口,比如有0~9十个数字,用10条传输线,那么每根线只需要传输一位数字,即可完成.         从理论上看,并行传输效率很高,但是由于线路上的物理原因,它的传输频率不能太高,所以实际的传输速度并不和并行度成正比,甚至可能更差. (2) 串行接口 指的是串行传输的接口,同样是0~9十个数字,用1条传输线,那么需要传输10次,才可以完成.          从理论上看,串行传输效率不高,但是由于它的数据准确性,高频率

安卓数据存储总结及详解

前言(首先说说什么存储的几个概念) 打开手机设置,选择应用管理,选择任意一个App,然后你会看到两个按钮,一个是清除缓存,另一个是清除数据,那么当我们点击清除缓存的时候清除的是哪里的数据?当我们点击清除数据的时候又是清除的哪里的数据? 在Android开发中我们常常听到这样几个概念,内存,内部存储,外部存储,很多人常常将这三个东西搞混,那么我们今天就先来详细说说这三个东西是怎么回事? 内存: 我们在英文中称作memory,内部存储,我们称为InternalStorage,外部存储我们称为Exte

openstack中nfs最为nova的后端存储

运行一个可用的nfs服务: [[email protected] ~]# showmount -e 192.168.100.10Export list for controller:/nfs *查看openstack当前nova的后端存储位置:我修改了默认云主机存储路径 [[email protected] ~]# cat /etc/nova/nova.conf | grep instances_path | grep -v "#"instances_path=/data/nova/i

配置NFS网络存储作为cinder的后端存储

安装cinder和nfs yum install -y openstack-cinder yum install cifs-utils 在controller节点配置nfs [[email protected] ~]# mkdir -p /data/nfs #创建一个共享挂载资源的目录 [[email protected] ~]# cat /etc/exports /data/nfs *(rw,sync,root_squash) #NFS服务程序的配置文件为/etc/exports sync 同

基于php使用memcache存储session的详解(转)

web服务器的php session都给memcached ,这样你不管分发器把 ip连接分给哪个web服务器都不会有问题了,配置方法很简单,就在php的配置文件内增加一条语句就可以了,不过前提你需要装好memcache模块 1.设置session用memcache来存储方法I: 在 php.ini 中全局设置session.save_handler = memcachesession.save_path = "tcp://127.0.0.1:11211"方法II: 某个目录下的 .h