Je me trouve dans l'obligation de réorganiser les partitions d'un système pour déplacer des données précédemment situées sous le système de fichiers racine dans des points de montage dédiés. Les volumes sont tous au format LVM. Il est donc relativement facile de créer de nouveaux volumes, d'y déplacer des données, de réduire le système de fichiers racine, puis de monter les nouveaux volumes aux points appropriés.
Le problème est l'étape 3, réduisant le système de fichiers racine. Les systèmes de fichiers impliqués sont ext4, le redimensionnement en ligne est donc pris en charge. cependant, lorsqu'ils sont montés, les systèmes de fichiers peuvent uniquement être développés. Pour réduire la partition, vous devez la démonter, ce qui n'est bien sûr pas possible pour la partition racine en fonctionnement normal.
Les réponses sur le Web semblent tourner autour du démarrage d'un LiveCD ou d'un autre support de secours, de l'opération de réduction, puis du redémarrage sur le système installé. Cependant, le système en question est distant et je n’y ai accès que via SSH. Je peux redémarrer mais l'initialisation d'un disque de secours et l'exécution d'opérations à partir de la console sont impossibles.
Comment démonter le système de fichiers racine tout en conservant un accès distant au shell?
pivot_root
là-bas. Un exemple ici dreamlayers.blogspot.co.uk/2012/10/running-linux-from-ram.html - c'est difficile, mais si vous avez une boîte de test pour l'essayer, cela vaut la peine d'être examiné.Réponses:
Pour résoudre ce problème, les informations fournies à l' adresse http://www.ivarch.com/blogs/oss/2007/01/resize-a-live-root-fs-a-howto.shtml étaient essentielles. Cependant, ce guide s’applique à une très ancienne version de RHEL et diverses informations étaient obsolètes.
Les instructions ci-dessous sont conçues pour fonctionner avec CentOS 7, mais elles doivent être facilement transférables à toute distribution exécutant systemd. Toutes les commandes sont exécutées en tant que root.
S'assurer que le système est dans un état stable
Assurez-vous que personne ne l'utilise et que rien d'autre n'est important. C'est probablement une bonne idée d'arrêter les unités fournissant des services comme httpd ou ftpd, juste pour s'assurer que les connexions externes ne perturbent pas les choses au milieu.
Démontez tous les systèmes de fichiers inutilisés
Cela imprimera un certain nombre d'avertissements «La cible est occupée», pour le volume racine lui-même et pour différents systèmes de sécurité temporaires / système. Ceux-ci peuvent être ignorés pour le moment. L'important est qu'aucun système de fichiers sur disque ne reste monté, à l'exception du système de fichiers racine lui-même. Vérifiez ceci:
Si vous voyez des systèmes de fichiers sur disque toujours montés, quelque chose ne fonctionne toujours pas. Vérifiez ce qu'il utilise
fuser
:Faire la racine temporaire
Cela crée un système racine très minimal, qui interrompt (entre autres choses) l'affichage de la page de manuel (non
/usr/share
), les personnalisations au niveau de l'utilisateur (non/root
ou/home
) et ainsi de suite. Cela est intentionnel, car cela constitue un encouragement à ne pas rester plus longtemps que nécessaire dans un système racinaire truqué par un jury.À ce stade, vous devez également vous assurer que tous les logiciels nécessaires sont installés, car cela endommagera également le gestionnaire de paquets. Parcourez toutes les étapes et assurez-vous de disposer des exécutables nécessaires.
Pivoter dans la racine
systemd force les montages à autoriser le partage des sous-arbres par défaut (comme avec
mount --make-shared
), et cela entraîne l'pivot_root
échec. Par conséquent, nous désactivons cela globalement avecmount --make-rprivate /
. Les systèmes de fichiers système et temporaires sont déplacés en gros vers la nouvelle racine. Ceci est nécessaire pour que cela fonctionne du tout; les sockets pour la communication avec systemd, entre autres choses, résident dans/run
, et il n’ya donc aucun moyen de faire en sorte que les processus en cours la ferment.S'assurer que l'accès à distance a survécu au basculement
Après avoir redémarré sshd, assurez-vous que vous pouvez y entrer en ouvrant un autre terminal et en vous reconnectant à la machine via ssh. Si vous ne pouvez pas, résolvez le problème avant de continuer.
Une fois que vous avez vérifié, vous pouvez vous reconnecter, quittez le shell que vous utilisez actuellement et reconnectez-vous. Cela permet aux fourchettes restantes
sshd
de sortir et garantit que la nouvelle ne tient pas/oldroot
.Fermez tout en utilisant l'ancienne racine
Ceci imprimera une liste des processus restant dans l'ancien répertoire racine. Sur mon système, cela ressemblait à ceci:
Vous devez gérer chacun de ces processus avant de pouvoir démonter
/oldroot
. L'approche par la force brute est simplementkill $PID
pour chacun, mais cela peut casser des choses. Pour le faire plus doucement:Cela crée une liste de services en cours d'exécution. Vous devriez pouvoir corréler cela avec la liste des processus en cours
/oldroot
, puis émettresystemctl restart
pour chacun d'eux. Certains services refuseront de se placer dans la racine temporaire et entreront dans un état d'échec. cela n'a pas vraiment d'importance pour le moment.Si le lecteur racine que vous souhaitez redimensionner est un lecteur LVM, vous devrez peut-être également redémarrer d'autres services en cours d'exécution, même s'ils n'apparaissent pas dans la liste créée par
fuser -vm /oldroot
. Si vous ne parvenez pas à redimensionner un lecteur LVM à l’étape 7, essayezsystemctl restart systemd-udevd
.Certains processus ne peuvent pas être traités simplement
systemctl restart
. Pour moi, ceux-ci sont inclusauditd
(qui n'aime pas être tués viasystemctl
, et je voulais juste en avoir unkill -15
). Ceux-ci peuvent être traités individuellement.Le dernier processus que vous trouverez, généralement, est
systemd
lui - même. Pour cela, lancezsystemctl daemon-reexec
.Une fois que vous avez terminé, la table devrait ressembler à ceci:
Démonter l'ancienne racine
À ce stade, vous pouvez effectuer toutes les manipulations dont vous avez besoin. La question initiale nécessitait une simple
resize2fs
invocation, mais vous pouvez faire ce que vous voulez ici; un autre cas d’utilisation consiste à transférer le système de fichiers racine d’une simple partition vers LVM / RAID / peu importe.Faire pivoter la racine
C’est un renversement simple de l’étape 4.
Éliminer la racine temporaire
Répétez les étapes 5 et 6, sauf
/tmp/tmproot
en lieu et place de/oldroot
. Ensuite:Comme il s’agit d’un tmpfs, la racine temporaire se dissout dans l’éther pour ne plus jamais être vue.
Remets les choses à leur place
Montez à nouveau les systèmes de fichiers:
À ce stade, vous devez également mettre à jour
/etc/fstab
etgrub.cfg
en fonction des ajustements que vous avez effectués à l'étape 7.Redémarrez tous les services en échec:
Autoriser à nouveau les sous-arbres partagés:
Démarrez les unités de service arrêtées - vous pouvez utiliser cette commande unique:
Et tu as fini.
Un grand merci à Andrew Wood, qui a élaboré cette évolution sur RHEL4, et à steve, qui m’ont fourni le lien avec l’ancien.
la source
umount /oldroot/boot
bien sûr passer à l'étape 6). Je relie votre réponse à d'autres questions SE qui n'ont pas eu de réponse ou de réponse négative.umount /oldroot/boot
avant vousumount /oldroot
mount --move
des fichiers tmpfs, mais cela n'est pas pris en charge.telinit u
pourrait faire ce que vous voulez./oldroot/tmp
, ce qui m’a empêché de démonter/oldroot
, mais ne s’affichefuser
ni dans, ni dans lalsof
sortie. Il a fallu un peu regarder fixement systemd pour que ça marche ...Si vous êtes sûr de ce que vous faites - et donc de ne pas expérimenter, vous pouvez vous connecter à initrd, qui est un moyen rapide et non interactif.
Voici comment procéder sur un système basé sur Debian.
Voir le code: https://github.com/szepeviktor/debian-server-tools/blob/master/debian-resizefs.sh
Il existe un autre exemple: https://github.com/szepeviktor/debian-server-tools/blob/master/debian-convert-ext3-ext4.sh
la source