Skip to content

Commit

Permalink
qemu: use 9p by default
Browse files Browse the repository at this point in the history
Templates for the following distro are updated to continue using reverse-sshfs,
as 9p is not available on them.
- AlmaLinux
- CentOS Stream
- Debian
- openSUSE
- Oracle Linux
- Rocky Linux

Close issue 971

Signed-off-by: Akihiro Suda <[email protected]>
  • Loading branch information
AkihiroSuda committed Oct 4, 2024
1 parent fd26375 commit 47565ec
Show file tree
Hide file tree
Showing 18 changed files with 112 additions and 33 deletions.
1 change: 1 addition & 0 deletions examples/almalinux-8.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ images:
arch: "x86_64"
- location: "https://repo.almalinux.org/almalinux/8/cloud/aarch64/images/AlmaLinux-8-GenericCloud-latest.aarch64.qcow2"
arch: "aarch64"
mountTypesUnsupported: ["9p"]
mounts:
- location: "~"
- location: "/tmp/lima"
Expand Down
1 change: 1 addition & 0 deletions examples/almalinux-9.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ images:
arch: "x86_64"
- location: "https://repo.almalinux.org/almalinux/9/cloud/aarch64/images/AlmaLinux-9-GenericCloud-latest.aarch64.qcow2"
arch: "aarch64"
mountTypesUnsupported: ["9p"]
mounts:
- location: "~"
- location: "/tmp/lima"
Expand Down
1 change: 1 addition & 0 deletions examples/centos-stream-9.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ images:
arch: "x86_64"
- location: "https://cloud.centos.org/centos/9-stream/aarch64/images/CentOS-Stream-GenericCloud-9-latest.aarch64.qcow2"
arch: "aarch64"
mountTypesUnsupported: ["9p"]
mounts:
- location: "~"
- location: "/tmp/lima"
Expand Down
2 changes: 1 addition & 1 deletion examples/debian-11.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ images:
arch: "x86_64"
- location: "https://cloud.debian.org/images/cloud/bullseye/latest/debian-11-genericcloud-arm64.qcow2"
arch: "aarch64"

mountTypesUnsupported: ["9p"]
mounts:
- location: "~"
- location: "/tmp/lima"
Expand Down
2 changes: 1 addition & 1 deletion examples/debian-12.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ images:
arch: "x86_64"
- location: "https://cloud.debian.org/images/cloud/bookworm/latest/debian-12-genericcloud-arm64.qcow2"
arch: "aarch64"

mountTypesUnsupported: ["9p"]
mounts:
- location: "~"
- location: "/tmp/lima"
Expand Down
6 changes: 5 additions & 1 deletion examples/default.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -111,9 +111,13 @@ mounts:
# 🔵 This file: true (only for "/tmp/lima")
writable: true

# Deny list of mount types for resolving the "default" type.
# 🟢 Builtin default: null
mountTypesUnsupported: null

# Mount type for above mounts, such as "reverse-sshfs" (from sshocker), "9p" (EXPERIMENTAL until Lima v1.0, from QEMU’s virtio-9p-pci, aka virtfs),
# or "virtiofs" (EXPERIMENTAL, needs `vmType: vz`; will graduate from experimental in Lima v1.0)
# 🟢 Builtin default: "reverse-sshfs" (for QEMU), "virtiofs" (for vz)
# 🟢 Builtin default: "default" (resolved to be "9p" for QEMU since Lima v1.0, "virtiofs" for vz)
mountType: null

# Enable inotify support for mounted directories (EXPERIMENTAL)
Expand Down
1 change: 1 addition & 0 deletions examples/experimental/opensuse-tumbleweed.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ images:
arch: "x86_64"
- location: "https://download.opensuse.org/ports/aarch64/tumbleweed/appliances/openSUSE-Tumbleweed-Minimal-VM.aarch64-Cloud.qcow2"
arch: "aarch64"
mountTypesUnsupported: ["9p"]
mounts:
- location: "~"
- location: "/tmp/lima"
Expand Down
1 change: 1 addition & 0 deletions examples/opensuse-leap.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ images:
arch: "x86_64"
- location: "https://download.opensuse.org/distribution/leap/15.6/appliances/openSUSE-Leap-15.6-Minimal-VM.aarch64-Cloud.qcow2"
arch: "aarch64"
mountTypesUnsupported: ["9p"]
mounts:
- location: "~"
- location: "/tmp/lima"
Expand Down
1 change: 1 addition & 0 deletions examples/oraclelinux-8.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ images:
- location: "https://yum.oracle.com/templates/OracleLinux/OL8/u10/aarch64/OL8U10_aarch64-kvm-cloud-b100.qcow2"
arch: "aarch64"
digest: "sha256:def7b8055e275507a593f07dc6076a2adc5967af046c003072b479e69f25f407"
mountTypesUnsupported: ["9p"]
mounts:
- location: "~"
- location: "/tmp/lima"
Expand Down
1 change: 1 addition & 0 deletions examples/oraclelinux-9.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ images:
- location: "https://yum.oracle.com/templates/OracleLinux/OL9/u4/aarch64/OL9U4_aarch64-kvm-cloud-b90.qcow2"
arch: "aarch64"
digest: "sha256:1f4e20190e87c76e8c3b4a9e15e660972386cbfa4f128e5cdcd8faa43a713d44"
mountTypesUnsupported: ["9p"]
mounts:
- location: "~"
- location: "/tmp/lima"
Expand Down
1 change: 1 addition & 0 deletions examples/rocky-8.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ images:
arch: "x86_64"
- location: "https://dl.rockylinux.org/pub/rocky/8/images/aarch64/Rocky-8-GenericCloud.latest.aarch64.qcow2"
arch: "aarch64"
mountTypesUnsupported: ["9p"]
mounts:
- location: "~"
- location: "/tmp/lima"
Expand Down
1 change: 1 addition & 0 deletions examples/rocky-9.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ images:
arch: "x86_64"
- location: "https://dl.rockylinux.org/pub/rocky/9/images/aarch64/Rocky-9-GenericCloud.latest.aarch64.qcow2"
arch: "aarch64"
mountTypesUnsupported: ["9p"]
mounts:
- location: "~"
- location: "/tmp/lima"
Expand Down
3 changes: 3 additions & 0 deletions hack/test-templates/test-misc.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# The test template for testing misc configurations:
# - disk
# - snapshots
# - (More to come)
#
# This template requires Lima v1.0.0-alpha.0 or later.
Expand All @@ -18,6 +19,8 @@ images:
- location: "https://cloud-images.ubuntu.com/releases/24.04/release/ubuntu-24.04-server-cloudimg-arm64.img"
arch: "aarch64"

# 9p is not compatible with `limactl snapshot`
mountTypesUnsupported: ["9p"]
mounts:
- location: "~"
writable: true
Expand Down
36 changes: 33 additions & 3 deletions pkg/limayaml/defaults.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import (
"github.com/lima-vm/lima/pkg/ptr"
"github.com/lima-vm/lima/pkg/store/dirnames"
"github.com/lima-vm/lima/pkg/store/filenames"
"github.com/lima-vm/lima/pkg/version/versionutil"
)

const (
Expand Down Expand Up @@ -171,6 +172,15 @@ func defaultGuestInstallPrefix() string {
// - CACertificates Files and Certs are uniquely appended in d, y, o order
func FillDefault(y, d, o *LimaYAML, filePath string) {
instDir := filepath.Dir(filePath)

var existingLimaVersion string // empty if the instance was created with Lima prior to v0.20
limaVersionFile := filepath.Join(instDir, filenames.LimaVersion)
if b, err := os.ReadFile(limaVersionFile); err == nil {
existingLimaVersion = strings.TrimSpace(string(b))
} else if !errors.Is(err, os.ErrNotExist) {
logrus.WithError(err).Warnf("Failed to read %q", limaVersionFile)
}

if y.VMType == nil {
y.VMType = d.VMType
}
Expand Down Expand Up @@ -547,21 +557,41 @@ func FillDefault(y, d, o *LimaYAML, filePath string) {
}
}

y.MountTypesUnsupported = append(append(o.MountTypesUnsupported, y.MountTypesUnsupported...), d.MountTypesUnsupported...)
mountTypesUnsupported := make(map[string]struct{})
for _, f := range y.MountTypesUnsupported {
mountTypesUnsupported[f] = struct{}{}
}
// MountType has to be resolved before resolving Mounts
if y.MountType == nil {
y.MountType = d.MountType
}
if o.MountType != nil {
y.MountType = o.MountType
}
if y.MountType == nil || *y.MountType == "" {
if *y.VMType == VZ {
if y.MountType == nil || *y.MountType == "" || *y.MountType == "default" {
switch *y.VMType {
case VZ:
y.MountType = ptr.Of(VIRTIOFS)
} else {
case QEMU:
y.MountType = ptr.Of(NINEP)
if _, ok := mountTypesUnsupported[NINEP]; ok {
// Use REVSSHFS if the instance does not support 9p
y.MountType = ptr.Of(REVSSHFS)
} else if isExistingInstanceDir(instDir) && !versionutil.GreaterEqual(existingLimaVersion, "1.0.0") {
// Use REVSSHFS if the instance was created with Lima prior to v1.0
y.MountType = ptr.Of(REVSSHFS)
}
default:
y.MountType = ptr.Of(REVSSHFS)
}
}

if _, ok := mountTypesUnsupported[*y.MountType]; ok {
// We cannot return an error here, but Validate() will return it.
logrus.Warnf("Unsupported mount type: %q", *y.MountType)
}

if y.MountInotify == nil {
y.MountInotify = d.MountInotify
}
Expand Down
55 changes: 28 additions & 27 deletions pkg/limayaml/limayaml.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,33 +7,34 @@ import (
)

type LimaYAML struct {
MinimumLimaVersion *string `yaml:"minimumLimaVersion,omitempty" json:"minimumLimaVersion,omitempty"`
VMType *VMType `yaml:"vmType,omitempty" json:"vmType,omitempty"`
VMOpts VMOpts `yaml:"vmOpts,omitempty" json:"vmOpts,omitempty"`
OS *OS `yaml:"os,omitempty" json:"os,omitempty"`
Arch *Arch `yaml:"arch,omitempty" json:"arch,omitempty"`
Images []Image `yaml:"images" json:"images"` // REQUIRED
CPUType CPUType `yaml:"cpuType,omitempty" json:"cpuType,omitempty"`
CPUs *int `yaml:"cpus,omitempty" json:"cpus,omitempty"`
Memory *string `yaml:"memory,omitempty" json:"memory,omitempty"` // go-units.RAMInBytes
Disk *string `yaml:"disk,omitempty" json:"disk,omitempty"` // go-units.RAMInBytes
AdditionalDisks []Disk `yaml:"additionalDisks,omitempty" json:"additionalDisks,omitempty"`
Mounts []Mount `yaml:"mounts,omitempty" json:"mounts,omitempty"`
MountType *MountType `yaml:"mountType,omitempty" json:"mountType,omitempty"`
MountInotify *bool `yaml:"mountInotify,omitempty" json:"mountInotify,omitempty"`
SSH SSH `yaml:"ssh,omitempty" json:"ssh,omitempty"` // REQUIRED (FIXME)
Firmware Firmware `yaml:"firmware,omitempty" json:"firmware,omitempty"`
Audio Audio `yaml:"audio,omitempty" json:"audio,omitempty"`
Video Video `yaml:"video,omitempty" json:"video,omitempty"`
Provision []Provision `yaml:"provision,omitempty" json:"provision,omitempty"`
UpgradePackages *bool `yaml:"upgradePackages,omitempty" json:"upgradePackages,omitempty"`
Containerd Containerd `yaml:"containerd,omitempty" json:"containerd,omitempty"`
GuestInstallPrefix *string `yaml:"guestInstallPrefix,omitempty" json:"guestInstallPrefix,omitempty"`
Probes []Probe `yaml:"probes,omitempty" json:"probes,omitempty"`
PortForwards []PortForward `yaml:"portForwards,omitempty" json:"portForwards,omitempty"`
CopyToHost []CopyToHost `yaml:"copyToHost,omitempty" json:"copyToHost,omitempty"`
Message string `yaml:"message,omitempty" json:"message,omitempty"`
Networks []Network `yaml:"networks,omitempty" json:"networks,omitempty"`
MinimumLimaVersion *string `yaml:"minimumLimaVersion,omitempty" json:"minimumLimaVersion,omitempty"`
VMType *VMType `yaml:"vmType,omitempty" json:"vmType,omitempty"`
VMOpts VMOpts `yaml:"vmOpts,omitempty" json:"vmOpts,omitempty"`
OS *OS `yaml:"os,omitempty" json:"os,omitempty"`
Arch *Arch `yaml:"arch,omitempty" json:"arch,omitempty"`
Images []Image `yaml:"images" json:"images"` // REQUIRED
CPUType CPUType `yaml:"cpuType,omitempty" json:"cpuType,omitempty"`
CPUs *int `yaml:"cpus,omitempty" json:"cpus,omitempty"`
Memory *string `yaml:"memory,omitempty" json:"memory,omitempty"` // go-units.RAMInBytes
Disk *string `yaml:"disk,omitempty" json:"disk,omitempty"` // go-units.RAMInBytes
AdditionalDisks []Disk `yaml:"additionalDisks,omitempty" json:"additionalDisks,omitempty"`
Mounts []Mount `yaml:"mounts,omitempty" json:"mounts,omitempty"`
MountTypesUnsupported []string `yaml:"mountTypesUnsupported,omitempty" json:"mountTypesUnsupported,omitempty"`
MountType *MountType `yaml:"mountType,omitempty" json:"mountType,omitempty"`
MountInotify *bool `yaml:"mountInotify,omitempty" json:"mountInotify,omitempty"`
SSH SSH `yaml:"ssh,omitempty" json:"ssh,omitempty"` // REQUIRED (FIXME)
Firmware Firmware `yaml:"firmware,omitempty" json:"firmware,omitempty"`
Audio Audio `yaml:"audio,omitempty" json:"audio,omitempty"`
Video Video `yaml:"video,omitempty" json:"video,omitempty"`
Provision []Provision `yaml:"provision,omitempty" json:"provision,omitempty"`
UpgradePackages *bool `yaml:"upgradePackages,omitempty" json:"upgradePackages,omitempty"`
Containerd Containerd `yaml:"containerd,omitempty" json:"containerd,omitempty"`
GuestInstallPrefix *string `yaml:"guestInstallPrefix,omitempty" json:"guestInstallPrefix,omitempty"`
Probes []Probe `yaml:"probes,omitempty" json:"probes,omitempty"`
PortForwards []PortForward `yaml:"portForwards,omitempty" json:"portForwards,omitempty"`
CopyToHost []CopyToHost `yaml:"copyToHost,omitempty" json:"copyToHost,omitempty"`
Message string `yaml:"message,omitempty" json:"message,omitempty"`
Networks []Network `yaml:"networks,omitempty" json:"networks,omitempty"`
// `network` was deprecated in Lima v0.7.0, removed in Lima v0.14.0. Use `networks` instead.
Env map[string]string `yaml:"env,omitempty" json:"env,omitempty"`
Param map[string]string `yaml:"param,omitempty" json:"param,omitempty"`
Expand Down
6 changes: 6 additions & 0 deletions pkg/limayaml/validate.go
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,12 @@ func Validate(y *LimaYAML, warn bool) error {
return fmt.Errorf("field `mountType` must be %q or %q or %q, or %q, got %q", REVSSHFS, NINEP, VIRTIOFS, WSLMount, *y.MountType)
}

for _, f := range y.MountTypesUnsupported {
if f == *y.MountType {
return fmt.Errorf("field `mountType` must not be one of %v (`mountTypesUnsupported`), got %q", y.MountTypesUnsupported, *y.MountType)
}
}

if warn && runtime.GOOS != "linux" {
for i, mount := range y.Mounts {
if mount.Virtiofs.QueueSize != nil {
Expand Down
6 changes: 6 additions & 0 deletions pkg/version/versionutil/versionutil.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,9 @@ func GreaterThan(limaVersion, oldVersion string) bool {
}
panic("unreachable")
}

// GreaterEqual return true if limaVersion >= oldVersion.
func GreaterEqual(limaVersion, oldVersion string) bool {
return strings.TrimPrefix(limaVersion, "v") == strings.TrimPrefix(oldVersion, "v") ||
GreaterThan(limaVersion, oldVersion)
}
20 changes: 20 additions & 0 deletions website/content/en/docs/faq/_index.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ weight: 6
- [Filesystem sharing](#filesystem-sharing)
- ["Filesystem is slow"](#filesystem-is-slow)
- ["Filesystem is not writable"](#filesystem-is-not-writable)
- ["Filesystem is unmounted after upgrading Lima to v1.0 (pre-release)"](#filesystem-is-unmounted-after-upgrading-lima-to-v10-pre-release)
- [External projects](#external-projects)
- ["I am using Rancher Desktop. How to deal with the underlying Lima?"](#i-am-using-rancher-desktop-how-to-deal-with-the-underlying-lima)
- ["Hints for debugging other problems?"](#hints-for-debugging-other-problems)
Expand Down Expand Up @@ -230,6 +231,25 @@ mounts:

Run `limactl edit <INSTANCE>` to open the YAML editor for an existing instance.

#### "Filesystem is unmounted after upgrading Lima to v1.0 (pre-release)"

Lima v1.0 (pre-release) changed the default mount type for QEMU from `reverse-sshfs` to `9p`.

The `9p` mount type is known to be incompatible with the following guest operating systems:
- AlmaLinux, CentOS Stream, Oracle Linux, and RockyLinux
- Debian GNU/Linux
- openSUSE

A new instance of these OS still use `reverse-sshfs` by default.
However, an existing instance created with a previous version of Lima may potentially need
running the following command (usually not needed):

```
limactl edit --mount-type=reverse-sshfs <NAME>
```

Ubuntu users are not affected by this issue.

### External projects
#### "I am using Rancher Desktop. How to deal with the underlying Lima?"

Expand Down

0 comments on commit 47565ec

Please sign in to comment.