转自: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}

(转) 通过UUID在vSphere虚拟机内外识别硬盘的更多相关文章

  1. 虚拟机VMware新增硬盘无法识别问题

    添加硬盘前的硬盘信息 在虚拟机中新增硬盘 添加后发现使用fdisk -l信息不变,新增的硬盘并没有识别,试过重启虚拟机硬盘就会识别出来.如果不想重启则按照如下方法: 先查看/proc/scsi/scs ...

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

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

  3. CentOS系统在不重启的情况下为虚拟机添加新硬盘

    一.概述 用过虚拟机的都知道,如果在系统运行的时候去给虚拟机添加一块新设备,比如说硬盘,系统是读取不到这个新硬盘的,因为系统在启动的时候会去检测硬件设备.但是我们也可能会遇到这样的情况,比如正在运行比 ...

  4. windows7系统下如何安装windows xp系统(无法识别硬盘,删除隐藏分区)

    一.硬盘模式的设置 要设置好硬盘模式,否则安装操作系统的时候,根本就不识别硬盘,自然无法安装操作系统了.此步骤主要是解决无法识别硬盘的问题. 首先,进入BIOS当中,一般在advanced当中,有一个 ...

  5. VMware如何给虚拟机添加新硬盘

    在使用虚拟机时,若硬盘空间不足.或需要用到双硬盘或多硬盘环境时,我们可以给虚拟机新增虚拟硬盘

  6. 浪潮服务器装linux系统无法识别硬盘

    先说无法识别硬盘的原因是没有安装和系统相对应的raid驱动. 公司需要两台Linux的物理服务器来部署业务系统. 客户给了两台浪潮的服务器. 1.先把linux系统刻录到u盘 2要先看一下raid卡的 ...

  7. vmware虚拟机linux添加硬盘后先分区再格式化操作方法

    先在虚拟机里填加硬盘,如图. 进入linux后台,df-l ,没有显示sdc盘,更切换的是,在fdisk中,却有sdc 看fdisk -l,确实有sdc. 说明sdc还没有分区,也没有格式化,也没有挂 ...

  8. 【VMware虚拟机】【克隆问题】在VMware 9.0下克隆CentOS6.5虚拟机无法识别eth网卡

    [日期]2014年4月23日 [平台]windows 8 vmware workstation 9.0 centos 6.5 [日志]1)执行ifconfig命令,输出: 2)查看/etc/udev/ ...

  9. vsphere 虚拟机的迁移,冷迁移,vmotion(热迁移)

    备注:(理论部分参考王春海老师的课程) 一.概述 1.vsphere数据中心当处于某种目的进行维护时,需要将某台主机上运行或关闭的虚拟机,迁移到其他主机上,这个时候就需要使用迁移 2.可以使用冷迁移或 ...

随机推荐

  1. Swift之 vm10虚拟机安装Mac OS X10.10教程

    VM10装Mac OS X 10.9.3及更新到Mac OS X 10.10,让你的windows也能玩Swift .   近期WWDC放出终极大招--新的编程语言Swift(雨燕),导致一大波程序猿 ...

  2. Lucene-全文索引

    近期接触了lucene,我想也有非常多人以前听过,于是带着好奇心,我開始对lucene进行了解,给我影响最深的是它非常多的应用了索引表,这个工具之所以快是就是由于大量引用到了索引表.今天仅仅说下我刚開 ...

  3. iOS8开发~Swift(五)Swift与OC混编

    一.概要 首先看<The Swift Programming Language>中提到"Swift's compatibility with Objective-C lets y ...

  4. 认识 Atlassian Datacenter 产品

    认识 Atlassian Datacenter 产品 云端原本就是群集化的架构,Atlassian 系列产品.应用的开发团队相当广范且行之有年,可是将应用程序作为节点(比方Jira,confluenc ...

  5. javascript进阶教程第一章案例实战

    javascript进阶教程第一章案例实战 一.学习任务 通过几个案例练习回顾学过的知识 通过练习积累JS的使用技巧 二.实例 练习1:删除确认提示框 实例描述: 防止用户小心单击了“删除”按钮,在用 ...

  6. 浏览器加载渲染HTML、DOM、CSS、 JAVASCRIPT、IMAGE、FLASH、IFRAME、SRC属性等资源的顺序总结

    页面响应加载的顺序:   1.域名解析->加载html->加载js和css->加载图片等其他信息 DOM详细的步骤如下: 解析HTML结构. 加载外部脚本和样式表文件. 解析并执行脚 ...

  7. Autoencoders and Sparsity(二)

    In this problem set, you will implement the sparse autoencoder algorithm, and show how it discovers ...

  8. 用内置的库turtle来画一朵花,python3

    题目:用内置的库turtle来画一朵花 看了群主最后成像的图片,应该是循环了36次画方框,每次有10度的偏移. 当然不能提前看答案,自己试着写代码. 之前有用过海龟画图来画过五角星.奥运五环.围棋盘等 ...

  9. Hive通过查询语句向表中插入数据过程中发现的坑

    前言 近期在学习使用Hive(版本号0.13.1)的过程中,发现了一些坑,它们也许是Hive提倡的比关系数据库更加自由的体现(同一时候引来一些问题).也许是一些bug.总而言之,这些都须要使用Hive ...

  10. CSS布局篇——固宽、变宽、固宽+变宽

    学了前端挺久了.近期写一个项目測试系统,布局时发现自己对变宽+固宽的布局还没有全然掌握,所以在这里总结一下,以后须要的时候回头看看. 1.最简单的当然是一列或多列固宽 比如两列固宽: <1> ...