Skip to content

Commit 6e63b78

Browse files
committed
[POC] USB sharing with host
1 parent e4ede4f commit 6e63b78

File tree

7 files changed

+40
-14
lines changed

7 files changed

+40
-14
lines changed

cmd/limactl/main.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package main
22

33
import (
4-
"errors"
54
"fmt"
65
"os"
76
"path/filepath"
@@ -66,9 +65,9 @@ func newApp() *cobra.Command {
6665
formatter.ForceColors = true
6766
logrus.StandardLogger().SetFormatter(formatter)
6867
}
69-
if os.Geteuid() == 0 {
70-
return errors.New("must not run as the root")
71-
}
68+
// if os.Geteuid() == 0 {
69+
// return errors.New("must not run as the root")
70+
// }
7271
// Make sure either $HOME or $LIMA_HOME is defined, so we don't need
7372
// to check for errors later
7473
if _, err := dirnames.LimaDir(); err != nil {

examples/default.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,10 @@ hostResolver:
392392
# - 1.1.1.1
393393
# - 1.0.0.1
394394

395+
# Privileged mode enables some features that are not availble in normal mode, like USB sharing
396+
# in such mode "limectl start" will ask for root password
397+
privileged: false
398+
395399
# ===================================================================== #
396400
# GLOBAL DEFAULTS AND OVERRIDES
397401
# ===================================================================== #

go.mod

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ require (
4848
github.com/golang/protobuf v1.5.2 // indirect
4949
github.com/google/btree v1.0.1 // indirect
5050
github.com/google/gopacket v1.1.19 // indirect
51+
github.com/google/gousb v1.1.2 // indirect
5152
github.com/hashicorp/errwrap v1.1.0 // indirect
5253
github.com/inconshreveable/mousetrap v1.0.1 // indirect
5354
github.com/insomniacslk/dhcp v0.0.0-20220504074936-1ca156eafb9f // indirect
@@ -63,11 +64,11 @@ require (
6364
github.com/u-root/uio v0.0.0-20210528114334-82958018845c // indirect
6465
go.uber.org/atomic v1.7.0 // indirect
6566
go.uber.org/multierr v1.7.0 // indirect
66-
golang.org/x/crypto v0.4.0 // indirect
67+
golang.org/x/crypto v0.5.0 // indirect
6768
golang.org/x/mod v0.6.0 // indirect
68-
golang.org/x/net v0.3.0 // indirect
69-
golang.org/x/term v0.3.0 // indirect
70-
golang.org/x/text v0.5.0 // indirect
69+
golang.org/x/net v0.5.0 // indirect
70+
golang.org/x/term v0.4.0 // indirect
71+
golang.org/x/text v0.6.0 // indirect
7172
golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac // indirect
7273
golang.org/x/tools v0.2.0 // indirect
7374
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect

go.sum

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,8 @@ github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSN
291291
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
292292
github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8=
293293
github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo=
294+
github.com/google/gousb v1.1.2 h1:1BwarNB3inFTFhPgUEfah4hwOPuDz/49I0uX8XNginU=
295+
github.com/google/gousb v1.1.2/go.mod h1:GGWUkK0gAXDzxhwrzetW592aOmkkqSGcj5KLEgmCVUg=
294296
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
295297
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
296298
github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
@@ -606,6 +608,8 @@ golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0
606608
golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
607609
golang.org/x/crypto v0.4.0 h1:UVQgzMY87xqpKNgb+kDsll2Igd33HszWHFLmpaRMq/8=
608610
golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80=
611+
golang.org/x/crypto v0.5.0 h1:U/0M97KRkSFvyD/3FSmdP5W5swImpNgle/EHFhOsQPE=
612+
golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU=
609613
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
610614
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
611615
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -700,6 +704,8 @@ golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su
700704
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
701705
golang.org/x/net v0.3.0 h1:VWL6FNY2bEEmsGVKabSlHu5Irp34xmMRoqb/9lF9lxk=
702706
golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE=
707+
golang.org/x/net v0.5.0 h1:GyT4nK/YDHSqa1c4753ouYCDajOYKTja9Xb/OHtgvSw=
708+
golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws=
703709
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
704710
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
705711
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -818,6 +824,8 @@ golang.org/x/term v0.0.0-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4
818824
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
819825
golang.org/x/term v0.3.0 h1:qoo4akIqOcDME5bhc/NgxUdovd6BSS2uMsVjB56q1xI=
820826
golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA=
827+
golang.org/x/term v0.4.0 h1:O7UWfv5+A2qiuulQk30kVinPoMtoIPeVaKLEgLpVkvg=
828+
golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ=
821829
golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
822830
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
823831
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -830,6 +838,8 @@ golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
830838
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
831839
golang.org/x/text v0.5.0 h1:OLmvp0KP+FVG99Ct/qFiL/Fhk4zp4QQnZ7b2U+5piUM=
832840
golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
841+
golang.org/x/text v0.6.0 h1:3XmdazWV+ubf7QgHSTWeykHOci5oeekaGJBLkrkaw4k=
842+
golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
833843
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
834844
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
835845
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=

pkg/cidata/template.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -82,12 +82,12 @@ func ValidateTemplateArgs(args TemplateArgs) error {
8282
if err := identifiers.Validate(args.User); err != nil {
8383
return err
8484
}
85-
if args.User == "root" {
86-
return errors.New("field User must not be \"root\"")
87-
}
88-
if args.UID == 0 {
89-
return errors.New("field UID must not be 0")
90-
}
85+
// if args.User == "root" {
86+
// return errors.New("field User must not be \"root\"")
87+
// }
88+
// if args.UID == 0 {
89+
// return errors.New("field UID must not be 0")
90+
// }
9191
if len(args.SSHPubKeys) == 0 {
9292
return errors.New("field SSHPubKeys must be set")
9393
}

pkg/limayaml/limayaml.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ type LimaYAML struct {
3434
PropagateProxyEnv *bool `yaml:"propagateProxyEnv,omitempty" json:"propagateProxyEnv,omitempty"`
3535
CACertificates CACertificates `yaml:"caCerts,omitempty" json:"caCerts,omitempty"`
3636
Rosetta Rosetta `yaml:"rosetta,omitempty" json:"rosetta,omitempty"`
37+
Privileged *bool `yaml:"privileged,omitempty" json:"privileged,omitempty"`
3738
}
3839

3940
type Arch = string

pkg/qemu/qemu.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515

1616
"github.com/coreos/go-semver/semver"
1717
"github.com/docker/go-units"
18+
"github.com/google/gousb"
1819
"github.com/lima-vm/lima/pkg/fileutils"
1920
"github.com/lima-vm/lima/pkg/iso9660util"
2021
"github.com/lima-vm/lima/pkg/limayaml"
@@ -469,6 +470,16 @@ func Cmdline(cfg Config) (string, []string, error) {
469470
args = append(args, "-cdrom", filepath.Join(cfg.InstanceDir, filenames.CIDataISO))
470471
}
471472

473+
// USB
474+
ctx := gousb.NewContext()
475+
defer ctx.Close()
476+
477+
ctx.OpenDevices(func(desc *gousb.DeviceDesc) bool {
478+
args = append(args, "-device", fmt.Sprintf("nec-usb-xhci,id=usb-%s-%s", desc.Vendor, desc.Product))
479+
args = append(args, "-device", fmt.Sprintf("usb-host,bus=usb-%s-%s.0,vendorid=0x%s,productid=0x%s", desc.Vendor, desc.Product, desc.Vendor, desc.Product))
480+
return false
481+
})
482+
472483
// Kernel
473484
kernel := filepath.Join(cfg.InstanceDir, filenames.Kernel)
474485
kernelCmdline := filepath.Join(cfg.InstanceDir, filenames.KernelCmdline)

0 commit comments

Comments
 (0)