Создание зашифрованного тома по требованию с помощью LUKS

13

Я пытаюсь создать зашифрованную файловую систему растущего по мере необходимости в Linux. Я знаком с LUKS и cryptsetup.

Я могу создать пустой файл:

fallocate -l 512M /root/image

Я могу создать контейнер LUKS на нем:

cryptsetup -y luksFormat /root/image

А потом «открой» это:

cryptsetup luksOpen /root/image luksvolume

На этом этапе я могу просто создать файловую систему:

mkfs.ext4 -j /dev/mapper/luksvolume

Это все прекрасно и денди. Тем не менее, это не относится к части «растут по требованию».

Идея состоит в том, что копирование файла 2 Гб в зашифрованной файловой системе «расширит» изображение так, чтобы оно стало достаточно большим для размещения файла.

Это вообще возможно сделать?

Merc
источник
Почему бы не сделать файловую систему нужного размера, и какую проблему вы пытаетесь решить?
Мэтью Ифе
3
Иногда вы не знаете, насколько большой должна быть файловая система. Проблема заключается в наличии одного файла в зашифрованной файловой системе и возможности добавлять к нему сотрудников без необходимости: 1) беспокоиться о нехватке места; 2) иметь тонны неиспользуемого пространства. Плюс, возможность скопировать этот зашифрованный файл в другое место и перемонтировать его.
Merc

Ответы:

21

Да! Похоже, это возможно. Давайте проверим, как это может быть достигнуто. Обратите внимание, что это не создает истинную файловую систему роста по требованию, так как, когда файловая система достигает максимального размера разреженного файла, она сообщит об ошибках «нехватки места», если все еще нужно будет записать больше данных.

Первоначально я исследовал Thin Provisioning , широко известную технологию для экономии места в сценариях виртуализации. К сожалению, в обычных случаях использования Linux он доступен только с LVM . Поскольку это кажется немного за рамками вашего вопроса, я искал что-то еще.

Вторая концепция, которую я исследовал, это Sparse File . Это точно подходит для вашего вопроса и ... мое первоначальное сомнение было: « Хорошо. Я могу создать разреженный файл. Но что произойдет, когда я инициализирую его как контейнер LUKS? Будет ли такая инициализация распределять все доступное пространство? Если нет, что произойдет, когда я инициализирую файловую систему в таком контейнере? Будет ли mkfs.ext4выделено все доступное пространство? ". Поскольку у меня не было ответа, я решил попробовать. Итак, посмотрим, что случилось.

Начнем с моей текущей системы, где у меня всего 3,3 ГБ свободного места в /repositoryфайловой системе:

root@iMac-Chiara:~# df -h /repository
File system     Dim. Usati Dispon. Uso% Montato su
/dev/sda3       275G  258G    3,3G  99% /repository

Давайте создадим 10G sparse-файл в такой файловой системе:

root@iMac-Chiara:~# dd of=/repository/file_container.img bs=1G count=0 seek=10
0+0 record dentro
0+0 record fuori
0 byte (0 B) copiati, 0,000119606 s, 0,0 kB/s

и давайте проверим это ... это действительно редкий файл:

root@iMac-Chiara:~# ls -lh /repository/file_container.img 
-rw-r--r-- 1 root root 10G dic 12 19:48 /repository/file_container.img

ОК. Итак, у нас есть файл 10G в файловой системе, в которой ранее было 3,3 ГБ свободного места. Сколько еще свободного места у меня есть?

root@iMac-Chiara:~# df -h /repository
File system     Dim. Usati Dispon. Uso% Montato su
/dev/sda3       275G  258G    3,3G  99% /repository

Все еще 3.3G. Приятно. Sparse-файл действительно ... sparse-file ;-) Давайте сделаем шаг вперед, создав контейнер LUKS в таком файле 10G и ... посмотрим, не исчерпаем ли мы пространство:

 root@iMac-Chiara:~# losetup /dev/loop0 /repository/file_container.img
 root@iMac-Chiara:~# cryptsetup -y luksFormat /dev/loop0

 WARNING!
 ========
 Ciò sovrascriverà i dati in /dev/loop0 in modo irreversibile.

 Are you sure? (Type uppercase yes): YES
 Inserire la passphrase LUKS: 
 Verify passphrase: 
 root@iMac-Chiara:~# cryptsetup luksOpen /dev/loop0 secretfs
 Inserire la passphrase per /dev/loop0: 
 root@iMac-Chiara:~#

Итак, теперь у меня есть открытый secretsконтейнер, определенный поверх моего разреженного 10G-файла, хранящегося в файловой системе, имеющей только 3,3G свободного пространства.

Сколько еще свободного места у меня есть?

 root@iMac-Chiara:~# df -h /repository
 File system     Dim. Usati Dispon. Uso% Montato su
 /dev/sda3       275G  258G    3,3G  99% /repository

Замечательный! Все еще 3.3ГБ. Наш зашифрованный контейнер практически не требует места!

Давайте проверим, все ли в порядке или есть что-то странное с нашей настройкой:

root@iMac-Chiara:~# cryptsetup status secretfs
/dev/mapper/secretfs is active.
  type:    LUKS1
  cipher:  aes-cbc-essiv:sha256
  keysize: 256 bits
  device:  /dev/loop0
  loop:    /repository/file_container.img
  offset:  4096 sectors
  size:    20967424 sectors
  mode:    read/write

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

root@iMac-Chiara:~# mkfs.ext4 /dev/mapper/secretfs 
mke2fs 1.42.5 (29-Jul-2012)
Etichetta del filesystem=
OS type: Linux
Dimensione blocco=4096 (log=2)
Dimensione frammento=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
655360 inodes, 2620928 blocks
131046 blocks (5.00%) reserved for the super user
Primo blocco dati=0
Maximum filesystem blocks=2684354560
80 gruppi di blocchi
32768 blocchi per gruppo, 32768 frammenti per gruppo
8192 inode per gruppo
Backup del superblocco salvati nei blocchi: 
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Allocating group tables: fatto                           
Scrittura delle tavole degli inode: fatto                           
Creating journal (32768 blocks): fatto
Scrittura delle informazioni dei superblocchi e dell'accounting del filesystem: fatto

root@iMac-Chiara:~#

Похоже, это сработало, так как не было следа «из космоса». Давайте проверим:

root@iMac-Chiara:~# df -h /repository
File system     Dim. Usati Dispon. Uso% Montato su
/dev/sda3       275G  258G    3,2G  99% /repository

Хм .... так что-то случилось. Мы потеряли что - то вроде 100M пространства , но .... это ожидаемое поведение: создание файловой системы ext4 DO требует написания большого количества метаданных. Так что это нормально, что некоторое пространство было использовано в процессе создания.

Это «рабочая» файловая система EXT4?

root@iMac-Chiara:~# tune2fs -l /dev/mapper/secretfs
tune2fs 1.42.5 (29-Jul-2012)
Filesystem volume name:   <none>
Last mounted on:          <not available>
Filesystem UUID:          e63321c3-cee7-478d-a6af-cbdcaf1be1f7
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Filesystem flags:         signed_directory_hash 
Default mount options:    user_xattr acl
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              655360
Block count:              2620928
Reserved block count:     131046
Free blocks:              2541265
Free inodes:              655349
First block:              0
Block size:               4096
Fragment size:            4096
Reserved GDT blocks:      639
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8192
Inode blocks per group:   512
Flex block group size:    16
Filesystem created:       Sat Dec 12 19:58:05 2015
Last mount time:          n/a
Last write time:          Sat Dec 12 19:58:05 2015
Mount count:              0
Maximum mount count:      -1
Last checked:             Sat Dec 12 19:58:05 2015
Check interval:           0 (<none>)
Lifetime writes:          131 MB
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:           256
Required extra isize:     28
Desired extra isize:      28
Journal inode:            8
Default directory hash:   half_md4
Directory Hash Seed:      c8b3bf1b-9f05-4267-85d3-2ecfdbaa6dc3
Journal backup:           inode blocks

Да! Выглядит хорошо

Итак, теперь у нас есть файловая система EXT4, написанная внутри открытого контейнера LUKS, определенного поверх разреженного 10G-файла, хранящегося в файловой системе 3.3G.

Посмотрим, все ли работает правильно, выделив место «по требованию».

Давайте начнем с записи фиктивных данных в 500M в зашифрованную FS

root@iMac-Chiara:~# mkdir /mnt/temp
root@iMac-Chiara:~# mount /dev/mapper/secretfs /mnt/temp
root@iMac-Chiara:~# dd if=/dev/zero of=/mnt/temp/random_data.bin bs=1M count=512
512+0 record dentro
512+0 record fuori
536870912 byte (537 MB) copiati, 2,35214 s, 228 MB/s
root@iMac-Chiara:~#

Успели ли мы в создании файла?

root@iMac-Chiara:~# ls -lh /mnt/temp/random_data.bin 
-rw-r--r-- 1 root root 512M dic 12 20:09 /mnt/temp/random_data.bin

Это выглядит так.

Что случилось с нашей настоящей файловой системой?

root@iMac-Chiara:~# df -h /repository
File system     Dim. Usati Dispon. Uso% Montato su
/dev/sda3       275G  259G    2,5G 100% /repository

СХ! Мы «потеряли» чуть больше 500М. Это хорошо, кстати, так как физическое пространство действительно выделено по требованию!

Давайте сохраним еще 2 ГБ файла:

root@iMac-Chiara:~# dd if=/dev/zero of=/mnt/temp/another_random_data.bin bs=1G count=2
2+0 record dentro
2+0 record fuori
2147483648 byte (2,1 GB) copiati, 25,6539 s, 83,7 MB/s
root@iMac-Chiara:~#

Что произошло?

root@iMac-Chiara:~# ls -arlh /mnt/temp
totale 2,6G
-rw-r--r-- 1 root root 512M dic 12 20:09 random_data.bin
drwx------ 2 root root  16K dic 12 19:58 lost+found
-rw-r--r-- 1 root root 2,0G dic 12 20:13 another_random_data.bin
drwxr-xr-x 8 root root 4,0K mag 29  2015 ..
drwxr-xr-x 3 root root 4,0K dic 12 20:12 .
root@iMac-Chiara:~# df -h /repository
File system     Dim. Usati Dispon. Uso% Montato su
/dev/sda3       275G  261G    484M 100% /repository
root@iMac-Chiara:~#

Действительно мило. Что произойдет, если мы удалим файл?

root@iMac-Chiara:~# rm /mnt/temp/random_data.bin 
root@iMac-Chiara:~# sync
root@iMac-Chiara:~# ls -arlh /mnt/temp
totale 2,1G
drwx------ 2 root root  16K dic 12 19:58 lost+found
-rw-r--r-- 1 root root 2,0G dic 12 20:13 another_random_data.bin
drwxr-xr-x 8 root root 4,0K mag 29  2015 ..
drwxr-xr-x 3 root root 4,0K dic 12 20:14 .
root@iMac-Chiara:~# df -h /repository
File system     Dim. Usati Dispon. Uso% Montato su
/dev/sda3       275G  261G    484M 100% /repository
root@iMac-Chiara:~#

Как и ожидалось, с sparse-файлом поведение точно такое же, как и при тонком обеспечении: после выделения пространство памяти не может быть востребовано при удалении файла. Но в целом это нормально. Не так ли?

Поэтому на данный момент ответ на ваш вопрос должен быть полным. Правильно?


Дополнение:

Посмотрим, что произойдет, когда подчеркнутое хранилище заполнится:

root@iMac-Chiara:~# dd if=/dev/zero of=/mnt/temp/a_third_random_data.bin bs=1G count=2
2+0 record dentro
2+0 record fuori
2147483648 byte (2,1 GB) copiati, 26,7142 s, 80,4 MB/s
root@iMac-Chiara:~#

Какие? похоже, это удалось! Как это было возможно? Давайте проверим!

root@iMac-Chiara:~# ls -arlh /mnt/temp
totale 4,1G
drwx------ 2 root root  16K dic 12 19:58 lost+found
-rw-r--r-- 1 root root 2,0G dic 12 20:17 a_third_random_data.bin
-rw-r--r-- 1 root root 2,0G dic 12 20:13 another_random_data.bin
drwxr-xr-x 8 root root 4,0K mag 29  2015 ..
drwxr-xr-x 3 root root 4,0K dic 12 20:17 .
root@iMac-Chiara:~#

Хм ... выглядит хорошо. Мы уверены?

root@iMac-Chiara:~# df /repository
File system    1K-blocchi     Usati Disponib. Uso% Montato su
/dev/sda3       288110208 275070448         0 100% /repository

у нас кончилось пространство! Безо всяких ошибок!

Даже если было бы неплохо выяснить, что на самом деле произошло ... Я оставлю это на ваше усмотрение и / или навыки устранения неполадок других участников ServerFault ;-)

Веселиться!


Кстати, я проверил все вышеперечисленное, здесь:

root@iMac-Chiara:~# cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=13.04
DISTRIB_CODENAME=raring
DISTRIB_DESCRIPTION="Ubuntu 13.04"
root@iMac-Chiara:~# uname -r
3.8.0-31-generic
root@iMac-Chiara:~# dpkg -l cryptsetup-bin
[...]
ii  cryptsetup-bin             2:1.4.3-4ubuntu2   amd64              disk encryption support - command line tools
root@iMac-Chiara:~#
Дамиано Верзулли
источник
Я заметил, что для работы этих команд вы должны быть пользователем root. Это всегда так для разреженных файлов?
Merc
Нет простите. Они также должны работать как обычные пользователи, если у них есть права на запись в основную папку.
Дамиано Верзулли
Спасибо за этот отличный ответ. Оставляет меня с вопросом и беспокойством. Беспокоиться: притворяться, что успешно записал второй файл объемом 2 ГБ, когда на нем действительно не было места? Неприятно ... Что происходит, когда вы пытаетесь прочитать его обратно (с помощью sha1sum или чего-то еще)? Вопрос: Существуют ли способы резервного копирования разреженного файла по сети, который сохраняет его разреженным (т.е. фактически копирует только те части, которые используются)?
Тило
У меня было искушение продолжить расследование, но ... к сожалению, у меня не хватило времени, и, действительно, это определенно место, подходящее для другого вопроса SF. В любом случае, этого можно легко избежать, не перебирая общий объем хранилища: я имею в виду, что вы можете создавать разреженные файлы, но ... чтобы иметь максимальный общий объем выделяемого пространства на физическом диске. Не так ли? Если вместо этого вы ищете решения для "перебронирования" .... чем, может быть, нужно
заняться
@Thilo Мне также любопытно, что произойдет, если вы попытаетесь прочитать файл, который молча переполнился. rsyncесть --sparseопция, которая должна создавать разреженные файлы на целевом диске.
localhost