~ruther/guix-local

b42bfbdfe55eea56234a91c33ef12b9fe198766d — Attila Lendvai 4 years ago 5a18cf3
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>
3 files changed, 31 insertions(+), 4 deletions(-)

M doc/guix.texi
M gnu/system/vm.scm
M guix/scripts/system.scm
M doc/guix.texi => doc/guix.texi +19 -4
@@ 34506,8 34506,8 @@ passed.
@cindex virtual machine
@cindex VM
@anchor{guix system vm}
Build a virtual machine that contains the operating system declared in
@var{file}, and return a script to run that virtual machine (VM).
Build a virtual machine (VM) that contains the operating system declared
in @var{file}, and return a script to run that VM.

@quotation Note
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
@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.

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
with the bootloader.  This requires more disk space since a root image
containing at least the kernel, initrd, and bootloader data files must
be created.  The @option{--image-size} option can be used to specify the
size of the image.
be created.

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 Creating system images in various formats

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

M guix/scripts/system.scm => guix/scripts/system.scm +10 -0
@@ 689,6 689,7 @@ checking this by themselves in their 'check' procedure."
(define* (system-derivation-for-action image action
                                       #:key
                                       full-boot?
                                       (graphic? #t)
                                       container-shared-network?
                                       mappings)
  "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)
       (system-qemu-image/shared-store-script os
                                              #:full-boot? full-boot?
                                              #:graphic? graphic?
                                              #:disk-image-size
                                              (if full-boot?
                                                  image-size


@@ 772,6 774,7 @@ and TARGET arguments."
                         dry-run? derivations-only?
                         use-substitutes? target
                         full-boot?
                         (graphic? #t)
                         container-shared-network?
                         (mappings '())
                         (gc-root #f))


@@ 825,6 828,7 @@ static checks."
  (mlet* %store-monad
      ((sys       (system-derivation-for-action image action
                                                #:full-boot? full-boot?
                                                #:graphic? graphic?
                                                #:container-shared-network? container-shared-network?
                                                #:mappings mappings))



@@ 1013,6 1017,8 @@ Some ACTIONS support additional ARGS.\n"))
  (display (G_ "
      --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_ "
      --skip-checks      skip file system and initrd module safety checks"))
  (display (G_ "
      --target=TRIPLET   cross-build for TRIPLET--e.g., \"armel-linux-gnu\""))


@@ 1081,6 1087,9 @@ Some ACTIONS support additional ARGS.\n"))
         (option '("full-boot") #f #f
                 (lambda (opt name arg 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
                 (lambda (opt name arg result)
                   (alist-cons 'save-provenance? #t result)))


@@ 1266,6 1275,7 @@ resulting from command-line parsing."
                               #:validate-reconfigure
                               (assoc-ref opts 'validate-reconfigure)
                               #:full-boot? (assoc-ref opts 'full-boot?)
                               #:graphic? (not (assoc-ref opts 'no-graphic?))
                               #:container-shared-network?
                               (assoc-ref opts 'container-shared-network?)
                               #:mappings (filter-map (match-lambda