3

При поиске причин, по которым невозможно изменить размер смонтированного раздела, я в основном нашел ответы вроде этого:

  • Это зависит от файловой системы и раздела, разные файловые системы и разделы будут использовать разные методы. - Хавьер Ривера

  • Сначала вы должны расширить базовое блочное устройство. Если вы используете обычный раздел на одном жестком диске, это невозможно. LVM и mdadm могут расширить блочное устройство, затем вы можете запустить resize2fs, чтобы расширить fs (предполагая, что это ext [234]). - по psui

  • Это действительно зависит от файловой системы, которую вы используете [...], но настоятельно НЕ рекомендуется изменять размер смонтированного, используемого раздела. - Луис Альварадо

Non объясняет, почему это невозможно (потому что никто не спросил), только упоминая, что это зависит от файловой системы или вообще невозможно, если раздел не является логическим томом.


Я вообще ничего не знаю о внутренней работе процесса монтирования и обработки разделов / файловых систем операционной системы, но я спрашиваю себя, почему программа разметки не может предложить пользователю закрыть все процессы и после этого сохранить остальные процессы и копия данных им нужны в оперативной памяти и размонтирует раздел для изменения его размера.

2 ответа2

3

На самом деле, можно изменить размер многих современных файловых систем , в то время как они установлены (хотя обычно только при увеличении их размеров). Например:

  • От man resize2fs: «Программа resize2fs ... может быть использована для увеличения или уменьшения размонтированной файловой системы ... Если файловая система смонтирована, ее можно использовать для увеличения размера смонтированной файловой системы .... »
  • От man xfs_growfs: «Файловая система должна быть смонтирована для увеличения ».
  • Из man mount: " Параметры монтирования для jfs ... resize = value... Измените громкость на значения блоков. JFS поддерживает только увеличение объема, но не уменьшение его. "
  • Из BTRFS Fun: «И да, это он-лайн изменение размера, нет необходимости размонтировать / сжать / смонтировать. Так что никаких простоев!"

AFAIK, ReiserFS не может быть изменен при монтировании.

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

Тем не менее, GParted не может изменять размеры разделов, не отключая их. Я не уверен, но я подозреваю, что это больше связано со стороной раздела уравнения, чем со стороной файловой системы; или может быть так, что разработчики GParted были консервативны и устанавливали требования наименьшего общего знаменателя (а именно, для ReiserFS).

Определенно легче справиться с изменением размера файловых систем, когда они хранятся в настройке LVM. Этот тип конфигурации означает, что вам никогда не придется перемещать начальную точку файловой системы, поэтому вы можете при необходимости увеличить логический том и файловую систему, в которой он находится, десятки раз, даже в пространство, занимаемое файловыми системами, которые раньше присутствовали. но это вы удалили. LVM также был разработан с учетом динамических изменений логических томов, тогда как обработка разделов ядром более статична. Если вы часто настраиваете свои файловые системы, вам определенно стоит взглянуть на LVM. У LVM есть некоторая кривая обучения, но это стоит хлопот любому, кто продвигает или часто манипулирует файловой системой.

2

Файловые системы реализуют некоторые API ядра. Поэтому им необходимо предоставить функции для открытия файла по имени, записи в файл, чтения из файла и повторного закрытия файла (просто придерживайтесь этих основных операций).

Ядро предоставляет функции для чтения сектора и записи сектора.

Волшебное промежуточное звено создается файловой системой "драйвер". Поэтому, если программа хочет открыть файл, ядро передает этот запрос драйверу файловой системы. Затем драйвер считывает метаданные файловой системы и находит запись для файла. Запись содержит информацию о файловой системе, такую как информация о владельце и группе, правах доступа, времени доступа и т.д., И, конечно, информация о секторе, в котором находится файл на диске (давайте проигнорируем фрагментацию здесь).

Таким образом, если вы возьмете весь раздел и переместите его в другое место на диске, все сохраненные номера секторов теперь будут иметь смещение, но файловая система не знает этого смещения. Таким образом, если программа затем пытается открыть файл, файловая система будет использовать номер сектора, сохраненный в метаданных файловой системы, для чтения содержимого файла. Но поскольку вся файловая система перемещается на несколько секторов дальше, считанные данные не будут соответствовать содержимому файла, и файл поврежден. То же самое касается всего остального в файловой системе.

Ядро ничего не знает об этом. Водитель просит прочитать сектор. Ядро не знает, должен ли номер сектора иметь смещение или нет. Так что это то, что должно быть реализовано во всех драйверах файловой системы.

Теперь представьте (унаследованную) файловую систему, которая использует 16 бит для адресации секторов. Давайте предположим, что сектор составляет 512 байт. Таким образом, максимальный размер файловой системы может составлять 32 МБ. Если вы хотите еще больше расширить файловую систему, она должна изменить размер адресуемого сектора с 512 байт до 1024 байт. Но даже сейчас файловая система заполнена, потому что используются все номера секторов. Поэтому программе расширения файловой системы необходимо отсканировать все файлы и скопировать два сектора размером 1024 байта, но только 512 байтов, в один сектор, чтобы один сектор был переполнен (снова), а другой мог быть освобожден.

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

Кроме того, под капотом больше магии. Вы можете, например, создать файл, открыть его и удалить его. У файла больше нет представления в файловой системе (у него нет имени файла), но, поскольку открытый дескриптор все еще существует, файл все еще может быть прочитан и записан. Если программа, содержащая fork дескриптора s, даже дети могут получить доступ к этому файлу, поскольку они наследуют дескриптор. Как только все открытые дескрипторы этого файла будут close d, файловая система пометит сектора как неиспользуемые, готовые для использования в новых файлах.

Поэтому, если вы unmount файловую систему, а затем снова mount ее, эти файлы исчезнут. И программа застряла.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .