diff options
| -rw-r--r-- | python/vyos/system/disk.py | 5 | ||||
| -rw-r--r-- | python/vyos/system/raid.py | 31 | ||||
| -rwxr-xr-x | src/op_mode/image_installer.py | 1 | 
3 files changed, 25 insertions, 12 deletions
| diff --git a/python/vyos/system/disk.py b/python/vyos/system/disk.py index f8e0fd1bf..b8a2c0f35 100644 --- a/python/vyos/system/disk.py +++ b/python/vyos/system/disk.py @@ -31,12 +31,17 @@ class DiskDetails:  def disk_cleanup(drive_path: str) -> None:      """Clean up disk partition table (MBR and GPT) +    Remove partition and device signatures.      Zeroize primary and secondary headers - first and last 17408 bytes      (512 bytes * 34 LBA) on a drive      Args:          drive_path (str): path to a drive that needs to be cleaned      """ +    partitions: list[str] = partition_list(drive_path) +    for partition in partitions: +        run(f'wipefs -af {partition}') +    run(f'wipefs -af {drive_path}')      run(f'sgdisk -Z {drive_path}') diff --git a/python/vyos/system/raid.py b/python/vyos/system/raid.py index 13b99fa69..5b33d34da 100644 --- a/python/vyos/system/raid.py +++ b/python/vyos/system/raid.py @@ -19,7 +19,7 @@ from pathlib import Path  from shutil import copy  from dataclasses import dataclass -from vyos.utils.process import cmd +from vyos.utils.process import cmd, run  from vyos.system import disk @@ -44,18 +44,11 @@ def raid_create(raid_members: list[str],      """      raid_devices_num: int = len(raid_members)      raid_members_str: str = ' '.join(raid_members) -    if Path('/sys/firmware/efi').exists(): -        for part in raid_members: -            drive: str = disk.partition_parent(part) -            command: str = f'sgdisk --typecode=3:A19D880F-05FC-4D3B-A006-743F0F84911E {drive}' -            cmd(command) -    else: -        for part in raid_members: -            drive: str = disk.partition_parent(part) -            command: str = f'sgdisk --typecode=3:A19D880F-05FC-4D3B-A006-743F0F84911E {drive}' -            cmd(command)      for part in raid_members: -        command: str = f'mdadm --zero-superblock {part}' +        drive: str = disk.partition_parent(part) +        # set partition type GUID for raid member; cf. +        # https://en.wikipedia.org/wiki/GUID_Partition_Table#Partition_type_GUIDs +        command: str = f'sgdisk --typecode=3:A19D880F-05FC-4D3B-A006-743F0F84911E {drive}'          cmd(command)      command: str = f'mdadm --create /dev/{raid_name} -R --metadata=1.0 \          --raid-devices={raid_devices_num} --level={raid_level} \ @@ -72,6 +65,20 @@ def raid_create(raid_members: list[str],      return raid +def clear(): +    """Deactivate all RAID arrays""" +    command: str = 'mdadm --examine --scan' +    raid_config = cmd(command) +    if not raid_config: +        return +    command: str = 'mdadm --run /dev/md?*' +    run(command) +    command: str = 'mdadm --assemble --scan --auto=yes --symlink=no' +    run(command) +    command: str = 'mdadm --stop --scan' +    run(command) + +  def update_initramfs() -> None:      """Update initramfs"""      mdadm_script = '/etc/initramfs-tools/scripts/local-top/mdadm' diff --git a/src/op_mode/image_installer.py b/src/op_mode/image_installer.py index 9452c5e28..66ce8f2e6 100755 --- a/src/op_mode/image_installer.py +++ b/src/op_mode/image_installer.py @@ -179,6 +179,7 @@ def create_partitions(target_disk: str, target_size: int,          rootfs_size: int = available_size      print(MSG_INFO_INSTALL_PARTITONING) +    raid.clear()      disk.disk_cleanup(target_disk)      disk_details: disk.DiskDetails = disk.parttable_create(target_disk,                                                             rootfs_size) | 
