#systemd #linux #namespaces #wsl #wsl2 #user #interface

bin+lib subsystemctl

在WSL2中使用Linux命名空间运行systemd的实用工具

3个不稳定版本

0.2.0 2021年10月4日
0.1.2 2020年10月17日
0.1.1 2020年6月11日

Unix API 中排名 391

MIT 许可证

33KB
718

subsystemd: 在WSL2中运行systemd

在WSL2中运行Linux命名空间下的systemd。在很大程度上受到 arkane-systems/genie 的启发,但用Rust编写。

与arkane-systems/genie的不同之处

略微遵循 genie 的行为,但如下所述...

  • 界面
    • 命令行界面不兼容。
  • 行为
    • 使用 --hostname--hostname-suffix 修改主机名是可选的
      • /etc/hosts 不更新。建议用户使用 nss-myhostname
    • 使用 machinectl shell 启动用户shell;这允许运行systemd用户会话
  • 内部
    • 删除了对 unsharedaemonizensenter 命令行工具的依赖
    • 通过 systemd.conf 插件设置systemd-wide环境变量,使用 DefaultEnvironment=
    • root命名空间中的systemd PID 存储在 /run/subsystemctl/systemd.pid

安装

Arch Linux

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

(原PKGBUILD提交到AUR (https://aur.archlinux.org/packages/subsystemctl) 已被删除,因为它们不欢迎仅WSL的软件包)

Debian/Ubuntu

请参阅 https://github.com/nkmideb/subsystemctl 获取debian源代码。

预构建的二进制软件包在 https://github.com/nkmideb/subsystemctl/releases 中提供,方便您使用。

自建

cargo install subsystemctl

或从git源代码构建

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

用法

subsystemctl start:启动 systemd 环境

PS> wsl -u root -- subsystemctl start

subsystemctl shell:以shell登录到systemd启用环境

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

指定登录的uid

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

自动启动并进入用户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的接口

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

指定uid(和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是-在内部运行的

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

subsystemctl是-

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

提示

否则/etc/resolv.conf可能会被resolved stub-resolver覆盖。

作者

Sorah Fukumori https://sorah.jp/

许可证

MIT

依赖项

~5–14MB
~160K SLoC