mirror of
https://github.com/philmmanjaro/alma.git
synced 2025-07-26 23:19:30 +02:00
259 lines
5.6 KiB
Bash
Executable File
259 lines
5.6 KiB
Bash
Executable File
#!/bin/bash
|
|
# -*- mode: sh; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
|
|
# vim: et sts=4 sw=4
|
|
|
|
# SPDX-License-Identifier: LGPL-2.1+
|
|
#
|
|
# Copyright © 2020 Collabora Ltd.
|
|
# Copyright © 2020 Valve Corporation.
|
|
#
|
|
# This file is part of steamos-customizations.
|
|
#
|
|
# steamos-customizations is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU Lesser General Public License as
|
|
# published by the Free Software Foundation; either version 2.1 of the License,
|
|
# or (at your option) any later version.
|
|
|
|
set -e
|
|
set -o pipefail
|
|
set -u
|
|
|
|
usage() {
|
|
cat <<EOF
|
|
Usage: ${0##*/} [-o fs-options] DEVICE MOUNTPOINT
|
|
${0##*/} -u MOUNTPOINT
|
|
|
|
Mount all the SteamOS filesystems on MOUNTPOINT using the DEVICE partitions.
|
|
|
|
Options:
|
|
-o, --options <list> comma-separated list of mount options
|
|
-u umount
|
|
-h, --help display this help
|
|
|
|
Options for disk:
|
|
partset=<self|other|A|B|dev>
|
|
explicitly specifies partset
|
|
noesp no mount /esp
|
|
noefi no mount /efi
|
|
novar no mount /var (implies nooverlay and noboot)
|
|
nohome no mount /home (implies nooffload)
|
|
nooffload no bind-mount offloaded directories
|
|
nooverlay no mount overlayed /etc
|
|
noboot no bind-mount /boot
|
|
EOF
|
|
}
|
|
|
|
partset="${partset:-other}"
|
|
while [[ "$#" -ne 0 ]]
|
|
do
|
|
if [[ "$1" =~ ^(-h|--help)$ ]]
|
|
then
|
|
usage
|
|
exit
|
|
elif [[ "$1" =~ ^(-u)$ ]]
|
|
then
|
|
unmount=1
|
|
elif [[ "$1" =~ ^(-o) ]]
|
|
then
|
|
if [[ "$1" == "-o" ]]
|
|
then
|
|
shift
|
|
opt="$1"
|
|
elif [[ "$1" =~ ^-o= ]]
|
|
then
|
|
opt="${1/-o=/}"
|
|
else
|
|
opt="${1/-o/}"
|
|
fi
|
|
|
|
IFS=, read -a opts <<<"$opt"
|
|
for opt in "${opts[@]}"
|
|
do
|
|
if [[ "${opt%%=*}" = "$opt" ]]
|
|
then
|
|
opt+="=1"
|
|
fi
|
|
eval "$(echo "$opt")"
|
|
done
|
|
elif [[ "${dev:-}" ]] || ( [[ -n "${unmount:-}" ]] && [[ "${mnt:-}" ]] )
|
|
then
|
|
usage
|
|
echo "$1: Too many arguments" >&2
|
|
exit 1
|
|
elif [[ ! "${mnt:-}" ]]
|
|
then
|
|
mnt="$1"
|
|
else
|
|
dev="$mnt"
|
|
mnt="$1"
|
|
fi
|
|
shift
|
|
done
|
|
|
|
if [[ ! "${mnt:-}" ]]
|
|
then
|
|
usage
|
|
exit 1
|
|
fi
|
|
|
|
# Unmount all partitions
|
|
if [[ "${unmount:-}" ]]
|
|
then
|
|
exec umount -R "$mnt"
|
|
fi
|
|
|
|
# Mount all partitions
|
|
if [[ ! "${dev:-}" ]]
|
|
then
|
|
usage
|
|
exit 1
|
|
fi
|
|
|
|
# Get the list of partitions
|
|
case "${partset:-other}" in
|
|
A|B|dev)
|
|
PARTITIONS=("efi-$partset" "rootfs-$partset" "var-$partset")
|
|
;;
|
|
*)
|
|
if [[ ! -d "/dev/disk/by-partsets/$partset" ]]
|
|
then
|
|
echo "$partset: No such partset" >&2
|
|
exit 1
|
|
fi
|
|
|
|
mapfile -t PARTITIONS < <(blkid -s PARTLABEL -o value "/dev/disk/by-partsets/$partset"/*)
|
|
;;
|
|
esac
|
|
PARTITIONS+=("esp" "home")
|
|
|
|
# Get the devices
|
|
mapfile -t devs < <(sfdisk -o "device,name" -l "$dev" | sed -n '/Device/,/^$/{//d;p}')
|
|
declare -A devices
|
|
for dev in "${devs[@]}"
|
|
do
|
|
read -r -a device < <(echo "$dev")
|
|
if [[ ${#device[@]} -lt 2 ]]
|
|
then
|
|
continue
|
|
fi
|
|
|
|
# check if the device is a SteamOS partition using the GPT partition label:
|
|
for part in "${PARTITIONS[@]}"
|
|
do
|
|
if [[ "$part" == "${device[1]}" ]]
|
|
then
|
|
devices[${device[1]}]="${device[0]}"
|
|
break
|
|
fi
|
|
done
|
|
done
|
|
|
|
for dev in "${!devices[@]}"
|
|
do
|
|
case "$dev" in
|
|
esp)
|
|
esp="${devices[$dev]}"
|
|
;;
|
|
efi-*)
|
|
efi="${devices[$dev]}"
|
|
;;
|
|
rootfs-*)
|
|
rootfs="${devices[$dev]}"
|
|
;;
|
|
var-*)
|
|
var="${devices[$dev]}"
|
|
;;
|
|
home)
|
|
home="${devices[$dev]}"
|
|
;;
|
|
esac
|
|
done
|
|
|
|
if [[ ! "${esp:-}" ]]
|
|
then
|
|
# Get the first EFI System Partition
|
|
mapfile -t esps < <(sfdisk -o "device,uuid,type" -l "$dev" | sed -n '/Device/,/^$/{//d;/EFI System$/p}')
|
|
for dev in "${esps[@]}"
|
|
do
|
|
read -r -a device < <(echo "$dev")
|
|
if [[ ${#device[@]} -lt 2 ]]
|
|
then
|
|
continue
|
|
fi
|
|
|
|
esp="${device[0]}"
|
|
break
|
|
done
|
|
fi
|
|
|
|
if [[ ! "${noesp:-}" ]] && [[ ! "${esp:-}" ]]
|
|
then
|
|
echo "esp: No such device" >&2
|
|
exit 1
|
|
elif [[ ! "${noefi:-}" ]] && [[ ! "${efi:-}" ]]
|
|
then
|
|
echo "efi: No such device" >&2
|
|
exit 1
|
|
elif [[ ! "${rootfs:-}" ]]
|
|
then
|
|
echo "rootfs: No such device" >&2
|
|
exit 1
|
|
elif [[ ! "${novar:-}" ]] && [[ ! "${var:-}" ]]
|
|
then
|
|
echo "var: No such device" >&2
|
|
exit 1
|
|
elif [[ ! "${nohome:-}" ]] && [[ ! "${home:-}" ]]
|
|
then
|
|
echo "home: No such device" >&2
|
|
exit 1
|
|
fi
|
|
|
|
# Mount partset
|
|
mount "$rootfs" "$mnt"
|
|
trap 'umount -R "$mnt"' 0
|
|
if [[ ! "${nohome:-}" ]]
|
|
then
|
|
mount "$home" "$mnt/home"
|
|
fi
|
|
if [[ ! "${novar:-}" ]]
|
|
then
|
|
mount "$var" "$mnt/var"
|
|
fi
|
|
if [[ ! "${noefi:-}" ]]
|
|
then
|
|
mount "$efi" "$mnt/efi"
|
|
fi
|
|
if [[ ! "${noesp:-}" ]]
|
|
then
|
|
mount "$esp" "$mnt/esp"
|
|
fi
|
|
|
|
# Mount offload
|
|
if [[ ! "${nohome:-}" ]] && [[ ! "${nooverlay:-}" ]]
|
|
then
|
|
for i in /opt /root /srv /usr/lib/debug /usr/local
|
|
do
|
|
mount --bind "$mnt/home/.steamos/offload$i" "$mnt$i"
|
|
done
|
|
if [[ ! "${novar:-}" ]]
|
|
then
|
|
for i in /var/cache/pacman /var/lib/docker /var/lib/flatpak /var/lib/systemd/coredump /var/log /var/tmp
|
|
do
|
|
mount --bind "$mnt/home/.steamos/offload$i" "$mnt$i"
|
|
done
|
|
fi
|
|
fi
|
|
|
|
# Mount overlay
|
|
if [[ ! "${novar:-}" ]] && [[ ! "${nooverlay:-}" ]]
|
|
then
|
|
mount -t overlay -o "lowerdir=$mnt/etc,upperdir=$mnt/var/lib/overlays/etc/upper,workdir=$mnt/var/lib/overlays/etc/work" none "$mnt/etc"
|
|
fi
|
|
|
|
# Mount boot
|
|
if [[ ! "${novar:-}" ]] && [[ ! "${noboot:-}" ]]
|
|
then
|
|
mount --bind "$mnt/var/boot" "$mnt/boot"
|
|
fi
|
|
trap - 0
|