mirror of
https://git.in.rschanz.org/ryan77627/guix.git
synced 2024-11-07 15:36:20 -05:00
vm: Add a <virtual-machine> type and associated gexp compiler.
* gnu/system/vm.scm (system-qemu-image/shared-store-script): Add #:options parameter and honor it. (<virtual-machine>): New record type. (virtual-machine): New macro. (port-forwardings->qemu-options, virtual-machine-compiler): New procedures.
This commit is contained in:
parent
c97cef0a91
commit
ed419fa0c5
1 changed files with 67 additions and 3 deletions
|
@ -68,7 +68,10 @@ (define-module (gnu system vm)
|
|||
|
||||
system-qemu-image/shared-store
|
||||
system-qemu-image/shared-store-script
|
||||
system-disk-image))
|
||||
system-disk-image
|
||||
|
||||
virtual-machine
|
||||
virtual-machine?))
|
||||
|
||||
|
||||
;;; Commentary:
|
||||
|
@ -581,7 +584,8 @@ (define* (system-qemu-image/shared-store-script os
|
|||
full-boot?
|
||||
(disk-image-size
|
||||
(* (if full-boot? 500 70)
|
||||
(expt 2 20))))
|
||||
(expt 2 20)))
|
||||
(options '()))
|
||||
"Return a derivation that builds a script to run a virtual machine image of
|
||||
OS that shares its store with the host. The virtual machine runs with
|
||||
MEMORY-SIZE MiB of memory.
|
||||
|
@ -614,7 +618,8 @@ (define qemu-exec
|
|||
#$@(common-qemu-options image
|
||||
(map file-system-mapping-source
|
||||
(cons %store-mapping mappings)))
|
||||
"-m " (number->string #$memory-size)))
|
||||
"-m " (number->string #$memory-size)
|
||||
#$@options))
|
||||
|
||||
(define builder
|
||||
#~(call-with-output-file #$output
|
||||
|
@ -626,4 +631,63 @@ (define builder
|
|||
|
||||
(gexp->derivation "run-vm.sh" builder)))
|
||||
|
||||
|
||||
;;;
|
||||
;;; High-level abstraction.
|
||||
;;;
|
||||
|
||||
(define-record-type* <virtual-machine> %virtual-machine
|
||||
make-virtual-machine
|
||||
virtual-machine?
|
||||
(operating-system virtual-machine-operating-system) ;<operating-system>
|
||||
(qemu virtual-machine-qemu ;<package>
|
||||
(default qemu))
|
||||
(graphic? virtual-machine-graphic? ;Boolean
|
||||
(default #f))
|
||||
(memory-size virtual-machine-memory-size ;integer (MiB)
|
||||
(default 256))
|
||||
(port-forwardings virtual-machine-port-forwardings ;list of integer pairs
|
||||
(default '())))
|
||||
|
||||
(define-syntax virtual-machine
|
||||
(syntax-rules ()
|
||||
"Declare a virtual machine running the specified OS, with the given
|
||||
options."
|
||||
((_ os) ;shortcut
|
||||
(%virtual-machine (operating-system os)))
|
||||
((_ fields ...)
|
||||
(%virtual-machine fields ...))))
|
||||
|
||||
(define (port-forwardings->qemu-options forwardings)
|
||||
"Return the QEMU option for the given port FORWARDINGS as a string, where
|
||||
FORWARDINGS is a list of host-port/guest-port pairs."
|
||||
(string-join
|
||||
(map (match-lambda
|
||||
((host-port . guest-port)
|
||||
(string-append "hostfwd=tcp::"
|
||||
(number->string host-port)
|
||||
"-:" (number->string guest-port))))
|
||||
forwardings)
|
||||
","))
|
||||
|
||||
(define-gexp-compiler (virtual-machine-compiler (vm <virtual-machine>)
|
||||
system target)
|
||||
;; XXX: SYSTEM and TARGET are ignored.
|
||||
(match vm
|
||||
(($ <virtual-machine> os qemu graphic? memory-size ())
|
||||
(system-qemu-image/shared-store-script os
|
||||
#:qemu qemu
|
||||
#:graphic? graphic?
|
||||
#:memory-size memory-size))
|
||||
(($ <virtual-machine> os qemu graphic? memory-size forwardings)
|
||||
(let ((options
|
||||
`("-net" ,(string-append
|
||||
"user,"
|
||||
(port-forwardings->qemu-options forwardings)))))
|
||||
(system-qemu-image/shared-store-script os
|
||||
#:qemu qemu
|
||||
#:graphic? graphic?
|
||||
#:memory-size memory-size
|
||||
#:options options)))))
|
||||
|
||||
;;; vm.scm ends here
|
||||
|
|
Loading…
Reference in a new issue