summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doGui.go21
-rw-r--r--makeGptPartitions.go88
2 files changed, 109 insertions, 0 deletions
diff --git a/doGui.go b/doGui.go
index 8263587..e6dd625 100644
--- a/doGui.go
+++ b/doGui.go
@@ -38,6 +38,22 @@ func addDrive(devname string, displayDesc string) *Block {
return blkpb
}
+// show the output of parted <dev> print
+func showPartitions(blk *Block) {
+ if blk == nil {
+ return
+ }
+
+ log.Info("check if", blk.Name, "is in use")
+ result, err := shell.RunVerbose([]string{"parted", blk.Name, "print"})
+ log.Info("result =", result.Stdout, "err =", err)
+ out := strings.Join(result.Stdout, "\n")
+ if err != nil {
+ out += log.Sprintf("err = %v", err)
+ }
+ me.driveInfoBox.SetText(out)
+}
+
func switchDrive(blk *Block) {
var inUse bool = false
me.currentDev = blk
@@ -126,6 +142,11 @@ func drawWindow(win *gadgets.GenericWindow) {
return
}
log.Info("If you got here, gdisk should be safe to run on", me.currentDev.Name)
+ if err := makeDefaultGPT(me.currentDev.Name); err != nil {
+ log.Info("PARTITIONING FAILED on", me.currentDev.Name, "with", err)
+ return
+ }
+ showPartitions(me.currentDev)
})
grid.NextRow()
diff --git a/makeGptPartitions.go b/makeGptPartitions.go
new file mode 100644
index 0000000..d272e7d
--- /dev/null
+++ b/makeGptPartitions.go
@@ -0,0 +1,88 @@
+package main
+
+import (
+ "fmt"
+ "io"
+ "os"
+
+ "go.wit.com/log"
+
+ "github.com/diskfs/go-diskfs"
+ "github.com/diskfs/go-diskfs/partition/gpt"
+)
+
+// make a default bootable GPT partition table
+func makeDefaultGPT(devname string) error {
+ // Open disk
+ // disk, err := diskfs.Open(devname, diskfs.ReadWrite)
+ disk, err := diskfs.Open(devname, diskfs.WithOpenMode(diskfs.ReadWrite))
+ if err != nil {
+ log.Errorf("Failed to open disk: %v\n", err)
+ return err
+ }
+
+ file, err := os.Open(devname)
+ if err != nil {
+ log.Errorf("Failed to open file for size: %v\n", err)
+ return err
+ }
+ defer file.Close()
+
+ // Determine disk size via Seek
+ sizeBytes, err := file.Seek(0, io.SeekEnd)
+ if err != nil {
+ log.Errorf("Failed to determine disk size: %v\n", err)
+ return err
+ }
+ sectorSize := int64(512)
+ totalSectors := uint64(sizeBytes / sectorSize)
+
+ // Setup partitions:
+ // Partition 1: BIOS boot, ~1MiB, starts at sector 2048
+ biosStart := uint64(2048)
+ biosSize := uint64(1 * 1024 * 1024) // bytes
+ biosSectors := biosSize / uint64(sectorSize)
+
+ // Partition 2: rest of the disk
+ rootStart := biosStart + biosSectors
+ rootSectors := totalSectors - rootStart
+
+ table := &gpt.Table{
+ LogicalSectorSize: int(sectorSize),
+ PhysicalSectorSize: int(sectorSize),
+ ProtectiveMBR: true,
+ Partitions: []*gpt.Partition{
+ {
+ Start: biosStart,
+ End: biosStart + biosSectors - 1,
+ // Size is optional, but let's provide it
+ Size: biosSectors * uint64(sectorSize),
+ // GUID for BIOS boot partition (ESP-like GUID for BIOS boot)
+ Type: biosBootGUID,
+ Name: "bios_grub",
+ },
+ {
+ Start: rootStart,
+ End: totalSectors - 1,
+ Size: rootSectors * uint64(sectorSize),
+ // GUID for Linux filesystem partition
+ Type: linuxFSGUID,
+ Name: "root",
+ },
+ },
+ }
+
+ if err := disk.Partition(table); err != nil {
+ log.Errorf("Failed to write GPT partition table: %v", err)
+ return err
+ }
+
+ fmt.Println("Partition table successfully written!")
+ return nil
+}
+
+// GUID definitions (copied from GPT standard tables)
+const (
+ biosBootGUID = "21686148-6449-6E6F-744E-656564454649" // BIOS boot
+ linuxFSGUID = "0FC63DAF-8483-4772-8E79-3D69D8477DE4" // Linux filesystem
+)