缺少 init.d/apache2 文件
在嘗試刪除 apache 和 tomcat,現在嘗試重新安裝 apache 2 之後,我缺少
init.d/apache2
啟動/停止伺服器的文件。我不確定新安裝是否真的有效,而且我
apt-get purge apache2
並沒有首先刪除所有內容!
init.d/apache2
如果伺服器啟動/安裝正確(我手動刪除了文件和目錄),如何獲取文件來測試?
嘗試使用
apt-get install --reinstall apache2
強制 apt-get 系統重新安裝,即使包存在並覆蓋目前文件——即使是它認為已經存在的文件。通過手動刪除系統中的內容,您無疑會讓包管理器對需要在哪裡做什麼感到困惑。您通常希望堅持使用提供的工具,除非您了解手動擺弄會產生什麼影響。
作為額外說明,您通常不需要自己弄亂 /etc/init.d 中的文件。有一個工具可以為您執行這些腳本。例如,要重新啟動 apache,您可以執行
service apache2 restart
.根據評論中的資訊進行編輯
初始化腳本是子包的一部分。第一次安裝一個包將安裝它的依賴項,但解除安裝它只會解除安裝包,而不是它的依賴項。您手動刪除的 init 腳本屬於該
apache2.2-common
包,它是主apache2
包名稱的依賴項。即使刪除 apache2 也不--purge
會對 init 腳本產生影響,因為它是不同包的一部分。讓它重新執行apt-get install --reinstall apache2.2-common
。編輯2
顯然 Debian 很古怪。我在測試系統上複製了這個問題,但無法使用包管理器取回初始化腳本。我在網上找到了其他幾個有同樣問題的人,看起來解決方案是手動下載包,解壓縮,然後像這樣撕掉文件:
cd /tmp aptitude download apache2.2-common dpkg --extract apache2.2-common_*.deb apache2.2-common sudo cp apache2.2-common/etc/init.d/apache2 /etc/init.d
編輯3
感謝 Faheem Mitha 所做的調查以及對以下評論的討論,這個問題的完整答案已經得到解決。閱讀 Faheem 的答案以獲取完整的詳細資訊。為了幽默的價值,這裡是懸崖筆記:
簡短的版本是初始化腳本被認為是 conf 文件,而 apt-get 太客氣了,不能觸摸使用者以任何方式修改過的 conf 文件,甚至在解除安裝後重新安裝時恢復刪除。在你說“當然”之前,先看看你必須做的體操。我引用:
在詢問 dpkg 列表(並被告知)+進一步擺弄之後,以下工作。小心這個。它將用包中的版本替換所有修改過的配置文件。
apt-get -o Dpkg::Options::="--force-confnew" -o Dpkg::Options::="--force-confask" install --reinstall apache2.2-common
. 我不知道你為什麼需要我告訴你這些。這是你首先應該想到的。:-) – 法希姆·米塔
(我正在跟進Caleb 的回答,儘管大部分相關資訊已經在評論中。我認為總結可能比瀏覽評論更方便。)
因此,正如 Caleb 的文章中所述,問題是 Alexander 刪除(或可能修改)
/etc/init.d/apache2
並希望將其取回。該文件位於apache-2.2-common
. 不過,顯而易見的apt-get install --reinstall apache2.2-common
是不會恢復文件。根據 Debian 政策,這樣做的原因是配置文件一旦更改就不會被系統觸及,除非使用者明確要求。請參閱有關配置文件處理的 Debian 政策:第 10.7.3 節。引用:配置文件處理必須符合以下行為:
- 在包升級期間必須保留本地更改,並且
- 刪除包時必須保留配置文件,只有在清除包時才刪除。
軟體包的添加和刪除由dpkg處理。dpkg 在這里區分兩種情況,當文件被修改時,當文件被完全刪除時。請參閱dpkg 手冊頁中以選項部分開頭的
--force-things
部分。(連結到 Ubuntu 的 dpkg 1.16 頁面,因為我在網上找不到 Debian Squeeze 手冊頁。如果您有指點,請發表評論。)所以對於這兩種情況
- 如果您希望通過重新安裝替換已刪除的 conf 文件,則需要將
--force-confmiss
選項傳遞給 dpkg。- 如果您希望在安裝時將已更改但未刪除的 conf 文件替換為其預設版本,您需要將
--force-confnew
和--force-confask
選項都傳遞給 dpkg。正如手冊頁所解釋的那樣,–force-confnew 本身只會在預設值比最初安裝的預設值更新的情況下,即升級時,將修改後的 conf 文件替換為預設值。如果我們通過 apt 呼叫 dpkg,我們需要將這些選項傳遞給 apt。對於上述兩種情況,這樣做如下:
apt-get -o Dpkg::Options::="--force-confmiss" install --reinstall apache2.2-common apt-get -o Dpkg::Options::="--force-confnew" -o Dpkg::Options::="--force-confask" install --reinstall apache2.2-common
我找不到
Dpkg::Options
. 我通過Google搜尋找到了它。如果您知道任何,請發表評論。註釋:
- 我認為,如果您遇到弄亂配置文件並想要返回的情況,重命名它然後使用
--force-confmiss
而不是要求將所有本地修改替換為預設值 per更安全--force-confnew
,即一般來說不是你想要的。- 如果使用配置文件,請始終將它們置於版本控制之下。這將使配置文件混亂的問題變得毫無意義。我使用並推薦 mercurial。在這種情況下(可能是任何情況:-)),在這種情況下,使用分佈式版本控制比使用像 subversion這樣的集中式版本控制系統更好。一個很好的程序是 etckeeper。
- 還值得一提的是,這可能導致了這裡的混亂,因為apt 錯誤 621720恰好涵蓋了刪除的情況,所以在擠壓中使用 apt 時
apache2.2-common
不能完全解除安裝 。根據您需要使用的錯誤報告apache2.2-common
apt-get remove apache2.2-common -o pkgProblemResolver::FixByInstall=0`
(由我驗證)。 4. 請參閱您需要了解的關於 conffiles 的所有資訊:由 dpkg 管理的配置文件,以討論dpkg 的開發人員之一Raphaël Hertzog 處理 dpkg 的配置文件。他提到這
--force-confask
是 Squeeze 中的新功能。他還提到dpkg --status apache2.2-common
給出 conffiles 的列表,以及其他資訊。要不就
dpkg-query --showformat='${Conffiles}\n' --show apache2.2-common
如果您只想要該資訊。
感謝 David Kalnischkies 和 Raphaël Hertzog 回答了我的問題(並告訴我我發錯了郵件列表)。我認為在這種情況下的 Debian 文件可以改進,特別是 dpkg 手冊頁可以添加額外的使用範例。我鼓勵這裡的人們(顯然願意提供幫助)也花時間為 Debian 等自由軟體項目貢獻文件更新檔。這是很有價值的工作,而且沒有足夠的人去做。