Ale*_*sse 6 debian init-script sysvinit apache-httpd
在尝试删除 apache 和 tomcat,现在尝试重新安装 apache 2 后,我缺少init.d/apache2启动/停止服务器的文件。
我不确定新安装是否真的有效,而且我一开始apt-get purge apache2并没有删除所有东西!
如何获取init.d/apache2文件以测试服务器是否正确启动/安装(我手动删除了文件和目录)?
Fah*_*tha 12
(我正在跟进Caleb 的回答,尽管大部分相关信息已经在评论中。我认为总结可能比浏览评论更方便。)
因此,正如 Caleb 的帖子中所述,问题是亚历山大删除(或可能修改)/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 挤压手册页。如果您有指针,请发表评论。)
所以对于这两种情况
如果想让已经删除的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
Run Code Online (Sandbox Code Playgroud)
我找不到任何文档Dpkg::Options。我是通过谷歌搜索找到的。如果你知道任何,请评论。
注释:
我认为,如果您遇到弄乱配置文件并想返回的情况,重命名它会更安全,然后使用
--force-confmiss而不是要求将所有本地修改替换为默认的 per --force-confnew,这是一般来说不是你想要的。
如果使用配置文件,请始终将它们置于版本控制之下。这将使混乱的配置文件问题变得毫无意义。我使用并推荐 mercurial。在这种情况下(可能是任何情况:-)),在这种情况下,使用分布式版本控制比使用像subversion这样的集中式版本控制系统更好 。一个很好的程序是 etckeeper。
还值得一提的是,可能会导致这里的混乱apache2.2-common,因为apt 错误 621720恰好涵盖了apache2.2-common删除的情况,因此在挤压时 apt无法完全卸载
。根据您需要使用的错误报告
apt-get remove apache2.2-common -o pkgProblemResolver::FixByInstall=0`
Run Code Online (Sandbox Code Playgroud)
(经本人核实)。
请参阅您需要了解的有关 conffiles 的一切:由 dpkg 管理的配置文件
,以讨论dpkg 的开发人员之一Raphaël Hertzog对 dpkg 的配置文件处理。他提到这--force-confask是 Squeeze 中的新功能。他还提到
dpkg --status apache2.2-common
Run Code Online (Sandbox Code Playgroud)
给出 conffiles 列表以及其他信息。要不就
dpkg-query --showformat='${Conffiles}\n' --show apache2.2-common
Run Code Online (Sandbox Code Playgroud)
如果你只想要这些信息。
感谢 David Kalnischkies 和 Raphaël Hertzog 回答了我的问题(并告诉我我发帖到了错误的邮件列表)。我认为这方面的 Debian 文档可以改进,特别是 dpkg 手册页可以提供额外的使用示例。我鼓励这里的人(显然愿意提供帮助)也花时间为 Debian 等自由软件项目贡献文档补丁。这是一项有价值的工作,而且没有足够的人去做。
尝试使用apt-get install --reinstall apache2强制 apt-get 系统重新安装,即使包存在并覆盖当前文件 - 即使是它认为已经存在的文件。
通过手动从系统中删除内容,您无疑会让包管理器对需要在何处执行的操作感到困惑。您通常希望坚持使用提供的工具,除非您了解手动摆弄会产生什么影响。
作为额外的说明,您通常不需要自己弄乱 /etc/init.d 中的文件。有一个工具可以为您运行这些脚本。例如,要重新启动 apache,您可以运行service apache2 restart.
根据评论中找到的信息进行编辑
init 脚本是子包的一部分。第一次安装一个包会安装它的依赖项,但是卸载它只会卸载这个包,而不是它的依赖项。您手动删除的 init 脚本属于apache2.2-common主apache2包名称的依赖项。即使删除 apache2 也不--purge会对 init 脚本产生影响,因为它是不同包的一部分。让它重新运行apt-get install --reinstall apache2.2-common。
编辑2
显然 Debian 很古怪。我在测试系统上复制了这个问题,但无法通过包管理器获取 init 脚本。我在网上发现了其他几个有同样问题的人,看起来解决方案是手动下载包,解压缩,然后像这样翻录文件:
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
Run Code Online (Sandbox Code Playgroud)
编辑3
多亏了 Faheem Mitha 的调查和对下面评论的讨论,这个问题的完整答案已经找到了。阅读 Faheem 的回答以了解全部细节。对于幽默价值,这里是悬崖笔记:
简短的版本是 init 脚本被认为是 conf 文件,apt-get 太客气了,不能接触用户以任何方式修改过的 conf 文件,甚至在卸载后重新安装时恢复删除。在你说“当然是废话”之前,先看看你必须做的体操。我引用:
在询问 dpkg 列表(并被告知)+进一步摆弄之后,以下工作。小心这一点。它将用包中的版本替换所有修改过的配置文件。
apt-get -o Dpkg::Options::="--force-confnew" -o Dpkg::Options::="--force-confask" install --reinstall apache2.2-common. 我不知道你为什么需要我告诉你这些。这是你应该想到的第一件事。:-) – Faheem Mitha
| 归档时间: |
|
| 查看次数: |
19224 次 |
| 最近记录: |