Вопрос или проблема
Я изучаю файловую систему overlay в Linux и у меня возникла проблема, которая выходит за рамки моего понимания. Может кто-нибудь объяснить технические основания этого?
mkdir ./{merged,work,upper,lower}
echo "сообщение из нижнего" >> ./lower/h
sudo mount -t overlay overlay -o lowerdir=./lower,upperdir=./upper,workdir=./work ./merged
# копируем lower/h при записи, и сохранится в lower/h
echo "сообщение из объединенного" >> ./merged/h
# проверьте содержимое файлов: merged/h и upper/h имеют одинаковое содержимое
cat ./lower/h
cat ./merged/h
cat ./upper/h
# эта команда показывает, что merged/h и lower/h имеют один и тот же inode, почему upper/h и merged/h не имеют одного и того же inode
stat ./lower/h ./upper/h ./merged/h
Я думаю, merged/h и upper/h должны иметь один и тот же inode, а lower – разные inode. Однако это не так на основе вышеуказанных экспериментальных результатов.
Ответ или решение
В системе Linux, когда мы работаем с наложенной файловой системой (overlay filesystem), возникают определенные нюансы, касающиеся инодов и структуры файлов. Давайте проанализируем, почему в вашем эксперименте файлы merged/h
и lower/h
имеют одинаковый инод, а upper/h
— другой.
Что такое инод?
Инод представляет собой структуру данных в файловой системе, которая описывает файл или каталог. Каждому файлу соответствует свой уникальный инод, который хранит информацию о владельце файла, его правам доступа, времени последнего изменения и, что важно, указатели на блоки данных, которые хранятся на диске.
Принципы работы наложенной файловой системы
Наложенная файловая система в Linux обеспечивает возможность комбинировать содержимое нескольких каталогов в один «объединенный» каталог. В вашем случае используются три уровня: lower
, upper
, и merged
.
- lowerdir: Содержит оригинальные файлы, которые изначально находятся на диске (в вашем случае — файл
lower/h
с содержимым "message from lower"). - upperdir: Содержит файлы, которые могут быть изменены или созданы. В вашем случае
upper/h
должен содержать информацию, изменённую по сравнению сlower/h
. - workdir: Используется для временных файлов и управляет метаданными при работе с наложенной файловой системой.
Почему иноды совпадают?
Когда вы используете команду echo "message from merged" >> ./merged/h
, вы фактически добавляете данные к файлу в объединенном (merged) каталоге. Если файл h
не существует в upperdir
, то система отправляет запрос к lowerdir
. В результате, так как файл в lowerdir
присутствует, система создаёт ссылку на этот файл, а не создает новый файл в upperdir
.
Таким образом:
- Когда у вас в
merged
каталоге есть только файлlower/h
, он может быть доступен как "верхний" (merged) файл, но с указанием на тот же инод. - Когда вы вносите изменения, система не меняет файл в
lower
— вместо этого создается новый файл вupper
. Таким образом,upper/h
получает свой уникальный инод, потому что он является новым файлом, созданным по результатам ваших изменений.
О разных инодах
- lower/h и merged/h имеют один и тот же инод, потому что при отсутствии файла в
upperdir
(в вашем случае так и было) наложенная файловая система возвращает ссылку на оригинал изlowerdir
. - upper/h отличается, так как был создан при модификации, он получает уникальный инод, потому что является новым объектом.
Заключение
Таким образом, отличие в инодах между файлами merged/h
и upper/h
объясняется работой наложенной файловой системы. Важным моментом является то, что экземпляры файловуются из-за различных механизмов обработки запросов к метаданным.
Для более глубокого понимания рекомендуется изучить документацию по наложенным файловым системам и принципам работы инодов в Linux. Используйте этот опыт для дальнейшего изучения и практики в области системного администрирования и работы с файловыми системами в Linux.