summary refs log tree commit diff
path: root/modules/system/boot/systemd.nix
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2012-06-14 18:44:56 -0400
committerEelco Dolstra <eelco.dolstra@logicblox.com>2012-06-14 18:44:56 -0400
commita46894b960c47348eef2a682ea5e0597d8c7b2c5 (patch)
tree5b708516b7c2d96ce534f8c72bffa3557fff6dfe /modules/system/boot/systemd.nix
parentfae777c2646ec7c316cb9a5ea3a408236ccb49c8 (diff)
downloadnixpkgs-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.nix261
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
+      '';
+
   };
 
 }