I have performed a major distribution upgrade in the past. This was with
rpm which requires bash. I did not have issues with utilities required by
the upgrade disappearing.

I believe rpm installs the new file, and then removes old files. Does opkg
remove the old binary before installing the new version?


-Jate

On Fri, Jan 28, 2022 at 8:12 AM Bryan Evenson <beven...@melinkcorp.com>
wrote:

> Andrej,
>
> > -----Original Message-----
> > From: Valek, Andrej <andrej.va...@siemens.com>
> > Sent: Friday, January 28, 2022 6:39 AM
> > To: openembedded-core@lists.openembedded.org; Bryan Evenson
> > <beven...@melinkcorp.com>
> > Subject: Re: [dunfell][PATCH RFC] busybox.inc: Create temporary busybox
> > links during install
> >
> > Hello Bryan,
> >
> > So looks like, there is some kind of problem.
> >
> > Was you able to run the busybox command after upgrade like, "busybox ls
> /"
> > ?
>
> In this particular case, after upgrade both "busybox ls" and "ls" worked.
> However, that was partly because for this particular case the packages were
> identical but I just forced a version number change.  None of the files
> were actually different after the upgrade.  Failure to replace files didn't
> affect operation.  When I was upgrading my image from the morty release to
> the dunfell release, there was a change in util-linux that conflicted with
> busybox if they both didn't upgrade cleanly and the update-alternatives
> installation step would fail for both.  In that case "busybox ls" would
> still work but "ls" would not.  Repeated upgrade attempts didn't fix it.  I
> had to manually delete certain files that were not deleted during the
> initial upgrade attempt and then upgrade packages manually in a particular
> order to get the system fully operational again.
>
> >  - If yes, there is a problem, that update alternatives hasn't been
> processed
> > correctly. Try direct command after reboot, if possible
> >  - If no, lets continue with patch creation based on the master branch
>
> I will continue work on a patch based on master.  I'm going to try testing
> a few other cases so I don't anticipate having a patch ready until early
> next week.
>
> Thanks,
> Bryan
>
> >
> > Cheers,
> > Andrej
> >
> > On Thu, 2022-01-27 at 14:39 +0000, Bryan Evenson wrote:
> > > Andrej,
> > >
> > > > -----Original Message-----
> > > > From: Valek, Andrej <andrej.va...@siemens.com>
> > > > Sent: Saturday, January 22, 2022 2:26 AM
> > > > To: openembedded-core@lists.openembedded.org; Bryan Evenson
> > > > <beven...@melinkcorp.com>
> > > > Subject: Re: [dunfell][PATCH RFC] busybox.inc: Create temporary
> > > > busybox links during install
> > > >
> > > > Hello again,
> > > >
> > > > Maybe a general question. Is it working in current master? I do not
> > > > want to brake dunfell, just applying something, which will create a
> > > > lot of divergence.
> > > >
> > >
> > > I wasn't able to build an image based on the latest master as of
> > > Monday.  From the error messages I think it had something to do with
> > > the addition of setuptools3-base that wasn't complete yet.  I was able
> > > to build and run an image based on the latest honister branch.
> > > The master branch has four commits for busybox that honsiter does not
> > > have.  In those four commits, I see no changes to any of the
> > > installation steps.  Based on this information, I'd say its safe to
> > > say that testing on the latest honister branch should confirm whether
> > > the problem is still present or not.
> > >
> > > To test, I first built my image and directly programmed it on my
> > > hardware.  My image is based upon core-image-minimal, uses sysvinit
> > > for an init system and opkg for a package manager.  I have also added
> > > bash, cronie, dhcpcd and util-linux to my image; I've added others but
> > > these seem to produce the most obvious errors.
> > >
> > > After programming the image on my hardware, I added PR="r1" to the gcc
> > > recipe.  This forced all the packages to get rebuilt and increment the
> > > version number (if anyone knows a simpler way to accomplish this, let
> > > me know).  I then created a package feed with this update and
> > > attempted an upgrade.
> > >
> > > To upgrade, I did:
> > > opkg update
> > > opkg --download-only upgrade
> > > opkg upgrade > full_upgrade.txt 2>&1 &
> > >
> > > I download all the packages to be upgraded first.  I then sent the
> > > upgrade process to the background so I could check other things during
> > > the upgrade process.
> > >
> > > During the upgrade, I would occasionally execute "ls -l" to verify
> > > that the file full_upgrade.txt existed and was still growing.  About a
> > > minute into the upgrade process when I executed "ls -l" I got the
> > > error message:
> > >
> > > ls: not found
> > >
> > > From that point on until upgrade was complete I had to execute
> > > "busybox ls -l" to see the current directory file list.  After upgrade
> > > was complete, I checked full_upgrade.txt for error messages.
> > > I saw the following:
> > >
> > > /usr/bin/update-alternatives: line 1: sed: not found  (occurred 102
> > > times)
> > > /usr/sbin/update-rc.d: line 54: rm: not found (occurred 36 times)
> > > Stopping crond: /etc/init.d/crond: line 37: start-stop-daemon: not
> > > found
> > > /tmp/opkg-yBH1Ta/cronie-zHpym4/preinst: line 1: tr: not found
> > > /etc/init.d/udev: line 74: start-stop-daemon: not found
> > > /tmp/opkg-yBH1Ta/dhcpcd-c86ca9/preinst: line 1: tr: not found
> > >
> > > In this case, a lot of alternatives and init scripts may not be setup
> > > correctly because either the old ones were not removed or the new ones
> > > were not installed.  Prior to my patch below, I saw similar errors
> > > when upgrading my image from a build based off the morty branch to one
> > > based off dunfell (and my system was not operational after the
> > > upgrade).  After my patch, I performed the same upgrade with no errors
> > > and my system was fully operational.
> > >
> > > I'm up for any thoughts on a different approach that accomplishes the
> > > same goal.  Otherwise, I'm going to work with what I have and update
> > > my changes so they patch cleanly on master.
> > >
> > > Thanks,
> > > Bryan
> > >
> > > > Cheers,
> > > > Andrej
> > > >
> > > > On Fri, 2022-01-21 at 15:02 +0000, Bryan Evenson wrote:
> > > > > Andrej,
> > > > >
> > > > > Thanks for the response.  This is an attempt to fix a problem I am
> > > > > having with automated firmware upgrades for my system.  I am using
> > > > > opkg for a package manager; not sure if the same problem exists
> > > > > with other package managers.  I run into problems whenever busybox
> > > > > is one of the packages that needs to get updated.  I enact my
> > > > > distribution firmware upgrade by calling "opkg --download-only
> > > > > upgrade; opkg upgrade".  What I see happen is:
> > > > >
> > > > > 1. In the busybox pkg_prerm stage sets up some soft links for some
> > > > > common applets in a temporary directory and exports a path to that
> > > > > directory.  It might also setup a temporary alternative to /bin/sh
> > > > > if it is the last shell.
> > > > > 2. After the remove stage, the busybox binary is gone.  The
> > > > > softlinks created in the prerm stage are useless since they point
> > > > > to binary that no longer exists.
> > > > > 3. opkg continues with upgrade on other packages which may depend
> > > > > on a command provided by busybox in a prerm, postrm, preinst or
> > > > > postinst script.  These upgrades then fail since the commands are
> > > > > no longer available.
> > > > > 4. The busybox upgrade completes, which may or may not complete
> > > > > successfully.  For what I am attempting, I am upgrading my system
> > > > > from the morty branch to dunfell.  I have util-linux on my system
> > > > > which shares some alternatives with busybox.  The util-linux
> > > > > upgrade fails because it needs some busybox applets during its
> > > > > upgrade process.
> > > > > Then the busybox upgrade fails because the final update-
> > > > > alternatives doesn’t work; some files still exist that util-linux
> > > > > couldn't remove during its upgrade that clash with busybox's
> > > > > alternatives.
> > > > >
> > > > > After trying several ways to get my upgrade to work, I landed on
> > > > > the approach below.  I'm creating a temporary directory and
> > > > > copying the busybox binary and the busybox.links files to that
> > > > > directory.  I then install an alternative for every applet for
> > > > > busybox listed in all of its busybox.links files that points to
> > > > > the temporary copy of the busybox binary.  This means that any
> > > > > package that uses a busybox applet during its install process
> > > > > should still work.  Then during the postinst step I am removing
> > > > > all the temporary alternative links.
> > > > > I
> > > > > use the temporary busybox.links files for removing the alternative
> > > > > links in case the upgraded busybox is now configured with a
> > > > > different set of applets.
> > > > >
> > > > > This is a heavy handed approach, and it does extend the upgrade
> > > > > process for me by a few minutes since it runs through update-
> > > > > alternatives for busybox two more times.  But, the approach works
> > > > > for me and I think would be more resilient than past approaches.
> > > > > I tried to mimic the existing code in my additions.  If a more
> > > > > widescale rewrite makes sense than that works for me also.
> > > > >
> > > > > Thanks,
> > > > > Bryan
> > > > >
> > > > >
> > > > > > -----Original Message-----
> > > > > > From: Valek, Andrej <andrej.va...@siemens.com>
> > > > > > Sent: Friday, January 21, 2022 9:01 AM
> > > > > > To: openembedded-core@lists.openembedded.org; Bryan Evenson
> > > > > > <beven...@melinkcorp.com>
> > > > > > Subject: Re: [dunfell][PATCH RFC] busybox.inc: Create temporary
> > > > > > busybox links during install
> > > > > >
> > > > > > Hi Bryan,
> > > > > >
> > > > > > Sorry, maybe I didn't fully understand the use-case. Are you
> > > > > > trying to upgrade the busybox on demand? If yes, that is not a
> > > > > > good idea.
> > > > > >
> > > > > > I'm little bit scary about doing "export
> > > > > > PATH=$busybox_rmdir:$PATH"
> > > > > > and
> > > > > > creating a custom locks is not a good at all.
> > > > > >
> > > > > > Cheers,
> > > > > > Andrej
> > > > > >
> > > > > > On Fri, 2022-01-21 at 13:29 +0000, Bryan Evenson wrote:
> > > > > > > All,
> > > > > > >
> > > > > > > Ping on this RFC.  It works for me, but I have a feeling there
> > > > > > > is a better way to do this.  It still seems a little messy and
> > > > > > > could probably be simplified for the same effect.
> > > > > > >
> > > > > > > Thanks,
> > > > > > > Bryan
> > > > > > >
> > > > > > > > -----Original Message-----
> > > > > > > > From: Bryan Evenson
> > > > > > > > Sent: Thursday, December 23, 2021 9:50 AM
> > > > > > > > To: openembedded-core@lists.openembedded.org
> > > > > > > > Subject: [dunfell][PATCH RFC] busybox.inc: Create temporary
> > > > > > > > busybox links during install
> > > > > > > >
> > > > > > > > Busybox upgrades sometimes fail, especially if there is a
> > > > > > > > major
> > > > > > > > distribution upgrade and all packages need to be updated.
> > > > > > > > Success
> > > > > > > > is highly dependent on the package upgrade order.
> > > > > > > >
> > > > > > > > Commit [1] attempts to ensure a shell is still present by
> > > > > > > > adding
> > > > > > > > an alternative to /bin/sh if busybox is the only shell.
> > > > > > > > However, if busybox is not the only shell present and the
> > > > > > > > other
> > > > > > > > shells are upgrading, it may then be possible that all
> > > > > > > > shells
> > > > > > > > will be removed during the upgrade process.
> > > > > > > >
> > > > > > > > Commit [2] creates temporary symbolic links for all the
> > > > > > > > busybox
> > > > > > > > links during busybox's postinst step.  However, this is too
> > > > > > > > late
> > > > > > > > in the process as some packages attempt to use 'rm' and
> > > > > > > > 'sed'
> > > > > > > > after
> > > > > > > > update-alternatives removes the old links and prior to when
> > > > > > > > busybox's postinst step runs.
> > > > > > > >
> > > > > > > > This fix is similar to [2] but runs during the preinst
> > > > > > > > step. For
> > > > > > > > opkg, this is the first step that is guaranteed to run from
> > > > > > > > the
> > > > > > > > new package (prerm is run from the old package) and will
> > > > > > > > therefore be a backwards-compatible fix for upgrading older
> > > > > > > > systems.
> > > > > > > >
> > > > > > > > Copies the existing busybox binary and the busybox.links
> > > > > > > > files
> > > > > > > > to a temporary directory and then creates alternative links
> > > > > > > > for
> > > > > > > > all installed busybox commands.  The temporary links and
> > > > > > > > directory are cleaned up during the postinst step.
> > > > > > > >
> > > > > > > > RFC: This works for me, but there may be room for
> > > > > > > > improvement. I
> > > > > > > > don't know if the current pkg_prerm steps are necessary
> > > > > > > > anymore.
> > > > > > > > However, in
> > > > > > > > my testing I did need the links for update-alternatives to
> > > > > > > > work
> > > > > > > > in the preinst step. I am also not certain if the
> > > > > > > > populate_packages_updatealternatives_append
> > > > > > > > step is necessary anymore.  I have also only tested this
> > > > > > > > fix on
> > > > > > > > dunfell, as I don't have a working image based on master
> > > > > > > > yet.
> > > > > > > > It
> > > > > > > > may be more appropriate for this to go to master and then
> > > > > > > > be
> > > > > > > > backported to dunfell, but I would need assistance in
> > > > > > > > testing.
> > > > > > > >
> > > > > > > > [1] https://git.openembedded.org/openembedded-
> > > > > > > > core/commit/meta/recipes-
> > > > > > > >
> > > > > >
> > > >
> > core/busybox/busybox.inc?id=a9d2af8f5b3da8239cf00a52883ca596a19ea23
> > > > > > > > a
> > > > > > > > [2] https://git.openembedded.org/openembedded-
> > > > > > > > core/commit/meta/recipes-
> > > > > > > >
> > > > > >
> > > >
> > core/busybox/busybox.inc?id=3a035bd0a06a6ded4d0ce7e35a3bce42245727
> > > > > > > > d2
> > > > > > > >
> > > > > > > > Signed-off-by: Bryan Evenson <beven...@melinkcorp.com>
> > > > > > > > ---
> > > > > > > >  meta/recipes-core/busybox/busybox.inc | 57
> > > > > > > > ++++++++++++++++++++++++++-
> > > > > > > >  1 file changed, 55 insertions(+), 2 deletions(-)
> > > > > > > >
> > > > > > > > diff --git a/meta/recipes-core/busybox/busybox.inc
> > > > > > > > b/meta/recipes-
> > > > > > > > core/busybox/busybox.inc index e0522be729..c85402411b
> > > > > > > > 100644
> > > > > > > > --- a/meta/recipes-core/busybox/busybox.inc
> > > > > > > > +++ b/meta/recipes-core/busybox/busybox.inc
> > > > > > > > @@ -441,12 +441,28 @@ pkg_postinst_${PN}_prepend () {  }
> > > > > > > >
> > > > > > > >  pkg_postinst_${PN}_append () {
> > > > > > > > -        # If busybox exists in the remove directory it is
> > > > > > > > because it was the only shell left.
> > > > > > > >          if [ "x$D" = "x" ] ; then
> > > > > > > > +           # If busybox exists in the remove directory it
> > > > > > > > is
> > > > > > > > because it was the only
> > > > > > > > shell left.
> > > > > > > >             if [ "x$BUSYBOX" != "x" ] ; then
> > > > > > > >                update-alternatives --remove sh $BUSYBOX
> > > > > > > > -              rm -f $BUSYBOX
> > > > > > > >             fi
> > > > > > > > +           # Remove the temporary alternatives
> > > > > > > > +           for busybox_preinstdir in /tmp/busyboxpreinst-
> > > > > > > > *; do
> > > > > > > > +               if [ "$busybox_preinstdir" !=
> > > > > > > > '/tmp/busyboxpreinst-
> > > > > > > > *' ] ; then
> > > > > > > > +
> > > > > > > > BUSYBOX_PREINST_DIR="$busybox_preinstdir"
> > > > > > > > +                  BUSYBOX="$BUSYBOX_PREINST_DIR/busybox"
> > > > > > > > +                  if [ -e $BUSYBOX ] ; then
> > > > > > > > +                      for suffix in "" ".nosuid" ".suid";
> > > > > > > > do
> > > > > > > > +                          if [ -e
> > > > > > > > $BUSYBOX_PREINST_DIR/busybox.links$suffix ] ; then
> > > > > > > > +                              while read link; do
> > > > > > > > +                                  update-alternatives --
> > > > > > > > remove
> > > > > > > > $($BUSYBOX basename
> > > > > > > > $link) $BUSYBOX
> > > > > > > > +                              done <
> > > > > > > > $BUSYBOX_PREINST_DIR/busybox.links$suffix
> > > > > > > > +                          fi
> > > > > > > > +                      done
> > > > > > > > +                  fi
> > > > > > > > +                  rm -rf $BUSYBOX_PREINST_DIR
> > > > > > > > +               fi
> > > > > > > > +           done
> > > > > > > >          fi
> > > > > > > >  }
> > > > > > > >
> > > > > > > > @@ -480,6 +496,43 @@ pkg_prerm_${PN} () {
> > > > > > > >          fi
> > > > > > > >  }
> > > > > > > >
> > > > > > > > +pkg_preinst_${PN} () {
> > > > > > > > +        # Create a temporary copy the busybox binary and
> > > > > > > > the
> > > > > > > > links
> > > > > > > > files.  Then,
> > > > > > > > +        # install an alternative link for all the links.
> > > > > > > > Other
> > > > > > > > packages use these
> > > > > > > > +        # commands during their upgrade process.  This
> > > > > > > > ensures
> > > > > > > > the
> > > > > > > > links are
> > > > > > > > available
> > > > > > > > +        # to all the other packages.  We do this in the
> > > > > > > > preinst
> > > > > > > > step because it is
> > > > > > > > +        # the first step guaranteed to be used from the
> > > > > > > > new
> > > > > > > > package.  The
> > > > > > > > prerm is
> > > > > > > > +        # used from the old package.  Placing this here
> > > > > > > > ensures it
> > > > > > > > runs on
> > > > > > > > upgrade even
> > > > > > > > +        # on older systems.
> > > > > > > > +
> > > > > > > > +        if [ "x$D" = "x" ] ; then
> > > > > > > > +           # update-alternatives may need the links from
> > > > > > > > commands
> > > > > > > > added in
> > > > > > > > the prerm step
> > > > > > > > +           # to operate.  Make sure we can get to that
> > > > > > > > path.
> > > > > > > > +           for busybox_rmdir in /tmp/busyboxrm-*; do
> > > > > > > > +               if [ "$busybox_rmdir" != '/tmp/busyboxrm-*'
> > > > > > > > ] ;
> > > > > > > > then
> > > > > > > > +                  export PATH=$busybox_rmdir:$PATH
> > > > > > > > +               fi
> > > > > > > > +           done
> > > > > > > > +
> > > > > > > > +           # Create a temporary directory for the busybox
> > > > > > > > binary
> > > > > > > > and the link lists
> > > > > > > > +           BUSYBOX=${base_bindir}/busybox
> > > > > > > > +           BUSYBOX_TMP_DIR=`$BUSYBOX mktemp -d
> > > > > > > > /tmp/busyboxpreinst-
> > > > > > > > XXXXXX`
> > > > > > > > +           BUSYBOX_TMP_LOC="$BUSYBOX_TMP_DIR/busybox"
> > > > > > > > +           $BUSYBOX cp $BUSYBOX $BUSYBOX_TMP_LOC
> > > > > > > > +
> > > > > > > > +           # Go through all the links and install an
> > > > > > > > alternative
> > > > > > > > that points to the
> > > > > > > > temporary
> > > > > > > > +           # busybox binary.
> > > > > > > > +           for suffix in "" ".nosuid" ".suid"; do
> > > > > > > > +               if [ -e ${sysconfdir}/busybox.links$suffix
> > > > > > > > ] ;
> > > > > > > > then
> > > > > > > > +                   $BUSYBOX cp
> > > > > > > > ${sysconfdir}/busybox.links$suffix
> > > > > > > > $BUSYBOX_TMP_DIR
> > > > > > > > +                   while read link; do
> > > > > > > > +                       update-alternatives --install $link
> > > > > > > > $($BUSYBOX basename $link)
> > > > > > > > $BUSYBOX_TMP_LOC 1
> > > > > > > > +                   done <
> > > > > > > > $BUSYBOX_TMP_DIR/busybox.links$suffix
> > > > > > > > +               fi
> > > > > > > > +           done
> > > > > > > > +        fi
> > > > > > > > +}
> > > > > > > > +
> > > > > > > >  pkg_postrm_${PN} () {
> > > > > > > >          # Add path to remove dir in case we removed our
> > > > > > > > only
> > > > > > > > grep
> > > > > > > >          if [ "x$D" = "x" ] ; then
> > > > > > > > --
> > > > > > > > 2.17.1
> > > > >
> > >
>
>
> 
>
>
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#161218): 
https://lists.openembedded.org/g/openembedded-core/message/161218
Mute This Topic: https://lists.openembedded.org/mt/87919018/21656
Group Owner: openembedded-core+ow...@lists.openembedded.org
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub 
[arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to