When deploying Linux systems on industrial CompactFlash (CF) cards that must operate unattended for extended periods, filesystem reliability becomes paramount. The primary concerns are:
- Minimizing write operations to prolong flash memory lifespan
- Ensuring filesystem consistency after power failures
- Reducing or eliminating the need for fsck on boot
For this specific use case, we recommend these mount options in /etc/fstab:
UUID=xxxx-xxxx / ext4 defaults,noatime,nodiratime,data=journal,commit=60,barrier=1 0 1
Breaking down the critical options:
- data=journal: Provides full data and metadata journaling for maximum reliability
- commit=60: Increases commit interval to reduce writes (tune based on your risk tolerance)
- noatime/nodiratime: Eliminates unnecessary access time updates
- barrier=1: Ensures proper write ordering (critical for flash storage)
When initially creating the filesystem:
mkfs.ext4 -O ^has_journal,^extent,^flex_bg -E lazy_itable_init=0,lazy_journal_init=0 /dev/sdX tune2fs -o journal_data /dev/sdX tune2fs -c 0 -i 0 /dev/sdX
These parameters:
- Explicitly enable journaling after creation for better control
- Disable extents which can complicate recovery
- Remove unnecessary filesystem checks
For additional protection:
echo 5 > /proc/sys/vm/dirty_background_ratio echo 10 > /proc/sys/vm/dirty_ratio echo 6000 > /proc/sys/vm/dirty_expire_centisecs echo 300 > /proc/sys/vm/dirty_writeback_centisecs
These kernel parameters help:
- Reduce dirty page thresholds
- Shorten writeback intervals
- Minimize potential data loss windows
Implement a simple monitoring script to check filesystem health:
#!/bin/bash # Check filesystem errors ERR_COUNT=$(dmesg | grep -i "ext4.*error" | wc -l) if [ $ERR_COUNT -gt 0 ]; then logger -t fscheck "EXT4 errors detected in kernel log" fi # Force periodic sync if needed sync
Schedule this to run periodically via cron to catch potential issues early.
For maximum reliability, consider making the root filesystem read-only:
mount -o remount,ro /
Then configure a separate small partition with these fstab options for writable data:
UUID=yyyy-yyyy /data ext4 defaults,noatime,data=journal,commit=60,barrier=1 0 2
This approach:
- Completely protects the root filesystem
- Confines writes to a designated area
- Minimizes potential corruption points
When configuring ext4 for unattended industrial systems using CompactFlash storage, we must prioritize these technical considerations:
- Data integrity over performance
- Power loss resilience as a primary design goal
- Minimal maintenance (ideally zero fsck requirements)
These mount options in /etc/fstab
provide the best balance for embedded systems:
UUID=xxxx-xxxx / ext4 errors=remount-ro,data=journal,nodelalloc,noauto_da_alloc 0 1
Key options explained:
data=journal
- Full journaling including file data (slowest but safest)nodelalloc
- Disables delayed allocation to prevent metadata corruptionnoauto_da_alloc
- Prevents unsafe optimizations that could cause corruption
Add these to your boot parameters (/etc/default/grub
):
GRUB_CMDLINE_LINUX="rootflags=data=journal elevator=noop"
When initially creating the filesystem (or when reformatting):
mkfs.ext4 -O ^has_journal,^extent,^uninit_bg -E lazy_itable_init=0 /dev/sdX
Then re-enable journaling separately:
tune2fs -o journal_data /dev/sdX
Even with these precautions, schedule monthly maintenance:
#!/bin/bash # Force filesystem sync and journal flush sync echo 3 > /proc/sys/vm/drop_caches
Here's a complete example for an embedded industrial controller:
# /etc/fstab UUID=5e4c4d4e-1234-5678-90ab-cdef01234567 / ext4 defaults,errors=remount-ro,data=journal,nodelalloc,noauto_da_alloc,commit=60 0 1 # Kernel parameters in /etc/default/grub GRUB_CMDLINE_LINUX_DEFAULT="quiet rootflags=data=journal elevator=noop"
Implement this simple monitoring script:
#!/bin/bash # Check filesystem health HEALTH=$(dmesg | grep "EXT4-fs error") if [ -n "$HEALTH" ]; then logger -t ext4mon "Filesystem errors detected: $HEALTH" fi