Назад | Перейти на главную страницу

Заменить существующее содержимое каталога во время выполнения

У меня такой сценарий:

  1. пользователи запускают программное обеспечение, установленное в / path / to / software
  2. Я создаю образ FS с файловой поддержкой с точно таким же содержимым, что и в / path / to / software
  3. Я монтирую образ с помощью loopback в режиме только для чтения в / path / to / software

После шага 3 старое содержимое каталога «затеняется» вновь смонтированным образом с точно таким же содержимым.

Может ли это каким-либо образом повлиять на пользователей, которые запустили исходное программное обеспечение до монтирования? Я провел несколько тестов, и кажется, что запущенные программы не знают о каких-либо изменениях, т.е. они продолжают работать без ошибок. Это немного удивительно, поскольку программы ранее открывали некоторые файлы (библиотеки) в старой файловой системе, которая исчезла после шага 3. Я ожидал, что дескрипторы файлов изменятся после монтирования.

Так почему же нет ошибки? Видны ли старые файлы каким-либо образом запущенным программам, несмотря на то, что содержимое каталога было затенено?

В POSIX-совместимых файловых системах открытые файлы не удаляются до тех пор, пока их больше никто не откроет. Такое же поведение используется в стандартной библиотеке tmpfile который открывает временный файл, а затем удаляет его. Дескриптор открытого файла по-прежнему может использоваться процессом, у которого есть дескриптор файла (или его дочерние элементы), но никакие другие процессы не могут открыть файл, так как имя файла больше не существует. Кажется разумным ожидать, что это также будет работать, когда mountчерез какой-то каталог.