В linux каждый файл или каталог хранится в виде структуры данных, называемой inode (index node). Inode содержит метаданные: права доступа, владельца, временные метки и ссылки на блоки с данными.
Даже если у вас много свободного места на диске, но закончились inodes - новые файлы создать не получится. Чаще всего такая ситуация возникает на серверах, где генерируются миллионы мелких файлов (логи, временные данные, кеши).
df -i
В столбцах будет видно общее количество inode, сколько уже занято и сколько осталось.
Inode создаются при форматировании файловой системы. Параметры задаются утилитой mkfs (для ext4 - mkfs.ext4). Например, создаем файловую систему с фиксированным количеством inode:
mkfs.ext4 -N 2000000 /dev/sdb1
Здесь -N задает количество inode. По умолчанию mkfs.ext4 рассчитывает их исходя из соотношения «один inode на 16К дискового пространства». Если ожидается много мелких файлов, можно увеличить плотность inode:
mkfs.ext4 -i 4096 /dev/sdb1
(один inode на каждые 4К).
Чтобы не допустить, что один пользователь «забьет» диск миллионами файлов, используют квоты. Включаем поддержку квот в /etc/fstab:
/dev/sdb1 /home ext4 defaults,usrquota,grpquota 0 2
Перемонтируем файловую систему:
mount -o remount /home
Создаем файлы для квот и включаем их:
quotacheck -cum /home
quotaon /home
Ограничиваем inode для пользователя:
edquota -u username
В открывшемся редакторе можно задать soft/hard limit для количества файлов (inodes).
#filesystem #inodes
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤1
Если существует риск кражи носителей с данными, стоит задуматься о шифровании. На linux это проще всего реализовать через LUKS, который позволяет зашифровать раздел и работать с ним как с обычным блочным устройством.
apt install cryptsetup # debian
cryptsetup luksFormat /dev/sdb1
cryptsetup luksOpen /dev/sdb1 lukscrypt
После этого появится устройство /dev/mapper/lukscrypt.
mkfs.ext4 /dev/mapper/lukscrypt
mkdir /mnt/crypt
mount /dev/mapper/lukscrypt /mnt/crypt
Теперь раздел доступен в системе, а при следующем подключении для расшифровки нужно будет выполнить
cryptsetup luksOpen и ввести пароль.#LUKS #security
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤1
Иногда команды в linux выдают данные так, что разобраться в них сложно: все идет сплошным текстом, столбцы "пляшут". В таких случаях выручает утилита
column, которая форматирует вывод в аккуратные таблицы.По умолчанию разделителем считается пробел, но при необходимости можно указать свой символ.
mount | column -t
Сразу видно, где какая файловая система и куда она примонтирована - читается намного удобнее.
/etc/passwd разделен двоеточиями. Сделаем его аккуратной таблицей:
column -s ":" -t /etc/passwd
Теперь строки легко обрабатывать, например, через awk. Выведем только имена пользователей:
column -s ":" -t /etc/passwd | awk '{print $1}'
Каждое имя - в отдельной строке. Отличный способ быстро собрать список, массив или передать данные.
#linux
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥2
tmpfs - это файловая система, которая хранит данные в оперативной памяти (RAM). Она монтируется как обычный каталог и доступна для приложений прозрачно, но при этом все записи идут не на диск, а в память.
Зачем это может быть полезно:📍 Ускорение работы - операции чтения/записи из RAM значительно быстрее, чем даже на NVMe SSD.📍 Снижение износа SSD - временные файлы не пишутся на диск, что уменьшает количество циклов записи.📍 Автоматическая очистка - содержимое tmpfs исчезает при перезагрузке.
Примеры использования tmpfs
/tmp по умолчанию монтируется как tmpfs. Если нет - можно добавить в /etc/fstab:
tmpfs /tmp tmpfs defaults,noatime,mode=1777 0 0
npm/yarn cache или /var/cache/pacman) в tmpfs.
tmpfs /var/cache tmpfs defaults,noatime,size=2G 0 0
build/ в RAM:
mount -t tmpfs -o size=4G tmpfs ./build
Ограничение по размеру
Размер tmpfs можно задавать вручную (size=1G), иначе по умолчанию он занимает до половины ОЗУ.
#linux #SSD
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤1
Когда нужно объединить несколько сетевых интерфейсов в один для повышения отказоустойчивости или производительности, в linux есть два основных механизма: bonding и teaming. Оба решают схожие задачи, но работают по-разному.
Основные режимы работы:
Проверенный и стабильный инструмент.
Поддерживается почти во всех дистрибутивах.
Большой выбор режимов.
Ограниченная масштабируемость.
Более тяжелое ядро-зависимое решение (модуль ядра).
Настройка чуть менее гибкая.
Особенности:
Гибкая настройка (json + плагины).
Легче масштабировать и управлять.
Мониторинг и логика вынесены в userspace (а не только ядро).
Более сложный для "быстрых правок".
В некоторых дистрибутивах bonding до сих пор по умолчанию используется чаще.
Если у вас традиционная инфраструктура (например, debian, старые centOS, небольшие серверы) - проще использовать bonding: он доступен сразу и без лишних зависимостей.
Если вы работаете с современными centOS или хотите больше гибкости (например, интеграцию с NetworkManager, плагины, мониторинг линков) - выбирайте teaming.
#network
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤2
Иногда нужно быстро передать файлы по сети, без заморочек с настройкой SMB или FTP. Для этого есть два простых инструмента - один для linux, другой для windows.
В современных дистрибутивах Python уже установлен, так что все сводится к одной команде:
cd /var/log
python3 -m http.server 8181
Открываем браузер, заходим на IP-адрес сервера с портом 8181 и сразу видим содержимое директории.
Файлы скачали - сервер остановили. Удобно и быстро.
Для Windows есть проверенное решение - HFS.
Это небольшой исполняемый файл, который работает на любой версии windows, включая 11. Скачали → запустили → открыли в браузере IP машины.
HFS позволяет публиковать как целые директории, так и отдельные файлы, просто перетащив их в окно программы. В отличие от SMB, который постоянно требует возни с версиями протокола и учетками, HFS работает «из коробки».
▪️ Дополнительные возможности HFS:📍 аутентификация пользователей;📍 логирование;📍 кастомизация внешнего вида через HTML-шаблоны;📍 контроль пропускной способности;📍 работа в фоне.
Программа бесплатна и с открытым исходным кодом.
#linux #windows #tools
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤1
Если раньше для просмотра базовой информации о linux системе приходилось использовать целый набор команд вроде:
lsb_release -a
uname -a
cat /etc/os-release
cat /etc/redhat-release
- то теперь достаточно одной:
hostnamectl
Static hostname: networkadmin.ru
Icon name: computer-vm
Chassis: vm
Machine ID: ---
Boot ID: ---
Virtualization: microsoft
Operating System: Debian GNU
Kernel: Linux ---
Architecture: x86-64
Что можно увидеть
Имя хоста (static/pretty/текущее)
ОС и версия дистрибутива
Версия ядра
Аппаратная информация (chassis, архитектура)
Виртуализация или контейнеризация (VM или Docker/LXC/OpenVZ)
Machine ID и Boot ID - полезно при отладке и мониторинге
Также с помощью hostnamectl можно не только смотреть информацию, но и менять имя сервера:
hostnamectl set-hostname myserver
Изменения применяются сразу и сохраняются после перезагрузки.
#hostnamectl
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤6
В Linux есть подсистема ядра -
inotify, которая умеет отслеживать изменения в файловой системе и выдавать уведомления о событиях (создание, удаление, обновление файлов и каталогов). Для работы можно воспользоваться утилитой fswatch, которая доступна почти во всех популярных ОС. В linux под капотом она использует именно inotify.
apt install fswatch
Запуск простого мониторинга за директорией /tmp:
fswatch /tmp
Но в таком виде вывод слишком сырой. Можно сразу добавить ключи:
-x - отображать тип событий
-t - выводить временные метки
fswatch -x -t /tmp
В одной консоли запускаем fswatch, а в другой пробуем:
echo '123' > /tmp/file.txt
rm /tmp/file.txt
В логах получаем:
28 Sep 2025 23:27:20 MSK /tmp/file.txt Created
28 Sep 2025 23:27:20 MSK /tmp/file.txt Updated
28 Sep 2025 23:27:35 MSK /tmp/file.txt Removed
Мониторинг можно запустить в фоне:
fswatch -x -t /tmp >> /var/log/fswatch.log &
или добавить автозапуск через cron:
@reboot fswatch -x -t /tmp >> /var/log/fswatch.log &
Более надёжный способ - оформить как сервис systemd:
/etc/systemd/system/fswatch.service
[Unit]
Denoscription=fswatch file monitor
[Service]
ExecStart=/usr/bin/fswatch -x -t /tmp
[Install]
WantedBy=multi-user.target
Запуск:
systemctl enable --now fswatch.service
journalctl -u fswatch.service
Можно отфильтровать конкретные типы событий, например, только удаление:
fswatch --event Removed -x -t /tmp
#inotify #fswatch
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤2
tcpdump - один из самых используемых инструментов для анализа сетевого трафика прямо в консоли. С его помощью можно не только снять дамп, но и отфильтровать нужные пакеты, чтобы не утонуть в гигабайтах логов.
tcpdump -i eth0
Смотрим весь трафик интерфейса eth0. Часто этого уже достаточно для первичной диагностики.
tcpdump host 192.168.1.10
Только пакеты от/к указанному IP.
tcpdump port 22
Видим весь SSH-трафик.
tcpdump src host 10.0.0.5
tcpdump dst port 80
tcpdump src host 192.168.1.100 and port 443
tcpdump not port 22
tcpdump icmp
tcpdump tcp
tcpdump udp
tcpdump -i eth0 tcp port 80 -A
Ключ -A выводит полезную нагрузку пакетов в ASCII. Удобно, если нужно подсмотреть запросы.
tcpdump -i eth0 tcp port 443 -vvv
С подробной детализацией можно увидеть домены, к которым идёт подключение.
tcpdump -i eth0 udp port 53
tcpdump -i eth0 -w dump.pcap
А потом открыть dump.pcap в Wireshark.
tcpdump -c 100 -i eth0
Собираем только первые 100 пакетов.
Используйте -nn - чтобы ip-адреса и порты не переводились в имена (ускоряет работу).
-vvv - максимально подробный вывод.
Для длительного мониторинга всегда сохраняйте в файл (-w) и анализируйте в wireshark или tshark.
#linux #tcpdump
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤1🔥1
Please open Telegram to view this post
VIEW IN TELEGRAM
😁18❤5🔥2
Часто возникает ситуация: программа подвисает, работает странно или вообще не запускается. В таких случаях на помощь приходят два инструмента -
strace и ltrace. Оба они позволяют заглянуть внутрь процесса, но делают это на разных уровнях.
strace ls /nonexistent
Вывод покажет, что ls пытается открыть директорию и получает ENOENT (нет такого файла).
strace -p 1234
Теперь видно, чем занимается процесс с PID 1234.
strace -e open,read,write -p 1234
Будут показаны только вызовы open, read, write.
ltrace ls
Вы увидите вызовы функций вроде malloc(), strlen(), fopen().
ltrace -e malloc,free ./myprog
Будут показаны только вызовы функций управления памятью.
strace → понять, что происходит на уровне системных вызовов (например, программа не может открыть файл из-за прав).
ltrace → отследить логику внутри библиотек (например, неверно передаются параметры в функцию).
strace -p <PID>
Сразу видно, ждёт ли программа I/O или зациклилась.
strace ./prog 2>&1 | grep ENOENT
Можно увидеть, какой именно файл не удаётся открыть.
ltrace -e malloc,free ./prog
Если много malloc(), но мало free() - повод задуматься.
#linux #debug
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤1
На первый взгляд, копирование файлов в linux выглядит элементарной задачей. Но если копать глубже, у команды cp есть несколько нюансов, которые легко могут привести к неожиданному результату.
cp /dir_a/* /dir_b
Кажется логичным, но так скопируются только файлы верхнего уровня, без вложенных директорий. Чтобы взять все целиком (с поддиректориями и атрибутами), используем:
cp -a /dir_a/* /dir_b
Ключ -a = рекурсия + права доступа + даты + симлинки. В общем, максимально правильное копирование.
Звездочка раскрывается в bash. Символ * обрабатывает сама оболочка, а не cp. То есть bash разворачивает список файлов и передаёт их в виде длинной команды:
cp -a /dir_a/file1 /dir_a/file2 ... /dir_b
Если файлов слишком много - можно упереться в ограничение длины команды.
Скрытые файлы теряются. Файлы, начинающиеся с точки (.htaccess, .env и т.п.), по умолчанию не попадут в *. В результате копирование окажется не точным.
Пустая директория = ошибка. Если в исходной папке нет файлов, то * не развернётся, и cp просто вернет ошибку.
cp -aT /dir_a /dir_b
Здесь:
-a - копирование со всеми атрибутами
-T - воспринимать /dir_b как саму директорию назначения, а не поддиректорию внутри неё
Таким образом, копирование отрабатывает корректно: и вложенные каталоги, и скрытые файлы будут на месте.
#linux #cp
Please open Telegram to view this post
VIEW IN TELEGRAM
👍24❤2🔥1😱1👌1
Swap в linux играет роль страховочного пространства на диске для выгрузки неиспользуемых страниц памяти. Но работать с ним можно по-разному: от полного отключения до использования современных технологий сжатия. Разберем основные практики.
swapon --show
free -h
swapoff -a
Чтобы выключить swap навсегда - закомментируйте его строки в
/etc/fstab.
# swapon /swapfile --priority 100
Текущие приоритеты видно в выводе
swapon --show.0 - максимально избегать использования swap.
60 (по умолчанию) - сбалансированный вариант.
100 - активно выгружать память в swap.
Пример настройки:
sysctl -w vm.swappiness=10
Для постоянного применения добавьте в
/etc/sysctl.conf:
vm.swappiness=10
Активация через параметры ядра:
zswap.enabled=1
Установка и включение в Debian/Ubuntu:
apt install zram-tools
systemctl enable --now zramswap.service
#linux #swap
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14
Когда речь заходит о работе с внешними или сетевыми хранилищами, важно проверять, что файловая система действительно подключена и смонтирована. В Linux для этого есть две удобные утилиты -
findmnt и findfs.
findmnt -x
Success, no errors or warnings detected
Если в конфигурации есть ошибка - получите подробное сообщение:
findmnt -x
/mnt/backup
[E] unreachable on boot required source: UUID=151ea24d-977a-412c-818f-0d374baa5012
Также можно проверять наличие конкретной точки монтирования:
if findmnt -rno TARGET "$1" >/dev/null; then
echo "$1 mounted."
else
echo "$1 not mounted."
fi
findfs "UUID=151ea24d-977a-412c-818f-0d374baa5013"
/dev/sda2
Выходной код тоже полезен в скриптах:
0 → устройство найдено
1 → файловая система не найдена
if findfs "UUID=$1" >/dev/null; then
echo "$1 connected."
else
echo "$1 not connected."
fi
Если не проверить подключение, легко попасть в неприятную ситуацию:
бэкап или копирование пойдет не на внешний диск, а в локальную систему;
место на корневом разделе быстро закончится;
при монтировании обратно старые файлы могут спрятаться за точкой монтирования.
#findmnt #findfs
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
Когда в скрипте что-то идет не так, часто хочется понять, какая команда выполнилась последней и какие значения получили переменные. Вместо того чтобы расставлять десятки echo, в bash есть встроенный инструмент -
set -x.Если указать его в начале скрипта, оболочка начнет печатать в консоль каждую выполняемую команду с подставленными значениями переменных. Перед строкой появляется символ +, что делает разбор вывода наглядным.
Создадим простой скрипт, который проверяет наличие файла и копирует его в директорию резервных копий:
#!/bin/bash
set -x
src="/etc/hosts"
dst="/tmp/backup"
mkdir -p "$dst"
timestamp=$(date +%Y%m%d_%H%M%S)
cp "$src" "$dst/hosts_$timestamp"
echo "Backup created: $dst/hosts_$timestamp"
Вывод консоли:
▶ Запуск
# ./backup.sh
+ src=/etc/hosts
+ dst=/tmp/backup
+ mkdir -p /tmp/backup
+ date +%Y%m%d_%H%M%S
+ timestamp=20251007_121330
+ cp /etc/hosts /tmp/backup/hosts_20251007_121330
+ echo 'Backup created: /tmp/backup/hosts_20251007_121330'
Backup created: /tmp/backup/hosts_20251007_121330
Мы видим каждое действие: какие переменные подставились, как отработала команда date, куда скопировался файл.
#linux #debug
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤4
Cockpit - это встроенный в современные дистрибутивы инструмент, который превращает сервер в управляемый через браузер интерфейс. Вам больше не нужно все делать вручную в консоли - многие задачи можно выполнять из веб-панели.
debian/ubuntu:
apt install cockpit -y
systemctl enable --now cockpit.socket
RHEL/centOS/fedora:
dnf install cockpit -y
systemctl enable --now cockpit.socket
После этого панель доступна по HTTPS на порту 9090:
https://IP-сервера:9090Авторизация выполняется через обычный системный логин и пароль.
Мониторинг ресурсов (CPU, RAM, диски, сеть) в реальном времени
Управление сервисами systemd (запуск, остановка, перезапуск)
Просмотр логов journald
Управление пользователями и правами
Настройка сетевых интерфейсов и firewall
Работа с дисками, RAID и LVM
Подключение Docker/Kubernetes для управления контейнерами
Возможность администрировать несколько серверов через одну панель
Минимальная настройка: поставил и сразу работает.
Не требует сторонних агентов - все идет через systemd и встроенные механизмы.
Легко интегрируется с SELinux, firewalld и другими системными компонентами.
#linux #cockpit
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15❤3
Обычно мы проверяем состояние конкретной службы:
systemctl status mariadb
Но если запустить без указания сервиса:
systemctl status
то получим сводку по всей системе. Очень полезная штука
Что покажет systemctl status без аргументов:
State - общее состояние (например: running, degraded)
Failed - количество упавших юнитов
Uptime - время работы systemd
Версия systemd
Количество активных units
Дерево зависимостей сервисов в удобном виде
systemctl list-units --failed
Посмотреть детали по конкретному юниту:
systemctl status <unit>
journalctl -u <unit>
Пример:
systemctl status
Вывод:
State: degraded
Failed: 1 units
Проверяем, что упало:
systemctl list-units --failed
например, systemd-modules-load.service.
Дальше копаемся в логах:
journalctl -u systemd-modules-load.service
systemctl status → быстрый обзор состояния системы.
systemctl list-units --failed → список проблемных юнитов.
journalctl -u <unit> → подробные логи конкретной службы.
#linux #systemctl
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤2
Админы, привыкшие к bash и linux, часто недооценивают powershell. А зря - это также неплохая оболочка, которая умеет не только выполнять команды, но и работать с объектами, сервисами и API windows. Ниже несколько полезных сценариев, которые пригодятся, если админите и linux, и windows.
# Процессы по имени
Get-Process | Where-Object { $_.ProcessName -like "*chrome*" }
# Открытые TCP-порты
Get-NetTCPConnection | Where-Object { $_.State -eq "Listen" }
# Найти все *.log файлы и удалить старше 7 дней
Get-ChildItem -Path "C:\Logs" -Filter *.log -Recurse |
Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-7) } |
Remove-Item -Force
$hosts = "8.8.8.8","1.1.1.1","networkadmin.ru"
foreach ($h in $hosts) {
Test-Connection -ComputerName $h -Count 2 -Quiet |
ForEach-Object { "$h -> $($_ -replace 'True','OK' -replace 'False','Fail')" }
}
# Проверить статус службы
Get-Service -Name "Spooler"
# Перезапустить службу
Restart-Service -Name "Spooler"
Invoke-RestMethod -Uri "https://api.ipify.org?format=json"
# Системная информация
Get-ComputerInfo | Select-Object CsName, WindowsVersion, OsArchitecture
# Диски
Get-PSDrive -PSProvider FileSystem
#powershell #windows
Please open Telegram to view this post
VIEW IN TELEGRAM
❤13👍2🔥2