Skip to content

Commit

Permalink
feat: native systemd support wip
Browse files Browse the repository at this point in the history
  • Loading branch information
K900 committed Sep 23, 2022
1 parent c1b0259 commit d3656e9
Show file tree
Hide file tree
Showing 6 changed files with 307 additions and 85 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
result
result-*
scripts/yoink/target
190 changes: 105 additions & 85 deletions modules/wsl-distro.nix
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,11 @@ with builtins; with lib;
in
{
enable = mkEnableOption "support for running NixOS as a WSL distribution";
nativeSystemd = mkOption {
type = bool;
default = false;
description = "Use native WSL systemd support";
};
automountPath = mkOption {
type = str;
default = "/mnt";
Expand All @@ -34,106 +39,121 @@ with builtins; with lib;
let
cfg = config.wsl;
syschdemd = pkgs.callPackage ../scripts/syschdemd.nix { inherit (cfg) automountPath defaultUser; };
yoink = pkgs.callPackage ../scripts/yoink/yoink.nix {};
in
mkIf cfg.enable {

wsl.wslConf = {
automount = {
enabled = true;
mountFsTab = true;
root = "${cfg.automountPath}/";
options = cfg.automountOptions;
};
network = {
generateResolvConf = mkDefault true;
generateHosts = mkDefault true;
mkMerge [
(mkIf cfg.enable {
wsl.wslConf = {
automount = {
enabled = true;
mountFsTab = true;
root = "${cfg.automountPath}/";
options = cfg.automountOptions;
};
network = {
generateResolvConf = mkDefault true;
generateHosts = mkDefault true;
};
};
};

# WSL is closer to a container than anything else
boot.isContainer = true;
# WSL is closer to a container than anything else
boot.isContainer = true;

environment.noXlibs = lib.mkForce false; # override xlibs not being installed (due to isContainer) to enable the use of GUI apps
hardware.opengl.enable = true; # Enable GPU acceleration
environment.noXlibs = lib.mkForce false; # override xlibs not being installed (due to isContainer) to enable the use of GUI apps
hardware.opengl.enable = true; # Enable GPU acceleration

environment = {
environment = {

etc = {
"wsl.conf".text = generators.toINI { } cfg.wslConf;
etc = {
"wsl.conf".text = generators.toINI { } cfg.wslConf;

# DNS settings are managed by WSL
hosts.enable = !config.wsl.wslConf.network.generateHosts;
"resolv.conf".enable = !config.wsl.wslConf.network.generateResolvConf;
};
# DNS settings are managed by WSL
hosts.enable = !config.wsl.wslConf.network.generateHosts;
"resolv.conf".enable = !config.wsl.wslConf.network.generateResolvConf;
};

systemPackages = [
(pkgs.runCommand "wslpath" { } ''
mkdir -p $out/bin
ln -s /init $out/bin/wslpath
'')
];
};
systemPackages = [
(pkgs.runCommand "wslpath" { } ''
mkdir -p $out/bin
ln -s /init $out/bin/wslpath
'')
];
};

networking.dhcpcd.enable = false;
networking.dhcpcd.enable = false;

users.users.${cfg.defaultUser} = {
isNormalUser = true;
uid = 1000;
extraGroups = [ "wheel" ]; # Allow the default user to use sudo
};
users.users.${cfg.defaultUser} = {
isNormalUser = true;
uid = 1000;
extraGroups = [ "wheel" ]; # Allow the default user to use sudo
};

users.users.root = {
shell = "${syschdemd}/bin/syschdemd";
# Otherwise WSL fails to login as root with "initgroups failed 5"
extraGroups = [ "root" ];
};
users.users.root.extraGroups = [ "root" ];

security.sudo.wheelNeedsPassword = mkDefault false; # The default user will not have a password by default

system.activationScripts = {
copy-launchers = mkIf cfg.startMenuLaunchers (
stringAfter [ ] ''
for x in applications icons; do
echo "Copying /usr/share/$x"
mkdir -p /usr/share/$x
${pkgs.rsync}/bin/rsync -ar --delete $systemConfig/sw/share/$x/. /usr/share/$x
done
''
);
populateBin = stringAfter [ ] ''
echo "setting up /bin..."
ln -sf /init /bin/wslpath
ln -sf ${pkgs.bashInteractive}/bin/bash /bin/sh
ln -sf ${pkgs.util-linux}/bin/mount /bin/mount
'';
};

security.sudo = {
extraConfig = ''
Defaults env_keep+=INSIDE_NAMESPACE
'';
wheelNeedsPassword = mkDefault false; # The default user will not have a password by default
};
systemd = {
# Disable systemd units that don't make sense on WSL
services = {
"serial-getty@ttyS0".enable = false;
"serial-getty@hvc0".enable = false;
"getty@tty1".enable = false;
"autovt@".enable = false;
firewall.enable = false;
systemd-resolved.enable = false;
systemd-udevd.enable = false;
};

tmpfiles.rules = [
# Don't remove the X11 socket
"d /tmp/.X11-unix 1777 root root"
];

# Don't allow emergency mode, because we don't have a console.
enableEmergencyMode = false;
};

system.activationScripts = {
copy-launchers = mkIf cfg.startMenuLaunchers (
stringAfter [ ] ''
for x in applications icons; do
echo "Copying /usr/share/$x"
mkdir -p /usr/share/$x
${pkgs.rsync}/bin/rsync -ar --delete $systemConfig/sw/share/$x/. /usr/share/$x
done
''
);
populateBin = stringAfter [ ] ''
echo "setting up /bin..."
ln -sf /init /bin/wslpath
ln -sf ${pkgs.bashInteractive}/bin/bash /bin/sh
ln -sf ${pkgs.util-linux}/bin/mount /bin/mount
warnings = (optional (config.systemd.services.systemd-resolved.enable && config.wsl.wslConf.network.generateResolvConf) "systemd-resolved is enabled, but resolv.conf is managed by WSL");
})
(mkIf (!cfg.nativeSystemd) {
users.users.root.shell = "${syschdemd}/bin/syschdemd";
security.sudo.extraConfig = ''
Defaults env_keep+=INSIDE_NAMESPACE
'';
};

systemd = {
# Disable systemd units that don't make sense on WSL
services = {
"serial-getty@ttyS0".enable = false;
"serial-getty@hvc0".enable = false;
"getty@tty1".enable = false;
"autovt@".enable = false;
firewall.enable = false;
systemd-resolved.enable = false;
systemd-udevd.enable = false;
wsl.wslConf.users.default = "root";
})
(mkIf cfg.nativeSystemd {
wsl.wslConf = {
user.default = cfg.defaultUser;
boot.systemd = true;
};

tmpfiles.rules = [
# Don't remove the X11 socket
"d /tmp/.X11-unix 1777 root root"
];

# Don't allow emergency mode, because we don't have a console.
enableEmergencyMode = false;
};

warnings = (optional (config.systemd.services.systemd-resolved.enable && config.wsl.wslConf.network.generateResolvConf) "systemd-resolved is enabled, but resolv.conf is managed by WSL");
};
system.activationScripts = {
shimSystemd = stringAfter [ ] ''
echo "setting up /lib/systemd/systemd shim..."
mkdir -p /lib/systemd
ln -sf ${yoink}/bin/yoink /lib/systemd/systemd
'';
};
})
];
}
145 changes: 145 additions & 0 deletions scripts/yoink/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 10 additions & 0 deletions scripts/yoink/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
[package]
name = "yoink"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
anyhow = { version = "1.0.65", features = ["backtrace"] }
nix = { version = "0.25.0", features = ["process"] }
Loading

0 comments on commit d3656e9

Please sign in to comment.