format ESP using mformat

This commit is contained in:
Mikaël Cluseau
2026-06-17 11:37:52 +02:00
parent 66f391de19
commit 99d8c7598e
2 changed files with 75 additions and 49 deletions
+4 -4
View File
@@ -1,7 +1,7 @@
from novit.tech/direktil/dkl:v1.2.0 as dkl from novit.tech/direktil/dkl:v1.2.0 as dkl
# ------------------------------------------------------------------------ # ------------------------------------------------------------------------
from golang:1.26.1-trixie as build from golang:1.26.4-trixie as build
run apt-get update && apt-get install -y git run apt-get update && apt-get install -y git
@@ -27,11 +27,11 @@ from debian:trixie
entrypoint ["/bin/dkl-local-server"] entrypoint ["/bin/dkl-local-server"]
env _uncache=1 env _uncache=1
run apt update \ run --mount=type=cache,id=debian-trixie-apt,target=/var/cache/apt \
apt update \
&& yes |apt install -y genisoimage gdisk dosfstools util-linux udev binutils systemd \ && yes |apt install -y genisoimage gdisk dosfstools util-linux udev binutils systemd \
grub2 grub-pc-bin grub-efi-amd64-bin ca-certificates curl openssh-client qemu-utils wireguard-tools \ grub2 grub-pc-bin grub-efi-amd64-bin ca-certificates curl openssh-client qemu-utils wireguard-tools \
erofs-utils erofsfuse cryptsetup systemd-boot-efi \ erofs-utils erofsfuse cryptsetup systemd-boot-efi mtools
&& apt clean
copy --from=dkl /bin/dkl /bin/dls /bin/ copy --from=dkl /bin/dkl /bin/dls /bin/
copy --from=build /src/dist/ /bin/ copy --from=build /src/dist/ /bin/
+71 -45
View File
@@ -2,6 +2,7 @@ package main
import ( import (
"archive/tar" "archive/tar"
"bytes"
"compress/gzip" "compress/gzip"
"flag" "flag"
"fmt" "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) { func setupBootImage(bootImg *os.File, ctx *renderContext, uki bool, cmdline string) (err error) {
if uki { if uki {
err = bootImg.Truncate(192 << 20) err = baseDiskUki(bootImg, 192)
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 { } else {
err = func() (err error) { err = baseDiskGrub(bootImg)
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
}()
} }
if err != nil { if err != nil {
return err return err
@@ -170,13 +135,6 @@ func setupBootImage(bootImg *os.File, ctx *renderContext, uki bool, cmdline stri
devp1 := dev + "p1" 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, "") err = syscall.Mount(devp1, tempDir, "vfat", 0, "")
if err != nil { if err != nil {
return fmt.Errorf("failed to mount %s to %s: %v", devp1, tempDir, err) 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 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) { func run(program string, args ...string) (err error) {
cmd := exec.Command(program, args...) cmd := exec.Command(program, args...)
cmd.Stdout = os.Stdout cmd.Stdout = os.Stdout