When testing kernel parameters through sysctl
, many developers assume that simply reloading the default configuration file (/etc/sysctl.conf
) will reset all values. However, this isn't the case because:
- Some parameters are set during boot by the kernel or init system
- Runtime changes persist until reboot unless explicitly reset
- Loading a partial config file doesn't override all existing values
Here are three effective approaches to reset sysctl parameters:
Method 1: Full System Reboot
The most thorough solution:
sudo reboot
This guarantees all parameters return to their boot-time defaults.
Method 2: Targeted Parameter Reset
For individual parameters when you know the defaults:
# Example: Reset vm.swappiness
sudo sysctl -w vm.swappiness=60
# Example: Reset net.ipv4.tcp_fin_timeout
sudo sysctl -w net.ipv4.tcp_fin_timeout=60
Method 3: Reapply All Defaults
Create a reset script using these steps:
#!/bin/bash
# First, clear all current settings
sudo sysctl --system
# Then reapply default configs
for conf in /usr/lib/sysctl.d/*.conf /etc/sysctl.d/*.conf /etc/sysctl.conf; do
[ -f "$conf" ] && sudo sysctl -p "$conf"
done
Always verify changes with:
# Check all parameters
sysctl -a
# Filter specific parameters
sysctl -a | grep 'net.ipv4.tcp'
Remember this distinction:
Type | Command | Persistence |
---|---|---|
Runtime | sysctl -w |
Until reboot |
Persistent | Edit config files | Survives reboot |
To find built-in kernel defaults (before any configs are applied):
# Boot with minimal configuration
sudo sysctl --system --boot
# Then check the current values
sysctl -a > kernel_defaults.txt
When testing kernel parameters through sysctl
, many administrators assume that simply reloading the default configuration with sysctl -p
will revert all changes. However, this only affects parameters specified in /etc/sysctl.conf
or your custom config file. The actual runtime values may persist through various mechanisms.
Modern Linux systems manage sysctl parameters through multiple layers:
1. Runtime values (via /proc/sys/) 2. Boot-time settings (sysctl.service) 3. Distribution defaults (/usr/lib/sysctl.d/) 4. Local administrator settings (/etc/sysctl.d/) 5. Legacy configuration (/etc/sysctl.conf)
For a full reset to distribution defaults, follow this procedure:
Step 1: Clear runtime modifications
# Find all modified parameters
sysctl -a > current_values.txt
sysctl --system > default_values.txt
diff current_values.txt default_values.txt | grep "<" | awk '{print $2}' > modified_params.txt
# Reset each parameter individually
while read param; do
sysctl -w "$param=$(grep "^${param}=" default_values.txt | cut -d= -f2)"
done < modified_params.txt
Step 2: Purge custom configurations
# Remove all custom configs while preserving originals
mkdir ~/sysctl_backup
mv /etc/sysctl.conf ~/sysctl_backup/
mv /etc/sysctl.d/*.conf ~/sysctl_backup/ 2>/dev/null
# Reinstall base packages to restore defaults (Debian/Ubuntu example)
apt-get --reinstall install procps
Step 3: Full system reload
# Apply all system defaults
sysctl --system
# Alternative for older systems
find /usr/lib/sysctl.d/ -name "*.conf" | xargs -I {} sysctl -p {}
To confirm successful reset:
# Compare against known good state
sysctl -a | sha256sum
# Should match output from a fresh installation
Remember that:
sysctl -w
makes temporary runtime changes- Configuration files create persistent changes
- Some parameters may be managed by other services (like networkd)
For frequent testing, save this as reset_sysctl.sh
:
#!/bin/bash
# Backup current state
TIMESTAMP=$(date +%Y%m%d-%H%M%S)
mkdir -p /var/backups/sysctl/${TIMESTAMP}
sysctl -a > /var/backups/sysctl/${TIMESTAMP}/pre-reset.conf
# Reset procedure
sysctl --system
systemctl restart systemd-sysctl
# Verify
sysctl -a > /var/backups/sysctl/${TIMESTAMP}/post-reset.conf
diff /var/backups/sysctl/${TIMESTAMP}/pre-reset.conf \
/var/backups/sysctl/${TIMESTAMP}/post-reset.conf