
Коллекция вопросов и ответов для тестирования Linux-сисадминов. Проверьте свои знания и навыки в различных областях с помощью этих вопросов и ответов.
:star:
"Великий администратор не обязан знать всё, но он должен уметь находить удивительные решения для невозможных проектов." — cwheeler33 (ServerFault)
:star:
"Мои навыки — заставлять вещи работать, а не знать миллиард фактов. [...] Если мне нужно исправить систему, я выявлю проблему, проверю логи и найду ошибки. Если нужно внедрить решение, я изучу правильное решение, внедрю его и задокументирую, а впоследствии буду иметь лишь общее представление о том, как оно работает, если не взаимодействую с ним часто... именно поэтому оно документировано." — Sparcrypt (Reddit)
ℹ️ Этот проект содержит 284 тестовых вопроса и ответа, которые можно использовать для проверки знаний или во время собеседования/экзамена на должность Системного администратора Linux (*nix).
✔️ Ответы являются лишь примерами и не охватывают всю тему целиком. Большинство из них содержат полезные ресурсы для более глубокого понимания.
⚠️ Вопросы, отмеченные *** , пока не имеют ответа или ответ неполный — сделайте pull request, чтобы добавить их!
🚥 Если вы нашли что-то, что не имеет смысла или кажется неверным, пожалуйста, сделайте pull request и добавьте обоснованные объяснения ваших изменений или комментариев.
📚 Чтобы улучшить свои знания/навыки, посмотрите devops-interview-questions. Выглядит действительно интересно.
» Все предложения приветствуются «
Мой любимый дистрибутив Linux:
Полезные ресурсы:
GNU на самом деле не является ОС. Это скорее набор правил или философий, регулирующих свободное программное обеспечение, который в то же время породил множество инструментов при попытке создать ОС. Таким образом, инструменты GNU — это, по сути, открытые версии уже существовавших инструментов, но переработанные в соответствии с принципами открытого ПО. GNU/Linux — это сочетание этих инструментов и ядра Linux, образующее полноценную ОС, но существуют и другие GNU, например GNU/Hurd.
Unix и BSD — это «более старые» реализации POSIX, имеющие разную степень «закрытости». Unix обычно полностью закрыт, но существует столько же разновидностей Unix, сколько и Linux (если не больше). BSD обычно не считается «открытой», но при выпуске она считалась очень открытой. Её лицензия также допускала коммерческое использование с гораздо меньшими ограничениями, чем более «открытые» лицензии того времени.
Linux — самый новый из четырёх. Строго говоря, это «просто ядро»; однако в целом его считают полноценной ОС в сочетании с инструментами GNU и несколькими другими основными компонентами.
Основные различия между ними лежат в их идеалах. Unix, Linux и BSD имеют разные идеалы, которые они реализуют. Все они соответствуют POSIX и в основном взаимозаменяемы. Некоторые одни и те же проблемы они решают разными способами. Так что кроме идеалов и способов реализации стандартов POSIX разница невелика.
Для получения дополнительной информации рекомендую прочитать краткую статью о создании GNU, OSS, Linux, BSD и UNIX. Они будут склоняться к своим отдельным идеям, но эти статьи должны дать вам лучшее представление о различиях.
Полезные ресурсы:
CLI — это аббревиатура от Command Line Interface (интерфейс командной строки) или Command Language Interpreter (интерпретатор командного языка). Командная строка — один из самых мощных способов управления вашей системой/компьютером.
В Unix-подобных системах CLI — это интерфейс, с помощью которого пользователь может вводить команды для выполнения системой. CLI очень мощный, но не очень устойчив к ошибкам.
CLI позволяет выполнять манипуляции с внутренними компонентами системы и с кодом гораздо более тонко. Он обеспечивает большую гибкость и контроль, чем GUI, независимо от используемой ОС. Многие программы, которые вы, возможно, захотите использовать в своём ПО, размещённом, например, на Github, также требуют выполнения некоторых команд в CLI для их запуска.
Мои любимые инструменты
screen — свободный терминальный мультиплексор; я могу запустить сессию, и мои терминалы сохранятся, даже если соединение прервется, так что можно возобновить работу позже или из домаssh — самая ценная общая команда для изучения; я могу использовать её для удивительных вещей:
sshfsrsync на сервере без демона rsync, запуская его через sshvi/vim — самый популярный и мощный текстовый редактор; он универсален, работает очень быстро, даже с большими файламиBASH — моя любимая. Это скорее вопрос предпочтений: мне нравится синтаксис, и он просто «щёлкает» для меня. Синтаксис перенаправления ввода/вывода (>>, << 2>&1, 2>, 1> и т. д.) похож на C++, что облегчает его распознавание.
Мне также нравится оболочка ZSH, потому что она гораздо более настраиваема, чем BASH. У неё есть фреймворк Oh-My-Zsh, мощное контекстное автодополнение, мощные возможности сопоставления с образцом/глоббинга, загружаемые модули и многое другое.
Полезные ресурсы:
man [имя_команды] — можно использовать для просмотра описания команды (например: man less, man cat)-h или --help — некоторые программы реализуют вывод инструкций при передаче этого параметра (например: python -h и python --help)w — много полезной информации, включая время работы сервераtop — можно увидеть все запущенные процессы, отсортировать их по загрузке ЦП, использованию памяти и т. д.netstat — чтобы узнать, на каком порту и IP слушает ваш сервер и какие процессы их используютdf — показывает объем используемого дискового пространства файловыми системамиhistory — показывает, что ранее выполнял пользователь, под которым вы сейчас подключеныПолезные ресурсы:
ls -al?В порядке вывода:```bash -rwxrw-r-- 1 root root 2048 Jan 13 07:11 db.dump
- права доступа к файлу,
- количество ссылок,
- имя владельца,
- группа владельца,
- размер файла,
- время последнего изменения,
- имя файла/каталога
Права доступа к файлу отображаются следующим образом:
- первый символ — `-` или `l` или `d`, `d` обозначает каталог, `-` обозначает файл, `l` — символическая ссылка (или мягкая ссылка) — особый тип файла
- три набора символов, по три в каждом, указывающие права доступа для владельца, группы и остальных:
- `r` = чтение
- `w` = запись
- `x` = выполнение
В вашем примере `-rwxrw-r--` это означает, что отображаемая строка:
- обычный файл (отображается как `-`)
- читаемый, записываемый и исполняемый для владельца (`rwx`)
- читаемый, записываемый, но не исполняемый для группы (`rw-`)
- читаемый, но не записываемый и не исполняемый для остальных (`r--`)
Полезные ресурсы:
- [Что означают поля в выводе ls -al? (оригинал)](https://unix.stackexchange.com/questions/103114/what-do-the-fields-in-ls-al-output-mean)
</details>
<details>
<summary><b>Как получить список вошедших пользователей?</b></summary><br>
Для получения сводки вошедших пользователей, включая каждый логин пользователя, терминалы, к которым прикреплены пользователи, дату/время входа и, возможно, компьютер, с которого установлено соединение, введите:```bash
# It uses /var/run/utmp and /var/log/wtmp files to get the details.
who
Самое значительное преимущество выполнения процесса в фоновом режиме заключается в том, что вы можете одновременно выполнять любые другие задачи, пока другие процессы работают в фоновом режиме. Таким образом, больше процессов может быть завершено в фоновом режиме, пока вы работаете над другими процессами. Это можно сделать, добавив специальный символ & в конце команды.
Обычно приложения, которые выполняются слишком долго и не требуют взаимодействия с пользователем, отправляются в фоновый режим, чтобы мы могли продолжить работу в терминале.
Например, если вы хотите что-то скачать в фоновом режиме, вы можете:```bash wget https://url-to-download.com/download.tar.gz &
Когда вы запускаете вышеуказанную команду, вы получаете следующий вывод:```bash
[1] 2203
Здесь 1 — это порядковый номер задания, а 2203 — это PID задания. Вы можете увидеть задания, выполняемые в фоновом режиме, с помощью следующей команды:```bash jobs
Когда вы выполняете задачу в фоновом режиме, она дает вам PID задачи, вы можете завершить задачу, выполняющуюся в фоновом режиме, с помощью следующей команды:```bash
kill PID
Замените PID на PID задачи. Если у вас запущена только одна задача, вы можете вывести её на передний план с помощью:```bash fg
Если у вас есть несколько заданий, работающих в фоновом режиме, вы можете вывести любое задание на передний план, используя:```bash
fg %#
Замените # на порядковый номер задания.
Полезные ресурсы:
Необходимо дополнить.
Запуск (всего) от имени root — это плохо, потому что:
Глупость: ничто не мешает вам совершить неосторожную ошибку. Если вы попытаетесь изменить систему потенциально опасным способом, вам нужно использовать sudo, что обеспечивает паузу (пока вы вводите пароль), чтобы убедиться, что вы не собираетесь ошибиться.
Безопасность: сложнее взломать, если неизвестно имя учетной записи администратора. root означает, что у вас уже есть половина рабочего набора учетных данных администратора.
Вам это на самом деле не нужно: если вам нужно выполнить несколько команд от имени root и вас раздражает необходимость несколько раз вводить пароль, когда срок действия sudo истек, все, что вам нужно сделать, это sudo -i, и вы становитесь root. Хотите выполнить несколько команд с помощью каналов? Используйте sudo sh -c "command1 | command2".
Вы всегда можете использовать его в консоли восстановления: консоль восстановления позволяет восстановиться после серьезной ошибки или исправить проблему, вызванную приложением (которое все равно нужно было запускать через sudo). В этом случае в Ubuntu нет пароля для учетной записи root, но вы можете найти в интернете, как это изменить — это усложнит нанесение вреда любому, у кого есть физический доступ к вашему компьютеру.
Полезные ресурсы:
Для обоих используется top/htop. С помощью команд free и vmstat мы можем отобразить статистику физической и виртуальной памяти соответственно. С помощью команды sar мы видим загрузку ЦП и другую статистику (но sar даже не установлен в большинстве систем).
Полезные ресурсы:
Linux load averages — это «средние значения загрузки системы», которые показывают спрос на выполняемые потоки (задачи) как среднее количество выполняемых и ожидающих потоков. Это измеряет спрос, который может быть больше, чем система обрабатывает в данный момент. Большинство инструментов показывают три средних значения: за 1, 5 и 15 минут.
Эти 3 числа не являются числами для разных ЦП. Эти числа являются средними значениями показателя загрузки за заданный период времени (за последние 1, 5 и 15 минут).
Load average обычно описывается как «средняя длина очереди выполнения». Таким образом, несколько процессов или потоков, потребляющих ЦП, могут поднять load average выше 1. Нет проблем, если load average меньше общего количества ядер ЦП. Но если он становится выше количества ЦП, это означает, что некоторые потоки/процессы будут оставаться в очереди, готовые к выполнению, но ожидая свободного ЦП.
Он предназначен для того, чтобы дать представление о состоянии системы, усредненное за несколько периодов времени. Поскольку это среднее значение, требуется время, чтобы оно вернулось к 0 после большой нагрузки на систему.
Некоторые интерпретации:
Полезные ресурсы:
Пароли вообще нигде не хранятся в системе. То, что хранится в /etc/shadow, — это так называемые хеши паролей.
Хеш некоторого текста создается путем выполнения так называемой односторонней функции над текстом (паролем), создавая строку для проверки. По замыслу «невозможно» (вычислительно неосуществимо) обратить этот процесс вспять.
В старых версиях Unix зашифрованные пароли хранились в /etc/passwd вместе с другой информацией о каждой учетной записи.
В новых версиях просто стоит * в соответствующем поле в /etc/passwd, а для хранения пароля используется /etc/shadow, отчасти для того, чтобы никто не мог получить доступ на чтение к паролям, когда им нужны только остальные данные (shadow обычно защищен более строго, чем passwd).
Для получения дополнительной информации обратитесь к man crypt, man shadow, man passwd.
Полезные ресурсы:
Чтобы изменить все каталоги, например, на 755 (drwxr-xr-x):```bash
find /opt/data -type d -exec chmod 755 {} ;
Чтобы изменить все файлы, например, на **644** (`-rw-r--r--`):```bash
find /opt/data -type f -exec chmod 644 {} \;
Полезные ресурсы:
command not found. Как отследить источник ошибки и исправить её?Похоже, что в какой-то момент происходит перезапись переменной окружения PATH по умолчанию. Тип ошибок, которые вы получаете, указывает на то, что PATH не содержит, например, /bin, где находятся команды (включая bash).
Один из способов начать отладку вашего bash-скрипта или команды — запустить подкоманду с опцией -x:```bash
bash --login -x
Это покажет вам каждую команду и её аргументы, которые выполняются при запуске этой оболочки.
Также очень полезно отображать значения переменной `PATH`:```bash
echo $PATH
Если вы запустите это:```bash PATH=/bin:/sbin:/usr/bin:/usr/sbin
большинство команд должно начать работать — после этого вы можете редактировать `~/.bash_profile` вместо `~/.bashrc` и исправить то, что сбрасывает `PATH` там. Значения переменной `PATH` по умолчанию для **root** и других пользователей находятся в файле `/etc/profile`.
Полезный ресурс:
- [Как правильно добавить путь в PATH?](https://unix.stackexchange.com/questions/26047/how-to-correctly-add-a-path-to-path)
</details>
<details>
<summary><b>Вы нажимаете <code>CTRL + C</code>, но ваш скрипт всё ещё выполняется. Как его остановить?</b></summary><br>
В большинстве случаев вы можете остановить выполняющийся скрипт, используя комбинацию клавиш `CTRL + C`. Она отправляет сигнал прерывания (SIGINT) скрипту, что завершает его выполнение. Если это не сработало и скрипт всё ещё работает, попробуйте комбинацию `CTRL + \`, которая отправляет сигнал выхода (SIGQUIT) скрипту и может немедленно завершить его.
В качестве альтернативы, если вы используете терминал или интерфейс командной строки, можно попробовать команду `kill`, чтобы отправить сигнал процессу скрипта. Вы можете найти идентификатор процесса (PID) скрипта с помощью команд `ps` или `top`, а затем использовать `kill` с PID, чтобы остановить скрипт.
В некоторых случаях может потребоваться использовать команду `kill -9` для принудительной остановки скрипта, так как обычная команда `kill` может не сработать, если скрипт завис или не отвечает. Опция `-9` отправляет сигнал SIGKILL, который заставляет процесс немедленно остановиться.
</details>
<details>
<summary><b>Что такое команда <code>grep</code>? Как сопоставить несколько строк в одной строке?</b></summary><br>
Утилиты `grep` — это семейство инструментов Unix, включающее `egrep` и `fgrep`.
`grep` выполняет поиск по шаблонам в файлах. Если вы ищете определённый шаблон в выводе другой команды, `grep` выделяет соответствующие строки. Используйте эту команду grep для поиска в файлах журналов, конкретных процессах и многом другом.
Для сопоставления нескольких строк:```bash
grep -E "string1|string2" filename
Если вы хотите выполнить каждую команду только после успешного завершения предыдущей, объедините их с помощью оператора &&:```bash
cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install
Если одна из команд завершится ошибкой, то все последующие команды не будут выполнены.
Если вы хотите выполнить все команды независимо от того, завершились ли предыдущие ошибкой или нет, разделите их точкой с запятой:```bash
cd /my_folder; rm *.jar; svn co path to repo; mvn compile package install
В вашем случае, я думаю, вам нужен первый вариант, когда выполнение следующей команды зависит от успеха предыдущей.
Вы также можете поместить все команды в скрипт и выполнить его вместо этого:```bash
#! /bin/sh
cd /my_folder
&& rm *.jar
&& svn co path to repo
&& mvn compile package install
Полезные ресурсы:
- [Выполнение и объединение нескольких команд Linux в одну строку (оригинал)](https://stackoverflow.com/questions/13077241/execute-combine-multiple-linux-commands-in-one-line)
</details>
<details>
<summary><b>Какое символическое представление нужно передать <code>chmod</code>, чтобы дать всем пользователям права на выполнение файла, не затрагивая другие разрешения?</b></summary><br>```bash
chmod a+x /path/to/file
a - для всех пользователейx - разрешение на выполнениеЧтобы синхронизировать содержимое dir1 с dir2 в той же системе, введите:```bash rsync -av --progress --delete dir1/ dir2
- `-a`, `--archive` — режим архивации
- `--delete` — удаление лишних файлов из целевых каталогов
- `-v`, `--verbose` — подробный режим (повышение детализации)
- `--progress` — показывать прогресс во время передачи
Полезные ресурсы:
- [Как синхронизировать две локальные директории? (оригинал)](https://unix.stackexchange.com/questions/392536/how-can-i-sync-two-local-directories)
- [Синхронизация папок с помощью rsync](https://www.jveweb.net/en/archives/2010/11/synchronizing-folders-with-rsync.html)
</details>
<details>
<summary><b>Многие базовые задачи обслуживания требуют редактирования конфигурационных файлов. Объясните способы отмены сделанных изменений.</b></summary><br>
- резервное копирование файла вручную перед редактированием (с помощью brace expansion, например: `cp filename{,.orig}`)
- ручное копирование структуры каталогов, где находится файл (например, с помощью `cp`, `rsync` или `tar`)
- создание резервной копии исходного файла в вашем редакторе (например, установка правил в конфигурационном файле редактора)
- наилучшее решение — использовать `git` (или любую другую систему контроля версий) для отслеживания конфигурационных файлов (например, `etckeeper` для каталога `/etc`)
Полезные ресурсы:
- [Резервное копирование файла с расширением .bak перед расширением имени файла](https://unix.stackexchange.com/questions/66376/backup-file-with-bak-before-filename-extension)
- [Хорошая ли идея использовать git для контроля версий конфигурационных файлов?](https://superuser.com/questions/1037211/is-it-a-good-idea-to-use-git-for-configuration-file-version-controlling)
</details>
<details>
<summary><b>Вам нужно найти все файлы размером более 20 МБ. Как вы это сделаете?</b></summary><br>```bash
find / -type f -size +20M
sudo su -, а не просто sudo su?sudo присутствует в большинстве современных дистрибутивов Linux, где (но не всегда) пользователь root отключен и не имеет установленного пароля. Поэтому вы не можете переключиться на пользователя root с помощью su (можно попробовать). Вам нужно вызвать sudo с привилегиями root: sudo su.
su просто переключает пользователя, предоставляя обычную оболочку с окружением, почти таким же, как у старого пользователя.
su - вызывает оболочку входа после переключения пользователя. Оболочка входа сбрасывает большинство переменных окружения, обеспечивая чистую базу.
Полезные ресурсы:
Они необходимы для расследования проблем в системе. Управление логами абсолютно критично для ИТ-безопасности.
Серверы, межсетевые экраны и другое ИТ-оборудование хранят лог-файлы, в которых записываются важные события и транзакции. Эта информация может дать важные подсказки о враждебной активности, затрагивающей вашу сеть как изнутри, так и снаружи. Данные логов также могут предоставить информацию для выявления и устранения неполадок оборудования, включая проблемы с конфигурацией и аппаратные сбои.
Это запись сервера о том, кто посещал ваш сайт, когда и что именно просматривал. Она невероятно детализирована и показывает:
Факторы, которые следует учитывать:
Собирая и анализируя логи, вы можете понять, что происходит в вашей сети. Каждый лог-файл содержит множество фрагментов информации, которые могут быть бесценны, особенно если вы умеете их читать и анализировать.
Полезные ресурсы:
Инкрементальное резервное копирование — это тип резервного копирования, при котором копируются только файлы, изменившиеся с момента предыдущего копирования.
Полезные ресурсы:
RAID (Redundant Array of Inexpensive Disks) — это технология, используемая для повышения производительности и/или надёжности хранения данных.
Полезные ресурсы:
Если не указано, поведение useradd будет зависеть от переменной USERGROUPS_ENAB, содержащейся в /etc/login.defs. Поведение по умолчанию (USERGROUPS_ENAB yes) заключается в создании группы с тем же именем, что и имя пользователя, с GID, равным UID.
Полезные ресурсы:
Будет дополнено.
Полезные ресурсы:
Будет дополнено.
Наиболее важные вещи, которые нужно понять о модели OSI (или любой другой):
Полезные ресурсы:
VLAN и подсети решают разные задачи. VLAN работают на уровне 2, изменяя, например, домены коллизий. Тогда как подсети в текущем контексте относятся к уровню 3.
Подсеть — это диапазон IP-адресов, определяемый частью адреса (часто называемой сетевым адресом) и маской подсети (netmask). Например, если маска подсети равна 255.255.255.0 (или сокращенно /24), а сетевой адрес — 192.168.10.0, то это определяет диапазон IP-адресов от 192.168.10.0 до 192.168.10.255. Сокращенная запись: 192.168.10.0/24.
VLAN — это «разделение коммутатора». Предположим, у вас есть 8-портовый коммутатор с поддержкой VLAN. Вы можете назначить 4 порта одной VLAN (например, VLAN 1) и 4 порта другой VLAN (например, VLAN 2). VLAN 1 не будет видеть трафик VLAN 2, и наоборот; логически у вас теперь два отдельных коммутатора. Обычно на коммутаторе, если он не видел MAC-адрес, он «заливает» трафик на все остальные порты. предотвращают это.
POP и IMAP — это протоколы для получения сообщений с почтового сервера на почтовый клиент.
POP (Post Office Protocol) использует одностороннюю передачу от сервера к клиенту. По умолчанию сообщения отправляются в POP-клиент и удаляются с сервера, хотя можно настроить сервер на сохранение всех сообщений. Любые действия с сообщением в почтовом клиенте (метки, удаление, перемещение в папку) не будут отражены на сервере и, следовательно, будут недоступны другим клиентам, получающим почту с этого сервера. POP использует мало места на сервере и может считаться более безопасным, поскольку сообщения существуют только на одном клиенте, а не на сервере и нескольких клиентах.
IMAP (Internet Message Access Protocol) использует двустороннюю связь между сервером и клиентом. Удаление или маркировка сообщения в почтовом клиенте, настроенном на IMAP, также удалит или пометит сообщение на сервере. IMAP обеспечивает единообразие при доступе к почте с разных клиентов или устройств, так как сообщения могут находиться в одинаковом состоянии на нескольких устройствах. IMAP также экономит дисковое пространство на клиенте, выборочно синхронизируя сообщения и удаляя старые с клиента, так как при необходимости их можно снова загрузить с сервера.
Выбирайте IMAP, если вам нужен доступ к сообщениям с нескольких устройств и вы хотите сэкономить место на клиенте. Выбирайте POP, если хотите сэкономить место на почтовом сервере, получать сообщения только с одного клиента и гарантировать, что сообщения не будут храниться на нескольких системах.
С помощью команд netstat -nr, route -n или ip route show можно просмотреть маршрут по умолчанию и таблицы маршрутизации.
Полезные ресурсы:
Основное различие, скорее всего, в том, что для localhost всё ещё требуется выполнить реальный поиск где-то.
Если вы используете 127.0.0.1, то (интеллектуальное) программное обеспечение просто преобразует его непосредственно в IP-адрес и использует. Некоторые реализации gethostbyname обнаруживают точечный формат (и, предположительно, эквивалентный формат IPv6) и вообще не выполняют поиск.
В противном случае имя должно быть разрешено. И нет гарантии, что ваш файл hosts будет использоваться для этого разрешения (сначала или вообще); таким образом, localhost может стать совершенно другим IP-адресом.
Я имею в виду, что в некоторых системах локальный файл hosts может быть обойдён. Файл host.conf управляет этим в Linux (и многих других Unix-подобных системах).
Если вы используете сокет Unix domain, он будет немного быстрее TCP/IP (из-за меньших накладных расходов). Windows по умолчанию использует TCP/IP, тогда как Linux пытается использовать сокет Unix domain при выборе localhost и TCP/IP при выборе 127.0.0.1.
Полезные ресурсы:
ping?ping использует ICMP, а именно ICMP echo request и ICMP echo reply. С ICMP не связан никакой 'порт'. Порты связаны с двумя транспортными протоколами IP: TCP и UDP. ICMP, TCP и UDP — это «родственные» протоколы; они не основаны друг на друге, а являются тремя отдельными протоколами, работающими поверх IP.
Пакеты ICMP идентифицируются по полю 'протокол' в заголовке IP-датаграммы. ICMP не использует услуги связи UDP или TCP; он использует услуги «сырых» IP-коммуникаций. Это означает, что сообщение ICMP передаётся непосредственно в поле данных IP-датаграммы. «Сырой» (raw) происходит от того, как это реализовано в программном обеспечении: для создания и отправки сообщения ICMP открывается сырой сокет, создаётся буфер с сообщением, а затем буфер записывается в сокет.
Значение протокола IP для ICMP — 1. Поле протокола является частью IP-заголовка и определяет, что находится в части данных IP-датаграммы.
Однако вы можете использовать nmap, чтобы проверить, открыты ли порты:```bash
nmap -p 80 example.com
Полезные ресурсы:
- [Номер порта Ping](https://networkengineering.stackexchange.com/questions/42463/ping-port-number)
- [Можно ли пинговать адрес:порт?](https://superuser.com/questions/769541/is-it-possible-to-ping-an-addressport)
</details>
<details>
<summary><b>Сервер A не может связаться с сервером B. Опишите возможные причины в несколько шагов.</b></summary><br>
Для устранения проблем связи между серверами лучше следовать стеку TCP/IP:
1. **Прикладной уровень**: работают ли службы на обоих серверах? Настроены ли они правильно (например, привязка к правильному IP и правильному порту)? Показывают ли журналы приложений и системы значимые ошибки?
2. **Транспортный уровень**: открыты ли порты, используемые приложением (попробуйте telnet!)? Можно ли пропинговать сервер?
3. **Сетевой уровень**: правильно ли настроен брандмауэр в сети или на ОС? Правильно ли настроен стек IP (IP, маршруты, DNS и т.д.)? Работают ли коммутаторы и маршрутизаторы (проверьте таблицу ARP! )?
4. **Физический уровень**: подключены ли серверы к сети? Теряются ли пакеты?
</details>
<details>
<summary><b>Почему на вашем сервере не разрешаются имена хостов? Исправьте эту проблему. ***</b></summary><br>
Будет дополнено.
</details>
<details>
<summary><b>Как разрешить доменное имя (с помощью внешнего DNS) через CLI? Можно ли разрешить IP-адреса в доменные имена?</b></summary><br>
Примеры для разрешения IP-адреса в доменное имя:```bash
# with host command:
host domain.com 8.8.8.8
# with dig command:
dig @9.9.9.9 google.com
# with nslookup command:
nslookup domain.com 8.8.8.8
telnet или nc?nc -vz code42.example.com 5432
</details>
<details>
<summary><b>Почему следует избегать <code>telnet</code> для удаленного администрирования системы?</b></summary><br>
Современные операционные системы отключают все потенциально небезопасные службы по умолчанию. С другой стороны, некоторые производители сетевых устройств по-прежнему разрешают устанавливать связь с помощью протокола telnet.
**Telnet** использует самый незащищенный метод связи. Он передает данные по сети в виде открытого текста, и любой желающий может легко узнать пароль с помощью сетевого инструмента.
В случае **Telnet** это включает передачу учетных данных для входа в открытом виде, что означает: любой, кто запустит сниффер в вашей сети, может за несколько секунд получить информацию, необходимую для перехвата управления устройством, подслушав сеанс входа в **Telnet**.
Полезные ресурсы:
- [Telnet и SSH как безопасная альтернатива](https://www.ssh.com/ssh/telnet)
- [Как подключиться по telnet к IP-адресу на определенный порт?](https://superuser.com/questions/339107/how-to-telnet-to-an-ip-address-on-a-specific-port)
</details>
<details>
<summary><b>В чем разница между <code>wget</code> и <code>curl</code>?</b></summary><br>
Основные различия: главное преимущество `wget` перед `curl` — это возможность рекурсивной загрузки. `wget` работает только из командной строки. `curl` поддерживает FTP, FTPS, HTTP, HTTPS, SCP, SFTP, TFTP, TELNET, DICT, LDAP, LDAPS, FILE, POP3, IMAP, SMTP, RTMP и RTSP.
Полезные ресурсы:
- [В чем разница между curl и wget? (оригинал)](https://unix.stackexchange.com/questions/47434/what-is-the-difference-between-curl-and-wget)
</details>
<details>
<summary><b>Что такое SSH и как он работает?</b></summary><br>
**SSH** расшифровывается как **Secure Shell**. Это протокол, который позволяет из сервера «А» перейти в shell-сессию на сервере «Б». Он позволяет взаимодействовать с вашим сервером «Б».
Для установления соединения **SSH** на удаленной машине (сервер A) должна быть запущена программа, называемая **SSH**-демоном, а на компьютере пользователя (сервер B) должен быть **SSH**-клиент.
**SSH**-демон и **SSH**-клиент прослушивают соединения на определенном сетевом порту (по умолчанию 22), аутентифицируют запросы на подключение и запускают соответствующее окружение, если пользователь предоставляет правильные учетные данные.
Полезные ресурсы:
- [Понимание процесса шифрования и подключения SSH](https://www.digitalocean.com/community/tutorials/understanding-the-ssh-encryption-and-connection-process)
</details>
<details>
<summary><b>В большинстве руководств рекомендуется использовать аутентификацию по SSH-ключам, а не по паролю. Почему это считается более безопасным?</b></summary><br>
**SSH-ключ** — это учетные данные для доступа в протоколе SSH. Его функция аналогична имени пользователя и паролю, но ключи в основном используются для автоматизированных процессов и реализации единого входа (SSO) системными администраторами и опытными пользователями.
Вместо требования пароля пользователя можно подтвердить личность клиента с помощью алгоритмов асимметричного шифрования, используя открытый и закрытый ключи.
Если ваша SSH-служба разрешает только аутентификацию по открытому ключу, злоумышленнику потребуется копия закрытого ключа, соответствующего открытому ключу, хранящемуся на сервере.
Если ваша SSH-служба разрешает аутентификацию по паролю, то ваш SSH-сервер, подключенный к Интернету, будет круглосуточно атакован ботнетами, пытающимися угадать имена пользователей и пароли. Ботнету не нужна никакая информация — он может просто перебирать популярные имена и пароли. Помимо прочего, это засоряет ваши журналы.
Полезные ресурсы:
- [Аутентификация на основе ключей (аутентификация по открытому ключу)](http://www.crypto-it.net/eng/tools/key-based-authentication.html)
- [SSH: парольная аутентификация против ключевой](https://security.stackexchange.com/questions/33381/ssh-password-vs-key-authentication)
</details>
<details>
<summary><b>Что такое пакетный фильтр и как он работает?</b></summary><br>
**Пакетная фильтрация** — это метод межсетевого экранирования, используемый для управления сетевым доступом путем мониторинга исходящих и входящих пакетов и разрешения или блокировки их прохождения на основе исходного и целевого IP-адресов, протоколов и портов.
Пакетная фильтрация подходит там, где требования к безопасности невысоки. Внутренние (частные) сети многих организаций не сильно сегментированы. Для изоляции одной части организации от другой не требуются сверхсложные межсетевые экраны.
Однако разумно обеспечить некоторую защиту производственной сети от лабораторной или экспериментальной сети. Устройство пакетной фильтрации — очень подходящая мера для изоляции одной подсети от другой.
Работая на сетевом и транспортном уровнях стека протоколов TCP/IP, каждый пакет проверяется при его поступлении в стек протоколов. Заголовки сетевого и транспортного уровней тщательно изучаются на предмет следующей информации:
- **протокол (IP-заголовок, сетевой уровень)** — в IP-заголовке байт 9 (напомним, отсчет байтов начинается с нуля) определяет протокол пакета. Большинство фильтрующих устройств способны различать TCP, UDP и ICMP.
- **исходный адрес (IP-заголовок, сетевой уровень)** — исходный адрес — это 32-битный IP-адрес хоста, создавшего пакет.
- **целевой адрес (IP-заголовок, сетевой уровень)** — целевой адрес — это 32-битный IP-адрес хоста, которому предназначен пакет.
- **исходный порт (заголовок TCP или UDP, транспортный уровень)** — каждый конец TCP- или UDP-соединения привязан к порту. Порты TCP отдельны и отличны от портов UDP. Порты с номерами ниже 1024 зарезервированы — они имеют строго определенное назначение. Порты с номерами 1024 и выше известны как эфемерные порты. Их можно использовать по выбору поставщика. Список «общеизвестных» портов см. в RFC1700. Исходный порт — это псевдослучайно назначенный эфемерный номер порта. Поэтому часто не имеет смысла фильтровать по исходному порту.
- **целевой порт (заголовок TCP или UDP, транспортный уровень)** — номер целевого порта указывает порт, на который отправляется пакет. Каждая служба на целевом хосте прослушивает свой порт. Некоторые известные порты, которые могут фильтроваться: 20/TCP и 21/TCP — ftp-соединение/данные, 23/TCP — telnet, 80/TCP — http, 53/TCP — зональные передачи DNS.
- **статус соединения (заголовок TCP, транспортный уровень)** — статус соединения показывает, является ли пакет первым пакетом сетевой сессии. Бит ACK в заголовке TCP устанавливается в «false» или 0, если это первый пакет в сессии. Просто запретить хосту устанавливать соединение, отбрасывая любые пакеты с битом ACK, установленным в «false» или 0.
Полезные ресурсы:
- [Building Internet Firewalls — Пакетная фильтрация](http://web.deu.edu.tr/static/oreily/networking/firewall/ch06_01.htm)
</details>
<details>
<summary><b>Каковы преимущества использования обратного прокси-сервера?</b></summary><br>
**Скрытие топологии и характеристик ваших внутренних серверов**
**Обратный прокси-сервер** может скрыть присутствие и характеристики исходного сервера. Он действует как посредник между облаком Интернета и веб-сервером. Это хорошо с точки зрения безопасности, особенно при использовании услуг веб-хостинга.
**Обеспечивает прозрачное обслуживание внутренних серверов**
Изменения, вносимые в серверы, работающие за обратным прокси, будут полностью незаметны для конечных пользователей.
**Балансировка нагрузки**
Обратный прокси будет применять алгоритм балансировки нагрузки, такой как round robin, взвешенный round robin, наименьшее количество соединений, взвешенное наименьшее количество соединений или случайный, для распределения нагрузки между серверами в кластере.
Когда сервер выходит из строя, система автоматически переключается на следующий работающий сервер, и пользователи могут продолжать свою деятельность по безопасной передаче файлов.
**Разгрузка/завершение SSL**
Обрабатывает входящие HTTPS-соединения, расшифровывая запросы и передавая незашифрованные запросы веб-серверам.
**Маскировка IP**
Использование одного IP-адреса, но разных URL-адресов для маршрутизации к различным внутренним серверам.
Полезные ресурсы:
- [Преимущества обратного прокси](https://dzone.com/articles/benefits-reverse-proxy)
</details>
<details>
<summary><b>В чем разница между маршрутизатором и шлюзом? Что такое шлюз по умолчанию?</b></summary><br>
**Маршрутизатор** описывает общую техническую функцию (пересылка на уровне 3) или аппаратное устройство, предназначенное для этой цели, в то время как шлюз описывает функцию для локального сегмента (обеспечение связи с другими сетями). Можно также сказать, что «вы настраиваете маршрутизатор как шлюз». Другой термин — «хоп», описывающий пересылку между подсетями.
Термин **шлюз по умолчанию** используется для обозначения маршрутизатора в вашей локальной сети, который отвечает за первичную обработку трафика, направленного за пределы локальной сети.
Это просто вопрос точки зрения — устройство одно и то же.
Полезные ресурсы:
- [Разница между маршрутизатором и шлюзом (оригинал)](https://networkengineering.stackexchange.com/questions/51426/difference-between-router-and-gateway)
</details>
<details>
<summary><b>Объясните назначение каждой из следующих DNS-записей: SOA, PTR, A, MX и CNAME.</b></summary><br>
**DNS-записи** — это, по сути, файлы сопоставления, которые сообщают DNS-серверу, с каким IP-адресом связан каждый домен, и как обрабатывать запросы, отправляемые на каждый домен. Некоторые синтаксисы **DNS-записей**, обычно используемые почти во всех конфигурациях DNS, — это `A`, `AAAA`, `CNAME`, `MX`, `PTR`, `NS`, `SOA`, `SRV`, `TXT` и `NAPTR`.
- **SOA** — Start Of Authority (начало зоны авторитетности)
- **A** — запись сопоставления адресов
- **AAAA** — запись адреса IPv6
- **CNAME** — каноническая запись имени
- **MX** — запись почтового обменника
- **NS** — запись сервера имен
- **PTR** — запись обратного указателя
Полезные ресурсы:
- [Список типов DNS-записей](https://en.wikipedia.org/wiki/List_of_DNS_record_types)
</details>
<details>
<summary><b>Почему MAC-адреса нельзя использовать вместо IPv4/IPv6 для работы в сети?</b></summary><br>
Модель **OSI** объясняет, почему не имеет смысла принимать решения о маршрутизации (концепция **уровня 3**) на основе физического механизма (**уровень 2**).
Современные сети разделены на множество различных уровней для обеспечения сквозной связи. Ваша сетевая карта (которая адресуется MAC-адресом — физическим адресом) должна отвечать только за связь с узлами в своей физической сети.
Связь, которую вы можете установить с помощью вашего **MAC**-адреса, будет ограничена другими устройствами, находящимися в физическом контакте с вашей машиной. В Интернете, например, вы физически не подключены к каждой машине. Поэтому мы используем механизм **TCP/IP** (логический адрес **уровня 3**), когда нам нужно связаться с машиной, к которой мы не подключены физически.
**IP** — это произвольная схема нумерации, иерархически наложенная на группу компьютеров для логического выделения их в группу (это и есть подсеть). Обмен сообщениями между такими группами осуществляется с помощью таблиц маршрутизации, которые, в свою очередь, разделены на несколько уровней, чтобы нам не приходилось отслеживать каждую подсеть.
Это также легко соотнести с другой парой систем. У вас есть удостоверение личности, выданное государством. Зачем вам нужен почтовый адрес, если этот номер уже уникален для вас? Почтовый адрес нужен, потому что это произвольная система, описывающая, куда должно направляться уникальное место назначения для связи с вами.
С другой стороны, распределение **MAC**-адресов по сети является случайным и совершенно не связано с топологией. Группировка маршрутов была бы невозможна, каждому маршрутизатору пришлось бы хранить маршруты для каждого устройства, которое передает через него трафик. Это как раз то, что делают коммутаторы **уровня 2**, и это плохо масштабируется за пределами определенного количества хостов.
Полезные ресурсы:
- [Почему MAC-адреса нельзя использовать вместо IPv4/IPv6 для работы в сети? (оригинал)](https://serverfault.com/questions/410626/why-couldnt-mac-addresses-be-used-instead-of-ipv46-for-networking)
</details>
<details>
<summary><b>Какова наименьшая маска подсети IPv4, которую можно применить к сети, содержащей до 30 устройств?</b></summary><br>
Будь то стандартная VLAN `/24` для конечных пользователей, `/30` для каналов «точка-точка» или что-то среднее, подсеть, которая должна содержать до 30 устройств, соответствует маске `/27` — или маске подсети `255.255.255.224`.
Полезные ресурсы:
- [Как рассчитать префикс, сеть, подсеть и количество хостов?](https://networkengineering.stackexchange.com/questions/7106/how-do-you-calculate-the-prefix-network-subnet-and-host-numbers)
- [Слеш после IP-адреса — нотация CIDR](https://networkengineering.stackexchange.com/questions/3697/the-slash-after-an-ip-address-cidr-notation)
- [Почему существует 3 диапазона частных IPv4-адресов?](https://networkengineering.stackexchange.com/questions/32119/why-are-there-3-ranges-of-private-ipv4-addresses)
- [IP-калькулятор](http://jodies.de/ipcalc)
</details>
<details>
<summary><b>Назовите некоторые распространенные HTTP-статус коды.</b></summary><br>
- **1xx** — Информационные ответы — передают информацию протокольного уровня
- **2xx** — Успех — указывает, что запрос клиента был успешно принят
- **3xx** — Перенаправление — указывает, что клиент должен предпринять дополнительные действия для завершения своего запроса
- **4xx** — Ошибка на стороне клиента — эта категория кодов ошибок указывает на клиента
- **5xx** — Ошибка на стороне сервера — сервер берет на себя ответственность за эти коды статуса ошибок
Полезные ресурсы:
- [HTTP-статус коды](https://httpstatuses.com/)
</details>
###### Вопросы по DevOps (5)
<details>
<summary><b>Что такое DevOps? Что важнее для успеха любого сообщества DevOps: то, как люди общаются, или инструменты, которые вы выбираете для развертывания? ***</b></summary><br>
**DevOps** — это сплоченная команда, которая занимается как разработкой (Development), так и эксплуатацией (Operations), или же это отдельные команды эксплуатации и разработки, работающие очень тесно. Это скорее «способ» совместной работы с другими отделами для достижения общих целей.
</details>
<details>
<summary><b>Что такое система контроля версий? Ваши сообщения коммитов хорошо оформлены?</b></summary><br>
Это система, которая записывает изменения в файл или набор файлов с течением времени, чтобы вы могли впоследствии вернуться к определенным версиям. Системы контроля версий состоят из центрального общего репозитория, куда участники команды могут фиксировать изменения в файле или наборе файлов. Затем вы можете упомянуть варианты использования контроля версий.
Контроль версий позволяет:
- откатить файлы к предыдущему состоянию
- откатить весь проект к предыдущему состоянию
- сравнивать изменения с течением времени
- увидеть, кто последним изменял то, что могло вызвать проблему
- кто и когда внес проблему
Семь правил хорошего сообщения коммита:
- отделить тему от тела пустой строкой
- ограничить строку темы 50 символами
- использовать заглавную букву в начале темы
- не ставить точку в конце темы
- использовать повелительное наклонение в теме
- переносить тело на 72 символах
- использовать тело для объяснения «что» и «почему», а не «как»
Полезные ресурсы:
- [Начало работы — О контроле версий (оригинал)](https://git-scm.com/book/en/v2/Getting-Started-About-Version-Control)
</details>
<details>
<summary><b>Объясните некоторые основные команды <code>git</code>.</b></summary><br>
- `git init` — создать новый локальный репозиторий
- `git commit -m "message"` — зафиксировать изменения в HEAD
- `git status` — вывести список файлов, добавленных с помощью `git add`, а также любые файлы, измененные с тех пор
- `git push origin master` — отправить изменения в ветку master вашего удаленного репозитория
</details>
<details>
<summary><b>Объясните простой конвейер непрерывной интеграции (Continuous Integration).</b></summary><br>
- клонировать репозиторий
- этап развертывания (QA)
- среда тестирования (QA)
- этап развертывания (PROD)
</details>
<details>
<summary><b>Объясните некоторые основные команды <code>docker</code>.</b></summary><br>
- `docker ps` — показать запущенные контейнеры
- `docker ps -a` — показать все контейнеры
- `docker images` — показать образы Docker
- `docker logs <container-id|container-name>` — получить логи контейнера
- `docker network ls` — показать все сети Docker
- `docker volumes ls` — показать все тома Docker
- `docker exec -it <container-id|container-name> bash` — выполнить bash в контейнере с интерактивной оболочкой
</details>
###### Вопросы по кибербезопасности (1)
<details>
<summary><b>Что такое небезопасная конфигурация (Security Misconfiguration)?</b></summary><br>
**Небезопасная конфигурация** — это уязвимость, когда устройство/приложение/сеть сконфигурированы таким образом, что злоумышленник может использовать это в своих целях. Это может быть так же просто, как оставление имени пользователя и пароля по умолчанию без изменений или слишком простые пароли для учетных записей устройств и т.д.
</details>
### :diamond_shape_with_a_dot_inside: <a name="regular-sysadmin">Обычный сисадмин</a>
###### Системные вопросы (60)
<details>
<summary><b>Расскажите о вашем опыте работы с производственными средами? ***</b></summary><br>
To be completed.
</details>
<details>
<summary><b>Какой дистрибутив вы бы выбрали для запуска крупного веб-сервера? ***</b></summary><br>
To be completed.
</details>
<details>
<summary><b>Объясните в нескольких пунктах процесс загрузки системы Linux.</b></summary><br>
**BIOS**: Полное название BIOS — Basic Input/Output System, она выполняет проверку целостности, а затем ищет, загружает и выполняет загрузчик.
**Загрузчик (Bootloader)**: Поскольку ранние этапы не зависят от операционной системы, процесс загрузки на базе BIOS для архитектур x86 и x86-64 считается начинающимся, когда выполняется код главной загрузочной записи (MBR) в реальном режиме и загружается загрузчик первой стадии. В системах UEFI может выполняться непосредственно полезная нагрузка, например ядро Linux. Таким образом, загрузчик не требуется. Некоторые популярные загрузчики: **GRUB**, **Syslinux/Isolinux** или **Lilo**.
**Ядро (Kernel)**: Ядро в Linux обрабатывает все процессы операционной системы, такие как управление памятью, планирование задач, ввод/вывод, межпроцессное взаимодействие и общее управление системой. Оно загружается в два этапа: на первом этапе ядро (в виде сжатого файла образа) загружается в память и распаковывается, настраиваются несколько фундаментальных функций, таких как базовое управление памятью.
**Init**: Является родительским процессом для всех процессов в системе, он выполняется ядром и отвечает за запуск всех остальных процессов.
- `SysV init` — задача init состоит в том, «чтобы все работало должным образом, как только ядро полностью запущено». По сути, он устанавливает и управляет всем пользовательским пространством. Сюда входит проверка и монтирование файловых систем, запуск необходимых пользовательских служб и, в конечном итоге, переключение на пользовательскую среду после завершения загрузки системы.
- `systemd` — разработчики systemd намеревались заменить систему инициализации Linux, унаследованную от Unix System V. Как и init, systemd — это демон, управляющий другими демонами. Все демоны, включая systemd, являются фоновыми процессами. Systemd запускается первым (во время загрузки) и завершается последним (во время выключения).
- `runit` — runinit — это схема инициализации для Unix-подобных операционных систем, которая инициализирует, контролирует и завершает процессы во всей операционной системе. Это реализация инструментария контроля процессов daemontools, работающая в операционных системах Linux, Mac OS X, \*BSD и Solaris.
Полезные ресурсы:
- [Анализ процесса загрузки Linux](https://opensource.com/article/18/1/analyzing-linux-boot-process)
- [Процесс загрузки systemd в Linux — подробный обзор](https://linoxide.com/linux-how-to/systemd-boot-process/)
</details>
<details>
<summary><b>Как и почему демоны Linux понижают свои привилегии? Почему некоторым демонам для запуска требуются права root? Объясните. ***</b></summary>
To be completed.
</details>
<details>
<summary><b>Почему загрузка 1.00 не является идеальной для одноядерной машины?</b></summary><br>Проблема с нагрузкой 1.00 заключается в том, что у вас нет запаса. На практике многие системные администраторы проводят черту на отметке 0.70.
**Эмпирическое правило «Нужно разобраться»: 0.70.** Если средняя загрузка стабильно превышает 0.70, пора заняться расследованием, пока ситуация не ухудшилась.
**Эмпирическое правило «Исправлять немедленно»: 1.00.** Если средняя загрузка стабильно превышает 1.00, найдите проблему и исправьте её сейчас. Иначе вас разбудят среди ночи, и это будет невесело.
**Эмпирическое правило: 5.0.** Если средняя загрузка превышает 5.00, вы можете оказаться в серьёзной беде: ваша машина либо зависнет, либо сильно замедлится, и это (необъяснимо) случится в самый неподходящий момент — например, посреди ночи или во время выступления на конференции. Не допускайте этого.
Полезные ресурсы:
- [Правильный способ интерпретации системной загрузки на процессоре с 4 ядрами и 8 потоками](https://serverfault.com/questions/618130/proper-way-of-interpreting-system-load-on-a-4-core-8-thread-processor)
- [Понимание загрузки ЦП в Linux — когда стоит беспокоиться?](http://blog.scoutapp.com/articles/2009/07/31/understanding-load-averages)
</details>
<details>
<summary><b>Что означает, что эффективный пользователь — root, а реальный идентификатор пользователя по-прежнему ваше имя?</b></summary><br>
**Реальный идентификатор пользователя (real user ID)** — это кто вы на самом деле (пользователь, которому принадлежит процесс), а **эффективный идентификатор пользователя (effective user ID)** — это то, на что смотрит операционная система, принимая решение, разрешено ли вам что-то делать (в большинстве случаев, хотя бывают исключения).
Когда вы входите в систему, оболочка входа устанавливает и **реальный, и эффективный идентификаторы пользователя** в одно и то же значение (ваш **реальный идентификатор пользователя**), взятое из файла паролей.
Если, например, вы выполняете setuid, и помимо работы от имени другого пользователя (например, **root**), программа setuid также должна что-то сделать от вашего имени.
После выполнения setuid у неё будет ваш **реальный идентификатор** (поскольку вы владелец процесса) и эффективный идентификатор пользователя владельца файла (например, **root**), так как она установлена как setuid.
Рассмотрим пример с `passwd`:```bash
-rwsr-xr-x 1 root root 45396 may 25 2012 /usr/bin/passwd
Использование logrotate — обычный способ работы с лог-файлами. Но вместо добавления содержимого в /etc/logrotate.conf лучше добавить свою задачу в /etc/logrotate.d/, иначе при обновлении версий придётся просматривать больше различий в файлах конфигурации.
Если файл активно пишется, у вас не так много возможностей для его усечения. Единственные варианты — усечь файл:```bash : >/var/log/massive-logfile
Это очень удобно, так как позволяет усекать файл без нарушения работы процессов.
Полезные ресурсы:
- [How to Use logrotate to Manage Log Files](https://www.linode.com/docs/uptime/logs/use-logrotate-to-manage-log-files/)
- [System logging](https://www.ibm.com/developerworks/library/l-lpic1-108-2/index.html)
</details>
<details>
<summary><b>Как ядро Linux создаёт, управляет и удаляет процессы в системе? ***</b></summary><br>
Будет дополнено.
Полезные ресурсы:
- [Linux Processes](https://www.tldp.org/LDP/tlk/kernel/processes.html)
</details>
<details>
<summary><b>Объясните выбранную информацию, которую можно увидеть в <code>top</code> и <code>htop</code>. Как диагностировать нагрузку, высокое время пользовательского режима и проблемы с нехваткой памяти с помощью этих инструментов? ***</b></summary><br>
Будет дополнено.
Полезные ресурсы:
- [top explained visually](https://www.svennd.be/top-explained-visually/)
- [htop Explained Visually](https://codeahoy.com/2017/01/20/hhtop-explained-visually/)
- [Explanation of everything you can see in htop/top on Linux](https://peteris.rocks/blog/htop/)
</details>
<details>
<summary><b>Как распознать процесс, который пожирает ресурсы? </b></summary><br>
`top` работает достаточно хорошо, если смотреть на правильные цифры.
- **M** Сортировка по текущему использованию резидентной памяти
- **T** Сортировка по общему (или накопленному) использованию ЦП
- **P** Сортировка по текущему использованию ЦП (это обновление по умолчанию)
- **?** Отображает сводку использования для всех команд top
Это очень важная информация для выяснения причин медленной работы компьютерного процесса и принятия решений о том, какие процессы завершить/какое программное обеспечение удалить.
Полезные ресурсы:
- [How to find the process(es) which are hogging the machine](https://superuser.com/questions/326300/how-to-find-the-processes-which-are-hogging-the-machine)
</details>
<details>
<summary><b>Вам необходимо обновить службу <code>ntpd</code> на 200 серверах. Как лучше всего обновить их все до последней версии?</b></summary><br>
Используя подход **Инфраструктура как код**, существует несколько хороших способов:
1. **Модель управления изменениями через синхронизацию конфигурации**:
Существуют инструменты управления конфигурацией (Ansible, Chef, Puppet, Saltstack и т.д.), которые можно использовать для автоматического обновления службы `ntpd` на всех серверах. Для поддержания стабильности систем пакеты на серверах обычно обновляются автоматически только с исправлениями безопасности. Основные или минорные версии пакетов обычно фиксируются по версии в определениях конфигурации, чтобы предотвратить неправильную настройку службы. Изменение развёртывается путём изменения версии `ntpd` в определении конфигурации.
При таком подходе важно быть осторожным при массовом развёртывании изменений в инфраструктуре. Конвейер развёртывания должен включать модульные, интеграционные и системные тесты, а в конечном итоге сначала развёртываться в среду Staging для проверки конфигурации. Если тесты подтверждают корректность конфигурации, развёртывание должно выполняться поэтапно с возможностью отката в случае ошибок или сбоев.
2. **Модель неизменяемых серверов**:
В модели неизменяемого сервера целая единица (сервер, контейнер) заменяется новым обновлённым образом, а не вносятся изменения в работающий сервер (это устраняет дрейф конфигурации). При таком подходе образ сервера обычно создаётся с помощью инструментов, таких как Packer или Docker с Dockerfile. Затем этот образ тестируется и развёртывается аналогично варианту выше (1.), но теперь используются такие техники, как Canary Release, которые также позволяют поэтапное развёртывание и откат.
Полезные ресурсы:
- [Infrastructure as a Code - Chapter 8: Patterns for Updating and Changing Servers](http://shop.oreilly.com/product/0636920039297.do)
</details>
<details>
<summary><b>Как навсегда установить <code>$PATH</code> в Linux/Unix? Почему эта переменная так важна? ***</b></summary>
Будет дополнено.
</details>
<details>
<summary><b>Когда сервер загружается, на консоли появляются некоторые ошибки. Как просмотреть сообщения загрузки и где они хранятся?</b></summary><br>
На вашей консоли есть два типа сообщений:
- **сгенерированные ядром** (через printk)
- **сгенерированные пользовательским пространством** (обычно вашей системой инициализации)
Сообщения ядра всегда хранятся в буфере **kmsg**, который виден через команду `dmesg`. Они также часто копируются в ваш **syslog**. Это также относится к сообщениям пользовательского пространства, записанным в `/dev/kmsg`, но такие встречаются довольно редко.
Между тем, когда пользовательское пространство выводит свой нарядный статус загрузки на `/dev/console` или `/dev/tty1`, оно нигде не сохраняется. Оно просто идёт на экран, и всё.
`dmesg` используется для просмотра сообщений загрузки, содержащихся в кольцевом буфере ядра. Кольцевой буфер — это буфер фиксированного размера, в котором любые новые данные перезаписывают самые старые.
Он показывает операции после завершения процесса загрузки, такие как параметры командной строки, переданные ядру; обнаруженные аппаратные компоненты, события при подключении нового USB-устройства или ошибки, например, отказ NIC (сетевой интерфейсной карты), когда драйверы сообщают об отсутствии активности на сетевом канале, и многое другое.
Если ведение журнала системы осуществляется через компонент journal, следует использовать `journalctl`. Он показывает сообщения, включая сообщения ядра и загрузки; сообщения от syslog или различных служб.
Проблемы/ошибки загрузки требуют от системного администратора просмотра определённых важных файлов в сочетании с определёнными командами (обрабатываются по-разному в разных версиях Linux):
- `/var/log/boot.log` — журнал загрузки системы, содержит всё, что происходило во время загрузки системы
- `/var/log/messages` — хранит глобальные системные сообщения, включая сообщения, регистрируемые во время загрузки системы
- `/var/log/dmesg` — содержит информацию кольцевого буфера ядра
| Тип главы | Количество вопросов | Краткое описание |
|---|
| Введение | ||
| 🔸 Простые вопросы | 14 вопросов | Расслабленные, весёлые и простые — отлично подходят для начала. |
| Общие знания | ||
| 🔸 Младший сисадмин | 65 вопросов | Достаточно простые и основанные на базовых знаниях. |
| 🔸 Обычный сисадмин | 94 вопроса | Средний уровень вопросов для тех, кто обладает хорошими знаниями. |
| 🔸 Старший сисадмин | 99 вопросов | Сложные вопросы и головоломки. Проверьте, если хотите быть хорошим. |
| Секретные знания | ||
| 🔸 Гуру сисадмин | 12 вопросов | Действительно глубокие вопросы, чтобы узнать Гуру сисадмина. |
bash-completionСоветы и уловки
CTRL + Rpopd/pushd и другие встроенные функции оболочки, которые позволяют управлять стеком директорийCTRL + U, CTRL + E!* — все аргументы последней команды!! — вся последняя команда!ssh — последняя команда, начинающаяся с sshПолезные ресурсы:
Для получения подробной информации, включая имя пользователя, терминал, IP-адрес исходного компьютера, время начала сеанса, время простоя, тактовые циклы процессора, тактовые циклы задания и текущую выполняемую команду, введите:```bash
w
Также важно для отображения списка последних вошедших пользователей, введите:```bash
# It uses /var/log/wtmp.
last
Полезные ресурсы:
или```bash grep -e "string1" -e "string2" filename
Полезные ресурсы:
- [Что такое grep и как его использовать? (оригинал)](https://kb.iu.edu/d/afiy)
</details>
<details>
<summary><b>Объясните команды для работы с содержимым файлов и их описание.</b></summary><br>
- `head`: проверка начала файла.
- `tail`: проверка окончания файла. Противоположна команде head.
- `cat`: используется для просмотра, создания и объединения файлов.
- `more`: используется для отображения текста в окне терминала в режиме постраничного просмотра.
- `less`: используется для просмотра текста в обратном направлении, а также обеспечивает построчное перемещение.
Полезные ресурсы:
- [Просмотр текстовых файлов из командной строки](https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/4/html/Step_by_Step_Guide/s1-viewingtext-terminal.html)
</details>
<details>
<summary><b>Сигналы POSIX SIGHUP, SIGINT, SIGKILL и SIGTERM. Объяснение.</b></summary><br>
- **SIGHUP** - отправляется процессу, когда его управляющий терминал закрывается. Изначально был предназначен для уведомления процесса о разрыве последовательной линии (обрыве связи). Многие демоны при получении этого сигнала перезагружают свои конфигурационные файлы и повторно открывают файлы журналов вместо завершения.
- **SIGINT** - отправляется процессу его управляющим терминалом, когда пользователь хочет прервать процесс. Обычно это инициируется нажатием `Ctrl+C`, но в некоторых системах можно использовать символ "delete" или клавишу "break".
- **SIGKILL** - отправляется процессу для немедленного завершения (убийства). В отличие от **SIGTERM** и **SIGINT**, этот сигнал нельзя перехватить или игнорировать, и принимающий процесс не может выполнить никаких операций очистки при его получении.
- **SIGTERM** - отправляется процессу с запросом на завершение. В отличие от сигнала **SIGKILL**, он может быть перехвачен и обработан или проигнорирован процессом. Это позволяет процессу корректно завершиться, освободив ресурсы и сохранив состояние, если это необходимо. **SIGINT** почти идентичен **SIGTERM**.
Полезные ресурсы:
- [Сигналы POSIX](https://dsa.cs.tsinghua.edu.cn/oj/static/unix_signal.html)
- [Введение в программирование сигналов Unix](http://titania.ctie.monash.edu.au/signals/)
</details>
<details>
<summary><b>Что делает команда <code>kill</code>?</b></summary><br>
В Unix и Unix-подобных операционных системах `kill` — это команда, используемая для отправки сигнала процессу. По умолчанию отправляется сигнал завершения, который запрашивает выход процесса. Но название `kill` вводит в заблуждение; отправляемый сигнал может не иметь ничего общего с завершением процесса.
Полезные ресурсы:
- [Освоение команды "Kill" в Linux](https://www.maketecheasier.com/kill-command-in-linux/)
</details>
<details>
<summary><b>В чем разница между <code>rm</code> и <code>rm -rf</code>?</b></summary><br>
`rm` удаляет только указанные файлы (не каталоги). С параметром `-rf`, как вы говорите:
- `-r`, `-R`, `--recursive` рекурсивно удаляет содержимое каталога, включая скрытые файлы и подкаталоги
- `-f`, `--force` игнорировать несуществующие файлы, никогда не запрашивать подтверждение
Полезные ресурсы:
- [В чем разница между `rm -r` и `rm -f`?](https://superuser.com/questions/1126206/what-is-the-difference-between-rm-r-and-rm-f)
</details>
<details>
<summary><b>Как выполнить рекурсивный <code>grep</code>? Объясните на нескольких примерах. ***</b></summary>
Дополнить.
</details>
<details>
<summary><b><code>archive.tgz</code> имеет размер ~30 ГБ. Как просмотреть его содержимое и извлечь только один файл?</b></summary><br>```bash
# list of content
tar tf archive.tgz
# extract file
tar xf archive.tgz filename
Полезные ресурсы:
r - разрешение на чтениеw - разрешение на записьПолезные ресурсы:
Полезные ресурсы:
Подсеть — это не более чем диапазон IP-адресов, который помогает хостам взаимодействовать на уровне 2 и 3. Каждая подсеть не требует своей VLAN. VLAN используются для изоляции (песочница для обмена на втором уровне: две системы из разных VLAN не могут взаимодействовать, но это можно сделать с помощью меж-VLAN маршрутизации), упрощения управления и повышения безопасности.
Полезные ресурсы:
| СЛУЖБА | ПОРТ |
|---|---|
| SMTP | 25 |
| FTP | 20 для передачи данных и 21 для установки соединения |
| DNS | 53 |
| DHCP | 67/UDP для сервера DHCP, 68/UDP для клиента DHCP |
| SSH | 22 |
Полезные ресурсы:
Вы можете (иногда) выполнить обратное разрешение IP-адреса в имя хоста. IP-адрес может быть сохранен в записи PTR. Затем вы можете сделать:```bash dig A
Чтобы найти IPv4-адрес для хоста, или:```bash
dig AAAA <hostname>
Для поиска IPv6-адреса для хоста, или:```bash dig PTR ZZZ.YYY.XXX.WWW.in-addr.arpa.
Для поиска имени хоста по IPv4-адресу `WWW.XXX.YYY.ZZZ` (обратите внимание, октеты расположены в обратном порядке), или:```bash
dig PTR b.a.9.8.7.6.5.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa.
Полезные ресурсы:
Когда пользователь2 хочет изменить свой пароль, он выполняет /usr/bin/passwd.
RUID будет пользователем2, но EUID этого процесса будет root.
Пользователь2 может использовать passwd только для смены своего собственного пароля, потому что внутренне passwd проверяет RUID и, если он не root, его действия будут ограничены паролем реального пользователя.
Необходимо, чтобы EUID стал root в случае passwd, так как процессу нужно записывать в /etc/passwd и/или /etc/shadow.
Полезные ресурсы: