Как создать блочное устройство, которое "просто помещает" файлы в подкаталог?

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

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

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

Я не думаю, что это имеет большое значение, какого рода блочное устройство я создаю, но если вы считаете, что это важно, я создаю том EBS на Amazon EC2.

Так есть ли у кого-нибудь комментарии о том, как лучше это сделать?

Вот мой код Python для расчета размера каталога:

def get_directory_size(start_path=None):
    print(start_path)
    total_size = 0
    for dirpath, dirnames, filenames in os.walk(start_path):
        for f in filenames + dirnames:
            fp = os.path.join(dirpath, f)
            if os.path.islink(fp):
                # ignore symbolic links
                continue
            total_size += os.path.getsize(fp)
    return total_size

1 ответ

Решение

Если вы используете файловую систему в семействе ext (например, ext3 или ext4), вы можете начать с файловой системы, которая больше, чем нужно, а затем использовать resize2fs -M изменить размер файловой системы до минимального размера. При этом будет изменен только размер файловой системы, а не содержащего ее блочного устройства, но вы можете впоследствии изменить размер раздела или скопировать данные на новое блочное устройство соответствующего размера, если хотите.

Если для получившейся файловой системы приемлемо только чтение, вы можете использовать что-то вроде SquashFS, которая за один шаг создаст файловую систему с ее целевым размером.

Другие вопросы по тегам