Защита от «дурака»
Предположим, у Вас важные конфигурационные файлы, которые не стоит модифицировать особенно удалять. В борьбу с человеком который руководствуется только «давай поправим и посмотрим что будет», вам на помощь придет chattr.
chattr (Change Attribute) — это утилита используемая для установки/снятия специальных атрибутов файлов для предотвращения случайной модификации и удаления файлов или директорий, даже если вы авторизованы как root.
Синтаксис chattr:
Для установки атрибута мы используем оператор +, для снятия — оператор
~]#
~]#
Предположим, у Вас важные конфигурационные файлы, которые не стоит модифицировать особенно удалять. В борьбу с человеком который руководствуется только «давай поправим и посмотрим что будет», вам на помощь придет chattr.
chattr (Change Attribute) — это утилита используемая для установки/снятия специальных атрибутов файлов для предотвращения случайной модификации и удаления файлов или директорий, даже если вы авторизованы как root.
Синтаксис chattr:
chattr [operator] [flags] [filename]
Как защитить файл от удаленияДля установки атрибута мы используем оператор +, для снятия — оператор
~]#
chattr +i dir/
~]# chattr +i file.conf
Проверить установленные атрибуты:~]#
lsattr
Проверяем:
[root@ ~]# rm -rf dir/
rm: cannot remove dir/: Operation not permitted
Как защитить файлы /etc/passwd и /etc/shadow~]# chattr +i /etc/passwd
~]# chattr +i /etc/shadow
Проверяем:
~]# useradd test
useradd: cannot open /etc/passwdsystemd-logind: Failed to start user slice user-0.slice, ignoring: Connection timed out ((null))
Сообщения в
systemd-logind[10714]: Failed to start user slice user-0.slice, ignoring: Connection timed out ((null))
systemd-logind[10714]: Failed to start session scope session-13692.scope: Connection timed out
systemd[1]: Failed to propagate agent release message: Operation not supported
Данная ошибка сообщает о том что systemd-logind не может создать user-0.slice. В версии systemd 219-42.el7
~]# rpm -qa | grep systemd
присутствует баг, в следствии чего systemd не может обрабатывать большое количество сессий в ввиду полной утилизации ресурсов RAM и сбоя модуля systemd-logind.
Для решения проблемы рекомендуется произвести обновления модуля до версии systemd-219-62.el7_6.9 или более поздней.
Обновление systemd лучше совместить с установкой более новой версии ядра.
Решение:
~]# /bin/rm $(join -v 1 <(find /run/systemd/system -maxdepth 1 -type f -name "*.scope" | sort) <(find /run/systemd/system -maxdepth 1 -type d -name "*.scope.d" | sed "s/\.d\$//" | sort))
Для реклярного исполненияя, стоит добавить в crontab
~]# vi /etc/crontab
* * * * * root {приведенная выше команда}
Сообщения в
journal
crond[111309]: pam_systemd(crond:session): Failed to create session: Connection timed outsystemd-logind[10714]: Failed to start user slice user-0.slice, ignoring: Connection timed out ((null))
systemd-logind[10714]: Failed to start session scope session-13692.scope: Connection timed out
systemd[1]: Failed to propagate agent release message: Operation not supported
Данная ошибка сообщает о том что systemd-logind не может создать user-0.slice. В версии systemd 219-42.el7
~]# rpm -qa | grep systemd
присутствует баг, в следствии чего systemd не может обрабатывать большое количество сессий в ввиду полной утилизации ресурсов RAM и сбоя модуля systemd-logind.
Для решения проблемы рекомендуется произвести обновления модуля до версии systemd-219-62.el7_6.9 или более поздней.
Обновление systemd лучше совместить с установкой более новой версии ядра.
Решение:
~]# /bin/rm $(join -v 1 <(find /run/systemd/system -maxdepth 1 -type f -name "*.scope" | sort) <(find /run/systemd/system -maxdepth 1 -type d -name "*.scope.d" | sed "s/\.d\$//" | sort))
Для реклярного исполненияя, стоит добавить в crontab
~]# vi /etc/crontab
* * * * * root {приведенная выше команда}
Free Identity, Policy and Audit
FreeIPA — открытый проект для создания централизованной системы по управлению идентификацией пользователей, задания политик доступа и аудита для сетей на базе Linux и Unix. FreeIPA можно сравнить с диспетчером Identity Manager компании Novell или Active Directory от Microsoft в том, что используемые цели и механизмы похожи.
Для Вас подобраны материалы, вы можете воспользоваться им:
- Контроллер ЕПП FreeIPA в Astra Linux
- Установка FreeIPA с опцией изолированной сети
- Ошибки установки FreeIPA
FreeIPA — открытый проект для создания централизованной системы по управлению идентификацией пользователей, задания политик доступа и аудита для сетей на базе Linux и Unix. FreeIPA можно сравнить с диспетчером Identity Manager компании Novell или Active Directory от Microsoft в том, что используемые цели и механизмы похожи.
Для Вас подобраны материалы, вы можете воспользоваться им:
- Контроллер ЕПП FreeIPA в Astra Linux
- Установка FreeIPA с опцией изолированной сети
- Ошибки установки FreeIPA
Как поставить на постоянный контроль доступность хостов?
~]# cat ping.sh
#!/bin/bash
time=$(date "+%a %d.%m.%Y %H:%M:%S")
cpuUsage=$(top -bn1 | awk '/Cpu/ { print $2}')
memUsage=$(free -m | awk '/Mem/{print $3}')
cat /opt/serverlist |while read i
do
ping -c 1 -n -i 0.2 -W1 "$i" > /dev/null
if [ $? -eq 0 ]; then
echo "ok, ping up" > /dev/null
else
echo "$time $i is down. Server not avalible to ping. CPU Usage: $cpuUsage% Memory Usage: $memUsage MB" >> /var/log/checkping.log
fi
done
где, /opt/serverlist - список ip/hostname серверов
/var/log/checkping.log - События зарегиструются если хост не доступен
Для регулярной проверки достпности, необходимо добавить скрипт в crontab
* * * * *. root. /opt/ping.sh
~]# cat ping.sh
#!/bin/bash
time=$(date "+%a %d.%m.%Y %H:%M:%S")
cpuUsage=$(top -bn1 | awk '/Cpu/ { print $2}')
memUsage=$(free -m | awk '/Mem/{print $3}')
cat /opt/serverlist |while read i
do
ping -c 1 -n -i 0.2 -W1 "$i" > /dev/null
if [ $? -eq 0 ]; then
echo "ok, ping up" > /dev/null
else
echo "$time $i is down. Server not avalible to ping. CPU Usage: $cpuUsage% Memory Usage: $memUsage MB" >> /var/log/checkping.log
fi
done
где, /opt/serverlist - список ip/hostname серверов
/var/log/checkping.log - События зарегиструются если хост не доступен
Для регулярной проверки достпности, необходимо добавить скрипт в crontab
* * * * *. root. /opt/ping.sh
Как захватить сбои ядра Linux?
kdump – это продвинутый механизм сброса аварий.
Когда включен, система загружается из контекста другого ядра.Это второе ядро резервирует небольшой объем памяти, и его единственной целью является захват изображения дампа ядра в случае сбоя системы.
Пакеты к установке:
~]# yum install kexec-tools
Настройка GRUB
~]# grubby --update-kernel=ALL --args="crashkernel = auto"
Перезапустите систему, что бы изменения вступили в силу:
-]# shutdown -r
Чтобы настроить kdump, нам нужно отредактировать файл конфигурации /etc/kdump.conf.
Приведите строку
#core_collector -c -message-level 1 -d 31
к виду:
core_collector makedumpfile -c
default halt
Управление демоном:
~]# systemctl enable kdump.service
~]# systemctl start kdump.service
Проверить статус:
~]# systemctl is-active kdump
Вызовем crash kernel:
kdump – это продвинутый механизм сброса аварий.
Когда включен, система загружается из контекста другого ядра.Это второе ядро резервирует небольшой объем памяти, и его единственной целью является захват изображения дампа ядра в случае сбоя системы.
Пакеты к установке:
~]# yum install kexec-tools
Настройка GRUB
~]# grubby --update-kernel=ALL --args="crashkernel = auto"
Перезапустите систему, что бы изменения вступили в силу:
-]# shutdown -r
Чтобы настроить kdump, нам нужно отредактировать файл конфигурации /etc/kdump.conf.
Приведите строку
к виду:
core_collector makedumpfile -c
Укажите действие по умолчанию, срабатывает если dump не может сформироваться в указанном месте. Если действие не указано “reboot”, то параметр по умолчанию:default halt
Управление демоном:
~]# systemctl enable kdump.service
~]# systemctl start kdump.service
Проверить статус:
~]# systemctl is-active kdump
Вызовем crash kernel:
~]# echo 1 > /proc/sys/kernel/sysrq
~]# echo c > /proc/sysrq-trigger
По default, сбой ядра сохраниться в / var / crash /SSSD + DNSMASQ
System Security Services Daemon – это пакет приложений для управления аутентификацией и авторизацией в операционных системах.
Для исправления любых проблем с SSSD является настройка отладочный логов, которые сохраняются в /var/log/sssd. Они включаются одной простой командой:
~]# sss_debuglevel 7
Локальный DNS кэш
Аутентификация с использованием SSSD может некорректно работать или не работать вовсе, если из поля видимости хоста пропадает первый DNS сервер, указанный в /etc/resolv.conf. SSSD использует системный резолвер (resolver) для разрешения DNS имен. Любое разрешение DNS имени производится через запрос к DNS серверу. Cледует учесть, что системный резолвер опрашивает DNS сервера, указанные в /etc/resolv.conf в том порядке, в котором они там перечислены с таймаутом запроса в 5 секунд. Такие задержки в разрешении DNS имен могут оказывать крайне негативное влияние на работу SSSD.Частично проблема решается с помощью указания нескольких опций в /etc/resolv.conf:
options timeout:1 #опускает таймаут ожидания ответа от DNS сервера с 5 до 1 секунды
Это изменения позволят SSSD не уходить в оффлайн режим.
DNSMASQ - локальный кэш DNS
В конфигурации dnsmasq следует обратить внимание на параметр all-servers, который заставляет dnsmasq в случае промаха кэша отправлять DNS запросы сразу ко всем DNS серверам одновременно. При этом адреса "настоящих" DNS серверов удобно выносить из общей конфигурации в отдельный файл, расположенный рядом с системным /etc/resolv.conf.
Автообнаружение в SSSD
~]# vi /etc/sssd/sssd.conf
ad_server = dc01.example.com, dc02.example.com, _srv_
Автообнаружение в Kerberos
~]# vi /etc/krb5.conf
[realms]
EXAMPLE.COM = {
kdc = dc01.example.com
kdc = dc02.example.com
}
System Security Services Daemon – это пакет приложений для управления аутентификацией и авторизацией в операционных системах.
Для исправления любых проблем с SSSD является настройка отладочный логов, которые сохраняются в /var/log/sssd. Они включаются одной простой командой:
~]# sss_debuglevel 7
Локальный DNS кэш
Аутентификация с использованием SSSD может некорректно работать или не работать вовсе, если из поля видимости хоста пропадает первый DNS сервер, указанный в /etc/resolv.conf. SSSD использует системный резолвер (resolver) для разрешения DNS имен. Любое разрешение DNS имени производится через запрос к DNS серверу. Cледует учесть, что системный резолвер опрашивает DNS сервера, указанные в /etc/resolv.conf в том порядке, в котором они там перечислены с таймаутом запроса в 5 секунд. Такие задержки в разрешении DNS имен могут оказывать крайне негативное влияние на работу SSSD.Частично проблема решается с помощью указания нескольких опций в /etc/resolv.conf:
options timeout:1 #опускает таймаут ожидания ответа от DNS сервера с 5 до 1 секунды
Это изменения позволят SSSD не уходить в оффлайн режим.
DNSMASQ - локальный кэш DNS
В конфигурации dnsmasq следует обратить внимание на параметр all-servers, который заставляет dnsmasq в случае промаха кэша отправлять DNS запросы сразу ко всем DNS серверам одновременно. При этом адреса "настоящих" DNS серверов удобно выносить из общей конфигурации в отдельный файл, расположенный рядом с системным /etc/resolv.conf.
Автообнаружение в SSSD
~]# vi /etc/sssd/sssd.conf
ad_server = dc01.example.com, dc02.example.com, _srv_
Автообнаружение в Kerberos
~]# vi /etc/krb5.conf
[realms]
EXAMPLE.COM = {
kdc = dc01.example.com
kdc = dc02.example.com
}
Расширить корневой раздел (ext4, не LVM)
Выключаем swap (файл подкачки)
~]# swapoff -a
Начинаем удалять разделы (данные не потеряются). Смотрим разметку:
~]# fdisk /dev/sda
Command (m for help): p
/dev/sda1 - / ФС
/dev/sda2 - не размеченная область
/dev/sda5 - Файл подкачки SWAP
Для начала удалим не размеченную область /dev/sda2
Command (m for help): d
Partition number (1,2,5, default 5): 2
Partition 2 has been deleted.
Проверяем результат
Command (m for help): p
Удаляем раздел /dev/sda1 (данные не потеряются)
Command (m for help): d
Selected partition 1
Partition 1 has been deleted.
Создадим новый раздел (primary)
Command (m for help): n
p primary
e extended
Select (default p): p
…
…
Created a new partition 1 of type 'Linux' and of size XX GiB.
Таким образом мы создали новый раздел размером XX Gb
Создадим раздел (extended) под swap
Command (m for help): n
Partition type
p primary
e extended
Select (default p): e
…
…
Created a new partition 2 of type 'Extended' and of size XX MiB.
Попробуем поменять тип файловой системы
Command (m for help): t
Partition number (1,2, default 2): 2
Hex code (type L to list all codes): 82
….
Type of partition 2 is unchanged: Extended.
Сохраняем изменения
Command (m for help): w
Утилита сообщает, что изменения применятся после перезагрузки
Перезагружаем машину
~]# reboot
Запускаем утилиту cfdisk
~]# cfdisk /dev/sda
Выбираем /dev/sda1:
Bootable
Выбираем неразмеченную область:
New - > Partition size: XX M -> Type: 82
Сохраняем изменения
Write: yes - > Quit
Передаем информацию об изменении разметки операционной системе, установив утилиту parted
~]# sudo apt install parted -y
или
~]# yum install parted -y (если не установлено)
~]# partprobe
Создаем раздел под swap
~]# mkswap /dev/sda5
Включаем swap
~]# swapon /dev/sda5
Смотрим новые UUID
~]# blkid
Прописываем их в /etc/fstab, монтируем
~]# mount -a
Перезагружаем ОС
~]# reboot
Расширяем раздел /dev/sda1
~]# resize2fs /dev/sda1
Проверяем
~]# lsblk
~]# df -h
Выключаем swap (файл подкачки)
~]# swapoff -a
Начинаем удалять разделы (данные не потеряются). Смотрим разметку:
~]# fdisk /dev/sda
Command (m for help): p
/dev/sda1 - / ФС
/dev/sda2 - не размеченная область
/dev/sda5 - Файл подкачки SWAP
Для начала удалим не размеченную область /dev/sda2
Command (m for help): d
Partition number (1,2,5, default 5): 2
Partition 2 has been deleted.
Проверяем результат
Command (m for help): p
Удаляем раздел /dev/sda1 (данные не потеряются)
Command (m for help): d
Selected partition 1
Partition 1 has been deleted.
Создадим новый раздел (primary)
Command (m for help): n
p primary
e extended
Select (default p): p
…
…
Created a new partition 1 of type 'Linux' and of size XX GiB.
Таким образом мы создали новый раздел размером XX Gb
Создадим раздел (extended) под swap
Command (m for help): n
Partition type
p primary
e extended
Select (default p): e
…
…
Created a new partition 2 of type 'Extended' and of size XX MiB.
Попробуем поменять тип файловой системы
Command (m for help): t
Partition number (1,2, default 2): 2
Hex code (type L to list all codes): 82
….
Type of partition 2 is unchanged: Extended.
Сохраняем изменения
Command (m for help): w
Утилита сообщает, что изменения применятся после перезагрузки
Перезагружаем машину
~]# reboot
Запускаем утилиту cfdisk
~]# cfdisk /dev/sda
Выбираем /dev/sda1:
Bootable
Выбираем неразмеченную область:
New - > Partition size: XX M -> Type: 82
Сохраняем изменения
Write: yes - > Quit
Передаем информацию об изменении разметки операционной системе, установив утилиту parted
~]# sudo apt install parted -y
или
~]# yum install parted -y (если не установлено)
~]# partprobe
Создаем раздел под swap
~]# mkswap /dev/sda5
Включаем swap
~]# swapon /dev/sda5
Смотрим новые UUID
~]# blkid
Прописываем их в /etc/fstab, монтируем
~]# mount -a
Перезагружаем ОС
~]# reboot
Расширяем раздел /dev/sda1
~]# resize2fs /dev/sda1
Проверяем
~]# lsblk
~]# df -h
Использование tar в Linux
Не стану много говорить о возможностях tar, но вы наверняка сталкивались с необходимостью разбить архив на части.
Есть 2 варианта:
1. Создать архив -> Разбить на части
2. Создать архив разбитый на части
Касательно первого, вы можете пойти этим вариантом, но есть риск не возможности объединения частей после разбиения.
Второй вариант, как на мой взгляд, достаточно интересный. Создаем архив, разбитый на части:
~]# tar -zcvf - /path/to/dir | split -b 100M - arch.tar.gz
данная команда создаст архив каталога /path/to/dir и разобьет его на части по 100 М
В результате мы получим:
arch.tar.gzaa
arch.tar.gzab
arch.tar.gzac
Что бы собрать архив и восстановить его, достаточно выполнить:
~]# cat arch.tar.gz* | tar -zxf
Редко, но порой необходимо добывать файл в имеющийся архив
~]# tar -rf .archive.tar file
Не стану много говорить о возможностях tar, но вы наверняка сталкивались с необходимостью разбить архив на части.
Есть 2 варианта:
1. Создать архив -> Разбить на части
2. Создать архив разбитый на части
Касательно первого, вы можете пойти этим вариантом, но есть риск не возможности объединения частей после разбиения.
Второй вариант, как на мой взгляд, достаточно интересный. Создаем архив, разбитый на части:
~]# tar -zcvf - /path/to/dir | split -b 100M - arch.tar.gz
данная команда создаст архив каталога /path/to/dir и разобьет его на части по 100 М
В результате мы получим:
arch.tar.gzaa
arch.tar.gzab
arch.tar.gzac
Что бы собрать архив и восстановить его, достаточно выполнить:
~]# cat arch.tar.gz* | tar -zxf
Редко, но порой необходимо добывать файл в имеющийся архив
~]# tar -rf .archive.tar file
Что делать если установили ОС на минималках?
Решение казалось бы простое - установить требуемый пакет. Но если вам необходимо установить группу пакетов, то в Linux предусмотрена установка групп. Подробнее об этом:
Вывести доступные группы
~]# yum list group
Предположим, вам необходимо вывести список пакетов входящих в группу
~]# yum groupinfo “Server with GUI”
Данный пример отобразит список пакетов включенных в группу графической оболочки. Установим ее:
~]# yum groupinstall “Server with GUI” -y
После успешной установки, необходимо переключиться на графический интерфес, выбрав его основным:
~]# systemctl set-default graphical.target
Выполните перезапуск системы
~]# shutdown -r
Решение казалось бы простое - установить требуемый пакет. Но если вам необходимо установить группу пакетов, то в Linux предусмотрена установка групп. Подробнее об этом:
Вывести доступные группы
~]# yum list group
Предположим, вам необходимо вывести список пакетов входящих в группу
~]# yum groupinfo “Server with GUI”
Данный пример отобразит список пакетов включенных в группу графической оболочки. Установим ее:
~]# yum groupinstall “Server with GUI” -y
После успешной установки, необходимо переключиться на графический интерфес, выбрав его основным:
~]# systemctl set-default graphical.target
Выполните перезапуск системы
~]# shutdown -r
Yum не работает
Предположим, необходимо найти установленные пакеты
~]# yum list installed
File "/usr/bin/yum", line 30
except KeyboardInterrupt, e: ^
SyntaxError: invalid syntax
Диагностика сопутствующих компонентов для работы YUM:
~]# rpm -Va python
....L.... /usr/bin/python
Поскольку python2 необходим для функциональности ОС, его необходимо переустановить, чтобы решить эту проблему со ссылкой.
~]# rpm -ivh --replacefiles --replacepkgs <python-2.package version>
Проверяем:
~]# yum repolist
~]# yum list installed
Предположим, необходимо найти установленные пакеты
~]# yum list installed
File "/usr/bin/yum", line 30
except KeyboardInterrupt, e: ^
SyntaxError: invalid syntax
Диагностика сопутствующих компонентов для работы YUM:
~]# rpm -Va python
....L.... /usr/bin/python
Поскольку python2 необходим для функциональности ОС, его необходимо переустановить, чтобы решить эту проблему со ссылкой.
~]# rpm -ivh --replacefiles --replacepkgs <python-2.package version>
Проверяем:
~]# yum repolist
~]# yum list installed
Astra Linux. Scheduling while atomic
Относительно недавно, ко мне обратились с ошибкой scheduling. Что делать, как максимально быстро и оперативно решить проблему?
Scheduling while atomic - отладное сообщение, связанное с проблемами атомарности. Это означает, что schedule() был вызван, когда текущая задача была атомарной. Задача в ядре может по определению не иметь состояние сон, если она атомарная.
Система перестает отвечать на запросы или работает очень медленно. Сообщение;
kernel: BUG: scheduling while atomic: swapper/0x00010000/0
Система регистрирует следующее сообщение в /var/log/messages:
kernel: BUG: scheduling while atomic: swapper/0x00010000/0
Одним, из самых быстрых и главное правильных решений - установить минорную версию ядра, где исправлен Bag.
К примеру, если у вас установлена версия ядра:
5.4.0-54-generic, то необходимо выполнить Update ядра до минорной версии 5.4.0-110-generic
Относительно недавно, ко мне обратились с ошибкой scheduling. Что делать, как максимально быстро и оперативно решить проблему?
Scheduling while atomic - отладное сообщение, связанное с проблемами атомарности. Это означает, что schedule() был вызван, когда текущая задача была атомарной. Задача в ядре может по определению не иметь состояние сон, если она атомарная.
Система перестает отвечать на запросы или работает очень медленно. Сообщение;
kernel: BUG: scheduling while atomic: swapper/0x00010000/0
Система регистрирует следующее сообщение в /var/log/messages:
kernel: BUG: scheduling while atomic: swapper/0x00010000/0
Одним, из самых быстрых и главное правильных решений - установить минорную версию ядра, где исправлен Bag.
К примеру, если у вас установлена версия ядра:
5.4.0-54-generic, то необходимо выполнить Update ядра до минорной версии 5.4.0-110-generic
Предотвратить Запуск дублирования задания CRON
Когда вы настраиваете задание cron, иногда вам нужно убедиться, что у вас всегда будет только один запущенный экземпляр за раз.
Проверку предыдущего вызова скрипта можно реализовать с помощью другого скрипта оболочки, который обнаруживает запущенный экземпляр перед его повторным выполнением (например, с помощью pidof), альтернатива - вы можете использовать flock или run-once.
Файл блокировки - это обычный файл, который создается перед выполнением сценария и удаляется после завершения сценария.
Таким образом, если какая-либо другая команда попытается выполнить тот же сценарий, используя тот же файл блокировки, она завершиться или подождет, пока не сможет его запустить.
FLOCK: crontab
*/5 * * * * /usr/bin/flock -n /opt/ms.lockfile /opt/my_script
Использование flock для выполнения сценария, явно указывая файл блокировки для использования, и для завершения, если скрипт уже запущен с параметром -n.
RUN-ONE: crontab
*/5 * * * * run-one /opt/my_script
В некоторых дистрибутивах, также есть утилита run-one, которая обрабатывает блокировку автоматически.
Подведем итог:
Хорошей практикой является предотвращение дублирования запущенных экземпляров заданий cron
Когда вы настраиваете задание cron, иногда вам нужно убедиться, что у вас всегда будет только один запущенный экземпляр за раз.
Проверку предыдущего вызова скрипта можно реализовать с помощью другого скрипта оболочки, который обнаруживает запущенный экземпляр перед его повторным выполнением (например, с помощью pidof), альтернатива - вы можете использовать flock или run-once.
Файл блокировки - это обычный файл, который создается перед выполнением сценария и удаляется после завершения сценария.
Таким образом, если какая-либо другая команда попытается выполнить тот же сценарий, используя тот же файл блокировки, она завершиться или подождет, пока не сможет его запустить.
FLOCK: crontab
*/5 * * * * /usr/bin/flock -n /opt/ms.lockfile /opt/my_script
Использование flock для выполнения сценария, явно указывая файл блокировки для использования, и для завершения, если скрипт уже запущен с параметром -n.
RUN-ONE: crontab
*/5 * * * * run-one /opt/my_script
В некоторых дистрибутивах, также есть утилита run-one, которая обрабатывает блокировку автоматически.
Подведем итог:
Хорошей практикой является предотвращение дублирования запущенных экземпляров заданий cron
FAILLOCATE против DD для создания и использования SWAP
Разберем пример использования двух великолепных команд:
~]# fallocate -l 1G /swapfile
и
~]# dd if=/dev/zero of=/swapfile bs=1024 count=1024
Приведенные команды, отрабатывают и формируют SWAP.
Останься задать один вопрос:
Если приведенные команды великолепны и отрабатывают, так в чем же преимущество одной от другой?
mkswap позволяет задействовать одноименную утилиту, предназначенную для создания файлов или разделов подкачки.
Обратившись к man mkswap:
Обратите внимание, что файл подкачки не должен содержать никаких пропусков.
Использование cp для создания файла неприемлемо.
Также не рекомендуется использовать fallocate в файловых системах, поддерживающих XFS или ext4, или в файловых системах btrfs. В этих случаях рекомендуется использовать
dd(1) и /dev/zero.
Обратившись к man swapon:
Вы не должны использовать swapon для файла с пропусками. Это можно увидеть в системном журнале следующим образом
swapon: swapfile has holes.
Реализация файла подкачки в ядре предполагает возможность записи
в файл напрямую, без помощи файловой системы. Это проблема с предварительно распределенными файлами (например, fallocate) в файловых системах, таких как XFS или ext4, и в btrfs.
Из этого следует, что, хотя fallocate может быть быстрее, чем dd, он не подходит для создания файлов подкачки и не поддерживается инструментами, связанными с управлением им.
Разберем пример использования двух великолепных команд:
~]# fallocate -l 1G /swapfile
и
~]# dd if=/dev/zero of=/swapfile bs=1024 count=1024
Приведенные команды, отрабатывают и формируют SWAP.
Останься задать один вопрос:
Если приведенные команды великолепны и отрабатывают, так в чем же преимущество одной от другой?
mkswap позволяет задействовать одноименную утилиту, предназначенную для создания файлов или разделов подкачки.
Обратившись к man mkswap:
Обратите внимание, что файл подкачки не должен содержать никаких пропусков.
Использование cp для создания файла неприемлемо.
Также не рекомендуется использовать fallocate в файловых системах, поддерживающих XFS или ext4, или в файловых системах btrfs. В этих случаях рекомендуется использовать
dd(1) и /dev/zero.
Обратившись к man swapon:
Вы не должны использовать swapon для файла с пропусками. Это можно увидеть в системном журнале следующим образом
swapon: swapfile has holes.
Реализация файла подкачки в ядре предполагает возможность записи
в файл напрямую, без помощи файловой системы. Это проблема с предварительно распределенными файлами (например, fallocate) в файловых системах, таких как XFS или ext4, и в btrfs.
Из этого следует, что, хотя fallocate может быть быстрее, чем dd, он не подходит для создания файлов подкачки и не поддерживается инструментами, связанными с управлением им.
Расширение диска без LVM.txt
14 KB
Как расширить диск без LVM (EXT4)?
TCPDUMP. Анализ и перехват сетевого трафика.
tcpdump — отличный инструмент командной строки, который способен перехватывать и анализировать сетевой трафик.
Синтаксис:
tcpdump опции -i интерфейс фильтры
Опции tcpdump
-A: Позволяет отсортировать пакеты с форматом ASCII
-l: Добавляет функцию прокрутки
-i: После ввода нужно указать сетевой интерфейс, который будет отслеживаться. Чтобы начать отслеживать все интерфейсы, впишите после опции слово «any»
-c: Завершает процесс отслеживания после проверки указанного количества пакетов
-w: Генерирует текстовый файл с отчетом проверки
-e: Показывает уровень интернет-соединения пакета данных
-L: Выводит только те протоколы, которые поддерживает указанный сетевой интерфейс
-C: Создает другой файл во время записи пакета, если его размер больше заданного
-r: Открывает файл для чтения, который был создан с помощью опции -w
-j: Для записи пакетов будет использоваться формат TimeStamp
-J: Позволяет просмотреть все доступные форматы TimeStamp
-G: Служит для создания файла с логами. Опция требует также указания временного значения, по истечении которого будет создаваться новый лог
-v, -vv, -vvv: В зависимости от количества символов в опции, вывод команды будет становиться подробнее
-f: В выводе показывает имя домена адресов IP
-F: Позволяет считывать информацию не из сетевого интерфейса, а из указанного файла
-D: Демонстрирует все сетевые интерфейсы, которые можно использовать
-n: Деактивирует отображение доменных имен
-Z: Задает пользователя, под учетной записью которого будут созданы все файлы
-K: Пропуск анализа контрольных сумм
-q: Демонстрация краткой информации
-H: Позволяет обнаружить заголовки 802.11s
-I: Используется при захвате пакетов в режиме монитора
Фильтры
host: Служит для указания имени хоста
net: Указывает IP подсети и сети
ip: Служит для указания адреса протокола
src: Выводит пакеты, которые были отправлены с указанного адреса
dst: Выводит пакеты, которые были получены указанным адресом
arp, udp, tcp: Фильтрация по одному из протоколов
port: Отображает информацию, относящуюся к определенному порту
and, or: Служит для объединения нескольких фильтров в команде
less, greater: Вывод пакетов меньше или больше указанного размера
Пример вывода:
20:58:26.765637 IP 10.0.0.50.80 > 10.0.0.1.53181: Flags [F.], seq 1, ack 2, win 453, options [nop,nop,TS val 3822939 ecr 249100129], length 0
Описание:
• Метка времени Unix (20: 58: 26.765637)
• протокол (IP)
• имя или IP-адрес исходного хоста и номер порта (10.0.0.50.80)
• имя хоста или IP-адрес назначения и номер порта (10.0.0.1.53181)
• Флаги TCP (Flags [F.]). Указывают на состояние соединения и могут содержать более одного значения:
• o S — SYN. Первый шаг в установлении соединения
• F — FIN. Прекращение соединения
• — ACK. Пакет подтверждения принят успешно
• P — PUSH. Указывает получателю обрабатывать пакеты вместо их буферизации
• R — RST. Связь прервалась
• Порядковый номер данных в пакете. (seq 1)
• Номер подтверждения. (ack 2)
• Размер окна (win 453). Количество байтов, доступных в приемном буфере. Далее следуют параметры TCP
• Длина полезной нагрузки данных. (length 0)
tcpdump — отличный инструмент командной строки, который способен перехватывать и анализировать сетевой трафик.
Синтаксис:
tcpdump опции -i интерфейс фильтры
Опции tcpdump
-A: Позволяет отсортировать пакеты с форматом ASCII
-l: Добавляет функцию прокрутки
-i: После ввода нужно указать сетевой интерфейс, который будет отслеживаться. Чтобы начать отслеживать все интерфейсы, впишите после опции слово «any»
-c: Завершает процесс отслеживания после проверки указанного количества пакетов
-w: Генерирует текстовый файл с отчетом проверки
-e: Показывает уровень интернет-соединения пакета данных
-L: Выводит только те протоколы, которые поддерживает указанный сетевой интерфейс
-C: Создает другой файл во время записи пакета, если его размер больше заданного
-r: Открывает файл для чтения, который был создан с помощью опции -w
-j: Для записи пакетов будет использоваться формат TimeStamp
-J: Позволяет просмотреть все доступные форматы TimeStamp
-G: Служит для создания файла с логами. Опция требует также указания временного значения, по истечении которого будет создаваться новый лог
-v, -vv, -vvv: В зависимости от количества символов в опции, вывод команды будет становиться подробнее
-f: В выводе показывает имя домена адресов IP
-F: Позволяет считывать информацию не из сетевого интерфейса, а из указанного файла
-D: Демонстрирует все сетевые интерфейсы, которые можно использовать
-n: Деактивирует отображение доменных имен
-Z: Задает пользователя, под учетной записью которого будут созданы все файлы
-K: Пропуск анализа контрольных сумм
-q: Демонстрация краткой информации
-H: Позволяет обнаружить заголовки 802.11s
-I: Используется при захвате пакетов в режиме монитора
Фильтры
host: Служит для указания имени хоста
net: Указывает IP подсети и сети
ip: Служит для указания адреса протокола
src: Выводит пакеты, которые были отправлены с указанного адреса
dst: Выводит пакеты, которые были получены указанным адресом
arp, udp, tcp: Фильтрация по одному из протоколов
port: Отображает информацию, относящуюся к определенному порту
and, or: Служит для объединения нескольких фильтров в команде
less, greater: Вывод пакетов меньше или больше указанного размера
Пример вывода:
20:58:26.765637 IP 10.0.0.50.80 > 10.0.0.1.53181: Flags [F.], seq 1, ack 2, win 453, options [nop,nop,TS val 3822939 ecr 249100129], length 0
Описание:
• Метка времени Unix (20: 58: 26.765637)
• протокол (IP)
• имя или IP-адрес исходного хоста и номер порта (10.0.0.50.80)
• имя хоста или IP-адрес назначения и номер порта (10.0.0.1.53181)
• Флаги TCP (Flags [F.]). Указывают на состояние соединения и могут содержать более одного значения:
• o S — SYN. Первый шаг в установлении соединения
• F — FIN. Прекращение соединения
• — ACK. Пакет подтверждения принят успешно
• P — PUSH. Указывает получателю обрабатывать пакеты вместо их буферизации
• R — RST. Связь прервалась
• Порядковый номер данных в пакете. (seq 1)
• Номер подтверждения. (ack 2)
• Размер окна (win 453). Количество байтов, доступных в приемном буфере. Далее следуют параметры TCP
• Длина полезной нагрузки данных. (length 0)
Без парольный доступ. Работа с rsa ключами.
Для осуществления без парольного доступа, используют RSA ключи.
RSA - криптографический алгоритм с открытым ключом.
Предположим у вас есть пул машин, одна из которых, с именем - central.server, а остальные - server
На сервере central.server:
~]# hostname
central.server
~]# cat ~/.ssh/id_rsa
В случае отсутствия, выполните:
~]# ssh-keygen
(На все запросы нажмите Enter)
Помните, при генерации нового ключа с заменой предыдущего, вы не сможете воспользоваться предыдущим ключом.
На серверах, server:
~]# hostname
server
~]# mkdir ~/.ssh
~]# touch ~/.ssh/authorized_keys
~]# chmod -R 700 $HOME/.ssh
~]# chmod 644 ~/.ssh/authorized_keys
Скопировать содержимое из ~/.ssh/id_rsa с central.server в ~/.ssh/authorized_keys на пул серверов к которым вы желаете осуществить подключение.
Альтернативой копирования ключа, может выступить rsa-copy-id
..@central.server ~]# rsa-copy-id username@server
или
..@central.server ~]# cat .ssh/id_rsa.pub | ssh username@server 'cat >> ~/.ssh/authorized_keys'
Проверяем:
..@central.server ~]# ssh username@server
Для осуществления без парольного доступа, используют RSA ключи.
RSA - криптографический алгоритм с открытым ключом.
Предположим у вас есть пул машин, одна из которых, с именем - central.server, а остальные - server
На сервере central.server:
~]# hostname
central.server
~]# cat ~/.ssh/id_rsa
В случае отсутствия, выполните:
~]# ssh-keygen
(На все запросы нажмите Enter)
Помните, при генерации нового ключа с заменой предыдущего, вы не сможете воспользоваться предыдущим ключом.
На серверах, server:
~]# hostname
server
~]# mkdir ~/.ssh
~]# touch ~/.ssh/authorized_keys
~]# chmod -R 700 $HOME/.ssh
~]# chmod 644 ~/.ssh/authorized_keys
Скопировать содержимое из ~/.ssh/id_rsa с central.server в ~/.ssh/authorized_keys на пул серверов к которым вы желаете осуществить подключение.
Альтернативой копирования ключа, может выступить rsa-copy-id
..@central.server ~]# rsa-copy-id username@server
или
..@central.server ~]# cat .ssh/id_rsa.pub | ssh username@server 'cat >> ~/.ssh/authorized_keys'
Проверяем:
..@central.server ~]# ssh username@server
Окружение. Переменные.
Переменные окружения - это переменные каждого пользователя специфичные для определенной среды, в операционной системе .
Несколько примеров переменных окружения в Linux:
• USER – указывает на текущего вошедшего в систему пользователя.
• HOME – отображается домашний каталог текущего пользователя.
• SHELL – путь к оболочке текущего пользователя
• LANG – переменная указывает на текущие настройки языка / локали.
• MAIL – местоположение, в котором хранится почта текущего пользователя.
Эти переменные окружения меняются в зависимости от текущего сеанса пользователя.
Отобразить список переменных окружения:
~]# env
Вывод переменных окружения Linux:
~]# printenv VAR
или
~]# echo $VAR
Установить переменные среды окружения.
Синтаксис
export VAR_NaME=value
Пример:
~]# export LOG=/var/log
Проверить:
~]# env
~]# cd $LOG
Данные метод, является временным и сохраняется для текущего сеанса.
Постоянные переменные окружения.
bashrc - файл сценария, который выполняется всякий раз, когда пользователь входит в систему.
Чтобы сделать LOG переменную постоянной, отредактируйте файл .bashrc и определите ее в нем
~]# vi ~/.bashrc
Для вступления изменений в силу, выполните:
~]# source .bashrc
Данная переменная станет постоянной, но только для текущего пользователя.
Создание глобальных постоянных переменных
Для применения общесистемных переменных (переменных доступных всем пользователям), используется файл /etc/environment
Добавьте переменную LOG с ее значением в файл. Чтобы изменения вступили в силу, используйте команду
~]# source /etc/environment
Переменные, установленные в /etc/profile, считываются всякий раз, когда оболочка bash входит в систему. Отредактируйте:
~]# vi /etc/profile
и внесите, в содержимое:
export hi=“HI Linux Administrator”
Переменные окружения - это переменные каждого пользователя специфичные для определенной среды, в операционной системе .
Несколько примеров переменных окружения в Linux:
• USER – указывает на текущего вошедшего в систему пользователя.
• HOME – отображается домашний каталог текущего пользователя.
• SHELL – путь к оболочке текущего пользователя
• LANG – переменная указывает на текущие настройки языка / локали.
• MAIL – местоположение, в котором хранится почта текущего пользователя.
Эти переменные окружения меняются в зависимости от текущего сеанса пользователя.
Отобразить список переменных окружения:
~]# env
Вывод переменных окружения Linux:
~]# printenv VAR
или
~]# echo $VAR
Установить переменные среды окружения.
Синтаксис
export VAR_NaME=value
Пример:
~]# export LOG=/var/log
Проверить:
~]# env
~]# cd $LOG
Данные метод, является временным и сохраняется для текущего сеанса.
Постоянные переменные окружения.
bashrc - файл сценария, который выполняется всякий раз, когда пользователь входит в систему.
Чтобы сделать LOG переменную постоянной, отредактируйте файл .bashrc и определите ее в нем
~]# vi ~/.bashrc
Для вступления изменений в силу, выполните:
~]# source .bashrc
Данная переменная станет постоянной, но только для текущего пользователя.
Создание глобальных постоянных переменных
Для применения общесистемных переменных (переменных доступных всем пользователям), используется файл /etc/environment
Добавьте переменную LOG с ее значением в файл. Чтобы изменения вступили в силу, используйте команду
~]# source /etc/environment
Переменные, установленные в /etc/profile, считываются всякий раз, когда оболочка bash входит в систему. Отредактируйте:
~]# vi /etc/profile
и внесите, в содержимое:
export hi=“HI Linux Administrator”
system_info.pages
165.6 KB
Информация о системе. Как узнать быстро состояние?
Существует многочисленное количество команд для уточнения состояния системы, таких как mem, cpu, disk и иная информация. Я всегда только «ЗА» оптимизацию, получать своевременно и мгновенно информацию.
Прикрепленный файл system_info, несет в себе bash скрипт, при исполнении которого вам будет выведена информация о:
- загрузка системы
- использование дискового массива
- Использование оперативной памяти
- Количество процессов запущенных в системе
- Количество пользователей авторизованных в системе
- IP адрес
Но при чем тут автоматизация? Верно, автоматизация заключается в получении информации с применением минимальных труда затрат. Именно по этому мы сейчас допилим не большие моменты:
Измените привилегии доступа, сделайте исполняемым файл (при необходимости переименуйте файл):
~]# chown root. system_info.sh
Внесите изменения в конфигурационный файл /etc/bashrc и добавьте в конец файла, содержимое:
InfoScript=«/etc/system_info.sh";
if [[ -n $SSH_CONNECTION ]] && [ -x "$InfoScript" ]; then
/bin/bash $InfoScript; echo "";
fi;
А теперь, вы можете перезайти в систему и наслаждаться результатом информации о ней.
Существует многочисленное количество команд для уточнения состояния системы, таких как mem, cpu, disk и иная информация. Я всегда только «ЗА» оптимизацию, получать своевременно и мгновенно информацию.
Прикрепленный файл system_info, несет в себе bash скрипт, при исполнении которого вам будет выведена информация о:
- загрузка системы
- использование дискового массива
- Использование оперативной памяти
- Количество процессов запущенных в системе
- Количество пользователей авторизованных в системе
- IP адрес
Но при чем тут автоматизация? Верно, автоматизация заключается в получении информации с применением минимальных труда затрат. Именно по этому мы сейчас допилим не большие моменты:
Измените привилегии доступа, сделайте исполняемым файл (при необходимости переименуйте файл):
~]# chown root. system_info.sh
Внесите изменения в конфигурационный файл /etc/bashrc и добавьте в конец файла, содержимое:
InfoScript=«/etc/system_info.sh";
if [[ -n $SSH_CONNECTION ]] && [ -x "$InfoScript" ]; then
/bin/bash $InfoScript; echo "";
fi;
А теперь, вы можете перезайти в систему и наслаждаться результатом информации о ней.
Список пользователей.
Информация о локальных пользователях хранится в файле /etc/passwd.
~]# less /etc/passwd
Если вы хотите отображать только имя пользователя, вы можете использовать команды awk или cut для печати только первого поля, содержащего имя пользователя:
~]# awk -F: '{ print $1}' /etc/passwd
или
~]# cut -d: -f1 /etc/passwd
GETENT.
Команда getent отображает записи из баз данных, настроенных в файле /etc/nsswitch.conf, в том числе и passwd
~]# getent passwd
Если вы используете доменную аутентификацию, getent будет отображать всех пользователей Linux как из файла /etc/passwd, так и из AD/LDAP.
~]# getent passwd | awk -F: '{ print $1}'
или
~]# getent passwd | cut -d: -f1
Аналогично можно выполнить:
~]# compgen -u
Пользователи в Linux подразделяются на обычные и системные.
Обычные пользователи — это пользователи, созданные пользователем root или другим пользователем с привилегиями sudo. У каждого пользователя есть числовой идентификатор пользователя, называемый UID. Если UID не был выбран при создании пользователя с помощью useradd, то он будет выбран автоматически между UID_MIN и UID_MAX. Как их узнать?
~]# grep -E '^UID_MIN|^UID_MAX' /etc/login.defs
Вывод:
UID_MIN 500
UID_MAX 6000
Знание минимального и максимального значения позволяет нам запрашивать список всех обычных пользователей в нашей системе.
~]# getent passwd {500..6000}
Как отобразить пользователей имеющих оболочку входа?
~]# cat /etc/passwd | grep -E 'bash|sh|bin|zsh'
или
~]# cat /etc/passwd | grep -E -v 'nologin'
Информация о локальных пользователях хранится в файле /etc/passwd.
~]# less /etc/passwd
Если вы хотите отображать только имя пользователя, вы можете использовать команды awk или cut для печати только первого поля, содержащего имя пользователя:
~]# awk -F: '{ print $1}' /etc/passwd
или
~]# cut -d: -f1 /etc/passwd
GETENT.
Команда getent отображает записи из баз данных, настроенных в файле /etc/nsswitch.conf, в том числе и passwd
~]# getent passwd
Если вы используете доменную аутентификацию, getent будет отображать всех пользователей Linux как из файла /etc/passwd, так и из AD/LDAP.
~]# getent passwd | awk -F: '{ print $1}'
или
~]# getent passwd | cut -d: -f1
Аналогично можно выполнить:
~]# compgen -u
Пользователи в Linux подразделяются на обычные и системные.
Обычные пользователи — это пользователи, созданные пользователем root или другим пользователем с привилегиями sudo. У каждого пользователя есть числовой идентификатор пользователя, называемый UID. Если UID не был выбран при создании пользователя с помощью useradd, то он будет выбран автоматически между UID_MIN и UID_MAX. Как их узнать?
~]# grep -E '^UID_MIN|^UID_MAX' /etc/login.defs
Вывод:
UID_MIN 500
UID_MAX 6000
Знание минимального и максимального значения позволяет нам запрашивать список всех обычных пользователей в нашей системе.
~]# getent passwd {500..6000}
Как отобразить пользователей имеющих оболочку входа?
~]# cat /etc/passwd | grep -E 'bash|sh|bin|zsh'
или
~]# cat /etc/passwd | grep -E -v 'nologin'
blk_update_request.
Что делать если у вас регулярно регистрируется ошибка:
blk_update_request: I/O error, dev fd0, sector 0
Вы наверняка знаете, ранее в ПК мы использовали FLOPPY.
На ряду новых технологий, мы используем DVD, USB носители информации и совсем забыли о FLOPPY, так же как и о драйвере. Так давайте его отключим:
~]# rmmod floppy
Добавим в черный список загружаемых модулей
~]# echo "blacklist floppy" | sudo tee /etc/modprobe.d/blacklist-floppy.conf
~]# dracut -f -v
Выполним перезапуск системы
~]# reboot
Что делать если у вас регулярно регистрируется ошибка:
blk_update_request: I/O error, dev fd0, sector 0
Вы наверняка знаете, ранее в ПК мы использовали FLOPPY.
На ряду новых технологий, мы используем DVD, USB носители информации и совсем забыли о FLOPPY, так же как и о драйвере. Так давайте его отключим:
~]# rmmod floppy
Добавим в черный список загружаемых модулей
~]# echo "blacklist floppy" | sudo tee /etc/modprobe.d/blacklist-floppy.conf
~]# dracut -f -v
Выполним перезапуск системы
~]# reboot