systemd-delta: как найти, чем на самом деле переопределён unit
Иногда вы открываете unit-файл и видите одну конфигурацию, а systemd ведёт себя иначе.
Причина часто в drop-in override, созданном через
Например, основной unit:
а дополнительная настройка лежит здесь:
▪️ Посмотреть переопределения
Команда показывает отличия между vendor-конфигурацией и локальными изменениями.
Можно проверить конкретный unit:
Если сервис был переопределён, вы увидите соответствующий drop-in.
▪️ Почему это важно
Допустим, в основном unit указано:
Открыв только
systemd при запуске учитывает оба слоя.
▪️ Посмотреть итоговую конфигурацию
Для проверки того, что systemd реально использует:
Например:
А список связанных drop-in можно увидеть так:
Здесь systemd покажет основной unit и применённые drop-in-файлы.
▪️ Практический сценарий
Сервис неожиданно перезапускается:
В основном unit
Вместо того чтобы сразу менять конфигурацию, проверяем:
И обнаруживаем старый override:
Именно он мог изменить поведение сервиса.
▪️ Важный нюанс
Пакет может заменить vendor unit в
Поэтому при странном поведении unit полезно проверить не только сам файл, но и что поверх него было добавлено или изменено.
BashTex📱 #bash #systemd
Иногда вы открываете unit-файл и видите одну конфигурацию, а systemd ведёт себя иначе.
Причина часто в drop-in override, созданном через
systemctl edit.Например, основной unit:
/usr/lib/systemd/system/nginx.service
а дополнительная настройка лежит здесь:
/etc/systemd/system/nginx.service.d/override.conf
systemd-delta
Команда показывает отличия между vendor-конфигурацией и локальными изменениями.
Можно проверить конкретный unit:
systemd-delta nginx.service
Если сервис был переопределён, вы увидите соответствующий drop-in.
Допустим, в основном unit указано:
[Service]
Restart=no
А где-то в /etc/systemd/system/nginx.service.d/override.conf:
[Service]
Restart=always
Открыв только
/usr/lib/systemd/system/nginx.service, вы будете смотреть на неполную картину.systemd при запуске учитывает оба слоя.
Для проверки того, что systemd реально использует:
systemctl show nginx.service
Например:
systemctl show nginx.service -p Restart -p RestartUSec
А список связанных drop-in можно увидеть так:
systemctl cat nginx.service
Здесь systemd покажет основной unit и применённые drop-in-файлы.
Сервис неожиданно перезапускается:
systemctl status nginx
В основном unit
Restart= не настроен.Вместо того чтобы сразу менять конфигурацию, проверяем:
systemd-delta nginx.service
И обнаруживаем старый override:
/etc/systemd/system/nginx.service.d/override.conf
Именно он мог изменить поведение сервиса.
systemd-delta особенно полезен после обновлений дистрибутива.Пакет может заменить vendor unit в
/usr/lib/systemd/system/, но локальный override в /etc/systemd/system/ продолжит действовать.Поэтому при странном поведении unit полезно проверить не только сам файл, но и что поверх него было добавлено или изменено.
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Please open Telegram to view this post
VIEW IN TELEGRAM
😁8🔥2🗿1
file vs расширение - как Linux определяет тип файла на самом деле
В Linux расширение файла само по себе ничего не определяет.
Для системы:
это просто имена файлов. Можно спокойно сделать:
и содержимое файла от этого никак не изменится.
▪️ Откуда тогда
Утилита
Например:
Даже если файл называется:
file всё равно может определить его как PNG.
▪️ Главный источник - magic bytes
А file сопоставляет такие сигнатуры с базой magic:
и использует правила из базы magic.
▪️ Можно обмануть расширение
Результат всё равно будет примерно таким:
Потому что имя изменилось, а байты остались прежними.
▪️ Но не всё определяется только первыми байтами
Для ELF:
может показать архитектуру, разрядность и тип исполняемого файла.
Для текстовых файлов утилита анализирует содержимое и может определить кодировку, тип текста и другие признаки.
▪️ Практический сценарий
Скачали файл с подозрительным расширением:
Не стоит сразу доверять имени.
Сначала:
А затем, если это бинарник:
или:
Так можно понять, что реально лежит внутри файла.
▪️ Важный нюанс
Если формат не имеет узнаваемой сигнатуры или несколько форматов используют похожую структуру, результат может быть приблизительным.
И ещё важнее: file определяет тип по содержимому, но не говорит, что файл безопасен.
Файл может называться
В Linux расширение - часть имени.
А реальный формат гораздо чаще определяется тем, какие байты находятся внутри файла.
BashTex📱 #bash #systemd
В Linux расширение файла само по себе ничего не определяет.
Для системы:
backup.tar.gz
backup.jpg
backup.txt
это просто имена файлов. Можно спокойно сделать:
mv image.jpg image.txtи содержимое файла от этого никак не изменится.
file знает типУтилита
file смотрит не на расширение, а на содержимое файла.file image.txt
file archive.bin
file unknown
Например:
unknown: PNG image data, 1920 x 1080, 8-bit/color RGB
Даже если файл называется:
photo.txt
file всё равно может определить его как PNG.
Многие форматы имеют характерную сигнатуру в начале файла.
Например, PNG начинается с:
89 50 4e 47 0d 0a 1a 0a
Проверить первые байты можно:
xxd -l 16 photo.png
А file сопоставляет такие сигнатуры с базой magic:
file --version
и использует правила из базы magic.
cp image.png document.txt
file document.txt
Результат всё равно будет примерно таким:
document.txt: PNG image data
Потому что имя изменилось, а байты остались прежними.
file может анализировать не только сигнатуру.Для ELF:
file /bin/ls
может показать архитектуру, разрядность и тип исполняемого файла.
Для текстовых файлов утилита анализирует содержимое и может определить кодировку, тип текста и другие признаки.
Скачали файл с подозрительным расширением:
download.exe
Не стоит сразу доверять имени.
Сначала:
file download.exe
А затем, если это бинарник:
readelf -h download.exe
или:
xxd -l 32 download.exe
Так можно понять, что реально лежит внутри файла.
file не является универсальным детектором содержимого.Если формат не имеет узнаваемой сигнатуры или несколько форматов используют похожую структуру, результат может быть приблизительным.
И ещё важнее: file определяет тип по содержимому, но не говорит, что файл безопасен.
Файл может называться
document.pdf, определяться как PDF и при этом содержать вредоносную нагрузку.В Linux расширение - часть имени.
А реальный формат гораздо чаще определяется тем, какие байты находятся внутри файла.
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
du vs df: почему Linux показывает разный размер диска
Иногда ситуация выглядит странно:
показывает, что занято 80 GB.
А:
находит только 55 GB.
Кажется, что Linux «потерял» 25 GB. На самом деле
▪️ Что считает
Он показывает, сколько места файловая система считает занятым и свободным.
▪️ Что считает
▪️ Одна из главных причин расхождения
Процесс может держать открытым файл, который уже удалили.
Например:
Имя файла исчезло из каталога, но процесс всё ещё держит его открытым.
Для
А файловая система продолжает считать его блоки занятыми.
Проверить:
Можно увидеть что-то вроде:
Пока процесс не закроет этот дескриптор, место может не освободиться.
▪️ Есть и другие причины
Например,
Или часть пространства файловой системы зарезервирована и не доступна обычным пользователям.
Посмотреть файловую систему подробнее:
▪️ Практический сценарий
На сервере внезапно заканчивается место:
Показывает:
Но:
показывает только 70G.
Первое, что стоит проверить:
Если там огромный
▪️ Важный нюанс
«Сколько блоков файловой системы сейчас занято?»
А
«Сколько места занимают доступные мне файлы в этом дереве?»
Поэтому при расхождении
Сначала нужно понять, куда именно делось пространство.
BashTex📱 #bash #systemd
Иногда ситуация выглядит странно:
df -h /
показывает, что занято 80 GB.
А:
du -sh /
находит только 55 GB.
Кажется, что Linux «потерял» 25 GB. На самом деле
du и df измеряют разные вещи.dfdf смотрит на файловую систему и её блоки:df -h /
Он показывает, сколько места файловая система считает занятым и свободным.
dudu обходит дерево каталогов и суммирует пространство, связанное с найденными файлами:du -xhd1 / 2>/dev/null
-x здесь важен: он не позволяет уйти на другие файловые системы.Процесс может держать открытым файл, который уже удалили.
Например:
rm /var/log/app.log
Имя файла исчезло из каталога, но процесс всё ещё держит его открытым.
Для
du такого файла уже не существует.А файловая система продолжает считать его блоки занятыми.
Проверить:
lsof +L1
Можно увидеть что-то вроде:
app 1234 ... /var/log/app.log (deleted)
Пока процесс не закроет этот дескриптор, место может не освободиться.
Например,
du без -x может пересекать mount points и давать неожиданный результат.Или часть пространства файловой системы зарезервирована и не доступна обычным пользователям.
Посмотреть файловую систему подробнее:
findmnt /
df -h /
df -i /
На сервере внезапно заканчивается место:
df -h /
Показывает:
/dev/sda2 100G 95G 5G 95% /
Но:
du -xsh /
показывает только 70G.
Первое, что стоит проверить:
lsof +L1
Если там огромный
(deleted) лог, причина найдена.df отвечает примерно на вопрос:«Сколько блоков файловой системы сейчас занято?»
А
du:«Сколько места занимают доступные мне файлы в этом дереве?»
Поэтому при расхождении
df и du не стоит сразу запускать rm -rf по большим каталогам.Сначала нужно понять, куда именно делось пространство.
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Sparse files: почему файл на 100 ГБ может занимать несколько мегабайт
Размер файла и реально занятое место на диске не всегда совпадают.
Можно создать файл, который логически имеет размер 100 ГБ, но физически занимает всего несколько мегабайт.
Для этого используются sparse files.
▪️ Создаём sparse-файл
Теперь:
покажет:
Но:
может показать всего несколько килобайт.
▪️ Что произошло
Файл содержит большой диапазон нулей, для которого файловая система не обязана физически выделять блоки.
Условно:
Второй вариант показывает размер так, будто sparse-областей нет.
Например:
▪️ Практический сценарий
Есть сервер виртуализации, и администратор видит:
Образы занимают:
Но:
показывает:
Это не обязательно ошибка подсчёта.
Часть образов может быть sparse.
▪️ Важный нюанс
Копирование sparse-файла не всегда сохраняет holes.
Например, некоторые способы копирования могут превратить разреженный файл в обычный и реально записать нулевые блоки.
Проверить результат можно снова через:
Поэтому при работе с большими VM-образами важно различать логический размер файла и реально выделенное дисковое пространство.
BashTex📱 #bash #systemd
Размер файла и реально занятое место на диске не всегда совпадают.
Можно создать файл, который логически имеет размер 100 ГБ, но физически занимает всего несколько мегабайт.
Для этого используются sparse files.
truncate -s 100G test.img
Теперь:
ls -lh test.img
покажет:
-rw-r--r-- 1 user user 100G test.img
Но:
du -h test.img
может показать всего несколько килобайт.
ls смотрит на логический размер, а du - на реально выделенные filesystem blocks.Файл содержит большой диапазон нулей, для которого файловая система не обязана физически выделять блоки.
Условно:
логический файл:
[данные][ огромная область нулей ][данные]
↓ ↓ ↓
блоки hole блоки
Эта незаполненная область называется hole.
▪️Можно посмотреть оба размера
stat test.img
Обратите внимание на:
Size:
Blocks:
Size — логический размер файла.
Blocks — сколько filesystem blocks реально выделено.
▪️Почему это важно
Sparse files часто используются для образов виртуальных машин и контейнеров:
VM disk image → 100 GB
actual allocated space → 12 GB
Пока виртуальная машина не записала данные в свободные области, физическое место не требуется.
Но если эти области постепенно заполняются, реальное потребление диска начинает расти.
▪️Как проверить sparse-файл
du -h test.img
du --apparent-size -h test.img
Второй вариант показывает размер так, будто sparse-областей нет.
Например:
8.0K test.img
100G test.img
Есть сервер виртуализации, и администратор видит:
ls -lh /var/lib/images/*
Образы занимают:
500GНо:
du -sh /var/lib/imagesпоказывает:
180GЭто не обязательно ошибка подсчёта.
Часть образов может быть sparse.
Копирование sparse-файла не всегда сохраняет holes.
Например, некоторые способы копирования могут превратить разреженный файл в обычный и реально записать нулевые блоки.
Проверить результат можно снова через:
du -h file
du --apparent-size -h file
Поэтому при работе с большими VM-образами важно различать логический размер файла и реально выделенное дисковое пространство.
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
inotify vs polling: почему постоянный find может быть плохим мониторингом
Иногда нужно отследить появление нового файла в каталоге.
Самый простой вариант:
А с
Теперь процесс ждёт события вместо постоянного запуска
▪️ Можно сразу обрабатывать новые файлы
Когда файл появляется или перемещается в каталог, вызывается обработчик.
▪️ Почему
При polling:
мы постоянно проверяем состояние файловой системы, даже когда ничего не меняется.
При
процесс большую часть времени просто ожидает событие.
▪️ Но есть важный нюанс
У ядра есть ограничение на очередь событий:
Если приложение не успевает читать события, очередь может переполниться.
Тогда появляется:
И приложение уже не может считать, что знает обо всех произошедших изменениях.
Поэтому для критичных систем иногда нужен дополнительный механизм сверки состояния.
▪️ Практический сценарий
Есть каталог, куда другой сервис складывает файлы:
Вместо постоянного:
можно реагировать непосредственно на
Но если файл сначала создаётся и затем постепенно записывается, одного события создания недостаточно.
Нужно учитывать момент, когда файл полностью готов к обработке.
Именно поэтому в production важно следить не только за самим событием, но и за способом передачи файла.
BashTex📱 #bash #systemd
Иногда нужно отследить появление нового файла в каталоге.
Самый простой вариант:
while true; do
find /var/incoming -type f
sleep 1
done
Работает. Но каждые несколько секунд мы заново обходим каталог, даже если за это время ничего не произошло.
Для событийного мониторинга в Linux есть inotify.
▪️Следим за изменениями без постоянного обхода
Например, с inotifywait:
inotifywait -m /var/incoming
При создании файла можно получить:
/var/incoming/ CREATE report.csv
А с
-e можно ограничить интересующие события:inotifywait -m \
-e create -e moved_to \
/var/incoming
Теперь процесс ждёт события вместо постоянного запуска
find.inotifywait -m -e create -e moved_to --format '%w%f' \
/var/incoming |
while read -r file; do
process "$file"
done
Когда файл появляется или перемещается в каталог, вызывается обработчик.
polling хужеПри polling:
find → sleep → find → sleep → find
мы постоянно проверяем состояние файловой системы, даже когда ничего не меняется.
При
inotify:wait → event → обработка → waitпроцесс большую часть времени просто ожидает событие.
inotify не является очередью событий для бесконечного количества изменений.У ядра есть ограничение на очередь событий:
cat /proc/sys/fs/inotify/max_queued_events
Если приложение не успевает читать события, очередь может переполниться.
Тогда появляется:
IN_Q_OVERFLOW
И приложение уже не может считать, что знает обо всех произошедших изменениях.
Поэтому для критичных систем иногда нужен дополнительный механизм сверки состояния.
Есть каталог, куда другой сервис складывает файлы:
/var/incoming/
Вместо постоянного:
find /var/incoming ...
можно реагировать непосредственно на
CREATE или MOVED_TO.Но если файл сначала создаётся и затем постепенно записывается, одного события создания недостаточно.
Нужно учитывать момент, когда файл полностью готов к обработке.
Именно поэтому в production важно следить не только за самим событием, но и за способом передачи файла.
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Minor и major page fault: почему page fault не всегда означает проблему с диском
Когда процесс обращается к виртуальной памяти, нужная страница не всегда уже находится в памяти именно в том состоянии, которое ожидает процесс.
Тогда возникает page fault - обращение к ядру для обработки этого случая.
Но сам факт page fault ещё не означает, что система полезла на диск.
▪️ Смотрим статистику процесса
Или:
Там можно увидеть количество minor и major faults.
▪️
При minor page fault данные уже находятся в RAM, но процессу нужно, например, создать или настроить соответствующее отображение страницы.
Дисковый I/O для загрузки этой страницы не требуется.
Поэтому большое количество minor faults само по себе не означает медленный диск.
▪️
При major fault для продолжения работы процесса требуется получить данные из более медленного источника, например с диска.
Условно:
Именно major faults интересны при поиске проблем с памятью и I/O.
▪️ Смотрим процесс в реальном времени
Можно увидеть примерно:
Здесь процесс создаёт много minor faults, но major faults нет.
Это совершенно другая ситуация, чем:
Во втором случае часть обращений действительно приводит к ожиданию загрузки данных.
▪️ Практический сценарий
Приложение внезапно начинает тормозить.
Но:
показывает заметный
Тогда стоит дополнительно посмотреть I/O:
Возможно, процесс регулярно ждёт чтения данных со storage.
▪️ Важный нюанс
Не стоит использовать количество page faults как самостоятельную метрику производительности.
Высокий
Гораздо интереснее смотреть на major faults вместе с latency и I/O activity.
То есть:
Сам по себе page fault - это не ошибка. Это механизм, который Linux постоянно использует при работе с виртуальной памятью.
BashTex📱 #bash #systemd
Когда процесс обращается к виртуальной памяти, нужная страница не всегда уже находится в памяти именно в том состоянии, которое ожидает процесс.
Тогда возникает page fault - обращение к ядру для обработки этого случая.
Но сам факт page fault ещё не означает, что система полезла на диск.
ps -o pid,comm,min_flt,maj_flt -p 1234
Или:
pidstat -r -p 1234 1
Там можно увидеть количество minor и major faults.
minor faultПри minor page fault данные уже находятся в RAM, но процессу нужно, например, создать или настроить соответствующее отображение страницы.
Дисковый I/O для загрузки этой страницы не требуется.
Поэтому большое количество minor faults само по себе не означает медленный диск.
major faultПри major fault для продолжения работы процесса требуется получить данные из более медленного источника, например с диска.
Условно:
minor
процесс → kernel → RAM → продолжение
major
процесс → kernel → storage → RAM → продолжение
Именно major faults интересны при поиске проблем с памятью и I/O.
pidstat -r -p 1234 1
Можно увидеть примерно:
PID minflt/s majflt/s
1234 15230.00 0.00
Здесь процесс создаёт много minor faults, но major faults нет.
Это совершенно другая ситуация, чем:
PID minflt/s majflt/s
1234 1200.00 85.00
Во втором случае часть обращений действительно приводит к ожиданию загрузки данных.
Приложение внезапно начинает тормозить.
top показывает:CPU: 20%
RAM: 60%
Но:
pidstat -r -p 1234 1
показывает заметный
majflt/s.Тогда стоит дополнительно посмотреть I/O:
iostat -xz 1
Возможно, процесс регулярно ждёт чтения данных со storage.
Не стоит использовать количество page faults как самостоятельную метрику производительности.
Высокий
minflt/s может быть совершенно нормальным для приложения с определённым характером работы с памятью.Гораздо интереснее смотреть на major faults вместе с latency и I/O activity.
То есть:
page fault
↓
minor или major?
↓
если major → есть ли реальный I/O?
↓
где процесс проводит время?
Сам по себе page fault - это не ошибка. Это механизм, который Linux постоянно использует при работе с виртуальной памятью.
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
nohup vs session vs terminal - что реально происходит после закрытия SSH
Запустили процесс по SSH:
Закрыли SSH-сессию - а потом обнаружили, что процесс исчез.
Почему?
Проблема не в самом SSH. Нужно понимать связь между терминалом, session, shell и сигналами.
▪️ Что происходит при SSH-подключении
Условно:
Shell создаёт процессы в своей session и process group, а SSH предоставляет им псевдотерминал.
Когда соединение закрывается, терминал исчезает. Это может привести к отправке
Именно здесь обычный background-процесс может неожиданно завершиться.
▪️
Это не означает, что процесс переживёт закрытие SSH.
Проверить дерево:
Здесь особенно интересны:
Можно увидеть, к какой session и terminal относится процесс.
▪️ Что делает
Он в первую очередь меняет обработку
Проверить:
Процесс всё ещё может находиться в той же session.
Но получение
▪️ А что такое
Session - это уровень выше process group.
У неё есть лидер - обычно shell, запущенный после входа по SSH.
Посмотреть:
Например:
Оба процесса находятся в одной session, хотя имеют разные process groups.
▪️ Почему
Можно создать новую session:
Теперь процесс не находится в старой session SSH.
Это уже принципиально отличается от простого:
Но для полноценного фонового запуска всё равно нужно учитывать stdin/stdout/stderr и дальнейшее поведение приложения.
▪️ Практический вариант
Если нужен простой запуск долгой команды:
Если нужна полноценная интерактивная среда, которая переживает отключение SSH:
В
▪️ Важный нюанс
Поэтому вопрос «почему процесс умер после выхода из SSH?» лучше начинать не с
Сначала смотрим, к какой session, process group и terminal он вообще был привязан.
BashTex📱 #bash #systemd
Запустили процесс по SSH:
./backup.sh &
Закрыли SSH-сессию - а потом обнаружили, что процесс исчез.
Почему?
Проблема не в самом SSH. Нужно понимать связь между терминалом, session, shell и сигналами.
Условно:
sshd
↓
shell
↓
terminal / PTY
↓
команды
Shell создаёт процессы в своей session и process group, а SSH предоставляет им псевдотерминал.
Когда соединение закрывается, терминал исчезает. Это может привести к отправке
SIGHUP процессам, связанным с терминалом.Именно здесь обычный background-процесс может неожиданно завершиться.
& не делает процесс независимым./backup.sh &
& лишь запускает команду в фоне для текущего shell.Это не означает, что процесс переживёт закрытие SSH.
Проверить дерево:
ps -o pid,ppid,sid,pgid,tty,stat,cmd
Здесь особенно интересны:
PID PPID SID PGID TTY
Можно увидеть, к какой session и terminal относится процесс.
nohupnohup ./backup.sh >backup.log 2>&1 &
nohup не создаёт магическую «вечную» копию процесса.Он в первую очередь меняет обработку
SIGHUP и перенаправляет стандартные потоки, если они всё ещё связаны с терминалом.Проверить:
ps -o pid,ppid,sid,pgid,tty,cmd -p <PID>
Процесс всё ещё может находиться в той же session.
Но получение
SIGHUP уже не должно завершить его обычным способом.sessionSession - это уровень выше process group.
У неё есть лидер - обычно shell, запущенный после входа по SSH.
Посмотреть:
ps -o pid,ppid,sid,pgid,tty,cmd
Например:
PID PPID SID PGID TTY
1000 900 1000 1000 pts/0
1050 1000 1000 1050 pts/0
Оба процесса находятся в одной session, хотя имеют разные process groups.
setsid - это уже другоеМожно создать новую session:
setsid ./backup.sh
Теперь процесс не находится в старой session SSH.
Это уже принципиально отличается от простого:
./backup.sh &
Но для полноценного фонового запуска всё равно нужно учитывать stdin/stdout/stderr и дальнейшее поведение приложения.
Если нужен простой запуск долгой команды:
nohup ./backup.sh </dev/null >backup.log 2>&1 &
Если нужна полноценная интерактивная среда, которая переживает отключение SSH:
tmux
В
tmux процесс продолжает работать внутри отдельной terminal/session среды, а вы можете подключиться к ней позже.nohup, setsid и tmux решают разные задачи.& → background job
nohup → защита от SIGHUP + перенаправление потоков
setsid → новая session
tmux → отдельная управляемая terminal session
Поэтому вопрос «почему процесс умер после выхода из SSH?» лучше начинать не с
nohup, а с:ps -o pid,ppid,sid,pgid,tty,stat,cmd
Сначала смотрим, к какой session, process group и terminal он вообще был привязан.
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
veth - как Linux соединяет два network namespace
Network namespace изолирует сетевой стек процесса. У каждого namespace могут быть свои интерфейсы, маршруты и таблица соседей.
Но как соединить два таких изолированных сетевых мира?
Для этого в Linux есть veth pair - виртуальный Ethernet-кабель с двумя концами.
▪️ Создаём два namespace
Теперь создаём пару:
Получили:
То, что отправлено в один конец, появляется на другом.
▪️ Разносим концы по namespace
Теперь:
В каждом namespace находится только свой конец виртуального кабеля.
▪️ Назначаем адреса
Теперь можно проверить связь:
Пакет проходит примерно так:
Никакого физического интерфейса между namespace здесь нет.
▪️ Почему это используется в контейнерах
Контейнер получает собственный network namespace.
Один конец veth помещается внутрь контейнера:
Второй конец остаётся на host и обычно подключается к Linux bridge.
Например:
Так несколько изолированных namespace получают доступ к одной L2-сети.
▪️ Проверяем, где находится интерфейс
На host:
В namespace:
Можно увидеть, что
▪️ Важный нюанс
Он просто соединяет два сетевых пространства на уровне Ethernet.
Если нужно выйти из namespace в интернет, поверх veth обычно добавляют bridge, routing, NAT или другой сетевой механизм.
То есть
А уже дальше Linux решает, куда отправлять пакеты.
BashTex📱 #bash #systemd
Network namespace изолирует сетевой стек процесса. У каждого namespace могут быть свои интерфейсы, маршруты и таблица соседей.
Но как соединить два таких изолированных сетевых мира?
Для этого в Linux есть veth pair - виртуальный Ethernet-кабель с двумя концами.
ip netns add ns1
ip netns add ns2
Теперь создаём пару:
ip link add veth1 type veth peer name veth2
Получили:
veth1 <──────────> veth2
То, что отправлено в один конец, появляется на другом.
ip link set veth1 netns ns1
ip link set veth2 netns ns2
Теперь:
namespace ns1 namespace ns2
veth1 <──────────> veth2
В каждом namespace находится только свой конец виртуального кабеля.
ip -n ns1 addr add 10.10.0.1/24 dev veth1
ip -n ns2 addr add 10.10.0.2/24 dev veth2
ip -n ns1 link set veth1 up
ip -n ns2 link set veth2 up
Теперь можно проверить связь:
ip netns exec ns1 ping 10.10.0.2
Пакет проходит примерно так:
process
↓
network stack ns1
↓
veth1
↓
veth2
↓
network stack ns2
↓
process
Никакого физического интерфейса между namespace здесь нет.
Контейнер получает собственный network namespace.
Один конец veth помещается внутрь контейнера:
container
eth0
│
│ veth
│
host
Второй конец остаётся на host и обычно подключается к Linux bridge.
Например:
container eth0
│
veth
│
bridge
├── veth
├── veth
└── host
Так несколько изолированных namespace получают доступ к одной L2-сети.
На host:
ip link
В namespace:
ip -n ns1 link
Можно увидеть, что
veth1 и veth2 физически не существуют как один интерфейс — это два связанных виртуальных endpoint’а.veth сам по себе не маршрутизирует трафик.Он просто соединяет два сетевых пространства на уровне Ethernet.
Если нужно выйти из namespace в интернет, поверх veth обычно добавляют bridge, routing, NAT или другой сетевой механизм.
То есть
veth - это буквально виртуальный кабель:namespace A
│
veth A
│
└──────── veth B
│
namespace B
А уже дальше Linux решает, куда отправлять пакеты.
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥1
Почему Permission denied: как найти каталог, на котором ломаются права
Иногда файл имеет правильные права, пользователь состоит в нужной группе, но
Причина может быть выше по пути: чтобы открыть
Разберем, как быстро найти место, где ломается доступ.
1️⃣
В выводе будут отдельно показаны:
Сразу видно, на каком уровне пользователь может упереться в права.
2️⃣ Почему важен
Для каталога
Например:
Файлы внутри могут быть доступны для чтения, но войти в каталог без
Проверить можно:
3️⃣ Проверяем конкретного пользователя
Если доступ должен быть у
А группы:
Это помогает понять, действительно ли процесс запускается с теми группами, которые вы ожидаете.
4️⃣ ACL тоже могут менять картину
Обычных
Там могут быть дополнительные разрешения для конкретного пользователя или группы.
5️⃣ Почему
Команда:
показывает права самого файла.
Но если проблема находится в
Именно поэтому
BashTex📱 #bash #systemd
Иногда файл имеет правильные права, пользователь состоит в нужной группе, но
Permission denied всё равно появляется.Причина может быть выше по пути: чтобы открыть
/var/www/site/config.php, процесс должен иметь право x на каждый каталог в этом пути.Разберем, как быстро найти место, где ломается доступ.
namei показывает права на весь путьnamei -l /var/www/site/config.php
В выводе будут отдельно показаны:
drwxr-xr-x root root /
drwxr-xr-x root root var
drwxr-x--- root www-data www
drwx------ root root site
-rw-r----- root www-data config.php
Сразу видно, на каком уровне пользователь может упереться в права.
x у каталогаДля каталога
x означает не «запуск», а возможность проходить через него и обращаться к объектам внутри.Например:
chmod 644 /var/www/site
Файлы внутри могут быть доступны для чтения, но войти в каталог без
x уже нельзя.Проверить можно:
sudo -u www-data cat /var/www/site/config.php
Если доступ должен быть у
www-data:sudo -u www-data namei -l /var/www/site/config.php
А группы:
id www-data
Это помогает понять, действительно ли процесс запускается с теми группами, которые вы ожидаете.
Обычных
ls -l иногда недостаточно. Проверить ACL:getfacl /var/www/site/config.php
Там могут быть дополнительные разрешения для конкретного пользователя или группы.
ls -l файл не всегда помогаетКоманда:
ls -l /var/www/site/config.php
показывает права самого файла.
Но если проблема находится в
/var/www/site, информация о файле сама по себе этого не объяснит.Именно поэтому
namei -l удобен при странных Permission denied: он показывает всю цепочку каталогов, через которую процесс должен пройти до нужного файла.BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8