add qcow2 and vmdk boot images

This commit is contained in:
Mikaël Cluseau
2025-06-12 11:53:08 +02:00
parent 1871eac7bb
commit 58cfaa7d0f
5 changed files with 72 additions and 10 deletions

View File

@ -1,5 +1,5 @@
# ------------------------------------------------------------------------ # ------------------------------------------------------------------------
from golang:1.22.2-bookworm as build from golang:1.24.3-bookworm as build
run apt-get update && apt-get install -y git run apt-get update && apt-get install -y git
@ -27,7 +27,7 @@ entrypoint ["/bin/dkl-local-server"]
env _uncache=1 env _uncache=1
run apt-get update \ run apt-get update \
&& yes |apt-get install -y genisoimage gdisk dosfstools util-linux udev binutils systemd \ && yes |apt-get install -y genisoimage gdisk dosfstools util-linux udev binutils systemd \
grub2 grub-pc-bin grub-efi-amd64-bin ca-certificates curl openssh-client \ grub2 grub-pc-bin grub-efi-amd64-bin ca-certificates curl openssh-client qemu-utils \
&& apt-get clean && apt-get clean
copy --from=build /src/dist/ /bin/ copy --from=build /src/dist/ /bin/

View File

@ -56,6 +56,55 @@ func buildBootImgGZ(out io.Writer, ctx *renderContext) (err error) {
return return
} }
func buildBootImgQemuConvert(out io.Writer, ctx *renderContext, format string) (err error) {
imgPath, err := func() (imgPath string, err error) {
bootImg, err := os.CreateTemp(os.TempDir(), "boot.img-")
if err != nil {
return
}
defer rmTempFile(bootImg)
err = setupBootImage(bootImg, ctx)
if err != nil {
return
}
err = bootImg.Sync()
if err != nil {
return
}
imgPath = bootImg.Name() + "." + format
err = run("qemu-img", "convert", "-f", "raw", "-O", format, bootImg.Name(), imgPath)
if err != nil {
return
}
return
}()
defer os.Remove(imgPath)
if err != nil {
return
}
// send the result
img, err := os.Open(imgPath)
if err != nil {
return
}
io.Copy(out, img)
return
}
func buildBootQcow2(out io.Writer, ctx *renderContext) (err error) {
return buildBootImgQemuConvert(out, ctx, "qcow2")
}
func buildBootVmdk(out io.Writer, ctx *renderContext) (err error) {
return buildBootImgQemuConvert(out, ctx, "vmdk")
}
var grubSupportVersion = flag.String("grub-support", "1.1.0", "GRUB support version") var grubSupportVersion = flag.String("grub-support", "1.1.0", "GRUB support version")
func setupBootImage(bootImg *os.File, ctx *renderContext) (err error) { func setupBootImage(bootImg *os.File, ctx *renderContext) (err error) {

View File

@ -54,6 +54,13 @@ func (ws wsHost) register(rws *restful.WebService, alterRB func(*restful.RouteBu
Produces(mime.DISK + "+lz4"). Produces(mime.DISK + "+lz4").
Doc("Get the " + ws.hostDoc + "'s boot disk image (lz4 compressed)"), Doc("Get the " + ws.hostDoc + "'s boot disk image (lz4 compressed)"),
b("boot.qcow2").
Produces(mime.DISK + "+qcow2").
Doc("Get the " + ws.hostDoc + "'s boot disk image (qcow2)"),
b("boot.vmdk").
Produces(mime.DISK + "+vmdk").
Doc("Get the " + ws.hostDoc + "'s boot disk image (VMDK)"),
// metal/local HDD upgrades // metal/local HDD upgrades
b("boot.tar"). b("boot.tar").
Produces(mime.TAR). Produces(mime.TAR).
@ -186,6 +193,10 @@ func renderHost(w http.ResponseWriter, r *http.Request, what string, host *local
err = renderCtx(w, r, ctx, what, buildBootImgGZ) err = renderCtx(w, r, ctx, what, buildBootImgGZ)
case "boot.img.lz4": case "boot.img.lz4":
err = renderCtx(w, r, ctx, what, buildBootImgLZ4) err = renderCtx(w, r, ctx, what, buildBootImgLZ4)
case "boot.qcow2":
err = renderCtx(w, r, ctx, what, buildBootQcow2)
case "boot.vmdk":
err = renderCtx(w, r, ctx, what, buildBootVmdk)
default: default:
http.NotFound(w, r) http.NotFound(w, r)

View File

@ -20,6 +20,8 @@ export default {
"boot-efi.tar", "boot-efi.tar",
"boot.img.gz", "boot.img.gz",
"boot.img", "boot.img",
"boot.qcow2",
"boot.vmdk",
"ipxe", "ipxe",
], ],
}[this.kind] }[this.kind]

View File

@ -12,15 +12,15 @@ html/**/* {
prep: hack/build ./cmd/dkl-local-server prep: hack/build ./cmd/dkl-local-server
} }
dist/dkl-local-server { #dist/dkl-local-server {
prep: mkdir -p tmp # prep: mkdir -p tmp
daemon +sigterm: dist/dkl-local-server -data tmp -auto-unlock test # daemon +sigterm: dist/dkl-local-server -data tmp -auto-unlock test
} #}
dist/dkl-dir2config { dist/dkl-dir2config {
prep: dist/dkl-dir2config --debug --in test-dir2config # prep: dist/dkl-dir2config --debug --in test-dir2config
} }
**/*.proto !dist/**/* { #**/*.proto !dist/**/* {
prep: for mod in @mods; do protoc -I ./ --go_out=plugins=grpc,paths=source_relative:. $mod; done # prep: for mod in @mods; do protoc -I ./ --go_out=plugins=grpc,paths=source_relative:. $mod; done
} #}