NetworkAdmin.ru
4.78K subscribers
224 photos
26 videos
2 files
511 links
Авторский блог про сетевое и системное администрирование.

Сайт: networkadmin.ru
Реклама: @dad_admin
Биржа: https://telega.in/c/networkadminru
Download Telegram
🔄 strace и ltrace: отладка процессов

Часто возникает ситуация: программа подвисает, работает странно или вообще не запускается. В таких случаях на помощь приходят два инструмента - strace и ltrace. Оба они позволяют заглянуть внутрь процесса, но делают это на разных уровнях.

▪️ strace - системные вызовы. strace перехватывает системные вызовы, которые делает процесс, и возвращаемые значения. Это удобно для анализа проблем с доступом к файлам, сетевыми подключениями или зависаниями.

📍 Запуск с приложением:


strace ls /nonexistent


Вывод покажет, что ls пытается открыть директорию и получает ENOENT (нет такого файла).

📍 Подключение к уже работающему процессу:


strace -p 1234


Теперь видно, чем занимается процесс с PID 1234.

📍 Фильтрация вызовов:


strace -e open,read,write -p 1234


Будут показаны только вызовы open, read, write.

▪️ ltrace - вызовы библиотек. Если strace работает с системными вызовами ядра, то ltrace отслеживает вызовы функций библиотек. Это особенно полезно, если программа спотыкается не на уровне ядра, а на уровне glibc или других библиотек.

📍 Пример:


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

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍91
🌟 Подводные камни при копировании файлов в linux

На первый взгляд, копирование файлов в 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

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍252🔥1😱1👌1
ℹ️ Тонкая настройка swap для производительности

Swap в linux играет роль страховочного пространства на диске для выгрузки неиспользуемых страниц памяти. Но работать с ним можно по-разному: от полного отключения до использования современных технологий сжатия. Разберем основные практики.

▪️ Проверка текущего состояния. Посмотреть активные swap-разделы и файлы можно так:


swapon --show
free -h


▪️ Полное отключение swap. Если на сервере достаточно оперативной памяти, swap часто отключают, чтобы избежать лишних задержек:


swapoff -a


Чтобы выключить swap навсегда - закомментируйте его строки в /etc/fstab.

▪️ Настройка приоритета. Если используется несколько swap-устройств (например, раздел и файл), то можно указать приоритет. Чем выше значение, тем раньше будет использоваться swap:


# swapon /swapfile --priority 100


Текущие приоритеты видно в выводе swapon --show.

▪️ Управление swappiness. Параметр vm.swappiness задает, как активно ядро будет использовать swap.

0 - максимально избегать использования swap.
60 (по умолчанию) - сбалансированный вариант.
100 - активно выгружать память в swap.

Пример настройки:


sysctl -w vm.swappiness=10


Для постоянного применения добавьте в /etc/sysctl.conf:


vm.swappiness=10


▪️ Zswap и Zram. Чтобы уменьшить нагрузку на диск и ускорить работу используют сжатие памяти:

📍 Zswap - сжатый кэш для swap в оперативке.
Активация через параметры ядра:


zswap.enabled=1


📍 Zram - сжатый блочный девайс в RAM, который можно подключить как swap. Это будет полезно на ноутбуках и в контейнерах.
Установка и включение в Debian/Ubuntu:


apt install zram-tools
systemctl enable --now zramswap.service


#linux #swap

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14
⌛️ Быстрый способ отладки bash-скриптов

Когда в скрипте что-то идет не так, часто хочется понять, какая команда выполнилась последней и какие значения получили переменные. Вместо того чтобы расставлять десятки 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

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍124
🎆 Удобная веб-панель для управления linux серверами

Cockpit - это встроенный в современные дистрибутивы инструмент, который превращает сервер в управляемый через браузер интерфейс. Вам больше не нужно все делать вручную в консоли - многие задачи можно выполнять из веб-панели.

▪️ Установка и запуск. В большинстве систем 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

Авторизация выполняется через обычный системный логин и пароль.

📍 Возможности Cockpit

Мониторинг ресурсов (CPU, RAM, диски, сеть) в реальном времени
Управление сервисами systemd (запуск, остановка, перезапуск)
Просмотр логов journald
Управление пользователями и правами
Настройка сетевых интерфейсов и firewall
Работа с дисками, RAID и LVM
Подключение Docker/Kubernetes для управления контейнерами
Возможность администрировать несколько серверов через одну панель

📍 Почему это удобно?

Минимальная настройка: поставил и сразу работает.
Не требует сторонних агентов - все идет через systemd и встроенные механизмы.
Легко интегрируется с SELinux, firewalld и другими системными компонентами.

#linux #cockpit

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍153
🔫 Шпаргалка по systemctl status

Обычно мы проверяем состояние конкретной службы:


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

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍122
⬆️ Netplan в ubuntu - альтернативный способ настройки сетей

Ubuntu давно перешла от классического /etc/network/interfaces к новому инструменту - netplan. Он появился начиная с ubuntu 17.10 и стал основным способом настройки сетевых интерфейсов.

❗️ Netplan - это уровень абстракции для сетевых конфигураций.

Использует YAML-файлы в /etc/netplan/.

Работает через рендереры:

systemd-networkd - для серверов и headless-систем.
NetworkManager - для десктопов.

Позволяет централизованно и декларативно описывать сеть.


▪️ Где лежат конфиги

Все настройки находятся в /etc/netplan/*.yaml.
По умолчанию обычно есть файл 01-netcfg.yaml или 50-cloud-init.yaml.

▪️ Примеры конфигураций
1️⃣ DHCP (получение адреса автоматически)


network:
version: 2
renderer: networkd
ethernets:
ens33:
dhcp4: true


2️⃣ Статический IP


network:
version: 2
renderer: networkd
ethernets:
ens33:
addresses:
- 192.168.1.100/24
gateway4: 192.168.1.1
nameservers:
addresses: [8.8.8.8, 1.1.1.1]


3️⃣ Несколько IP на одном интерфейсе


network:
version: 2
ethernets:
ens33:
addresses:
- 192.168.1.101/24
- 192.168.1.102/24


4️⃣ Bonding (для отказоустойчивости и агрегации)


network:
version: 2
bonds:
bond0:
interfaces: [ens33, ens34]
parameters:
mode: balance-rr
addresses:
- 192.168.1.200/24
gateway4: 192.168.1.1


5️⃣ VLAN


network:
version: 2
vlans:
vlan100:
id: 100
link: ens33
addresses: [192.168.100.10/24]


▪️ Применение настроек

После изменения файлов:


sudo netplan apply


Для теста перед применением можно использовать:


sudo netplan try


(дает 120 секунд на подтверждение, если сеть отвалилась - конфиг откатывается).

#linux #netplan

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍131
📌 Проверка изменений системных конфигов в Debian/Ubuntu

Когда попадаешь на чужой сервер - никогда не знаешь, какие изменения там вносили. Один из быстрых способов разобраться - использовать утилиту debsums, которая есть в базовых репозиториях:


apt install debsums


Что делает debsums

Утилита сравнивает MD5-суммы файлов из пакетов с эталонными значениями. Это помогает:

📍проверить целостность пакетов;
📍выявить модифицированные файлы;
📍понять, какие стандартные конфиги редактировались.


▪️ Пример: проверка конфигов. Особенно полезно искать изменения в конфигурационных файлах:


debsums --config --changed


Результат может быть таким:


/etc/ssh/ssh_config
/etc/default/ssh


То есть видно, что системные конфиги OpenSSH редактировались.

▪️ debsums проверяет:

файлы из базовой системы (/etc/default, /etc/pam.d, /etc/grub.d);
юниты systemd;
конфиги сервисов вроде nginx, mariadb, apache2.

#linux #audit

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13
👩‍🎨 Шпаргалка по debsums

▪️ Основные ключи

Проверить все пакеты:


debsums


Показать только измененные файлы:


debsums --changed


Проверять только конфиги (/etc):


debsums --config


Только измененные конфиги:


debsums --config --changed


Показать отсутствующие файлы пакета:


debsums --missing


Игнорировать отсутствующие файлы (проверять только существующие):


debsums --ignore-missing


Проверка конкретного пакета


debsums nginx


▪️ Примеры

Найти какие конфиги менялись руками:


debsums --config --changed


Проверить целостность пакета OpenSSH:


debsums openssh-server


🌟 debsums берет эталонные хэши из пакета, поэтому иногда нужна переустановка пакета, если контрольные суммы недоступны.

#linux #audit

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍91
Отключение лишних сервисов через systemd

Одна из полезных практик на пути к оптимизации - переодически смотреть, а что вообще запускается и что из этого действительно нужно, а что можно отключить. Это будет полезно не только для оптимизации, но и для безопасности тоже.

1️⃣ Смотрим активные сервисы


systemctl list-unit-files --state=enabled


Команда покажет список всех юнитов, которые стартуют при загрузке. Также полезно посмотреть реально работающие процессы:


systemctl list-units --type=service


2️⃣ Отключение ненужного. Чтобы сервис не запускался при старте системы:


systemctl disable avahi-daemon.service


Чтобы остановить прямо сейчас:


systemctl stop avahi-daemon.service


Если сервис не нужен вообще - можно замаскировать, чтобы исключить случайный запуск:


systemctl mask avahi-daemon.service


(при этом запуск будет невозможен даже вручную, пока не сделаете unmask).

Примеры сервисов, которые часто не используются:

avahi-daemon.service - autodiscovery (не нужен на сервере)
bluetooth.service - если нет блютуза
ModemManager.service - если не используется мобильный модем
rpcbind.service - устаревший RPC, не нужен большинству

Далее уже зависит конкретно от Ваших потребностей и ситуации.

3️⃣ Проверка. После внесенных изменений убедитесь, что лишние службы не стартуют:


systemctl list-unit-files --state=enabled


#linux #systemd

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥21
🎤 Один ввод, а команды на всех хостах

Когда разворачиваешь кластер или нужно повторить одинаковые действия на нескольких серверах, очень помогает режим синхронизации панелей в tmux. С ним одна команда сразу выполняется во всех открытых панелях.

▪️ Установка


apt install tmux


▪️ Работа с панелями

1️⃣Запускаем tmux.
2️⃣Создаем несколько панелей:

Ctrl+B % - вертикальное разделение
Ctrl+B " - горизонтальное разделение

3️⃣Между панелями перемещаемся Ctrl+B + стрелки.
4️⃣В каждой панели подключаемся по SSH к своему хосту.

▪️ Включение синхронизации. В командной строке tmux (после Ctrl+B :) вводим:


:setw synchronize-panes


Теперь все, что вводите в активной панели, автоматически дублируется во все остальные.
Отключение производится той же командой.

▪️ Автоматизация

Если работаете с одним и тем же стендом регулярно, то можно написать конфиг для tmux или скрипт, который сразу запускает сессию и подключает нужные SSH-сессии.

#linux #terminal

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12
Ограничение процессов по CPU

Иногда необходимо жестко контролировать, какие ядра процесс может занимать, например, чтобы тяжелые задачи не забивали сервер или чтобы критичные сервисы не конкурировали за ресурсы. В linux это решается утилитой taskset, которая позволяет как изменять affinity уже работающих процессов, так и запускать новые с заданными ограничениями.

1️⃣ Привязка уже запущенного процесса к выбранным ядрам. Для начала найдем PID процесса. Выберите любой удобный способ:


ps aux | grep myapp
pidof myapp
pgrep -f myapp


Посмотрим CPU в системе:


lscpu | grep -E 'CPU\(s\)|NUMA'


Пример вывода:


CPU(s): 8
NUMA node0 CPU(s): 0-7


Допустим, нам нужно посадить процесс на ядра 0–2. Для этого:


taskset -pc 0-2 1574


Пример результата:


pid 1574's current affinity list: 0-7
pid 1574's new affinity list: 0,1,2


Теперь процесс гарантированно не займет остальные ядра.

2️⃣ Запуск программы с ограничением по CPU. Это более практичный вариант: мы сразу запускаем процесс с нужными ограничениями. Но тут есть нюанс: taskset требует mask (битовой маски), а не списка ядер.

Как работает маска?

Каждое ядро - это один бит:

Ядро Маска
0 1
1 2
2 4
3 8
… …

Например:
ядра 1 и 2 = 2 + 4 = 6 → маска 0x06


Пример запуска с ограничением на одно ядро. Запустить программу только на ядре 0:


taskset 1 gzip hugefile


(маска 1 = ядро 0)

Пример: запуск на ядрах 2 и 3

Маска: 4 + 8 = 12 = c


taskset c gzip hugefile


3️⃣ Как быстро узнать маску для нужных ядер. Если не хочется считать вручную, то есть хитрый трюк. Назначаем список ядер любому процессу:


taskset -pc 4-5 $(pidof systemd-journald)


А теперь смотрим его маску:


taskset -p $(pidof systemd-journald)


Пример:


pid 412's current affinity mask: 30


Вот и маска.

4️⃣ Наглядный тест с помощью xz. Архиватор xz умеет использовать несколько потоков, и его хорошо видно в htop. Создаем тестовый файл:


dd if=/dev/urandom of=/tmp/testfile bs=1M count=200


Запускаем xz только на ядрах 0 и 1 (маска 3):


taskset 3 xz -T2 /tmp/testfile


Смотрим в htop и процесс будет занимать строго эти два ядра.

#linux #taskset

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥1
🤠 Быстрый аудит безопасности

Бывает такое, что сервер уже настроен и работает, но не покидает ощущение - вдруг что-то упустил, оставил какую-то уязвимость - незащищенные параметры SSH, лишние службы, слабые настройки sysctl. Чтобы быстро проверить систему, удобно использовать Lynis, инструмент для аудита безопасности и оценки соответствия стандартам.

Lynis - это утилита с открытым исходным кодом, которая выполняет анализ конфигурации linux и unix подобных систем и выдает рекомендации по усилению безопасности. Она проверяет десятки аспектов системы:

настройки ядра и PAM,
файрвол и службы,
права на файлы,
SSH, cron, логирование,
пакеты и обновления.


▪️ Установка


apt install lynis #debian или ubuntu

yum install lynis #CentOS


▪️Проверка системы. Запустить аудит можно буквально одной командой:


lynis audit system


После выполнения вы получите подробный отчет с результатами и рекомендациями.
Файл отчета по умолчанию сохраняется в: /var/log/lynis.log
а краткий отчет в: /var/log/lynis-report.dat

▪️ Расшифровка результатов

В конце проверки Lynis показывает оценку безопасности - чем она выше, тем лучше.
Также будут даны рекомендации, например:


[WARNING] SSH root login is enabled
[SUGGESTION] Install a firewall management tool (ufw/firewalld)


Просто проходите по списку и исправляйте. После доработок можно снова запустить аудит и посмотреть, насколько улучшился индекс.

Официальный сайт 📌

#linux #security

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍161
🏃‍♂️ Сброс пароля root в linux через GRUB

Решил посмотреть, как на практике сбрасывается пароль root, и заодно поделиться с вами. Это классическая задача, которую часто дают на собеседованиях.

Цель - получить доступ к системе с правами root, даже если пароль неизвестен. Сделать это можно, изменив параметры загрузки ядра в GRUB.


▪️ Как это делается

1. Включаем сервер и ждем появления меню загрузки GRUB.
2. Выбираем нужный пункт и нажимаем e (латинскую).
3. В открывшемся редакторе ищем строку, начинающуюся с linux или linux16.
4. В самый конец этой строки добавляем:


rw init=/bin/bash


Это позволит запустить оболочку bash вместо стандартного systemd.

5. Нажимаем Ctrl+X или F10 для загрузки. После старта вы сразу окажетесь в консоли под пользователем root без пароля. Теперь можно просто задать новый пароль:


passwd


и перезагрузить систему:


exec /sbin/init


или


reboot -f


▪️ Как это работает

Параметр init= сообщает ядру, какой процесс нужно запустить первым.
Обычно это /sbin/init (или systemd), который отвечает за загрузку системы.
Когда мы подменяем его на /bin/bash, система вместо полноценной инициализации попадает прямо в консоль.
Фактически, вы оказываетесь в самой ранней стадии загрузки с полными правами root.

▪️ Для RHEL и производных

В системах вроде RHEL, CentOS, AlmaLinux, RockyLinux используется немного другой вариант:


rw rd.break enforcing=0


После загрузки окажетесь в emergency shell, где также сможете сбросить пароль через passwd.

#linux #security

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍23
🖥 Динамическая маршрутизация (OSPF/BGP)

Современные серверы и маршрутизаторы давно умеют не только работать с iptables и NAT, они вполне способны участвовать в динамической маршрутизации на уровне провайдерского оборудования. Два наиболее популярных решения для этого: BIRD и FRRouting (FRR).

Если вы используете статические маршруты (ip route add ...), то при изменении топологии сети приходится вручную обновлять таблицы маршрутов.
Динамические протоколы решают это автоматически: маршрутизаторы обмениваются маршрутами между собой, выбирают оптимальные пути и обновляют таблицы без участия администратора.

Основные протоколы:

OSPF (Open Shortest Path First) - для внутренних сетей (IGP)
BGP (Border Gateway Protocol) - для внешних соединений (межсетевые маршруты между организациями)


▪️ BIRD - легкий и быстрый демон маршрутизации

BIRD - это компактное и производительное решение, часто используемое в инфраструктуре провайдеров. Поддерживает IPv4, IPv6, OSPF, BGP, RIP и static.

Установка:


apt install bird # debian или ubuntu


Пример конфигурации OSPF:


protocol ospf {
area 0 {
interface "eth0" {
cost 10;
};
};
}


Пример простого BGP сессии:


protocol bgp mypeer {
local as 65001;
neighbor 192.168.1.2 as 65002;
import all;
export all;
}


Файлы конфигурации находятся в /etc/bird/.
После изменения конфигурации не обязательно перезапускать демон, можно использовать:


birdc configure


▪️ FRRouting (FRR) - наследник Quagga. FRR - это более тяжелое решение, ориентированное на продакшн-маршрутизаторы и крупные сети. Поддерживает OSPF, BGP, IS-IS, RIP, PIM и даже LDP.

Установка:


apt install frr frr-pythontools # debian или ubuntu


Конфигурация BGP (пример):


router bgp 65001
bgp router-id 192.168.1.1
neighbor 192.168.1.2 remote-as 65002
network 10.0.0.0/24


Запуск FRR:


systemctl enable frr
systemctl start frr


Конфигурация хранится в /etc/frr/frr.conf. Для управления используется утилита vtysh, она похожа на CLI сетевых устройств cisco или mikrotik.

#linux #networking

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
👓 Изоляция процессов без Docker

В linux есть встроенный механизм изоляции системных ресурсов - namespaces. Именно на нем основаны контейнеры вроде docker и LXC. Но namespaces можно использовать и напрямую без всяких надстроек.

Namespace - это способ ядра linux изолировать разные части системы: процессы, сеть, точки монтирования, пользователей и т.д.
Каждое приложение может жить в своем отдельном пространстве, не видя другие процессы и ресурсы.


▪️ Пример 1: изоляция процессов и монтирования. Запустим новую оболочку bash в отдельном пространстве процессов (PID) и монтирования (mount).


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


Здесь процесс bash получил PID 1 - он главный в своем изолированном пространстве. Теперь создадим изолированное монтирование:


mkdir /tmp/testdir /mnt/testdir
mount --bind /tmp/testdir /mnt/testdir
mount | grep testdir

/dev/sda3 on /mnt/testdir type ext4 (rw,relatime)


На хосте это монтирование вы не увидите, оно существует только внутри namespace.

▪️ Просмотр активных namespaces. Список всех пространств можно увидеть с помощью 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


Тут видны PID и MOUNT пространства, созданные нашей командой unshare. Если у вас работают контейнеры, их namespaces тоже будут отображены здесь.

▪️ Пример 2: запуск процессов в чужом namespace. Можно подключиться к уже существующему пространству с помощью nsenter.

Предположим, у нас есть процесс bash с PID 123. Подключимся к нему и запустим команду top:


nsenter -t 123 -p -m top


Теперь top выполняется внутри того же PID и mount namespace, что и процесс bash.

▪️ Полезные инструменты

unshare - создает новые namespaces.
nsenter - позволяет войти в уже существующие.
systemd-nspawn - мини-контейнерная система от systemd.

Пример запуска простого контейнера через systemd-nspawn:


systemd-nspawn -D /var/chroot/debian bash


#linux #namespaces

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11😁2