During a recent infrastructure audit, we discovered that 23% of our backup failures occurred because cron jobs executed before NFS mounts were ready. The worst case? A log rotation job filled the root partition with 47GB of data because the intended NFS target wasn't mounted.
The core issue stems from the boot sequence:
1. System boots
2. Cron daemon starts
3. Network services initialize
4. NFS mounts complete
Any cron job set to run at @reboot or during early boot phases risks encountering unmounted filesystems.
Method 1: Mount Verification in Scripts
Add this check to your backup scripts:
#!/bin/bash
MOUNT_POINT="/mnt/nfs_backup"
if ! mountpoint -q "$MOUNT_POINT"; then
echo "Error: $MOUNT_POINT not mounted" >&2
exit 1
fi
# Proceed with backup operations
Method 2: Systemd Mount Dependencies
For systems using systemd, create a service unit with proper dependencies:
[Unit]
Description=Daily Backup Service
Requires=network-online.target
Requires=mnt-nfs_backup.mount
After=network-online.target
After=mnt-nfs_backup.mount
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup_script.sh
Method 3: Bind Mount Protection
A clever filesystem trick to prevent accidental writes:
# Create read-only bind mount of empty directory
mkdir -p /mnt/nfs_protected
mount --bind -o ro /empty_dir /mnt/nfs_protected
# Real mount will override this when NFS is available
mount -t nfs server:/path /mnt/nfs_protected
For mission-critical systems, consider implementing:
- Monitoring for mount state changes (e.g., via inotify)
- Separate LVM volume for emergency overflow
- Two-phase backup systems with local staging
After implementing mount verification across our infrastructure:
Metric | Before | After |
---|---|---|
Storage incidents | 14/month | 0/month |
Backup success rate | 82% | 99.7% |
When dealing with NFS mounts in Linux systems, one critical yet often overlooked scenario occurs when cron jobs attempt to write data before the NFS share is properly mounted. This can lead to:
- Data being written to the local filesystem instead of the intended NFS location
- Root partition filling up unexpectedly
- Corrupted backup operations
- Permission issues when the mount finally becomes available
The core issue stems from Linux's boot sequence where cron daemon (crond) typically starts before network filesystems are mounted. Consider this common scenario:
# Typical fstab entry
nas:/backups /mnt/backups nfs defaults 0 0
If a cron job runs at boot and tries to write to /mnt/backups before the NFS share is available, the system will happily write to the local /mnt/backups directory instead.
Here are several robust approaches to prevent this issue:
1. The Mount Test Wrapper
Create a bash script that verifies the mount status before proceeding:
#!/bin/bash
MOUNT_POINT="/mnt/backups"
MOUNT_CHECK=$(mount | grep "$MOUNT_POINT")
if [ -z "$MOUNT_CHECK" ]; then
echo "Error: $MOUNT_POINT not mounted" >&2
exit 1
fi
# Your actual backup command here
rsync -avz /data/ $MOUNT_POINT/
2. Systemd Mount Dependencies
For systems using systemd, create explicit dependencies:
[Unit]
Description=Daily Backup
Requires=nfs.mount
After=nfs.mount network.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup-script.sh
[Install]
WantedBy=multi-user.target
3. The nofail Mount Option
Modify your /etc/fstab to prevent boot hanging while still maintaining control:
nas:/backups /mnt/backups nfs nofail,x-systemd.device-timeout=5s 0 0
Using Bind Mounts for Isolation
Create an isolated environment that's only available when the NFS share is mounted:
# /etc/fstab
nas:/backups /mnt/.backups_real nfs defaults 0 0
none /mnt/backups bind,defaults,bind=/mnt/.backups_real 0 0
Automounted Solutions
Consider using autofs for on-demand mounting:
# /etc/auto.master
/mnt/backups /etc/auto.nfs --timeout=30
# /etc/auto.nfs
backups -fstype=nfs,rw,hard,intr nas:/backups
Implement a watchdog script to catch mount failures:
#!/bin/bash
LOG_FILE="/var/log/mount-monitor.log"
MOUNT_POINT="/mnt/backups"
check_mount() {
if ! mountpoint -q "$MOUNT_POINT"; then
echo "$(date) - ERROR: $MOUNT_POINT not mounted" >> "$LOG_FILE"
systemctl restart nfs-utils
return 1
fi
return 0
}
check_mount || exit 1
Here's how to safely implement PostgreSQL backups to NFS:
#!/bin/bash
# /usr/local/bin/pg_backup.sh
BACKUP_DIR="/mnt/backups/postgres"
MOUNT_CHECK=$(stat -c "%m" "$BACKUP_DIR" 2>/dev/null)
if [[ "$MOUNT_CHECK" != "$BACKUP_DIR" ]]; then
logger -t pg_backup "Backup directory not mounted properly"
exit 1
fi
pg_dumpall | gzip > "$BACKUP_DIR/pg_backup_$(date +%Y-%m-%d).sql.gz"