Richard W.M. Jones
2015-Aug-27 16:32 UTC
[Libguestfs] [PATCH] customize: Use setarch when running commands on i686 guest (RHBZ#1256405).
When running (eg) dnf on a 32 bit i686 guest when the host is 64 bit
x86_64, dnf believes it is running on a 64 bit machine and so tries to
install x86_64 packages. We can 'trick' dnf into believing it's a
32
bit machine using the setarch program.
$ virt-builder fedora-22 --arch i686 --install 'gperf'
...
[ 27.4] Installing packages: gperf
...
Running transaction test
Error: Transaction check error:
package libgcc-5.1.1-4.fc22.x86_64 is intended for a different architecture
...
Thanks: Jan Sedlák for finding the solution.
---
customize/customize_run.ml | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/customize/customize_run.ml b/customize/customize_run.ml
index 828c711..2a4c71e 100644
--- a/customize/customize_run.ml
+++ b/customize/customize_run.ml
@@ -59,6 +59,7 @@ let run (g : Guestfs.guestfs) root (ops : ops) * - Pass
environment variables through from the host.
* - Send stdout and stderr to a log file so we capture all output
* in error messages.
+ * - Use setarch when running x86_64 host + i686 guest.
* Also catch errors and dump the log file completely on error.
*)
let env_vars @@ -69,11 +70,16 @@ let run (g : Guestfs.guestfs) root (ops :
ops) ) [ "http_proxy"; "https_proxy";
"ftp_proxy"; "no_proxy" ] in
let env_vars = String.concat "\n" env_vars ^ "\n" in
+ let setarch + match Config.host_cpu, guest_arch with
+ | "x86_64",
("i386"|"i486"|"i586"|"i686") ->
"setarch i686"
+ | _ -> "" in
+
let cmd = sprintf "\
exec >>%s 2>&1
%s
-%s
-" (quote logfile) env_vars cmd in
+%s %s
+" (quote logfile) env_vars setarch cmd in
if verbose () then printf "running command:\n%s\n%!" cmd;
try ignore (g#sh cmd)
--
2.5.0
Richard W.M. Jones
2015-Aug-27 16:38 UTC
Re: [Libguestfs] [PATCH] customize: Use setarch when running commands on i686 guest (RHBZ#1256405).
On Thu, Aug 27, 2015 at 05:32:31PM +0100, Richard W.M. Jones wrote:> When running (eg) dnf on a 32 bit i686 guest when the host is 64 bit > x86_64, dnf believes it is running on a 64 bit machine and so tries to > install x86_64 packages. We can 'trick' dnf into believing it's a 32 > bit machine using the setarch program. > > $ virt-builder fedora-22 --arch i686 --install 'gperf' > ... > [ 27.4] Installing packages: gperf > ... > Running transaction test > Error: Transaction check error: > package libgcc-5.1.1-4.fc22.x86_64 is intended for a different architecture > ... > > Thanks: Jan Sedlák for finding the solution. > --- > customize/customize_run.ml | 10 ++++++++-- > 1 file changed, 8 insertions(+), 2 deletions(-) > > diff --git a/customize/customize_run.ml b/customize/customize_run.ml > index 828c711..2a4c71e 100644 > --- a/customize/customize_run.ml > +++ b/customize/customize_run.ml > @@ -59,6 +59,7 @@ let run (g : Guestfs.guestfs) root (ops : ops) > * - Pass environment variables through from the host. > * - Send stdout and stderr to a log file so we capture all output > * in error messages. > + * - Use setarch when running x86_64 host + i686 guest. > * Also catch errors and dump the log file completely on error. > *) > let env_vars > @@ -69,11 +70,16 @@ let run (g : Guestfs.guestfs) root (ops : ops) > ) [ "http_proxy"; "https_proxy"; "ftp_proxy"; "no_proxy" ] in > let env_vars = String.concat "\n" env_vars ^ "\n" in > > + let setarch > + match Config.host_cpu, guest_arch with > + | "x86_64", ("i386"|"i486"|"i586"|"i686") -> "setarch i686" > + | _ -> "" in > + > let cmd = sprintf "\ > exec >>%s 2>&1 > %s > -%s > -" (quote logfile) env_vars cmd in > +%s %s > +" (quote logfile) env_vars setarch cmd inUnfortunately this doesn't work if the 'cmd' is actually multiple commands. For example if the command was: uname -m ; uname -m then this would be turned into: setarch i686 uname -m ; uname -m and that would print: i686 x86_64 It's tricky because setarch always wants to create a new shell. Rich. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones Read my programming and virtualization blog: http://rwmj.wordpress.com virt-builder quickly builds VMs from scratch http://libguestfs.org/virt-builder.1.html
Reasonably Related Threads
- [PATCH v2] customize: Use setarch when running commands on i686 guest
- [PATCH] customize: fix running commands on the same architecture
- [common PATCH] mltools: add run_in_guest_command helper
- [PATCH 0/4] sysprep: add FreeIPA offline unenrollment (RHBZ#1789592)
- [PATCH] customize: Make dnf upgrade to the latest versions of packages.