support UKI
This commit is contained in:
@@ -12,18 +12,16 @@ import (
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"syscall"
|
||||
|
||||
"github.com/pierrec/lz4"
|
||||
)
|
||||
|
||||
func buildBootImg(out io.Writer, ctx *renderContext) (err error) {
|
||||
func buildBootImg(out io.Writer, ctx *renderContext, uki bool, cmdline string) (err error) {
|
||||
bootImg, err := os.CreateTemp(os.TempDir(), "boot.img-")
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
defer rmTempFile(bootImg)
|
||||
|
||||
err = setupBootImage(bootImg, ctx)
|
||||
err = setupBootImage(bootImg, ctx, uki, cmdline)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
@@ -34,21 +32,10 @@ func buildBootImg(out io.Writer, ctx *renderContext) (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func buildBootImgLZ4(out io.Writer, ctx *renderContext) (err error) {
|
||||
lz4Out := lz4.NewWriter(out)
|
||||
|
||||
if err = buildBootImg(lz4Out, ctx); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
lz4Out.Close()
|
||||
return
|
||||
}
|
||||
|
||||
func buildBootImgGZ(out io.Writer, ctx *renderContext) (err error) {
|
||||
func buildBootImgGZ(out io.Writer, ctx *renderContext, uki bool, cmdline string) (err error) {
|
||||
gzOut := gzip.NewWriter(out)
|
||||
|
||||
if err = buildBootImg(gzOut, ctx); err != nil {
|
||||
if err = buildBootImg(gzOut, ctx, uki, cmdline); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
@@ -56,7 +43,7 @@ func buildBootImgGZ(out io.Writer, ctx *renderContext) (err error) {
|
||||
return
|
||||
}
|
||||
|
||||
func buildBootImgQemuConvert(out io.Writer, ctx *renderContext, format string) (err error) {
|
||||
func buildBootImgQemuConvert(out io.Writer, ctx *renderContext, format string, uki bool, cmdline string) (err error) {
|
||||
imgPath, err := func() (imgPath string, err error) {
|
||||
bootImg, err := os.CreateTemp(os.TempDir(), "boot.img-")
|
||||
if err != nil {
|
||||
@@ -64,7 +51,7 @@ func buildBootImgQemuConvert(out io.Writer, ctx *renderContext, format string) (
|
||||
}
|
||||
defer rmTempFile(bootImg)
|
||||
|
||||
err = setupBootImage(bootImg, ctx)
|
||||
err = setupBootImage(bootImg, ctx, uki, cmdline)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
@@ -100,37 +87,56 @@ func buildBootImgQemuConvert(out io.Writer, ctx *renderContext, format string) (
|
||||
io.Copy(out, img)
|
||||
return
|
||||
}
|
||||
func qemuImgBootImg(format string) func(out io.Writer, ctx *renderContext) (err error) {
|
||||
func qemuImgBootImg(format string, uki bool, cmdline string) func(out io.Writer, ctx *renderContext) (err error) {
|
||||
return func(out io.Writer, ctx *renderContext) (err error) {
|
||||
return buildBootImgQemuConvert(out, ctx, format)
|
||||
return buildBootImgQemuConvert(out, ctx, format, uki, cmdline)
|
||||
}
|
||||
}
|
||||
|
||||
var grubSupportVersion = flag.String("grub-support", "1.1.0", "GRUB support version")
|
||||
|
||||
func setupBootImage(bootImg *os.File, ctx *renderContext) (err error) {
|
||||
path, err := distFetch("grub-support", *grubSupportVersion)
|
||||
if err != nil {
|
||||
return
|
||||
func setupBootImage(bootImg *os.File, ctx *renderContext, uki bool, cmdline string) (err error) {
|
||||
if uki {
|
||||
err = bootImg.Truncate(128 << 20)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
err = bootImg.Sync()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
err = run("sgdisk", bootImg.Name(), "--clear", "--largest-new=1", "--typecode=1:EF00", "--change-name=1:ESP")
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
} else {
|
||||
err = func() (err error) {
|
||||
path, err := distFetch("grub-support", *grubSupportVersion)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
baseImage, err := os.Open(path)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
defer baseImage.Close()
|
||||
|
||||
baseImageGz, err := gzip.NewReader(baseImage)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
defer baseImageGz.Close()
|
||||
_, err = io.Copy(bootImg, baseImageGz)
|
||||
return
|
||||
}()
|
||||
}
|
||||
|
||||
baseImage, err := os.Open(path)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
defer baseImage.Close()
|
||||
|
||||
baseImageGz, err := gzip.NewReader(baseImage)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
defer baseImageGz.Close()
|
||||
_, err = io.Copy(bootImg, baseImageGz)
|
||||
|
||||
if err != nil {
|
||||
return
|
||||
return err
|
||||
}
|
||||
|
||||
log.Print("running losetup...")
|
||||
@@ -163,6 +169,14 @@ func setupBootImage(bootImg *os.File, ctx *renderContext) (err error) {
|
||||
}()
|
||||
|
||||
devp1 := dev + "p1"
|
||||
|
||||
if uki {
|
||||
err = run("mkfs.vfat", "-F", "32", devp1)
|
||||
if err != nil {
|
||||
return fmt.Errorf("mkfs.vfat: %w", err)
|
||||
}
|
||||
}
|
||||
|
||||
err = syscall.Mount(devp1, tempDir, "vfat", 0, "")
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to mount %s to %s: %v", devp1, tempDir, err)
|
||||
@@ -176,10 +190,10 @@ func setupBootImage(bootImg *os.File, ctx *renderContext) (err error) {
|
||||
// add system elements
|
||||
tarOut, tarIn := io.Pipe()
|
||||
go func() {
|
||||
err2 := buildBootTar(tarIn, ctx)
|
||||
e := buildBootTar(tarIn, ctx, uki, cmdline)
|
||||
tarIn.Close()
|
||||
if err2 != nil {
|
||||
err = err2
|
||||
if e != nil {
|
||||
err = e
|
||||
}
|
||||
}()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user