近期發現幾例問題,均是xend裡面報了同一個錯誤
File "/usr/lib64/python2.4/site-packages/xen/xend/xenstore/xstransact.py", line 29, in __init__
self.transaction = xshandle().transaction_start()
Error: (2, 'No such file or directory')
好吧,可能有人會覺得我們太土了,怎麼還在用xend,我也很鄙視自己。不管怎樣,既然有問題,就得解決。剛好xenstore的實現之前也不是非常瞭解,藉此好好學習下。
根據xend報錯的路徑,可以發現xshandle這個方法,裡面的一個例項,只在xend start初始化一次即可。那麼可以排除xshandle()這個方法出錯。
transaction_start這個方法是python呼叫xenstore的c庫方法。
xenstore一般大家都理解成一個小型db,裡面存了各種domain有用的資訊,我們用的還是c版的,社群已有一個ocalm寫的,不過還沒試用過。還好是c的,還能看懂,換了ocalm的,又要多花點一點時間了。
具體程式碼邏輯也就不多說了,看了應該都能明白。大致流程簡單說下,就是開啟xenstore的時候,建立一個連線,有對應的connection的資料結構,還有一個全域性的context的東西,它裡面的儲存著最新資料的檔案fd,及相關資料資訊。所以有時候,讀xenstore,可以直接記憶體返回,有的時候,需要重新讀檔案,寫檔案,這個就是transaction做的事情。
一個transaction_start,就是會用原來的fd讀取所有資料,然後把它寫到一個新的檔案, transaction_end的時候,會rename成原來的檔案,這就是事務的實現方法。
所以看到這裡,結合errorcode,就很容易懷疑是檔案操作出錯之類,然後翻看系統的message日誌,果然,在xend出錯的時間點都對應有磁碟出錯的日誌。
謎底揭曉:系統盤出錯導致xend呼叫xenstore出錯
解決方案:可以臨時把/var/lib/xenstored/ 軟連線到/dev/shm, 再把tdb考到/dev/shm下。中間最好xend stop,避免資訊出現不一致問題。