Browse Source

fix issues with update from different kernel/glibc version, use chroot env

Reinhard Russinger 6 years ago
parent
commit
f93592dcbf
2 changed files with 333 additions and 1 deletions
  1. 1 1
      board/GfA/Display001/BUILD
  2. 332 0
      patches/0014-chroot_env_for_rootfs_update.patch

+ 1 - 1
board/GfA/Display001/BUILD

@@ -1 +1 @@
-634
+635

+ 332 - 0
patches/0014-chroot_env_for_rootfs_update.patch

@@ -0,0 +1,332 @@
+diff --git a/UpdateRootfs.sh.in b/UpdateRootfs.sh.in
+index 89ff561..3e4b29d 100644
+--- a/UpdateRootfs.sh.in
++++ b/UpdateRootfs.sh.in
+@@ -4,7 +4,7 @@ uuencode=0
+ binary=1
+ 
+ ##TAR_PARAMETERS="-C / --exclude=./opt --exclude=./etc/inittab -xzvf -"
+-TMP_PATH="/__GfA_Update"
++TMP_PATH="$GFA_PREFIX/__GfA_Update"
+ TAR_PARAMETERS="-C $TMP_PATH -xzvf -"
+ 
+ untar_payload ()
+@@ -25,6 +25,131 @@ untar_payload ()
+ 	fi
+ }
+ 
++if [ -z $1 ]
++then
++## prepare for chrooted environment
++chmod +x /bin/bash
++updatename=`realpath $0`
++echo -e "===\n prepare chroot and update script\n===\n"
++(\
++cat << EOF
++#! /bin/bash
++CHROOT=/__GfA_chroot
++
++#---------------------
++recurse ()
++# Param 1 is the nuumber of spaces that the output will be prepended with
++# Param 2 full path to library
++{
++#Use 'readelf -d' to find dependencies
++dependencies=\$(readelf -d \${2} | grep NEEDED | awk '{ print \$5 }' | tr -d '[]')
++for d in \$dependencies; do
++   echo "\${1}\${d} :: \${2}"
++   rsync -lpR \${2} \${CHROOT}
++   if [ -L \${2} ] ; then
++   	LIBNAM=\`readlink -f \${2}\`
++	rsync -lpR \${LIBNAM} \${CHROOT}
++	echo "\${1}-->\${LIBNAM}"
++   fi
++   nm=\${d##*/}
++   #libstdc++ hack for the '+'-s
++   nm1=\${nm//"+"/"\+"}
++   # /lib /lib64 /usr/lib and /usr/lib are searched
++   children=\$(find / -name \${d} 2>/dev/null | grep -E "(^/(lib|lib32|usr/lib|usr/lib32)/\${nm1})")
++   rc=\$?
++   #at least locate... didn't fail
++   if [ \${rc} == "0" ] ; then
++      #we have at least one dependency
++      if [ \${#children[@]} -gt 0 ]; then
++         #check the dependeny's dependencies
++         for c in \$children; do
++          recurse "  \${1}" \${c}
++         done
++      else
++         echo "\${1}no children found"
++      fi
++   else
++      echo "\${1}locate failed for ${d}"
++   fi
++done
++}
++# -- recurse needs 2 params could/should be supplied from cmdline
++echo "==== PREPARE CHROOT ENVIRONMENT in \${CHROOT} ===="
++rm -rf \$CHROOT
++mkdir -p \$CHROOT
++#------------------------------------
++tt=/bin/bash
++echo -e "===\n \$tt\n"
++recurse "" \$tt
++
++tt=/bin/sh
++echo -e "===\n \$tt\n"
++recurse "" \$tt
++
++tt=/bin/busybox
++echo -e "===\n \$tt\n"
++recurse "" \$tt
++
++tt=/usr/sbin/fbset
++echo -e "===\n \$tt\n"
++recurse "" \$tt
++
++tt=/usr/bin/awk
++echo -e "===\n \$tt\n"
++recurse "" \$tt
++
++tt=/usr/bin/cut
++echo -e "===\n \$tt\n"
++recurse "" \$tt
++
++tt=/usr/bin/tail
++echo -e "===\n \$tt\n"
++recurse "" \$tt
++
++tt=/sbin/reboot
++echo -e "===\n \$tt\n"
++recurse "" \$tt
++
++#----------------------------------------
++cp -a /lib/ld-* \${CHROOT}/lib
++cp -a /bin/*  \${CHROOT}/bin
++
++ln -s ./realroot/root \${CHROOT}/root
++
++mkdir -p \${CHROOT}/proc
++mkdir -p \${CHROOT}/dev
++mkdir -p \${CHROOT}/sys
++mkdir -p \${CHROOT}/etc
++mkdir -p \${CHROOT}/realroot
++mkdir -p \${CHROOT}/var
++mkdir -p \${CHROOT}/tmp
++mkdir -p \${CHROOT}/mnt
++
++mkdir -p \${CHROOT}/realroot/media/usb0
++mkdir -p \${CHROOT}/realroot/media/usb1
++
++mount -o bind /proc \${CHROOT}/proc    
++mount -o bind /dev \${CHROOT}/dev
++mount -o bind /sys \${CHROOT}/sys
++mount -o bind /etc \${CHROOT}/etc
++mount -o bind /var \${CHROOT}/var
++mount -o bind /tmp \${CHROOT}/tmp
++mount -o bind / \${CHROOT}/realroot
++
++mount -o bind /media/usb0 \${CHROOT}/realroot/media/usb0
++mount -o bind /media/usb1 \${CHROOT}/realroot/media/usb1
++
++echo -e "\n===========\nchroot environment ready in \n \${CHROOT}\n===========\n"
++chroot \${CHROOT} sh -c 'GFA_PREFIX=/realroot sh /realroot${updatename} DoRealUpdate' 
++
++EOF
++) > /root/GfA_prep_chroot.sh
++
++chmod a+x /root/GfA_prep_chroot.sh
++#--- execute built script
++echo "==>>> execute chroot update script"
++/root/GfA_prep_chroot.sh
++else
+ ## --- Kommandos zum Installieren
+ ## -- get bootpartition
+ such="root=/dev/mmcblk1"
+@@ -54,26 +179,26 @@ cp $TMP_PATH/*.dtb /mnt
+ 
+ mkdir -p $TMP_PATH/bu_cfg
+ 
+-if [ -e /etc/network/interfaces ]
++if [ -e $GFA_PREFIX/etc/network/interfaces ]
+ then
+-        cp /etc/network/interfaces $TMP_PATH/bu_cfg
+-        rm /etc/network/interfaces
++        cp $GFA_PREFIX/etc/network/interfaces $TMP_PATH/bu_cfg
++        rm $GFA_PREFIX/etc/network/interfaces
+ fi
+ 
+-if [ -e /etc/wpa_supplicant.conf ]
++if [ -e $GFA_PREFIX/etc/wpa_supplicant.conf ]
+ then
+-        cp /etc/wpa_supplicant.conf $TMP_PATH/bu_cfg/wpa_supplicant.conf_old
+-        rm /etc/wpa_supplicant.conf
++        cp $GFA_PREFIX/etc/wpa_supplicant.conf $TMP_PATH/bu_cfg/wpa_supplicant.conf_old
++        rm $GFA_PREFIX/etc/wpa_supplicant.conf
+ fi
+ 
+-if [ -e /etc/wpa_supplicant/wpa_supplicant.conf ]
++if [ -e $GFA_PREFIX/etc/wpa_supplicant/wpa_supplicant.conf ]
+ then
+-        cp /etc/wpa_supplicant/wpa_supplicant.conf $TMP_PATH/bu_cfg
+-        rm /etc/wpa_supplicant/wpa_supplicant.conf
++        cp $GFA_PREFIX/etc/wpa_supplicant/wpa_supplicant.conf $TMP_PATH/bu_cfg
++        rm $GFA_PREFIX/etc/wpa_supplicant/wpa_supplicant.conf
+ fi
+ 
+ #rootfs auspacken
+-tar -C / --exclude=./tmp --exclude=./etc/inittab \
++tar -C $GFA_PREFIX/ --exclude=./tmp --exclude=./etc/inittab \
+ 	--exclude=./etc/hosts --exclude=./etc/hostname \
+ 	--exclude=./etc/passwd --exclude=./etc/shadow \
+ 	--exclude=./etc/vncpwd --exclude=./etc/init.d/S99tincd \
+@@ -97,10 +222,10 @@ auto lo
+ iface lo inet loopback
+ 
+ EOF
+-) > /etc/network/interfaces
++) > $GFA_PREFIX/etc/network/interfaces
+ 
+ awk -v par=$INTERFACE '/^iface/ && $2==par {f=1}/^iface/ && $2!=par {f=0}f && !/^\s*#/d && !/^\s*$/d  {print $0 }' $TMP_PATH/bu_cfg/interfaces \
+->> /etc/network/interfaces
++>> $GFA_PREFIX/etc/network/interfaces
+ 
+ (\
+ cat << EOF
+@@ -114,52 +239,52 @@ iface wlan0 inet dhcp
+         wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
+ #
+ EOF
+-) >> /etc/network/interfaces
++) >> $GFA_PREFIX/etc/network/interfaces
+ 
+-if [ -e /etc/init.d/S98usb_g_ether ]
++if [ -e $GFA_PREFIX/etc/init.d/S98usb_g_ether ]
+ then
+-	cp /etc/init.d/S98usb_g_ether /etc/init.d/M98usb_g_ether
+-	rm /etc/init.d/S98usb_g_ether
++	cp $GFA_PREFIX/etc/init.d/S98usb_g_ether $GFA_PREFIX/etc/init.d/M98usb_g_ether
++	rm $GFA_PREFIX/etc/init.d/S98usb_g_ether
+ fi
+ 
+-if [ -e /etc/init.d/S80ti-sgx ]
++if [ -e $GFA_PREFIX/etc/init.d/S80ti-sgx ]
+ then
+-	rm /etc/init.d/S80ti-sgx
++	rm $GFA_PREFIX/etc/init.d/S80ti-sgx
+ fi
+         
+-if [ -e /etc/init.d/M99_wlan_usb ]
++if [ -e $GFA_PREFIX/etc/init.d/M99_wlan_usb ]
+ then
+-	rm /etc/init.d/M99_wlan_usb
++	rm $GFA_PREFIX/etc/init.d/M99_wlan_usb
+ fi
+ 
+-if [ -e /etc/init.d/S99_wlan_usb ]
++if [ -e $GFA_PREFIX/etc/init.d/S99_wlan_usb ]
+ then
+-	rm /etc/init.d/S99_wlan_usb
++	rm $GFA_PREFIX/etc/init.d/S99_wlan_usb
+ fi
+ 
+-if [ -e /etc/init.d/M80dhcp-relay ]
++if [ -e $GFA_PREFIX/etc/init.d/M80dhcp-relay ]
+ then
+-	rm /etc/init.d/M80dhcp-relay
++	rm $GFA_PREFIX/etc/init.d/M80dhcp-relay
+ fi
+ 
+-if [ -e /etc/init.d/S80dhcp-relay ]
++if [ -e $GFA_PREFIX/etc/init.d/S80dhcp-relay ]
+ then
+-	rm /etc/init.d/S80dhcp-relay
++	rm $GFA_PREFIX/etc/init.d/S80dhcp-relay
+ fi
+ 
+-if [ -e /etc/init.d/M80dhcp-server ]
++if [ -e $GFA_PREFIX/etc/init.d/M80dhcp-server ]
+ then
+-	rm /etc/init.d/M80dhcp-server
++	rm $GFA_PREFIX/etc/init.d/M80dhcp-server
+ fi
+ 
+-if [ -e /etc/init.d/S80dhcp-server ]
++if [ -e $GFA_PREFIX/etc/init.d/S80dhcp-server ]
+ then
+-	rm /etc/init.d/S80dhcp-server
++	rm $GFA_PREFIX/etc/init.d/S80dhcp-server
+ fi
+ 
+-if [ -d /etc/dhcp ]
++if [ -d $GFA_PREFIX/etc/dhcp ]
+ then
+-	rm -rf /etc/dhcp
++	rm -rf $GFA_PREFIX/etc/dhcp
+ fi
+ 
+ #echo "Update Firmware"
+@@ -170,7 +295,7 @@ fi
+ #/root/gfa_spi -v
+ #================================
+ #--create mountable run folder insted of link
+-RUNDIR=/run
++RUNDIR=$GFA_PREFIX/run
+ if [ -L $RUNDIR ]; then
+   mv $RUNDIR $RUNDIR'_WRK'
+   mkdir $RUNDIR
+@@ -182,28 +307,29 @@ if [ -L $RUNDIR ]; then
+   rm $RUNDIR'_WRK' 
+ fi
+ #--- craete missing nogroup group
+-GID_NOGROUP=`awk -F\: '/nogroup/ {print $3}' /etc/group`
++GID_NOGROUP=`awk -F\: '/nogroup/ {print $3}' $GFA_PREFIX/etc/group`
+ if [ -z "$GID_NOGROUP" ]; then
+-  addgroup -S -g 65534 nogroup
++#  addgroup -S -g 65534 nogroup
++  echo "nogroup:x:65534:" >> $GFA_PREFIX/etc/group
+ fi
+ #--create missing users for mysql,
+-if [ -z `awk -F\: '/mysql/ {print $3}' /etc/passwd` ]; then
+-  UID_MY=`awk -F: '{uid[$3]=1}END{for(x=1000; x<=1500; x++) {if(uid[x] != ""){}else{print x; exit;}}}' /etc/passwd`
+-  echo "mysql:x:$UID_MY:65534:MySQL daemon:/var/mysql:/bin/false" >> /etc/passwd
++if [ -z `awk -F\: '/mysql/ {print $3}' $GFA_PREFIX/etc/passwd` ]; then
++  UID_MY=`awk -F: '{uid[$3]=1}END{for(x=1000; x<=1500; x++) {if(uid[x] != ""){}else{print x; exit;}}}' $GFA_PREFIX/etc/passwd`
++  echo "mysql:x:$UID_MY:65534:MySQL daemon:/var/mysql:/bin/false" >> $GFA_PREFIX/etc/passwd
+ fi
+ #--create missing users for postgresql,
+-if [ -z `awk -F\: '/postgres/ {print $3}' /etc/passwd` ]; then
+-  UID_PG=`awk -F: '{uid[$3]=1}END{for(x=1000; x<=1500; x++) {if(uid[x] != ""){}else{print x; exit;}}}' /etc/passwd`
+-  GID_PG=`awk -F\: '/postgres/ {print $3}' /etc/group`
++if [ -z `awk -F\: '/postgres/ {print $3}' $GFA_PREFIX/etc/passwd` ]; then
++  UID_PG=`awk -F: '{uid[$3]=1}END{for(x=1000; x<=1500; x++) {if(uid[x] != ""){}else{print x; exit;}}}' $GFA_PREFIX/etc/passwd`
++  GID_PG=`awk -F\: '/postgres/ {print $3}' $GFA_PREFIX/etc/group`
+   if [ -z "$GID_PG" ]; then
+-    GID_PG=`awk -F: '{uid[$3]=1}END{for(x=1000; x<=1500; x++) {if(uid[x] != ""){}else{print x; exit;}}}' /etc/group`
+-    echo "postgres:x:$GID_PG:" >> /etc/group
++    GID_PG=`awk -F: '{uid[$3]=1}END{for(x=1000; x<=1500; x++) {if(uid[x] != ""){}else{print x; exit;}}}' $GFA_PREFIX/etc/group`
++    echo "postgres:x:$GID_PG:" >> $GFA_PREFIX/etc/group
+     fi
+-  echo "postgres:x:$UID_PG:$GID_PG:PostgreSQL Server:/var/lib/pgsql:/bin/sh" >> /etc/passwd
++  echo "postgres:x:$UID_PG:$GID_PG:PostgreSQL Server:/var/lib/pgsql:/bin/sh" >> $GFA_PREFIX/etc/passwd
+ fi
+ #------------------
+-chown -Rv mysql:nogroup /var/mysql
+-chown -Rv postgres:postgres /var/lib/pgsql
++chown -Rv mysql:nogroup $GFA_PREFIX/var/mysql
++chown -Rv postgres:postgres $GFA_PREFIX/var/lib/pgsql
+ #==============================================================================
+ # Get Graphics resolution and set dtb to the right resolution
+ BASEBOARD=`cat /tmp/BASEBOARD`
+@@ -288,4 +414,11 @@ fi
+ echo "Update Done, pls. reboot System"
+ umount /mnt
+ echo "."
++echo "restart system !!!"
++sleep 2
++#-----------------
++reboot
++exit 0
++fi
++#-------------
+ exit 0