#!/bin/bash # # add-firmware-to: Add non-free firmware to Debian install media # # Copyright (C) 2008-2009 dann frazier # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # Changelog: # 2011.02.08 - Add support for initrd.img files (same as initrd.gz) # (Andrew McGlashan) # 2009.02.17 - Add support for isolinux-based CD images, # which should work for i386/amd64 - happy # to add other archs upon request # 2008.??.?? - Initial creation, just works on initrds # set -x is_iso() { file "$1" | grep -q "ISO 9660\|DOS/MBR boot sector" } is_initrd() { file "$1" | grep -q "gzip compressed data" } fetch_firmware() { local target local fwfile local fwurl local suite target="$1" suite="$2" fwfile="firmware.tar.gz" fwurl="http://cdimage.debian.org/cdimage/unofficial/non-free/firmware/$suite/current/$fwfile" wget "$fwurl" -O "$target" } am_root() { [ "$(id -u)" -eq 0 ] } initrd_append_fw() { local initrd="$1" local fwfile="$2" local outfile="$3" local BUILD_DIR=$(pwd) local initrdtmp="$(mktemp -d)" gunzip < "$initrd" > "$initrdtmp/initrd" cd "$initrdtmp" tar xfz "$fwfile" mkdir x for file in *deb; do dpkg-deb -x "$file" x done mkdir -p x/usr/share/graphics/ cp $BUILD_DIR/extras/bandeau.png x/usr/share/graphics/logo_debian.png (cd x && find . | cpio -H newc -o) >> initrd cd - gzip -9 < "$initrdtmp/initrd" > "$outfile" #rm -rf "$initrdtmp" } if [ $# != 3 ]; then echo "Usage: add-firmware-to.sh " >&2 exit 1 fi file="$1" if [ ! -f "$file" ]; then echo "$file not found" >&2 exit 2 fi outfile="$2" if [ -e "$outfile" ]; then echo "$outfile already exists" >&2 exit 2 fi suite="$3" if [ "$suite" != "buster" ] && [ "$suite" != "bullseye" ]; then echo "Unrecognized suite $suite, trying anyway." >&2 fi fwfile="$(mktemp)" if ! fetch_firmware "$fwfile" "$suite"; then echo "ERROR: Could not download firmware" >&2 exit 1 fi if is_iso "$file"; then isotmp="$(mktemp -d)" buildtree="$isotmp/buildtree" BUILD_DIR=$(pwd) xorriso -osirrox on -indev "$file" -extract / "$buildtree" chmod -R u+w "$buildtree" cp $BUILD_DIR/menu.cfg $buildtree/isolinux/ arch=`echo "$file" | cut -d"-" -f3` if [ $arch = "i386" ]; then sed -i 's/__ARCH__/386/g' $buildtree/isolinux/menu.cfg else sed -i 's/__ARCH__/amd/g' $buildtree/isolinux/menu.cfg fi for i in $(find "$buildtree" -name "initrd.gz" -o -name "initrd.img"); do initrd_append_fw "$i" "$fwfile" "$i" done isolinuxpath="$(cd $buildtree && find . -name isolinux.bin | head -1 | cut -b 3-)" genisoimage -r -J -b "$isolinuxpath" -c boot.cat \ -no-emul-boot -boot-load-size 4 -boot-info-table \ -o "$outfile" "$buildtree" #rm -rf "$isotmp" fi if is_initrd "$file"; then initrd_append_fw "$file" "$fwfile" "$outfile" fi # Add MBR/EFI stuff to make iso bootable with dd / Etcher ... isohybrid $outfile echo "Output in $outfile" rm -f "$fwfile"