Sí, parece que es posible. Vamos a comprobar cómo se puede conseguir. Ten en cuenta que esto no crea un verdadero sistema de archivos de crecimiento bajo demanda, ya que cuando el sistema de archivos alcanza el tamaño máximo del archivo disperso, informará de errores de "falta de espacio" si todavía hay que escribir más datos.
Inicialmente, estaba investigando Aprovisionamiento fino una tecnología bien conocida para ahorrar espacio de almacenamiento en escenarios de virtualización. Desafortunadamente, en los casos de uso comunes de Linux, parece estar disponible sólo con LVM . Como esto parece un poco fuera del alcance de su pregunta, busqué algo más.
El segundo concepto que he investigado es Archivo disperso . Esto se ajusta exactamente a tu pregunta y... mi duda inicial era: " DE ACUERDO. Puedo crear un archivo Sparse. ¿Pero qué pasa cuando lo inicializo como un contenedor LUKS? ¿Asignará dicha inicialización todo el espacio disponible? Si no es así, ¿qué ocurrirá cuando inicialice el sistema de archivos en dicho contenedor? ¿Se asignará un mkfs.ext4
¿Asignar todo el espacio disponible? ". Como no tenía respuesta, decidí intentarlo. Entonces, veamos qué pasó.
Empecemos por mi sistema actual, en el que sólo tengo 3.3G de espacio libre dentro del /repository
sistema de archivos:
root@iMac-Chiara:~# df -h /repository
File system Dim. Usati Dispon. Uso% Montato su
/dev/sda3 275G 258G 3,3G 99% /repository
Vamos a crear un 10G sparse-file dentro de dicho sistema de archivos, con:
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
y verifiquemos que... es realmente un archivo disperso:
root@iMac-Chiara:~# ls -lh /repository/file_container.img
-rw-r--r-- 1 root root 10G dic 12 19:48 /repository/file_container.img
BIEN. Así que tenemos un 10G en un sistema de archivos que antes tenía 3.3G de espacio libre. ¿Cuánto espacio libre tengo todavía?
root@iMac-Chiara:~# df -h /repository
File system Dim. Usati Dispon. Uso% Montato su
/dev/sda3 275G 258G 3,3G 99% /repository
Todavía 3.3G. Muy bien. Los archivos dispersos son realmente... archivos dispersos ;-) Vamos a dar un paso adelante, creando un contenedor LUKS dentro de dicho archivo de 10G y... veamos si nos quedamos sin espacio:
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:~#
Así que ahora tengo abierto un secrets
contenedor definido sobre mi archivo disperso de 10G almacenado en un sistema de archivos que sólo tiene 3,3G de espacio libre.
¿Cuánto espacio libre tengo todavía?
root@iMac-Chiara:~# df -h /repository
File system Dim. Usati Dispon. Uso% Montato su
/dev/sda3 275G 258G 3,3G 99% /repository
¡Maravilloso! Todavía 3.3GB. Nuestro contenedor encriptado no requiere casi nada de espacio.
Vamos a comprobar si todo está bien o si hay algo extraño en nuestra configuración:
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
Todo parece estar bien, así que vamos a empezar a utilizar dicho contenedor para almacenar algo. Empecemos por crear un sistema de archivos EXT4 dentro de él:
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:~#
Parece que ha funcionado, ya que no había ninguna pista de "fuera de espacio". Vamos a comprobarlo:
root@iMac-Chiara:~# df -h /repository
File system Dim. Usati Dispon. Uso% Montato su
/dev/sda3 275G 258G 3,2G 99% /repository
Uhm.... así que algo pasó. Perdimos algo así como 100M de espacio pero.... es un comportamiento esperado: la creación del sistema de archivos EXT4 DO requieren la redacción de muchos metadatos. Así que es normal que se haya utilizado algo de espacio en el proceso de creación.
¿Es un sistema de archivos EXT4 "que funciona"?
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
¡Sí! Se ve bien.
Así que ahora tenemos un sistema de archivos EXT4 escrito dentro de un contenedor LUKS abierto definido sobre un archivo disperso de 10G almacenado dentro de un sistema de archivos de 3.3G.
Veamos si todo funciona correctamente, asignando espacio "a la carta".
Comencemos escribiendo 500M de datos ficticios en el FS encriptado
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:~#
¿Hemos conseguido crear el archivo?
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
Así parece.
¿Qué pasó con nuestro sistema de archivos real?
root@iMac-Chiara:~# df -h /repository
File system Dim. Usati Dispon. Uso% Montato su
/dev/sda3 275G 259G 2,5G 100% /repository
¡Uau! Hemos "perdido" algo más de 500 millones. ¡Eso es bueno, BTW, ya que el espacio físico se asigna realmente en la demanda!
Vamos a almacenar otro archivo de 2GB:
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:~#
¿Qué ha pasado?
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:~#
Muy bonito. ¿Qué pasa si borramos un archivo?
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:~#
Como era de esperar, con sparse-file el comportamiento es exactamente igual que el thin-provisioning: una vez asignado, el espacio de almacenamiento no puede ser reclamado de nuevo cuando se eliminan los archivos. Pero esto, en general, está bien. ¿No es así?
Así que en este punto, la respuesta a su pregunta debería ser completa. ¿No es así?
Adición:
Veamos qué ocurre cuando se llena el almacén de subrayado:
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:~#
¿Qué? ¡Parece que ha tenido éxito! ¿Cómo ha sido posible? Vamos a comprobarlo.
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:~#
Uhm... Se ve bien. ¿Estamos seguros?
root@iMac-Chiara:~# df /repository
File system 1K-blocchi Usati Disponib. Uso% Montato su
/dev/sda3 288110208 275070448 0 100% /repository
¡nos hemos quedado sin espacio! ¡Sin ningún error!
Aunque sería bueno investigar lo que realmente sucedió... Voy a dejar esto a su curiosidad y / o habilidades de solución de problemas de otros miembros ServerFault ;-)
Diviértete.
BTW: He probado todo lo anterior, aquí:
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:~#