Почему монтирование происходит поверх существующего directory?

Вы можете создать демона процесс, который запускается от имени пользователя root. Процесс запускает определенные команды, которые вы записываете в определенный файл с правами root. Белый список команд определит, будет ли данная команда запущена или проигнорирована. Таким образом, вы эффективно создаете выборочную команду sudo .

Обратите внимание, однако, что написать такого демона не так просто.

53
23.12.2015, 10:21
2 ответа

Если mount (2) требовал создания нового каталога в качестве точки монтирования, вы не могли ничего смонтировать в файловой системе, доступной только для чтения. Это было бы глупо, поэтому мы можем это исключить.

Если бы при монтировании опционально был создан новый каталог, который будет точкой монтирования, это было бы странно. Это не похоже на то, чтобы монтирование / размонтирование происходило постоянно, поэтому добавление дополнительной логики в ядро ​​для выполнения этих двух шагов с помощью одного системного вызова не будет важным ускорением. Просто оставьте это на усмотрение пользователя, чтобы сделать системный вызов mkdir (2) , если он этого хочет. Ответ Дмитрия указывает на то, что если mount (2) выполняет обе функции, это сделает его неатомарным. И вам нужен дополнительный аргумент для mount (2) с флагами режима, такими как open (2) принимает, для O_CREAT , O_EXCL ] и т. д. Это было бы просто глупо по сравнению с тем, чтобы позволить это делать пользовательскому пространству.

Или, может быть, вы спрашивали о том, чтобы mount (8) (традиционная программа, которая заставляет системные вызовы mount (2) ) делать это? Это было бы возможно, но для этой работы уже существует mkdir (1) , а дизайн Unix основан на хороших небольших инструментах, которые можно комбинировать. Если вам нужен инструмент, который делает и то, и другое, легко написать сценарий оболочки, чтобы собрать этот инструмент из двух более простых инструментов. (Или, как прокомментировал Муру, udisksctl уже делает это, поэтому вам не нужно его писать.) Кроме того, обычное mount (8) Linux от util-linux поддерживает mount -o x-mount.mkdir [= mode] с использованием синтаксиса x- для параметров пользовательского пространства, а не параметров, передаваемых в файловую систему.


Теперь более интересный вопрос: зачем вообще должен быть каталог в родительской файловой системе?

Как указывает ответ pjc50 (никакого отношения, хотя у него есть мои инициалы!), Появляются точки монтирования в списках каталогов тогда потребуется дополнительная проверка каждого readdir () .

Наличие точек монтирования в виде каталогов в каталоге, содержащем их (в родительской FS), - это хороший трюк. readdir () вообще не должен замечать, что это точка монтирования. Это происходит только , если точка монтирования используется как компонент пути. При разрешении пути, конечно, необходимо проверять таблицу монтирования для каждого компонента каталога пути.

20
27.01.2020, 19:33

Меня тоже всегда это интересовало.

Простая оболочка, такая как:

#!/bin/sh
eval "mkdir -p \"\$$#\"" 
/bin/mount "$@"  

, сохраненная как исполняемый скрипт с именем mount в каталоге, переопределяющем / bin в вашем PATH, должна позаботиться об этом, если вас это тоже беспокоит много

(Перед запуском фактического двоичного файла mount он создает каталог, названный в честь последнего аргумента mount , если такой каталог еще не существует.)


В качестве альтернативы , если вам не нужны неудачные вызовы оболочки mount для создания каталогов, вы можете сделать:

#!/bin/sh
set -e
eval "lastArg=\"\$$#\""
test -d "$lastArg" || { mkdir "$lastArg"; madeDir=1; }
/bin/mount "$@"  ||  {  test -z "$madeDir" || rmdir "$lastArg"; }
2
27.01.2020, 19:33

Теги

Похожие вопросы