1: 替代chroot、docker,使用systemd-nspawn容器搭建ARM交叉编译环境(1) 2: 替代chroot、docker,使用systemd-nspawn容器搭建ARM交叉编译环境(2)
上一篇说到了systemd-nspawn的基本使用方法,这边来说一下他的一些贴心功能
systemd-snpawn文件主属问题
systemd-nspawn -D
与systemd-nspawn -bD
启动的系统文件主属并不一致,要注意在systemd-nspawn -D
下尽量少做操作,毕竟我们主要是在systemd-nspawn -bD
模式下面操作的,出现主属无法识别的时候我们只能强制使用chmod重设一下主属。
共享主机文件夹
共享文件夹很简单,只需要在启动的时候添加–bind参数即可,要注意路径必须使用绝对路径:
#默认容器中的目录与主机一致
sudo systemd-nspawn -bD ./ubuntu20.04 --bind $PWD/主机目录
#指定容器中的目录
sudo systemd-nspawn -bD ./ubuntu20.04 --bind $PWD/主机目录:容器中的目录
图形化
systemd-nspawn运行图形界面不需要安装xorg、wayland这些显示服务端,都是借助主机上已有的服务端来运行,这样显示服务才不会争抢显卡。运行图形界面有两种方式,一种是借助主系统的Xorg 一种是直接采用systemd-nspawn系统的Xephyr,Xorg的方式需要在另一个tty中启动一个xorg服务,不能与主机共享显示器,所以这里只介绍Xephyr方式,这种方式比较方便。
在主机上先安装一下Xephyr:
sudo apt install xserver-xephyr
启动一个X服务:
Xephyr :1 -resizeable
我们使用:1这个端口,不和主机冲突,启动完成的样子:
图形服务有了,我们该启动一个带图形配置的容器了,X 在 /tmp 文件夹中存储一些必要的文件。为了使容器能显示任何内容,它需要访问这些文件。为此,当启动容器时,请追加 --bind-ro=/tmp/.X11-unix 选项:
sudo systemd-nspawn -bD ./ubuntu20.04 --bind-ro=/tmp/.X11-unix
进入容器之后我们就可以随意启动图形程序,DISPLAY环境变量可以设置到系统中,在完整启动模式下无法从外部传入。
DISPLAY=:1 xterm
开机启动
因为是systemd那一套的东西,自然开机启动什么的自然也是无缝衔接的,我们只需要写一个systemd启动服务即可。
vim /lib/systemd/system/server-name.service
填写如下内容
[Unit]
Description=”系统名称“
After=network.target systemd-resolved.service
PartOf=machines.target
Before=machines.target
RequiresMountsFor=/var/lib/machines
[Service]
ExecStart=/usr/bin/systemd-nspawn -bD “容器文件夹位置”
KillMode=mixed
Type=notify
RestartForceExitStatus=133
SuccessExitStatus=133
WatchdogSec=3min
Slice=machine.slice
Delegate=yes
TasksMax=16384
DevicePolicy=closed
DeviceAllow=/dev/net/tun rwm
DeviceAllow=char-pts rw
DeviceAllow=/dev/loop-control rw
DeviceAllow=block-loop rw
DeviceAllow=block-blkext rw
DeviceAllow=/dev/mapper/control rw
DeviceAllow=block-device-mapper rw
[Install]
WantedBy=machines.target
启动容器
sudo systemctl start server-name.service
停止容器
sudo systemctl stop server-name.service
设置开机自起
sudo systemctl enable server-name.service
参考
freedesktop: 官方文档 archwiki: systemd-nspawn (简体中文)