J'essaie de créer un système de fichiers crypté, en croissance selon les besoins avec Linux. Je connais LUKS et cryptsetup.
Je peux créer un fichier vide:
fallocate -l 512M /root/image
Je peux créer un conteneur LUKS dessus:
cryptsetup -y luksFormat /root/image
Et puis "l'ouvrir":
cryptsetup luksOpen /root/image luksvolume
À ce stade, je peux simplement créer un système de fichiers dessus:
mkfs.ext4 -j /dev/mapper/luksvolume
C'est très bien et dandy. Cependant, il ne traite pas la partie «croissance à la demande» de la question.
L'idée est que la copie d'un fichier de 2 Go sur le système de fichiers crypté "agrandira" l'image afin qu'elle soit suffisamment grande pour contenir le fichier.
Est-il même possible de le faire?
Réponses:
Oui! On dirait que c'est possible. Vérifions comment cela peut être réalisé. Notez que cela ne crée pas un véritable système de fichiers de croissance à la demande, car lorsque le système de fichiers atteint la taille maximale du fichier clairsemé, il signalera des erreurs de «manque d'espace» si davantage de données doivent encore être écrites.
Au départ, j'étudiais Thin Provisioning , une technologie bien connue pour économiser de l'espace de stockage dans les scénarios de virtualisation. Malheureusement, dans les cas d'utilisation courants de Linux, il ne semble être disponible qu'avec LVM . Comme cela semble un peu hors de portée de votre question, j'ai cherché autre chose.
Le deuxième concept que j'ai étudié est Sparse File . Cela correspond exactement à votre question et ... mon doute initial était: " OK. Je peux créer un fichier fragmenté. Mais que se passe-t-il lorsque je l'initialise en tant que conteneur LUKS? Une telle initialisation allouera-t-elle tout l'espace disponible? Sinon, que se passera-t-il lorsque j'initialiserai le système de fichiers dans un tel conteneur? Un
mkfs.ext4
allouera-t-il tout l'espace disponible? ". Comme je n'avais pas de réponse, j'ai décidé d'essayer. Voyons donc ce qui s'est passé.Commençons par mon système actuel, où je n'ai que 3,3 G d'espace libre dans le
/repository
système de fichiers:Créons un fichier 10G clairsemé dans un tel système de fichiers, avec:
et vérifions que ... c'est vraiment un fichier clairsemé:
D'ACCORD. Nous avons donc un fichier 10G , dans un système de fichiers qui avait auparavant 3,3G d'espace libre. Combien d'espace libre ai-je encore?
Toujours 3.3G. Agréable. Les fichiers épars sont vraiment ... des fichiers épars ;-) Allons de l'avant, en créant un conteneur LUKS dans un tel fichier 10G et ... voyons si nous manquons d'espace:
Alors maintenant, j'ai un
secrets
conteneur ouvert défini au-dessus de mon fichier fragmenté 10G stocké dans un système de fichiers ne disposant que de 3,3 G d'espace libre.Combien d'espace libre ai-je encore?
Magnifique! Encore 3,3 Go. Notre conteneur crypté ne nécessitait pratiquement pas d'espace!
Vérifions si tout va bien ou s'il y a quelque chose d'étrange avec notre configuration:
Tout semble OK alors commençons à utiliser un tel conteneur pour stocker quelque chose. Commençons par créer un système de fichiers EXT4 à l'intérieur:
Il semble que cela ait fonctionné, car il n'y avait aucune trace de «hors de l'espace». Allons vérifier:
Uhm .... donc quelque chose est arrivé. Nous avons perdu quelque chose comme 100M de l' espace , mais .... c'est un comportement attendu: la création du système de fichiers EXT4 DO nécessite l'écriture des lots de métadonnées. Il est donc normal que de l'espace ait été utilisé par le processus de création.
S'agit-il d'un système de fichiers EXT4 "fonctionnel"?
Oui! Ça a l'air bien.
Nous avons donc maintenant un système de fichiers EXT4 écrit à l'intérieur d'un conteneur LUKS ouvert défini au-dessus d'un fichier 10G clairsemé stocké dans un système de fichiers 3.3G.
Voyons si tout fonctionne correctement, en allouant de l'espace "à la demande".
Commençons par écrire 500 millions de données fictives dans le FS chiffré
Avons-nous réussi à créer le fichier?
Il en est ainsi.
Qu'est-il arrivé à notre vrai système de fichiers?
Uau! Nous avons "perdu" un peu plus de 500 millions. C'est bien, BTW, car l'espace physique est vraiment alloué à la demande!
Stockons un autre fichier de 2 Go:
Qu'est-il arrivé?
Vraiment sympa. Que se passe-t-il si nous supprimons un fichier?
Comme prévu, avec un fichier clairsemé, le comportement est exactement comme l'allocation dynamique: une fois alloué, l'espace de stockage ne peut pas être récupéré lorsque le fichier est supprimé. Mais cela, en général, est OK. N'est-ce pas?
Donc, à ce stade, la réponse à votre question devrait être complète. Droite?
Une addition:
Voyons ce qui se passe lorsque le stockage de soulignement est plein:
Quelle? on dirait qu'il a réussi! Comment cela a-t-il été possible? Allons vérifier!
Uhm ... Ça a l'air ok. Sommes-nous sûrs?
nous manquons d'espace! Sans aucune erreur!
Même si ce serait bien d'enquêter sur ce qui s'est réellement passé ... Je vais laisser cela à votre curiosité et / ou aux compétences de dépannage des autres membres de ServerFault ;-)
S'amuser!
BTW: J'ai testé tout ce qui précède, ici:
la source
rsync
a une--sparse
option qui devrait créer des fichiers épars sur le disque de destination.