J'ai besoin de réorganiser les partitions d'un système pour déplacer des données précédemment sous le système de fichiers racine vers des points de montage dédiés. Les volumes sont tous en LVM, c'est donc relativement simple :créez de nouveaux volumes, déplacez-y des données, réduisez le système de fichiers racine, puis montez les nouveaux volumes aux points appropriés.
Le problème est l'étape 3, la réduction du système de fichiers racine. Les systèmes de fichiers impliqués sont ext4, donc le redimensionnement en ligne est pris en charge; cependant, lorsqu'ils sont montés, les systèmes de fichiers ne peuvent qu'être agrandis. Pour réduire la partition, il faut 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 dans 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 démarrer un disque de secours et effectuer des opérations à partir de la console n'est pas possible.
Comment puis-je démonter le système de fichiers racine tout en conservant l'accès au shell distant ?
Réponse acceptée :
Pour résoudre ce problème, les informations fournies sur http://www.ivarch.com/blogs/oss/2007/01/resize-a-live-root-fs-a-howto.shtml ont été essentielles. Cependant, ce guide concerne 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 devraient être assez facilement transférables à n'importe quelle distribution qui exécute systemd. Toutes les commandes sont exécutées en tant que root.
-
Assurez-vous que le système est dans un état stable
Assurez-vous que personne d'autre ne l'utilise et que rien d'autre d'important ne se passe. 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.
systemctl stop httpd systemctl stop nfs-server # and so on....
-
Démontez tous les systèmes de fichiers inutilisés
umount -a
Cela imprimera un certain nombre d'avertissements "La cible est occupée", pour le volume racine lui-même et pour divers FS temporaires/système. Ceux-ci peuvent être ignorés pour le moment. Ce qui est important, c'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 :
# mount alone provides the info, but column makes it possible to read mount | column -t
Si vous voyez des systèmes de fichiers sur disque encore montés, alors quelque chose est toujours en cours d'exécution qui ne devrait pas l'être. Vérifiez ce qu'il utilise
fuser
:# if necessary: yum install psmisc # then: fuser -vm <mountpoint> systemctl stop <whatever> umount -a # repeat as required...
-
Faire la racine temporaire
mkdir /tmp/tmproot mount -t tmpfs none /tmp/tmproot mkdir /tmp/tmproot/{proc,sys,dev,run,usr,var,tmp,oldroot} cp -ax /{bin,etc,mnt,sbin,lib,lib64} /tmp/tmproot/ cp -ax /usr/{bin,sbin,lib,lib64} /tmp/tmproot/usr/ cp -ax /var/{account,empty,lib,local,lock,nis,opt,preserve,run,spool,tmp,yp} /tmp/tmproot/var/
Cela crée un système racine très minimal, qui interrompt (entre autres) l'affichage des pages de manuel (pas de
/usr/share
), personnalisations au niveau de l'utilisateur (pas de/root
ou/home
) et ainsi de suite. C'est intentionnel, car cela constitue un encouragement à ne pas rester dans un tel système racine truqué par un jury plus longtemps que nécessaire.À ce stade, vous devez également vous assurer que tous les logiciels nécessaires sont installés, car cela cassera certainement le gestionnaire de packages. Parcourez toutes les étapes et assurez-vous que vous disposez des exécutables nécessaires.
-
Pivotez à la racine
mount --make-rprivate / # necessary for pivot_root to work pivot_root /tmp/tmproot /tmp/tmproot/oldroot for i in dev proc sys run; do mount --move /oldroot/$i /$i; done
systemd oblige les montages à autoriser le partage de sous-arborescence par défaut (comme avec
mount --make-shared
), et cela provoquepivot_root
échouer. 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, vivent dans/run
, et il n'y a donc aucun moyen de faire en sorte que les processus en cours d'exécution le ferment. -
Assurez-vous que l'accès à distance a survécu au changement
systemctl restart sshd systemctl status sshd
Après avoir redémarré sshd, assurez-vous que vous pouvez 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é que vous pouvez vous reconnecter, quittez le shell que vous utilisez actuellement et reconnectez-vous. Cela autorise le
sshd
fourchu restant pour quitter et s'assure que le nouveau ne contient pas/oldroot
. -
Fermez tout en utilisant toujours l'ancienne racine
fuser -vm /oldroot
Cela imprimera une liste des processus conservant toujours l'ancien répertoire racine. Sur mon système, cela ressemblait à ceci :
USER PID ACCESS COMMAND /oldroot: root kernel mount /oldroot root 1 ...e. systemd root 549 ...e. systemd-journal root 563 ...e. lvmetad root 581 f..e. systemd-udevd root 700 F..e. auditd root 723 ...e. NetworkManager root 727 ...e. irqbalance root 730 F..e. tuned root 736 ...e. smartd root 737 F..e. rsyslogd root 741 ...e. abrtd chrony 742 ...e. chronyd root 743 ...e. abrt-watch-log libstoragemgmt 745 ...e. lsmd root 746 ...e. systemd-logind dbus 747 ...e. dbus-daemon root 753 ..ce. atd root 754 ...e. crond root 770 ...e. agetty polkitd 782 ...e. polkitd root 1682 F.ce. master postfix 1714 ..ce. qmgr postfix 12658 ..ce. pickup
Vous devez traiter chacun de ces processus avant de pouvoir démonter
/oldroot
. L'approche par force brute consiste simplement àkill $PID
pour chacun, mais cela peut casser des choses. Pour le faire plus doucement :systemctl | grep running
Cela crée une liste des services en cours d'exécution. Vous devriez pouvoir corréler cela avec la liste des processus contenant
/oldroot
, puis émettezsystemctl restart
pour chacun d'eux. Certains services refuseront de monter dans la racine temporaire et entreront dans un état d'échec; ceux-ci n'ont 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 certains 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 via un simple
systemctl restart
. Pour moi, cela incluaitauditd
(qui n'aime pas être tué viasystemctl
, et donc je voulais juste 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, exécutezsystemctl daemon-reexec
.Une fois que vous avez terminé, le tableau devrait ressembler à ceci :
USER PID ACCESS COMMAND /oldroot: root kernel mount /oldroot
-
Démonter l'ancienne racine
umount /oldroot
À ce stade, vous pouvez effectuer toutes les manipulations dont vous avez besoin. La question d'origine nécessitait un 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/n'importe quoi. -
Faites pivoter la racine vers l'arrière
mount <blockdev> /oldroot mount --make-rprivate / # again pivot_root /oldroot /oldroot/tmp/tmproot for i in dev proc sys run; do mount --move /tmp/tmproot/$i /$i; done
Il s'agit d'une simple inversion de l'étape 4.
-
Supprimer la racine temporaire
Répétez les étapes 5 et 6, sauf en utilisant
/tmp/tmproot
à la place de/oldroot
. Ensuite :umount /tmp/tmproot rmdir /tmp/tmproot
Puisqu'il s'agit d'un tmpfs, à ce stade, la racine temporaire se dissout dans l'éther, pour ne plus jamais être vue.
-
Remettez les choses à leur place
Montez à nouveau les systèmes de fichiers :
mount -a
À ce stade, vous devez également mettre à jour
/etc/fstab
etgrub.cfg
conformément aux ajustements que vous avez effectués à l'étape 7.Redémarrez tous les services défaillants :
systemctl | grep failed systemctl restart <whatever>
Autoriser à nouveau les sous-arborescences partagées :
mount --make-rshared /
Démarrez les unités de service arrêtées - vous pouvez utiliser cette seule commande :
systemctl isolate default.target
Et vous avez terminé.
En relation :Je ne peux pas installer software-center sur Kali ?Un grand merci à Andrew Wood, qui a élaboré cette évolution sur RHEL4, et à steve, qui m'a fourni le lien vers la première.