关于存储的一些问题

Ceph增加osd的方法

    如果在部署环境前无法识别硬盘,但是环境又要求存储必须为ceph,可以用如下方法:

部署模式按ceph走,在磁盘划分的时候根据实际情况划分

环境部署成功且各组件正常工作,这时候到相应的节点查看部署前未被识别的硬盘是否被识

别(注:不要对识别的新硬盘进行分区格式化!!!)如果有,请按如下方法进行ceph

的osd的增加:

1:首先查看当前环境的ceph环境

ceph osd tree

node-xxx

osd.4  up

记住相应节点的当前有几个osd,方便一会增加后进行核实

2:在相应的节点(非管理节点)执行如下命令

ceph-deploy osd prepare $(hostname -s):/dev/sdx

ceph-deploy osd activate $(hostname-s):/dev/sdx1

注:第一步执行后,它是在进行硬盘的分区和格式化,硬盘会被分成两个分区,只有第一个分区才是有用的,由于是首次操作,第二个分区用作OSD日志

3:在管理节点查看

ceph -s

正常的话,这时候就能看到相应节点已经新增了osd

 

ceph-deploy添加硬盘(存储上的LUN)报错

问题原因:ceph-deploy不支持外挂存储

解决方法:

手动添加OSD示例:

uuidgen

cephosd create 906f693a-acb0-4f24-8e2c-a8d7cdaec63f

mkdir/var/lib/ceph/osd/ceph-3

mkfs-t xfs /dev/mapper/mpathcp

mount-t xfs /dev/mapper/mpathcp1 /var/lib/ceph/osd/ceph-3

ceph-osd-i 3 --mkfs --mkkey --osd-uuid 906f693a-acb0-4f24-8e2c-a8d7cdaec63f

cephauth add osd.3 osd 'allow *' mon 'allow profile osd' -i/var/lib/ceph/osd/ceph-3/keyring

cephosd crush add osd.3 1.0 host=node-6

ceph-diskactivate /var/lib/ceph/osd/ceph-3

vim/etc/fstab

/dev/mapper/mpathcp    /var/lib/ceph/osd/ceph-3  xfs  defaults,noatime,inode64        00

 

从EBS启动的镜像准备方法

 

1、上传镜像到glance,执行glance p_w_picpath-list确保镜像上传成功

2、设置镜像的属性,glance p_w_picpath-update --propertyarchitecture=XXXX --property os_distro=XXXX --propertyos_version=XXXX   --property vol_size=X  p_w_picpath-ID 

3、创建镜像对应的可启动卷,cinder create --p_w_picpath-id p_w_picpath-ID --display-name XXXX  size,执行cinder list 确保volume创建成功

      可以通过qemu-imginfo 来查看镜像的size,对于qcow2格式的镜像,size必须大于virtualsize。

4、设置volume的属性,cinder  metadata volume-ID setawcloud_public_p_w_picpath=yes

5、经过上述设置,选择imge创建虚拟机时,会直接从对应的volume clone出一个新的volume。

1、上传镜像到glance,执行glance p_w_picpath-list确保镜像上传成功

2、设置镜像的属性,glance p_w_picpath-update --propertyarchitecture=XXXX --property os_distro=XXXX --propertyos_version=XXXX   --property vol_size=X  p_w_picpath-ID 

3、创建镜像对应的可启动卷,cinder create --p_w_picpath-id p_w_picpath-ID  --display-name XXXX size,执行cinder list 确保volume创建成功

      可以通过qemu-img info 来查看镜像的size,对于qcow2格式的镜像,size必须大于virtual size。

4、设置volume的属性,cinder metadata volume-ID set awcloud_public_p_w_picpath=yes

5、经过上述设置,选择imge创建虚拟机时,会直接从对应的volumeclone出一个新的volume。

 

 

ceph中如何查找一个object或者rbd p_w_picpath的实际数据存储位置

ceph同时提供对象存储、块存储、文件存储三种接口,但本质上其实是对象存储,也就是说一个rbd p_w_picpath实际上包含了多个对象(默认情况下是p_w_picpath_size/4M),这里我们首先介绍一下如何查找一个对象的实际存储位置,然后介绍如何查找rbd p_w_picpath。

 

ceph中查找一个对象的位置

1、上传一个文件到pool(示例中叫做test)中

      rados -p  testput cirros cirros-0.3.2-x86_64-disk.img

2、查看pool中刚才上传的对象

       rados -p test ls| grep cirros

3、查看对象的位置信息

       ceph osd maptest cirros

       输出结果:

       osdmap e20062pool 'test' (13) object 'cirros' -> pg 13.9576dc54 (13.54) -> up ([5,3],p5) acting ([5,3], p5)

       这代表pool test中的cirros这个对象位于13.54这个pg中,并且位于osd5和osd3上(两个副本)。

4、进入到对应osd的存储目录,找到对应文件即可。

     cd /var/lib/ceph/osd/ceph-3/current/13.54_head; ls

      这个目录下存放了13.54这个pg中所有的object,可以根据指纹9576dc54来定位到具体的文件。

 

 

ceph中查找一个rbd p_w_picpath的存储位置

正如文章开头提到,一个rbd p_w_picpath其实包含了多个obejct,因此我们只需找到这个p_w_picpath包含了哪些object,然后按照上面的方法找出每个object的位置即可。

1、在pool test中创建一个p_w_picpath1

      rbd createtest/p_w_picpath1 --size 100 --p_w_picpath-format 2

2、查看这个p_w_picpath,找到指纹信息

       rbd infotest/p_w_picpath1

       命令输出

       rbd p_w_picpath 'p_w_picpath1':
 size 102400 kB in 25 objects
 order 22 (4096 kB objects)
 block_name_prefix: rbd_data.4eed912ae8944a
 format: 2
 features: layering, exclusive

        指纹就是4eed912ae8944a

3、根据指纹找到这个p_w_picpath的object

      rados -p test ls| grep 4eed912ae8944a

       这个命令的输出就是这个p_w_picpath的所有object

4、按照上面的方法即可找到每个object对应的实际存储位置

 

 

ceph 状态恢复同步过程卡住(大量pgs)

处理过程

检查curshmap的分配是,如果有rack,查看该rack中的pg 是否够用,如果不够那就要向rack中添加主机:osd:容量等

问题原因分析:在同步过程中会不断的申请pg,所以在同步之前一定要检查容量和pg是有够用

 

PV丢失的故障处理

问题

手工创建逻辑卷失败,报错显示有PV丢失

现象:中科院云平台无法创建虚拟机

1.查看日志,发现是在创建逻辑卷的时候报错

2.手工创建逻辑卷失败,报错显示有PV丢失:

[root@node29archive]# lvcreate -L 1G -n testlv vgcloud

Cannotchange VG vgcloud while PVs are missing.

Considervgreduce --removemissing.

3.进一步查看:

[root@node29archive]# pvs

  PV                   VG      Fmt Attr PSize PFree 

  /dev/mapper/mpathbp1 vgcloud lvm2 a--  1.82t 89.40g

  /dev/mapper/mpathbp2 vgcloud lvm2 a--  1.82t 91.14g

  /dev/mapper/mpathbp3 vgcloud lvm2 a--  1.82t 30.14g

  /dev/mapper/mpathbp4 vgcloud lvm2 a--  1.64t 30.00g

  /dev/mapper/mpathcp1 vgcloud lvm2 a-m  1.82t 84.14g

  /dev/mapper/mpathcp2 vgcloud lvm2 a-m  1.82t 117.14g

  /dev/mapper/mpathcp3 vgcloud lvm2 a-m  1.82t  1.33t

  /dev/mapper/mpathcp4 vgcloud lvm2 a--  1.81t  1.81t

 

[root@node29archive]# vgs

  VG     #PV #LV #SN Attr   VSize  VFree

  vgcloud  8 126   0 wz-pn- 14.36t 3.58t

 

其中发现有三个逻辑卷处于missing的状态

 

4.经过查找资料得知可以使用vgextend –restoremissing操作解决

#manvgextend

......

DESCRIPTION

       vgextend allows  you to add one or moreinitialized physical volumes ( see pvcre-

       ate(8) ) to an existing volume group toextend it in size. Moreover, it allows you

       to re-add  a physical volume that hasgone missing previously, due to a transient

       device failure, without re-initialisingit. Use vgextend --restoremissing to that

       effect.

......

5.处理

[root@node26tmp]# vgextend --restoremissing vgcloud /dev/mapper/mpathcp1

  Volume group "vgcloud" successfullyextended

[root@node26tmp]# vgextend --restoremissing vgcloud /dev/mapper/mpathcp2

  Volume group "vgcloud" successfullyextended

[root@node26tmp]# vgextend --restoremissing vgcloud /dev/mapper/mpathcp3

  Volume group "vgcloud" successfullyextended

6.再看已经没有missing状态标示了

   手工创建逻辑卷

[root@node29archive]# lvcreate -L 1G -n testlv vgcloud

  Logical volume "testlv" created

7.再创建虚拟机就可以了

 

在线添加磁盘

下面就是一般的给虚拟机的逻辑卷括容的操作了。首先查看虚拟机有多少块磁盘。

#virsh domblklist fuelmaster-ng

Target     Source

------------------------------------------------

vda        /var/lib/libvirt/ssd/fuelmaster61.img

hda        /var/lib/libvirt/p_w_picpaths/fuel-community-6.1-396-2015-10-11_04-29-43.iso

其中fuelmaster-ng是虚拟机的名字。我们决定添加一个新磁盘vdb。

创建一个空的100GB磁盘文件。

# ddif=/dev/zero of=/var/lib/libvirt/p_w_picpaths/fuelmaster61vdb.img bs=1G seek=100count=0

记录了0+0 的读入

记录了0+0 的写出

0字节(0B)已复制,0.00384708 秒,0.0 kB/秒

创建一个设备描述XML。

vdb.xml

='file'>

 

 =>

 

接着把这个设备在线添加到虚拟机。

#virsh attach-device --persistent fuelmaster-ng vdb.xml

成功附加设备

检查是否成功添加:

#virsh domblklist fuelmaster-ng

Target     Source

------------------------------------------------

vda        /var/lib/libvirt/ssd/fuelmaster61.img

vdb       /var/lib/libvirt/p_w_picpaths/fuelmaster61vdb.img

hda        /var/lib/libvirt/p_w_picpaths/fuel-community-6.1-396-2015-10-11_04-29-43.iso

 

 

在线扩容

下面的操作需要在虚拟机里进行。

首先用lsblk查看是否发现了新磁盘。

#lsblk

NAME          

vda                                                                                              252:0    0  100G  0disk

├─vda1                                                                                           252:1    0   24M  0part

├─vda2                                                                                           252:2    0  200M  0part /boot/efi

├─vda3                                                                                           252:3    0  200M  0part /boot

└─vda4                                                                                           252:4    0 99.6G  0 part

  ├─os-swap(dm-0)                                                                               253:0    0  3.9G  0lvm  [SWAP]

  ├─os-root(dm-1)                                                                               253:1    0  9.8G  0lvm  /

  ├─os-var(dm-2)                                                                                253:2    0 26.4G  0 lvm /var

  ├─os-varlibdocker(dm-3)                                                                       253:3    0 27.7G  0 lvm /var/lib/docker

  └─os-varlog(dm-4)                                                                             253:4    0 31.8G  0 lvm /var/log

sr0                                                                                               11:0    1  2.9G  0rom 

vdb                                                                                              252:16   0  100G  0disk

看到一个100G的vdb。

接着创建物理卷。

#pvcreate /dev/vdb

  Physical volume "/dev/vdb"successfully created

接着对卷组os进行括容。

#vgextend os /dev/vdb

  Volume group "os" successfullyextended

接着对逻辑卷varlibdocker括容。

#lvextend --extent +100%FREE /dev/os/varlibdocker

  Size of logical volume os/varlibdockerchanged from 27.69 GiB (886 extents) to 127.75 GiB (4088 extents).

  Logical volume varlibdocker successfullyresized

注意是+100%不是100%。

最后对文件系统括容。

#resize2fs /dev/os/varlibdocker

resize2fs1.41.12 (17-May-2010)

Filesystemat /dev/os/varlibdocker is mounted on /var/lib/docker; on-line resizingrequired

olddesc_blocks = 2, new_desc_blocks = 8

Performingan on-line resize of /dev/os/varlibdocker to 33488896 (4k) blocks.

Thefilesystem on /dev/os/varlibdocker is now 33488896 blocks long.

Fuel的问题

Web界面删除OpenStack环境长时间无响应的处理

如果有节点掉线,或者有的节点正在安装操作系统,终止部署和删除环境都可能等待很长时间无法完成。

在这种情况下,可以通过登录fuel master的ssh,使用fuel后台命令强制删除节点和环境。

用fuel task列出所有任务,示例输出如下:

[root@fuelmaster ~]# fuel task

id | status | name       | cluster | progress| uuid                               

---|---------|------------|---------|----------|-------------------------------------

46 | ready  | provision  | 1       | 100      | 57427dff-ec6e-4219-a1e8-c8ccb490f3a3

47 | running | deployment | 1       | 50       | 19cbf0d7-8e9b-4366-af86-9f45558611e4

43 | running | deploy     | 1      | 64       |66de25c6-be12-40c9-8bde-1695aa004c06

如果是删除环境没有完成,会看到一个处于running状态的删除环境的任务。强制删除没有完成的任务。

fuel task --delete --force --task XX

其中XX是刚才列出来的task的编号。

用fuel env命令列出所有的环境:

[root@fuelmaster ~]# fuel env

id | status     | name | mode       | release_id | changes                                                                                                                                                       |pending_release_id

---|------------|------|------------|------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------

1  |deployment | test | ha_compact | 1         | [{u'node_id': None, u'name': u'attributes'}, {u'node_id': None,u'name': u'networks'}, {u'node_id': 1, u'name': u'disks'}, {u'node_id': 2,u'name': u'disks'}] | None

重置这个环境:

fuel reset --env X

其中X是这个环境的id。

接着就需要手动重启所有这个环境里的物理机。物理机重启成功后,会进入bootstrap系统,然后抹除当前系统里的磁盘数据,再重启。

使用fuel task命令可以观察到出现一个新的reset任务。这个任务完成后,等待所有物理机进入bootstrap系统。用fuel node命令应该能看到这些节点处于discover状态。

这时就可以在界面上正常删除OpenStack环境了。

如果仍然有问题,使用下面的命令强制删除node,然后重启物理机,重新发现。

fuel node --node-id X1,X2,X3--delete-from-db

其中X1、X2、X3是用fuel node命令看到的node编号。

 

 

修改数据库中承载网的VLAN ID

进入fuel master的postgresql的命令行。

dockerctl shell postgres sudo -u postgrespsql -d nailgun

运行下面的sql命令

select * from network_groups;

示例输出


nailgun=#select * from network_groups;

 id |    name      | release | vlan_start|       cidr       |    gateway     |                                                                   

    meta                                                                                                                                                   | group_id

----+---------------+---------+------------+------------------+-----------------+---------------------------------------------------------------------

------------------------------------------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------+----------

  1 | fuelweb_admin |         |            | 10.20.0.0/24     |                | {"notation": "ip_ranges", "render_type":null, "assign_vip": false,

"configurable":false, "unmovable": true, "use_gateway": true,"render_addr_mask": null, "map_priority": 0}                                         

                                                                                     |       

  2 | public        |      1 |            | 192.168.247.0/24| 192.168.247.254 | {"name": "public","notation": "ip_ranges", "render_type": null,"as

sign_vip":true, "map_priority": 1, "floating_range_var":"floating_ranges", "use_gateway": true, "vlan_start":null, "render_addr_mask": "public", "c

idr":"172.16.0.0/24", "configurable": true,"ip_range": ["172.16.0.2", "172.16.0.126"]}|        1

  3 | management    |      1 |       1001 |192.168.0.0/24   |                 | {"name":"management", "notation": "cidr","render_type": "cidr", "a

ssign_vip":true, "map_priority": 2, "use_gateway": false,"vlan_start": null, "render_addr_mask":"internal", "cidr": "192.168.0.0/24","configurable

":true}                                                                                |        1

  4 | storage       |      1 |       1002 |192.168.1.0/24   |                 | {"name":"storage", "notation": "cidr","render_type": "cidr", "assi

gn_vip":false, "map_priority": 2, "use_gateway": false,"vlan_start": null, "render_addr_mask":"storage", "cidr": "192.168.1.0/24","configurable":

true}                                                                                   |        1

  5 | private       |      1 |            |                  |                 | {"name": "private","notation": null, "render_type": null, "assign_v

ip":false, "map_priority": 2, "use_gateway": false,"vlan_start": null, "render_addr_mask": null,"neutron_vlan_range": true, "configurable": false,

"seg_type":"vlan"}                                                                      |        1

(5rows)

譬如要修改存储网的VLAN ID,在上面的输出中,存储网的数据库ID是4,那么执行下面的语句。

updatenetwork_groups set vlan_start=1003 where id=4;

示例输出

nailgun=#update network_groups set vlan_start=1003 where id=4;

UPDATE1

这时候再刷新Web界面,看到存储网的ID已经变了。

 

 

P2V过程异常类

windows迁移后起虚拟机蓝屏

处理过程:先保证你的第一块盘,也就是系统盘是IDE,然后开机,安装RHEV-toolsetup;然后关机;这时候你要将你的网卡改成virtro,然后最重要的是你要额外填加一块virtro的硬盘,然后开机,这时候系统会发现新硬件并安装相应的驱动;之后关机,删除第二块硬盘,并将系统盘改成virtro,然后开机

问题原因分析:系统虽然安装了virtro硬盘驱动,但是如果没有相应硬盘,windows就没有办法发现硬件并安装驱动。

 

让已部署的节点临时进入Bootstrap模式

有时希望测试已部署的节点的硬件,比如测试网卡性能,而已部署的节点大都建了bond、网桥、服务网络,要拆除这些设备然后测网卡会比较麻烦。

一个简单的方法是重启机器并进入Bootstrap模式。主要的问题是,重启机器后PXE收到的菜单里只有本地磁盘启动,并且菜单超时时间为0,没有机会选择进入Bootstrap。

可以从Cobbler的后台修改菜单,实现进入Bootstrap。首先记录目标机器的PXE网卡的MAC地址,然后进入cobbler容器,并执行下面的操作。

dockerctl shell cobbler

cd /var/lib/tftpboot/pxelinux.cfg/

备份现在的菜单,假设目标机器的PXE网卡的MAC地址是01:0c:c4:7a:18:93:74

mv 01-0c-c4-7a-18-93-74   01-0c-c4-7a-18-93-74.bk 

cp default 01-0c-c4-7a-18-93-74  # 用Bootstrap菜单覆盖现在的菜单

接着,重启目标机器,自然就进入Bootstrap系统了。要回到原来的系统,就再次进入cobbler容器,还原刚才备份的01-0c-c4-7a-18-93-74.bk文件即可。

注意,有时目标机器不是从eth0启动的,或者启动的网卡的顺序不固定,如果发现不能进入Bootstrap系统,可以找到其他几块网卡对的MAC地址对应的菜单文件,用Bootstrap菜单覆盖掉即可。