На изображениях петли
Прежде всего, забудьте offset=
, используйте losetup --partscan
и просто смонтируйте раздел через /dev/loop0p1
.
# losetup --partscan /dev/loop0 myimage.img # lsblk # mount /dev/loop0p1 /mnt
Чтобы эффективно очистить пустое пространство внутри раздела, запустите fstrim
файловую систему, смонтированную на петле, так же, как на SSD. (Это фактически сделает файл изображения разреженным.)
# fstrim -v /mnt
При изменении размера разделов
Но сейчас вам не нужно очищать пустое пространство или делать что-то подобное. Заполнена ли область, которую нужно урезать, нулями или порциями старых данных, совершенно не имеет значения.
Вместо этого вам нужно сделать то же самое, что и с ext4 на реальном диске - вам нужно сжать каждый слой изнутри. Вы не можете пропустить шаги только потому, что это изображение.
Чтобы сжать раздел, содержащий файловую систему, вы должны сначала указать файловой системе сжать себя. Для ext2 / 3/4 это делается с помощью resize2fs
. Это переместит данные, которые могут находиться в области, которую вы собираетесь отрубить, и сохранит новые границы как часть метаданных файловой системы. (Я полагаю, это то, что вы подразумевали под «дефрагментацией».)
Только после того, как файловая система была сокращена, вы также можете сжать раздел, содержащий ее. Это можно сделать с помощью parted или fdisk, просто изменив конечный адрес раздела.
Примечание: у вас должна быть возможность использовать GParted для изменения размера файловой системы и раздела за один шаг - если он поддерживает работу на петлевых устройствах, то есть. Это может зависеть от версии GParted. (Однако CLI parted не может сжать файловые системы, он просто усекает раздел.)
Наконец, после изменения размера файловой системы и раздела вы можете обрезать весь образ, содержащий их. Для этого сначала отсоедините петлевое устройство и используйте его truncate --size=...
в своем файле изображения.
(Чтобы сделать это безопасно, без необходимости делать тщательные вычисления, я бы сжал файловую систему немного больше, чем нужно для создания некоторого «буферного» пространства; например, если бы я хотел образ 4 ГБ, я бы сжал файловую систему до 3 ГБ, раздел до 3,5 ГБ, а затем обрежьте изображение до 4 ГБ. Затем увеличьте все в обратном порядке, чтобы заполнить пространство «буфера».)