Вопрос или проблема
Снимок устройства-отображателя, хранящийся в расширяющемся файле
Существует ли способ создать блочное устройство, которое основывается на файле, увеличивающемся в размере по мере записи на блочное устройство?
Я хочу использовать снимки устройства (то есть команду dmsetup create
, которая указывает snapshot
в качестве типа создаваемого элемента), и согласно документации снимок должен храниться на блочном устройстве. Один из способов создать это блочное устройство – использовать losetup
для преобразования файла в блочное устройство. Однако это требует наличия файла фиксированного размера. Я пытаюсь разобраться, есть ли способ обойтись без файла фиксированного размера и вместо этого сделать так, чтобы файл, который служит основой для блочного устройства, которое поддерживает снимок, увеличивался по мере роста снимка.
Вы не можете сделать именно то, что хотите, но вы можете оказаться в аналогичной ситуации, просто создав очень большой файл поддержки без фактического распределения дискового пространства заранее.
Например, мы можем создать файл поддержки размером 1 ТБ следующим образом:
truncate -s1T backingfile
Смотрите, какой он большой!
$ ls -lh backingfile
-rw-r--r--. 1 lars lars 1.0T Sep 21 07:53 backingfile
Но на самом деле он не занимает никакого дискового пространства:
$ du -k backingfile
0 backingfile
Настройте это как блочное устройство с помощью losetup
и используйте его в вашей конфигурации devicemapper, и дисковое пространство будет использоваться только по мере записи.
Ответ или решение
Создание блока устройства, который поддерживается файлом, растущим в размере по мере записи на блок устройства, является интересной задачей. Важно отметить, что подход, который вы ищете, не может быть осуществлён в полной мере с использованием существующих инструментов, но есть способ достичь схожего результата.
В Linux существует возможность создания файла-объекта, который будет выглядеть как большой файл на заводе, но на самом деле не будет занимать физическое пространство на диске, пока не произойдет запись в него. Для этого вы можете воспользоваться командой truncate
. Она позволяет создать файл заданного размера, не выделяя физическое пространство на жестком диске.
Вот как можно это сделать:
- Создайте файл, который будет служить в качестве бэковерта, например, размером 1 ТБ (террабайт):
truncate -s 1T backingfile
- Этот файл теперь будет занимать место в 1 ТБ, но фактически не будет потреблять дисковое пространство:
ls -lh backingfile
du -k backingfile
ls -lh
покажет вам, что файл действительно имеет размеры 1 ТБ, но команда du -k
покажет, что он фактически использует 0 КБ на диске.
- Далее, вы сможете связать этот файл с блоком устройства, используя
losetup
. Пример:
losetup /dev/loop0 backingfile
-
Теперь вы можете использовать этот блок устройства (
/dev/loop0
) в конфигурации Device Mapper для создания снимков (snapshot). Убедитесь, что у вас установлены необходимые пакеты для работы с Device Mapper, такие какlvm2
. - Например, создайте снимок с использованием
dmsetup
, например:
dmsetup create my_snapshot --table "0 $(blocksize) snapshot /dev/loop0 /dev/real_device <parameters>"
Здесь замените $(blocksize)
на размер блока, который вы хотите использовать, и укажите реальное устройство, на которое будет сделан снимок.
С помощью этого метода, ваш файл будет «расти» в размере по мере записи данных в бэковый файл. Таким образом, вы достигнете желаемого эффекта получения растущего бэковера для снапшотов, не требующего изначально выделения большого объема дискового пространства.