Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

pass target arch to final image builder as TARGETARCH; use TARGETARCH… #3951

Merged
merged 1 commit into from
Oct 8, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/cmd/linuxkit/build.go
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,7 @@ The generated image can be in one of multiple formats which can be run on variou
}

log.Infof("Create outputs:")
err = moby.Formats(filepath.Join(dir, name), image, buildFormats, size, cacheDir.String())
err = moby.Formats(filepath.Join(dir, name), image, buildFormats, size, arch, cacheDir.String())
if err != nil {
return fmt.Errorf("Error writing outputs: %v", err)
}
Expand Down
11 changes: 8 additions & 3 deletions src/cmd/linuxkit/moby/docker.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ import (
)

// dockerRun is outside the linuxkit/docker package, because that is for caching, this is
// used for running to build images.
func dockerRun(input io.Reader, output io.Writer, img string, args ...string) error {
// used for running to build images. runEnv is passed through to the docker run command.
func dockerRun(input io.Reader, output io.Writer, img string, runEnv []string, args ...string) error {
log.Debugf("docker run %s (input): %s", img, strings.Join(args, " "))
docker, err := exec.LookPath("docker")
if err != nil {
Expand All @@ -36,7 +36,12 @@ func dockerRun(input io.Reader, output io.Writer, img string, args ...string) er
}

var errbuf strings.Builder
args = append([]string{"run", "--network=none", "--log-driver=none", "--rm", "-i", img}, args...)
args = []string{"run", "--network=none", "--log-driver=none", "--rm", "-i"}
for _, e := range runEnv {
args = append(args, "-e", e)
}

args = append(args, img)
cmd := exec.Command(docker, args...)
cmd.Stderr = &errbuf
cmd.Stdin = input
Expand Down
8 changes: 4 additions & 4 deletions src/cmd/linuxkit/moby/images.yaml
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
iso: linuxkit/mkimage-iso:1f6fdf0ee860caf13c06a6f3f2d89413de78881e
iso-bios: linuxkit/mkimage-iso-bios:314c06ec0d72f12057c9e8d5fdf790df02dbc8c2
iso-efi: linuxkit/mkimage-iso-efi:b74d215d594ccdf7d51fa412518b2f895aa7f9dc
iso-efi-initrd: linuxkit/mkimage-iso-efi-initrd:0e66171ffde9bb735b0e014f811f9626fc8b9bc9
iso-efi: linuxkit/mkimage-iso-efi:55b72b55ffea82d1c254c0ff5cb65df0c2c04528
iso-efi-initrd: linuxkit/mkimage-iso-efi-initrd:f7fba1acaee8afbea2771717c9faf758d0a66a87
raw-bios: linuxkit/mkimage-raw-bios:6185592a62b860b01491d7f1661e79f62e6fc902
raw-efi: linuxkit/mkimage-raw-efi:6dff9623fb4fecff05ca02123aa8bc345ab7c707
raw-efi: linuxkit/mkimage-raw-efi:6a8d9ebf4f7883839e00034c1516527452c564d3
squashfs: linuxkit/mkimage-squashfs:92dbcfe5ef69dc93276403b09a9f892f25654ed7
gcp: linuxkit/mkimage-gcp:035c2c2b4b958060c0b6bdd41d9cbc886a335098
qcow2-efi: linuxkit/mkimage-qcow2-efi:67d5e16228dfb434ac5418bafac720bf23bbaf42
qcow2-efi: linuxkit/mkimage-qcow2-efi:19cb758d47c07169bc4772a7576e28d56740b004
vhd: linuxkit/mkimage-vhd:91bcc7a6475f46a3d5d84cf6161f07c583dd9c21
dynamic-vhd: linuxkit/mkimage-dynamic-vhd:b755f8ff82c8631d18decaebb09867e7b88c2533
vmdk: linuxkit/mkimage-vmdk:20a370a55bd8d58c2ae9d634c297a955bb006efd
Expand Down
99 changes: 58 additions & 41 deletions src/cmd/linuxkit/moby/output.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import (
"strings"

"github.com/linuxkit/linuxkit/src/cmd/linuxkit/initrd"
"github.com/linuxkit/linuxkit/src/cmd/linuxkit/util"
log "github.com/sirupsen/logrus"
"gopkg.in/yaml.v2"
)
Expand All @@ -23,8 +24,8 @@ import (
var imagesBytes []byte
var outputImages map[string]string

var outFuns = map[string]func(string, io.Reader, int) error{
"kernel+initrd": func(base string, image io.Reader, size int) error {
var outFuns = map[string]func(base string, ir io.Reader, size int, arch string) error{
"kernel+initrd": func(base string, image io.Reader, size int, arch string) error {
kernel, initrd, cmdline, ucode, err := tarToInitrd(image)
if err != nil {
return fmt.Errorf("Error converting to initrd: %v", err)
Expand All @@ -35,7 +36,7 @@ var outFuns = map[string]func(string, io.Reader, int) error{
}
return nil
},
"tar-kernel-initrd": func(base string, image io.Reader, size int) error {
"tar-kernel-initrd": func(base string, image io.Reader, size int, arch string) error {
kernel, initrd, cmdline, ucode, err := tarToInitrd(image)
if err != nil {
return fmt.Errorf("Error converting to initrd: %v", err)
Expand All @@ -45,70 +46,70 @@ var outFuns = map[string]func(string, io.Reader, int) error{
}
return nil
},
"iso-bios": func(base string, image io.Reader, size int) error {
err := outputIso(outputImages["iso-bios"], base+".iso", image)
"iso-bios": func(base string, image io.Reader, size int, arch string) error {
err := outputIso(outputImages["iso-bios"], base+".iso", image, arch)
if err != nil {
return fmt.Errorf("Error writing iso-bios output: %v", err)
}
return nil
},
"iso-efi": func(base string, image io.Reader, size int) error {
err := outputIso(outputImages["iso-efi"], base+"-efi.iso", image)
"iso-efi": func(base string, image io.Reader, size int, arch string) error {
err := outputIso(outputImages["iso-efi"], base+"-efi.iso", image, arch)
if err != nil {
return fmt.Errorf("Error writing iso-efi output: %v", err)
}
return nil
},
"iso-efi-initrd": func(base string, image io.Reader, size int) error {
"iso-efi-initrd": func(base string, image io.Reader, size int, arch string) error {
kernel, initrd, cmdline, _, err := tarToInitrd(image)
if err != nil {
return fmt.Errorf("Error converting to initrd: %v", err)
}

err = outputImg(outputImages["iso-efi-initrd"], base+"-efi-initrd.iso", kernel, initrd, cmdline)
err = outputImg(outputImages["iso-efi-initrd"], base+"-efi-initrd.iso", kernel, initrd, cmdline, arch)
if err != nil {
return fmt.Errorf("Error writing iso-efi-initrd output: %v", err)
}
return nil
},
"raw-bios": func(base string, image io.Reader, size int) error {
"raw-bios": func(base string, image io.Reader, size int, arch string) error {
kernel, initrd, cmdline, _, err := tarToInitrd(image)
if err != nil {
return fmt.Errorf("Error converting to initrd: %v", err)
}
// TODO: Handle ucode
err = outputImg(outputImages["raw-bios"], base+"-bios.img", kernel, initrd, cmdline)
err = outputImg(outputImages["raw-bios"], base+"-bios.img", kernel, initrd, cmdline, arch)
if err != nil {
return fmt.Errorf("Error writing raw-bios output: %v", err)
}
return nil
},
"raw-efi": func(base string, image io.Reader, size int) error {
"raw-efi": func(base string, image io.Reader, size int, arch string) error {
kernel, initrd, cmdline, _, err := tarToInitrd(image)
if err != nil {
return fmt.Errorf("Error converting to initrd: %v", err)
}
err = outputImg(outputImages["raw-efi"], base+"-efi.img", kernel, initrd, cmdline)
err = outputImg(outputImages["raw-efi"], base+"-efi.img", kernel, initrd, cmdline, arch)
if err != nil {
return fmt.Errorf("Error writing raw-efi output: %v", err)
}
return nil
},
"kernel+squashfs": func(base string, image io.Reader, size int) error {
err := outputKernelSquashFS(outputImages["squashfs"], base, image)
"kernel+squashfs": func(base string, image io.Reader, size int, arch string) error {
err := outputKernelSquashFS(outputImages["squashfs"], base, image, arch)
if err != nil {
return fmt.Errorf("Error writing kernel+squashfs output: %v", err)
}
return nil
},
"kernel+iso": func(base string, image io.Reader, size int) error {
err := outputKernelISO(outputImages["iso"], base, image)
"kernel+iso": func(base string, image io.Reader, size int, arch string) error {
err := outputKernelISO(outputImages["iso"], base, image, arch)
if err != nil {
return fmt.Errorf("Error writing kernel+iso output: %v", err)
}
return nil
},
"aws": func(base string, image io.Reader, size int) error {
"aws": func(base string, image io.Reader, size int, arch string) error {
filename := base + ".raw"
log.Infof(" %s", filename)
kernel, initrd, cmdline, _, err := tarToInitrd(image)
Expand All @@ -121,29 +122,29 @@ var outFuns = map[string]func(string, io.Reader, int) error{
}
return nil
},
"gcp": func(base string, image io.Reader, size int) error {
"gcp": func(base string, image io.Reader, size int, arch string) error {
kernel, initrd, cmdline, _, err := tarToInitrd(image)
if err != nil {
return fmt.Errorf("Error converting to initrd: %v", err)
}
err = outputImg(outputImages["gcp"], base+".img.tar.gz", kernel, initrd, cmdline)
err = outputImg(outputImages["gcp"], base+".img.tar.gz", kernel, initrd, cmdline, arch)
if err != nil {
return fmt.Errorf("Error writing gcp output: %v", err)
}
return nil
},
"qcow2-efi": func(base string, image io.Reader, size int) error {
"qcow2-efi": func(base string, image io.Reader, size int, arch string) error {
kernel, initrd, cmdline, _, err := tarToInitrd(image)
if err != nil {
return fmt.Errorf("Error converting to initrd: %v", err)
}
err = outputImg(outputImages["qcow2-efi"], base+"-efi.qcow2", kernel, initrd, cmdline)
err = outputImg(outputImages["qcow2-efi"], base+"-efi.qcow2", kernel, initrd, cmdline, arch)
if err != nil {
return fmt.Errorf("Error writing qcow2 EFI output: %v", err)
}
return nil
},
"qcow2-bios": func(base string, image io.Reader, size int) error {
"qcow2-bios": func(base string, image io.Reader, size int, arch string) error {
filename := base + ".qcow2"
log.Infof(" %s", filename)
kernel, initrd, cmdline, _, err := tarToInitrd(image)
Expand All @@ -157,40 +158,40 @@ var outFuns = map[string]func(string, io.Reader, int) error{
}
return nil
},
"vhd": func(base string, image io.Reader, size int) error {
"vhd": func(base string, image io.Reader, size int, arch string) error {
kernel, initrd, cmdline, _, err := tarToInitrd(image)
if err != nil {
return fmt.Errorf("Error converting to initrd: %v", err)
}
err = outputImg(outputImages["vhd"], base+".vhd", kernel, initrd, cmdline)
err = outputImg(outputImages["vhd"], base+".vhd", kernel, initrd, cmdline, arch)
if err != nil {
return fmt.Errorf("Error writing vhd output: %v", err)
}
return nil
},
"dynamic-vhd": func(base string, image io.Reader, size int) error {
"dynamic-vhd": func(base string, image io.Reader, size int, arch string) error {
kernel, initrd, cmdline, _, err := tarToInitrd(image)
if err != nil {
return fmt.Errorf("Error converting to initrd: %v", err)
}
err = outputImg(outputImages["dynamic-vhd"], base+".vhd", kernel, initrd, cmdline)
err = outputImg(outputImages["dynamic-vhd"], base+".vhd", kernel, initrd, cmdline, arch)
if err != nil {
return fmt.Errorf("Error writing vhd output: %v", err)
}
return nil
},
"vmdk": func(base string, image io.Reader, size int) error {
"vmdk": func(base string, image io.Reader, size int, arch string) error {
kernel, initrd, cmdline, _, err := tarToInitrd(image)
if err != nil {
return fmt.Errorf("Error converting to initrd: %v", err)
}
err = outputImg(outputImages["vmdk"], base+".vmdk", kernel, initrd, cmdline)
err = outputImg(outputImages["vmdk"], base+".vmdk", kernel, initrd, cmdline, arch)
if err != nil {
return fmt.Errorf("Error writing vmdk output: %v", err)
}
return nil
},
"rpi3": func(base string, image io.Reader, size int) error {
"rpi3": func(base string, image io.Reader, size int, arch string) error {
if runtime.GOARCH != "arm64" {
return fmt.Errorf("Raspberry Pi output currently only supported on arm64")
}
Expand Down Expand Up @@ -251,7 +252,7 @@ func ValidateFormats(formats []string, cache string) error {
}

// Formats generates all the specified output formats
func Formats(base string, image string, formats []string, size int, cache string) error {
func Formats(base string, image string, formats []string, size int, arch, cache string) error {
log.Debugf("format: %v %s", formats, base)

err := ValidateFormats(formats, cache)
Expand All @@ -265,7 +266,7 @@ func Formats(base string, image string, formats []string, size int, cache string
}
defer ir.Close()
f := outFuns[o]
if err := f(base, ir, size); err != nil {
if err := f(base, ir, size, arch); err != nil {
return err
}
}
Expand Down Expand Up @@ -336,7 +337,7 @@ func tarInitrdKernel(kernel, initrd []byte, cmdline string) (*bytes.Buffer, erro
return buf, tw.Close()
}

func outputImg(image, filename string, kernel []byte, initrd []byte, cmdline string) error {
func outputImg(image, filename string, kernel []byte, initrd []byte, cmdline, arch string) error {
log.Debugf("output img: %s %s", image, filename)
log.Infof(" %s", filename)
buf, err := tarInitrdKernel(kernel, initrd, cmdline)
Expand All @@ -348,18 +349,26 @@ func outputImg(image, filename string, kernel []byte, initrd []byte, cmdline str
return err
}
defer output.Close()
return dockerRun(buf, output, image, cmdline)
march, err := util.MArch(arch)
if err != nil {
return err
}
return dockerRun(buf, output, image, []string{fmt.Sprintf("TARGETARCH=%s", march)}, cmdline)
}

func outputIso(image, filename string, filesystem io.Reader) error {
func outputIso(image, filename string, filesystem io.Reader, arch string) error {
log.Debugf("output ISO: %s %s", image, filename)
log.Infof(" %s", filename)
output, err := os.Create(filename)
if err != nil {
return err
}
defer output.Close()
return dockerRun(filesystem, output, image)
march, err := util.MArch(arch)
if err != nil {
return err
}
return dockerRun(filesystem, output, image, []string{fmt.Sprintf("TARGETARCH=%s", march)})
}

func outputRPi3(image, filename string, filesystem io.Reader) error {
Expand All @@ -370,7 +379,7 @@ func outputRPi3(image, filename string, filesystem io.Reader) error {
return err
}
defer output.Close()
return dockerRun(filesystem, output, image)
return dockerRun(filesystem, output, image, nil)
}

func outputKernelInitrd(base string, kernel []byte, initrd []byte, cmdline string, ucode []byte) error {
Expand Down Expand Up @@ -482,7 +491,7 @@ func outputKernelInitrdTarball(base string, kernel []byte, initrd []byte, cmdlin
return tw.Close()
}

func outputKernelSquashFS(image, base string, filesystem io.Reader) error {
func outputKernelSquashFS(image, base string, filesystem io.Reader, arch string) error {
log.Debugf("output kernel/squashfs: %s %s", image, base)
log.Infof(" %s-squashfs.img", base)

Expand Down Expand Up @@ -534,10 +543,14 @@ func outputKernelSquashFS(image, base string, filesystem io.Reader) error {
}
defer output.Close()

return dockerRun(buf, output, image)
march, err := util.MArch(arch)
if err != nil {
return err
}
return dockerRun(buf, output, image, []string{fmt.Sprintf("TARGETARCH=%s", march)})
}

func outputKernelISO(image, base string, filesystem io.Reader) error {
func outputKernelISO(image, base string, filesystem io.Reader, arch string) error {
log.Debugf("output kernel/iso: %s %s", image, base)
log.Infof(" %s.iso", base)

Expand Down Expand Up @@ -589,5 +602,9 @@ func outputKernelISO(image, base string, filesystem io.Reader) error {
}
defer output.Close()

return dockerRun(buf, output, image)
march, err := util.MArch(arch)
if err != nil {
return err
}
return dockerRun(buf, output, image, []string{fmt.Sprintf("TARGETARCH=%s", march)})
}
25 changes: 25 additions & 0 deletions src/cmd/linuxkit/util/arch.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package util

import "fmt"

// MArch turn an input arch into a canonical arch as given by `uname -m`
func MArch(in string) (string, error) {
switch in {
case "x86_64", "amd64":
return "x86_64", nil
case "aarch64", "arm64":
return "aarch64", nil
}
return "", fmt.Errorf("unknown arch %q", in)
}

// GoArch turn an input arch into a go arch
func GoArch(in string) (string, error) {
switch in {
case "x86_64", "amd64":
return "amd64", nil
case "aarch64", "arm64":
return "arm64", nil
}
return "", fmt.Errorf("unknown arch %q", in)
}