Pages : 1
#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
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 !
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
!
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 je ferais mieux maintenant que je sais
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
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 , 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.
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.
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
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
On ne peut pas mettre d'array dans un string!
https://sputnick.fr/
Hors ligne
#21 Le 10/09/2010, à 19:22
- Josepe36
Hors ligne
Pages : 1