Sur une nouvelle installation d'Ubuntu 14.04, je reçois ce message d'erreur lors du démarrage
le lecteur de disque pour/dev/mapper/cryptswap1 n'est pas encore prêt ou n'est pas présent
et la partition de swap n'est jamais activée. De mes recherches jusqu'à présent, j'ai trouvé:
Est-il possible d'utiliser un échange crypté sur Ubuntu 14.04 sans utiliser ce type de piratage? Je suis parfaitement à l'aise de mettre à jour tous les packages installés et de corriger ces fichiers de configuration, qui ont été initialisés avec un contenu incorrect en raison de scripts d'installation bogués. Je préfère éviter d'avoir à utiliser mon propre script pour activer l'échange, car ce type d'approche a tendance à se casser lorsque les packages sont mis à jour.
C'est ce que mon /etc/crypttab
ressemble à:
cryptswap1 /dev/sda6 /dev/urandom swap,cipher=aes-cbc-essiv:sha256,offset=16
Et la ligne pertinente de mon /etc/fstab
est:
/dev/mapper/cryptswap1 none swap sw 0 0
Ce que j'ai essayé jusqu'à présent:
J'ai trouvé le lecteur de disque de message pour/dev/mapper/cryptswap1 n'est pas encore prêt ou n'est pas présent même après avoir essayé diverses options demandant quel pourrait être le même scénario.
Mais la seule réponse suggère d'utiliser un échange non chiffré.
J'ai trouvé http://ubuntuforums.org/showthread.php?t=2200995 qui prétend avoir une solution, mais la solution n'a aucun sens pour moi.
La première partie de la solution proposée consiste à réécrire l'en-tête de swap chiffré à l'aide de mkswap. Cependant, comme cet en-tête est chiffré avec une clé qui n'est pas persistante lors des redémarrages, cette étape n'aiderait pas à faire fonctionner le swap après le prochain redémarrage.
Il suggère également des mises à jour de/etc/fstab, mais il semble que mon fstab regarde déjà correctement.
Le post suppose LVM, que je n'utilise pas. Je ne suis au courant d'aucune façon, cela ferait une différence.
J'ai trouvé https://bugs.launchpad.net/ubuntu/+source/ecryptfs-utils/+bug/1310058 ce qui m'a aidé à comprendre le problème avec l'en-tête de swap en cours d'écrasement et l'ajout de offset
to crypttab
et la régénération de l'en-tête de swap non chiffré peut résoudre ce problème.
Cependant l'en-tête écrasé n'est pas le seul problème en jeu, il y a un autre problème, que je ne comprends pas encore complètement.
Autres choses que j'ai découvertes sur le problème:
De la lecture /lib/cryptsetup/cryptdisks.functions
J'ai appris qu'au démarrage, l'appareil est censé être créé avec le nom cryptswap1_unformatted
alors l'en-tête de swap chiffré doit être écrit et le périphérique doit être renommé en cryptswap1
. Dans le journal du noyau, je trouve ce message d'erreur:
[ 39.419429] device-mapper: ioctl: Unable to change name on mapped device cryptswap1_unformatted to one that already exists: cryptswap1
De façon confuse, le résultat est que l'appareil finit par avoir le nom cryptswap1
, mais l'en-tête swap
n'a jamais été écrit.
Swap fonctionne pendant les démarrages où une vérification du système de fichiers a été effectuée. Ce n'est que lorsqu'aucune vérification du système de fichiers n'est effectuée, que j'obtiens le redouté cryptswap1 is not ready yet
Erreur.
Dans /var/log/upstart/cryptdisks.log
Je trouve le message d'erreur
Device cryptswap1_unformatted already exists.
Cependant, en ajoutant une journalisation supplémentaire à /lib/cryptsetup/cryptdisks.functions
, J'ai appris qu'il y a une course entre /etc/init.d/cryptdisks-early
et /etc/init/cryptdisks.conf
. Toute journalisation que j'ajoute à cryptdisks.functions
peut influencer la façon dont les actions des deux scripts sont entrelacées, et parfois, cela finit par fonctionner.
Il est clair que les deux ne sont pas censés gérer le même appareil en parallèle. Comment puis-je obtenir les deux scripts sérialisés, de sorte que l'échange fonctionne à chaque démarrage?
Il y a deux problèmes distincts qui doivent être résolus pour obtenir cryptswap1
fonctionne correctement dans Ubuntu 14.04.
Problème 1: en-tête de swap écrasé
La partition a été initialement formatée avec un en-tête de swap non chiffré, qui est utilisé pour trouver la partition correcte à utiliser lors du démarrage. Étant donné que la clé de chiffrement change à chaque démarrage, l'en-tête d'échange crypté sera réécrit à chaque démarrage. En raison d'un bogue dans la génération de /etc/crypttab
, l'en-tête de swap chiffré écrase l'en-tête de swap non chiffré. Cela empêchera la partition de swap d'être trouvée à tous les futurs démarrages.
Problème 2: Condition de course au démarrage
Il y a une condition de concurrence au démarrage entre /etc/init.d/cryptdisks-early
et /etc/init/cryptdisks.conf
. Les deux essaieront simultanément d'activer tous les périphériques répertoriés dans crypttab
. Dans le cas d'un échange crypté, le résultat de la condition de course sera la plupart du temps, que cela ne fonctionne pas du tout. Certaines vérifications d'intégrité échouent, entraînant l'omission de l'écriture de l'en-tête de swap crypté afin d'éviter toute perte de données potentielle.
Résoudre et contourner les problèmes
Le premier problème peut être facilement résolu. La seconde peut être contournée. Dans /etc/crypttab
identifier la ligne de swap. Cela devrait ressembler à ceci (sauf que l'UUID sera différent):
cryptswap1 UUID=f9a0f20c-fac4-408c-a8b9-47300216f727 /dev/urandom swap,cipher=aes-cbc-essiv:sha256
Dans mon cas, c'était la seule ligne dans /etc/crypttab
. Pour corriger l'écrasement de l'en-tête de swap, un décalage doit être ajouté. Les sources ne s'entendent pas sur la valeur exacte à utiliser, mais l'utilisation d'une valeur trop grande ne fait pas de mal. Je l'ai fait fonctionner en utilisant un décalage de 16
.
De plus, j'ai ajouté noearly
ce qui provoque /etc/init.d/cryptdisks-early
pour ignorer cette ligne et ainsi contourner la condition de concurrence.
La ligne résultante ressemble à ceci:
cryptswap1 UUID=f9a0f20c-fac4-408c-a8b9-47300216f727 /dev/urandom swap,cipher=aes-cbc-essiv:sha256,offset=16,noearly
Cela empêchera l'écrasement de l'en-tête d'échange non chiffré, mais nous devons toujours le recréer sur la partition. À cette étape, il est crucial d'utiliser la bonne partition car l'utilisation d'une mauvaise partition entraînera une perte de données. J'ai utilisé fdisk -l
pour trouver la partition correcte, qui dans mon cas est /dev/sda6
.
Utilisez maintenant mkswap
pour réécrire l'en-tête d'échange non chiffré.
mkswap /dev/sda6 -U f9a0f20c-fac4-408c-a8b9-47300216f727
L'UUID est celui que la partition de swap avait avant d'être écrasé (que vous pouvez toujours voir dans /etc/crypttab
). Une fois cela fait, un redémarrage est nécessaire, et tout devrait fonctionner.
Vérification du bon fonctionnement
Je recommande de redémarrer trois fois pour vérifier qu'il continue de fonctionner.
Le message d'erreur the disk drive for /dev/mapper/cryptswap1 is not ready yet or not present
reste brièvement visible pendant le démarrage. Cela ne semble pas être un problème, car il devient prêt avant la fin du processus de démarrage.
Connectez-vous et saisissez cat /proc/swaps
pour voir que l'échange est actif. Vous devriez voir une partition de swap avec le nom /dev/dm-0
où dm
indique qu'il utilise en effet la couche de mappage de périphérique, qui fournit le cryptage.