Skip to content

Utility to run systemd in WSL2 with a Linux namespace

License

Notifications You must be signed in to change notification settings

sorah/subsystemctl

Folders and files

NameName
Last commit message
Last commit date

Latest commit

cf112a2 · Feb 3, 2022

History

28 Commits
Sep 13, 2021
Jun 10, 2020
Oct 4, 2021
Oct 4, 2021
Jun 10, 2020
Feb 3, 2022
Jun 10, 2020

Repository files navigation

subsystemd: Run systemd in WSL2

Maintanence Note: You may want to use nullpo-head/wsl-distrod which provides better compatibility with systemd and easier installation, and well maintained.

Run systemd under Linux namespace in WSL2. Heavily inspired by arkane-systems/genie, but written in Rust.

Difference with arkane-systems/genie

Slightly following genie's behavior, but noted below...

  • Interface
    • Command line interface is not compatible.
  • Behavior
    • Hostname altertion is optional with --hostname, --hostname-suffix
      • /etc/hosts are not updated. Users are encouraged to use nss-myhostname.
    • Uses machinectl shell to launch a user shell; this allows running systemd user session
  • Internal
    • Removed dependency to unshare, daemonize, nsenter command line tools
    • systemd-wide environment variables are set via systemd.conf drop-in, using DefaultEnvironment=
    • systemd PID from root namespace is stored at /run/subsystemctl/systemd.pid

Install

Arch Linux

PKGBUILD: https://github.com/sorah/arch.sorah.jp/tree/master/aur-sorah/PKGBUILDs/subsystemctl

(PKGBUILD originally submitted to AUR (https://aur.archlinux.org/packages/subsystemctl) was deleted as they unwelcomes WSL-exclusive packages.)

Debian/Ubuntu

Refer to https://github.com/nkmideb/subsystemctl for debian source.

Pre-built package binaries available at https://github.com/nkmideb/subsystemctl/releases for your convenient.

Self build

cargo install subsystemctl

or from git source:

cargo build --release
install -m6755 -oroot -groot ./target/release/subsystemctl /usr/local/bin/subsystemctl

Usage

subsystemctl start: Start systemd environment

PS> wsl -u root -- subsystemctl start

subsystemctl shell: shell login to systemd-enabled environment

PS> wsl subsystemctl shell
Connected to the local host. Press ^] three times within 1s to exit session.
someone@hostname$ ...

Specifying uid to login

PS> wsl -u root -- subsystemctl shell --uid=1000
Connected to the local host. Press ^] three times within 1s to exit session.
someone@hostname$ ...

Automatically starting and entering a user shell

PS> wsl -u root -d Arch -- subsystemctl shell --uid=1000 --start
[2021-06-27T16:32:20Z INFO  subsystemctl] Starting systemd
Connected to the local host. Press ^] three times within 1s to exit session.

someone@hostname$ ...

subsystemctl exec: Raw nsenter like interface

PS> wsl subsystemctl exec id
uid=1000(sorah) gid=1000(sorah) groups=1000(sorah),116(admin)

Specifying uid (and gid)

PS> wsl -u root -- subsystemctl exec id
uid=0(root) gid=0(root) groups=0(root)

PS> wsl -u root -- subsystemctl exec --uid=1000 id
uid=1000(sorah) gid=1000(sorah) groups=1000(sorah),116(admin)

PS> wsl -u root -- subsystemctl exec --uid=1000 --gid=116 id
uid=1000(sorah) gid=116(admin) groups=116(admin)

subsystemctl is-running

#!/bin/bash
if subsystemctl is-running; then
  echo "running"
else
  echo "not-running"
fi

subsystemctl is-inside

#!/bin/bash
if subsystemctl is-inside; then
  echo "inside"
else
  echo "outside"
fi

Tips

systemd-resolved, networkd are recommended to be disabled

otherwise /etc/resolv.conf might get overwritten to resolved stub-resolver.

Author

Sorah Fukumori https://sorah.jp/

License

MIT

About

Utility to run systemd in WSL2 with a Linux namespace

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages