treewide: port everything to blockdev

This gets rid of most ad-hoc block device code, using blockdev for
everything. It also gets rid of diskfs for everything but tests. This
enables Metropolis to be installed on non-512-byte block sizes.

Change-Id: I644b5b68bb7bed8106585df3179674789031687a
Reviewed-on: https://review.monogon.dev/c/monogon/+/1873
Tested-by: Jenkins CI
Reviewed-by: Serge Bazanski <serge@monogon.tech>
diff --git a/metropolis/cli/metroctl/cmd_install.go b/metropolis/cli/metroctl/cmd_install.go
index 9ad7953..39790f1 100644
--- a/metropolis/cli/metroctl/cmd_install.go
+++ b/metropolis/cli/metroctl/cmd_install.go
@@ -15,6 +15,8 @@
 	"source.monogon.dev/metropolis/cli/metroctl/core"
 	clicontext "source.monogon.dev/metropolis/cli/pkg/context"
 	"source.monogon.dev/metropolis/cli/pkg/datafile"
+	"source.monogon.dev/metropolis/pkg/blkio"
+	"source.monogon.dev/metropolis/pkg/fat32"
 	"source.monogon.dev/metropolis/proto/api"
 	cpb "source.monogon.dev/metropolis/proto/common"
 )
@@ -49,30 +51,21 @@
 	size   uint64
 }
 
-func external(name, datafilePath string, flag *string) *externalFile {
+func external(name, datafilePath string, flag *string) fat32.SizedReader {
 	if flag == nil || *flag == "" {
 		df, err := datafile.Get(datafilePath)
 		if err != nil {
 			log.Fatalf("No %s specified", name)
 		}
-		return &externalFile{
-			reader: bytes.NewReader(df),
-			size:   uint64(len(df)),
-		}
+		return bytes.NewReader(df)
 	}
 
-	f, err := os.Open(*bundlePath)
+	f, err := blkio.NewFileReader(*bundlePath)
 	if err != nil {
 		log.Fatalf("Failed to open specified %s: %v", name, err)
 	}
-	st, err := f.Stat()
-	if err != nil {
-		log.Fatalf("Failed to stat specified %s: %v", name, err)
-	}
-	return &externalFile{
-		reader: f,
-		size:   uint64(st.Size()),
-	}
+
+	return f
 }
 
 func doGenUSB(cmd *cobra.Command, args []string) {
@@ -154,12 +147,10 @@
 	}
 
 	installerImageArgs := core.MakeInstallerImageArgs{
-		TargetPath:    args[0],
-		Installer:     installer.reader,
-		InstallerSize: installer.size,
-		NodeParams:    params,
-		Bundle:        bundle.reader,
-		BundleSize:    bundle.size,
+		TargetPath: args[0],
+		Installer:  installer,
+		NodeParams: params,
+		Bundle:     bundle,
 	}
 
 	log.Printf("Generating installer image (this can take a while, see issues/92).")