Como diz o @BrianRedbeard, há uma ferramenta para isso ( cryptsetup-reencrypt
). Leia a documentação relacionada com cuidado. Esta é uma operação perigosa. (A conversão de dados no local é sempre. Um passo errado e ele fica em chamas.)
Apenas por diversão, o processo manual:
Na verdade, é bem simples (e não funciona dessa maneira na outra direção!). Você pode simplesmente copiá-lo assim:
pv < /dev/mapper/cryptsdx1 > /dev/sdx1
Mas como estamos lendo e gravando no mesmo dispositivo físico, pode ser mais rápido fazer com dd
e um tamanho grande de blocos (desde que você tenha muita RAM). Em um HDD, isso provavelmente é mais rápido, já que faz menos buscas, e as buscas são lentas.
dd status=progress bs=1G iflag=fullblock if=/dev/mapper/cryptsdx1 of=/dev/sdx1
Mas primeiro, você deve fazer o backup do seu cabeçalho LUKS, já que o cabeçalho LUKS é a primeira coisa que você irá sobrescrever nesse processo, e você não poderá continuar mesmo que queira.
cryptsetup luksHeaderBackup /dev/sdx1 --header-backup-file myluksheader.backup
E certifique-se de manter esse backup seguro, não apenas na RAM de um ambiente LiveCD.
O dispositivo LUKS basicamente é assim:
| LUKS HEADER | ENCRYPTED DATA |
e depois do pv / dd, deve ficar assim:
| DECRYPTED DATA | FREE SPACE |
Portanto, o cabeçalho LUKS está no início do dispositivo e tem cerca de 2 MiB de tamanho (costumava ser 1 MiB mais alguns setores). E como estamos nos livrando dele, haverá espaço livre no final do dispositivo, e você poderá aumentar o sistema de arquivos em 2MiB. Wheee!
Os dados em si são, portanto, encontrados em um deslocamento (geralmente de 2 MiB, verifique com cryptsetup luksDump
). Esse deslocamento é importante aqui - significa que os dados não apenas precisam ser descriptografados, mas também deslocados - o início da descriptografia aparecerá onde originalmente o cabeçalho LUKS estava armazenado.
Isso também significa que, durante todo o processo, haverá uma região sobreposta que existe em formulários descriptografados e criptografados. Isso é útil caso a máquina falhe e você tenha que encontrar o ponto de retorno.
Então, o que fazer em caso de falha?
Primeiro você tem que recriar o dispositivo crypt usando o backup:
cryptsetup --header myluksheader.backup luksOpen /dev/sdx1 cryptsdx1
Em seguida, encontre o ponto de sobreposição:
skip=0 # or skip=X if you're sure at least X bytes were copied
step=$((1024*1024)) # 1MiB, use 512KiB for old 1MiB headers (offset / 2)
while ! cmp --bytes=$step /dev/sdx1 /dev/mapper/cryptsdx1 $skip $skip
do
skip=$(($skip+$step))
done
cmp --bytes=$step /dev/sdx1 /dev/mapper/cryptsdx1 $skip $skip && echo $skip || echo fail
Por fim, retome:
dd status=progress bs=1G iflag=fullblock,skip_bytes oflag=seek_bytes \
skip=$skip seek=$skip if=/dev/mapper/cryptsdx1 of=/dev/sdx1
Antes de usar qualquer um dos métodos em seu sistema de arquivos real, vale a pena executar uma prática em uma partição não relacionada (ou mesmo apenas em um dispositivo de loop) apenas para garantir que ela ainda funcione.
Por exemplo, eu não levei em conta o novo formato LUKS2, que em sua forma básica funciona da mesma maneira (cabeçalho 4MiB), mas suporta coisas estranhas como múltiplos segmentos de dados e outros. Então, se você estiver usando esses recursos, é um pouco mais complicado (e eu não acho que cryptsetup-reencrypt
cobre isso ainda).