Основные источники проблем в Linux и инструменты диагностики
Прежде чем говорить о решениях проблем, важно понимать, где искать их причины. Linux-система оставляет множество «следов», которые помогают в диагностике:
Системные логи – основа диагностики
Логи в Linux – это первое, куда следует заглянуть при возникновении проблем. Основные источники информации:
- /var/log/syslog или /var/log/messages – общесистемный журнал событий
- /var/log/auth.log – записи аутентификации и авторизации
- /var/log/kern.log – сообщения ядра
- /var/log/dmesg – сообщения драйверов и ядра при загрузке
Зная данные о местонахождении необходимого нам журнала, мы можем воспользоваться следующими командами:
# Простой мониторинг логов в реальном времени
tail -f /var/log/syslog
# Поиск ошибок в логах
grep -i error /var/log/syslog
Мониторинг ресурсов и производительности
Инструменты, позволяющие отслеживать состояние системы:
- top/htop – интерактивный мониторинг процессов и нагрузки
- iotop – мониторинг дисковых операций
- vmstat – статистика использования виртуальной памяти
- iostat – детальная информация о дисковой подсистеме
- netstat/ss – анализ сетевых соединений
# Получение информации о процессах, интенсивно использующих CPU
ps aux --sort=-%cpu | head -10
# Анализ дискового пространства
df -h
du -sh /* | sort -hr
Автоматизация устранения неполадок в Linux
Bash-скрипты – фундамент автоматизации
Bash-скрипты – это простой и эффективный способ автоматизировать рутинные задачи. Вот пример скрипта для проверки и освобождения места на диске:
#!/bin/bash
# Проверяем свободное место на диске
FREE_SPACE=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//')
# Если свободного места меньше 10%, выполняем очистку
if [ "$FREE_SPACE" -gt 90 ]; then
echo "Критически мало места на диске: $FREE_SPACE% занято"
# Очищаем кэш apt
apt-get clean
# Удаляем старые журналы
journalctl --vacuum-time=7d
# Очищаем временные файлы
find /tmp -type f -atime +7 -delete
echo "Очистка завершена"
fi
Решение распространенных проблем в Linux
Проблема 1: Высокая нагрузка на CPU/память
Симптомы: Система работает медленно, процессы зависают, высокая загрузка в top.
Решение:
Идентификация проблемного процесса:
# Сортировка по использованию CPU
ps aux --sort=-%cpu | head -10
# Сортировка по использованию памяти
ps aux --sort=-%mem | head -10
Автоматизация мониторинга нагрузки:
#!/bin/bash
# Скрипт для мониторинга и уведомления о высокой нагрузке
THRESHOLD=90
while true; do
CPU_LOAD=$(top -bn1 | grep "Cpu(s)" | awk '{print $2 + $4}')
if (( $(echo "$CPU_LOAD > $THRESHOLD" | bc -l) )); then
echo "Предупреждение: Высокая нагрузка на CPU: $CPU_LOAD%"
# Здесь может быть код для отправки уведомления
# Выводим топ-5 процессов по нагрузке
ps aux --sort=-%cpu | head -6
fi
sleep 60
done
Проблема 2: Недостаток дискового пространства
Симптомы: Ошибки «No space left on device», сбои в работе приложений.
Решение:
Идентификация проблемы:
# Проверка заполнения разделов
df -h
# Поиск крупных файлов
find / -type f -size +100M -exec ls -lh {} \; | sort -k5,5hr
Автоматизация через Ansible:
---
- name: Управление дисковым пространством
hosts: all
become: yes
tasks:
- name: Проверка свободного места
shell: df -h / | awk 'NR==2 {print $5}' | sed 's/%//'
register: disk_usage
- name: Очистка при критическом уровне
block:
- name: Очистка старых логов
shell: find /var/log -type f -name "*.gz" -mtime +30 -delete
- name: Очистка кэша apt
apt:
clean: yes
- name: Очистка старых ядер
shell: apt-get autoremove --purge -y
when: disk_usage.stdout|int > 85
Проблема 3: Проблемы с сетью
Симптомы: Недоступность сервисов, ошибки подключения, таймауты.
Решение:
Диагностика:
# Проверка сетевых интерфейсов
ip addr
# Проверка маршрутизации
ip route
# Проверка DNS
dig example.com
# Проверка портов
ss -tuln
Автоматический мониторинг и восстановление:
#!/bin/bash
# Скрипт проверки сетевых соединений
# Список важных хостов для мониторинга
HOSTS=("8.8.8.8" "1.1.1.1" "example.com")
GATEWAY=$(ip route | grep default | awk '{print $3}')
# Проверка сетевого интерфейса
IFACE=$(ip route | grep default | awk '{print $5}')
IFACE_STATUS=$(ip link show $IFACE | grep -o "UP\|DOWN")
if [ "$IFACE_STATUS" = "DOWN" ]; then
echo "Сетевой интерфейс $IFACE отключен. Перезапуск..."
ip link set $IFACE up
systemctl restart NetworkManager
fi
# Проверка подключения к хостам
for HOST in "${HOSTS[@]}"
do
ping -c 1 -W 2 $HOST &>/dev/null
if [ $? -ne 0 ]; then
echo "Нет связи с $HOST. Проверка шлюза..."
ping -c 1 -W 2 $GATEWAY &>/dev/null
if [ $? -ne 0 ]; then
echo "Нет связи со шлюзом $GATEWAY. Перезапуск сетевого сервиса..."
systemctl restart NetworkManager
break
fi
fi
done
Проблема 4: Проблемы с файловой системой
Симптомы: Ошибки ввода-вывода, сообщения о поврежденной файловой системе, ошибки монтирования.
Решение:
Проверка и восстановление файловой системы:
# Проверка состояния дисков
smartctl -a /dev/sda
# Проверка файловой системы
fsck -f /dev/sda1 # выполняется после размонтирования!
# Поиск "плохих" блоков
badblocks -v /dev/sda1
Автоматизация регулярных проверок:
#!/bin/bash
# Скрипт для планового обслуживания файловых систем
# Запись информации о SMART-атрибутах дисков
for DISK in /dev/sd?; do
smartctl -a $DISK > /var/log/smart_$(basename $DISK)_$(date +%Y%m%d).log
# Проверка на наличие ошибок SMART
ERRORS=$(smartctl -H $DISK | grep -i "overall-health" | grep -i "failed")
if [ ! -z "$ERRORS" ]; then
echo "ВНИМАНИЕ: Диск $DISK сообщает о проблемах!"
# Отправка уведомления
fi
done
# Проверка журнала на наличие ошибок ввода-вывода
IOERRORS=$(dmesg | grep -i "I/O error")
if [ ! -z "$IOERRORS" ]; then
echo "Обнаружены ошибки ввода-вывода в системном журнале!"
# Отправка уведомления
fi
Распространенные ошибки безопасности и их автоматическое устранение
Автоматизация аудита безопасности
#!/bin/bash
# Скрипт для базового аудита безопасности
# Проверка открытых портов
echo "=== Открытые порты ==="
ss -tuln | grep LISTEN
# Проверка наличия подозрительных процессов
echo "=== Процессы не от root с открытыми портами ниже 1024 ==="
for PID in $(lsof -i -P -n | grep ":[0-9]\{1,3\}" | grep -v "root" | awk '{print $2}' | sort | uniq); do
ps -p $PID -o user,pid,command
done
# Проверка наличия неавторизованных ключей SSH
echo "=== Проверка авторизованных ключей SSH ==="
find /home -name "authorized_keys" -exec ls -la {} \; -exec cat {} \;
# Проверка сетевых соединений
echo "=== Активные сетевые соединения ==="
netstat -antup | grep ESTABLISHED
# Поиск файлов SUID
echo "=== SUID файлы ==="
find / -type f -perm -4000 2>/dev/null
Автоматическое исправление проблем с правами доступа
#!/bin/bash
# Исправление типичных проблем с правами доступа
# Исправление прав для важных директорий
chmod 700 /root
chmod 755 /home
chmod 755 /etc
chmod 700 /etc/ssh
# Исправление прав для критических файлов
chmod 644 /etc/passwd
chmod 600 /etc/shadow
chmod 644 /etc/group
chmod 600 /etc/gshadow
# Исправление прав для SSH-файлов
find /etc/ssh -name "ssh_host_*_key" -exec chmod 600 {} \;
find /etc/ssh -name "ssh_host_*_key.pub" -exec chmod 644 {} \;
# Исправление прав для web-директорий
if [ -d /var/www/html ]; then
find /var/www/html -type d -exec chmod 755 {} \;
find /var/www/html -type f -exec chmod 644 {} \;
fi