Initial commit: Linux System Tuning Suite
- Intelligent hardware detection and analysis - Modular optimization system with profiles - Automatic tmpfs, zram, and kernel tuning - Real-time monitoring and health checks - Support for desktop, gaming, and development workloads - Safe backup and rollback capabilities - Systemd integration for persistent optimizations
This commit is contained in:
21
LICENSE
Normal file
21
LICENSE
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2025 Linux System Tuning Suite
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
94
README.md
Normal file
94
README.md
Normal file
@@ -0,0 +1,94 @@
|
|||||||
|
# Linux System Tuning Suite
|
||||||
|
|
||||||
|
🚀 **Intelligent system optimization toolkit for Linux desktop systems**
|
||||||
|
|
||||||
|
This repository provides automated system tuning based on hardware detection, usage patterns, and best practices for tmpfs, overlay filesystems, and kernel parameter optimization.
|
||||||
|
|
||||||
|
## 🎯 Features
|
||||||
|
|
||||||
|
- **Hardware Detection**: Automatically detects RAM, CPU, storage configuration
|
||||||
|
- **Usage Analysis**: Identifies frequently accessed files and directories
|
||||||
|
- **Intelligent Tuning**: Applies optimizations based on system characteristics
|
||||||
|
- **Modular Design**: Easy to customize and extend
|
||||||
|
- **Safe Deployment**: Backup and rollback capabilities
|
||||||
|
- **Multi-Distribution**: Works across different Linux distributions
|
||||||
|
|
||||||
|
## 🏗️ Components
|
||||||
|
|
||||||
|
### Core Scripts
|
||||||
|
- `tune-system.sh` - Main tuning orchestrator
|
||||||
|
- `system-analyzer.sh` - Hardware and usage analysis
|
||||||
|
- `optimizer.sh` - Apply specific optimizations
|
||||||
|
- `monitor.sh` - System monitoring and health checks
|
||||||
|
|
||||||
|
### Modules
|
||||||
|
- `modules/hardware-detection.sh` - RAM, CPU, storage detection
|
||||||
|
- `modules/usage-analysis.sh` - File access pattern analysis
|
||||||
|
- `modules/tmpfs-optimizer.sh` - tmpfs configuration
|
||||||
|
- `modules/overlay-optimizer.sh` - overlay filesystem setup
|
||||||
|
- `modules/kernel-tuning.sh` - kernel parameter optimization
|
||||||
|
- `modules/zram-optimizer.sh` - zram/zswap configuration
|
||||||
|
|
||||||
|
### Profiles
|
||||||
|
- `profiles/` - Pre-configured optimization profiles
|
||||||
|
- `configs/` - Configuration templates
|
||||||
|
|
||||||
|
## 🚀 Quick Start
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Clone the repository
|
||||||
|
git clone git@gitea.egonetix.de:root/linux_system_tuning.git
|
||||||
|
cd linux_system_tuning
|
||||||
|
|
||||||
|
# Run system analysis
|
||||||
|
sudo ./system-analyzer.sh
|
||||||
|
|
||||||
|
# Apply optimizations
|
||||||
|
sudo ./tune-system.sh --auto
|
||||||
|
|
||||||
|
# Monitor results
|
||||||
|
./monitor.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📊 Supported Optimizations
|
||||||
|
|
||||||
|
- **Memory Management**: zram, tmpfs, overlay filesystems
|
||||||
|
- **Kernel Tuning**: vm parameters, scheduler settings
|
||||||
|
- **Cache Optimization**: Browser, IDE, package manager caches
|
||||||
|
- **I/O Optimization**: Storage and network tuning
|
||||||
|
- **Desktop Responsiveness**: Priority and scheduling tweaks
|
||||||
|
|
||||||
|
## 🔧 Configuration
|
||||||
|
|
||||||
|
The system can be configured through:
|
||||||
|
- Interactive setup wizard
|
||||||
|
- Configuration files
|
||||||
|
- Command-line parameters
|
||||||
|
- Environment variables
|
||||||
|
|
||||||
|
## 📈 Benchmarking
|
||||||
|
|
||||||
|
Built-in benchmarking tools to measure:
|
||||||
|
- Boot time improvements
|
||||||
|
- Application startup times
|
||||||
|
- Memory utilization efficiency
|
||||||
|
- I/O performance gains
|
||||||
|
|
||||||
|
## 🛡️ Safety
|
||||||
|
|
||||||
|
- Automatic backups before changes
|
||||||
|
- Rollback capabilities
|
||||||
|
- Safe mode for testing
|
||||||
|
- Validation checks
|
||||||
|
|
||||||
|
## 📄 License
|
||||||
|
|
||||||
|
MIT License - see LICENSE file for details
|
||||||
|
|
||||||
|
## 🤝 Contributing
|
||||||
|
|
||||||
|
Contributions welcome! Please read CONTRIBUTING.md for guidelines.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
*Making Linux systems faster, one optimization at a time* ⚡
|
||||||
43
configs/default.conf
Normal file
43
configs/default.conf
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
# Configuration Template
|
||||||
|
# Copy this file to /var/lib/system-tuning/configs/custom.conf and modify
|
||||||
|
|
||||||
|
# Global settings
|
||||||
|
PROFILE="desktop" # desktop, gaming, development, minimal
|
||||||
|
DRY_RUN=false # Test mode - show what would be done
|
||||||
|
VERBOSE=true # Detailed output
|
||||||
|
BACKUP_ENABLED=true # Create backups before changes
|
||||||
|
|
||||||
|
# Memory settings
|
||||||
|
ZRAM_ENABLED=true # Enable zram compression
|
||||||
|
ZRAM_SIZE="auto" # Size: auto, 4G, 8G, 12G, etc.
|
||||||
|
ZRAM_ALGORITHM="lz4" # Compression: lz4, zstd, lzo
|
||||||
|
|
||||||
|
# tmpfs settings
|
||||||
|
TMPFS_BROWSER_CACHE=true # Browser cache in RAM
|
||||||
|
TMPFS_IDE_CACHE=true # IDE/editor cache in RAM
|
||||||
|
TMPFS_PACKAGE_CACHE=true # Package manager cache in RAM
|
||||||
|
TMPFS_BUILD_CACHE=false # Build cache in RAM (development)
|
||||||
|
|
||||||
|
# Kernel tuning
|
||||||
|
TUNE_KERNEL_PARAMS=true # Optimize kernel parameters
|
||||||
|
CUSTOM_SWAPPINESS="" # Leave empty for profile default
|
||||||
|
CUSTOM_DIRTY_RATIO="" # Leave empty for profile default
|
||||||
|
|
||||||
|
# Advanced settings
|
||||||
|
OVERLAY_ENABLED=false # Enable overlay filesystems
|
||||||
|
OVERLAY_PROTECT_CONFIGS=false # Protect system configs with overlay
|
||||||
|
SYSTEMD_SERVICE=true # Install systemd service
|
||||||
|
|
||||||
|
# Exclusions (space-separated paths)
|
||||||
|
EXCLUDE_PATHS="/home/user/important /opt/critical"
|
||||||
|
|
||||||
|
# Custom tmpfs mounts (format: path:size)
|
||||||
|
CUSTOM_TMPFS="
|
||||||
|
/tmp/custom-cache:1G
|
||||||
|
/var/tmp/builds:2G
|
||||||
|
"
|
||||||
|
|
||||||
|
# Performance monitoring
|
||||||
|
ENABLE_MONITORING=true # Enable performance monitoring
|
||||||
|
LOG_METRICS=true # Log performance metrics
|
||||||
|
BENCHMARK_ON_COMPLETION=false # Run benchmark after optimization
|
||||||
46
install.sh
Executable file
46
install.sh
Executable file
@@ -0,0 +1,46 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Installation script for Linux System Tuning Suite
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
INSTALL_DIR="/opt/linux-system-tuning"
|
||||||
|
BIN_DIR="/usr/local/bin"
|
||||||
|
SYSTEMD_DIR="/etc/systemd/system"
|
||||||
|
|
||||||
|
echo "🚀 Installing Linux System Tuning Suite"
|
||||||
|
echo "======================================="
|
||||||
|
|
||||||
|
# Check if running as root
|
||||||
|
if [[ $EUID -ne 0 ]]; then
|
||||||
|
echo "Please run this installer as root (use sudo)"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Create installation directory
|
||||||
|
echo "Creating installation directory..."
|
||||||
|
mkdir -p "$INSTALL_DIR"
|
||||||
|
cp -r * "$INSTALL_DIR/"
|
||||||
|
|
||||||
|
# Create symlinks in PATH
|
||||||
|
echo "Creating command symlinks..."
|
||||||
|
ln -sf "$INSTALL_DIR/tune-system.sh" "$BIN_DIR/tune-system"
|
||||||
|
ln -sf "$INSTALL_DIR/system-analyzer.sh" "$BIN_DIR/system-analyzer"
|
||||||
|
ln -sf "$INSTALL_DIR/monitor.sh" "$BIN_DIR/system-monitor"
|
||||||
|
|
||||||
|
# Create directories
|
||||||
|
mkdir -p /var/lib/system-tuning/{backups,configs,logs}
|
||||||
|
mkdir -p /tmp/tmpfs-cache
|
||||||
|
|
||||||
|
echo "✅ Installation complete!"
|
||||||
|
echo ""
|
||||||
|
echo "Available commands:"
|
||||||
|
echo " tune-system - Main tuning tool"
|
||||||
|
echo " system-analyzer - System analysis"
|
||||||
|
echo " system-monitor - Performance monitoring"
|
||||||
|
echo ""
|
||||||
|
echo "Quick start:"
|
||||||
|
echo " sudo system-analyzer # Analyze your system"
|
||||||
|
echo " sudo tune-system --auto # Apply optimizations"
|
||||||
|
echo " system-monitor live # Monitor performance"
|
||||||
|
echo ""
|
||||||
|
echo "For more information, see: $INSTALL_DIR/README.md"
|
||||||
178
modules/hardware-detection.sh
Executable file
178
modules/hardware-detection.sh
Executable file
@@ -0,0 +1,178 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Hardware Detection Module
|
||||||
|
# Part of Linux System Tuning Suite
|
||||||
|
|
||||||
|
detect_hardware() {
|
||||||
|
local output_file="${1:-/dev/stdout}"
|
||||||
|
|
||||||
|
# Detect RAM
|
||||||
|
local ram_total_gb=$(free -g | awk '/^Mem:/{print $2}')
|
||||||
|
local ram_total_mb=$(free -m | awk '/^Mem:/{print $2}')
|
||||||
|
local ram_available_gb=$(free -g | awk '/^Mem:/{print $7}')
|
||||||
|
|
||||||
|
# Detect CPU
|
||||||
|
local cpu_cores=$(nproc)
|
||||||
|
local cpu_threads=$(lscpu | grep "^CPU(s):" | awk '{print $2}')
|
||||||
|
local cpu_model=$(lscpu | grep "Model name:" | sed 's/Model name:[[:space:]]*//')
|
||||||
|
local cpu_arch=$(uname -m)
|
||||||
|
local cpu_freq=$(lscpu | grep "CPU MHz:" | awk '{print $3}' | head -1)
|
||||||
|
|
||||||
|
# Detect storage
|
||||||
|
local ssd_count=0
|
||||||
|
local hdd_count=0
|
||||||
|
local nvme_count=0
|
||||||
|
|
||||||
|
while IFS= read -r line; do
|
||||||
|
if [[ "$line" =~ nvme ]]; then
|
||||||
|
((nvme_count++))
|
||||||
|
elif [[ "$line" =~ "0$" ]]; then
|
||||||
|
((ssd_count++))
|
||||||
|
elif [[ "$line" =~ "1$" ]]; then
|
||||||
|
((hdd_count++))
|
||||||
|
fi
|
||||||
|
done < <(lsblk -d -o name,rota 2>/dev/null | tail -n +2)
|
||||||
|
|
||||||
|
# Detect GPU
|
||||||
|
local gpu_info=""
|
||||||
|
if command -v lspci >/dev/null 2>&1; then
|
||||||
|
gpu_info=$(lspci | grep -i "vga\|3d\|display" | head -1)
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Generate hardware profile
|
||||||
|
cat > "$output_file" << EOF
|
||||||
|
{
|
||||||
|
"ram": {
|
||||||
|
"total_gb": $ram_total_gb,
|
||||||
|
"total_mb": $ram_total_mb,
|
||||||
|
"available_gb": $ram_available_gb,
|
||||||
|
"classification": "$(classify_ram_size $ram_total_gb)"
|
||||||
|
},
|
||||||
|
"cpu": {
|
||||||
|
"cores": $cpu_cores,
|
||||||
|
"threads": $cpu_threads,
|
||||||
|
"model": "$cpu_model",
|
||||||
|
"architecture": "$cpu_arch",
|
||||||
|
"frequency_mhz": ${cpu_freq:-0},
|
||||||
|
"classification": "$(classify_cpu_performance $cpu_cores)"
|
||||||
|
},
|
||||||
|
"storage": {
|
||||||
|
"nvme_drives": $nvme_count,
|
||||||
|
"ssd_drives": $ssd_count,
|
||||||
|
"hdd_drives": $hdd_count,
|
||||||
|
"primary_type": "$(determine_primary_storage_type $nvme_count $ssd_count $hdd_count)"
|
||||||
|
},
|
||||||
|
"gpu": "$gpu_info",
|
||||||
|
"optimization_profile": "$(determine_optimization_profile $ram_total_gb $cpu_cores $nvme_count $ssd_count)"
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
classify_ram_size() {
|
||||||
|
local ram_gb=$1
|
||||||
|
|
||||||
|
if [[ $ram_gb -ge 32 ]]; then
|
||||||
|
echo "very_high"
|
||||||
|
elif [[ $ram_gb -ge 16 ]]; then
|
||||||
|
echo "high"
|
||||||
|
elif [[ $ram_gb -ge 8 ]]; then
|
||||||
|
echo "medium"
|
||||||
|
elif [[ $ram_gb -ge 4 ]]; then
|
||||||
|
echo "low"
|
||||||
|
else
|
||||||
|
echo "very_low"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
classify_cpu_performance() {
|
||||||
|
local cores=$1
|
||||||
|
|
||||||
|
if [[ $cores -ge 16 ]]; then
|
||||||
|
echo "very_high"
|
||||||
|
elif [[ $cores -ge 8 ]]; then
|
||||||
|
echo "high"
|
||||||
|
elif [[ $cores -ge 4 ]]; then
|
||||||
|
echo "medium"
|
||||||
|
elif [[ $cores -ge 2 ]]; then
|
||||||
|
echo "low"
|
||||||
|
else
|
||||||
|
echo "very_low"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
determine_primary_storage_type() {
|
||||||
|
local nvme=$1
|
||||||
|
local ssd=$2
|
||||||
|
local hdd=$3
|
||||||
|
|
||||||
|
if [[ $nvme -gt 0 ]]; then
|
||||||
|
echo "nvme"
|
||||||
|
elif [[ $ssd -gt 0 ]]; then
|
||||||
|
echo "ssd"
|
||||||
|
elif [[ $hdd -gt 0 ]]; then
|
||||||
|
echo "hdd"
|
||||||
|
else
|
||||||
|
echo "unknown"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
determine_optimization_profile() {
|
||||||
|
local ram_gb=$1
|
||||||
|
local cores=$2
|
||||||
|
local nvme=$3
|
||||||
|
local ssd=$4
|
||||||
|
|
||||||
|
# High-end system
|
||||||
|
if [[ $ram_gb -ge 16 && $cores -ge 8 && ($nvme -gt 0 || $ssd -gt 0) ]]; then
|
||||||
|
echo "aggressive"
|
||||||
|
# Mid-range system
|
||||||
|
elif [[ $ram_gb -ge 8 && $cores -ge 4 ]]; then
|
||||||
|
echo "moderate"
|
||||||
|
# Low-end system
|
||||||
|
elif [[ $ram_gb -ge 4 ]]; then
|
||||||
|
echo "conservative"
|
||||||
|
# Very low-end system
|
||||||
|
else
|
||||||
|
echo "minimal"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to get recommended zram size based on RAM
|
||||||
|
get_recommended_zram_size() {
|
||||||
|
local ram_gb=$(free -g | awk '/^Mem:/{print $2}')
|
||||||
|
|
||||||
|
if [[ $ram_gb -ge 32 ]]; then
|
||||||
|
echo "16G"
|
||||||
|
elif [[ $ram_gb -ge 16 ]]; then
|
||||||
|
echo "12G"
|
||||||
|
elif [[ $ram_gb -ge 8 ]]; then
|
||||||
|
echo "6G"
|
||||||
|
elif [[ $ram_gb -ge 4 ]]; then
|
||||||
|
echo "4G"
|
||||||
|
else
|
||||||
|
echo "2G"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Function to get recommended tmpfs sizes
|
||||||
|
get_recommended_tmpfs_sizes() {
|
||||||
|
local ram_gb=$(free -g | awk '/^Mem:/{print $2}')
|
||||||
|
local profile="$1"
|
||||||
|
|
||||||
|
case "$profile" in
|
||||||
|
"aggressive")
|
||||||
|
echo "browser:4G,ide:2G,packages:3G,thumbnails:512M"
|
||||||
|
;;
|
||||||
|
"moderate")
|
||||||
|
echo "browser:2G,ide:1G,packages:2G,thumbnails:256M"
|
||||||
|
;;
|
||||||
|
"conservative")
|
||||||
|
echo "browser:1G,ide:512M,packages:1G,thumbnails:128M"
|
||||||
|
;;
|
||||||
|
"minimal")
|
||||||
|
echo "browser:512M,packages:512M"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "browser:1G,packages:1G"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
286
modules/usage-analysis.sh
Executable file
286
modules/usage-analysis.sh
Executable file
@@ -0,0 +1,286 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Usage Analysis Module
|
||||||
|
# Analyzes file access patterns and cache usage
|
||||||
|
|
||||||
|
analyze_usage_patterns() {
|
||||||
|
local output_file="${1:-/dev/stdout}"
|
||||||
|
local analysis_duration="${2:-300}" # 5 minutes default
|
||||||
|
|
||||||
|
log "Analyzing file access patterns (duration: ${analysis_duration}s)..."
|
||||||
|
|
||||||
|
# Create temporary files for analysis
|
||||||
|
local temp_dir="/tmp/usage-analysis-$$"
|
||||||
|
mkdir -p "$temp_dir"
|
||||||
|
|
||||||
|
# Start monitoring file access
|
||||||
|
start_file_access_monitoring "$temp_dir" "$analysis_duration" &
|
||||||
|
local monitor_pid=$!
|
||||||
|
|
||||||
|
# Analyze current cache usage
|
||||||
|
analyze_current_cache_usage "$temp_dir"
|
||||||
|
|
||||||
|
# Analyze browser usage
|
||||||
|
analyze_browser_usage "$temp_dir"
|
||||||
|
|
||||||
|
# Analyze development tools usage
|
||||||
|
analyze_development_usage "$temp_dir"
|
||||||
|
|
||||||
|
# Wait for file access monitoring to complete
|
||||||
|
wait $monitor_pid 2>/dev/null || true
|
||||||
|
|
||||||
|
# Compile results
|
||||||
|
compile_usage_analysis "$temp_dir" "$output_file"
|
||||||
|
|
||||||
|
# Cleanup
|
||||||
|
rm -rf "$temp_dir"
|
||||||
|
}
|
||||||
|
|
||||||
|
start_file_access_monitoring() {
|
||||||
|
local temp_dir="$1"
|
||||||
|
local duration="$2"
|
||||||
|
|
||||||
|
# Monitor file access using inotifywait if available
|
||||||
|
if command -v inotifywait >/dev/null 2>&1; then
|
||||||
|
timeout "$duration" inotifywait -m -r /home --format '%w%f %e' \
|
||||||
|
-e access,modify,create,delete \
|
||||||
|
2>/dev/null > "$temp_dir/file_access.log" || true
|
||||||
|
else
|
||||||
|
# Fallback: use find to detect recently accessed files
|
||||||
|
find /home -type f -atime -1 2>/dev/null > "$temp_dir/recent_files.log" || true
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
analyze_current_cache_usage() {
|
||||||
|
local temp_dir="$1"
|
||||||
|
|
||||||
|
{
|
||||||
|
echo "=== CURRENT CACHE ANALYSIS ==="
|
||||||
|
|
||||||
|
# Browser caches
|
||||||
|
echo "Browser cache sizes:"
|
||||||
|
find /home -type d \( -name "*cache*" -o -name "*Cache*" \) \
|
||||||
|
-path "*/.mozilla/*" -o -path "*/.config/google-chrome/*" \
|
||||||
|
-o -path "*/.config/chromium/*" -o -path "*/.cache/mozilla/*" \
|
||||||
|
2>/dev/null | while read -r dir; do
|
||||||
|
if [[ -d "$dir" ]]; then
|
||||||
|
size=$(du -sh "$dir" 2>/dev/null | cut -f1)
|
||||||
|
echo " $dir: $size"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "System caches:"
|
||||||
|
|
||||||
|
# Package manager caches
|
||||||
|
[[ -d /var/cache/apt ]] && echo " APT cache: $(du -sh /var/cache/apt 2>/dev/null | cut -f1)"
|
||||||
|
[[ -d /var/cache/pacman ]] && echo " Pacman cache: $(du -sh /var/cache/pacman 2>/dev/null | cut -f1)"
|
||||||
|
[[ -d /var/cache/yum ]] && echo " YUM cache: $(du -sh /var/cache/yum 2>/dev/null | cut -f1)"
|
||||||
|
|
||||||
|
# User application caches
|
||||||
|
find /home -maxdepth 3 -type d -name ".cache" 2>/dev/null | while read -r cache_dir; do
|
||||||
|
if [[ -d "$cache_dir" ]]; then
|
||||||
|
size=$(du -sh "$cache_dir" 2>/dev/null | cut -f1)
|
||||||
|
echo " User cache ($cache_dir): $size"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
} > "$temp_dir/cache_analysis.txt"
|
||||||
|
}
|
||||||
|
|
||||||
|
analyze_browser_usage() {
|
||||||
|
local temp_dir="$1"
|
||||||
|
|
||||||
|
{
|
||||||
|
echo "=== BROWSER USAGE ANALYSIS ==="
|
||||||
|
|
||||||
|
# Firefox profiles
|
||||||
|
find /home -path "*/.mozilla/firefox/*/prefs.js" 2>/dev/null | while read -r prefs_file; do
|
||||||
|
profile_dir=$(dirname "$prefs_file")
|
||||||
|
profile_name=$(basename "$profile_dir")
|
||||||
|
size=$(du -sh "$profile_dir" 2>/dev/null | cut -f1)
|
||||||
|
last_used=$(stat -c %Y "$prefs_file" 2>/dev/null || echo "0")
|
||||||
|
last_used_human=$(date -d "@$last_used" 2>/dev/null || echo "unknown")
|
||||||
|
|
||||||
|
echo "Firefox profile: $profile_name"
|
||||||
|
echo " Size: $size"
|
||||||
|
echo " Last used: $last_used_human"
|
||||||
|
echo " Path: $profile_dir"
|
||||||
|
echo ""
|
||||||
|
done
|
||||||
|
|
||||||
|
# Chrome/Chromium profiles
|
||||||
|
find /home -path "*/.config/google-chrome/*/Preferences" -o \
|
||||||
|
-path "*/.config/chromium/*/Preferences" 2>/dev/null | while read -r prefs_file; do
|
||||||
|
profile_dir=$(dirname "$prefs_file")
|
||||||
|
browser_type=$(echo "$profile_dir" | grep -o -E "(google-chrome|chromium)")
|
||||||
|
profile_name=$(basename "$profile_dir")
|
||||||
|
size=$(du -sh "$profile_dir" 2>/dev/null | cut -f1)
|
||||||
|
last_used=$(stat -c %Y "$prefs_file" 2>/dev/null || echo "0")
|
||||||
|
last_used_human=$(date -d "@$last_used" 2>/dev/null || echo "unknown")
|
||||||
|
|
||||||
|
echo "$browser_type profile: $profile_name"
|
||||||
|
echo " Size: $size"
|
||||||
|
echo " Last used: $last_used_human"
|
||||||
|
echo " Path: $profile_dir"
|
||||||
|
echo ""
|
||||||
|
done
|
||||||
|
|
||||||
|
} > "$temp_dir/browser_analysis.txt"
|
||||||
|
}
|
||||||
|
|
||||||
|
analyze_development_usage() {
|
||||||
|
local temp_dir="$1"
|
||||||
|
|
||||||
|
{
|
||||||
|
echo "=== DEVELOPMENT TOOLS ANALYSIS ==="
|
||||||
|
|
||||||
|
# VS Code
|
||||||
|
find /home -path "*/.vscode/extensions" -o \
|
||||||
|
-path "*/.config/Code/CachedData" 2>/dev/null | while read -r vscode_dir; do
|
||||||
|
size=$(du -sh "$vscode_dir" 2>/dev/null | cut -f1)
|
||||||
|
echo "VS Code data: $size ($vscode_dir)"
|
||||||
|
done
|
||||||
|
|
||||||
|
# Node.js caches
|
||||||
|
find /home -name "node_modules" -type d 2>/dev/null | head -10 | while read -r node_dir; do
|
||||||
|
size=$(du -sh "$node_dir" 2>/dev/null | cut -f1)
|
||||||
|
echo "Node modules: $size ($node_dir)"
|
||||||
|
done
|
||||||
|
|
||||||
|
# Python caches
|
||||||
|
find /home -name "__pycache__" -type d 2>/dev/null | wc -l | xargs echo "Python cache directories:"
|
||||||
|
|
||||||
|
# Docker (if accessible)
|
||||||
|
if [[ -d /var/lib/docker ]] && command -v docker >/dev/null 2>&1; then
|
||||||
|
docker_size=$(du -sh /var/lib/docker 2>/dev/null | cut -f1 || echo "unknown")
|
||||||
|
echo "Docker data: $docker_size"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Git repositories
|
||||||
|
find /home -name ".git" -type d 2>/dev/null | wc -l | xargs echo "Git repositories found:"
|
||||||
|
|
||||||
|
} > "$temp_dir/development_analysis.txt"
|
||||||
|
}
|
||||||
|
|
||||||
|
compile_usage_analysis() {
|
||||||
|
local temp_dir="$1"
|
||||||
|
local output_file="$2"
|
||||||
|
|
||||||
|
# Calculate recommendations based on analysis
|
||||||
|
local total_browser_cache=0
|
||||||
|
local total_dev_cache=0
|
||||||
|
local total_system_cache=0
|
||||||
|
|
||||||
|
# Parse cache sizes and convert to MB for calculations
|
||||||
|
if [[ -f "$temp_dir/cache_analysis.txt" ]]; then
|
||||||
|
total_browser_cache=$(grep -E "(firefox|chrome|chromium)" "$temp_dir/cache_analysis.txt" | \
|
||||||
|
grep -oE "[0-9.]+[KMG]" | sed 's/G/*1024/g;s/M/*1/g;s/K\/1024/g' | bc -l 2>/dev/null | \
|
||||||
|
awk '{sum+=$1} END {print int(sum)}' || echo "0")
|
||||||
|
fi
|
||||||
|
|
||||||
|
cat > "$output_file" << EOF
|
||||||
|
{
|
||||||
|
"analysis_timestamp": "$(date -Iseconds)",
|
||||||
|
"cache_usage": {
|
||||||
|
"browser_cache_mb": $total_browser_cache,
|
||||||
|
"development_cache_mb": $total_dev_cache,
|
||||||
|
"system_cache_mb": $total_system_cache
|
||||||
|
},
|
||||||
|
"recommendations": {
|
||||||
|
"browser_tmpfs_size": "$(recommend_browser_tmpfs_size $total_browser_cache)",
|
||||||
|
"development_tmpfs_size": "$(recommend_dev_tmpfs_size $total_dev_cache)",
|
||||||
|
"priority_directories": $(generate_priority_directories "$temp_dir")
|
||||||
|
},
|
||||||
|
"frequent_paths": $(analyze_frequent_paths "$temp_dir"),
|
||||||
|
"optimization_score": $(calculate_optimization_potential "$temp_dir")
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
recommend_browser_tmpfs_size() {
|
||||||
|
local current_mb=$1
|
||||||
|
|
||||||
|
if [[ $current_mb -gt 2048 ]]; then
|
||||||
|
echo "4G"
|
||||||
|
elif [[ $current_mb -gt 1024 ]]; then
|
||||||
|
echo "2G"
|
||||||
|
elif [[ $current_mb -gt 512 ]]; then
|
||||||
|
echo "1G"
|
||||||
|
else
|
||||||
|
echo "512M"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
recommend_dev_tmpfs_size() {
|
||||||
|
local current_mb=$1
|
||||||
|
|
||||||
|
if [[ $current_mb -gt 1024 ]]; then
|
||||||
|
echo "2G"
|
||||||
|
elif [[ $current_mb -gt 512 ]]; then
|
||||||
|
echo "1G"
|
||||||
|
else
|
||||||
|
echo "512M"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
generate_priority_directories() {
|
||||||
|
local temp_dir="$1"
|
||||||
|
|
||||||
|
# Generate JSON array of priority directories for tmpfs
|
||||||
|
cat << 'EOF'
|
||||||
|
[
|
||||||
|
{"path": "/var/cache/apt", "type": "package_cache", "priority": "high"},
|
||||||
|
{"path": "~/.cache", "type": "user_cache", "priority": "medium"},
|
||||||
|
{"path": "~/.mozilla/firefox/*/storage", "type": "browser_storage", "priority": "high"},
|
||||||
|
{"path": "~/.config/google-chrome/*/storage", "type": "browser_storage", "priority": "high"},
|
||||||
|
{"path": "~/.vscode/extensions", "type": "ide_extensions", "priority": "medium"}
|
||||||
|
]
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
analyze_frequent_paths() {
|
||||||
|
local temp_dir="$1"
|
||||||
|
|
||||||
|
if [[ -f "$temp_dir/file_access.log" ]]; then
|
||||||
|
# Parse inotify log to find most accessed paths
|
||||||
|
awk '{print $1}' "$temp_dir/file_access.log" | \
|
||||||
|
sort | uniq -c | sort -nr | head -10 | \
|
||||||
|
jq -R -s 'split("\n") | map(select(length > 0)) | map(split(" ") | {count: .[0], path: .[1]})'
|
||||||
|
else
|
||||||
|
echo "[]"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
calculate_optimization_potential() {
|
||||||
|
local temp_dir="$1"
|
||||||
|
local score=0
|
||||||
|
|
||||||
|
# Base score calculation
|
||||||
|
local ram_gb=$(free -g | awk '/^Mem:/{print $2}')
|
||||||
|
|
||||||
|
# More RAM = higher potential
|
||||||
|
if [[ $ram_gb -gt 16 ]]; then
|
||||||
|
score=$((score + 40))
|
||||||
|
elif [[ $ram_gb -gt 8 ]]; then
|
||||||
|
score=$((score + 30))
|
||||||
|
else
|
||||||
|
score=$((score + 20))
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check for existing optimizations
|
||||||
|
if mount | grep -q "tmpfs.*cache"; then
|
||||||
|
score=$((score + 10))
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -e /dev/zram0 ]]; then
|
||||||
|
score=$((score + 15))
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check for large caches that could benefit from tmpfs
|
||||||
|
if [[ -f "$temp_dir/cache_analysis.txt" ]]; then
|
||||||
|
local large_caches=$(grep -c "[0-9][0-9][0-9]M\|[0-9]G" "$temp_dir/cache_analysis.txt" 2>/dev/null || echo "0")
|
||||||
|
score=$((score + large_caches * 5))
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo $score
|
||||||
|
}
|
||||||
426
monitor.sh
Executable file
426
monitor.sh
Executable file
@@ -0,0 +1,426 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# System Monitoring and Health Check
|
||||||
|
# Part of Linux System Tuning Suite
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
LOG_DIR="/var/log/system-tuning"
|
||||||
|
METRICS_FILE="$LOG_DIR/metrics.log"
|
||||||
|
|
||||||
|
# Colors
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
NC='\033[0m'
|
||||||
|
|
||||||
|
log() {
|
||||||
|
echo -e "${BLUE}[$(date '+%H:%M:%S')]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
warn() {
|
||||||
|
echo -e "${YELLOW}[WARNING]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
error() {
|
||||||
|
echo -e "${RED}[ERROR]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
success() {
|
||||||
|
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
show_usage() {
|
||||||
|
cat << EOF
|
||||||
|
System Monitoring Tool
|
||||||
|
|
||||||
|
Usage: $0 [OPTIONS] [MODE]
|
||||||
|
|
||||||
|
OPTIONS:
|
||||||
|
-h, --help Show this help message
|
||||||
|
-l, --log Log metrics to file
|
||||||
|
-d, --duration SEC Monitoring duration in seconds (default: continuous)
|
||||||
|
|
||||||
|
MODES:
|
||||||
|
status Show current status (default)
|
||||||
|
live Live monitoring with updates
|
||||||
|
benchmark Run performance benchmarks
|
||||||
|
health Health check of optimizations
|
||||||
|
compare Compare performance before/after
|
||||||
|
export Export metrics for external analysis
|
||||||
|
|
||||||
|
EXAMPLES:
|
||||||
|
$0 # Show current status
|
||||||
|
$0 live # Live monitoring
|
||||||
|
$0 health # Health check
|
||||||
|
$0 benchmark # Run benchmarks
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
setup_logging() {
|
||||||
|
if [[ ! -d "$LOG_DIR" ]]; then
|
||||||
|
sudo mkdir -p "$LOG_DIR"
|
||||||
|
sudo chown $USER:$USER "$LOG_DIR" 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
collect_metrics() {
|
||||||
|
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
|
||||||
|
|
||||||
|
# Memory metrics
|
||||||
|
local mem_info=$(free -m | awk '/^Mem:/{printf "total:%s,used:%s,free:%s,available:%s", $2,$3,$4,$7}')
|
||||||
|
local swap_info=$(free -m | awk '/^Swap:/{printf "total:%s,used:%s,free:%s", $2,$3,$4}')
|
||||||
|
|
||||||
|
# zram metrics
|
||||||
|
local zram_info=""
|
||||||
|
if [[ -e /dev/zram0 ]]; then
|
||||||
|
local zram_size=$(cat /sys/block/zram0/disksize 2>/dev/null || echo "0")
|
||||||
|
local zram_used=$(cat /sys/block/zram0/compr_data_size 2>/dev/null || echo "0")
|
||||||
|
local zram_orig=$(cat /sys/block/zram0/orig_data_size 2>/dev/null || echo "0")
|
||||||
|
zram_info="size:$zram_size,used:$zram_used,orig:$zram_orig"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# tmpfs metrics
|
||||||
|
local tmpfs_count=$(mount -t tmpfs | wc -l)
|
||||||
|
local tmpfs_total=$(df -t tmpfs --total | tail -1 | awk '{print $2}' 2>/dev/null || echo "0")
|
||||||
|
local tmpfs_used=$(df -t tmpfs --total | tail -1 | awk '{print $3}' 2>/dev/null || echo "0")
|
||||||
|
|
||||||
|
# System load
|
||||||
|
local load_avg=$(uptime | awk -F'load average:' '{print $2}' | sed 's/^ *//')
|
||||||
|
|
||||||
|
# I/O stats
|
||||||
|
local io_stats=""
|
||||||
|
if command -v iostat >/dev/null 2>&1; then
|
||||||
|
io_stats=$(iostat -d 1 2 | tail -n +4 | awk 'NR>1{tps+=$2; read+=$3; write+=$4} END{printf "tps:%.2f,read:%.2f,write:%.2f", tps, read, write}')
|
||||||
|
fi
|
||||||
|
|
||||||
|
cat << EOF
|
||||||
|
{
|
||||||
|
"timestamp": "$timestamp",
|
||||||
|
"memory": {$mem_info},
|
||||||
|
"swap": {$swap_info},
|
||||||
|
"zram": {$zram_info},
|
||||||
|
"tmpfs": {"count": $tmpfs_count, "total_kb": $tmpfs_total, "used_kb": $tmpfs_used},
|
||||||
|
"load": "$load_avg",
|
||||||
|
"io": {$io_stats}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
show_status() {
|
||||||
|
echo "🚀 System Tuning Status"
|
||||||
|
echo "======================="
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Memory overview
|
||||||
|
echo "💾 Memory Overview:"
|
||||||
|
free -h | while IFS= read -r line; do
|
||||||
|
echo " $line"
|
||||||
|
done
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# zram status
|
||||||
|
echo "🔄 Compression (zram):"
|
||||||
|
if [[ -e /dev/zram0 ]]; then
|
||||||
|
if command -v zramctl >/dev/null 2>&1; then
|
||||||
|
zramctl | while IFS= read -r line; do
|
||||||
|
echo " $line"
|
||||||
|
done
|
||||||
|
else
|
||||||
|
local zram_size=$(cat /sys/block/zram0/disksize 2>/dev/null)
|
||||||
|
local zram_used=$(cat /sys/block/zram0/compr_data_size 2>/dev/null)
|
||||||
|
echo " Size: $((zram_size / 1024 / 1024 / 1024))GB"
|
||||||
|
echo " Used: $((zram_used / 1024 / 1024))MB"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo " Not configured"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# tmpfs overview
|
||||||
|
echo "📁 tmpfs Filesystems:"
|
||||||
|
df -h -t tmpfs | while IFS= read -r line; do
|
||||||
|
echo " $line"
|
||||||
|
done
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Kernel parameters
|
||||||
|
echo "⚙️ Key Kernel Parameters:"
|
||||||
|
echo " Swappiness: $(cat /proc/sys/vm/swappiness)"
|
||||||
|
echo " Dirty ratio: $(cat /proc/sys/vm/dirty_ratio)"
|
||||||
|
echo " Dirty background ratio: $(cat /proc/sys/vm/dirty_background_ratio)"
|
||||||
|
echo " VFS cache pressure: $(cat /proc/sys/vm/vfs_cache_pressure)"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Service status
|
||||||
|
echo "🔧 Services:"
|
||||||
|
if systemctl is-enabled system-tuning.service >/dev/null 2>&1; then
|
||||||
|
echo " System tuning service: ✅ ENABLED"
|
||||||
|
else
|
||||||
|
echo " System tuning service: ❌ DISABLED"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Performance score
|
||||||
|
echo ""
|
||||||
|
echo "📊 Performance Score: $(calculate_performance_score)/100"
|
||||||
|
}
|
||||||
|
|
||||||
|
live_monitoring() {
|
||||||
|
local duration=${1:-0}
|
||||||
|
local count=0
|
||||||
|
|
||||||
|
echo "📊 Live System Monitoring"
|
||||||
|
echo "========================"
|
||||||
|
echo "Press Ctrl+C to stop"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
while true; do
|
||||||
|
clear
|
||||||
|
echo "🔄 Live Monitor - $(date) (Update #$((++count)))"
|
||||||
|
echo "=================================================="
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Real-time metrics
|
||||||
|
echo "Memory Usage:"
|
||||||
|
free -h | head -2
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo "Top tmpfs by usage:"
|
||||||
|
df -h -t tmpfs | sort -k5 -nr | head -5 | while IFS= read -r line; do
|
||||||
|
echo " $line"
|
||||||
|
done
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo "zram compression ratio:"
|
||||||
|
if [[ -e /dev/zram0 ]]; then
|
||||||
|
local orig=$(cat /sys/block/zram0/orig_data_size 2>/dev/null || echo "0")
|
||||||
|
local compr=$(cat /sys/block/zram0/compr_data_size 2>/dev/null || echo "0")
|
||||||
|
if [[ $orig -gt 0 && $compr -gt 0 ]]; then
|
||||||
|
local ratio=$(echo "scale=2; $orig / $compr" | bc -l 2>/dev/null || echo "N/A")
|
||||||
|
echo " Compression: ${ratio}:1"
|
||||||
|
echo " Original: $((orig / 1024 / 1024))MB"
|
||||||
|
echo " Compressed: $((compr / 1024 / 1024))MB"
|
||||||
|
else
|
||||||
|
echo " No compression data available"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo " zram not active"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo "System Load: $(uptime | awk -F'load average:' '{print $2}')"
|
||||||
|
|
||||||
|
# Log metrics if enabled
|
||||||
|
if [[ -f "$METRICS_FILE" ]]; then
|
||||||
|
collect_metrics >> "$METRICS_FILE"
|
||||||
|
fi
|
||||||
|
|
||||||
|
sleep 2
|
||||||
|
|
||||||
|
# Exit if duration specified and reached
|
||||||
|
if [[ $duration -gt 0 && $count -ge $duration ]]; then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
run_benchmark() {
|
||||||
|
echo "🏁 Performance Benchmark"
|
||||||
|
echo "========================"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
log "Running memory performance tests..."
|
||||||
|
|
||||||
|
# Memory speed test
|
||||||
|
echo "Memory Performance:"
|
||||||
|
if command -v dd >/dev/null 2>&1; then
|
||||||
|
echo " Write test (1GB to tmpfs):"
|
||||||
|
time (dd if=/dev/zero of=/tmp/benchmark-test bs=1M count=1024 2>/dev/null && sync)
|
||||||
|
rm -f /tmp/benchmark-test
|
||||||
|
echo ""
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Application startup test
|
||||||
|
echo "Application Startup Test:"
|
||||||
|
if command -v time >/dev/null 2>&1; then
|
||||||
|
echo " Shell startup:"
|
||||||
|
time bash -c "exit" 2>&1 | grep real || echo " Could not measure"
|
||||||
|
|
||||||
|
if command -v python3 >/dev/null 2>&1; then
|
||||||
|
echo " Python startup:"
|
||||||
|
time python3 -c "pass" 2>&1 | grep real || echo " Could not measure"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# I/O performance
|
||||||
|
if command -v iostat >/dev/null 2>&1; then
|
||||||
|
echo "Current I/O performance:"
|
||||||
|
iostat -x 1 1 | tail -n +4
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
success "Benchmark completed"
|
||||||
|
}
|
||||||
|
|
||||||
|
health_check() {
|
||||||
|
echo "🏥 System Health Check"
|
||||||
|
echo "====================="
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
local issues=0
|
||||||
|
local warnings=0
|
||||||
|
|
||||||
|
# Check zram
|
||||||
|
if [[ -e /dev/zram0 ]]; then
|
||||||
|
if swapon --show | grep -q zram0; then
|
||||||
|
success "zram swap is active"
|
||||||
|
else
|
||||||
|
error "zram device exists but swap is not active"
|
||||||
|
((issues++))
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
warn "zram not configured"
|
||||||
|
((warnings++))
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check tmpfs mounts
|
||||||
|
local tmpfs_count=$(mount -t tmpfs | wc -l)
|
||||||
|
if [[ $tmpfs_count -gt 5 ]]; then
|
||||||
|
success "Multiple tmpfs mounts detected ($tmpfs_count)"
|
||||||
|
else
|
||||||
|
warn "Few tmpfs mounts detected ($tmpfs_count) - consider more optimizations"
|
||||||
|
((warnings++))
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check memory usage
|
||||||
|
local mem_usage=$(free | awk '/^Mem:/{printf "%.0f", $3/$2*100}')
|
||||||
|
if [[ $mem_usage -lt 80 ]]; then
|
||||||
|
success "Memory usage is healthy ($mem_usage%)"
|
||||||
|
else
|
||||||
|
warn "High memory usage ($mem_usage%) - monitor for performance impact"
|
||||||
|
((warnings++))
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check swap usage
|
||||||
|
local swap_usage=$(free | awk '/^Swap:/{if($2>0) printf "%.0f", $3/$2*100; else print "0"}')
|
||||||
|
if [[ $swap_usage -lt 50 ]]; then
|
||||||
|
success "Swap usage is reasonable ($swap_usage%)"
|
||||||
|
else
|
||||||
|
warn "High swap usage ($swap_usage%) - consider adding more RAM"
|
||||||
|
((warnings++))
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check service status
|
||||||
|
if systemctl is-active system-tuning.service >/dev/null 2>&1; then
|
||||||
|
success "System tuning service is running"
|
||||||
|
else
|
||||||
|
warn "System tuning service is not running"
|
||||||
|
((warnings++))
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "Health Summary:"
|
||||||
|
echo " Issues: $issues"
|
||||||
|
echo " Warnings: $warnings"
|
||||||
|
|
||||||
|
if [[ $issues -eq 0 && $warnings -eq 0 ]]; then
|
||||||
|
success "System is optimally configured! 🎉"
|
||||||
|
elif [[ $issues -eq 0 ]]; then
|
||||||
|
warn "System is mostly optimized with $warnings minor warnings"
|
||||||
|
else
|
||||||
|
error "System has $issues issues that need attention"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
calculate_performance_score() {
|
||||||
|
local score=0
|
||||||
|
|
||||||
|
# Base score
|
||||||
|
score=30
|
||||||
|
|
||||||
|
# zram bonus
|
||||||
|
[[ -e /dev/zram0 ]] && score=$((score + 20))
|
||||||
|
|
||||||
|
# tmpfs bonus
|
||||||
|
local tmpfs_count=$(mount -t tmpfs | wc -l)
|
||||||
|
if [[ $tmpfs_count -gt 8 ]]; then
|
||||||
|
score=$((score + 25))
|
||||||
|
elif [[ $tmpfs_count -gt 5 ]]; then
|
||||||
|
score=$((score + 15))
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Kernel parameter optimization
|
||||||
|
local swappiness=$(cat /proc/sys/vm/swappiness)
|
||||||
|
[[ $swappiness -le 10 ]] && score=$((score + 10))
|
||||||
|
|
||||||
|
# Service bonus
|
||||||
|
systemctl is-enabled system-tuning.service >/dev/null 2>&1 && score=$((score + 15))
|
||||||
|
|
||||||
|
echo $score
|
||||||
|
}
|
||||||
|
|
||||||
|
main() {
|
||||||
|
local mode="status"
|
||||||
|
local log_metrics=false
|
||||||
|
local duration=0
|
||||||
|
|
||||||
|
# Parse arguments
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
|
case $1 in
|
||||||
|
-h|--help)
|
||||||
|
show_usage
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
-l|--log)
|
||||||
|
log_metrics=true
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-d|--duration)
|
||||||
|
duration="$2"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
status|live|benchmark|health|compare|export)
|
||||||
|
mode="$1"
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
error "Unknown option: $1"
|
||||||
|
show_usage
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
# Setup logging if requested
|
||||||
|
if [[ "$log_metrics" == "true" ]]; then
|
||||||
|
setup_logging
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Execute requested mode
|
||||||
|
case "$mode" in
|
||||||
|
status)
|
||||||
|
show_status
|
||||||
|
;;
|
||||||
|
live)
|
||||||
|
live_monitoring "$duration"
|
||||||
|
;;
|
||||||
|
benchmark)
|
||||||
|
run_benchmark
|
||||||
|
;;
|
||||||
|
health)
|
||||||
|
health_check
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
error "Mode '$mode' not implemented yet"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
# Run if called directly
|
||||||
|
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
|
||||||
|
main "$@"
|
||||||
|
fi
|
||||||
81
profiles/desktop.json
Normal file
81
profiles/desktop.json
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
{
|
||||||
|
"_comment": "Desktop/Workstation Optimization Profile - Optimized for general desktop use with focus on responsiveness",
|
||||||
|
"profile_name": "desktop",
|
||||||
|
"description": "General desktop optimization for workstations",
|
||||||
|
"target_systems": [
|
||||||
|
"Desktop computers",
|
||||||
|
"Workstations",
|
||||||
|
"General purpose laptops"
|
||||||
|
],
|
||||||
|
"requirements": {
|
||||||
|
"min_ram_gb": 4,
|
||||||
|
"recommended_ram_gb": 8
|
||||||
|
},
|
||||||
|
"optimizations": {
|
||||||
|
"zram": {
|
||||||
|
"enabled": true,
|
||||||
|
"size_formula": "min(ram_gb * 0.75, 12)G",
|
||||||
|
"compression_algorithm": "lz4"
|
||||||
|
},
|
||||||
|
"tmpfs": {
|
||||||
|
"browser_cache": {
|
||||||
|
"enabled": true,
|
||||||
|
"size": "auto",
|
||||||
|
"paths": [
|
||||||
|
"/tmp/tmpfs-cache/browser"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"ide_cache": {
|
||||||
|
"enabled": true,
|
||||||
|
"size": "1G",
|
||||||
|
"paths": [
|
||||||
|
"/tmp/tmpfs-cache/vscode",
|
||||||
|
"/tmp/tmpfs-cache/jetbrains"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"package_cache": {
|
||||||
|
"enabled": true,
|
||||||
|
"size": "2G",
|
||||||
|
"bind_mounts": [
|
||||||
|
"/var/cache/apt",
|
||||||
|
"/var/cache/pacman/pkg"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"thumbnails": {
|
||||||
|
"enabled": true,
|
||||||
|
"size": "256M",
|
||||||
|
"paths": [
|
||||||
|
"/tmp/tmpfs-cache/thumbnails"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"kernel_parameters": {
|
||||||
|
"vm.swappiness": 5,
|
||||||
|
"vm.dirty_ratio": 5,
|
||||||
|
"vm.dirty_background_ratio": 2,
|
||||||
|
"vm.vfs_cache_pressure": 50,
|
||||||
|
"vm.page-cluster": 0,
|
||||||
|
"net.core.netdev_max_backlog": 5000,
|
||||||
|
"net.core.rmem_max": 16777216,
|
||||||
|
"net.core.wmem_max": 16777216
|
||||||
|
},
|
||||||
|
"overlayfs": {
|
||||||
|
"enabled": false,
|
||||||
|
"protect_configs": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"sizing_rules": {
|
||||||
|
"browser_cache": {
|
||||||
|
"ram_4gb": "512M",
|
||||||
|
"ram_8gb": "1G",
|
||||||
|
"ram_16gb": "2G",
|
||||||
|
"ram_32gb": "4G"
|
||||||
|
},
|
||||||
|
"zram_size": {
|
||||||
|
"ram_4gb": "3G",
|
||||||
|
"ram_8gb": "6G",
|
||||||
|
"ram_16gb": "12G",
|
||||||
|
"ram_32gb": "16G"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
76
profiles/development.json
Normal file
76
profiles/development.json
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
{
|
||||||
|
"_comment": "Development Workstation Profile - Optimized for software development with large projects",
|
||||||
|
"profile_name": "development",
|
||||||
|
"description": "Development-focused optimization for IDEs and build tools",
|
||||||
|
"target_systems": [
|
||||||
|
"Development workstations",
|
||||||
|
"DevOps machines",
|
||||||
|
"CI/CD systems"
|
||||||
|
],
|
||||||
|
"requirements": {
|
||||||
|
"min_ram_gb": 8,
|
||||||
|
"recommended_ram_gb": 32
|
||||||
|
},
|
||||||
|
"optimizations": {
|
||||||
|
"zram": {
|
||||||
|
"enabled": true,
|
||||||
|
"size_formula": "min(ram_gb * 0.8, 16)G",
|
||||||
|
"compression_algorithm": "zstd"
|
||||||
|
},
|
||||||
|
"tmpfs": {
|
||||||
|
"build_cache": {
|
||||||
|
"enabled": true,
|
||||||
|
"size": "8G",
|
||||||
|
"paths": [
|
||||||
|
"/tmp/tmpfs-cache/build",
|
||||||
|
"/tmp/tmpfs-cache/ccache"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"ide_cache": {
|
||||||
|
"enabled": true,
|
||||||
|
"size": "4G",
|
||||||
|
"paths": [
|
||||||
|
"/tmp/tmpfs-cache/vscode",
|
||||||
|
"/tmp/tmpfs-cache/jetbrains",
|
||||||
|
"/tmp/tmpfs-cache/eclipse"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"package_cache": {
|
||||||
|
"enabled": true,
|
||||||
|
"size": "4G",
|
||||||
|
"bind_mounts": [
|
||||||
|
"/var/cache/apt",
|
||||||
|
"/var/cache/pacman/pkg",
|
||||||
|
"/root/.cache/pip"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"node_modules": {
|
||||||
|
"enabled": true,
|
||||||
|
"size": "6G",
|
||||||
|
"paths": ["/tmp/tmpfs-cache/node_modules"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"kernel_parameters": {
|
||||||
|
"vm.swappiness": 5,
|
||||||
|
"vm.dirty_ratio": 10,
|
||||||
|
"vm.dirty_background_ratio": 5,
|
||||||
|
"vm.vfs_cache_pressure": 50,
|
||||||
|
"fs.file-max": 2097152,
|
||||||
|
"fs.inotify.max_user_watches": 524288,
|
||||||
|
"kernel.pid_max": 32768
|
||||||
|
},
|
||||||
|
"overlayfs": {
|
||||||
|
"enabled": true,
|
||||||
|
"protect_configs": true,
|
||||||
|
"overlay_paths": [
|
||||||
|
"/home/*/workspace",
|
||||||
|
"/opt/projects"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"development_specific": {
|
||||||
|
"docker_optimization": true,
|
||||||
|
"git_optimization": true,
|
||||||
|
"compiler_cache": true
|
||||||
|
}
|
||||||
|
}
|
||||||
64
profiles/gaming.json
Normal file
64
profiles/gaming.json
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
{
|
||||||
|
"_comment": "Gaming Optimization Profile - Optimized for gaming performance with low latency",
|
||||||
|
"profile_name": "gaming",
|
||||||
|
"description": "Gaming-focused optimization for maximum performance",
|
||||||
|
"target_systems": [
|
||||||
|
"Gaming desktops",
|
||||||
|
"High-performance laptops",
|
||||||
|
"Streaming setups"
|
||||||
|
],
|
||||||
|
"requirements": {
|
||||||
|
"min_ram_gb": 8,
|
||||||
|
"recommended_ram_gb": 16
|
||||||
|
},
|
||||||
|
"optimizations": {
|
||||||
|
"zram": {
|
||||||
|
"enabled": true,
|
||||||
|
"size_formula": "min(ram_gb * 0.5, 8)G",
|
||||||
|
"compression_algorithm": "lz4"
|
||||||
|
},
|
||||||
|
"tmpfs": {
|
||||||
|
"game_cache": {
|
||||||
|
"enabled": true,
|
||||||
|
"size": "4G",
|
||||||
|
"paths": [
|
||||||
|
"/tmp/tmpfs-cache/steam",
|
||||||
|
"/tmp/tmpfs-cache/games"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"browser_cache": {
|
||||||
|
"enabled": true,
|
||||||
|
"size": "1G",
|
||||||
|
"paths": ["/tmp/tmpfs-cache/browser"]
|
||||||
|
},
|
||||||
|
"shader_cache": {
|
||||||
|
"enabled": true,
|
||||||
|
"size": "2G",
|
||||||
|
"paths": ["/tmp/tmpfs-cache/shaders"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"kernel_parameters": {
|
||||||
|
"vm.swappiness": 1,
|
||||||
|
"vm.dirty_ratio": 3,
|
||||||
|
"vm.dirty_background_ratio": 1,
|
||||||
|
"vm.vfs_cache_pressure": 40,
|
||||||
|
"vm.page-cluster": 0,
|
||||||
|
"kernel.sched_autogroup_enabled": 0,
|
||||||
|
"kernel.sched_child_runs_first": 1,
|
||||||
|
"net.core.netdev_max_backlog": 10000,
|
||||||
|
"net.core.rmem_max": 33554432,
|
||||||
|
"net.core.wmem_max": 33554432
|
||||||
|
},
|
||||||
|
"overlayfs": {
|
||||||
|
"enabled": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"gaming_specific": {
|
||||||
|
"cpu_governor": "performance",
|
||||||
|
"disable_services": [
|
||||||
|
"bluetooth",
|
||||||
|
"cups"
|
||||||
|
],
|
||||||
|
"priority_adjustments": true
|
||||||
|
}
|
||||||
|
}
|
||||||
251
system-analyzer.sh
Executable file
251
system-analyzer.sh
Executable file
@@ -0,0 +1,251 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# System Analyzer - Hardware Detection and Usage Analysis
|
||||||
|
# Part of Linux System Tuning Suite
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
MODULES_DIR="$SCRIPT_DIR/modules"
|
||||||
|
ANALYSIS_DIR="/tmp/system-analysis-$(date +%Y%m%d-%H%M%S)"
|
||||||
|
|
||||||
|
# Colors for output
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
log() {
|
||||||
|
echo -e "${BLUE}[$(date '+%H:%M:%S')]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
warn() {
|
||||||
|
echo -e "${YELLOW}[WARNING]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
error() {
|
||||||
|
echo -e "${RED}[ERROR]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
success() {
|
||||||
|
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check if running as root
|
||||||
|
check_root() {
|
||||||
|
if [[ $EUID -ne 0 ]]; then
|
||||||
|
error "This script must be run as root for complete analysis"
|
||||||
|
echo "Usage: sudo $0"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Create analysis directory
|
||||||
|
setup_analysis_dir() {
|
||||||
|
mkdir -p "$ANALYSIS_DIR"
|
||||||
|
log "Analysis directory created: $ANALYSIS_DIR"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Load modules
|
||||||
|
load_modules() {
|
||||||
|
for module in "$MODULES_DIR"/*.sh; do
|
||||||
|
if [[ -f "$module" ]]; then
|
||||||
|
source "$module"
|
||||||
|
log "Loaded module: $(basename "$module")"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# Main analysis function
|
||||||
|
run_analysis() {
|
||||||
|
log "Starting comprehensive system analysis..."
|
||||||
|
|
||||||
|
echo "=== SYSTEM ANALYSIS REPORT ===" > "$ANALYSIS_DIR/report.txt"
|
||||||
|
echo "Generated: $(date)" >> "$ANALYSIS_DIR/report.txt"
|
||||||
|
echo "Hostname: $(hostname)" >> "$ANALYSIS_DIR/report.txt"
|
||||||
|
echo "" >> "$ANALYSIS_DIR/report.txt"
|
||||||
|
|
||||||
|
# Hardware detection
|
||||||
|
log "Analyzing hardware configuration..."
|
||||||
|
detect_hardware > "$ANALYSIS_DIR/hardware.json"
|
||||||
|
|
||||||
|
# Memory analysis
|
||||||
|
log "Analyzing memory usage patterns..."
|
||||||
|
analyze_memory > "$ANALYSIS_DIR/memory.json"
|
||||||
|
|
||||||
|
# Storage analysis
|
||||||
|
log "Analyzing storage configuration..."
|
||||||
|
analyze_storage > "$ANALYSIS_DIR/storage.json"
|
||||||
|
|
||||||
|
# Usage pattern analysis
|
||||||
|
log "Analyzing file access patterns (this may take a moment)..."
|
||||||
|
analyze_usage_patterns > "$ANALYSIS_DIR/usage.json"
|
||||||
|
|
||||||
|
# Current optimizations
|
||||||
|
log "Checking existing optimizations..."
|
||||||
|
check_current_optimizations > "$ANALYSIS_DIR/current.json"
|
||||||
|
|
||||||
|
# Generate recommendations
|
||||||
|
log "Generating optimization recommendations..."
|
||||||
|
generate_recommendations > "$ANALYSIS_DIR/recommendations.json"
|
||||||
|
|
||||||
|
success "Analysis complete! Results saved to: $ANALYSIS_DIR"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Display summary
|
||||||
|
show_summary() {
|
||||||
|
echo ""
|
||||||
|
echo "=== ANALYSIS SUMMARY ==="
|
||||||
|
|
||||||
|
local ram_gb=$(free -g | awk '/^Mem:/{print $2}')
|
||||||
|
local cpu_cores=$(nproc)
|
||||||
|
local disk_type=$(lsblk -d -o name,rota | awk '$2==0{print "SSD"} $2==1{print "HDD"}' | head -1)
|
||||||
|
|
||||||
|
echo "💻 Hardware Overview:"
|
||||||
|
echo " RAM: ${ram_gb}GB"
|
||||||
|
echo " CPU Cores: $cpu_cores"
|
||||||
|
echo " Primary Storage: ${disk_type:-Unknown}"
|
||||||
|
|
||||||
|
if [[ -f "$ANALYSIS_DIR/recommendations.json" ]]; then
|
||||||
|
echo ""
|
||||||
|
echo "🎯 Top Recommendations:"
|
||||||
|
jq -r '.recommendations[] | " • " + .description' "$ANALYSIS_DIR/recommendations.json" 2>/dev/null | head -5 || {
|
||||||
|
echo " Run ./tune-system.sh --analyze for detailed recommendations"
|
||||||
|
}
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "📊 Next Steps:"
|
||||||
|
echo " 1. Review full report: cat $ANALYSIS_DIR/report.txt"
|
||||||
|
echo " 2. Apply optimizations: sudo ./tune-system.sh --auto"
|
||||||
|
echo " 3. Monitor performance: ./monitor.sh"
|
||||||
|
}
|
||||||
|
|
||||||
|
main() {
|
||||||
|
check_root
|
||||||
|
setup_analysis_dir
|
||||||
|
|
||||||
|
# Load modules if they exist
|
||||||
|
if [[ -d "$MODULES_DIR" ]]; then
|
||||||
|
load_modules
|
||||||
|
else
|
||||||
|
warn "Modules directory not found. Using built-in functions."
|
||||||
|
fi
|
||||||
|
|
||||||
|
run_analysis
|
||||||
|
show_summary
|
||||||
|
}
|
||||||
|
|
||||||
|
# Built-in analysis functions (if modules not available)
|
||||||
|
detect_hardware() {
|
||||||
|
cat << EOF
|
||||||
|
{
|
||||||
|
"ram": {
|
||||||
|
"total_gb": $(free -g | awk '/^Mem:/{print $2}'),
|
||||||
|
"total_bytes": $(free -b | awk '/^Mem:/{print $2}'),
|
||||||
|
"available_gb": $(free -g | awk '/^Mem:/{print $7}'),
|
||||||
|
"used_percent": $(free | awk '/^Mem:/{printf "%.1f", $3/$2*100}')
|
||||||
|
},
|
||||||
|
"cpu": {
|
||||||
|
"cores": $(nproc),
|
||||||
|
"model": "$(lscpu | grep 'Model name:' | sed 's/Model name:[[:space:]]*//' | tr -d '\n')",
|
||||||
|
"architecture": "$(uname -m)"
|
||||||
|
},
|
||||||
|
"storage": $(lsblk -J -o NAME,SIZE,TYPE,MOUNTPOINT,ROTA 2>/dev/null || echo '{"blockdevices":[]}')
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
analyze_memory() {
|
||||||
|
cat << EOF
|
||||||
|
{
|
||||||
|
"current_usage": $(free -j 2>/dev/null || free | awk '/^Mem:/{printf "{\"total\":%s,\"used\":%s,\"free\":%s,\"available\":%s}", $2, $3, $4, $7}'),
|
||||||
|
"swap": $(free | awk '/^Swap:/{printf "{\"total\":%s,\"used\":%s,\"free\":%s}", $2, $3, $4}'),
|
||||||
|
"tmpfs_mounts": $(df -t tmpfs --output=target,size,used,avail | tail -n +2 | jq -R -s 'split("\n") | map(select(length > 0)) | map(split(" ") | {target: .[0], size: .[1], used: .[2], available: .[3]})')
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
analyze_storage() {
|
||||||
|
cat << EOF
|
||||||
|
{
|
||||||
|
"filesystems": $(df -h --output=source,fstype,size,used,avail,pcent,target | tail -n +2 | jq -R -s 'split("\n") | map(select(length > 0)) | map(split(" ") | select(length >= 7) | {device: .[0], type: .[1], size: .[2], used: .[3], available: .[4], percent: .[5], mount: .[6]})'),
|
||||||
|
"block_devices": $(lsblk -J 2>/dev/null || echo '{"blockdevices":[]}')
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
analyze_usage_patterns() {
|
||||||
|
# Analyze frequently accessed directories/files
|
||||||
|
cat << EOF
|
||||||
|
{
|
||||||
|
"large_cache_dirs": [
|
||||||
|
$(find /home -name ".cache" -type d 2>/dev/null | while read dir; do
|
||||||
|
size=$(du -sh "$dir" 2>/dev/null | cut -f1 || echo "0")
|
||||||
|
echo " {\"path\": \"$dir\", \"size\": \"$size\"},"
|
||||||
|
done | sed '$s/,$//')
|
||||||
|
],
|
||||||
|
"browser_profiles": [
|
||||||
|
$(find /home -path "*/.mozilla/firefox/*/storage" -o -path "*/.config/google-chrome/*/storage*" -o -path "*/.config/chromium/*/storage*" 2>/dev/null | while read dir; do
|
||||||
|
size=$(du -sh "$(dirname "$dir")" 2>/dev/null | cut -f1 || echo "0")
|
||||||
|
echo " {\"path\": \"$(dirname "$dir")\", \"type\": \"browser\", \"size\": \"$size\"},"
|
||||||
|
done | sed '$s/,$//')
|
||||||
|
]
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
check_current_optimizations() {
|
||||||
|
cat << EOF
|
||||||
|
{
|
||||||
|
"zram": $(zramctl -J 2>/dev/null || echo '[]'),
|
||||||
|
"tmpfs_count": $(mount -t tmpfs | wc -l),
|
||||||
|
"kernel_params": {
|
||||||
|
"swappiness": $(cat /proc/sys/vm/swappiness),
|
||||||
|
"dirty_ratio": $(cat /proc/sys/vm/dirty_ratio),
|
||||||
|
"dirty_background_ratio": $(cat /proc/sys/vm/dirty_background_ratio),
|
||||||
|
"vfs_cache_pressure": $(cat /proc/sys/vm/vfs_cache_pressure)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
generate_recommendations() {
|
||||||
|
local ram_gb=$(free -g | awk '/^Mem:/{print $2}')
|
||||||
|
local has_zram=$(zramctl 2>/dev/null | grep -q zram && echo "true" || echo "false")
|
||||||
|
|
||||||
|
cat << EOF
|
||||||
|
{
|
||||||
|
"recommendations": [
|
||||||
|
{
|
||||||
|
"priority": "high",
|
||||||
|
"category": "memory",
|
||||||
|
"description": "Configure zram compression (current: $has_zram)",
|
||||||
|
"command": "./tune-system.sh --enable-zram"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"priority": "high",
|
||||||
|
"category": "tmpfs",
|
||||||
|
"description": "Set up tmpfs for browser cache",
|
||||||
|
"command": "./tune-system.sh --enable-tmpfs-cache"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"priority": "medium",
|
||||||
|
"category": "kernel",
|
||||||
|
"description": "Optimize kernel parameters for desktop",
|
||||||
|
"command": "./tune-system.sh --tune-kernel"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"system_score": {
|
||||||
|
"current": 65,
|
||||||
|
"potential": 85,
|
||||||
|
"improvement": "+20 points"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
# Run if called directly
|
||||||
|
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
|
||||||
|
main "$@"
|
||||||
|
fi
|
||||||
511
tune-system.sh
Executable file
511
tune-system.sh
Executable file
@@ -0,0 +1,511 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Linux System Tuning Suite - Main Orchestrator
|
||||||
|
# Intelligent system optimization based on hardware and usage analysis
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
MODULES_DIR="$SCRIPT_DIR/modules"
|
||||||
|
PROFILES_DIR="$SCRIPT_DIR/profiles"
|
||||||
|
CONFIG_DIR="$SCRIPT_DIR/configs"
|
||||||
|
BACKUP_DIR="/var/lib/system-tuning/backups"
|
||||||
|
|
||||||
|
# Colors
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
NC='\033[0m'
|
||||||
|
|
||||||
|
# Global variables
|
||||||
|
DRY_RUN=false
|
||||||
|
VERBOSE=false
|
||||||
|
AUTO_MODE=false
|
||||||
|
PROFILE=""
|
||||||
|
FORCE=false
|
||||||
|
|
||||||
|
log() {
|
||||||
|
echo -e "${BLUE}[$(date '+%H:%M:%S')]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
warn() {
|
||||||
|
echo -e "${YELLOW}[WARNING]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
error() {
|
||||||
|
echo -e "${RED}[ERROR]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
success() {
|
||||||
|
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
show_usage() {
|
||||||
|
cat << EOF
|
||||||
|
Linux System Tuning Suite
|
||||||
|
|
||||||
|
Usage: $0 [OPTIONS] [ACTIONS]
|
||||||
|
|
||||||
|
OPTIONS:
|
||||||
|
-h, --help Show this help message
|
||||||
|
-v, --verbose Enable verbose output
|
||||||
|
-n, --dry-run Show what would be done without making changes
|
||||||
|
-f, --force Force operations without confirmation
|
||||||
|
-p, --profile NAME Use specific optimization profile
|
||||||
|
|
||||||
|
ACTIONS:
|
||||||
|
--analyze Run system analysis only
|
||||||
|
--auto Automatic optimization based on system analysis
|
||||||
|
--enable-zram Configure zram compression
|
||||||
|
--enable-tmpfs Set up tmpfs optimizations
|
||||||
|
--tune-kernel Optimize kernel parameters
|
||||||
|
--create-service Install systemd service for persistent optimizations
|
||||||
|
--benchmark Run performance benchmarks
|
||||||
|
--rollback Restore previous configuration
|
||||||
|
--status Show current optimization status
|
||||||
|
|
||||||
|
PROFILES:
|
||||||
|
desktop Desktop/workstation optimization (default)
|
||||||
|
server Server optimization
|
||||||
|
gaming Gaming-focused optimization
|
||||||
|
development Development workstation optimization
|
||||||
|
minimal Minimal safe optimizations
|
||||||
|
|
||||||
|
EXAMPLES:
|
||||||
|
$0 --analyze # Analyze system only
|
||||||
|
$0 --auto # Automatic optimization
|
||||||
|
$0 --profile gaming --auto # Gaming-optimized setup
|
||||||
|
$0 --dry-run --auto # Show what would be done
|
||||||
|
$0 --enable-zram --enable-tmpfs # Specific optimizations
|
||||||
|
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
check_root() {
|
||||||
|
if [[ $EUID -ne 0 ]]; then
|
||||||
|
error "This script must be run as root"
|
||||||
|
echo "Usage: sudo $0 [options]"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
setup_directories() {
|
||||||
|
mkdir -p "$BACKUP_DIR"
|
||||||
|
mkdir -p /var/lib/system-tuning/configs
|
||||||
|
mkdir -p /var/lib/system-tuning/logs
|
||||||
|
}
|
||||||
|
|
||||||
|
load_modules() {
|
||||||
|
for module in "$MODULES_DIR"/*.sh; do
|
||||||
|
if [[ -f "$module" ]]; then
|
||||||
|
source "$module"
|
||||||
|
[[ "$VERBOSE" == "true" ]] && log "Loaded module: $(basename "$module")"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
create_backup() {
|
||||||
|
local backup_name="backup-$(date +%Y%m%d-%H%M%S)"
|
||||||
|
local backup_path="$BACKUP_DIR/$backup_name"
|
||||||
|
|
||||||
|
mkdir -p "$backup_path"
|
||||||
|
|
||||||
|
log "Creating system backup..."
|
||||||
|
|
||||||
|
# Backup important configs
|
||||||
|
[[ -f /etc/sysctl.conf ]] && cp /etc/sysctl.conf "$backup_path/"
|
||||||
|
[[ -f /etc/fstab ]] && cp /etc/fstab "$backup_path/"
|
||||||
|
|
||||||
|
# Save current state
|
||||||
|
free -h > "$backup_path/memory-before.txt"
|
||||||
|
mount > "$backup_path/mounts-before.txt"
|
||||||
|
sysctl -a > "$backup_path/sysctl-before.txt" 2>/dev/null
|
||||||
|
|
||||||
|
echo "$backup_name" > /var/lib/system-tuning/last-backup
|
||||||
|
success "Backup created: $backup_path"
|
||||||
|
}
|
||||||
|
|
||||||
|
analyze_system() {
|
||||||
|
log "Running system analysis..."
|
||||||
|
|
||||||
|
if [[ -f "$SCRIPT_DIR/system-analyzer.sh" ]]; then
|
||||||
|
bash "$SCRIPT_DIR/system-analyzer.sh"
|
||||||
|
else
|
||||||
|
error "System analyzer not found"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
auto_optimize() {
|
||||||
|
log "Starting automatic optimization..."
|
||||||
|
|
||||||
|
# Run analysis first
|
||||||
|
analyze_system
|
||||||
|
|
||||||
|
# Determine optimal configuration based on hardware
|
||||||
|
local ram_gb=$(free -g | awk '/^Mem:/{print $2}')
|
||||||
|
local cpu_cores=$(nproc)
|
||||||
|
|
||||||
|
log "Detected: ${ram_gb}GB RAM, ${cpu_cores} CPU cores"
|
||||||
|
|
||||||
|
# Apply optimizations based on available RAM
|
||||||
|
if [[ $ram_gb -ge 16 ]]; then
|
||||||
|
log "High-memory system detected (≥16GB) - applying aggressive optimizations"
|
||||||
|
enable_zram "12G"
|
||||||
|
enable_tmpfs_cache "large"
|
||||||
|
tune_kernel_params "desktop-high-memory"
|
||||||
|
elif [[ $ram_gb -ge 8 ]]; then
|
||||||
|
log "Medium-memory system detected (8-15GB) - applying moderate optimizations"
|
||||||
|
enable_zram "6G"
|
||||||
|
enable_tmpfs_cache "medium"
|
||||||
|
tune_kernel_params "desktop"
|
||||||
|
elif [[ $ram_gb -ge 4 ]]; then
|
||||||
|
log "Low-memory system detected (4-7GB) - applying conservative optimizations"
|
||||||
|
enable_zram "4G"
|
||||||
|
enable_tmpfs_cache "small"
|
||||||
|
tune_kernel_params "desktop-low-memory"
|
||||||
|
else
|
||||||
|
warn "Very low memory system (<4GB) - applying minimal optimizations only"
|
||||||
|
enable_zram "2G"
|
||||||
|
tune_kernel_params "minimal"
|
||||||
|
fi
|
||||||
|
|
||||||
|
create_systemd_service
|
||||||
|
success "Automatic optimization complete!"
|
||||||
|
}
|
||||||
|
|
||||||
|
enable_zram() {
|
||||||
|
local size=${1:-"8G"}
|
||||||
|
log "Configuring zram with size: $size"
|
||||||
|
|
||||||
|
if [[ "$DRY_RUN" == "true" ]]; then
|
||||||
|
echo "[DRY RUN] Would configure zram with size $size"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check if zram module exists
|
||||||
|
if ! modinfo zram >/dev/null 2>&1; then
|
||||||
|
error "zram module not available"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Configure zram
|
||||||
|
if [[ -e /dev/zram0 ]]; then
|
||||||
|
swapoff /dev/zram0 2>/dev/null || true
|
||||||
|
echo 1 > /sys/class/zram-control/hot_remove 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
|
||||||
|
modprobe zram num_devices=1
|
||||||
|
echo "$size" > /sys/block/zram0/disksize
|
||||||
|
mkswap /dev/zram0
|
||||||
|
swapon /dev/zram0
|
||||||
|
|
||||||
|
success "zram configured with $size"
|
||||||
|
}
|
||||||
|
|
||||||
|
enable_tmpfs_cache() {
|
||||||
|
local profile=${1:-"medium"}
|
||||||
|
log "Setting up tmpfs cache optimization (profile: $profile)"
|
||||||
|
|
||||||
|
if [[ "$DRY_RUN" == "true" ]]; then
|
||||||
|
echo "[DRY RUN] Would set up tmpfs cache with profile: $profile"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Create tmpfs directories
|
||||||
|
mkdir -p /tmp/tmpfs-cache/{browser,ide,packages,thumbnails}
|
||||||
|
|
||||||
|
case "$profile" in
|
||||||
|
"large")
|
||||||
|
mount -t tmpfs -o size=4G tmpfs /tmp/tmpfs-cache/browser
|
||||||
|
mount -t tmpfs -o size=2G tmpfs /tmp/tmpfs-cache/ide
|
||||||
|
mount -t tmpfs -o size=3G tmpfs /tmp/tmpfs-cache/packages
|
||||||
|
mount -t tmpfs -o size=512M tmpfs /tmp/tmpfs-cache/thumbnails
|
||||||
|
;;
|
||||||
|
"medium")
|
||||||
|
mount -t tmpfs -o size=2G tmpfs /tmp/tmpfs-cache/browser
|
||||||
|
mount -t tmpfs -o size=1G tmpfs /tmp/tmpfs-cache/ide
|
||||||
|
mount -t tmpfs -o size=2G tmpfs /tmp/tmpfs-cache/packages
|
||||||
|
mount -t tmpfs -o size=256M tmpfs /tmp/tmpfs-cache/thumbnails
|
||||||
|
;;
|
||||||
|
"small")
|
||||||
|
mount -t tmpfs -o size=1G tmpfs /tmp/tmpfs-cache/browser
|
||||||
|
mount -t tmpfs -o size=512M tmpfs /tmp/tmpfs-cache/ide
|
||||||
|
mount -t tmpfs -o size=1G tmpfs /tmp/tmpfs-cache/packages
|
||||||
|
mount -t tmpfs -o size=128M tmpfs /tmp/tmpfs-cache/thumbnails
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Bind mount package cache
|
||||||
|
if [[ -d /var/cache/apt ]]; then
|
||||||
|
mount --bind /tmp/tmpfs-cache/packages /var/cache/apt
|
||||||
|
fi
|
||||||
|
|
||||||
|
success "tmpfs cache optimization enabled"
|
||||||
|
}
|
||||||
|
|
||||||
|
tune_kernel_params() {
|
||||||
|
local profile=${1:-"desktop"}
|
||||||
|
log "Tuning kernel parameters (profile: $profile)"
|
||||||
|
|
||||||
|
if [[ "$DRY_RUN" == "true" ]]; then
|
||||||
|
echo "[DRY RUN] Would tune kernel parameters with profile: $profile"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
local sysctl_conf="/etc/sysctl.d/99-system-tuning.conf"
|
||||||
|
|
||||||
|
cat > "$sysctl_conf" << EOF
|
||||||
|
# System Tuning - Generated $(date)
|
||||||
|
# Profile: $profile
|
||||||
|
|
||||||
|
EOF
|
||||||
|
|
||||||
|
case "$profile" in
|
||||||
|
"desktop-high-memory")
|
||||||
|
cat >> "$sysctl_conf" << EOF
|
||||||
|
# High-memory desktop optimization
|
||||||
|
vm.swappiness = 1
|
||||||
|
vm.dirty_ratio = 3
|
||||||
|
vm.dirty_background_ratio = 1
|
||||||
|
vm.vfs_cache_pressure = 40
|
||||||
|
vm.page-cluster = 0
|
||||||
|
EOF
|
||||||
|
;;
|
||||||
|
"desktop")
|
||||||
|
cat >> "$sysctl_conf" << EOF
|
||||||
|
# Desktop optimization
|
||||||
|
vm.swappiness = 5
|
||||||
|
vm.dirty_ratio = 5
|
||||||
|
vm.dirty_background_ratio = 2
|
||||||
|
vm.vfs_cache_pressure = 50
|
||||||
|
vm.page-cluster = 0
|
||||||
|
EOF
|
||||||
|
;;
|
||||||
|
"desktop-low-memory")
|
||||||
|
cat >> "$sysctl_conf" << EOF
|
||||||
|
# Low-memory desktop optimization
|
||||||
|
vm.swappiness = 10
|
||||||
|
vm.dirty_ratio = 10
|
||||||
|
vm.dirty_background_ratio = 5
|
||||||
|
vm.vfs_cache_pressure = 100
|
||||||
|
EOF
|
||||||
|
;;
|
||||||
|
"minimal")
|
||||||
|
cat >> "$sysctl_conf" << EOF
|
||||||
|
# Minimal safe optimization
|
||||||
|
vm.swappiness = 10
|
||||||
|
vm.dirty_ratio = 10
|
||||||
|
vm.dirty_background_ratio = 5
|
||||||
|
EOF
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Apply immediately
|
||||||
|
sysctl -p "$sysctl_conf"
|
||||||
|
success "Kernel parameters tuned"
|
||||||
|
}
|
||||||
|
|
||||||
|
create_systemd_service() {
|
||||||
|
log "Creating systemd service for persistent optimizations"
|
||||||
|
|
||||||
|
if [[ "$DRY_RUN" == "true" ]]; then
|
||||||
|
echo "[DRY RUN] Would create systemd service"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Create startup script
|
||||||
|
cat > /usr/local/bin/system-tuning-startup.sh << 'EOF'
|
||||||
|
#!/bin/bash
|
||||||
|
# System Tuning Startup Script
|
||||||
|
# Auto-generated by Linux System Tuning Suite
|
||||||
|
|
||||||
|
log() {
|
||||||
|
echo "[$(date '+%H:%M:%S')] $1" | systemd-cat -t system-tuning
|
||||||
|
}
|
||||||
|
|
||||||
|
log "Starting system optimizations..."
|
||||||
|
|
||||||
|
# Recreate tmpfs mounts
|
||||||
|
if [[ -d /tmp/tmpfs-cache ]]; then
|
||||||
|
for cache_dir in /tmp/tmpfs-cache/*; do
|
||||||
|
if [[ -d "$cache_dir" ]] && ! mountpoint -q "$cache_dir"; then
|
||||||
|
size=$(df -h "$cache_dir" 2>/dev/null | awk 'NR==2{print $2}' || echo "1G")
|
||||||
|
mount -t tmpfs -o size="$size" tmpfs "$cache_dir"
|
||||||
|
log "Mounted tmpfs: $cache_dir ($size)"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Ensure zram is configured
|
||||||
|
if [[ ! -e /dev/zram0 ]]; then
|
||||||
|
modprobe zram num_devices=1 2>/dev/null || true
|
||||||
|
if [[ -e /sys/block/zram0/disksize ]]; then
|
||||||
|
echo "8G" > /sys/block/zram0/disksize
|
||||||
|
mkswap /dev/zram0
|
||||||
|
swapon /dev/zram0
|
||||||
|
log "Configured zram swap"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
log "System optimizations applied"
|
||||||
|
EOF
|
||||||
|
|
||||||
|
chmod +x /usr/local/bin/system-tuning-startup.sh
|
||||||
|
|
||||||
|
# Create systemd service
|
||||||
|
cat > /etc/systemd/system/system-tuning.service << EOF
|
||||||
|
[Unit]
|
||||||
|
Description=System Performance Tuning
|
||||||
|
After=multi-user.target
|
||||||
|
Wants=multi-user.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
ExecStart=/usr/local/bin/system-tuning-startup.sh
|
||||||
|
RemainAfterExit=yes
|
||||||
|
StandardOutput=journal
|
||||||
|
StandardError=journal
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
|
||||||
|
systemctl daemon-reload
|
||||||
|
systemctl enable system-tuning.service
|
||||||
|
|
||||||
|
success "Systemd service created and enabled"
|
||||||
|
}
|
||||||
|
|
||||||
|
show_status() {
|
||||||
|
echo "=== SYSTEM TUNING STATUS ==="
|
||||||
|
echo
|
||||||
|
|
||||||
|
echo "💾 Memory:"
|
||||||
|
free -h
|
||||||
|
echo
|
||||||
|
|
||||||
|
echo "🔄 Swap/zram:"
|
||||||
|
if command -v zramctl >/dev/null 2>&1; then
|
||||||
|
zramctl 2>/dev/null || echo "No zram devices"
|
||||||
|
else
|
||||||
|
echo "zramctl not available"
|
||||||
|
fi
|
||||||
|
echo
|
||||||
|
|
||||||
|
echo "📁 tmpfs mounts:"
|
||||||
|
df -h | grep tmpfs | head -10
|
||||||
|
echo
|
||||||
|
|
||||||
|
echo "⚙️ Key kernel parameters:"
|
||||||
|
echo " Swappiness: $(cat /proc/sys/vm/swappiness)"
|
||||||
|
echo " Dirty ratio: $(cat /proc/sys/vm/dirty_ratio)"
|
||||||
|
echo " VFS cache pressure: $(cat /proc/sys/vm/vfs_cache_pressure)"
|
||||||
|
echo
|
||||||
|
|
||||||
|
echo "🔧 Service status:"
|
||||||
|
if systemctl is-enabled system-tuning.service >/dev/null 2>&1; then
|
||||||
|
echo " System tuning service: ENABLED"
|
||||||
|
else
|
||||||
|
echo " System tuning service: DISABLED"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
parse_args() {
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
|
case $1 in
|
||||||
|
-h|--help)
|
||||||
|
show_usage
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
-v|--verbose)
|
||||||
|
VERBOSE=true
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-n|--dry-run)
|
||||||
|
DRY_RUN=true
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-f|--force)
|
||||||
|
FORCE=true
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-p|--profile)
|
||||||
|
PROFILE="$2"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
--analyze)
|
||||||
|
analyze_system
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
--auto)
|
||||||
|
AUTO_MODE=true
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
--enable-zram)
|
||||||
|
enable_zram
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
--enable-tmpfs)
|
||||||
|
enable_tmpfs_cache
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
--tune-kernel)
|
||||||
|
tune_kernel_params
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
--create-service)
|
||||||
|
create_systemd_service
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
--status)
|
||||||
|
show_status
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
error "Unknown option: $1"
|
||||||
|
show_usage
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
main() {
|
||||||
|
echo "🚀 Linux System Tuning Suite"
|
||||||
|
echo "=============================="
|
||||||
|
|
||||||
|
check_root
|
||||||
|
setup_directories
|
||||||
|
|
||||||
|
# Load modules if available
|
||||||
|
if [[ -d "$MODULES_DIR" ]]; then
|
||||||
|
load_modules
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Parse arguments
|
||||||
|
parse_args "$@"
|
||||||
|
|
||||||
|
# If no specific action, show usage
|
||||||
|
if [[ "$AUTO_MODE" != "true" ]] && [[ $# -eq 0 ]]; then
|
||||||
|
show_usage
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Create backup before making changes
|
||||||
|
if [[ "$DRY_RUN" != "true" ]]; then
|
||||||
|
create_backup
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Execute auto mode if requested
|
||||||
|
if [[ "$AUTO_MODE" == "true" ]]; then
|
||||||
|
auto_optimize
|
||||||
|
fi
|
||||||
|
|
||||||
|
success "Operation completed successfully!"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Run main function if script is executed directly
|
||||||
|
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
|
||||||
|
main "$@"
|
||||||
|
fi
|
||||||
Reference in New Issue
Block a user