(轉) 經過UUID在vSphere虛擬機內外識別硬盤

轉自:http://ju.outofmemory.cn/entry/28398node

 

簡單介紹下應用場景:開發基於虛擬化IaaS的一些應用就免不了要跟虛擬機(VM)打交道,由於VM邏輯上獨立於宿主機(host),二者之間的交互就成了一個問題,本文介紹的就是在vSphere環境下VM和host之間如何準確識別硬盤,但願能對一樣基於VMware vSphere平臺作開發的朋友們一點幫助和啓發。linux

如何標識硬盤

在物理機上咱們把硬盤插在一條條數據線上,數據線被接到控制器總線上。IaaS這一層把對基礎硬件這一層給池化,所以也提供了一系列對硬件操做的API,增長/刪除設備等等。和在物理環境下同樣,增長虛擬硬盤也須要指定對應的總線號和在總線上的位置,看起來這個總線號(相似X:Y,X是總線編號,Y是在總線上的unit號)能夠成爲內外部統一的標識符了。不過,不要too young too simple的覺得真相會是那麼簡單喲。shell

在Linux中使用總線編號來查詢磁盤主要有兩種方法:ide

  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來在虛擬機內外惟一標識磁盤,用法也很簡單。ui

  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總線上的磁盤設備:idea


# {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} 

相關文章
相關標籤/搜索