1: 替代chroot、docker,使用systemd-nspawn容器搭建ARM交叉编译环境(1) 2: 替代chroot、docker,使用systemd-nspawn容器搭建ARM交叉编译环境(2)

上一篇说到了systemd-nspawn的基本使用方法,这边来说一下他的一些贴心功能

systemd-snpawn文件主属问题

systemd-nspawn -Dsystemd-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这个端口,不和主机冲突,启动完成的样子:

docker创建交叉编译环境 docker 交叉编译arm_docker创建交叉编译环境


图形服务有了,我们该启动一个带图形配置的容器了,X 在 /tmp 文件夹中存储一些必要的文件。为了使容器能显示任何内容,它需要访问这些文件。为此,当启动容器时,请追加 --bind-ro=/tmp/.X11-unix 选项:

sudo systemd-nspawn -bD ./ubuntu20.04 --bind-ro=/tmp/.X11-unix

进入容器之后我们就可以随意启动图形程序,DISPLAY环境变量可以设置到系统中,在完整启动模式下无法从外部传入。

DISPLAY=:1 xterm

docker创建交叉编译环境 docker 交叉编译arm_容器_02

开机启动

因为是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 (简体中文)