vm: Adapt qemu command to ARM.
* gnu/build/vm.scm (load-in-linux-vm): New argument #:target-arm32. Use it to adapt command for qemu-system-arm. This implies to choose a machine ("virt"), use the correct console port "ttyAMA0", disable KVM use that is buggy on some ARM boards (Odroid XU4 for example) and use user mode network stack instead of NIC. Gather all those options in a new variable "arch-specific-flags". * gnu/system/vm.scm (expression->derivation-in-linux-vm): Pass to load-in-linux-vm "#:target-arm32?" argument.
This commit is contained in:
parent
dfb403b053
commit
acf54bca22
|
@ -77,6 +77,7 @@
|
||||||
linux initrd
|
linux initrd
|
||||||
make-disk-image?
|
make-disk-image?
|
||||||
single-file-output?
|
single-file-output?
|
||||||
|
target-arm32?
|
||||||
(disk-image-size (* 100 (expt 2 20)))
|
(disk-image-size (* 100 (expt 2 20)))
|
||||||
(disk-image-format "qcow2")
|
(disk-image-format "qcow2")
|
||||||
(references-graphs '()))
|
(references-graphs '()))
|
||||||
|
@ -91,6 +92,31 @@ access it via /dev/hda.
|
||||||
|
|
||||||
REFERENCES-GRAPHS can specify a list of reference-graph files as produced by
|
REFERENCES-GRAPHS can specify a list of reference-graph files as produced by
|
||||||
the #:references-graphs parameter of 'derivation'."
|
the #:references-graphs parameter of 'derivation'."
|
||||||
|
|
||||||
|
(define arch-specific-flags
|
||||||
|
`(;; On ARM, a machine has to be specified. Use "virt" machine to avoid
|
||||||
|
;; hardware limits imposed by other machines.
|
||||||
|
,@(if target-arm32? '("-M" "virt") '())
|
||||||
|
|
||||||
|
;; Only enable kvm if we see /dev/kvm exists. This allows users without
|
||||||
|
;; hardware virtualization to still use these commands. KVM support is
|
||||||
|
;; still buggy on some ARM32 boards. Do not use it even if available.
|
||||||
|
,@(if (and (file-exists? "/dev/kvm")
|
||||||
|
(not target-arm32?))
|
||||||
|
'("-enable-kvm")
|
||||||
|
'())
|
||||||
|
"-append"
|
||||||
|
;; The serial port name differs between emulated architectures/machines.
|
||||||
|
,@(if target-arm32?
|
||||||
|
`(,(string-append "console=ttyAMA0 --load=" builder))
|
||||||
|
`(,(string-append "console=ttyS0 --load=" builder)))
|
||||||
|
;; NIC is not supported on ARM "virt" machine, so use a user mode
|
||||||
|
;; network stack instead.
|
||||||
|
,@(if target-arm32?
|
||||||
|
'("-device" "virtio-net-pci,netdev=mynet"
|
||||||
|
"-netdev" "user,id=mynet")
|
||||||
|
'("-net" "nic,model=virtio"))))
|
||||||
|
|
||||||
(when make-disk-image?
|
(when make-disk-image?
|
||||||
(format #t "creating ~a image of ~,2f MiB...~%"
|
(format #t "creating ~a image of ~,2f MiB...~%"
|
||||||
disk-image-format (/ disk-image-size (expt 2 20)))
|
disk-image-format (/ disk-image-size (expt 2 20)))
|
||||||
|
@ -113,7 +139,6 @@ the #:references-graphs parameter of 'derivation'."
|
||||||
(unless (zero?
|
(unless (zero?
|
||||||
(apply system* qemu "-nographic" "-no-reboot"
|
(apply system* qemu "-nographic" "-no-reboot"
|
||||||
"-m" (number->string memory-size)
|
"-m" (number->string memory-size)
|
||||||
"-net" "nic,model=virtio"
|
|
||||||
"-virtfs"
|
"-virtfs"
|
||||||
(string-append "local,id=store_dev,path="
|
(string-append "local,id=store_dev,path="
|
||||||
(%store-directory)
|
(%store-directory)
|
||||||
|
@ -132,12 +157,7 @@ the #:references-graphs parameter of 'derivation'."
|
||||||
",format=" disk-image-format
|
",format=" disk-image-format
|
||||||
",id=myhd"))
|
",id=myhd"))
|
||||||
'())
|
'())
|
||||||
;; Only enable kvm if we see /dev/kvm exists.
|
arch-specific-flags)))
|
||||||
;; This allows users without hardware virtualization to still
|
|
||||||
;; use these commands.
|
|
||||||
(if (file-exists? "/dev/kvm")
|
|
||||||
'("-enable-kvm")
|
|
||||||
'()))))
|
|
||||||
(error "qemu failed" qemu))
|
(error "qemu failed" qemu))
|
||||||
|
|
||||||
;; When MAKE-DISK-IMAGE? is true, the image is in OUTPUT already.
|
;; When MAKE-DISK-IMAGE? is true, the image is in OUTPUT already.
|
||||||
|
|
|
@ -175,6 +175,10 @@ made available under the /xchg CIFS share."
|
||||||
#:memory-size #$memory-size
|
#:memory-size #$memory-size
|
||||||
#:make-disk-image? #$make-disk-image?
|
#:make-disk-image? #$make-disk-image?
|
||||||
#:single-file-output? #$single-file-output?
|
#:single-file-output? #$single-file-output?
|
||||||
|
;; FIXME: ‘target-arm32?’ may not operate on
|
||||||
|
;; the right system/target values. Rewrite
|
||||||
|
;; using ‘let-system’ when available.
|
||||||
|
#:target-arm32? #$(target-arm32?)
|
||||||
#:disk-image-format #$disk-image-format
|
#:disk-image-format #$disk-image-format
|
||||||
#:disk-image-size size
|
#:disk-image-size size
|
||||||
#:references-graphs graphs)))))
|
#:references-graphs graphs)))))
|
||||||
|
|
Loading…
Reference in New Issue