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 - 直接在容器中启动 shell
  • machinectl 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

Network

为了使 DHCP 和 DNS 在容器中自动工作,最简单的方法是在主机上安装 systemd-networkdsystemd-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