diff --git a/build_library/disk_layout.json b/build_library/disk_layout.json index 33ae6cb473..de346ea424 100644 --- a/build_library/disk_layout.json +++ b/build_library/disk_layout.json @@ -13,7 +13,7 @@ "label":"EFI-SYSTEM", "fs_label":"EFI-SYSTEM", "type":"efi", - "blocks":"262144", + "blocks":"2097152", "fs_type":"vfat", "mount":"/boot", "features": [] @@ -27,7 +27,8 @@ "label":"USR-A", "uuid":"7130c94a-213a-4e5a-8e26-6cce9662f132", "type":"flatcar-rootfs", - "blocks":"2097152", + "blocks":"4194304", + "extract_blocks":"2097152", "fs_blocks":"260094", "fs_type":"btrfs", "fs_compression":"zstd", @@ -38,7 +39,8 @@ "label":"USR-B", "uuid":"e03dd35c-7c2d-4a47-b3fe-27f15780a57c", "type":"flatcar-rootfs", - "blocks":"2097152", + "blocks":"4194304", + "extract_blocks":"2097152", "fs_blocks":"262144" }, "5":{ @@ -51,7 +53,7 @@ "label":"OEM", "fs_label":"OEM", "type":"data", - "blocks":"262144", + "blocks":"2097152", "fs_type":"btrfs", "fs_compression":"zlib", "mount":"/oem" @@ -70,7 +72,7 @@ "label":"ROOT", "fs_label":"ROOT", "type":"flatcar-resize", - "blocks":"4427776", + "blocks":"3653632", "fs_type":"ext4", "mount":"/" } diff --git a/build_library/disk_util b/build_library/disk_util index 8550605a99..497ab5f67d 100755 --- a/build_library/disk_util +++ b/build_library/disk_util @@ -40,10 +40,10 @@ def LoadPartitionConfig(options): '_comment', 'type', 'num', 'label', 'blocks', 'block_size', 'fs_blocks', 'fs_block_size', 'fs_type', 'features', 'uuid', 'part_alignment', 'mount', 'binds', 'fs_subvolume', 'fs_bytes_per_inode', 'fs_inode_size', 'fs_label', - 'fs_compression')) + 'fs_compression', 'extract_blocks')) integer_layout_keys = set(( 'blocks', 'block_size', 'fs_blocks', 'fs_block_size', 'part_alignment', - 'fs_bytes_per_inode', 'fs_inode_size')) + 'fs_bytes_per_inode', 'fs_inode_size', 'extract_blocks')) required_layout_keys = set(('type', 'num', 'label', 'blocks')) filename = options.disk_layout_file @@ -136,6 +136,13 @@ def LoadPartitionConfig(options): part.setdefault('fs_block_size', metadata['fs_block_size']) part.setdefault('fs_blocks', part['bytes'] // part['fs_block_size']) part['fs_bytes'] = part['fs_blocks'] * part['fs_block_size'] + # The partition may specify extract_blocks to limit what content gets + # extracted. The use case is the /usr partition where we can grow the + # partition but can't directly grow the filesystem and the update + # payload until all (or most) nodes are running the partition layout + # with the grown /usr partition (which can take a few years). + if part.get('extract_blocks', None): + part['extract_bytes'] = part['extract_blocks'] * metadata['block_size'] if part['fs_bytes'] > part['bytes']: raise InvalidLayout( @@ -823,6 +830,7 @@ def Extract(options): if not part['image_compat']: raise InvalidLayout("Disk layout is incompatible with existing image") + extract_size = part.get('extract_bytes', part['image_bytes']) subprocess.check_call(['dd', 'bs=10MB', 'iflag=count_bytes,skip_bytes', @@ -831,7 +839,7 @@ def Extract(options): 'if=%s' % options.disk_image, 'of=%s' % options.output, 'skip=%s' % part['image_first_byte'], - 'count=%s' % part['image_bytes']]) + 'count=%s' % extract_size]) def GetPartitionByNumber(partitions, num): diff --git a/changelog/changes/2025-10-09-partition-sizes.md b/changelog/changes/2025-10-09-partition-sizes.md new file mode 100644 index 0000000000..407bf1a036 --- /dev/null +++ b/changelog/changes/2025-10-09-partition-sizes.md @@ -0,0 +1 @@ +- Increased all partition sizes: `/boot` to 1 GB, the two `/usr` partitions to 2 GB, `/oem` to 1 GB so that we can use more space in a few years when we can assume that most nodes run the new partition layout - existing nodes can still update for the next years ([scripts#3027](https://github.com/flatcar/scripts/pull/3027))