Увеличить файловую систему в контейнере

Posted: 2014-02-20 in IT, Security

Ситуация: хранилище из примерно 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

Обсуждение закрыто.