轉自: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
讓咱們來看看使用總線位置標識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,有以下幾個緣由:優化
那聽上去是否是沒有什麼好辦法了?要沒有好辦法樓主也不會廢話那麼多失敗的例子了。目前看來靠譜的方法是使用UUID來在虛擬機內外惟一標識磁盤,用法也很簡單。ui
虛擬化環境擁有不少物理環境中作不到或者是很難作到的功能,好比在開機狀態下熱增長磁盤,計算資源(參考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}