Systemd-machined
简介
systemd-machined 是一个轻量级的容器管理器,主要设计用于管理 systemd-nspawn 容器。
最重要的是,由 machined 管理的容器实际上会启动一个带有 systemd 的完整系统,而不是仅仅运行单个服务。这使得它非常适合像虚拟机一样使用容器,只是没有额外的内核和 VM。容器可以是一个文件系统树(最好是在 btrfs 子卷中)或一个磁盘镜像。
systemd-machined 直接来自 systemd,因此集成度很高。使用这样的容器在熟悉服务单元的运行方式时感觉非常自然。即使是容器的日志输出也可以通过 journalctl 在主机上查看。
安装
systemd-machined 包含在 systemd-container 包中,可以使用 zypper 进行安装。
用法
machinectl list- 列出正在运行的容器machinectl list-images- 列出离线容器machinectl start NAME- 启动镜像machinectl login NAME- 登录到正在运行的容器,就像串行登录一样machinectl shell NAME- 直接在容器中启动 shellmachinectl enable NAME- 启用容器在启动时运行
入门
快速启动并运行的方法是简单地下载一个现成的 TW 设备。它将存储在 /var/lib/machines 中的 btrfs 子卷中。
# machinectl pull-tar --verify=no http://download.opensuse.org/tumbleweed/appliances/opensuse-tumbleweed-image.x86_64-networkd.tar.xz tumbleweed # machinectl read-only tumbleweed false # machinectl start tumbleweed # machinectl shell tumbleweed
- TODO: 集成 systemd-sysupdate
- TODO: 校验和验证 https://github.com/openSUSE/open-build-service/issues/10407
- XXX: 需要弄清楚为什么容器默认是只读的并修复它
Network
为了使 DHCP 和 DNS 在容器中自动工作,最简单的方法是在主机上安装 systemd-networkd。systemd-networkd 可以与 eg NetworkManager 并行运行,因为 systemd-networkd 默认情况下只会获取由 systemd-machined 创建的接口。
# zypper in systemd-network # systemctl enable systemd-networkd
默认情况下,容器也会使用主机 /etc/resolv.conf 中的 DNS 服务器。如果 resolv.conf 没有 DNS 服务器,例如因为使用了本地 dnsmasq,则需要手动配置主机的 networkd 以向容器发出特定的 DNS 服务器地址。
# mkdir -p /etc/systemd/network/80-container-ve.network.d # echo -e "[DHCPServer]\nDNS=1.1.1.1" > /etc/systemd/network/80-container-ve.network.d/dhcp-dns-cloudflare.conf
Firewalld 集成
确保连接已正确分配了区域。没有显式区域分配的接口通常配置为使用“public”区域。您可能希望例如将您的 wifi 连接分配给“home”区域,并将您的公司 wifi 分配给“work”。
示例
/etc/NetworkManager/system-connections/ACME-vpn
[connection] zone=work
为 machined 容器创建新区域
firewall-cmd --permanent --new-zone machined firewall-cmd --permanent --zone machined --add-service dhcp firewall-cmd --permanent --zone machined --add-service dhcpv6-client
启用传出接口上的 masquerading
firewall-cmd --permanent --zone=public --add-masquerade firewall-cmd --permanent --zone=home --add-masquerade firewall-cmd --permanent --zone=work --add-masquerade
创建一个允许转发的策略
firewall-cmd --permanent --new-policy=machined-policy firewall-cmd --permanent --policy=machined-policy --add-egress-zone=public firewall-cmd --permanent --policy=machined-policy --add-egress-zone=home firewall-cmd --permanent --policy=machined-policy --add-egress-zone=work firewall-cmd --permanent --policy=machined-policy --set-target=ACCEPT
将您的 machined 接口添加到 machined 区域(ip l l 列出接口,它是 ve-*)
firewall-cmd --permanent --zone machined --add-interface=ve-tumbleweed
重新加载防火墙
firewall-cmd --reload
映射用户
映射用户是一个方便的功能,可以在容器内使用您的主机用户。为了使此功能工作,必须使用私有用户组。检查 id 命令是否报告相同的 uid 和 gid。如果不是,请创建一个与您的用户具有相同名称和 gid 的组,并使其成为您的用户的基本组。
如果您的用户具有私有组,请配置容器以使用它。在 /etc/systemd/nspawn/name.nspawn 中添加
[Files] BindUser=alan
容器内必须激活 nss-systemd
# zypper in nss-systemd # grep -v '^#\|^$' /usr/etc/nsswitch.conf > /etc/nsswitch.conf # vi /etc/nsswitch.conf # grep systemd /etc/nsswitch.conf passwd: compat systemd group: compat [SUCCESS=merge] systemd shadow: compat systemd
## or with one sed command: # sed -e '/^#\|^$/d;s/^\(group:\s*compat\)$/\1 [SUCCESS=merge] systemd/;s/^\(\(passwd\|shadow\):\s*compat\)/\1 systemd/' /usr/etc/nsswitch.conf > /etc/nsswitch.conf
将容器作为用户使用
可以在没有 root 权限的情况下以用户身份启动、停止和登录到容器。设置它只需要 root 权限。您可以从 home:lnussel:systemd/systemd-machined-userpolicy 安装 polkit 策略
然后,遵循模式 user-$USERNAME-SOMETHING 的容器可以由 $USERNAME 在没有身份验证的情况下管理。因此,重命名上面创建的容器
machinectl rename tumbleweed user-alan-tumbleweed
映射目录
也可以将某些主机目录挂载到容器中。如果您例如将源代码保存在您的主目录之外,或者希望将某些守护程序的的数据存储在主机上,这将非常方便。
/etc/systemd/nspawn/name.nspawn:
[Files] Bind=/work/git