github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/lib/mbr/impl.go (about) 1 package mbr 2 3 import ( 4 "fmt" 5 "os" 6 "os/exec" 7 ) 8 9 func decode(file *os.File) (*Mbr, error) { 10 var mbr Mbr 11 if _, err := file.ReadAt(mbr.raw[:], 0); err != nil { 12 return nil, err 13 } 14 if mbr.raw[0x1FE] == 0x55 && mbr.raw[0x1FF] == 0xAA { 15 return &mbr, nil 16 } 17 return nil, nil 18 } 19 20 func (mbr *Mbr) getPartitionOffset(index uint) uint64 { 21 partitionOffset := 0x1BE + 0x10*index 22 return 512 * (uint64(mbr.raw[partitionOffset+8]) + 23 uint64(mbr.raw[partitionOffset+9])<<8 + 24 uint64(mbr.raw[partitionOffset+10])<<16 + 25 uint64(mbr.raw[partitionOffset+11])<<24) 26 } 27 28 func (mbr *Mbr) getPartitionSize(index uint) uint64 { 29 partitionOffset := 0x1BE + 0x10*index 30 return 512 * (uint64(mbr.raw[partitionOffset+12]) + 31 uint64(mbr.raw[partitionOffset+13])<<8 + 32 uint64(mbr.raw[partitionOffset+14])<<16 + 33 uint64(mbr.raw[partitionOffset+15])<<24) 34 } 35 36 func writeDefault(filename string, tableType TableType) error { 37 label, err := tableType.lookupString() 38 if err != nil { 39 return err 40 } 41 fmt.Printf("making table type: %d (%s)\n", tableType, label) 42 cmd := exec.Command("parted", "-s", "-a", "optimal", filename, 43 "mklabel", label, 44 "mkpart", "primary", "ext2", "1", "100%", 45 "set", "1", "boot", "on", 46 ) 47 output, err := cmd.CombinedOutput() 48 if err != nil { 49 return fmt.Errorf("error partitioning: %s: %s: %s", 50 filename, err, output) 51 } 52 return nil 53 }