Existem dois problemas separados que devem ser resolvidos para que o cryptswap1
funcione corretamente no Ubuntu 14.04.
Problema 1: cabeçalho de troca sobrescrito
A partição foi originalmente formatada com um cabeçalho de swap não criptografado, que é usado para localizar a partição correta a ser usada durante a inicialização. Como a chave de criptografia muda a cada inicialização, o cabeçalho de troca criptografada será reescrito em cada inicialização. Devido a um erro na geração de /etc/crypttab
, o cabeçalho de troca criptografado sobrescreve o cabeçalho de swap não criptografado. Isso impedirá que a partição swap seja encontrada em todas as inicializações futuras.
Problema 2: condição de corrida durante o arranque
Existe uma condição de corrida durante a inicialização entre /etc/init.d/cryptdisks-early
e /etc/init/cryptdisks.conf
. Ambos tentarão simultaneamente ativar todos os dispositivos listados em crypttab
. No caso de troca criptografada, o resultado da condição de corrida na maior parte do tempo será que ela não funciona. Algumas verificações de integridade falham, fazendo com que a gravação do cabeçalho de troca criptografada seja ignorada, a fim de evitar perda potencial de dados.
Corrigindo e contornando os problemas
O primeiro problema pode ser facilmente corrigido. O segundo pode ser contornado. Em /etc/crypttab
, identifique a linha de swap. Deve ficar assim (exceto que o UUID será diferente):
cryptswap1 UUID=f9a0f20c-fac4-408c-a8b9-47300216f727 /dev/urandom swap,cipher=aes-cbc-essiv:sha256
No meu caso, esta foi a única linha em /etc/crypttab
. Para corrigir a sobregravação do cabeçalho de troca, um deslocamento deve ser adicionado. Fontes discordam sobre o que exatamente o valor correto é usado, mas usar um valor muito grande não faz mal. Eu consegui trabalhar usando um deslocamento de 16
.
Além disso, adicionei noearly
, o que faz com que /etc/init.d/cryptdisks-early
ignore essa linha e assim funciona em torno da condição de corrida.
A linha resultante se parece com:
cryptswap1 UUID=f9a0f20c-fac4-408c-a8b9-47300216f727 /dev/urandom swap,cipher=aes-cbc-essiv:sha256,offset=16,noearly
Isso evitará que o cabeçalho de swap não criptografado seja sobrescrito novamente, mas ainda precisamos recriá-lo na partição. Nesta etapa é crucial usar a partição correta porque usar a partição incorreta irá causar perda de dados. Eu usei fdisk -l
para encontrar a partição correta, que no meu caso é /dev/sda6
.
Agora use mkswap
para reescrever o cabeçalho de swap não criptografado.
mkswap /dev/sda6 -U f9a0f20c-fac4-408c-a8b9-47300216f727
O UUID é aquele que a partição swap tinha antes de ser sobrescrita (que você ainda pode ver em /etc/crypttab
). Uma vez feito isso, é necessário reiniciar e tudo deve funcionar.
Verificando a operação correta
Eu recomendo reiniciar três vezes para verificar se continua funcionando.
A mensagem de erro the disk drive for /dev/mapper/cryptswap1 is not ready yet or not present
permanece visível brevemente durante a inicialização. No entanto, isso parece não ser um problema, pois fica pronto antes que o processo de inicialização seja concluído.
Faça o login e digite cat /proc/swaps
para ver se a troca está ativa. Você deve ver uma partição de troca com o nome /dev/dm-0
, em que dm
indica que está realmente usando a camada de mapeador de dispositivo, que fornece a criptografia.