Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

stage-2: parameterized systemd executable #93110

Merged
merged 1 commit into from Jul 14, 2020

Conversation

grahamc
Copy link
Member

@grahamc grahamc commented Jul 14, 2020

This lets users do sneaky things before systemd starts, and
permanently affect the environment in which systemd runs. For example,
we could start systemd in a non-default network namespace by setting
the systemdExecutable to a wrapper script containing:

#!/bin/sh
ip netns add virtual
touch /var/run/netns/physical
mount -o bind /proc/self/ns/net /var/run/netns/physical
exec ip netns exec virtual systemd

note: the above example does literally work, but there are unresolved problems with udev and dhcp.

Motivation for this change
Things done
  • Tested using sandboxing (nix.useSandbox on NixOS, or option sandbox in nix.conf on non-NixOS linux)
  • Built on platform(s)
    • NixOS
    • macOS
    • other Linux distributions
  • Tested via one or more NixOS test(s) if existing and applicable for the change (look inside nixos/tests)
  • Tested compilation of all pkgs that depend on this change using nix-shell -p nixpkgs-review --run "nixpkgs-review wip"
  • Tested execution of all binary files (usually in ./result/bin/)
  • Determined the impact on package closure size (by running nix path-info -S before and after)
  • Ensured that relevant documentation is up to date
  • Fits CONTRIBUTING.md.

@edolstra
Copy link
Member

The option name and description are misleading, since this is not a program but a shell fragment that gets concatenated after exec. It might be better to name it startSystemd or something like that (with default value exec systemd). PATH=... LOCALE_ARCHIVE=... could be split from the exec so it's easier to inject arbitrary shell code to run before systemd.

A more general solution would be to modularize the stage 2 script similar to the activation script, such that the script fragment that starts systemd gets ordered after all other fragments. But that's probably a bit overkill.

@grahamc
Copy link
Member Author

grahamc commented Jul 14, 2020

Ah, in this case, the fragment would be written to a wrapper script which would still be exec'd the same way. Not a shell fragment. It does look like a shell fragment, but only because Git strips lines that start with a # and my shebang was eaten.

This lets users do sneaky things before systemd starts, and
permanently affect the environment in which systemd runs. For example,
we could start systemd in a non-default network namespace by setting
the systemdExecutable to a wrapper script containing:

    #!/bin/sh
    ip netns add virtual
    touch /var/run/netns/physical
    mount -o bind /proc/self/ns/net /var/run/netns/physical
    exec ip netns exec virtual systemd

_note: the above example does literally work, but there are unresolved
problems with udev and dhcp._
@grahamc
Copy link
Member Author

grahamc commented Jul 14, 2020

I updated the description and type to show that it is a single value, not lines.

@grahamc grahamc merged commit 0c10b75 into NixOS:master Jul 14, 2020
@grahamc grahamc deleted the systemd-executable branch July 14, 2020 19:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants