销毁Jail

销毁一个jail并不是简单的停止jail和删除jiail目录以及对应配置那么简单:

  • FreeBSD的一些文件标志的特定文件即使root用户也无法删除,需要通过 chflags 命令移除标志才能清理

销毁jail的步骤

  • 停止需要销毁的jail

停止jail
# 停止名为dev的jail
service jail stop dev
  • 使用 chflags 命令移除文件标志:

使用 chflags 命令移除文件标志
chflags -R 0 /usr/local/jails/containers/dev
  • 然后删除jail所在目录,或者zfs销毁卷:

删除zfs卷
zfs destroy zroot/jails/containers/dev
  • 清除 /etc/jail.conf/etc/jail.conf.d/ 目录下配置

无法销毁zfs问题排查

我遇到一个问题,销毁 dev-1dev-2 的两个zfs卷正常,但是尝试删除 dev 卷:

删除zfs卷
zfs destroy zroot/jails/containers/dev
删除zfs卷报错
cannot unmount '/usr/local/jails/containers/dev': pool or dataset is busy

我确定已经停止了jail( jls 已经无输出),甚至重启了操作系统,但是报错依旧。

执行 lsof | grep containers 看到如下输出:

lsof 输出确实显示有访问存在
gvfsd-tra 1766      admin   22r     VDIR  2943269321,419618350         3     34 /usr/local/jails/containers (zroot/jails/containers)
gvfsd-tra 1766      admin   23r     VDIR  2943269321,419618350         3     34 /usr/local/jails/containers (zroot/jails/containers)
gvfsd-tra 1766      admin   24r     VDIR 1197231863,1485889153        23     34 /usr/local/jails/containers/dev (zroot/jails/containers/dev)
gvfsd-tra 1766      admin   25r     VDIR 1197231863,1485889153        23     34 /usr/local/jails/containers/dev (zroot/jails/containers/dev)
lsof: WARNING: /root/.lsof_xcloud was updated.

可以看到十一个 1766 进程在使用中,这个 1766 进程如下:

仍然在使用zroot中容器目录的进程
admin      1766   0.0  0.1   46772  11748  -  S    13:33     0:00.08 /usr/local/libexec/gvfsd-trash --spawner :1.2 /org/gtk/gvfs/exec_spaw/0

这个问题在 Bug 254024 - devel/gvfs: gvfsd-trash latches to zfs volumes 已经有报告bug,看起来是Trash服务监控zfs卷存在问题(glibc问题?),例如xfce的垃圾箱回收就使用 gvfsd-trash

可以先临时杀掉 gvfsd-trash 进程来解决 zfs destroy 卡住问