精华内容
下载资源
问答
  • systemd-nspawnsystemd-nspawn docker run的便利包装器脚本,用于设置与主机交互的环境。 它负责传递必要的变量、套接字、绑定安装和文件权限。 特征: 共享 SSH 代理 共享 X11 分享PulseAudio 将指定目录挂载为 ...
  • 与sbuild或pbuilder类的类似工具不同, debspawn使用systemd-nspawn而不是普通的chroot来管理隔离的环境。 这允许Debspawn通过容器技术进一步将构建与主机系统隔离。 它还允许使用更高级的功能来管理构建,例如,为...
  • 如果/ var / lib / machines不是它自己的文件系统,则systemd-nspawn将创建/var/lib/machines.raw并将其环回安装为btrfs文件系统。 您可能希望增加默认大小: machinectl set-limit 20G 我们建议您创建一个足够大...
  • Nomad Systemd-Nspawn驱动程序 这是Hashicorp任务驱动运行与容器systemd-nspawn 。 通过该驱动程序启动的容器默认情况下将启用专用网络,并且其计算机ID将设置为启动的Nomad任务的分配ID。 客户要求 以root身份运行...
  • nspawn 具有容器 特征: 差分图像 支持图像的多重继承 提供用于图像build和机器setup 机器由生成的 安装 要安装python软件包: sudo pip install nspawn 构建脚本 要构建映像,请提供并调用可执行的build.py...
  • 容器是什么? 一个容器就是一个用户空间实例,它能够在与托管容器的系统(叫做宿主系统)相隔离的环境中运行一个程序或者一个操作系统。...为此,systemd 提供了 systemd-nspawn,这款工具能够使用多种 Linux 技术创

    容器是什么?

    一个容器就是一个用户空间实例,它能够在与托管容器的系统(叫做宿主系统)相隔离的环境中运行一个程序或者一个操作系统。这和 chroot 或 虚拟机 的思想非常类似。运行在容器中的进程是由与宿主操作系统相同的内核来管理的,但它们是与宿主文件系统以及其它进程隔离开的。

    什么是 systemd-nspawn?

    systemd 项目认为应当将容器技术变成桌面的基础部分,并且应当和用户的其余系统集成在一起。为此,systemd 提供了 systemd-nspawn,这款工具能够使用多种 Linux 技术创建容器。它也提供了一些容器管理工具。

    systemd-nspawn 和 chroot 在许多方面都是类似的,但是前者更加强大。它虚拟化了文件系统、进程树以及客户系统中的进程间通信。它的吸引力在于它提供了很多用于管理容器的工具,例如用来管理容器的 machinectl。由 systemd-nspawn 运行的容器将会与 systemd 组件一同运行在宿主系统上。举例来说,一个容器的日志可以输出到宿主系统的日志中。

    在 Fedora 24 上,systemd-nspawn 已经从 systemd 软件包分离出来了,所以你需要安装 systemd-container 软件包。一如往常,你可以使用 dnf install systemd-container 进行安装。

    创建容器

    使用 systemd-nspawn 创建一个容器是很容易的。假设你有一个专门为 Debian 创造的应用,并且无法在其它发行版中正常运行。那并不是一个问题,我们可以创造一个容器!为了设置容器使用最新版本的 Debian(现在是 Jessie),你需要挑选一个目录来放置你的系统。我暂时将使用目录 ~/DebianJessie。

    一旦你创建完目录,你需要运行 debootstrap,你可以从 Fedora 仓库中安装它。对于 Debian Jessie,你运行下面的命令来初始化一个 Debian 文件系统。

    $ debootstrap --arch=amd64 stable ~/DebianJessie
    以上默认你的架构是 x86_64。如果不是的话,你必须将架构的名称改为 amd64。你可以使用 uname -m 得知你的机器架构。

    一旦设置好你的根目录,你就可以使用下面的命令来启动你的容器。

    $ systemd-nspawn -bD ~/DebianJessie
    容器将会在数秒后准备好并运行,当你试图登录时就会注意到:你无法使用你的系统上任何账户。这是因为 systemd-nspawn 虚拟化了用户。修复的方法很简单:将之前的命令中的 -b 移除即可。你将直接进入容器的 root 用户的 shell。此时,你只能使用 passwd 命令为 root 设置密码,或者使用 adduser 命令添加一个新用户。一旦设置好密码或添加好用户,你就可以把 -b 标志添加回去然后继续了。你会进入到熟悉的登录控制台,然后你使用设置好的认证信息登录进去。

    以上对于任意你想在容器中运行的发行版都适用,但前提是你需要使用正确的包管理器创建系统。对于 Fedora,你应使用 DNF 而非 debootstrap。想要设置一个最小化的 Fedora 系统,你可以运行下面的命令,要将“/absolute/path/”替换成任何你希望容器存放的位置。

    $ sudo dnf --releasever=24 --installroot=/absolute/path/ install systemd passwd dnf fedora-release

    设置网络

    如果你尝试启动一个服务,但它绑定了你宿主机正在使用的端口,你将会注意到这个问题:你的容器正在使用和宿主机相同的网络接口。幸运的是,systemd-nspawn 提供了几种可以将网络从宿主机分开的方法。

    本地网络

    第一种方法是使用 --private-network 标志,它默认仅创建一个回环设备。这对于你不需要使用网络的环境是非常理想的,例如构建系统和其它持续集成系统。

    多个网络接口

    如果你有多个网络接口设备,你可以使用 --network-interface 标志给容器分配一个接口。想要给我的容器分配 eno1,我会添加选项 --network-interface=eno1。当某个接口分配给一个容器后,宿主机就不能同时使用那个接口了。只有当容器彻底关闭后,宿主机才可以使用那个接口。

    共享网络接口

    对于我们中那些并没有额外的网络设备的人来说,还有其它方法可以访问容器。一种就是使用 --port 选项。这会将容器中的一个端口定向到宿主机。使用格式是 协议:宿主机端口:容器端口,这里的协议可以是 tcp 或者 udp,宿主机端口 是宿主机的一个合法端口,容器端口 则是容器中的一个合法端口。你可以省略协议,只指定 宿主机端口:容器端口。我通常的用法类似 --port=2222:22。

    你可以使用 --network-veth 启用完全的、仅宿主机模式的网络,这会在宿主机和容器之间创建一个虚拟的网络接口。你也可以使用 --network-bridge 桥接二者的连接。

    使用 systemd 组件

    如果你容器中的系统含有 D-Bus,你可以使用 systemd 提供的实用工具来控制并监视你的容器。基础安装的 Debian 并不包含 dbus。如果你想在 Debian Jessie 中使用 dbus,你需要运行命令 apt install dbus。

    machinectl

    为了能够轻松地管理容器,systemd 提供了 machinectl 实用工具。使用 machinectl,你可以使用 machinectl login name 登录到一个容器中、使用 machinectl status name检查状态、使用 machinectl reboot name 启动容器或者使用 machinectl poweroff name 关闭容器。

    其它 systemd 命令

    多数 systemd 命令,例如 journalctl, systemd-analyze 和 systemctl,都支持使用 --machine 选项来指定容器。例如,如果你想查看一个名为 “foobar” 的容器的日志,你可以使用 journalctl --machine=foobar。你也可以使用 systemctl --machine=foobar status service 来查看运行在这个容器中的服务状态。

    和 SELinux 一起工作

    如果你要使用 SELinux 强制模式(Fedora 默认模式),你需要为你的容器设置 SELinux 环境。想要那样的话,你需要在宿主系统上运行下面两行命令。

    $ semanage fcontext -a -t svirt_sandbox_file_t “/path/to/container(/.*)?”
    $ restorecon -R /path/to/container/
    确保使用你的容器路径替换 “/path/to/container”。对于我的容器 “DebianJessie”,我会运行下面的命令:

    $ semanage fcontext -a -t svirt_sandbox_file_t “/home/johnmh/DebianJessie(/.*)?”
    $ restorecon -R /home/johnmh/DebianJessie/
    via: https://fedoramagazine.org/container-technologies-fedora-systemd-nspawn/

    展开全文
  • linux systemd 只要存在GNU / Linux系统,系统管理员就需要从根文件系统损坏,意外的配置更改或其他阻止系统启动到“正常”状态的情况中恢复。 Linux发行版通常在启动时提供一个或多个菜单选项(例如,在GRUB菜单...

    systemd linux

    只要存在GNU / Linux系统,系统管理员就需要从根文件系统损坏,意外的配置更改或其他阻止系统启动到“正常”状态的情况中恢复。

    Linux发行版通常在启动时提供一个或多个菜单选项(例如,在GRUB菜单中),这些菜单选项可用于营救损坏的系统。 通常,他们在禁用大多数系统服务的情况下将系统引导到单用户模式。 在最坏的情况下,用户可以修改引导加载程序中的内核命令行,以将标准外壳用作初始化(PID 1)进程。 这种方法最复杂,并且充满了复杂性,在需要抢救系统时可能会导致挫败感和浪费时间。

    当另一个系统(具有相同体系结构和通常相似的配置)可用时,简化修复过程的常用技术是从损坏的系统中提取存储设备,并将它们作为辅助设备连接到工作系统。 对于物理系统,这通常很简单,但是大多数云计算平台也可以支持此操作,因为它们允许将损坏实例的根存储卷安装到另一个实例上。

    将根文件系统附加到另一个系统后,使用fsck和其他工具即可轻松解决文件系统损坏。 解决配置错误,损坏的程序包或其他问题可能会更加复杂,因为它们需要挂载文件系统以及查找和更改正确的配置文件或数据库。

    使用systemd

    systemd之前,使用文本编辑器编辑配置文件是纠正配置的实用方法。 找到必要的文件并了解其内容可能是一个单独的挑战,这超出了本文的范围。

    但是,当GNU / Linux系统使用systemd时 ,最好使用它提供的工具来进行许多配置更改-例如,启用和禁用服务需要在各个位置创建或删除符号链接。 systemctl工具用于进行这些更改,但使用它需要运行一个systemd实例并正在(在D-Bus上)侦听请求。 当根文件系统作为附加文件系统挂载到另一台计算机上时,不能使用运行中的systemd实例进行这些更改。

    手动启动目标系统的systemd也不可行,因为它被设计为系统上的PID 1进程并管理所有其他进程,这将与用于修复的系统上已经在运行的实例冲突。

    幸运的是, systemd能够启动容器,具有自己的PID 1的完全封装的GNU / Linux系统以及利用Linux内核提供的各种名称空间功能的环境。 与Docker和Rocket这样的工具不同, systemd不需要容器映像来启动容器。 它可以启动一个植根于现有文件系统中任何位置的文件。 这是使用systemd-nspawn工具完成的,该工具将创建必要的系统名称空间并在容器中启动初始过程,然后在容器中提供控制台。 与chroot (仅更改文件系统的表观根目录)相反,此类型的容器将具有单独的文件系统名称空间,在/ dev/ run/ proc上安装的合适文件系统,以及单独的进程名称空间和IPC名称空间。 请查阅systemd-nspawn 手册页以了解有关其功能的更多信息。

    展示其工作原理的示例

    在此示例中,包含损坏的系统根文件系统的存储设备已连接到正在运行的系统,在该系统中显示为/ dev / vdc 。 设备名称将根据现有存储设备的数量,设备的类型以及用于将其连接到系统的方法而有所不同。 根文件系统可以使用整个存储设备,也可以使用该设备内的分区。 由于最常见(简单)的配置将根文件系统放置在设备的第一个分区中,因此本示例将使用/ dev / vdc1。 确保使用系统的正确设备名称替换以下命令中的设备名称。

    损坏的根文件系统也可能比设备上的单个文件系统更为复杂。 它可以是LVM卷集中的一个卷,也可以是组合到软件RAID设备中的一组设备上的卷。 在这些情况下,必须执行组成和激活保存文件系统的逻辑设备的必要步骤,然后才能将其安装。 同样,这些步骤超出了本文的范围。

    先决条件

    首先,请确保已安装systemd-nspawn工具-大多数GNU / Linux发行版默认都不安装它。 大多数发行版中的systemd-container软件包都提供了该软件包,因此请使用发行版的软件包管理器来安装该软件包。 本示例中的指令已使用Debian 9进行了测试,但在任何现代GNU / Linux发行版中均应类似地工作。

    使用下面的命令几乎肯定会需要root权限,因此您要么需要以root身份登录,要么使用sudo获得具有root权限的shell,要么为每个命令加上sudo前缀。

    验证并安装文件系统

    首先,使用fsck验证目标文件系统的结构和内容:

     $ fsck /dev/vdc1 
    

    如果发现文件系统有任何问题,请适当回答问题以更正它们。 如果文件系统已充分损坏,则可能无法修复,在这种情况下,您将不得不寻找其他方法来提取其内容。

    现在,创建一个临时目录并将目标文件系统挂载到该目录:

    
       
    $ mkdir /tmp/target-rescue
    $ mount /dev/vdc1 /tmp/target-rescue

    挂载文件系统后,启动一个以该文件系统为根文件系统的容器:

     $ systemd-nspawn --directory /tmp/target-rescue --boot -- --unit rescue.target 
    

    用于启动容器的命令行参数为:

    • --directory / tmp / target-rescue提供容器的根文件系统的路径。
    • --boot在容器的根文件系统中搜索合适的init程序并启动它,并将参数从命令行传递给它。 在此示例中,目标系统还使用systemd作为其PID 1进程,因此其余参数将用于该进程。 如果要修复的目标系统使用任何其他工具作为其PID 1进程,则需要相应地调整参数。
    • -systemd-nspawn的参数与容器的PID 1进程的参数分开。
    • --unit rescue.target告诉容器中的systemd在引导过程中应尝试到达的目标名称。 为了简化目标系统中的救援操作,请将其引导到“救援”模式,而不是正常的多用户模式。

    如果一切顺利,您应该会看到类似以下的输出:

    
       
    Spawning container target-rescue on /tmp/target-rescue.
    Press ^] three times within 1s to kill container.
    systemd 232 running in system mode. (+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN)
    Detected virtualization systemd-nspawn.
    Detected architecture arm.

    Welcome to Debian GNU/Linux 9 (Stretch)!

    Set hostname to <test>.
    Failed to install release agent, ignoring: No such file or directory
    [  OK  ] Reached target Swap.
    [  OK  ] Listening on Journal Socket (/dev/log).
    [  OK  ] Started Dispatch Password Requests to Console Directory Watch.
    [  OK  ] Reached target Encrypted Volumes.
    [  OK  ] Created slice System Slice.
             Mounting POSIX Message Queue File System...
    [  OK  ] Listening on Journal Socket.
             Starting Set the console keyboard layout...
             Starting Restore / save the current clock...
             Starting Journal Service...
             Starting Remount Root and Kernel File Systems...
    [  OK  ] Mounted POSIX Message Queue File System.
    [  OK  ] Started Journal Service.
    [  OK  ] Started Remount Root and Kernel File Systems.
             Starting Flush Journal to Persistent Storage...
    [  OK  ] Started Restore / save the current clock.
    [  OK  ] Started Flush Journal to Persistent Storage.
    [  OK  ] Started Set the console keyboard layout.
    [  OK  ] Reached target Local File Systems (Pre).
    [  OK  ] Reached target Local File Systems.
             Starting Create Volatile Files and Directories...
    [  OK  ] Started Create Volatile Files and Directories.
    [  OK  ] Reached target System Time Synchronized.
             Starting Update UTMP about System Boot/Shutdown...
    [  OK  ] Started Update UTMP about System Boot/Shutdown.
    [  OK  ] Reached target System Initialization.
    [  OK  ] Started Rescue Shell.
    [  OK  ] Reached target Rescue Mode.
             Starting Update UTMP about System Runlevel Changes...
    [  OK  ] Started Update UTMP about System Runlevel Changes.
    You are in rescue mode. After logging in, type "journalctl -xb" to view
    system logs, "systemctl reboot" to reboot, "systemctl default" or ^D to
    boot into default mode.
    Give root password for maintenance
    (or press Control-D to continue):

    在此输出中,您可以看到systemd作为容器中的init进程启动,并检测到它正在容器中运行,因此可以适当地调整其行为。 启动各种单位文件以使容器处于可用状态,然后请求目标系统的根密码。 如果要具有root权限的shell提示符,可以在此处输入root密码,也可以按Ctrl + D允许启动过程继续,这将显示正常的控制台登录提示符。

    完成对目标系统的必要更改后,快速连续按三下Ctrl +] 。 这将终止容器并使您返回原始外壳。 从那里,您可以通过卸载目标系统的文件系统并删除临时目录来进行清理:

    
       
    $ umount /tmp/target-rescue
    $ rmdir /tmp/target-rescue

    而已! 现在,您可以删除目标系统的存储设备,并将它们返回到目标系统。

    以这种方式使用systemd-nspawn的想法,尤其是--boot参数 ,来自于StackExchange上发布的一个问题 感谢Shibumi和kirbyfan64sos为这个问题提供了有用的答案!

    翻译自: https://opensource.com/article/18/11/systemd-nspawn-system-recovery

    systemd linux

    展开全文
  • mkdir -p /etc/systemd/nspawn cat > /etc/systemd/nspawn/plex.nspawn [Exec] Boot=on [Files] Bind=/mnt/media:/mnt [Network] VirtualEthernet=yes Bridge=br0 EOF 更多规则请查看man(5):system.nspawn 4.3 启动...

    一、准备网络

    1.1 基础网络配置

    禁用系统默认网络管理器,启用systemd-networkd

    systemctl disable network
    systemctl disable networking
    systemctl disable NetworkManager
    systemctl enable systemd-networkd
    

    1.2 创建网桥

    创建bridge网桥规则文件

    cat > /etc/systemd/network/br0.netdev <<EOF
    [NetDev]
    Name=br0
    Kind=bridge
    EOF
    
    cat > /etc/systemd/network/br0.network <<EOF
    [Match]
    Name=br0
    
    [Network]
    DHCP=ipv4
    EOF
    

    重启启动systemd-networkd网络管理服务

    systemctl restart systemd-networkd
    

    1.3 启用域名解析

    启用systemd-resolved本地DNS缓存服务

    systemctl enable systemd-resolved
    systemctl start systemd-resolved
    ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
    

    测试网络是否正常

    ping www.163.com
    

    二、配置环境

    2.1 启动machines.target

    systemctl start machines.target
    

    2.2 配置镜像分区

    1. 创建LV卷来存放镜像

      lvcreate -n machines -L 50G
      
    2. 格式化为BTRFS分区

      mkfs.btrfs /dev/${VGNAME}/machines
      
    3. 编写分区挂载文件

      system.mount方式挂载文件系统可防止因分区故障导致系统无法启动(系统分区无法挂载会进入紧急模式)。

      cat > /etc/systemd/system/var-lib-machines.mount <<EOF
      [Unit]
      Documentation=man:systemd-nspawn(1)
      Description=Virtual Machine and ContainerStorage
      ConditionPathExists=/dev/sys/machines
      
      [Mount]
      What=/dev/disk/by-uuid/2fbd6637-5615-4c75-9fa9-d7e814ed966f
      Where=/var/lib/machines
      Type=btrfs
      
      [Install]
      WantedBy=machines.target
      EOF
      

      UUID根据你自己创建的LV卷来确定,此处示例的分区UUD为2fbd6637-5615-4c75-9fa9-d7e814ed966f,可以使用命令blkid来查看所有分区的UUID

      更多文档语法请查看手册man(5):system.mount

    4. 挂载分区

      systemctl enable var-lib-machines.mount
      systemctl start var-lib-machines.mount
      

    三、创建镜像

    3.1 构建镜像

    可以通过多种途径构建镜像,包括下面几种:

    machinectl --verify=no pull-tar https://cloud-images.ubuntu.com/xenial/current/xenial-server-cloudimg-amd64-root.tar.gz xenial-base
    

    3.2 配置镜像

    启动镜像

    systemd-nspawn --boot --directory=/var/lib/machines/xenial-base --network-bridge=br0
    

    以下操作在镜像内配置

    修改镜像密码

    passwd
    

    卸载镜像Cloud-init工具

    apt remove cloud-init
    

    配置镜像使用DHCP获取IP地址

    cat > /etc/systemd/network/host.network <<EOF
    [Match]
    Name=host0
    
    [Network]
    DHCP=ipv4
    EOF
    

    启动镜像systemd-networkd服务

    systemctl enable systemd-networkd
    

    配置镜像systemd-resolve获取DNS

    systemctl enable systemd-resolve
    ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
    

    配置结束后输入exit退出镜像

    只读镜像,将镜像设置为只读可防止修改。

    machinectl read-only xenial-base true
    

    四、创建容器

    4.1 构建容器

    将刚创建好的镜像克隆成容器

    machinectl clone xenial-base plex
    

    4.2 配置容器

    将容器参数以文件保存,这样就不用每次启动镜像都指定参数

    如需创建配置文件,确保容器配置目录已创建,默认该目录不存在,需要手动创建。

    mkdir -p /etc/systemd/nspawn
    
    cat > /etc/systemd/nspawn/plex.nspawn <<EOF
    [Exec]
    Boot=on
    
    [Files]
    Bind=/mnt/media:/mnt
    
    [Network]
    VirtualEthernet=yes
    Bridge=br0
    EOF
    

    更多规则请查看man(5):system.nspawn

    4.3 启动容器

    machinectl start plex
    

    4.4 查看容器运行情况

    machinectl list
    

    五、容器登陆方式

    可以通过两种方式登陆到容器

    5.1 shell访问

    通过machinectl的来获取容器shell

    machinectl shell root@plex -- /bin/bash
    

    5.2 ssh访问

    想使用ssh方式的话必须按照ssh服务

    machinectl shell root@plex -- /bin/bash -c "dpkg-reconfigure openssh-server"
    

    添加key

    export KEY=$(cat ~/.ssh/id_rsa.pub)
    machinectl shell root@plex -- /bin/bash -c "ssh-keygen -f /root/.ssh/id_rsa -t rsa -N ''"
    machinectl shell root@plex -- /bin/bash -c "echo ${KEY} | tee -a /root/.ssh/authorized_keys"
    

    完成上面操作的话就可以通过ssh来登陆到容器中

    六、测试应用

    本次演示的应用是plex

    6.1 登陆到容器

    machinectl shell root@plex -- /bin/bash
    

    6.2 部署应用

    安装应用plex

    echo plex > /etc/hostname
    echo deb https://downloads.plex.tv/repo/deb/ public main | sudo tee /etc/apt/sources.list.d/plexmediaserver.list
    curl https://downloads.plex.tv/plex-keys/PlexSign.key | sudo apt-key add -
    apt-get update
    apt-get install -y plexmediaserver
    

    查看容器的IP地址信息,即可通过IP地址来访问容器内的plex应用。

    ip route get 1
    1.0.0.0 via 172.16.24.2 dev br0  src 172.16.24.211
        cache
    

    plex

    七、其他新的容器

    通过上面的几个步骤的操作,我们完成了容器的基本创建和配置。如果想创建新的容器,可按照下面步骤进行操作。

    • 创建容器的 根文件系统(rootfs),然后将镜像克隆成容器: machinectl clone xenial-base new-container

    • 构建容器的unit配置文件。

    cat > /etc/systemd/nspawn/new-container.nspawn <<EOF
    [Exec]
    Boot=on
    
    [Network]
    VirtualEthernet=yes
    Bridge=br0
    EOF
    
    • 重新加载systemd服务配置:systemctl daemon-reload

    • 如果想让容器在系统启动时自动启动,则使用命令: systemctl enable systemd-nspawn@new-container

    • 手动启动则使用命令: machinectl start new-container


    帮助文档

    更多文档信息请查看官网文档。

    展开全文
  • 本文将学习systemd-nspawn的相关知识。 容器是什么? 一个容器就是一个用户空间实例,它能够在与托管容器的系统(叫做宿主系统)相隔离的环境中运行一个程序或者一个操作系统。这和chroot或虚拟机的思想...

    欢迎来到“Fedora 中的容器技术”系列!本文是该系列文章中的第一篇,它将说明你可以怎样使用 Fedora 中各种可用的容器技术。本文将学习 systemd-nspawn 的相关知识。

    容器是什么?

    一个容器就是一个用户空间实例,它能够在与托管容器的系统(叫做宿主系统)相隔离的环境中运行一个程序或者一个操作系统。这和 chroot 或 虚拟机 的思想非常类似。运行在容器中的进程是由与宿主操作系统相同的内核来管理的,但它们是与宿主文件系统以及其它进程隔离开的。

    什么是 systemd-nspawn?

    systemd 项目认为应当将容器技术变成桌面的基础部分,并且应当和用户的其余系统集成在一起。为此,systemd 提供了 systemd-nspawn,这款工具能够使用多种 Linux 技术创建容器。它也提供了一些容器管理工具。

    systemd-nspawn 和 chroot 在许多方面都是类似的,但是前者更加强大。它虚拟化了文件系统、进程树以及客户系统中的进程间通信。它的吸引力在于它提供了很多用于管理容器的工具,例如用来管理容器的machinectl。由 systemd-nspawn 运行的容器将会与 systemd 组件一同运行在宿主系统上。举例来说,一个容器的日志可以输出到宿主系统的日志中。

    在 Fedora 24 上,systemd-nspawn 已经从 systemd 软件包分离出来了,所以你需要安装 systemd-container 软件包。一如往常,你可以使用 dnf install systemd-container 进行安装。

    创建容器

    使用 systemd-nspawn 创建一个容器是很容易的。假设你有一个专门为 Debian 创造的应用,并且无法在其它发行版中正常运行。那并不是一个问题,我们可以创造一个容器!为了设置容器使用最新版本的 Debian(现在是 Jessie),你需要挑选一个目录来放置你的系统。我暂时将使用目录 ~/DebianJessie

    一旦你创建完目录,你需要运行 debootstrap,你可以从 Fedora 仓库中安装它。对于 Debian Jessie,你运行下面的命令来初始化一个 Debian 文件系统。

     
     
    1. $ debootstrap --arch=amd64 stable ~/DebianJessie

    以上默认你的架构是 x86_64。如果不是的话,你必须将架构的名称改为 amd64。你可以使用 uname -m 得知你的机器架构。

    一旦设置好你的根目录,你就可以使用下面的命令来启动你的容器。

     
     
    1. $ systemd-nspawn -bD ~/DebianJessie

    容器将会在数秒后准备好并运行,当你试图登录时就会注意到:你无法使用你的系统上任何账户。这是因为systemd-nspawn 虚拟化了用户。修复的方法很简单:将之前的命令中的 -b 移除即可。你将直接进入容器的 root 用户的 shell。此时,你只能使用 passwd 命令为 root 设置密码,或者使用 adduser 命令添加一个新用户。一旦设置好密码或添加好用户,你就可以把 -b 标志添加回去然后继续了。你会进入到熟悉的登录控制台,然后你使用设置好的认证信息登录进去。

    以上对于任意你想在容器中运行的发行版都适用,但前提是你需要使用正确的包管理器创建系统。对于 Fedora,你应使用 DNF 而非 debootstrap。想要设置一个最小化的 Fedora 系统,你可以运行下面的命令,要将“/absolute/path/”替换成任何你希望容器存放的位置。

     
     
    1. $ sudo dnf --releasever=24 --installroot=/absolute/path/ install systemd passwd dnf fedora-release

    设置网络

    如果你尝试启动一个服务,但它绑定了你宿主机正在使用的端口,你将会注意到这个问题:你的容器正在使用和宿主机相同的网络接口。幸运的是,systemd-nspawn 提供了几种可以将网络从宿主机分开的方法。

    本地网络

    第一种方法是使用 --private-network 标志,它默认仅创建一个回环设备。这对于你不需要使用网络的环境是非常理想的,例如构建系统和其它持续集成系统。

    多个网络接口

    如果你有多个网络接口设备,你可以使用 --network-interface 标志给容器分配一个接口。想要给我的容器分配 eno1,我会添加选项 --network-interface=eno1。当某个接口分配给一个容器后,宿主机就不能同时使用那个接口了。只有当容器彻底关闭后,宿主机才可以使用那个接口。

    共享网络接口

    对于我们中那些并没有额外的网络设备的人来说,还有其它方法可以访问容器。一种就是使用 --port 选项。这会将容器中的一个端口定向到宿主机。使用格式是 协议:宿主机端口:容器端口,这里的协议可以是 tcp或者 udp宿主机端口 是宿主机的一个合法端口,容器端口 则是容器中的一个合法端口。你可以省略协议,只指定 宿主机端口:容器端口。我通常的用法类似 --port=2222:22

    你可以使用 --network-veth 启用完全的、仅宿主机模式的网络,这会在宿主机和容器之间创建一个虚拟的网络接口。你也可以使用 --network-bridge 桥接二者的连接。

    使用 systemd 组件

    如果你容器中的系统含有 D-Bus,你可以使用 systemd 提供的实用工具来控制并监视你的容器。基础安装的 Debian 并不包含 dbus。如果你想在 Debian Jessie 中使用 dbus,你需要运行命令 apt install dbus

    machinectl

    为了能够轻松地管理容器,systemd 提供了 machinectl 实用工具。使用 machinectl,你可以使用machinectl login name 登录到一个容器中、使用 machinectl status name检查状态、使用machinectl reboot name 启动容器或者使用 machinectl poweroff name 关闭容器。

    其它 systemd 命令

    多数 systemd 命令,例如 journalctlsystemd-analyze 和 systemctl,都支持使用 --machine 选项来指定容器。例如,如果你想查看一个名为 “foobar” 的容器的日志,你可以使用 journalctl --machine=foobar。你也可以使用 systemctl --machine=foobar status service 来查看运行在这个容器中的服务状态。

    和 SELinux 一起工作

    如果你要使用 SELinux 强制模式(Fedora 默认模式),你需要为你的容器设置 SELinux 环境。想要那样的话,你需要在宿主系统上运行下面两行命令。

     
     
    1. $ semanage fcontext -a -t svirt_sandbox_file_t "/path/to/container(/.*)?"
    2. $ restorecon -R /path/to/container/

    确保使用你的容器路径替换 “/path/to/container”。对于我的容器 "DebianJessie",我会运行下面的命令:

     
     
    1. $ semanage fcontext -a -t svirt_sandbox_file_t "/home/johnmh/DebianJessie(/.*)?"
    2. $ restorecon -R /home/johnmh/DebianJessie/

    原文发布时间为:2016-07-28

    本文来自云栖社区合作伙伴“Linux中国”

    展开全文
  • systemd-nspawn可以创建最轻量级的容器(ns的意思就是namespace),本文的实验平台是Ubuntu 16.04,x86_64机器。本文的目的是:在Ubuntu中用systemd-nspawn启动一个容器,运行Debian操作系统(Jessie),并在主机...
  • systemd-nspawn 快速指南

    2017-05-02 14:47:00
    systemd-nspawn 快速指南 我目前已从 chroot(译者注:chroot可以构建类似沙盒的环境,建议各位同学先了解chroot) 迁移到 systemd-nspawn,同时我写了一篇快速指南。简单的说,我强烈建议正在使用 systemd 的用户...
  • 本文转发自:... 介绍了systemd-nspawn创建最轻量级的container。    Typically Lennart Poettering gives his conference talks about various aspects of the systemd init replacement, and hi
  • systemd linux_如何使用systemd-nspawn进行Linux系统恢复 systemd linux 只要存在GNU / Linux系统,系统管理员就需要从根文件系统损坏,意外的配置更改或其他阻止系统启动到“正常”状态的情况中恢复。 Linux发行...
  • # systemd-nspawn 运行最轻量的容器 ## 安装 - systemd-container包含所有用于启动和管理容器和虚拟机的工具; - 而debootstrap则是debian/ubuntu下用于构建一套基本的根文件系统的工具。 ``` sudo apt install ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,098
精华内容 439
热门标签
关键字:

systemd-nspawn