Skip to content

Commit 9295e3f

Browse files
author
dlorenc
committed
Merge branch 'hyperkit-mount-fix' of github.com:mo-hit/minikube into mo-hit-hyperkit-mount-fix
2 parents ee00eda + e725337 commit 9295e3f

File tree

14 files changed

+2307
-348
lines changed

14 files changed

+2307
-348
lines changed

Godeps/Godeps.json

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cmd/minikube/cmd/start.go

+6
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ const (
5252
humanReadableDiskSize = "disk-size"
5353
vmDriver = "vm-driver"
5454
xhyveDiskDriver = "xhyve-disk-driver"
55+
NFSSharesRoot = "nfs-shares-root"
56+
NFSShare = "nfs-share"
5557
kubernetesVersion = "kubernetes-version"
5658
hostOnlyCIDR = "host-only-cidr"
5759
containerRuntime = "container-runtime"
@@ -130,6 +132,8 @@ func runStart(cmd *cobra.Command, args []string) {
130132
DiskSize: diskSizeMB,
131133
VMDriver: viper.GetString(vmDriver),
132134
XhyveDiskDriver: viper.GetString(xhyveDiskDriver),
135+
NFSShare: viper.GetStringSlice(NFSShare),
136+
NFSSharesRoot: viper.GetString(NFSSharesRoot),
133137
DockerEnv: dockerEnv,
134138
DockerOpt: dockerOpt,
135139
InsecureRegistry: insecureRegistry,
@@ -367,6 +371,8 @@ func init() {
367371
startCmd.Flags().String(hypervVirtualSwitch, "", "The hyperv virtual switch name. Defaults to first found. (only supported with HyperV driver)")
368372
startCmd.Flags().String(kvmNetwork, "default", "The KVM network name. (only supported with KVM driver)")
369373
startCmd.Flags().String(xhyveDiskDriver, "ahci-hd", "The disk driver to use [ahci-hd|virtio-blk] (only supported with xhyve driver)")
374+
startCmd.Flags().StringSlice(NFSShare, []string{}, "Local folders to share with Guest via NFS mounts")
375+
startCmd.Flags().String(NFSSharesRoot, "/nfsshares", "Where to root the NFS Shares (defaults to /nfsshares)")
370376
startCmd.Flags().StringArrayVar(&dockerEnv, "docker-env", nil, "Environment variables to pass to the Docker daemon. (format: key=value)")
371377
startCmd.Flags().StringArrayVar(&dockerOpt, "docker-opt", nil, "Specify arbitrary flags to pass to the Docker daemon. (format: key=value)")
372378
startCmd.Flags().String(apiServerName, constants.APIServerName, "The apiserver name which is used in the generated certificate for localkube/kubernetes. This can be used if you want to make the apiserver available from outside the machine")

pkg/drivers/hyperkit/driver.go

+68
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,17 @@ import (
2222
"encoding/json"
2323
"fmt"
2424
"os"
25+
"os/user"
26+
"path"
2527
"path/filepath"
28+
"strings"
2629
"syscall"
2730
"time"
2831

2932
"github.com/docker/machine/libmachine/drivers"
3033
"github.com/docker/machine/libmachine/log"
3134
"github.com/docker/machine/libmachine/state"
35+
nfsexports "github.com/johanneswuerbach/nfsexports"
3236
hyperkit "github.com/moby/hyperkit/go"
3337
"github.com/pborman/uuid"
3438
"github.com/pkg/errors"
@@ -53,6 +57,8 @@ type Driver struct {
5357
CPU int
5458
Memory int
5559
Cmdline string
60+
NFSShares []string
61+
NFSSharesRoot string
5662
}
5763

5864
func NewDriver(hostName, storePath string) *Driver {
@@ -207,6 +213,18 @@ func (d *Driver) Start() error {
207213
if err := commonutil.RetryAfter(30, getIP, 2*time.Second); err != nil {
208214
return fmt.Errorf("IP address never found in dhcp leases file %v", err)
209215
}
216+
217+
if len(d.NFSShares) > 0 {
218+
log.Info("Setting up NFS mounts")
219+
// takes some time here for ssh / nfsd to work properly
220+
time.Sleep(time.Second * 30)
221+
err = d.setupNFSShare()
222+
if err != nil {
223+
log.Errorf("NFS setup failed: %s", err.Error())
224+
return err
225+
}
226+
}
227+
210228
return nil
211229
}
212230

@@ -232,6 +250,56 @@ func (d *Driver) extractKernel(isoPath string) error {
232250
return nil
233251
}
234252

253+
func (d *Driver) setupNFSShare() error {
254+
user, err := user.Current()
255+
if err != nil {
256+
return err
257+
}
258+
259+
hostIP, err := GetNetAddr()
260+
if err != nil {
261+
return err
262+
}
263+
264+
mountCommands := fmt.Sprintf("#/bin/bash\\n")
265+
log.Info(d.IPAddress)
266+
267+
for _, share := range d.NFSShares {
268+
if !path.IsAbs(share) {
269+
share = d.ResolveStorePath(share)
270+
}
271+
nfsConfig := fmt.Sprintf("%s %s -alldirs -mapall=%s", share, d.IPAddress, user.Username)
272+
273+
if _, err := nfsexports.Add("", d.nfsExportIdentifier(share), nfsConfig); err != nil {
274+
if strings.Contains(err.Error(), "conflicts with existing export") {
275+
log.Info("Conflicting NFS Share not setup and ignored:", err)
276+
continue
277+
}
278+
return err
279+
}
280+
281+
root := d.NFSSharesRoot
282+
mountCommands += fmt.Sprintf("sudo mkdir -p %s/%s\\n", root, share)
283+
mountCommands += fmt.Sprintf("sudo mount -t nfs -o noacl,async %s:%s %s/%s\\n", hostIP, share, root, share)
284+
}
285+
286+
if err := nfsexports.ReloadDaemon(); err != nil {
287+
return err
288+
}
289+
290+
writeScriptCmd := fmt.Sprintf("echo -e \"%s\" | sh", mountCommands)
291+
292+
if _, err := drivers.RunSSHCommandFromDriver(d, writeScriptCmd); err != nil {
293+
return err
294+
}
295+
296+
return nil
297+
}
298+
299+
func (d *Driver) nfsExportIdentifier(path string) string {
300+
return fmt.Sprintf("docker-machine-driver-hyperkit %s-%s", d.MachineName, path)
301+
}
302+
235303
func (d *Driver) sendSignal(s os.Signal) error {
236304
pid := d.getPid()
237305
proc, err := os.FindProcess(pid)

pkg/drivers/hyperkit/vmnet.go

+31-1
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,38 @@ limitations under the License.
1818

1919
package hyperkit
2020

21-
import vmnet "github.com/zchee/go-vmnet"
21+
import (
22+
"fmt"
23+
"net"
24+
"os"
25+
"os/exec"
26+
"strings"
27+
28+
vmnet "github.com/zchee/go-vmnet"
29+
)
30+
31+
const (
32+
CONFIG_PLIST = "/Library/Preferences/SystemConfiguration/com.apple.vmnet"
33+
NET_ADDR_KEY = "Shared_Net_Address"
34+
)
2235

2336
func GetMACAddressFromUUID(UUID string) (string, error) {
2437
return vmnet.GetMACAddressFromUUID(UUID)
2538
}
39+
40+
func GetNetAddr() (net.IP, error) {
41+
_, err := os.Stat(CONFIG_PLIST + ".plist")
42+
if err != nil {
43+
return nil, fmt.Errorf("Does not exist %s", CONFIG_PLIST+".plist")
44+
}
45+
46+
out, err := exec.Command("defaults", "read", CONFIG_PLIST, NET_ADDR_KEY).Output()
47+
if err != nil {
48+
return nil, err
49+
}
50+
ip := net.ParseIP(strings.TrimSpace(string(out)))
51+
if ip == nil {
52+
return nil, fmt.Errorf("Could not get the network address for vmnet")
53+
}
54+
return ip, nil
55+
}

pkg/minikube/cluster/cluster_darwin.go

+2
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ func createHyperkitHost(config MachineConfig) *hyperkit.Driver {
6969
DiskSize: config.DiskSize,
7070
Memory: config.Memory,
7171
CPU: config.CPUs,
72+
NFSShares: config.NFSShare,
73+
NFSSharesRoot: config.NFSSharesRoot,
7274
Cmdline: "loglevel=3 user=docker console=ttyS0 console=tty0 noembed nomodeset norestore waitusb=10 systemd.legacy_systemd_cgroup_controller=yes base host=" + cfg.GetMachineName(),
7375
}
7476
}

pkg/minikube/cluster/types.go

+2
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ type MachineConfig struct {
3838
Downloader util.ISODownloader `json:"-"`
3939
DockerOpt []string // Each entry is formatted as KEY=VALUE.
4040
DisableDriverMounts bool // Only used by virtualbox and xhyve
41+
NFSShare []string
42+
NFSSharesRoot string
4143
}
4244

4345
// Config contains machine and k8s config

vendor/github.com/docker/machine/libmachine/drivers/utils.go

+2-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)