#1 Le 25/06/2021, à 13:09
- gigiair
demande d'aide pour un script qui échoue
Je suis un (malheureux ?) propriétaire d'un Asus x205TA sur lequel j''ai installé une Debian mais en étant incapable de configurer le son.
Ceci est dû à un chipset « Bay trail » bon marché et pour le moins exotique.
J'ai eu le son pendant un an ou deux mais à la suite de l'évolution du noyau, ça ne marche plus.
Il y a un spécialiste de cette machine (HarryHarryHarry) qui s'est attelé au problème et qui a proposé diverses solutions.
Mais comme la machine est assez ancienne, il a un peu laissé tomber.
Pour ne pas abandonner les nombreuses personnes qui le suivent il a écrit un script qui se propose de transformer un iso qui installe une distribution sonore à partir d'une distribution quelconque ( c'est ce que j'ai compris avec mes modestes compétences en anglais)
Post de HHH
Le script est affiché ci-dessous, mais j'ai un gros problème :
le script plante sur ma machine (debian 11) : il ne distingue pas le fichier iso fourni en argument, ni l'absence d'argument non plus :
debjjr@charlotte:~/Téléchargements$ sh ./x205ta-create-iso.sh debian-live-testing-amd64-xfce+nonfree.iso
./x205ta-create-iso.sh: 3: [[: not found
./x205ta-create-iso.sh: 10: set: Illegal option -o pipefail
Comme vous l'imaginez, je suis un piètre connaisseur en bash j'ai googelisé sans succès pendant un bon moment. Comme je sais que de fins connaisseurs fréquentent ce site, je fais appel à eux.
#!/usr/bin/env bash
if [[ -z $1 ]]
then
echo "Supply linux iso as parameter: $0 /path/to/linux.iso"
exit 1
fi
## If anything goes awry, abort script
set -euo pipefail
## Clean up some mounts/directories the script might have made if the script is ended (prematurely or not).
function cleanup {
rm -rf "${tmp_work_dir}" || /bin/true
umount "${tmp_mount_dir}" || /bin/true
rm -rf "${tmp_mount_dir}" || /bin/true
umount "${tmp_x205ta_efi_dir}" || /bin/true
rm -rf "${tmp_x205ta_efi_dir}" || /bin/true
umount "${tmp_original_efi_dir}" || /bin/true
rm -rf "${tmp_original_efi_dir}" || /bin/true
rm -rf /tmp/grub.cfg || /bin/true
}
trap "cleanup" SIGHUP SIGINT SIGTERM EXIT
## Perform some checks to ensure the script can run properly
if [[ $EUID != 0 ]]
then
echo "Script needs root to mount iso."
exit 1
fi
if [[ ! -f /usr/lib/grub/i386-efi/modinfo.sh ]]
then
echo "Aborting: i386-efi grub-libraries (/usr/lib/grub/i386-efi) missing"
exit 1
fi
if [[ -f /usr/share/syslinux/isohdpfx.bin ]]
then
isohdpfx_bin="/usr/share/syslinux/isohdpfx.bin"
elif [[ -f /usr/lib/syslinux/bios/isohdpfx.bin ]]
then
isohdpfx_bin="/usr/lib/syslinux/bios/isohdpfx.bin"
elif [[ -f /usr/lib/ISOLINUX/isohdpfx.bin ]]
then
isohdpfx_bin="/usr/lib/ISOLINUX/isohdpfx.bin"
else
echo "Aborting: isohdpfx.bin not found, please install syslinux and make sure this script points to isohdpfx.bin"
exit 1
fi
if [[ -f /usr/bin/grub2-mkstandalone ]]
then
grub_mkstandalone="/usr/bin/grub2-mkstandalone"
elif [[ -f /usr/bin/grub-mkstandalone ]]
then
grub_mkstandalone="/usr/bin/grub-mkstandalone"
else
grub_mkstandalone="/usr/bin/grub-emkstandalone"
fi
required_binaries=( fdisk isoinfo mkdosfs xorriso rsync readlink ${grub_mkstandalone} )
binaries_are_missing=false
for i in "${required_binaries[@]}"
do
command -v "${i}" >/dev/null 2>&1 || { echo >&2 "This script needs $i but it's not installed."; binaries_are_missing=true; }
done
if $binaries_are_missing
then
echo "Aborting, some required binaries are missing"
exit 1
fi
## Set some variables with info regarding the iso and the directory the script is in
iso_label=$(isoinfo -d -i $1 | sed -n 's/Volume id: //p')
script_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
## create temporary directories where the script is allowed to perform its business
tmp_mount_dir=$(mktemp -d -t x205ta-mount-XXXXXXXXXX)
tmp_work_dir=$(mktemp -d -t x205ta-work-XXXXXXXXXX)
tmp_original_efi_dir=$(mktemp -d -t x205ta-efi-original-XXXXXXXXXX)
tmp_x205ta_efi_dir=$(mktemp -d -t x205ta-efi-XXXXXXXXXX)
## Mount iso and copy its contents to a temporary directory
mount -o loop "${1}" "${tmp_mount_dir}"
rsync -a "${tmp_mount_dir}"/. "${tmp_work_dir}"
## Add a bootia32.efi (which the script will generate) to the original iso's efi.img to allow booting from a 32-bit efi device
if [[ "${iso_label}" == openSUSE* ]]
then
efi_original_from_iso_location=$(find "${tmp_work_dir}" -type f -name 'efi' | head -n1)
elif [[ "${iso_label}" == *buntu*21* ]]
then
skip=$(/sbin/fdisk -l "$1" | fgrep '.iso2 ' | awk '{print $2}')
size=$(/sbin/fdisk -l "$1" | fgrep '.iso2 ' | awk '{print $4}')
dd if="$1" bs=512 skip="$skip" count="$size" of="${tmp_work_dir}"/efi.img
efi_original_from_iso_location="${tmp_work_dir}"/efi.img
else
efi_original_from_iso_location=$(find "${tmp_work_dir}" -type f -name '*efi*img*' | head -n1)
fi
mount -o loop "${efi_original_from_iso_location}" "${tmp_original_efi_dir}"
cp -a "${tmp_original_efi_dir}"/* "${tmp_x205ta_efi_dir}"
umount "${tmp_original_efi_dir}"
dd if=/dev/zero of="${efi_original_from_iso_location}" bs=1M count=19
mkdosfs -F 12 "${efi_original_from_iso_location}"
mount -o loop "${efi_original_from_iso_location}" "${tmp_original_efi_dir}"
cp -a "${tmp_x205ta_efi_dir}"/* "${tmp_original_efi_dir}"
## Make grub.cfg aware that all files it references are located on hd0 (being the usb stick).
grub_cfg_location=$(find "${tmp_work_dir}" -name 'grub.cfg' | head -n1)
sed -i '1 i\set root=(hd0)' "${grub_cfg_location}"
echo "search.fs_label ${iso_label} root hd0,msdos2" > /tmp/grub.cfg
echo "configfile (hd0)/${grub_cfg_location#*/*/*/}" >> /tmp/grub.cfg
## Generate bootia32.efi to allow booting from a 32-bit efi device
"${grub_mkstandalone}" -d /usr/lib/grub/i386-efi/ -O i386-efi --modules="part_gpt part_msdos" --fonts="unicode" --themes="" \
-o "${tmp_original_efi_dir}/efi/boot/bootia32.efi" "boot/grub/grub.cfg=/tmp/grub.cfg"
umount "${efi_original_from_iso_location}"
pushd "${tmp_work_dir}"
## Create modified iso
if [[ "${iso_label}" == MANJARO* || "${iso_label}" == *buntu*21* || "${iso_label}" == MX-Live ]]
then
xorriso -as mkisofs -iso-level 3 -full-iso9660-filenames -volid "${iso_label}" \
-eltorito-boot boot/grub/i386-pc/eltorito.img -eltorito-catalog boot.catalog \
-no-emul-boot -boot-load-size 4 -boot-info-table -isohybrid-mbr "${isohdpfx_bin}" \
-eltorito-alt-boot -e "${efi_original_from_iso_location#*/*/*/}" -no-emul-boot -isohybrid-gpt-basdat \
-output "${script_dir}"/"${1/#/x205ta-}" .
elif [[ "${iso_label}" == openSUSE* ]]
then
xorriso -as mkisofs -iso-level 3 -full-iso9660-filenames -volid "${iso_label}" \
-eltorito-boot boot/x86_64/loader/isolinux.bin \
-no-emul-boot -boot-load-size 4 -boot-info-table -isohybrid-mbr "${isohdpfx_bin}" \
-eltorito-alt-boot -e "${efi_original_from_iso_location#*/*/*/}" -no-emul-boot -isohybrid-gpt-basdat \
-output "${script_dir}"/"${1/#/x205ta-}" .
else
echo "[ WARN ] Not recognizing iso label, using default xorriso-command to build iso. This may fail !!!"
xorriso -as mkisofs -iso-level 3 -full-iso9660-filenames -volid "${iso_label}" \
-eltorito-boot isolinux/isolinux.bin -eltorito-catalog isolinux/boot.cat \
-no-emul-boot -boot-load-size 4 -boot-info-table -isohybrid-mbr "${isohdpfx_bin}" \
-eltorito-alt-boot -e "${efi_original_from_iso_location#*/*/*/}" -no-emul-boot -isohybrid-gpt-basdat \
-output "${script_dir}"/"${1/#/x205ta-}" .
fi
popd
## Set ownership and group permissions to the created iso (otherwise it'll be owned by root, which is annoying).
chown $(who am i | awk '{print $1}'):$(who am i | awk '{print $1}') "${script_dir}"/"${1/#/x205ta-}"
exit 0
--
JJR.
Hors ligne
#2 Le 25/06/2021, à 13:20
- pingouinux
Re : demande d'aide pour un script qui échoue
Bonjour,
debjjr@charlotte:~/Téléchargements$ sh ./x205ta-create-iso.sh debian-live-testing-amd64-xfce+nonfree.iso
Il ne faut pas lancer le script avec sh.
Utilise une des deux méthodes suivantes :
bash ./x205ta-create-iso.sh debian-live-testing-amd64-xfce+nonfree.iso
./x205ta-create-iso.sh debian-live-testing-amd64-xfce+nonfree.iso
Hors ligne
#3 Le 25/06/2021, à 13:22
- alex2423
Re : demande d'aide pour un script qui échoue
Ta première erreur vient de la ligne :
if [[ -z $1 ]]
puis ensuite il s'agit de la ligne (permettant de construire la variable)
set -euo pipefail
En effet si j'étais toi, je renommerais le nom du fichier avec un nom plus court, sans le "+".
Hors ligne
#4 Le 25/06/2021, à 13:24
- gigiair
Re : demande d'aide pour un script qui échoue
Merci. Je reconnais que je suis nul en Bash... ça fait des années que je lançais un script de cette façon.
--
JJR.
Hors ligne