added: Пересобрана структура вопросов (#5)
This commit is contained in:
21
README.md
21
README.md
@@ -3,13 +3,14 @@
|
||||
В данном репозитории представлены вопросы для собеседований по основным темам Linux инженера и/или DevOps инженера.
|
||||
|
||||
## Основные темы:
|
||||
1. [Linux. Basic](questions/linux.basic.md)
|
||||
2. [Linux. Main+](questions/linux.mainPlus.md)
|
||||
3. [Теория DevOps](questions/theoryDevOps.md)
|
||||
4. [Git](questions/git.md)
|
||||
5. [CI/CD](questions/cicd.md)
|
||||
6. [Terraform](questions/terraform.md)
|
||||
7. [Docker](questions/docker.md)
|
||||
8. [Ansible](questions/ansible.md)
|
||||
9. [Kubernetes / Openshift](questions/kubernetes.md)
|
||||
10. [Тестовые практические задания](questions/practice.md)
|
||||
1. [Linux](questions/linux.md)
|
||||
2. [Сети](questions/networks.md)
|
||||
3. [Базы данных](questions/databases.md)
|
||||
4. [Теория DevOps](questions/theoryDevOps.md)
|
||||
5. [Git](questions/git.md)
|
||||
6. [CI/CD](questions/cicd.md)
|
||||
7. [Terraform](questions/terraform.md)
|
||||
8. [Docker](questions/docker.md)
|
||||
9. [Ansible](questions/ansible.md)
|
||||
10. [Kubernetes / Openshift](questions/kubernetes.md)
|
||||
11. [Тестовые практические задания](questions/practice.md)
|
||||
|
||||
69
questions/databases.md
Normal file
69
questions/databases.md
Normal file
@@ -0,0 +1,69 @@
|
||||
1. Как настроить master-slave репликацию в mysql (кратко)?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
Необходимы 2 сервера: master и slave.
|
||||
|
||||
1. На обеих сервера устанавливаем сервер MySQL одинаковой версии.
|
||||
2. Включаем сервер базы данных на обеих серверах.
|
||||
3. Настраиваем master - в `/etc/my.cnf` устанавливаем слеюущие значения:
|
||||
```
|
||||
# выбираем ID сервера, произвольное число, лучше начинать с 1
|
||||
server-id = 1
|
||||
# путь к бинарному логу
|
||||
log_bin = /var/log/mysql/mysql-bin.log
|
||||
# название Вашей базы данных, которая будет реплицироваться
|
||||
binlog_do_db = newdatabase
|
||||
```
|
||||
Перезапускаем сервер базы данных.
|
||||
4. Подключаемся к master серверу, создаем пользователя и назначаем ему права для выполнения репликации.
|
||||
```
|
||||
mysql -u root -p <пароль root сервера БД>
|
||||
GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY 'password';
|
||||
FLUSH PRIVILEGES;
|
||||
```
|
||||
5. На master сервере делаем дамп базы данных c блокировкой таблиц.
|
||||
```
|
||||
mysqldump -u root -p --lock-all-tables newdatabase > newdatabase.sql
|
||||
```
|
||||
6. Переносим дамп базы на slave сервер, создаем базу данных с таким же именем и импортируем базу.
|
||||
```
|
||||
CREATE DATABASE newdatabase;
|
||||
mysql -u root -p newdatabase < newdatabase.sql
|
||||
```
|
||||
7. Настраиваем slave в `/etc/my.cnf`:
|
||||
```
|
||||
# ID Слейва, удобно выбирать следующим числом после Мастера
|
||||
server-id = 2
|
||||
# Путь к relay логу
|
||||
relay-log = /var/log/mysql/mysql-relay-bin.log
|
||||
# Путь к bin логу на Мастере
|
||||
log_bin = /var/log/mysql/mysql-bin.log
|
||||
# База данных для репликации
|
||||
binlog_do_db = newdatabase
|
||||
```
|
||||
Перезапускаем сервер базы данных.
|
||||
8. Запускаем репликацию на slave сервере.
|
||||
```
|
||||
CHANGE MASTER TO MASTER_HOST='10.10.0.1', MASTER_USER='slave_user', MASTER_PASSWORD='password',
|
||||
MASTER_LOG_FILE = 'mysql-bin.000001', MASTER_LOG_POS = 107;
|
||||
##Указанные значения мы берем из настроек Мастера
|
||||
После этого запускаем репликацию на Слейве:
|
||||
START SLAVE;
|
||||
```
|
||||
9. Проверяем статус репликации:
|
||||
```
|
||||
SHOW SLAVE STATUSG
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
2. Какой тип базы данных использует Prometheus?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
Prometheus использует TSDB (time series database).
|
||||
|
||||
</details>
|
||||
@@ -1,494 +0,0 @@
|
||||
## Linux. Basic
|
||||
|
||||
1. Что такое LA? В каких единицах измеряется?
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
LA (load average) -- параметр, определяющий среднюю нагрузку на систему за период времени (1 мин, 5 минут, 15 минут). Изменяется в количестве задач на одно ядро процессора. На нагрузку системы также влияет количество задач ввода-вывода и задержка сети. Также влияние на расчета LA оказывает: 1. Технология Hyper-Threading, которая делит одно физическое ядро на 2 логических, 2. Технология Turbo Bust, которая позволяет разгонять тактовую частоту процессора и работать на частоте выше заявленной, т.е. выше номинальной частоты (время на обработку одной задачи уменьшается).
|
||||
</details>
|
||||
|
||||
2. Что будет если на сервере LA = 100?
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
Вероятно, что на сервере будет наблюдаться замедленная работа сервисов, но если параметр LA равен количеству ядер в системе или количеству потоков в системе, то данная нагрузка является нормальной.
|
||||
</details>
|
||||
|
||||
3. Почему при высоких показателях значения LA на сервере может не наблюдаться проблем (консоль ssh отзывается, сервисы работают в обычном режиме)?
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
На параметр нагрузки LA влияет также и ожидание ввода-вывода (параметр *wa* в утилите *top*) в дисков и задержка сети. Данные параметры могут не влиять на работу основных сервисов в системе, но учитываются при расчете общей нагрузки на систему.
|
||||
|
||||
</details>
|
||||
|
||||
4. Представлен вывод команды *top*. Что означает каждая запись в выводе?
|
||||
```
|
||||
top - 21:29:24 up 14:18, 1 user, load average: 0,78, 1,48, 1,10
|
||||
Tasks: 277 total, 3 running, 274 sleeping, 0 stopped, 0 zombie
|
||||
%Cpu(s): 12,4 us, 2,5 sy, 0,1 ni, 84,8 id, 0,1 wa, 0,0 hi, 0,1 si, 0,0 st
|
||||
KiB Mem : 7106404 total, 306972 free, 3127144 used, 3672288 buff/cache
|
||||
KiB Swap: 8191996 total, 8191996 free, 0 used. 3270520 avail Mem
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
*top* - название утилиты.
|
||||
|
||||
*21:29:24* - текущее время системы.
|
||||
|
||||
*up 14:18* - сколько часов:минут система работает с момента последнего запуска.
|
||||
|
||||
*1 user* - количество пользователей авторизованных в системе.
|
||||
|
||||
*load average: 0,78, 1,48, 1,10* - параметр средней нагрузки на систему за период времени 1 минута, 5 минут, 15 минут.
|
||||
|
||||
*277 total* - всего процессов в системе.
|
||||
|
||||
*3 running* - количество процессов в работе.
|
||||
|
||||
*274 sleeping* - количество процессов в состоянии 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-памяти.
|
||||
|
||||
</details>
|
||||
|
||||
5. Как в утилите top в Linux посмотреть нагрузку на каждое ядро процессора?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
В утилите top нажать `1`, чтобы отобразить все ядра в системе.
|
||||
|
||||
</details>
|
||||
|
||||
6. Как в утилите top в Linux посмотреть какой командой был запущен процесс?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
В утилите top нажать `c`, чтобы отобразить команды, которыми были запущены процессы.
|
||||
|
||||
</details>
|
||||
|
||||
6. Как происходит HTTPS соединение?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
Когда вы вводите адрес сайта в браузере, он спрашивает у сервера, установлен ли для сайта сертификат. В ответ сервер отправляет общую информацию об SSL-сертификате и публичный ключ, то есть сам сертификат. Браузер сверяет информацию со списком авторизованных центров сертификации. Если всё в порядке, браузер генерирует сеансовый ключ, зашифровывает его публичным ключом и отправляет на сервер. Сервер расшифровывает сообщение и сохраняет сеансовый ключ. После этого между браузером и сайтом устанавливается безопасное соединение через протокол HTTPS.
|
||||
|
||||

|
||||
|
||||
</details>
|
||||
|
||||
7. Чем отличается TCP от UDP? Что лучше?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
TCP – транспортный протокол передачи данных в сетях TCP/IP, предназначен для управления передачей данных интернета. Пакеты в TCP называются сегментами.
|
||||
Ориентирован на соединение, используется для передачи данных (электронная почта, файлы, сообщения). При определении потери пакетов будет выполнен перезапрос потерянных пакетов.
|
||||
|
||||
UDP – транспортный протокол, передающий сообщения-датаграммы без необходимости установки соединения в IP-сети. Не ориентирован на установление соединения, используется в потоковой передаче данных (IPTV, VoIP). При потере пакетов перезапроса потерянных пакетов не происходит.
|
||||
|
||||
Нельзя сказать, что TCP лучше UDP, т.к. данные транспортные протоколы используются для различных типов передачи трафика.
|
||||
|
||||
</details>
|
||||
|
||||
8. Как происходит соединение TCP?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||

|
||||
|
||||
1. Клиент, который намеревается установить соединение, посылает серверу сегмент с номером последовательности и флагом SYN.
|
||||
Дальнейший алгоритм:
|
||||
Сервер получает сегмент, запоминает номер последовательности и пытается создать сокет (буферы и управляющие структуры памяти) для обслуживания нового клиента;
|
||||
В случае успеха сервер посылает клиенту сегмент с номером последовательности и флагами SYN и ACK, и переходит в состояние SYN-RECEIVED;
|
||||
В случае неудачи сервер посылает клиенту сегмент с флагом RST.
|
||||
2. Если клиент получает сегмент с флагом SYN, то он запоминает номер последовательности и посылает сегмент с флагом ACK.
|
||||
Дальнейший алгоритм:
|
||||
Если он одновременно получает и флаг ACK (что обычно и происходит), то он переходит в состояние ESTABLISHED;
|
||||
Если клиент получает сегмент с флагом RST, то он прекращает попытки соединиться;
|
||||
Если клиент не получает ответа в течение 10 секунд, то он повторяет процесс соединения заново.
|
||||
|
||||
3. Если сервер в состоянии SYN-RECEIVED получает сегмент с флагом ACK, то он переходит в состояние ESTABLISHED.
|
||||
В противном случае после тайм-аута он закрывает сокет и переходит в состояние CLOSED.
|
||||
Процесс называется «трёхэтапным рукопожатием» (англ. three way handshake), так как несмотря на то что возможен процесс установления соединения с использованием четырёх сегментов (SYN в сторону сервера, ACK в сторону клиента, SYN в сторону клиента, ACK в сторону сервера), на практике для экономии времени используется три сегмента.
|
||||
|
||||
</details>
|
||||
|
||||
9. Какие стандартные коды ответов есть у веб-серверов?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
- 1XX — информационные коды. Они отвечают за процесс передачи данных. Это временные коды, они информируют о том, что запрос принят и обработка будет продолжаться.
|
||||
- 2XX — успешная обработка. Запрос был получен и успешно обработан сервером.
|
||||
- 3XX — перенаправление (редирект). Эти ответы сервера гласят, что нужно предпринять дальнейшие действия для выполнения запроса. Например, сделать запрос по другому адресу.
|
||||
- 4XX — ошибка пользователя. Это значит, что запрос не может быть выполнен по его вине.
|
||||
- 5XX — ошибка сервера. Эти коды возникают из-за ошибок на стороне сервера. В данном случае пользователь всё сделал правильно, но сервер не может выполнить запрос. Для кодов этого класса сервер обязательно показывает сообщение, что не может обработать запрос и по какой причине.
|
||||
|
||||
</details>
|
||||
|
||||
10. Какие существуют основные типы запросов HTTP?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
Два наиболее часто используемых видов HTTP запросов это: GET и POST.
|
||||
|
||||
GET - запрашивает данные с определенного ресурса (сайта).
|
||||
POST - отправляет данные на сервер для последующей их обработки.
|
||||
|
||||
Особенности GET запроса:
|
||||
- Может быть закэширован
|
||||
- Остается в истории браузера
|
||||
- Может быть закладкой в браузере
|
||||
- Не должен использоваться при работе с крайне важными данными
|
||||
- Имеет ограниченную длину
|
||||
- Должен применяться только для получения данных
|
||||
|
||||
Особенности POST запроса:
|
||||
- Не кэшируется
|
||||
- Не может быть закладкой в браузере
|
||||
- Не остаётся в истории браузера
|
||||
- Нет ограничений по длине запроса
|
||||
|
||||
| Заголовок | Описание |
|
||||
|-----------|---------------------------------------------------------------------------------------------|
|
||||
| HEAD | Тоже самое что GET, однако возвращает только HTTP заголовки и не возвращает тело документа. |
|
||||
| DELETE | Удаляет определенный ресурс. |
|
||||
| PUT | Загружает представление определенного URI. |
|
||||
| OPTIONS | Возвращает список видов запросов, поддерживаемых веб-сервером. |
|
||||
| CONNECT | Создает прозрачный TCP/IP туннель для передачи запросов. |
|
||||
|
||||
</details>
|
||||
|
||||
11. Где хранятся имена файлов/директорий?
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
- Inodes не содержат имён файлов, только другие метаданные файла.
|
||||
- Каталоги Unix представляют собой списки ассоциативных структур, каждая из которых содержит одно имя файла и один номер индекса.
|
||||
- Драйвер файловой системы должен найти каталог, ищущий определенное имя файла, а затем преобразовать имя файла в правильный соответствующий номер индекса.
|
||||
|
||||
Таким образом имя файла/директории хранится в информационной структуре каталов.
|
||||

|
||||
|
||||
</details>
|
||||
|
||||
12. Как удалить файл с именем `-rf`?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
```
|
||||
rm ./-rf
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
13. Как посмотреть описание дискриптора? Как посмотреть время последней модификации файла?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
Посмотреть полную информацию по дискриптору возможно командой `stat <path_to_file>`.
|
||||
Время модификации:
|
||||
```
|
||||
stat --format=%y dira
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
14. Для чего нужна переменная окружения PATH?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
Переменная окружения PATH содержит абсолютные пути директорий, в которых производится поиск исполняемых файлов при вводе команд
|
||||
|
||||
</details>
|
||||
|
||||
15. Как посмотреть нагрузку на диски?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
Установить утилиту `sysstat`, проверить нагрузку на диски `iostat -xtc`.
|
||||
|
||||
</details>
|
||||
|
||||
16. Клиент пишет, что заходит на свой сайт и он к нему подключается через раз. Что делать, что спрашивать от клиента?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
Необходимо спросить у клиента какую ошибку он наблюдает при неудачном запросе сайта, в какое время. Если проблема периодическая, то возможно проблема на стороне провайдера клиента. Необходимо запросить у клиента анализ сети с помощью утилит `traceroute`, `mtr` с того узла, где он наблюдает проблему и до сайта
|
||||
|
||||
</details>
|
||||
|
||||
17. Что такое 127.0.0.1 адрес? Для чего нужен?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
127.0.0.1 адрес или localhost доменное имя, а также зарезервированная сеть 127.0.0.1/8 частных IP адресов предназначены для тестирования программы на той же физической машине, где она запускается.
|
||||
|
||||
Использование адреса 127.0.0.1 позволяет устанавливать соединение и передавать информацию для программ-серверов, работающих на том же компьютере, что и программа-клиент, независимо от конфигурации аппаратных сетевых средств компьютера (не требуется сетевая карта, модем, и прочее коммуникационное оборудование, интерфейс реализуется при помощи драйвера псевдоустройства в ядре операционной системы)
|
||||
|
||||
Так же адрес 127.0.0.1 устанавливается для запрета доступа к сервису из внешней сети. Например:
|
||||
```
|
||||
docker run -d -p 127.0.0.1:3306:3306 mysql
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
18. Что такое файл в понятиях Unix-like операцинных системах?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
Файлы - это объекты, в которые мы записываем информацию и наши данные, исполняемые файлы, но кроме этих привычных нам понятий здесь есть файлы специального назначения - файлы устройств, файлы туннелей, сокетов и многое другое.
|
||||
|
||||
Типы файлов в Linux:
|
||||
- Обычные файлы, для хранения информации;
|
||||
- Специальные файлы - для устройств и туннелей;
|
||||
- Директории.
|
||||
|
||||
</details>
|
||||
|
||||
19. Что такое RAID? Какие массивы бывают?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
RAID (Redundant Array of Independent Disks) - избыточный массив независимых дисков, технология виртуализации данных для объединения нескольких физических дисковых устройств в логический модуль для повышения отказоустойчивости и производительности.
|
||||
|
||||
В зависимости от количества дисков и класса отказоустойчивости существуют следующие основные типы RAID:
|
||||
RAID 0:
|
||||
RAID 1:
|
||||
RAID 5:
|
||||
RAID 6:
|
||||
RAID 10:
|
||||
|
||||
</details>
|
||||
|
||||
20. При каком количестве одновременно вышедших из строя дисков обеспечивает работоспособность RAID 6?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
2 диска.
|
||||
|
||||
</details>
|
||||
|
||||
21. В чем разница между объявлением переменной `export VAR="VALUE"` и `VAR="VALUE"` в bash?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
При объявлении переменной через export - переменная будет доступна в любых других процессах, при обычном объявлении переменной - переменная будет доступна только в запущенном процессе.
|
||||
|
||||
</details>
|
||||
|
||||
22. Как остановить выполнение скрипта в bash при возникновении ошибки в команде?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
Команда `set -e` завершит скрипт с ошибкой, в случае, если в нижеследующем bash коде будет обнаружена ошибка. По-умолчанию bash скрипт продолжает работу, если в ходе выполнения возникла ошибка.
|
||||
|
||||
</details>
|
||||
|
||||
23. Что в bash скрипте означает команда `set -euo pipefail`?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
Команда `set` устанавливает аттрибуты оболочки с опеределенных опций.
|
||||
Опция `-e` - означает, что скрипт будет остановлен, когда произойдет ошибка в ходе его выполнения.
|
||||
Опция `-u` - означает, что скрипт будет остановлен, если в ходе скрипта, будет обнаружена переменная, которая не определена.
|
||||
Опция `-o pipefail` - означает, что скрипт будет остановлен, если в ходе пайплайна команд будет выявлена ошибка.
|
||||
|
||||
</details>
|
||||
|
||||
24. Как активировать debug режим в bash?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
Команда `set -x` в начале скрипта активирует вывод в консоль debug информации.
|
||||
|
||||
</details>
|
||||
|
||||
25. Что значит `$@` в bash?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
`$@` - все параметры переданные скрипту.
|
||||
|
||||
</details>
|
||||
|
||||
26. Какой код сигнала будет выполнен при исполнении команды `kill <PID>`?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
Сигнал SIGTERM (код 15) - это сигнал по-умолчанию отправляемый при вызове команды kill. Это указывает процессу на завершение работы и обычно считается сигналом для использования при чистом завершении работы.
|
||||
|
||||
</details>
|
||||
|
||||
27. Как выполнить фильтрацию вывода команды, чтобы на экран были выведены только ошибки (STDERR), игнорируя STDOUT?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
```
|
||||
cmd 2>&1 >/dev/null | grep pattern
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
28. Какую команду необходимо выполнить, чтобы посмотреть какие пользователи вошли в систему в систему?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
Команда `w` покажет список пользователей, которые вошли на сервер.
|
||||
|
||||
</details>
|
||||
|
||||
29. Какой файл необходимо отредактировать, чтобы отключить ssh аутентификацию по паролю?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
Необходимо редактировать файл `/etc/ssh/sshd_config`, отвечающий за конфигурацию сервиса ssh.
|
||||
|
||||
</details>
|
||||
|
||||
30. В каком файле находится информация о смонтированных каталогах в файловую систсему?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
Файл `/etc/fstab` содержит информацию о смонтированных каталогах в файловую систему.
|
||||
|
||||
</details>
|
||||
|
||||
31. Что выведет команда `cat a` и почему?
|
||||
```
|
||||
mkdir /tmp/abc
|
||||
cd /tmp/abc
|
||||
ls >a 2>b
|
||||
cat a
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
`cat a` выведет
|
||||
```
|
||||
a
|
||||
b
|
||||
```
|
||||
Обработка команды идёт справа налево. Сначала создается файл *b*, потом создается файл *a*, команда `ls` отображает список файлов в текущей директории (файлы *a* и *b* уже созданы) в одну колонну и перенаправляет стандартный поток вывода (`>`) в файл *a*, а стандартный поток ошибок `2` в файл *b*.
|
||||
|
||||
</details>
|
||||
|
||||
32. Какой транспортный протокол использует DNS? В каком случае DNS работает по UDP, а в каком по TCP?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
Все реализации DNS серверов должны поддерживать использование обоих протоколов транспортного уровня (TCP и UDP). Большинство DNS-запросов будет обрабатываться с использованием протокола UDP, исключение составляют трансфер зоны (Query type AXFR) и ответы сервера, превышающие 512 байт на одно сообщение. На вопрос "зачем?" ответ простой -- чтобы не использовались для DDoS.
|
||||
|
||||
</details>
|
||||
|
||||
33. В bash-скрипте указан аттрибут оболочки `set -x`. В одной из команд происходит ошибка и скрипт завершает свою работу. Как сделать, чтобы при возникновении ошибки в определенной команде скрипт продолжил свою работу?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
1 вариант: указать `|| true` после выполнения команды с ошибкой.
|
||||
```sh
|
||||
<command with error> || true
|
||||
```
|
||||
|
||||
2 вариант: до выполнения данной команды указать `set +e` для игнорирования ошибок, начиная со следующей строки и после выполнения команды указать `set -e` для завершения работы скрипта в случае ошибки, начиная со следующей строки.
|
||||
```sh
|
||||
set -e
|
||||
<command 1>
|
||||
<command 2>
|
||||
set +e
|
||||
<command 3 wih error>
|
||||
set -e
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
34. Сколько адресов в следующих подсетях?
|
||||
```
|
||||
192.168.5.0/24
|
||||
192.168.5.0/23
|
||||
192.168.5.0/19
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
192.168.5.0/24 - 254 хостов (+1 адрес сети, +1 broadcast)
|
||||
192.168.5.0/23 - 510 хостов (+1 адрес сети, +1 broadcast)
|
||||
192.168.5.0/19 - 8190 хостов (+1 адрес сети, +1 broadcast)
|
||||
|
||||
</details>
|
||||
|
||||
35. Что такое протокол IP?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
IP (Internet Protocol) - протокол сетевого уровня стека TCP/IP.
|
||||
|
||||
Основной задачей протокола является доставка датаграмм между хостами сетей TCP/IP через произвольное число промежуточных узлов (маршрутизаторов).
|
||||
|
||||
Функции, реализуемые IP:
|
||||
- Основа передачи данных.
|
||||
- Адресация.
|
||||
- Маршрутизация.
|
||||
- Фрагментация датаграмм.
|
||||
Протокол IP не гарантирует надежной доставки пакета: пакеты могут прийти в неправильном порядке, пакет может быть утерян, пакет может продублироваться или оказаться поврежденным. За надежность доставки пакетов отвечают протоколы транспортного уровня.
|
||||
|
||||
На данный момент наиболее распространена четвертая версия протокола (IPv4), однако ведутся активные работы по внедрению более совершенного IPv6.
|
||||
|
||||
</details>
|
||||
|
||||
@@ -1,372 +0,0 @@
|
||||
## Linux.Main+
|
||||
|
||||
1. Что такое системный вызов, какие они бывают?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
Системный вызов - обращение программы к ядру операционной системы для выполнения какой-либо операции.
|
||||
|
||||
В Unix, Unix-like и других POSIX-совместимых операционных системах популярными системными вызовами являются:
|
||||
- open,
|
||||
- read,
|
||||
- write,
|
||||
- close,
|
||||
- wait,
|
||||
- exec,
|
||||
- fork,
|
||||
- exit,
|
||||
- kill.
|
||||
|
||||
</details>
|
||||
|
||||
2. Что такое сигнал в Unix, зачем они нужны и разница между 9 и 15 сигналами?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
Сигнал - в Unix-like операционных системах - асинхронное (в случайное время) уведомление процесса для обработки какого-либо события. Один из основных способов взаимодействия между процессами.
|
||||
|
||||
Посылка сигналов от одного процесса к другому обычно осуществляется при помощи системного вызова *kill*. Его первый параметр – PID процесса, которому посылается сигнал; второй параметр – номер сигнала.
|
||||
```
|
||||
kill(1111, SIGTERM);
|
||||
```
|
||||
|
||||
Стандарт POSIX определяет 28 сигналов. Некоторые из них:
|
||||
|
||||
| Сигнал | Код | Описание |
|
||||
|-|-|-|
|
||||
| SIGTERM | 15 | Сигнал завершения (сигнал по умолчанию для утилиты kill) |
|
||||
| SIGKILL | 9 | Безусловное завершение |
|
||||
| SIGSTOP | 23 | Остановка выполнения процесса |
|
||||
| SIGHUP | 1 | Закрытие терминала (перечитать конфигурацию) |
|
||||
| SIGINT | 2 | Сигнал прерывания (Ctrl-C) с терминала |
|
||||
|
||||
</details>
|
||||
|
||||
4. Что такое inode? Какая информация там хранится?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
Inode (индексный дескриптор) - структура данных, в которой хранятся метаданные файла и перечислены блоки с данными файла. Хранит всю информацию, кроме имени файла и данных. Каждый файл в данном каталоге является записью с именем файла и номером индекса. Вся остальная информация о файле извлекается из таблицы индексов путем ссылки на номер индекса. Номера inodes уникальны на уровне раздела. Каждый раздел как собственная таблица индексов. Если у вас закончились inode, вы не можете создавать новые файлы, даже если у вас есть свободное место на данном разделе.
|
||||
|
||||
Inodes хранит метаданные о файле, к которому он относится. Эти метаданные содержат всю информацию об указанном файле.
|
||||
- Размер.
|
||||
- Разрешение.
|
||||
- Владелец/группа.
|
||||
- Расположение жесткого диска.
|
||||
- Дата/время.
|
||||
- Любая другая необходимая информация.
|
||||
|
||||
</details>
|
||||
|
||||
5. Что такое hard link? В чем разница между hard link и soft link? Примеры их практического применения.
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
**Hard link**:
|
||||
Ссылка на файл в файловой системе с использованием такого же inode идентификатора, как у файла, на который ссылаемся.
|
||||
Создадим файл *realFile*.
|
||||
```
|
||||
touch realFile
|
||||
```
|
||||
Создадим hard link командой `ln <целевой_файл> <файл_ссылка>`:
|
||||
```
|
||||
ln realFile hardLink
|
||||
```
|
||||
Проверим, что inode у файла *realFile* и hard ссылке *hardLink* имеют одинаковый идентификатор.
|
||||
```
|
||||
$ ls -li
|
||||
итого 0
|
||||
2359720 -rw-r--r-- 2 rmntrvn rmntrvn 0 апр 25 23:24 hardLink
|
||||
2359720 -rw-r--r-- 2 rmntrvn rmntrvn 0 апр 25 23:24 realFile
|
||||
```
|
||||
Как видно realFile и hardLink имеют одинаковый идентификатор inode.
|
||||
|
||||
**Soft link**:
|
||||
Создадим soft ссылку на файл *realFile*.
|
||||
```
|
||||
ln -s realFile softLink
|
||||
```
|
||||
Проверим, что чистовой идентификатор *softLink* отличается от числового идентификатора *realFile*.
|
||||
```
|
||||
$ ls -li
|
||||
итого 0
|
||||
2359720 -rw-r--r-- 2 rmntrvn rmntrvn 0 апр 25 23:24 hardLink
|
||||
2359720 -rw-r--r-- 2 rmntrvn rmntrvn 0 апр 25 23:24 realFile
|
||||
2366763 lrwxrwxrwx 1 rmntrvn rmntrvn 8 апр 25 23:29 softLink -> realFile
|
||||
```
|
||||
|
||||
Некоторые нюансы:
|
||||
- Soft ссылки используют различные номера inode, чем основные файлы.
|
||||
- Soft ссылки становятся полезными, если исходный файл был удален.
|
||||
- Soft ссылки могут быть созданы из каталогов.
|
||||
- Soft ссылка может быть создана на пересечении файловых систем.
|
||||
|
||||
- Hard ссылка может размещаться только на том же логическом разделе, что и оригинальный файл. Это связано с независимой идентификацией файлов на разных разделах.
|
||||
- Создание жестких ссылок не поддерживается для папок — только для файлов.
|
||||
- Файловая система должна поддерживать работу с hard ссылками.
|
||||
|
||||
</details>
|
||||
|
||||
6. Какие состояния процессов существуют? Что значит состояние процесса D?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
| **Статус** | **Описание** |
|
||||
|:----------------------------------------------:|:---------------------------------------:|
|
||||
| R (running or runnable) | Выполняется или готов к выполнению |
|
||||
| D (uninterruptible sleep) | Ожидает записи на диск |
|
||||
| S (interruptible sleep) | Неактивен (< 20 s) |
|
||||
| T (stopped by job control signal) | Остановлен или трассируется отладчиком |
|
||||
| Z (zombie) | зомби |
|
||||
| W (paging (not valid since the 2.6.xx kernel)) | Процесс выгружен на диск |
|
||||
| < | Процесс имеет повышенный приоритет nice |
|
||||
| N | Процесс имеет пониженный приоритет nice |
|
||||
| L (locked) | Некоторые страницы блокированы в ядре |
|
||||
| s | Процесс является лидеров сеанса |
|
||||
|
||||
</details>
|
||||
|
||||
7. Что такое процесс-зомби и процесс-сирота? Можно ли самостоятельно сделать зомби?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
*Процесс-зомби* - дочерний процесс в Unix-системе, завершивший своё выполнение, но ещё присутствующий в списке процессов операционной системы, чтобы дать родительскому процессу считать код завершения.
|
||||
|
||||
Удаление зомби возлагается на родительский процесс или системный вызов `wait()` также может это выполнить, поэтому перед ее вызовом не нужно проверять, продолжает ли выполняться требуемый дочерний процесс. Если родительский процесс не удалит своих потомков, то они останутся в состоянии зомби.
|
||||
|
||||
Убить зомби-процесс невозможно. Чтобы убить зомби-процесс нужно найти родительский процесс и завершить его или перезапустить. Найти зомби-процессы и их родителей можно следующей командой:
|
||||
```
|
||||
ps ajx | grep -w Z
|
||||
```
|
||||
PID'ы процессов родителей в 3 колонке. Убить процесс следующей командой:
|
||||
```
|
||||
kill -9 <PID процесса родителя>
|
||||
```
|
||||
|
||||
*Процесс-сирота* — в семействе операционных систем UNIX вспомогательный процесс, чей основной процесс (или связь с ним) был завершен нештатно (не подав сигнала на завершение работы).
|
||||
|
||||
---
|
||||
|
||||
Отличие в том, что процесс-сирота (orphan process) всё еще активен. Его родительский процесс был по какой-либо причине прерван, и сирота теперь переходит под руководство init, чей ID процесса равен 1. PPID orphan процесса получит значение 1. Пользователь также может создать подобный процесс, отсоединив его от терминала. Сиротские процессы используют много ресурсов, их легко найти с помощью top или htop.
|
||||
|
||||
В отличии от процесса-сироты, зомби-процесс неактивен, но контролируется родительским процессом, пока тот не решит, что статус выхода дочерних процессов больше не нужен. Он не использует ресурсы и не может быть запланирован для выполнения. Иногда родительский процесс удерживает дочерний процесс в состоянии зомби, чтобы гарантировать, что будущие дочерние процессы не получат тот же PID. Если вы уничтожите родителя зомби-процесса, зомби-процесс тоже умрет. Для этого найдите родительский PID (PPID) зомби и отправьте ему сигнал SIGCHLD (17): kill -17 ppid.
|
||||
|
||||
</details>
|
||||
|
||||
8. Что такое файловый дескриптор? Какая информация там хранится?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
*Файловый дескриптор* - неотрицательное целое число, которое используется в интерфейсе между пространством пользователя и пространством ядра (kernel) для идентификации ресурсов файла / сокета. Когда создаётся новый поток ввода-вывода, ядро возвращает процессу, создавшему поток ввода-вывода, его файловый дескриптор.
|
||||
|
||||
</details>
|
||||
|
||||
9. Что такое buffer/cache память? Для чего нужна?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
buff/cache память - рассчитанная память, которая зарезервирована, но может быть освобождена при необходимости и используется для быстрого доступа программами к данным, которые находятся в оперативной памяти (быстрой памяти).
|
||||
|
||||
buffers — буферы в памяти — страницы памяти, зарезервированные системой для выделения их процессам, когда они затребуют этого, так же известна как heap-memory;
|
||||
cached — файлы, которые недавно были использованы системой/процессами и хранящиеся в памяти на случай если вскоре они снова потребуются.
|
||||
|
||||
</details>
|
||||
|
||||
10. Какие DNS записи бывают? Что такое DKIM, DMARC, PTR?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
Основные DNS записи:
|
||||
|
||||
| Тип | Расшифрока | Описание |
|
||||
|-|-|-|
|
||||
| A | Address | Адресная запись, соответствие между именем и IP-адресом. |
|
||||
| AAAA | Address v6 | Аналог A записи для IPv6 адресов. |
|
||||
| CNAME | Canonical Name | Каноническое имя для псевдонима (одноуровневая переадресация) |
|
||||
| MX | Mail Exchanger | Адрес почтового шлюза для домена. Состоит из двух частей — приоритета (чем число больше, тем ниже приоритет), и адреса узла. |
|
||||
| NS | Authoritative name server | Адрес узла, отвечающего за доменную зону. Критически важна для функционирования самой системы доменных имён. |
|
||||
| PTR | Pointer | Соответствие адреса имени — обратное соответствие для A и AAAA. |
|
||||
| SOA | Start of authority | Указание на авторитетность информации, используется для указания на новую зону. |
|
||||
| TXT | Text string | Запись произвольных двоичных данных, до 255 байт в размере. |
|
||||
| SPF | Sender Policy Framework | Указывает серверы, которые могут отправлять почту с данного домена. |
|
||||
|
||||
DomainKeys Identified Mail (DKIM) — метод E-mail аутентификации, разработанный для обнаружения подделывания сообщений, пересылаемых по email. Метод дает возможность получателю проверить, что письмо действительно было отправлено с заявленного домена. DKIM упрощает борьбу с поддельными адресами отправителей, которые часто используются в фишинговых письмах и в почтовом спаме.
|
||||
|
||||
Domain-based Message Authentication, Reporting and Conformance (идентификация сообщений, создание отчётов и определение соответствия по доменному имени) или DMARC — это техническая спецификация, созданная группой организаций, предназначенная для снижения количества спамовых и фишинговых электронных писем, основанная на идентификации почтовых доменов отправителя на основании правил и признаков, заданных на почтовом сервере получателя.
|
||||
|
||||
Информация о DKIM и DMARC устанавливается в TXT записи домена.
|
||||
|
||||
</details>
|
||||
|
||||
11. Что такое RoundRobin DNS как работает?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
Round-robin - алгоритм распределения нагрузки распределенной вычислительной системы методом перебора и упорядочения её элементов по круговому циклу.
|
||||
|
||||
Round-robin DNS работает, отвечая на запросы не только одним IP-адресом, а списком из нескольких адресов серверов, предоставляющих идентичный сервис. Порядок, в котором возвращаются IP-адреса из списка, основан на алгоритме Round-robin. То есть на практике на доменное имя назначаются несколько IP адресов серверов, которые отвечают на запросы.
|
||||
|
||||
</details>
|
||||
|
||||
12. Как настроить master-slave репликацию в mysql (кратко)?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
Необходимы 2 сервера: master и slave.
|
||||
|
||||
1. На обеих сервера устанавливаем сервер MySQL одинаковой версии.
|
||||
2. Включаем сервер базы данных на обеих серверах.
|
||||
3. Настраиваем master - в `/etc/my.cnf` устанавливаем слеюущие значения:
|
||||
```
|
||||
# выбираем ID сервера, произвольное число, лучше начинать с 1
|
||||
server-id = 1
|
||||
# путь к бинарному логу
|
||||
log_bin = /var/log/mysql/mysql-bin.log
|
||||
# название Вашей базы данных, которая будет реплицироваться
|
||||
binlog_do_db = newdatabase
|
||||
```
|
||||
Перезапускаем сервер базы данных.
|
||||
4. Подключаемся к master серверу, создаем пользователя и назначаем ему права для выполнения репликации.
|
||||
```
|
||||
mysql -u root -p <пароль root сервера БД>
|
||||
GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY 'password';
|
||||
FLUSH PRIVILEGES;
|
||||
```
|
||||
5. На master сервере делаем дамп базы данных c блокировкой таблиц.
|
||||
```
|
||||
mysqldump -u root -p --lock-all-tables newdatabase > newdatabase.sql
|
||||
```
|
||||
6. Переносим дамп базы на slave сервер, создаем базу данных с таким же именем и импортируем базу.
|
||||
```
|
||||
CREATE DATABASE newdatabase;
|
||||
mysql -u root -p newdatabase < newdatabase.sql
|
||||
```
|
||||
7. Настраиваем slave в `/etc/my.cnf`:
|
||||
```
|
||||
# ID Слейва, удобно выбирать следующим числом после Мастера
|
||||
server-id = 2
|
||||
# Путь к relay логу
|
||||
relay-log = /var/log/mysql/mysql-relay-bin.log
|
||||
# Путь к bin логу на Мастере
|
||||
log_bin = /var/log/mysql/mysql-bin.log
|
||||
# База данных для репликации
|
||||
binlog_do_db = newdatabase
|
||||
```
|
||||
Перезапускаем сервер базы данных.
|
||||
8. Запускаем репликацию на slave сервере.
|
||||
```
|
||||
CHANGE MASTER TO MASTER_HOST='10.10.0.1', MASTER_USER='slave_user', MASTER_PASSWORD='password',
|
||||
MASTER_LOG_FILE = 'mysql-bin.000001', MASTER_LOG_POS = 107;
|
||||
##Указанные значения мы берем из настроек Мастера
|
||||
После этого запускаем репликацию на Слейве:
|
||||
START SLAVE;
|
||||
```
|
||||
9. Проверяем статус репликации:
|
||||
```
|
||||
SHOW SLAVE STATUSG
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
13. Представлен вывод команды `free`.
|
||||
```
|
||||
$ free -m
|
||||
total used free shared buff/cache available
|
||||
Mem: 6930 3598 843 183 2489 2919
|
||||
Swap: 15999 4 15995
|
||||
```
|
||||
Почему доступной (available) памяти сейчас 2919, если свободной (free) памяти 843?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
- Total. Эта цифра представляет всю существующую память.
|
||||
- Used вычисление общего значения оперативной памяти системы за вычетом выделенной свободной, разделяемой, буферной и кэш-памяти.
|
||||
```
|
||||
used = total - free - buff/cache
|
||||
```
|
||||
- Free – свободная память в системе.
|
||||
- Shared – память, используемая (преимущественно) в tmpfs
|
||||
- Buffer, и Cache идентифицируют память, используемую для нужд ядра / операционной системы. Буфер и кеш складываются вместе, а сумма указывается в разделе «buff/cache».
|
||||
- Available – примерное количество оперативной памяти, доступное для запуска новых приложений без использования ими раздела подкачки. В отличие от поля free, это поле принимает в расчёт страницу cache и также то, что не вся рекуперируемая (пригодная для повторного использования) память будет возвращена для рекуперации из-за того, что элементы используются в данный момент.
|
||||
|
||||
</details>
|
||||
|
||||
14. Вы вводите в строке браузера yandex.ru. Опишите процесс от нажатия клавиши до загрузки страницы.
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||

|
||||
|
||||
Любой URL содержит следующую структуру `<протокол>/<хост>/путь`, например `https://yandex.ru/pogoda/samara`. Также URL может содержать данные для отображения страницы.
|
||||
|
||||
1. При вводе URL браузер смотрит на протокол запроса. Если протокол в URL не указан, то браузер смотрит на список HSTS (HTTP Strict Transport Security - механизм, принудительно активирующий защищенное соединение через протокол HTTPS), если хост есть в данном списке, то браузер отправит запрос по протоколу HTTPS, если нет, то по HTTP.
|
||||
|
||||
2. Для того, чтобы установить соединение с сервером, необходим его IP адрес. Так как мы используем домен, то необходимо установить соответствие домена и IP адреса сервера, где размещается ресурс. При запросе мы обращаемся к DNS. Cначала проверяется кеш DNS. Приоритет опроса DNS кеша следующий:
|
||||
- Кеш браузера,
|
||||
- Проверяется hosts файл ,
|
||||
- Кеш ОС,
|
||||
- Кеш роутера,
|
||||
- Кеш интернет-провайдера
|
||||
Если данных о данном запрашиваеомом хосте в кеше нет, то:
|
||||
- DNS интернет провайдера отправляет запрос к контевому серверу DNS (.),
|
||||
- Если корневой сервер не знает запрашиваемого домена, то он отправляет запрос серверу ответственному за зону (.ru), в которому привязан домен,
|
||||
- Если DNS сервер зоны не знает запрашиваемого домена, то запрос отправляется к NS серверу домена.
|
||||
IP адрес хоста, при его наличии у DNS сервера, возвращается обратно по цепочке
|
||||
|
||||
3. После того, как IP адрес хоста получили, необходимо сформировать на прикладном уровне запрос к серверу. К запросу добавляются следующие заголовки:
|
||||
- Прикладной уровень: протокол запроса (HTTP/S, FTP и т.д),
|
||||
- Транспортный (TCP/UDP): порт, по которому обращаемся к серверу.
|
||||
- Сетевой уровень: IP адрес пакета
|
||||
- Канальный уровень: определяет есть ли такой адрес в сети. Если нет, то пакет передаётся шлюзу. Устройство шлюза проверяет свою таблицу маршрутизации и направляет пакет в нужном направлении.
|
||||
|
||||
4. Далее выполняется следующий алгоритм действий установления соединения:
|
||||
- После того, как запрос достиг сервера, клиент отправляет клиенту запрос (client hello) и свою версию протокола TLS на защищенное соединение.
|
||||
- Сервер отвечает клиенту (server hello) с информацией о выбранной версии TLS, методом шифрования, методом компресии и публичный сертификат сервера, подписанный центром сертификации. Сертификат содержит публичный ключ, который будет использован клиентом для шифрования данных.
|
||||
- Клиент подтверждает сертификат сервера с помощью своего списка центров сертификации. Если сертификат подписан центром из списка, то серверу можно доверять.
|
||||
- Клиент шифрует данные публичным ключем и отправляет серверу зашифрованное сообщение.
|
||||
- Сервер расшифровывает сообщение с помощью своего приватного ключа и генерирует симметричный мастер-ключ и отправляет его клиенту.
|
||||
- Клиент отправляет серверу сообщение о финише, шифруя хэш передачи с помощью симметричного ключа.
|
||||
- Сервер генерирует собственный хеш, а затем расшифровывает полученный от клиента хэш, чтобы проверить совпадает ли хэш клиента с хэшом сервера. Если совпадение обнаружено, то сервер отправляет клиенту сообщение о финише.
|
||||
|
||||
После этого защищенное соединение с сервером установлено.
|
||||
|
||||
5. Далее необходимо сформировать запрос серверу:
|
||||
- Клиент формирует запрос HTTP, в котором участвует метод (например GET), URL и версию протокола. Например `GET /pogoda/samara HTTP/2`.
|
||||
- Следующий заголовок клиента HOST, в котором указывается к какому хосту необходимо обратиться. Например `HOST: yandex.ru`. По заголовку HOST сервер может определить к какому сайту на сервере необходимо обратиться.
|
||||
- Запрос может также содержать и другие заголовки. Необходимо только, чтобы сервер смог понять эти заголовки.
|
||||
|
||||
</details>
|
||||
|
||||
15. Порядок загрузки дистрибутива Linux.
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
1. Включение компьютера кнопкой.
|
||||
2. Загрузить BIOS / UEFI из NVRAM.
|
||||
3. Собрать сведения об аппаратуре.
|
||||
4. Выбрать устройства для запуска (диск, сеть).
|
||||
5. Идентифицировать системный раздел EFI.
|
||||
6. Загрузить BIOS / UEFI из NVRAM.
|
||||
7. Определить какое ядро загрузить.
|
||||
8. Загрузить ядро.
|
||||
9. Создать структуры данных ядра.
|
||||
10. Запустить init / systemd как PID 1.
|
||||
11. Выполнить сценарии запуска.
|
||||
12. Запустить систему.
|
||||
|
||||
</details>
|
||||
|
||||
551
questions/linux.md
Normal file
551
questions/linux.md
Normal file
@@ -0,0 +1,551 @@
|
||||
## Linux. Basic
|
||||
|
||||
1. Что такое LA? В каких единицах измеряется?
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
LA (load average) -- параметр, определяющий среднюю нагрузку на систему за период времени (1 мин, 5 минут, 15 минут). Изменяется в количестве задач на одно ядро процессора. На нагрузку системы также влияет количество задач ввода-вывода и задержка сети. Также влияние на расчета LA оказывает: 1. Технология Hyper-Threading, которая делит одно физическое ядро на 2 логических, 2. Технология Turbo Bust, которая позволяет разгонять тактовую частоту процессора и работать на частоте выше заявленной, т.е. выше номинальной частоты (время на обработку одной задачи уменьшается).
|
||||
</details>
|
||||
|
||||
2. Что будет если на сервере LA = 100?
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
Вероятно, что на сервере будет наблюдаться замедленная работа сервисов, но если параметр LA равен количеству ядер в системе или количеству потоков в системе, то данная нагрузка является нормальной.
|
||||
</details>
|
||||
|
||||
3. Почему при высоких показателях значения LA на сервере может не наблюдаться проблем (консоль ssh отзывается, сервисы работают в обычном режиме)?
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
На параметр нагрузки LA влияет также и ожидание ввода-вывода (параметр *wa* в утилите *top*) в дисков и задержка сети. Данные параметры могут не влиять на работу основных сервисов в системе, но учитываются при расчете общей нагрузки на систему.
|
||||
|
||||
</details>
|
||||
|
||||
4. Представлен вывод команды *top*. Что означает каждая запись в выводе?
|
||||
```
|
||||
top - 21:29:24 up 14:18, 1 user, load average: 0,78, 1,48, 1,10
|
||||
Tasks: 277 total, 3 running, 274 sleeping, 0 stopped, 0 zombie
|
||||
%Cpu(s): 12,4 us, 2,5 sy, 0,1 ni, 84,8 id, 0,1 wa, 0,0 hi, 0,1 si, 0,0 st
|
||||
KiB Mem : 7106404 total, 306972 free, 3127144 used, 3672288 buff/cache
|
||||
KiB Swap: 8191996 total, 8191996 free, 0 used. 3270520 avail Mem
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
*top* - название утилиты.
|
||||
|
||||
*21:29:24* - текущее время системы.
|
||||
|
||||
*up 14:18* - сколько часов:минут система работает с момента последнего запуска.
|
||||
|
||||
*1 user* - количество пользователей авторизованных в системе.
|
||||
|
||||
*load average: 0,78, 1,48, 1,10* - параметр средней нагрузки на систему за период времени 1 минута, 5 минут, 15 минут.
|
||||
|
||||
*277 total* - всего процессов в системе.
|
||||
|
||||
*3 running* - количество процессов в работе.
|
||||
|
||||
*274 sleeping* - количество процессов в состоянии 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-памяти.
|
||||
|
||||
</details>
|
||||
|
||||
5. Как в утилите top в Linux посмотреть нагрузку на каждое ядро процессора?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
В утилите top нажать `1`, чтобы отобразить все ядра в системе.
|
||||
|
||||
</details>
|
||||
|
||||
6. Как в утилите top в Linux посмотреть какой командой был запущен процесс?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
В утилите top нажать `c`, чтобы отобразить команды, которыми были запущены процессы.
|
||||
|
||||
</details>
|
||||
|
||||
7. Где хранятся имена файлов/директорий?
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
- Inodes не содержат имён файлов, только другие метаданные файла.
|
||||
- Каталоги Unix представляют собой списки ассоциативных структур, каждая из которых содержит одно имя файла и один номер индекса.
|
||||
- Драйвер файловой системы должен найти каталог, ищущий определенное имя файла, а затем преобразовать имя файла в правильный соответствующий номер индекса.
|
||||
|
||||
Таким образом имя файла/директории хранится в информационной структуре каталов.
|
||||

|
||||
|
||||
</details>
|
||||
|
||||
8. Как удалить файл с именем `-rf`?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
```
|
||||
rm ./-rf
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
9. Как посмотреть описание дискриптора? Как посмотреть время последней модификации файла?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
Посмотреть полную информацию по дискриптору возможно командой `stat <path_to_file>`.
|
||||
Время модификации:
|
||||
```
|
||||
stat --format=%y dira
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
10. Для чего нужна переменная окружения PATH?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
Переменная окружения PATH содержит абсолютные пути директорий, в которых производится поиск исполняемых файлов при вводе команд
|
||||
|
||||
</details>
|
||||
|
||||
11. Как посмотреть нагрузку на диски?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
Установить утилиту `sysstat`, проверить нагрузку на диски `iostat -xtc`.
|
||||
|
||||
</details>
|
||||
|
||||
12. Что такое файл в понятиях Unix-like операцинных системах?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
Файлы - это объекты, в которые мы записываем информацию и наши данные, исполняемые файлы, но кроме этих привычных нам понятий здесь есть файлы специального назначения - файлы устройств, файлы туннелей, сокетов и многое другое.
|
||||
|
||||
Типы файлов в Linux:
|
||||
- Обычные файлы, для хранения информации;
|
||||
- Специальные файлы - для устройств и туннелей;
|
||||
- Директории.
|
||||
|
||||
</details>
|
||||
|
||||
13. Что такое RAID? Какие массивы бывают?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
RAID (Redundant Array of Independent Disks) - избыточный массив независимых дисков, технология виртуализации данных для объединения нескольких физических дисковых устройств в логический модуль для повышения отказоустойчивости и производительности.
|
||||
|
||||
В зависимости от количества дисков и класса отказоустойчивости существуют следующие основные типы RAID:
|
||||
RAID 0:
|
||||
RAID 1:
|
||||
RAID 5:
|
||||
RAID 6:
|
||||
RAID 10:
|
||||
|
||||
</details>
|
||||
|
||||
14. При каком количестве одновременно вышедших из строя дисков обеспечивает работоспособность RAID 6?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
2 диска.
|
||||
|
||||
</details>
|
||||
|
||||
15. В чем разница между объявлением переменной `export VAR="VALUE"` и `VAR="VALUE"` в bash?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
При объявлении переменной через export - переменная будет доступна в любых других процессах, при обычном объявлении переменной - переменная будет доступна только в запущенном процессе.
|
||||
|
||||
</details>
|
||||
|
||||
16. Как остановить выполнение скрипта в bash при возникновении ошибки в команде?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
Команда `set -e` завершит скрипт с ошибкой, в случае, если в нижеследующем bash коде будет обнаружена ошибка. По-умолчанию bash скрипт продолжает работу, если в ходе выполнения возникла ошибка.
|
||||
|
||||
</details>
|
||||
|
||||
17. Что в bash скрипте означает команда `set -euo pipefail`?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
Команда `set` устанавливает аттрибуты оболочки с опеределенных опций.
|
||||
Опция `-e` - означает, что скрипт будет остановлен, когда произойдет ошибка в ходе его выполнения.
|
||||
Опция `-u` - означает, что скрипт будет остановлен, если в ходе скрипта, будет обнаружена переменная, которая не определена.
|
||||
Опция `-o pipefail` - означает, что скрипт будет остановлен, если в ходе пайплайна команд будет выявлена ошибка.
|
||||
|
||||
</details>
|
||||
|
||||
18. Как активировать debug режим в bash?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
Команда `set -x` в начале скрипта активирует вывод в консоль debug информации.
|
||||
|
||||
</details>
|
||||
|
||||
19. Что значит `$@` в bash?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
`$@` - все параметры переданные скрипту.
|
||||
|
||||
</details>
|
||||
|
||||
20. Какой код сигнала будет выполнен при исполнении команды `kill <PID>`?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
Сигнал SIGTERM (код 15) - это сигнал по-умолчанию отправляемый при вызове команды kill. Это указывает процессу на завершение работы и обычно считается сигналом для использования при чистом завершении работы.
|
||||
|
||||
</details>
|
||||
|
||||
21. Как выполнить фильтрацию вывода команды, чтобы на экран были выведены только ошибки (STDERR), игнорируя STDOUT?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
```
|
||||
cmd 2>&1 >/dev/null | grep pattern
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
22. Какую команду необходимо выполнить, чтобы посмотреть какие пользователи вошли в систему в систему?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
Команда `w` покажет список пользователей, которые вошли на сервер.
|
||||
|
||||
</details>
|
||||
|
||||
23. Какой файл необходимо отредактировать, чтобы отключить ssh аутентификацию по паролю?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
Необходимо редактировать файл `/etc/ssh/sshd_config`, отвечающий за конфигурацию сервиса ssh.
|
||||
|
||||
</details>
|
||||
|
||||
24. В каком файле находится информация о смонтированных каталогах в файловую систсему?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
Файл `/etc/fstab` содержит информацию о смонтированных каталогах в файловую систему.
|
||||
|
||||
</details>
|
||||
|
||||
25. Что выведет команда `cat a` и почему?
|
||||
```
|
||||
mkdir /tmp/abc
|
||||
cd /tmp/abc
|
||||
ls >a 2>b
|
||||
cat a
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
`cat a` выведет
|
||||
```
|
||||
a
|
||||
b
|
||||
```
|
||||
Обработка команды идёт справа налево. Сначала создается файл *b*, потом создается файл *a*, команда `ls` отображает список файлов в текущей директории (файлы *a* и *b* уже созданы) в одну колонну и перенаправляет стандартный поток вывода (`>`) в файл *a*, а стандартный поток ошибок `2` в файл *b*.
|
||||
|
||||
</details>
|
||||
|
||||
26. В bash-скрипте указан аттрибут оболочки `set -x`. В одной из команд происходит ошибка и скрипт завершает свою работу. Как сделать, чтобы при возникновении ошибки в определенной команде скрипт продолжил свою работу?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
1 вариант: указать `|| true` после выполнения команды с ошибкой.
|
||||
```sh
|
||||
<command with error> || true
|
||||
```
|
||||
|
||||
2 вариант: до выполнения данной команды указать `set +e` для игнорирования ошибок, начиная со следующей строки и после выполнения команды указать `set -e` для завершения работы скрипта в случае ошибки, начиная со следующей строки.
|
||||
```sh
|
||||
set -e
|
||||
<command 1>
|
||||
<command 2>
|
||||
set +e
|
||||
<command 3 wih error>
|
||||
set -e
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
27. Что такое системный вызов, какие они бывают?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
Системный вызов - обращение программы к ядру операционной системы для выполнения какой-либо операции.
|
||||
|
||||
В Unix, Unix-like и других POSIX-совместимых операционных системах популярными системными вызовами являются:
|
||||
- open,
|
||||
- read,
|
||||
- write,
|
||||
- close,
|
||||
- wait,
|
||||
- exec,
|
||||
- fork,
|
||||
- exit,
|
||||
- kill.
|
||||
|
||||
</details>
|
||||
|
||||
28. Что такое сигнал в Unix, зачем они нужны и разница между 9 и 15 сигналами?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
Сигнал - в Unix-like операционных системах - асинхронное (в случайное время) уведомление процесса для обработки какого-либо события. Один из основных способов взаимодействия между процессами.
|
||||
|
||||
Посылка сигналов от одного процесса к другому обычно осуществляется при помощи системного вызова *kill*. Его первый параметр – PID процесса, которому посылается сигнал; второй параметр – номер сигнала.
|
||||
```
|
||||
kill(1111, SIGTERM);
|
||||
```
|
||||
|
||||
Стандарт POSIX определяет 28 сигналов. Некоторые из них:
|
||||
|
||||
| Сигнал | Код | Описание |
|
||||
|-|-|-|
|
||||
| SIGTERM | 15 | Сигнал завершения (сигнал по умолчанию для утилиты kill) |
|
||||
| SIGKILL | 9 | Безусловное завершение |
|
||||
| SIGSTOP | 23 | Остановка выполнения процесса |
|
||||
| SIGHUP | 1 | Закрытие терминала (перечитать конфигурацию) |
|
||||
| SIGINT | 2 | Сигнал прерывания (Ctrl-C) с терминала |
|
||||
|
||||
</details>
|
||||
|
||||
29. Что такое inode? Какая информация там хранится?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
Inode (индексный дескриптор) - структура данных, в которой хранятся метаданные файла и перечислены блоки с данными файла. Хранит всю информацию, кроме имени файла и данных. Каждый файл в данном каталоге является записью с именем файла и номером индекса. Вся остальная информация о файле извлекается из таблицы индексов путем ссылки на номер индекса. Номера inodes уникальны на уровне раздела. Каждый раздел как собственная таблица индексов. Если у вас закончились inode, вы не можете создавать новые файлы, даже если у вас есть свободное место на данном разделе.
|
||||
|
||||
Inodes хранит метаданные о файле, к которому он относится. Эти метаданные содержат всю информацию об указанном файле.
|
||||
- Размер.
|
||||
- Разрешение.
|
||||
- Владелец/группа.
|
||||
- Расположение жесткого диска.
|
||||
- Дата/время.
|
||||
- Любая другая необходимая информация.
|
||||
|
||||
</details>
|
||||
|
||||
30. Что такое hard link? В чем разница между hard link и soft link? Примеры их практического применения.
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
**Hard link**:
|
||||
Ссылка на файл в файловой системе с использованием такого же inode идентификатора, как у файла, на который ссылаемся.
|
||||
Создадим файл *realFile*.
|
||||
```
|
||||
touch realFile
|
||||
```
|
||||
Создадим hard link командой `ln <целевой_файл> <файл_ссылка>`:
|
||||
```
|
||||
ln realFile hardLink
|
||||
```
|
||||
Проверим, что inode у файла *realFile* и hard ссылке *hardLink* имеют одинаковый идентификатор.
|
||||
```
|
||||
$ ls -li
|
||||
итого 0
|
||||
2359720 -rw-r--r-- 2 rmntrvn rmntrvn 0 апр 25 23:24 hardLink
|
||||
2359720 -rw-r--r-- 2 rmntrvn rmntrvn 0 апр 25 23:24 realFile
|
||||
```
|
||||
Как видно realFile и hardLink имеют одинаковый идентификатор inode.
|
||||
|
||||
**Soft link**:
|
||||
Создадим soft ссылку на файл *realFile*.
|
||||
```
|
||||
ln -s realFile softLink
|
||||
```
|
||||
Проверим, что чистовой идентификатор *softLink* отличается от числового идентификатора *realFile*.
|
||||
```
|
||||
$ ls -li
|
||||
итого 0
|
||||
2359720 -rw-r--r-- 2 rmntrvn rmntrvn 0 апр 25 23:24 hardLink
|
||||
2359720 -rw-r--r-- 2 rmntrvn rmntrvn 0 апр 25 23:24 realFile
|
||||
2366763 lrwxrwxrwx 1 rmntrvn rmntrvn 8 апр 25 23:29 softLink -> realFile
|
||||
```
|
||||
|
||||
Некоторые нюансы:
|
||||
- Soft ссылки используют различные номера inode, чем основные файлы.
|
||||
- Soft ссылки становятся полезными, если исходный файл был удален.
|
||||
- Soft ссылки могут быть созданы из каталогов.
|
||||
- Soft ссылка может быть создана на пересечении файловых систем.
|
||||
|
||||
- Hard ссылка может размещаться только на том же логическом разделе, что и оригинальный файл. Это связано с независимой идентификацией файлов на разных разделах.
|
||||
- Создание жестких ссылок не поддерживается для папок — только для файлов.
|
||||
- Файловая система должна поддерживать работу с hard ссылками.
|
||||
|
||||
</details>
|
||||
|
||||
31. Какие состояния процессов существуют? Что значит состояние процесса D?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
| **Статус** | **Описание** |
|
||||
|:----------------------------------------------:|:---------------------------------------:|
|
||||
| R (running or runnable) | Выполняется или готов к выполнению |
|
||||
| D (uninterruptible sleep) | Ожидает записи на диск |
|
||||
| S (interruptible sleep) | Неактивен (< 20 s) |
|
||||
| T (stopped by job control signal) | Остановлен или трассируется отладчиком |
|
||||
| Z (zombie) | зомби |
|
||||
| W (paging (not valid since the 2.6.xx kernel)) | Процесс выгружен на диск |
|
||||
| < | Процесс имеет повышенный приоритет nice |
|
||||
| N | Процесс имеет пониженный приоритет nice |
|
||||
| L (locked) | Некоторые страницы блокированы в ядре |
|
||||
| s | Процесс является лидеров сеанса |
|
||||
|
||||
</details>
|
||||
|
||||
32. Что такое процесс-зомби и процесс-сирота? Можно ли самостоятельно сделать зомби?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
*Процесс-зомби* - дочерний процесс в Unix-системе, завершивший своё выполнение, но ещё присутствующий в списке процессов операционной системы, чтобы дать родительскому процессу считать код завершения.
|
||||
|
||||
Удаление зомби возлагается на родительский процесс или системный вызов `wait()` также может это выполнить, поэтому перед ее вызовом не нужно проверять, продолжает ли выполняться требуемый дочерний процесс. Если родительский процесс не удалит своих потомков, то они останутся в состоянии зомби.
|
||||
|
||||
Убить зомби-процесс невозможно. Чтобы убить зомби-процесс нужно найти родительский процесс и завершить его или перезапустить. Найти зомби-процессы и их родителей можно следующей командой:
|
||||
```
|
||||
ps ajx | grep -w Z
|
||||
```
|
||||
PID'ы процессов родителей в 3 колонке. Убить процесс следующей командой:
|
||||
```
|
||||
kill -9 <PID процесса родителя>
|
||||
```
|
||||
|
||||
*Процесс-сирота* — в семействе операционных систем UNIX вспомогательный процесс, чей основной процесс (или связь с ним) был завершен нештатно (не подав сигнала на завершение работы).
|
||||
|
||||
---
|
||||
|
||||
Отличие в том, что процесс-сирота (orphan process) всё еще активен. Его родительский процесс был по какой-либо причине прерван, и сирота теперь переходит под руководство init, чей ID процесса равен 1. PPID orphan процесса получит значение 1. Пользователь также может создать подобный процесс, отсоединив его от терминала. Сиротские процессы используют много ресурсов, их легко найти с помощью top или htop.
|
||||
|
||||
В отличии от процесса-сироты, зомби-процесс неактивен, но контролируется родительским процессом, пока тот не решит, что статус выхода дочерних процессов больше не нужен. Он не использует ресурсы и не может быть запланирован для выполнения. Иногда родительский процесс удерживает дочерний процесс в состоянии зомби, чтобы гарантировать, что будущие дочерние процессы не получат тот же PID. Если вы уничтожите родителя зомби-процесса, зомби-процесс тоже умрет. Для этого найдите родительский PID (PPID) зомби и отправьте ему сигнал SIGCHLD (17): kill -17 ppid.
|
||||
|
||||
</details>
|
||||
|
||||
33. Что такое файловый дескриптор? Какая информация там хранится?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
*Файловый дескриптор* - неотрицательное целое число, которое используется в интерфейсе между пространством пользователя и пространством ядра (kernel) для идентификации ресурсов файла / сокета. Когда создаётся новый поток ввода-вывода, ядро возвращает процессу, создавшему поток ввода-вывода, его файловый дескриптор.
|
||||
|
||||
</details>
|
||||
|
||||
34. Что такое buffer/cache память? Для чего нужна?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
buff/cache память - рассчитанная память, которая зарезервирована, но может быть освобождена при необходимости и используется для быстрого доступа программами к данным, которые находятся в оперативной памяти (быстрой памяти).
|
||||
|
||||
buffers — буферы в памяти — страницы памяти, зарезервированные системой для выделения их процессам, когда они затребуют этого, так же известна как heap-memory;
|
||||
cached — файлы, которые недавно были использованы системой/процессами и хранящиеся в памяти на случай если вскоре они снова потребуются.
|
||||
|
||||
</details>
|
||||
|
||||
35. Представлен вывод команды `free`.
|
||||
```
|
||||
$ free -m
|
||||
total used free shared buff/cache available
|
||||
Mem: 6930 3598 843 183 2489 2919
|
||||
Swap: 15999 4 15995
|
||||
```
|
||||
Почему доступной (available) памяти сейчас 2919, если свободной (free) памяти 843?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
- Total. Эта цифра представляет всю существующую память.
|
||||
- Used вычисление общего значения оперативной памяти системы за вычетом выделенной свободной, разделяемой, буферной и кэш-памяти.
|
||||
```
|
||||
used = total - free - buff/cache
|
||||
```
|
||||
- Free – свободная память в системе.
|
||||
- Shared – память, используемая (преимущественно) в tmpfs
|
||||
- Buffer, и Cache идентифицируют память, используемую для нужд ядра / операционной системы. Буфер и кеш складываются вместе, а сумма указывается в разделе «buff/cache».
|
||||
- Available – примерное количество оперативной памяти, доступное для запуска новых приложений без использования ими раздела подкачки. В отличие от поля free, это поле принимает в расчёт страницу cache и также то, что не вся рекуперируемая (пригодная для повторного использования) память будет возвращена для рекуперации из-за того, что элементы используются в данный момент.
|
||||
|
||||
</details>
|
||||
|
||||
36. Порядок загрузки дистрибутива Linux.
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
1. Включение компьютера кнопкой.
|
||||
2. Загрузить BIOS / UEFI из NVRAM.
|
||||
3. Собрать сведения об аппаратуре.
|
||||
4. Выбрать устройства для запуска (диск, сеть).
|
||||
5. Идентифицировать системный раздел EFI.
|
||||
6. Загрузить BIOS / UEFI из NVRAM.
|
||||
7. Определить какое ядро загрузить.
|
||||
8. Загрузить ядро.
|
||||
9. Создать структуры данных ядра.
|
||||
10. Запустить init / systemd как PID 1.
|
||||
11. Выполнить сценарии запуска.
|
||||
12. Запустить систему.
|
||||
|
||||
</details>
|
||||
250
questions/networks.md
Normal file
250
questions/networks.md
Normal file
@@ -0,0 +1,250 @@
|
||||
1. Что такое протокол IP?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
IP (Internet Protocol) - протокол сетевого уровня стека TCP/IP.
|
||||
|
||||
Основной задачей протокола является доставка датаграмм между хостами сетей TCP/IP через произвольное число промежуточных узлов (маршрутизаторов).
|
||||
|
||||
Функции, реализуемые IP:
|
||||
- Основа передачи данных.
|
||||
- Адресация.
|
||||
- Маршрутизация.
|
||||
- Фрагментация датаграмм.
|
||||
Протокол IP не гарантирует надежной доставки пакета: пакеты могут прийти в неправильном порядке, пакет может быть утерян, пакет может продублироваться или оказаться поврежденным. За надежность доставки пакетов отвечают протоколы транспортного уровня.
|
||||
|
||||
На данный момент наиболее распространена четвертая версия протокола (IPv4), однако ведутся активные работы по внедрению более совершенного IPv6.
|
||||
|
||||
</details>
|
||||
|
||||
2. Сколько адресов в следующих подсетях?
|
||||
```
|
||||
192.168.5.0/24
|
||||
192.168.5.0/23
|
||||
192.168.5.0/19
|
||||
```
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
192.168.5.0/24 - 254 хостов (+1 адрес сети, +1 broadcast)
|
||||
192.168.5.0/23 - 510 хостов (+1 адрес сети, +1 broadcast)
|
||||
192.168.5.0/19 - 8190 хостов (+1 адрес сети, +1 broadcast)
|
||||
|
||||
</details>
|
||||
|
||||
3. Что такое 127.0.0.1 адрес? Для чего нужен?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
127.0.0.1 адрес или localhost доменное имя, а также зарезервированная сеть 127.0.0.1/8 частных IP адресов предназначены для тестирования программы на той же физической машине, где она запускается.
|
||||
|
||||
Использование адреса 127.0.0.1 позволяет устанавливать соединение и передавать информацию для программ-серверов, работающих на том же компьютере, что и программа-клиент, независимо от конфигурации аппаратных сетевых средств компьютера (не требуется сетевая карта, модем, и прочее коммуникационное оборудование, интерфейс реализуется при помощи драйвера псевдоустройства в ядре операционной системы)
|
||||
|
||||
Так же адрес 127.0.0.1 устанавливается для запрета доступа к сервису из внешней сети. Например:
|
||||
```
|
||||
docker run -d -p 127.0.0.1:3306:3306 mysql
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
4. Вы вводите в строке браузера yandex.ru. Опишите процесс от нажатия клавиши до загрузки страницы.
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||

|
||||
|
||||
Любой URL содержит следующую структуру `<протокол>/<хост>/путь`, например `https://yandex.ru/pogoda/samara`. Также URL может содержать данные для отображения страницы.
|
||||
|
||||
1. При вводе URL браузер смотрит на протокол запроса. Если протокол в URL не указан, то браузер смотрит на список HSTS (HTTP Strict Transport Security - механизм, принудительно активирующий защищенное соединение через протокол HTTPS), если хост есть в данном списке, то браузер отправит запрос по протоколу HTTPS, если нет, то по HTTP.
|
||||
|
||||
2. Для того, чтобы установить соединение с сервером, необходим его IP адрес. Так как мы используем домен, то необходимо установить соответствие домена и IP адреса сервера, где размещается ресурс. При запросе мы обращаемся к DNS. Cначала проверяется кеш DNS. Приоритет опроса DNS кеша следующий:
|
||||
- Кеш браузера,
|
||||
- Проверяется hosts файл ,
|
||||
- Кеш ОС,
|
||||
- Кеш роутера,
|
||||
- Кеш интернет-провайдера
|
||||
Если данных о данном запрашиваеомом хосте в кеше нет, то:
|
||||
- DNS интернет провайдера отправляет запрос к контевому серверу DNS (.),
|
||||
- Если корневой сервер не знает запрашиваемого домена, то он отправляет запрос серверу ответственному за зону (.ru), в которому привязан домен,
|
||||
- Если DNS сервер зоны не знает запрашиваемого домена, то запрос отправляется к NS серверу домена.
|
||||
IP адрес хоста, при его наличии у DNS сервера, возвращается обратно по цепочке
|
||||
|
||||
3. После того, как IP адрес хоста получили, необходимо сформировать на прикладном уровне запрос к серверу. К запросу добавляются следующие заголовки:
|
||||
- Прикладной уровень: протокол запроса (HTTP/S, FTP и т.д),
|
||||
- Транспортный (TCP/UDP): порт, по которому обращаемся к серверу.
|
||||
- Сетевой уровень: IP адрес пакета
|
||||
- Канальный уровень: определяет есть ли такой адрес в сети. Если нет, то пакет передаётся шлюзу. Устройство шлюза проверяет свою таблицу маршрутизации и направляет пакет в нужном направлении.
|
||||
|
||||
4. Далее выполняется следующий алгоритм действий установления соединения:
|
||||
- После того, как запрос достиг сервера, клиент отправляет клиенту запрос (client hello) и свою версию протокола TLS на защищенное соединение.
|
||||
- Сервер отвечает клиенту (server hello) с информацией о выбранной версии TLS, методом шифрования, методом компресии и публичный сертификат сервера, подписанный центром сертификации. Сертификат содержит публичный ключ, который будет использован клиентом для шифрования данных.
|
||||
- Клиент подтверждает сертификат сервера с помощью своего списка центров сертификации. Если сертификат подписан центром из списка, то серверу можно доверять.
|
||||
- Клиент шифрует данные публичным ключем и отправляет серверу зашифрованное сообщение.
|
||||
- Сервер расшифровывает сообщение с помощью своего приватного ключа и генерирует симметричный мастер-ключ и отправляет его клиенту.
|
||||
- Клиент отправляет серверу сообщение о финише, шифруя хэш передачи с помощью симметричного ключа.
|
||||
- Сервер генерирует собственный хеш, а затем расшифровывает полученный от клиента хэш, чтобы проверить совпадает ли хэш клиента с хэшом сервера. Если совпадение обнаружено, то сервер отправляет клиенту сообщение о финише.
|
||||
|
||||
После этого защищенное соединение с сервером установлено.
|
||||
|
||||
5. Далее необходимо сформировать запрос серверу:
|
||||
- Клиент формирует запрос HTTP, в котором участвует метод (например GET), URL и версию протокола. Например `GET /pogoda/samara HTTP/2`.
|
||||
- Следующий заголовок клиента HOST, в котором указывается к какому хосту необходимо обратиться. Например `HOST: yandex.ru`. По заголовку HOST сервер может определить к какому сайту на сервере необходимо обратиться.
|
||||
- Запрос может также содержать и другие заголовки. Необходимо только, чтобы сервер смог понять эти заголовки.
|
||||
|
||||
</details>
|
||||
|
||||
5. Чем отличается TCP от UDP? Что лучше?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
TCP – транспортный протокол передачи данных в сетях TCP/IP, предназначен для управления передачей данных интернета. Пакеты в TCP называются сегментами.
|
||||
Ориентирован на соединение, используется для передачи данных (электронная почта, файлы, сообщения). При определении потери пакетов будет выполнен перезапрос потерянных пакетов.
|
||||
|
||||
UDP – транспортный протокол, передающий сообщения-датаграммы без необходимости установки соединения в IP-сети. Не ориентирован на установление соединения, используется в потоковой передаче данных (IPTV, VoIP). При потере пакетов перезапроса потерянных пакетов не происходит.
|
||||
|
||||
Нельзя сказать, что TCP лучше UDP, т.к. данные транспортные протоколы используются для различных типов передачи трафика.
|
||||
|
||||
</details>
|
||||
|
||||
6. Как происходит соединение TCP?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||

|
||||
|
||||
1. Клиент, который намеревается установить соединение, посылает серверу сегмент с номером последовательности и флагом SYN.
|
||||
Дальнейший алгоритм:
|
||||
Сервер получает сегмент, запоминает номер последовательности и пытается создать сокет (буферы и управляющие структуры памяти) для обслуживания нового клиента;
|
||||
В случае успеха сервер посылает клиенту сегмент с номером последовательности и флагами SYN и ACK, и переходит в состояние SYN-RECEIVED;
|
||||
В случае неудачи сервер посылает клиенту сегмент с флагом RST.
|
||||
2. Если клиент получает сегмент с флагом SYN, то он запоминает номер последовательности и посылает сегмент с флагом ACK.
|
||||
Дальнейший алгоритм:
|
||||
Если он одновременно получает и флаг ACK (что обычно и происходит), то он переходит в состояние ESTABLISHED;
|
||||
Если клиент получает сегмент с флагом RST, то он прекращает попытки соединиться;
|
||||
Если клиент не получает ответа в течение 10 секунд, то он повторяет процесс соединения заново.
|
||||
|
||||
3. Если сервер в состоянии SYN-RECEIVED получает сегмент с флагом ACK, то он переходит в состояние ESTABLISHED.
|
||||
В противном случае после тайм-аута он закрывает сокет и переходит в состояние CLOSED.
|
||||
Процесс называется «трёхэтапным рукопожатием» (англ. three way handshake), так как несмотря на то что возможен процесс установления соединения с использованием четырёх сегментов (SYN в сторону сервера, ACK в сторону клиента, SYN в сторону клиента, ACK в сторону сервера), на практике для экономии времени используется три сегмента.
|
||||
|
||||
</details>
|
||||
|
||||
7. Как происходит HTTPS соединение?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
Когда вы вводите адрес сайта в браузере, он спрашивает у сервера, установлен ли для сайта сертификат. В ответ сервер отправляет общую информацию об SSL-сертификате и публичный ключ, то есть сам сертификат. Браузер сверяет информацию со списком авторизованных центров сертификации. Если всё в порядке, браузер генерирует сеансовый ключ, зашифровывает его публичным ключом и отправляет на сервер. Сервер расшифровывает сообщение и сохраняет сеансовый ключ. После этого между браузером и сайтом устанавливается безопасное соединение через протокол HTTPS.
|
||||
|
||||

|
||||
|
||||
</details>
|
||||
|
||||
8. Какие стандартные коды ответов есть у веб-серверов?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
- 1XX — информационные коды. Они отвечают за процесс передачи данных. Это временные коды, они информируют о том, что запрос принят и обработка будет продолжаться.
|
||||
- 2XX — успешная обработка. Запрос был получен и успешно обработан сервером.
|
||||
- 3XX — перенаправление (редирект). Эти ответы сервера гласят, что нужно предпринять дальнейшие действия для выполнения запроса. Например, сделать запрос по другому адресу.
|
||||
- 4XX — ошибка пользователя. Это значит, что запрос не может быть выполнен по его вине.
|
||||
- 5XX — ошибка сервера. Эти коды возникают из-за ошибок на стороне сервера. В данном случае пользователь всё сделал правильно, но сервер не может выполнить запрос. Для кодов этого класса сервер обязательно показывает сообщение, что не может обработать запрос и по какой причине.
|
||||
|
||||
</details>
|
||||
|
||||
9. Какие существуют основные типы запросов HTTP?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
Два наиболее часто используемых видов HTTP запросов это: GET и POST.
|
||||
|
||||
GET - запрашивает данные с определенного ресурса (сайта).
|
||||
POST - отправляет данные на сервер для последующей их обработки.
|
||||
|
||||
Особенности GET запроса:
|
||||
- Может быть закэширован
|
||||
- Остается в истории браузера
|
||||
- Может быть закладкой в браузере
|
||||
- Не должен использоваться при работе с крайне важными данными
|
||||
- Имеет ограниченную длину
|
||||
- Должен применяться только для получения данных
|
||||
|
||||
Особенности POST запроса:
|
||||
- Не кэшируется
|
||||
- Не может быть закладкой в браузере
|
||||
- Не остаётся в истории браузера
|
||||
- Нет ограничений по длине запроса
|
||||
|
||||
| Заголовок | Описание |
|
||||
|-----------|---------------------------------------------------------------------------------------------|
|
||||
| HEAD | Тоже самое что GET, однако возвращает только HTTP заголовки и не возвращает тело документа. |
|
||||
| DELETE | Удаляет определенный ресурс. |
|
||||
| PUT | Загружает представление определенного URI. |
|
||||
| OPTIONS | Возвращает список видов запросов, поддерживаемых веб-сервером. |
|
||||
| CONNECT | Создает прозрачный TCP/IP туннель для передачи запросов. |
|
||||
|
||||
</details>
|
||||
|
||||
10. Клиент пишет, что заходит на свой сайт и он к нему подключается через раз. Что делать, что спрашивать от клиента?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
Необходимо спросить у клиента какую ошибку он наблюдает при неудачном запросе сайта, в какое время. Если проблема периодическая, то возможно проблема на стороне провайдера клиента. Необходимо запросить у клиента анализ сети с помощью утилит `traceroute`, `mtr` с того узла, где он наблюдает проблему и до сайта
|
||||
|
||||
</details>
|
||||
|
||||
11. Какой транспортный протокол использует DNS? В каком случае DNS работает по UDP, а в каком по TCP?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
Все реализации DNS серверов должны поддерживать использование обоих протоколов транспортного уровня (TCP и UDP). Большинство DNS-запросов будет обрабатываться с использованием протокола UDP, исключение составляют трансфер зоны (Query type AXFR) и ответы сервера, превышающие 512 байт на одно сообщение. На вопрос "зачем?" ответ простой -- чтобы не использовались для DDoS.
|
||||
|
||||
</details>
|
||||
|
||||
11. Какие DNS записи бывают? Что такое DKIM, DMARC, PTR?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
Основные DNS записи:
|
||||
|
||||
| Тип | Расшифрока | Описание |
|
||||
|-|-|-|
|
||||
| A | Address | Адресная запись, соответствие между именем и IP-адресом. |
|
||||
| AAAA | Address v6 | Аналог A записи для IPv6 адресов. |
|
||||
| CNAME | Canonical Name | Каноническое имя для псевдонима (одноуровневая переадресация) |
|
||||
| MX | Mail Exchanger | Адрес почтового шлюза для домена. Состоит из двух частей — приоритета (чем число больше, тем ниже приоритет), и адреса узла. |
|
||||
| NS | Authoritative name server | Адрес узла, отвечающего за доменную зону. Критически важна для функционирования самой системы доменных имён. |
|
||||
| PTR | Pointer | Соответствие адреса имени — обратное соответствие для A и AAAA. |
|
||||
| SOA | Start of authority | Указание на авторитетность информации, используется для указания на новую зону. |
|
||||
| TXT | Text string | Запись произвольных двоичных данных, до 255 байт в размере. |
|
||||
| SPF | Sender Policy Framework | Указывает серверы, которые могут отправлять почту с данного домена. |
|
||||
|
||||
DomainKeys Identified Mail (DKIM) — метод E-mail аутентификации, разработанный для обнаружения подделывания сообщений, пересылаемых по email. Метод дает возможность получателю проверить, что письмо действительно было отправлено с заявленного домена. DKIM упрощает борьбу с поддельными адресами отправителей, которые часто используются в фишинговых письмах и в почтовом спаме.
|
||||
|
||||
Domain-based Message Authentication, Reporting and Conformance (идентификация сообщений, создание отчётов и определение соответствия по доменному имени) или DMARC — это техническая спецификация, созданная группой организаций, предназначенная для снижения количества спамовых и фишинговых электронных писем, основанная на идентификации почтовых доменов отправителя на основании правил и признаков, заданных на почтовом сервере получателя.
|
||||
|
||||
Информация о DKIM и DMARC устанавливается в TXT записи домена.
|
||||
|
||||
</details>
|
||||
|
||||
12. Что такое RoundRobin DNS как работает?
|
||||
|
||||
<details>
|
||||
<summary>Ответ</summary>
|
||||
|
||||
Round-robin - алгоритм распределения нагрузки распределенной вычислительной системы методом перебора и упорядочения её элементов по круговому циклу.
|
||||
|
||||
Round-robin DNS работает, отвечая на запросы не только одним IP-адресом, а списком из нескольких адресов серверов, предоставляющих идентичный сервис. Порядок, в котором возвращаются IP-адреса из списка, основан на алгоритме Round-robin. То есть на практике на доменное имя назначаются несколько IP адресов серверов, которые отвечают на запросы.
|
||||
|
||||
</details>
|
||||
Reference in New Issue
Block a user