format ESP using mformat
This commit is contained in:
+4
-4
@@ -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/
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user