add qcow2 and vmdk boot images
This commit is contained in:
@ -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/
|
||||||
|
@ -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) {
|
||||||
|
@ -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)
|
||||||
|
@ -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]
|
||||||
|
16
modd.conf
16
modd.conf
@ -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
|
||||||
}
|
#}
|
||||||
|
Reference in New Issue
Block a user