Створення зашифрованого обсягу за потребою на вимогу за допомогою 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

Це все добре і денді. Однак він не стосується частини питання "зростаючого попиту".

Ідея полягає в тому, що копіювання файлу 2Gb в зашифровану файлову систему "розширить" зображення так, що воно буде достатньо великим, щоб містити файл.

Чи можливо це навіть зробити?


Чому б не зробити файлову систему потрібного розміру в першу чергу, і яку проблему ви намагаєтеся вирішити?
Метью Іфе

3
Іноді ти не знаєш, наскільки великою потрібно файлова система. Проблема полягає в тому, що один файл у зашифрованій файловій системі та можливість додати до нього співробітників без необхідності 1) Турбуватися про те, що не вистачить місця 2) Маючи TONS невикористаного простору. Крім того, можливість копіювати цей зашифрований файл десь в іншому місці та перекомпонувати його.
Merc

Відповіді:


21

Так! Схоже, це можливо. Давайте перевіримо, як цього можна досягти. Зауважте, що це не створює справжню файлову систему з ростом на вимогу, оскільки коли файлова система досягає максимального розміру розрідженого файлу, вона повідомлятиме про помилки "поза місця", якщо ще потрібно записати більше даних.

Спочатку я досліджував Thin Provisioning - відому технологію економії місця для зберігання у сценаріях віртуалізації. На жаль, у звичайних випадках використання 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 розріджений файл у такій файловій системі з:

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,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. Приємно. Рідкий файл насправді ... розріджений файл ;-) Давайте зробимо крок вперед, створивши контейнер 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,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 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 млн. Це добре, BTW, оскільки фізичний простір дійсно розподіляється на вимогу!

Збережемо ще один 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:~#

Я помітив, що ви повинні мати корінь, щоб ці команди працювали. Чи завжди це стосується рідких файлів?
Мерк

Ні вибач. Вони також повинні працювати як звичайні користувачі, отримуючи належний дозвіл на запис у головну папку.
Даміано Верзуллі

Дякую за цю чудову відповідь. Залишає мене питанням і хвилюванням. Турбуйтеся: прикидаєтесь, що успішно записали цей другий файл 2 Гб, коли для нього не було місця? Проблемно ... Що відбувається, коли ви намагаєтесь прочитати його назад (з sha1sum чи щось)? Запитання: Чи існують способи резервного копіювання розрідженого файлу по всій мережі, що забезпечує його розрідження (тобто лише фактично копіює використовувані частини)?
Тіло

Я був спокушений детальніше розслідувати, але .... на жаль, мені не вистачало часу, і, справді, це просто місце, яке може бути справедливим для іншого іншого питання SF. У будь-якому разі, цього можна легко уникнути, не переобробляючи загальний обсяг пам’яті: я маю на увазі, ви можете створювати розрізнені файли, але ... так, щоб у вашому фіскальному диску розмістився максимальний загальний простір. Чи не так? Якщо замість цього, ви шукаєте рішення "надбукерів" .... ніж можливо щось інше слід дослідити (LVM?)
Даміано Верзуллі

@Thilo Мені також цікаво, що трапиться, якби ти спробував прочитати файл, який мовчки переповнюється. rsyncє --sparseопція, яка повинна створювати розріджені файли на цільовому диску.
localhost
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.