65 votes

Est-il possible de réduire en ligne un volume EXT4 avec LVM ?

Aujourd'hui, j'ai essayé cela sur ma machine avec OpenSUSE 12.3 (noyau 3.7) :

# resize2fs /dev/mapper/system-srv 2G
resize2fs 1.42.6 (21-Sep-2012)
Filesystem at /dev/mapper/system-srv is mounted on /srv; on-line resizing required
resize2fs: On-line shrinking not supported

/dev/mapper/system-srv est un volume EXT4.

Est-ce qu'il n'est vraiment pas pris en charge ou est-ce que je rate quelque chose ?

99voto

Michael Hampton Points 232226

Comme le dit le message, vous pouvez seulement se développer un système de fichiers ext4 en ligne. Si vous voulez le réduire, vous devrez d'abord le démonter.

Selon le responsable du système de fichiers ext4 Ted Ts'o :

Désolé, le rétrécissement en ligne n'est pas pris en charge.

14 votes

C'est dommage...

6 votes

C'est quoi ce "downvote" ?

29 votes

@MichaelHampton - un crétin qui tire sur le messager ? :D

41voto

urusha Points 459

S'il s'agit d'un serveur distant sans console, vous pouvez réduire le système de fichiers en utilisant initramfs lors du redémarrage. Vous devez ajouter resize2fs à initramfs et l'exécuter avant de monter root.

Exemple de Debian/Ubuntu :

/etc/initramfs-tools/hooks/resizefs (exécutable) :

#!/bin/sh

set -e

PREREQS=""

prereqs() { echo "$PREREQS"; }

case $1 in
    prereqs)
        prereqs
        exit 0
    ;;
esac

. /usr/share/initramfs-tools/hook-functions

copy_exec /sbin/e2fsck
copy_exec /sbin/resize2fs

exit 0

/etc/initramfs-tools/scripts/local-premount/resizefs (exécutable)

#!/bin/sh

set -e

PREREQS=""

prereqs() { echo "$PREREQS"; }

case "$1" in
    prereqs)
        prereqs
        exit 0
    ;;
esac

# simple device example
/sbin/e2fsck -yf /dev/sda1
/sbin/resize2fs /dev/sda1 5G # see size info below
/sbin/e2fsck -yf /dev/sda1

# complex device example
# activate md-raid containing FS/PV
#/sbin/mdadm -A /dev/md0
# activate VG containing FS
#/sbin/lvm vgchange -ay vg0
# resize
#/sbin/e2fsck -yf /dev/vg0/root # or /dev/md0
#/sbin/resize2fs /dev/vg0/root 5G
#/sbin/e2fsck -yf /dev/vg0/root

Exécutez maintenant update-initramfs -u -k kernel-name pour mettre à jour les initramfs pour le noyau kernel-name qui est défini par défaut dans votre chargeur de démarrage (Grub). En cas d'échec du démarrage - vous pouvez démarrer avec un autre noyau/initramfs sain non modifié. Ou vous pouvez utiliser all pour mettre à jour tous les noyaux, mais alors vous n'avez aucun moyen de retour.

Vérifiez que vous n'avez pas d'outils dans votre système qui font croître le système de fichiers automatiquement (par exemple, cloud-init - commentaire resizefs en /etc/cloud/cloud.cfg ).

Redémarrage. Vérifier la taille du système de fichiers. Supprimez initramfs scripts et exécutez update-intiramfs -u -k kernel-name encore.

Maintenant, vous pouvez réduire le dispositif sous-jacent avec parted resizepart / mdadm --grow --size= / lvresize -L . La taille du périphérique doit être supérieure à la taille du système de fichiers des scripts. La manière la plus simple de ne pas faire d'erreurs : si la taille prévue du périphérique est de 6G, définissez la taille de fs dans le scripts à 5G. après que fs soit redimensionné, redimensionnez le périphérique à 6G, puis augmentez fs au maximum en ligne avec resize2fs /dev/sda1 . Maintenant, votre fs s'adapte parfaitement à votre appareil.

Pour dracut (Fedora,CentOS) utilisez la même logique (/usr/lib/dracut/modules.d).

Ceci est très utile pour crypter ou déplacer des rootfs, sans espace libre disponible pour la nouvelle partition.

5 votes

Cela fonctionne à merveille. Notez que vous devez exécuter update-initramfs avec l'option -u.

1 votes

Cool. Dans mon cas, je devais également update-grub .

1 votes

Cela fonctionne parfaitement, mais je ne l'ai pas pensé au début parce que mon hébergeur avait inséré une entrée dans /etc/rc.local qui redimensionne / à sa taille maximale à chaque démarrage ! Je suppose qu'ils ont une image de base qui s'agrandit automatiquement pour chaque hôte. Je l'ai banni et tout va bien.

26voto

r0nk3l1 Points 21

Oui, vous pouvez réduire/déplacer/agrandir une partition racine sans redémarrage. (ni livecd, ni usbkey) : consultez cette réponse . Il est très bien écrit et facile à suivre, bien qu'assez long et un peu risqué.

resize2fs ne peut pas rétrécir en ligne ext4 partitions . Cette limitation, lorsqu'elle est appliquée à la partition racine, peut vous amener à penser que vous ne pouvez pas éviter de redémarrer l'hôte pour permettre le rétrécissement de la partition racine. root ce qui peut être quelque chose que vous voulez éviter. Le processus lié vous permettra de démonter la partition racine sans aucun redémarrage. Donc, dans cette optique, ce n'est pas à proprement parler en ligne Il s'agit d'un redimensionnement en ce qui concerne l'état monté de la partition, mais il reste un redimensionnement en ligne en ce qui concerne l'état en ligne du réseau ou l'accessibilité de l'hôte.

Bien sûr, si vous voulez seulement agrandir votre partition ext4, vous devriez vous en tenir au fonctionnement conventionnel resize2fs solutions.

La solution générale que j'ai indiquée fonctionnera sur n'importe quel type de solution dédiée ou VPS par exemple.

TLDR ; cette solution implique de pivot_root a tmpfs pour que vous puissiez umount en toute sécurité votre partition racine en direct et bricoler avec elle. Une fois fait, vous pivot_root sur votre nouvelle partition racine.

Cela permet à peu près n'importe quelle manipulation sur le système de fichiers racine (le déplacer, changer de système de fichiers, changer de périphérique physique...).

Je l'ai personnellement utilisé, et il fonctionne très bien sur le système debian aussi, mais le guide a été initialement écrit en 2007 pour redhat, la réponse que j'ai liée a été mise à jour pour CentOS7. Il est très probable que cela fonctionne sur votre OpenSUSE, mais probablement avec quelques adaptations.

17 votes

Il ne s'agit pas d'un projet "en ligne" en ce qui concerne la comparaison avec la "culture en ligne". Tous les services doivent être arrêtés et votre système de fichiers racine devient inaccessible. Il peut être intéressant de comparer cette approche à celle de livecd ou initramfs/rdshell dans ce commentaire. Je ne voudrais pas que les gens soient déroutés par cela.

3 votes

@BrianChrisman Il s'agit en effet d'un problème qui méritait d'être clarifié et que j'espère avoir couvert en modifiant mon message. Merci beaucoup pour vos commentaires.

0 votes

Ce que j'apprécie dans la solution référencée, c'est qu'elle est "presque en ligne". J'ai fait cette chose particulière en encodant un petit script et des outils dans la commande dracut et j'ai lancé l'initramfs résultant à partir de kexec. Si cela pouvait d'une manière ou d'une autre garder une session ssh ouverte tout au long du processus, ce serait mieux. Je suppose que si vous construisez la fausse racine avec sshd et les fichiers nécessaires, démarrez un autre sshd (parce que vous êtes connecté par ssh) sur un autre port, vous pouvez alors vous connecter par ssh à l'autre port et vérifier la connectivité avant de continuer à lobotomiser le système.

-3voto

shubham rasal Points 1

Oui..

vous pouvez utiliser --resizefs à la commande lvreduce.

lvreduce --size -2G  --resizefs /dev/<volumegroup-name>/<logical-volume-name>

Exemple de commande

0 votes

Comment cela fonctionne-t-il sur la partition fs racine ?

3 votes

@shubham rasal, lisez les autres réponses. L'option --resizefs est juste une option de commodité, qui appelle la fonction fsadm pour redimensionner. Cela ne change pas la limitation qui est affichée dans les autres réponses : un système de fichiers ext4 n'est pas réductible lorsqu'il est monté.

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