#!/bin/bash # # Copyright (c) 2015 Igor Pecovnik, igor.pecovnik@gma**.com # # This file is licensed under the terms of the GNU General Public # License version 2. This program is licensed "as is" without any # warranty of any kind, whether express or implied. # # This file is a part of tool chain https://github.com/igorpecovnik/lib # BOARD="" RELEASE=$(lsb_release -cs) if [[ "$RELEASE" == "sid" ]]; then RELEASE="jessie"; fi if [[ "$RELEASE" == "testing" ]]; then RELEASE="jessie"; fi backtitle="Armbian install script, http://www.armbian.com | Author: Igor Pecovnik" title="Armbian universal installer 2015.11" #----------------------------------------------------------------------------------------------------------------------- # Show warning at start #----------------------------------------------------------------------------------------------------------------------- display_warning() { read -r -d '' MOJTEXT << EOM 1. Please do a backup even the script doesn't plan to ruin anything critical. 2. If you choose wrong board you might end up with not bootable system. 3. We are going to remove current kernel package together with headers, firmware and board definitions. 4. The script will also conduct apt-get upgrade so all packages will be upgraded. 5. Where possible you can upgrade/downgrade kernel from legacy to vanilla and vice versa. 6. The whole process takes at least 8 minutes on a fresh image to 30 minutes if you upgrade from other system. 7. You might need to power cycle the board. EOM dialog --title "$title" --backtitle "$backtitle" --cr-wrap --colors --yesno " \Z1$(toilet -f mono12 WARNING)\Z0\n$MOJTEXT" 36 74 if [ $? -ne 0 ]; then exit 1; fi } #----------------------------------------------------------------------------------------------------------------------- # Create boot scripts for Allwinner boards #----------------------------------------------------------------------------------------------------------------------- create_boot_script () { [ -f "/boot/boot.cmd" ] && cp /boot/boot.cmd /boot/boot.cmd.backup cat > /boot/boot.cmd </dev/null 2>&1 } #----------------------------------------------------------------------------------------------------------------------- # Install packeges and repository #----------------------------------------------------------------------------------------------------------------------- install_repo () { dialog --title "$title" --backtitle "$backtitle" --infobox "\nAdding repository and running pkg list update." 5 50 # remove system hostapd apt-get -f -qq install apt-get clean apt-get -y -qq remove hostapd if [ $? -ne 0 ]; then dialog --title "$title" --backtitle "$backtitle" --infobox "\nError in apt-get. Can not continue." 5 40 exit 1 fi # move armbian to separate list and remove others sed -i '/armbian/d' /etc/apt/sources.list if [ -f "/etc/apt/sources.list.d/bananian.list" ]; then rm -f /etc/apt/sources.list.d/bananian.list rm -f /etc/kernel/postinst.d/bananian-kernel-postinst chsh -s /bin/bash echo "Armbian lite" > /etc/motd echo "" >> /etc/motd fi if [ ! -f "/etc/apt/sources.list.d/armbian.list" ]; then echo -e "[\e[0;32m o.k. \x1B[0m] Updating package list. Please wait" echo "deb http://apt.armbian.com $RELEASE main" > /etc/apt/sources.list.d/armbian.list apt-key adv --keyserver keys.gnupg.net --recv-keys 0x93D6889F9F0E78D5 >/dev/null 2>&1 apt-get update >/dev/null 2>&1 fi } get_hardware_info () #----------------------------------------------------------------------------------------------------------------------- # determine root and boot partitions, arhitecture, cpu, ... #----------------------------------------------------------------------------------------------------------------------- { # arhitecture ARCH=$(lscpu | grep Architecture | awk '{print $2}') if [[ "$ARCH" != arm* ]]; then echo -e "[\e[0;31m error \x1B[0m] Architecture not supported"; exit; fi # CPU HARDWARE=$(cat /proc/cpuinfo | grep Hardware | awk '{print $3}') if [[ !( "$HARDWARE" == "sun7i" || "$HARDWARE" == "Allwinner" || "$HARDWARE" == "sun4i" ) ]]; then echo -e "[\e[0;31m error \x1B[0m] Unsupported hw"; exit; fi # boot partition bootdevice="/dev/mmcblk0p1"; # if mmc is not present than boot can only be nand1 if [[ "$(grep nand /proc/partitions)" != "" && "$(grep mmc /proc/partitions)" == "" ]]; then bootdevice="/dev/nand1"; fi # root partition root_device=$(mountpoint -d /) for file in /dev/* ; do CURRENT_DEVICE=$(printf "%d:%d" $(stat --printf="0x%t 0x%T" $file)) if [ $CURRENT_DEVICE = $root_device ]; then rootdevice=$file break; fi done rootdevice="/dev/"$(sed -n 's/^DEVNAME=//p' /sys/dev/block/$(mountpoint -d /)/uevent) } mount_boot_device () #----------------------------------------------------------------------------------------------------------------------- # mount boot device #----------------------------------------------------------------------------------------------------------------------- { if [[ "$bootdevice" == "/dev/mmcblk0p1" && "$rootdevice" != "/dev/mmcblk0p1" ]]; then umount /boot /media/mmc mkdir -p /media/mmc/boot mount /dev/mmcblk0p1 /media/mmc/ if [ -d "/media/mmc/boot/" ]; then mount --bind /media/mmc/boot/ /boot/ else mount --bind /media/mmc /boot/ fi fi if [[ "$bootdevice" == "/dev/nand1" ]]; then umount /boot /mnt mount /dev/nand1 /boot fi } select_boards () #----------------------------------------------------------------------------------------------------------------------- # This might be changed once with board detection which is already very accurate #----------------------------------------------------------------------------------------------------------------------- { if [ -z "$BOARD" ]; then IFS=" " Options="Cubieboard A10 Cubieboard2 A20 Cubietruck A20 Lime-A10 A10 Lime \ A20 Lime2 A20 Micro A20 Bananapipro A20 Lamobo-R1 A20 Orangepi A20 Pcduino3nano A20" BoardOptions=($Options); BoardCmd=(dialog --title "Choose a board:" --backtitle "$backtitle" --menu "\n$infos" 20 60 26) BoardChoices=$("${BoardCmd[@]}" "${BoardOptions[@]}" 2>&1 >/dev/tty) BOARD=${BoardChoices,,} fi # exit the script on cancel if [ "$BOARD" == "" ]; then echo "ERROR: You have to choose one board"; exit; fi if [ -z "$BRANCH" ]; then IFS="'" declare -a Options=("legacy'3.4.x - 3.14.x most supported'vanilla'4.x Vanilla from www.kernel.org"); # Exceptions if [[ $BOARD == "cubox-i" || $BOARD == "udoo-neo" || "$bootdevice" == "/dev/nand1" ]]; then declare -a Options=("legacy'3.4.x - 3.14.x most supported"); fi BoardOptions=($Options); BoardCmd=(dialog --title "Choose a board:" --backtitle "$backtitle" --menu "\n$infos" 10 60 16) BoardChoices=$("${BoardCmd[@]}" "${BoardOptions[@]}" 2>&1 >/dev/tty) BRANCH=${BoardChoices,,} fi # exit the script on cancel if [ "$BRANCH" == "" ]; then echo "ERROR: You have to choose one branch"; exit; fi if [[ $BRANCH == "vanilla" ]] ; then ROOT_BRACH="-next" else ROOT_BRACH="" fi case $BOARD in bananapipro | lamobo-r1 | orangepi | orangepimini) LINUXFAMILY="sun7i" if [[ $BRANCH == "vanilla" ]] ; then LINUXFAMILY="sunxi"; fi ;; cubox-i) LINUXFAMILY="cubox" ;; cubieboard | lime-a10) LINUXFAMILY="sun4i" if [[ $BRANCH == "vanilla" ]] ; then LINUXFAMILY="sunxi"; fi ;; udoo | udoo-neo) LINUXFAMILY="udoo" ;; *) LINUXFAMILY="sun7i" if [[ $BRANCH == "vanilla" ]] ; then LINUXFAMILY="sunxi"; fi ;; esac if [[ $BOARD == "cubox-i" || $BOARD == udoo* || $BRANCH == "vanilla" ]]; then PACKETS="linux-dtb$ROOT_BRACH-$LINUXFAMILY"; fi PACKETS="linux-image$ROOT_BRACH-$LINUXFAMILY linux-firmware-image$ROOT_BRACH-$LINUXFAMILY \ linux-u-boot-$BOARD$ROOT_BRACH linux-headers$ROOT_BRACH-$LINUXFAMILY linux-$RELEASE-root$ROOT_BRACH-$BOARD $PACKETS" } remove_old () #----------------------------------------------------------------------------------------------------------------------- # Delete previous kernel #----------------------------------------------------------------------------------------------------------------------- { clear dialog --title "$title" --backtitle "$backtitle" --infobox "\nRemoving conflicting packages ..." 5 41 aptitude remove ~nlinux-dtb --quiet=100 >> upgrade.log aptitude remove ~nlinux-u-boot --quiet=100 >> upgrade.log aptitude remove ~nlinux-image --quiet=100 >> upgrade.log aptitude remove ~nlinux-headers --quiet=100 >> upgrade.log aptitude remove ~nlinux-firmware --quiet=100 >> upgrade.log aptitude remove ~nlinux-$RELEASE-root --quiet=100 >> upgrade.log } install_new () #----------------------------------------------------------------------------------------------------------------------- # install new one #----------------------------------------------------------------------------------------------------------------------- { IFS=" " apt-get $1 -y install $PACKETS 2>&1 | dialog --title "$title" --backtitle "$backtitle" --progressbox "$2" 20 80 if [ $? -ne 0 ]; then dialog --title "$title" --backtitle "$backtitle" --infobox "\nError downloadiing." 5 41 exit 1; fi } #----------------------------------------------------------------------------------------------------------------------- # # Program start # #----------------------------------------------------------------------------------------------------------------------- # This tool must run under root #----------------------------------------------------------------------------------------------------------------------- if [[ ${EUID} -ne 0 ]]; then echo "This tool must run as root. Exiting ..." exit 1 fi #----------------------------------------------------------------------------------------------------------------------- # Downloading dependencies #----------------------------------------------------------------------------------------------------------------------- if [[ $(dpkg-query -W -f='${Status}' dialog 2>/dev/null | grep -c "ok installed") -eq 0 || \ $(dpkg-query -W -f='${Status}' u-boot-tools 2>/dev/null | grep -c "ok installed") -eq 0 || \ $(dpkg-query -W -f='${Status}' debconf-utils 2>/dev/null | grep -c "ok installed") -eq 0 || \ $(dpkg-query -W -f='${Status}' lsb-release 2>/dev/null | grep -c "ok installed") -eq 0 || \ $(dpkg-query -W -f='${Status}' aptitude 2>/dev/null | grep -c "ok installed") -eq 0 \ ]]; then echo "Downloading dependencies ... please wait" apt-get install -qq -y dialog u-boot-tools debconf-utils lsb-release aptitude fake-hwclock >/dev/null 2>&1 fi display_warning install_repo get_hardware_info mount_boot_device create_boot_script select_boards install_new "-d" "Downloading packages..." remove_old install_new "" "Installing packages..." apt-get -y upgrade 2>&1 | dialog --title "$title" --backtitle "$backtitle" --progressbox "System upgrade" 20 80 [[ "$bootdevice" == "/dev/nand1" ]] && sed -e 's,script=.*,script=script.bin,g' -i /boot/uEnv.txt ln -sf /boot/bin/$BOARD.bin /boot/script.bin || cp /boot/bin/$BOARD.bin /boot/script.bin dialog --title "$title" --backtitle "$backtitle" --yes-label "Reboot" --no-label "Exit" \ --yesno "\nAll done." 7 60 if [ $? -eq 0 ]; then reboot; fi echo "Visit: forum.armbian.com in case of troubles or just for fun ;)" echo ""