aboutsummaryrefslogtreecommitdiff
path: root/nvme/nvme-ebs-links
blob: f2c470b285052475844541025ccfbf7afde83cf0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/bin/sh

[ -x /usr/sbin/nvme ] || exit

PROC="$(basename $0)[$$]"

log() {
  FACILITY="kern.$1"
  shift
  logger -s -p "$FACILITY" -t "$PROC" "$@"
}

raw_ebs_alias() {
  /usr/sbin/nvme id-ctrl "/dev/$BASE" -b 2>/dev/null | dd bs=32 skip=96 count=1 2>/dev/null
}

case $ACTION in
  add|"")
    BASE=$(echo $MDEV | sed -re 's/^(nvme[0-9]+n[0-9]+).*/\1/')
    PART=$(echo $MDEV | sed -re 's/nvme[0-9]+n[0-9]+p?//g')
    MAXTRY=50
    TRY=0
    until [ -n "$EBS" ]; do
      EBS=$(raw_ebs_alias | sed -nre '/^(\/dev\/)?(s|xv)d[a-z]{1,2} /p' | tr -d ' ')
      [ -n "$EBS" ] && break
      TRY=$((TRY + 1))
      if [ $TRY -eq $MAXTRY ]; then
        log err "Failed to get EBS volume alias for $MDEV after $MAXTRY attempts ($(raw_ebs_alias))"
        exit 1
      fi
      sleep 0.1
    done
    EBS=${EBS#/dev/}$PART
    ln -sf "$MDEV" "${EBS/xvd/sd}" && log notice "Added ${EBS/xvd/sd} symlink for $MDEV"
    ln -sf "$MDEV" "${EBS/sd/xvd}" && log notice "Added ${EBS/sd/xvd} symlink for $MDEV"
    ;;
  remove)
    for TARGET in sd* xvd*
    do
      [ "$(readlink $TARGET 2>/dev/null)" = "$MDEV" ] && rm -f "$TARGET" && log notice "Removed $TARGET symlink for $MDEV"
    done
    ;;
esac