4722
Авторский блог про сетевое и системное администрирование. Сайт: networkadmin.ru Реклама: @dad_admin Биржа: https://telega.in/c/networkadminru
systemd.path: запуск действия при изменении файла
У systemd есть удобный механизм, о котором часто забывают - systemd.path. Он позволяет следить за событиями в файловой системе и запускать нужный .service, когда файл или каталог изменился.
Например:
изменился конфиг - перезапустить сервис
появился файл - запустить обработчик
обновился сертификат - скопировать его и сделать reload
▪️ Пример: реагируем на изменение конфига. Допустим, нужно выполнить действие при изменении файла:
/etc/daemon/daemon.conf
/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
/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
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
[Path]
PathModified=/path/file
PathChanged=/path/file
PathExists=/path/file
PathExistsGlob=/path/*.conf
DirectoryNotEmpty=/path/dir
❗️ Как сохранить команду в историю, не запуская ее
Есть в bash одна малозаметная, но крайне удобная функция, о которой знают далеко не все. Она помогает сохранить длинную команду в истории без ее выполнения. Отлично подходит для случаев, когда вы передумали запускать команду, но хотите оставить ее на потом.
▪️ Как это работает
Вы набираете длинную строку в консоли, но понимаете, что сейчас выполнять ее не нужно. Вместо того чтобы копировать ее куда-то в файл, используйте простую комбинацию:Alt + Shift + 3
После нажатия bash автоматически добавит символ # в начало строки. Команда будет выполнена как комментарий: фактически не запускается, потому что закомментирована, но при этом сохраняется в history вместе с #.
▪️ Как потом ее найти
Открываете поиск по истории (Ctrl + R) и просто ищете по #, нужная команда окажется первой.
Маленькая фича, но иногда очень ускоряет работу.
#bash
🧑💻 NetworkAdmin
Нежно зайду и нажму кнопку «перезагрузка»
#юмор
🧑💻 NetworkAdmin
📱 Тестирование производительности PostgreSQL
Если нужно быстро оценить, как PostgreSQL чувствует себя на разных типах дисков, файловых системах или конфигурациях виртуалок, необязательно глубоко погружаться в тюнинг СУБД. Достаточно воспользоваться встроенной утилитой pgbench, она идет в комплекте с PostgreSQL и позволяет получить базовые, но показательные метрики.
▪️ Установка и подготовка среды. Устанавливаем PostgreSQL:
apt install postgresql
systemctl status postgresql
su - postgres
psql
create database test_db;
\q
pgbench -i test_db -s 10
pgbench test_db -c 5 -j 2 -P 5 -T 60
number of transactions actually processed: 219950
latency average = 1.362 ms
tps = 3665.930847
✍️ Быстрый способ выпустить свой HTTPS-сертификат через собственный CA
Сегодня почти любой сервис требует HTTPS. Даже если ресурс локальный или временный, браузеры без сертификата засыпают предупреждениями. Если нет внешнего доступа для Lets Encrypt, приходится копировать сертификаты вручную или постоянно продлевать их.
Гораздо удобнее выпустить свой корневой CA, добавить его в доверенные и генерировать сертификаты под любые домены/IP с любым сроком (хоть на 9999 дней). Покажу, как сделать это для Nginx.
В примере выпускаем сертификат для домена zabbix.internal и IP 192.168.77.55.
1️⃣ Создаем свой CA
mkdir ~/tls && cd ~/tls
openssl ecparam -out myCA.key -name prime256v1 -genkey
openssl req -x509 -new -nodes -key myCA.key -sha256 -days 9999 -out myCA.crt
openssl genrsa -out zabbix.internal.key 2048
openssl req -new -key zabbix.internal.key -out zabbix.internal.csr
mcedit zabbix.internal.ext
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
IP.1 = 192.168.77.55
DNS.1 = zabbix.internal
openssl x509 -req -in zabbix.internal.csr -CA myCA.crt -CAkey myCA.key \
-CAcreateserial -out zabbix.internal.crt -days 9999 -sha256 -extfile zabbix.internal.ext
mkdir /etc/nginx/certs
cp zabbix.internal.crt /etc/nginx/certs/
cp zabbix.internal.key /etc/nginx/certs/
openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
listen 443 http2 ssl;
server_name zabbix.internal 192.168.77.55;
ssl_certificate /etc/nginx/certs/zabbix.internal.crt;
ssl_certificate_key /etc/nginx/certs/zabbix.internal.key;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
nginx -t
nginx -s reload
cp myCA.crt /usr/local/share/ca-certificates/
update-ca-certificates
🖥 Small HTTP Server
Small HTTP Server - программа родом из эпохи Windows 95 и NT, но до сих пор развивается. Написана на C++, невероятно компактная - установщик весит всего около 1 МБ.
▪️ Что умеет Small HTTP Server?
▪️ HTTP-сервер: поддерживает CGI/FastCGI, ISAPI, запуск внешних интерпретаторов (PHP, Perl и т.д.), виртуальные хосты и директории. Можно использовать как полноценный небольшой веб-сервер.
▪️ Почтовый сервер POP3/SMTP: фильтры антиспама, чёрные/белые/серые списки, переотправка писем, запуск скриптов для обработки входящей почты, интеграция с внешними антивирусами.
▪️ FTP-сервер: с виртуальными каталогами и базовым управлением пользователями.
▪️ HTTP-proxy: работает с HTTP/HTTPS/FTP, умеет докачивать файлы, кешировать контент, запрашивать сжатые данные и распаковывать их на лету (через zlib).
▪️ DNS-сервер: поддерживает рекурсивные запросы, кеширование, DNSBL, DoH (RFC8484), а также интересную функцию: если удалённый сервис не отвечает, сервер может автоматически подменять IP-адрес на резервный.
▪️ DHCP-сервер: простой, но рабочий.
▪️ HTTP-TLS VPN: есть свой мини-VPN, использующий OpenVPN TAP-драйвер. И сервер, и клиент.
▪️ Интерфейс и работа
Программа доступна под Windows, Linux и ARM, отличный вариант для маломощных одноплатников.
Все службы настраиваются через удобный веб-интерфейс со статистикой. Конфигурация хранится в обычном текстовом файле. На Windows сервер запускается просто запуском EXE, по умолчанию работает как файловый листинг каталога. Можно установить как службу.
#utils
🧑💻 NetworkAdmin
🏠 Windows Firewall: как включить логирование и понять, что именно он блокирует
Встроенный брандмауэр windows по умолчанию не пишет логи о входящих и исходящих соединениях, которые он блокирует. Из-за этого сложно понять, кто виноват: само приложение, сеть или firewall. Многие в такой ситуации просто отключают защиту целиком, но это плохая практика.
Куда правильнее включить логирование DROP-пакетов, посмотреть, что именно блокируется (порт, IP, протокол), и уже после этого создать точечное правило.
▪️ Логирование в текстовый файл. Самый простой способ - это включить запись в стандартный лог:
Set-NetFireWallProfile -Profile Public `
-LogBlocked True `
-LogMaxSize 20480 `
-LogFileName "%systemroot%\system32\LogFiles\Firewall\pfirewall.log" `
-Verbose
pfirewall.log. В них видно источник, порт, направление и действие (DROP/ALLOW).
Auditpol /set /category:"System" /SubCategory:"Filtering Platform Packet Drop" /failure:enable
Event Viewer → Windows Logs → Security
👒 Легкий TCP/UDP туннель поверх HTTP
Хочу поделиться полезным инструментом, который часто упоминают в контексте пентестов, но который одинаково удобен и администраторам: Chisel. Это один бинарник (на Go) и для сервера, и для клиента доступный для linux, windows, macOS. Работает поверх HTTP, поэтому его очень просто поднять там, где открыт веб-порт.
▪️ Коротко, зачем нужно:
▪️быстро организовать SOCKS5-прокси через открытую HTTP/HTTPS точку;
▪️поднять обратный туннель (reverse) с защищённого хоста, который не доступен извне;
▪️пробросить локальный порт на удалённый хост по HTTP, когда прямой доступ заблокирован.
▪️ Примеры (общая схема)
1️⃣ Быстрый SOCKS5-прокси. На сервере (с публичным IP, порт 80/443 доступен):
./chisel server --port 80 --socks5
./chisel client http://server.example.com:80 socks
./chisel server --port 80 --reverse
./chisel client http://server.example.com:80 R:2222:localhost:22
ssh -p 2222 root@127.0.0.1
--reverse. На внутреннем клиенте даем правило:
./chisel client http://server.example.com:80 33306:127.0.0.1:3306
--auth user:pass и на сервере, и на клиенте, используйте для защиты туннеля.--backend позволяет прятать chisel-сервер за обычным веб-сервером (перенаправлять чужие HTTP-запросы), что облегчает развертывание в средах с ограничениями.
🔑 Простой инструмент для выпуска сертификатов Lets Encryptacme.sh - это полностью bash-скрипт для работы с Lets Encrypt и другими ACME-совместимыми центрами сертификации. Он не требует python, библиотек или дополнительных пакетов, достаточно стандартного окружения linux. Именно легкость, автономность и гибкость сделали его популярной альтернативой certbot.
▪️ Установка. Устанавливается одной командой:
curl https://get.acme.sh | sh -s email=you@networkadmin.ru
~/.acme.sh/acme.sh в .bashrc
acme.sh --issue --server letsencrypt -d networkadmin.ru -w /var/www/html
~/.acme.sh/networkadmin.ru/, где хранятся:acme.sh:
acme.sh --install-cert -d networkadmin.ru \
--key-file /etc/nginx/certs/key.pem \
--fullchain-file /etc/nginx/certs/cert.pem \
--reloadcmd "systemctl reload nginx"
acme.sh сам скопирует файлы и перезагрузит веб-сервер.acme.sh? Главные преимущества:~/.acme.sh, не трогают системные каталоги.
🧐 Анализ трафика
tcpdump - легкий и быстрый способ посмотреть сетевой трафик прямо в терминале, когда GUI-инструменты недоступны.
▪️ Основные приемы
Быстрые параметры:-i eth0 - интерфейс-nn - без DNS/порт-резолва-s 0 - захватывать пакет полностью-w file.pcap - сохранить трафик-r file.pcap - прочитать файл
Фильтры:
tcpdump -i eth0 -nn host 10.0.0.5
tcpdump -i eth0 -nn tcp port 443
tcpdump -i eth0 -nn 'tcp and dst port 22'
tcpdump -i any -nn -s 0 -A 'tcp port 80'
tcpdump -i any -nn -s 0 -A 'udp port 53'
tcpdump -i eth0 -nn -s 0 -w capture.pcap
tcpdump -i eth0 -nn 'tcp[tcpflags] & tcp-syn != 0'
tcpdump -i eth0 -nn -e
timeout 10 tcpdump -i eth0 -nn icmp | wc -l
tcpdump -i any -nn -s 0 -A 'tcp port 443' | grep -i 'server name'
⌨️ Инструмент для управления RDP-серверами Windows
Для администраторов windows есть небольшой, очень быстрый и почти олдовейший по духу инструмент - Terminal Services Manager от LizardSystems. Размер всего ~4 МБ, работает мгновенно, интерфейс простой и предельно функциональный. Изначально утилиту делали для терминальных серверов, но по факту она отлично подходит для любой Windows-машины: от серверов до обычных рабочих станций.
Программа платная, но условно. Для персонального использования доступна полностью бесплатная версия без ограничений.
▪️ Что умеет Terminal Services Manager
▪️ Управление терминальными сессиями
- Просмотр всех подключённых пользователей
- Видно, кто активен, кто в состоянии Disconnected
- Подключение к пользовательской сессии
- Принудительный logout или завершение всех сессий
▪️ Взаимодействие с пользователями
- Отправка сообщений прямо в их RDP-сессии
▪️ Мониторинг состояния системы
- Быстрый просмотр нагрузки CPU, RAM, диска
▪️ Управление процессами
- Просмотр процессов на удалённой машине
- Завершение зависших приложений
- Видно процессы по пользователям
▪️ Администрирование хоста
- Перезагрузка и выключение удалённых серверов
- Очистка профилей пользователей
- Быстрое включение/отключение RDP-доступа
Если вы часто управляете RDP-серверами, разгребаете зависшие сессии, мониторите пользователей, то эта утилита сильно экономит время.
#windows #RDP
🧑💻 NetworkAdmin
🧑💻 Создание и отладка собственных сервисов
Systemd давно стал стандартом для запуска, управления и наблюдения за сервисами. Но многие используют его только для управления уже существующими демонами и не создают собственные unit-файлы, а ведь это удобный способ автоматизировать любые скрипты, фоновые процессы или приложения.
▪️ Шаг 1: создаём unit-файл. Все пользовательские сервисы кладутся в:
/etc/systemd/system/
/etc/systemd/system/myapp.service
[Unit]
Description=My custom app
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/myapp.sh
Restart=on-failure
User=myuser
Group=myuser
[Install]
WantedBy=multi-user.target
Несколько рекомендаций по параметрам:Type=simple- подходит для скриптов и обычных демоновRestart=on-failure- перезапуск при сбояхUser=…- всегда запускайте сервисы НЕ от root, если это возможноAfter=network.target- ожидаем сеть перед запуском
#!/bin/bash
set -e
echo "Service started"
ping -c 1 8.8.8.8
chmod +x /usr/local/bin/myapp.sh
systemctl daemon-reload
systemctl enable --now myapp.service
systemctl status myapp.service
journalctl -u myapp.service -f
systemctl status myapp.service
systemctl daemon-reload
systemctl restart myapp.service
LimitNOFILE=65535WorkingDirectory=/opt/myappEnvironment="APP_ENV=prod"
ProtectSystem=full
ProtectHome=true
PrivateTmp=true
NoNewPrivileges=true
Как современные дистрибутивы управляют сетями
В последние годы сетевой стек linux стал удобнее и гибче. Вместо громоздких init-скриптов и ручной правки /etc/network/interfaces сейчас используются более современные инструменты - netplan и networkmanager. Часто они сосуществуют в одной системе, и админам важно понимать, когда и что использовать. Поделюсь, как работает каждый из этих инструментов и чем они отличаются.
▪️ Netplan: YAML-конфигурации и единая точка входа. Netplan появился в Ubuntu начиная с 17.10 и задумывался как универсальный слой конфигурации.
Его роль проста:
▪️читать YAML-файлы из /etc/netplan/
▪️транслировать их в настройки сетевого бэкенда (NetworkManager или systemd-networkd)
▪️выполнять примененную конфигурацию при загрузке
Сам Netplan не поднимает сети, он лишь управляет настройками. Пример конфигурации для systemd-networkd:
network:
version: 2
renderer: networkd
ethernets:
ens33:
dhcp4: no
addresses: [192.168.1.50/24]
gateway4: 192.168.1.1
nameservers:
addresses: [1.1.1.1, 8.8.8.8]
sudo netplan apply
Он умеет управлять:
Wi-Fi
VPN
Bonding/LACP
VLAN
Bridge
PPPoE
мобильными модемами
и многим другим.
nmcli connection add type ethernet ifname ens33 con-name static-ens33 \
ip4 192.168.1.50/24 gw4 192.168.1.1
nmcli connection modify static-ens33 ipv4.dns "1.1.1.1 8.8.8.8"
nmcli connection up static-ens33
network:
version: 2
renderer: NetworkManager
👓 Изоляция процессов без Docker
В linux есть встроенный механизм изоляции системных ресурсов - namespaces. Именно на нем основаны контейнеры вроде docker и LXC. Но namespaces можно использовать и напрямую без всяких надстроек.
Namespace - это способ ядра linux изолировать разные части системы: процессы, сеть, точки монтирования, пользователей и т.д.
Каждое приложение может жить в своем отдельном пространстве, не видя другие процессы и ресурсы.
unshare --pid --mount --fork --mount-proc /bin/bash
ps aux
USER PID %CPU %MEM COMMAND
root 1 0.0 0.0 /bin/bash
root 18 0.0 0.0 ps aux
mkdir /tmp/testdir /mnt/testdir
mount --bind /tmp/testdir /mnt/testdir
mount | grep testdir
/dev/sda3 on /mnt/testdir type ext4 (rw,relatime)
lsns:
lsns
NS TYPE NPROCS PID USER COMMAND
4026532480 pid 3 123 root unshare --pid --mount --fork --mount-proc /bin/bash
4026532481 mnt 3 123 root └─/bin/bash
unshare. Если у вас работают контейнеры, их namespaces тоже будут отображены здесь.
nsenter -t 123 -p -m top
unshare - создает новые namespaces.nsenter - позволяет войти в уже существующие.systemd-nspawn - мини-контейнерная система от systemd.systemd-nspawn:
systemd-nspawn -D /var/chroot/debian bash
Как смотреть потоки процесса через ps, /proc и strace
Обычно при работе с ps мы смотрим процесс по PID или грепаем по имени:
ps -p 524 -o %mem,%cpu,cmd
ps ax | grep 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
cat /proc/508/task/1077/stat
1077 (f2b/f.wp-login)
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 покажет системные вызовы в реальном времени.
⚙️ Автоматизация резервного копированияrsync до сих пор остается самым простым и быстрым инструментом для резервного копирования с нескольких и более серверов. А если обернуть его в ansible, можно получить полностью автоматизированную и воспроизводимую систему бэкапов, без ручных скриптов и кронов вразнобой.
Ansible будет отвечать за логику: какие хосты, какие директории, куда складывать.
rsync за быструю передачу файлов.
▪️ Пример структуры проекта
backup/
├── inventory
├── playbook.yml
└── vars.yml
vars.yml
backup_src: "/var/www"
backup_dest: "/backups/{{ inventory_hostname }}/"
playbook.yml
- hosts: all
become: yes
vars_files:
- vars.yml
tasks:
- name: Создать директорию для бэкапов
file:
path: "{{ backup_dest }}"
state: directory
recurse: yes
- name: Rsync данных
synchronize:
src: "{{ backup_src }}/"
dest: "{{ backup_dest }}"
archive: yes
compress: yes
delete: no
synchronize - это модуль ansible, который под капотом использует rsync.
0 3 * * * ansible-playbook /opt/backup/playbook.yml
🖥 RemoteApp на Windows 10/11
Если вам нужно, чтобы пользователи запускали через RDP не целый рабочий стол, а только определенное приложение, то для этого подойдет режим RemoteApp. Он чаще ассоциируется с серверами windows, но его реально настроить и на обычной win 10/11.
▪️ Что нужно сделать на сервере (удаленном Windows).
1. Включить RDP-доступ.
2. Установить нужное приложение и добавить пользователя в группу Remote Desktop Users или дать право через политику безопасности.
3. Разрешить запуск неопубликованных программ как RemoteApp: либо через групповые политики, либо через реестр:
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v fAllowUnlistedRemotePrograms /t REG_DWORD /d 1
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\TSAppAllowList\Applications\<AppName> с указанием пути, иконки и имени. mstsc.exe) и настраиваете подключение, затем сохраняете его как файл .RDP.
remoteapplicationmode:i:1
RemoteApplicationName:s:Имя_окна
RemoteApplicationProgram:s:"C:\path\to\app.exe"
DisableRemoteAppCheck:i:1
PromptForCredentials:i:0
alternate shell:s:rdpinit.exe
RemoteApplicationCmdLine:s:....
🔓 Ansible Vault: хранение секретов и паролей
Если вы работаете с Ansible, рано или поздно возникает вопрос: куда девать пароли, ключи, токены и прочее? Хранить их в открытом виде в репозитории - явно плохая идея. Для этого существует Ansible Vault - встроенный механизм шифрования файлов и переменных.
Vault позволяет безопасно хранить секреты прямо в плейбуках или отдельных файлах, а ansible будет расшифровывать их при выполнении. Все просто, удобно и без лишних зависимостей.
▪️ Шифруем файл. Создадим защищенный файл с переменными:
ansible-vault create secrets.yml
db_user: admin
db_pass: S3cretP@ss
ansible-vault edit secrets.yml
ansible-vault decrypt secrets.yml
ansible-vault encrypt secrets.yml
vars_files:
- secrets.yml
ansible-playbook site.yml --ask-vault-pass
ansible-vault encrypt_string 'P@ssw0rd!' --name 'db_pass'
🧑💻 Docker шпаргалка для ежедневной работы
▪️ Установка Docker
curl -o - https://get.docker.com | bash -
docker run -d -p 80:80 --restart always --name nginx-proxy nginx
docker ps # только запущенные
docker ps -a # все
docker rm nginx-proxy # остановленного
docker rm -f nginx-proxy # принудительно
docker stop $(docker ps -aq)
docker rm $(docker ps -aq)
docker images
docker rmi nginx # удалить один
docker rmi $(docker images -aq) # удалить все
docker exec -it nginx-proxy bash
docker logs nginx-proxy
docker logs -n 100 nginx-proxy
docker logs -f nginx-proxy
docker top nginx-proxy
docker stats nginx-proxy
docker stats prometheus exporter
docker stats prometheus --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"
docker inspect nginx-proxy
docker inspect -f '{{ .NetworkSettings.Networks.bridge.IPAddress }}' nginx-proxy
docker inspect --format '{{json .Mounts}}' grafana | jq .
docker system df
docker system prune
docker cp nginx-proxy:/etc/nginx/nginx.conf ~/nginx
docker cp ~/nginx/nginx.conf nginx-proxy:/etc/nginx
docker export nginx-proxy -o ~/nginx-proxy.tar.gz
Дедлайн Новый год стучится в дверь! 😊
Я думаю, что все устали и всем пора отдыхать, набираться сил. Все дедлайны позади, а о будущих думать пока не стоит! 😊
Я пожелаю Вам хороших каникул, счастья, здоровья, поменьше выгорания и успехов в новом году! 😊
С наступающим, 2026! 😊
👀 Шпаргалка: куда делось свободное место
Полезное напоминание в преддверии новогодних праздников - проверить бэкапы и свободное место 🤔 Я лишь поделюсь небольшой шпаргалкой, по которой можно определить куда делось свободное место, если в какой-то момент оно вдруг исчезло.
▪️ Проверяем общий объём занятых данных
df -h
du -h -d 1 / | sort -hr
du -hs /* | sort -hr
du -h -d 1 / | sort -hr | head -10
du -hcx --max-depth=6 / | sort -rh | head -n 20
find / -mount -ignore_readdir_race -type f -exec du -h "{}" + 2>&1 \
| sort -rh | head -n 20
df -ih
du показывает меньше, чем df, виноваты могут быть процессы, держащие удалённые файлы:
lsof | grep '(deleted)'
lsof +L1
kill -9 <pid>
/mnt/backup, но диск в момент копирования не смонтирован. Файлы падают на корневую ФС, а после монтирования становятся невидимыми, но место продолжают занимать.
⚙️ Восстановление GRUB и загрузки после сбоя
Если после обновления, кривой установки windows или повреждения разделов linux перестал загружаться, то почти всегда можно вернуть систему к жизни, просто восстановив GRUB.
1️⃣ Загружаемся с LiveCD. Любой дистрибутив подходит (Ubuntu, Debian, Fedora). Открываем терминал.
2️⃣ Находим Linux-раздел
lsblk
/dev/sda2./boot существует, то запомните и его.
sudo mount /dev/sda2 /mnt
/boot:
sudo mount /dev/sda1 /mnt/boot
for i in /dev /proc /sys /run; do sudo mount --bind $i /mnt$i; done
sudo chroot /mnt
grub-install /dev/sda
update-grub
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=GRUB
update-grub
/boot/efi не смонтирован, то смонтируйте нужный EFI-раздел (lsblk -f покажет FAT32):
mount /dev/sda1 /boot/efi
exit
sudo reboot
os-prober && update-grub
GRUB_TIMEOUT_STYLE=menu
🖥 Навигация по файловой системе в виде дерева
Многие знают про tree, но мало кто знает про broot. Это консольный инструмент для навигации по файловой системе, который сочетает просмотр дерева, поиск, переходы и фильтры в одном интерфейсе.
▪️ Установка. На большинстве дистрибутивов достаточно:
curl -fsSL https://dystroy.org/broot/install.sh | bash
br, запускающий интерактивный браузер.
nginx
cd ../../../../../.br -sbr -c :focustype:d
Заземление заказывали?
#юмор
🧑💻 NetworkAdmin
SMB-сервер на Python impacket - идеален для одноразовых задач: поднимаешь за пару команд, кидаешь файлы и завершаешь процесс.
▪️ Установка на Debian/Ubuntu:
apt install python3-impacket
cd /usr/share/doc/python3-impacket/examples/
python3 smbserver.py share /mnt/share -smb2support
Пояснения:share- имя шары;/mnt/share- директория, которую расшариваем (не забудьте права, для анонимного доступа удобно chmod 777 /mnt/share);-smb2support- включить SMB2 (без этого Windows 10/11 иногда не подключаются).
python3 smbserver.py share /mnt/share -smb2support -username demo -password pass
smbclient -L 192.168.55.15 --user demo%pass
smbclient //192.168.55.15/share --user demo%pass
🔠 Монтирование файловых систем через systemd
Хотя многие админы по привычке используют /etc/fstab, у systemd есть собственный механизм монтирования, который во многом удобнее и современнее.
📍 Почему systemd лучше, чем fstab?
1️⃣Автомонтирование при обращении - устройство подключается только тогда, когда к нему обращаются, и может автоматически отключаться по заданному таймауту.
2️⃣Автосоздание точек монтирования - systemd сам создает нужные директории, администратору не нужно следить за их наличием.
3️⃣Гибкая работа с таймаутами - если устройство недоступно, загрузка системы не повиснет, как это иногда бывает с fstab.
4️⃣Зависимости от сервисов - можно задать, что монтирование произойдёт только после старта VPN или другого сервиса, который необходим для доступа к диску.
/etc/systemd/system/mnt-backup.mount:
[Unit]
Description=Disk for backups
[Mount]
What=/dev/disk/by-uuid/f774fad3-2ba0-47d1-a20b-0b1c2ae1b7d6
Where=/mnt/backup
Type=ext4
Options=defaults
[Install]
WantedBy=multi-user.target
cfdisk /dev/sdb #создаем раздел
mkfs -t ext4 /dev/sdb1 #форматируем
blkid #смотрим UUID
systemctl daemon-reload
systemctl start mnt-backup.mount
systemctl enable mnt-backup.mount
/etc/systemd/system/mnt-backup.mount:
[Unit]
Description=NFS share
[Mount]
What=srv.example.com:/backup/nfs_share
Where=/mnt/backup
Type=nfs4
Options=rw
TimeoutSec=15
/etc/systemd/system/mnt-backup.automount:
[Unit]
Description=NFS share
Requires=network-online.target
BindsTo=openvpn@client.service
After=openvpn@client.service
[Automount]
Where=/mnt/backup
TimeoutIdleSec=60
[Install]
WantedBy=graphical.target
systemctl daemon-reload
systemctl enable --now mnt-backup.automount
openvpn@client.service диск автоматически отмонтируется.
📱 Windows в контейнере
На GitHub есть готовый способ запустить windows прямо в контейнере docker, без ручной настройки виртуалок. Все автоматизировано и работает поверх KVM. Ссылка: https://github.com/dockur/windows
▪️ Первые шаги
Разворачивать все на виртуальной машине с включенной вложенной виртуализацией. Выставляется тип процессора в host и на этом все. Дальше - стандартный старт:
git clone https://github.com/dockur/windows
cd windows
docker compose up
docker-compose.yml достаточно задать переменную окружения:
version: "3"
services:
windows:
environment:
VERSION: "win10"
docker compose up
http://<ip_сервера>:8006
И не говори, что не захотел
#юмор
🧑💻 NetworkAdmin
🖥 Курсы по PostgreSQL
Если вы работаете с PostgreSQL или только планируете - обратите внимание бесплатные курсы от компании Postgres Professional. Это один из немногих примеров, когда коммерческая компания делится полноценной учебной программой без ограничений.
Ссылка: https://postgrespro.ru/education/courses
▪️ Доступные курсы для администраторов PostgreSQL
DBA1 - базовое администрирование PostgreSQL
DBA2 - настройка и мониторинг
DBA3 - резервное копирование и репликация
QPT - оптимизация запросов
PGPRO - возможности Postgres Pro Enterprise
Каждый курс - это набор подробных презентаций и видео, охватывающих реальные задачи администрирования. Проходить можете в любом порядке, если нужно что-то точечно узнать - добро пожаловать.
▪️ Пример
Хотите разобраться с резервным копированием и репликацией?
Перейдите в DBA3, тема 2. Базовая резервная копия. Вы узнаете про холодные и горячие бэкапы, различия подходов, используемые инструменты и проверку восстановления.
(не реклама)
#postgresql #database
🧑💻 NetworkAdmin