systemd-nspawn 是 systemd 自帶的 container 機制, 可想成是另一個相對安全方便些的 chroot.

首先準備一個 root file system, 配合使用 systemd 的 distro 最好, 例如 debian 8.0, 產生 root file system 的指令如下
$ sudo debootstrap jessie my_debian http://ftp.jp.debian.org/debian

上面的指令會在目前目錄下建立一個 my_debian 目錄, 在裡面產生一個基於 debian 8.0 (jessie) 的最小 root file system, packages 從 http://mirrors.163.com/debian download 下來.

接下來去掉 root 密碼 (輸入 username root 無需密碼即可 login)
$ sudo chroot my_debian passwd --delete

或者直接將密碼改掉
$ sudo chroot my_debian passwd

接著就可以用新的 root file system 開機
$ sudo systemd-nspawn --directory my_debian --boot

上面的指令會產生一個新的 container, 並執行 my_debian 中的 systemd 啟動相關 services. 要結束目前的 contianer, 在一秒內連按 3 次 ctrl+], 或是執行 poweroff 命令. 想看看目前有多少 container 在執行著, 可於 host 下以 machinectl 命令查詢
$ sudo machinectl

要將 container 執行於 backgroud, 先將 rootfs 移到以下目錄中
/var/lib/container

例如

$ sudo mkdir /var/lib/container
$ sudo mv my_debian /varlib/container

然後, 以目錄名稱為 container 名啟動 systemd-nspawn 服務
$ sudo systemctl start [email protected]_debian

要讓 container 在開機時一併啟動, 執行
$ sudo systemctl enable [email protected]_debian

要連上執行中的 container, 一種方式是在 container 中安裝 ssh, 這種方式, 就需要幫每一個 container 分配 IP (這樣每個 container 都 listen 在自己 IP 上的 port 22), 或是, 如果 container 共用 IP 的話, 就要為每個 container 修改 /etc/ssh/sshd_config.

或是, 使用 machinectl 的 login 命令, 例如

$ sudo machinectl
MACHINE                          CONTAINER SERVICE         
my_debian                        container nspawn
$ sudo machinectl login my_debian

如果 machinectl 回報無法開啟 pty, 可自行啟動 [email protected], 這裡 instance 為 /dev/pts 下的 pts 編號, 隨便選一個沒人用的即可, 例如
$ sudo ln -s /lib/systemd/system/[email protected] /etc/systemd/system/getty.target.wants/[email protected]