mirror of
https://github.com/linuxkit/linuxkit.git
synced 2025-07-21 10:09:07 +00:00
pkg/mount: also create /dev/disk/by-uuid links
Some software (such as cri-containerd and kubelet) rely on the presence of
these links, which are usually created by udev.
Inspired by 74b145b5c7/sourceroot/functions.sh (L93...L124)
but rewritten in go.
Signed-off-by: Ian Campbell <ijc@docker.com>
This commit is contained in:
parent
d890253cec
commit
2582614135
@ -12,6 +12,7 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
"regexp"
|
"regexp"
|
||||||
"sort"
|
"sort"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"syscall"
|
"syscall"
|
||||||
)
|
)
|
||||||
@ -114,6 +115,84 @@ func findFirst(drives []string) (string, error) {
|
|||||||
return first, nil
|
return first, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func makeDevLinks() error {
|
||||||
|
rex := regexp.MustCompile(`([A-Z]+)=("(?:\\.|[^"])*") ?`)
|
||||||
|
|
||||||
|
byLabel := "/dev/disk/by-label"
|
||||||
|
byUUID := "/dev/disk/by-uuid"
|
||||||
|
for _, p := range []string{byLabel, byUUID} {
|
||||||
|
err := os.MkdirAll(p, 0755)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
devs, err := ioutil.ReadDir("/sys/class/block")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
for _, dev := range devs {
|
||||||
|
name := dev.Name()
|
||||||
|
devpath := filepath.Join("/dev", name)
|
||||||
|
outb, err := exec.Command("blkid", devpath).CombinedOutput()
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Unable to get blkid for %s: %v", devpath, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
out := string(outb)
|
||||||
|
if out == "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
prefix := devpath + ": "
|
||||||
|
if !strings.HasPrefix(out, prefix) {
|
||||||
|
log.Printf("Malformed blkid for %s: %s", name, out)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
out = strings.TrimPrefix(out, prefix)
|
||||||
|
|
||||||
|
for _, match := range rex.FindAllStringSubmatch(out, -1) {
|
||||||
|
key := match[1]
|
||||||
|
|
||||||
|
val, err := strconv.Unquote(match[2])
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Failed to parse: %s\n", match[0])
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
switch key {
|
||||||
|
case "LABEL":
|
||||||
|
// This is not currently handled
|
||||||
|
// because for compatibility we would
|
||||||
|
// need to encode val according to
|
||||||
|
// blkid_encode_string which hex
|
||||||
|
// escapes certain chacters as \xXX.
|
||||||
|
//
|
||||||
|
// See:
|
||||||
|
// https://github.com/systemd/systemd/blob/8d8ce9e2cd066e90c17e2d1eb1882defabb1fa63/src/udev/udev-builtin-blkid.c#L61..L66
|
||||||
|
// https://www.kernel.org/pub/linux/utils/util-linux/v2.21/libblkid-docs/libblkid-Encoding-utils.html
|
||||||
|
case "UUID":
|
||||||
|
// Strictly the value should be
|
||||||
|
// encoded here as with "LABEL" but we
|
||||||
|
// take the chance that a string UUID
|
||||||
|
// is unlikely to contain any unsafe
|
||||||
|
// characters.
|
||||||
|
sympath := filepath.Join(byUUID, val)
|
||||||
|
// udev makes these relative links, copy that behaviour.
|
||||||
|
tgtpath := filepath.Join("..", "..", name)
|
||||||
|
if err := os.Symlink(tgtpath, sympath); err != nil {
|
||||||
|
log.Printf("Failed to create %q: %v", err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
case "TYPE":
|
||||||
|
// uninteresting
|
||||||
|
default:
|
||||||
|
log.Printf("unused %q blkid property %q", name, key, match[0])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// return a list of all available drives
|
// return a list of all available drives
|
||||||
func findDrives() []string {
|
func findDrives() []string {
|
||||||
driveKeys := []string{}
|
driveKeys := []string{}
|
||||||
@ -189,4 +268,9 @@ func main() {
|
|||||||
if err := mount(deviceVar, mountpoint); err != nil {
|
if err := mount(deviceVar, mountpoint); err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if err := makeDevLinks(); err != nil {
|
||||||
|
log.Printf("Failed to make /dev/ links for: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user