mirror of
				https://github.com/containers/podman.git
				synced 2025-10-31 01:50:50 +08:00 
			
		
		
		
	 a140c74ba4
			
		
	
	a140c74ba4
	
	
	
		
			
			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,
 | |
| 	}
 | |
| }
 |