diff --git a/bins/packages/cloudhypervisor/cloudhypervisor.sh b/bins/packages/cloudhypervisor/cloudhypervisor.sh index 50bf48fac..7990d05a1 100644 --- a/bins/packages/cloudhypervisor/cloudhypervisor.sh +++ b/bins/packages/cloudhypervisor/cloudhypervisor.sh @@ -1,5 +1,5 @@ -CLOUDHYPERVISOR_VERSION="27.0" -CLOUDHYPERVISOR_CHECKSUM="82024378691018fec4fcfa6263949fb5" +CLOUDHYPERVISOR_VERSION="39.0" +CLOUDHYPERVISOR_CHECKSUM="c6f0f32b8ed6e68e0f9ddff805d912c7" CLOUDHYPERVISOR_LINK="https://github.com/cloud-hypervisor/cloud-hypervisor/releases/download/v${CLOUDHYPERVISOR_VERSION}/cloud-hypervisor-static" diff --git a/go.mod b/go.mod index 70e3bd293..a1426c9c1 100644 --- a/go.mod +++ b/go.mod @@ -32,17 +32,14 @@ require ( github.com/google/uuid v1.6.0 github.com/gorilla/mux v1.8.0 github.com/gtank/merlin v0.1.1 - github.com/hashicorp/go-multierror v1.0.0 github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d github.com/hasura/go-graphql-client v0.10.0 github.com/jbenet/go-base58 v0.0.0-20150317085156-6237cf65f3a6 github.com/joncrlsn/dque v0.0.0-20200702023911-3e80e3146ce5 - github.com/klauspost/compress v1.16.7 github.com/lestrrat-go/jwx v1.1.7 github.com/machinebox/graphql v0.2.2 github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417 github.com/patrickmn/go-cache v2.1.0+incompatible - github.com/pierrec/lz4/v4 v4.1.21 github.com/pkg/errors v0.9.1 github.com/rs/zerolog v1.31.0 github.com/shirou/gopsutil v3.21.11+incompatible @@ -52,12 +49,10 @@ require ( github.com/threefoldtech/tfgrid-sdk-go/rmb-sdk-go v0.11.4 github.com/threefoldtech/zbus v1.0.1 github.com/tyler-smith/go-bip39 v1.1.0 - github.com/ulikunitz/xz v0.5.8 github.com/urfave/cli/v2 v2.17.2-0.20221006022127-8f469abc00aa github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852 github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f github.com/whs/nacl-sealed-box v0.0.0-20180930164530-92b9ba845d8d - github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 github.com/yggdrasil-network/yggdrasil-go v0.4.0 golang.org/x/crypto v0.14.0 golang.org/x/sys v0.19.0 @@ -94,10 +89,10 @@ require ( github.com/gorilla/websocket v1.5.0 // indirect github.com/gtank/ristretto255 v0.1.2 // indirect github.com/hanwen/go-fuse/v2 v2.3.0 // indirect - github.com/hashicorp/errwrap v1.0.0 // indirect github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/holiman/uint256 v1.2.2-0.20230321075855-87b91420868c // indirect github.com/josharian/native v0.0.0-20200817173448-b6b71def0850 // indirect + github.com/klauspost/compress v1.16.7 // indirect github.com/lestrrat-go/backoff/v2 v2.0.7 // indirect github.com/lestrrat-go/blackmagic v1.0.0 // indirect github.com/lestrrat-go/httpcc v1.0.0 // indirect @@ -137,6 +132,7 @@ require ( github.com/tinylib/msgp v1.1.5 // indirect github.com/tklauser/go-sysconf v0.3.9 // indirect github.com/tklauser/numcpus v0.6.0 // indirect + github.com/ulikunitz/xz v0.5.8 // indirect github.com/vedhavyas/go-subkey v1.0.3 // indirect github.com/vmihailenco/msgpack v4.0.4+incompatible // indirect github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect diff --git a/go.sum b/go.sum index f6342491e..447f94d1d 100644 --- a/go.sum +++ b/go.sum @@ -278,10 +278,6 @@ github.com/gtank/ristretto255 v0.1.2 h1:JEqUCPA1NvLq5DwYtuzigd7ss8fwbYay9fi4/5uM github.com/gtank/ristretto255 v0.1.2/go.mod h1:Ph5OpO6c7xKUGROZfWVLiJf9icMDwUeIvY4OmlYW69o= github.com/hanwen/go-fuse/v2 v2.3.0 h1:t5ivNIH2PK+zw4OBul/iJjsoG9K6kXo4nMDoBpciC8A= github.com/hanwen/go-fuse/v2 v2.3.0/go.mod h1:xKwi1cF7nXAOBCXujD5ie0ZKsxc8GGSA1rlMJc+8IJs= -github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-multierror v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs= github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= @@ -457,8 +453,6 @@ github.com/philhofer/fwd v1.1.1 h1:GdGcTjf5RNAxwS4QLsiMzJYj5KEvPJD3Abr261yRQXQ= github.com/philhofer/fwd v1.1.1/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= github.com/pierrec/lz4 v2.3.0+incompatible h1:CZzRn4Ut9GbUkHlQ7jqBXeZQV41ZSKWFc302ZU6lUTk= github.com/pierrec/lz4 v2.3.0+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= -github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pierrec/xxHash v0.1.5 h1:n/jBpwTHiER4xYvK3/CdPVnLDPchj8eTJFFLUb4QHBo= github.com/pierrec/xxHash v0.1.5/go.mod h1:w2waW5Zoa/Wc4Yqe0wgrIYAGKqRMf7czn2HNKXmuL+I= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= @@ -591,8 +585,6 @@ github.com/vmihailenco/msgpack v4.0.4+incompatible h1:dSLoQfGFAo3F6OoNhwUmLwVgaU github.com/vmihailenco/msgpack v4.0.4+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk= github.com/whs/nacl-sealed-box v0.0.0-20180930164530-92b9ba845d8d h1:7UnhkLc0c3CSUXmDlQumHjDte0S2vW7TL+4mubdkiY4= github.com/whs/nacl-sealed-box v0.0.0-20180930164530-92b9ba845d8d/go.mod h1:ltQsZR7FRY+aC2OSr4UmsNI91hR831dJo2gZd50TSa4= -github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 h1:nIPpBwaJSVYIxUFsDv3M8ofmx9yWTog9BfvIu0q41lo= -github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= diff --git a/pkg/primitives/vm/decompress_kernel.go b/pkg/primitives/vm/decompress_kernel.go deleted file mode 100644 index 63ad7ce25..000000000 --- a/pkg/primitives/vm/decompress_kernel.go +++ /dev/null @@ -1,227 +0,0 @@ -package vm - -import ( - "bytes" - "compress/bzip2" - "compress/gzip" - "debug/elf" - "fmt" - "io" - "os" - "strings" - - // "github.com/cyberdelia/lzo" --> it requires liblzo2-dev to be installed - - "github.com/hashicorp/go-multierror" - "github.com/klauspost/compress/zstd" - "github.com/pierrec/lz4/v4" - "github.com/rs/zerolog/log" - "github.com/ulikunitz/xz/lzma" - "github.com/xi2/xz" -) - -func isValidELFKernel(KernelImagePath string) error { - f, err := elf.Open(KernelImagePath) - if err != nil { - return err - } - f.Close() - return nil -} - -type algoOptions struct { - decompressFunc func(kernelStream io.Reader) (io.Reader, error) - headerBytes []byte - name string -} - -func decompressData(data []byte, tmpFile *os.File, o algoOptions) error { - var headerIndex int - var errs error - - headerCount := bytes.Count(data, o.headerBytes) - if headerCount == 0 { - return fmt.Errorf("%s: couldn't find the compression algorithm header", o.name) - } - - for i := 0; i < headerCount; i++ { - headerIndex += bytes.Index(data[headerIndex:], o.headerBytes) - - headerData := data[headerIndex:] - - // to ignore the current header in the next iteration - headerIndex += len(o.headerBytes) - - r, err := o.decompressFunc(bytes.NewBuffer(headerData)) - if err != nil { - errs = multierror.Append(errs, err) - continue - } - - // close zstd reader after write - if reader, ok := r.(*zstd.Decoder); ok { - defer reader.Close() - } - - _, err = io.Copy(tmpFile, r) - if err != nil && err != bzip2.StructuralError("bad magic value in continuation file") && err != zstd.ErrMagicMismatch { - if o.name == "zstd" { - err = fmt.Errorf("%s: %v", o.name, err) - } - errs = multierror.Append(errs, err) - continue - } - - if err = isValidELFKernel(tmpFile.Name()); err == nil { - return nil - } - - errs = multierror.Append(errs, err) - } - - return errs -} - -func gUnzip(kernelStream io.Reader) (io.Reader, error) { - r, err := gzip.NewReader(kernelStream) - if err != nil { - return nil, err - } - - r.Multistream(false) - // TODO: how it read after closing !!!! - defer r.Close() - - return r, nil -} - -func unXZ(kernelStream io.Reader) (io.Reader, error) { - r, err := xz.NewReader(kernelStream, 0) - if err != nil { - return nil, err - } - - r.Multistream(false) - return r, nil -} - -func bUnzip2(kernelStream io.Reader) (io.Reader, error) { - return bzip2.NewReader(kernelStream), nil -} - -func unlzma(kernelStream io.Reader) (io.Reader, error) { - return lzma.NewReader(kernelStream) -} - -func lZop(kernelStream io.Reader) (io.Reader, error) { - return nil, fmt.Errorf("lzo: algorithm is not supported yet") -} - -func lZ4(kernelStream io.Reader) (io.Reader, error) { - return lz4.NewReader(kernelStream), nil -} - -func unZstd(kernelStream io.Reader) (io.Reader, error) { - r, err := zstd.NewReader(kernelStream) - if err != nil { - return nil, err - } - - return r, nil -} - -func tryDecompressKernel(kernelImagePath string) error { - if len(strings.TrimSpace(kernelImagePath)) == 0 { - return fmt.Errorf("kernel image is required") - } - - // if kernel is already an elf (uncompressed) - if err := isValidELFKernel(kernelImagePath); err == nil { - log.Debug().Msg("kernel is decompressed") - return nil - } - - log.Debug().Msg("kernel is compressed, trying to decompress kernel") - - // Prepare temp files: - tmpFile, err := os.CreateTemp("", "vmlinux-") - if err != nil { - return err - } - - defer func() { - tmpFile.Close() - os.Remove(tmpFile.Name()) - }() - - kernelData, err := os.ReadFile(kernelImagePath) - if err != nil { - return err - } - - algos := []algoOptions{ - { - decompressFunc: gUnzip, - headerBytes: []byte("\037\213\010"), - name: "gunzip", - }, - { - decompressFunc: unXZ, - headerBytes: []byte("\3757zXZ\000"), - name: "unxz", - }, - { - decompressFunc: bUnzip2, - headerBytes: []byte("BZh"), - name: "bunzip2", - }, - { - decompressFunc: unlzma, - headerBytes: []byte("\135\000\000\000"), - name: "unlzma", - }, - { - decompressFunc: lZop, - headerBytes: []byte("\211\114\132"), - name: "lzop", - }, - { - decompressFunc: lZ4, - headerBytes: []byte("\002!L\030"), - name: "lz4", - }, - { - decompressFunc: unZstd, - headerBytes: []byte("(\265/\375"), - name: "zstd", - }, - } - - var errs error - - for _, algo := range algos { - if err = decompressData(kernelData, tmpFile, algo); err == nil { - if _, err = tmpFile.Seek(0, io.SeekStart); err != nil { - return err - } - - f, err := os.Create(kernelImagePath) - if err != nil { - return err - } - - defer f.Close() - - if _, err := io.Copy(f, tmpFile); err != nil { - return err - } - - log.Debug().Str("algorithm", algo.name).Msg("kernel is decompressed") - return nil - } - - errs = multierror.Append(errs, err) - } - - return errs -} diff --git a/pkg/primitives/vm/utils.go b/pkg/primitives/vm/utils.go index 658a003e2..424fcdf36 100644 --- a/pkg/primitives/vm/utils.go +++ b/pkg/primitives/vm/utils.go @@ -148,11 +148,6 @@ func (p *Manager) prepContainer( // can be overridden from the flist itself if exists if len(imageInfo.KernelPath) != 0 { - // try to decompress kernel - if err := tryDecompressKernel(imageInfo.KernelPath); err != nil { - return errors.Wrapf(err, "failed to decompress kernel: %s", imageInfo.KernelPath) - } - machine.KernelImage = imageInfo.KernelPath machine.InitrdImage = imageInfo.InitrdPath // we are using kernel from flist, we need to respect