guix system vm: Add --no-graphic CLI argument.

It configures QEMU to use the tty it was started in for IO (as opposed to
opening a separate graphical window).  This enables copy-pasting and
scrollback.  Exit QEMU with C-a x.

* gnu/system/vm.scm (system-qemu-image/shared-store-script): Also add the
'-nographic' QEMU argument when called with #:graphic? #false.
* guix/scripts/system.scm (system-derivation-for-action): Propagate
the #:graphic? keyword arg.
(perform-action): Add and propagate the #:graphic? keyword arg.
(show-help): Add --no-graphic CLI arg.
(%options): Process the new --no-graphic CLI arg.
(process-action): Feed in the CLI arg through the #:graphic? keyword arg.
* doc/guix.texi (Invoking guix system): Add example to combine guix system and
invoking the vm start script into one command.  Split the description of the
various options into separate paragraphs.  Add a paragraph to describe
--no-graphic.

Signed-off-by: Mathieu Othacehe <othacehe@gnu.org>
This commit is contained in:
Attila Lendvai 2021-12-02 20:18:56 +01:00 committed by Mathieu Othacehe
parent 5a18cf3604
commit b42bfbdfe5
No known key found for this signature in database
GPG Key ID: 8354763531769CA6
3 changed files with 31 additions and 4 deletions

View File

@ -34506,8 +34506,8 @@ passed.
@cindex virtual machine @cindex virtual machine
@cindex VM @cindex VM
@anchor{guix system vm} @anchor{guix system vm}
Build a virtual machine that contains the operating system declared in Build a virtual machine (VM) that contains the operating system declared
@var{file}, and return a script to run that virtual machine (VM). in @var{file}, and return a script to run that VM.
@quotation Note @quotation Note
The @code{vm} action and others below The @code{vm} action and others below
@ -34526,6 +34526,12 @@ emulated machine:
$ /gnu/store/@dots{}-run-vm.sh -m 1024 -smp 2 -nic user,model=virtio-net-pci $ /gnu/store/@dots{}-run-vm.sh -m 1024 -smp 2 -nic user,model=virtio-net-pci
@end example @end example
It's possible to combine the two steps into one:
@example
$ $(guix system vm my-config.scm) -m 1024 -smp 2 -nic user,model=virtio-net-pci
@end example
The VM shares its store with the host system. The VM shares its store with the host system.
Additional file systems can be shared between the host and the VM using Additional file systems can be shared between the host and the VM using
@ -34549,8 +34555,17 @@ store of the host can then be mounted.
The @option{--full-boot} option forces a complete boot sequence, starting The @option{--full-boot} option forces a complete boot sequence, starting
with the bootloader. This requires more disk space since a root image with the bootloader. This requires more disk space since a root image
containing at least the kernel, initrd, and bootloader data files must containing at least the kernel, initrd, and bootloader data files must
be created. The @option{--image-size} option can be used to specify the be created.
size of the image.
The @option{--image-size} option can be used to specify the size of the
image.
The @option{--no-graphic} option will instruct @command{guix system} to
spawn a headless VM that will use the invoking tty for IO. Among other
things, this enables copy-pasting, and scrollback. Use the @kbd{ctrl-a}
prefix to issue QEMU commands; e.g. @kbd{ctrl-a h} prints a help,
@kbd{ctrl-a x} quits the VM, and @kbd{ctrl-a c} switches between the
QEMU monitor and the VM.
@cindex System images, creation in various formats @cindex System images, creation in various formats
@cindex Creating system images in various formats @cindex Creating system images in various formats

View File

@ -754,6 +754,8 @@ it is mostly useful when FULL-BOOT? is true."
(define qemu-exec (define qemu-exec
#~(list #+(file-append qemu "/bin/" #~(list #+(file-append qemu "/bin/"
(qemu-command (or target system))) (qemu-command (or target system)))
;; Tells qemu to use the terminal it was started in for IO.
#$@(if graphic? '() #~("-nographic"))
#$@(if full-boot? #$@(if full-boot?
#~() #~()
#~("-kernel" #$(operating-system-kernel-file os) #~("-kernel" #$(operating-system-kernel-file os)

View File

@ -689,6 +689,7 @@ checking this by themselves in their 'check' procedure."
(define* (system-derivation-for-action image action (define* (system-derivation-for-action image action
#:key #:key
full-boot? full-boot?
(graphic? #t)
container-shared-network? container-shared-network?
mappings) mappings)
"Return as a monadic value the derivation for IMAGE according to ACTION." "Return as a monadic value the derivation for IMAGE according to ACTION."
@ -706,6 +707,7 @@ checking this by themselves in their 'check' procedure."
((vm) ((vm)
(system-qemu-image/shared-store-script os (system-qemu-image/shared-store-script os
#:full-boot? full-boot? #:full-boot? full-boot?
#:graphic? graphic?
#:disk-image-size #:disk-image-size
(if full-boot? (if full-boot?
image-size image-size
@ -772,6 +774,7 @@ and TARGET arguments."
dry-run? derivations-only? dry-run? derivations-only?
use-substitutes? target use-substitutes? target
full-boot? full-boot?
(graphic? #t)
container-shared-network? container-shared-network?
(mappings '()) (mappings '())
(gc-root #f)) (gc-root #f))
@ -825,6 +828,7 @@ static checks."
(mlet* %store-monad (mlet* %store-monad
((sys (system-derivation-for-action image action ((sys (system-derivation-for-action image action
#:full-boot? full-boot? #:full-boot? full-boot?
#:graphic? graphic?
#:container-shared-network? container-shared-network? #:container-shared-network? container-shared-network?
#:mappings mappings)) #:mappings mappings))
@ -1012,6 +1016,8 @@ Some ACTIONS support additional ARGS.\n"))
register it as a garbage collector root")) register it as a garbage collector root"))
(display (G_ " (display (G_ "
--full-boot for 'vm', make a full boot sequence")) --full-boot for 'vm', make a full boot sequence"))
(display (G_ "
--no-graphic for 'vm', use the tty that we are started in for IO"))
(display (G_ " (display (G_ "
--skip-checks skip file system and initrd module safety checks")) --skip-checks skip file system and initrd module safety checks"))
(display (G_ " (display (G_ "
@ -1081,6 +1087,9 @@ Some ACTIONS support additional ARGS.\n"))
(option '("full-boot") #f #f (option '("full-boot") #f #f
(lambda (opt name arg result) (lambda (opt name arg result)
(alist-cons 'full-boot? #t result))) (alist-cons 'full-boot? #t result)))
(option '("no-graphic") #f #f
(lambda (opt name arg result)
(alist-cons 'no-graphic? #t result)))
(option '("save-provenance") #f #f (option '("save-provenance") #f #f
(lambda (opt name arg result) (lambda (opt name arg result)
(alist-cons 'save-provenance? #t result))) (alist-cons 'save-provenance? #t result)))
@ -1266,6 +1275,7 @@ resulting from command-line parsing."
#:validate-reconfigure #:validate-reconfigure
(assoc-ref opts 'validate-reconfigure) (assoc-ref opts 'validate-reconfigure)
#:full-boot? (assoc-ref opts 'full-boot?) #:full-boot? (assoc-ref opts 'full-boot?)
#:graphic? (not (assoc-ref opts 'no-graphic?))
#:container-shared-network? #:container-shared-network?
(assoc-ref opts 'container-shared-network?) (assoc-ref opts 'container-shared-network?)
#:mappings (filter-map (match-lambda #:mappings (filter-map (match-lambda