Merge pull request #1880 from medicalwei/fixed-reset-partition-size

Accept a fixed partition size for reset partition in autoinstall.yaml
This commit is contained in:
Dan Bungert 2024-02-12 20:21:10 -07:00 committed by GitHub
commit 2883cad416
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 77 additions and 2 deletions

View File

@ -423,6 +423,41 @@ Example with no size scaling and a passphrase:
sizing-policy: all sizing-policy: all
password: LUKS_PASSPHRASE password: LUKS_PASSPHRASE
Reset Partition
^^^^^^^^^^^^^^^
``reset-partition`` is used for creating a Reset Partition, which is a FAT32 file system containing the entire content of the installer image, so that the user can start the installer from GRUB or EFI without using the installation media. This option is useful for OEM system provisioning.
By default, the size of a Reset Partition is roughly 1.1x the used file system size of the installation media.
An example to enable Reset Partition:
.. code-block:: yaml
storage:
layout:
name: direct
reset-partition: true
The size of the reset partition can also be fixed to a specified size. This is an example to fix Reset Partition to 12 GiB:
.. code-block:: yaml
storage:
layout:
name: direct
reset-partition: 12G
The installer can also install Reset Partition without installing the system. To do this, set ``reset-partition-only`` to ``true``:
.. code-block:: yaml
storage:
layout:
name: direct
reset-partition: true
reset-partition-only: true
Action-based configuration Action-based configuration
^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^

View File

@ -535,6 +535,7 @@ class GuidedChoiceV2:
sizing_policy: Optional[SizingPolicy] = SizingPolicy.SCALED sizing_policy: Optional[SizingPolicy] = SizingPolicy.SCALED
reset_partition: bool = False reset_partition: bool = False
reset_partition_size: Optional[int] = None
@attr.s(auto_attribs=True) @attr.s(auto_attribs=True)

View File

@ -29,6 +29,7 @@ import pyudev
from curtin import swap from curtin import swap
from curtin.commands.extract import AbstractSourceHandler from curtin.commands.extract import AbstractSourceHandler
from curtin.storage_config import ptable_part_type_to_flag from curtin.storage_config import ptable_part_type_to_flag
from curtin.util import human2bytes
from subiquity.common.apidef import API from subiquity.common.apidef import API
from subiquity.common.errorreport import ErrorReportKind from subiquity.common.errorreport import ErrorReportKind
@ -712,7 +713,10 @@ class FilesystemController(SubiquityController, FilesystemManipulator):
raise Exception("failed to locate gap after adding boot") raise Exception("failed to locate gap after adding boot")
if choice.reset_partition: if choice.reset_partition:
if self.app.opts.dry_run: if choice.reset_partition_size is not None:
part_align = disk.alignment_data().part_align
reset_size = align_up(choice.reset_partition_size, part_align)
elif self.app.opts.dry_run:
reset_size = DRY_RUN_RESET_SIZE reset_size = DRY_RUN_RESET_SIZE
else: else:
cp = await arun_command(["du", "-sb", "/cdrom"]) cp = await arun_command(["du", "-sb", "/cdrom"])
@ -1418,6 +1422,20 @@ class FilesystemController(SubiquityController, FilesystemManipulator):
disk_id=gap.device.id, gap=gap, allowed=[] disk_id=gap.device.id, gap=gap, allowed=[]
) )
reset_partition = False
reset_partition_size = None
rp_input = layout.get("reset-partition", None)
if rp_input:
reset_partition = True
if isinstance(rp_input, (str, int)):
reset_partition_size = int(human2bytes(rp_input))
log.info(
"autoinstall: will install reset partition "
f"of size {reset_partition_size}"
)
else:
log.info("autoinstall: will install reset partition")
log.info( log.info(
f"autoinstall: running guided {capability} install in " f"autoinstall: running guided {capability} install in "
f"mode {mode} using {target}" f"mode {mode} using {target}"
@ -1429,7 +1447,8 @@ class FilesystemController(SubiquityController, FilesystemManipulator):
password=password, password=password,
recovery_key=guided_recovery_key, recovery_key=guided_recovery_key,
sizing_policy=sizing_policy, sizing_policy=sizing_policy,
reset_partition=layout.get("reset-partition", False), reset_partition=reset_partition,
reset_partition_size=reset_partition_size,
), ),
reset_partition_only=layout.get("reset-partition-only", False), reset_partition_only=layout.get("reset-partition-only", False),
) )

View File

@ -472,6 +472,26 @@ class TestGuided(IsolatedAsyncioTestCase):
self.assertEqual(DRY_RUN_RESET_SIZE, d1p2.size) self.assertEqual(DRY_RUN_RESET_SIZE, d1p2.size)
self.assertEqual("/", d1p3.mount) self.assertEqual("/", d1p3.mount)
async def test_fixed_reset_partition(self):
await self._guided_setup(Bootloader.UEFI, "gpt")
target = GuidedStorageTargetReformat(
disk_id=self.d1.id, allowed=default_capabilities
)
fixed_reset_size = 12 << 30
await self.controller.guided(
GuidedChoiceV2(
target=target,
capability=GuidedCapability.DIRECT,
reset_partition=True,
reset_partition_size=fixed_reset_size,
)
)
[d1p1, d1p2, d1p3] = self.d1.partitions()
self.assertEqual("/boot/efi", d1p1.mount)
self.assertIsNone(d1p2.mount)
self.assertEqual(fixed_reset_size, d1p2.size)
self.assertEqual("/", d1p3.mount)
async def test_guided_reset_partition_only(self): async def test_guided_reset_partition_only(self):
await self._guided_setup(Bootloader.UEFI, "gpt") await self._guided_setup(Bootloader.UEFI, "gpt")
target = GuidedStorageTargetReformat( target = GuidedStorageTargetReformat(