--- # LVM Sizing Algorithm # ==================== # Sizes are computed from disk_size_gb, memory_mb, and feature flags. # # Swap sizing: # - RAM >= 16 GB → swap = RAM/2 (in GB) # - RAM < 16 GB → swap = max(RAM_GB, 2) # - Capped to: min(target, 4 + max(disk - overhead, 0)) # - Further capped to: max available after subtracting reserved + CIS + extent reserve + 4 GB buffer # # Root sizing: # - Full-disk mode (default): disk - reserved - swap - extent_reserve - (CIS volumes if enabled) # - Partial mode: tiered — <4 GB available → 4 GB, 4-12 GB → all available, >12 GB → 40% of disk # # CIS volumes (only when CIS enabled): # - /home: max(min(home_raw, home_max), home_min) where home_raw = (disk - overhead) * 10% # - /var: 2 GB, /var/log: 2 GB, /var/log/audit: 1.5 GB # # Extent reserve: 10 extents * 4 MiB = ~0.04 GB (prevents VG overflow) - name: Create LVM logical volumes when: system_cfg.filesystem != 'btrfs' block: - name: Create LVM volume group community.general.lvg: vg: "{{ partitioning_vg_name }}" pvs: "{{ partitioning_root_device }}" - name: Create LVM logical volumes when: - system_cfg.features.cis.enabled or item.lv not in ['home', 'var', 'var_log', 'var_log_audit'] - system_cfg.features.swap.enabled | bool or item.lv != 'swap' vars: partitioning_lvm_extent_reserve_count: 10 partitioning_lvm_extent_size_mib: 4 partitioning_lvm_extent_reserve_gb: >- {{ ( (partitioning_lvm_extent_reserve_count | float) * (partitioning_lvm_extent_size_mib | float) / 1024 ) | round(2, 'ceil') }} partitioning_lvm_swap_target_gb: >- {{ ( ((partitioning_memory_mb | float / 1024) >= 16.0) | ternary( (partitioning_memory_mb | float / 2048), [(partitioning_memory_mb | float / 1024), 2] | max | float ) ) if system_cfg.features.swap.enabled | bool else 0 }} partitioning_lvm_swap_cap_gb: >- {{ ( 4 + [ (partitioning_disk_size_gb | float) - (partitioning_disk_overhead_gb | float), 0 ] | max ) if system_cfg.features.swap.enabled | bool else 0 }} partitioning_lvm_swap_target_limited_gb: >- {{ ( [ partitioning_lvm_swap_target_gb, partitioning_lvm_swap_cap_gb ] | min ) if system_cfg.features.swap.enabled | bool else 0 }} partitioning_lvm_swap_max_gb: >- {{ ( [ ( (partitioning_disk_size_gb | float) - (partitioning_reserved_gb | float) - (system_cfg.features.cis.enabled | ternary(partitioning_cis_reserved_gb | float, 0)) - partitioning_lvm_extent_reserve_gb - 4 ), 0 ] | max ) if system_cfg.features.swap.enabled | bool else 0 }} partitioning_lvm_available_gb: >- {{ ( (partitioning_disk_size_gb | float) - (partitioning_reserved_gb | float) - (system_cfg.features.cis.enabled | ternary(partitioning_cis_reserved_gb | float, 0)) - partitioning_lvm_extent_reserve_gb - partitioning_lvm_swap_target_limited_gb ) | float }} partitioning_lvm_home_raw_gb: >- {{ ((partitioning_disk_size_gb | float) - (partitioning_disk_overhead_gb | float)) * (partitioning_home_allocation_pct | float) }} partitioning_lvm_home_gb: >- {{ [ [(partitioning_lvm_home_raw_gb | float), (partitioning_home_min_gb | float)] | max, (partitioning_home_max_gb | float) ] | min }} partitioning_lvm_root_default_gb: >- {{ [ ( ((partitioning_lvm_available_gb | float) < 4) | ternary( 4, ( ((partitioning_lvm_available_gb | float) > 12) | ternary( ((partitioning_disk_size_gb | float) * 0.4) | round(0, 'ceil'), partitioning_lvm_available_gb ) ) ) ), 4 ] | max }} partitioning_lvm_swap_gb: >- {{ ( [ partitioning_lvm_swap_target_limited_gb, partitioning_lvm_swap_max_gb ] | min | round(2, 'floor') ) if system_cfg.features.swap.enabled | bool else 0 }} partitioning_lvm_root_full_gb: >- {{ [ ( (partitioning_disk_size_gb | float) - (partitioning_reserved_gb | float) - (partitioning_lvm_swap_gb | float) - partitioning_lvm_extent_reserve_gb - ( (partitioning_lvm_home_gb | float) + (partitioning_lvm_var_gb | float) + (partitioning_lvm_var_log_gb | float) + (partitioning_lvm_var_log_audit_gb | float) if system_cfg.features.cis.enabled else 0 ) ), 4 ] | max | round(2, 'floor') }} partitioning_lvm_root_gb: >- {{ partitioning_lvm_root_full_gb if partitioning_use_full_disk | bool else partitioning_lvm_root_default_gb }} community.general.lvol: vg: "{{ partitioning_vg_name }}" lv: "{{ item.lv }}" size: "{{ item.size }}" state: present loop: - lv: root size: "{{ partitioning_lvm_root_gb | string + 'G' }}" - lv: swap size: "{{ partitioning_lvm_swap_gb | string + 'G' }}" - lv: home size: "{{ partitioning_lvm_home_gb | string + 'G' }}" - { lv: var, size: "{{ partitioning_lvm_var_gb }}G" } - { lv: var_log, size: "{{ partitioning_lvm_var_log_gb }}G" } - { lv: var_log_audit, size: "{{ partitioning_lvm_var_log_audit_gb }}G" } loop_control: label: "{{ item.lv }}"