51fbffcd73ccc8f3913a4ef653afb4784caad272
[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 map_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     # Step 3: Get pysical extent number
26
27     pvname="`pvdisplay -c $device 2>/dev/null | awk -F: '{print $1,$2,$8}' | sed -e 's/^ *//'`"
28
29     if [ -z "$pvname" ]; then
30         echo "! $device is not a physical volume" 1>&2
31         exit 1
32     fi
33
34     pesize="${pvname##* }"
35     vgname="${pvname% *}"
36     pvname="${vgname% *}"
37     vgname="${vgname#* }"
38     pesize="`dc -e "$pesize 2 * p"`" #`"
39     pestart="`pvs --unit s -ope_start $device 2>/dev/null | sed -n -e 's/ *//g' -e 's/S.*$//' -e '$p'`"
40     penum="`dc -e "$sector $pestart - $pesize ~ n [ ] n p"`" #`"
41     subsector="${penum% *}"
42     penum="${penum#* }"
43
44     echo "device $pvname pv"
45     echo "offset $pestart"
46     echo "pesize $pesize"
47     echo "extent $penum"
48     echo "subsector $subsector"
49     echo "group $vgname"
50
51     # Step 4: Find associated logical volume
52
53     lestart="$(vgdisplay -v $vgname 2>/dev/null | awk '/LV Name/{print $3}' | while read lvname; do \
54         lvdisplay -m $lvname 2>/dev/null \
55             | awk -v RS="\n *\n(  --- Segments ---\n)?" \
56                   -F"[ \t\n:]+" \
57                   -v pvname="$pvname" \
58                   -v penum="$penum" \
59                   -v lvname="$lvname" \
60                   '$0 ~ "Physical volume[ \t]+" pvname && $14<=penum && $16>=penum{print lvname,$4,$14}'; \
61         done)"
62
63     if [ -z "$lestart" ]; then
64         echo "# pysical extent $penum of $pvname is not mapped in any logical volume" 1>&2
65         exit 0
66     fi
67
68     lvname="${lestart%% *}"
69     lestart="${lestart#* }"
70     firstpe="${lestart#* }"
71     lestart="${lestart% *}"
72     lenum="`dc -e "$penum $firstpe - $lestart + p"`" #`"
73
74     echo "device $lvname lv"
75     echo "extent $lenum"
76
77     fsdev="$lvname"
78     fssector="`dc -e "$lenum $pesize * $subsector + p"`" #`"
79
80     echo "sector $fssector"
81
82     device="$fsdev"
83     sector="$fssector"
84 }
85
86 register_mapper "lvm"