summaryrefslogtreecommitdiff
path: root/perform_recipe_by_lvm
blob: fc8fcdf76e7950fd52fc43155934573a9a21f577 (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
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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
#!/bin/sh

. /lib/partman/lib/base.sh
. /lib/partman/lib/recipes.sh
. /lib/partman/lib/lvm-base.sh

VG_name=$1
recipe=$2

decode_recipe $recipe lvm

lvmscheme=$(echo "$scheme" | grep lvmok)

# Filter partitions for the current VG
scheme=$(echo "$lvmscheme" | grep "in_vg{ *$VG_name *}")

# Add partitions without an explicit VG if we are working on the default VG
db_get partman-auto-lvm/new_vg_name
if [ "$VG_name" = "$RET" ]; then
	scheme="${scheme:+$scheme$NL}$(echo "$lvmscheme" | grep -v 'in_vg{')"
fi

partstep=$(echo "$scheme" | wc -l)
partstep=$(expr $partstep + 3)

db_progress START 0 $partstep partman-auto/text/automatically_partition
db_progress INFO partman-auto/progress/info

db_progress STEP 1

# expand_scheme can't cope with decimal and lvm overhead.
# lvm overhead gets calculated properly only using kbytes.
# Switch to that. The worst scenario is that the last partition will
# be one PE smaller, but in the big numbers it's nothing (4MB).
free_size=$(vgs -o vg_free --units K --noheading --nosuffix $VG_name | sed -e 's/^[[:space:]]*//; s/\..*//g')

newscheme=''
foreach_partition '
	newmin="${1}000"
	newmed="${2}000"
	# Second test is for backwards compatibility
	if [ "$3" != "-1" ] && [ "$3" != "1000000000" ]; then
		newmax="${3}000"
	else
		newmax="$3"
	fi
	shift; shift; shift
	newscheme="$newscheme${NL}$newmin $newmed $newmax $*"
'

scheme="$newscheme"

db_progress STEP 1

expand_scheme

db_progress STEP 1

name_number=1
foreach_partition '
	if echo $* | grep -q "lv_name{"; then
		lvname=$(echo $* | sed \
			-e "s/.*lv_name{  *\([^ }]*\) *}.*/\1/g"
		)
	elif echo $* | grep -q "mountpoint{"; then
		lvname=$(echo $* | sed \
			-e "s/.*mountpoint{  *\([^ }]*\) *}.*/\1/g" \
			-e "s!//!/!g" \
			-e '\''s!/$!!g'\'' \
			-e "s/_/__/g" \
			-e "s/+/_+/g" \
			-e "s/-/_dash/g" \
			-e "s/ /_space/g" \
			-e '\''s!^/root$!_root!g'\'' \
			-e '\''s!^$!/root!g'\'' \
			-e "s!^/!!" \
			-e "s!/!+!g"
		)
	elif echo $* | grep -q "method{"; then
		lvname=$(echo $* | sed \
			-e "s/.*method{  *\([^ }]*\) *}.*/\1/g")
		lvname="${lvname}_$name_number"
		name_number=$(($name_number + 1))
	else
		lvname=_$name_number
		name_number=$(($name_number + 1))
	fi

	if [ "$last" = yes ]; then
		vg_get_info "$VG_name"
		lv_create $VG_name "$lvname" $FREEPE || autopartitioning_failed
	else
		extents=$(lvm_extents_from_human $VG_name "${1}K")
		lv_create $VG_name "$lvname" $extents || autopartitioning_failed
	fi

	# Hyphens in VG or LV names are doubled under /dev/mapper
	VG_dev="$(echo "$VG_name" | sed 's/-/--/g')"
	LV_dev="$(echo "$lvname" | sed 's/-/--/g')"
	device=/dev/mapper/"$VG_dev"-"$LV_dev"

	dirname=$(echo "$device" | sed "s:/:=:g")
	dev=$DEVICES/$dirname

	rm -rf $dev
	mkdir $dev || autopartitioning_failed
	printf "%s" "$device" >$dev/device
	printf "%s" "$4" >$dev/size
	printf "%s" "$VG_name - $lvname" >$dev/model

	update-dev --settle

	cd $dev
	open_dialog OPEN "$(cat $dev/device)"
	read_line response
	close_dialog
	if [ "$response" = failed ]; then
		cd /
		rm -rf $dev
		autopartitioning_failed
	fi

	open_dialog NEW_LABEL loop
	close_dialog

	# find the free space
	open_dialog PARTITIONS
	free_space=""
	while { read_line num id size type fs path name; [ "$id" ]; }; do
		case $fs in
		    free|unknown)
			free_space=$id
			free_size=$size
			free_fs=$fs
			;;
		esac
	done
	close_dialog

	# create partition in the free space
	[ "$free_space" ] || autopartitioning_failed
	if [ "$free_fs" = unknown ]; then
		# parted >= 3.2 gives us a partition automatically.
		id=$free_space
	else
		# With parted < 3.2 we must create a partition manually.
		open_dialog NEW_PARTITION primary ext2 $free_space full $free_size
		read_line num id size type fs path name
		close_dialog
	fi

	shift; shift; shift; shift
	setup_partition $id $*
	db_progress STEP 1
'

db_progress STOP

stop_parted_server

restart_partman