diff options
author | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2012-06-14 18:44:56 -0400 |
---|---|---|
committer | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2012-06-14 18:44:56 -0400 |
commit | a46894b960c47348eef2a682ea5e0597d8c7b2c5 (patch) | |
tree | 5b708516b7c2d96ce534f8c72bffa3557fff6dfe /modules/system/boot/systemd.nix | |
parent | fae777c2646ec7c316cb9a5ea3a408236ccb49c8 (diff) | |
download | nixpkgs-a46894b960c47348eef2a682ea5e0597d8c7b2c5.tar nixpkgs-a46894b960c47348eef2a682ea5e0597d8c7b2c5.tar.gz nixpkgs-a46894b960c47348eef2a682ea5e0597d8c7b2c5.tar.bz2 nixpkgs-a46894b960c47348eef2a682ea5e0597d8c7b2c5.tar.lz nixpkgs-a46894b960c47348eef2a682ea5e0597d8c7b2c5.tar.xz nixpkgs-a46894b960c47348eef2a682ea5e0597d8c7b2c5.tar.zst nixpkgs-a46894b960c47348eef2a682ea5e0597d8c7b2c5.zip |
Get lots more systemd stuff working
Enabled a bunch of units that ship with systemd. Also added an option ‘boot.systemd.units’ that can be used to define additional units (e.g. ‘sshd.service’).
Diffstat (limited to 'modules/system/boot/systemd.nix')
-rw-r--r-- | modules/system/boot/systemd.nix | 261 |
1 files changed, 170 insertions, 91 deletions
diff --git a/modules/system/boot/systemd.nix b/modules/system/boot/systemd.nix index 3b51ebf43fc..4555b59d278 100644 --- a/modules/system/boot/systemd.nix +++ b/modules/system/boot/systemd.nix @@ -9,106 +9,71 @@ let makeUnit = name: text: pkgs.writeTextFile { name = "unit"; inherit text; destination = "/${name}"; }; - defaultTarget = makeUnit "default.target" - '' - [Unit] - Description=Default System - Requires=getty.target - After=getty.target - Conflicts=rescue.target - AllowIsolate=yes - ''; - - gettyTarget = makeUnit "getty.target" - '' - [Unit] - Description=Login Prompts - Requires=getty@tty1.service getty@tty2.service - After=getty@tty1.service getty@tty2.service - ''; - - gettyService = makeUnit "getty@.service" - '' - [Unit] - Description=Getty on %I - #BindTo=dev-%i.device - #After=dev-%i.device systemd-user-sessions.service plymouth-quit-wait.service - Before=getty.target - - [Service] - Environment=TERM=linux - ExecStart=-${pkgs.utillinux}/sbin/agetty --noclear --login-program ${pkgs.shadow}/bin/login %I 38400 - Restart=always - RestartSec=0 - UtmpIdentifier=%I - TTYPath=/dev/%I - TTYReset=yes - TTYVHangup=yes - TTYVTDisallocate=yes - KillMode=process - IgnoreSIGPIPE=no - - # Unset locale for the console getty since the console has problems - # displaying some internationalized messages. - Environment=LANG= LANGUAGE= LC_CTYPE= LC_NUMERIC= LC_TIME= LC_COLLATE= LC_MONETARY= LC_MESSAGES= LC_PAPER= LC_NAME= LC_ADDRESS= LC_TELEPHONE= LC_MEASUREMENT= LC_IDENTIFICATION= - - # Some login implementations ignore SIGTERM, so we send SIGHUP - # instead, to ensure that login terminates cleanly. - KillSignal=SIGHUP - ''; - - rescueTarget = makeUnit "rescue.target" - '' - [Unit] - Description=Rescue Mode - Requires=rescue.service - After=rescue.service - AllowIsolate=yes - ''; - - rescueService = makeUnit "rescue.service" - '' - [Unit] - Description=Rescue Shell - DefaultDependencies=no - #After=basic.target - #Before=shutdown.target - - [Service] - Environment=HOME=/root - WorkingDirectory=/root - ExecStartPre=-${pkgs.coreutils}/bin/echo 'Welcome to rescue mode. Use "systemctl default" or ^D to enter default mode.' - #ExecStart=-/sbin/sulogin - ExecStart=-${pkgs.bashInteractive}/bin/bash --login - ExecStopPost=-${systemd}/bin/systemctl --fail --no-block default - StandardInput=tty-force - StandardOutput=inherit - StandardError=inherit - KillMode=process - - # Bash ignores SIGTERM, so we send SIGHUP instead, to ensure that bash - # terminates cleanly. - KillSignal=SIGHUP - ''; - upstreamUnits = - [ "systemd-journald.socket" - "systemd-journald.service" + [ # Targets. "basic.target" "sysinit.target" - "sysinit.target.wants" "sockets.target" - "sockets.target.wants" + "graphical.target" + "multi-user.target" + "getty.target" + "rescue.target" + "network.target" + "nss-lookup.target" + "nss-user-lookup.target" + "syslog.target" + "time-sync.target" + + # Login stuff. + "systemd-logind.service" + "autovt@.service" + "systemd-vconsole-setup.service" + "systemd-user-sessions.service" + + # Journal. + "systemd-journald.socket" + "systemd-journald.service" + # SysV init compatibility. + "systemd-initctl.socket" + "systemd-initctl.service" + "runlevel0.target" + "runlevel1.target" + "runlevel2.target" + "runlevel3.target" + "runlevel4.target" + "runlevel5.target" + "runlevel6.target" + + # Random seed. + "systemd-random-seed-load.service" + "systemd-random-seed-save.service" + + # Utmp maintenance. + "systemd-update-utmp-runlevel.service" + "systemd-update-utmp-shutdown.service" + # Filesystems. + "fsck@.service" + "fsck-root.service" + "systemd-remount-fs.service" "local-fs.target" - "local-fs.target.wants" "local-fs-pre.target" "remote-fs.target" "remote-fs-pre.target" "swap.target" - "media.mount" + "dev-hugepages.mount" "dev-mqueue.mount" + "sys-fs-fuse-connections.mount" + "sys-kernel-config.mount" + "sys-kernel-debug.mount" + + # Hibernate / suspend. + "hibernate.target" + "hibernate.service" + "suspend.target" + "suspend.service" + "sleep.target" # Reboot stuff. "reboot.target" @@ -121,18 +86,46 @@ let "shutdown.target" "umount.target" "final.target" + + # Misc. + "syslog.socket" ]; + upstreamWants = + [ "basic.target.wants" + "sysinit.target.wants" + "sockets.target.wants" + "local-fs.target.wants" + "multi-user.target.wants" + "shutdown.target.wants" + ]; + + nixosUnits = mapAttrsToList makeUnit config.boot.systemd.units; + systemUnits = pkgs.runCommand "system-units" { } '' mkdir -p $out/system for i in ${toString upstreamUnits}; do fn=${systemd}/example/systemd/system/$i - echo $fn [ -e $fn ] - ln -s $fn $out/system + if [ -L $fn ]; then + cp -pd $fn $out/system/ + else + ln -s $fn $out/system + fi done - for i in ${toString [ defaultTarget gettyTarget gettyService rescueTarget rescueService ]}; do + for i in ${toString upstreamWants}; do + fn=${systemd}/example/systemd/system/$i + [ -e $fn ] + x=$out/system/$(basename $fn) + mkdir $x + for i in $fn/*; do + y=$x/$(basename $i) + cp -pd $i $y + if ! [ -e $y ]; then rm -v $y; fi + done + done + for i in ${toString nixosUnits}; do cp $i/* $out/system done ''; # */ @@ -141,6 +134,18 @@ in { + ###### interface + + options = { + + boot.systemd.units = mkOption { + default = {} ; + description = "Systemd units."; + }; + + }; + + ###### implementation config = { @@ -152,7 +157,81 @@ in target = "systemd"; } ]; + + boot.systemd.units."default.target" = + '' + [Unit] + Description=Default System + Requires=multi-user.target + After=multi-user.target + Conflicts=rescue.target + AllowIsolate=yes + Wants=sshd.service autovt@tty1.service # FIXME + ''; + boot.systemd.units."getty@.service" = + '' + [Unit] + Description=Getty on %I + Documentation=man:agetty(8) + After=systemd-user-sessions.service plymouth-quit-wait.service + + # If additional gettys are spawned during boot then we should make + # sure that this is synchronized before getty.target, even though + # getty.target didn't actually pull it in. + Before=getty.target + IgnoreOnIsolate=yes + + [Service] + Environment=TERM=linux + ExecStart=-${pkgs.utillinux}/sbin/agetty --noclear --login-program ${pkgs.shadow}/bin/login %I 38400 + Type=idle + Restart=always + RestartSec=0 + UtmpIdentifier=%I + TTYPath=/dev/%I + TTYReset=yes + TTYVHangup=yes + TTYVTDisallocate=yes + KillMode=process + IgnoreSIGPIPE=no + + # Unset locale for the console getty since the console has problems + # displaying some internationalized messages. + Environment=LANG= LANGUAGE= LC_CTYPE= LC_NUMERIC= LC_TIME= LC_COLLATE= LC_MONETARY= LC_MESSAGES= LC_PAPER= LC_NAME= LC_ADDRESS= LC_TELEPHONE= LC_MEASUREMENT= LC_IDENTIFICATION= + + # Some login implementations ignore SIGTERM, so we send SIGHUP + # instead, to ensure that login terminates cleanly. + KillSignal=SIGHUP + ''; + + boot.systemd.units."rescue.service" = + '' + [Unit] + Description=Rescue Shell + DefaultDependencies=no + Conflicts=shutdown.target + After=sysinit.target + Before=shutdown.target + + [Service] + Environment=HOME=/root + WorkingDirectory=/root + ExecStartPre=-${pkgs.coreutils}/bin/echo 'Welcome to rescue mode. Use "systemctl default" or ^D to enter default mode.' + #ExecStart=-/sbin/sulogin + ExecStart=-${pkgs.bashInteractive}/bin/bash --login + ExecStopPost=-${systemd}/bin/systemctl --fail --no-block default + Type=idle + StandardInput=tty-force + StandardOutput=inherit + StandardError=inherit + KillMode=process + + # Bash ignores SIGTERM, so we send SIGHUP instead, to ensure that bash + # terminates cleanly. + KillSignal=SIGHUP + ''; + }; } |