c++ - 如何从整个磁盘中排除要挂载的一个文件
问题描述
我正在尝试使用 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
解决方案
您不能排除单个文件。要排除一个目录,您可以在该目录的顶部挂载一些东西以有效地隐藏它。但是,您必须小心确保仅隐藏绑定挂载中的目录,而不是原始目录中的目录。为此,您可以将第一个绑定挂载设为私有。使用 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);
推荐阅读
- entity-framework - 我无法在 .NET Core 3.1.9 中使用实体框架创建新的 Web API
- r - 正态混合分布
- python - 在 Python 中以递归方式返回由列表表示的树的节点
- cryptography - 保存使用用户密码加密的私钥是否比在数据库中存储哈希更安全?
- pandas - 根据其他列中的条件替换值
- directx - 为什么每次 OpenSharedResource 调用都会导致显存增加(泄漏)?
- r - 创建 df 时:对于一列,仅在特定行中添加值
- c - 如何使用纯 C 的指针设计函数
- docker - 如何将 rpm 安装到 /usr/bin 而不是 /opt/app-root/bin
- flutter - 如何删除 Cloud Firestore 中除一个之外的所有文档?