Вопрос или проблема
Я пытаюсь уменьшить образ файловой системы до минимально возможного размера. Меня устраивает, что resize2fs оставляет зарезервированные блоки файловой системы на месте, но он оставляет около 400 Мб свободного пространства в файловой системе после операции уменьшения.
Вот шаги, которые я выполняю:
aj@pop-os:~/disk_images$ sudo losetup -fP --show mcard.img
/dev/loop0
aj@pop-os:~/disk_images$ sudo zerofree -v /dev/loop0p1
112082/2671282/3665210
aj@pop-os:~/disk_images$ sudo e2fsck -f /dev/loop0p1
e2fsck 1.46.5 (30-Dec-2021)
Проход 1: Проверка инодов, блоков и размеров
Проход 2: Проверка структуры каталогов
Проход 3: Проверка соединения каталогов
Проход 4: Проверка ссылок
Проход 5: Проверка информации о группах
/dev/loop0p1: 191007/917504 файлов (0.3% несмежных), 993928/3665210 блоков
aj@pop-os:~/disk_images$ sudo resize2fs -Mp /dev/loop0p1
resize2fs 1.46.5 (30-Dec-2021)
Изменение размера файловой системы на /dev/loop0p1 до 1115084 (4k) блоков.
Начинаем проход 2 (макс = 3444)
Перемещение блоков XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Начинаем проход 3 (макс = 112)
Сканирование таблицы инодов XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Файловая система на /dev/loop0p1 теперь длиной 1115084 (4k) блоков.
Все, похоже, работает нормально, и файловая система уменьшилась с 16 Гб до 4.1 Гб. Однако в файловой системе все еще остается свободное пространство:
aj@pop-os:~/disk_images$ sudo mount /dev/loop0p1 xmnt/
aj@pop-os:~/disk_images$ df -h xmnt/
Файловая система Размер Использовано Свободно Использ. % Смонтирована в
/dev/loop0p1 4.1G 3.5G 434M 90% /home/aj/disk_images/xmnt
aj@pop-os:~/disk_images$ sudo umount xmnt/
aj@pop-os:~/disk_images$ sudo dumpe2fs -h /dev/loop0p1
(Вывод сокращен для читаемости)
Количество блоков: 1115084
Количество зарезервированных блоков: 47712
Свободные блоки: 162785
Размер блока: 4096
Как вы можете видеть, после уменьшения файловой системы как утилита df
, так и dumpe2fs
показывают, что в образе файловой системы осталось свободное пространство.
Почему это происходит и как можно заставить resize2fs действительно уменьшить размер файловой системы так, чтобы не было свободного пространства, кроме зарезервированных блоков?
Похоже, что есть две вещи, которые resize2fs не может изменить:
- “Индексы на группу”, как сообщает
tune2fs -l
. - Соотношение байт по иноду, установленное с помощью параметра
-i
командыmke2fs
.
Это означает, что должно быть некоторое минимальное количество инодов и некоторый минимальный размер в байтах для файловой системы. Это оставляет свободное пространство. (И если у вас будет достаточно маленьких файлов, может потребоваться сохранить дополнительное пространство для инодов, что требует больше байт в файловой системе.)
Правки:
- Я не уверен, что это вся история….
- Удаление журнала может помочь (
tune2fs -O ^has_journal /dev/...
, а затем снова без^
, чтобы добавить его обратно).
Ответ или решение
При выполнении операции сжатия файловой системы с помощью resize2fs
на вашем образе диска, вы столкнулись с тем, что после завершения операции остаётся свободное пространство, которое не используется. Это может быть вызвано несколькими факторами, которые подробно будут объяснены ниже.
Причины, по которым остаётся свободное пространство:
-
Минимальные параметры файловой системы: Как вы уже отметили, некоторые параметры, такие как количество инодов на группу и соотношение байт на инод, не могут быть изменены после создания файловой системы с помощью утилиты
mke2fs
. Эти параметры задают структуру файловой системы и могут создавать «неиспользуемое» пространство, которое остается после сжатия. -
Иноды: Каждый файл и директория в файловой системе требует инод. Если в файловой системе создано большее количество инодов, чем необходимо для текущего количества файлов, это может привести к дополнительному выделению пространства, которое не может быть перераспределено. Ваша файловая система может иметь больше инодов, чем необходимо для хранения существующих файлов, что приводит к показателю свободного места.
-
Резервированные блоки: Проверьте, сколько резервированных блоков указано в выводе команды
dumpe2fs
. Они предназначены для использования привилегированными пользователями (обычно это около 5% от объёма файла). Эти блоки остаются зарезервированными до тех пор, пока они не будут перераспределены.
Предложения по устранению проблемы:
-
Настройка параметров инодов: Для уменьшения свободного пространства можно попробовать пересоздать файловую систему с оптимизированными параметрами, такими как уменьшенное количество инодов или изменения в соотношении байт на инод. Это можно сделать с помощью параметров
-i
при создании файловой системы сmke2fs
. Для этого вам нужно будет сначала создать резервную копию данных. -
Удаление журнала: Как вы упомянули, удаление журнала может освободить дополнительные блоки. Используйте команду
tune2fs -O ^has_journal /dev/loop0p1
для удаления журнала и затемtune2fs -O has_journal /dev/loop0p1
для его повторного добавления. Обратите внимание, что это может повлиять на консистенцию данных в случае сбоя. -
Очистка лишних файлов: Убедитесь, что нет неиспользуемых файлов и директорий на файловой системе, которые занимают место. Используйте такие утилиты, как
du
илиncdu
, для определения и очистки ненужных файлов. -
Пересоздание файловой системы: Если ваша цель — максимально уменьшить размер, возможно, стоит пересоздать файловую систему с нуля с правильными настройками параметров при создании, чтобы избежать оставшегося свободного пространства. Сначала сделайте резервную копию ваших данных, а затем используйте
mke2fs
с нужными параметрами.
Заключение
Таким образом, главное решение вашей проблемы заключается в правильной настройке параметров файловой системы при её создании. Однако, если данная файловая система уже существует, вам, возможно, придётся пересоздать её или оптимизировать имеющиеся настройки с помощью утилиты tune2fs
и удаления журнала.