Skip to content
Open
Changes from all commits
Commits
Show all changes
175 commits
Select commit Hold shift + click to select a range
0049157
btrfs fix suggestion
beyondbrokkoli Feb 6, 2026
e66cb24
Update main.py
beyondbrokkoli Feb 7, 2026
5e91cf8
Update main.py
beyondbrokkoli Feb 7, 2026
0067a92
Update main.py
beyondbrokkoli Feb 7, 2026
0c98aa3
Update main.py
beyondbrokkoli Feb 7, 2026
d875fc6
Update main.py
beyondbrokkoli Feb 7, 2026
c130129
Update main.py
beyondbrokkoli Feb 7, 2026
0f4ebba
Update main.py
beyondbrokkoli Feb 7, 2026
b7c82bf
Update main.py
beyondbrokkoli Feb 7, 2026
a2a82ec
Update main.py
beyondbrokkoli Feb 7, 2026
c02d357
Update main.py
beyondbrokkoli Feb 7, 2026
2c300c0
Update main.py
beyondbrokkoli Feb 7, 2026
3c6b509
Update main.py
beyondbrokkoli Feb 7, 2026
18f0622
Update main.py
beyondbrokkoli Feb 7, 2026
8e1418e
Update main.py
beyondbrokkoli Feb 7, 2026
8599c0f
Update main.py
beyondbrokkoli Feb 7, 2026
b84f269
Update main.py
beyondbrokkoli Feb 7, 2026
832e020
Update main.py
beyondbrokkoli Feb 7, 2026
f904c0c
Update main.py
beyondbrokkoli Feb 7, 2026
c4b23ff
Update main.py
beyondbrokkoli Feb 7, 2026
2d7062d
Update main.py
beyondbrokkoli Feb 7, 2026
a664d86
Update main.py
beyondbrokkoli Feb 8, 2026
de97075
Update main.py
beyondbrokkoli Feb 8, 2026
07078bf
Update main.py
beyondbrokkoli Feb 9, 2026
e627dce
Update main.py
beyondbrokkoli Feb 9, 2026
c5d7f27
Update main.py
beyondbrokkoli Feb 9, 2026
1e4b7c5
Update main.py
beyondbrokkoli Feb 10, 2026
ebfae4f
Update main.py
beyondbrokkoli Feb 10, 2026
7803bd7
Update main.py
beyondbrokkoli Feb 10, 2026
efb3ff9
Update main.py
beyondbrokkoli Feb 10, 2026
9e0e808
Update main.py
beyondbrokkoli Feb 10, 2026
ed1d543
Update main.py
beyondbrokkoli Feb 10, 2026
8d0d52d
Update main.py
beyondbrokkoli Feb 10, 2026
849e56c
Update main.py
beyondbrokkoli Feb 10, 2026
7c3147f
Update main.py
beyondbrokkoli Feb 10, 2026
5fe6ca4
Update main.py
beyondbrokkoli Feb 10, 2026
3e62cba
Update main.py
beyondbrokkoli Feb 10, 2026
b9d6a61
Update main.py
beyondbrokkoli Feb 10, 2026
2018d5e
Update main.py
beyondbrokkoli Feb 10, 2026
3cf7691
Update main.py
beyondbrokkoli Feb 10, 2026
0a39708
Update main.py
beyondbrokkoli Feb 10, 2026
bdd282c
Update main.py
beyondbrokkoli Feb 10, 2026
353e4db
Update main.py
beyondbrokkoli Feb 10, 2026
3f0fa48
Update main.py
beyondbrokkoli Feb 10, 2026
0ca5392
Update main.py
beyondbrokkoli Feb 10, 2026
56c17b9
Update main.py
beyondbrokkoli Feb 10, 2026
856e20e
Update main.py
beyondbrokkoli Feb 10, 2026
d957ef3
Update main.py
beyondbrokkoli Feb 10, 2026
2b2014b
Update main.py
beyondbrokkoli Feb 10, 2026
c94f61b
Update main.py
beyondbrokkoli Feb 10, 2026
6d790ba
Update main.py
beyondbrokkoli Feb 10, 2026
8be6618
Update main.py
beyondbrokkoli Feb 10, 2026
cc60e79
Update main.py
beyondbrokkoli Feb 10, 2026
72273d6
Update main.py
beyondbrokkoli Feb 10, 2026
b980ce6
Update main.py
beyondbrokkoli Feb 10, 2026
2e4fd42
Update main.py
beyondbrokkoli Feb 10, 2026
a5d2129
Update main.py
beyondbrokkoli Feb 10, 2026
e7a1012
Update main.py
beyondbrokkoli Feb 10, 2026
7ff1a80
Update main.py
beyondbrokkoli Feb 10, 2026
ec934cc
Update main.py
beyondbrokkoli Feb 10, 2026
acb983c
Update main.py
beyondbrokkoli Feb 10, 2026
bda7289
Update main.py
beyondbrokkoli Feb 10, 2026
92bb716
Update main.py
beyondbrokkoli Feb 10, 2026
fc7080e
Update main.py
beyondbrokkoli Feb 10, 2026
c2be55d
Update main.py
beyondbrokkoli Feb 11, 2026
e37a428
Update main.py
beyondbrokkoli Feb 11, 2026
fcd2454
Update main.py
beyondbrokkoli Feb 11, 2026
09abdf1
Update main.py
beyondbrokkoli Feb 12, 2026
c07d6d7
Update main.py
beyondbrokkoli Feb 12, 2026
db8efa4
python iterator bug fix
beyondbrokkoli Feb 12, 2026
c2d3cc7
Update main.py
beyondbrokkoli Feb 12, 2026
e804a26
Update main.py
beyondbrokkoli Feb 12, 2026
b1da871
Update main.py
beyondbrokkoli Feb 12, 2026
6583413
Update main.py
beyondbrokkoli Feb 12, 2026
c7f6c10
Update main.py
beyondbrokkoli Feb 12, 2026
6e42dc4
Update main.py
beyondbrokkoli Feb 12, 2026
22ae031
Update main.py
beyondbrokkoli Feb 12, 2026
449f279
Update main.py
beyondbrokkoli Feb 12, 2026
7d4ecab
Update main.py
beyondbrokkoli Feb 12, 2026
eb123c5
Update main.py
beyondbrokkoli Feb 12, 2026
9413678
Update main.py
beyondbrokkoli Feb 12, 2026
64c5fe7
Update main.py
beyondbrokkoli Feb 12, 2026
abb279d
Update main.py
beyondbrokkoli Feb 12, 2026
bb93cec
Update main.py
beyondbrokkoli Feb 12, 2026
5ccd551
Update main.py
beyondbrokkoli Feb 12, 2026
c3a065a
Update main.py
beyondbrokkoli Feb 12, 2026
04d9091
Update main.py
beyondbrokkoli Feb 12, 2026
b5acc59
Update main.py
beyondbrokkoli Feb 12, 2026
cc13ef8
Update main.py
beyondbrokkoli Feb 12, 2026
27e7029
Update main.py
beyondbrokkoli Feb 12, 2026
c4569a7
Update main.py
beyondbrokkoli Feb 12, 2026
13baecf
Update main.py
beyondbrokkoli Feb 12, 2026
7e1415d
Update main.py
beyondbrokkoli Feb 12, 2026
05bfd66
Update main.py
beyondbrokkoli Feb 12, 2026
6cf6946
Update main.py
beyondbrokkoli Feb 12, 2026
f5bc099
Update main.py
beyondbrokkoli Feb 12, 2026
f46d6f3
Update main.py
beyondbrokkoli Feb 13, 2026
292c500
Update main.py
beyondbrokkoli Feb 13, 2026
6f94118
Update main.py
beyondbrokkoli Feb 13, 2026
ba351c5
Update main.py
beyondbrokkoli Feb 13, 2026
6843578
Update main.py
beyondbrokkoli Feb 13, 2026
4a502f0
Update main.py
beyondbrokkoli Feb 13, 2026
4b8af46
Update main.py
beyondbrokkoli Feb 13, 2026
4828e5a
Update main.py
beyondbrokkoli Feb 13, 2026
68ae861
Update main.py
beyondbrokkoli Feb 13, 2026
ab26912
Update main.py
beyondbrokkoli Feb 13, 2026
721d071
Update main.py
beyondbrokkoli Feb 13, 2026
ef7f127
Update main.py
beyondbrokkoli Feb 13, 2026
dccae9f
Update main.py
beyondbrokkoli Feb 13, 2026
91b07b5
Update main.py
beyondbrokkoli Feb 13, 2026
a41e0c1
Update main.py
beyondbrokkoli Feb 13, 2026
cd31bf5
Update main.py
beyondbrokkoli Feb 14, 2026
1dc389b
Update main.py
beyondbrokkoli Feb 14, 2026
3ae9759
Update main.py
beyondbrokkoli Feb 14, 2026
022acf0
Update main.py
beyondbrokkoli Feb 14, 2026
78fd433
Update main.py
beyondbrokkoli Feb 14, 2026
b2586b3
Update main.py
beyondbrokkoli Feb 14, 2026
7e1dceb
Update main.py
beyondbrokkoli Feb 14, 2026
6d461a4
Update main.py
beyondbrokkoli Feb 14, 2026
48b86c3
Update main.py
beyondbrokkoli Feb 14, 2026
11a3596
Update main.py
beyondbrokkoli Feb 14, 2026
6a6545e
Update main.py
beyondbrokkoli Feb 14, 2026
24389ea
Update main.py
beyondbrokkoli Feb 14, 2026
d294133
Update main.py
beyondbrokkoli Feb 14, 2026
bcc6e22
Update main.py
beyondbrokkoli Feb 14, 2026
e6784f1
Update main.py
beyondbrokkoli Feb 14, 2026
eddd936
Update main.py
beyondbrokkoli Feb 14, 2026
87a11c7
Update main.py
beyondbrokkoli Feb 14, 2026
8ea67e4
Update main.py
beyondbrokkoli Feb 14, 2026
a32e2b4
Update main.py
beyondbrokkoli Feb 14, 2026
5097fe3
Update main.py
beyondbrokkoli Feb 14, 2026
724e719
Update main.py
beyondbrokkoli Feb 14, 2026
1f16ef0
Update main.py
beyondbrokkoli Feb 14, 2026
700ff73
Update main.py
beyondbrokkoli Feb 14, 2026
e454e8a
Update main.py
beyondbrokkoli Feb 14, 2026
1f03732
Update main.py
beyondbrokkoli Feb 15, 2026
fe18cef
Update main.py
beyondbrokkoli Feb 15, 2026
f2dfdeb
Update main.py
beyondbrokkoli Feb 15, 2026
92d5f05
Update main.py
beyondbrokkoli Feb 15, 2026
75a7c19
Update main.py
beyondbrokkoli Feb 15, 2026
88fe1bd
Update main.py
beyondbrokkoli Feb 16, 2026
680ebf7
Update main.py
beyondbrokkoli Feb 16, 2026
50775f8
Update main.py
beyondbrokkoli Feb 17, 2026
706f743
Update main.py
beyondbrokkoli Feb 17, 2026
c57e42b
Update main.py
beyondbrokkoli Feb 17, 2026
4c5d175
Update main.py
beyondbrokkoli Feb 17, 2026
5aaa562
Update main.py
beyondbrokkoli Feb 17, 2026
4c5437f
Update main.py
beyondbrokkoli Feb 17, 2026
8395f45
Update main.py
beyondbrokkoli Feb 17, 2026
93354ad
Update main.py
beyondbrokkoli Feb 17, 2026
20a2aaf
Update main.py
beyondbrokkoli Feb 17, 2026
89c2978
Update main.py
beyondbrokkoli Feb 17, 2026
5e3bc29
Update main.py
beyondbrokkoli Feb 17, 2026
1bda31a
Update main.py
beyondbrokkoli Feb 17, 2026
b1f766c
Update main.py
beyondbrokkoli Feb 17, 2026
73f244c
Update main.py
beyondbrokkoli Feb 17, 2026
79848cb
Update main.py
beyondbrokkoli Feb 17, 2026
1069c4d
Update main.py
beyondbrokkoli Feb 17, 2026
1a530cb
Update main.py
beyondbrokkoli Feb 17, 2026
aa36beb
Update main.py
beyondbrokkoli Feb 17, 2026
a1c70f4
Update main.py
beyondbrokkoli Feb 17, 2026
e61730e
Update main.py
beyondbrokkoli Feb 17, 2026
bb59c1f
Update main.py
beyondbrokkoli Feb 18, 2026
e24e5f3
Update main.py
beyondbrokkoli Feb 18, 2026
1eab1ff
Update main.py
beyondbrokkoli Feb 20, 2026
153deef
Update main.py
beyondbrokkoli Feb 20, 2026
b7329e6
Update main.py
beyondbrokkoli Feb 20, 2026
9795944
Update main.py
beyondbrokkoli Feb 20, 2026
00fd99f
Update main.py
beyondbrokkoli Feb 20, 2026
2cbf8ed
Update main.py
beyondbrokkoli Feb 20, 2026
9c38205
Update main.py
beyondbrokkoli Feb 20, 2026
4966573
Update main.py
beyondbrokkoli Feb 20, 2026
0a1403a
Update main.py
beyondbrokkoli Feb 21, 2026
f1a2d9a
Update main.py
beyondbrokkoli Feb 21, 2026
70d398c
Update main.py
beyondbrokkoli Feb 21, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
207 changes: 135 additions & 72 deletions src/modules/mount/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -146,10 +146,18 @@ def get_btrfs_subvolumes(partitions):
if not btrfs_subvolumes:
btrfs_subvolumes = [dict(mountPoint="/", subvolume="/@"), dict(mountPoint="/home", subvolume="/@home")]

# Filter out the subvolumes which have a dedicated partition
# Identify dedicated partitions (excluding root)
non_root_partition_mounts = [m for m in [p.get("mountPoint", None) for p in partitions] if
m is not None and m != '/']
btrfs_subvolumes = list(filter(lambda s: s["mountPoint"] not in non_root_partition_mounts, btrfs_subvolumes))

# Filter: Skip subvolume if it IS a partition OR is INSIDE a partition
btrfs_subvolumes = [
s for s in btrfs_subvolumes
if s["mountPoint"] == "/" or not any(
m and (s["mountPoint"] == m or s["mountPoint"].startswith(m + "/"))
for m in non_root_partition_mounts
)
]
Comment thread
beyondbrokkoli marked this conversation as resolved.

# If we have a swap **file**, give it a separate subvolume.
swap_choice = libcalamares.globalstorage.value("partitionChoices")
Expand Down Expand Up @@ -224,8 +232,14 @@ def mount_zfs(root_mount_point, partition):
except subprocess.CalledProcessError:
raise ZfsException(_("Failed to set zfs mountpoint"))

def err(error_message, active_mounts):
for tmp_dir in sorted(active_mounts, reverse=True):
if os.path.ismount(tmp_dir):
if subprocess.call(["umount", "-v", tmp_dir]) != 0:
subprocess.call(["umount", "-v", "-l", tmp_dir])
raise Exception(error_message)

def mount_partition(root_mount_point, partition, partitions, mount_options, mount_options_list, efi_location):
def mount_partition(root_mount_point, partition, partitions, mount_options, mount_options_list, efi_location, active_mounts):
"""
Do a single mount of @p partition inside @p root_mount_point.

Expand All @@ -235,6 +249,7 @@ def mount_partition(root_mount_point, partition, partitions, mount_options, moun
:param mount_options: The mount options from the config file
:param mount_options_list: A list of options for each mountpoint to be placed in global storage for future modules
:param efi_location: A string holding the location of the EFI partition or None
:param active_mounts A list of strings
:return:
"""
# Create mount point with `+` rather than `os.path.join()` because
Expand Down Expand Up @@ -262,73 +277,114 @@ def mount_partition(root_mount_point, partition, partitions, mount_options, moun
if fstype == "unformatted":
return

if fstype == "fat16" or fstype == "fat32":
fstype = "vfat"

am = active_mounts
am.append(mount_point)
device = partition["device"]

# Only allow fat32 on boot path and block incompatible
if fstype in ["fat16", "fat32", "ntfs", "ext2", "exfat"]:
is_boot = raw_mount_point in ["/boot", "/boot/efi"]
if not (is_boot and fstype == "fat32"):
err(f"Unsupported {fstype} partition on {raw_mount_point}", am)
fstype = "vfat"
Comment thread
beyondbrokkoli marked this conversation as resolved.

if "luksMapperName" in partition:
device = os.path.join("/dev/mapper", partition["luksMapperName"])

if fstype == "zfs":
mount_zfs(root_mount_point, partition)
else: # fstype == "zfs"
mount_options_string = get_mount_options(fstype, mount_options, partition, efi_location)
if libcalamares.utils.mount(device,
mount_point,
fstype,
mount_options_string) != 0:
libcalamares.utils.warning("Cannot mount {}".format(device))
return


mount_options_string = get_mount_options(fstype, mount_options, partition, efi_location)

# Standard mount for everything EXCEPT Btrfs root (this catches other btrfs partitions)
if not (fstype == "btrfs" and raw_mount_point == '/'):
if libcalamares.utils.mount(device, mount_point, fstype, mount_options_string) != 0:
err(f"Cannot mount {device}", am)

# Verify that the install target is empty
is_virtual = any(raw_mount_point.startswith(v) for v in ["/sys", "/proc", "/dev", "/run"])
if not is_virtual and raw_mount_point not in ["/home", "/srv", "/boot", "/boot/efi"]:
ignored_metadata = [
"lost+found", ".Trash-1000", "$RECYCLE.BIN",
"System Volume Information", ".fseventsd",
".Spotlight-V100"
]
contents = [f for f in os.listdir(mount_point) if f not in ignored_metadata]
if contents:
err((
f"Device {device} at {raw_mount_point} not empty. "
"Only /home or /srv allowed."), am)

mount_options_list.append({"mountpoint": raw_mount_point, "option_string": mount_options_string})
return

# Special handling for btrfs subvolumes. Create the subvolumes listed in mount.conf
if fstype == "btrfs" and partition["mountPoint"] == '/':
# Root has been mounted to btrfs volume -> create subvolumes from configuration
btrfs_subvolumes = get_btrfs_subvolumes(partitions)

# Store created list in global storage so it can be used in the fstab module
libcalamares.globalstorage.insert("btrfsSubvolumes", btrfs_subvolumes)
# Create the subvolumes that are in the completed list
for s in btrfs_subvolumes:
if not s["subvolume"]:
continue
os.makedirs(root_mount_point + os.path.dirname(s["subvolume"]), exist_ok=True)
subprocess.check_call(["btrfs", "subvolume", "create",
root_mount_point + s["subvolume"]])
# Set secure permissions for /root subvolume (750 instead of default 755)
if s["mountPoint"] == "/root":
os.chmod(root_mount_point + s["subvolume"], 0o750)

if s["mountPoint"] == "/":
# insert the root subvolume into global storage
libcalamares.globalstorage.insert("btrfsRootSubvolume", s["subvolume"])
subprocess.check_call(["umount", "-v", root_mount_point])

device = partition["device"]

if "luksMapperName" in partition:
device = os.path.join("/dev/mapper", partition["luksMapperName"])

# Mount the subvolumes
swap_subvol = libcalamares.job.configuration.get("btrfsSwapSubvol", "/@swap")
for s in btrfs_subvolumes:
if s['subvolume'] == swap_subvol:
mount_option_no_subvol = get_mount_options("btrfs_swap", mount_options, partition)
else:
mount_option_no_subvol = get_mount_options(fstype, mount_options, partition)

# Only add subvol= argument if we are not mounting the entire filesystem
if s['subvolume']:
mount_option = f"subvol={s['subvolume']},{mount_option_no_subvol}"
else:
mount_option = mount_option_no_subvol
subvolume_mountpoint = mount_point[:-1] + s['mountPoint']
mount_options_list.append({"mountpoint": s['mountPoint'], "option_string": mount_option_no_subvol})
if libcalamares.utils.mount(device,
subvolume_mountpoint,
fstype,
mount_option) != 0:
libcalamares.utils.warning("Cannot mount {}".format(device))

# Btrfs Setup
btrfs_subvolumes = get_btrfs_subvolumes(partitions)

# Ensure every entry has a subvolume name
for s in btrfs_subvolumes:
if not s.get("mountPoint") or not s.get("subvolume"):
err(f"Btrfs config error: entry missing mountPoint or subvolume name", am)

# Ensure root subvolume with mountpoint / exists
root_sub = next((s for s in btrfs_subvolumes if s["mountPoint"] == "/"), None)
if not root_sub:
err("Btrfs config error: root subvolume not found", am)

# Mount raw partition to create subvolumes
with tempfile.TemporaryDirectory(prefix="calam-btrfs-") as setup_dir:
am.append(setup_dir)
if libcalamares.utils.mount(device, setup_dir, fstype, "defaults") != 0:
err(f"Cannot mount btrfs for subvolume creation {device}", am)
try:
for s in btrfs_subvolumes:
sub_path = setup_dir + s["subvolume"]
if os.path.exists(sub_path):
err((
f"Subvolume {s['subvolume']} already exists on {device}. "
"Only /home or /srv allowed."), am)
Comment thread
beyondbrokkoli marked this conversation as resolved.
for s in btrfs_subvolumes:
sub_path = setup_dir + s["subvolume"]
os.makedirs(os.path.dirname(sub_path), exist_ok=True)
subprocess.check_call(["btrfs", "subvolume", "create", sub_path])
# Set secure permissions for /root subvolume (750 instead of default 755)
if s["mountPoint"] == "/root":
os.chmod(sub_path, 0o750)
finally:
if os.path.ismount(setup_dir):
subprocess.call(["umount", "-v", setup_dir])
if setup_dir in am:
am.remove(setup_dir)

# Mount the specific @ root subvolume
root_opts = f"subvol={root_sub['subvolume']},{mount_options_string}"

if libcalamares.utils.mount(device, root_mount_point, fstype, root_opts) != 0:
err(f"Failed to mount root subvolume {device}", am)

# Mount remaining subvolumes
for s in btrfs_subvolumes:
if s["mountPoint"] == "/":
continue

# Prepare subvolume mount options and target mount point
sub_opts = f"subvol={s['subvolume']},{mount_options_string}"
sub_path = root_mount_point + s["mountPoint"]
os.makedirs(sub_path, exist_ok=True)

if libcalamares.utils.mount(device, sub_path, fstype, sub_opts) == 0:
mount_options_list.append({"mountpoint": s["mountPoint"], "option_string": mount_options_string})
Comment thread
beyondbrokkoli marked this conversation as resolved.
else:
err(f"Failed to mount subvolume {s['subvolume']}", am)

# Fstab module uses btrfsRootSubvolume to inject subvol=/@ into generic / entry
mount_options_list.append({"mountpoint": raw_mount_point, "option_string": mount_options_string})
libcalamares.globalstorage.insert("btrfsRootSubvolume", root_sub['subvolume'])
libcalamares.globalstorage.insert("btrfsSubvolumes", btrfs_subvolumes)


def enable_swap_partition(devices):
Expand Down Expand Up @@ -374,27 +430,34 @@ def run():
if libcalamares.globalstorage.value("firmwareType") == "efi":
efi_location = libcalamares.globalstorage.value("efiSystemPartition")
else:
for mount in extra_mounts:
if mount.get("efi", None) is True:
extra_mounts.remove(mount)
extra_mounts = [m for m in extra_mounts if not m.get("efi")]

# Add extra mounts to the partitions list and sort by mount points.
# This way, we ensure / is mounted before the rest, and every mount point
# is created on the right partition (e.g. if a partition is to be mounted
# under /tmp, we make sure /tmp is mounted before the partition)
mountable_partitions = [p for p in partitions + extra_mounts if "mountPoint" in p and p["mountPoint"]]
mountable_partitions.sort(key=lambda x: x["mountPoint"])

# mount_options_list will be inserted into global storage for use in fstab later
mount_options_list = []
try:
for partition in mountable_partitions:
mount_partition(root_mount_point, partition, partitions, mount_options, mount_options_list, efi_location)
except ZfsException as ze:
return _("zfs mounting error"), ze.message
active_mounts = []

if not mount_options_list:
libcalamares.utils.warning("No mount options defined, {!s} partitions, {!s} mountable".format(len(partitions), len(mountable_partitions)))
# Lexical Sort: mount / before sub-paths
physical = [p for p in partitions if "mountPoint" in p and p["mountPoint"]]
physical.sort(key=lambda x: x["mountPoint"])

try:
for p in physical:
mount_partition(root_mount_point, p, partitions, mount_options, mount_options_list, efi_location, active_mounts)

# Bind/Virtual: After creating Btrfs subvolumes
extra = [p for p in extra_mounts if "mountPoint" in p and p["mountPoint"]]
extra.sort(key=lambda x: x["mountPoint"])

for p in extra:
mount_partition(root_mount_point, p, partitions, mount_options, mount_options_list, efi_location, active_mounts)

except Exception as e:
err(str(e), active_mounts)

libcalamares.globalstorage.insert("rootMountPoint", root_mount_point)
libcalamares.globalstorage.insert("mountOptionsList", mount_options_list)
Expand Down