1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241
|
#!/bin/bash
# Steven Shiau <steven _at_ clonezilla org>
# License: GPL
# Description: prepare the memtest86+ by using the files on the system or download and extract the required programs for DRBL.
DRBL_SCRIPT_PATH="${DRBL_SCRIPT_PATH:-/usr/share/drbl}"
. $DRBL_SCRIPT_PATH/sbin/drbl-conf-functions
[ -e /etc/drbl/drbl-ocs.conf ] && . /etc/drbl/drbl-ocs.conf
[ -e $DRBL_SCRIPT_PATH/sbin/ocs-functions ] && . $DRBL_SCRIPT_PATH/sbin/ocs-functions
# Local settings
# By default we only copy the required files to $pxelinux_binsrc_dir. This option will allow us to copy files to dir $pxecfg_pd.
deploy_to_system_too="no"
# Functions
USAGE() {
echo "Put the memtest86+ files in DRBL package repository"
echo "Usage: $0 [OPTION]"
echo "OPTION:"
echo "-u, --from-upstream Use the binary from upstream ($MEMTEST86_URL). If this option is not assigned, DRBL will try to use the memtest86+ from your GNU/Linux distribution."
echo "-mv, --memtest86-version VERSION The memtest86+ version to be used with -u|--from-upstream. If not assigned, the version number specified in drbl.conf will be used."
echo "-d, --deploy-to-system-too Deploy the file to DRBL system ($pxecfg_pd), too."
echo "Ex: To use the memtest86+ 4.20 from $MEMTEST86_URL, run '$0 -u -mv 4.20'"
}
#
put_memtest_bin_2_drbl_repo() {
local memtest_bin_abs_path="$1"
[ -z "$memtest_bin_abs_path" ] && return 1
echo "Putting memtest86+ in DRBL package repository $memtest86_dir/... "
memtest_f="$(shorten_memtest_filename `basename $memtest_bin_abs_path`)"
cp -af $memtest_bin_abs_path $memtest86_dir/$memtest_f
memtest_v="$(LC_ALL=C strings $memtest_bin_abs_path | grep -Ei 'Memtest86\+[[:space:]]+v' |\
sed -r -e "s/^[[:space:]]*//g" | sort | head -n 1)"
echo "Memtest86+ version: $memtest_v"
echo $memtest_v > $memtest86_dir/VERSION
echo "done!"
if [ "$deploy_to_system_too" = "yes" ]; then
echo -n "Putting memtest86+ in DRBL system dir $pxecfg_pd/... "
cp -af $memtest_f $pxecfg_pd/
echo $memtest_v > $pxecfg_pd/MEMTEST86+_VERSION
echo "done!"
fi
} # end of put_memtest_bin_2_drbl_repo
#
put_upstream_memtest(){
# Function to use the upstream binary directly
local ver="$1"
if [ -z "$ver" ]; then
[ "$BOOTUP" = "color" ] && $SETCOLOR_FAILURE
echo "No upstream memtest version was assigned. Program terminated."
[ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
USAGE
exit 1
fi
memfile="memtest86+-${ver}.bin"
tmp_wd="$(LC_ALL=C mktemp -d /tmp/memtest_tmp.XXXXXXX)"
echo -n "Downloading ${ver} memtest86+ files from $MEMTEST86_URL... "
LC_ALL=C wget $wget_opt -P $tmp_wd $MEMTEST86_URL/$ver/$memfile
echo "done!"
put_memtest_bin_2_drbl_repo $tmp_wd/$memfile
if [ -d "$tmp_wd" -a -n "$(echo "$tmp_wd" | grep -i memtest_tmp)" ]; then
rm -rf $tmp_wd
fi
} # end of put_upstream_memtest
#
shorten_memtest_filename() {
local inp_fn="$1"
# memtest86+.bin -> mt86+x32.mbr
# memtest86+x32.bin -> mt86+x32.mbr
# memtest86+x32.efi -> mt86+x32.efi
# memtest86+ia32.bin -> mt86+x32.mbr
# memtest86+ia32.efi -> mt86+x32.efi
# memtest86+x64.bin -> mt86+x64.mbr
# memtest86+x64.efi -> mt86+x64.efi
case "$inp_fn" in
memtest86+.bin) echo mt86+x32.mbr;;
memtest86+x32.bin) echo mt86+x32.mbr;;
memtest86+x32.efi) echo mt86+x32.efi;;
memtest86+ia32.bin) echo mt86+x32.mbr;;
memtest86+ia32.efi) echo mt86+x32.efi;;
memtest86+x64.bin) echo mt86+x64.mbr;;
memtest86+x64.efi) echo mt86+x64.efi;;
*) echo $inp_fn;;
esac
} # end of shorten_memtest_filename
#
put_distribution_memtest() {
# Function to use the package from distribution.
# Memtest86+ file name on different distributions:
# Debian/Ubuntu
# <= v7.2: /boot/memtest86+x64.bin, /boot/memtest86+x64.efi;
# >= v8.0: /boot/mt86+ia32, /boot/mt86+x64 (Unified Binary, no longer separate .bin (Legacy) and .efi (UEFI) files
# i.e., a single binary for both UEFI and legacy boot.)
# SuSE: "memtest.bin"
# Fedora 14: "/boot/memtest86+"
# Centos 5.6: "/boot/memtest86+-1.65"
if $query_pkglist_exist_cmd memtest86+ &>/dev/null; then
# Found on the system
# For Redhat-like system, there might return more than one file on a system, i.e. one file belongs to 2 rpm packages.
# 2022/11/23, 2023/05/17 On Debian, memtest86+ v6 is available:
# /boot/memtest86+x32.bin
# /boot/memtest86+x32.efi
# /boot/memtest86+ia32.bin (For newer package)
# /boot/memtest86+ia32.efi (For newer package)
# /boot/memtest86+x64.bin
# /boot/memtest86+x64.efi
# While for memtest86+ <= v5, the file is:
# /boot/memtest86+.bin
# For syslinux in FAT file system,
# "memtest86+.bin" is 9 characters, will go wrong when it's FAT (usb flash drive). We use memtest to overwrite the one comes from Debian live.
# In addition, do NOT use memtest.bin, use memtest instead of memtest.bin
# since "*.bin" has specially purpose for syslinux.
# So here they are:
# memtest86+.bin -> mt86+x32.mbr
# memtest86+x32.bin -> mt86+x32.mbr
# memtest86+x32.efi -> mt86+x32.efi
# memtest86+ia32.bin -> mt86+x32.mbr
# memtest86+ia32.efi -> mt86+x32.efi
# memtest86+x64.bin -> mt86+x64.mbr
# memtest86+x64.efi -> mt86+x64.efi
# For memtest <= v5.0
memtest_bin="$(LC_ALL=C $query_pkglist_cmd memtest86+ | grep -Ew "(memtest86\+.bin$|memtest\.bin$|^/boot/memtest86+)" | sort | head -n 1)"
# For memtest >= v6.0
memtest_x32_bin="$(LC_ALL=C $query_pkglist_cmd memtest86+ | grep -Ew "^/boot/memtest86\+x32\.bin" | sort | head -n 1)"
memtest_x32_efi="$(LC_ALL=C $query_pkglist_cmd memtest86+ | grep -Ew "^/boot/memtest86\+x32\.efi" | sort | head -n 1)"
memtest_x32_bin="$(LC_ALL=C $query_pkglist_cmd memtest86+ | grep -Ew "^/boot/memtest86\+ia32\.bin" | sort | head -n 1)"
memtest_x32_efi="$(LC_ALL=C $query_pkglist_cmd memtest86+ | grep -Ew "^/boot/memtest86\+ia32\.efi" | sort | head -n 1)"
memtest_x64_bin="$(LC_ALL=C $query_pkglist_cmd memtest86+ | grep -Ew "^/boot/memtest86\+x64\.bin" | sort | head -n 1)"
memtest_x64_efi="$(LC_ALL=C $query_pkglist_cmd memtest86+ | grep -Ew "^/boot/memtest86\+x64\.efi" | sort | head -n 1)"
# For memtest >= v8.0
memtest_x64="$(LC_ALL=C $query_pkglist_cmd memtest86+ | grep -Ew "^/boot/mt86\+x64$" | sort | head -n 1)"
for im in $memtest_x64 $memtest_bin $memtest_x32_bin $memtest_x32_efi $memtest_x64_bin $memtest_x64_efi; do
eval imfile="\$im"
if [ -n "$imfile" ]; then
echo "Found $imfile in this system, copying the memtest file to DRBL local repository..."
put_memtest_bin_2_drbl_repo $imfile
else
[ "$BOOTUP" = "color" ] && $SETCOLOR_WARNING
echo "Package of memtest was installed, but memtest boot file not found!"
[ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
fi
done
else
# Download and extract it. The reason we do not install it is we do not want to bother the server's boot menu
tmp_wd="$(LC_ALL=C mktemp -d /tmp/memtest_tmp.XXXXXXX)"
echo "Trying to download memtest86+ from distribution repository..."
if [ -e /etc/debian_version ]; then
# Debian
# The binary for memtest86+ in Debian Squeeze: /boot/memtest86+.bin
# Clean all stale deb files in the cache dir. Otherwise there might be some old version of debs exist in the cache dir.
LC_ALL=C apt-get clean
LC_ALL=C apt-get -d --reinstall install memtest86+
(
cd $tmp_wd
LC_ALL=C dpkg --extract /var/cache/apt/archives/memtest86+*.deb .
if [ -e "$(pwd)/boot/mt86+x64" ]; then
put_memtest_bin_2_drbl_repo "$(pwd)"/boot/mt86+x64
elif [ -e "$(pwd)/boot/memtest86+64.bin" ]; then
put_memtest_bin_2_drbl_repo "$(pwd)"/boot/memtest86+x64.bin
elif [ -e "$(pwd)/boot/memtest86+64.efi" ]; then
put_memtest_bin_2_drbl_repo "$(pwd)"/boot/memtest86+x64.efi
fi
)
elif [ -e /etc/SuSE-release ]; then
# SuSE
# The binary for memtest86+ in openSuse 11.3 is: /boot/memtest.bin
LC_ALL=C zypper install -d -f -y memtest86+
memtest86_rpm="$(LC_ALL=C find /var/cache/zypp/packages/ -name "memtest86+-*.rpm" -print)"
memtest_bin="$(LC_ALL=C rpm -qpl "$memtest86_rpm" | grep -Ew "memtest.bin$")"
(
cd $tmp_wd
LC_ALL=C rpm2cpio "$memtest86_rpm" | cpio -idm
put_memtest_bin_2_drbl_repo "$(pwd)"/$memtest_bin
)
else
# RH-like
# The binary for memtest86+ in Fedora 14 is: /boot/memtest86+-4.10
LC_ALL=C yumdownloader --destdir $tmp_wd memtest86+
memtest_bin="$(LC_ALL=C rpm -qpl "$tmp_wd/memtest86*.rpm" | grep -Ew "^/boot/memtest86+")"
(
cd $tmp_wd
LC_ALL=C rpm2cpio $tmp_wd/memtest86*.rpm | cpio -idm
put_memtest_bin_2_drbl_repo "$(pwd)"/$memtest_bin
)
fi
if [ -d "$tmp_wd" -a -n "$(LC_ALL=C echo "$tmp_wd" | grep -i memtest_tmp)" ]; then
rm -rf $tmp_wd
fi
fi
} # end of put_distribution_memtest
############
### MAIN ###
############
check_if_root
ask_and_load_lang_set
#
while [ $# -gt 0 ]; do
case "$1" in
-u|--from-upstream) shift; mode="from-upstream" ;;
-mv|--memtest86-version)
shift;
if [ -z "$(echo $1 |grep ^-.)" ]; then
# skip the -xx option, in case
memtest_ver_requested="$1"
[ -z "$memtest_ver_requested" ] && USAGE && exit 1
shift
fi
;;
-d|--deploy-to-system-too) shift; deploy_to_system_too="yes" ;;
*) USAGE && exit 1 ;;
esac
done
# Check arch
cpu_arch="$(LC_ALL=C uname -m)"
if [ "$cpu_arch" != "i686" -a "$cpu_arch" != "x86_64" ]; then
[ "$BOOTUP" = "color" ] && $SETCOLOR_WARNING
echo "CPU arch is not i386/i686 or x86_64!"
echo "Skipping preparing memtest+!"
[ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
echo "$msg_program_stop"
exit 3
fi
# mode is essential
[ -z "$mode" ] && mode="from-distribution"
[ -z "$memtest_ver_requested" ] && memtest_ver_requested="$MEMTEST86_VER_DEF"
case "$mode" in
from-distribution) put_distribution_memtest ;;
from-upstream) put_upstream_memtest $memtest_ver_requested ;;
esac
exit 0
|