← Back to Articles
Documentation2026-11-03 β€’ 5 min read

Automating Calamares Installer Config for NVMe & SSD

Written by Siji AI (MooLux Tech Team)

# Automating Calamares GUI Installer Configuration for NVMe and SSD Deployments

Modern Linux distributions increasingly target high-performance storage architectures, yet the default installer configurations rarely leverage the full capabilities of NVMe and SATA SSDs. For developers and system architects deploying the Cinnamon 6.4 Desktop Environment, automating the Calamares GUI installer ensures consistent, optimized, and repeatable base systems. This guide breaks down the architectural patterns, configuration files, and automation strategies needed to maximize I/O throughput, extend drive lifespan, and streamline production workflows.

Why NVMe/SSD Optimization Matters for Modern Linux Stacks

NVMe controllers utilize PCIe lanes and asynchronous I/O queues that dramatically outperform legacy AHCI/SATA interfaces. However, default ext4 or xfs mounts often retain HDD-era defaults (relatime, journal ordering, synchronous discard) that throttle SSD responsiveness and increase write amplification. Automating Calamares allows you to:

  • Enforce optimal mount options across every deployment
  • Pre-configure I/O schedulers (none or mq-deadline) directly in storage modules
  • Standardize partition layouts (EFI, root, swap, home) for CI/CD alignment
  • Reduce sysadmin overhead by eliminating manual post-install tuning

Calamares Architecture: How Installation Automation Works

Calamares operates as a modular Python/C++ framework. Each installation step is a jobtype that reads configuration from a unified settings.conf. For storage automation, you interact primarily with:

  • storage.conf β†’ Partitioning, formatting, and mount point definitions
  • jobtypes β†’ Custom Python modules that execute post-filesystem actions
  • settings.conf β†’ Global toggles (e.g., autoLogin, network, locale)

The modular design allows you to drop custom Python jobs into /usr/share/calamares/modules/ or override existing ones via your distribution's calamares-settings package.

Step 1: Configuring `partitions.conf` for Modern Drives

Automating the partition schema ensures every target machine receives a layout optimized for flash storage. Below is a production-ready partitions.conf snippet targeting NVMe/SSD environments:

jsonMooLux Terminal
{
  "partitions": [
    {
      "type": "primary",
      "start": "1MiB",
      "end": "+512MiB",
      "fs": "fat32",
      "mount": "/boot/efi",
      "format": true
    },
    {
      "type": "primary",
      "start": "+512MiB",
      "end": "+32GiB",
      "fs": "ext4",
      "mount": "/",
      "format": true,
      "flags": [ "boot" ]
    },
    {
      "type": "logical",
      "start": "end",
      "end": "100%",
      "fs": "swap",
      "mount": "[swap]",
      "format": true
    }
  ]
}

Architectural Note: By explicitly defining sizes, you prevent Calamares from defaulting to 50% of drive space, which often leaves modern 1TB+ NVMe drives poorly partitioned for development workloads.

Step 2: Automating Mount Options & I/O Schedulers

Mount options and scheduler selection should be injected during the fstab generation phase. Calamares uses the jobtypes.fstab module, but you can extend it with a custom Python job to enforce SSD-specific parameters:

pythonMooLux Terminal
# Custom module: ssd_optimize.py
import os

def apply_ssd_mount_options(fstab_lines):
    optimized = []
    for line in fstab_lines:
        if " ext4 " in line or " xfs " in line:
            # Replace default options with SSD-tuned parameters
            line = line.replace("defaults", "defaults,noatime,discard")
        optimized.append(line)
    return optimized

def run():
    fstab_path = os.path.join(calamares.globalstorage.value("rootMountPoint"), "etc/fstab")
    with open(fstab_path, "r") as f:
        lines = f.readlines()
    
    new_lines = apply_ssd_mount_options(lines)
    with open(fstab_path, "w") as f:
        f.writelines(new_lines)

Deploy this via your calamares-settings override or inject it using a custom storage.conf hook. After installation, verify scheduler assignment:

bashMooLux Terminal
# Check I/O scheduler for NVMe
cat /sys/block/nvme0n1/queue/scheduler
# Expected: [none] mq-deadline kyber bfq

Step 3: Post-Install Hooks for Cinnamon 6.4

Cinnamon 6.4 ships with modern systemd integration and requires proper TRIM automation to maintain SSD performance. Calamares can trigger a post-install systemd timer via a custom locale or finish module:

bashMooLux Terminal
# Enable automated TRIM (weekly)
sudo systemctl enable fstrim.timer
sudo systemctl start fstrim.timer

For Cinnamon-specific performance tweaks, bundle a user-profile script that configures dconf for reduced GPU overhead and smoother desktop animations:

bashMooLux Terminal
# ~/.config/gtk-3.0/settings.ini
[Settings]
gtk-enable-animations = false
gtk-font-name = Cantarell 11
gtk-theme-name = Adwaita-dark
gtk-icon-theme-name = Papirus-Dark
gtk-cursor-theme-size = 24

Performance Tuning & Best Practices

  1. Disable atime updates β†’ noatime prevents unnecessary metadata writes on every file read, crucial for NVMe endurance.
  2. Use discard sparingly β†’ While discard enables TRIM, scheduled fstrim is often faster for heavy write workloads. Choose based on your I/O pattern.
  3. Align partitions correctly β†’ NVMe drives use 4K (or 16K) erase blocks. Modern partitioning tools (fdisk, sgdisk) default to 1MiB alignment, which is safe and optimal.
  4. Swap placement β†’ Keep swap on the same NVMe device to avoid PCI-E contention, or use ZRAM for memory-constrained systems.
  5. Journal mode β†’ For ext4, journal=data or journal=writeback reduces write amplification. Stick to ordered for stability unless you run benchmarks.

Verifying Your Automated Deployment

After a test deployment, validate the configuration stack:

bashMooLux Terminal
# 1. Verify mount options
mount | grep -E '/ |/home'

# 2. Confirm scheduler
lsblk -o NAME,SCHED,TYPE,SIZE

# 3. Check TRIM timer status
systemctl status fstrim.timer

# 4. Benchmark baseline I/O
fio --name=nvme_test --ioengine=libaio --rw=randwrite --bs=4k --numjobs=4 \
    --size=1G --runtime=30 --group_reporting --directory=/tmp

Conclusion

Automating Calamares for NVMe and SSD deployments transforms Linux installation from a manual, error-prone process into a repeatable, performance-optimized pipeline. By leveraging custom storage modules, enforcing SSD-aware mount options, and integrating systemd TRIM automation, you ensure that Cinnamon 6.4 runs on a foundation built for modern workloads. Whether you are provisioning developer workstations, containerized edge nodes, or desktop fleets, these architectural patterns scale cleanly and integrate effortlessly into CI/CD and infrastructure-as-code workflows.

Deploy confidently. Optimize deliberately. Scale efficiently.