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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
. /lib/partman/lib/lvm-base.sh
# List PVs to be removed to initialize a device
remove_lvm_find_vgs() {
local realdev vg pvs pv disk
realdev="$1"
# Simply exit if there is no lvm support
[ -f /var/lib/partman/lvm ] || exit 0
# Check all VGs to see which PV needs removing
# BUGME: the greps in this loop should be properly bounded so they
# do not match on partial matches!
# Except that we want partial matches for disks...
for vg in $(vg_list); do
pvs="$(vg_list_pvs $vg)"
if ! echo "$pvs" | grep -q "$realdev"; then
continue
fi
pvs="$(echo -n "$pvs" | grep -v "$realdev")"
# Make sure the VG doesn't span any other disks
if [ "$pvs" ]; then
# Except on disks that are going to be auto-partitioned
db_get partman-auto/disk || RET=""
for disk in $RET; do
pvs="$(echo -n "$pvs" | grep -v "$disk")"
done
if [ "$pvs" ]; then
log-output -t partman-lvm vgs
db_input critical partman-lvm/device_remove_lvm_span || true
db_go || true
return 1
fi
fi
echo "$vg"
done
}
# Wipes any traces of LVM from a disk
# Normally called from a function that initializes a device
# Note: if the device contains an empty PV, it will not be removed
device_remove_lvm() {
local dev realdev tmpdev restart confirm
local pvs pv vgs vg lvs lv pvtext vgtext lvtext
dev="$1"
cd $dev
# Check if the device already contains any physical volumes
realdev=$(mapdevfs "$(cat $dev/device)")
if ! pv_on_device "$realdev"; then
return 0
fi
vgs="$(remove_lvm_find_vgs $realdev)" || return 1
[ "$vgs" ] || return 0
pvs=""
lvs=""
for vg in $vgs; do
pvs="${pvs:+$pvs$NL}$(vg_list_pvs $vg)"
lvs="${lvs:+$lvs$NL}$(vg_list_lvs $vg)"
done
# Ask for permission to erase LVM volumes
lvtext=""
for lv in $lvs; do
lvtext="${lvtext:+$lvtext, }$lv"
done
vgtext=""
for vg in $vgs; do
vgtext="${vgtext:+$vgtext, }$vg"
done
pvtext=""
for pv in $pvs; do
pvtext="${pvtext:+$pvtext, }$pv"
done
db_fget partman-lvm/device_remove_lvm seen
if [ $RET = true ]; then
# Answer has been preseeded
db_get partman-lvm/device_remove_lvm
confirm=$RET
else
db_subst partman-lvm/device_remove_lvm LVTARGETS "$lvtext"
db_subst partman-lvm/device_remove_lvm VGTARGETS "$vgtext"
db_subst partman-lvm/device_remove_lvm PVTARGETS "$pvtext"
db_input critical partman-lvm/device_remove_lvm
db_go || return 1
db_get partman-lvm/device_remove_lvm
confirm=$RET
db_reset partman-lvm/device_remove_lvm
fi
if [ "$confirm" != true ]; then
return 255
fi
# We need devicemapper support here
modprobe dm-mod >/dev/null 2>&1
for vg in $vgs; do
# Remove LVs from the VG
for lv in $(vg_list_lvs $vg); do
lv_delete $vg $lv
done
# Remove the VG
vg_delete $vg
done
# Remove the PVs and unlock the devices
for pv in $pvs; do
pv_delete $pv
partman_unlock_unit $pv
done
# Make sure that parted has no stale LVM info
restart=""
for tmpdev in $DEVICES/*; do
[ -d "$tmpdev" ] || continue
realdev=$(cat $tmpdev/device)
if [ -b "$realdev" ] || \
! $(echo "$realdev" | grep -q "/dev/mapper/"); then
continue
fi
rm -rf $tmpdev
restart=1
done
if [ "$restart" ]; then
return 99
fi
return 0
}
|