Como posso preencher o arquivo / swap sem apagar o que o torna um arquivo de troca?

8

Eu tenho um script que eu executo para otimizar o espaço em disco antes de fazer backup de um convidado virtual (realmente não importa muito qual hipervisor é usado).

As versões modernas do Ubuntu (por exemplo, 18.04) parecem usar como padrão /swapfileuma partição, e não uma partição. Tudo bem também.

No entanto, eu gostaria de preencher o arquivo de swap juntamente com a partição raiz que o contém.

Com as partições de troca, isso era relativamente simples, pois havia sempre uma maneira de extrair a existente $UUIDda partição de troca e - após o preenchimento da partição - executar mkswap -U $UUIDpara recriar a referida partição de troca.

No entanto, com o /swapfileeu não vejo como fazer isso. Enquanto eu percebo que você não pode montar um /swapfilepor UUID /etc/fstab, eu ainda quero manter o UUID.

Acho que preciso de um dos seguintes procedimentos para prosseguir:

  1. Eu preciso de um método que possa preencher o arquivo de swap sem também limpar as estruturas que o tornam uma partição de swap (ou seja, evitar a execução mkswap -U $UUID)
  2. Eu preciso de um método para recuperar o UUID existente de um arquivo de swap (em oposição a uma partição onde eu posso usar qualquer coisa, desde blkidolhar /dev/disk/by-uuid/$UUID...)
0xC0000022L
fonte

Respostas:

15
  1. Isso não limpará o arquivo de troca tão completamente quanto recriá-lo, mas se você limpá-lo após pular o primeiro 4KiB (a rigor, a primeira página, que depende da sua arquitetura), você não tocará em nenhuma das estruturas que identificam um arquivo de troca.

  2. blkid também funciona bem em arquivos de troca:

    $ mkswap swap
    Setting up swapspace version 1, size = 512 MiB (536866816 bytes)
    no label, UUID=7916b81f-1faa-4b7d-84ef-b0bf2f75dbbc
    
    $ blkid swap
    swap: UUID="7916b81f-1faa-4b7d-84ef-b0bf2f75dbbc" TYPE="swap"
    

O formato do cabeçalho é definido no kernel : o formato antigo possui um valor mágico no final da primeira página, o novo formato combina isso com uma área livre de 1KiB e vários campos (versão, tamanho, páginas incorretas, UUID, etiqueta) que se encaixam confortavelmente na primeira página.

Stephen Kitt
fonte
Uau, sem dúvida a resposta mais rápida que já recebi em qualquer site StackExchange. Obrigado. Eu francamente nunca usei blkidcom um parâmetro. Acho que devo fazer isso em vez de, por exemplo, usar ddcom um deslocamento.
0xC0000022L
3
Certo, ler o UUID e recriar o arquivo de troca é provavelmente a opção mais fácil.
Stephen Kitt
@ 0xC0000022L também analisa as opções de formato de saída de blkid. Dependendo da versão, você poderá blkid swap -o value -s uuidextrair apenas o UUID.
muru
@muru graças, já fez e optou pelo blkid -o export <file>qual o tubo I por meio sedde preceder local a cada linha e, em seguida, evalusando Bash. Dessa forma, tenho os valores em minha função como variáveis ​​de ambiente local imediatamente.
0xC0000022L