summary refs log tree commit diff
diff options
context:
space:
mode:
authorAlyssa Ross <hi@alyssa.is>2019-02-22 18:47:53 +0000
committerAlyssa Ross <hi@alyssa.is>2019-02-22 18:47:53 +0000
commit43c723b3c60350eb72b11e658b2e6a122fda6bfc (patch)
treeafc0f8933110431cfbe7f246720077d0f2a82221
parent6141939d6e0a77c84905efd560c03c3032164ef1 (diff)
downloadnixlib-sixos.tar
nixlib-sixos.tar.gz
nixlib-sixos.tar.bz2
nixlib-sixos.tar.lz
nixlib-sixos.tar.xz
nixlib-sixos.tar.zst
nixlib-sixos.zip
s6 experiments sixos
-rw-r--r--nixos/modules/module-list.nix2
-rw-r--r--nixos/modules/security/pam.nix2
-rw-r--r--nixos/modules/services/hardware/mdevd.nix71
-rw-r--r--nixos/modules/system/activation/top-level.nix38
-rw-r--r--nixos/modules/system/boot/loader/grub/install-grub.pl17
-rw-r--r--nixos/modules/system/boot/s6.nix256
-rw-r--r--pkgs/os-specific/linux/elogind/default.nix49
-rw-r--r--pkgs/os-specific/linux/eudev/default.nix4
-rw-r--r--pkgs/os-specific/linux/mdevd/default.nix26
-rw-r--r--pkgs/os-specific/linux/s6-linux-init/default.nix26
-rw-r--r--pkgs/top-level/all-packages.nix39
-rw-r--r--udhcpd.conf2
12 files changed, 508 insertions, 24 deletions
diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix
index 37e90232da2a..04cc8ff0c1fd 100644
--- a/nixos/modules/module-list.nix
+++ b/nixos/modules/module-list.nix
@@ -277,6 +277,7 @@
   ./services/hardware/irqbalance.nix
   ./services/hardware/lcd.nix
   ./services/hardware/lirc.nix
+  ./services/hardware/mdevd.nix
   ./services/hardware/nvidia-optimus.nix
   ./services/hardware/pcscd.nix
   ./services/hardware/pommed.nix
@@ -790,6 +791,7 @@
   ./system/boot/networkd.nix
   ./system/boot/plymouth.nix
   ./system/boot/resolved.nix
+  ./system/boot/s6.nix
   ./system/boot/shutdown.nix
   ./system/boot/stage-1.nix
   ./system/boot/stage-2.nix
diff --git a/nixos/modules/security/pam.nix b/nixos/modules/security/pam.nix
index 926c6d77d3bb..8bf132e93b33 100644
--- a/nixos/modules/security/pam.nix
+++ b/nixos/modules/security/pam.nix
@@ -376,7 +376,7 @@ let
           ${optionalString cfg.otpwAuth
               "session optional ${pkgs.otpw}/lib/security/pam_otpw.so"}
           ${optionalString cfg.startSession
-              "session optional ${pkgs.systemd}/lib/security/pam_systemd.so"}
+              "session optional ${pkgs.elogind}/lib/security/pam_elogind.so"}
           ${optionalString cfg.forwardXAuth
               "session optional pam_xauth.so xauthpath=${pkgs.xorg.xauth}/bin/xauth systemuser=99"}
           ${optionalString (cfg.limits != [])
diff --git a/nixos/modules/services/hardware/mdevd.nix b/nixos/modules/services/hardware/mdevd.nix
new file mode 100644
index 000000000000..b141bfc875eb
--- /dev/null
+++ b/nixos/modules/services/hardware/mdevd.nix
@@ -0,0 +1,71 @@
+{ pkgs, lib, config, ... }:
+
+let
+  inherit (lib) mkDefault mkIf mkOption;
+
+in {
+  options = {
+    services.mdevd.enable = mkOption {
+      default = false;
+      description = "Whether to use the mdevd kernel hotplug management daemon";
+    };
+
+    services.mdevd.package = mkOption {
+      default = pkgs.mdevd;
+      description = "Package providing the mdevd command";
+    };
+
+    services.mdevd.verbosity = mkOption {
+      default = 1;
+      description = "Log level between 0 and 3. 3 is the most verbose.";
+    };
+
+    services.mdevd.notif = mkOption {
+      default = 3;
+      description = "File descriptor to use to notify s6 of readiness.";
+      internal = true;
+    };
+
+    services.mdevd.kbufsz = mkOption {
+      default = 500000;
+      description = "Bytes of buffer to reserve for the netlink queue";
+    };
+
+    services.mdevd.slashsys = mkOption {
+      default = "/sys";
+      description = "Location of the sysfs";
+    };
+
+    services.mdevd.slashdev = mkOption {
+      default = "/dev";
+      description = "Location of the device nodes";
+    };
+
+    services.mdevd.fwbase = mkOption {
+      description = "Location of the firmware files, if any";
+    };
+  };
+
+  config = mkIf config.services.mdevd.enable {
+    services.mdevd.fwbase = mkDefault "${config.hardware.firmware}/lib/firmware";
+
+    # s6.rc.services.mdevd = {
+    #   type = "longrun";
+    #   notification-fd = config.services.mdevd.notif;
+    #   run = ''
+    #     #!${pkgs.execline}/bin/execlineb -P
+    #     ${config.services.mdevd.package}/bin/mdevd
+    #         -v ${toString config.services.mdevd.verbosity}
+    #         -D ${toString config.services.mdevd.notif}
+    #         -b ${toString config.services.mdevd.kbufsz}
+    #         -f ${pkgs.writeText "mdev.conf" ''
+    #           SUBSYSTEM=net;.* root:root 600 @${pkgs.nettools}/bin/nameif
+    #           tun[0-9]* root:root 600 =net/
+    #           tap[0-9]* root:root 600 =net/
+    #         ''}
+    #         -s ${config.services.mdevd.slashdev}
+    #         -F ${config.services.mdevd.fwbase}
+    #   '';
+    # };
+  };
+}
diff --git a/nixos/modules/system/activation/top-level.nix b/nixos/modules/system/activation/top-level.nix
index a560af5ce96d..4bee55d80fbb 100644
--- a/nixos/modules/system/activation/top-level.nix
+++ b/nixos/modules/system/activation/top-level.nix
@@ -52,6 +52,20 @@ let
 
         echo -n "$kernelParams" > $out/kernel-params
 
+        ln -s ${
+          
+          pkgs.makeInitrd {
+            contents = [
+              { symlink = "init";
+                object = pkgs.writeScript "init" ''
+                  echo hello world
+                '';
+              }
+            ];
+          }
+
+        }/${config.system.boot.loader.initrdFile} $out/s6-initrd
+
         ln -s ${initrdPath} $out/initrd
 
         ln -s ${config.system.build.initialRamdiskSecretAppender}/bin/append-initrd-secrets $out
@@ -65,6 +79,30 @@ let
       unset activationScript
 
       cp ${config.system.build.bootStage2} $out/init
+
+      ${pkgs.s6-linux-init}/bin/s6-linux-init-maker \
+        -G "${pkgs.utillinux}/bin/agetty --noclear 38400 tty1" \
+        -c $out/s6 \
+        -b ${pkgs.execline.bin}/bin \
+        -p ${lib.makeBinPath (with pkgs; [ execline s6 s6-portable-utils s6-linux-utils s6-linux-init ])} \
+        -s /run/kernel-env \
+        -2 $out/s6/rc.init \
+        -Z ${pkgs.writeScript "shutdown" ''
+          #!${pkgs.execline}/bin/execlineb -P
+          echo alyssa shutting down
+        ''} \
+        $out/s6
+      sed -i '9aif { ${pkgs.coreutils}/bin/mkfifo -m 600 /run/service/s6-svscan-log/fifo }' "$out/s6/init"
+      rm $out/s6/run-image/service/s6-svscan-log/fifo
+
+      cat <<RC >$out/s6/rc.init
+      #!${pkgs.execline}/bin/execlineb -P
+      if { $out/activate }
+      if { ${config.s6.rc.initCommand} }
+      ${config.s6.rc.command}
+      RC
+      chmod +x $out/s6/rc.init
+
       substituteInPlace $out/init --subst-var-by systemConfig $out
 
       ln -s ${config.system.build.etc}/etc $out/etc
diff --git a/nixos/modules/system/boot/loader/grub/install-grub.pl b/nixos/modules/system/boot/loader/grub/install-grub.pl
index bda6a3136407..9ad86763f06e 100644
--- a/nixos/modules/system/boot/loader/grub/install-grub.pl
+++ b/nixos/modules/system/boot/loader/grub/install-grub.pl
@@ -372,6 +372,10 @@ sub addEntry {
         "systemConfig=" . Cwd::abs_path($path) . " " .
         "init=" . Cwd::abs_path("$path/init") . " " .
         readFile("$path/kernel-params");
+    my $kernelParams6 =
+        "systemConfig=" . Cwd::abs_path($path) . " " .
+        "init=" . Cwd::abs_path($path) . "/s6/init " .
+        readFile("$path/kernel-params");
     my $xenParams = $xen && -e "$path/xen-params" ? readFile("$path/xen-params") : "";
 
     if ($grubVersion == 1) {
@@ -393,6 +397,19 @@ sub addEntry {
         $conf .= "  multiboot $xen $xenParams\n" if $xen;
         $conf .= "  " . ($xen ? "module" : "linux") . " $kernel $kernelParams\n";
         $conf .= "  " . ($xen ? "module" : "initrd") . " $initrd\n";
+        $conf .= "}\n";
+        $conf .= "menuentry \"$name - s6\" {\n";
+        $conf .= $grubBoot->search . "\n";
+        if ($copyKernels == 0) {
+            $conf .= $grubStore->search . "\n";
+        }
+        if ($extraInitrd) {
+            $conf .= $extraInitrdPath->search . "\n";
+        }
+        $conf .= "  $extraPerEntryConfig\n" if $extraPerEntryConfig;
+        $conf .= "  multiboot $xen $xenParams\n" if $xen;
+        $conf .= "  " . ($xen ? "module" : "linux") . " $kernel $kernelParams6\n";
+        $conf .= "  " . ($xen ? "module" : "initrd") . " $initrd\n";
         $conf .= "}\n\n";
     }
 }
diff --git a/nixos/modules/system/boot/s6.nix b/nixos/modules/system/boot/s6.nix
new file mode 100644
index 000000000000..23ccd0f0c8b6
--- /dev/null
+++ b/nixos/modules/system/boot/s6.nix
@@ -0,0 +1,256 @@
+{ pkgs, lib, config, ... }:
+
+let
+  inherit (builtins) typeOf;
+  inherit (pkgs) linkFarm writeScript runCommand;
+  inherit (lib) concatStringsSep mapAttrsToList mkOption mkDefault types filterAttrsRecursive foldr;
+
+  s6EntryTypes = {
+    int = v: s6Entry (toString v);
+    bool = v: s6Entry "";
+    string = writeScript "s6-file";
+    set = v: linkFarm "s6-dir"
+      (mapAttrsToList (name: value: { inherit name; path = s6Entry value; }) v);
+    list = v: s6Entry (concatStringsSep "\n" v);
+  };
+
+  s6Entry = v: s6EntryTypes.${typeOf v} v;
+
+  s6RcCompile = { uids ? null, gids ? null, fdhuser ? null }: source: 
+    runCommand "s6-rc-compile" {} ''
+      ${config.s6.rc.package}/bin/s6-rc-compile \
+          ${if (uids != null) then "-u ${concatStringsSep "," uids}" else ""} \
+          ${if (gids != null) then "-g ${concatStringsSep "," gids}" else ""} \
+          ${if (fdhuser != null) then "-h ${fdhuser}" else ""} \
+          $out \
+          ${lib.traceVal (toString (s6Entry (filterAttrsRecursive (n: v: v != null) source)))}
+    '';
+
+in {
+  options = {
+    s6.rc.package = mkOption {
+      default = pkgs.s6-rc;
+      description = ''
+        The package to look for the s6-rc, s6-rc-compile, and s6-rc-init
+        commands in.
+      '';
+    };
+
+    s6.rc.initTimeout = mkOption {
+      default = null;
+      description = ''
+        Milliseconds to wait for all s6-supervise processes to start up before
+        giving up.
+      '';
+    };
+
+    s6.rc.timeout = mkOption {
+      default = null;
+      description = ''
+        Milliseconds to wait for s6-rc to transition to the up state.
+      '';
+    };
+
+    s6.rc.services = mkOption {
+      description = ''
+        Attribute set of available services. Names correspond to service
+        directory names on disk. Values are attribute sets of service
+        properties, which are then transformed into the directory structure
+        expected by s6-rc-compile.
+      '';
+      example = {
+        foo = { 
+          type = "oneshot"; 
+          up = "echo hello world"; 
+          dependencies = [ "bar" "baz" ]; 
+          env = { a = "b"; };
+        };
+      };
+
+      type = with types; attrsOf
+        (submodule {
+          options = {
+            type = mkOption {
+              description = "type";
+              type = enum [ "bundle" "oneshot" "longrun" ];
+            };
+            contents = mkOption {
+              description = "contents";
+              type = nullOr (listOf str);
+              default = null;
+            };
+            timeout-up = mkOption {
+              description = "timeout-up";
+              type = nullOr ints.unsigned;
+              default = null;
+            };
+            timeout-down = mkOption {
+              description = "timeout-down";
+              type = nullOr ints.unsigned;
+              default = null;
+            };
+            dependencies = mkOption {
+              description = "dependencies";
+              type = nullOr (listOf str);
+              default = null;
+            };
+            up = mkOption {
+              description = "up";
+              type = nullOr str;
+              default = null;
+            };
+            down = mkOption {
+              description = "down";
+              type = nullOr str;
+              default = null;
+            };
+            run = mkOption {
+              description = "run";
+              type = nullOr str;
+              default = null;
+            };
+            finish = mkOption {
+              description = "finish";
+              type = nullOr str;
+              default = null;
+            };
+            notification-fd = mkOption {
+              description = "notification-fd";
+              type = nullOr ints.unsigned;
+              default = null;
+            };
+            timeout-kill = mkOption {
+              description = "timeout-kill";
+              type = nullOr ints.unsigned;
+              default = null;
+            };
+            timeout-finish = mkOption {
+              description = "timeout-finish";
+              type = nullOr ints.unsigned;
+              default = null;
+            };
+            nosetsid = mkOption {
+              description = "nosetsid";
+              type = nullOr bool;
+              default = null;
+            };
+            data = mkOption {
+              description = "data";
+              type = nullOr (attrsOf str);
+              default = null;
+            };
+            env = mkOption {
+              description = "env";
+              type = nullOr (attrsOf str);
+              default = null;
+            };
+            producer-for = mkOption {
+              description = "producer-for";
+              type = nullOr str;
+              default = null;
+            };
+            consumer-for = mkOption { 
+              description = "consumer-for";
+              type = nullOr (listOf str);
+              default = null;
+            };
+            pipeline-name = mkOption { 
+              description = "pipeline-name";
+              type = nullOr str;
+              default = null;
+            };
+          };
+        });
+    };
+
+    s6.rc.live = mkOption {
+      default = "/run/s6-rc";
+      description = ''
+        Where to store the s6-rc live state.
+      '';
+    };
+
+    s6.rc.prefix = mkOption {
+      default = "";
+      description = ''
+        Unique prefix to apply to all service names when they are added to the
+        supervisor, for disambiguation.
+      '';
+    };
+
+    s6.rc.uids = mkOption {
+      default = null;
+      description = ''
+        IDs of users who should be allowed to start and stop services controlled
+        by this instance of s6-rc. Default: only root.
+      '';
+    };
+
+    s6.rc.gids = mkOption {
+      default = null;
+      description = ''
+        IDs of groups who should be allowed to start and stop services controlled
+        by this instance of s6-rc. Default: only root.
+      '';
+    };
+
+    s6.rc.fdhuser = mkOption {
+      default = null;
+      description = ''
+        User for the s6-fileholder-daemon process to run as. Defaults to root,
+        the owner of the supervision tree.
+      '';
+    };
+
+    s6.rc.initBundle = mkOption {
+      default = "ok-all";
+      description = ''
+        Name of the top bundle to be brought up at system startup.
+      '';
+    };
+
+    s6.rc.initCommand = mkOption {
+      description = ''
+        The s6-rc-init command line to be executed by rc.init, prior to running
+        s6-rc.
+      '';
+    };
+
+    s6.rc.command = mkOption {
+      description = ''
+        The s6-rc command line to be executed by rc.init, after running
+        s6-rc-init.
+      '';
+    };
+  };
+
+  config = {
+    s6.rc.services.${config.s6.rc.initBundle} = {
+      type = "bundle";
+      contents = [];
+    };
+
+    s6.rc.initCommand = mkDefault ''
+      ${config.s6.rc.package}/bin/s6-rc-init \
+          -c ${s6RcCompile
+                { inherit (config.s6.rc) uids gids fdhuser; }
+                config.s6.rc.services} \
+          -l ${config.s6.rc.live} \
+          -p "${config.s6.rc.prefix}" \
+          ${if (config.s6.rc.initTimeout != null)
+            then "-t ${toString config.s6.rc.initTimeout}"
+            else ""} \
+          /run/service
+    '';
+
+    s6.rc.command = mkDefault ''
+      ${config.s6.rc.package}/bin/s6-rc \
+          -l ${config.s6.rc.live} \
+          change \
+          ${if (config.s6.rc.timeout != null)
+            then "-t ${toString config.s6.rc.timeout}"
+            else ""} \
+          ${config.s6.rc.initBundle}
+    '';
+  };
+}
diff --git a/pkgs/os-specific/linux/elogind/default.nix b/pkgs/os-specific/linux/elogind/default.nix
new file mode 100644
index 000000000000..c93391a5ff96
--- /dev/null
+++ b/pkgs/os-specific/linux/elogind/default.nix
@@ -0,0 +1,49 @@
+{ stdenv, lib, fetchFromGitHub
+, meson, m4, gperf, gettext, pkgconfig, libxslt, ninja
+, libcap, libudev
+, enablePam ? true, pam
+, docbook_xsl, docbook_xml_dtd_42, docbook_xml_dtd_45 }:
+
+stdenv.mkDerivation rec {
+  name = "elogind-${version}";
+  version = "239.2";
+
+  src = fetchFromGitHub {
+    owner = "elogind";
+    repo = "elogind";
+    rev = "v${version}";
+    sha256 = "17khwbzqmkfd3hcscs51kzdpvq9p2llm08vbpsdhy9yxgwfzlfa6";
+  };
+
+  postPatch = ''
+    for f in man/*.xml; do
+      substituteInPlace $f \
+        --replace http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd ${docbook_xml_dtd_42}/xml/dtd/docbook/docbookx.dtd \
+        --replace http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd ${docbook_xml_dtd_45}/xml/dtd/docbook/docbookx.dtd
+    done
+
+    patchShebangs .
+
+    set -x
+  '';
+
+  preConfigure = ''
+    mesonFlagsArray+=(-Drootprefix=$out)
+    mesonFlagsArray+=(-Dsysconfdir=$out/etc)
+    mesonFlagsArray+=(-Dpamconfdir=$out/etc/pam.d)
+    mesonFlagsArray+=(-Dcgroup-controller=elogind)
+  '';
+
+  buildInputs = [ libcap libudev ] ++ lib.optional enablePam pam;
+  nativeBuildInputs = [ meson m4 gperf gettext pkgconfig libxslt ninja docbook_xsl ];
+
+  strictDeps = true;
+
+  meta = with lib; {
+    homepage = https://github.com/elogind/elogind;
+    description = "logind, extracted to a standalone package";
+    license = licenses.lgpl21Plus;
+    maintainers = with maintainers; [ qyliss ];
+    platforms = platforms.linux;
+  };
+}
diff --git a/pkgs/os-specific/linux/eudev/default.nix b/pkgs/os-specific/linux/eudev/default.nix
index 771f012c2c21..7e8c9e413380 100644
--- a/pkgs/os-specific/linux/eudev/default.nix
+++ b/pkgs/os-specific/linux/eudev/default.nix
@@ -3,10 +3,10 @@ let
   s = # Generated upstream information
   rec {
     baseName="eudev";
-    version = "3.2.6";
+    version = "3.2.7";
     name="${baseName}-${version}";
     url="http://dev.gentoo.org/~blueness/eudev/eudev-${version}.tar.gz";
-    sha256 = "1qdpnvsv3qqwy6jl4i4b1dn212y6nvawpaladb7plfping9p2n46";
+    sha256 = "0qphgfw1vh2f73yjggkh5icxfq5gg811a0j6b22zkhaks95n211h";
   };
 
   nativeBuildInputs = [ pkgconfig ];
diff --git a/pkgs/os-specific/linux/mdevd/default.nix b/pkgs/os-specific/linux/mdevd/default.nix
new file mode 100644
index 000000000000..05e1452beb9c
--- /dev/null
+++ b/pkgs/os-specific/linux/mdevd/default.nix
@@ -0,0 +1,26 @@
+{ lib, skawarePackages }:
+
+with skawarePackages;
+
+buildPackage {
+  pname = "mdevd";
+  version = "0.1.0.2";
+  sha256 = "1m7n2g499l2chwya1a13ng2nqiwd3zhvpj4vrkd8x2mamsan7rxx";
+
+  description = "Kernel event manager compatible with mdev.conf";
+  platforms = lib.platforms.linux;
+
+  outputs = [ "bin" "dev" "doc" "out" ];
+
+  configureFlags = [
+    "--with-sysdeps=${skalibs.lib}/lib/skalibs/sysdeps"
+    "--with-include=${skalibs.dev}/include"
+    "--with-lib=${skalibs.lib}/lib"
+  ];
+
+  postInstall = ''
+    find . -type f -executable -delete
+    mv examples/ $doc/share/doc/mdevd
+    mv doc $doc/share/doc/mdevd/html
+  '';
+}
diff --git a/pkgs/os-specific/linux/s6-linux-init/default.nix b/pkgs/os-specific/linux/s6-linux-init/default.nix
new file mode 100644
index 000000000000..2fca6aaa8c99
--- /dev/null
+++ b/pkgs/os-specific/linux/s6-linux-init/default.nix
@@ -0,0 +1,26 @@
+{ lib, skawarePackages }:
+
+with skawarePackages;
+
+buildPackage {
+  pname = "s6-linux-init";
+  version = "0.4.0.0";
+  sha256 = "0zpd6n30cf8847240f658gw40sh64lm1mbaxr19q6rryvs5rpb6l";
+
+  description = "Automated /sbin/init creation for s6-based Linux systems";
+  platforms = lib.platforms.linux;
+
+  outputs = [ "bin" "dev" "doc" "out" ];
+
+  configureFlags = [
+    "--includedir=\${dev}/include"
+    "--with-sysdeps=${skalibs.lib}/lib/skalibs/sysdeps"
+    "--with-include=${skalibs.dev}/include"
+    "--with-lib=${skalibs.lib}/lib"
+  ];
+
+  postInstall = ''
+    find . -type f -executable -delete
+    mv doc $doc/share/doc/s6-linux-init/html
+  '';
+}
diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix
index 9e9ee8797ff1..0285a8a3b78f 100644
--- a/pkgs/top-level/all-packages.nix
+++ b/pkgs/top-level/all-packages.nix
@@ -2511,8 +2511,6 @@ with pkgs;
     stdenv = if stdenv.isi686 then overrideCC stdenv gcc6 else stdenv;
   };
 
-  execline = skawarePackages.execline;
-
   exif = callPackage ../tools/graphics/exif { };
 
   exiftags = callPackage ../tools/graphics/exiftags { };
@@ -5225,14 +5223,6 @@ with pkgs;
 
   s3gof3r = callPackage ../tools/networking/s3gof3r { };
 
-  s6-dns = skawarePackages.s6-dns;
-
-  s6-linux-utils = skawarePackages.s6-linux-utils;
-
-  s6-networking = skawarePackages.s6-networking;
-
-  s6-portable-utils = skawarePackages.s6-portable-utils;
-
   sablotron = callPackage ../tools/text/xml/sablotron { };
 
   safecopy = callPackage ../tools/system/safecopy { };
@@ -11546,8 +11536,6 @@ with pkgs;
 
   nss_wrapper = callPackage ../development/libraries/nss_wrapper { };
 
-  nsss = skawarePackages.nsss;
-
   ntbtls = callPackage ../development/libraries/ntbtls { };
 
   ntk = callPackage ../development/libraries/audio/ntk { };
@@ -12242,8 +12230,6 @@ with pkgs;
 
   skaffold = callPackage ../development/tools/skaffold { };
 
-  skalibs = skawarePackages.skalibs;
-
   skawarePackages = recurseIntoAttrs {
     buildPackage = callPackage ../build-support/skaware/build-skaware-package.nix { };
 
@@ -12252,16 +12238,31 @@ with pkgs;
 
     s6 = callPackage ../tools/system/s6 { };
     s6-dns = callPackage ../tools/networking/s6-dns { };
+    s6-linux-init = callPackage ../os-specific/linux/s6-linux-init { };
     s6-linux-utils = callPackage ../os-specific/linux/s6-linux-utils { };
     s6-networking = callPackage ../tools/networking/s6-networking { };
     s6-portable-utils = callPackage ../tools/misc/s6-portable-utils { };
     s6-rc = callPackage ../tools/system/s6-rc { };
 
+    mdevd = callPackage ../os-specific/linux/mdevd { };
     nsss = callPackage ../development/libraries/nsss { };
     utmps = callPackage ../development/libraries/utmps { };
-
   };
 
+  inherit (skawarePackages)
+    execline
+    mdevd
+    nsss
+    s6
+    s6-dns
+    s6-linux-init
+    s6-linux-utils
+    s6-networking
+    s6-portable-utils
+    s6-rc
+    skalibs
+    utmps;
+
   skydive = callPackage ../tools/networking/skydive { };
 
   slang = callPackage ../development/libraries/slang { };
@@ -12575,8 +12576,6 @@ with pkgs;
 
   uthash = callPackage ../development/libraries/uthash { };
 
-  utmps = skawarePackages.utmps;
-
   ucommon = ucommon_openssl;
 
   ucommon_openssl = callPackage ../development/libraries/ucommon {
@@ -13728,10 +13727,6 @@ with pkgs;
     boost = boost159;
   };
 
-  s6 = skawarePackages.s6;
-
-  s6-rc = skawarePackages.s6-rc;
-
   supervise = callPackage ../tools/system/supervise { };
 
   spamassassin = callPackage ../servers/mail/spamassassin {
@@ -14067,6 +14062,8 @@ with pkgs;
 
   dstat = callPackage ../os-specific/linux/dstat { };
 
+  elogind = callPackage ../os-specific/linux/elogind { };
+
   # unstable until the first 1.x release
   fscrypt-experimental = callPackage ../os-specific/linux/fscrypt {
     buildGoPackage = buildGo110Package;
diff --git a/udhcpd.conf b/udhcpd.conf
new file mode 100644
index 000000000000..eb5840439640
--- /dev/null
+++ b/udhcpd.conf
@@ -0,0 +1,2 @@
+lease_file	/tmp/leases
+