Une place pour une véritable innovation. Partagez vos propres utilitaires créés avec la communauté Manjaro.
Questions et discussions sur la programmation et le codage.

easy2chroot

#1Messageil y a 9 ans

Bonjour @ tous :salut:
J'ai constaté que bon nombre d'entre nous ont du passer un système en chroot pour pouvoir se dépanner depuis un autre système.
Cette démarche pas très compliquée rebute souvent les débutants ou ceux qui préfèrent le "servez chaud". Rien ne remplace l'apprentissage par une démarche personnelle de recherche , pourtant parfois, un petit coup de main est le bienvenu.
C'est donc dans une démarche très personnelle que je me suis lancé dans l'élaboration pour ne pas dire un bricolage d'un petit script Bash après avoir consulté des pages entières sur le sujet. Du coup, ce script m'a permis d'avancer un peu, et c'est plutôt aux testeurs et au curieux que je m'adresse, encore que ça peut toujours servir comme disait Lacoste. :gsourire:
Mise en garde: Comme vous le savez , les systèmes Unix-Like dont fait partie Linux et donc Manjaro, reposent sur le FHS (File Hierarchy Standard) où tout est fichiers depuis la racine "/" . La commande chroot permet de changer de racine "/" depuis un système actif vers un autre inactif, généralement malade, ou pour mettre à jour un grub somnolant....
Ce n'est pas une commande a prendre à la légère!
Easy2chroot vous permet donc de rechercher les partitions "chrootables" , de monter à votre place celle de votre choix et de la démonter automatiquement quand vous avez terminé.
Notez qu'après un chroot, le chemin d'exécution des binaires du système n'est plus valide et que le reboot est parfois nécessaire, surtout si on doit compiler. Pour le commun des mortels, le chroot servira a modifier des fichiers systèmes (fstab ,grub.conf,etc...) dans une distro malmenée par une mise à jour ou une bourde réparable :clindoeil:
Voici pour la mise en bouche. On y va! :manger:

Créez un fichier texte dans votre home avec l'éditeur de votre choix et nommez le easy2chroot. Par exemple :

gedit easy2chroot

J' emploie sudo car ce script doit être lancé avec les droits root et je n'en ai mis aucun dans le fichier.
Donnez lui les droits nécessaires :

sudo chmod a+x easy2chroot

et collez-y ces lignes:

#!/bin/bash

       if [[ ! $(whoami) = "root" ]]; then
        echo "Ce script doit être lancé avec les droits root."
        exit 1
       fi

             #Déclaration de la fonction Intro
       intro()
       {
            echo
            echo "easy2chroot vous permet de chrooter aisement une partition système détectée par os-prober
            il ne fait qu'executer des commandes à votre place.
            Vous n'aurez qu'a renseigner la partition racine que vous voulez <<chrooter>>"
            echo
            echo "Voici les partitions racine que vous pouvez chrooter.
            Veuillez patienter pendant la détection par os-prober."
       }

            #Détection des partitions systèmes
       detection()
       {
            echo
            os-prober | cat -b
       echo
       }

            #Déclaration de la fonction de selection
            selection()
            {
            echo "Quelle partition voulez-vous chrooter?
            important: Entrez la partition au format:
             /dev/sdXY"
       read -p "/dev/sd" choix
       echo "Vous avez choisi la racine /dev/sd$choix"
       echo     "Confirmez! Tapez[o] ou [n]?"

       read
            }

             #Déclaration de la fonction de montage automatique
            montageAuto()
            {
              mount /dev/sd$choix /mnt
              mount --bind /dev /mnt/dev
              mount -t proc /proc /mnt/proc
              mount -t sysfs /sys /mnt/sys
         mount -t devpts pts /mnt/dev/pts/
              echo "Vous êtes en chroot sur /dev/sd$choix
         Vous pouvez modifier  directement des fichiers systèmes.
         Pour utiliser des commandes propres à votre système chrooté
         vous devez renseigner le PATH. Copier/collez cette ligne:
         export PATH=/usr/bin:/bin:/usr/sbin:/sbin

                 Tapez exit pour quitter."
              chroot /mnt
           }

           #Déclaration de la fonction de demande de démontage
           demandedemontage()
           {
                  echo
                echo "Voulez-vous démonter automatiquement /dev/sd$choix ?
              Tapez[o] ou [n] pour continuer "
         read -r fin   
       }
           
       #Déclaration de la fonction démontage
       demontageAuto()
       {   
                 umount /mnt/proc
                 umount /mnt/sys
                 umount /mnt/dev
                 umount /dev/sd$choix /mnt
                 exit
        }

             #Déclaration de la fonction Avertissement
             avertissement()
           {
               echo "N'oubliez pas de démonter votre partition avant d'éteindre votre ordinateur!!
                #umount /mnt/proc
                #umount /mnt/sys
                #umount /mnt/dev
                #umount /dev/sd$choix /mnt
           "         
           }

         intro
         detection
         selection
           
       case $REPLY in

            o)montageAuto ;;
            n)selection ;;
       *)echo "Erreur de saisie" ; selection ;;

           esac   

       demandedemontage
     
             case $fin in

             o)demontageAuto ;;     
             n)avertissement ;;
        *)echo "Erreur de saisie" ; demandedemontage ;;
           esac
       exit

Pour le lancer si vous l'avez bien mis dans votre home, un simple :

sudo ./easy2chroot

Vous n'aurez qu 'a vous laisser guider.
Dîtes moi surtout ce qu'on pourrait faire pour l'améliorer. ;)

Edit: Modification du script pour les droits root et quelques améliorations .

easy2chroot

#2Messageil y a 9 ans

:bien
pas assez calé en script pour apporter quoi que ce soit. :desole:

Un point pour la discussion : pourquoi chez arch on ne monte rien avant chroot ? J'ai écris il y a quelque temps que arch-chroot remplaçait tous les montages proc, sys, etc.. avant chroot, et il s'avère que non.
ci dessous le contenu de arch-root.in contenu dans le paquet arch-install-scripts :

#!/bin/bash

shopt -s extglob

m4_include(common)

usage() {
  cat <<EOF
usage: ${0##*/} chroot-dir [command]

    -h             Print this help message

If 'command' is unspecified, ${0##*/} will launch /bin/sh.

EOF
}

if [[ -z $1 || $1 = @(-h|--help) ]]; then
  usage
  exit $(( $# ? 0 : 1 ))
fi

(( EUID == 0 )) || die 'This script must be run with root privileges'
chrootdir=$1
shift

[[ -d $chrootdir ]] || die "Can't create chroot on non-directory %s" "$chrootdir"

api_fs_mount "$chrootdir" || die "failed to setup API filesystems in chroot %s" "$chrootdir"
track_mount /etc/resolv.conf "$chrootdir/etc/resolv.conf" --bind

SHELL=/bin/sh chroot "$chrootdir" "$@"


Donc : faut il vraiment faire tous les montages sous manjaro ? Les wikis le dise. Je m'interroge. :sourire:

easy2chroot

#3Messageil y a 9 ans

:bjr:
Je me suis aussi posé la question. C'est de manière empirique que j'ai repris cette façon de monter donnée par ewolnux et qui a toujours bien fonctionné. Je me suis lancé dans ce script avec l'intention reprendre la fonction de choix numérique comme dans yaourt.
Et puis j'ai reculé devant le mur incompréhension ,et l'ai composé "from scratch" ,d'où la relative simplicité du code. Par contre ,il faut taper "/dev/sdXY" plutôt qu'un chiffre.... Ça reste un bon entraînement :sourire:

easy2chroot

#4Messageil y a 9 ans

ouaip, manque plus que fassil colle ce script dans un de ses isos, et j'essaierai peut être un jour Exx ! :gsourire:

easy2chroot

#5Messageil y a 9 ans

lemust83 a écrit :Créez un fichier texte dans votre home et nommez le easy2chroot. Par exemple :

    sudo gedit easy2chroot


J' emploie sudo car ce script doit être lancé avec les droits root et je n'en ai mis aucun dans le fichier.

il n'est pas utile de créer ce script en Root, d'autant qu'il est placé dans le home d'un utilisateur simple; le fait que le script appartienne à un utilisateur lambda ou à Root ne conditionne en rien ses droits d'exécution futurs.
ce qui attribue les droits d'exécution à ton script, c'est l'utilisateur qui le lance, pas l'utilisateur à qui il appartient (sauf si on ajoute un setuid).

et comme il est déconseillé de placer des fichiers appartenant à Root dans le home d'un utilisateur, source de problèmes ultérieurs...

easy2chroot

#6Messageil y a 9 ans

Je n'avais pas pensé à ça... En fait ,si on le lance sans sudo , le programme s’exécute avec des erreurs évidement .
A moins de rajouter un sudo devant os-prober dans le script, je ne vois pas trop comment on peux faire pour que la demande de MP soit automatique.

Edit : Le script a été modifié pour ne s'exécuter qu'en droits root.

easy2chroot

#7Messageil y a 9 ans

HeLLo,
Otacon a écrit :ouaip, manque plus que fassil colle ce script dans un de ses isos, et j'essaierai peut être un jour Exx ! :gsourire:


J'ai un alias "rooty" dans le .bashrc du live qui une fois la partition cible (à chrooter) renseignée s'occupe de tout sans rien démonter (tout démonter proprement dans la ram, pfuuu.. :clindoeil: ).

alias rooty='sudo mount /dev/sda4 /mnt && sudo mount --bind /dev /mnt/dev && sudo mount -t proc /proc /mnt/proc && sudo mount -t sysfs /sys /mnt/sys && sudo chroot /mnt'


@lemust, tant qu'on y est:
alias easy2chroot='sudo easy2chroot' # Explicatif
en mettant/laissant le script à sa place (/usr/bin) ?


Ps: Je pense que les raisons de "chrooter" sont moins nombreuses que ça, finalement, en fait c'est + d'accès terminal (tty) du tout sur le système malade pour lancer un truc...
Ps²: @lemust, je pense d'un coup qu'il faudra modifier le nom du script (mais pas l'alias) pour que cela fonctionne :clindoeil:
Dernière modification par fassilil y a 9 ans, modifié au total 1 fois.

easy2chroot

#8Messageil y a 9 ans

Salut Fassil. :bjr:
On peut bien sur résumer la commande à un simple alias.Ça sous entend qu'on connait parfaitement le nom de la partition à monter.
J'avais commencé avec blkid , mais les retours de cette commande sont un peu trop bavards et abscons pour un novice.Os-prober pour le coup, identifie nominativement les racines ,et ça ,c'est pas évident dans un alias.
Le coller dans /usrbin ou /usr/local/bin était ma première intention. L'idée en fait consistait à en faciliter l'usage depuis une live sans rien "installer" au sens propre du terme, c'est à dire en dehors du home. Si l'idée séduit ,je pourrais alors en faire un paquet installable depuis Aur, mais comme tu le dis si bien , les occasions ne sont pas aussi fréquentes que ça, et il est toujours plus important de savoir ce qu'on fait que de recourir à ce genre de script. Pourtant , je me dis que ça n'est pas totalement inutile. Au moins , on peut se faire une idée de ce qui se passe quand on tape dans un terminal .
Image

easy2chroot

#9Messageil y a 9 ans

Yep, mais tu peux aussi lancer ton script avec un alias (en modifiant un brin son nom), n'est-il pas ?
genre:
alias easy2chroot='/usr/bin/sudo easy2chroot'

Ps: X'cuses pour les multiples éditions/raturages, je teste en même temps que j'écris...

easy2chroot

#10Messageil y a 9 ans

Salut

On peut finalement simplifier un peu le chroot d'une partition sans utiliser un script ; en fait on va confier à deux alias une partie du taf.

En premier éditer .bashrc de root :

sudo <editeurdetexte> /root/.bashrc

Coller les alias suivants :

alias chrooton='mount --bind /dev /mnt/dev && mount -t proc /proc /mnt/proc && mount -t sysfs /sys /mnt/sys && chroot /mnt'
alias chrootoff='exit && umount /mnt/proc && umount /mnt/sys && umount /mnt/dev && umount /mnt && exit'


Ensuite tout est prêt ; manuellement on monte le système à réparer, par exemple /dev/sda1, puis on enchaîne avec l'alias chrooton :

su -
mount /dev/sda1 /mnt
chrooton


On fait maintenant la réparation par exemple un update-grub, puis on sort :

update-grub
chrootoff


Un petit redémarrage pour finaliser == normalement ce n'est pas nécessaire, le démontage étant fait proprement.

easy2chroot

#11Messageil y a 9 ans

Bon ,ben je n'aurais pas fait ça pour rien. Ça a permis de donner des idées.
Bien sur qu'il y avait plus simple . Ce que je visais était surtout la détection des partitions "chrootables" . Dans un alias ,il faut connaitre la à l'avance .
Comme je le rappelle ,c'était aussi un exercice pour moi :clindoeil:
Je vais m’atteler à d'autres idées du genre.

easy2chroot

#12Messageil y a 9 ans

lemust83 a écrit :Bien sur qu'il y avait plus simple . Ce que je visais était surtout la détection des partitions "chrootables" . Dans un alias ,il faut connaitre la à l'avance .

Mon alias ne mentionne pas de partition.

easy2chroot

#13Messageil y a 9 ans

Oui ,mais je pense que tu devrais l’appeler autrement que chroot afin d'éviter un risque de redondance :
alias chroot='mount --bind /dev /mnt/dev && mount -t proc /proc /mnt/proc && mount -t sysfs /sys /mnt/sys && chroot /mnt'

easy2chroot

#14Messageil y a 9 ans

Yep, un alias ne doit pas exister comme commande, sinon peut-être:

[fassil@manjaro ~]$ chroot
chroot: opérande manquant
Saisissez « chroot --help » pour plus d'informations.

easy2chroot

#15Messageil y a 9 ans

Pas essayé :cartonrouge: Eh bien on va l’appeler chrooton. Je rectifie.

easy2chroot

#16Messageil y a 9 ans

Ça ne fonctionne pas.

J'ai essayé ton alias, fassil, et voici le retour (idem à ce que j'obtiens avec ma version) :

┌──[11-12-2014 12:56:04] [thierry@pc-thierry] ~ 
└──[$] → rooty
[sudo] password for thierry:
groups: impossible de trouver le nom pour le GID 19

l'alias rooty :

alias rooty='sudo mount /dev/sdb2 /mnt && sudo mount --bind /dev /mnt/dev && sudo mount -t proc /proc /mnt/proc && sudo mount -t sysfs /sys /mnt/sys && sudo chroot /mnt'

easy2chroot

#17Messageil y a 9 ans

Dans l'alias rooty , il y a /dev/sdb2 . Ça correspond avec ce que tu veux?
GID me fait penser à un problème de reconnaissance du MP Utilisateur/Root.

easy2chroot

#18Messageil y a 9 ans

lemust83 a écrit :Dans l'alias rooty , il y a /dev/sdb2 . Ça correspond avec ce que tu veux?
GID me fait penser à un problème de reconnaissance du MP Utilisateur/Root.

En fait ça fonctionne très bien comme dit ici.

Ça ne fonctionnait pas parce que je chrootait (depuis manjaro) un autre système que manjaro (les mdp sont identiques).

J'ai donc utilisé le mien d'alias que j'ai finalement appelé chrooton. J'ai chrooté depuis manjaro-kde une session manjaro-mate sans aucun souci.

C'est au niveau du démontage de la partition qu'il faut maintenant fouiner car actuellement il faut redémarrer.

easy2chroot

#19Messageil y a 9 ans

Pour le démontage propre il faut passer ces commandes (dont je vais faire un alias) :

exit
umount /mnt/proc
umount /mnt/sys
umount /mnt/dev
umount /mnt
exit


Je vais reprendre le message plus haut et inclure encore cet alias de démontage.

easy2chroot

#20Messageil y a 9 ans

J'avais remarqué que le démontage pose parfois problème.
J'ai d'ailleurs mis la fonction de démontage auto dans le script qui est analogue à la tienne.
J'ai aussi noté que plusieurs opérations chroot peuvent obliger à rebooter à moins de savoir jouer du fuser -k et de repointer le chemin de /bin dans le noyau.....
Répondre