VMware vCenter Storage Monitoring Service failed

環境是 vSphere 5 與 VMware vCenter Server Appliance,監控 storage 的服務是 VMware vCenter Storage Monitoring Service 縮寫是 sms。

今天發現從 vCenter Service Status sms 一直 failed,也可以從 vCenter 的這個網址檢查是不是健康 https://vcenter/sms/health.xml。造成跟硬碟效能監控有關的圖都跑不出來,嚴重影響我的測試,十分不悅。

結果去 /var/log/vmware/vpx/sms.log 裡面看到如下的錯誤:

— Cause: org.h2.jdbc.JdbcSQLException: NULL not allowed for column “ENTITYID”; SQL statement:
INSERT INTO scsiTarget ( entityId, wwn, portWwn, nodeWwn, iscsiName, iscsiAlias, type, vendor
) VALUES ( ?, ?, ?, ?, ?, ?, ?, ? ) [90006-147]
at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeUpdate(GeneralStatement.java:91)
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.insert(SqlMapExecutorDelegate.java:447)
at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.insert(SqlMapSessionImpl.java:82)
at com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.insert(SqlMapClientImpl.java:59)
at com.vmware.vim.sms.provider.VcProviderImpl.populateScsiTargets(VcProviderImpl.java:849)
at com.vmware.vim.sms.provider.VcProviderImpl.access$300(VcProviderImpl.java:41)
at com.vmware.vim.sms.provider.VcProviderImpl$PopulateStorageInfoTask.run(VcProviderImpl.java:3006)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)

十分不悅 again..,是 vCenter 的 bug = =?

好險找到這篇文章最後一個回答是解答,這個表裡面有一筆 NULL 的資料因此出了問題。所以找個軟體來連進去資料庫,我這環境是用 oracle,Client 是用 Navicat Premium 登入 Oracle,按照順序檢查有沒有這筆空資料,有的話就刪除。

select * from VPX_PSA_TARGET_TRANSPORT where ISCSI_NAME is NULL AND VPX_TYPE=’vim.host.InternetScsiTargetTransport’;

delete from VPX_PSA_TARGET_TRANSPORT where ISCSI_NAME is NULL AND VPX_TYPE=’vim.host.InternetScsiTargetTransport’;

接著重開 ESXi Service 他就復活拉拉拉阿~~~~~

VMware vSphere vSwitch

VMware vSphere vSwitch 的 port 可以增加三種介面

Service Console

vSphere host 本身的 IP,實際上就是透過這個 IP 連入 vSphere 來管理,因此這個設定相當重要,通常也不太會需要更動,如果有需要做容錯,可以用兩個網卡分別在不同的 vSwitch 設定不同的 Service Console 來避免一個網段或網卡的故障。

VMKernel

作為 vMotion iScsi nfs 的網路介面,類似在 host 新增一個虛擬網卡,作用跟 Service Console 很像,但是用途不一樣,多一個彈性讓 host 可以像是擁有很多個網卡一樣,在不同網卡設定不同 ip,可以用這個 IP 來連接需要透過網路的 storage,可以走 nfs or iscsi 都需要有一個虛擬 IP,也可以透過這個 VMKernel 的 IP 在 storage 上指定讀寫權限。

vmotion 也需要透過增加這個介面來讓虛擬機進行同步,因此在增加時有 vmotion or fault tolerance 的選項能設定。

Virtual Machine(port group)

一個 vSwitch 上面可以有很多個 port group 就是透過新增一個 virtual machine 來執行,可以用來管理流量或安全策略的設定,分屬同一個 port group 的設定將會一致。因此在 vmotion 時需要將兩台 host 的 vSwitch and port group 設定都一致才能順利的移轉,這也是虛擬機對應 port 的承載介面,每個虛擬機的網卡指定的 port 位置就是一個 port group。

可以透過 host profile 來同步管理數台機器的網路設定。

vSphere ESXi shell clone vm instance without vCenter

由於使用的是免費版的 ESXi 在測試,所以沒有 VCenter 的簡便功能可以作很多事,所以要做一些比較複雜的操作就要靠自己了…

我灌的情況比較特別,其實是安裝 ESX  然後輸入 ESXi 的免費序號,不曉得到底是算啥…混合板…= =

有幾種方法可以擴充一些免費版無法做的操作

SDK

SDK 我自己也有抓下來在 windows 的環境跑,要把伺服器上的某個 crt 抓下來設定比較麻煩之外,用起來是蠻容易的,如果要自己整合一些簡單的介面就推薦這種方式囉。他裡面幾乎每個 api 好像都有些 sample 可以直接用。

Vsphere Shell

另外一種是如果 api 不支援,就要登進去灌 vsphere 的主機上,直接用命令對他做操作,大多都是 vm* 開頭的指令,如果是複製 vm 的話可以參考這個網站[1],教你用 Shell vmkfstools 指令去複製 VM,還說明了許多 vm 存放資料概念,

重要的概念是 vmdk 那個檔是存放很多參數,所以複製的時後記得透過 vmkfstools 才不會把內容的名字留下來。

只是複製完了呢?要如何讓 vm client 登入的時候看得到呢?

因為 vsphere 似乎沒辦法直接掃瞄硬碟就察覺有新的 vm 進入,我猜測是是透過內建的資料庫去存放這些資訊,所以除了單純複製資料夾外,就是要對 vsphere 資料庫進行註冊,這就要參考這篇[2]文章了~!,他其實是Scripting-VMware-Power-Tools-Infrastructure 這本書節錄下來的章節,他描述了整個流程,並且寫了幾個不同語言的 script 來做這些事。

  • 新增新的 vm 要存放的資料夾
  • 產生 *.vmx 內容
  • 用 vmkfstools 去複製 *.vmdk , *-flat.vmdk ; vmkfstools -i /vmfs/volumes/Storage1/2003/2003.vmdk -d thin /vmfs/volumes/Storage1/2003c/2003c.vmdk
  • 使用 vmware-cmd -s register *.vmx 去向 vsphere 註冊

而我在作到最後一步的時候發生了 fault.RestrictedVersion.summary 的錯誤,根據[3] 的內容大概推斷是新版本的 ESXi 免費版開始不支援你透過指令去寫 config。

但是由於 vsphere shell 內有很多指令可以用,就另外找到一個[4] 用 vim-cmd 的方式來操作註冊的動作結果就成功了,

[root@esx node] vim-cmd solo/registervm /vmfs/volumes/datastore1/node/node.vmx

但是開機時還是有一些問題,可能是我流程還沒跑完一次,是用複製檔案的方式做的吧~

但是他卡在 95% 時就問我問題…問我說是不是 copy 他的映像檔…進 console 就能回答= =我就回答 我 copy it …就開機了?

只是應該要注意共用實體的問題。

參考資源:

  1. 在ESX中把玩VM的虛擬硬碟 http://vaemon.com/article/910.html
  2. Cloning Virtual Machines Utilizing ESX Shell Scripts http://searchsystemschannel.techtarget.com/feature/Cloning-Virtual-Machines-Utilizing-ESX-Shell-Scripts
  3. http://vmetc.com/2009/03/31/esxi-u4-ends-free-version-read-and-write-access-from-the-rcli/
  4. http://www.virtuallyghetto.com/p/vmware-vimsh_9940.html

VMserver Virural Machine 開機自動啟動(autostart)

每次重開機都要開 client 登入 vmserver 進行重開機,之前找好久都找不到哪裡可以設,

今天終於找到了…。

我的 VMServer 版本是 2.0.2 ,VM Infrastructure Client 是 2.5.0,先選 host ,右邊會有很多 tab 有一個是 configuration ,然後再選 子選單內的 Vitural Machine Starup/Shutdown,會列出目前所有的 vm,然後在選右邊的 property,打勾最上面的選項,就可以把想要的 VM 移到 automatic starup with system了。

Build Hadoop Cluster using VMware vSphere

紀錄一下…想要建一個真實跟虛擬的主機都能連線的環境,且沒用很多IP,由於 IP 有限,要架設很多台的環境需要設定一下網路,所以要建立一個虛擬的區域網路,由一台 Master 負責 DHCP 與 NAT ,幫 Master 建立兩個虛擬網卡,與按下圖 2 處建立第二個 vSwitch,將 Node 與 Master 接在同個虛擬網路,然後 Master 第二個網卡對應到有真實網卡的虛擬網路,然後外部的 Node 們透過 VPN 與虛擬區網內的 Node 連線。

架設 pptpd[4] 伺服器,接著測試用 windows vpn 連入,linux 圖形化介面設定方式也類似,指令則比較麻煩…[5]

整理一下設定 pppd client 命令列的步驟:

  1. 安裝 ppp pptp http://pptpclient.sourceforge.net/yum/
  2. /etc/ppp/chap-secrets 設定帳號密碼
  3. /etc/ppp/peers/$tunnel 設定 tunnels 資訊
  4. 撥號 pppd call $tunnel
  5. 設定路由規則 route add -net 192.168.1.0 netmask 255.0.0.0 dev ppp0
  6. 但是在兩台centos 做同樣的事..都遇到類似的錯誤..一台莫名的突然可以..另一台就炸掉了~
  7. 無法連線排解 … http://pptpclient.sourceforge.net/howto-diagnosis.phtml#connect_refused 不了..
  8. 某種情況開著 pppd 讓他跑 再開另外一個連線 pppd call $tunnel 就連上了…
  9. 記得要裝 pptp 如果沒裝 pppd 還是能跑 只是 pptp is not running at the time pppd writes to the psuedo-tty

網路設定:

在這邊要注意 iptables 的設定跟 route 的設定, iptables 大都照著鳥哥[3]的設定就可以使用了,但是在 route 的地方處理的是封包要往哪走,如果是透過 ppp 連上虛擬區網的主機,就要設定一下將虛擬網路的封包都導向 ppp0 中,

route add -net 192.168.1.0 netmask 255.255.255.0 dev ppp0

route 增加 -net 網段 netmask 遮罩 dev 網路介面

在這邊就是指 192.168.1.0-254 的封包都要往 ppp0 (vpn) 送,才能連到虛擬網路,否則會走原本的實體IP就連不到東西了。

參考資源: