如何从 bash 脚本确定文件系统的可用性?

如何从 bash 脚本确定文件系统的可用性?

如果我有一个依赖于以下其中一项的脚本:overlayfs、aufs、unionfs - 确定 bash 脚本中可用的最佳方法是什么?我想使用overlayfs,但如果不可用,则回退到aufs 或unionfs。我可以将内核版本作为猜测 - 但仅仅因为它是 >= 3.18 内核并不意味着 overlayfs 是内置的 - 是否有一种相当万无一失的方法来检查?

答案1

在 Linux 下,您可以在文件中查看正在运行的内核中有哪些文件系统类型可用/proc/filesystems。该文件的内容是内核在读取时实时构建的,因此反映了当前状态。该文件的格式有点烦人:每行要么包含 8 个空格,后跟文件系统类型,要么nodev包含 3 个空格,后跟文件系统类型。去掉每行的前 8 个字符以获取可用的文件系统类型,或使用grep -w(只要您不是在寻找名为 的文件系统类型nodev)。

if grep -qw aufs /proc/filesystems; then
  echo aufs is available
fi

这并不是完整的故事,因为文件系统驱动程序可能以当前未加载的模块的形式提供。假设您可以加载模块,如果文件系统不可用,请尝试加载它。文件系统模块具有以下形式的别名(实际模块名称通常是文件系统类型的名称,但并非总是如此)。fs-FSTYPE

if grep -qw aufs /proc/filesystems; then
  echo aufs is available
elif modprobe fs-aufs; then
  echo now aufs is available
fi

这是针对内核文件系统的。对于 FUSE 文件系统,检查fuse文件系统是否可用,并查找实现该文件系统的可执行文件。虽然您可以查找fusein /proc/filesystems,但这只能告诉您它是否可用,而不能告诉您您的程序是否有足够的权限来使用它。实践中更可靠的测试是检查是否可以写入/dev/fuse.

if [ -w /dev/fuse ]; then
  echo FUSE is available
  if type unionfs-fuse >/dev/null 2>/dev/null; then 
    echo unionfs-fuse is available
  fi
fi

相关内容