[OE-core] [PATCH] package_rpm: Fix useradd preinst ordering issues
Steve Sakoman
sakoman at gmail.com
Thu Apr 12 13:39:47 UTC 2012
On Wed, Apr 11, 2012 at 2:42 PM, Mark Hatle <mark.hatle at windriver.com> wrote:
> On 4/11/12 4:31 PM, Richard Purdie wrote:
>>
>> We were already having occasional ordering issues with package_rpm.
>> Fixing the ldconfig postinstall issue pushed rpm over the cliff and
>> totally broke rpm builds with the packages getting installed in
>> effectively a random order and the useradd preinstalls getting executed
>> out of order and breaking.
>>
>> The only explanation I can find for this is that rpm is special. It will
>> happily run a preinst for a package without any of that package's
>> dependencies being present regardless of whether there are any circular
>> dependency issues or not. I attempted various ways of solving this such
>> as ordering the total_solution.manifest in creative ways but the bottom
>> line is RPM ignores this. It takes little account of any request to
>> ignore /bin/sh dependencies for the purposes of constructing the final
>> image.
>>
>> The end result is we're having to install the base-passwd, base-files
>> and shadow packages first (if there is a request to install them), then
>> install any other packages.
>>
>> It this wasn't in the middle of a release I'd be rewriting this bbclass
>> file, its horrible.
>>
>> Signed-off-by: Richard Purdie<richard.purdie at linuxfoundation.org>
>
>
> I've reviewed this. I don't see anything wrong with this, other then the
> pain of having to do this.
>
> Signed-off-by: Mark Hatle <mark.hatle at windriver.com>
FWIW, after pulling current poky this morning all of my image builds
are failing with errors like this:
| Installing base dependencies first (base-passwd, base-files and
shadow) since rpm is special
| error: Failed dependencies:
| /bin/sh is needed by base-passwd-3.5.24-r0.armv7a
| /bin/sh is needed by shadow-4.1.4.3-r8.armv7a
| /bin/sh is needed by libgcc1-4.6.3+svnr184847-r24.armv7a
| /bin/sh is needed by libc6-2.13-r23+svnr15508.armv7a
I'll investigate, but since it is late in the release process thought
I would mention the issue.
Steve
>> diff --git a/meta/classes/package_rpm.bbclass
>> b/meta/classes/package_rpm.bbclass
>> index 16a2c87..1b0f6f2 100644
>> --- a/meta/classes/package_rpm.bbclass
>> +++ b/meta/classes/package_rpm.bbclass
>> @@ -166,22 +167,23 @@ rpm_common_comand () {
>> # install or remove the pkg
>> rpm_update_pkg () {
>>
>> + manifest=$1
>> + btmanifest=$manifest.bt
>> local target_rootfs="${INSTALL_ROOTFS_RPM}"
>>
>> # Save the rpm's build time for incremental image generation, and the
>> file
>> # would be moved to ${T}
>> - rm -f ${target_rootfs}/install/total_solution_bt.manifest
>> - for i in `cat ${target_rootfs}/install/total_solution.manifest`; do
>> + rm -f $btmanifest
>> + for i in `cat $manifest`; do
>> # Use "rpm" rather than "${RPM}" here, since we don't need the
>> # '--dbpath' option
>> - echo "$i `rpm -qp --qf '%{BUILDTIME}\n' $i`">> \
>> - ${target_rootfs}/install/total_solution_bt.manifest
>> + echo "$i `rpm -qp --qf '%{BUILDTIME}\n' $i`">> $btmanifest
>> done
>>
>> # Only install the different pkgs if incremental image generation is
>> set
>> if [ "${INC_RPM_IMAGE_GEN}" = "1" -a -f
>> ${T}/total_solution_bt.manifest -a \
>> "${IMAGE_PKGTYPE}" = "rpm" ]; then
>> - cur_list="${target_rootfs}/install/total_solution_bt.manifest"
>> + cur_list="$btmanifest"
>> pre_list="${T}/total_solution_bt.manifest"
>> sort -u $cur_list -o $cur_list
>> sort -u $pre_list -o $pre_list
>> @@ -203,8 +205,7 @@ rpm_update_pkg () {
>> -Uvh ${target_rootfs}/install/incremental.manifest
>> else
>> # Attempt to install
>> - rpm_common_comand --replacepkgs \
>> - -Uhv ${target_rootfs}/install/total_solution.manifest
>> + rpm_common_comand --replacepkgs -Uhv $manifest
>> fi
>> }
>>
>> @@ -440,14 +441,7 @@ package_install_internal_rpm () {
>>
>> fi
>>
>> - # If base-passwd or shadow are in the list of packages to install,
>> - # ensure they are installed first to support later packages that
>> - # may create custom users/groups (fixes Yocto bug #2127)
>> - infile=${target_rootfs}/install/install_solution.manifest
>> - outfile=${target_rootfs}/install/total_solution.manifest
>> - cat $infile | grep /base-passwd-[0-9]> $outfile || true
>> - cat $infile | grep /shadow-[0-9]>> $outfile || true
>> - cat $infile | grep -v /shadow-[0-9] | grep -v /base-passwd-[0-9]>>
>> $outfile || true
>> + cat ${target_rootfs}/install/install_solution.manifest>
>> ${target_rootfs}/install/total_solution.manifest
>> cat ${target_rootfs}/install/install_multilib_solution.manifest>>
>> ${target_rootfs}/install/total_solution.manifest
>>
>> # Construct install scriptlet wrapper
>> @@ -474,8 +468,45 @@ EOF
>>
>> chmod 0755 ${WORKDIR}/scriptlet_wrapper
>>
>> - rpm_update_pkg
>> + # RPM is special. It can't handle dependencies and preinstall
>> scripts correctly. Its
>> + # probably a feature. The only way to convince rpm to actually run
>> the preinstall scripts
>> + # for base-passwd and shadow first before installing packages that
>> depend on these packages
>> + # is to do two image installs, installing one set of packages,
>> then the other.
>> + if [ "${INC_RPM_IMAGE_GEN}" = "1" -a -f
>> ${T}/total_solution_bt.manifest ]; then
>> + echo "Skipping pre install due to exisitng image"
>> + else
>> + echo "# Intial Install manifest">
>> ${target_rootfs}/install/initial_install.manifest
>> + echo "Installing base dependencies first (base-passwd,
>> base-files and shadow) since rpm is special"
>> + grep /base-passwd-[0-9]
>> ${target_rootfs}/install/total_solution.manifest>>
>> ${target_rootfs}/install/initial_install.manifest || true
>> + grep /base-files-[0-9]
>> ${target_rootfs}/install/total_solution.manifest>>
>> ${target_rootfs}/install/initial_install.manifest || true
>> + grep /shadow-[0-9]
>> ${target_rootfs}/install/total_solution.manifest>>
>> ${target_rootfs}/install/initial_install.manifest || true
>> +
>> + # Generate an install solution by doing a --justdb
>> install, then recreate it with
>> + # an actual package install!
>> + mkdir -p ${target_rootfs}/initial
>> +
>> + ${RPM} --predefine "_rpmds_sysinfo_path
>> ${target_rootfs}/etc/rpm/sysinfo" \
>> + --predefine "_rpmrc_platform_path
>> ${target_rootfs}/etc/rpm/platform" \
>> + -D "_dbpath ${target_rootfs}/initial" -D "`cat
>> ${confbase}-base_archs.macro`" \
>> + -D "__dbi_txn create nofsync" \
>> + -U --justdb --noscripts --notriggers
>> --noparentdirs --nolinktos --ignoresize \
>> + ${target_rootfs}/install/initial_install.manifest
>> +
>> + ${RPM} -D "_dbpath ${target_rootfs}/initial" -qa --yaml \
>> + -D "__dbi_txn create nofsync private" \
>> + | grep -i 'Packageorigin' | cut -d : -f 2>
>> ${target_rootfs}/install/initial_solution.manifest
>> +
>> + rpm_update_pkg
>> ${target_rootfs}/install/initial_solution.manifest
>> +
>> + grep -Fv -f
>> ${target_rootfs}/install/initial_solution.manifest
>> ${target_rootfs}/install/total_solution.manifest>
>> ${target_rootfs}/install/total_solution.manifest.new
>> + mv ${target_rootfs}/install/total_solution.manifest.new
>> ${target_rootfs}/install/total_solution.manifest
>> +
>> + rm -rf ${target_rootfs}/initial
>> + fi
>> +
>> + echo "Installing main solution manifest
>> (${target_rootfs}/install/total_solution.manifest)"
>>
>> + rpm_update_pkg ${target_rootfs}/install/total_solution.manifest
>> }
>>
>> python write_specfile () {
>>
>
>
> _______________________________________________
> Openembedded-core mailing list
> Openembedded-core at lists.openembedded.org
> http://lists.linuxtogo.org/cgi-bin/mailman/listinfo/openembedded-core
More information about the Openembedded-core
mailing list