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 03/03/2017, à 13:08

dzeekee

GRUB 2 est devenu "fou" !

Bonjour,

Depuis quelques jours, mon GRUB est devenu complètement "fou"
Le démarrage peut prendre jusqu'à 4 heures (avant que le menu GRUB apparait).

J'ai essayé le boot-repair mais ça n'as pas marché (même impossible de générer un rapport en pastebin mais fichier texte oui, mais il est énorme (7.3 Mo !))

En regardant dans le fichier grub.cfg, je trouve qu'il y a comme une anomalie,
d'abord le fichier est énorme (3.6 Mo), il est très long car il y a des milliers de texte de ce style
Voici un petite extrait, ces entrés "menuentry" ces répètent par milliers (mais elle ne sont pas identiques)

}
	menuentry 'Ubuntu, with Linux 4.4.0-21-generic (upstart) (sur /dev/sda6) (sur /dev/sda7) (sur /dev/sda6) (sur /dev/sda7) (sur /dev/sda6) (sur /dev/sda7) (sur /dev/sda6) (sur /dev/sda7) (sur /dev/sda6) (sur /dev/sda7) (sur /dev/sda6) (sur /dev/sda8) (sur /dev/sda7) (sur /dev/sda8) (sur /dev/sda7) (on /dev/sda8)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.4.0-21-generic--71c55562-5ed5-46e4-ad18-4ddf46f246a3' {
		insmod part_msdos
		insmod ext2
		set root='hd0,msdos8'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos8 --hint-efi=hd0,msdos8 --hint-baremetal=ahci0,msdos8  71c55562-5ed5-46e4-ad18-4ddf46f246a3
		else
		  search --no-floppy --fs-uuid --set=root 71c55562-5ed5-46e4-ad18-4ddf46f246a3
		fi
		linux /boot/vmlinuz-4.4.0-21-generic root=UUID=ce5ed4b4-5185-410b-a0c6-fa79de864c10 ro quiet splash $vt_handoff init=/sbin/upstart
		initrd /boot/initrd.img-4.4.0-21-generic
	}
	menuentry 'Ubuntu, with Linux 4.4.0-21-generic (recovery mode) (sur /dev/sda6) (sur /dev/sda7) (sur /dev/sda6) (sur /dev/sda7) (sur /dev/sda6) (sur /dev/sda7) (sur /dev/sda6) (sur /dev/sda7) (sur /dev/sda6) (sur /dev/sda7) (sur /dev/sda6) (sur /dev/sda8) (sur /dev/sda7) (sur /dev/sda8) (sur /dev/sda7) (on /dev/sda8)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.4.0-21-generic-root=UUID=ce5ed4b4-5185-410b-a0c6-fa79de864c10 ro recovery nomodeset-71c55562-5ed5-46e4-ad18-4ddf46f246a3' {
		insmod part_msdos
		insmod ext2
		set root='hd0,msdos8'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos8 --hint-efi=hd0,msdos8 --hint-baremetal=ahci0,msdos8  71c55562-5ed5-46e4-ad18-4ddf46f246a3
		else
		  search --no-floppy --fs-uuid --set=root 71c55562-5ed5-46e4-ad18-4ddf46f246a3
		fi
		linux /boot/vmlinuz-4.4.0-21-generic root=UUID=ce5ed4b4-5185-410b-a0c6-fa79de864c10 ro recovery nomodeset
		initrd /boot/initrd.img-4.4.0-21-generic
	}

the "menuentry" il y en a des milliers !

Je suppose que c'est ça qui ralenti le démarrage.

pour l'info:
Je n'ai qu'un seul HD (sda), partitioné comme suit:

============================= Boot Info Summary: ===============================

 => Grub2 (v2.00) is installed in the MBR of /dev/sda and looks at sector 1 of 
    the same hard drive for core.img. core.img is at this location and looks 
    for (,msdos6)/boot/grub. It also embeds following components:
    
    modules
    ---------------------------------------------------------------------------
    fshelp ext2 part_msdos biosdisk
    ---------------------------------------------------------------------------

sda1: __________________________________________________________________________

    File system:       ntfs
    Boot sector type:  Windows Vista: NTFS
    Boot sector info:  No errors found in the Boot Parameter Block.
    Operating System:  
    Boot files:        /BOOTMGR /BOOT/BCD

sda2: __________________________________________________________________________

    File system:       ntfs
    Boot sector type:  Windows 8/2012: NTFS
    Boot sector info:  No errors found in the Boot Parameter Block.
    Operating System:  
    Boot files:        /bootmgr /Boot/BCD

sda3: __________________________________________________________________________

    File system:       ntfs
    Boot sector type:  Windows 7/2008: NTFS
    Boot sector info:  No errors found in the Boot Parameter Block.
    Operating System:  
    Boot files:        /bootmgr /Boot/BCD /Windows/System32/winload.exe

sda4: __________________________________________________________________________

    File system:       Extended Partition
    Boot sector type:  -
    Boot sector info: 

sda5: __________________________________________________________________________

    File system:       swap
    Boot sector type:  -
    Boot sector info: 

sda6: __________________________________________________________________________

    File system:       ext4
    Boot sector type:  -
    Boot sector info: 
    Operating System:  Ubuntu 16.04.2 LTS
    Boot files:        /boot/grub/grub.cfg /etc/fstab 
                       /boot/grub/i386-pc/core.img

sda7: __________________________________________________________________________

    File system:       ext4
    Boot sector type:  -
    Boot sector info: 
    Operating System:  Ubuntu 16.04.2 LTS
    Boot files:        /boot/grub/grub.cfg /etc/fstab 
                       /boot/grub/i386-pc/core.img

sda8: __________________________________________________________________________

    File system:       ext4
    Boot sector type:  -
    Boot sector info: 
    Operating System:  Ubuntu 16.04.2 LTS
    Boot files:        /boot/grub/grub.cfg /etc/fstab 
                       /boot/grub/i386-pc/core.img

Comment pourrai-je résoudre ce problème ?
éditer je ne sais pas quel fichier et virer ces milliers de texte/code.

Merci pour votre aide et bonne journée.

Cordialement,
Janus

Dernière modification par dzeekee (Le 03/03/2017, à 13:10)

Hors ligne

#2 Le 03/03/2017, à 13:39

malbo

Re : GRUB 2 est devenu "fou" !

Et est-ce que tu arrives à démarrer normalement sur Windows ?
D'autre part, peux-tu donner le nom du modèle de ton ordi et son fabricant ?
Le partitionnement que tu as collé dans ton post #1, c'est un extrait d'un Boot-Info récent ? Si oui ça fait peur : tu aurais trois installation de Ubuntu 16.04.2 sur le même disque (une sur sda6, une sur sda7 et une sur sda8)

Dernière modification par malbo (Le 03/03/2017, à 13:40)

Hors ligne

#3 Le 03/03/2017, à 14:41

Christophe C

Re : GRUB 2 est devenu "fou" !

J'ai déjà eu cela. Un grub monstrueux et très lent. A priori, c'était grub-customizer qui me l'avait explosé.

J'avais réinstallé le grub via un sudo grub-install /dev/sda (je suppose que ton grub est sur SDA), suivi d'un sudo update-grub

Perso, cela avait marché.

Dernière modification par Christophe C (Le 03/03/2017, à 15:51)


BountySource - Faite un petit don, ponctuel ou récurent, pour soutenir le développement de XFCE.
Timeshift - Sécurité : pensez à paramétrer des points de restauration système.
Euclide : « Ce qui est affirmé sans preuve peut être nié sans preuve ».

Hors ligne

#4 Le 03/03/2017, à 14:46

Bougron

Re : GRUB 2 est devenu "fou" !

Bonjour
Ton problème est malheureusement très classique lorsque tu empiles des versions de ubuntu.
Dans le grub, elles ne s'ajoutent pas. Elles se multiplient!
Comme tu as la chance d'avoir pu booter
A)

 sudo chmod -x /etc/grub.d/30_os-prober

B)

sudo update-grub

C) Vérifier que le fichier a bien changé de taille

wc /boot/grub/grub.cfg

D) entreprendre la vraie réparation .
    https://forum.ubuntu-fr.org/viewtopic.p … #p21605078

Donc la réparation que je vois
   1) identifier toutes les partitions susceptibles de contenir un ubuntu installé
   

 sudo blkid

                                         Vu ce que tu as posté, Cela devrait donner SDA7 et SDA8, car SDA6 est certainement celui que tu as choisis pour booter
pour chacune de ces partitions
   1) Monter la partition
   2) Ouvrir par gedit le fichier /boot/grub/grub.cfg de cette partition.
  3) Supprimer tout ce qui est en trop dans ce fichier.
    C'est à dire tout ce qui suit la ligne ### END /etc/grub.d/10_linux ###
  4) Sauver le fichier.

5) Installer l'application kclean dans ta partition actuelle=> https://forum.ubuntu-fr.org/viewtopic.php?id=242358
6) Exécuter kclean afin d'enlever les dizaines des noyaux que tu as certainement dans ton ubuntu qui vient de mettre en route.
 

  sudo kclean -k

7) Remettre la détection des autres OS

 sudo chmod +x /etc/grub.d/30_os-prober
sudo update-grub

8) Puis au prochain boot, tu pourras choisir un autre OS et lui faire l'opération " non détection des noyaux et kclean"
   

 sudo chmod -x /etc/grub.d/30_os-prober

     http://hoper.dnsalias.net/tdc/public/kclean.deb
     

  sudo kclean -k

9) Itération à faire pour l'autre  OS.

En résumé, seul l'OS actuel que le bios te propose pour booter est autorisé à rechercher la totalité des OS présents sur le disque.
Je suis parti du principe que c'était celui que tu viens de lancer (SDA6).

 => Grub2 (v2.00) is installed in the MBR of /dev/sda and looks at sector 1 of 
    the same hard drive for core.img. core.img is at this location and looks 
    for (,msdos6)/boot/grub. It also embeds following components:

     Mais rien ne le prouve.

Dernière modification par Bougron (Le 07/03/2017, à 11:53)

Hors ligne

#5 Le 03/03/2017, à 20:16

dzeekee

Re : GRUB 2 est devenu "fou" !

Merci beaucoup à tous.

Très instructive, je vais essayer de m'en sortir avec vos conseils.

Je vous tiens au courant.

Encore merci et bonne soirée.

Hors ligne

#6 Le 04/03/2017, à 00:56

Babdu89

Re : GRUB 2 est devenu "fou" !

Bonsoir.

@Bougron.
Dans tes commandes. Tu es sur que c'est le script 40_custom ?  je dirais plutôt le script 30_os-prober,  non??.

sudo chmod -x /etc/grub.d/40_custom

Je pense plutôt à ceci;

sudo chmod -x /etc/grub.d/30_os-prober

Pour info, j'aide à tester un script, qui lorsqu'il fonctionnera bien, va régler ce souci.
Le script servira aussi de savoir dans le cas d'un multi boot, ce qui est installé dans les partitions, en mettant un label au partitions systèmes des Os.

Actuellement. Si on ne met pas de label aux partitions système des Os, cette partie du script n'a aucun effet. On peut donc l'utiliser uniquement pour faire maigrir les fichier grub.cfg

Lire le sujet pour bien comprendre ce qu'il se passe.
Svp, tant que l'auteur du script n'aura pas repris ses tests, prière de ne pas encombrer le sujet avec des questions auxquelles il ne répondrait pas. Merci.

Conseil pour ceux qui veulent tester le script en toute sécurité.

Dans l'Os qui sert à démarrer la machine. Créer un dossier "tests" (ou autre nom) dans  /boot/grub  , y copier/coller le fichier gub.cfg à faire maigrir.
Utiliser le script, en indiquant le chemin du fichier à traiter   /boot/grub/tests/grub.cfg  , lorsque ce sera demandé dans la boîte de dialogue ouverte par le script.
Le script installé depuis l'Os qui sert au démarrage de la machine, est capable de traiter tous les fichiers ; /boot/grub/grub.cfg  des Os installés. Il suffit d'indiquer le chemin qui convient pour les  grub.cfg de chaque Os.

J'attends le retour de l'auteur du script pour continuer les tests.
On a un souci avec les label des partitions qui se répètent lorsque l'on traite plusieurs fois le fichier grub.cfg avec le script.

Les multiples traitement du fichier avec le script, c'est le cas avec chaque nouvelle installation, mise à jour de grub, et avec les maj système qui génère une maj de grub. On doit repasser le fichier grub.cfg à la "moulinette".

Lorsque ce script sera vraiment opérationnel. Il permettra d'éviter de désactiver le script  /etc/grub.d/30_os-prober dans les Os autres que celui qui sert au démarrage, et de savoir quel est le système installé sur les partitions systèmes, à condition d'y mettre des label.

Voir ce sujet, pour ceux que çà intéresse.

https://forum.ubuntu-fr.org/viewtopic.php?id=2004576


Dernier post du sujet pour le moment.

https://forum.ubuntu-fr.org/viewtopic.p … #p21680976

@+.   Babdu89  .

Dernière modification par Babdu89 (Le 04/03/2017, à 01:15)


J'ai découvert Ubuntu avec la 07.10.... Et alors?!...  Depuis je regarde de temps en temps si Windows marche toujours....

Hors ligne

#7 Le 04/03/2017, à 05:31

moko138

Re : GRUB 2 est devenu "fou" !

Quel est l'intérêt de ce script ?

Je ne comprends pas (à part la satisfaction intellectuelle de mettre au point un script), l'intérêt d'alourdir tous les systèmes d'un script, quand il y a déjà deux solutions éprouvées et légères.

Pour mémoire (cf. ./viewtopic.php?pid=21604969#p21604969) :
- bloquer os-prober dans tous les systèmes sauf un ;
       Ou bien
- désinstaller tous les grub, sauf un bien réinstallé dans le MBR. 
Cette solution, indiquée par Rufus T. et de loin la plus légère, fonctionne chez Rufus et chez moi.


%NOINDEX%
Un utilitaire précieux : ncdu
Photo, mini-tutoriel :  À la découverte de dcraw

Hors ligne

#8 Le 04/03/2017, à 10:51

Babdu89

Re : GRUB 2 est devenu "fou" !

Bonjour.

moko138 a dit;
Je ne comprends pas (à part la satisfaction intellectuelle de mettre au point un script), l'intérêt d'alourdir tous les systèmes d'un script, quand il y a déjà deux solutions éprouvées et légères.

L'intérêt est double.
Faire maigrir les fichiers grub.cfg des config multi Os. (Ok on sait faire autrement. À mon avis ce n'est pas plus mal d'y arriver, sans avoir à modifier les fichiers de configuration de Grub, (30_os-prober) en utilisant le script.

Et surtout, deuxième intérêt lorsque ce sera au point. En mettant des label explicites aux partitions système des Os installés, savoir à l'affichage du menu Grub quels sont les Os installés sur les partitions proposées au démarrage depuis le menu Grub.

Si avec un grub v1.98/99 on sait faire cette manip, on voit le nom des Os installé dans les menuentry. (modification de  /etc/default/grub  + maj de grub.)
Mais, avec un Grub v2.00 et suivantes. Le menu Grub affiche bien le nom du premier Os proposé, mais affiche 'Ubuntu....' pour les suivants. Si on veut savoir à quoi on a affaire, il faut ouvrir les lignes Options avancées pour Ubuntu de chaque bloc menuentry. Après avoir fait la modif indiquée ci-dessus.  Ce n'est pas pratique.
C'est ce qui m'a incité à aider en testant.

De plus on n’alourdit qu'un système, puisque le script installé sur l'Os qui démarre la machine par défaut peut modifier  tous les fichier grub.cfg des autres Os sans avoir à l'installer dans chacun d'eux.

@+.   Babdu89   .

Dernière modification par Babdu89 (Le 04/03/2017, à 10:55)


J'ai découvert Ubuntu avec la 07.10.... Et alors?!...  Depuis je regarde de temps en temps si Windows marche toujours....

Hors ligne

#9 Le 04/03/2017, à 21:23

dzeekee

Re : GRUB 2 est devenu "fou" !

Yes, ça a marché smile)))

Merci beaucoup à tous le monde.

J'ai utilisé la méthode A + B de Bougron pour l'OS sur le quel j'ai eu la chance de démarrer
Mais en utilisant pour A le

sudo chmod -x /etc/grub.d/30_os-prober

à la place de

sudo chmod -x /etc/grub.d/40_custom

Et ensuite la méthode de Babdu89
https://forum.ubuntu-fr.org/viewtopic.p … #p21605134
Pour arranger le grub.cfg des autres OS

Maintenant je voudrais carrément supprimer le troisième UBUNTU, pour en avoir que W10 + 2x UBUNTU (ça fera moins bordel à l'avenir), avant procéder peut-être (je ne suis pas un as de terminal) à nettoyage de innombrables kernels, etc.

Comment faire ça proprement (supprimer le 3-ème UBUNTU) ?

Et encore merci beaucoup à tous le monde

Hors ligne

#10 Le 05/03/2017, à 01:36

Babdu89

Re : GRUB 2 est devenu "fou" !

Bonsoir.

Dans la discussions que tu indiques.
J'explique comment "désactiver" le script  /etc/grub.d/30_os-prober en mode graphique (en décochant... + une maj de grub), pour que la rubrique  30_os-prober des fichiers grub.cfg soit vide.

Bougron dans le post;

https://forum.ubuntu-fr.org/viewtopic.p … #p21605142

De la même discussions indique comment le faire en commandes. pour obtenir le même résultat.

Post#1 on voit que tu as 3 Ubuntu installé.
Un en /dev/sda6, un en  /dev/sda7,un en /dev/sda8
La machine démarre sur celui qui est installé en /dev/sda6.
Lequel veux tu supprimer.

Pour le nettoyage des noyaux, tu installes Kclean dans les deux Ubuntu qui resteront dans la machine.

https://forum.ubuntu-fr.org/viewtopic.php?id=242358

Le nettoyage va prendre du temps, donc il faut attendre que çà se fasse.

@+.  Babdu89  .


J'ai découvert Ubuntu avec la 07.10.... Et alors?!...  Depuis je regarde de temps en temps si Windows marche toujours....

Hors ligne

#11 Le 05/03/2017, à 09:46

dzeekee

Re : GRUB 2 est devenu "fou" !

Salut,

Merci bien Babdu89.

Babdu89 a écrit :

...
Post#1 on voit que tu as 3 Ubuntu installé.
Un en /dev/sda6, un en  /dev/sda7,un en /dev/sda8
La machine démarre sur celui qui est installé en /dev/sda6.
Lequel veux tu supprimer.
...

Je veux supprimer le dernier (/dev/sda8)

Dernière modification par dzeekee (Le 05/03/2017, à 09:50)

Hors ligne

#12 Le 05/03/2017, à 10:22

Babdu89

Re : GRUB 2 est devenu "fou" !

Bonjour.

Si la machine démarre toujours sans problème sur le Ubuntu qui est installé en /dev/sda6 (à vérifier et confirmer)
Avec Gparted en session live ou installé. Toutes les partitions démontées, swap désactivé.
Tu supprimes la partition /dev/sda8 .
Puis tu fais la mise à jour de Grub de l'Os qui démarre la machine par défaut, /dev/sda6

sudo update-grub

Au redémarrage le menu Grub ne devrait ne devrait plus proposer l'Os en /dev/sda8.

Stp, veux tu bien ensuite répondre à cette demande, et poster l'URL du boot info dans ta réponse.

https://doc.ubuntu-fr.org/tutoriel/boot-info

En le faisant depuis l'Os qui fonctionne. Tu choisis le bouton  "Rapport en ligne (URL pastebin).
Ceci pour nous permettre de voir la situation au sujet des versions des noyaux à nettoyer.

Remarque,
Si tu nous dis que dans le menu Grub qui s'affiche au démarrage, il n'y a plus que le Ubuntu installé en /dev/sda6 qui est proposé. C'est que tu as désactivé le script /etc/grub.d/30_os-prober  de cet Os.
C'est justement celui-ci qui ne doit pas être désactivé. Dans ce cas le réactiver.

 
sudo chmod +x /etc/grub.d/30_os-prober

sudo update-grub

Et nous dire ce qu'il y a au menu Grub.

@+.   Babdu89  .


J'ai découvert Ubuntu avec la 07.10.... Et alors?!...  Depuis je regarde de temps en temps si Windows marche toujours....

Hors ligne

#13 Le 05/03/2017, à 14:55

Bougron

Re : GRUB 2 est devenu "fou" !

Babdu89 a écrit :

Bonsoir.

@Bougron.
Dans tes commandes. Tu es sur que c'est le script 40_custom ?  je dirais plutôt le script 30_os-prober,  non??.

sudo chmod -x /etc/grub.d/40_custom

Je pense plutôt à ceci;

sudo chmod -x /etc/grub.d/30_os-prober

Pour info, j'aide à tester un script, qui lorsqu'il fonctionnera bien, va régler ce souci.
Le script servira aussi de savoir dans le cas d'un multi boot, ce qui est installé dans les partitions, en mettant un label au partitions systèmes des Os.


https://forum.ubuntu-fr.org/viewtopic.php?id=2004576


Dernier post du sujet pour le moment.

https://forum.ubuntu-fr.org/viewtopic.p … #p21680976

@+.   Babdu89  .

Bonjour
Merci d'avoir rectifié si vite.   Je pensais pourtant bien OS-PROBER et non CUSTOM!!!!
Je voudrais bien tester "modif-grub.sh". J'ai du mal cherché l'endroit où il se trouve
Si, en plus, il sait mieux fonctionner que OS-PROBER pour les partitions BTRFS.... Car ce n'est  pas amusant de devoir gérer manuellement cette structure

#####   Ajout du boot BTRFS le 21/02/2017
menuentry 'Ubuntu 16.04.2 BTRFS' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-8abf27ff-a62e-4894-a00a-5f5e6423de5b' {                                                                         
	recordfail
	load_video
	gfxmode $linux_gfx_mode
	insmod gzio
	if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
	insmod part_gpt
	insmod btrfs
	set root='hd0,gpt24'
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt24 --hint-efi=hd0,gpt24 --hint-baremetal=ahci0,gpt24  8abf27ff-a62e-4894-a00a-5f5e6423de5b
	else
	  search --no-floppy --fs-uuid --set=root 8abf27ff-a62e-4894-a00a-5f5e6423de5b
	fi
	linux	/@/boot/vmlinuz-4.8.0-36-generic.efi.signed root=UUID=8abf27ff-a62e-4894-a00a-5f5e6423de5b ro rootflags=subvol=@  quiet splash $vt_handoff
	initrd	/@/boot/initrd.img-4.8.0-36-generic
}
submenu 'Options avancées pour Ubuntu16.04.2 BTRFS' $menuentry_id_option 'gnulinux-advanced-8abf27ff-a62e-4894-a00a-5f5e6423de5b' {
        menuentry 'Ubuntu, avec Linux 4.8.0-36-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.8.0-36-generic-advanced-8abf27ff-a62e-4894-a00a-5f5e6423de5b' {
		recordfail
		load_video
		gfxmode $linux_gfx_mode
		insmod gzio
		if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
		insmod part_gpt
		insmod btrfs
		set root='hd0,gpt24'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt24 --hint-efi=hd0,gpt24 --hint-baremetal=ahci0,gpt24  8abf27ff-a62e-4894-a00a-5f5e6423de5b
		else
		  search --no-floppy --fs-uuid --set=root 8abf27ff-a62e-4894-a00a-5f5e6423de5b
		fi
		echo	'Chargement de Linux 4.8.0-36-generic…'
bf27ff-a62e-4894-a00a-5f5e6423de5b ro rootflags=subvol=@  quiet splash $vt_handoff
		echo	'Chargement du disque mémoire initial…'
		initrd	/@/boot/initrd.img-4.8.0-36-generic
	}
	menuentry 'Ubuntu, with Linux 4.8.0-36-generic (upstart)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.8.0-36-generic-init-upstart-8abf27ff-a62e-4894-a00a-5f5e6423de5b' {
		recordfail
		load_video
		gfxmode $linux_gfx_mode
		insmod gzio
		if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
		insmod part_gpt
		insmod btrfs
		set root='hd0,gpt24'
		if [ x$feature_platform_search_hint = xy ]; then
		  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt24 --hint-efi=hd0,gpt24 --hint-baremetal=ahci0,gpt24  8abf27ff-a62e-4894-a00a-5f5e6423de5b
		else
                  search --no-floppy --fs-uuid --set=root 8abf27ff-a62e-4894-a00a-5f5e6423de5b
		fi
		echo	'Chargement de Linux 4.8.0-36-generic…'
		linux	/@/boot/vmlinuz-4.8.0-36-generic.efi.signed root=UUID=8abf27ff-a62e-4894-a00a-5f5e6423de5b ro rootflags=subvol=@  quiet splash $vt_handoff init=/sbin/upstart
		echo	'Chargement du disque mémoire initial…'
		initrd	/@/boot/initrd.img-4.8.0-36-generic
	}
	menuentry 'Ubuntu, with Linux 4.8.0-36-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.8.0-36-generic-recovery-8abf27ff-a62e-4894-a00a-5f5e6423de5b' {
		recordfail
		load_video
		insmod gzio
		if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
		insmod part_gpt
		insmod btrfs
		set root='hd0,gpt24'
		if [ x$feature_platform_search_hint = xy ]; then
                  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt24 --hint-efi=hd0,gpt24 --hint-baremetal=ahci0,gpt24  8abf27ff-a62e-4894-a00a-5f5e6423de5b
		else
		  search --no-floppy --fs-uuid --set=root 8abf27ff-a62e-4894-a00a-5f5e6423de5b
		fi
		echo	'Chargement de Linux 4.8.0-36-generic…'
		linux	/@/boot/vmlinuz-4.8.0-36-generic.efi.signed root=UUID=8abf27ff-a62e-4894-a00a-5f5e6423de5b ro recovery nomodeset rootflags=subvol=@ 
		echo	'Chargement du disque mémoire initial…'
		initrd	/@/boot/initrd.img-4.8.0-36-generic	} }

Pour info, les 3 partitions sont déjà labellisées

u16041@u16041:~$ sudo blkid |grep U1604
/dev/sda6: LABEL="U16041" UUID="299d7644-ae32-43ff-b3db-16987328b52f" TYPE="ext4" PARTLABEL="U16041" PARTUUID="1fe66c0d-dc55-48cc-9339-75f8746c903f"
/dev/sda23: LABEL="U16042ext4" UUID="cdd96a40-d1b8-45b6-835f-a2644f4ae3cd" TYPE="ext4" PARTLABEL="u16042ext4" PARTUUID="82249afc-cd78-49d1-a15e-a2183fd3eb98"
/dev/sda24: LABEL="U16042btrfs" UUID="8abf27ff-a62e-4894-a00a-5f5e6423de5b" UUID_SUB="bece5e53-c6d1-4d30-8f95-efed9204e9f3" TYPE="btrfs" PARTLABEL="u16042btrfs" PARTUUID="75e4f225-c90d-4170-a6d6-64ccf19b4408"
u16041@u16041:~$ 

Hors ligne

#14 Le 06/03/2017, à 01:35

Babdu89

Re : GRUB 2 est devenu "fou" !

Bonsoir.
@Bougron.
Dans la discutions;

https://forum.ubuntu-fr.org/viewtopic.php?id=2004576

Posts#85, #86 #87 , de cette discutions, il est expliqué comment le script va rechercher les menuentry qui se multiplient, pour les supprimer.

On recherche cette situation là

search --no-floppy --fs-uuid --set=root ea999dc0-aaad-46bb-84ab-6e510bd28348

linux /boot/vmlinuz-4.4.0-62-generic root=UUID=2f5e2fc1-c492-408e-956b-1d56a72eb7d3

Dans ton grub.cfg pour les lignes ; search.....   et  linux /boot......  on voit ceci;

search --no-floppy --fs-uuid --set=root 8abf27ff-a62e-4894-a00a-5f5e6423de5b

linux    /@/boot/vmlinuz-4.8.0-36-generic.efi.signed root=UUID=8abf27ff-a62e-4894-a00a-5f5e6423de5b ro rootflags=subvol=@  quiet splash $vt_handoff

Si le contenu de la ligne "searche...." convient. Il n'en est pas de même pour la ligne "linux /boot...."

Je ne sais pas si le script va fonctionner.

Je veux bien tester cette fonction du script dans mon Os de tests si tu m'envoies en MP une copie d'un fichier grub.cfg avec des blocs menuentry qui se multiplient.
On en saura plus.

/boot/vmlinuz-4.8.0-36-generic.efi.signed root

Comme je teste sur une machine en 32 bits, çà me fait pensé que dans les grub.cfg des Os en 64 bit, on voit .efi dans vmlinuz...


Ni l'auteur du script, ni moi y avons pensé. On va peut-être avoir un souci là...

@+.  Babdu89  .


J'ai découvert Ubuntu avec la 07.10.... Et alors?!...  Depuis je regarde de temps en temps si Windows marche toujours....

Hors ligne

#15 Le 06/03/2017, à 06:30

Bougron

Re : GRUB 2 est devenu "fou" !

Bonjour Babdu89.
Je sais que c'est du test. Je prendrais des précautions.    Mais je ne sais pas ou se trouve stocké modif-grub.sh

Hors ligne

#16 Le 06/03/2017, à 11:00

Babdu89

Re : GRUB 2 est devenu "fou" !

Bonjour.

Post pour Bougron.

@Bougron.
Je supprimerai ce post lorsque tu auras récupéré le contenu du script.
Le contenu du script en version 8

#!/bin/bash
# complètement pas optimisé !!!! mais je ne suis pas pressé ....
#
# principe : grub contenant des lignes de menus inutiles? je les supprime
# on choisit un fichier A (il peut être n'importe où)
# 	ce fichier est traité mais s'il n'a pas la structure d'un grub "normal" 
# 	il pourra y avoir problème de traitement
#	( le shell créera deux fichiers de contenu incorrect )
# donc
# il y a création de deux fichiers dans le répertoire courant
# fichier A-OK-date.txt et fichier A-sup-date.txt

# en fin de traitement on demande si on veut remplacer le fichier A par le résultat
# si on accepte
# 	A est sauvegardé dans A-date par précaution
#	le contenu de A-OK-date.txt remplace le contenu de A

# exemple
# on choisit /boot/grub/grub.cfg
# il y a création de grub-OK-date.txt et grub-sup-date.txt dans le répertoire courant
# si on accepte le remplacement
#	/boot/grub/grub.cfg est sauvegardé dans /boot/grub/grub.cfg-date
#	et
# 	le contenu de /boot/grub/grub.cfg est remplacé par le contenu de grub-OK-date.txt

# version 1
# traitement 1 
# si dans la ligne menuentry il y a ....../dev/sd...../dev/sd........... ( voir version 4 )
# je supprime jusqu'à rencontrer une ligne constituée du seul caractère } 
#
# traitement 2 ( qui dépend de blkid)
# dans un paragraphe menuentry {  }
#	remplacement de la chaîne
#	menuentry 'Ubuntu
#	par
#	menuentry '<le bon label si trouvé>

# V2 2017-02-? 
#	ajout de la fonction tranforme_ligne_sousmenu ( dépend aussi de blkid)
#	dans une ligne submenu remplacement de
#	submenu 'Options avancées pour Ubuntu
#	par
#	submenu 'Options avancées pour <le bon label si trouvé>
#   ne traite que les cas où l'UUID est dans cette ligne 
# V3 2017-02-08
#	correction lecture ligne vide dans $res_blkid
#	correction présentation dans function info

# V4 2017-02-10
# il n'y aura suppression du menu uniquement  si on trouve  ....../dev/sd...../dev/sd...... AVANT la chaine --class  , mais est-ce que c'est normal ?
# (function trt_menu2 remplace la function trt_menu )
#
# prise en compte de possibilité de trouver la chaîne menuentry "Ubuntu au lieu de menuentry 'Ubuntu
# ===>nouvelle présentation pour les sous menu , je mets le label en tête
#
# ajout demande mise à jour uuid-label (utile pour les tests)


# V5 2017-02-12
# pour les lignes menu entry
# modication du test de présence menuentry : au lieu du simple test de présence "menuentry"
# seules les lignes commençant par menuentry et finisant par { seront traitées comme menuentry
#       (le test se fait par ^[tab ]*menuentry.*{$) 
# mais
# ne pas traiter les lignes menuentry 'Memory test qui sont dans ce cas là
# ne pas traiter les lignes menuentry "Memory test qui seraient dans ce cas là ?
#
# pour les lignes submenu
# submenu : au lieu du simple test de présence de "submenu"
# seules les lignes commençant par submenu et finisant par { seront traitées comme submenu
# test par ^[tab ]submenu.*{$

# V6 2017-02-13
# au lieu de récupérer l'UUID dans la ligne menu entry
# on récupère l'UUID dans la ligne search --no-floppy --fs-uuid --set=root du bloc
# par modification de la function transforme-ligne qui devient transforme_ligne_menuentry
#
# adjonction d'un fichier de suivi des lignes menuentry fichier $fich_transforme


# V7 2017-02-13
# la ligne de submenu est recherché par submenu ' ou par submenu " au lieu de submenu 'Options ..... 
# et au lieu de récupérer l'UUID dans la ligne submenu
# je récupère UUID (et calcul du label) dans le bloc suivant de menuentry

# V8 2017-02-14
# adjonction critere_suppression_2
# suppression des menus qui ont des UUID différents dans search --no-floppy et dans linux /boot/
# conservation des menus qui n'ont pas de lignes search --no-floppy
# conservation des menus qui n'ont pas de lignes linux /boot/vmlinu

function info {
echo "ce programme supprime des lignes supposées inutiles de grub"
echo " ( paragraphes  contenant ......$rech_dev.....$rech_dev........... AVANT la chaine $rech_class )"
echo "il demandera le nom du fichier à traiter .. en réel ce devrait être <partition>/boot/grub/grub.cfg .."
echo "et créera un fichier OK-date qui pourra être utilisé pour remplacer le fichier grub"
echo "il utilise aussi le label des partitions .. si ces labels existent .. pour informer plus précisement le grub"
echo "les x qui défilent indiquent des lignes supprimées"
echo "les c qui défilent indiquent les lignes conservées"
echo "si le fichier à traiter n est pas au format grub , il ne fonctionnera pas correctement"
echo "il serait préférable de lancer ce programme après avoir lancé un update-grub"
}


function OK {
rep=""
while [[ $rep != [oOyYnN] ]]
do
titre="programme $0        /!\/!\/!\/!\    Répondez par : (oOyYnN)"
texte="ce programme supprime des lignes supposées inutiles de grub 
 ( paragraphes  contenant ......$rech_dev.....$rech_dev........... AVANT la chaine $rech_class )
 
 il demandera le nom du fichier à traiter .. 
 en réel ce devrait être <partition>/boot/gub/grub.cfg ..
 et créera un fichier OK-date qui pourra être utilisé pour remplacer le fichier grub
 il utilise aussi le label des partitions .. si ces labels existent .. pour informer plus précisement le grub
 
	 remarque :pour des essais , on peut traiter n'importe quel fichier
 
 les x qui défilent indiquent des lignes de menu qui seront supprimées
 les c qui défilent indiquent les lignes de menu qui seront conservées
 les . qui défilent indiquent les autres lignes  (qui seront conservées)
 
 si le fichier à traiter n'est pas au format grub , il ne fonctionnera pas correctement
 
 et en réel il serait préférable de lancer ce programme après avoir lancé un update-grub
 
			tapez O puis valider pour continuer
			tapez N puis valider pour arrêter 

			O pour continuer / N pour arrêter le programme  
       "
       
rep=`zenity --entry --title "$titre" --text "$texte" --width "800"`
case $rep in
	[oOyY] )	:
	;;
	[nN]	)	exit 1
	;;
	*	) 	echo "utilisez seulement oOyYnN S.V.P."
	;;
esac	
done
}



function critere_suppression_2 { # se fait après une initialisation de menu[0] ... menu[n]
# renvoie 0 si les uuid sont égaux (situation normale) 1 sinon
# récupération des différents UUID dans le tableau menu linux	/boot/vmlinuz
# dans la ligne search
# dans la ligne linux
uuid_search="x"
uuid_linux="y"
chaine_search="search \-\-no\-floppy \-\-fs\-uuid \-\-set=root"
chaine_linux="linux\/boot\/vmlinu" # les blancs seront supprimés avant la recherche
#chaine_linux="vmlinu"
ligne_search=""
ligne_linux=""

# recherche dans le tableau menu[] de la ligne search
i=0 # on commencera la recherche à 1
while [[ $i -lt ${#menu[*]} ]]
do
	((i++))
	res=`grep "$chaine_search" <<< "${menu[i]}"`
	if [[ -n $res ]]
		then
		ligne_search="${menu[i]}"
		break
	fi
done

if [[ -z "$ligne_search" ]]
then
	return 0 # pas de chaine search => on conserve le menu
fi



# recherche dans le tableau menu[] de la ligne search
i=0 # on commencera la recherche à 1
while [[ $i -lt ${#menu[*]} ]]
do
	((i++))
	tmp=`sed 's/[[:blank:]]//g' <<< "${menu[i]}"`
	res=`grep "$chaine_linux" <<< "$tmp"`

	if [[ -n $res ]]
		then
		ligne_linux="${menu[i]}"
		break
	fi

done


if [[ -z "$ligne_linux" ]]
then
	return 0 # pas de chaine linux => on conserve le menu
fi



#recherche uuid_search
n=-1
while [[ $n -lt $maxuuid ]]
	do
	((n++))					# uuid suivant
	if [[ -n ${uuid[$n]} ]] # précaution supplémentaire uuid non vide 
	then
		res=`grep ${uuid[$n]} <<< "$ligne_search"`	#  y-a-t-il l'UUID
		if [[ -n $res ]] 
			then
				uuid_search=${uuid[$n]}
				break
		fi
	fi 
done 

#recherche linux_uuid
n=-1
while [[ $n -lt $maxuuid ]]
	do
	((n++))					# uuid suivant
	if [[ -n ${uuid[$n]} ]] # précaution supplémentaire uuid non vide 
	then
		res=`grep ${uuid[$n]} <<< "$ligne_linux"`	#  y-a-t-il l'UUID
		if [[ -n $res ]] 
			then
				uuid_linux=${uuid[$n]}
				break
		fi
	fi 
done


#test de résultat
if [[ "$uuid_search" != "$uuid_linux" ]]
	then
		return 1
	else
		return 0 # uuid egaux , c'est normal
fi

}



function transforme_ligne_submenu {	#reçoit une ligne de sous menu et la modifie
# V7 remplacée par traite_ligne_submenu
: # voir contenu dans V6
}

function ecrire_lignes_intermediaires {	#V8 pour alléger traite_ligne_submenu

if [[ ${#ligne_sousmenu[*]} -gt 0 ]]
	then
		i=0 
		while :
		do
			echo "${ligne_sousmenu[$i]}" >> "$fich_sauv"	# écriture lignes intermédiares
			((nb_lignes_cons++))				# stat
			((nb_lignes_hors_menu++))		# ce sont des lignes hors menu
			echo -e "c\c"								# suivi écran
			((i++))											# suivant		
			if [[ $i -ge ${#ligne_sousmenu[*]} ]] 	#jusqu'au bout du tableau
				then
					break					# c'est fini sort du while
			fi
		done

	# else on ne fait rien
fi
unset ligne_sousmenu

}




function traite_ligne_submenu { # reçoit $1=ligne ayant submenu '.......

submenu="$1" #mise en mémoire de cette ligne

i_s=-1	# pour mettre en mémoire les lignes qui seaient après submenu mais ne seraient pas menuentry

# assez compliqué car il faut refaire tous les tests

# lire les lignes qui suivent jusqu'à trouver menuentry intéressante
while read ligne
do
((nb_lignes_lues++))

# si on trouve } seul sur la ligne  , c'est qu'on est au bout du submenu
# il faut suvegarder la ligne submenu et les lignes intermédiaires
# je ne traite pas du cas où on trouverait une ligne menuentry terminée par  } }

tmp=`sed 's/[[:blank:]]//g' <<<"$ligne"` # supprime les blancs de la ligne
if [[ "$tmp" = "}" ]]   ### on est en fin de submenu ###
		then
			echo $ligne	>> "$fich_sauv"
			((nb_lignes_cons++))
			((nb_lignes_hors_menu++))
			echo -e "./c"	
			return			# fin de traitement de submenu
fi

res=`echo "$ligne" | grep "^[	 ]*menuentry.*{$"`
mem=`echo "$ligne" | grep "^[	 ]*menuentry ['\"]Memory test.*{$"`

if [[ -n $mem ]]
then			
	res=""		# si on trouve la chaine Memory pas intéressant on force res à vide
fi

if  [[ -z $res ]]
	then # la ligne ne contient pas menuentry {    ( ni memory  )
		((i_s++))	# première fois 0 2ème fois 1 etc....
		ligne_sousmenu[i_s]="$ligne"	# mise en mémoire pour écriture ultérieure
	else
		lire_menuentry # menu[0] .... menu[n] } et ((nb_lignes_lues++))jpb

		#code=`trt_menu2 "${menu[0]}"` && `critere_suppression_2`

		trt_menu2 "${menu[0]}"
		code=$?
		critere_suppression_2
		code1=$?
		((code = $code + $code1 ))


		#echo ${menu[0]}
		#echo "code retour ligne 282 " $code
	
		#if trt_menu2 "${menu[0]}" # contient dev dev ou non
		if [[ $code -eq 0 ]]	# 0 si c'est bon , 1 si on supprime
			then  # ne contient pas dev dev
				# recherche label dans bloc menuentry
				rech_uuid_label_menuentry	# retour 0 si label trouvé , pas zéro sinon
				code=$?
				if [[ $code -eq 0 ]]
					then # on a un label
				# la totale : sauv submenu , ligne intermédiare , menuentry

				# la ligne submenu
						echo "$1"										>> "$fich_transforme"
						ligne=`sed "s/submenu '/submenu '$label_trouve : /" <<< $1`
						ligne=`sed "s/submenu \"/submenu \"$label_trouve : /" <<< $1`

						echo "ligne transformée en" 	>> "$fich_transforme"
						echo "$ligne"									>> "$fich_transforme"
						echo 													>> "$fich_transforme"

						echo "$ligne" 					>> "$fich_sauv"	# écriture
						((nb_lignes_cons++))							# stat
						((nb_lignes_hors_menu++))						# considérée hors menu
						echo -e "c\c"									# suivi écran
						
				# les lignes intermédiares (considérées comme hors menu)
	
						ecrire_lignes_intermediaires



				# les lignes menuentry
						# ici il faut modifier menu[0] car on a un label non vide

						#echo "UUID trouvé : $uuid_trouve LABEL trouvé : $label_trouve********"
						
						menu[0]=`sed "s/menuentry '/menuentry '$label_trouve : /" <<< ${menu[0]}`
						menu[0]=`sed "s/menuentry \"/menuentry \"$label_trouve : /" <<< ${menu[0]}`
		
						echo ${menu[0]}						>> "$fich_transforme"		
						echo "ligne transformée en"			>> "$fich_transforme"
						echo ${menu[0]} 					>> "$fich_transforme"
		
 
						i=0
						while :
						do	echo "${menu[$i]}" >> "$fich_sauv"	# écriture
							((nb_lignes_cons++))			# stat
							((nb_lignes_menu_cons++))		# stat
							echo -e "c\c"					# suivi écran
							((i++))							# suivant
							if [[ $i -ge ${#menu[*]} ]] 	# jusqu'au bout du tableau
								then
									((nb_menu_cons++))	
									break					# fin du tableau menu
							fi
						done

						return 0

					else 	# pas de label dans menuentry
							# il faudra quand même écrire ces lignes
							p=0
							while [[ $p -le ${#menu[*]} ]] # tant que <= indice final de menu
							do
								((i_s++))
								ligne_sousmenu[i_s]=${menu[$p]} #mémorise ces lignes
								((p++))	
							done 
							((nb_menu_cons++)) # ce menu étant conservé
				fi

			else # le bloc menuentry contient /dev /dev
				# bloc menuentry pas interessant , 
				# on écrit dans fich_sup on essaiera le suivant
				sort_menu_1
				((nb_menu_sup++))
				
	fi

fi


done

# si on arrive ici on n'a pas trouvé de label
# il faut écrire la ligne submenu et les lignes intermédiaires

	echo "$1" 					>> "$fich_sauv"	# écriture

	echo 						>> "$fich_transforme"
	echo "$1"					>> "$fich_transforme"
	echo "ligne non modifiée"	>> "$fich_transforme"

	((nb_lignes_cons++))			# stat
	echo -e "c\c"					# suivi écran

	# les lignes intermédiaires (considérées comme hors menu)
	ecrire_lignes_intermediaires

}



function transforme-ligne { # modifie 1ere du menuentry
: #  voir v5
}


function rech_uuid_label_ligne {	# recherche un uuid dans $1 (le paramètre reçu)
# si trouvé positionne les variables uuid_trouve et label_trouve
# renvoie 0 si uuid et label trouvé			uuid_trouve et label_trouve sont positionnés
# renvoie 1 si uuid trouvé et label vide	uuid_trouve est positionné , label_trouve rest à ""
# renvoie 2 si uuid non trouvé				uuid_trouve et label_trouve restent à ""	

n=-1
while [[ $n -lt $maxuuid ]]
	do
	((n++))					# uuid suivant
	if [[ -n ${uuid[$n]} ]] # précaution supplémentaire uuid non vide 
	then
		res=`grep ${uuid[$n]} <<< $1`	#  y-a-t-il l'UUID
		if [[ -n $res ]] 
			then
				uuid_trouve=${uuid[$n]}
				if [[ -n ${label[$n]} ]] # si label non vide on modifie la chaine
				then
					label_trouve=${label[$n]}
					return 0	# uuid trouvé et label non vide trouvé
				else
					return 1	# uuid trouvé mais pas de label trouvé
				fi
		fi
	fi 
done 
return 2	# pas uuid trouvé dans la ligne 
}


function rech_uuid_label_menuentry {
# recherche l'uuid (et donc le label) dans menu[1] .... menu [n] (pas dans menu [0])
p=0

while [[ $p -lt ${#menu[*]} ]]		#  tant que p < indice final du tableau

do
((p++))			# menu[suivant]
# a-t-on "search --no-floppy --fs-uuid --set=root"
search_uuid="search \-\-no\-floppy \-\-fs\-uuid \-\-set=root"

res=`echo ${menu[$p]} | grep "$search_uuid"`

if [[ -n $res ]]
	then
		rech_uuid_label_ligne ${menu[$p]}	
		# positionne uuid_trouve
		# positionne label_trouve
		return $?	# 0 ok 1:uuid trouvé,label vide 2 pas d'uuid dans search 
fi
done
return 3	# pas de search trouvé , (donc pas d'uuid , et donc pas de label) !!!
}



function transforme_ligne_menuentry {	# modifie la première ligne du menu conservé
# principe : recherche l'UUID dans la ligne search --no-floppy --fs-uuid --set=root
# si trouvé , on récupère le label
# si label vide on ne fait rien
# si label déjà présent on ne fait rien ( à faire )
# sinon on rajoute avec : en tête après menuentry ' ou menuentry " 
# 

label_trouve=""
uuid_trouve=""

#echo									# trace écran
#echo ${menu[0]}							# trace écran

echo 			>> "$fich_transforme"	# trace fichier
echo ${menu[0]} >> "$fich_transforme"	# trace fichier


rech_uuid_label_menuentry			# cette fonction positionne le label à la bonne valeur
code=$?												# retour de la fonction

case $code in
	0)		#echo "UUID trouvé : $uuid_trouve LABEL trouvé : $label_trouve********"
			menu[0]=`sed "s/menuentry '/menuentry '$label_trouve : /" <<< ${menu[0]}`
					# prise en compte de " 	au lieu de ' dans certain cas de menu
			menu[0]=`sed "s/menuentry \"/menuentry \"$label_trouve : /" <<< ${menu[0]}`
			#echo "ligne transformée en"	
			#echo ${menu[0]}			
			echo "ligne transformée en"			>> "$fich_transforme"
			echo ${menu[0]} 								>> "$fich_transforme"
	;;
	1)	#echo "UUID trouvé : $uuid_trouve pas de label pour ce menu******"
			echo "pas de label trouvé pour ce menu" >> "$fich_transforme"
	;;
	2)	#echo "pas d'UUID trouvé"
			echo "pas de uuid trouvé pour ce menu" 	>> "$fich_transforme"
	;;
	3)	#echo "pas de ligne search trouvée"
			echo "pas de ligne search trouvée"			>> "$fich_transforme"			
	;;	
	
	*)	echo "code inconnu : $code"						>> "$fich_transforme"
	;;
esac

return $code
}


function lire_menuentry { # met dans tableau menu[n] jusqu'à trouvé } seul sur la ligne
i=0
menu[$i]="$ligne" # menu[0] est la première ligne
	# les suivantes seront menu [n]
	while :	# au lieu du test : faire le test jusqu'à fin de fichier ?
	do
		read ligne				# lecture ligne suivante
		((i++))
		((nb_lignes_lues++))	
		menu[$i]="$ligne"
		tmp=`sed 's/[[:blank:]]//g' <<<"$ligne"` # supprime les blancs de la ligne
		if [[ "$tmp" = "}" ]]   ### correct que si on a une source formatée "grub" ###
		# ne faudrait-il pas  mieux faire le test : si la ligne se termine par }
		then	
			return
		fi
		# et si pas de } seul sur la ligne on ira jusqu'en fin de fichier !!!!
		# c'est un critère de format de grub
	done
}


function sort_menu_0 {	# écrit menu[] dans le fichier de sauvegarde
	i=0
	#transforme-ligne  ${menu[0]}				# essai de mettre un label
	transforme_ligne_menuentry					# essai de mettre un label
	while :
	do	echo "${menu[$i]}" >> "$fich_sauv"	# écriture
		((nb_lignes_cons++))			# stat
		((nb_lignes_menu_cons++))		# stat
		echo -e "c\c"					# suivi écran
		((i++))							# suivant
		if [[ $i -ge ${#menu[*]} ]] 	#jusqu'au bout du tableau
			then
				break					# c'est fini
		fi
	done

}
	

function sort_menu_1 {	# écrit le menu dans le fichier de supression
	i=0
	while :
	do		
		echo "${menu[$i]}" >> "$fich_sup"		# écriture
		((nb_lignes_sup++))									# stat
		echo -e "x\c"												# suivi écran
		((i++))															# suivant
		if [[ $i -ge ${#menu[*]} ]] 				# jusqu'au bout du tableau menu à supprimer
			then
				break														# fin du tableau atteint
		fi
	done
}


function trt_menu { # n'est plus utilisée FONCTION REMPLACÉE  par tr_menu2
: # voir Versions précédentes renvoie 1 si + 1 fois/dev/sd
}


function trt_menu2 { # analyse le paramètre $1 reçu et renvoi 0 si on garde , 1 si on supprime
		# critére de suppression
		# si la 1ère ligne du menu contient plus d'une fois .../dev/sd...  avant --class , 
		# renvoie 1 sinon 0

IFS=" "		# il faut l'espace comme délimiteur
tableau=($1)	# mise en tableau de la ligne
IFS="~"		# peut-être utile pour la suite ?

# rech_class="\-\-class"	# est défini en début de prog principal  chaine --class
# rech_dev="\/dev\/sd"		# est défini en début de prog principal  chaine  /dev/sd

nbdevsd=0 					# nombre de fois que l'on trouve /dev/sd (avant --class)

for n in ${!tableau[@]} # de 0 1 2 .... x
do
	r_class=`echo ${tableau[$n]} | grep "$rech_class"` # test présence --class
	if [[  -n $r_class ]] 					# --class ou pas ?
		then
			break							# --class est trouvé, on sort de la boucle for

		else
			r_dev=`echo ${tableau[$n]} | grep "$rech_dev"`   #  test présence /dev/sd
			if [[ -n $r_dev ]] 				# /dev/sd ou pas ?
				then
					((nbdevsd++))			# incrémente nombre 
					if [[ $nbdevsd -gt 1 ]]	# si plus d une fois /dev/sd
						then
							return 1 		# on renvoie 1
					fi
			fi
	fi
done

if [[ $nbdevsd -gt 1 ]]	# test nombre
	then
		return 1 # 1 si plus d'une fois /dev/sd
	else
		return 0 # 0 sinon
fi

}


# début du programme #####################################################################################

# variable qui serviront aux recherches

rech_class="\-\-class"		# jusqu'à trouver la chaine --class dans menuentry
rech_dev="\/dev\/sd"		# la présence de la chaine  /dev/sd dans menuentry
res_blkid="blkid-res.txt"	# le fichier contenant le résultat de sudo blkid


info
OK
# mettre les UUID et LABEL dans un tableau
echo "récupération de UUID et LABEL par sudo blkid"

rep=""
while [[ $rep != [oOyYnNaA] ]]
do
titre="récupération des UUID et LABEL des partitions des disques"
texte="
			Mise à jour du fichier des LABEL et UUID
					répondez par
					
              		(oOyY) pour lancer la commande sudo blkid ( remise à jour du fichier) 
                   	(nN)   si vous voulez réutiliser le fichier $res_blkid existant
                   	(aA)   pour arrêter ce programme
                   	puis Valider
                   	
                   	mise en garde :
                   	si vous répondez non , ce sera le fichier $res_blkid qui sera
                   	utilisé pour mettre à jour le titre des menus et sous menus dans le fichier traité
                   	(surtout utile pour des essais)
				
					O pour remise à jour UUID LABEL via SUDO
					N pour réutilisation du fichier UUID LABEL
					A Arrêter
"
rep=`zenity --entry --title "$titre" --text "$texte" --width "800"`
case $rep in
	[oOyY] )	sudo blkid > $res_blkid
	;;
	[nN]	)	echo "réutilisation du fichier $res_blkid"
	;;
	[aA]	)	echo "arrêt du programme"
				exit 0
	;;
	
	*	) 	echo "utilisez seulement oOyYnNaA S.V.P."
	;;
esac
done



maxuuid=-1
while read ligne
do
	if [[ -n $ligne ]] #correction ligne vide
	then
	((maxuuid++))
	tableau=($ligne) # découper la ligne en champ 
	for champ in ${tableau[@]}
		do
			deb=` echo $champ |cut -c1-4`
			case $deb in
				LABE)			#label[maxuuid]=${champ##*=}
								# on enlève les guillemets donne U16.04-b7
					label[maxuuid]=`sed 's/"//g' <<< ${champ##*=}`
					;;
				UUID)			# sans les guillemets donne c63335c7-be09-4782-978c-dff6cce2be94
					uuid[maxuuid]=`sed 's/"//g' <<< ${champ##*=}`
					;;
			esac
	done
	fi
done <$res_blkid


##################################################


# Quel fichier grub traiter ? ####################
titre="$0 Sélectionnez le fichier GRUB à traiter"
fich_source=`zenity --file-selection --filename="$rep_rech" --title="$titre"`


#traitement de cette sélection ###########################
case $? in	#$? est le code de retour de zenity
        1)	echo "Aucun fichier sélectionné."	
		read g
		exit 1
		;;
       -1)	echo "Une erreur inattendue est survenue."
		read g
		exit 1
		;;	
        0)	:
		;;
	*)	echo "erreur non reconnue"
		read g
		exit 1
		;;	
esac

#########################################################
num=`date +%Y:%m:%d`-`date +%H:%M:%S`
fich_sauv=grub-OK-$num.txt
fich_sup=grub-sup-$num.txt
fich_transforme=fich_transforme-$num.txt

##### pour les stat #####################################
nb_menu_cons=0
nb_menu_sup=0
nb_lignes_sup=0
nb_lignes_cons=0
nb_lignes_lues=0
nb_lignes_hors_menu=0
nb_lignes_menus_cons=0

#### lecture et traitement du fichier GRUB ################################################
IFS="~"
while read ligne
do


#res=`echo $ligne| grep "menuentry "`
#V5 modification du test !!!! entre les crochets on a tab et espace 
res=`echo "$ligne" | grep "^[	 ]*menuentry.*{$"`
mem=`echo "$ligne" | grep "^[	 ]*menuentry ['\"]Memory test.*{$"`

# res est vide s'il n'y a pas menuentry {
# mem est non vide si on a memory test

# ne pas traiter munuentry 'Memory test
# ne pas traiter munuentry "Memory test



if [[ -n $mem ]]
then			# si on trouve la chaine Memory on force res à vide
	res=""
fi

((nb_lignes_lues++))
if  [[ -z $res ]]
	then # la ligne ne contient pas menuentry 
		subm=`echo "$ligne" | grep "^[	 ]*submenu.*{$"` # au lieu de "submenu"
		if [[ -z $subm ]]
			then # ne contient pas submenu on écrit dans le fichier de sauvegarde
				echo "$ligne" >> $fich_sauv
				((nb_lignes_cons++))

				((nb_lignes_hors_menu++))

				echo -e ".\c"
			#else # contient submenu on traite d'abord cette ligne avant d'écrire 
				#transforme_ligne_submenu "$ligne"
				#echo "$ligne" >> $fich_sauv
				#((nb_lignes_cons++))
				#((nb_lignes_hors_menu++))
				#echo -e ".\c"
			else
				traite_ligne_submenu "$ligne"
		fi
		
	else # la ligne contient menuentry
		lire_menuentry	# lire le paragraphe : en sortie on a menu[0] ... menu[n]
		
		#code=`trt_menu2 "${menu[0]}"` && `critere_suppression_2`
		trt_menu2 "${menu[0]}"
		code=$?
		critere_suppression_2
		code1=$?
		((code = $code + $code1 ))


		if [[ $code -eq 0 ]]	# 0 si c'est bon , 1 si on supprime
		#if trt_menu2 "${menu[0]}" 	# et si ça convient on l'écrit dans le fichier de sauvegarde 
			then	# ou on conserve
				
				sort_menu_0
				((nb_menu_cons++))
			else	# ou on supprime
				
				sort_menu_1
				((nb_menu_sup++))
		fi	
		unset menu	# vide la variable par précaution
fi
done < "$fich_source"
echo
echo
echo "fichier traité                : $fich_source"	#/media/jpb/U14-04-a12/boot/grub/grub.cfg
echo "le résultat se trouve dans    : $fich_sauv"	# grub-OK-date.txt
echo
echo "nombre de lignes lues         : $nb_lignes_lues"
echo "lignes conservées             : $nb_lignes_cons"
echo "lignes supprimées             : $nb_lignes_sup"
echo "fichier des lignes supprimées : $fich_sup"
echo
echo "nombre de menus conservés     : $nb_menu_cons"
echo "nombre de menus supprimés     : $nb_menu_sup"
echo
echo "lignes conservées (hors menu) : $nb_lignes_hors_menu"
echo "lignes conservées (menu)      : $nb_lignes_menu_cons"

echo "après avoir vérifier manuellement le fichier"
echo "$fich_sauv"
echo "vous pourrez remplacer grub.cfg par celui-ci à vos risques et périls"
echo


rep=""
while [[ $rep != [oOyYnN] ]]
do
titre="remplacement de GRUB"
texte="Voulez-vous remplacer le grub original par le nouveau fichier généré (oOyYnN)
	
       si vous répondez oui le fichier
 $fich_source (fichier original choisi)
          sera par précaution sauvegardé dans
 $fich_source-$num
	 mais Attention
 $fich_source 
	sera remplacé par le contenu du fichier
 $fich_sauv  (le résultat OK obtenu)
                   répondez par (oOyYnN)"

rep=`zenity --entry --title "$titre" --text "$texte" --width "800"`
case $rep in
	[oOyY] )	# sauvegarde de "grub" , je conserve $num	
			echo "OK je sauvegarde le fichier original $fich_source dans $fich_source-$num"
			sudo cp "$fich_source" "$fich_source-$num"

			#et fich_sauv remplace grub
			echo "et je remplace $fich_source par $fich_sauv"
			sudo mv "$fich_sauv" "$fich_source"
	;;
	[nN]	)	echo "grub non remplacé"
	;;
	*	) 	echo "utilisez seulement oOyYnN S.V.P."
	;;
esac
done

echo "taper entrée pour terminer"
read g #pour attendre

exit 0

Dans ton dossier personnel créer un fichier texte vide.
Mettre le contenu du script dedans. Lui donner un nom " modif-grub-v8.sh "  par exemple.
Rendre le script exécutable dans les "propriétés"  "Permissions" .

Dans /boot/grub  ,créer un dossier "tests" , et copier/coller dedans le fichier  grub.cfg à traiter avec le script.
Lancer le script (sudo bash modif-grub-v8.sh )

Le script va se lancer. Dans ton dossier personnel, il va créer des fichiers de travail, voir leur nature dans la discutions.
À toutes les questions posées tu réponds par oui  "O ".
Dans la boîte de dialogue pour indiquer le fichier grub.cfg à traiter, tu indiques  /boot/grub/tests/grub.cfg
Lorsque c'est fini, si çà bloque, ou que çà travail jusqu'au bout. Faire une copie de sauvegarde du retour terminal du lancement du script dans un fichier texte, pour garder une trace de ce que fait le script, çà pourra éventuellement servir.

À la fin du traitement, dans ce dossier "tests" tu vas avoir un fichier de sauvegarde de grub.cfg, et la modification faite.
Comme il semble que tu as mis des label à tes partitions système, tu verras si le script modifie 'Ubuntu...' par les label.

Normalement le fichier  /boot/grub/grub.cfg de ton système ne sera pas touché.

Bons tests.

En incorporant ton menuentry dans un ficher grub.cfg de test chez moi, qui est bien modifié par le script. et en indiquant un UUID de mes partitions existantes.   5ed81f97-295e-4246-8aa1-7ae54d6c9e7c

menuentry 'Ubuntu 16.04.2 BTRFS' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-8abf27ff-a62e-4894-a00a-5f5e6423de5b' {                                                                         
    recordfail
    load_video
    gfxmode $linux_gfx_mode
    insmod gzio
    if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
    insmod part_gpt
    insmod btrfs
    set root='hd0,gpt24'
    if [ x$feature_platform_search_hint = xy ]; then
      search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt24 --hint-efi=hd0,gpt24 --hint-baremetal=ahci0,gpt24  8abf27ff-a62e-4894-a00a-5f5e6423de5b
    else
      search --no-floppy --fs-uuid --set=root 5ed81f97-295e-4246-8aa1-7ae54d6c9e7c
    fi
    linux    /@/boot/vmlinuz-4.8.0-36-generic.efi.signed root=UUID=8abf27ff-a62e-4894-a00a-5f5e6423de5b ro rootflags=subvol=@  quiet splash $vt_handoff
    initrd    /@/boot/initrd.img-4.8.0-36-generic
}


Le script ne supprime pas le bloc menuentry dans ces conditions ci-dessous.

search --no-floppy --fs-uuid --set=root 5ed81f97-295e-4246-8aa1-7ae54d6c9e7c
linux    /@/boot/vmlinuz-4.8.0-36-generic.efi.signed root=UUID=8abf27ff-a62e-4894-a00a-5f5e6423de5b ro rootflags=subvol=@  quiet splash $vt_handoff
search --no-floppy --fs-uuid --set=root 5ed81f97-295e-4246-8aa1-7ae54d6c9e7c
linux   /boot/vmlinuz-4.8.0-36-generic.efi.signed root=UUID=8abf27ff-a62e-4894-a00a-5f5e6423de5b ro rootflags=subvol=@  quiet splash $vt_handoff
search --no-floppy --fs-uuid --set=root 5ed81f97-295e-4246-8aa1-7ae54d6c9e7c
linux   /boot/vmlinuz-4.8.0-36-generic root=UUID=8abf27ff-a62e-4894-a00a-5f5e6423de5b ro rootflags=subvol=@  quiet splash $vt_handoff

Ci-dessous est ce qui se rapproche le plus des menuentry chez moi.

search --no-floppy --fs-uuid --set=root 5ed81f97-295e-4246-8aa1-7ae54d6c9e7c
linux   /boot/vmlinuz-4.8.0-36-generic root=UUID=8abf27ff-a62e-4894-a00a-5f5e6423de5b ro quiet splash $vt_handoff

@+.    Babdu89  .

Dernière modification par Babdu89 (Le 06/03/2017, à 16:52)


J'ai découvert Ubuntu avec la 07.10.... Et alors?!...  Depuis je regarde de temps en temps si Windows marche toujours....

Hors ligne

#17 Le 06/03/2017, à 18:46

Bougron

Re : GRUB 2 est devenu "fou" !

Bonjour
Donc j'ai utilisé la commande que j'ai abrégé un peu.

./mmodif-grub-v8.sh

D'abord mes trois instances sont  en bon état car j'ai déjà été vacciné et os_prober est déactivé pour deux d'entre elles. Il n'y aura donc pas de suppression. Mon constat est
a) Très agréable à utiliser et on voit bien ce qu'il faut répondre
b) N'a pas bronché pour l'instance sur partition BTRFS mais n'a pas fait le remplacement de ubuntu par le nom de la partition comme on peut le voir ici

### BEGIN /etc/grub.d/10_linux ###
function gfxmode {
	set gfxpayload="${1}"
	if [ "${1}" = "keep" ]; then
		set vt_handoff=vt.handoff=7
	else
		set vt_handoff=
	fi
}
if [ "${recordfail}" != 1 ]; then
  if [ -e ${prefix}/gfxblacklist.txt ]; then
    if hwmatch ${prefix}/gfxblacklist.txt 3; then
      if [ ${match} = 0 ]; then
        set linux_gfx_mode=keep
      else
        set linux_gfx_mode=text
      fi
    else
      set linux_gfx_mode=text
    fi
  else
    set linux_gfx_mode=keep
  fi
else
  set linux_gfx_mode=text
fi
export linux_gfx_mode
menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-8abf27ff-a62e-4894-a00a-5f5e6423de5b' {
	recordfail
	load_video
	gfxmode $linux_gfx_mode
	insmod gzio
	if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
	insmod part_gpt
	insmod btrfs
	set root='hd0,gpt24'
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt24 --hint-efi=hd0,gpt24 --hint-baremetal=ahci0,gpt24  8abf27ff-a62e-4894-a00a-5f5e6423de5b
	else
	  search --no-floppy --fs-uuid --set=root 8abf27ff-a62e-4894-a00a-5f5e6423de5b
	fi
	linux	/@/boot/vmlinuz-4.8.0-36-generic.efi.signed root=UUID=8abf27ff-a62e-4894-a00a-5f5e6423de5b ro rootflags=subvol=@  quiet splash $vt_handoff
	initrd	/@/boot/initrd.img-4.8.0-36-generic
}
}
### END /etc/grub.d/10_linux ###
u16041@u16041:~$ blkid | grep btrfs
/dev/sda24: LABEL="U16042btrfs" UUID="8abf27ff-a62e-4894-a00a-5f5e6423de5b" UUID_SUB="bece5e53-c6d1-4d30-8f95-efed9204e9f3" TYPE="btrfs" PARTLABEL="u16042btrfs" PARTUUID="75e4f225-c90d-4170-a6d6-64ccf19b4408"
u16041@u16041:~$ 

 
c) Ne sait pas traiter mon fichier 40_custom.   Il part en boucle. J'ai fini par tuer. J'ai isolé la structure responsable. Je crains que cela ne soit pas facile à rectifier. Voici un extrait de la partie responsable que j'avais en une dizaine d'exemplaires! (installation de windows, installation de ubuntu, et définition complète du ubuntu installé dans la partition BTRFS puisque os_prober ne sait pas détecter)

menuentry 'Lancement MEMTEST sda13' { insmod part_gpt  insmod fat
          search --no-floppy --fs-uuid --set=root 4261-BC79	
          chainloader /EFI/BOOT/BOOTX64.efi}

La bonne codif devant être

menuentry 'Lancement MEMTEST sda13' { insmod part_gpt  insmod fat
          search --no-floppy --fs-uuid --set=root 4261-BC79	
          chainloader /EFI/BOOT/BOOTX64.efi
      }

Merci Babdu89 de la transmission du script.

Dernière modification par Bougron (Le 07/03/2017, à 01:51)

Hors ligne

#18 Le 06/03/2017, à 20:23

ar barzh paour

Re : GRUB 2 est devenu "fou" !

aïe je viens de mettre à dispo la dernière version de modif_grubV24 ..
sauf que je n'ai pas prévu le cas

linux	/@/boot/vmlinuz-4.8.0-36-generic.efi.signed root=UUID=8abf27ff-a62e-4894-a00a-5f5e6423de5b ro rootflags=subvol=@  quiet splash $vt_handoff

comme je l'avais dit au départ je ne connais pas assez la structure d'un fichier grub pour analyser tous les cas possibles
je vais voir si je sais faire
pour ceux qui connaisent un peu
en ligne 686 j'ai

chaine_linux="linux\/boot\/vmlinu"

peut-être en remplaçant cette ligne par celle-ci le script fonctionnerait-il ?

chaine_linux="linux.*.*\/boot\/vmlinu"

voir https://forum.ubuntu-fr.org/viewtopic.p … #p21693010

Dernière modification par ar barzh paour (Le 06/03/2017, à 20:37)


PC          : B760M DS3H DDR4,  12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( en voyage )
Portable2 : T5750  @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )

Hors ligne

#19 Le 09/03/2017, à 18:21

dzeekee

Re : GRUB 2 est devenu "fou" !

Bonjour tous le monde.

Juste pour info comment est fini mon "aventure".
J'ai fini par désactiver os-prober sur les 2 ubuntus sur 3 (laissant os-prober sur le sda6 -> machine démarre sur ce ubuntu) et j'ai fait le menage avec kclean sur tous les 3.
J'ai finalement laissé les 3 distributions (je n'ai pas supprimé la dernière)
Et c'est tout bon !
Merci encore à tous le monde et particulièrement à Bougron et Babdu89 :-)

Dernière modification par dzeekee (Le 09/03/2017, à 18:22)

Hors ligne