[OE-core] [PATCH 1/1] busybox: fix the on-target upgrade problem
ChenQi
Qi.Chen at windriver.com
Mon Jul 8 08:20:55 UTC 2013
On 07/06/2013 06:27 PM, Martin Jansa wrote:
> On Wed, Jul 03, 2013 at 12:48:12PM +0800, Qi.Chen at windriver.com wrote:
>> From: Chen Qi <Qi.Chen at windriver.com>
>>
>> We now can have a 'one-binary' version of busybox, or 'two-binary'
>> version of busybox, controlled by the 'BUSYBOX_SPLIT_SUID' variable.
>> This makes on-target upgrade a problem, as we have to support the
>> following four upgrading paths.
>>
>> For convenience, in the following context, A is used to denote a
>> 'two-binary' version of busybox while B is used to denote a 'one-binary'
>> version of busybox.
>>
>> A --(upgrade)--> B
>> B --(upgrade)--> A
>> A --(upgrade)--> A
>> B --(upgrade)--> B
>>
>> This patch makes effort to support the above four situations.
> Thanks for looking into it (it's more complicated then I've first
> expected) and it looks like there is more issues probably caused
> by applet path moved in latest busybox upgrade (but ip looks weird) :/
>
> update-alternatives: Error: cannot register alternative addgroup to
> /usr/sbin/addgroup since it is already registered to /bin/addgroup
> update-alternatives: Error: cannot register alternative adduser to
> /usr/sbin/adduser since it is already registered to /bin/adduser
>
> update-alternatives: Error: cannot register alternative delgroup to
> /usr/sbin/delgroup since it is already registered to /bin/delgroup
> update-alternatives: Error: cannot register alternative deluser to
> /usr/sbin/deluser since it is already registered to /bin/deluser
>
> update-alternatives: Error: cannot register alternative ip to /sbin/ip
> since it is already registered to /bin/ip
>
> SHR root at gjama ~ $ cat /var/lib/opkg/alternatives/ip
> /bin/ip
> busybox 50
> /bin/busybox 50
> /bin/busybox.nosuid 50
> SHR root at gjama ~ $ cat /var/lib/opkg/alternatives/adduser
> /bin/adduser
> /bin/busybox.nosuid 50
> SHR root at gjama ~ $ cat /var/lib/opkg/alternatives/addgroup
> /bin/addgroup
> /bin/busybox.nosuid 50
> SHR root at gjama ~ $ cat /var/lib/opkg/alternatives/delgroup
> /bin/delgroup
> /bin/busybox.nosuid 50
> SHR root at gjama ~ $ cat /var/lib/opkg/alternatives/deluser
> /bin/deluser
> /bin/busybox.nosuid 50
Hi Martin,
The problem roots in opkg's update-alternatives.
opkg's update-alternatives cannot handle following situations.
/bin/<cmd> --> /bin/<cmd>.<pkgA>
/usr/bin/<cmd> --> /usr/bin/<cmd>.<pkgB>.
[Let's denote this situation as situationA, we have different links and
different targets in situationA.]
It has a simple assumption in its design, that is, the links for the
same command should be the same.
In case of our busybox upgrade, we have:
/bin/deluser --> /bin/busybox.nosuid
/usr/sbin/deluser --> /bin/busybox.nosuid
[Let's denote this situation as situationB, we have different links but
the same target in situationB.]
The links are different, /bin/deluser and /usr/sbin/deluser, so opkg's
update-alternatives rendered an error while registering the alternative.
According to its assumption, opkg's update-alternatives should not
support situationA and situationB.
But I think it should at least be able to deal with situationB. Because
it's not unusual in Yocto/OE to create symlinks via update-alternatives
and situationB might indicate an on-device upgrade.
I've just made a patch to support this situationB. I'm still doing some
tests on this patch. Please see attachment for more details.
Any thoughts on this problem?
Best Regards,
Chen Qi
>> [YOCTO #4802]
>>
>> Signed-off-by: Chen Qi <Qi.Chen at windriver.com>
>> ---
>> meta/recipes-core/busybox/busybox.inc | 48 +++++++++++++++++++++++++++++++++
>> 1 file changed, 48 insertions(+)
>>
>> diff --git a/meta/recipes-core/busybox/busybox.inc b/meta/recipes-core/busybox/busybox.inc
>> index 8567d64..acd2bfb 100644
>> --- a/meta/recipes-core/busybox/busybox.inc
>> +++ b/meta/recipes-core/busybox/busybox.inc
>> @@ -190,6 +190,10 @@ do_install () {
>> install -m 0644 ${S}/busybox.links.suid ${D}${sysconfdir}
>> install -m 0644 ${S}/busybox.links.nosuid ${D}${sysconfdir}
>> ln -sf busybox.nosuid ${D}${base_bindir}/sh
>> + # Keep a default busybox for people who want to invoke busybox directly.
>> + # This is also useful for the on device upgrade. Because we want
>> + # to use the busybox command in postinst.
>> + ln -sf busybox.nosuid ${D}${base_bindir}/busybox
>> else
>> if grep -q "CONFIG_FEATURE_SUID=y" ${B}/.config; then
>> install -m 4755 ${B}/busybox ${D}${base_bindir}
>> @@ -198,6 +202,12 @@ do_install () {
>> fi
>> install -m 0644 ${S}/busybox.links ${D}${sysconfdir}
>> ln -sf busybox ${D}${base_bindir}/sh
>> + # We make this symlink here to eliminate the error when upgrading together
>> + # with busybox-syslog. Without this symlink, the opkg may think of the
>> + # busybox.nosuid as obsolete and remove it, resulting in dead links like
>> + # /bin/sed -> /bin/busybox.nosuid. This will make upgrading busybox-syslog fail.
>> + # This symlink will be safely deleted in postinst, thus no negative effect.
>> + ln -sf busybox ${D}${base_bindir}/busybox.nosuid
>> fi
>> else
>> install -d ${D}${base_bindir} ${D}${base_sbindir}
>> @@ -306,6 +316,44 @@ python do_package_prepend () {
>> set_alternative_vars("/etc/busybox.links.suid", "/bin/busybox.suid")
>> }
>>
>> +pkg_postinst_${PN} () {
>> + # This part of code is dedicated to the on target upgrade problem.
>> + # It's known that if we don't make appropriate symlinks before update-alternatives calls,
>> + # there will be errors indicating missing commands such as 'sed'.
>> + # These symlinks will later be updated by update-alternatives calls.
>> + test -n 2 > /dev/null || alias test='busybox test'
>> + if test "x$D" = "x"; then
>> + # Remove busybox.nosuid if it's a symlink, because this situation indicates
>> + # that we're installing or upgrading to a one-binary busybox.
>> + if test -h /bin/busybox.nosuid; then
>> + rm -f /bin/busybox.nosuid
>> + fi
>> + for suffix in "" ".nosuid" ".suid"; do
>> + if test -e /etc/busybox.links$suffix; then
>> + while read link; do
>> + if test ! -e "$link"; then
>> + case "$link" in
>> + /*/*/*)
>> + to="../../bin/busybox$suffix"
>> + ;;
>> + /bin/*)
>> + to="busybox$suffix"
>> + ;;
>> + /*/*)
>> + to="../bin/busybox$suffix"
>> + ;;
>> + esac
>> + # we can use busybox here because even if we are using splitted busybox
>> + # we've made a symlink from /bin/busybox to /bin/busybox.nosuid.
>> + busybox rm -f $link
>> + busybox ln -s $to $link
>> + fi
>> + done < /etc/busybox.links$suffix
>> + fi
>> + done
>> + fi
>> +}
>> +
>> pkg_prerm_${PN} () {
>> # This is so you can make busybox commit suicide - removing busybox with no other packages
>> # providing its files, this will make update-alternatives work, but the update-rc.d part
>> --
>> 1.7.9.5
>>
>> _______________________________________________
>> Openembedded-core mailing list
>> Openembedded-core at lists.openembedded.org
>> http://lists.openembedded.org/mailman/listinfo/openembedded-core
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-opkg-fix-update-alternatives-to-handle-on-device-upg.patch
Type: text/x-patch
Size: 3567 bytes
Desc: not available
URL: <http://lists.openembedded.org/pipermail/openembedded-core/attachments/20130708/bc6c52f9/attachment-0002.bin>
More information about the Openembedded-core
mailing list