Например, сетевое пространство имён (network namespace) изолирует сетевой стек контейнера, а пара виртуальных сетевых интерфейсов veth соединяет его с основной сетью Linux через виртуальный мост (Linux Bridge).
На картинке наглядно показано, как устроены сетевые пространства имён, veth-пары, сетевые мосты, маршрутизация, NAT и проброс портов.
Сохрани, чтобы не потерять!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14❤11🔥8
Например,
ssh -L позволяет открыть локальный порт и через SSH получить доступ к сервису на удалённом сервере, а ssh -R работает в обратную сторону — открывает порт на удалённой стороне и направляет трафик к вашему локальному сервису.На картинке наглядно разобраны 4 частых сценария: локальный проброс, доступ через bastion-сервер, удалённый проброс и reverse-туннель через gateway.
Сохрани, чтобы не потерять!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍27🔥9❤6
Linux умеет автоматически запускать команду после изменения файла без бесконечных циклов и ручных проверок!
Частая задача при разработке: изменить код, дождаться сборки, проверить тесты, обновить конфигурацию.
Обычно для этого пишут циклы с
Утилита
Теперь после каждого изменения Go-файла тесты автоматически запускаются заново.
Можно следить за целым проектом:
После сохранения JavaScript-файла сборка будет выполнена автоматически.
Можно использовать это и для серверных задач:
Изменили конфигурацию — сервис сразу получил обновление без ручного запуска команды.
🔥 В отличие от постоянных циклов,
🚪 Linux Ready | #совет
Частая задача при разработке: изменить код, дождаться сборки, проверить тесты, обновить конфигурацию.
Обычно для этого пишут циклы с
while, используют таймеры или устанавливают тяжёлые системы отслеживания изменений.Утилита
entr делает это проще:$ ls *.go | entr go test ./...
Теперь после каждого изменения Go-файла тесты автоматически запускаются заново.
Можно следить за целым проектом:
$ find . -name "*.js" | entr npm run build
После сохранения JavaScript-файла сборка будет выполнена автоматически.
Можно использовать это и для серверных задач:
$ echo nginx.conf | entr sudo systemctl reload nginx
Изменили конфигурацию — сервис сразу получил обновление без ручного запуска команды.
entr использует системные механизмы уведомления об изменениях файлов и не нагружает процессор постоянным опросом.Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🔥11❤6🤝1
В этой статье:
• Узнаете, как быстро найти файлы и директории, которые занимают больше всего места;• Разберёте инструменты для проверки скорости диска и поиска процессов, создающих высокую нагрузку;• Познакомитесь с утилитами для очистки дублей, передачи файлов и синхронизации данных с облаками.🔊 Продолжай читать на Habr!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤9🔥4🤝2
Например,
SOCK_STREAM используется для потоковых соединений вроде TCP, а SOCK_DGRAM — для передачи отдельных датаграмм, например через UDP.На картинке — наглядная схема работы сетевых и Unix domain sockets:
AF_INET, AF_INET6, AF_UNIX, различия между stream и datagram-сокетами, а также базовый обмен данными между клиентом и сервером.Сохрани, чтобы не потерять!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12❤7🔥5🤝2
This media is not supported in your browser
VIEW IN TELEGRAM
Здесь собраны заметки и команды по работе с Linux: Shell и SSH, файловая система и LVM, права доступа, grep, sed и Vim, сеть, systemd, переменные окружения, безопасность, DEB/RPM-пакеты, ядро и Bash-скрипты. Есть отдельные материалы по Docker, сборке программ через CMake и Autotools, отладке с GDB и другим системным инструментам.
Оставляю ссылочку: GitHub📱
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥8❤4🤝2
Почему TCP подключается, но передача данных зависает?
TCP-соединение может успешно устанавливаться, хотя передача данных по нему работает нестабильно. Характерные симптомы — зависание SSH, HTTP-запросов и загрузок после начала передачи более крупных TCP-сегментов.
Одна из возможных причин — проблема с определением MTU на всём пути передачи. Сначала проверим MTU физических и виртуальных интерфейсов:
MTU интерфейса и MTU всего маршрута — разные параметры. Интерфейс может иметь MTU 1500, тогда как VPN, VXLAN, GRE, IPsec, PPPoE или другой участок маршрута ограничивает максимальный размер проходящего IP-пакета.
Для IPv4 проверим прохождение пакета размером 1500 байт с запретом фрагментации:
Если ядру уже известен меньший MTU маршрута, можно получить локальную ошибку:
MTU маршрута также может быть уменьшен после получения ICMP
Если такие ICMP-сообщения фильтруются, отправитель может не узнать, что размер пакета необходимо уменьшить. Крупные пакеты будут отбрасываться, а небольшие продолжат проходить.
При необходимости можно выполнить проверку без учёта сохранённого ядром MTU маршрута:
Найти приблизительную границу можно последовательной проверкой:
Например, если максимальный рабочий размер данных ICMP равен 1372 байтам:
Предполагаемый MTU маршрута — 1400 байт. При этом он может различаться в прямом и обратном направлениях, поэтому при возможности проверяйте соединение с обеих сторон.
Дополнительно проверим маршрут:
Для TCP важен MSS — максимальный размер данных TCP, который сторона сообщает другой стороне. MSS объявляется независимо в SYN и SYN-ACK, поэтому значения могут отличаться. Посмотреть MSS при установлении соединения:
При IPv4 MTU 1500 типичный MSS:
Если реальный MTU маршрута меньше, а его определение работает некорректно — например, ICMP
Состояние TCP-соединения проверим через:
Смотрим RTT,
Ищем повторные передачи TCP-сегментов и ICMP
При подтверждённой проблеме не стоит произвольно уменьшать MTU на конечном сервере. Проверьте MTU туннелей, фильтрацию ICMP и конфигурацию наложенной сети. Ограничение TCP MSS также может применяться на маршрутизаторах и VPN-шлюзах, но только как осознанное решение конкретной проблемы.
🔥 Главный вывод будет такой: успешное установление TCP-соединения не гарантирует нормальную передачу данных. Если небольшие пакеты проходят, а крупные теряются — проверяйте MTU маршрута, MSS, ICMP и повторные передачи TCP.
🚪 Linux Ready | #практика
TCP-соединение может успешно устанавливаться, хотя передача данных по нему работает нестабильно. Характерные симптомы — зависание SSH, HTTP-запросов и загрузок после начала передачи более крупных TCP-сегментов.
Одна из возможных причин — проблема с определением MTU на всём пути передачи. Сначала проверим MTU физических и виртуальных интерфейсов:
ip -br link
ip link show eth0
ip link show wg0
ip link show tun0
ip link show docker0
MTU интерфейса и MTU всего маршрута — разные параметры. Интерфейс может иметь MTU 1500, тогда как VPN, VXLAN, GRE, IPsec, PPPoE или другой участок маршрута ограничивает максимальный размер проходящего IP-пакета.
Для IPv4 проверим прохождение пакета размером 1500 байт с запретом фрагментации:
ping -4 -M do -s 1472 server_ip
1472 — данные ICMP. Плюс 20 байт заголовка IPv4 и 8 байт ICMP — получаем IP-пакет размером 1500 байт.Если ядру уже известен меньший MTU маршрута, можно получить локальную ошибку:
ping: local error: message too long, mtu=1400
MTU маршрута также может быть уменьшен после получения ICMP
Fragmentation Needed от маршрутизатора.Если такие ICMP-сообщения фильтруются, отправитель может не узнать, что размер пакета необходимо уменьшить. Крупные пакеты будут отбрасываться, а небольшие продолжат проходить.
При необходимости можно выполнить проверку без учёта сохранённого ядром MTU маршрута:
ping -4 -M probe -s 1472 server_ip
Найти приблизительную границу можно последовательной проверкой:
for size in 1472 1452 1440 1420 1400 1380 1372; do
ping -4 -M do -c 3 -s "$size" server_ip
done
Например, если максимальный рабочий размер данных ICMP равен 1372 байтам:
1372 + 20 IPv4 + 8 ICMP = 1400
Предполагаемый MTU маршрута — 1400 байт. При этом он может различаться в прямом и обратном направлениях, поэтому при возможности проверяйте соединение с обеих сторон.
Дополнительно проверим маршрут:
tracepath server_ip
Для TCP важен MSS — максимальный размер данных TCP, который сторона сообщает другой стороне. MSS объявляется независимо в SYN и SYN-ACK, поэтому значения могут отличаться. Посмотреть MSS при установлении соединения:
tcpdump -i any -nn -vv 'tcp[tcpflags] & tcp-syn != 0'
При IPv4 MTU 1500 типичный MSS:
1500 - 20 IPv4 - 20 TCP = 1460
Если реальный MTU маршрута меньше, а его определение работает некорректно — например, ICMP
Fragmentation Needed блокируется — крупные пакеты могут теряться, вызывая повторные передачи и зависание соединения.Состояние TCP-соединения проверим через:
ss -ti dst server_ip
Смотрим RTT,
mss, advmss, окно перегрузки и повторные передачи. Одновременно можно анализировать TCP и ICMP:tcpdump -i any -nn -vv 'tcp or icmp'
Ищем повторные передачи TCP-сегментов и ICMP
Fragmentation Needed. Успешный обычный ping здесь ничего не доказывает: небольшие ICMP-пакеты могут проходить даже при меньшем MTU маршрута. По той же причине TCP-соединение может успешно устанавливаться — SYN, SYN-ACK и ACK имеют небольшой размер.При подтверждённой проблеме не стоит произвольно уменьшать MTU на конечном сервере. Проверьте MTU туннелей, фильтрацию ICMP и конфигурацию наложенной сети. Ограничение TCP MSS также может применяться на маршрутизаторах и VPN-шлюзах, но только как осознанное решение конкретной проблемы.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21🔥10❤7🤝1
This media is not supported in your browser
VIEW IN TELEGRAM
Здесь собраны команды, инструкции и примеры по управлению процессами и пользователями, правам доступа, Bash и SSH, systemd и
cron, логам и мониторингу, сетям, дискам и диагностике системы. Отдельно разобрана работа с ps, systemctl, journalctl, nmcli, apt, yum, LVM и другими системными инструментами. Полезный справочник для изучения Linux и работы с серверами.Оставляю ссылочку: GitHub📱
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥9🤝5❤2
Например,
i включает режим вставки текста, dd удаляет текущую строку, а :wq сохраняет изменения и закрывает редактор.На картинке — основные режимы и самые нужные команды Vim для навигации, редактирования, поиска, сохранения и выхода.
Сохрани, чтобы не потерять!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15❤11🔥8👎1
Отслеживаем изменения файлов через inotifywait!
При диагностике приложения, деплоя или скрипта полезно видеть файловую активность в реальном времени: создание, изменение, удаление и перемещение файлов. В Linux такие события можно отслеживать через
В Debian и Ubuntu утилита устанавливается из стандартных репозиториев:
Запустим непрерывное наблюдение за каталогом. Параметр
События выводятся по мере их получения от ядра:
Для наблюдения за всем деревом каталогов добавим
Параметр
Для диагностики удобнее выводить время, тип события и путь объекта:
При использовании абсолютного пути
Следует учитывать, что одно действие приложения может породить несколько событий
🔥
🚪 Linux Ready | #практика
При диагностике приложения, деплоя или скрипта полезно видеть файловую активность в реальном времени: создание, изменение, удаление и перемещение файлов. В Linux такие события можно отслеживать через
inotify, а из командной строки — с помощью inotifywait.В Debian и Ubuntu утилита устанавливается из стандартных репозиториев:
sudo apt update && sudo apt install -y inotify-tools
Запустим непрерывное наблюдение за каталогом. Параметр
-m (--monitor) оставляет процесс активным после получения события:inotifywait -m /var/www/app
События выводятся по мере их получения от ядра:
/var/www/app/ MODIFY config.json
/var/www/app/ CREATE cache.tmp
/var/www/app/ DELETE cache.tmp
Для наблюдения за всем деревом каталогов добавим
-r (--recursive):inotifywait -m -r /var/www/app
Параметр
-e позволяет оставить только нужные события. move включает события перемещения из наблюдаемого каталога и в него:inotifywait -m -r \
-e create,modify,delete,move \
/var/www/app
Для диагностики удобнее выводить время, тип события и путь объекта:
inotifywait -m -r \
--timefmt '%H:%M:%S' \
--format '%T %e %w%f' \
/var/www/app
При использовании абсолютного пути
%w%f формирует полный путь к объекту:14:32:07 MODIFY /var/www/app/config.json
14:32:11 MOVED_TO /var/www/app/releases/current
Следует учитывать, что одно действие приложения может породить несколько событий
inotify, а рекурсивное наблюдение создаёт отдельные watches для дерева каталогов. Текущий системный лимит можно проверить через sysctl:sysctl fs.inotify.max_user_watches
inotify фиксирует события файловой системы, но не сообщает PID процесса, который инициировал изменение. Если требуется определить конкретный процесс или пользователя, следует использовать механизмы аудита, например auditd.Please open Telegram to view this post
VIEW IN TELEGRAM
👍20🔥7❤6
В этой статье:
• Узнаете, почему даже регулярно создаваемые бэкапы могут оказаться бесполезными в критический момент;• Разберёте проверку целостности, тестовое восстановление и мониторинг резервных копий;• Посмотрите, как правильно проверять бэкапы файлов и баз данных PostgreSQL и MySQL.🔊 Продолжай читать на Habr!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤11👍11🔥7👎1
Знали, что в Git можно одновременно работать с несколькими ветками без постоянного переключения между ними?
Обычно при переключении между задачами приходится сохранять изменения, менять ветку и возвращаться обратно.
Теперь рядом находятся два независимых каталога:
В одном можно продолжать разработку, а во втором открыть срочный
Каждая директория имеет собственное состояние файлов, но использует общую историю, объекты и ветки Git.
Посмотреть все активные рабочие каталоги:
После завершения задачи дополнительную копию можно удалить:
🔥
🚪 Linux Ready | #совет
Обычно при переключении между задачами приходится сохранять изменения, менять ветку и возвращаться обратно.
git worktree создаёт дополнительную рабочую копию репозитория, которая использует тот же .git:git worktree add ../feature-login feature/login
Теперь рядом находятся два независимых каталога:
project/
project-feature-login/
В одном можно продолжать разработку, а во втором открыть срочный
hotfix:git worktree add ../hotfix main
Каждая директория имеет собственное состояние файлов, но использует общую историю, объекты и ветки Git.
Посмотреть все активные рабочие каталоги:
git worktree list
После завершения задачи дополнительную копию можно удалить:
git worktree remove ../hotfix
git worktree избавляет от постоянного сохранения временных изменений и переключения между ветками. Полезно, когда одновременно ведутся несколько задач или нужно срочно исправить баг.Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥8❤7
Когда системный диск заканчивается, данные приложения можно перенести на другое хранилище, сохранив прежний путь для сервисов и скриптов.
Bind mount позволяет сделать это средствами Linux без symlink и изменений в конфигурации приложения.В этом посте:
• Переносим данные через rsync с сохранением ACL, xattrs и hard links;
• Переключаем каталог на новое хранилище через mount --bind;
• Проверяем фактическую точку монтирования с помощью findmnt;
• Закрепляем bind mount в /etc/fstab после перезагрузки.
Bind mount отделяет путь, с которым работает приложение, от физического расположения данных — удобный приём для миграции каталогов между дисками и файловыми системами.Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19🔥8🤝4❤3
Например, цепочка
INPUT обрабатывает пакеты, предназначенные локальной машине, FORWARD — транзитный трафик, а через PREROUTING и POSTROUTING удобно понимать, где выполняется NAT.На картинке — основные таблицы и цепочки
iptables, маршруты входящих, исходящих и транзитных пакетов, а также примеры SSH, DNAT и MASQUERADE.Сохрани, чтобы не потерять!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥17👍10❤9
Например, BIOS/UEFI инициализирует оборудование, загрузчик GRUB запускает ядро, а
systemd поднимает системные сервисы и переводит систему в нужный target.На картинке — основные этапы загрузки: BIOS/UEFI, GRUB, ядро,
systemd, уровни загрузки, важные системные файлы, параметры ядра, полезные команды и типичные проблемы при запуске системы. Сохрани, чтобы не потерять!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤15🤝9👍7🔥2
Знали, что git diff умеет сравнивать вообще любые файлы и каталоги — даже если они никогда не находились в Git?
Для этого есть малоиспользуемый режим
Это удобно при разборе двух распакованных сборок, сгенерированных конфигураций или результатов работы программы:
Можно использовать и для отдельных файлов:
Есть важная деталь для скриптов: при найденных различиях команда завершается с кодом 1, а при полном совпадении — 0. Поэтому 1 здесь не означает обычную ошибку выполнения.
🔥 Если нужен
🚪 Linux Ready | #совет
Для этого есть малоиспользуемый режим
--no-index:git diff --no-index ./release-old ./release-new
Git рекурсивно сравнит два каталога и покажет привычный цветной diff с именами файлов и изменёнными строками. Репозиторий для этого не нужен.Это удобно при разборе двух распакованных сборок, сгенерированных конфигураций или результатов работы программы:
git diff --no-index \
/tmp/output-before \
/tmp/output-after
Можно использовать и для отдельных файлов:
git diff --no-index nginx.conf.old nginx.conf.new
Есть важная деталь для скриптов: при найденных различиях команда завершается с кодом 1, а при полном совпадении — 0. Поэтому 1 здесь не означает обычную ошибку выполнения.
git diff --no-index old/ new/
echo $?
diff двух произвольных каталогов, возможно, привычный интерфейс Git уже умеет именно то, что нужно.Please open Telegram to view this post
VIEW IN TELEGRAM
❤11👍8🤝3