¿Cómo puedo zerofill el / swapfile sin borrar lo que lo hace un swapfile?

8

Tengo un script que ejecuto para optimizar el espacio en disco antes de hacer una copia de seguridad de un invitado virtual (realmente no importa demasiado qué hipervisor se use).

Las versiones modernas de Ubuntu (por ejemplo, 18.04) parecen usar por defecto /swapfileuna partición en lugar de una partición. Eso también está bien.

Sin embargo, me gustaría rellenar el archivo de intercambio junto con la partición raíz que lo contiene.

Con las particiones de intercambio, esto era relativamente sencillo, ya que siempre había una forma de extraer lo existente $UUIDde la partición de intercambio y, después de completar la partición, ejecutar mkswap -U $UUIDpara volver a crear dicha partición de intercambio.

Sin embargo, con el /swapfileno veo cómo hacer eso. Si bien me doy cuenta de que no puede montar un /swapfileUUID /etc/fstab, todavía quiero retener el UUID.

Así que creo que necesito uno de los siguientes para proceder:

  1. Necesito un método que pueda rellenar el archivo de intercambio sin borrar también las estructuras que lo convierten en una partición de intercambio (es decir, evitar tener que ejecutarse mkswap -U $UUID)
  2. Necesito un método para recuperar el UUID existente de un archivo de intercambio (en lugar de una partición donde puedo usar cualquier cosa blkidpara mirar /dev/disk/by-uuid/$UUID...)
0xC0000022L
fuente

Respuestas:

15
  1. Esto no borrará el archivo de intercambio tan a fondo como volver a crearlo, pero si lo borra después de omitir el primer 4KiB (estrictamente hablando, la primera página, que depende de su arquitectura), no tocará ninguna de las estructuras que identifican un archivo de intercambio.

  2. blkid también funciona bien en archivos de intercambio:

    $ 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"
    

El formato del encabezado se define en el kernel : el formato anterior tiene un valor mágico al final de la primera página, el nuevo formato combina eso con un área libre de 1 KB, luego varios campos (versión, tamaño, páginas defectuosas, UUID, etiqueta) que caben cómodamente dentro de la primera página.

Stephen Kitt
fuente
Wow, sin duda la respuesta más rápida que he recibido en cualquier sitio de StackExchange. Gracias. Francamente, nunca lo usé blkidcon un parámetro. Supongo que debería estar haciendo eso en lugar de, por ejemplo, usarlo ddcon un desplazamiento.
0xC0000022L
3
Bien, leer el UUID y volver a crear el archivo de intercambio es probablemente la opción más fácil.
Stephen Kitt
@ 0xC0000022L también busque en las opciones de formato de salida de blkid. Dependiendo de la versión, puede hacer blkid swap -o value -s uuidpara extraer solo el UUID.
muru
@muru gracias, ya lo hice y opté por blkid -o export <file>lo que paso sedpara anteponer local cada línea y luego evalusar Bash. De esta manera, tengo los valores en mi función como variables de entorno local de inmediato.
0xC0000022L