Bonjour.
Çà va peut-être éclairer un souci avec la clé grub qui ne boot pas chez moi sans Plop Boot Manager...
Test du script du post#171 de ce sujet.
Os de test Ubuntu12.04.5 où est le script.
Iso Lubuntu-15.04-desktop-i386.iso . téléchargée dans une partition de stockage NTFS
(/media/ISO_LINUX/) du hdd de ma machine. (Important çà , puisque il n'y a pas d'USB qui intervient.)
Nettoyage dans /boot/grub de l'OS 12.04.5 .
suppression de /greffons et de /custom.cfg .
Lancement du sript.
Je choisi le répertoire /boot/grub de l'Os 12.04.5
J'indique le chemin de l'iso.
Par le script. Création des fichiers dans l'Os 12.04.5
/boot/grub/greffons/fonctions.iso
/boot/grub/custom.cfg
Dans la partition de stockage /media/ISO_LINUX/Lubuntu-15.04-desktop-i386.loopback.cfg
Contenu des fichiers;
fonctions.iso
# fonctions_iso_V2-3.cfg
# 2016_01_10 : suppression du paramètre "--no-floppy" de la commande search (certaines PC voient les clés USB comme des floppy
#######################################################################################################################
# Redémarrage en cas d'absence ou d'indisponibilité des fichiers (fichier image iso ou fichier de configuration)
function rdmge {
echo Le PC va redémarrer dans quelques secondes
sleep -v 10
reboot
}
#######################################################################################################################
# Avertissement présenté à l'utilisateur si le fichier iso est introuvable, ou n'a pas été donné en paramètre de la commande iso_boot
# Iso file missing
function no_iso_file {
if [ -n "${1}" ] ; then
echo L\'image à partir de laquelle il faut amorcer le PC, ${1}, ne se trouve sur aucun des supports actuellement raccordés à l\'ordinateur.
else
echo Aucune image iso n\'a été attachée au libellé ${chosen} que vous venez de choisir.
fi
rdmge
}
#######################################################################################################################
# Avertissement présenté à l'utilisateur si le fichier de configuration est introuvable
# Grub configuration file missing
function no_cfg_file {
echo Le fichier de configuration, ${1}, ne se trouve sur aucun des supports actuellement raccordés à l\'ordinateur.
rdmge
}
#######################################################################################################################
# Contrôle de l'existence des fichiers
#
function existent_fichiers {
# recherche du fichier iso
if [ -n "${iso_file}" ]; then
# si grub trouve le fichier ${iso_file}, alors ce fichier est sur la partition ${root} ; sinon il faut chercher où il est.
if [ -e "${iso_file}" ]; then set image_iso=${root}; else search --file --set=image_iso "${iso_file}"; fi
fi
if [ -z "${image_iso}" ]; then no_iso_file "${iso_file}"; fi
# création du périphérique virtuel qui donne accès au fichier iso
# creation of the virtual device holding the iso file and paths initialisation
loopback iso (${image_iso})${iso_file}
set root=iso
set loopcfg=
# recherche et introduction du menu spécifique à l'image iso considérée
if [ -z "${sourcefile}" ]; then set sourcefile=/boot/grub/loopback.cfg; fi
# si le fichier se trouve sur le périphérique $root, il n'est pas utile de le chercher
if [ -e "${sourcefile}" ]; then set loopcfg=${root} ; else search --file --set=loopcfg "${sourcefile}" ; fi
if [ -z "${loopcfg}" ]; then no_cfg_file "${sourcefile}"; fi
}
#######################################################################################################################
# Cette procédure crée un periphérique virtuel qui donne accès aux répertoires et fichiers contenu dans le fichier iso
# et cherche le fichier contenant le menu correspondant à l'image iso considérée et l'introduit dans le menu Grub
# paramètre ${1} : le chemin d'accès au fichier iso
# paramètre ${2}, facultatif : le chemin d'accès au fichier contenant les entrées de menu pour l'image iso considérée
# quand il est omis, il s'agit du fichier /boot/grub/loopback.cfg de l'image iso
function iso_boot {
set image_iso=
set iso_file="${1}"
set iso_path="${1}"
set sourcefile="${2}"
existent_fichiers
source "(${loopcfg})${sourcefile}"
}
function echec_maj_amorceiso {
#######################################################################################################################
# Cette procédure affiche le message explicatif de ce qu'il faut faire si grub ne sait pas écrire dans le répertoire
# grub pour effacer la demande de démarrage par un fichier iso
echo "L'erreur précédente résulte d'une limitation de grub qui ne dispose pas des modules pour effacer la demande de démarrage" ;
echo "par un fichier iso, du fait de la nature du système de fichier support de grub.cfg (le répertoire référencé" ;
echo "par core.img tel que présenté par le rapport produit par boot-repair ou par bootinfoscript)." ;
echo "Une fois le démarrage terminé, pour supprimer cette demande de démarrage avec ${iso_file}," ;
echo "passer les commandes suivantes, dans lesquelles la variable grub désigne le point de montage" ;
echo "du répertoire pointé par core.img tel que présenté par le rapport produit par boot-repair" ;
echo "Pour démarrer le PC avec ${iso_file}, appuyer sur la touche Alt." ;
echo "Dans le cas contraire, appuyer sur la touche Ctrl." ;
}
function amorce_iso {
########################################################################################
#
# amorçage par le script shell iso_boot.sh
#
#######################################################################################
# pour éviter le bouclage sur la procédure
if ${amorceiso}; then
set image_iso=
set iso_path="${1}"
set iso_file="${1}"
set sourcefile="${2}"
existent_fichiers
export iso_path
export iso_file
export root
set amorceiso=false
if save_env amorceiso ; then
configfile "(${loopcfg})${sourcefile}"
else
echec_maj_amorceiso ;
until keystatus --ctrl ; do
sleep 1 ;
if keystatus --alt ; then configfile "(${loopcfg})${sourcefile}" ; fi ;
done ;
fi
fi
custom.cfg
source ${config_directory}/greffons/fonctions_iso.cfg
submenu "lubuntu-15.04-desktop-i386" {iso_boot "/ISO_LINUX/lubuntu-15.04-desktop-i386.iso" "/ISO_LINUX/lubuntu-15.04-desktop-i386.loopback.cfg"}
lubuntu-15.04-desktop-i386.loopback.cfg
menuentry "Try Lubuntu without installing" {
linux /casper/vmlinuz file=/cdrom/preseed/lubuntu.seed boot=casper iso-scan/filename=${iso_path} quiet splash ---
initrd /casper/initrd.lz
}
menuentry "Install Lubuntu" {
linux /casper/vmlinuz file=/cdrom/preseed/lubuntu.seed boot=casper only-ubiquity iso-scan/filename=${iso_path} quiet splash ---
initrd /casper/initrd.lz
}
menuentry "Check disc for defects" {
linux /casper/vmlinuz boot=casper integrity-check iso-scan/filename=${iso_path} quiet splash ---
initrd /casper/initrd.lz
}
menuentry "Test memory" {
linux16 /install/mt86plus
}
Redémarrage.
Au menu grub de l'Os 12.04.5 j'ai bien une entrée pour la lubuntu-15.04-desktop-i386.iso.
Sélection, validation .
Message d'erreur comme avec la clé Grub.
erreur: commande inconnue `iso_boot'
appuyer sur une touche pour continuer...
Et çà repart en boucle.
La clé Grub et le Bios de la machine qui ne sait pas booter sur l'USB, n'étant pas en cause...
Un souci dans le script?...
Je copie le contenu du script lancé depuis chez moi.
#! /bin/bash
function ai_version () {
echo " "
echo " Version 2-3 du 13/01/2016"
echo " "
Version_amorce_iso="2016_01_13-amorce_iso V2.3";
}
function fonctions_iso_V2.3 () {
echo '# fonctions_iso_V2-3.cfg
# 2016_01_10 : suppression du paramètre "--no-floppy" de la commande search (certaines PC voient les clés USB comme des floppy
#######################################################################################################################
# Redémarrage en cas d'"'"'absence ou d'"'"'indisponibilité des fichiers (fichier image iso ou fichier de configuration)
function rdmge {
echo Le PC va redémarrer dans quelques secondes
sleep -v 10
reboot
}
#######################################################################################################################
# Avertissement présenté à l'"'"'utilisateur si le fichier iso est introuvable, ou n'"'"'a pas été donné en paramètre de la commande iso_boot
# Iso file missing
function no_iso_file {
if [ -n "${1}" ] ; then
echo L\'"'"'image à partir de laquelle il faut amorcer le PC, ${1}, ne se trouve sur aucun des supports actuellement raccordés à l\'"'"'ordinateur.
else
echo Aucune image iso n\'"'"'a été attachée au libellé ${chosen} que vous venez de choisir.
fi
rdmge
}
#######################################################################################################################
# Avertissement présenté à l'"'"'utilisateur si le fichier de configuration est introuvable
# Grub configuration file missing
function no_cfg_file {
echo Le fichier de configuration, ${1}, ne se trouve sur aucun des supports actuellement raccordés à l\'"'"'ordinateur.
rdmge
}
#######################################################################################################################
# Contrôle de l'"'"'existence des fichiers
#
function existent_fichiers {
# recherche du fichier iso
if [ -n "${iso_file}" ]; then
# si grub trouve le fichier ${iso_file}, alors ce fichier est sur la partition ${root} ; sinon il faut chercher où il est.
if [ -e "${iso_file}" ]; then set image_iso=${root}; else search --file --set=image_iso "${iso_file}"; fi
fi
if [ -z "${image_iso}" ]; then no_iso_file "${iso_file}"; fi
# création du périphérique virtuel qui donne accès au fichier iso
# creation of the virtual device holding the iso file and paths initialisation
loopback iso (${image_iso})${iso_file}
set root=iso
set loopcfg=
# recherche et introduction du menu spécifique à l'"'"'image iso considérée
if [ -z "${sourcefile}" ]; then set sourcefile=/boot/grub/loopback.cfg; fi
# si le fichier se trouve sur le périphérique $root, il n'"'"'est pas utile de le chercher
if [ -e "${sourcefile}" ]; then set loopcfg=${root} ; else search --file --set=loopcfg "${sourcefile}" ; fi
if [ -z "${loopcfg}" ]; then no_cfg_file "${sourcefile}"; fi
}
#######################################################################################################################
# Cette procédure crée un periphérique virtuel qui donne accès aux répertoires et fichiers contenu dans le fichier iso
# et cherche le fichier contenant le menu correspondant à l'"'"'image iso considérée et l'"'"'introduit dans le menu Grub
# paramètre ${1} : le chemin d'"'"'accès au fichier iso
# paramètre ${2}, facultatif : le chemin d'"'"'accès au fichier contenant les entrées de menu pour l'"'"'image iso considérée
# quand il est omis, il s'"'"'agit du fichier /boot/grub/loopback.cfg de l'"'"'image iso
function iso_boot {
set image_iso=
set iso_file="${1}"
set iso_path="${1}"
set sourcefile="${2}"
existent_fichiers
source "(${loopcfg})${sourcefile}"
}
function echec_maj_amorceiso {
#######################################################################################################################
# Cette procédure affiche le message explicatif de ce qu'"'"'il faut faire si grub ne sait pas écrire dans le répertoire
# grub pour effacer la demande de démarrage par un fichier iso
echo "L'"'"'erreur précédente résulte d'"'"'une limitation de grub qui ne dispose pas des modules pour effacer la demande de démarrage" ;
echo "par un fichier iso, du fait de la nature du système de fichier support de grub.cfg (le répertoire référencé" ;
echo "par core.img tel que présenté par le rapport produit par boot-repair ou par bootinfoscript)." ;
echo "Une fois le démarrage terminé, pour supprimer cette demande de démarrage avec ${iso_file}," ;
echo "passer les commandes suivantes, dans lesquelles la variable grub désigne le point de montage" ;
echo "du répertoire pointé par core.img tel que présenté par le rapport produit par boot-repair" ;
echo "Pour démarrer le PC avec ${iso_file}, appuyer sur la touche Alt." ;
echo "Dans le cas contraire, appuyer sur la touche Ctrl." ;
}
function amorce_iso {
########################################################################################
#
# amorçage par le script shell iso_boot.sh
#
#######################################################################################
# pour éviter le bouclage sur la procédure
if ${amorceiso}; then
set image_iso=
set iso_path="${1}"
set iso_file="${1}"
set sourcefile="${2}"
existent_fichiers
export iso_path
export iso_file
export root
set amorceiso=false
if save_env amorceiso ; then
configfile "(${loopcfg})${sourcefile}"
else
echec_maj_amorceiso ;
until keystatus --ctrl ; do
sleep 1 ;
if keystatus --alt ; then configfile "(${loopcfg})${sourcefile}" ; fi ;
done ;
fi
fi'
}
function ai_exit () {
exit ${1}
}
function ai_syntaxe ()
{
# Trois éléments sont nécessaires démarrer (boot) un PC avec une image iso
# le fichier iso en question,
# le répertoire qui contient le fichier grub.cfg utilisé par grub lors du lancement,
# le fichier des commandes grub spécifiques au fichier iso (les lignes du menu et les ordres correspondants)
# Ces trois éléments sont définis dans la ligne de commande, ou, à défaut, par trois commandes "zenity
# ce qui n'est pas vraiment ergonomique, car les fenêtres correspondantes peuvent se trouver masquées,
# ce qui est un peu déconcertant. J'ai prévu la transcription en python, langage que je ne connais pas encore
# et je suis par avance reconnaissant à quiconque m'apportera une aide dans cette opération.
echo " Syntaxe : $0 [options]"
echo " Options disposibles : "
echo " -d --grub-directory répertoire d'installation de grub"
echo " -h --help affichage de la syntaxe"
echo " -i --iso-file fichier iso avec lequel amorcer le PC"
echo " -l --loopback menu grub à présenter au démarrage"
echo " -r --reboot réamorcer avec la configuration précédente"
echo " -v --version version"
echo " "
echo " Exemple d'utilisation en ligne de commande : sudo bash $0.sh -d /boot/grub -i ~/isofiles/file.iso"
echo " "
}
function que_faire () {
########################################################################################
# Présentation de la liste des options disponibles et interprétation des options sélectionnées
########################################################################################
msg="Définir le comportement de grub au redémarrage avec l'image iso"
msg="${msg}"$'\n'"${nf}"
action=$({ cat <<EOF
true
r
Réamorcer immédiatement.
false
e
Continuer à travailler. Amorcer avec l'image au prochain démarrage.
false
p
Introduire l'image comme choix dans le menu grub standard.
EOF
} | zenity --list \
--title "Choix du comportement de grub" \
--text="${msg}" \
--multiple --column="Sélection" --column="code" --column="Comportement de grub" --hide-column=2 --radiolist \
--print-column=2 --separator="" --width=300 --height=200 2>/dev/null)
case ${action} in
"r") permanent=false ; reboot=true ;;
"e") permanent=false ; reboot=false ;;
"p") permanent=true ; reboot=false ;;
"#") ai_exit 5 ;;
esac
}
function param_init () {
######################################################
# Initialisation des paramètres
######################################################
grub_dir= ;
amorce_menu= ;
aide=false ;
reboot=false ;
# whereis zenity 1>/dev/null && gui=true || gui=false ;
OPTIND=1 ;
}
function ctrl_root () {
###########################################################
# Vérification du contexte de l'appel
###########################################################
[ "$USER" != "root" ] &&
{
echo " ";
echo " Erreur : L'amorce depuis un fichier iso nécessite les droits d'administarteur";
echo " Avez vous oublie sudo devant le nom du script ?";
echo " ";
return 1;}
return 0
}
function param_decod () {
###########################################################
# Decodage de la ligne de commande
###########################################################
while getopts "d:i:l:hrv-:" option; do
ol=false
# gestion des options longues avec ou sans argument
# "${OPTARG%%=*} donne comme résultat le début de l'argument jusqu'au signe "=" non compris
# la valeur donnée à l'argument est tout ce qui suit le signe "="
[ "${option}" = "-" ] && opt_long="${OPTARG%%=*}" && OPTARG="${OPTARG:((${#opt_long}+1))}" && ol=true;
${ol} && case "${opt_long}" in
grub-directory) option="d" ;;
iso-file) option="i" ;;
loopback) option="l" ;;
help) option="h" ;;
version) option="v" ;;
reboot) option="r" ;;
*) ai_syntaxe ; clean_exit 1 ;;
esac
# puis gestion des options courtes
case $option in
d) grub_dir="${OPTARG}" ;;
i) amorce_iso="${OPTARG}" ;;
l) amorce_menu="${OPTARG}" ;;
h) ai_version && display_syntaxe && ai_exit 0 ;;
v) ai_version && ai_exit 0 ;;
r) reboot=true ;;
*) ai_syntaxe && ai_exit 1 ;;
esac
done
}
function iso_fichier () {
###########################################################
# Calcul du nom de fichier pour grub
##########################################################
# il s'agit ici de trouver le nom du fichier par rapport à la partition dans laquelle il se trouve
# df donne un résultat tel que :
# /dev/sda8 294155260 175789668 103423388 63% /media/Multimedia
# dont grep -o "% *\/.*$" | grep -o "\/.*$" ne retient que tout ce qui suit les espaces qui suivent
# le signe % cad ici : /media/Multimedia
partition=$(df "${1}" | grep -o "% *\/.*$" | grep -o "\/.*$")
if ! [ "${partition}" = "/" ]; then
# on cherche alors dans la partition les fichiers qui ont le même inode, on ne conserve que le premier
# et on supprime le nom de la partition pour ne renvoyer que le nom du fichier dans la partition
sudo find -H "${partition}" -samefile "${1}" | grep -m 1 "${partition}" | sed -e "s^${partition}^^"
else
echo "${1}"
fi
}
function quel_menu () {
#########################################################
# Sélection du fichier "loopback.cfg"
##########################################################
abort=false ;
amorce_menu="${amorce_iso%.iso}.loopback.cfg"
if ! [[ -e "${amorce_menu}" ]] && [[ -e "/tmp/${SUDO_USER}/cdrom/boot/grub/loopback.cfg" ]]; then
cp -T "/tmp/${SUDO_USER}/cdrom/boot/grub/loopback.cfg" "${amorce_menu}" ;
msg="Le fichier /boot/grub/loopback.cfg du fichier iso a été recopié sur le fichier \"${amorce_menu}\"" ;
zenity --info --title="Fichier menu grub" --text="${msg}" ;
sudo chown "${SUDO_USER}:${SUDO_USER}" "${amorce_menu}" ;
fi
trouve=false ;
abort=false ;
autre=false ;
until ${trouve} ; do
if ! [[ -e "${amorce_menu}" ]] || ${autre} ; then
autre=false ;
amorce_menu=$(zenity --file-selection --file-filter="*.cfg" \
--title="Choisir le modèle pour la création du fichier que grub doit utiliser au redémarrage") ;
! [ $((${?})) = 0 ] && return 1 ;
fi
zenity --text-info \
--title="Contrôle et mise au point éventuelle du fichier de configuration de grub" \
--width=900 --height=380 --timeout=0 --filename="${amorce_menu}" \
--editable --ok-label="C'est le bon fichier" \
--cancel-label="Choisir un autre modèle de fichier de configuration" 1>"/tmp/${SUDO_USER}/loopback.cfg";
if ! [ $((${?})) = 0 ]; then
autre=true
else
trouve=true
sudo cp -fT "/tmp/${SUDO_USER}/loopback.cfg" "${amorce_menu}" ;
sudo chown "${SUDO_USER}:${SUDO_USER}" "${amorce_menu}" ;
fi
done ;
return 0 ;
}
function quel_grub() {
########################################################################################
# Présentation de la liste des options disponibles et interprétation des options sélectionnées
########################################################################################
msg="Attendre l'affichage des répertoires, en cours de constitution,"
msg="${msg}"$'\n'"puis choisir le répertoire dans lequel se trouve le fichier"
msg="${msg}"$'\n'"de configuration que grub doit utiliser pour réamorcer le PC"
[[ -z "${grub_dir}" ]] && grub_dir=$(sudo find / -path */grub/grub.cfg | sed -e "s^/grub.cfg^^" | while \
read a; do echo false; echo "${a}"; done | zenity --list \
--title "Répertoires /grub disponibles" \
--text="${msg}" \
--multiple --column="Sélection" --column="Répertoire" --radiolist \
--print-column=2 --separator="" --width=300 --height=300 2>/dev/null)
[[ -z "${grub_dir}" ]] && return 1 || return 0
}
function quelle_amorce () {
##########################################################
# Contrôle de la structure du fichier d'installation
#########################################################
( [[ -z "${amorce_iso}" ]] || ! [[ -e "${amorce_iso}" ]] ) && amorce_iso=$(zenity --file-selection \
--file-filter="*.iso" --title="Choisir le fichier à partir duquel amorcer le PC") ;
[[ -z "${amorce_iso}" ]] && return 1 ;
grub_iso=$(iso_fichier "${amorce_iso}") ;
nf=$(basename "${grub_iso}" .iso)
! [[ -e "/tmp/${SUDO_USER}/cdrom" ]] && mkdir -p "/tmp/${SUDO_USER}/cdrom" ;
mount -r -o loop "${amorce_iso}" "/tmp/${SUDO_USER}/cdrom" ;
msg="Le fichier \"${amorce_iso}\" a été monté sur le point de montage \"/tmp/${SUDO_USER}/cdrom\""
zenity --info --title="Fichier iso sélectionné pour le futur redémarrage" --text="${msg}" ;
return 0 ;
}
function iso_reamorce () {
###########################################################
# Arrêt et redémarrage pour amorçage depuis le fichier iso
##########################################################
! ${permanent} && sudo grub-editenv "${grub_dir}/grubenv" set amorceiso=true
${reboot} && sudo shutdown -r now
return 0
}
function iso_gen_custom () {
##########################################################
## Création ou mise à jour du fichier custom.cfg
##########################################################
grep -e {config_directory} -c ${grub_dir}/grub.cfg 1>/dev/null && prefix="{config_directory}" || prefix="{prefix}"
sudo mkdir -p /tmp/amorceiso
touch "${grub_dir}/custom.cfg" && cat "${grub_dir}/custom.cfg" | grep -v -e amorce_iso -e "${1}" -e greffons/fonctions_iso.cfg \
1>"/tmp/amorceiso/custom.cfg"
{ echo -n " "; echo "source \$${prefix}/greffons/fonctions_iso.cfg" ; } 1>"${grub_dir}/custom.cfg"
if ${permanent}; then
{ echo -n " "; echo "submenu "'"'"${nf}"'"'" {iso_boot "'"'"${1}"'"'" "'"'"${2}"'"'}" " ; } 1>>"${grub_dir}/custom.cfg"
else
{ echo -n " "; echo amorce_iso "${1}" "${2}" ; } 1>>"${grub_dir}/custom.cfg"
fi
cat "/tmp/amorceiso/custom.cfg" 1>>"${grub_dir}/custom.cfg"
return 0
}
###################################
#
# Enregistrement des fonctions iso pour grub
#
####################################
function iso_gen_fonction () {
! [ -e "${grub_dir}/greffons" ] && \
{ titre="Création de la fonction grub pour permettre l'amorce par fichier iso" ;
msg="Enregistrement du fichier \"fonctions_iso.cfg\" dans le répertoire \"${grub_dir}/greffons\""
zenity --info \
--title="${titre}" --text="${msg}" || echo "${msg}" ;
sudo mkdir "${grub_dir}/greffons"; }
fonctions_iso_V2.3 1>"${grub_dir}/greffons/fonctions_iso.cfg" ;
}
function execution () {
#############################################################
#
# Script d'amorce à partir d'une image iso
#
############################################################
! ctrl_root && ai_exit 1 ;
shopt -s extglob ;
param_init ;
param_decod "${@}" ;
${reboot} && iso_reamorce && ai_exit 100 ;
# ${gui} && { grub_dir= ; amorce_iso= ; amorce_menu= ; } ;
! quel_grub && ai_exit 2
iso_gen_fonction ;
! quelle_amorce && ai_exit 3 ;
! quel_menu && ai_exit 4
[[ -n "${amorce_menu}" ]] && grub_menu=$(iso_fichier "${amorce_menu}") || ai_exit 5 ;
que_faire
iso_gen_custom "${grub_iso}" "${grub_menu}"
iso_reamorce
ai_exit 100
}
execution
@+.Babdu89 .