Linux

Что такое load average? Что показывает эта метрика? Почему load average состоит из трёх значений?

uptime, top.

Цифры обозначают нагрузку за определенный период времени. 1, 5 и 15 минут. (Это важно учесть, это все рассчитывается для предыдущего времени. И когда вы заходите на сервер спустя минуту - там может ничего не быть)

Вообще - эта цифра показывает количество процессов в статусе d r (ожидание, запущено соответственно) А дальше уже всё будет зависеть от ситуации. Допустим у нас сервер есть где постоянно на диски пишутся резервные копии. Там LA будет высокая скорее всего. Просто потому что есть процессы в статусе d, которые копятся из-за того, что диск занят. Но на работу системы в целом это может не влиять вообще.

Если процессов скопилось много там, где это не ожидается, ну там сервера с сайтами, базами данных, с php-fpm, nginx и прочим таким, то смотрим через top -cHi -d1 что там именно скопилось. И в таких вот случаях сервер может тупить, ибо будут копиться процессы в статусе r. Из-за чего работа сервера будет медленной. Даже по ssh иногда не зайти будет.

Если коротко это кол-во процессов и операций ввода/вывода которые находяться в ожидание процессорного времени(исполнения процессором) за 1, 5, 15 минут

Как работает оом киллер и для чего нужен? Out of memory, oom

Когда на вашем Linux-компьютере заканчивается память, ядро вызывает Убийцу нехватки памяти (OOM) для освобождения памяти. Это часто встречается на серверах, на которых запущен ряд процессов с интенсивным использованием памяти.

Оом киллер освобождает память для спасения системы, но чтобы процессы освобождаемые были наименее важны для системы.

Ядро Linux дает оценку каждому запущенному процессу, называемому oom_score, которая показывает, насколько вероятно, что он будет остановлен в случае нехватки доступной памяти.

Оценка пропорциональна количеству памяти, используемой процессом. Оценка - 10% процентов памяти, используемой процессом. Таким образом, максимальная оценка составляет 100% x 10 = 1000.

Что такое системные вызовы? Зачем они нужны и как они работают? Какие системные вызовы знаешь 5-10

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

read - чтение из файлового дескриптора.

open - открывающий и по возможности создающий файл или устройство

close - закрыть файловый дескриптор

access - проверка пользовательских привелегий для этого файла

mmap - служит для отображения предварительно открытого файла (например, с помощью системного вызоваа open()) в адресное пространство вычислительной системы

Команда для вывода всех системных вызовов во время исполнения программы: strace -c ls

Где в системе можно посмотреть сводку по текущему потреблению памяти?

free -m

Эта утилита не показывает физическое количество памяти. Она показывает сколько памяти доступно в системе. То есть физически сколько заняло ядро.

total - 3923 мегабайт - Она показывает сколько памяти у нас в системе. used - 309 мегабайт - сколько у нас памяти занимают исполняемые процессы. free - 231 мегабайт - ненужная в данный момент память. То есть если надо будет системе - она ее займет. shared - 2 мегабайта - shared память для межпроцессорного взаимодействия. Чтобы поделиться памятью из одного процессора в другой. buff/cache - буффер - память для компоновки данных. Страничный кэш - это то, с помощью чего мы например можем файлы открывать.

Почему линукс съедает память?

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

Итого свободная память - это та память которая ни нужна ни для кэша, ни для чего-то ещё. available - 3381 мегабайт может быть доступно в случае необходимости. Если available нет, то его в примерном виде можно посчитать так: free + 70% от кэша. Ибо не во всех дистрибутивах этот показатель есть.

Какие ситуации будут указывать на возможную проблему?

Available память или ( free -/+ buffers/cache ) близки к нулю или очень маленькое значение. В логах ядра есть сообщения OutOfMemory. (dmesg -T | grep out of memory)

Что показывает статус процессов? Какие статусы используются в linux?

R - процесс исполняется, или ждет своей очереди на исполнение

S - прерываемый сон - процесс ожидает определенного события или сигнала. Нужен, когда процесс нельзя завершить (чтение из файла), ядро переводит на ожидание. Ожидать данные от сетевого соединения

D - непрерывное ожидание, сон. Ждем сигнал от аппаратной части.

T - остановка процесса, посылаем сигнал STOP. В этом состоянии процессу запрещено выполняться Чтобы вернуть к жизни нужно послать CONT При завершении процесса он становится зомби

Z(zombie) - зомби это процесс, который закончил выполнение, но не передал родительскому процессу свой код возвращения. Процесс в этом состоянии игнорирует kill.

Родитель получает код, и освобождает структуру ядра, которое относится к процессу Бывает еще когда родительский умирает раньше дочернего. Процесс становится сиротой.

Чем опасны зомби процессы, какие проблемы они могут создать?

Зомби не занимают памяти (как процессы-сироты ), но блокируют записи в таблице процессов, размер которой ограничен для каждого пользователя и системы в целом.

При достижении лимита записей все процессы пользователя, от имени которого выполняется создающий зомби родительский процесс, не будут способны создавать новые дочерние процессы. Кроме этого, пользователь, от имени которого выполняется родительский процесс, не сможет зайти на консоль (локальную или удалённую) или выполнить какие-либо команды на уже открытой консоли (потому что для этого командный интерпретатор sh должен создать новый процесс)

Иногда, если родительский процесс выполняется от имени суперпользователя, для освобождения записей (перезапуска процесса) может потребоваться перезагрузка (причём зачастую — только аппаратным рестартом). Некоторые операционные системы (например, Sun Solaris ) при возникновении такой ситуации аварийно завершают часть выполняющихся процессов, восстанавливая работоспособность системы.

Что такое файловый дескриптор, какая информация в нем бывает?

Файловый дескриптор неотрицательное целое число, которое используется в интерфейсе между пространством пользователя и пространством ядра (kernel) для идентификации ресурсов файла / сокета. Когда создаётся новый поток ввода-вывода, ядро возвращает процессу, создавшему поток ввода-вывода, его файловый дескриптор.

Важно отметить, что файловые дескрипторы не ограничиваются только файлами. Они также могут ссылаться на каталоги, сокеты, каналы (pipes), устройства ввода-вывода и даже некоторые специфические для процесса ресурсы, такие как файлы процесса и области памяти.

Операционная система автоматически создает три файловых дескриптора для каждого процесса: 0 (стандартный ввод), 1 (стандартный вывод) и 2 (стандартный вывод ошибок).

Как процессы в системе взаимодействуют между собой?

Трубы(пайпы '|') — связь между двумя взаимосвязанными процессами. Механизм является полудуплексным, что означает, что первый процесс связан со вторым процессом. Для достижения полного дуплекса, т. Е. Для взаимодействия второго процесса с первым процессом требуется другой канал.

FIFO — Связь между двумя не связанными процессами. FIFO — это полный дуплекс, что означает, что первый процесс может взаимодействовать со вторым процессом и наоборот одновременно.

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

Совместно используемая память. Связь между двумя или более процессами достигается за счет совместного использования памяти всеми процессами. Совместно используемая память должна быть защищена друг от друга путем синхронизации доступа ко всем процессам.

Семафоры — семафоры предназначены для синхронизации доступа к нескольким процессам. Когда один процесс хочет получить доступ к памяти (для чтения или записи), он должен быть заблокирован (или защищен) и освобожден при удалении доступа. Это должно быть повторено всеми процессами для защиты данных.

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

Примечание. Почти все программы в этом руководстве основаны на системных вызовах в операционной системе Linux (выполняется в Ubuntu).

Для чего нужны сигналы? Какие сигналы используются чаще всего? 5 - 10 штук

Это уведомление процесса о наступившем событии. Также это способ взаимодйествия между процссами.

SIGTERM (15) - запрос на "мягкое завершение процесса.

SIGKILL (9) - принудительное завершение процесса.

SIGINT (2) - прерывание процесса. (Например нажатие Ctrl-C)

SIGSTOP (10) - приостановка процесса.

SIGCONT (18) - возобновить работу процесса.

SIGHUP (1) - перезагрузка конфигурации (например можно так сделать релоад nginx)

Сигналы SIGKILL и SIGSTOP нельзя перехватить, блокировать или игнорировать.

Что делает команда kill?

Назначение команды kill - отправить определенный сигнал процессу. По умолчанию используется сигнал SIGTERM.

А вот все сигналы можно глянуть через kill -l, они нужны для взаимодействия между процессами

Как посмотреть нагрузку на диски?

Установить утилиту sysstat, проверить нагрузку на диски iostat -xtc.

Использовать утилиту iotop, которая показывает процессы, которые активно используют диск.

Использовать dstat - утилита, которая выводит раз в какое-то время статистику по системным ресурсам. В целом более удобная замена таких утилит как vmstat, iostat, ifstat

Что такое процесс? Что такое тред? В чем заключаются их главные отличия?

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

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

Главные отличия процесса и треда:

Адресное пространство: Процесс имеет собственное адресное пространство, а тред разделяет адресное пространство с другими тредами в том же процессе.

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

Создание и переключение: Создание и переключение между процессами обычно более затратно, чем между тредами, поскольку процессы требуют выделения и инициализации дополнительного адресного пространства и ресурсов.

Параллелизм: Процессы могут выполняться параллельно на разных процессорах или ядрах, в то время как трединг позволяет реализовывать параллелизм внутри одного процесса.

Безопасность: Процессы предоставляют более высокий уровень изоляции и безопасности, чем треди, поскольку они имеют отдельное адресное пространство и ресурсы.

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

Что будешь делать если у команды chmod убрали права на исполнение? chmod -x chmod

Если у вас есть root-доступ Если вы имеете root-доступ, вы можете использовать sudo для выполнения команд. Например: sudo chmod +x /bin/chmod

Использование bash встроенной команды install Если у вас есть доступ к встроенной команде install, вы можете использовать её для изменения прав доступа: install -m 755 /bin/chmod /bin/chmod

Использование cp для копирования файла Если у вас есть какая-либо другая исполняемая копия chmod на системе (например, в директории /usr/bin/ или где-то ещё), вы можете просто заменить текущий файл: cp /usr/bin/chmod /bin/chmod

Использование Python или других языков программирования Если у вас есть доступ к Python, вы можете изменить права файла с помощью встроенного модуля os: python3 -c "import os; os.chmod('/bin/chmod', 0755)"

Что такое userspace, kernelspace? Чем они отличаются?

Что такое kernelspace (пространство ядра)?

Kernelspace — это область памяти и привилегий, в которой выполняется код операционной системы (ядра) и где происходят низкоуровневые взаимодействия с аппаратным обеспечением.

В kernelspace выполняются:

Управление аппаратным обеспечением (драйверы, взаимодействие с процессором, памятью, устройствами ввода/вывода).

Планирование процессов и управление потоками.

Работа с физической памятью и виртуальной памятью.

Обеспечение безопасности и изоляции процессов.

Обработка системных вызовов (например, вызовам через API операционной системы).

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

Что такое userspace (пользовательское пространство)?

Userspace — это область памяти и исполнения, где работают пользовательские программы и приложения. Программы, работающие в userspace, имеют ограниченные привилегии и не могут напрямую взаимодействовать с аппаратным обеспечением.

Особенности userspace:

Программы запускаются в изолированных процессах, защищённых от прямого доступа к памяти ядра или других процессов.

Для взаимодействия с ядром (например, для работы с файлами, сетью или устройствами) приложения используют системные вызовы (syscalls), которые передают управление ядру.

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

Примеры программ, работающих в userspace:

Браузеры, текстовые редакторы, игры и другие пользовательские приложения. Командные оболочки (bash, zsh). Системные приложения, такие как менеджеры задач или службы, которые взаимодействуют с ядром.

Как они взаимодействуют?

Программы в userspace не могут напрямую обращаться к ресурсам компьютера (например, к жёсткому диску или сети). Вместо этого они используют системные вызовы (syscalls), которые передают управление ядру. Пример:

Программа в userspace хочет открыть файл.

Она вызывает системный вызов (например, open()).

Управление передаётся ядру, которое проверяет права доступа, находит файл и открывает его.

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

Такое разделение обеспечивает:

Стабильность системы: ошибки в userspace-программах не влияют на ядро.

Безопасность: ядро может контролировать доступ пользователей к аппаратным ресурсам.

Почему это важно?

Разделение kernelspace и userspace предотвращает случайное или преднамеренное повреждение ядра системой приложений.

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

Это обеспечивает безопасность, так как ядро ограничивает доступ к важным системным ресурсам.

Что такое физическая память?

Физическая память (или «ОЗУ», «RAM», «оперативка») — это энергозависимая память, установленная в компьютере. Для её работы требуется непрерывный поток электричества. Перебои с электропитанием или внезапное выключение компьютера могут привести к стиранию хранящихся в ней данных. Кроме того, эта память является линейно адресуемой. Другими словами, значения адресов памяти увеличиваются линейным образом.

Запуская и исполняя программы, процессор напрямую обращается к физической памяти. Обычно программы хранятся на жестком диске. Время доступа процессора к диску значительно превышает аналогичное время доступа к физической (оперативной) памяти.

Чтобы процессор мог выполнять программы быстрее, они сначала помещаются в физическую (оперативную) память. После завершения своей работы, они возвращаются обратно на жесткий диск.

Освобожденная таким образом память может быть выделена новой программе. При выполнении данные программы называются процессами.

Что такое виртуальная память?

Виртуальная память (или «логическая память») — это метод управления памятью, осуществляемый операционной системой, который позволяет программам задействовать значительно больше памяти, чем фактически установлено в компьютере.

Например, если объем физической памяти компьютера составляет 4 ГБ, а виртуальной 16 ГБ, то программе может быть доступен объем виртуальной памяти вплоть до 16 ГБ.

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

Именно в ней находятся выполняемые в данный момент программы. А виртуальная память — это метод управления, расширяющий при помощи жесткого диска объем физической памяти, благодаря чему у пользователей появляется возможность запускать программы, требование к памяти которых превышает объем установленной в компьютере физической памяти.

Как работает sudo? Для чего она используется?

sudo (англ. Substitute User and do, дословно «подменить пользователя и выполнить») — программа для системного администрирования UNIX-систем, позволяющая делегировать те или иные привилегированные ресурсы пользователям с ведением протокола работы. Основная идея — дать пользователям как можно меньше прав, при этом достаточных для решения поставленных задач.

Как работает sudo:

Проверка прав пользователя:

Когда пользователь вводит sudo перед командой, система проверяет, есть ли у этого пользователя разрешение на выполнение команды через sudo.

Эти разрешения определяются в конфигурационном файле /etc/sudoers или в файлах в папке /etc/sudoers.d/.

Запрос пароля:

Если пользователь имеет право использовать sudo, система может запросить его личный пароль (а не пароль суперпользователя). Это сделано для подтверждения личности и предотвращения несанкционированного доступа.

После успешного ввода пароля доступ к sudo обычно сохраняется на некоторое время (по умолчанию 5 минут), чтобы не запрашивать пароль при каждом вызове.

Выполнение команды:

sudo запускает указанную команду с правами суперпользователя или другого пользователя (если явно указано через флаг -u, например, sudo -u username command).

Запись логов:

Все действия, выполненные через sudo, записываются в журналы (обычно в файл /var/log/auth.log или /var/log/secure), чтобы администраторы могли отслеживать, кто и что выполнял.

Представлен вывод команды top. Что означает каждая запись в выводе?

top - утилита
10:44:36 — время системы
up - сколько система работает с момента последнего запуска
7 user - количество авторизованных юзеров в системе
load average: 0.00, 0.02, 0.05 - параметр средней нагрузки на систему за период времени 1 минута, 5 минут, 15 минут
156 total - всего процессов в системе
1 running - количество процессов в работе
155 sleeping - ожидание процесса или сигнала
0 stopped - количество приостановленных процессов сигналом STOP или выполнение трассировки
0 zombie - количество зомби-процессов, которые завершили своё выполнение, но присутствующие в системе, чтобы дать родительскому процессу считать свой код завершения.

us (user) Использование процессора пользовательским процессами

sy (system) Использование процессора системным процессами

ni (nice) Использование процессора процессами с измененным приоритетом с помощью команды nice

id (idle) Простой процессора. Можно сказать, что это свободные ресурсы

wa (IO-wait) Время на простой, то есть ожидания переферийных устройств ввода вывода

hi (hardware interrupts) Показывает сколько процессорного времени было потрачено на обслуживание аппаратного прерывания. (Аппаратные прерывания генерируются аппаратными устройствами. Сетевыми картами, клавиуатурами, датчиками, когда им нужно о чем-то просигнализировать цп.

si (software interrupts) Показывает сколько процессорного времени было потрачено на обслуживание софтверного прерывания. Фрагмент кода, вызывающий процедуру прерывания

st (stolen by the hypervisor) Показывает сколько процессорного времени было «украдено» гипервизором. Для запуска виртуальной машины, или для иных нужд

**KiB Mem** - количество оперативной памяти в кибибайтах (кратно 1024): *7106404 total* -- всего доступно оперативной памяти в системе, *306972 free* -- свободно оперативной памяти для использования, *3127144 used* -- использовано оперативной памяти, *3672288 buff/cache* -- буферизовано/закешировано оперативной памяти.

**KiB Swap** - количество swap-памяти в кибибайтах (кратно 1024), которые выделено на диске: *8191996 total* - всего выделено swap-памяти, *8191996 free* - свободно swap-памяти *0 used* - использовано swap-памяти, *3270520 avail Mem* - доступно для использования swap-памяти.

Что такое зомби-процесс? Как можно создать такой процесс?

Зомби-процесс (или процесс-зомби) — это процесс, который завершил свое выполнение, но его запись все еще остается в таблице процессов. Это происходит потому, что родительский процесс не получил информацию о состоянии завершения дочернего процесса. Эта информация, а именно код завершения (exit code), должна быть получена родительским процессом. После получения этой информации запись о дочернем процессе удаляется из таблицы процессов.

Пока родительский процесс не получит код завершения, дочерний процесс остается в состоянии зомби. Зомби-процессы потребляют минимальное количество системных ресурсов (в основном, лишь запись в таблице процессов), но их накопление может привести к проблемам, особенно если идентификаторы процессов (PID) исчерпаются.

Другой вариант создания зомби процесса, попроще: (sleep 1 & exec /bin/sleep 10)

Процесс создания зомби-процесса Зомби-процесс — это процесс, который завершился, но его статус завершения не был считан родительским процессом. Рассмотрим, как происходит создание зомби-процесса:

Родительский процесс (например, оболочка) создаёт дочерний процесс для выполнения команды в скобках. Внутри этого дочернего процесса запускается команда sleep 1 в фоновом режиме. Сразу после этого выполняется команда exec /bin/sleep 10, которая заменяет дочерний процесс на sleep 10.

Когда sleep 1 завершает своё выполнение (через 1 секунду), его родительский процесс уже не может обработать его завершение, так как был заменён на команду sleep 10.

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

Зомби-процесс будет существовать до тех пор, пока не завершится команда sleep 10 (через 10 секунд), после чего родительская оболочка сможет обработать завершение всей составной команды.

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

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

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

Как осуществляется обработка сигналов? Чем отличается SIGTERM от SIGKILL?

Обработка сигналов в Unix-подобных операционных системах — это механизм, который позволяет программам получать асинхронные уведомления о различных событиях. Сигналы могут быть отправлены процессу, чтобы уведомить его о каком-то событии, например, завершении дочернего процесса, ошибках или внешних запросах на завершение.

Обработка сигналов

1. Установка обработчиков сигналов: Процесс может установить функции-обработчики для определённых сигналов. Это делается с помощью системных вызовов, таких как `signal()` или `sigaction()`. Когда процесс получает сигнал, вместо стандартного действия (например, завершения процесса), вызывается установленная функция-обработчик.

2. Игнорирование сигналов: Процесс может игнорировать определённые сигналы, за исключением некоторых, таких как `SIGKILL` и `SIGSTOP`, которые не могут быть перехвачены или проигнорированы.

3. Стандартные действия: Если для сигнала не установлено специальное действие, процесс выполняет стандартное действие, определённое для этого сигнала (например, завершение процесса, игнорирование или создание дампа памяти).

Различия между SIGTERM и SIGKILL

-`SIGTERM` (Signal Terminate): -Назначение: Это сигнал, который вежливо просит процесс завершиться. Он может быть перехвачен, обработан или проигнорирован процессом. - Стандартное действие: Завершение процесса. - Использование: Обычно используется для «мягкого» завершения процессов, так как процесс может освободить ресурсы, сохранить состояние или выполнить другие операции очистки перед завершением.

- `SIGKILL` (Signal Kill): - Назначение: Это сигнал, который немедленно завершает процесс. Он не может быть перехвачен, обработан или проигнорирован.

- Стандартное действие: Непосредственное завершение процесса.

- Использование: Применяется, когда необходимо принудительно завершить процесс, который не реагирует на другие сигналы, например, `SIGTERM`. Так как этот сигнал не даёт процессу возможности выполнить очистку, его использование может привести к потерям данных или неосвобождённым ресурсам.

Таким образом, `SIGTERM` предпочтителен для обычного завершения процесса, а `SIGKILL` — для принудительного завершения, когда другие методы неэффективны.

Где в linux хранится информация о процессах?

Директория proc/PID

Информация о процессах хранится в директориях /proc/N, где N — числовой идентификатор процесса. В этой директории содержатся различные псевдо-файлы, которые содержат информацию о самом процессе и связанном с ним окружении.

/proc/N/cmdline — Содержимое командной строки, которой был запущен процесс.

/proc/N/environ — Описание окружения, в котором работает процесс. Оно может быть полезно для просмотра содержимого окружения, если вам надо, например, посмотреть, была ли установлена переменная окружения перед запуском программы.

/proc/N/exe — Символическая ссылка на выполнимый файл запущенной программы.

/proc/N/limits — Лимиты на использование системных ресурсов, актуальные для работающего процесса.

/proc/N/mounts — Список смонтированных ресурсов, которые доступны процессу

/proc/N/status — Статус работающей программы. Он включает в себя такую информацию как идентификатор родительского процесса, статус самого процесса, его название, его идентификатор, идентификатор пользователя и группы, группы, в которые входит владелец процесса, сколько потоков использует процесс, сколько памяти он использует и так далее.

В этой же директории содержится несколько псевдо-директорий:

/proc/N/cwd — Текущая директория для процесса. Представлена символической ссылкой на директорию. Если рабочая директория для процесса изменится, изменится и ссылка.

/proc/N/fd — Файловые дескрипторы, которые используются процессом. Для программы bash, например, там по умолчанию будут дескрипторы 0, 1, 2 и 255, указывающие на виртуальный терминал, в котором запущен процесс, например, /dev/pts/6.

/proc/N/fdinfo — Информация о файловых дескрипторах. Каждый файл в этой директории содержит поля pos (позиция курсора), flags (флаги, с которыми этот дескриптор был открыт) и mnt_id (идентификатор точки монтирования из списка, содержащегося в файле /proc/N/mountinfo)

/proc/N/root — Символическая ссылка на директорию, которая для данного процесса является корневой

/proc/N/net — Сетевые системные ресурсы и их параметры, действующие для конкретного процесса.

Зачем нужна система инициализации? Какие системы инициализации используются в современных дистрибутивах? 2 - 5 штук init

В операционной системе Linux и других системах семейства Unix после завершения загрузки ядра начинается инициализация Linux системы, сервисов и других компонентов. За это отвечает процесс инициализации, он запускается ядром сразу после завершения загрузки, имеет PID 1, и будет выполняться пока будет работать система.

За время развития операционных систем были созданы различные системы инициализации Linux. В разных дистрибутивах использовались разные системы

Есть init. Это первый процесс, родительский процесс, которые все процессы запускает. Проверка, монитрование файловых систем, запуск служб.

Есть три его варианты работы

System V init (SysV)

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

То есть процесс инициализирует на одном из уровней запуска системы

SystemD

Родительский процесс, который запускает инициализацию в ускоренном режиме за счет параллельного запуска задач. Ускоренный режим достигается за счет особенностей работы процессора. И если они позволяют, запускает инициализацию параллельно.

Upstart

Здесь запускаются скрипты инициализации, отслеживает события, и реагирует на них. Более гибкий процесс инициализации. Если какая-то служба не запустилась, или вдруг упала, то апстарт это отследит и запустит повторно.

Что такое iowait и почему он может появляться?

iowait это показатель, показывающий процентное соотношение времени процессора, которое он потратил на ожидание ввода-вывода.

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

Замеряется в количестве потоков, которые ждут работы.

Файловая система

Отличие хардлинков от симлинков hardlinks symlinks

Хардлинк - жесткая ссылка. По своей сути является тем же файлом на который ссылается. Также счетчик в айнодах есть. Цифра 1 это оно. Счетчик имен одного и того же файла.

Симлинк - магкая ссылка. При ее создании создается новый объект на существующий файл файловой системы.

Отличить можно по наличию буквы l в выводе команды ls

При создании нового файла система возвращает ошибку no space left device

Сначала смотрим свободное место

df -h

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

df -i

При создании нового файла пользователем система возвращает ошибку no space left on device

несмотря на то, что df сообщает о наличии свободного места; при это пользователь root может создавать и записывать файлы. При каких обстоятельствах может возникнуть описанная ситуация?(quotas)**

Ответ

Бывает так, что превышается квота Для каждого юзера и пользователя она своя может быть, жестко заданная

#посмотреть квоту юзера

quota -v user

df сообщает о наличии 20 Гб занятого пространства, подсчёт занятого файлами места при помощи du даёт результат в 20 Мб. При каких обстоятельствах может возникнуть описанная ситуация?(deleted files)

При удаленном файле такое может быть. Файловый дескриптор держит файл

Ищем файл через

lsof -a +L1 | grep var | grep httpd

При удалении файла, который в этот момент был «занят» процессом — его имя удаляется, но inode — остаётся в файловой системе до тех пор, пока не завершится процесс, который «держит» этот файл.

Соответственно, что бы «освободить» уже удалённые файлы — необходимо перезапустить процесс, который этот файл держит.

Попытка запуска исполняемого файла завершается ошибкой no such file or directory. Почему?

Причин подобного поведения несколько

Файл не существует.

Файл существует, но это символическая ссылка

Файл существует, но это 32 битный файл. И нужны библиотеки для его запуска.

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

Нету интерпретатора в системе

Что такое RAID? Какие основные типы RAID существуют, чем они отличаются?

RAID (Redundant Array of Independent Disks) — это технология объединения нескольких физических дисков в один логический массив для повышения производительности, отказоустойчивости или увеличения объема хранения.

Основные типы RAID:

RAID 0 (Striping)

Разбивает данные на блоки и записывает их на несколько дисков.

Преимущества: высокая производительность, увеличение объема.

Недостаток: отсутствие отказоустойчивости — выход одного диска из строя приводит к потере данных.

RAID 1 (Mirroring)

Полное дублирование данных на два или больше дисков.

Преимущества: высокая надежность — данные сохраняются при выходе одного диска.

Недостаток: уменьшение доступного объема вдвое.

RAID 5 (Striping with Parity)

Использует чередование данных и добавляет контроль четности (parity) для восстановления данных.

Преимущества: баланс между производительностью, объемом и отказоустойчивостью.

Недостаток: требует минимум 3 дисков; снижение производительности при записи и восстановлении.

RAID 6 (Striping with Double Parity)

Как RAID 5, но с двумя блоками четности, что позволяет выдерживать выход из строя двух дисков.

Преимущества: высокая отказоустойчивость.

Недостаток: требует минимум 4 дисков, сниженная скорость записи.

RAID 10 (1+0, Mirroring + Striping)

Комбинация RAID 1 и RAID 0: данные дублируются, а затем разбиваются на блоки.

Преимущества: высокая производительность и надежность.

Недостаток: требует минимум 4 дисков, половина объема уходит на зеркалирование.

Ключевые различия:

RAID 0 — только производительность, нет отказоустойчивости.

RAID 1 — отказоустойчивость за счет зеркалирования.

RAID 5/6 — компромисс между объемом и отказоустойчивостью.

RAID 10 — высокая надежность и производительность, но высокая стоимость.

Какие средства для работы с программными RAID массивами существуют в linux?

mdadm (RAID Management Utility)

Это основной инструмент для создания, управления и мониторинга программных RAID-массивов в Linux. Поддерживает все типы RAID (RAID 0, 1, 5, 6, 10 и т.д.). Позволяет: Создавать RAID-массивы, Добавлять/удалять устройства из массива, Проверять состояние массива, Восстанавливать RAID после сбоя.

Примеры команд:

Создание RAID 1:

mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdX /dev/sdY

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

cat /proc/mdstat

Сохранение конфигурации:

mdadm --detail --scan >> /etc/mdadm/mdadm.conf

LVM (Logical Volume Manager): Хотя LVM не является инструментом для создания RAID массивов в традиционном смысле, он поддерживает RAID уровни, такие как RAID 1, RAID 5, RAID 6 и RAID 10. LVM позволяет объединять физические диски в логические тома и управлять ими гибко. Команды для управления томами (lvcreate, lvextend, lvreduce), физическими томами (pvcreate, pvremove), и групповыми томами (vgcreate, vgextend).

btrfs

Современная файловая система с встроенной поддержкой RAID (RAID 0, 1, 10, 5, 6). RAID в btrfs управляется на уровне файловой системы, а не блочного устройства.

Пример создания RAID 1 в btrfs: mkfs.btrfs -m raid1 -d raid1 /dev/sdX /dev/sdY

zfs

ZFS — файловая система с функциями RAID (RAID-Z, зеркалирование и другие). Используется в системах, где требуется высокая надежность и производительность. Пример: zpool create mypool mirror /dev/sdX /dev/sdY

Что такое LVM? Для решения каких задач он предназначен?

Менеджер, позволяющий управлять логическими томами в системах Linux. Сами логические тома можно собрать из нескольких дисков или разделов дисков. LVM расшифровывается как Logical Volume Manager или по-русски — менеджер логических томов.

LVM или Logical Volume Manager - это еще один программный уровень абстракции над физическими разделами жесткого диска, который позволяет создавать логические тома для хранения данных без непосредственной переразметки жесткого диска на одном или нескольких жестких дисках.

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

Почему доступной available памяти сейчас 2919, если свободной free памяти 843?

Total. Эта цифра представляет всю существующую память.

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

used = total - free - buff/cache

Free – свободная память в системе.

Shared – память, используемая (преимущественно) в tmpfs

Buffer, и Cache идентифицируют память, используемую для нужд ядра / операционной системы. Буфер и кеш складываются вместе, а сумма указывается в разделе «buff/cache».

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

В отличие от поля free, это поле принимает в расчёт страницу cache и также то, что не вся рекуперируемая (пригодная для повторного использования) память будет возвращена для рекуперации из-за того, что элементы используются в данный момент. (То есть то, что можно потенциально освободить. Кэш, буфер и тп)

Вот и получается, что доступная память (available) как правило больше или равна свободной памяти (free)

Что такое псевдофайловая система?

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

Примеры:

/proc — информация о процессах и состоянии ядра (например, /proc/cpuinfo — данные о процессоре).

/sys — данные о подключенных устройствах и их конфигурациях.

/dev — файлы устройств для взаимодействия с оборудованием (например, /dev/sda — диски).

/run — временные данные, используемые системой.

Псевдофайловая система в Ubuntu (как и в других Unix-подобных системах, таких как Linux) — это специальный тип файловой системы, который предоставляется ядром операционной системы для отображения информации о состоянии системы или взаимодействия с ней в виде файлов и каталогов. Эти файлы и каталоги не хранятся на физическом диске, а создаются динамически в оперативной памяти и не содержат реальных данных пользователя. Они позволяют программам и пользователю получать системную информацию или управлять системой через стандартные операции с файлами.

Основные примеры псевдофайловых систем в Ubuntu:

1. /proc — Процессная файловая система (procfs) Это самая известная псевдофайловая система. В каталоге /proc содержится информация о процессах, а также информация о состоянии ядра и оборудования. Например:

/proc/cpuinfo — информация о процессоре.

/proc/meminfo — информация о памяти.

/proc/[PID] — информация о конкретном процессе (где [PID] — это идентификатор процесса).

/proc/diskstats — статистика по дисковым операциям.

В отличие от обычных файлов, данные в файлах внутри /proc изменяются в реальном времени и отображают текущее состояние системы.

2. /sys — Системная файловая система (sysfs)

Псевдофайловая система /sys предоставляет доступ к информации о подключенных устройствах и их настройках. Она используется для взаимодействия с драйверами устройств и различными компонентами системы. Например:

/sys/class/net/ — информация о сетевых интерфейсах.

/sys/block/ — информация о блочных устройствах (жесткие диски, SSD и т.д.).

/sys/devices/ — информация об аппаратных устройствах.

В отличие от /proc, файловая система /sys предназначена в основном для взаимодействия с аппаратными устройствами и их параметрами.

3. /dev — Файловая система устройств (devfs)

Каталог /dev содержит специальные файлы, которые представляют собой устройства, подключенные к системе. Эти файлы используются для взаимодействия с аппаратными устройствами через файловые операции (чтение, запись). Примеры файлов в /dev:

/dev/sda — первый жесткий диск или SSD.

/dev/null — устройство, которое "поглощает" любые данные, отправленные в него.

/dev/tty — терминальные устройства.

Здесь каждый файл в /dev представляет собой устройство, с которым можно взаимодействовать через операции ввода-вывода.

4. /run — Файловая система временных данных

Псевдофайловая система /run используется для хранения временных данных, таких как PID-файлы, сокеты и другие данные, необходимые для работы системы и приложений. Данные в /run существуют только в оперативной памяти и не сохраняются между перезагрузками системы.

5. /tmp — Файловая система временных файлов

В некоторых конфигурациях /tmp может быть смонтирован как псевдофайловая система в оперативной памяти (tmpfs). В этом случае любые данные, записанные в /tmp, будут храниться в оперативной памяти и удалятся при перезагрузке системы.

Зачем нужны псевдофайловые системы?

Простота доступа к системной информации. С помощью псевдофайловых систем можно легко получить информацию о состоянии системы или устройств, просто читая файлы с помощью стандартных инструментов (например, cat).

Унификация интерфейса. В Unix-подобных системах всё является файлом, и псевдофайловые системы позволяют работать с системной информацией и устройствами так же, как с обычными файлами, используя привычные команды (ls, cat, echo и т.д.).

Управление системой. Некоторые псевдофайлы не только предоставляют информацию, но и позволяют изменять настройки. Например, запись в определенные файлы в /proc или /sys может изменить параметры ядра или устройств.

Что такое inodes айноды

Inode (индексный дескриптор) - структура данных, в которой хранятся метаданные файла и перечислены блоки с данными файла.

Хранит всю информацию, кроме имени файла и данных. Каждый файл в данном каталоге ( по факту таблица с индексами ( inumber ) ) является записью с именем файла и номером индекса.

Вся остальная информация о файле извлекается из таблицы индексов путем ссылки на номер индекса.

Номера inodes уникальны на уровне раздела. Каждый раздел имеет собственную таблицу индексов. Если у вас закончились inode, вы не можете создавать новые файлы, даже если у вас есть свободное место на данном разделе.

Inodes хранят метаданные о файле, к которому они относятся. Эти метаданные содержат всю информацию об указанном файле:

Размер.

Разрешение.

Владелец/группа.

Расположение жесткого диска.

Дата/время.

Любая другая необходимая информация.

Чтобы увеличить количество inode, нужно увеличить размер файловой системы, ведь количество инодов фиксированное и оно задается при создании файловой системы. Значит увеличение файловой системы = увеличение количества инодов.

Существуют файловые системы с динамическим количеством инодов, одна из которых - XFS.

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

Сети

Чем отличается TCP от UDP?

TCP – транспортный протокол передачи данных в сетях TCP/IP, предварительно устанавливающий соединение с сетью. Ориентирован на соединение, используется для передачи данных (электронная почта, файлы, сообщения). При определении потери пакетов будет выполнен перезапрос потерянных пакетов.

UDP – транспортный протокол, передающий сообщения-датаграммы без необходимости установки соединения в IP-сети. Не ориентирован на установление соединения, используется в потоковой передаче данных (IPTV, VoIP). При потере пакетов перезапроса потерянных пакетов не происходит.

Нельзя сказать, что TCP лучше UDP, т.к. данные транспортные протоколы используются для различных типов передачи трафика.

tcp перед передачей сигнала устанавливает связь между устройствами. И он требует хендшейк. udp сразу отправляет, хендшейк не устанавливает. Возможна частичная потеря и несоблюдение порядка данных. Но что делать, если доставка не гарантирована в таком случае? Просто отправляются по два пакета. Если один потерялся - дойдет второй.

Как TCP устанавливает соединение?

Клиент, который намеревается установить соединение, посылает серверу сегмент с номером последовательности и флагом SYN. Он является пакетом синхронизации. Устанавливается только в первом пакете хоста и сервера. Позволяет установить сеанс, делая возможным обеим сторонам согласовать порядковый номер для начала связи. Дальнейший алгоритм: Сервер получает сегмент, запоминает номер последовательности и пытается создать сокет (буферы и управляющие структуры памяти) для обслуживания нового клиента;

В случае успеха сервер посылает клиенту сегмент с номером последовательности и флагами SYN и ACK, и переходит в состояние SYN-RECEIVED;

В случае неудачи сервер посылает клиенту сегмент с флагом RST.

Если клиент получает сегмент с флагом SYN, то он запоминает номер последовательности и посылает сегмент с флагом ACK. Дальнейший алгоритм: Если он одновременно получает и флаг ACK (что обычно и происходит), то он переходит в состояние ESTABLISHED; Если клиент получает сегмент с флагом RST, то он прекращает попытки соединиться; Если клиент не получает ответа в течение 10 секунд, то он повторяет процесс соединения заново.

Если сервер в состоянии SYN-RECEIVED получает сегмент с флагом ACK, то он переходит в состояние ESTABLISHED. В противном случае после тайм-аута он закрывает сокет и переходит в состояние CLOSED. Процесс называется «трёхэтапным рукопожатием» (англ. three way handshake), так как несмотря на то что возможен процесс установления соединения с использованием четырёх сегментов (SYN в сторону сервера, ACK в сторону клиента, SYN в сторону клиента, ACK в сторону сервера), на практике для экономии времени используется три сегмента.

Как TCP поддерживает соединение?

Многие реализации TCP способны посылать сообщение о поддержании соединения (keep-alive), тестирующее неактивные соединения.

Такие сообщения периодически отправляются партнеру для проверки его существования в сети. В ответ должны поступать сообщения ACK. Использование сообщений о поддержании соединения не является обязательным. Если в системе имеется такая возможность, приложение может отменить ее собственными средствами.

Предполагаемый период по умолчанию для тайм-аута поддержания соединения составляет целых два часа!

Чем симметричное шифрование отличается от ассиметричного?

Принципиальное различие между этими двумя методами заключается в том, что алгоритмы симметричного шифрования используют один ключ, в то время как асимметричные используют два разных, но связанных между собой ключа

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

Как работает ICMP

ICMP — это сетевой протокол для передачи сообщений об ошибках, диагностики и управления сетью. Используется, например, в ping (проверка доступности узла) и traceroute (определение маршрута).

Работает на уровне IP: отправляет сообщения типа "узел недоступен", "время истекло" или "ответ эха". Не передаёт пользовательские данные, только служебную информацию.

Расскажи мне, как неподготовленному слушателю как устанавливает соединение SSH и происходит авторизация разными методами: по паролю и SSH-ключам.

Как работает SSH (очень просто и понятно): SSH (Secure Shell) — это способ безопасно подключаться к другому компьютеру по сети. Например, вы хотите управлять своим сервером, который находится где-то далеко. SSH позволяет вам это сделать, обеспечивая шифрование соединения, чтобы ваши данные (включая пароль) нельзя было перехватить.

Установка соединения (на пальцах):

Ваш компьютер (клиент) говорит серверу: "Привет, я хочу подключиться к тебе по SSH".

Сервер отвечает: "Окей, но сначала докажи, что ты тот, за кого себя выдаёшь".

Для доказательства вы можете использовать пароль или SSH-ключи.

Авторизация по паролю:

Сервер говорит: "Введи пароль".

Вы вводите пароль, и он шифруется (чтобы никто не мог его подслушать).

Сервер проверяет пароль: если он правильный, вас пускают; если нет — отказано.

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

Авторизация по SSH-ключам:

Вместо пароля вы заранее создаёте SSH-ключи:

Приватный ключ (хранится только у вас, никому не показывайте).

Публичный ключ (вы отдаёте серверу).

Когда вы подключаетесь:

Сервер говорит: "У тебя есть ключ? Докажи".

Сервер посылает вашему компьютеру особую "задачку" (шифрованное сообщение).

Ваш компьютер решает её с помощью приватного ключа и отправляет ответ.

Если сервер видит, что ответ правильный, он говорит: "Окей, заходи".

Плюсы ключей:

Не нужно вводить пароль.

Даже если кто-то перехватит данные, без вашего приватного ключа он не сможет подключиться.

Как работают сертификаты? Как подтверждается соединение? https соединение

1. Вы вводите в браузере доменное имя.

2. Сервер отправляет информацию об SSL-сертификате и публичный ключ.

3. Браузер проверяет информацию, генерирует сеансовый ключ, зашифровует его публичным ключем и отправляет назад.

4. Сервер расшифровывает сеансовый ключ.

5. Безопасное соединение установлено.

Процесс работает следующим образом:

Браузер или сервер пытается подключиться к веб-сайту (веб-серверу), защищенному с помощью SSL.

Браузер или сервер запрашивает идентификацию у веб-сервера.

В ответ веб-сервер отправляет браузеру или серверу копию своего SSL-сертификата и публичный ключ.

Браузер или сервер проверяет, является ли этот SSL-сертификат доверенным. У него уже зашиты сервера с помощью которых нужно производить проверку, с помощью центров сертификации. Если это так, он сообщает об этом веб-серверу. Генерирует сенасовый ключ, шифрует пебличным ключом и отправляет на сервер.

Сеервер расшифровывает сообщение и сохраняет сеансовый ключ. Затем веб-сервер возвращает подтверждение с цифровой подписью и начинает сеанс, зашифрованный с использованием SSL.

Зашифрованные данные используются совместно браузером или сервером и веб-сервером.

Этот процесс иногда называют подтверждением SSL-соединения. Хотя по описанию этот процесс выглядит длительным, в реальности он занимает миллисекунды.

Что происходит когда в браузере вводишь yandex.ru? Описать процесс

Любой URL содержит следующую структуру <протокол>/<хост>/путь, например https://yandex.ru/pogoda/samara. Также URL может содержать данные для отображения страницы.

При вводе URL браузер смотрит на протокол запроса. Если протокол в URL не указан, то браузер смотрит на список HSTS (HTTP Strict Transport Security - механизм, принудительно активирующий защищенное соединение через протокол HTTPS), если хост есть в данном списке, то браузер отправит запрос по протоколу HTTPS, если нет, то по HTTP.

Для того, чтобы установить соединение с сервером, необходим его IP адрес. Так как мы используем домен, то необходимо установить соответствие домена и IP адреса сервера, где размещается ресурс. При запросе мы обращаемся к DNS. Cначала проверяется кеш DNS. Приоритет опроса DNS кеша следующий:

Кеш браузера,

Проверяется hosts файл ,

Кеш ОС,

Кеш роутера,

Кеш интернет-провайдера Если данных о данном запрашиваемом хосте в кеше нет, то:

DNS интернет провайдера отправляет запрос к корневому серверу DNS (.),

Если корневой сервер не знает запрашиваемого домена, то он отправляет запрос серверу ответственному за зону (.ru), в которому привязан домен,

Если DNS сервер зоны не знает запрашиваемого домена, то запрос отправляется к NS серверу домена. IP адрес хоста, при его наличии у DNS сервера, возвращается обратно по цепочке

После того, как IP адрес хоста получили, необходимо сформировать на прикладном уровне запрос к серверу. К запросу добавляются следующие заголовки:

Прикладной уровень: протокол запроса (HTTP/S, FTP и т.д),

Транспортный (TCP/UDP): порт, по которому обращаемся к серверу.

Сетевой уровень: IP адрес пакета

Канальный уровень: определяет есть ли такой адрес в сети. Если нет, то пакет передаётся шлюзу.

Устройство шлюза проверяет свою таблицу маршрутизации и направляет пакет в нужном направлении.

Далее выполняется следующий алгоритм действий установления соединения:

После того, как запрос достиг сервера, клиент отправляет клиенту запрос (client hello) и свою версию протокола TLS на защищенное соединение.

Сервер отвечает клиенту (server hello) с информацией о выбранной версии TLS, методом шифрования, методом компресии и публичный сертификат сервера, подписанный центром сертификации. Сертификат содержит публичный ключ, который будет использован клиентом для шифрования данных.

Клиент подтверждает сертификат сервера с помощью своего списка центров сертификации. Если сертификат подписан центром из списка, то серверу можно доверять.

Клиент шифрует данные публичным ключом и отправляет серверу зашифрованное сообщение.

Сервер расшифровывает сообщение с помощью своего приватного ключа и генерирует симметричный мастер-ключ и отправляет его клиенту.

Клиент отправляет серверу сообщение о финише, шифруя хэш передачи с помощью симметричного ключа.

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

После этого защищенное соединение с сервером установлено.

Далее необходимо сформировать запрос серверу:

Клиент формирует запрос HTTP, в котором участвует метод (например GET), URL и версию протокола. Например GET /pogoda/samara HTTP/2.

Следующий заголовок клиента HOST, в котором указывается к какому хосту необходимо обратиться. Например HOST: yandex.ru. По заголовку HOST сервер может определить к какому сайту на сервере необходимо обратиться.

Запрос может также содержать и другие заголовки. Необходимо только, чтобы сервер смог понять эти заголовки.

После этого всё, соединение установлено

Как работает DNS, зачем он нужен? Типы DNS записей, какие бывают?

DNS (Domain Name System) – это система, которая переводит доменные имена (например, example.com) в IP-адреса (например, 192.0.2.1), необходимые для соединения устройств в сети.

**Как работает:**

1. Пользователь вводит доменное имя в браузере.

2. Запрос отправляется на DNS-сервер, который ищет соответствующий IP-адрес.

3. Если сервер не знает адрес, он передает запрос другим DNS-серверам (итеративно или рекурсивно).

4. После нахождения IP-адрес возвращается пользователю, и устройство подключается к нужному серверу.

**Зачем нужен:**

DNS упрощает взаимодействие с интернетом, позволяя использовать легко запоминаемые имена вместо числовых IP-адресов.

A запись: запись связывает доменное имя с ipv4 ip адресом.

AAAA запись: запись связывает доменное имя с ipv6 ip адресом.

CNAME запись (Canonical Name): одно доменное имя может быть алиасом другого допустим www.example.com и example.com .

NS запись: указывает имя сервера который обрабатывает информацию о домене.

MX запись: определяет почтовые серверы, принимающие почту для домена. допустим mail.example.com.

TTL запись: время жизни хранения записи. Представляет собой продолжительность кэширования записи каждым звеном цепочки установки соответствий DNS.

TXT запись: поле с текстом. Часто через это поле проверяют право владения доменом (если можешь менять записи значит ты владелец). Используется для выпуска сертификатов. Также для SPF записей, DKIM ключа (для почтовых сервисов)

PTR запись: обратная запись, которая позволяет связать IP адрес с доменом (эту запись может ставить ТОЛЬКО ВЛАДЕЛЕЦ IP АДРЕСА)

SOA запись: начальная запись зоны, которая указывает, на каком сервере хранится эталонная информация о домене.

Удалить эту запись нельзя. SOA-запись и ее значения не влияют на работу домена

Что такое рекурсивный и не рекурсивный запрос DNS

Рекурсивный сервер — это DNS-сервер, который настроен на выполнение запросов к другим DNS-серверам, пока не найдёт ответ на вопрос. Он вернёт клиенту ответ на его запрос, либо сообщение об ошибке (его получит системный распознаватель, который, в свою очередь, передаст его клиентскому приложению).

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

**Рекурсивный запрос:**

**Что происходит:** Клиент запрашивает у DNS-сервера определенную информацию (например, IP-адрес для `example.com`), и ожидает получить окончательный ответ, даже если серверу придется обращаться к другим DNS-серверам для его получения. Сервер берет на себя всю работу по поиску ответа.

**Как это работает:** Если DNS-сервер не знает ответа, он действует как посредник, отправляя запросы другим DNS-серверам (корневым, TLD, авторитативным) от имени клиента, пока не найдет ответ или не определит, что запрашиваемого ресурса не существует. Затем сервер возвращает окончательный ответ клиенту.

**Аналогия:** Представьте, что вы просите друга купить вам определенную книгу. В рекурсивном сценарии ваш друг берет на себя всю ответственность. Он обзванивает все книжные магазины, пока не найдет книгу или не убедится, что ее нигде нет, а затем возвращается к вам с книгой или сообщением, что ее не удалось найти.

**Когда используется:** Обычно используется конечными устройствами (компьютерами, смартфонами) при обращении к DNS-серверу, предоставленному провайдером или публичному DNS-серверу (например, Google Public DNS).

**Нерекурсивный запрос (итеративный):**

**Что происходит:** Клиент запрашивает у DNS-сервера информацию. Если сервер не имеет запрашиваемой информации, он возвращает клиенту referral – адрес следующего DNS-сервера, к которому следует обратиться (например, адрес корневого сервера или TLD-сервера). Клиент затем самостоятельно отправляет запрос этому серверу и повторяет процесс, пока не получит окончательный ответ.

**Как это работает:** Сервер отвечает на запрос только в том случае, если у него есть информация. В противном случае он направляет клиента к более авторитетному серверу. Клиент выполняет итеративный процесс, обращаясь к каждому серверу по очереди.

**Аналогия:** Снова представьте, что вы просите друга купить книгу. В нерекурсивном сценарии, если у вашего друга нет книги, он говорит вам, в какой книжный магазин обратиться. Затем вы идете в этот магазин, и если там нет книги, они направляют вас в другой магазин, и так далее, пока вы не найдете книгу или не узнаете, что ее нигде нет.

**Когда используется:** Используется DNS-серверами при взаимодействии друг с другом для разрешения имен. Например, когда рекурсивный DNS-сервер, получив запрос от клиента, начинает поиск ответа, он отправляет нерекурсивные запросы другим DNS-серверам.

**В кратце:**

**Рекурсивный:** Сервер делает всю работу.

**Нерекурсивный (итеративный):** Сервер дает подсказки, клиент выполняет всю работу по поиску.

На каком уровне работает протокол TCP?

Транспортный. Поскольку TCP является протоколом транспортного уровня.

Что такое TLS и SSL

TLS (Transport Layer Security) - это протокол, обеспечивающий безопасную передачу данных в интернете. Он шифрует связь между клиентом и сервером, защищая ее от подслушивания и подмены. SSL (Secure Sockets Layer) - это предшественник TLS. Сегодня используется TLS, а SSL считается устаревшим и небезопасным.

Какие существуют основные типы запросов HTTP?

Основные типы запросов HTTP (методы запроса) определяют, какое действие клиент хочет выполнить с ресурсом на сервере. Вот наиболее распространенные из них:

**GET:** Запрашивает данные с сервера. Это самый распространенный тип запроса. GET-запросы не должны иметь побочных эффектов на сервере, то есть они не должны изменять состояние данных. Параметры запроса передаются в URL.

**POST:** Отправляет данные на сервер для обработки. Обычно используется для создания новых ресурсов или обновления существующих. Данные передаются в теле запроса, а не в URL. POST-запросы могут иметь побочные эффекты.

**PUT:** Заменяет существующий ресурс на сервере данными, предоставленными в теле запроса. Если ресурс не существует, он может быть создан.

**PATCH:** Частично изменяет существующий ресурс. Отправляет только изменения, которые необходимо внести, а не весь ресурс целиком.

**DELETE:** Удаляет указанный ресурс на сервере.

**HEAD:** Аналогичен GET, но возвращает только заголовки ответа, без тела. Полезен для проверки метаданных ресурса, таких как размер или тип контента, без необходимости загружать весь ресурс.

**OPTIONS:** Запрашивает поддерживаемые сервером методы HTTP для указанного ресурса. Используется для определения возможностей сервера.

**CONNECT:** Используется для установления туннеля к серверу. Обычно используется для создания HTTPS-соединения через прокси-сервер.

**TRACE:** Отправляет запрос обратно клиенту, позволяя ему увидеть, как он был изменен промежуточными серверами. Используется для отладки.

В современных веб-приложениях наиболее часто используются GET, POST, PUT, PATCH и DELETE. Остальные методы используются реже и предназначены для более специфических задач.

Разница между PUT и POST в том, что PUT является идемпотентным, т.е. единичный и множественные вызовы этого метода, с идентичным набором данных, будут иметь тот же результат выполнения (без сторонних эффектов), в случае с POST, множественный вызов с идентичным набором данных может повлечь за собой сторонние эффекты такие как например: оформление одного и того же заказа несколько раз.

Что такое идемпотентность? Приведи пример таких операций, и противоположных им

Идемпотентность — это свойство операции, при котором многократное её выполнение приводит к такому же результату, как и однократное. Другими словами, повторный вызов идемпотентной функции с теми же аргументами не имеет дополнительных эффектов после первого вызова.

**Примеры идемпотентных операций:**

**Чтение данных (GET-запрос):** Независимо от того, сколько раз вы запрашиваете один и тот же ресурс с помощью GET, результат будет одинаковым (если ресурс сам не меняется на сервере).

* **PUT-запрос (при условии неизменности данных):** Если вы отправляете один и тот же PUT-запрос несколько раз с одинаковыми данными для обновления ресурса, состояние ресурса после первого запроса и всех последующих будет идентичным. Важно отметить, что PUT-запрос, изменяющий данные при каждом вызове (например, увеличивающий счетчик), *не* является идемпотентным.

**DELETE-запрос:** Удаление ресурса один раз и последующие попытки его удаления дадут один и тот же результат — ресурс будет удален. Код ответа сервера может отличаться (например, 204 No Content после первого удаления и 404 Not Found после последующих), но сам эффект — отсутствие ресурса — сохраняется.

**Примеры неидемпотентных операций:**

**POST-запрос (в большинстве случаев):** Каждый POST-запрос обычно создает новый ресурс или изменяет существующий, что приводит к различному состоянию сервера после каждого запроса. Например, отправка нескольких одинаковых POST-запросов на создание заказа может привести к созданию нескольких одинаковых заказов.

**PUT-запрос (с изменяемыми данными):** Как упоминалось ранее, если PUT-запрос изменяет данные при каждом вызове (например, добавляет единицу к счетчику), он не является идемпотентным.

**Перевод денег:** Если вы переведете 100 рублей с одного счета на другой несколько раз, каждый перевод изменит баланс счетов.

**Инкремент счетчика:** Каждое увеличение счетчика изменяет его значение.

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

Что такое IP и маска подсети?

**IP-адрес** (Internet Protocol address) — это уникальный идентификатор устройства в сети, использующийся для его адресации и взаимодействия с другими устройствами. Существует два основных типа IP-адресов:

**IPv4** — 32-битный адрес, представляется в виде четырёх десятичных чисел, разделённых точками (например, 192.168.0.1) Каждый октет (число между точками) представляет 8 бит и может принимать значения от 0 до 255..

**IPv6** — 128-битный адрес, используется для решения проблемы нехватки адресов в IPv4 (например, 2001:0db8:85a3:0000:0000:8a2e:0370:7334).

**Маска подсети** — это параметр, который определяет, какая часть IP-адреса относится к сети, а какая — к устройствам (хостам) в этой сети. Маска подсети помогает разделить IP-адрес на две части:

1. **Сетевая часть** — определяет сеть, к которой принадлежит устройство.

2. **Часть хоста** — идентифицирует конкретное устройство (хост) внутри этой сети.

Маска подсети в IPv4 также представляется в виде четырёх десятичных чисел, разделённых точками (например, 255.255.255.0). Она может быть записана и в виде префикса (например, /24), что означает количество единичных битов в маске.

Пример:

IP-адрес: 192.168.1.10

Маска подсети: 255.255.255.0 (или /24)

В данном примере первые 24 бита (192.168.1) — это сетевая часть, а последние 8 битов (10) — это часть хоста. Это значит, что все устройства с IP-адресами от 192.168.1.1 до 192.168.1.254 находятся в одной подсети.

Зачем нужен VLAN?

VLAN (Virtual Local Area Network), или так называемые виртуальные локальные сети, которые позволяют на на одном физическом порту роутера создать несколько виртуальных локальных сетей сразу.

Это разделение одной сети на несколько логических подсетей, разделенных друг от друга. Причем эти сети будут работать независимо друг от друга

Реализуется коммутаторами и находится на канальном уровне.

Зачем всё таки нужен

Изоляция сетей

Разные отделы внутри одной компании Допустим каждый отдел в компании захочет иметь свою собственную подсетку

Разные компании в бизнес-центре Можно конечно физические сети строить. Но мы заранее не знаем чего сколько должно быть. Логично построить одну сеть, а затем разбивать её логически на куски.

Преимущества

Нагрузка распределяется, чтобы вся сетка не парализовалась Ограничение широковещательного трафика Недостатки

Кажущаяся безопасность. Вроде бы данные идут куда надо, но любой желающий может подслушать любые данные, просто выставив нужный номер VLAN на подключённом устройстве

Почему DNS использует UDP?

DNS использует **UDP** (User Datagram Protocol) по следующим основным причинам:

1. **Быстрота и эффективность**:

- **UDP** не требует установки соединения, как это делает **TCP**. Это означает, что DNS-запросы и ответы могут быть отправлены и получены быстрее, с минимальной задержкой. В случае **UDP**, запрос отправляется сразу, без необходимости устанавливать соединение, что экономит время на выполнение DNS-запросов.

- DNS-запросы обычно очень малы (менее 512 байт для большинства стандартных запросов), и **UDP** отлично подходит для передачи таких коротких сообщений, поскольку он не требует дополнительных накладных расходов, связанных с управлением соединениями.

2. **Меньшая нагрузка на серверы**: - **UDP** не требует ведения состояния соединения на сервере. В отличие от **TCP**, где сервер должен отслеживать и обрабатывать установленные соединения, использование UDP избавляет сервер от необходимости поддерживать информацию о каждом клиенте. Это позволяет DNS-серверам обрабатывать больше запросов одновременно, что особенно важно, учитывая огромное количество DNS-запросов в сети.

3. **Проще и легче**: - **UDP** намного проще по своей природе, чем **TCP**, так как не требует подтверждения получения пакетов, управления порядком пакетов и других механизмов, которые требуются в TCP для обеспечения надёжной передачи данных. Для большинства DNS-запросов, которые небольшие и одноразовые, этого не требуется, что делает UDP лучшим выбором.

4. **Минимальные потери при ошибках**: - Если DNS-запрос или ответ теряется (например, из-за проблем в сети), клиент может просто отправить запрос повторно. Поскольку DNS-запросы обычно очень малы и просты, повторная отправка не создаёт значительных накладных расходов. Это также делает использование UDP оправданным, так как для большинства DNS-запросов от клиента требуется только один пакет, и потеря этого пакета не требует сложного восстановления, как это происходит в TCP.

Когда DNS использует **TCP**: Хотя DNS по умолчанию использует **UDP**, есть несколько случаев, когда он переключается на **TCP**:

1. **Размер ответа превышает 512 байт** (например, при DNSSEC или передаче зон), что требует использования TCP для более надёжной передачи больших данных.

2. **Повторные запросы не дали результата** — если сервер не отвечает на запрос по UDP (например, из-за потери пакета), клиент может переключиться на TCP для надёжной доставки запроса.

Заключение:

DNS использует **UDP**, потому что это быстрый, лёгкий и эффективный способ передачи небольших запросов и ответов. **UDP** снижает задержки и нагрузку на серверы, что делает его идеальным для типичных DNS-запросов.

Как работает NAT, зачем он нужен?

NAT (Network Address Translation), или преобразование сетевых адресов, — это механизм, который позволяет нескольким устройствам в частной сети использовать один публичный IP-адрес для доступа к Интернету. Он действует как посредник, изменяя IP-адреса и номера портов в пакетах данных, проходящих между частной и публичной сетями.

**Как работает NAT:**

1. **Запрос из частной сети:** Когда устройство в частной сети отправляет запрос в Интернет, пакет данных сначала попадает на NAT-устройство (обычно маршрутизатор).

2. **Преобразование адреса и порта:** NAT-устройство заменяет исходный IP-адрес (частный) в пакете на свой собственный публичный IP-адрес. Кроме того, оно выбирает случайный свободный номер порта на своей стороне и заменяет исходный порт этим новым номером. Эта комбинация из публичного IP-адреса и номера порта называется "преобразованием NAT". NAT-устройство сохраняет эту информацию в таблице преобразования NAT.

3. **Пересылка пакета:** Измененный пакет отправляется в Интернет.

4. **Ответ из Интернета:** Когда сервер в Интернете отвечает на запрос, он отправляет пакет данных на публичный IP-адрес и порт NAT-устройства.

5. **Обратное преобразование:** NAT-устройство, используя свою таблицу преобразования NAT, определяет, какому устройству в частной сети предназначается пакет. Оно заменяет IP-адрес назначения и номер порта в пакете на исходные частный IP-адрес и порт.

6. **Пересылка пакета во внутреннюю сеть:** Измененный пакет отправляется устройству в частной сети.

**Зачем нужен NAT?**

**Сохранение IP-адресов:** NAT позволяет множеству устройств в частной сети использовать один публичный IP-адрес. Это особенно важно в связи с ограниченным количеством доступных IPv4-адресов.

**Безопасность:** NAT действует как своего рода firewall, скрывая внутреннюю структуру сети от внешнего мира. Устройства в Интернете не могут напрямую обращаться к устройствам в частной сети, так как они видят только публичный IP-адрес NAT-устройства.

**Гибкость:** NAT позволяет легко изменять внутреннюю структуру сети без необходимости перенастраивать внешние сервисы. Можно добавлять, удалять и изменять IP-адреса устройств в частной сети без влияния на публичный IP-адрес.

**Упрощение администрирования:** NAT упрощает администрирование сети, так как нет необходимости управлять большим количеством публичных IP-адресов.

**Типы NAT:**

**Статический NAT (Static NAT):** Создает постоянное отображение между частным и публичным IP-адресом. Используется, когда устройству в частной сети требуется постоянный публичный IP-адрес (например, для игрового сервера).

**Динамический NAT (Dynamic NAT):** Назначает публичные IP-адреса из пула доступных адресов по мере необходимости. Это наиболее распространенный тип NAT.

**NAT с перегрузкой портов (Port Address Translation, PAT, или NAPT, Network Address Port Translation):** Позволяет нескольким устройствам в частной сети использовать один публичный IP-адрес и один порт, используя разные номера портов на стороне NAT-устройства. Это наиболее эффективный способ использования NAT.

В заключение, NAT является важной технологией, которая позволяет эффективно использовать ограниченное пространство IPv4-адресов и обеспечивает безопасность частных сетей. Он является неотъемлемой частью большинства современных сетей.

На каком уровне оси работает ssh?

SSH (Secure Shell) работает на **прикладном уровне** модели OSI (7 уровень).

Хотя SSH использует TCP (на транспортном уровне) для обеспечения надежной передачи данных, сам протокол SSH предоставляет сервисы, связанные с удаленным доступом к терминалу, передачей файлов и туннелированием, что характерно для прикладного уровня.

Можно провести аналогию с почтовой службой:

**Транспортный уровень (TCP):** Это как транспортная компания, которая гарантирует доставку письма от отправителя до получателя. Она заботится о надежности доставки, но не о содержании письма.

**Прикладной уровень (SSH):** Это само письмо и его содержание. SSH определяет, *как* будет осуществляться удаленный доступ, *какие* команды будут выполняться, и *какие* данные будут передаваться.

Таким образом, SSH, используя TCP для транспорта, реализует свои функции на прикладном уровне, предоставляя пользователям интерфейс для взаимодействия с удаленными системами.

Почему latency до 8.8.8.8 всегда низкий?

Latency до 8.8.8.8 (публичный DNS-сервер Google) обычно низкий по нескольким причинам:

Распределенная инфраструктура: Google размещает серверы 8.8.8.8 в многочисленных дата-центрах по всему миру. Это означает, что ваш запрос скорее всего будет направлен на сервер, физически расположенный недалеко от вас, минимизируя время прохождения сигнала. Чем ближе сервер, тем ниже latency.

Оптимизированная сеть: Google вложила значительные средства в построение высокопроизводительной и отказоустойчивой сетевой инфраструктуры. Их сеть спроектирована для быстрой и эффективной маршрутизации трафика, сводя к минимуму задержки и потери пакетов.

Anycast: Google использует технологию Anycast для 8.8.8.8. Anycast позволяет объявить один и тот же IP-адрес из нескольких мест. Когда вы отправляете запрос на 8.8.8.8, ваш трафик направляется на ближайший сервер с этим IP-адресом, что опять же способствует низкому latency.

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

Простота запросов: Запросы к DNS-серверам, как правило, довольно небольшие по объему данных. Это способствует быстрой обработке запроса и уменьшению времени отклика.

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

Docker

Легенда

Раскрывающийся текст

Легенда

Раскрывающийся текст

Легенда

Раскрывающийся текст

Легенда

Раскрывающийся текст

Легенда

Раскрывающийся текст

Легенда

Раскрывающийся текст

Легенда

Раскрывающийся текст

Легенда

Раскрывающийся текст

Легенда

Раскрывающийся текст

Легенда

Раскрывающийся текст

Легенда

Раскрывающийся текст

Легенда

Раскрывающийся текст

Легенда

Раскрывающийся текст

Легенда

Раскрывающийся текст

Легенда

Раскрывающийся текст

Легенда

Раскрывающийся текст

Легенда

Раскрывающийся текст

Легенда

Раскрывающийся текст