Skip to content

Commit 3152e7b

Browse files
committed
9p: hvsock support
1 parent 9d23c41 commit 3152e7b

File tree

6 files changed

+77
-7
lines changed

6 files changed

+77
-7
lines changed

cmd/crc/cmd/daemon.go

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -252,15 +252,29 @@ func run(configuration *types.Configuration) error {
252252

253253
// 9p home directory sharing
254254
if runtime.GOOS == "windows" {
255-
listener9p, err := vn.Listen("tcp", net.JoinHostPort(configuration.GatewayIP, fmt.Sprintf("%d", constants.Plan9TcpPort)))
255+
// 9p over hvsock
256+
listener9pHvsock, err := fs9p.GetHvsockListener(constants.Plan9HvsockGUID)
256257
if err != nil {
257258
return err
258259
}
259-
server9p, err := fs9p.New9pServer(listener9p, constants.GetHomeDir())
260+
server9pHvsock, err := fs9p.New9pServer(listener9pHvsock, constants.GetHomeDir())
260261
if err != nil {
261262
return err
262263
}
263-
if err := server9p.Start(); err != nil {
264+
if err := server9pHvsock.Start(); err != nil {
265+
return err
266+
}
267+
268+
// 9p over TCP (as a backup)
269+
listener9pTcp, err := vn.Listen("tcp", net.JoinHostPort(configuration.GatewayIP, fmt.Sprintf("%d", constants.Plan9TcpPort)))
270+
if err != nil {
271+
return err
272+
}
273+
server9pTcp, err := fs9p.New9pServer(listener9pTcp, constants.GetHomeDir())
274+
if err != nil {
275+
return err
276+
}
277+
if err := server9pTcp.Start(); err != nil {
264278
return err
265279
}
266280
}

packaging/windows/product.wxs.template

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,11 @@
7272
<RegistryValue Type="string" Name="ElementName" Value="gvisor-tap-vsock" KeyPath="yes"/>
7373
</RegistryKey>
7474
</Component>
75+
<Component Id="Hvsock9pRegistryEntry" Guid="*">
76+
<RegistryKey Root="HKLM" Key="Software\Microsoft\Windows NT\CurrentVersion\Virtualization\GuestCommunicationServices\00009000-FACB-11E6-BD58-64006A7986D3">
77+
<RegistryValue Type="string" Name="ElementName" Value="fs9p-hvsock" KeyPath="yes"/>
78+
</RegistryKey>
79+
</Component>
7580
</Directory>
7681
</Directory>
7782
</Directory>
@@ -130,6 +135,7 @@
130135
<ComponentRef Id="AddToPath"/>
131136
<ComponentRef Id="AddUserToCrcUsers" />
132137
<ComponentRef Id="VsockRegistryEntry" />
138+
<ComponentRef Id="Hvsock9pRegistryEntry" />
133139
</Feature>
134140
<UI>
135141
<UIRef Id="WixUI_ErrorProgressText"/>

pkg/crc/constants/constants.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,10 @@ const (
5656

5757
BackgroundLauncherExecutable = "crc-background-launcher.exe"
5858

59-
Plan9Msize = 1024 * 1024
60-
Plan9TcpPort = 564
59+
Plan9Msize = 1024 * 1024
60+
Plan9TcpPort = 564
61+
Plan9HvsockGUID = "00009000-FACB-11E6-BD58-64006A7986D3"
62+
Plan9HvsockPort = 36864
6163
)
6264

6365
var adminHelperExecutableForOs = map[string]string{

pkg/crc/machine/start.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -264,8 +264,12 @@ func configureSharedDirs(vm *virtualMachine, sshRunner *crcssh.Runner) error {
264264
if _, _, err := sshRunner.RunPrivileged("Changing owner of mount directory", "chown core:core", mount.Target); err != nil {
265265
return err
266266
}
267-
if _, _, err := sshRunner.Run("9pfs 192.168.127.1", mount.Target); err != nil {
268-
return err
267+
if _, _, err := sshRunner.Run("9pfs -V -p", fmt.Sprintf("%d", constants.Plan9HvsockPort), mount.Target); err != nil {
268+
logging.Warnf("Failed to connect to 9p server over hvsock: %v", err)
269+
logging.Warnf("Falling back to 9p over TCP")
270+
if _, _, err := sshRunner.Run("9pfs 192.168.127.1", mount.Target); err != nil {
271+
return err
272+
}
269273
}
270274

271275
default:
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
//go:build !windows
2+
3+
package fs9p
4+
5+
import (
6+
"fmt"
7+
"net"
8+
"runtime"
9+
)
10+
11+
// GetHvsockListener returns a net.Listener listening on the specified hvsock.
12+
// The used hvsock must already be defined before this function is called.
13+
func GetHvsockListener(hvsockGuid string) (net.Listener, error) {
14+
return nil, fmt.Errorf("GetHvsockListener() not implemented on %s", runtime.GOOS)
15+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
//go:build windows
2+
3+
package fs9p
4+
5+
import (
6+
"fmt"
7+
"net"
8+
9+
"github.com/linuxkit/virtsock/pkg/hvsock"
10+
)
11+
12+
// GetHvsockListener returns a net.Listener listening on the specified hvsock.
13+
// The used hvsock must already be defined before this function is called.
14+
func GetHvsockListener(hvsockGuid string) (net.Listener, error) {
15+
service, err := hvsock.GUIDFromString(hvsockGuid)
16+
if err != nil {
17+
return nil, fmt.Errorf("parsing hvsock guid %s: %w", hvsockGuid, err)
18+
}
19+
20+
listener, err := hvsock.Listen(hvsock.Addr{
21+
VMID: hvsock.GUIDWildcard,
22+
ServiceID: service,
23+
})
24+
if err != nil {
25+
return nil, fmt.Errorf("retrieving listener for hvsock %s: %w", hvsockGuid, err)
26+
}
27+
28+
return listener, nil
29+
}

0 commit comments

Comments
 (0)