使用初始化脚本(或openrc),我始终可以从其他安装根目录运行服务。
但是当我跑步时chroot /somepath/to_root /usr/bin/systemctl start someservice
我得到了:
Running in chroot, ignoring request.
有没有办法强制系统运行服务?
更新:
我忘了说我的主机系统运行初始化脚本或openrc,但从未使用systemd,而且我使用chroot对无法启动最小外壳程序的Unix系统进行故障排除。
使用初始化脚本(或openrc),我始终可以从其他安装根目录运行服务。
但是当我跑步时chroot /somepath/to_root /usr/bin/systemctl start someservice
我得到了:
Running in chroot, ignoring request.
有没有办法强制系统运行服务?
更新:
我忘了说我的主机系统运行初始化脚本或openrc,但从未使用systemd,而且我使用chroot对无法启动最小外壳程序的Unix系统进行故障排除。
Answers:
systemd发行版(Arch Linux,OpenSUSE,Fedora)中的一个众所周知的问题。
Systemd取代了sysvinit,并在此方面提供了一大优势。在sysvinit中,当您要求服务启动时,它会继承调用脚本的人员的执行上下文,其中包括环境变量,ulimits等。相反,Systemd通过通知守护程序对此进行了改进,该守护程序将在定义良好,健康,恒定的环境中启动服务,由于环境始终是相同的,因此在该环境中当然可以更容易预测服务的性能。
这意味着,当我从chroot内部调用systemctl时,与我在chroot内部无关,要继承的环境仍然是PID 1,而不是我当前的环境。但是它变得比这更糟:由于通信套接字位于/ run / systemd内,因此chroot中的进程甚至无法与init系统对话!
那么您如何在systemd发行版中进行chroot'ing?
如果您只想拥有Linux容器,那么Arch Wiki页面将告诉您如何在30秒内设置Linux容器systemd-nspawn
。
相反,如果您真的想要chroot环境,那么这个美丽而透明的Web页将为您提供两种可行的解决方案(第二种是在第1点提供的解决方案的修改版本)。
systemd-nspawn
但无法运行。不,这不是针对容器的,因为主机和目标体系结构都需要使用该服务。
systemd-nspawn
失败并显示“不在systemd系统上运行”。除非主机也使用systemd。
systemd-nspawn
,但指向新的根目录也无济于事。主机已经拥有了它(因为它正在运行systemd),在这种情况下可以使用主机版本,或者主机没有它,但是新根目录的版本将无法使用。
systemd
将会拒绝参加chroot
systemd
只忽略“服务”,因此我只是手动运行守护程序命令。
所以代替
service sshd start
我用
/usr/sbin/sshd -D &
startx
将为工作Xorg
。
我真的受够了Systemd,因为我遇到了从未遇到过Upstart或Openrc之类的问题:
systemd-udevd
哪个需求systemd-init
,而哪个需求所要求的systemd-boot
软件包不能同时安装,grub2
也不能从reiser4分区读取内核映像。networkd
。Systemd是解决问题的简单方法,就像alsa而不是ossv4。因此,如果您有使用systemd的东西,只需擦除所有数据:
dd if=/dev/urandom of=/dev/dm−0 bs=1M
并在解决SysV Init问题(如带有Openrc的Gentoo)时安装根本不使用它的东西。
关于我的问题systemd就像Windows®注册表一样:如果其中一部分搞砸了,那就结束了。
不会。服务由systemd(pid 1)执行,而不是直接由systemctl(仅发送启动请求)执行,并且由于systemd在chroot之外运行,因此服务也将运行。
尽管从技术上讲,可以实现这一点(通过使systemctl以某种方式将其根源传递给systemd),但由于已经存在创建完整容器的工具(systemd-nspawn /somepath/to_root
),因此不太可能发生。不过,您始终可以联系邮件列表。
RootDirectory=
也要提及,因为您是如此危险地缺乏投票。(-:
RootDirectory
和chroot
命令之间(在结果方面)有什么区别?
pid 1
是init 怎么追加?
曾经尝试使用chroot的网络配置以应急模式启动网络时面临此问题。最后,这对我有用:
service --skip-redirect <service> restart
要么:
SYSTEMCTL_SKIP_REDIRECT=_ /etc/init.d/<service> restart
如果要通过套接字激活来启动inetd样式的服务,请考虑使用指定chroot和二进制文件作为inetd样式的启动目标的配置文件来启动stunnel。
请注意,您可能有SELINUX问题。在Oracle Linux 7.1系统上,我必须对tunnel需要读取的所有文件进行“ chcon -v --type = stunnel_etc_t”。
您将需要在套接字的客户端上使用TLS加密(即,配置中的另一个带有“ client = yes”的通道)。如果您需要更多详细信息,请告诉我。
您可以使用nohup
命令在chroot中启动服务。httpd
例如,要开始服务,我就是这样做的。
nohup httpd /dev/null &
阻止它 pkill httpd
Running in chroot, ignoring request.
。我不认为您会一直使用chroot来执行此操作。实际上,启动脚本需要systemd。