248 lines
6.3 KiB
Bash
Executable File
248 lines
6.3 KiB
Bash
Executable File
#!/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=$(LC_ALL=C 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
|
|
|
|
# free_size and everything in the scheme are now in (decimal) kilobytes. For
|
|
# conversion to human numbers, we need another multiple of 1000.
|
|
minsize="$(min_size)"
|
|
hminsize="$(longint2human "$minsize"000)"
|
|
hmaxsize="$(longint2human "$free_size"000)"
|
|
minsize_rounded="$(human2longint "$hminsize")"
|
|
maxsize_rounded="$(human2longint "$hmaxsize")"
|
|
minpercent="$(expr 100 \* "$minsize" / "$free_size")"
|
|
|
|
guided_size=
|
|
while [ -z "$guided_size" ]; do
|
|
db_fget partman-auto-lvm/guided_size seen
|
|
if [ "$RET" = false ]; then
|
|
db_set partman-auto-lvm/guided_size "$hmaxsize"
|
|
fi
|
|
db_subst partman-auto-lvm/guided_size MINSIZE "$hminsize"
|
|
db_subst partman-auto-lvm/guided_size MAXSIZE "$hmaxsize"
|
|
db_subst partman-auto-lvm/guided_size PERCENT "$minpercent%"
|
|
db_input high partman-auto-lvm/guided_size || true
|
|
db_go || return 255
|
|
|
|
db_get partman-auto-lvm/guided_size
|
|
case $RET in
|
|
max)
|
|
guided_size="$free_size"000
|
|
;;
|
|
*%)
|
|
digits="$(expr "$RET" : '\([1-9][0-9]*\) *%$')"
|
|
if [ "$digits" ]; then
|
|
maxmb="$(convert_to_megabytes "$free_size"000)"
|
|
guided_size="$(($digits * $maxmb / 100))000000"
|
|
fi
|
|
;;
|
|
*)
|
|
if valid_human "$RET"; then
|
|
guided_size="$(human2longint "$RET")"
|
|
fi
|
|
;;
|
|
esac
|
|
|
|
if [ -z "$guided_size" ]; then
|
|
db_subst partman-auto-lvm/bad_guided_size INPUT "$RET"
|
|
db_input high partman-auto-lvm/bad_guided_size || true
|
|
db_go || true
|
|
elif ! longint_le "$guided_size" "$free_size"000; then
|
|
if longint_le "$guided_size" "$maxsize_rounded"; then
|
|
guided_size="$free_size"000
|
|
else
|
|
db_subst partman-auto-lvm/big_guided_size SIZE \
|
|
"$(longint2human "$guided_size")"
|
|
db_subst partman-auto-lvm/big_guided_size MAXSIZE \
|
|
"$hmaxsize"
|
|
db_input high partman-auto-lvm/big_guided_size || true
|
|
db_go || true
|
|
guided_size=
|
|
fi
|
|
elif ! longint_le "$minsize"000 "$guided_size"; then
|
|
if longint_le "$minsize_rounded" "$guided_size"; then
|
|
guided_size="$minsize"000
|
|
else
|
|
db_subst partman-auto-lvm/small_guided_size SIZE \
|
|
"$(longint2human "$guided_size")"
|
|
db_subst partman-auto-lvm/small_guided_size MINSIZE \
|
|
"$hminsize"
|
|
db_input high partman-auto-lvm/small_guided_size || true
|
|
db_go || true
|
|
guided_size=
|
|
fi
|
|
fi
|
|
|
|
if [ "$guided_size" ]; then
|
|
# We have a figure in (decimal) megabytes. Convert back to
|
|
# (decimal) kilobytes, which is what the rest of this is
|
|
# expecting.
|
|
guided_size="$(expr 0000"$guided_size" : '0*\(..*\)...$')"
|
|
else
|
|
db_fset partman-auto-lvm/guided_size seen false
|
|
fi
|
|
done
|
|
|
|
use_all=
|
|
if [ "$guided_size" -ge "$free_size" ]; then
|
|
use_all=1
|
|
fi
|
|
free_size="$guided_size"
|
|
|
|
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 ] && [ "$use_all" ]; 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
|