在尝试删除 apache 和 tomcat 之后,现在尝试重新安装 apache 2,我缺少init.d/apache2
启动/停止服务器的文件。
我不确定新安装是否真的有效,而且我的apt-get purge apache2
一开始并没有删除所有内容!
我如何获取init.d/apache2
文件来测试服务器是否启动/安装正确(我已手动删除文件和目录)?
答案1
(我正在跟进迦勒的回答,尽管大多数相关信息已经在评论中了。我认为总结可能比查看评论更方便。)
因此,正如 Caleb 的帖子中所述,问题在于 Alexander 删除了(或可能修改了)/etc/init.d/apache2
并想要将其恢复。该文件位于apache-2.2-common
.但显然apt-get install --reinstall apache2.2-common
并不能恢复文件。根据 Debian 政策,这样做的原因是,配置文件一旦更改,系统就不会触及它们,除非用户明确要求。看Debian 关于配置文件处理的政策:第 10.7.3 节。引用:
配置文件处理必须符合以下行为:
在软件包升级期间必须保留本地更改,并且
删除包时必须保留配置文件,并且仅在清除包时才删除配置文件。
包的添加和删除由以下人员处理包装袋。 dpkg 在这里区分两种情况:文件被修改时和文件被完全删除时。请参阅以 in 开头的选项--force-things
部分中的部分dpkg 手册页。 (链接到 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
。我通过谷歌搜索找到了它。如果您知道,请评论。
评论:
我认为,如果您遇到弄乱配置文件并想要返回的情况,那么更安全的方法是重命名它,然后使用
--force-confmiss
而不是要求将所有本地修改替换为默认的 per--force-confnew
,即一般来说不是你想要的。如果使用配置文件,请始终将它们置于版本控制之下。这将使配置文件混乱的问题变得毫无意义。我使用并推荐 水银。在这种情况下(可能是任何情况:-)),在这种情况下,使用分布式版本控制比使用集中式版本控制系统(如 颠覆。执行此操作的一个好程序是 等等管理员。
还值得一提的是,可能会造成这里的混乱,因为在挤压中使用 apt
apache2.2-common
并不能完全卸载,因为 容易出错 621720,这恰好涵盖了删除的情况apache2.2-common
。根据错误报告,您需要使用apt-get remove apache2.2-common -o pkgProblemResolver::FixByInstall=0`
(经本人验证)。
看关于 conffiles 您需要了解的一切:由 dpkg 管理的配置文件 有关 dpkg 的配置文件处理的讨论拉斐尔·赫尔佐格,dpkg 的开发者之一。他提到这
--force-confask
是 Squeeze 中的新功能。他还提到dpkg --status apache2.2-common
给出配置文件列表以及其他信息。要不就
dpkg-query --showformat='${Conffiles}\n' --show apache2.2-common
如果您只想要该信息。
感谢 David Kalnischkies 和 Raphaël Hertzog 回答了我的相关问题(并告诉我我发布到了错误的邮件列表)。我认为 Debian 文档在这方面可以改进,特别是 dpkg 手册页可以提供额外的使用示例。我鼓励这里的人们(他们显然愿意提供帮助)也花时间为 Debian 等自由软件项目贡献文档补丁。这是一项有价值的工作,但没有足够的人来做这件事。
答案2
尝试使用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 的回答以获取完整详细信息。为了幽默价值,以下是悬崖注释:
简而言之,init 脚本被视为 conf 文件,而 apt-get 太客气了,不会触及用户以任何方式修改过的 conf 文件,甚至在卸载后重新安装时恢复已删除的文件。在你说“当然啦”之前,先看看你必须做的体操。我引用:
在询问 dpkg 列表(并被告知)+进一步摆弄之后,以下工作有效。对此要小心。它将用包中的版本替换所有修改的配置文件。
apt-get -o Dpkg::Options::="--force-confnew" -o Dpkg::Options::="--force-confask" install --reinstall apache2.2-common
。我不知道你为什么需要我告诉你这个。这是你首先应该想到的事情。 :-) – 法希姆·米萨
答案3
我在 Debian 系统上遇到了同样的问题。它影响了 apache 和 nginx。
这里的所有解决方案都不适合我;清除、重新安装、下载和手动安装,Dpkg::Options 不起作用。
事实证明,依赖项之一创建了启动和停止服务所需的配置文件。您只需删除所有依赖项并重新安装即可。
我在这里找到了解决方案:http://dancingpenguinsoflight.com/2009/02/how-to-completely-reset-an-apache-instance-in-ubuntu/
APACHE_PKGS=`sudo dpkg --get-selections | grep apache | cut -f 1`
# Make sure things are sane:
echo $APACHE_PKGS
# Example output: apache2 apache2-mpm-prefork apache2-utils apache2.2-common \
# libapache2-mod-php5 libapache2-mod-python libapache2-svn
# Likely if you have a Python application:
# libapache2-mod-python libapache2-mod-python-doc libapache2-mod-wsgi
# Or if you roll with the PHP:
# libapache2-mod-php5
sudo apt-get remove --purge $APACHE_PKGS