Pages : 1
#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é )))
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.
...
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" !
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
Pages : 1