50

With init scripts (or with openrc) I alway could run services from a different installation root.
but when I run chroot /somepath/to_root /usr/bin/systemctl start someservice I got:

Running in chroot, ignoring request.

Is there a way to force systemd run the service?

Update:
I forgot to say my host system run init scripts or openrc, but never systemd, and that I use chroot to troubleshot Unix systems which can't even launch a minimal shell.

4
  • 1
    I also need to run services into a chroot, it always worked before openrc2, seems impossible now ;( – neofutur Aug 3 '14 at 1:05
  • You’re trying to solve the wrong problem. If you have OpenRC, you need to convert the systemd service into an OpenRC service. There’s really no way around that. – Daniel B Mar 10 '15 at 21:22
  • @DanielB : NO! Did you ever heard of systemrescuecd? – user2284570 Mar 11 '15 at 0:19
  • No. I also don't see how it relates to your question. – Daniel B Mar 11 '15 at 6:34
40

A well-known problem in systemd distros (Arch Linux, OpenSUSE, Fedora).

Systemd replaces sysvinit, and provides one great advantage over this. In sysvinit, when you ask a service to start, it inherits the execution context of the person invoking the script, which includes environment variables, ulimits, and so on. Systemd improves on this at the contrary by notifying a daemon, which will start the service in a well-defined, healthy, constant environment, where of course the performances of the services are much easier to predict, since the environment is always the same.

This implies that, when I call systemctl from within the chroot, it is irrelevant that I am inside chroot, the environment that will be inherited is still that of PID 1, not my current one. But it gets worse than this: since communication sockets are placed inside /run/systemd, a process in a chroot will not even be able to talk to the init system!

So how do you go about chroot'ing in systemd distros?

  1. If all you want to do is have a Linux container, this Arch Wiki page will tell you how to set up a Linux container in less than 30 seconds, thanks to systemd-nspawn.

  2. If instead you really want a chroot environment, this beautiful and crystal clear Web page will provide you with two working solutions (the second one is a modified version of the one offered at point #1).

13
  • 2
    That I never use systemd in my host system root. In my case I can't mix systemd with openrc. – user2284570 Dec 16 '13 at 18:05
  • 2
    @TwoD That won't work. Running systemd-nspawn fails with "Not running on a systemd system." unless the host is using systemd as well. – hvd Jul 15 '15 at 11:59
  • 1
    @TwoD And I responded because it doesn't sound like that at all to me. :) "I can't run it" is an odd thing to say if you're having trouble finding the executable, which is why I suspect that the problem is what I put in my comment: running it gives that error message and doesn't do anything useful. But even if it turns out the problem really was where to find systemd-nspawn, then pointing into the new root won't help. Either the host already has it (because it's running systemd), in which case the host version can be used, or the host doesn't have it, but the new root's version won't work. – hvd Jul 15 '15 at 12:45
  • 1
    systemd will refuse to be run in chroot – Erkin Alp Güney Mar 11 '17 at 14:30
  • 1
    @CraigHicks Except since you set up a jail, you can’t do things like connecting wayland apps to the host’s compositing. Plain chroot isn’t a jail, but a way to change access search paths for the binaires. – user2284570 Aug 8 '20 at 10:02
13

Several years laters I must admit there is only one solution to most Systemd practical problems. Because the error is Systemd itself

I am really fed up with Systemd as I had problems that I never faced with things like Upstart or Openrc :

  • The enforcing of a kernel requiring cgroups support (instead of being made optional but enabled by default inside a config file) even for embedded systems with only 24Mb of ram and no writable storage.
    While proponents argue that not being able to use it in such case is the wanted behavior since it wasn’t designed for such case, the reality is the other init systems also don’t care while in systemd such feature isn’t a separate project which highlights once again the consequences of not following kiss.
  • Despite the claim of being modular, at runtime the dependency hell makes it a strong god object : want to boot over a single reiser4 rootfs ? It’s not possible because many programs requires systemd-udevd which requires systemd-init which requires the systemd-boot package which can’t be installed at the same time than grub2 nor can read kernel images from a reiser4 partition.
  • Want to connect to internet through Bluetooth dialup ? If it doesn’t work with your samsung java me phone, then you aren’t able to run the scripts and command line software that previously worked manually because of networkd.
  • Though I recognize the biggest problem is if you are building and maintaining your own Linux distribution : the systemd init module itself has so much dependencies that you can’t propose to choose an other init system through different install packages.
  • The default use of Google dns for systemd if no resolver is defined in terms of privacy.
  • The inability to launch a background non serive process and log out as there are no simple way to do it in a new systemd scope.
  • Good luck for viewing logs if you can’t chroot in your system or if you upgraded from libdb4.8 (whereas at least, in worst case Microsoft have it’s log files in xml format).

The only solution :

Systemd is unessary complex for solving problems : like alsa instead of ossv4. So if you have something that uses systemd just wipe all the data :

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

and install something that don’t uses it at all while solving problems of SysV Init like Gentoo with Openrc.
Concerning my question systemd makes things like the Windows® registry : if a part of it gets screwed up, then it’s over.

14
  • 6
    Please recognize that the design of something can really prevent from getting an answer so that the answer is to switch to something which works. And that this is a real answer. – user2284570 Nov 18 '18 at 21:47
  • 1
    I had the same opinion, now I am on a little bit more balanced view. Systemd has the super-big advantage that it can really kill what should be killed. It is because it tracks all the forked sub-processes with the kernel cgroup feature. None of the older tools can do that. Furthermore, do you remember the crap of the scripts in /etc/init/*.sh?I too, but it is only a bad memory to me today. The systemd service files are clear and around 10 lines long configs. Not 200 line long scripts. These huge advantages has the systemd, I agree that its all other features are disadvantage. – peterh Mar 25 '19 at 12:53
  • Btw, I voted your answer up because, beside its advantages, exactly this type of critics, exactly in this tone is what the systemd development requires to improve. For example, I've just tried to start a postgresql in a chroot and I had to crap my root system to do that. Many, many crappy thing is still there, right. – peterh Mar 25 '19 at 12:57
  • @peterh : unfortunately not everyone share it I mean to the point of deleting post. This is not about SysV init against Systemd but more against things like Openrc or even Upstart (which allows for short startup scripts as well as parallel service start). At least I learned one thing : Darwin is mostly the ᴏꜱ of Apple™ Windows is the ᴏꜱ of Microsoft and Linux design is mostly run by red hat. Though SysV init while being slower doesn’t restrict you at what you can do at runtime. – user2284570 Mar 26 '19 at 13:08
  • 1
    @LuisMachuca which is the problem of this question (but apt-get can work without Systemd). How do you manage to not have pid 1 based on a systemd binary because of packages dependencies? This is for that impossibility that devuan was started. Are you still running Jessie or older? – user2284570 Apr 28 '20 at 22:12
7

systemd only ignores "services", so I just run the daemon commands manually.

So instead of

service sshd start

I use

/usr/sbin/sshd -D &
3
  • 2
    This doesn’t work for all services. Some require to be started as part of the system service starter like Xorg. – user2284570 Dec 6 '15 at 11:15
  • startx will work for Xorg. – Erkin Alp Güney Mar 11 '17 at 14:26
  • @ErkinAlpGüney : not in chroot… Because of Dbus. – user2284570 Apr 20 '18 at 19:02
3

No. Services are executed by systemd (pid 1), not by systemctl directly (which only sends a start request), and since systemd runs outside the chroot, so will the service.

Although technically it could be possible to implement this (by making systemctl somehow pass its root to systemd), it is somewhat unlikely to happen since there already is a tool for creating full containers (systemd-nspawn /somepath/to_root). You could always contact the mailing list though.

4
  • 1
    Nice, But I need to use systemctl since My host system use oepnrc. I want full independent solution – user2284570 Dec 15 '13 at 17:55
  • 3
    I'll muddy the waters yet further by saying: Psst! Mention RootDirectory= as well since you are so dangerously short of upvotes. (-: – JdeBP Dec 16 '13 at 19:56
  • @JdeBP : What is the difference (in term of results) beetween the variable RootDirectoryand the chrootcommand? – user2284570 Dec 17 '13 at 21:35
  • @grawity : So What append if the pid 1 is init? – user2284570 Dec 21 '13 at 9:41
2

Faced this problem once tried to bring up network in rescue mode using network configuration from chroot. Finally this works for me:

service --skip-redirect <service> restart

or:

SYSTEMCTL_SKIP_REDIRECT=_ /etc/init.d/<service> restart
1
  • Nice. But it works only with legacy Init compatible services (won’t work for networking in Fedora rawhide). As I said in my answer, the real solution is to screw up anything that use systemd. – user2284570 Dec 12 '17 at 14:59
0

Define a service file outside chroot that execute the service inside the chroot with the options RootDirectory=/path/to/chroot in conjunction with MountAPIVFS=on, the link above contains the magic.

Run systemd script in chroot from outside the chroot

1
  • It will then be run with isolation preventing it from interacting with things like udev on the host. – user2284570 Sep 8 '20 at 7:38
-1

If you are launching an inetd-style service with socket activation, consider launching stunnel instead with a configuration file that specifies both a chroot and your binary as an inetd-style launch target.

Note that you may have SELINUX issues. On an Oracle Linux 7.1 system, I had to "chcon -v --type=stunnel_etc_t" on all files that stunnel needed to read.

You will need to use TLS encryption on the client side of the socket (i.e., another stunnel with "client=yes" in the config). Let me know if you want more details on this.

1
  • no it's about things like d-bus. I do it in order to diagnose problems on the target chroot. – user2284570 Sep 14 '15 at 17:15
-1

You can use nohup command to start services in chroot. To start httpdservice for example, I do it like this.

nohup httpd /dev/null &

to stop it pkill httpd

5
  • What about services like Dbus that can only be started by the installed binary systemd script ? – user2284570 Apr 11 '16 at 10:01
  • You can start such services from its directory with start command. – ellooku Apr 21 '16 at 18:18
  • Which is a symlink against systemctl. So it doesn’t work. – user2284570 Apr 21 '16 at 18:25
  • I do this all the time on Fedora running on my Android. May be I don't know what your problem is. – ellooku Apr 21 '16 at 18:32
  • The consequence is this message :Running in chroot, ignoring request.. I don’t think you do it all the time though chroot. Indeed, the startup script requires systemd. – user2284570 Apr 21 '16 at 18:35

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.