Skip to content

Commit 3a8d64a

Browse files
committed
9p: hvsock support
1 parent eff3c6e commit 3a8d64a

File tree

7 files changed

+92
-12
lines changed

7 files changed

+92
-12
lines changed

cmd/crc/cmd/daemon.go

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -252,25 +252,49 @@ func run(configuration *types.Configuration) error {
252252

253253
// 9p home directory sharing
254254
if runtime.GOOS == "windows" && config.Get(crcConfig.EnableSharedDirs).AsBool() {
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 {
264265
return err
265266
}
266267
defer func() {
267-
if err := server9p.Stop(); err != nil {
268-
logging.Warnf("error stopping 9p server: %v", err)
268+
if err := server9pHvsock.Stop(); err != nil {
269+
logging.Warnf("error stopping 9p server (hvsock): %v", err)
269270
}
270271
}()
271272
go func() {
272-
if err := server9p.WaitForError(); err != nil {
273-
logging.Errorf("9p server error: %v", err)
273+
if err := server9pHvsock.WaitForError(); err != nil {
274+
logging.Errorf("9p server (hvsock) error: %v", err)
275+
}
276+
}()
277+
278+
// 9p over TCP (as a backup)
279+
listener9pTCP, err := vn.Listen("tcp", net.JoinHostPort(configuration.GatewayIP, fmt.Sprintf("%d", constants.Plan9TcpPort)))
280+
if err != nil {
281+
return err
282+
}
283+
server9pTCP, err := fs9p.New9pServer(listener9pTCP, constants.GetHomeDir())
284+
if err != nil {
285+
return err
286+
}
287+
if err := server9pTCP.Start(); err != nil {
288+
return err
289+
}
290+
defer func() {
291+
if err := server9pTCP.Stop(); err != nil {
292+
logging.Warnf("error stopping 9p server (tcp): %v", err)
293+
}
294+
}()
295+
go func() {
296+
if err := server9pTCP.WaitForError(); err != nil {
297+
logging.Errorf("9p server (tcp) error: %v", err)
274298
}
275299
}()
276300
}

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ require (
2828
github.com/klauspost/compress v1.18.1
2929
github.com/klauspost/cpuid/v2 v2.3.0
3030
github.com/kofalt/go-memoize v0.0.0-20220914132407-0b5d6a304579
31+
github.com/linuxkit/virtsock v0.0.0-20220523201153-1a23e78aa7a2
3132
github.com/mattn/go-colorable v0.1.14
3233
github.com/mdlayher/vsock v1.2.1
3334
github.com/onsi/ginkgo/v2 v2.27.2
@@ -131,7 +132,6 @@ require (
131132
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect
132133
github.com/klauspost/pgzip v1.2.6 // indirect
133134
github.com/letsencrypt/boulder v0.0.0-20240620165639-de9c06129bec // indirect
134-
github.com/linuxkit/virtsock v0.0.0-20220523201153-1a23e78aa7a2 // indirect
135135
github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683 // indirect
136136
github.com/mailru/easyjson v0.7.7 // indirect
137137
github.com/mattn/go-isatty v0.0.20 // indirect

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", constants.VSockGateway, mount.Target); err != nil {
268-
return err
267+
if _, _, err := sshRunner.Run("9pfs -V -p", fmt.Sprintf("%d", constants.Plan9HvsockPort), "2", 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", constants.VSockGateway, 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)