有时,安装某些应用程序会从安装时自动运行的应用程序启动进程或服务。我如何不启动就安装它们?
chroot
安装我需要的软件包,而不是启动它。当然,具体来说,驱动程序不存在,需要安装GPU驱动程序。
有时,安装某些应用程序会从安装时自动运行的应用程序启动进程或服务。我如何不启动就安装它们?
chroot
安装我需要的软件包,而不是启动它。当然,具体来说,驱动程序不存在,需要安装GPU驱动程序。
Answers:
在自动安装脚本中有一段时间,我已经使用了一种有点骇人听闻但相当可靠的方式来执行此操作。
首先创建一个目录,例如/root/fake
,其中包含指向的符号链接/bin/true
:
initctl
invoke-rc.d
restart
start
stop
start-stop-daemon
service
deb-systemd-helper
您还可以使它们成为不执行任何操作并返回成功的bash脚本。
然后$PATH
在安装软件包时在最前面添加该目录:
PATH=/root/fake:$PATH apt-get install whatever
这只会阻止守护程序启动/重新启动,而诸如创建initramfs之类的事情仍在进行中。
在软件包安装和删除时执行的脚本会执行invoke-rc.d
上述命令或其他命令以启动和停止服务。但是,它们不会使用绝对路径来调用它们(至少我没有遇到过绝对路径)。
因此,通过在的开头插入伪造的“ no operation”命令,将$PATH
永远不会调用实际命令。
由于仅用于启动/停止服务的命令是伪造的,因此其他所有内容,特别是重要任务,如更新/创建initramfs-images,仍然有效。
ln -s
例如,可以使用创建它们ln -s /bin/true /root/fake/initctl
。
invoke-rc.d
负责。
$PATH
变量的开头,所有invoke-rc.d
可用于启动和停止守护程序的调用和其他调用都将使用伪造命令。也就是说,除非使用绝对路径调用它们,但我从未遇到过。
/bin/true
东西?软件包中涉及的其余命令又是什么?他们会不会被指定的轨道丢掉$PATH
?
后台守护程序以开头invoke-rc.d
,如果该守护程序的rc脚本表明不应在当前系统运行级别上运行,则确保该守护程序未启动。您可以通过设置环境变量RUNLEVEL来覆盖其对当前系统运行级别的想法。不应在运行级别0和6上运行任何内容,但是invoke-rc.d
如果使用这些运行级别,则似乎有问题并且可以运行任何东西。大多数守护程序不在运行级别1中运行,因此您可以像这样阻止它们在安装时启动:
sudo RUNLEVEL=1 apt-get install redis-server
chroot
安装所需的软件包,而不是启动该驱动器。由于事情开始运行,有时我会退出ubuntu(实时CD)会话。无论如何,我要问的是,我怎么用这个RUNLEVEL
的chroot
?
invoke-rc.d
是我遇到的问题的原因?
invoke-rc.d
。这是什么包?
我相信您--no-triggers
在dpkg
安装时需要使用命令行选项。像这样:
dpkg -i --no-triggers SomeBigPackage.deb
要使此设置持久化,使其apt-get install
不运行任何触发器,请在以下位置创建一个自定义dpkg配置文件/etc/dpkg/dpkg.cfg.d/custom
:
# Install packages without starting background processes and services
# See http://askubuntu.com/q/74061
no-triggers
请注意,即使dpkg触发器没有运行,它仍然会将其记录为已运行:
$ sudo apt-get install redis-server
…
Starting redis-server: redis-server.
$ service redis-server status
redis-server is not running
或者,您可以让安装程序脚本运行service
命令以关闭新服务:
service name_of_service stop
apt-get
等效的?还是有一种方法可以配置dpkg
为直接--no-triggers
使用dpkg
还是apt-get
安装某些东西来运行?
我最终要做的是模拟安装软件包时的debootstrap行为,除了我使用dpkg-divert之外:
首先将实际文件移开:
dpkg-divert --add --rename --local /sbin/start-stop-daemon
dpkg-divert --add --rename --local /sbin/initctl
然后创建虚拟版本:
echo \
"#!/bin/sh
echo
echo \"Warning: Fake start-stop-daemon called, doing nothing\"" > "/sbin/start-stop-daemon"
chmod 755 "/sbin/start-stop-daemon"
echo \
"#!/bin/sh
echo
echo \"Warning: Fake initctl called, doing nothing\"" > "/sbin/initctl"
chmod 755 "/sbin/initctl"
然后进行apt-get升级,安装等,然后使用以下方法进行清理:
rm /sbin/initctl /sbin/start-stop-daemon
dpkg-divert --remove --rename /sbin/initctl
dpkg-divert --remove --rename /sbin/start-stop-daemon
我知道还有其他命令可用于停止/启动服务,但是debootstrap只关心start-stop-daemon
和initctl
,所以我也照做。