format ESP using mformat
This commit is contained in:
@@ -2,6 +2,7 @@ package main
|
||||
|
||||
import (
|
||||
"archive/tar"
|
||||
"bytes"
|
||||
"compress/gzip"
|
||||
"flag"
|
||||
"fmt"
|
||||
@@ -93,47 +94,11 @@ func qemuImgBootImg(format string, uki bool, cmdline string) func(out io.Writer,
|
||||
}
|
||||
}
|
||||
|
||||
var grubSupportVersion = flag.String("grub-support", "1.1.0", "GRUB support version")
|
||||
|
||||
func setupBootImage(bootImg *os.File, ctx *renderContext, uki bool, cmdline string) (err error) {
|
||||
if uki {
|
||||
err = bootImg.Truncate(192 << 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
|
||||
}
|
||||
|
||||
err = baseDiskUki(bootImg, 192)
|
||||
} 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
|
||||
}()
|
||||
err = baseDiskGrub(bootImg)
|
||||
}
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -170,13 +135,6 @@ func setupBootImage(bootImg *os.File, ctx *renderContext, uki bool, cmdline stri
|
||||
|
||||
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)
|
||||
@@ -231,6 +189,74 @@ func setupBootImage(bootImg *os.File, ctx *renderContext, uki bool, cmdline stri
|
||||
return
|
||||
}
|
||||
|
||||
func baseDiskUki(image *os.File, sizeMB int16) (err error) {
|
||||
err = image.Truncate(0)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
size := int64(sizeMB) << 20
|
||||
|
||||
err = image.Truncate(size)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
err = image.Sync()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
err = run("sgdisk", "--zap", "--new=1:2048:", "--typecode=1:EF00", "--change-name=1:ESP", image.Name())
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
const (
|
||||
espOffset = 2048 * 512
|
||||
gptBackupSectors = 34 // real world data
|
||||
)
|
||||
espSectors := (size-espOffset)/512 - gptBackupSectors
|
||||
|
||||
cfg := fmt.Sprintf("drive d: file=%q offset=%d\n", image.Name(), espOffset)
|
||||
err = mtool(cfg, "mformat", "-F", "-T", fmt.Sprint(espSectors), "d:")
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
var grubSupportVersion = flag.String("grub-support", "1.1.1", "GRUB support version")
|
||||
|
||||
func baseDiskGrub(image *os.File) (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(image, baseImageGz)
|
||||
return
|
||||
}
|
||||
|
||||
func mtool(config string, program string, args ...string) (err error) {
|
||||
cmd := exec.Command(program, args...)
|
||||
cmd.Env = append(os.Environ(), "MTOOLSRC=/dev/stdin")
|
||||
cmd.Stdin = bytes.NewBufferString(config)
|
||||
cmd.Stdout = os.Stdout
|
||||
cmd.Stderr = os.Stderr
|
||||
return cmd.Run()
|
||||
}
|
||||
|
||||
func run(program string, args ...string) (err error) {
|
||||
cmd := exec.Command(program, args...)
|
||||
cmd.Stdout = os.Stdout
|
||||
|
||||
Reference in New Issue
Block a user