diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix index c8f45014ece..ab3243a4f7f 100644 --- a/nixos/modules/module-list.nix +++ b/nixos/modules/module-list.nix @@ -214,6 +214,7 @@ ./services/torrent/transmission.nix ./services/ttys/gpm.nix ./services/ttys/agetty.nix + ./services/ttys/kmscon.nix ./services/web-servers/apache-httpd/default.nix ./services/web-servers/jboss/default.nix ./services/web-servers/lighttpd/default.nix diff --git a/nixos/modules/services/ttys/kmscon.nix b/nixos/modules/services/ttys/kmscon.nix new file mode 100644 index 00000000000..97fe7a1ca1b --- /dev/null +++ b/nixos/modules/services/ttys/kmscon.nix @@ -0,0 +1,64 @@ +{ config, pkgs, ... }: +let + inherit (pkgs.lib) mkOption types mkIf optionalString; + + cfg = config.services.kmscon; + + configDir = pkgs.writeTextFile { name = "kmscon-config"; destination = "/kmscon.conf"; text = cfg.extraConfig; }; +in { + options = { + services.kmscon = { + enable = mkOption { + description = "Use kmscon as the virtual console instead of gettys"; + type = types.bool; + default = false; + }; + + hwRender = mkOption { + description = "Whether to use 3D hardware acceleration to render the console"; + type = types.bool; + default = false; + }; + + extraConfig = mkOption { + description = "Extra contents of the kmscon.conf file"; + type = types.lines; + default = ""; + example = "font-size=14"; + }; + }; + }; + + config = mkIf cfg.enable { + # Largely copied from unit provided with kmscon source + systemd.units."kmsconvt@.service".text = '' + [Unit] + Description=KMS System Console on %I + Documentation=man:kmscon(1) + After=systemd-user-sessions.service + After=plymouth-quit-wait.service + After=systemd-logind.service + Requires=systemd-logind.service + Before=getty.target + Conflicts=getty@%i.service + OnFailure=getty@%i.service + IgnoreOnIsolate=yes + ConditionPathExists=/dev/tty0 + + [Service] + ExecStart=${pkgs.kmscon}/bin/kmscon "--vt=%I" --seats=seat0 --no-switchvt --configdir ${configDir} --login -- ${pkgs.shadow}/bin/login -p + UtmpIdentifier=%I + TTYPath=/dev/%I + TTYReset=yes + TTYVHangup=yes + TTYVTDisallocate=yes + ''; + + systemd.units."autovt@.service".linkTarget = "${config.systemd.units."kmsconvt@.service".unit}/kmsconvt@.service"; + + services.kmscon.extraConfig = mkIf cfg.hwRender '' + drm + hwaccel + ''; + }; +} diff --git a/nixos/modules/system/boot/systemd.nix b/nixos/modules/system/boot/systemd.nix index 75c2c788f38..b12031d24ad 100644 --- a/nixos/modules/system/boot/systemd.nix +++ b/nixos/modules/system/boot/systemd.nix @@ -11,13 +11,16 @@ let systemd = cfg.package; makeUnit = name: unit: - pkgs.runCommand "unit" { inherit (unit) text; preferLocalBuild = true; } - (if unit.enable then '' - mkdir -p $out - echo -n "$text" > $out/${name} - '' else '' + pkgs.runCommand "unit" ({ preferLocalBuild = true; } // optionalAttrs (unit.linkTarget == null) { inherit (unit) text; }) + (if !unit.enable then '' mkdir -p $out ln -s /dev/null $out/${name} + '' else if unit.linkTarget != null then '' + mkdir -p $out + ln -s ${unit.linkTarget} $out/${name} + '' else '' + mkdir -p $out + echo -n "$text" > $out/${name} ''); upstreamUnits = @@ -338,7 +341,7 @@ let done for i in ${toString (mapAttrsToList (n: v: v.unit) cfg.units)}; do - ln -s $i/* $out/ + ln -fs $i/* $out/ done for i in ${toString cfg.packages}; do @@ -362,7 +365,7 @@ let ln -s rescue.target $out/kbrequest.target mkdir -p $out/getty.target.wants/ - ln -s ../getty@tty1.service $out/getty.target.wants/ + ln -s ../autovt@tty1.service $out/getty.target.wants/ ln -s ../local-fs.target ../remote-fs.target ../network.target ../nss-lookup.target \ ../nss-user-lookup.target ../swap.target $out/multi-user.target.wants/ @@ -416,6 +419,11 @@ in internal = true; description = "The generated unit."; }; + linkTarget = mkOption { + default = null; + description = "The file to symlink this target to."; + type = types.nullOr types.path; + }; }; config = { unit = makeUnit name config;