mirror of
https://github.com/containers/podman.git
synced 2025-11-01 19:21:04 +08:00
This PR adds libkrun support to podman machine. This is an experimental feature and should not be marketed yet. Before we unmark the experimental status on this function, we will need to have full CI support and a full podman point release has pased. This work relies on the fact that vfkit and libkrun share a reasonably (if not perfectly) same API. The --log-level debug option will not show a GUI screen for boots as krun is not capable of this. Signed-off-by: Brent Baude <bbaude@redhat.com>
134 lines
4.0 KiB
Go
134 lines
4.0 KiB
Go
//go:build darwin
|
|
|
|
package applehv
|
|
|
|
import (
|
|
"fmt"
|
|
"strconv"
|
|
|
|
gvproxy "github.com/containers/gvisor-tap-vsock/pkg/types"
|
|
"github.com/containers/podman/v5/pkg/machine"
|
|
"github.com/containers/podman/v5/pkg/machine/apple"
|
|
"github.com/containers/podman/v5/pkg/machine/apple/vfkit"
|
|
"github.com/containers/podman/v5/pkg/machine/define"
|
|
"github.com/containers/podman/v5/pkg/machine/ignition"
|
|
"github.com/containers/podman/v5/pkg/machine/shim/diskpull"
|
|
"github.com/containers/podman/v5/pkg/machine/vmconfigs"
|
|
"github.com/containers/podman/v5/utils"
|
|
vfConfig "github.com/crc-org/vfkit/pkg/config"
|
|
)
|
|
|
|
// applehcMACAddress is a pre-defined mac address that vfkit recognizes
|
|
// and is required for network flow
|
|
|
|
var (
|
|
vfkitCommand = "vfkit"
|
|
)
|
|
|
|
type AppleHVStubber struct {
|
|
vmconfigs.AppleHVConfig
|
|
}
|
|
|
|
func (a AppleHVStubber) UserModeNetworkEnabled(_ *vmconfigs.MachineConfig) bool {
|
|
return true
|
|
}
|
|
|
|
func (a AppleHVStubber) UseProviderNetworkSetup() bool {
|
|
return false
|
|
}
|
|
|
|
func (a AppleHVStubber) RequireExclusiveActive() bool {
|
|
return true
|
|
}
|
|
|
|
func (a AppleHVStubber) CreateVM(opts define.CreateVMOpts, mc *vmconfigs.MachineConfig, ignBuilder *ignition.IgnitionBuilder) error {
|
|
mc.AppleHypervisor = new(vmconfigs.AppleHVConfig)
|
|
mc.AppleHypervisor.Vfkit = vfkit.Helper{}
|
|
bl := vfConfig.NewEFIBootloader(fmt.Sprintf("%s/efi-bl-%s", opts.Dirs.DataDir.GetPath(), opts.Name), true)
|
|
mc.AppleHypervisor.Vfkit.VirtualMachine = vfConfig.NewVirtualMachine(uint(mc.Resources.CPUs), uint64(mc.Resources.Memory), bl)
|
|
|
|
randPort, err := utils.GetRandomPort()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
mc.AppleHypervisor.Vfkit.Endpoint = localhostURI + ":" + strconv.Itoa(randPort)
|
|
|
|
virtiofsMounts := make([]machine.VirtIoFs, 0, len(mc.Mounts))
|
|
for _, mnt := range mc.Mounts {
|
|
virtiofsMounts = append(virtiofsMounts, machine.MountToVirtIOFs(mnt))
|
|
}
|
|
|
|
// Populate the ignition file with virtiofs stuff
|
|
virtIOIgnitionMounts, err := apple.GenerateSystemDFilesForVirtiofsMounts(virtiofsMounts)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
ignBuilder.WithUnit(virtIOIgnitionMounts...)
|
|
|
|
return apple.ResizeDisk(mc, mc.Resources.DiskSize)
|
|
}
|
|
|
|
func (a AppleHVStubber) Exists(name string) (bool, error) {
|
|
// not applicable for applehv
|
|
return false, nil
|
|
}
|
|
|
|
func (a AppleHVStubber) MountType() vmconfigs.VolumeMountType {
|
|
return vmconfigs.VirtIOFS
|
|
}
|
|
|
|
func (a AppleHVStubber) MountVolumesToVM(_ *vmconfigs.MachineConfig, _ bool) error {
|
|
// virtiofs: nothing to do here
|
|
return nil
|
|
}
|
|
|
|
func (a AppleHVStubber) RemoveAndCleanMachines(_ *define.MachineDirs) error {
|
|
return nil
|
|
}
|
|
|
|
func (a AppleHVStubber) SetProviderAttrs(mc *vmconfigs.MachineConfig, opts define.SetOptions) error {
|
|
state, err := a.State(mc, false)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return apple.SetProviderAttrs(mc, opts, state)
|
|
}
|
|
|
|
func (a AppleHVStubber) StartNetworking(mc *vmconfigs.MachineConfig, cmd *gvproxy.GvproxyCommand) error {
|
|
return apple.StartGenericNetworking(mc, cmd)
|
|
}
|
|
|
|
func (a AppleHVStubber) StartVM(mc *vmconfigs.MachineConfig) (func() error, func() error, error) {
|
|
bl := mc.AppleHypervisor.Vfkit.VirtualMachine.Bootloader
|
|
if bl == nil {
|
|
return nil, nil, fmt.Errorf("unable to determine boot loader for this machine")
|
|
}
|
|
|
|
return apple.StartGenericAppleVM(mc, vfkitCommand, bl, mc.AppleHypervisor.Vfkit.Endpoint)
|
|
}
|
|
|
|
func (a AppleHVStubber) StopHostNetworking(_ *vmconfigs.MachineConfig, _ define.VMType) error {
|
|
return nil
|
|
}
|
|
|
|
func (a AppleHVStubber) UpdateSSHPort(mc *vmconfigs.MachineConfig, port int) error {
|
|
// managed by gvproxy on this backend, so nothing to do
|
|
return nil
|
|
}
|
|
|
|
func (a AppleHVStubber) VMType() define.VMType {
|
|
return define.AppleHvVirt
|
|
}
|
|
|
|
func (a AppleHVStubber) PrepareIgnition(_ *vmconfigs.MachineConfig, _ *ignition.IgnitionBuilder) (*ignition.ReadyUnitOpts, error) {
|
|
return nil, nil
|
|
}
|
|
|
|
func (a AppleHVStubber) PostStartNetworking(mc *vmconfigs.MachineConfig, noInfo bool) error {
|
|
return nil
|
|
}
|
|
|
|
func (a AppleHVStubber) GetDisk(userInputPath string, dirs *define.MachineDirs, mc *vmconfigs.MachineConfig) error {
|
|
return diskpull.GetDisk(userInputPath, dirs, mc.ImagePath, a.VMType(), mc.Name)
|
|
}
|