Fix/finish modularization
[mapsector.git] / lib / 50_map_lvm.sh
1 detect_lvm()
2 {
3     which pvdisplay >/dev/null 2>&1 && pvdisplay $device >/dev/null 2>&1
4 }
5
6 describe_lvm()
7 {
8     echo "    LVM (linear allocation scheme)"
9 }
10
11 do_lvm()
12 {
13     local pvname
14     local pesize
15     local vgname
16     local pestart
17     local penum
18     local subsector
19     local lestart
20     local firstpe
21     local lenum
22     local fsdev
23     local fssector
24
25     echo "# $device: LVM detected" 1>&2
26     
27     # Step 3: Get pysical extent number
28
29     pvname="`pvdisplay -c $device 2>/dev/null | awk -F: '{print $1,$2,$8}' | sed -e 's/^ *//'`"
30
31     if [ -z "$pvname" ]; then
32         echo "! $device is not a physical volume" 1>&2
33         exit 1
34     fi
35
36     pesize="${pvname##* }"
37     vgname="${pvname% *}"
38     pvname="${vgname% *}"
39     vgname="${vgname#* }"
40     pesize="`dc -e "$pesize 2 * p"`" #`"
41     pestart="`pvs --unit s -ope_start $device 2>/dev/null | sed -n -e 's/ *//g' -e 's/S.*$//' -e '$p'`"
42     penum="`dc -e "$sector $pestart - $pesize ~ n [ ] n p"`" #`"
43     subsector="${penum% *}"
44     penum="${penum#* }"
45
46     echo "device $pvname pv"
47     echo "offset $pestart"
48     echo "pesize $pesize"
49     echo "extent $penum"
50     echo "subsector $subsector"
51     echo "group $vgname"
52
53     # Step 4: Find associated logical volume
54
55     lestart="$(vgdisplay -v $vgname 2>/dev/null | awk '/LV Name/{print $3}' | while read lvname; do \
56         lvdisplay -m $lvname 2>/dev/null \
57             | awk -v RS="\n *\n(  --- Segments ---\n)?" \
58                   -F"[ \t\n:]+" \
59                   -v pvname="$pvname" \
60                   -v penum="$penum" \
61                   -v lvname="$lvname" \
62                   '$0 ~ "Physical volume[ \t]+" pvname && $14<=penum && $16>=penum{print lvname,$4,$14}'; \
63         done)"
64
65     if [ -z "$lestart" ]; then
66         echo "# pysical extent $penum of $pvname is not mapped in any logical volume" 1>&2
67         exit 0
68     fi
69
70     lvname="${lestart%% *}"
71     lestart="${lestart#* }"
72     firstpe="${lestart#* }"
73     lestart="${lestart% *}"
74     lenum="`dc -e "$penum $firstpe - $lestart + p"`" #`"
75
76     echo "device $lvname lv"
77     echo "extent $lenum"
78
79     fsdev="$lvname"
80     fssector="`dc -e "$lenum $pesize * $subsector + p"`" #`"
81
82     echo "sector $fssector"
83
84     device="$fsdev"
85     sector="$fssector"
86
87     return 1
88 }
89
90 register_mapper "lvm"