mirror of
https://github.com/containers/podman.git
synced 2025-06-26 04:46:57 +08:00
Merge pull request #19677 from n1hility/detect-old-wsl
Validate current generation of WSL2 with user-mode-networking
This commit is contained in:
@ -338,6 +338,12 @@ func (v *MachineVM) Init(opts machine.InitOptions) (bool, error) {
|
||||
v.Rootful = opts.Rootful
|
||||
v.Version = currentMachineVersion
|
||||
|
||||
if v.UserModeNetworking {
|
||||
if err := verifyWSLUserModeCompat(); err != nil {
|
||||
return false, err
|
||||
}
|
||||
}
|
||||
|
||||
if err := downloadDistro(v, opts); err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
@ -10,6 +10,7 @@ import (
|
||||
"path/filepath"
|
||||
|
||||
"github.com/containers/podman/v4/pkg/machine"
|
||||
"github.com/containers/podman/v4/pkg/machine/wsl/wutil"
|
||||
"github.com/containers/podman/v4/pkg/specgen"
|
||||
"github.com/sirupsen/logrus"
|
||||
)
|
||||
@ -53,6 +54,21 @@ ip route add $ROUTE
|
||||
rm -rf /mnt/wsl/podman-usermodenet
|
||||
`
|
||||
|
||||
func verifyWSLUserModeCompat() error {
|
||||
if wutil.IsWSLStoreVersionInstalled() {
|
||||
return nil
|
||||
}
|
||||
|
||||
prefix := ""
|
||||
if !winVersionAtLeast(10, 0, 19043) {
|
||||
prefix = "upgrade to 22H2, "
|
||||
}
|
||||
|
||||
return fmt.Errorf("user-mode networking requires a newer version of WSL: "+
|
||||
"%sapply all outstanding windows updates, and then run `wsl --update`",
|
||||
prefix)
|
||||
}
|
||||
|
||||
func (v *MachineVM) startUserModeNetworking() error {
|
||||
if !v.UserModeNetworking {
|
||||
return nil
|
||||
@ -299,6 +315,10 @@ func (v *MachineVM) obtainUserModeNetLock() (*fileLock, error) {
|
||||
}
|
||||
|
||||
func changeDistUserModeNetworking(dist string, user string, image string, enable bool) error {
|
||||
if err := verifyWSLUserModeCompat(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Only install if user-mode is being enabled and there was an image path passed
|
||||
if enable && len(image) > 0 {
|
||||
if err := installUserModeDist(dist, image); err != nil {
|
||||
|
@ -5,6 +5,7 @@ package wutil
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"io"
|
||||
"os/exec"
|
||||
"strings"
|
||||
"syscall"
|
||||
@ -37,19 +38,41 @@ func IsWSLInstalled() bool {
|
||||
if err = cmd.Start(); err != nil {
|
||||
return false
|
||||
}
|
||||
scanner := bufio.NewScanner(transform.NewReader(out, unicode.UTF16(unicode.LittleEndian, unicode.UseBOM).NewDecoder()))
|
||||
result := true
|
||||
for scanner.Scan() {
|
||||
line := scanner.Text()
|
||||
// Windows 11 does not set an error exit code when a kernel is not avail
|
||||
if strings.Contains(line, "kernel file is not found") {
|
||||
result = false
|
||||
break
|
||||
}
|
||||
}
|
||||
if err := cmd.Wait(); !result || err != nil {
|
||||
|
||||
kernelNotFound := matchOutputLine(out, "kernel file is not found")
|
||||
|
||||
if err := cmd.Wait(); err != nil {
|
||||
return false
|
||||
}
|
||||
|
||||
return true
|
||||
return !kernelNotFound
|
||||
}
|
||||
|
||||
func IsWSLStoreVersionInstalled() bool {
|
||||
cmd := SilentExecCmd("wsl", "--version")
|
||||
out, err := cmd.StdoutPipe()
|
||||
cmd.Stderr = nil
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
if err = cmd.Start(); err != nil {
|
||||
return false
|
||||
}
|
||||
hasVersion := matchOutputLine(out, "WSL version:")
|
||||
if err := cmd.Wait(); err != nil {
|
||||
return false
|
||||
}
|
||||
|
||||
return hasVersion
|
||||
}
|
||||
|
||||
func matchOutputLine(output io.ReadCloser, match string) bool {
|
||||
scanner := bufio.NewScanner(transform.NewReader(output, unicode.UTF16(unicode.LittleEndian, unicode.UseBOM).NewDecoder()))
|
||||
for scanner.Scan() {
|
||||
line := scanner.Text()
|
||||
if strings.Contains(line, match) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
Reference in New Issue
Block a user