Создание grow-on-demand зашифрованного тома с LUKS

Я пытаюсь создать зашифрованный, выращиваю по мере необходимости файловую систему в с 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

Это все великолепно. Однако это не обращается к "grow-on-demand" части вопроса.

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

Даже возможно сделать?

10
задан 4 June 2015 в 12:11
1 ответ

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

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

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

Давайте начнем с моей текущей системы, где у меня только 3.3G свободного места в файловой системе /репозитория:

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

Давайте создадим 10G разреженный файл в такой файловой системе, с:

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

OK. Итак, у нас есть 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.3G. Хорошо. Sparse-файл на самом деле... разреженный файл ;-) Давайте сделаем шаг вперед, создав контейнер 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:~#

Итак, теперь у меня есть открытый secretts контейнер, определенный поверх моего 10G sparse-файла, который хранится в файловой системе, имеющей только 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

Uhm...., так что что-то случилось. Мы потеряли что-то вроде 100 Мб пространства, но.... это ожидаемое поведение: создание файловой системы 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, определенном поверх 10Гб разреженного файла, хранящегося в файловой системе 3.3Гб.

Давайте посмотрим, все ли работает правильно, выделив место "по требованию".

Давайте начнем с записи 500М поддельных данных в зашифрованный 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

Uau! Мы "потеряли" более 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:~#

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

Итак, на данный момент ответ на ваш вопрос должен быть полным. Верно?


Добавление:

Давайте посмотрим, что произойдет, когда хранилище с подчёркиванием будет заполнено:

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 ;-)

Развлекайтесь!


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

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:~#
18
ответ дан 2 December 2019 в 22:04

Теги

Похожие вопросы