ubuntu-22.04.3-desktop-amd64/casper/filesystem/usr/lib/partman/init.d/30parted

288 lines
6.9 KiB
Bash
Executable File

#!/bin/sh
set -e
. /lib/partman/lib/base.sh
ORIG_IFS="$IFS"
is_inactive_md() {
local number
number=$(echo "$1" | sed -n -e 's,/dev/md/\?,,p')
if [ "$number" ] && ! grep -q "^md$number : active" /proc/mdstat; then
return 0
fi
return 1
}
part_of_mdraid () {
local holder
local dev=${1#/dev/}
for holder in /sys/block/$dev/holders/*; do
local mddev=${holder##*/}
case "$mddev" in
md[0-9]|md[0-9][0-9]|md[0-9][0-9][0-9])
return 0
;;
esac
done
return 1
}
part_of_sataraid () {
local raiddev
for raiddev in $(dmraid -r -c); do
if [ "$(readlink -f $raiddev)" = $1 ]; then
return 0
fi
done
return 1
}
part_of_multipath() {
local mpdev
type multipath >/dev/null 2>&1 || return 1
if is_multipath_part $1; then
return 0
fi
# The block devices that make up the multipath:
# Output looks like "(decoration-symbols) 4:0:0:1 sdc 8:32 ..."
# (decoration-symbols are not matched; they may change again, and the spaces differ for last device)
for mpdev in $(multipath -l | \
grep -o '\([#0-9]\+:\)\{3\}[#0-9]\+ [hs]d[a-z]\+ [0-9]\+:[0-9]\+' | \
cut -f2 -d' '); do
if [ "$(readlink -f /dev/$mpdev)" = $1 ]; then
return 0
fi
done
return 1
}
if [ ! -f /var/run/parted_server.pid ]; then
mkdir -p /var/run
db_get partman/alignment
PARTMAN_ALIGNMENT="$RET" parted_server
RET=$?
if [ $RET != 0 ]; then
# TODO: How do we signal we couldn't start parted_server properly?
exit $RET
fi
rm -rf /var/lib/partman/old_devices
if [ -d $DEVICES ]; then
mv $DEVICES /var/lib/partman/old_devices
fi
mkdir $DEVICES || true
IFS="$NL"
for partdev in $(parted_devices |
sed 's,^/dev/\(ide\|scsi\|[hs]d\|md/\?[0-9]\+\),!/dev/\1,' |
sort |
sed 's,^!,,' ); do
IFS="$TAB"
set -- $partdev
IFS="$ORIG_IFS"
device=$1
size=$2
model=$3
label=$4
# Skip mtd (not supported by parted) and mmcblk odities
case "${device#/dev/}" in
mtd* | mmcblk?rpmb | mmcblk?boot? )
continue
;;
esac
# Skip MD devices which are not active
if [ -e /proc/mdstat ]; then
if is_inactive_md $device; then
continue
fi
fi
# Skip devices that are part of a mdraid device
if part_of_mdraid $device; then
continue
fi
# Skip devices that are part of a dmraid device
if type dmraid >/dev/null 2>&1 && \
dmraid -r -c >/dev/null 2>&1; then
if part_of_sataraid $device && \
[ -f /var/lib/disk-detect/activate_dmraid ]; then
continue
fi
fi
# Skip devices that are part of a multipathed device
if part_of_multipath $device; then
continue
fi
dirname=$(echo $device | sed 's:/:=:g')
dev=$DEVICES/$dirname
if [ -d /var/lib/partman/old_devices/$dirname ]; then
mv /var/lib/partman/old_devices/$dirname $dev
else
mkdir $dev || continue
fi
printf "%s" "$device" >$dev/device
printf "%s" "$size" >$dev/size
printf "%s" "$model" >$dev/model
printf "%s" "$label" >$dev/label
# Set the sataraid flag for dmraid arrays.
if type dmraid >/dev/null 2>&1 && \
dmraid -s -c >/dev/null 2>&1; then
if dmraid -sa -c | grep -q $(basename $device); then
>$dev/sataraid
fi
fi
cd $dev
open_dialog OPEN "$(cat $dev/device)"
read_line response
close_dialog
if [ "$response" = failed ]; then
cd /
rm -rf $dev
fi
done
db_get partman/filter_mounted
if [ "$RET" = true ]; then
# Get a list of active mounts in a more convenient format.
mounts=
# If parted failed to parse partition table, still
# ensure that the overall blockdevice is marked as
# installation_medium, otherwise we end up offering it
# as the install target
installation_medium_block=
while read dev mp rest; do
[ -e "$dev" ] || continue
mappeddev="$(mapdevfs "$dev")" || true
if [ "$mappeddev" ]; then
dev="$mappeddev"
fi
mounts="${mounts:+$mounts$NL}$dev $mp"
# Oooh, installation media
if [ "$mp" = '/cdrom' ]; then
# Is a full block dev?
block=$(basename $dev)
if [ -d "/sys/block/$block" ]; then
installation_medium_block=/dev/$block
else
# Is it a partition?
for i in /sys/block/*/$block; do
if [ -d "$i" ]; then
installation_medium_block=/dev/$(basename $(dirname $i))
fi
done
fi
fi
done < /proc/mounts
# For each disk, check for any active mounts on it. If the
# only thing mounted is the installation medium and it uses
# more or less the whole disk, then silently exclude that
# disk; if the installation medium is mounted but doesn't
# use the whole disk, issue a warning that partitioning may
# be difficult; if anything else is mounted, offer to
# unmount it.
disks_unmount=
parts_unmount=
part_warn=
for dev in $DEVICES/*; do
[ -d "$dev" ] || continue
cd $dev
free=0
parts=
instparts=
seen_unmounted=
open_dialog PARTITIONS
while { read_line num id size type fs path name; [ "$id" ]; }; do
if [ "$fs" = free ]; then
free="$(($free + $size))"
continue
fi
mappedpath="$(mapdevfs "$path")" || true
if [ "$mappedpath" ]; then
path="$mappedpath"
fi
mp=
IFS="$NL"
for line in $mounts; do
restore_ifs
if [ "$path" = "${line%% *}" ]; then
mp="${line#* }"
break
fi
IFS="$NL"
done
restore_ifs
if [ "$mp" = /cdrom ]; then
instparts="${instparts:+$instparts }$path"
elif [ "$mp" ]; then
parts="${parts:+$parts }$path"
else
seen_unmounted=1
fi
done
close_dialog
if [ "$(cat device)" = "$installation_medium_block" ]; then
if [ -z "$instparts" ]; then
# Looks like parted failed to parse partition table
# of the thing, that has installation medium mounted
# make it so, anyway.
instparts="${instparts:+$instparts }$installation_medium_block"
fi
fi
if [ "$instparts" ]; then
if [ -z "$seen_unmounted" ] && \
longint_le "$free" 16777216; then
# The installation medium uses more
# or less the whole disk.
open_dialog CLOSE
close_dialog
cd /
rm -rf "$dev"
else
# There's an installation medium
# here, but it doesn't use the whole
# disk.
part_warn="$instparts"
>installation_medium
fi
elif [ "$parts" ]; then
# Something other than an installation
# medium is mounted.
disks_unmount="${disks_unmount:+$disks_unmount }$(cat device)"
parts_unmount="${parts_unmount:+$parts_unmount }$parts"
fi
done
if [ "$disks_unmount" ]; then
db_subst partman/unmount_active DISKS "$(echo "$disks_unmount" | sed 's/ /, /g')"
db_fset partman/unmount_active seen false
db_input critical partman/unmount_active || true
db_go || exit 10
db_get partman/unmount_active || RET=
if [ "$RET" = true ]; then
umount $parts_unmount || true
fi
fi
if [ "$part_warn" ]; then
db_subst partman/installation_medium_mounted PARTITION "$part_warn"
db_fset partman/installation_medium_mounted seen false
db_capb align
db_input high partman/installation_medium_mounted || true
db_go || true
db_capb backup align
fi
fi
rm -rf /var/lib/partman/old_devices
fi