GNU/Linux >> Tutoriels Linux >  >> Cent OS

Centos - Comment réduire le système de fichiers racine sans démarrer un Livecd ?

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.

  1. 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....
    
  2. 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...
    
  3. 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.

  4. 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 provoque pivot_root échouer. Par conséquent, nous désactivons cela globalement avec mount --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.

  5. 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 .

  6. 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 émettez systemctl 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, essayez systemctl restart systemd-udevd .

    Certains processus ne peuvent pas être traités via un simple systemctl restart . Pour moi, cela incluait auditd (qui n'aime pas être tué via systemctl , et donc je voulais juste un kill -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écutez systemctl daemon-reexec .

    Une fois que vous avez terminé, le tableau devrait ressembler à ceci :

                 USER        PID ACCESS COMMAND
    /oldroot:    root     kernel mount /oldroot
    
  7. 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.

  8. 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.

  9. 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.

  10. Remettez les choses à leur place

    Montez à nouveau les systèmes de fichiers :

    mount -a
    

    À ce stade, vous devez également mettre à jour /etc/fstab et grub.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.


Cent OS
  1. Comment réinitialiser le mot de passe root dans CentOS 7

  2. Comment installer Habari sur CentOS 7

  3. Comment installer Elgg sur CentOS 7

  4. Comment réduire le système de fichiers racine sur CentOS / RHEL 6

  5. Comment supprimer l'option de montage noatime du point de montage racine sans redémarrage (CentOS/RHEL)

Comment installer CumulusClips sur CentOS 7

Comment installer Logaholic sur CentOS 7

Comment installer Webasyst sur CentOS 7

Comment installer ProjectSend sur CentOS 7

Comment installer Phpwcms sur CentOS 7

Comment installer X-Cart sur CentOS 7