nixpkgs/nixos/modules/system/boot
aszlig dcf40f7c24
Merge pull request #57519 (systemd-confinement)
Currently if you want to properly chroot a systemd service, you could do
it using BindReadOnlyPaths=/nix/store or use a separate derivation which
gathers the runtime closure of the service you want to chroot. The
former is the easier method and there is also a method directly offered
by systemd, called ProtectSystem, which still leaves the whole store
accessible. The latter however is a bit more involved, because you need
to bind-mount each store path of the runtime closure of the service you
want to chroot.

This can be achieved using pkgs.closureInfo and a small derivation that
packs everything into a systemd unit, which later can be added to
systemd.packages.

However, this process is a bit tedious, so the changes here implement
this in a more generic way.

Now if you want to chroot a systemd service, all you need to do is:

  {
    systemd.services.myservice = {
      description = "My Shiny Service";
      wantedBy = [ "multi-user.target" ];

      confinement.enable = true;
      serviceConfig.ExecStart = "${pkgs.myservice}/bin/myservice";
    };
  }

If more than the dependencies for the ExecStart* and ExecStop* (which
btw. also includes script and {pre,post}Start) need to be in the chroot,
it can be specified using the confinement.packages option. By default
(which uses the full-apivfs confinement mode), a user namespace is set
up as well and /proc, /sys and /dev are mounted appropriately.

In addition - and by default - a /bin/sh executable is provided, which
is useful for most programs that use the system() C library call to
execute commands via shell.

Unfortunately, there are a few limitations at the moment. The first
being that DynamicUser doesn't work in conjunction with tmpfs, because
systemd seems to ignore the TemporaryFileSystem option if DynamicUser is
enabled. I started implementing a workaround to do this, but I decided
to not include it as part of this pull request, because it needs a lot
more testing to ensure it's consistent with the behaviour without
DynamicUser.

The second limitation/issue is that RootDirectoryStartOnly doesn't work
right now, because it only affects the RootDirectory option and doesn't
include/exclude the individual bind mounts or the tmpfs.

A quirk we do have right now is that systemd tries to create a /usr
directory within the chroot, which subsequently fails. Fortunately, this
is just an ugly error and not a hard failure.

The changes also come with a changelog entry for NixOS 19.03, which is
why I asked for a vote of the NixOS 19.03 stable maintainers whether to
include it (I admit it's a bit late a few days before official release,
sorry for that):

  @samueldr:

    Via pull request comment[1]:

      +1 for backporting as this only enhances the feature set of nixos,
      and does not (at a glance) change existing behaviours.

    Via IRC:

      new feature: -1, tests +1, we're at zero, self-contained, with no
      global effects without actively using it, +1, I think it's good

  @lheckemann:

    Via pull request comment[2]:

      I'm neutral on backporting. On the one hand, as @samueldr says,
      this doesn't change any existing functionality. On the other hand,
      it's a new feature and we're well past the feature freeze, which
      AFAIU is intended so that new, potentially buggy features aren't
      introduced in the "stabilisation period". It is a cool feature
      though? :)

A few other people on IRC didn't have opposition either against late
inclusion into NixOS 19.03:

  @edolstra:  "I'm not against it"
  @Infinisil: "+1 from me as well"
  @grahamc:   "IMO its up to the RMs"

So that makes +1 from @samueldr, 0 from @lheckemann, 0 from @edolstra
and +1 from @Infinisil (even though he's not a release manager) and no
opposition from anyone, which is the reason why I'm merging this right
now.

I also would like to thank @Infinisil, @edolstra and @danbst for their
reviews.

[1]: https://github.com/NixOS/nixpkgs/pull/57519#issuecomment-477322127
[2]: https://github.com/NixOS/nixpkgs/pull/57519#issuecomment-477548395
2019-03-29 04:37:53 +01:00
..
loader Merge pull request #54625 from FlorianFranzen/efi32 2019-03-21 11:39:45 -04:00
binfmt.nix nixos/binfmt: Initial binfmt_msc support. 2018-02-18 12:42:17 -05:00
coredump.nix manual: Clarify that limits.conf doesn't apply to systemd services. (#40267) 2018-05-12 17:44:57 +02:00
emergency-mode.nix nixos: tmp on tmpfs option 2014-07-30 16:19:26 +02:00
grow-partition.nix Fix kernel crash caused by absent root device 2018-05-12 02:55:33 +03:00
initrd-network.nix Merge pull request #47665 from erikarvstedt/initrd-improvements 2019-01-06 21:48:26 -06:00
initrd-ssh.nix nixos/initrd: improve descriptions 2018-10-02 17:38:06 +02:00
kernel_config.nix linux: ability to merge structured configs 2019-01-28 09:06:33 +09:00
kernel.nix kernel: fix boot.consoleLogLevel description 2018-04-17 10:45:30 +09:00
kexec.nix nixos/kexec: Fix typo in meta.platforms 2018-09-28 17:44:42 +02:00
luksroot.nix nixos/luksroot: Fix typo Verifiying -> Verifying 2019-01-08 15:45:02 -05:00
modprobe.nix modprobe activation: Order after specialfs 2018-02-05 21:04:40 +01:00
networkd.nix nixos/networkd: do not require gateway for routes 2018-09-07 02:23:12 +03:00
pbkdf2-sha512.c Update to the Yubikey PBA 2014-02-08 14:59:52 +01:00
plymouth.nix nixos/plymouth: multi-user.target wants plymouth-quit-wait.service 2018-05-04 16:06:57 +02:00
resolved.nix [bot] nixos/*: remove unused arguments in lambdas 2018-07-20 20:56:59 +00:00
shutdown.nix Don't run hwclock if /dev/rtc doesn't exist 2014-05-05 16:47:51 +02:00
stage-1-init.sh Merge pull request #42183 from kisik21/master 2019-01-17 07:42:32 +00:00
stage-1.nix nixos: add preferLocalBuild=true; on derivations for config files 2019-02-22 20:11:27 +01:00
stage-2-init.sh nixos/stage-2: create empty machine-id at boot 2018-09-30 10:45:35 -07:00
stage-2.nix systemd: ensure fsck Requires/After links are created in mount units 2018-08-28 17:12:49 +02:00
systemd-lib.nix nixos: Add 'chroot' options to systemd.services 2019-03-14 19:14:01 +01:00
systemd-nspawn.nix nixos/systemd-nspawn: accept all Exec and Files options 2018-12-08 14:41:37 +01:00
systemd-unit-options.nix nixos/systemd: add StartLimitIntervalSec to unit config 2019-01-28 00:29:43 +00:00
systemd.nix Merge pull request #56012 from matix2267/logind-lid-switch-external-power 2019-02-22 20:55:46 +01:00
timesyncd.nix [bot] nixos/*: remove unused arguments in lambdas 2018-07-20 20:56:59 +00:00
tmp.nix nixos: tmp on tmpfs option 2014-07-30 16:19:26 +02:00