diff options
author | Anders F Björklund <anders.f.bjorklund@gmail.com> | 2021-10-31 13:05:25 +0100 |
---|---|---|
committer | Anders F Björklund <anders.f.bjorklund@gmail.com> | 2021-12-30 13:37:34 +0100 |
commit | a3326e23d852fdcf03e7358f631ca24f5881ac70 (patch) | |
tree | 028f18b99698b0a7efe8518d2e8b01c85e9677d3 | |
parent | 8e7eeaa4dd14621bda15e396fcd7b9187bc500c5 (diff) | |
download | podman-a3326e23d852fdcf03e7358f631ca24f5881ac70.tar.gz podman-a3326e23d852fdcf03e7358f631ca24f5881ac70.tar.bz2 podman-a3326e23d852fdcf03e7358f631ca24f5881ac70.zip |
Check the mount type for future compatibility
There are other mount types available, such as NFS or SMB,
or one could use reverse sshfs for better compatibility.
It could either be a global option, or it could perhaps be
overridden for each volume (like the container volumes).
Refactor the creation of the options string or array.
Allow specifying the volume as read-only, if desired.
[NO NEW TESTS NEEDED]
Signed-off-by: Anders F Björklund <anders.f.bjorklund@gmail.com>
-rw-r--r-- | pkg/machine/qemu/config.go | 9 | ||||
-rw-r--r-- | pkg/machine/qemu/machine.go | 54 |
2 files changed, 52 insertions, 11 deletions
diff --git a/pkg/machine/qemu/config.go b/pkg/machine/qemu/config.go index 177487953..e76509bb1 100644 --- a/pkg/machine/qemu/config.go +++ b/pkg/machine/qemu/config.go @@ -36,10 +36,11 @@ type MachineVM struct { } type Mount struct { - Type string - Tag string - Source string - Target string + Type string + Tag string + Source string + Target string + ReadOnly bool } type Monitor struct { diff --git a/pkg/machine/qemu/machine.go b/pkg/machine/qemu/machine.go index 7bef4ff8e..fde520f03 100644 --- a/pkg/machine/qemu/machine.go +++ b/pkg/machine/qemu/machine.go @@ -36,6 +36,11 @@ func GetQemuProvider() machine.Provider { return qemuProvider } +const ( + VolumeTypeVirtfs = "virtfs" + MountType9p = "9p" +) + // NewMachine initializes an instance of a virtual machine based on the qemu // virtualization. func (p *Provider) NewMachine(opts machine.InitOptions) (machine.VM, error) { @@ -167,18 +172,42 @@ func (v *MachineVM) Init(opts machine.InitOptions) (bool, error) { // Add arch specific options including image location v.CmdLine = append(v.CmdLine, v.addArchOptions()...) + // TODO: add to opts + volumeType := VolumeTypeVirtfs + mounts := []Mount{} for i, volume := range opts.Volumes { tag := fmt.Sprintf("vol%d", i) - paths := strings.SplitN(volume, ":", 2) + paths := strings.SplitN(volume, ":", 3) source := paths[0] target := source + readonly := false if len(paths) > 1 { target = paths[1] } - addVirtfsOptions := []string{"-virtfs", fmt.Sprintf("local,path=%s,mount_tag=%s,security_model=mapped-xattr", source, tag)} - v.CmdLine = append(v.CmdLine, addVirtfsOptions...) - mounts = append(mounts, Mount{Type: "9p", Tag: tag, Source: source, Target: target}) + if len(paths) > 2 { + options := paths[2] + volopts := strings.Split(options, ",") + for _, o := range volopts { + switch o { + case "rw": + readonly = false + case "ro": + readonly = true + default: + fmt.Printf("Unknown option: %s\n", o) + } + } + } + switch volumeType { + case VolumeTypeVirtfs: + virtfsOptions := fmt.Sprintf("local,path=%s,mount_tag=%s,security_model=mapped-xattr", source, tag) + if readonly { + virtfsOptions += ",readonly" + } + v.CmdLine = append(v.CmdLine, []string{"-virtfs", virtfsOptions}...) + mounts = append(mounts, Mount{Type: MountType9p, Tag: tag, Source: source, Target: target, ReadOnly: readonly}) + } } v.Mounts = mounts @@ -360,9 +389,20 @@ func (v *MachineVM) Start(name string, _ machine.StartOptions) error { if err != nil { return err } - err = v.SSH(name, machine.SSHOptions{Args: []string{"-q", "--", "sudo", "mount", "-t", mount.Type, "-o", "trans=virtio", mount.Tag, mount.Target, "-o", "version=9p2000.L,msize=131072"}}) - if err != nil { - return err + switch mount.Type { + case MountType9p: + mountOptions := []string{"-t", "9p"} + mountOptions = append(mountOptions, []string{"-o", "trans=virtio", mount.Tag, mount.Target}...) + mountOptions = append(mountOptions, []string{"-o", "version=9p2000.L,msize=131072"}...) + if mount.ReadOnly { + mountOptions = append(mountOptions, []string{"-o", "ro"}...) + } + err = v.SSH(name, machine.SSHOptions{Args: append([]string{"-q", "--", "sudo", "mount"}, mountOptions...)}) + if err != nil { + return err + } + default: + return fmt.Errorf("unknown mount type: %s", mount.Type) } } return nil |