Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP

Loading…

A bunch of changes #43

Closed
wants to merge 10 commits into from

5 participants

@nylen

I decided to make rpi-update behave more like how I wanted, so I thought I'd share. This pull request includes the following changes:

  • Readme updates and restructuring, based on Bengt's #20
  • Merged adammw's #14 to fix a possible BOOT_PATH and ROOT_PATH issue
  • Show a bunch more progress messages from different steps, including the ones from lacop's #17 and more
  • Show output from git, wget, cp - this helps to diagnose whether the update process is hung up or if it is still continuing
  • Prefix script messages with *** and errors with !!! to make it clear which output comes from the script and which comes from external commands
  • Add and document option to disable self-updating (UPDATE_SELF=0 rpi-update)

The commits aren't as cleanly separated as I'd like. If you don't want all of this stuff, let me know, and I'll try to clean up what you do want.

@Hexxeh
Owner

Happy to merge this, but you'll need to tweak it to merge cleanly to HEAD. Some of the changes you've included from other pull requests have now been merged, too.

@Hexxeh Hexxeh referenced this pull request
Closed

githubified the readme #20

@Hexxeh Hexxeh closed this
@nylen

Done. An updated pull request is at #51.

@nylen nylen referenced this pull request
Merged

A bunch of changes (v2) #51

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Commits on Jun 19, 2012
  1. @adammw
Commits on Jul 3, 2012
  1. @lacop

    Added more progress messages in the update sequence.

    lacop authored
    Since it takes a while it is nice to know what the status is.
Commits on Jul 9, 2012
  1. @Bengt

    githubified the readme

    Bengt authored
Commits on Oct 24, 2012
  1. @nylen

    Merge branch 'new-readme' of git://github.com/Bengt/rpi-update

    nylen authored
    Conflicts:
    	README.md
  2. @nylen

    Merge branch 'master' of git://github.com/lacop/rpi-update

    nylen authored
    Conflicts:
    	rpi-update
  3. @nylen
  4. @nylen
  5. @nylen
  6. @nylen
  7. @nylen
This page is out of date. Refresh to see the latest.
Showing with 121 additions and 91 deletions.
  1. +50 −34 README.md
  2. +71 −57 rpi-update
View
84 README.md
@@ -1,58 +1,74 @@
-rpi-update
-==========
+# rpi-update
-An easier way to update the firmware of your Raspberry Pi
+An easier way to update the firmware of your Raspberry Pi.
-Instructions
-------------
+## Preparations
+
+There are two possible problems related to SSL certificates that may prevent
+this tool from working.
+
+- The time may be set incorrectly on your Raspberry Pi, which you can fix
+ by setting the time using NTP.
+
+ sudo ntpdate -u ntp.ubuntu.com
+
+- The other possible issue is that you might not have the `ca-certificates`
+ package installed, and so GitHub's SSL certificate isn't trusted. If you are
+ on Debian, you can resolve this by typing:
+
+ sudo apt-get install ca-certificates
+
+## Installing
To install the tool, run the following command:
-<pre>
-sudo wget http://goo.gl/1BOfJ -O /usr/bin/rpi-update && sudo chmod +x /usr/bin/rpi-update
-</pre>
+ sudo wget http://goo.gl/1BOfJ -O /usr/bin/rpi-update && chmod +x /usr/bin/rpi-update
+
+## Updating
-If you get errors relating to certificates, then the problem is likely due to one of two things. Either the time is set incorrectly on your Raspberry Pi, which you can fix by simply setting the time using NTP. The other possible issue is that you might not have the ca-certificates package installed, and so GitHub's SSL certificate isn't trusted. If you're on Debian, you can resolve this by typing:
+Then, to update your firmware, just run the following command:
-<pre>
-sudo apt-get install ca-certificates
-</pre>
+ sudo rpi-update
-To then update your firmware, simply run the following command:
+## Activating
-<pre>
-sudo rpi-update
-</pre>
+After the firmware has been sucessfully updated, you'll need to reboot to load
+the new firmware.
-To upgrade/downgrade to a specific firmware revision, specify it's Git hash as follows:
+## Options
-<pre>
-rpi-update <git hash>
-</pre>
+If you'd like to set a different GPU/ARM memory split, then define `gpu_mem` in
+`/boot/config.txt`.
-If you'd like to set a different GPU/ARM memory split, then define gpu_mem in /boot/config.txt.
+To upgrade/downgrade to a specific firmware revision, specify its Git hash
+(from the https://github.com/Hexxeh/rpi-firmware repository) as follows:
-Expert options
---------------
+ sudo rpi-update fab7796df0cf29f9563b507a59ce5b17d93e0390
-There are a number of options for experts you might like to use, these are all environment variables you must set if you wish to use them.
+### Expert options
-### SKIP_KERNEL
+There are a number of options for experts you might like to use. These are all
+environment variables you must set if you wish to use them.
-#### Usage
+#### `UPDATE_SELF`
-SKIP_KERNEL=1 rpi-update
+By default, `rpi-update` will attempt to update itself each time it is run.
+You can disable this behavior by:
-#### Effect
+ sudo UPDATE_SELF=0 rpi-update
-Will update everything EXCEPT the kernel.img files and the kernel modules. Use with caution, some firmware updates might depend a kernel update.
+#### `SKIP_KERNEL`
-### ROOT_PATH/BOOT_PATH
+ sudo SKIP_KERNEL=1 rpi-update
-#### Usage
+Will update everything **except** the `kernel.img` files and the kernel modules.
+Use with caution, some firmware updates might depend on a kernel update.
-ROOT_PATH=/media/root BOOT_PATH=/media/boot rpi-update
+#### `ROOT_PATH` and `BOOT_PATH`
-#### Effect
+ sudo ROOT_PATH=/media/root BOOT_PATH=/media/boot rpi-update
-Allows you to perform an "offline" update, ie update firmware on an SD card you're not currently booted from. Useful for installing firmware/kernel to a non-RPI customised image. Be careful, you must specify both options or neither. Specifying only one will not work.
+Allows you to perform an "offline" update, ie update firmware on an SD card you
+are not currently booted from. Useful for installing firmware/kernel to a
+non-RPI customised image. Be careful, you must specify both options or neither.
+Specifying only one will not work.
View
128 rpi-update
@@ -5,9 +5,15 @@ set -o errexit
REPO_URI="http://github.com/Hexxeh/rpi-firmware"
-UPDATE2=${UPDATE2:-1}
+UPDATE_SELF=${UPDATE_SELF:-1}
UPDATE_URI="https://github.com/Hexxeh/rpi-update/raw/master/rpi-update"
+if [[ ${BOOT_PATH:-"unset"} == "unset" && ${ROOT_PATH:-"unset"} != "unset" ]] ||
+[[ ${BOOT_PATH:-"unset"} != "unset" && ${ROOT_PATH:-"unset"} == "unset" ]]; then
+ echo " *** You need to specify both ROOT_PATH and BOOT_PATH, or neither"
+ exit 1
+fi
+
ROOT_PATH=${ROOT_PATH:-"/"}
BOOT_PATH=${BOOT_PATH:-"/boot"}
SKIP_KERNEL=${SKIP_KERNEL:-0}
@@ -19,18 +25,18 @@ FW_REV=${1:-""}
GITCMD="git --git-dir=\"${FW_REPOLOCAL}/.git\" --work-tree=\"${FW_REPOLOCAL}\""
function update_self() {
- echo "Performing self-update"
+ echo " *** Performing self-update"
_tempFileName="$0.tmp"
- if ! wget --quiet --output-document="${_tempFileName}" "${UPDATE_URI}"; then
- echo "Failed to download update for rpi-update!"
- echo "Make sure you have ca-certificates installed and that the time is set correctly"
+ if ! wget --output-document="${_tempFileName}" "${UPDATE_URI}"; then
+ echo " !!! Failed to download update for rpi-update!"
+ echo " !!! Make sure you have ca-certificates installed and that the time is set correctly"
exit 1
fi
OCTAL_MODE=$(stat -c '%a' "$0")
if ! chmod ${OCTAL_MODE} "${_tempFileName}" ; then
- echo "Failed: Error while trying to set mode on ${_tempFileName}"
+ echo " !!! Failed: Error while trying to set mode on ${_tempFileName}"
exit 1
fi
@@ -38,38 +44,45 @@ function update_self() {
#!/bin/bash
if mv "${_tempFileName}" "$0"; then
rm -- "\$0"
- exec env UPDATE2=0 /bin/bash "$0" "${FW_REV}"
+ exec env UPDATE_SELF=0 /bin/bash "$0" "${FW_REV}"
else
- echo "Failed!"
+ echo " !!! Failed!"
fi
EOF
+ echo " *** Relaunching after update"
exec /bin/bash /tmp/updateScript.sh
}
function update_modules {
if [[ ${SKIP_KERNEL} -eq 0 ]]; then
- cp -R "${FW_REPOLOCAL}/modules/"* "${FW_MODPATH}/"
+ echo " *** Updating modules"
+ cp -vR "${FW_REPOLOCAL}/modules/"* "${FW_MODPATH}/"
find "${FW_REPOLOCAL}/modules" -mindepth 1 -maxdepth 1 -type d | while read DIR; do
+ echo " *** depmod $(basename "${DIR}")"
depmod -b "${ROOT_PATH}" -a $(basename "${DIR}")
done
+ else
+ echo " *** As requested, not updating modules"
fi
}
function update_sdk {
+ echo " *** Updating SDK"
+
if [[ -f /etc/init.d/vcfiled ]]; then
/etc/init.d/vcfiled stop
fi
ELFOUTPUT=$(readelf -a "${ROOT_PATH}/bin/bash")
if [ "${ELFOUTPUT}" != "${ELFOUTPUT/VFP_args/}" ]; then
- echo "Using HardFP libraries"
- cp -R "${FW_REPOLOCAL}/vc/hardfp/"* "${ROOT_PATH}/"
+ echo " *** Using HardFP libraries"
+ cp -vR "${FW_REPOLOCAL}/vc/hardfp/"* "${ROOT_PATH}/"
else
- echo "Using SoftFP libraries"
- cp -R "${FW_REPOLOCAL}/vc/softfp/"* "${ROOT_PATH}/"
+ echo " *** Using SoftFP libraries"
+ cp -vR "${FW_REPOLOCAL}/vc/softfp/"* "${ROOT_PATH}/"
fi
- cp -R "${FW_REPOLOCAL}/vc/sdk/"* "${ROOT_PATH}/"
+ cp -vR "${FW_REPOLOCAL}/vc/sdk/"* "${ROOT_PATH}/"
if [[ -f /etc/init.d/vcfiled ]]; then
/etc/init.d/vcfiled start
@@ -77,59 +90,65 @@ function update_sdk {
}
function update_firmware {
+ echo " *** Updating firmware"
rm -rf ${FW_PATH}/*.elf
rm -rf ${FW_PATH}/*.bin
- cp ${FW_REPOLOCAL}/*.elf "${FW_PATH}/"
- cp ${FW_REPOLOCAL}/*.bin "${FW_PATH}/"
- cp ${FW_REPOLOCAL}/*.dat "${FW_PATH}/"
+ cp -v ${FW_REPOLOCAL}/*.elf "${FW_PATH}/"
+ cp -v ${FW_REPOLOCAL}/*.bin "${FW_PATH}/"
+ cp -v ${FW_REPOLOCAL}/*.dat "${FW_PATH}/"
if [[ ${SKIP_KERNEL} -eq 0 ]]; then
- cp "${FW_REPOLOCAL}/"*.img "${FW_PATH}/"
+ cp -v "${FW_REPOLOCAL}/"*.img "${FW_PATH}/"
else
- echo "Skipping kernel/modules updated as requested"
+ echo " *** As requested, not updating kernel"
fi
}
function finalise {
if [[ -f "${FW_PATH}/arm192_start.elf" ]]; then
- cp "${FW_PATH}/arm192_start.elf" "${FW_PATH}/start.elf"
+ echo " *** Setting 192M ARM split"
+ cp -v "${FW_PATH}/arm192_start.elf" "${FW_PATH}/start.elf"
fi
+ echo " *** Running ldconfig"
ldconfig -r "${ROOT_PATH}"
+ echo " *** Storing current firmware revision"
eval ${GITCMD} rev-parse master > "${FW_PATH}/.firmware_revision"
+ echo " *** Syncing changes to disk"
sync
}
function download_repo {
- echo "Setting up firmware (this will take a few minutes)"
+ echo " *** Setting up firmware (this may take a few minutes)"
mkdir -p "${FW_REPOLOCAL}"
- git clone "${FW_REPO}" "${FW_REPOLOCAL}" --depth=1 --quiet
+ git clone "${FW_REPO}" "${FW_REPOLOCAL}" --depth=1
RETVAL=$?
if [[ ${RETVAL} -ne 0 ]]; then
- echo "Failed to download new firmware files"
+ echo " !!! Failed to download new firmware files"
exit 1
fi
}
function update_repo {
- echo "Updating firmware (this will take a few minutes)"
- eval ${GITCMD} fetch --quiet
+ echo " *** Updating firmware (this may take a few minutes)"
+ eval ${GITCMD} fetch
RETVAL=$?
if [[ ${RETVAL} -ne 0 ]]; then
- echo "Failed to download updated firmware files"
+ echo " !!! Failed to download updated firmware files"
exit 1
fi
- eval ${GITCMD} reset --hard --quiet
- eval ${GITCMD} clean -f -d --quiet
- eval ${GITCMD} merge origin/master -m "automerge" --quiet
+ eval ${GITCMD} reset --hard
+ eval ${GITCMD} clean -f -d
+ eval ${GITCMD} merge origin/master -m "automerge"
RETVAL=$?
if [[ ${RETVAL} -ne 0 ]]; then
- echo "Failed to download updated firmware files"
+ echo " !!! Failed to download updated firmware files"
exit 1
fi
}
function do_backup {
- cp -a "${FW_PATH}" "${FW_PATH}.bak"
- cp -a "${FW_MODPATH}" "${FW_MODPATH}.bak"
+ echo " *** Backing up files"
+ cp -va "${FW_PATH}" "${FW_PATH}.bak"
+ cp -va "${FW_MODPATH}" "${FW_MODPATH}.bak"
}
function do_update {
@@ -137,77 +156,72 @@ function do_update {
update_modules
update_sdk
finalise
- echo "If no errors appeared, your firmware was successfully $1"
+ echo " *** If no errors appeared, your firmware was successfully $1"
if [[ "${ROOT_PATH}" == "/" ]]; then
- echo "A reboot is needed to activate the new firmware"
+ echo " *** A reboot is needed to activate the new firmware"
fi
}
function download_rev {
- echo "Downloading specific firmware revision (this will take a few minutes)"
+ echo " *** Downloading specific firmware revision (this will take a few minutes)"
mkdir -p "${FW_REPOLOCAL}"
- wget -q "${REPO_URI}/tarball/${FW_REV}" -O "${FW_REPOLOCAL}/${FW_REV}.tar.gz"
+ wget "${REPO_URI}/tarball/${FW_REV}" -O "${FW_REPOLOCAL}/${FW_REV}.tar.gz"
tar xzf "${FW_REPOLOCAL}/${FW_REV}.tar.gz" -C "${FW_REPOLOCAL}" --strip-components=1
rm "${FW_REPOLOCAL}/${FW_REV}.tar.gz"
}
if [[ ${EUID} -ne 0 ]]; then
- echo "This tool must be run as root"
+ echo " !!! This tool must be run as root"
exit 1
fi
-if [[ ${UPDATE2} -ne 0 ]]; then
- echo "Raspberry Pi firmware updater by Hexxeh, enhanced by AndrewS"
- update_self
-fi
+echo " *** Raspberry Pi firmware updater by Hexxeh, enhanced by AndrewS"
-if [[ ( "${ROOT_PATH}" == "/" && "${BOOT_PATH}" != "/boot" ) ]] ||
-[[ ( "${BOOT_PATH}" == "/boot" && "${ROOT_PATH}" != "/" ) ]]; then
- echo "You need to specify both ROOT_PATH and BOOT_PATH, or neither"
- exit 1
+if [[ ${UPDATE_SELF} -ne 0 ]]; then
+ update_self
fi
if [[ ! -d "${FW_PATH}" ]]; then
- echo "${FW_PATH} doesn't exist"
+ echo " !!! ${FW_PATH} doesn't exist"
exit 1
fi
if [[ ! -f "${FW_PATH}/start.elf" ]]; then
- echo "${FW_PATH}/start.elf doesn't exist."
+ echo " !!! ${FW_PATH}/start.elf doesn't exist."
exit 1
fi
if [[ ! -d "${FW_MODPATH}" ]]; then
- echo "${FW_MODPATH} doesn't exist"
+ echo " !!! ${FW_MODPATH} doesn't exist"
exit 1
fi
command -v git >/dev/null 2>&1 || {
- echo "This tool requires you have Git installed, please install it first"
- echo "In Debian, try: sudo apt-get install git-core"
- echo "In Arch, try: pacman -S git"
+ echo " !!! This tool requires you have Git installed, please install it first"
+ echo " In Debian, try: sudo apt-get install git-core"
+ echo " In Arch, try: pacman -S git"
exit 1
}
command -v readelf >/dev/null 2>&1 || {
- echo "This tool requires you have readelf installed, please install it first"
- echo "In Debian, try: sudo apt-get install binutils"
- echo "In Arch, try: pacman -S binutils"
+ echo " !!! This tool requires you have readelf installed, please install it first"
+ echo " In Debian, try: sudo apt-get install binutils"
+ echo " In Arch, try: pacman -S binutils"
exit 1
}
-echo "ARM/GPU split is now defined in /boot/config.txt using the gpu_mem option!"
+echo " *** ARM/GPU split is now defined in /boot/config.txt using the gpu_mem option!"
if [[ ${FW_REV} != "" ]]; then
download_rev
do_update "updated to revision ${FW_REV}"
elif [[ -f "${FW_REPOLOCAL}/.git/config" ]]; then
update_repo
if [[ -f "${FW_PATH}/.firmware_revision" ]] && [[ $(cat "${FW_PATH}/.firmware_revision") == $(eval ${GITCMD} rev-parse master) ]]; then
- echo "Your firmware is already up to date"
+ echo " *** Your firmware is already up to date"
finalise
else
do_update "updated"
fi
else
- echo "We're running for the first time"
+ echo " *** We're running for the first time"
download_repo
do_backup
do_update "setup"
Something went wrong with that request. Please try again.