AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 567474
Accepted
Michael Hampton
Michael Hampton
Asked: 2014-01-16 08:30:57 +0800 CST2014-01-16 08:30:57 +0800 CST 2014-01-16 08:30:57 +0800 CST

如何在不启动相关服务的情况下安装软件包?

  • 772

您可能知道,默认情况下,当您在基于 Debian 或 Ubuntu 的系统上安装软件包时,如果该软件包包含服务,则该服务通常会在您安装该软件包时自动启用并启动。

这对我来说是个问题。

我发现自己需要管理用于构建 LXC 容器的模板。有几个容器,每个容器对应一个 Debian 或 Ubuntu 版本。(也有基于 Red Hat 的容器,但它们在这里不相关。)

/var/lib/libvirt/filesystems/debian6_template
/var/lib/libvirt/filesystems/debian7_template
/var/lib/libvirt/filesystems/ubuntu1004_template
/var/lib/libvirt/filesystems/ubuntu1204_template

有时我会发现模板缺少包或需要进行其他更改,因此我将 chroot 进入它们以安装包。不幸的是,当我这样做时,我最终运行了几个包服务的副本!

例如,我发现模板没有系统日志守护程序,所以我安装了一个:

for template in /var/lib/libvirt/filesystems/{debian,ubuntu}*_template; do
    chroot $template apt-get install rsyslog
done

并立即运行了四个 rsyslog 副本。更不用说两份exim4了。哎呀!


我在某处读到(虽然我现在找不到了)它不应该在 chroot 中运行时启动服务,但这显然不会发生在这里。

一个可能可行的讨厌的黑客要求临时替换实际启动服务的各种命令,例如start-stop-daemonand initctl,尽管这比我真正想做的工作要多得多。如果我别无选择,虽然...

这里理想的解决方案是让基于 Debian 的系统停止做这种废话,但如果做不到这一点,可能是一个晦涩的或未记录的命令行选项apt-get?

如果不清楚,如果可能的话,我真的想保留与管理模板之外的模板相关的任何内容。

ubuntu debian package-management
  • 2 2 个回答
  • 11196 Views

2 个回答

  • Voted
  1. Best Answer
    sciurus
    2014-01-16T09:10:59+08:002014-01-16T09:10:59+08:00

    对于 debian,您可以使用policy-rc.d执行此操作。这是一种解释:

    一个包的维护者脚本应该只通过 invoke-rc.d、update-rc.d 和 LSB 初始化脚本头与 init 系统交互……invoke-rc.d 将在采取行动之前检查是否/usr/sbin/policy-rc.d 是可执行的,将在其命令行上使用相应的服务名称和当前运行级别编号调用它,并根据其退出代码执行操作。例如,返回值 101 将阻止执行计划的操作。这包括在安装包时自动启动服务以及在删除包时停止服务,并将包升级期间的停止-升级-重启仪式减少为仅执行升级,这可能会使旧版本的服务继续运行

    由于您不希望任何服务启动,因此您的 policy-rc.d 脚本可以很简单

    #!/bin/sh
    exit 101
    

    这是 pbuilder 和 Docker 的mkimage-debootstrap等工具使用的技术。

    不幸的是,这种技术不适用于 Ubuntu chroots。与 upstart init 系统集成的软件包在安装过程中调用 /usr/sbin/initctl 而不是 invoke-rc.d,并且 initctl 不咨询 policy-rc.d。根据 upstart 的作者的说法,解决方法是将 /sbin/initctl 替换为 chroot 中 /bin/true 的符号链接。您也可以在 mkimage-debootstrap 中看到这一点,他们可以

    dpkg-divert --local --rename --add /sbin/initctl
    ln -sf /bin/true sbin/initctl
    
    • 25
  2. DavisNT
    2014-02-05T09:22:48+08:002014-02-05T09:22:48+08:00

    你可以做:

    export RUNLEVEL=1
    for template in /var/lib/libvirt/filesystems/{debian,ubuntu}*_template; do
        chroot $template apt-get install rsyslog
    done
    exit
    

    我没有用 chroot 测试过它,但它应该可以工作。起初它设置了 RUNLEVEL 环境变量,所以 apt-get 启动的进程不会启动任何服务,因为它们会“认为”系统在单模式下运行。由于修改环境的方式可能会影响未来的命令,当不再需要修改的环境时,需要退出 shell,这是通过最后的exit命令完成的。可能有一些(罕见的?)软件包无法在单一模式下正确安装(但 AFAIK 在大多数情况下这应该不是问题)。

    • 5

相关问题

  • 无法通过 Ubuntu VPN 访问外部网络

  • ubuntu apt-get upgrade - 如何在 shell 中单击确定?

  • VirtualBox 上 Ubuntu 的访客优化技巧 [关闭]

  • 外部硬盘上的 virtualbox 虚拟硬盘驱动器(Vista 主机上的 ubuntu 客户机)

  • 如何在 Ubuntu 上挂载 LVM 分区?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve