Comment puis-je remplir le fichier / swap sans effacer ce qui en fait un fichier d'échange?

8

J'ai un script que j'exécute afin d'optimiser l'espace disque avant de sauvegarder un invité virtuel (vraiment peu importe quel hyperviseur est utilisé).

Les versions d'Ubuntu modernes (par exemple 18.04) semblent utiliser par défaut /swapfileune partition plutôt qu'une partition à cet effet. C'est bien aussi.

Cependant, je voudrais remplir le fichier d'échange avec la partition racine qui le contient.

Avec les partitions de swap, cela était relativement indolore car il y avait toujours un moyen d'extraire l'existant $UUIDde la partition de swap et - après avoir rempli la partition de zéro - d'exécuter mkswap -U $UUIDpour recréer ladite partition de swap.

Cependant, avec le /swapfileje ne vois pas comment faire ça. Bien que je réalise que vous ne pouvez pas monter un /swapfileUUID dans /etc/fstab, je voudrais quand même conserver l'UUID.

Je pense donc avoir besoin de l'un des éléments suivants pour continuer:

  1. J'ai besoin d'une méthode qui peut remplir le fichier d'échange sans effacer également les structures qui en font une partition d'échange (c'est-à-dire éviter d'avoir à exécuter mkswap -U $UUID)
  2. J'ai besoin d'une méthode pour récupérer l'UUID existant à partir d'un fichier d' échange (par opposition à une partition où je peux utiliser n'importe quoi de blkidà regarder /dev/disk/by-uuid/$UUID...)
0xC0000022L
la source

Réponses:

15
  1. Cela n'effacera pas le fichier d'échange aussi complètement que le recréer, mais si vous l'effacez après avoir sauté le premier 4KiB (à proprement parler, la première page, qui dépend de votre architecture), vous ne toucherez aucune des structures qui identifient un fichier d'échange.

  2. blkid fonctionne très bien sur les fichiers d'échange aussi:

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

Le format d'en-tête est défini dans le noyau : l'ancien format a une valeur magique à la fin de la première page, le nouveau format combine cela avec une zone libre de 1 Ko, puis un certain nombre de champs (version, taille, mauvaises pages, UUID, étiquette) qui tiennent tous confortablement à l'intérieur de la première page.

Stephen Kitt
la source
Wow, de loin la réponse la plus rapide que j'ai jamais reçue sur n'importe quel site StackExchange. Merci. Franchement je ne l'ai jamais utilisé blkidavec un paramètre. Je suppose que je devrais faire cela plutôt que, par exemple, utiliser ddavec un décalage.
0xC0000022L
3
À droite, lire l'UUID et recréer le fichier d'échange est probablement l'option la plus facile.
Stephen Kitt
@ 0xC0000022L examine également les options de format de sortie de blkid. Selon la version, vous pourrez peut-être blkid swap -o value -s uuidextraire uniquement l'UUID.
muru
@muru merci, blkid -o export <file>je l'ai déjà fait et j'ai opté pour que je passe par sedle préfixe local à chaque ligne et que j'utilise ensuite evalBash. De cette façon, j'ai les valeurs dans ma fonction en tant que variables d'environnement local tout de suite.
0xC0000022L