c++ - 如何从整个磁盘中排除要挂载的一个文件

标签 c++ linux mount

我正在尝试使用 c++ 执行挂载,但我想排除一个正在挂载的特定文件,因为我不希望该文件被任何其他进程触及。

以下是我的源代码:

#include <sys/mount.h>

#define DROOT "/rd/daemon-root"

if (mkdir(DROOT, 0744) && errno != EEXIST)
    cout<<endl<<"Can't create "<<DROOT <<" (" << strerror(errno) << ")";

int r = mount("/", DROOT, "ext4", MS_BIND, NULL);
  if (r == -1)
    cout<<endl<<"Mounting of " DROOT " failed (" << strerror(errno) << ")";
  else
    cout<<endl<<DROOT<<" mounted successfully";


现在我的系统根目录包含/etc 目录,我不希望它被挂载,因为使用挂载的进程会更改它。

有什么方法可以避免挂载特定目录,或者让它以一种方式更改,这样挂载上的更改不会影响实际目录。

PS - 已经尝试过列出的选项 https://www.gnu.org/software/libc/manual/html_node/Mount_002dUnmount_002dRemount.html但没有任何帮助。甚至没有 MS_ReadOnly

最佳答案

您不能排除单个文件。要排除一个目录,您可以在该目录顶部挂载一些东西以有效地隐藏它。但是,您必须小心确保仅隐藏绑定(bind)挂载中的目录,而不是原始目录中的目录。为此,您可以将第一个绑定(bind)挂载设为私有(private)。使用 shell 命令,它看起来像这样:

mkdir $DROOT
mkdir /tmp/empty
mount -o bind --make-private / $DROOT
mount -o bind /tmp/empty $DROOT/tmp/

在 C 中(减去错误检查):
char path_to_hide[PATH_MAX];
snprintf(path_to_hide, sizeof path_to_hide, "%s/%s", DROOT, "etc");

mkdir(DROOT, 0744);
mkdir("/tmp/empty", 0);

mount("/", DROOT, NULL, MS_BIND | MS_PRIVATE, NULL);
mount("/tmp/empty", path_to_hide, NULL, MS_BIND, NULL);

关于c++ - 如何从整个磁盘中排除要挂载的一个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60016188/

相关文章:

linux - 如何在linux中从具有两个范围的url批量下载文件

linker - 为什么 "/lib/libc.so.1"挂载在solaris 10上?

c++ - 用模板函数计算中值

c++ - 将 unsigned int 分配给结构中的数组枚举时出现编译错误

Python 视频转换器包

linux - 安装的 Xen 镜像与实际驱动器不同步

linux - root 可以可靠地确定每个安装的 ("bind mount")标志,例如对于 FUSE 文件系统?

C++ 二叉搜索树通过递归插入

c++ - 堆栈与堆属性的 QT 特定差异?

C MySQL 客户端库行为