Я пытаюсь создать в 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 ГБ в зашифрованную файловую систему «расширит» изображение, чтобы оно было достаточно большим, чтобы вместить файл.
Это вообще возможно сделать?
Да! Похоже, это возможно. Посмотрим, как этого добиться. Обратите внимание, что это не создает настоящую файловую систему с расширением по требованию, поскольку, когда файловая система достигает максимального размера разреженного файла, она сообщит об ошибках «нехватки места», если все еще необходимо записать больше данных.
Изначально я исследовал Тонкое обеспечение, хорошо известная технология для экономии дискового пространства в сценариях виртуализации. К сожалению, в обычных случаях использования Linux он, кажется, доступен только с LVM. Поскольку это кажется немного выходящим за рамки вашего вопроса, я искал что-то еще.
Вторая концепция, которую я исследовал, это Разреженный файл. Это как раз подходит для вашего вопроса и ... мое первоначальное сомнение было: "ХОРОШО. Я могу создать разреженный файл. Но что произойдет, если я инициализирую его как контейнер 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-file - это действительно ... sparse-file ;-) Давайте сделаем шаг вперед, создав контейнер LUKS в таком 10-гигабайтном файле и ... посмотрим, не закончится ли у нас место:
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
контейнер, определенный поверх моего разреженного файла размером 10 ГБ, хранящегося в файловой системе, имеющей всего 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,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
Эээ .... так что-то случилось. Мы потеряли около 100 МБ пространства, но ... это ожидаемое поведение: создание файловой системы EXT4 ДЕЛАТЬ требуют написания большого количества метаданных. Так что это нормально, что в процессе создания было использовано некоторое пространство.
Это "рабочая" файловая система 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 ГБ.
Посмотрим, все ли работает правильно, выделив место «по запросу».
Начнем с записи 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:~#
Как и ожидалось, с разреженным файлом поведение точно такое же, как при тонком выделении: однажды выделенное пространство для хранения не может быть востребовано обратно при удалении файла. Но это, в общем, нормально. Не так ли?
Итак, на данный момент ответ на ваш вопрос должен быть полным. Правильно?
Дополнение:
Давайте посмотрим, что произойдет, когда хранилище подчеркивания заполнится:
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:~#