Hey ho!

Mathieu Othacehe <m.othac...@gmail.com> skribis:

>> Here’s my tentative config file.
>
> I just generated a disk-image with your config file! Just like you, I did
> hit the "unsupported ioctl" issue on both master and core-updates
> branch.
>
> The reason is that the command run when producing the disk image is:
>
>           qemu-arm qemu-system-arm disk-image-builder
>             ^           ^
>             |           |-- Native qemu (so for armhf-linux architecture).
>             |
>             Run by binfmt because qemu-system-arm is a binary for armhf
>             architecture.
>
> So a syscall issued somewhere in disk-image-builder goes through the
> kernel emulated by qemu-system-arm and via qemu-arm to your host kernel.
>
> The failing syscall is number 47601 (FS_IOC32_GETVERSION), I don't know
> why it is not supported by our host kernel. However, using a
> qemu-system-arm built for arm doesn't make much sense here, because we
> add an unecessary (and failing) layer of emulation.

Woow, good catch!

> So what I would propose is to produce a disk-image using a qemu-system-*
> built for the host architecture (and not the system specified by
> --system argument). This remains true when cross-compiling a system.

Indeed, makes sense.

> The attached patch does thin in an ugly way but that solves the issue.

[…]

> +(define-record-type <native-qemu>
> +  (%native-qemu qemu system)
> +  native-qemu?
> +  (qemu native-qemu-qemu)
> +  (system native-qemu-system))
> +
> +(define-gexp-compiler (native-qemu-compiler (native-qemu <native-qemu>) 
> system target)
> +  (package->derivation (native-qemu-qemu native-qemu)
> +                       (native-qemu-system native-qemu)))
> +
>  (define* (expression->derivation-in-linux-vm name exp
>                                               #:key
>                                               (system (%current-system)) 
> target
> @@ -193,6 +204,9 @@ made available under the /xchg CIFS share."
>                          (reboot)
>                          (exit 1))))
>  
> +  (define qemu-native
> +    (%native-qemu qemu (@ (guix config) %system)))
> +
>    (let ((initrd (or initrd
>                      (base-initrd file-systems
>                                   #:on-error 'backtrace
> @@ -215,7 +229,7 @@ made available under the /xchg CIFS share."
>                             (gnu build vm))
>  
>                (let* ((native-inputs
> -                      '#+(list qemu (canonical-package coreutils)))
> +                      '#+(list qemu-native (canonical-package coreutils)))

This is a clever hack, but now the result of:

  guix system build -s armhf-linux -d …

would be dependent on the actual system type.  In other words, the
result would be different if you run it on armhf-linux, if you run it on
x86_64-linux, or if you run it on i686-linux.  Not great.

Could we use an evil trick, like the ‘binfmt-misc?’ predicate we
discussed in another thread, to somehow strip one emulation layer?  Hmm
probably not possible…

Why do we have that syscall ID mismatch anyway?…

Thoughts?

Ludo’.

Reply via email to