[Libguestfs] Weird results from g.sh()

Richard W.M. Jones rjones at redhat.com
Thu Aug 27 08:08:05 UTC 2020


On Thu, Aug 27, 2020 at 10:50:12AM +0300, Sam Eiderman wrote:
> Hi,
> 
> I'm using libguestfs 1.42,
> 
> When I run the following python3 commands on a rhel7.8:
> 
> print(g.ls('/sys'))
> []

This lists the files in /sys in the filesystem, which in most disk
images is likely to be an empty directory.

> print(g.sh('ls /sys'))
> block
> bus
> class
> dev
> devices
> firmware
> fs
> hypervisor
> kernel
> module
> power

sh bind-mounts /sys from the appliance into the filesystem temporarily
in order to make it possible to run some commands:

https://github.com/libguestfs/libguestfs/blob/fce82fe55a2b64a1a7e494858aa272d608e5e54e/daemon/sh.c#L60

However this /sys has nothing to do with /sys as it may appear in the
guest when it is running.  Libguestfs edits filesystems, it doesn't
run the guest.

> It seems that g.ls('/sys') is chrooted correctly.
> But g.sh('ls /sys') isn't.
> 
> I came across this behavior when I used g.command(['grub2-mkconfig', '-o',
> '....']) on rhel7.8 and it didn't produce the correct linuxefi/initrdefi
> entries in grub, since in rhel7.8 the uefi detection algorithm is checking
> in bash '[ -d /sys/firmware/efi ]'.
> https://src.fedoraproject.org/rpms/grub2/blob/71e0fb4ea646071ec86e4a65bb24241e31c156bb/f/0106-Make-10_linux-work-with-our-changes-for-linux16-and-.patch

It's pretty unlikely that running grub can work.  The libguestfs
appliance is sufficiently different from how the guest boots that
things like BIOS mappings are not related, and libguestfs doesn't use
EFI at all.

There's unfortunately no good way to run grub.  syslinux/extlinux is
the only option since it is designed to make modifications to offline
filesystems, and grub is not.

Rich.

> I thought I could simply g.mkdir_p('/sys/firmware/efi') - but that created
> a fake dir in my chrooted environment, where grub2-mkconfig somehow was
> inspecting the real /sys as demonstrated in the above 'ls' example.
> 
> Any ideas on why sh jailbreaks the chroot? is /sys set through some
> environment variable?
> 
> Thanks!

> _______________________________________________
> Libguestfs mailing list
> Libguestfs at redhat.com
> https://www.redhat.com/mailman/listinfo/libguestfs


-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-p2v converts physical machines to virtual machines.  Boot with a
live CD or over the network (PXE) and turn machines into KVM guests.
http://libguestfs.org/virt-v2v




More information about the Libguestfs mailing list