Ситуация: хранилище из примерно 2 млн весьма мелких файлов, внутри контейнера-в-файле, где все 20 Гб места кончились.
Задача: Расширить контейнер, не занимаюсь долгим и муторным копированием 2 млн мелких файлов.
Монтирование делается вот таким скриптом:
#!/bin/bash
cnt=’/path/to_container.fs’
trg=’/mnt/FS1′;
lpd=’/dev/loop0′;
umount $trg
losetup -d $lpd
losetup $lpd $cnt
mount $lpd $trg
Сперва отключаем точку монтирования, потом устройство от файла:
umount /dev/loop0
losetup -d /dev/loop0
После этого обязательно бэкапим файл-контейнер, ибо все следующие команды — ЧРЕЗВЫЧАЙНО ОПАСНЫ.
Затем ОЧЕНЬ аккуратно дописываем нужное число нулей. Для этого сперва надо точно вычислить размер исходного файла. В моём случае файл был ровно 20480 блоков по 1М, поэтому команда вот такая:
dd if=/dev/zero of=/path/to_container.fs bs=1M seek=20480 count=10240
В данном случае мы будем оперировать целыми блоками размером по 1М (1048576 байт), дописав примерно 10 Гб в файл, пропустив ровно 20480 блоков (точный размер файла). Оперирование точными размерами тут очень важно. Можно конечно воспользоваться командой cat, и просто склеить старый файл на 20 Гб с новым на 10 Гб, но это а) дольше б) требует дополнительного свободного места.
После чего снова прицепляем файл к виртуальному устройству:
losetup /dev/loop0 /path/to_container
Затем проверяем старую ФС:
fsck /dev/loop0
И просто говорим сделать хорошо и красиво:
resize2fs /dev/loop0
После чего монтируем:
mount /dev/loop0 /mnt/FS1