Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/sorah/subsystemctl
Utility to run systemd in WSL2 with a Linux namespace
https://github.com/sorah/subsystemctl
systemd wsl wsl2
Last synced: about 21 hours ago
JSON representation
Utility to run systemd in WSL2 with a Linux namespace
- Host: GitHub
- URL: https://github.com/sorah/subsystemctl
- Owner: sorah
- License: mit
- Created: 2020-06-10T21:25:56.000Z (over 4 years ago)
- Default Branch: master
- Last Pushed: 2022-02-04T13:27:33.000Z (almost 3 years ago)
- Last Synced: 2025-01-04T01:16:32.495Z (8 days ago)
- Topics: systemd, wsl, wsl2
- Language: Rust
- Homepage:
- Size: 63.5 KB
- Stars: 330
- Watchers: 8
- Forks: 15
- Open Issues: 11
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome - sorah/subsystemctl - Utility to run systemd in WSL2 with a Linux namespace (Rust)
- jimsghstars - sorah/subsystemctl - Utility to run systemd in WSL2 with a Linux namespace (Rust)
README
# subsystemd: Run systemd in WSL2
__Maintanence Note:__ You may want to use [nullpo-head/wsl-distrod](https://github.com/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][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](https://lists.archlinux.org/pipermail/aur-requests/2020-June/041193.html).)_
### 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:
```bash
cargo build --release
install -m6755 -oroot -groot ./target/release/subsystemctl /usr/local/bin/subsystemctl
```## Usage
### `subsystemctl start`: Start `systemd` environment
```ps1
PS> wsl -u root -- subsystemctl start
```### `subsystemctl shell`: shell login to systemd-enabled environment
```ps1
PS> wsl subsystemctl shell
Connected to the local host. Press ^] three times within 1s to exit session.
someone@hostname$ ...
```#### Specifying uid to login
```ps1
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
```ps1
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
```ps1
PS> wsl subsystemctl exec id
uid=1000(sorah) gid=1000(sorah) groups=1000(sorah),116(admin)
```#### Specifying uid (and gid)
```ps1
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`
```bash
#!/bin/bash
if subsystemctl is-running; then
echo "running"
else
echo "not-running"
fi
```### `subsystemctl is-inside`
```bash
#!/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
[genie]: https://github.com/arkane-systems/genie