2016-04-27 49 views
2

這不是什麼大問題的Ubuntu 14.04之下,但由於切換到16.04事情變得有點凌亂:如何確保新啓動的虛擬機已準備好進行配置?

當我使用工具來啓動一個新的虛擬機並運行腳本配置(認爲流浪或包裝機)劇本所做的第一件事之一就是舞蹈apt-get update/upgrade/install。因爲切換到Ubuntu Xenial這些腳本都扔了很多不確定性的錯誤一樣

Reading package lists... 
E: Could not get lock /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable) 
E: Unable to lock directory /var/lib/apt/lists/ 

E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable) 
E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it? 

我發現如果我把一個sleep 30或在腳本的開頭類似它似乎安定下來。如果我在重試的循環中嘗試每個命令,直到退出狀態爲0,它也可以工作。最好我可以看到,有一些首次啓動任務在我的供應商同時運行apt-get。

我認爲這是明顯的東西,就像apt-daily服務一樣。但是添加下面的等待循環沒有任何效果;它永遠不會等待任何東西:

while systemctl status apt-daily.service > /dev/null 2>&1; do 
    sleep 0.5 
done 

我知道我可以按照想法this question檢查一個恰當的鎖定。具體而言,但我如果有確定何時更通用和防彈方式更感興趣一個新的VM已經完全出現了。做一個瞎子sleep好像太脆弱了。

回答

4

至少當我遇到同樣的問題時,您的日常服務正處於正確的軌道上。但apt-daily會立即觸發無人值守升級,這可能是您的睡眠環路無法做到的原因。思想夫婦:

選項1

如果您正在構建自己的流浪者中,這裏是如何解決這個問題:

建立在你的基地框中輸入新的文件:

的/ etc/systemd /系統/公寓-daily.timer.d /公寓-daily.timer.conf

[Timer] 
Persistent=false 

這將覆蓋默認systemd定時器觸發的apt-每天開機立即運行(在d efault persistent = true意味着如果在系統關閉時錯過了作業,那麼它將在引導時立即運行)。該文件將在此文件中覆蓋默認設置:

/lib/systemd/system/apt-daily.timer

這是我做的,因爲我建立了自己顛沛流離的盒子,我可以證實它的工作原理。

選項2

使用此xenial圖像

https://github.com/geerlingguy/packer-ubuntu-1604

Geerlingguy通過禁用無人值守的升級解決了這個問題。你可以看到這裏的討論

https://github.com/geerlingguy/packer-ubuntu-1604/issues/3#issue-154560190