Timezone кажется мелочью ровно до первого инцидента. Сервис упал в 03:10. Мониторинг сработал в 00:10. В логах приложения ошибка в 05:10. А cron, который точно должен был запуститься ночью, вообще отработал не тогда. И начинается расследование не аварии, а вопроса: "чье это вообще время?" Проблема в том, что в инфраструктуре легко получить несколько разных временных реальностей:
• сервер живет в UTC;
• приложение пишет логи в локальном времени;
• контейнер использует другой timezone;
• база хранит timestamp без offset;
• мониторинг показывает время браузера;
• cron работает по системному времени хоста;
• разработчик смотрит все из своей локальной зоны.
•
В итоге события вроде бы относятся к одному инциденту, но на таймлайне разъезжаются на 2–3 часа.
timedatectl
Посмотреть текущую дату с зоной:
date
Проверить UTC:
date -u
Для systemd-журнала удобно явно указывать временное окно:
journalctl --since "2026-05-29 03:00" --until "2026-05-29 03:30"
Но важно понимать: это окно интерпретируется в локальном времени системы, с которой вы работаете.
С cron тоже есть нюанс. Если на сервере стоит Europe/Moscow, то запись:
0 3 * * * /opt/scripts/backup.sh
запустится в 03:00 по времени этого сервера.
Если такой же cron стоит на другом сервере в UTC, задача фактически поедет на несколько часов.
• хранить серверное время в UTC;
• писать логи с timezone или offset;
• использовать ISO 8601 формат;
• не хранить timestamp без понимания зоны;
• явно документировать, в каком времени работает cron;
• синхронизировать время через NTP;
• при расследовании сразу строить единый таймлайн.
2026-05-29T03:10:42Z
# или так:
2026-05-29T06:10:42+03:00
2026-05-29 03:10:42
Потому что без timezone непонятно, это UTC, Москва, Хельсинки, время контейнера или фантазия приложения.
#linux #timezone
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥1
Иногда нужно быстро объединить несколько разных дисков в один общий каталог, но без RAID, LVM и сложной перестройки хранилища. Например, есть два диска, смонтированные так:
/mnt/sda
/mnt/sdb
А хочется получить одну общую точку:
/mnt/storage. Чтобы приложения видели это как единое хранилище, а файлы физически раскладывались по исходным дискам. Для такой задачи хорошо подходит mergerfs. Это не RAID и не замена бэкапам. Это именно логическое объединение каталогов в одну файловую систему поверх уже существующих маунт поинтов.• видеосервер с архивом камер. Можно объединить несколько разнородных дисков и указать видеосерверу один общий путь.
• сервер со статикой или кэшем. Когда отказоустойчивость не критична, но нужно удобно расширять объем.
• backup-хранилище. Для некоторых сценариев бэкапов логическое объединение дисков вполне допустимо.
• сервер с дисками разного размера. Например, есть 2 ТБ + 3 ТБ, и хочется получить один общий каталог без плясок с RAID-массивами.
/dev/sda и /dev/sdb. Создаем разделы, файловые системы и монтируем их:
cfdisk /dev/sda
cfdisk /dev/sdb
mkfs.ext4 /dev/sda1
mkfs.ext4 /dev/sdb1
mkdir -p /mnt/sda1 /mnt/sdb1
mount /dev/sda1 /mnt/sda1
mount /dev/sdb1 /mnt/sdb1
Проверяем:
df -h
Теперь ставим mergerfs:
apt install mergerfs
Создаем общую точку монтирования:
mkdir -p /mnt/storage
И объединяем два диска:
mergerfs -o defaults,allow_other,category.create=mfs,moveonenospc=true,minfreespace=1G \
/mnt/sda1:/mnt/sdb1 /mnt/storage
После этого
/mnt/storage будет показывать суммарный объем двух дисков. Проверяем:
df -h | grep storage
allow_other - Позволяет видеть файловую систему не только root, но и другим пользователям.category.create=mfs - Новые файлы создаются там, где больше свободного места. mfs - most free space.moveonenospc=true - Если при записи на выбранном диске закончилось место, mergerfs попробует перенести файл на другой диск.minfreespace=1G - Если на диске осталось меньше 1 ГБ, новые файлы туда больше не пишутся.
dd if=/dev/zero of=/mnt/storage/tempfile1 bs=1M count=1000
dd if=/dev/zero of=/mnt/storage/tempfile2 bs=1M count=1000
ls /mnt/storage
ls /mnt/sda1
ls /mnt/sdb1
Файлы будут видны в общей точке
/mnt/storage, но физически лежать на одном из исходных дисков. Это важное отличие от RAID: каждый файл хранится целиком на конкретном диске, а не размазывается блоками по всем устройствам.• можно объединять диски разного размера
• не нужно пересобирать массив
• легко добавить новый диск
• файлы остаются читаемыми напрямую с исходных mount point’ов
• удобно для статичных данных, кэша, архивов и бэкапов
То есть mergerfs дает удобство единого пространства, но не дает отказоустойчивость. Для постоянного подключения mergerfs можно добавить в
/etc/fstab или оформить через systemd mount. Это уже зависит от того, как вы привыкли управлять маунтами.#mergerfs #storage
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤1
Иногда нужно быстро передать ссылку, Wi-Fi пароль, токен для теста или короткий текст с сервера на телефон. Можно не открывать браузер и не генерировать картинку. QR-код можно вывести прямо в терминале. В linux для этого удобно использовать
qrencode.
apt install qrencode
qrencode -t ANSIUTF8 "https://networkadmin.ru"
В терминале появится QR-код, который можно сразу отсканировать телефоном.
Если нужен PNG-файл:
qrencode -o qrcode.png "https://networkadmin.ru"
Можно передавать данные из pipe:
echo "ssh user@10.10.10.5" | qrencode -t ANSIUTF8
sudo apt install qrencode
qrencode -t ANSIUTF8 "https://networkadmin.ru"
Если WSL нет, можно использовать PowerShell-модуль или сторонние утилиты, но через WSL обычно быстрее и проще.
#terminal #qrcode
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
В Active Directory можно настроить длину пароля, срок действия, историю и требования к сложности. Но есть неприятный нюанс: стандартная политика сложности не понимает, что такое плохой, но формально сложный пароль. Например:
Qwerty123
P@ssw0rd
Company2026
Admin@123
Такие пароли могут проходить базовую проверку сложности: есть заглавные буквы, строчные буквы, цифры, иногда спецсимволы.
Формально все хорошо.
Фактически - это словарные и шаблонные пароли, которые легко угадываются или быстро подбираются. Проблема в том, что стандартная парольная политика AD проверяет структуру пароля, но плохо понимает его смысл. То есть пароль вида:
P@ssw0rd2026! может выглядеть сложным для политики, но быть очень слабым с точки зрения реальной безопасности.• входит в список запрещенных слов
• похож на название компании
• содержит имя пользователя
• совпадает с типовыми шаблонами
• найден в базе скомпрометированных паролей
• слишком предсказуемо меняется по годам или сезонам
• PassFiltEx
• Lithnet Password Protection for Active Directory
Оба варианта позволяют расширить стандартную проверку паролей и отсеивать то, что обычная политика AD пропускает. Например, можно запретить пароли, связанные с: названием компании, доменом, брендами, городами, типовыми словами вроде Password, Qwerty, Admin, годовыми шаблонами вроде 2025, 2026, известными утечками паролей. Это особенно полезно в инфраструктурах, где пользователи любят обновлять пароль по принципу:
Winter2025! Spring2026! Company2026!С точки зрения пользователя - пароль новый. С точки зрения атакующего - почти тот же самый шаблон.
#windows #activedirectory
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Как смотреть потоки процесса через ps, /proc и strace
Обычно при работе с ps мы смотрим процесс по PID или грепаем по имени:
Но часто удобнее сразу указать имя процесса через -C. Например, посмотрим потоки prometheus:
▪️ Посчитать количество потоков
Важно: количество потоков и количество процессов - не одно и то же. Например:
Результаты могут сильно отличаться.
▪️ Посмотреть нагрузку по потокам. Если приложение тормозит, полезно вывести CPU/MEM с разбивкой по потокам. Например, для процесса с PID 508:
Так можно увидеть, какой именно поток ест CPU.
▪️ Найти подробности потока через /proc. Если знаем PID процесса и SPID потока:
В начале строки можно увидеть имя потока, например:
У Fail2ban это может подсказать, какой jail сейчас нагружает систему. Больше информации:
▪️ Подключить strace к конкретному потоку. strace умеет подключаться не только к PID процесса, но и к SPID потока:
На нагруженном сервере вывод быстро завалит консоль, поэтому лучше писать в файл:
Можно ограничить типы системных вызовов. Открытие файлов и чтение:
Запись:
Сеть:
▪️ Через htop. В htop тоже можно смотреть трейсы. Выберите нужный процесс или поток и нажмите:
#linux #htop
🧑💻 NetworkAdmin
Обычно при работе с ps мы смотрим процесс по PID или грепаем по имени:
ps -p 524 -o %mem,%cpu,cmd
ps ax | grep prometheus
Но часто удобнее сразу указать имя процесса через -C. Например, посмотрим потоки prometheus:
ps -T -C prometheus
PID SPID TTY TIME CMD
525 525 ? 00:55:34 prometheus
525 803 ? 00:03:10 prometheus
525 808 ? 00:09:22 prometheus
525 1054 ? 00:08:44 prometheus
PID - ID основного процессаSPID - ID конкретного потока
ps -T -C zabbix_server | wc -l
Важно: количество потоков и количество процессов - не одно и то же. Например:
ps -T -C zabbix_server | wc -l
ps ax | grep zabbix_server | wc -l
Результаты могут сильно отличаться.
ps -L -o spid,%mem,%cpu,cmd 508
SPID %MEM %CPU CMD
1070 0.6 0.0 /usr/bin/python3 /usr/bin/fail2ban-server -xf start
1071 0.6 0.1 /usr/bin/python3 /usr/bin/fail2ban-server -xf start
1077 0.6 0.3 /usr/bin/python3 /usr/bin/fail2ban-server -xf start
Так можно увидеть, какой именно поток ест CPU.
cat /proc/508/task/1077/stat
В начале строки можно увидеть имя потока, например:
1077 (f2b/f.wp-login)
У Fail2ban это может подсказать, какой jail сейчас нагружает систему. Больше информации:
cat /proc/508/task/1077/status
strace -p 1077
На нагруженном сервере вывод быстро завалит консоль, поэтому лучше писать в файл:
strace -p 1077 -o ~/strace.out
Можно ограничить типы системных вызовов. Открытие файлов и чтение:
strace -p 1077 -e trace=openat,read
Запись:
strace -p 1077 -e trace=write
Сеть:
strace -p 1077 -e trace=connect,recvfrom,sendto
s. Если strace установлен, htop покажет системные вызовы в реальном времени.#linux #htop
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
systemd.path: запуск действия при изменении файла
У systemd есть удобный механизм, о котором часто забывают - systemd.path. Он позволяет следить за событиями в файловой системе и запускать нужный .service, когда файл или каталог изменился.
Например:
изменился конфиг - перезапустить сервис
появился файл - запустить обработчик
обновился сертификат - скопировать его и сделать reload
▪️ Пример: реагируем на изменение конфига. Допустим, нужно выполнить действие при изменении файла:
Создаем unit:
Этот .path будет следить за изменением файла.
▪️ Сервис, который запустится по событию. Теперь создаем:
Для примера сервис просто пишет дату события в файл:
На практике в ExecStart можно указать любой скрипт:
• перезапуск сервиса;
• reload nginx;
• копирование файла;
• отправка алерта;
• валидация конфига.
▪️ Включаем и запускаем
Проверяем статус:
Теперь изменяем файл:
И смотрим результат:
Должна появиться новая строка с текущей датой.
▪️ Почему это удобно. Главный плюс- все работает через systemd. Значит, события и ошибки можно смотреть привычно:
Не нужно писать отдельный бесконечный watcher на bash или городить cron.
▪️ Полезные директивы
Срабатывает при изменении файла.
Срабатывает после закрытия файла, в который была запись.
Срабатывает, когда файл или каталог появился.
То же самое, но с маской.
Срабатывает, когда в пустом каталоге появился файл.
#linux #systemd
🧑💻 NetworkAdmin
У systemd есть удобный механизм, о котором часто забывают - systemd.path. Он позволяет следить за событиями в файловой системе и запускать нужный .service, когда файл или каталог изменился.
Например:
изменился конфиг - перезапустить сервис
появился файл - запустить обработчик
обновился сертификат - скопировать его и сделать reload
/etc/daemon/daemon.conf
Создаем unit:
/etc/systemd/system/daemon.path
[Unit]
Description=Watch /etc/daemon/daemon.conf for changes
[Path]
PathModified=/etc/daemon/daemon.conf
[Install]
WantedBy=multi-user.target
Этот .path будет следить за изменением файла.
/etc/systemd/system/daemon.service
[Unit]
Description=Run action after daemon.conf change
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo "daemon config changed at $(date)" >> /etc/daemon/restart.date'
Для примера сервис просто пишет дату события в файл:
/etc/daemon/restart.date
На практике в ExecStart можно указать любой скрипт:
• перезапуск сервиса;
• reload nginx;
• копирование файла;
• отправка алерта;
• валидация конфига.
systemctl daemon-reload
systemctl enable --now daemon.path
Проверяем статус:
systemctl status daemon.path
Теперь изменяем файл:
echo "# test" >> /etc/daemon/daemon.conf
И смотрим результат:
cat /etc/daemon/restart.date
Должна появиться новая строка с текущей датой.
journalctl -u daemon.path
journalctl -u daemon.service
Не нужно писать отдельный бесконечный watcher на bash или городить cron.
[Path]
PathModified=/path/file
Срабатывает при изменении файла.
PathChanged=/path/file
Срабатывает после закрытия файла, в который была запись.
PathExists=/path/file
Срабатывает, когда файл или каталог появился.
PathExistsGlob=/path/*.conf
То же самое, но с маской.
DirectoryNotEmpty=/path/dir
Срабатывает, когда в пустом каталоге появился файл.
#linux #systemd
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Обычная маршрутизация отвечает на вопрос: куда отправить пакет по адресу назначения? Но иногда этого мало. Например, на linux-сервере есть два провайдера, два интерфейса или несколько VPN. И нужно, чтобы часть трафика шла через один шлюз, а часть - через другой.
Вот здесь появляется Policy Based Routing. PBR позволяет маршрутизировать трафик не только по destination IP, но и по дополнительным условиям:
• source IP
• интерфейс
• fwmark
• отдельная таблица маршрутизации
• правила из ip rule
eth0 -> 192.168.1.10/24 -> gateway 192.168.1.1
eth1 -> 10.10.10.10/24 -> gateway 10.10.10.1
Обычный default route может быть только один основной. А нам нужно, чтобы ответы с адреса 10.10.10.10 уходили обратно через 10.10.10.1, а не через первый шлюз.
Создаем отдельную таблицу маршрутизации:
echo "100 isp2" >> /etc/iproute2/rt_tables
Добавляем маршрут в эту таблицу:
ip route add 10.10.10.0/24 dev eth1 src 10.10.10.10 table isp2
ip route add default via 10.10.10.1 dev eth1 table isp2
Теперь добавляем правило:
ip rule add from 10.10.10.10/32 table isp2
Смысл такой: если пакет идет от source IP 10.10.10.10, использовать таблицу isp2.
Проверить правила:
ip rule show
Проверить маршруты в таблице:
ip route show table isp2
Проверить, как ядро выберет маршрут:
ip route get 8.8.8.8 from 10.10.10.10
Это одна из самых полезных команд при отладке PBR.
• сервер с несколькими провайдерами
• отдельный выход в интернет для VPN-клиентов
• маршрутизация по source IP
• разделение служебного и пользовательского трафика
• multi-WAN
• асимметричные схемы
• маршрутизация через разные туннели
Можно использовать и fwmark, если нужно направлять трафик по меткам firewall. Например, пометить пакеты через iptables:
iptables -t mangle -A OUTPUT -p tcp --dport 443 -j MARK --set-mark 10
И отправить такие пакеты в отдельную таблицу:
ip rule add fwmark 10 table isp2
Так можно строить более гибкую логику: не только от какого IP, но и какой именно трафик.
ip route # маршруты
ip rule # правила
Потому что решение принимает не одна таблица маршрутизации, а связка: rule -> table -> route
#network #routing
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Когда говорят про безопасность в linux, часто вспоминают SELinux и AppArmor. Оба инструмента решают похожую задачу: ограничивают, что процесс может делать в системе, даже если у него уже есть обычные Unix-права.
То есть если приложение скомпрометировали, оно не должно автоматически получить возможность читать все подряд, писать куда угодно и трогать чужие файлы. Это дополнительный слой защиты поверх пользователей, групп и прав доступа. Но подход у них разный.
Проверить статус:
sestatus
Посмотреть контексты файлов:
ls -Z
Посмотреть контекст процесса:
ps auxZ
SELinux мощный и гибкий, но за это приходится платить сложностью. Если что-то заблокировано, нужно разбираться в контекстах, политиках, AVC denial, boolean’ах и audit2allow.
Типичный разбор:
ausearch -m avc -ts recent
audit2why
audit2allow
Для больших корпоративных инфраструктур, особенно на RHEL-подобных системах, SELinux - сильный и зрелый вариант.
Проверить статус:
aa-status
Перевести профиль в complain-режим:
aa-complain /etc/apparmor.d/usr.sbin.nginx
Вернуть enforcement:
aa-enforce /etc/apparmor.d/usr.sbin.nginx
В complain-режиме AppArmor не блокирует действие, а только пишет, что было бы запрещено. Это удобно при внедрении: сначала наблюдаем, потом включаем реальные ограничения.
• быстрее понять логику профиля;
• проще привязка к путям;
• легче внедрять точечно;
• удобнее для небольших команд;
• меньше порог входа для обычного админа.
• более строгая модель через labels;
• лучше подходит для больших стандартизированных сред;
• глубже интегрирован в RHEL/CentOS/Rocky/Alma;
• мощнее при сложных многоуровневых политиках;
• меньше зависит от путей к файлам.
Самая плохая практика:
setenforce 0
или полное отключение SELinux/AppArmor просто потому, что сервис не стартует. Это не решение проблемы, а выключение защитного слоя. Лучше временно перевести в мягкий режим и разобраться:
setenforce 0
для диагностики SELinux, но не как постоянное состояние. Для AppArmor аналогично:
aa-complain /etc/apparmor.d/profile-name
#linux #security
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤1
Иногда нужно не просто писать общий access log, а отдельно сохранять конкретные типы запросов. Например: все 404, все 5xx, запросы от конкретных ботов, отдельные URI, нестандартные методы, трафик из определенных стран. Можно потом парсить общий лог через grep, awk или SIEM. Но в Nginx часто есть более аккуратный способ - использовать map.
map позволяет создать переменную на основе другой переменной Nginx. А потом использовать эту переменную в логах, блокировках, редиректах и другой логике.
map $status $to404log {
404 1;
default 0;
}
map $status $to5xxlog {
~^5 1;
default 0;
}
Теперь в нужном виртуальном хосте:
access_log /var/log/nginx/404.log combined if=$to404log;
access_log /var/log/nginx/5xx.log combined if=$to5xxlog;
• запросы со статусом 404 попадут в /var/log/nginx/404.log
• ответы 500, 502, 503, 504 и другие 5xx попадут в /var/log/nginx/5xx.log
• при этом общий access log можно оставить как есть
Например:
access_log /var/log/nginx/access.log combined;
• Nginx смотрит на встроенную переменную $status
• если статус 404, переменная $to404log получает значение 1
• если статус начинается с 5, переменная $to5xxlog получает значение 1
• директива access_log ... if= пишет запись только если переменная не равна 0
Так можно быстро отделить интересные события без внешней обработки логов.
map $http_user_agent $block_useragent {
default 0;
~*semrushbot 1;
~*ahrefs 1;
~*rss2tg 1;
~*seznambot 1;
~*AspiegelBot 1;
~*BLEXBot 1;
~*MASHIAH 1;
}
А в виртуальном хосте вернуть 403:
if ($block_useragent) {
return 403;
}
Да, if в Nginx часто ругают, но для простого return внутри server это нормальный и распространенный сценарий. По такой же логике можно делать условия по другим переменным:
$request_method
$request_uri
$remote_addr
$host
$geoip_country_code
$http_referer
Например:
• отдельно логировать POST-запросы
• блокировать конкретные URI для некоторых User-Agent
• писать подозрительные запросы в отдельный лог
• ограничивать доступ по стране через GeoIP
• включать разные upstream’ы по признакам запроса
#nginx #linux
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9
Если для удаленного хоста доступны и IPv4, и IPv6, Windows по умолчанию может выбрать IPv6. То есть если DNS или mDNS в локальной сети вернул сразу две записи:
A -> IPv4-адрес
AAAA -> IPv6-адрес
то подключение с windows-клиента часто пойдет именно по IPv6-адресу из AAAA. В обычной современной сети это нормально. IPv6 - не лишний протокол, а полноценная часть сетевого стека Windows. Но иногда из-за этого начинаются странные проблемы. Например:
• имя хоста резолвится нормально;
• ping может работать;
• по IPv4 сервис доступен;
• но приложение пытается подключиться по IPv6;
• а сам сервис IPv6 не слушает или работает с ним криво.
Особенно часто это всплывает со старыми приложениями, самописными сервисами, легаси-софтом, SMB-сценариями в рабочих группах и внутренними утилитами, которые всегда жили на IPv4.
Симптомы могут выглядеть так:
по IP 192.168.x.x все открывается
по имени хоста - ошибка
соседний компьютер виден, но сервис не отвечает
приложение пишет timeout
в логах видно попытку подключения к IPv6
Первый импульс - полностью отключить IPv6. Но это плохая идея. Microsoft не рекомендует полностью отключать IPv6 в Windows, потому что часть компонентов системы рассчитывает на его наличие.
Более аккуратный обходной путь - поднять приоритет IPv4 над IPv6 в prefix policy. Посмотреть текущую таблицу префиксов:
netsh interface ipv6 show prefixpolicies
Увеличить приоритет IPv4-mapped адресов можно так:
netsh interface ipv6 set prefix ::ffff:0:0/96 55 4
В некоторых инструкциях также встречается настройка для ::/96:
netsh interface ipv6 set prefix ::/96 60 3
После изменения стоит проверить таблицу еще раз:
netsh interface ipv6 show prefixpolicies
Смысл этих настроек в том, что винда меняет предпочтения при выборе адреса назначения. IPv6 остается включенным, но при наличии IPv4 и IPv6 система может начать чаще выбирать IPv4.
Проверить резолвинг можно так:
nslookup hostname
А доступность порта:
Test-NetConnection hostname -Port 445
#windows #network
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
tmpfs - это файловая система, которая хранит данные в оперативной памяти. Проще говоря, вы монтируете каталог как обычную файловую систему, но файлы физически лежат не на диске, а в RAM. При необходимости часть данных может быть вытеснена в swap, если он включен.
df -h -t tmpfs
/run
/dev/shm
/tmp
Главный плюс tmpfs - скорость. Операции чтения и записи обычно быстрее, чем на диске, особенно если это много мелких временных файлов.
• временные файлы приложения;
• build-кэши;
• сокеты и runtime-файлы;
• промежуточные данные, которые не нужны после перезагрузки;
• тестовые стенды;
• ускорение операций с большим количеством мелких файлов.
Например, можно смонтировать отдельный каталог:
mkdir -p /mnt/ramtmp
mount -t tmpfs -o size=2G tmpfs /mnt/ramtmp
Теперь
/mnt/ramtmp будет tmpfs с лимитом 2 ГБ.Для постоянного подключения через
/etc/fstab:
tmpfs /mnt/ramtmp tmpfs defaults,size=2G,noatime 0 0
Первая проблема - данные исчезают после перезагрузки. Если приложение случайно пишет туда то, что должно храниться постоянно, после ребута будет сюрприз.
Вторая проблема - расход RAM. Если задать слишком большой tmpfs или не ограничить его размер, временные файлы могут начать конкурировать с приложениями за память. Проверить использование:
df -h /mnt/ramtmp
И отдельно смотреть память:
free -h
Третья проблема - OOM. Если приложение активно пишет во временный каталог на tmpfs, можно неожиданно упереться в память.
Особенно на серверах с тяжелыми сервисами, контейнерами или сборками.
Четвертая проблема - swap. Если swap включен, tmpfs не всегда означает "только RAM". Под давлением памяти часть страниц может уехать в swap, и внезапно "быстрый tmpfs" станет не таким быстрым.
•
/tmp на серверах с непредсказуемыми задачами;• директории аплоадов;
• временные файлы баз данных;
• CI/CD-сборки без лимитов;
• контейнеры с активной записью;
• любые каталоги, где размер данных заранее неизвестен.
Для systemd-сервисов можно использовать временные каталоги аккуратнее:
[Service]
PrivateTmp=true
Это даст сервису отдельный
/tmp и /var/tmp, чтобы он не мешал другим процессам. А если нужен runtime-каталог:
[Service]
RuntimeDirectory=myapp
Тогда systemd создаст каталог в
/run, который обычно тоже находится на tmpfs.#linux #tmpfs
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍2
psmisc - небольшой набор утилит, которые часто оказываются полезнее, чем кажутся на первый взгляд. Обычно пакет ставят ради трех команд:
fuser, pstree, killall
apt install psmisc
# или:
yum install psmisc
umount /mnt/backup
А в ответ:
target is busyСмотрим, кто держит mount point:
fuser -vm /mnt/backup
Можно увидеть PID, пользователя и тип доступа. Если нужно аккуратно завершить процессы:
fuser -k /mnt/backup
Но с
-k лучше не спешить. Сначала посмотреть, потом убивать.Еще полезный пример - кто держит TCP-порт:
fuser -v 8080/tcp
Или UDP:
fuser -v 53/udp
ps aux часто превращается в простыню. pstree показывает процессы в виде дерева: кто кого запустил и где родительский процесс.
pstree
С PID:
pstree -p
Для конкретного пользователя:
pstree -u username
Для конкретного процесса:
pstree -p 1234
Это очень удобно, когда нужно понять:
• какой процесс породил дочерние
• кто держит worker’ы
• почему после остановки сервиса остались потомки
• откуда запущен странный процесс
• что происходит внутри shell-сессии или скрипта
Например, при зависшем deploy можно быстро увидеть цепочку:
sshd───bash───deploy.sh───rsync
И уже понятно, кого действительно нужно трогать.
killall nginx
или мягко через TERM:
killall -TERM nginx
Если процесс не реагирует:
killall -KILL nginx
Но KILL - это крайний вариант. Сначала лучше отправлять TERM, чтобы процесс мог корректно завершиться. Можно посмотреть, что будет затронуто:
pgrep -a nginx
А уже потом использовать killall.
killall работает по имени процесса. Если на сервере есть несколько процессов с одинаковым именем, можно задеть лишнее.Особенно осторожно с короткими именами и системными процессами.
Хороший порядок в админке такой:
fuser -vm /mnt/backup
pstree -p
pgrep -a process_name
killall -TERM process_name
Сначала понять, кто держит ресурс. Потом посмотреть дерево процессов. И только потом что-то завершать.
#linux #psmisc
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤1
Короткая, но полезная штука для админов Windows. У Sysinternals есть live-каталог, который можно подключить как сетевой диск и запускать утилиты напрямую, без ручного скачивания архива. Команда простая:
net use S: http://live.sysinternals.com/tools
Если все прошло нормально, Windows ответит: Команда выполнена успешно.
После этого у вас появляется диск S:, где лежат утилиты Sysinternals.
Переходим на него:
S:
И запускаем нужный инструмент:
procexp64.exe
Для тех, кто не пользовался Sysinternals: это старый и очень известный набор утилит microsoft для диагностики и администрирования windows.
• Process Explorer. Расширенный менеджер процессов. Показывает дерево процессов, потоки, DLL, handles, параметры запуска, цифровые подписи, сетевую активность и много другой информации.
procexp64.exe
• TCPView. Показывает сетевые соединения: какой процесс, куда подключился, какой порт использует и в каком состоянии соединение.
tcpview.exe
• Autoruns. Один из лучших инструментов для разбора автозагрузки. Показывает Run-ключи, службы, драйверы, scheduled tasks, shell extensions и многое другое.
Autoruns.exe
• PsExec. Утилита для удаленного запуска процессов на Windows-хостах.
PsExec.exe
• Handle. Помогает понять, какой процесс держит файл или каталог.
handle.exe
Такой способ особенно удобен, когда нужно быстро что-то проверить на сервере или рабочей станции, а заранее набор утилит не скачан. Закончили работу - отключаем диск:
net use S: /delete
#windows #sysinternals
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤4🙏1
В Windows можно подключать каталоги с удаленного linux/unix-сервера как обычный сетевой диск. Не через SMB, не через FTP и не через WebDAV, а по защищенному SSH-соединению. Для этого есть SSHFS-Win - порт SSHFS-клиента для Windows. Он позволяет монтировать удаленную файловую систему по SSH так, будто это обычный диск в Проводнике.
После установки SSHFS-Win каталог можно подключить прямо из Проводника Windows. Например, UNC-путь:
\\sshfs.r\administrator@192.168.158.100\remote_folder
sshfs.r - тип подключенияadministrator - пользователь на удаленном сервере192.168.158.100 - адрес сервераremote_folder - удаленный каталогМожно смонтировать диск и из командной строки:
net use M: \\sshfs.r\administrator@192.168.158.100\ps /user:administrator
После этого в системе появится диск M:, с которым можно работать как с обычным сетевым диском.
Если нужна SSH-аутентификация по ключу, можно использовать другой префикс:
\\sshfs.k\administrator@192.168.158.100\remote_folder
Префикс
sshfs.k говорит SSHFS-Win использовать ключевую аутентификацию. Это удобнее и безопаснее, чем постоянно вводить пароль, особенно если доступ нужен регулярно.Пример подключения по ключу:
net use M: \\sshfs.k\administrator@192.168.158.100\remote_folder
Отключить диск можно стандартно:
net use M: /delete
• админ работает на Windows, а серверы linux;
• нужно быстро открыть
/var/log или /etc;• нет желания поднимать samba;
• нужен доступ к файлам через уже разрешенный SSH;
• удобно подключать dev/test каталоги;
• нужно временно смонтировать удаленную папку без лишней инфраструктуры.
SSHFS-Win - это не замена нормальному файловому серверу для большой команды. Для постоянной совместной работы, офисных файлов и тяжелой нагрузки чаще лучше использовать SMB/NFS/специализированное хранилище. Но для админских задач SSHFS-Win очень удобен: есть SSH-доступ - есть и сетевой диск в windows. Главное - использовать ключи, ограничивать права пользователя на сервере и не монтировать под root то, что можно открыть обычной учеткой.
#windows #sshfs
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13
Please open Telegram to view this post
VIEW IN TELEGRAM
😁8👍1
С днём системного администратора! 🏆
Пусть серверы не падают, бэкапы восстанавливаются, мониторинг молчит, а пользователи хотя бы иногда пробуют перезагрузить компьютер до обращения в поддержку.
Желаю стабильного аптайма, спокойных дежурств, крепких нервов и достойной зарплаты. За localhost!🍻 🍷
🧑💻 NetworkAdmin
Пусть серверы не падают, бэкапы восстанавливаются, мониторинг молчит, а пользователи хотя бы иногда пробуют перезагрузить компьютер до обращения в поддержку.
Желаю стабильного аптайма, спокойных дежурств, крепких нервов и достойной зарплаты. За localhost!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13👌4
Forwarded from localhost
Please open Telegram to view this post
VIEW IN TELEGRAM
2❤7😁5
Одна из старых проблем linux- приложение либо работает от обычного пользователя, либо получает полный root. Но на практике многим сервисам нужен всего один привилегированный доступ. Например:
• открыть порт ниже 1024;
• работать с raw-сокетами;
• менять сетевые настройки;
• выполнять отдельные системные операции.
Давать ради этого полный root - не лучшая идея. Для таких случаев в Linux существуют capabilities. Они разбивают привилегии суперпользователя на отдельные возможности, которые можно выдавать выборочно. К примеру, веб-серверу нужен только доступ к 80 порту. Без root обычный пользователь не сможет открыть этот порт:
python3 -m http.server 80
# Получим ошибку:
Permission denied```
Но можно выдать только capability для привязки к привилегированным портам:
setcap cap_net_bind_service=+ep /usr/bin/python3
Проверяем:
getcap /usr/bin/python3
Результат:
/usr/bin/python3 cap_net_bind_service=ep
Теперь процесс сможет слушать порт 80 без запуска от root. Еще несколько популярных capabilities:
•
CAP_NET_BIND_SERVICE - порты ниже 1024•
CAP_NET_RAW - raw sockets, ping и подобные инструменты•
CAP_SYS_TIME - изменение системного времени•
CAP_NET_ADMIN - управление сетью•
CAP_SYS_ADMIN - очень широкие административные возможности (почти mini-root)Посмотреть capabilities процесса:
cat /proc/<PID>/status | grep Cap
Или использовать:
capsh --print
Удалить capability:
setcap -r /usr/bin/python3
Очень полезны capabilities и в systemd. Например, сервис работает от непривилегированного пользователя:
[Service]
User=nginx
AmbientCapabilities=CAP_NET_BIND_SERVICE
В итоге процесс не получает root, но может слушать 80 и 443 порты. Это гораздо безопаснее, чем запускать весь сервис от суперпользователя. Но не все capabilities одинаково безопасны. Например:
CAP_SYS_ADMIN настолько мощная, что ее часто называют новым root. Поэтому принцип тот же, что и с правами пользователей: выдаем минимум необходимого.Если приложению нужен только доступ к порту 80 - выдаем только
CAP_NET_BIND_SERVICE. Не нужно на всякий случай раздавать весь набор возможностей.#linux #security #capabilities
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤1