VMware Workstation 共享磁盘和Linux的UDEV使用

VMware Workstation 共享磁盘和Linux的UDEV使用


因为要测试Oracle RAC的安装,需要使用共享磁盘。 一般情况下做与Oracle相关的试验使用Oracle VM VirtualBox会比较好。不过由于个人比较偏爱VMware的虚拟工具,所以尝试用VMware Workstation做测试平台。但是也经历了一些困难。在这里做个总结,便于以后查阅。


实体机环境:Windows Server 2008 R2 Enterprise Edition, 64-bit , Service Pack 1

虚拟机环境:VMware Workstation 11.0.0

测试环境:CentOS 6.5_64bit,OracleLinux-R6-U3-x86_64 (测试过这两个系统)



参考资料:

关于udev与asmlib 以及Multipath的问题,提问前先看这个

http://www.askmaclean.com/archives/question-about-udev-asmlib.html


使用UDEV在Oracle Linux 6上安装Oracle 11g RAC(11.2.0.3)   
http://blog.csdn.net/staricqxyz/article/details/8447495


使用udev管理asmdisk执行/sbin/scsi_id不显示UUID 
http://blog.itpub.net/19602/viewspace-1172958/

使用udev管理asmdisk常用的命令 
http://blog.itpub.net/19602/viewspace-1173071/


Oracle_rac在vmware上面安装时,udev磁盘没有scsi_id返回值
http://www.68idc.cn/help/jiabenmake/qita/20141224149948.html

Vmware Workstation虚拟机如何设置共享磁盘 
http://longyue4585.blog.163.com/blog/static/3817153220126645339463/

How to use udev for Oracle ASM in Oracle Linux 6
http://www.dbform.com/html/2011/1708.html


VMwarelinux虚拟机无法获取uuid
http://www.bitscn.com/os/other/563854.html

Using the Virtual Machine UUID
http://pubs.vmware.com/workstation-9/index.jsp?topic=%2Fcom.vmware.ws.using.doc%2FGUID-533B2C4F-7BD5-41EB-8392-2B9FE687AE50.html

查看VMWARE UUID  
http://doorgods.blog.163.com/blog/static/7854785720133100591281/

更改或保留已移动虚拟机的 UUID (2040913)
http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2040913

oracle_使用udev绑定磁盘方法 

http://blog.sina.com.cn/s/blog_8317516b0101agp5.html

用UDEV服务解决RAC ASM存储设备名
http://blog.csdn.net/evils798/article/details/7616432


linux下获取scsi上的磁盘设备的序列号
http://blog.csdn.net/wwyyxx26/article/details/7739070

Linux下查看UUID方法
http://os.chinaunix.net/a2010/0312/1061/000001061871.shtml

Oracle RAC (11.2.0.4版本) For AIX 6.1安装手册
http://blog.csdn.net/alangmei/article/details/18310381


总结:

VMware 下面使用共享磁盘后有两种方法可以做UDEV。


先说基础部分,这一部分是共享磁盘的准备工作:
虚拟系统1和虚拟系统2,克隆虚拟系统1需要在新建(共享)磁盘之前。

虚拟系统1:
安装完Linux系统后,关闭系统。
1.在“设置”中添加硬盘,选“SCSI(S)推荐”,这里可选“独立(D)”,也可不选,第一次试验时选了,后来发现无法取得UUID,用了方法二解决共享磁盘问题。后两次试验没有选独立。
2.下一步,“创建新虚拟磁盘(V)”,“最大磁盘大小”自定义,建议不要选太大,下面要勾选“立即分配所有磁盘空间”,下面再勾选“将虚拟磁盘存储为单个文件”。 (因为如果选了“将虚拟磁盘拆分成多个文件”,那么虚拟系统2就没有办法共享同一个磁盘)。
3.下一步,指定虚拟磁盘路径和给虚拟磁盘命名,建好之后建议不要再修改了。重命名没试过,修改大小好像是不行了,只能删掉重建。

虚拟系统2:
1.在“设置”中添加硬盘,选“SCSI(S)推荐”,这里可选“独立(D)”,也可不选,第一次试验时选了,后来发现无法取得UUID,用了方法二解决共享磁盘问题。后两次试验没有选独立。
2.下一步,“使用现有虚拟磁盘”,选择路径找到虚拟系统1新加的磁盘。下面的模式不用选了。不过使用共享磁盘后快照就不能用了。
3.添加完成。


后面还不能直接启动系统,VWmare 会报错的。需要修改虚拟系统下的*.vmx文件,两个虚拟系统下的*.vmx文件都需要修改。

在*.vmx文件中找到以下参数:

//这是第一个磁盘的设置
scsi0:1.present = "TRUE"
scsi0:1.fileName = "D:\VMwareWorkstation\CentOS_Oracle11g\CentOS_Oracle11g_asmdisk01.vmdk"
scsi0:1.redo = ""
scsi0:1.mode = "independent-persistent"
scsi0:1.writeThrough="TRUE"
scsi0:1.sharedBus="virtual"
scsi0:1.deviceType = "disk"

//第二个磁盘的设置
scsi0:2.present = "TRUE"
scsi0:2.fileName = "D:\VMwareWorkstation\CentOS_Oracle11g\CentOS_Oracle11g_asmdisk02.vmdk"
scsi0:2.redo = ""
scsi0:2.mode = "independent-persistent"
scsi0:2.writeThrough="TRUE"
scsi0:2.sharedBus="virtual"
scsi0:2.deviceType = "disk"

//第三个磁盘的设置
scsi0:3.present = "TRUE"
scsi0:3.fileName = "D:\VMwareWorkstation\CentOS_Oracle11g\CentOS_Oracle11g_asmdisk03.vmdk"
scsi0:3.redo = ""
scsi0:3.mode = "independent-persistent"
scsi0:3.writeThrough="TRUE"
scsi0:3.sharedBus="virtual"
scsi0:3.deviceType = "disk"


//这一段没看懂,不过照抄就行
diskLib.dataCacheMaxSize = "0"
diskLib.dataCacheMaxReadAheadSize = "0"
diskLib.dataCacheMinReadAheadSize = "0"
diskLib.dataCachePageSize = "4096"
diskLib.maxUnsyncedWrites = "0"
disk.locking = "FALSE"
scsi1.virtualDev = "lsilogic"

//打开UUID,这个设置好像说是有弊端,就是之后修改虚拟系统的硬件配置的话会导致UUID值变更。所以可以将共享磁盘的操作留到最后处理。
disk.enableUUID = "TRUE"

修改参数是需仔细,如果原文件中已有“ scsi0:3.redo = ""” 参数,就不要重复添加了。如果参数不正确,启动虚拟机时会报错的。两个虚拟系统的参数文件修改后就可以分别启动这两个虚拟系统。

虚拟系统开启后先分别在系统中检查一下:
[root@localhost ~]# fdisk -l

Disk /dev/sda: 64.4 GB, 64424509440 bytes
255 heads, 63 sectors/track, 7832 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          38      305203+  83  Linux
/dev/sda2              39        7318    58476600   83  Linux
/dev/sda3            7319        7832     4128705   82  Linux swap / Solaris

Disk /dev/sdb: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Disk /dev/sdb doesn't contain a valid partition table

Disk /dev/sdc: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Disk /dev/sdc doesn't contain a valid partition table

Disk /dev/sdd: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Disk /dev/sdd doesn't contain a valid partition table

顺便提一下,Oracle RAC 64bit的内存设置要4G以上。不然安装前的检查是无法通过的。

如果两个虚拟系统都已认出了共享磁盘,就可以使用UDEV加载磁盘了。

1.确认已经安装了必要的UDEV包
[root@localhost ~]# rpm -qa|grep udev
udev-095-14.21.el5


(方法一)
2.配置udev
在虚拟系统1上执行下面脚本
for i in b c d  ;
do
echo "KERNEL==\"sd*\", BUS==\"scsi\", PROGRAM==\"/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/\$name\", RESULT==\"`/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/sd$i`\", NAME=\"asm-disk$i\", OWNER=\"grid\", GROUP=\"asmadmin\", MODE=\"0660\""      >> /etc/udev/rules.d/99-oracle-asmdevices.rules
done
//将文件拷贝到节点2(虚拟系统2)
scp /etc/udev/rules.d/99-oracle-asmdevices.rules node2:/etc/udev/rules.d/ 

//分别在两个虚拟系统上重新载入规则,启动udev服务,或者重启服务器即可 
[root@server2 ~]# /sbin/udevcontrol reload_rules
[root@server2 ~]# /sbin/start_udev
Starting udev:                                             [  OK  ]


[root@server2 ~]# ls -l /dev/asm-disk*
brw-rw---- 1 grid asmadmin 8, 17 Sep 30 17:49 /dev/asm-diskb
brw-rw---- 1 grid asmadmin 8, 33 Sep 30 17:52 /dev/asm-diskc
brw-rw---- 1 grid asmadmin 8, 49 Sep 30 17:49 /dev/asm-diskd


//下面的命令是查看UUID
[root@server1 ~]# sudo blkid
/dev/sda1: UUID="ec3f5c5d-634c-43d4-b21a-def742702519" TYPE="ext4" 
/dev/sda2: UUID="kfSFtZ-7GAT-IgBn-S63P-2ebp-S7nz-KBazer" TYPE="LVM2_member" 
/dev/sdd: TYPE="oracleasm" 
/dev/sdc: TYPE="oracleasm" 
/dev/sdb: TYPE="oracleasm" 
/dev/mapper/VolGroup-lv_root: UUID="65bb5403-072c-4138-b480-847bec086b19" TYPE="ext4" 
/dev/mapper/VolGroup-lv_swap: UUID="95bc6aed-e5b2-4e5e-8e07-1cc91120e63d" TYPE="swap"

[root@server1 by-id]# ls
dm-name-VolGroup-lv_root
dm-name-VolGroup-lv_swap
dm-uuid-LVM-CwWwocr3fxAFTFMb9sdfuse8MPYXdVex5rHCNc6WGuaWwFoCubYd6g0RAve6cczA
dm-uuid-LVM-CwWwocr3fxAFTFMb9sdfuse8MPYXdVexOLWGlOt9ZmIXcDUDoeYazVI9vqLS2qvz
scsi-36000c2949053c54c1a238a917b4bcbf2
scsi-36000c294e125c50c4a72627b5e47573a
scsi-36000c2958faf5c7b43bee1e668b0bb2f
scsi-36000c298df1f4f89724d320de9127853
scsi-36000c29cca1ea663013f8c339467da8d
scsi-36000c29cca1ea663013f8c339467da8d-part1
scsi-36000c29cca1ea663013f8c339467da8d-part2
wwn-0x6000c2949053c54c1a238a917b4bcbf2
wwn-0x6000c294e125c50c4a72627b5e47573a
wwn-0x6000c2958faf5c7b43bee1e668b0bb2f
wwn-0x6000c298df1f4f89724d320de9127853
wwn-0x6000c29cca1ea663013f8c339467da8d
wwn-0x6000c29cca1ea663013f8c339467da8d-part1
wwn-0x6000c29cca1ea663013f8c339467da8d-part2

[root@server1 by-id]# /sbin/scsi_id -g /dev/sdb
36000c2958faf5c7b43bee1e668b0bb2f
[root@server1 by-id]# /sbin/scsi_id -g /dev/sdb
36000c2958faf5c7b43bee1e668b0bb2f
[root@server1 by-id]# /sbin/scsi_id -g /dev/sdc
36000c298df1f4f89724d320de9127853
[root@server1 by-id]# /sbin/scsi_id -g /dev/sde
36000c2949053c54c1a238a917b4bcbf2




方法二:当上面的方法找不到UUID时,就只能用折中的方式了

由于使用的是vmware虚拟机,默认磁盘是没有scsi_id返回值的,那不得不考虑使用别的方法
第一种是从VMWARE层面去解决,用文本编辑器修改vmx文件,在vmx文件中任意位置(通常在最后)添加如下行:
disk.EnableUUID = "TRUE"

这种方法有坏处,就是每次修改完磁盘或者网卡信息以后,参数又会变成默认的false,每次都得重新修改,这不符合实际的生产环境要求。

另外一种方法就是,我们的udev采用别的取值方法来绑定磁盘,比如
root@udev ~]#  udevinfo -a -p /sys/block/sdc/sdc1

Udevinfo starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

looking at device '/block/sdc/sdc1':

KERNEL=="sdb1"
SUBSYSTEM=="block"
SYSFS{dev}=="8:33"
SYSFS{partition}=="1"
SYSFS{start}=="63"


SYSFS{size}=="20964762"


我们用上面标红的四个值来取代scsi_id,所以我的规则文件可以写成下面这样
取以下四个值写入文件/etc/udev/rules.d/99-oracle-asmdevices.rules

    KERNEL=="sdb1"
    SUBSYSTEM=="block"
    SYSFS{size}=="20964762"
    SYSFS{start}=="63"

KERNEL=="sdb1", SUBSYSTEM=="block", SYSFS{size}=="20964762", SYSFS{start}=="63", NAME="asm-diskb", OWNER="grid", GROUP="asmadmin", MODE="0660"
KERNEL=="sdc1", SUBSYSTEM=="block", SYSFS{size}=="208782", SYSFS{start}=="63", NAME="asm-diskc", OWNER="grid", GROUP="asmadmin", MODE="0660"
KERNEL=="sdd1", SUBSYSTEM=="block", SYSFS{size}=="20964762", SYSFS{start}=="63", NAME="asm-diskd", OWNER="grid", GROUP="asmadmin", MODE="0660"

#end


主题思路就是通过udevinfo这个命令去找其他唯一的值来代替


#重新载入规则,启动udev服务,或者重启服务器即可 
[root@server2 ~]# /sbin/udevcontrol reload_rules
[root@server2 ~]# /sbin/start_udev
Starting udev:                                             [  OK  ]


[root@server2 ~]# ls -l /dev/asm-disk*
brw-rw---- 1 grid asmadmin 8, 17 Sep 30 17:49 /dev/asm-diskb
brw-rw---- 1 grid asmadmin 8, 33 Sep 30 17:52 /dev/asm-diskc
brw-rw---- 1 grid asmadmin 8, 49 Sep 30 17:49 /dev/asm-diskd


#udev是否启动了我们直接在os上查找和udev相关的进程就可以了
ps -ef|grep udev

scsi_id --whitelisted --replace-whitespace --device=/dev/sdb

scsi_id只支持相对路径,直接使用绝对路径会因为找不到设备属性文件而无返回值。
直接执行/sbin/scsi_id -g -u -s /block/sdb后,返回WWID







你可能感兴趣的:(虚拟机,Linux)