2 votes

Comment puis-je restaurer un instantané LVM d'un plus grand volume sur un plus petit disque ?

J'essaie de sauvegarder/restaurer un volume LVM sur un serveur Ubuntu 20.04 (Focal Fossa) local. Le serveur de production a un LV de 500 Go, mais il n'y a que 19 Go utilisés jusqu'à présent.

Le serveur de développement local dispose de 24 Go d'espace libre où j'ai l'intention de restaurer les 19 Go de la production. J'utilise -L 24G comme paramètre lors de l'exécution de l'instantané LVM. Le processus échoue à la restauration avec le message : "no space left on device" :

Serveur de production :

sudo lvcreate -s /dev/vg0/test -n backup_test -L 24G
sudo dd if=/dev/vg0/backup_test  | lz4 > test_lvm.ddimg.lz4

1048576000+0 records in
1048576000+0 records out
536870912000 bytes (537 GB, 500 GiB) copied, 967.79 s, 555 MB/s

sudo lvdisplay /dev/vg0/backup_test
  --- Logical volume ---
  LV Path                /dev/vg0/backup_test
  LV Name                backup_test
  VG Name                vg0
  LV UUID                IsGBmM-VM7C-2sO4-VrC1-kHKg-EzcR-4Hej44
  LV Write Access        read/write
  LV Creation host, time leo, 2021-07-04 12:45:45 +0200
  LV snapshot status     active destination for m360
  LV Status              available
  # open                 0
  LV Size                500.00 GiB
  Current LE             128000
  COW-table size         24.00 GiB
  COW-table LE           6144
  Allocated to snapshot  0.01%
  Snapshot chunk size    4.00 KiB
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:10

Serveur de test local :

sudo lvcreate -n restore -L 24.5G data
sudo mkfs.ext4 /dev/data/restore
sudo lz4 -d test_lvm.ddimg.lz4 | sudo dd of=/dev/data/restore

Warning : using stdout as default output. Do not rely on this behavior: use explicit `-c` instead !
dd: writing to '/dev/data/restore': No space left on device
51380225+0 records in
51380224+0 records out
26306674688 bytes (26 GB, 24 GiB) copied, 1181.48 s, 22.3 MB/s

Existe-t-il un moyen de restaurer le volume de 500 Go contenant seulement 19 Go sur un disque plus petit que 500 Go ?

5voto

Karl Points 1085

Les données que vous essayez de restaurer ont une taille de 500 Go, et ne peuvent pas tenir sur un volume logique de 24 Go. Vous pouvez être plus sélectif quant à ce que vous transférez, ou vous pouvez allouer plus d'espace au groupe de volumes cible.

Il semble que les données du volume logique que vous sauvegardez ne soient que de 19 Go. Il y a plusieurs façons de transférer ces données.

Si vous ne vous préoccupez que des données et non du système de fichiers, vous pouvez créer un nouveau système de fichiers (via le bouton mkfs.ext4 ou plus) sur la cible, et utiliser des outils qui opèrent sur des fichiers plutôt que sur des blocs, comme rsync(1) ou tar(1).

Alternativement, vous pouvez utiliser fsarchiver(8) qui permet de sauvegarder un système de fichiers, puis de le restaurer sur un dispositif plus petit.

Enfin, vous pouvez réduire la taille du périphérique de bloc que vous sauvegardez avec resize2fs(8) et lvreduce(8). Vous pouvez ensuite sauvegarder ce volume plus petit et le restaurer sur un volume de taille similaire sur le nouveau serveur.

2voto

jcollum Points 10236

La seule façon de restaurer vos données est d'utiliser un périphérique de bloc qui est compressé (par exemple VDO, loop-device sur un système de fichiers compressé comme btrfs et ZFS).

Cependant, même si vos données ne sont que de 17 Go, l'espace libre peut contenir des données provenant d'écritures précédentes et l'ensemble du LV peut ne pas être compressible.

Comme systèmes de fichiers compressés, vous pouvez utiliser btrfs ou ZFS, et créer un fichier de 500G mis à zéro que vous mappez sur un périphérique en boucle (avec losetup ), ou, sur ZFS, vous pouvez créer directement un périphérique de bloc qui est compressé. Ensuite, restaurez votre LV sur le périphérique de bloc que vous avez créé à l'étape précédente. La compression devrait vous donner une chance de restaurer toutes les données.

1voto

gronostaj Points 111

Le concept d'octets (non)utilisés n'existe pas au niveau de LVM. Le fait qu'un octet (ou en fait un secteur) contienne des données significatives ou des déchets inutilisés est déterminé par le système de fichiers qui vit à l'intérieur du LV. Le LVM ne sait pas ce qu'est un système de fichiers. Tout ce qu'il fait, c'est prendre un tas de disques et les combiner logiquement selon vos instructions. Il ne se soucie pas de ce que vous ferez avec ce volume combiné.

Cela signifie que vous prenez un instantané de 500 Go de données. LVM ne comprend pas quelles parties de cet instantané sont significatives et méritent d'être préservées et quelles parties ne le sont pas.

Ce que vous voulez réaliser est possible au niveau du système de fichiers par imagerie. Certains logiciels, comme le libre partclone, comprennent les structures des systèmes de fichiers et peuvent créer un image - essentiellement un fichier clairsemé qui ne contient que les parties du système de fichiers qui sont utilisées. Le problème ici est que le périphérique cible doit avoir au moins la même taille que la source, parce que partclone n'ajuste pas la géométrie du système de fichiers : tous les morceaux stockés doivent aller à leur emplacement d'origine lorsque l'image est restaurée.

Le plan serait donc le suivant :

  • Redimensionner le système de fichiers source à 25 GB (cela ne nécessite pas de redimensionner le LV !)
  • Imagez-le avec partclone ou quelque chose de similaire
  • Recréer manuellement le LV sur la cible
  • Restaurer le système de fichiers à partir d'une image

Une variante de cette méthode consisterait à redimensionner le système de fichiers à 25 Go, puis à envoyer l'instantané LVM. Il y aura une erreur avec "no space left on device" parce que vous envoyez toujours la totalité des 500 Go, mais ce n'est pas grave, car seuls les 25 premiers Go du volume contiendront le système de fichiers.

Quoi qu'il en soit, vous devrez probablement ajuster le fstab s'il s'agit de volumes amorçables, alors préparez-vous à cela.

1voto

chutz Points 7404

Deux points à aborder.

La création d'un instantané LVM de 24G signifie que l'instantané survivra à 24G de perte de données. changements entre le volume d'origine et le volume de l'instantané. Le dispositif de cliché instantané lui-même apparaîtra comme s'il avait la même taille que le volume d'origine. Même si vous n'apportez jamais de modifications au volume de l'instantané, toute modification du volume d'origine devra être enregistrée en tant que modification entre le volume d'origine et l'instantané, ce qui réduira la taille de 24 Go de l'instantané.

Pour faire ce que vous essayez de faire, voici quelques idées :

  1. Pour une copie pas si parfaite, il suffit d'utiliser une copie des fichiers au niveau du système de fichiers :

sur le serveur de test :

sudo mount /dev/data/restore /mnt/restore

sur le serveur source :

sudo rsync -avPAHX /source/dir/ root@testserver:/mnt/restore/
  1. Pour une copie précise à un moment précis, montez votre snapshot, et rsync que :

    sudo mount -r /dev/vg0/backup_test /mnt/backup_test sudo rsync -avPAHX /dev/vg0/backup_test/ root@testserver:/mnt/restore/

  2. Si vous voulez vraiment transférer l'image disque, vous devrez d'abord réduire le système de fichiers et le volume logique. N'oubliez pas que vous devrez d'abord démonter le système de fichiers.

    sudo lvresize -L24G -r vg0/test

Alors fais ce que tu as fait.

0voto

laojuntasa Points 1

Vous devez utiliser le lvconvert avec la commande --mergesnapshot et le nom de l'instantané du volume logique pour restaurer un volume logique LVM. Lorsque l'option --mergesnapshot est utilisée, l'instantané est fusionné avec le volume logique d'origine, puis effacé.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X