[fstab] If swap is "file" then create it here
- handle swapfiles when writing /etc/fstab in the target system - special-case mountpoint - since swapfiles are not a partition, take the setting out of partitionChoices - create the physical swapfile as well (there's no other place where it would make sense)
This commit is contained in:
parent
029c3f1c74
commit
0b3a6baeea
@ -257,7 +257,7 @@ class FstabGenerator(object):
|
|||||||
|
|
||||||
if mount_point == "/":
|
if mount_point == "/":
|
||||||
check = 1
|
check = 1
|
||||||
elif mount_point:
|
elif mount_point and mount_point != "swap":
|
||||||
check = 2
|
check = 2
|
||||||
else:
|
else:
|
||||||
check = 0
|
check = 0
|
||||||
@ -270,8 +270,10 @@ class FstabGenerator(object):
|
|||||||
|
|
||||||
if has_luks:
|
if has_luks:
|
||||||
device = "/dev/mapper/" + partition["luksMapperName"]
|
device = "/dev/mapper/" + partition["luksMapperName"]
|
||||||
else:
|
elif partition["uuid"] is not None:
|
||||||
device = "UUID=" + partition["uuid"]
|
device = "UUID=" + partition["uuid"]
|
||||||
|
else:
|
||||||
|
device = partition["device"]
|
||||||
|
|
||||||
return dict(device=device,
|
return dict(device=device,
|
||||||
mount_point=mount_point,
|
mount_point=mount_point,
|
||||||
@ -307,6 +309,29 @@ class FstabGenerator(object):
|
|||||||
self.mount_options["default"])
|
self.mount_options["default"])
|
||||||
|
|
||||||
|
|
||||||
|
def create_swapfile(root_mount_point, root_btrfs):
|
||||||
|
"""
|
||||||
|
Creates /swapfile in @p root_mount_point ; if the root filesystem
|
||||||
|
is on btrfs, then handle some btrfs specific features as well,
|
||||||
|
as documented in
|
||||||
|
https://wiki.archlinux.org/index.php/Swap#Swap_file
|
||||||
|
"""
|
||||||
|
swapfile_path = os.path.join(root_mount_point, "swapfile")
|
||||||
|
with open(swapfile_path, "wb") as f:
|
||||||
|
pass
|
||||||
|
if root_btrfs:
|
||||||
|
o = subprocess.check_output(["chattr", "+C", swapfile_path])
|
||||||
|
libcalamares.utils.debug("swapfile attributes: {!s}".format(o))
|
||||||
|
o = subprocess.check_output(["btrfs", "property", "set", swapfile_path, "compression", "none"])
|
||||||
|
libcalamares.utils.debug("swapfile compression: {!s}".format(o))
|
||||||
|
# Create the swapfile; swapfiles are small-ish
|
||||||
|
o = subprocess.check_output(["dd", "if=/dev/zero", "of=" + swapfile_path, "bs=1M", "count=512", "conv=notrunc"])
|
||||||
|
libcalamares.utils.debug("swapfile dd: {!s}".format(o))
|
||||||
|
os.chmod(swapfile_path, 0o600)
|
||||||
|
o = subprocess.check_output(["mkswap", swapfile_path])
|
||||||
|
libcalamares.utils.debug("swapfile mkswap: {!s}".format(o))
|
||||||
|
|
||||||
|
|
||||||
def run():
|
def run():
|
||||||
""" Configures fstab.
|
""" Configures fstab.
|
||||||
|
|
||||||
@ -330,6 +355,17 @@ def run():
|
|||||||
_("No root mount point is given for <pre>{!s}</pre> to use.")
|
_("No root mount point is given for <pre>{!s}</pre> to use.")
|
||||||
.format("fstab"))
|
.format("fstab"))
|
||||||
|
|
||||||
|
# This follows the GS settings from the partition module's Config object
|
||||||
|
swap_choice = global_storage.value( "partitionChoices" )
|
||||||
|
if swap_choice:
|
||||||
|
swap_choice = swap_choice.get( "swap", None )
|
||||||
|
if swap_choice and swap_choice == "file":
|
||||||
|
# There's no formatted partition for it, so we'll sneak in an entry
|
||||||
|
partitions.append( dict(fs="swap", mountPoint=None, claimed=True, device="/swapfile", uuid=None) )
|
||||||
|
else:
|
||||||
|
swap_choice = None
|
||||||
|
|
||||||
|
libcalamares.job.setprogress(0.1)
|
||||||
mount_options = conf["mountOptions"]
|
mount_options = conf["mountOptions"]
|
||||||
ssd_extra_mount_options = conf.get("ssdExtraMountOptions", {})
|
ssd_extra_mount_options = conf.get("ssdExtraMountOptions", {})
|
||||||
crypttab_options = conf.get("crypttabOptions", "luks")
|
crypttab_options = conf.get("crypttabOptions", "luks")
|
||||||
@ -339,4 +375,14 @@ def run():
|
|||||||
ssd_extra_mount_options,
|
ssd_extra_mount_options,
|
||||||
crypttab_options)
|
crypttab_options)
|
||||||
|
|
||||||
|
if swap_choice is not None:
|
||||||
|
libcalamares.job.setprogress(0.2)
|
||||||
|
root_partitions = [ p["fs"].lower() for p in partitions if p["mountPoint"] == "/" ]
|
||||||
|
root_btrfs = (root_partitions[0] == "btrfs") if root_partitions else False
|
||||||
|
create_swapfile(root_mount_point, root_btrfs)
|
||||||
|
|
||||||
|
try:
|
||||||
|
libcalamares.job.setprogress(0.5)
|
||||||
return generator.run()
|
return generator.run()
|
||||||
|
finally:
|
||||||
|
libcalamares.job.setprogress(1.0)
|
||||||
|
@ -37,6 +37,10 @@ efiSystemPartition: "/boot/efi"
|
|||||||
# In both cases, a fudge factor (usually 10% extra) is applied so that there
|
# In both cases, a fudge factor (usually 10% extra) is applied so that there
|
||||||
# is some space for administrative overhead (e.g. 8 GiB swap will allocate
|
# is some space for administrative overhead (e.g. 8 GiB swap will allocate
|
||||||
# 8.8GiB on disk in the end).
|
# 8.8GiB on disk in the end).
|
||||||
|
#
|
||||||
|
# If *file* is enabled here, make sure to have the *fstab* module
|
||||||
|
# as well (later in the exec phase) so that the swap file is
|
||||||
|
# actually created.
|
||||||
userSwapChoices:
|
userSwapChoices:
|
||||||
- none # Create no swap, use no swap
|
- none # Create no swap, use no swap
|
||||||
- small # Up to 4GB
|
- small # Up to 4GB
|
||||||
|
Loading…
Reference in New Issue
Block a user