Как я могу исключить один файл для монтирования со всего диска - PullRequest
1 голос
/ 01 февраля 2020

Я пытаюсь выполнить монтирование с использованием 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";

Теперь моя система root содержит каталог / et c, и я не хочу, чтобы он монтировался, поскольку процесс, использующий монтирование, меняет его.

Есть ли способ избежать монтирования конкретный каталог или сделать его односторонним изменением, чтобы изменения в монтировании не влияли на фактический.

PS - уже опробованы перечисленные варианты https://www.gnu.org/software/libc/manual/html_node/Mount_002dUnmount_002dRemount.html, но ничего не помогает. Даже MS_ReadOnly

1 Ответ

1 голос
/ 01 февраля 2020

Вы не можете исключить один файл. Чтобы исключить каталог, вы можете смонтировать что-нибудь поверх этого каталога, чтобы эффективно его скрыть. Тем не менее, вы должны быть осторожны, чтобы убедиться, что вы скрываете только каталог в монтировании bind, но не в оригинальном каталоге. Вы делаете это, делая первую привязку монтируемой частной. Используя команды оболочки, это выглядело бы так:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...