unofficial mirror of bug-guix@gnu.org 
 help / color / mirror / code / Atom feed
From: Christopher Lemmer Webber <cwebber@dustycloud.org>
Cc: 42252@debbugs.gnu.org
Subject: bug#42252: Not possible to reliably port forward with "guix system vm" anymore
Date: Tue, 07 Jul 2020 18:21:16 -0400	[thread overview]
Message-ID: <87lfjvezkz.fsf@dustycloud.org> (raw)
In-Reply-To: <87o8orf3cd.fsf@dustycloud.org>

[-- Attachment #1: Type: text/plain, Size: 418 bytes --]

Christopher Lemmer Webber writes:

> Christopher Lemmer Webber writes:
>
>>   guix system vm config.scm --hostfwd=tcp::10022-:22 --hostfwd=tcp::8888-:80
>>
>> kind of ugly, but it could work.  WDYT?
>
> Kind of uglier, but more versatile:
>
>   guix system vm config.scm --nic=user,model=virtio-net-pci,hostfwd=tcp::10022-:22,hostfwd=tcp::8888-:80

Here's a patch that implements just that.  Seems to work fine here!


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-guix-system-Add-nic-option-for-vm-subcommand.patch --]
[-- Type: text/x-patch, Size: 7676 bytes --]

From b008aad5d00fb6a87eb5a03d1849d6f52fb2307d Mon Sep 17 00:00:00 2001
From: Christopher Lemmer Webber <cwebber@dustycloud.org>
Date: Tue, 7 Jul 2020 18:13:29 -0400
Subject: [PATCH] guix system: Add --nic option for 'vm' subcommand.

This allows passing in explicit options for the qemu -nic keyword argument
for use in port forwarding, etc.

* (show-help, %options, process-action): Add and use command line
  argument of --nic for `guix system vm' and pass along appropriately.
  guix/scripts/system.scm (system-derivation-for-action):
  (perform-action): Define and use #:nic-options keyword.
* gnu/system/vm.scm (common-qemu-options)
  (system-qemu-image/shared-store-script): Likewise.
  (default-nic-options): New variable.
* doc/guix.texi (Running Guix in a VM): Use --nic argument in system vm port
  forwarding example.
---
 doc/guix.texi           |  2 +-
 gnu/system/vm.scm       | 16 ++++++++++++----
 guix/scripts/system.scm | 18 ++++++++++++++----
 3 files changed, 27 insertions(+), 9 deletions(-)

diff --git a/doc/guix.texi b/doc/guix.texi
index 992bc303bb..4e76eb832a 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -28315,7 +28315,7 @@ To enable SSH inside a VM you need to add an SSH server like
 22 by default, to the host.  You can do this with
 
 @example
-`guix system vm config.scm` -nic user,model=virtio-net-pci,hostfwd=tcp::10022-:22
+`guix system vm config.scm --nic=user,model=virtio-net-pci,hostfwd=tcp::10022-:22`
 @end example
 
 To connect to the VM you can run
diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm
index f2b6b71b4d..78f89f6568 100644
--- a/gnu/system/vm.scm
+++ b/gnu/system/vm.scm
@@ -803,7 +803,11 @@ bootloader refers to: OS kernel, initrd, bootloader data, etc."
               #:register-closures? #f
               #:copy-inputs? full-boot?))
 
-(define* (common-qemu-options image shared-fs)
+(define default-nic-options
+  "user,model=virtio-net-pci")
+
+(define* (common-qemu-options image shared-fs
+                              #:key nic-options)
   "Return the a string-value gexp with the common QEMU options to boot IMAGE,
 with '-virtfs' options for the host file systems listed in SHARED-FS."
 
@@ -819,7 +823,9 @@ with '-virtfs' options for the host file systems listed in SHARED-FS."
             '())
 
      "-no-reboot"
-     "-nic" "user,model=virtio-net-pci"
+
+     ;; Construct -nic while forwarding all --hostfwd=... options
+     "-nic" #$(or nic-options default-nic-options)
      "-object" "rng-random,filename=/dev/urandom,id=guixsd-vm-rng"
      "-device" "virtio-rng-pci,rng=guixsd-vm-rng"
 
@@ -840,7 +846,8 @@ with '-virtfs' options for the host file systems listed in SHARED-FS."
                                                 (disk-image-size
                                                  (* (if full-boot? 500 70)
                                                     (expt 2 20)))
-                                                (options '()))
+                                                (options '())
+                                                (nic-options #f))
   "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.
@@ -874,7 +881,8 @@ it is mostly useful when FULL-BOOT?  is true."
                                 (string-join #$kernel-arguments " "))))
               #$@(common-qemu-options image
                                       (map file-system-mapping-source
-                                           (cons %store-mapping mappings)))
+                                           (cons %store-mapping mappings))
+                                      #:nic-options nic-options)
               "-m " (number->string #$memory-size)
               #$@options))
 
diff --git a/guix/scripts/system.scm b/guix/scripts/system.scm
index 61eeec622b..32cea9b184 100644
--- a/guix/scripts/system.scm
+++ b/guix/scripts/system.scm
@@ -684,7 +684,7 @@ checking this by themselves in their 'check' procedure."
 (define* (system-derivation-for-action os base-image action
                                        #:key image-size file-system-type
                                        full-boot? container-shared-network?
-                                       mappings)
+                                       mappings nic-options)
   "Return as a monadic value the derivation for OS according to ACTION."
   (case action
     ((build init reconfigure)
@@ -703,7 +703,8 @@ checking this by themselves in their 'check' procedure."
                                             (if full-boot?
                                                 image-size
                                                 (* 70 (expt 2 20)))
-                                            #:mappings mappings))
+                                            #:mappings mappings
+                                            #:nic-options nic-options))
     ((disk-image)
      (lower-object
       (system-image
@@ -764,6 +765,7 @@ and TARGET arguments."
                          use-substitutes? bootloader-target target
                          image-size file-system-type full-boot?
                          container-shared-network?
+                         nic-options
                          (mappings '())
                          (gc-root #f))
   "Perform ACTION for OS.  INSTALL-BOOTLOADER? specifies whether to install
@@ -819,7 +821,8 @@ static checks."
                                                 #:image-size image-size
                                                 #:full-boot? full-boot?
                                                 #:container-shared-network? container-shared-network?
-                                                #:mappings mappings))
+                                                #:mappings mappings
+                                                #:nic-options nic-options))
 
        ;; For 'init' and 'reconfigure', always build BOOTCFG, even if
        ;; --no-bootloader is passed, because we then use it as a GC root.
@@ -965,6 +968,8 @@ Some ACTIONS support additional ARGS.\n"))
       --share=SPEC       for 'vm', share host file system according to SPEC"))
   (display (G_ "
       --expose=SPEC      for 'vm', expose host file system according to SPEC"))
+  (display (G_ "
+      --nic=NIC-OPTIONS  for 'fm', set the value passed to qemu's -nic option"))
   (display (G_ "
   -N, --network          for 'container', allow containers to access the network"))
   (display (G_ "
@@ -1014,6 +1019,10 @@ Some ACTIONS support additional ARGS.\n"))
                  (lambda (opt name arg result)
                    (alist-cons 'image-size (size->number arg)
                                result)))
+         (option '("nic") #t #f
+                 (lambda (opt name arg result)
+                   (alist-cons 'nic-options arg
+                               result)))
          (option '(#\N "network") #f #f
                  (lambda (opt name arg result)
                    (alist-cons 'container-shared-network? #t result)))
@@ -1172,7 +1181,8 @@ resulting from command-line parsing."
                                #:install-bootloader? bootloader?
                                #:target target-file
                                #:bootloader-target bootloader-target
-                               #:gc-root (assoc-ref opts 'gc-root)))))
+                               #:gc-root (assoc-ref opts 'gc-root)
+                               #:nic-options (assoc-ref opts 'nic-options)))))
           #:target target
           #:system system)))
     (warn-about-disk-space)))
-- 
2.26.2


  reply	other threads:[~2020-07-07 22:22 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-07-07 20:40 bug#42252: Not possible to reliably port forward with "guix system vm" anymore Christopher Lemmer Webber
2020-07-07 21:00 ` Christopher Lemmer Webber
2020-07-07 22:21   ` Christopher Lemmer Webber [this message]
2020-07-08  9:46 ` Bengt Richter
2020-07-11 19:49   ` Christopher Lemmer Webber
2020-07-11 21:38 ` Marius Bakke

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://guix.gnu.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87lfjvezkz.fsf@dustycloud.org \
    --to=cwebber@dustycloud.org \
    --cc=42252@debbugs.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/guix.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).