diff options
author | Robin Gloster <mail@glob.in> | 2017-09-02 23:29:04 +0200 |
---|---|---|
committer | Robin Gloster <mail@glob.in> | 2017-09-02 23:29:04 +0200 |
commit | 0156db2da530a52265fbccc8ad7747b00ee8aaf3 (patch) | |
tree | f5facfdd70ac838997ed0538fd9f4e8edffe9936 /nixos/modules/system | |
parent | 891a1662aa6cd6b2bcd2187d97f27822ed5df138 (diff) | |
parent | d784b830051bb86172b9a3669826774cc20e1f41 (diff) | |
download | nixlib-0156db2da530a52265fbccc8ad7747b00ee8aaf3.tar nixlib-0156db2da530a52265fbccc8ad7747b00ee8aaf3.tar.gz nixlib-0156db2da530a52265fbccc8ad7747b00ee8aaf3.tar.bz2 nixlib-0156db2da530a52265fbccc8ad7747b00ee8aaf3.tar.lz nixlib-0156db2da530a52265fbccc8ad7747b00ee8aaf3.tar.xz nixlib-0156db2da530a52265fbccc8ad7747b00ee8aaf3.tar.zst nixlib-0156db2da530a52265fbccc8ad7747b00ee8aaf3.zip |
Merge remote-tracking branch 'upstream/master' into HEAD
Diffstat (limited to 'nixos/modules/system')
-rw-r--r-- | nixos/modules/system/activation/switch-to-configuration.pl | 9 | ||||
-rw-r--r-- | nixos/modules/system/activation/top-level.nix | 1 | ||||
-rw-r--r-- | nixos/modules/system/boot/loader/grub/install-grub.pl | 4 | ||||
-rw-r--r-- | nixos/modules/system/boot/loader/systemd-boot/systemd-boot-builder.py | 29 | ||||
-rw-r--r-- | nixos/modules/system/boot/networkd.nix | 33 | ||||
-rw-r--r-- | nixos/modules/system/boot/stage-1-init.sh | 4 | ||||
-rw-r--r-- | nixos/modules/system/boot/stage-1.nix | 2 | ||||
-rw-r--r-- | nixos/modules/system/boot/systemd.nix | 34 | ||||
-rw-r--r-- | nixos/modules/system/etc/etc.nix | 26 | ||||
-rw-r--r-- | nixos/modules/system/etc/make-etc.sh | 10 | ||||
-rw-r--r-- | nixos/modules/system/etc/setup-etc.pl | 2 |
11 files changed, 128 insertions, 26 deletions
diff --git a/nixos/modules/system/activation/switch-to-configuration.pl b/nixos/modules/system/activation/switch-to-configuration.pl index 88e7847cf8c8..29cc60b00324 100644 --- a/nixos/modules/system/activation/switch-to-configuration.pl +++ b/nixos/modules/system/activation/switch-to-configuration.pl @@ -147,11 +147,16 @@ my $activePrev = getActiveUnits; while (my ($unit, $state) = each %{$activePrev}) { my $baseUnit = $unit; - # Recognise template instances. - $baseUnit = "$1\@.$2" if $unit =~ /^(.*)@[^\.]*\.(.*)$/; my $prevUnitFile = "/etc/systemd/system/$baseUnit"; my $newUnitFile = "$out/etc/systemd/system/$baseUnit"; + # Detect template instances. + if (!-e $prevUnitFile && !-e $newUnitFile && $unit =~ /^(.*)@[^\.]*\.(.*)$/) { + $baseUnit = "$1\@.$2"; + $prevUnitFile = "/etc/systemd/system/$baseUnit"; + $newUnitFile = "$out/etc/systemd/system/$baseUnit"; + } + my $baseName = $baseUnit; $baseName =~ s/\.[a-z]*$//; diff --git a/nixos/modules/system/activation/top-level.nix b/nixos/modules/system/activation/top-level.nix index e9897cc01b6a..67cb2264e3f3 100644 --- a/nixos/modules/system/activation/top-level.nix +++ b/nixos/modules/system/activation/top-level.nix @@ -141,6 +141,7 @@ in system.build = mkOption { internal = true; default = {}; + type = types.attrs; description = '' Attribute set of derivations used to setup the system. ''; diff --git a/nixos/modules/system/boot/loader/grub/install-grub.pl b/nixos/modules/system/boot/loader/grub/install-grub.pl index 1edb9e0d229b..82b5bcda9217 100644 --- a/nixos/modules/system/boot/loader/grub/install-grub.pl +++ b/nixos/modules/system/boot/loader/grub/install-grub.pl @@ -121,8 +121,8 @@ sub GetFs { my $device = $fields[$n + 1]; my @superOptions = split /,/, $fields[$n + 2]; - # Skip the read-only bind-mount on /nix/store. - next if $mountPoint eq "/nix/store" && (grep { $_ eq "rw" } @superOptions) && (grep { $_ eq "ro" } @mountOptions); + # Skip the bind-mount on /nix/store. + next if $mountPoint eq "/nix/store" && (grep { $_ eq "rw" } @superOptions); # Skip mount point generated by systemd-efi-boot-generator? next if $fsType eq "autofs"; diff --git a/nixos/modules/system/boot/loader/systemd-boot/systemd-boot-builder.py b/nixos/modules/system/boot/loader/systemd-boot/systemd-boot-builder.py index 779005c0df52..3333569c36be 100644 --- a/nixos/modules/system/boot/loader/systemd-boot/systemd-boot-builder.py +++ b/nixos/modules/system/boot/loader/systemd-boot/systemd-boot-builder.py @@ -12,6 +12,9 @@ import warnings import ctypes libc = ctypes.CDLL("libc.so.6") import re +import datetime +import glob +import os.path def copy_if_not_exists(source, dest): if not os.path.exists(dest): @@ -24,7 +27,7 @@ def system_dir(profile, generation): return "/nix/var/nix/profiles/system-%d-link" % (generation) BOOT_ENTRY = """title NixOS{profile} -version Generation {generation} +version Generation {generation} {description} linux {kernel} initrd {initrd} options {kernel_params} @@ -54,6 +57,26 @@ def copy_from_profile(profile, generation, name, dry_run=False): copy_if_not_exists(store_file_path, "@efiSysMountPoint@%s" % (efi_file_path)) return efi_file_path +def describe_generation(generation_dir): + try: + with open("%s/nixos-version" % generation_dir) as f: + nixos_version = f.read() + except IOError: + nixos_version = "Unknown" + + kernel_dir = os.path.dirname(os.path.realpath("%s/kernel" % generation_dir)) + module_dir = glob.glob("%s/lib/modules/*" % kernel_dir)[0] + kernel_version = os.path.basename(module_dir) + + build_time = int(os.path.getctime(generation_dir)) + build_date = datetime.datetime.fromtimestamp(build_time).strftime('%F') + + description = "NixOS {}, Linux Kernel {}, Built on {}".format( + nixos_version, kernel_version, build_date + ) + + return description + def write_entry(profile, generation, machine_id): kernel = copy_from_profile(profile, generation, "kernel") initrd = copy_from_profile(profile, generation, "initrd") @@ -69,6 +92,7 @@ def write_entry(profile, generation, machine_id): generation_dir = os.readlink(system_dir(profile, generation)) tmp_path = "%s.tmp" % (entry_file) kernel_params = "systemConfig=%s init=%s/init " % (generation_dir, generation_dir) + with open("%s/kernel-params" % (generation_dir)) as params_file: kernel_params = kernel_params + params_file.read() with open(tmp_path, 'w') as f: @@ -76,7 +100,8 @@ def write_entry(profile, generation, machine_id): generation=generation, kernel=kernel, initrd=initrd, - kernel_params=kernel_params)) + kernel_params=kernel_params, + description=describe_generation(generation_dir))) if machine_id is not None: f.write("machine-id %s\n" % machine_id) os.rename(tmp_path, entry_file) diff --git a/nixos/modules/system/boot/networkd.nix b/nixos/modules/system/boot/networkd.nix index f96dde153610..9d2cea3ad165 100644 --- a/nixos/modules/system/boot/networkd.nix +++ b/nixos/modules/system/boot/networkd.nix @@ -94,7 +94,7 @@ let checkNetwork = checkUnitConfig "Network" [ (assertOnlyFields [ "Description" "DHCP" "DHCPServer" "IPForward" "IPMasquerade" "IPv4LL" "IPv4LLRoute" - "LLMNR" "Domains" "Bridge" "Bond" + "LLMNR" "MulticastDNS" "Domains" "Bridge" "Bond" ]) (assertValueOneOf "DHCP" ["both" "none" "v4" "v6"]) (assertValueOneOf "DHCPServer" boolValues) @@ -103,6 +103,7 @@ let (assertValueOneOf "IPv4LL" boolValues) (assertValueOneOf "IPv4LLRoute" boolValues) (assertValueOneOf "LLMNR" boolValues) + (assertValueOneOf "MulticastDNS" boolValues) ]; checkAddress = checkUnitConfig "Address" [ @@ -141,6 +142,18 @@ let (assertValueOneOf "EmitTimezone" boolValues) ]; + # .network files have a [Link] section with different options than in .netlink files + checkNetworkLink = checkUnitConfig "Link" [ + (assertOnlyFields [ + "MACAddress" "MTUBytes" "ARP" "Unmanaged" + ]) + (assertMacAddress "MACAddress") + (assertByteFormat "MTUBytes") + (assertValueOneOf "ARP" boolValues) + (assertValueOneOf "Unmanaged" boolValues) + ]; + + commonNetworkOptions = { enable = mkOption { @@ -370,6 +383,18 @@ let ''; }; + linkConfig = mkOption { + default = {}; + example = { Unmanaged = true; }; + type = types.addCheck (types.attrsOf unitOption) checkNetworkLink; + description = '' + Each attribute in this set specifies an option in the + <literal>[Link]</literal> section of the unit. See + <citerefentry><refentrytitle>systemd.network</refentrytitle> + <manvolnum>5</manvolnum></citerefentry> for details. + ''; + }; + name = mkOption { type = types.nullOr types.str; default = null; @@ -580,6 +605,12 @@ let { inherit (def) enable; text = commonMatchText def + '' + ${optionalString (def.linkConfig != { }) '' + [Link] + ${attrsToSection def.linkConfig} + + ''} + [Network] ${attrsToSection def.networkConfig} ${concatStringsSep "\n" (map (s: "Address=${s}") def.address)} diff --git a/nixos/modules/system/boot/stage-1-init.sh b/nixos/modules/system/boot/stage-1-init.sh index 9a125dcb0aeb..b442386914ad 100644 --- a/nixos/modules/system/boot/stage-1-init.sh +++ b/nixos/modules/system/boot/stage-1-init.sh @@ -221,6 +221,9 @@ checkFS() { # Don't check resilient COWs as they validate the fs structures at mount time if [ "$fsType" = btrfs -o "$fsType" = zfs ]; then return 0; fi + # Skip fsck for bcachefs - not implemented yet. + if [ "$fsType" = bcachefs ]; then return 0; fi + # Skip fsck for inherently readonly filesystems. if [ "$fsType" = squashfs ]; then return 0; fi @@ -301,6 +304,7 @@ mountFS() { *x-nixos.autoresize*) if [ "$fsType" = ext2 -o "$fsType" = ext3 -o "$fsType" = ext4 ]; then echo "resizing $device..." + e2fsck -fp "$device" resize2fs "$device" fi ;; diff --git a/nixos/modules/system/boot/stage-1.nix b/nixos/modules/system/boot/stage-1.nix index 02870878c0f3..d6e3e3a87d01 100644 --- a/nixos/modules/system/boot/stage-1.nix +++ b/nixos/modules/system/boot/stage-1.nix @@ -207,7 +207,7 @@ let preLVMCommands preDeviceCommands postDeviceCommands postMountCommands preFailCommands kernelModules; resumeDevices = map (sd: if sd ? device then sd.device else "/dev/disk/by-label/${sd.label}") - (filter (sd: hasPrefix "/dev/" sd.device && !sd.randomEncryption + (filter (sd: hasPrefix "/dev/" sd.device && !sd.randomEncryption.enable # Don't include zram devices && !(hasPrefix "/dev/zram" sd.device) ) config.swapDevices); diff --git a/nixos/modules/system/boot/systemd.nix b/nixos/modules/system/boot/systemd.nix index 00d6d370dd75..d12d0a06f444 100644 --- a/nixos/modules/system/boot/systemd.nix +++ b/nixos/modules/system/boot/systemd.nix @@ -593,7 +593,7 @@ in services.logind.extraConfig = mkOption { default = ""; type = types.lines; - example = "HandleLidSwitch=ignore"; + example = "IdleAction=lock"; description = '' Extra config options for systemd-logind. See man logind.conf for available options. @@ -659,16 +659,22 @@ in })); }; + systemd.user.paths = mkOption { + default = {}; + type = with types; attrsOf (submodule [ { options = pathOptions; } unitConfig ]); + description = "Definition of systemd per-user path units."; + }; + systemd.user.services = mkOption { default = {}; type = with types; attrsOf (submodule [ { options = serviceOptions; } unitConfig serviceConfig ] ); description = "Definition of systemd per-user service units."; }; - systemd.user.timers = mkOption { + systemd.user.slices = mkOption { default = {}; - type = with types; attrsOf (submodule [ { options = timerOptions; } unitConfig ] ); - description = "Definition of systemd per-user timer units."; + type = with types; attrsOf (submodule [ { options = sliceOptions; } unitConfig ] ); + description = "Definition of systemd per-user slice units."; }; systemd.user.sockets = mkOption { @@ -683,6 +689,12 @@ in description = "Definition of systemd per-user target units."; }; + systemd.user.timers = mkOption { + default = {}; + type = with types; attrsOf (submodule [ { options = timerOptions; } unitConfig ] ); + description = "Definition of systemd per-user timer units."; + }; + systemd.additionalUpstreamSystemUnits = mkOption { default = [ ]; type = types.listOf types.str; @@ -799,12 +811,12 @@ in }; systemd.units = - mapAttrs' (n: v: nameValuePair "${n}.target" (targetToUnit n v)) cfg.targets + mapAttrs' (n: v: nameValuePair "${n}.path" (pathToUnit n v)) cfg.paths // mapAttrs' (n: v: nameValuePair "${n}.service" (serviceToUnit n v)) cfg.services - // mapAttrs' (n: v: nameValuePair "${n}.socket" (socketToUnit n v)) cfg.sockets - // mapAttrs' (n: v: nameValuePair "${n}.timer" (timerToUnit n v)) cfg.timers - // mapAttrs' (n: v: nameValuePair "${n}.path" (pathToUnit n v)) cfg.paths - // mapAttrs' (n: v: nameValuePair "${n}.slice" (sliceToUnit n v)) cfg.slices + // mapAttrs' (n: v: nameValuePair "${n}.slice" (sliceToUnit n v)) cfg.slices + // mapAttrs' (n: v: nameValuePair "${n}.socket" (socketToUnit n v)) cfg.sockets + // mapAttrs' (n: v: nameValuePair "${n}.target" (targetToUnit n v)) cfg.targets + // mapAttrs' (n: v: nameValuePair "${n}.timer" (timerToUnit n v)) cfg.timers // listToAttrs (map (v: let n = escapeSystemdPath v.where; in nameValuePair "${n}.mount" (mountToUnit n v)) cfg.mounts) @@ -813,7 +825,9 @@ in in nameValuePair "${n}.automount" (automountToUnit n v)) cfg.automounts); systemd.user.units = - mapAttrs' (n: v: nameValuePair "${n}.service" (serviceToUnit n v)) cfg.user.services + mapAttrs' (n: v: nameValuePair "${n}.path" (pathToUnit n v)) cfg.user.paths + // mapAttrs' (n: v: nameValuePair "${n}.service" (serviceToUnit n v)) cfg.user.services + // mapAttrs' (n: v: nameValuePair "${n}.slice" (sliceToUnit n v)) cfg.user.slices // mapAttrs' (n: v: nameValuePair "${n}.socket" (socketToUnit n v)) cfg.user.sockets // mapAttrs' (n: v: nameValuePair "${n}.target" (targetToUnit n v)) cfg.user.targets // mapAttrs' (n: v: nameValuePair "${n}.timer" (timerToUnit n v)) cfg.user.timers; diff --git a/nixos/modules/system/etc/etc.nix b/nixos/modules/system/etc/etc.nix index fd6e58cd5b43..7d43ba07ca57 100644 --- a/nixos/modules/system/etc/etc.nix +++ b/nixos/modules/system/etc/etc.nix @@ -20,8 +20,8 @@ let sources = map (x: x.source) etc'; targets = map (x: x.target) etc'; modes = map (x: x.mode) etc'; - uids = map (x: x.uid) etc'; - gids = map (x: x.gid) etc'; + users = map (x: x.user) etc'; + groups = map (x: x.group) etc'; }; in @@ -108,6 +108,26 @@ in ''; }; + user = mkOption { + default = "+${toString config.uid}"; + type = types.str; + description = '' + User name of created file. + Only takes affect when the file is copied (that is, the mode is not 'symlink'). + Changing this option takes precedence over <literal>uid</literal>. + ''; + }; + + group = mkOption { + default = "+${toString config.gid}"; + type = types.str; + description = '' + Group name of created file. + Only takes affect when the file is copied (that is, the mode is not 'symlink'). + Changing this option takes precedence over <literal>gid</literal>. + ''; + }; + }; config = { @@ -130,7 +150,7 @@ in system.build.etc = etc; - system.activationScripts.etc = stringAfter [ "stdio" ] + system.activationScripts.etc = stringAfter [ "users" "groups" ] '' # Set up the statically computed bits of /etc. echo "setting up /etc..." diff --git a/nixos/modules/system/etc/make-etc.sh b/nixos/modules/system/etc/make-etc.sh index 60d4ba1301a3..1ca4c3046f0e 100644 --- a/nixos/modules/system/etc/make-etc.sh +++ b/nixos/modules/system/etc/make-etc.sh @@ -6,8 +6,8 @@ set -f sources_=($sources) targets_=($targets) modes_=($modes) -uids_=($uids) -gids_=($gids) +users_=($users) +groups_=($groups) set +f for ((i = 0; i < ${#targets_[@]}; i++)); do @@ -36,9 +36,9 @@ for ((i = 0; i < ${#targets_[@]}; i++)); do fi if test "${modes_[$i]}" != symlink; then - echo "${modes_[$i]}" > $out/etc/$target.mode - echo "${uids_[$i]}" > $out/etc/$target.uid - echo "${gids_[$i]}" > $out/etc/$target.gid + echo "${modes_[$i]}" > $out/etc/$target.mode + echo "${users_[$i]}" > $out/etc/$target.uid + echo "${groups_[$i]}" > $out/etc/$target.gid fi fi diff --git a/nixos/modules/system/etc/setup-etc.pl b/nixos/modules/system/etc/setup-etc.pl index efda74161ff8..eed20065087f 100644 --- a/nixos/modules/system/etc/setup-etc.pl +++ b/nixos/modules/system/etc/setup-etc.pl @@ -108,6 +108,8 @@ sub link { my $uid = read_file("$_.uid"); chomp $uid; my $gid = read_file("$_.gid"); chomp $gid; copy "$static/$fn", "$target.tmp" or warn; + $uid = getpwnam $uid unless $uid =~ /^\+/; + $gid = getgrnam $gid unless $gid =~ /^\+/; chown int($uid), int($gid), "$target.tmp" or warn; chmod oct($mode), "$target.tmp" or warn; rename "$target.tmp", $target or warn; |