Файловые системы реализуют некоторые API ядра. Поэтому им необходимо предоставить функции для открытия файла по имени, записи в файл, чтения из файла и повторного закрытия файла (просто придерживайтесь этих основных операций).
Ядро предоставляет функции для чтения сектора и записи сектора.
Волшебное промежуточное звено создается файловой системой "драйвер". Поэтому, если программа хочет открыть файл, ядро передает этот запрос драйверу файловой системы. Затем драйвер считывает метаданные файловой системы и находит запись для файла. Запись содержит информацию о файловой системе, такую как информация о владельце и группе, правах доступа, времени доступа и т.д., И, конечно, информация о секторе, в котором находится файл на диске (давайте проигнорируем фрагментацию здесь).
Таким образом, если вы возьмете весь раздел и переместите его в другое место на диске, все сохраненные номера секторов теперь будут иметь смещение, но файловая система не знает этого смещения. Таким образом, если программа затем пытается открыть файл, файловая система будет использовать номер сектора, сохраненный в метаданных файловой системы, для чтения содержимого файла. Но поскольку вся файловая система перемещается на несколько секторов дальше, считанные данные не будут соответствовать содержимому файла, и файл поврежден. То же самое касается всего остального в файловой системе.
Ядро ничего не знает об этом. Водитель просит прочитать сектор. Ядро не знает, должен ли номер сектора иметь смещение или нет. Так что это то, что должно быть реализовано во всех драйверах файловой системы.
Теперь представьте (унаследованную) файловую систему, которая использует 16 бит для адресации секторов. Давайте предположим, что сектор составляет 512 байт. Таким образом, максимальный размер файловой системы может составлять 32 МБ. Если вы хотите еще больше расширить файловую систему, она должна изменить размер адресуемого сектора с 512 байт до 1024 байт. Но даже сейчас файловая система заполнена, потому что используются все номера секторов. Поэтому программе расширения файловой системы необходимо отсканировать все файлы и скопировать два сектора размером 1024 байта, но только 512 байтов, в один сектор, чтобы один сектор был переполнен (снова), а другой мог быть освобожден.
Теперь представьте, что это нужно сделать, когда файловая система смонтирована, а программы с радостью читают и записывают данные с диска и на диск. Это добавляет некоторую сложность драйверу файловой системы, который требуется только для этого особого варианта использования. Таким образом, проще просто изменить размер файловой системы, когда она не смонтирована.
Кроме того, под капотом больше магии. Вы можете, например, создать файл, открыть его и удалить его. У файла больше нет представления в файловой системе (у него нет имени файла), но, поскольку открытый дескриптор все еще существует, файл все еще может быть прочитан и записан. Если программа, содержащая fork
дескриптора s, даже дети могут получить доступ к этому файлу, поскольку они наследуют дескриптор. Как только все открытые дескрипторы этого файла будут close
d, файловая система пометит сектора как неиспользуемые, готовые для использования в новых файлах.
Поэтому, если вы unmount
файловую систему, а затем снова mount
ее, эти файлы исчезнут. И программа застряла.