在chroot中启动systemd服务


38

使用初始化脚本(或openrc),我始终可以从其他安装根目录运行服务。
但是当我跑步时chroot /somepath/to_root /usr/bin/systemctl start someservice我得到了:

Running in chroot, ignoring request.

有没有办法强制系统运行服务?

更新:
我忘了说我的主机系统运行初始化脚本或openrc,但从未使用systemd,而且我使用chroot对无法启动最小外壳程序的Unix系统进行故障排除。


1
我还需要将服务运行到chroot中,它始终可以在openrc2之前工作,现在看来似乎已经不可能了;(
neofutur 2014年

您正在尝试解决错误的问题。如果您具有OpenRC,则需要将systemd服务转换为OpenRC服务。真的没有办法解决。
丹尼尔·B

@DanielB:不!您听说过systemrescuecd吗?
user2284570 2015年

不。我也看不到它与您的问题有什么关系。
Daniel B

Answers:


29

systemd发行版(Arch Linux,OpenSUSE,Fedora)中的一个众所周知的问题。

Systemd取代了sysvinit,并在此方面提供了一大优势。在sysvinit中,当您要求服务启动时,它会继承调用脚本的人员的执行上下文,其中包括环境变量,ulimits等。相反,Systemd通过通知守护程序对此进行了改进,该守护程序将在定义良好,健康,恒定的环境中启动服务,由于环境始终是相同的,因此在该环境中当然可以更容易预测服务的性能。

这意味着,当我从chroot内部调用systemctl时,与我在chroot内部无关,要继承的环境仍然是PID 1,而不是我当前的环境。但是它变得比这更糟:由于通信套接字位于/ run / systemd内,因此chroot中的进程甚至无法与init系统对话!

那么您如何在systemd发行版中进行chroot'ing?

  1. 如果您只想拥有Linux容器,那么Arch Wiki页面将告诉您如何在30秒内设置Linux容器systemd-nspawn

  2. 相反,如果您真的想要chroot环境,那么这个美丽而透明的Web页将为您提供两种可行的解决方案(第二种是在第1点提供的解决方案的修改版本)。


我一直在寻找,systemd-nspawn但无法运行。不,这不是针对容器的,因为主机和目标体系结构都需要使用该服务。
user2284570 2013年

2
我从不在主机系统根目录中使用systemd。就我而言,我无法将systemd与openrc混合使用。
user2284570 2013年

1
@TwoD那行不通。运行systemd-nspawn失败并显示“不在systemd系统上运行”。除非主机也使用systemd。
hvd 2015年

1
@TwoD我回应了,因为它对我来说根本不是那样。:)如果您在查找可执行文件时遇到麻烦,“我无法运行”是一件奇怪的事情,这就是为什么我怀疑问题出在我的评论中:为什么运行它会给出该错误消息,而不会没有做任何有用的事情。但是,即使事实确实是问题出在哪里systemd-nspawn,但指向新的根目录也无济于事。主机已经拥有了它(因为它正在运行systemd),在这种情况下可以使用主机版本,或者主机没有它,但是新根目录的版本将无法使用。
hvd 2015年

1
systemd将会拒绝参加chroot
Erkin AlpGüney17年

4

systemd 只忽略“服务”,因此我只是手动运行守护程序命令。

所以代替

service sshd start

我用

/usr/sbin/sshd -D &

这不适用于所有服务。有些需要作为Xorg之类的系统服务启动程序的一部分来启动。
user2284570 2015年

startx将为工作Xorg
Erkin AlpGüney17年

@ErkinAlpGüney:不在chroot中...因为Dbus。
user2284570 '18

4

几年后,我必须承认,对于大多数系统化的实际问题,只有一种解决方案。因为错误是Systemd本身

我真的受够了Systemd,因为我遇到了从未遇到过Upstart或Openrc之类的问题:

  • 即使对于只有24Mb内存且没有可写存储的嵌入式系统,强制执行要求cgroups支持的内核(而不是使其成为可选的,而是默认在配置文件中启用)
  • 尽管声称是模块化的,但在运行时,依赖地狱却使其成为一个强大的上帝对象:是否要通过单个reiser4 rootfs引导?这是不可能的,因为许多程序需要使用systemd-udevd哪个需求systemd-init,而哪个需求所要求的systemd-boot软件包不能同时安装,grub2也不能从reiser4分区读取内核映像。
  • 是否想通过蓝牙拨号连接到互联网?如果它不适用于您的三星java me手机,那么您将无法运行以前由于而导致手动运行的脚本和命令行软件networkd
  • 尽管我认识到最大的问题是您是否正在构建和维护自己的Linux发行版:systemd初始化模块本身具有太多的依赖关系,所以您不能建议通过不同的安装程序包选择另一个初始化系统。
  • 如果您无法在系统中使用chroot或从libdb4.8升级如果至少在最坏的情况下,Microsoft的xml格式的日志文件),则可以查看日志。

唯一的解决方案:

Systemd是解决问题的简单方法,就像alsa而不是ossv4。因此,如果您有使用systemd的东西,只需擦除所有数据:

dd if=/dev/urandom of=/dev/dm−0 bs=1M

并在解决SysV Init问题(如带有Openrc的Gentoo)时安装根本不使用它的东西。
关于我的问题systemd就像Windows®注册表一样:如果其中一部分搞砸了,那就结束了。


3
请认识到,某些东西的设计确实会阻止得到答案,因此答案就是切换到可行的东西。这是一个真正的答案。
user2284570

1
我有相同的观点,现在我的观点更加平衡。Systemd具有极大的优势,它可以真正杀死应该杀死的东西。这是因为它使用内核cgroup功能跟踪所有分叉的子进程。没有任何较旧的工具可以做到这一点。此外,您还记得/etc/init/*.sh中脚本的废话吗,但是今天对我来说只是一个不好的回忆。systemd服务文件是清晰的,大约有10行长的配置。不是200行长的脚本。这些巨大的优势具有系统性,我同意其所有其他特征都是不利的。
彼得说恢复莫妮卡

顺便说一句,我投票赞成你的答案,因为除了它的优点之外,正是这种类型的批评家,正是这种口吻是系统开发需要改进的。例如,我刚刚尝试在chroot中启动一个postgresql,而我不得不废除我的根系统来做到这一点。许多人,许多糟糕的事情还是有的,对吧。
彼得说恢复莫妮卡

@peterh:不幸的是,并不是所有人都分享我的意思,这是删除帖子的目的。这不是针对Systemd的SysV初始化,而是针对Openrc甚至Upstart(它允许简短的启动脚本以及并行服务启动)之类的东西。至少我学到了一件事:达尔文(Darwin)主要是Apple™,Windows是微软(Microsoft),而Linux设计主要是由红帽负责。尽管SysV初始化速度较慢,但​​并不限制您在运行时可以执行的操作。
user2284570

使用Openrc时,@ peterh Services脚本也非常清晰。Systemd上cgroup的问题是这不是一个选项,可以防止Systemd运行诸如Darwin或NetBSD之类的东西。
user2284570

3

不会。服务由systemd(pid 1)执行,而不是直接由systemctl(仅发送启动请求)执行,并且由于systemd在chroot之外运行,因此服务也将运行。

尽管从技术上讲,可以实现这一点(通过使systemctl以某种方式将其根源传递给systemd),但由于已经存在创建完整容器的工具(systemd-nspawn /somepath/to_root),因此不太可能发生。不过,您始终可以联系邮件列表


1
很好,但是我需要使用systemctl,因为我的主机系统使用了oepnrc。我想要完整的独立解决方案
user2284570 2013年

3
我要进一步说:“ Pstst!” RootDirectory=也要提及,因为您是如此危险地缺乏投票。(-:
JdeBP

@JdeBP:变量RootDirectorychroot命令之间(在结果方面)有什么区别?
user2284570 2013年

@grawity:那么如果pid 1是init 怎么追加?
user2284570 2013年

1

曾经尝试使用chroot的网络配置以应急模式启动网络时面临此问题。最后,这对我有用:

service --skip-redirect <service> restart

要么:

SYSTEMCTL_SKIP_REDIRECT=_ /etc/init.d/<service> restart

真好 但是它仅与旧的Init兼容服务一起使用(不适用于Fedora rawhide中的联网)。正如我在回答中所说的那样,真正的解决方案是搞砸所有使用systemd的东西。
user2284570

0

如果要通过套接字激活来启动inetd样式的服务,请考虑使用指定chroot和二进制文件作为inetd样式的启动目标的配置文件来启动stunnel。

请注意,您可能有SELINUX问题。在Oracle Linux 7.1系统上,我必须对tunnel需要读取的所有文件进行“ chcon -v --type = stunnel_etc_t”。

您将需要在套接字的客户端上使用TLS加密(即,配置中的另一个带有“ client = yes”的通道)。如果您需要更多详细信息,请告诉我。


不,这与d-bus有关。我这样做是为了诊断目标chroot上的问题。
user2284570

-1

您可以使用nohup命令在chroot中启动服务。httpd例如,要开始服务,我就是这样做的。

nohup httpd /dev/null &

阻止它 pkill httpd


诸如Dbus之类的只能由已安装的二进制systemd脚本启动的服务呢?
user2284570 '16

您可以使用start命令从其目录中启动此类服务。
ellooku '16

这是针对systemctl的符号链接。因此它不起作用。
user2284570 '16

我一直在Android上运行的Fedora上执行此操作。可能是我不知道您的问题是什么。
ellooku '16

结果是这样的信息:Running in chroot, ignoring request.。我不认为您会一直使用chroot来执行此操作。实际上,启动脚本需要systemd。
user2284570 '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.