Tweaked get_mount_info() and mount_subvolume(). mount info now returns the path it found after traversal. mount_subvolume will no longer assume installation.target is of pathlib.Path and converts it if it isn't.
This commit is contained in:
parent
4bc164cccc
commit
3ee1a5c18e
|
|
@ -6,29 +6,38 @@ from ..exceptions import DiskError
|
||||||
from ..general import SysCommand
|
from ..general import SysCommand
|
||||||
from ..output import log
|
from ..output import log
|
||||||
|
|
||||||
def mount_subvolume(installation, location :Union[pathlib.Path, str], force=False) -> bool:
|
def mount_subvolume(installation, subvolume_location :Union[pathlib.Path, str], force=False) -> bool:
|
||||||
"""
|
"""
|
||||||
This function uses mount to mount a subvolume on a given device, at a given location with a given subvolume name.
|
This function uses mount to mount a subvolume on a given device, at a given location with a given subvolume name.
|
||||||
|
|
||||||
@installation: archinstall.Installer instance
|
@installation: archinstall.Installer instance
|
||||||
@location: a localized string or path inside the installation / or /boot for instance without specifying /mnt/boot
|
@subvolume_location: a localized string or path inside the installation / or /boot for instance without specifying /mnt/boot
|
||||||
@force: overrides the check for weither or not the subvolume mountpoint is empty or not
|
@force: overrides the check for weither or not the subvolume mountpoint is empty or not
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
installation_mountpoint = installation.target
|
||||||
|
if type(installation_mountpoint) == str:
|
||||||
|
installation_mountpoint = pathlib.Path(installation_mountpoint)
|
||||||
# Set up the required physical structure
|
# Set up the required physical structure
|
||||||
if type(location) == str:
|
if type(subvolume_location) == str:
|
||||||
location = pathlib.Path(location)
|
subvolume_location = pathlib.Path(subvolume_location)
|
||||||
|
|
||||||
if not (installation.target/location).exists():
|
target = installation_mountpoint / subvolume_location.relative_to(subvolume_location.anchor)
|
||||||
(installation.target/location).mkdir(parents=True)
|
|
||||||
|
|
||||||
if glob.glob(str(installation.target/location/'*')) and force is False:
|
if not (target).exists():
|
||||||
raise DiskError(f"Cannot mount subvolume to {installation.target/location} because it contains data (non-empty folder target)")
|
(target).mkdir(parents=True)
|
||||||
|
|
||||||
log(f"Mounting {installation.target/location} as a subvolume", level=logging.INFO)
|
if glob.glob(str(target/'*')) and force is False:
|
||||||
|
raise DiskError(f"Cannot mount subvolume to {target} because it contains data (non-empty folder target)")
|
||||||
|
|
||||||
|
log(f"Mounting {target} as a subvolume", level=logging.INFO)
|
||||||
# Mount the logical volume to the physical structure
|
# Mount the logical volume to the physical structure
|
||||||
mount_location = get_mount_info(installation.target/location, traverse=True)['source']
|
mountpoint_device, mountpoint_device_real_path = get_mount_info(target, traverse=True, return_real_path=True)['source']
|
||||||
SysCommand(f"umount {mount_location}")
|
if mountpoint_device_real_path == str(target):
|
||||||
return SysCommand(f"mount {mount_location} {installation.target}/{str(location)} -o subvol=@/{str(location)}").exit_code == 0
|
log(f"Unmounting non-subvolume {mountpoint_device} previously mounted at {target}")
|
||||||
|
SysCommand(f"umount {mountpoint_device}")
|
||||||
|
|
||||||
|
return SysCommand(f"mount {mountpoint_device} {target} -o subvol=@{subvolume_location}").exit_code == 0
|
||||||
|
|
||||||
def create_subvolume(installation, location :Union[pathlib.Path, str]) -> bool:
|
def create_subvolume(installation, location :Union[pathlib.Path, str]) -> bool:
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
|
|
@ -117,7 +117,7 @@ def harddrive(size=None, model=None, fuzzy=False):
|
||||||
return collection[drive]
|
return collection[drive]
|
||||||
|
|
||||||
|
|
||||||
def get_mount_info(path :Union[pathlib.Path, str], traverse=False) -> dict:
|
def get_mount_info(path :Union[pathlib.Path, str], traverse=False, return_real_path=False) -> dict:
|
||||||
for traversal in list(map(str, [str(path)] + list(pathlib.Path(str(path)).parents))):
|
for traversal in list(map(str, [str(path)] + list(pathlib.Path(str(path)).parents))):
|
||||||
try:
|
try:
|
||||||
log(f"Getting mount information at location {traversal}", level=logging.INFO)
|
log(f"Getting mount information at location {traversal}", level=logging.INFO)
|
||||||
|
|
@ -131,6 +131,9 @@ def get_mount_info(path :Union[pathlib.Path, str], traverse=False) -> dict:
|
||||||
break
|
break
|
||||||
|
|
||||||
if not output:
|
if not output:
|
||||||
|
if return_real_path:
|
||||||
|
return {}, None
|
||||||
|
else:
|
||||||
return {}
|
return {}
|
||||||
|
|
||||||
output = json.loads(output)
|
output = json.loads(output)
|
||||||
|
|
@ -138,8 +141,14 @@ def get_mount_info(path :Union[pathlib.Path, str], traverse=False) -> dict:
|
||||||
if len(output['filesystems']) > 1:
|
if len(output['filesystems']) > 1:
|
||||||
raise DiskError(f"Path '{path}' contains multiple mountpoints: {output['filesystems']}")
|
raise DiskError(f"Path '{path}' contains multiple mountpoints: {output['filesystems']}")
|
||||||
|
|
||||||
|
if return_real_path:
|
||||||
|
return output['filesystems'][0], traversal
|
||||||
|
else:
|
||||||
return output['filesystems'][0]
|
return output['filesystems'][0]
|
||||||
|
|
||||||
|
if return_real_path:
|
||||||
|
return {}, traversal
|
||||||
|
else:
|
||||||
return {}
|
return {}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue