转自:http://ju.outofmemory.cn/entry/28398

简单介绍下应用场景:开发基于虚拟化IaaS的一些应用就免不了要跟虚拟机(VM)打交道,因为VM逻辑上独立于宿主机(host),两者之间的交互就成了一个问题,本文介绍的就是在vSphere环境下VM和host之间如何准确识别硬盘,希望能对同样基于VMware vSphere平台做开发的朋友们一点帮助和启发。

如何标识硬盘

在物理机上我们把硬盘插在一条条数据线上,数据线被接到控制器总线上。IaaS这一层把对基础硬件这一层给池化,因此也提供了一系列对硬件操作的API,增加/删除设备等等。和在物理环境下一样,增加虚拟硬盘也需要指定对应的总线号和在总线上的位置,看起来这个总线号(类似X:Y,X是总线编号,Y是在总线上的unit号)可以成为内外部统一的标识符了。不过,不要too young too simple的以为真相会是那么简单哟。

在Linux中使用总线编号来查询磁盘主要有两种方法:

  1. 在/sys/class/scsi_disk下面有诸如2:0:1:0之类的地址,见下图。
  2. 在/dev/disk/by-path下有一堆名字包含总线地址的符号链接。

让我们来看看使用总线位置标识X:Y来识别硬盘的问题:在Linux里,总线编号X其实取决于kernel module加载的顺序。使用dmesg命令查看日志可以发现,对应的总线控制器驱动的行为是:每个驱动在初始化的时候会扫描总线,看看有哪个总线是匹配的,然后拿到一个bus id来标识这条总线,这个bus id也就是我们的总线编号X。如果IDE总线驱动第一个被加载,然后再加载SCSI总线驱动,那么IDE总线就会拿到bus id 0,而SCSI总线就只能从1开始了。而且在虚拟化环境里SCSI总线也有不同的类别(LSIlogic,PVSCI等),对应不同的kernel module,因此不同类型的SCSI总线之间也会产生总线编号不确定的问题。

那是不是可以通过控制kernel module的方法来人为干预SCSI总线号呢?楼主用实践证明了这是个不靠谱stupid idea,有如下几个原因:

  1. 每个发行版修改kernel module加载顺序的方法不尽相同,RHEL 5.x就比较容易,重新编译下initrd,使用mkinitrd的–with参数定义module加载顺序就可以了。而RHEL 6.x由于使用了initramfs用老方法就不顶用了,尝试了很久发现有一个hack的方法:修改grub.conf,使用内核参数rdloaddriver(强制加载)和rdblacklist(强制不加载)来控制启动顺序,当然这是很不推荐的做法。
  2. 对于某些奇葩的系统,比如RHEL 6.0/Oracle Linux 6.0,即使修改grub.conf也不顶用,启动的时候module加载顺序会突变,暂时还不清楚突变的根本原因,但可能是一个bug,毕竟在之后的系统中都没有这个问题。

那听上去是不是没有什么好办法了?要没有好办法楼主也不会废话那么多失败的例子了。目前看来靠谱的方法是使用UUID来在虚拟机内外唯一标识磁盘,用法也很简单。

  1. Disk UUID在vSphere上默认是关闭的,需要通过在VM上设置参数disk.enableUUID=TRUE打开,如下图所示,注意因为configuration parameters实际上是被写入vmx文件的,故无法在开机情况下修改。理论上应该也可以通过修改host上面的/etc/vmware/config来实现host level全局的修改,这样就无需一个一个VM单独进行设置了。
  2. 在目标机器上安装VMware Tools。
  3. 在VM外可以使用vSphere的MBO(Managed Object Browser)来查看磁盘的UUID,找到VM->config->hardware->device->#DEVICE_KEY#->backing,如下图所示。当然通过API也可以查询甚至修改磁盘的UUID。
  4. 启用disk UUID并且安装了VMware Tools之后,可以在VM里面根据UUID来查询了。
    a) Linux可以在/dev/disk/by-id下找到一系列名字包含UUID的符号链接,target就是device node,类似/dev/sda,/dev/sdb之类的,可以使用readlink命令来得到符号链接的target。注意这里是by-id不是by-uuid,by-id这个目录只有在设置了disk.enableUUID之后才会出现。如下图所示,可以看到有by-id/by-path/by-uuid三个目录,by-path对应的就是上文介绍的使用SCSI总线地址来进行磁盘查找的方法。

    b) Windows可以使用Powershell命令:Get-WmiObject Win32_PhysicalMedia | where {$_.serialNumber -eq ‘#UUID#’} 来查询对应的磁盘,查到是第几块磁盘之后就可以使用diskpart来进行磁盘初始化。如下图所示,PHYSICALDRIVE0就是指第0块硬盘。
  5. 注意做Linked Clone也不会改变磁盘的UUID,这个UUID是记录在root vmdk文件中的,登录到ESXi上去可以用vi打开vmdk描述文件查看到。

开机状态检测磁盘的增加/变更

虚拟化环境拥有很多物理环境中做不到或者是很难做到的功能,比如在开机状态下热增加磁盘,计算资源(参考VMware vSphere hot-add CPU/memory学习笔记)等,算是先天优势而不是屌丝逆袭。现在各种操作系统也针对虚拟化环境做了不少优化,比如在Windows中热增加的磁盘能直接被识别出来。而Linux下就需要执行下面命令来重新扫描某个SCSI总线上的磁盘设备:

# {scsi_host_id}是系统上识别出来的bus id 
echo "- - -" > /sys/class/scsi_host/host{scsi_host_id}/scan

如果只是在外部修改磁盘大小,在Linux下也需要执行命令才能够使得guest系统正确识别新的size:

# {device_name}是逻辑设备号,比如sda,sdb。。。 
echo 1 > /sys/block/{device_name}/device/rescan 
# 然后你可以决定是否用resize2fs来调整文件系统大小 
resize2fs /dev/{device_name}

转载于:https://www.cnblogs.com/storymedia/p/4635875.html

(转) 通过UUID在vSphere虚拟机内外识别硬盘相关推荐

  1. 如何使用VMware VDP 6.1备份、复制和恢复vSphere虚拟机

    VSphere Data Protection 6.1利用镜像级别备份.集成 vStorage API和可变长度去重复化技术来保护vSphere数据. VMware vSphere Data Prot ...

  2. vmware创建虚拟机不识别网卡

    今天在给虚拟机添加网卡的时候,出现了虚拟机不识别新加的网卡,很纳闷,连的一样的端口组,为什么新加的网卡识别不了呢 然后查看pci设备,发现网卡的驱动为 AMD 79C970 PCnet32- LANC ...

  3. 阿里云发布vSphere虚拟机备份服务 ,网络带宽有限条件下依然能有效保护数据

    在6月上旬举行的云栖大会上海峰会上,阿里云发布了vSphere虚拟机备份上云服务(HBR for vSphere),并已经在7月份开始邀测.利用混合云备份服务可以将虚拟机镜像备份上云,避免了传统备份方 ...

  4. 虚拟机可以识别usb无线网卡,但一直提示设备正在运行中--解决方法

    虚拟机可以识别usb无线网卡,但一直提示设备正在运行中--解决方法 参考文章: (1)虚拟机可以识别usb无线网卡,但一直提示设备正在运行中--解决方法 (2)https://www.cnblogs. ...

  5. 服务器新建虚拟机不识别u盘,虚拟机无法识别u盘如何解决_虚拟机中无法识别u盘的处理办法...

    虚拟机是将一台计算机虚拟化实现一台计算机具备多台计算机的功能,很多用户都会使用到.可是最近有使用虚拟机的网友却反映说,自己遇到了虚拟机无法识别u盘的情况,不知道怎么回事,也不清楚如何解决很是苦恼.那针 ...

  6. VMware虚拟机不能识别U盘

    虚拟机无法识别U盘,试了好多办法都不行,简直抓狂.没有找到类似经历的好人写的扫盲教程,无奈,只能硬着头皮了.所幸,找到解决方法.吃瓜吃习惯了,也种个瓜吧. 话不多说,见图 下图去勾 启动系统,即可. ...

  7. 虚拟机架设服务器u盘不显示盘符,win7系统不显示u盘盘符虚拟机无法识别U盘的解法...

    最近有部分win7系统用户反映,在操作虚拟机的时候遇到了一个问题,那就是在插入U盘的时候,真机不认,虚拟机找到新设备,可是却不显示U盘盘符,怎么设置才可以让真机识别U盘呢?首先跟大家普及一下,所谓的虚 ...

  8. 使用虚拟机备份软件备份VMware vSphere虚拟机

    1.进入虚拟机备份系统 2.选择[虚拟机保护]--[备份],新建备份任务.选择虚拟化类型[VMware vSphere],再选择需要备份的虚拟机,点击[下一步] 3.设置备份目的地,选择[目标节点]与 ...

  9. 使用虚拟机备份软件恢复VMware vSphere虚拟机

    1.进入虚拟机备份系统 2.选择[虚拟机保护]--[恢复],新建恢复任务,选择选择虚拟化类型[VMware vSphere],勾选需要恢复的备份点,点击[下一步] 3.设置恢复目标宿主机,并按需配置恢 ...

最新文章

  1. python 爬取svg数据_python处理svg数据
  2. SnackbarUtilDemo【Snackbar的封装类】
  3. java把一个list_java中将一个List等分成n个list的工具方法(推荐)
  4. Linux编译安装Python3
  5. Silverlight中如何实现上下标的显示
  6. Linux io内存存在的意义~
  7. python安装包的方法
  8. Android 系统(115)---死机问题分析
  9. verilog coding style_阿里云收购长亭科技后 腾讯云也完成了对CODING的收购
  10. ios 访问设备的基本信息
  11. gstreamer的插件如何复制数据
  12. Autodesk AutoCAD 2023 Mac中文版安装方法
  13. java封装继承多态
  14. 软件需求与分析课堂讨论一
  15. 手把手教你搭建docker环境
  16. Linux根目录简介
  17. Gamma、Linear、sRGB 和Unity Color Space,你真懂了吗?
  18. Android Accessibility(辅助功能) 学习
  19. error LNK2001: 无法解析的外部符号 __imp__WSAGetLastError@0
  20. 调剂2002年计算机科学与技术,2021-03-24 2021年北京信息科技大学硕士研究生调剂信息...

热门文章

  1. 1087 有多少不同的值 (20分)
  2. ModuleNotFoundError: No module named 'tensorflow.python.saved_model.model_utils'
  3. php省城联动_thinkPHP实现的省市区三级联动功能示例
  4. c语言编写python库_c语言包装python程序
  5. shell变量(包含标准shell)
  6. mysql联合索失效_mysql 联合索引生效的条件、索引失效的条件
  7. 数据:比特币和以太坊的证券产品规模已超过百亿美元
  8. 24小时BTC合约大单成交1.52亿美元 现货大单成交1亿美元
  9. Filecoin Gas基础费率大幅回升至2.78 nanoFIL
  10. SAP License:资产年结