Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 09/09/2010, à 18:05

Josepe36

question initrd

bonsoir

je suis en cours d'éssais sur le fonctionnement de script lancer avec un noyau et in initramf.

l'idée c'est un script qui restaure et met a jour grub sur une partition choisie.

j'inclue le script dans init, ça fonctionne jusqu'a la phase du chroot.

le montage de la partition réussie, le chroot aussi mais la commande donnée en argument echoue :

chroot $partition_choisi /mnt bash update-grub

un resultat ressamblant à ça :

bash : not file found (de mémoire)

si quelqu'un a une experience en ce sens je serai interessé d'en apprendre à ce sujet


Développeur distribution Hybryde
www.hybryde.org

Hors ligne

#2 Le 09/09/2010, à 18:31

sputnick

Re : question initrd

man chroot nous apprend :

chroot NOUVRACINE [COMMANDE...]

toi tu met 2 arguments de montage, c'est pas bon.


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#3 Le 09/09/2010, à 19:04

Josepe36

Re : question initrd

bonsoir sputnick

en fait c'est exactement le meme script que j'ai posté récement et qui fonctionne parfaitement a partir d'une session normal.

pour info voici le script (non modifier pour init ) qui fonctionne sans soucis.
je te demanderai d'etre clément car je suis loin d'avoir ton niveau en bash.

#! /bin/bash



update_grub()
{
    control=$(ls /cdrom | grep casper)

    if [ -z "$control" ]
then echo -e "
*____________________Vous n'étes pas sur une live session !!!

FIN DU SCRIPT" ;sleep 2 

else

echo -e "CET OUTIL VOUS PERMET DE METTRE A JOUR GRUB
A PARTIR D'UN LIVECD" ;sleep 2

part_ext=$(blkid|grep -i "ext"|cut -c1-9)
if [ "$part_ext" ]
then
while [ -z "$partitiongrub" ];do
clear ;
echo -e "
A PARTIR DE QUELLE PARTITION GRUB
DOIT IL LIRE LES INFORMATIONS ?
"$part_ext"
"
read partitiongrub

done

									###############################################REPR
echo -e "MISE A JOUR DE GRUB A PARTIR DE $partitiongrub" ; sleep 2
    mount $partitiongrub /mnt ;
    mount --bind /dev/ /mnt/dev/;
    mount --bind /proc /mnt/proc/;
    mount --bind /sys/ /mnt/sys/;
chroot /mnt/ bash update-grub ;
    umount /mnt/dev
    umount /mnt/proc
    umount /mnt/sys
    umount /mnt/


echo -e "MISE A JOUR DE GRUB TERMINÉE"; sleep 2
else chec
fi
fi
partitiongrub=""
}


################################# FONCTION GRUB_INSTALL
grub_install()
{

    control=$(ls /cdrom | grep casper)

    if [ -z "$control" ]
then echo -e "
*____________________Vous n'étes pas sur une live session !!!

FIN DU SCRIPT" ;sleep 2 
reset
chec
else
echo -e "CET OUTIL VOUS PERMET D'INSTALLER GRUB
A PARTIR D'UN LIVECD" ;sleep 2

part_ext=$(blkid|grep -i "ext"|cut -c1-9)
if [ "$part_ext" ]
then
while [ -z "$partitiongrub" ];do
clear ;
echo -e "
A PARTIR DE QUELLE PARTITION GRUB
DOIT IL LIRE LES INFORMATIONS ?
"$part_ext"
"
read partitiongrub
done
while [ -z "$diskgrub" ];do
clear ;
echo -e "
SUR QUEL DEBUT DE DISQUE VOULEZ VOUS 
INSTALLER GRUB ?
"
read diskgrub
done
									###############################################REPR
echo -e "INSTALLATION DE GRUB " ; sleep 2
    mount $partitiongrub /mnt ;
    mount --bind /dev/ /mnt/dev/;
    mount --bind /proc /mnt/proc/;
    mount --bind /sys/ /mnt/sys/;
chroot /mnt/ bash grub-install $diskgrub ;
    umount /mnt/dev
    umount /mnt/proc
    umount /mnt/sys
    umount /mnt/


echo -e "INSTALLATION DE GRUB TERMINÉE"; sleep 2
else chec
fi
fi

partitiongrub=""

}
editeur2()
{
clear ;
fin=0 ;
until test "$boucle" = $fin
do
clear ;

cat << 'FIN MENU'
QUEL ACTION SOUHAITEZ VOUS EFFECTUER ?

	1 ) Installer GRUB

	2 ) Mise à jour de GRUB

        3 ) QUITTER

FIN MENU

echo -e "Votre choix : \c" ;
read boucle ;

case "$boucle" in

	1) clear ; grub_install; 
	   clear
	   ;;

	2) clear ; update_grub; 
	   
	   ;;

	3) clear ; exit 0; 
	   
	   ;;

esac
done

}

editeur2

Développeur distribution Hybryde
www.hybryde.org

Hors ligne

#4 Le 09/09/2010, à 19:10

Josepe36

Re : question initrd

je précise que le shell dans l'initranf est "sh", je me suis donc lancé a l'installation de bash.

j'ai copié /bin/bash dans le /bin de l'initramfs et /lib/libncurses.so.5.7 et /lib/libncurses.so.5 (lien symbolique car .so.5.7 est une bibliotheque partagée).

donc à priori je devrais pour utiliser bash.
pour que le script fonctionne dans init il faut laisser en entete #! /bin/sh.

voilà ou j'en suis, le chroot coince je ne sais pas pour quel raison pour l'instant


Développeur distribution Hybryde
www.hybryde.org

Hors ligne

#5 Le 09/09/2010, à 19:27

sputnick

Re : question initrd

Je n'ai pas grand chose à dire sur ton script de toutes façons, c'est un peu une suite d'instructions simples et tu me demande d'être clément wink
En revanche, pas besoin d'être un guru du shell pour indenter son code. Non seulement tu finira par commettre des erreurs à cause de ça, mais en outre c'est très désagréable à déchiffrer pour ceux qui te lisent. http://fr.wikipedia.org/wiki/Indentation

Sinon pour en revenir à ce qui nous préoccupe :

chroot /mnt/ bash grub-install $diskgrub ;

dans ton code, ton chroot a bien deux points de montage, mais le second est un argument au script grub-install ! c'est très différent !
chroot fonctionne comme ça :

chroot /point/de/montage

ca représente le minimum syndical, chroot change de racine et va chercher le shell par défaut du point de montage.

chroot /point/de/montage /bin/bash

va changer de racine et lancer le shell bash

chroot /point/de/montage /bin/bash --version

va changer de racine et lancer le shell bash en donnant sa version


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#6 Le 09/09/2010, à 21:50

Josepe36

Re : question initrd

je te remercie te porter attention à ma requette, oui je ferai en sorte de poster un script commenté la prochaine fois.
je vais faire les essais avec les explications que tu me donnes, je souhaite passer ce cap car le but est de pouvoir lancer mes propres scripts sans lancer un systeme complet dans l'avenir.

et comme je te l'ai déjas dit je trouve ton bash trés interessant et tu verras certainement des morceaux que tu as poster apparaitre prochainement.

je te tiens au courant, merci

a+


Développeur distribution Hybryde
www.hybryde.org

Hors ligne

#7 Le 09/09/2010, à 22:19

Josepe36

Re : question initrd

bon visiblement le probléme que je rencontre vient du fait que le shell de l'initranf est sh et non bash.

j'ai installer bash et les dependances dans l'initrd, mais je n'arrive pas a prendre en compte le shell bash à la place de sh.

je vais reflechir et chercher des solutions


Développeur distribution Hybryde
www.hybryde.org

Hors ligne

#8 Le 09/09/2010, à 22:19

sputnick

Re : question initrd

@Josepe36 rhoooo t'es terrible ! je ne te parle pas de commentaires mais d'indentation, c'est pas du tout pareil ! wink

Je pense que tu ne saisit pas complètement la commande chroot, je te conseille de faire plein de tests pour la comprendre.


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#9 Le 09/09/2010, à 22:21

sputnick

Re : question initrd

Et au lieu de taper

chroot /point/de/montage bash arguments

il faut absolument faire

chroot /point/de/montage /bin/bash arguments

! smile


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#10 Le 09/09/2010, à 22:35

Josepe36

Re : question initrd

oui je comprend bien ce que tu m'expliques au sujet de chroot, cela ne me pose aucun souci dans un environement "normal".

en montant /dev/sda6(partition ubuntu) dans /mnt
en appliquant les montages de coutume, dev, sys et proc dans ma future racine et en faisant :

chroot /mnt bash update-grub

cela fonctionne trés bien.

En revanche ici le probleme c'est lorsque l'on est dans l'environement de l'initrd, le comportement n'est plus le meme.

je sais pas si tu as bien saisi ce que j'essais de faire ?

je decompresse l'archive cpio, modifie le fichier init, recompresse mon cpio et teste le resultat.
Mais je ne veux pas monter la racine, je ceux seulement travail avec l'initrd.

ps : oui maitre sputnick, j'ai bien pris pour l'indentation tongue je ferais mieux maintenant que je sais wink

Dernière modification par Josepe36 (Le 09/09/2010, à 22:37)


Développeur distribution Hybryde
www.hybryde.org

Hors ligne

#11 Le 09/09/2010, à 22:51

sputnick

Re : question initrd

Si je comprens le contexte de ce que tu fais. Donne moi l'erreur avec /bin/bash à la place de bash et les valeures attendues de :

chroot $partition_choisi /mnt bash update-grub

On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#12 Le 10/09/2010, à 05:55

Josepe36

Re : question initrd

bonjour

j'ai fais les essais avant de me coucher, le comportement est le meme.

le message ressemnble à ça

bash : update-grub :file not found

avec tes propositions ou sans c'est pareil.

tiens regarde un exemple de ce que ça donne avec un simple ls en environnement ubuntu :

larrieu@larrieu-laptop:~$ sudo mount /dev/sda6 /mnt/
larrieu@larrieu-laptop:~$ mount --bind /dev/ /mnt/dev/
mount: seul l'usager ROOT peut faire cela
larrieu@larrieu-laptop:~$ sudo mount --bind /dev/ /mnt/dev/
larrieu@larrieu-laptop:~$ sudo mount --bind /proc/ /mnt/proc/
larrieu@larrieu-laptop:~$ sudo mount --bind /sys/ /mnt/sys/
larrieu@larrieu-laptop:~$ sudo chroot /mnt/ ls
bin  boot  cdrom  dev  etc  home  initrd.img  lib  lib64  media  mnt  opt  proc  root  sbin  selinux  srv  sys  tmp  usr  var  vmlinuz
larrieu@larrieu-laptop:~$ sudo chroot /mnt/ 
root@larrieu-laptop:/# ls
bin  boot  cdrom  dev  etc  home  initrd.img  lib  lib64  media  mnt  opt  proc  root  sbin  selinux  srv  sys  tmp  usr  var  vmlinuz
root@larrieu-laptop:/# 
root@larrieu-laptop:/# exit
exit
larrieu@larrieu-laptop:~$ ls
amsn_received          Capture.png  disque     grub.sh       ini2             lanceur.sh  pour-bernard.sh  RAPPORT          test2.sh       Vidéos
boiitte-outil.sh.back  d            Documents  Images        init-grub.sh     Modèles     Public           SAUVEGARDE       test.sh        workspace
Bureau                 dialog.sh    FrostWire  important.sh  installateur.sh  MUSIQUES    racine           Téléchargements  tinycore.cpio  xterm

ici on voit tres bien qu'en donnant une commande en argument a chroot, celui l'execute dans la nouvelle racine et la quitte dés que la commande demandée est terminé.

ce comportement est le meme dans le script.


Développeur distribution Hybryde
www.hybryde.org

Hors ligne

#13 Le 10/09/2010, à 06:15

Compte anonymisé

Re : question initrd

Salut

Je n'ai pas suivi tout le feuilleton, mais je ne suis pas sûr qu'update-grub soit dans le path de recherche. Donc ce que je tenterai :

chroot $partition_choisi /mnt /bin/bash /usr/sbin/update-grub

@+

#14 Le 10/09/2010, à 12:13

sputnick

Re : question initrd

tout a fait jeanjd63


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#15 Le 10/09/2010, à 16:00

Josepe36

Re : question initrd

bonjour

@jeanjd63: tu as vu juste, et voici pourquoi ....

ça y'es ça fonctionne, mais je suis mal à l'aise de vous dire que le probléme n'etait pas dans le code mais dans ma tete tongue

en effet j'ai deux partition racine sur mon disque, une ou je fais des test d'installation via l'installateur que j'ai bashé et l'autre avec l'installation actuelle qui est un peu exotique.

je m'explique, sur cette racine /usr est vide big_smile, donc les binaire utilisés par les outils d'installation et de mise à jour de grub sont inaccéssible.
et lors de mes test a chaque compression de l'initramfs je les faisai sur cette partition donc message d'erreur. roll

Donc la commande est bien :

chroot /mnt bash update-grub (ou ce que l'on veut)

à savoir, c'est que le chroot quiitte à la fin de la commande donc pour executer un script complet dans le chroot j'ai contourné le probléme en éditant en amont un script dans la racine a chrooter
exemple:

echo "
#! /bin/bash

update-grub 

exit

" > /mnt/bin/monscript.sh

	mount --bind /dev/ /mnt/dev/;
	mount --bind /proc /mnt/proc/;
	mount --bind /sys/ /mnt/sys/;
						
		chroot /mnt bash /bin/monscript.sh ;
		rm /mnt/bin/monscript.sh

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

merci pour votre aide, maintenant je vais pouvoir me faire ma boitte a outil bootable en 5 seconde grace à initrd.

a+

Dernière modification par Josepe36 (Le 10/09/2010, à 16:02)


Développeur distribution Hybryde
www.hybryde.org

Hors ligne

#16 Le 10/09/2010, à 16:19

sputnick

Re : question initrd

Wé ou plus simple et concis:

for i in dev proc sys; do mount --bind $i /mnt/$i; done
chroot /mnt /bin/bash <<EOF
update-grub 
exit
EOF
umount /mnt/{dev,proc,sys}
umount /mnt/

On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#17 Le 10/09/2010, à 17:56

Josepe36

Re : question initrd

yes , ben je me suis pas trompé en disant que ton bash est excellent.
j'ai pas encore cette logique, le montage dans la boucle for c'est du tonnerre whaou !!!

en revanche j'ai déjas vu EOF dans pas mal de scripts, suite à ta démonstration j'ai fais une recherche et suis tombé sur wikipedia.
Mais pas trop saisie la chose, alors j'ai fais quelques test simple dans le terminal et la subtilitée de la chose m'est apparue. big_smile

c'est génial, merci.

Dernière modification par Josepe36 (Le 10/09/2010, à 17:57)


Développeur distribution Hybryde
www.hybryde.org

Hors ligne

#18 Le 10/09/2010, à 18:13

sputnick

Re : question initrd

EOF est une chaine arbitraire (comprendre on peut mettre POUET à la place) qui signifie le début et la fin de l'entrée standard de ce here-doc
On aurais tout aussi bien pu le faire avec echo avec un pipe :

echo -e "update-grub\nexit" | chroot /mnt/root /bin/bash

Un peu de doc : http://mywiki.wooledge.org/HereDocument


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#19 Le 10/09/2010, à 18:51

Josepe36

Re : question initrd

génial, je commence sérieusement a m'éclatter.

il y'a tellement de subitilitées a connaitre, mais de toute façon je vais arreter un moment de bricoler pour me remettre dans la théorie.

est ce que cela ne te derange pas si de temps a autre je me permet de te demander conseil ?


Développeur distribution Hybryde
www.hybryde.org

Hors ligne

#20 Le 10/09/2010, à 18:55

sputnick

Re : question initrd

Josepe36 a écrit :

est ce que cela ne te derange pas si de temps a autre je me permet de te demander conseil ?

On (je) suis (est) là pour ça wink


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#21 Le 10/09/2010, à 19:22

Josepe36

Re : question initrd

merci c'est génial

bonne soirée


Développeur distribution Hybryde
www.hybryde.org

Hors ligne