mirror of
https://github.com/containers/podman.git
synced 2025-06-20 09:03:43 +08:00

AppleHV accepts a max 36 bytes for mount tags. Instead of using the fully qualified path for the mount tag, SHA256 the path, and truncate the shasum to 36 bytes. Also correctly escape dashes in mounted paths. Signed-off-by: Ashley Cui <acui@redhat.com>
74 lines
1.5 KiB
Go
74 lines
1.5 KiB
Go
package machine
|
|
|
|
import (
|
|
"crypto/sha256"
|
|
"encoding/hex"
|
|
|
|
"github.com/containers/podman/v5/pkg/machine/vmconfigs"
|
|
)
|
|
|
|
type Volume interface {
|
|
Kind() VolumeKind
|
|
}
|
|
|
|
type VolumeKind string
|
|
|
|
var (
|
|
VirtIOFsVk VolumeKind = "virtiofs"
|
|
NinePVk VolumeKind = "9p"
|
|
)
|
|
|
|
type VirtIoFs struct {
|
|
VolumeKind
|
|
ReadOnly bool
|
|
Source string
|
|
Tag string
|
|
Target string
|
|
}
|
|
|
|
func (v VirtIoFs) Kind() string {
|
|
return string(VirtIOFsVk)
|
|
}
|
|
|
|
// generateTag generates a tag for VirtIOFs mounts.
|
|
// AppleHV requires tags to be 36 bytes or fewer.
|
|
// SHA256 the path, then truncate to 36 bytes
|
|
func (v VirtIoFs) generateTag() string {
|
|
sum := sha256.Sum256([]byte(v.Target))
|
|
stringSum := hex.EncodeToString(sum[:])
|
|
return stringSum[:36]
|
|
}
|
|
|
|
func (v VirtIoFs) ToMount() vmconfigs.Mount {
|
|
return vmconfigs.Mount{
|
|
ReadOnly: v.ReadOnly,
|
|
Source: v.Source,
|
|
Tag: v.Tag,
|
|
Target: v.Target,
|
|
Type: v.Kind(),
|
|
}
|
|
}
|
|
|
|
// NewVirtIoFsMount describes a machine volume mount for virtio-fs. With virtio-fs
|
|
// the source/target are described as a "shared dir". With this style of volume mount
|
|
// the Tag is used as the descriptor value for the mount (in Linux).
|
|
func NewVirtIoFsMount(src, target string, readOnly bool) VirtIoFs {
|
|
vfs := VirtIoFs{
|
|
ReadOnly: readOnly,
|
|
Source: src,
|
|
Target: target,
|
|
}
|
|
vfs.Tag = vfs.generateTag()
|
|
return vfs
|
|
}
|
|
|
|
func MountToVirtIOFs(mnt *vmconfigs.Mount) VirtIoFs {
|
|
return VirtIoFs{
|
|
VolumeKind: VirtIOFsVk,
|
|
ReadOnly: mnt.ReadOnly,
|
|
Source: mnt.Source,
|
|
Tag: mnt.Tag,
|
|
Target: mnt.Target,
|
|
}
|
|
}
|