From 3d495ed673627be1d4815dafa8164276c579961a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20F=20Bj=C3=B6rklund?= Date: Sun, 23 Jun 2024 09:27:18 +0200 Subject: [PATCH] Allow compressing lima-guestagent with gzip MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Anders F Björklund --- Kconfig | 6 ++++++ Makefile | 15 ++++++++++---- config.mk | 1 + pkg/cidata/cidata.go | 2 +- pkg/usrlocalsharelima/usrlocalsharelima.go | 24 ++++++++++++++++++++++ 5 files changed, 43 insertions(+), 5 deletions(-) diff --git a/Kconfig b/Kconfig index 3e68bc4f2db..3c8853fec5a 100644 --- a/Kconfig +++ b/Kconfig @@ -30,3 +30,9 @@ config GUESTAGENT_ARCH_RISCV64 help Build lima-guestagent for "riscv64" Arch default y + +config GUESTAGENT_COMPRESS + bool "guestagent compress" + help + Compress lima-guestagent + default n diff --git a/Makefile b/Makefile index 9b4506552a1..373dd254bfc 100644 --- a/Makefile +++ b/Makefile @@ -86,22 +86,26 @@ HELPERS = \ _output/bin/podman.lima \ _output/bin/kubectl.lima +ifeq ($(CONFIG_GUESTAGENT_COMPRESS),y) +gz = .gz +endif + ifeq ($(CONFIG_GUESTAGENT_OS_LINUX),y) ifeq ($(CONFIG_GUESTAGENT_ARCH_X8664),y) GUESTAGENT += \ - _output/share/lima/lima-guestagent.Linux-x86_64 + _output/share/lima/lima-guestagent.Linux-x86_64$(gz) endif ifeq ($(CONFIG_GUESTAGENT_ARCH_AARCH64),y) GUESTAGENT += \ - _output/share/lima/lima-guestagent.Linux-aarch64 + _output/share/lima/lima-guestagent.Linux-aarch64$(gz) endif ifeq ($(CONFIG_GUESTAGENT_ARCH_ARMV7L),y) GUESTAGENT += \ - _output/share/lima/lima-guestagent.Linux-armv7l + _output/share/lima/lima-guestagent.Linux-armv7l$(gz) endif ifeq ($(CONFIG_GUESTAGENT_ARCH_RISCV64),y) GUESTAGENT += \ - _output/share/lima/lima-guestagent.Linux-riscv64 + _output/share/lima/lima-guestagent.Linux-riscv64$(gz) endif endif @@ -188,6 +192,9 @@ _output/share/lima/lima-guestagent.Linux-riscv64: GOOS=linux GOARCH=riscv64 CGO_ENABLED=0 $(GO_BUILD) -o $@ ./cmd/lima-guestagent chmod 644 $@ +_output/share/lima/lima-guestagent.%.gz: _output/share/lima/lima-guestagent.% + gzip $< + .PHONY: manpages manpages: _output/bin/limactl$(exe) @mkdir -p _output/share/man/man1 diff --git a/config.mk b/config.mk index 89f5488fe55..7b3eb49e2f9 100644 --- a/config.mk +++ b/config.mk @@ -3,3 +3,4 @@ CONFIG_GUESTAGENT_ARCH_X8664=y CONFIG_GUESTAGENT_ARCH_AARCH64=y CONFIG_GUESTAGENT_ARCH_ARMV7L=y CONFIG_GUESTAGENT_ARCH_RISCV64=y +CONFIG_GUESTAGENT_COMPRESS=n diff --git a/pkg/cidata/cidata.go b/pkg/cidata/cidata.go index 53d2bc1053e..1ee976e7ceb 100644 --- a/pkg/cidata/cidata.go +++ b/pkg/cidata/cidata.go @@ -345,7 +345,7 @@ func GenerateISO9660(instDir, name string, y *limayaml.LimaYAML, udpDNSLocalPort if err != nil { return err } - guestAgent, err := os.Open(guestAgentBinary) + guestAgent, err := usrlocalsharelima.Open(guestAgentBinary) if err != nil { return err } diff --git a/pkg/usrlocalsharelima/usrlocalsharelima.go b/pkg/usrlocalsharelima/usrlocalsharelima.go index 1b48c28fcb8..592e32ef56b 100644 --- a/pkg/usrlocalsharelima/usrlocalsharelima.go +++ b/pkg/usrlocalsharelima/usrlocalsharelima.go @@ -1,14 +1,17 @@ package usrlocalsharelima import ( + "compress/gzip" "errors" "fmt" + "io" "io/fs" "os" "path/filepath" "runtime" "github.com/lima-vm/lima/pkg/limayaml" + "github.com/sirupsen/logrus" ) func Dir() (string, error) { @@ -55,6 +58,11 @@ func Dir() (string, error) { } else if !errors.Is(err, os.ErrNotExist) { return "", err } + if _, err := os.Stat(gaCandidate + ".gz"); err == nil { + return filepath.Dir(gaCandidate), nil + } else if !errors.Is(err, os.ErrNotExist) { + return "", err + } } return "", fmt.Errorf("failed to find \"lima-guestagent.%s-%s\" binary for %q, attempted %v", @@ -74,3 +82,19 @@ func GuestAgentBinary(ostype limayaml.OS, arch limayaml.Arch) (string, error) { } return filepath.Join(dir, "lima-guestagent."+ostype+"-"+arch), nil } + +func Open(path string) (io.ReadCloser, error) { + reader, err := os.Open(path) + if errors.Is(err, os.ErrNotExist) { + reader, err := os.Open(path + ".gz") + if err != nil { + return nil, err + } + logrus.Debugf("Decompressing %s.gz", path) + return gzip.NewReader(reader) + } + if err != nil { + return nil, err + } + return reader, nil +}