Implement new findPartUUID that uses github.com/u-root/u-root/pkg/mount/gpt
This commit is contained in:
parent
d62e976d20
commit
1112d98ca9
1
go.mod
1
go.mod
@ -7,5 +7,6 @@ replace github.com/cavaliercoder/grab => ./grab
|
|||||||
require (
|
require (
|
||||||
github.com/cavaliercoder/grab v2.0.0+incompatible
|
github.com/cavaliercoder/grab v2.0.0+incompatible
|
||||||
github.com/lordwelch/pathvalidate v0.0.0-20201012043703-54efa7ea1308
|
github.com/lordwelch/pathvalidate v0.0.0-20201012043703-54efa7ea1308
|
||||||
|
github.com/u-root/u-root v7.0.0+incompatible
|
||||||
golang.org/x/net v0.0.0-20201209123823-ac852fbbde11
|
golang.org/x/net v0.0.0-20201209123823-ac852fbbde11
|
||||||
)
|
)
|
||||||
|
3
go.sum
3
go.sum
@ -1,5 +1,8 @@
|
|||||||
github.com/lordwelch/pathvalidate v0.0.0-20201012043703-54efa7ea1308 h1:CkcsZK6QYg59rc92eqU2h+FRjWltCIiplmEwIB05jfM=
|
github.com/lordwelch/pathvalidate v0.0.0-20201012043703-54efa7ea1308 h1:CkcsZK6QYg59rc92eqU2h+FRjWltCIiplmEwIB05jfM=
|
||||||
github.com/lordwelch/pathvalidate v0.0.0-20201012043703-54efa7ea1308/go.mod h1:4I4r5Y/LkH+34KACiudU+Q27ooz7xSDyVEuWAVKeJEQ=
|
github.com/lordwelch/pathvalidate v0.0.0-20201012043703-54efa7ea1308/go.mod h1:4I4r5Y/LkH+34KACiudU+Q27ooz7xSDyVEuWAVKeJEQ=
|
||||||
|
github.com/u-root/u-root v1.0.0 h1:3hJy0CG3mXIZtWRE+yrghG/3H0v8L1qEeZBlPr5nS9s=
|
||||||
|
github.com/u-root/u-root v7.0.0+incompatible h1:u+KSS04pSxJGI5E7WE4Bs9+Zd75QjFv+REkjy/aoAc8=
|
||||||
|
github.com/u-root/u-root v7.0.0+incompatible/go.mod h1:RYkpo8pTHrNjW08opNd/U6p/RJE7K0D8fXO0d47+3YY=
|
||||||
golang.org/x/net v0.0.0-20201209123823-ac852fbbde11 h1:lwlPPsmjDKK0J6eG6xDWd5XPehI0R024zxjDnw3esPA=
|
golang.org/x/net v0.0.0-20201209123823-ac852fbbde11 h1:lwlPPsmjDKK0J6eG6xDWd5XPehI0R024zxjDnw3esPA=
|
||||||
golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
105
main.go
105
main.go
@ -1,7 +1,6 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/binary"
|
|
||||||
"errors"
|
"errors"
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
@ -10,8 +9,11 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"syscall"
|
"syscall"
|
||||||
|
|
||||||
|
"github.com/u-root/u-root/pkg/mount/gpt"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@ -37,7 +39,7 @@ func mount() error {
|
|||||||
var (
|
var (
|
||||||
partUUIDb []byte
|
partUUIDb []byte
|
||||||
partUUID string
|
partUUID string
|
||||||
dev string
|
dev part
|
||||||
err error
|
err error
|
||||||
dataStat os.FileInfo
|
dataStat os.FileInfo
|
||||||
dataDir = filepath.Join(gloaderHome, "data")
|
dataDir = filepath.Join(gloaderHome, "data")
|
||||||
@ -71,11 +73,11 @@ func mount() error {
|
|||||||
_, err = folder.Readdir(1)
|
_, err = folder.Readdir(1)
|
||||||
if errors.Is(err, io.EOF) {
|
if errors.Is(err, io.EOF) {
|
||||||
fmt.Printf("mount %s %s", partUUID, dataDir)
|
fmt.Printf("mount %s %s", partUUID, dataDir)
|
||||||
dev, err = findPartUUID(partUUID)
|
dev = findPartUUID(partUUID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error mounting datadir: %w", err)
|
return fmt.Errorf("error mounting datadir: %w", err)
|
||||||
}
|
}
|
||||||
err = syscall.Mount(dev, dataDir, "ext4", 0, "")
|
err = syscall.Mount(dev.Path, dataDir, "ext4", 0, "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error mounting datadir: %w", err)
|
return fmt.Errorf("error mounting datadir: %w", err)
|
||||||
}
|
}
|
||||||
@ -86,11 +88,66 @@ func mount() error {
|
|||||||
return fmt.Errorf("error mounting datadir: data dir %s is not a directory", dataDir)
|
return fmt.Errorf("error mounting datadir: data dir %s is not a directory", dataDir)
|
||||||
}
|
}
|
||||||
|
|
||||||
func findPartUUID(uuid string) (string, error) {
|
// func findPartUUID(uuid string) (string, error) {
|
||||||
var dev string
|
// var dev string
|
||||||
|
// err := filepath.Walk("/sys/block", func(path string, info os.FileInfo, err error) error {
|
||||||
|
// if err != nil {
|
||||||
|
// log.Printf("findPartUUID: %v", err)
|
||||||
|
// return nil
|
||||||
|
// }
|
||||||
|
// if info.Mode()&os.ModeSymlink == 0 {
|
||||||
|
// return nil
|
||||||
|
// }
|
||||||
|
// devname := "/dev/" + filepath.Base(path)
|
||||||
|
// f, err := os.Open(devname)
|
||||||
|
// if err != nil {
|
||||||
|
// log.Printf("findPartUUID: %v", err)
|
||||||
|
// return nil
|
||||||
|
// }
|
||||||
|
// defer f.Close()
|
||||||
|
// if _, err := f.Seek(440, io.SeekStart); err != nil {
|
||||||
|
// var se syscall.Errno
|
||||||
|
// if errors.As(err, &se) && se == syscall.EINVAL {
|
||||||
|
// // Seek()ing empty loop devices results in EINVAL.
|
||||||
|
// return nil
|
||||||
|
// }
|
||||||
|
// log.Printf("findPartUUID: %v(%T)", err, err.(*os.PathError).Err)
|
||||||
|
// return nil
|
||||||
|
// }
|
||||||
|
// var diskSig struct {
|
||||||
|
// ID uint32
|
||||||
|
// Trailer uint16
|
||||||
|
// }
|
||||||
|
// if err := binary.Read(f, binary.LittleEndian, &diskSig); err != nil {
|
||||||
|
// log.Printf("findPartUUID: %v", err)
|
||||||
|
// return nil
|
||||||
|
// }
|
||||||
|
// if fmt.Sprintf("%08x", diskSig.ID) == uuid && diskSig.Trailer == 0 {
|
||||||
|
// dev = devname
|
||||||
|
// // TODO: abort early with sentinel error code
|
||||||
|
// return nil
|
||||||
|
// }
|
||||||
|
// return nil
|
||||||
|
// })
|
||||||
|
// if err != nil {
|
||||||
|
// return "", err
|
||||||
|
// }
|
||||||
|
// if dev == "" {
|
||||||
|
// return "", fmt.Errorf("PARTUUID=%s not found", uuid)
|
||||||
|
// }
|
||||||
|
// return dev, nil
|
||||||
|
// }
|
||||||
|
|
||||||
|
type part struct {
|
||||||
|
UUID string
|
||||||
|
Path string
|
||||||
|
}
|
||||||
|
|
||||||
|
func findPartUUID(UUID string) part {
|
||||||
|
var dev part
|
||||||
err := filepath.Walk("/sys/block", func(path string, info os.FileInfo, err error) error {
|
err := filepath.Walk("/sys/block", func(path string, info os.FileInfo, err error) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("findPartUUID: %v", err)
|
log.Printf("listPartUUID: %v", err)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
if info.Mode()&os.ModeSymlink == 0 {
|
if info.Mode()&os.ModeSymlink == 0 {
|
||||||
@ -99,39 +156,23 @@ func findPartUUID(uuid string) (string, error) {
|
|||||||
devname := "/dev/" + filepath.Base(path)
|
devname := "/dev/" + filepath.Base(path)
|
||||||
f, err := os.Open(devname)
|
f, err := os.Open(devname)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("findPartUUID: %v", err)
|
log.Printf("listPartUUID: %v", err)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
defer f.Close()
|
defer f.Close()
|
||||||
if _, err := f.Seek(440, io.SeekStart); err != nil {
|
parttable, _ := gpt.New(f)
|
||||||
var se syscall.Errno
|
if parttable.Primary != nil {
|
||||||
if errors.As(err, &se) && se == syscall.EINVAL {
|
for i, partition := range parttable.Primary.Parts {
|
||||||
// Seek()ing empty loop devices results in EINVAL.
|
if partition.UniqueGUID.String() == UUID {
|
||||||
return nil
|
dev = part{UUID: partition.UniqueGUID.String(), Path: devname + strconv.Itoa(i+1)}
|
||||||
}
|
}
|
||||||
log.Printf("findPartUUID: %v(%T)", err, err.(*os.PathError).Err)
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
var diskSig struct {
|
|
||||||
ID uint32
|
|
||||||
Trailer uint16
|
|
||||||
}
|
|
||||||
if err := binary.Read(f, binary.LittleEndian, &diskSig); err != nil {
|
|
||||||
log.Printf("findPartUUID: %v", err)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
if fmt.Sprintf("%08x", diskSig.ID) == uuid && diskSig.Trailer == 0 {
|
|
||||||
dev = devname
|
|
||||||
// TODO: abort early with sentinel error code
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return part{}
|
||||||
}
|
}
|
||||||
if dev == "" {
|
return dev
|
||||||
return "", fmt.Errorf("PARTUUID=%s not found", uuid)
|
|
||||||
}
|
|
||||||
return dev, nil
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user