Вопросы для собеседования Системного администратора или DevOps инженера Linux. Часть 3. Medium Linux Questions — 1

Всем привет! В прошлой статье мы продолжили разбор статьи с GitHub — Linux System Administrator/DevOps Interview Questions.
Сегодня будет пачка вопрос из раздела «Средние» — экзамен на звание Middle Linux administrator. Так как в оригинальной статье этот блок вышел довольно объемным (49 вопросов), я решил разбить его на 2 части (29 и 30 соответственно).

Вопросы среднего уровня сложности / Medium Linux Questions

1. Что делают следующие команды и как вы можете их использовать? (What do the following commands do and how would you use them?): tee, awk, tr, cut, tac, curl, wget, watch, head, tail

  • tee — читает со стандартного ввода (stdin) и выводит на стандартный вывод (stdout) и в указанный файл. Очень удобно когда вашему скрипту нужно и лог писать, и интерактивно сообщения на экран отправлять
  • awk — потоковый редактор который помогает управлять текстом при выводе. Я например использую его для удобного оперирования многоколоночным текстом.
  • tr — утилита для управления символами во входящем потоке текста. Подставлять или удаляет указанные символы
  • cut — утилита обработки текста, позволяющая выбирать колонки из текста или поля из строки
  • tac — команда, обратная команде cat — выводит файл (или конкатенацию файлов) но задом-наперед
  • curl клиентская программа для взаимодействия с серверами, поддерживающими формат url обращений, обычно веб серверами. Лично я применяю ее как консольный клиент для работы с веб серверами- проверить доступность, статус, дернуть api и тд.
  • wget — утилита для сетевой загрузки файлов.
  • watch — утилита позволяющая отслеживать вывод не интерактивной программы, запуская ее многократно, с указанным интервалом времени. Удобно когда вы хотите посмотреть какой то процесс в динамике — например “watch cat /proc/mdstat”
  • head — утилита обработки текста. Вывод указанное число строк с начала файла
  • tail утилита обработки текста. Вывод указанное число строк с конца файла. Может работать в режиме постоянного чтения и вывода на экран информации, дописываемой другим процессом в конец файла. Удобно смотреть логи в режиме реального времени

2. Что сделает символ &, введенный сразу после команды? (What does an & after a command do?)

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

 

3. Что такое пакетный фильтр и как он работает? (What is a packet filter and how does it work?)

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

4. Что такое виртуальная память? (What is Virtual Memory?)

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

5. Что такое swap и для чего он используется? (What is swap and what is it used for?)

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

6. Что такое A, NS, PTR и CNAME записи? (What is an A record, an NS record, a PTR record, a CNAME record, an MX record?)

Ресурсные записи системы dns:

  • A — основная запись, ставящая человеко-читаемое имя в формате fqdn в соответствие ip адресу.
  • NS — ресурсная запись, содержащая информацию об ip адресе dns сервера, обслуживающего данный домен
  • PTR — т.н. “обратная” ресурсная запись, противоположная А, ставящая в соответствие ip адресу имя в формате fqdn
  • CNAME — ресурсная запись- псевдоним, позволяющая создать одноуровневую переадресацию, задавая соответствие имя-имя (например для сервера srv.example.com, функциональный псевдоним mail.example.com)

7. Какие есть еще ресурсные записи и для чего они используются? (Are there any other RRs and what are they used for?)

  • MX — ресурсная запись, указывающая на сервер, обслуживающий почту в домене
  • TXT — произвольная текстовая запись. Часто используется для различных проверок
  • SRV — сервисная ресурсная запись. Указывает на местоположение серверов, обеспечивающих тот или иной сервис. Пример — Active Directory
  • SOA — Базовая запись DNS зоны с ее параметрами и прочими ресурсными записями внутри.
  • AAAA — то же самое что и A, только для ipv6

8. Что такое расщепление горизонта в терминах dns? (What is a Split-Horizon DNS?)

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

9. Что такое “липкий” бит? (What is the sticky bit?)

Дополнительный атрибут файла в UNIX файловых системах. Изначально он означал что программа, будучи запущена, должна оставаться в оперативной памяти целиком для ускорения работы и повторных обращений. С ростом объема оперативной памяти это стало не актуально и теперь этот бит выполняет роль защитного предохранителя для каталогов — если на каталог установлен “липкий бит”, пользователь, даже имея все необходимые права, сможет удалить только те файлы, владельцем которых он является.

10. Что означает для файла выставленный иммутабельный бит? (What does the immutable bit do to a file?)

Дополнительный атрибут файла в UNIX файловых системах, который будучи установленным для конкретного файла, не позволяет записывать в него изменения, тем самым принудительно устанавливая на него режим “только для чтения” (даже если редактировать его попытается пользователь с привилегиями root).

11. В чем разница между жесткой ссылкой/хардлинком и мягкой ссылкой/симлинком? Что происходит когда вы удаляете хардлинк/симлинк? (What is the difference between hardlinks and symlinks? What happens when you remove the source to a symlink/hardlink?)

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

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

12. Что такое айнода и что хранится в ней? (What is an inode and what fields are stored in an inode?)

Структура данных файловой системы в которой хранится информация о файле ( по одной айноде на файл), такая как:

  • Блок данных с которого файл начинается
  • Дата создания, изменения
  • Права доступа
  • Владелец

Имя файла не хранится в айноде — это хардлинк

13. как принудительно заставить систему выполнить проверку файловой системы при следующей загрузке? (How to force/trigger a file system check on next reboot?)

Мне известны два способа:

  • Создать в корне пустой файл: touch /forcefsck — его наличие переопределяет все настройки для fsck в файле /etc/fstab и заставляет систему принудительно проверить корневую файловую систему при запуске. После успешной проверки файл удаляется
  • Использовать команду tune2fs -c 1 /dev/sdb1 чтобы включить проверку файловой системы на sdb1 при следующей загрузке.

14. Что такое snmp и для чего он используется? (What is SNMP and what is it used for? )

simple network management protocol. переводить я думаю не нужно) Является стандартом дефакто в мире сетевого мониторинга, позволяя снимать различные метрики с хостов, устройств и любых объектов, которые могут быть подключены к сети и на которых производитель реализовал поддержку этого протокола.

15. Что такое уровень запуска и как посмотреть текущий? (What is a runlevel and how to get the current runlevel? )

Нумерованный режим функционирования операционной системы. В зависимости от номера ( уровня) зависит объем задействованных возможностей, например:

  • 1 — однопользовательский режим, предназначен для различных административных действий по восстановлению системы; на этом уровне выполнения система полностью сконфигурирована, но не запущен ни один сервис, а из пользователей может работать только один root;
  • 2 — многопользовательский режим без поддержки сети
  • 3 — многопользовательский режим с поддержкой сети, нормальный режим работы сервера;
  • 5 — загрузка в многопользовательском режиме с графическим входом в систему;

Текущий уровень можно посмотреть командой runlevel:

16. Что такое проброс портов ssh? (What is SSH port forwarding?)

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

17. В чем разница между локальным и удаленным пробросом портов? (What is the difference between local and remote port forwarding?)

В такой формулировке к сожалению вопрос не очень понятный, я для себя воспринимаю его так:

  • мы можем поверх ssh соединения к машине А, пробросить локальный порт со своей машины на некоторый локальный порт машины А. Например у нас есть веб сервер на котором так же установлена СУБД MySQL. Она сконфигурирована так, чтобы принимать соединения только с локальной машины ( в целях безопасности), но мы хотим подключиться к ней удаленно неким клиентским ПО ( стандартной утилитой mysql или графической оболочкой типа MySQL Workbrench). Для этого мы устанавливаем ssh соединения и поверх него настраиваем тоннель, соединяющий наш локальный порт xxx с портом localhost:3360 на удаленном сервере
  • Удаленный проброс портов, когда у нас есть возможность соедениться по ssh с машиной в удаленной сети, но по факту нам нужно попасть на другую машину в той же сети, куда прямого доступа нет. Тогда мы можем “пробросить” это соединение через машину, которая нам доступна.

18. Какие действия необходимо выполнить чтобы добавить пользователя без использования команд useradd/adduse ? (What are the steps to add a user to a system without using useradd/adduser?)

  1. Создать соответствующие записи в файлах /etc/passwd, /etc/shadow, /etc/groups
  2. Создать домашний каталог с необходимым содержимым
  3. Сделать нового пользователя владельцем этого каталога

19. Что такое мажорная и минорная версия файла? (What is MAJOR and MINOR numbers of special files?)

Согласно документации semver (https://semver.org/lang/ru/), действуют следующие понятия:

Обычный номер версии ДОЛЖЕН иметь формат X.Y.Z, где X, Y и Z — неотрицательные целые числа и НЕ ДОЛЖНЫ начинаться с нуля. X — мажорная версия, Y — минорная версия и Z — патч-версия.

Минорная версия (x.Y.z | x > 0) ДОЛЖНА быть увеличена, если в публичном API представлена новая обратно совместимая функциональность. Версия ДОЛЖНА быть увеличена, если какая-либо функциональность публичного API помечена как устаревшая (deprecated). Версия МОЖЕТ быть увеличена в случае реализации новой функциональности или существенного усовершенствования в приватном коде. Версия МОЖЕТ включать в себя изменения, характерные для патчей. Патч-версия ДОЛЖНА быть обнулена, когда увеличивается минорная версия.

Мажорная версия X (X.y.z | X > 0) ДОЛЖНА быть увеличена, если в публичном API представлены какие-либо обратно несовместимые изменения. Она МОЖЕТ включать в себя изменения, характерные для уровня минорных версий и патчей. Когда увеличивается мажорная версия, минорная и патч-версия ДОЛЖНЫ быть обнулены.

20. Опишите команду mknod и для чего бы вы ее применили? (Describe the mknod command and when you’d use it)

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

21. Опишите сценарий, при котором вы получаете сообщение “нет свободного места на файловой системе”, при этом команда “df” показывает что свободное место еще есть? (Describe a scenario when you get a «filesystem is full» error, but ‘df’ shows there is free space.)

Все очень просто — закончились свободные inode на данной файловой системе. То есть свободные блоки на блочном устройстве еще есть, а вот свободные файловые структуры под метаданные файлов в самой файловой системе закончились.

Проверить можно командой:

22. Опишите сценарий при удалении файла, когда “df” не показывает что после удаления место освободилось? (Describe a scenario when deleting a file, but ‘df’ not showing the space being freed.)

Опять же, все очень просто — дескриптор удаленного файла остался открыт каким-то приложением, которое тем самым не позволяет освободить место на файловой системе. выход из ситуации — при помощи команды lsof посмотреть список открытых файлов. Удаленные но все еще открытые файлы будут помечены как deleted, но так же вы увидите pid процесса который держит открытый дескриптор. Перезапустите этот процесс ( если это сервис) или просто убейте и вы увидите, что место освободилось!

23. Опишите, как работает утилита “ps”? (Describe how ‘ps’ works.)

В Linux  команда ps работает со специальной псевдофайловой системой proc. Каталог  /proc/PID  содержит большое количество различных файлов, которые предоставляют информацию о процессе с номером PID. Эти файлы и каталоги создаются “на лету” ядром операционной системы

Вы сами можете убедиться в этом, используя утилиту strace при запуске команды ps  — вы увидите все системные вызовы и файлы, которые открывает программа.

24. Что происходит, когда дочерний процесс умирает, не имея родителя, который бы дождался окончания его работы и чем это плохо? (What happens to a child process that dies and has no parent process to wait for it and what’s bad about this?)

Если родитель умер раньше завершения дочернего процесса, такой процесс называется “осиротевшим” и его забирает (“усыновляет”) процесс init, который корректно может его завершить. Если же мы имеем дело с ситуацией когда дочерний процесс умер а родитель просто не обработал это (возможно именно это имеется ввиду) — он превращается в процесс-зомби.  Фактически ресурсов он не потребляет, остается только запись в таблице процессов, то есть некоторое число открытых файлов. Пока он один это не страшно, но если число зомби процессов растет, мы рискуем попасть в ситуацию когда мы достигнем лимита числа открытых файловых дескрипторов…. В итоге вы не сможете зайти на сервер или уже будучи там, не сможете запустить новый экземпляр bash или любую команду.

25. Кратко объясните каждое из состояний процесса? (Explain briefly each one of the process states.)

Существует всего 3 состояния, в которых может находиться процесс:

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

26. Как узнать какой процесс слушает указанный порт? (How to know which process listens on a specific port?)

Есть старый и новый способ.

Старый способ- использовать команду netstat — например мы хотим узнать кто слушает 53/tcp порт:

Новый способ — утилита ss. Посмотрим для того же порта:

27. Что такое зомби-процесс и что может быть его причиной? (What is a zombie process and what could be the cause of it?)

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

Поиск зомби: ps -axho state,pid,ppid | grep Z | sed ‘s/./ps/’ | sh

Данная команда покажет все зомби процессы и их родителей (тестировалась под linux, под другими *nix возможны другие ключи у команды ps).

Убить зомби можно только перезапуском родительского процесса. kill -9 самого процесса-зомби и чеснок обычно не помогают. Если появление зомби разовое явление, то возможно проще на факт его появления забить

Вариант 2: родительский процесс использует wait, но зомби все равно появляются. Копать в сторону того, какая разновидность wait используется, если waitpid, которая проверяет завершение конкретных потомков, то смотреть откуда она берет проверяемые pid, возможно в процессе работы какие то pid потомков теряются и программа про них забывает. Может программа в какой то момент запрещает обработку сигналов и забывает восстановить обработку, после прохождения критического участка. Опять же — вариантов очень много, но сосредоточены они вокруг обработчика SIGCHLD и функций wait.

Вариант 3: родительский процесс умеет обрабатывать и готов правильно обработать завершение своих потомков. Но зацикливается в другом месте программы или засыпает на системном вызове, например чтения с сетевого диска, который стал недоступен и при этом прерывание по SIGCHLD запрещено. В этом случае надо разбираться с причинами его зависания. Кстати, отсутствие доступа к каким либо ресурсам, типа сетевых дисков (или при выходе из строя физического диска) — довольно частая причина массового появления зомби.

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

28. Вы запускаете баш скрипт и хотите одновременно видеть  его вывод на экран а так же в то же время писать лог скрипта в файл. Как это реализовать? (You run a bash script and you want to see its output on your terminal and save it to a file at the same time. How could you do it?)

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

29. Опишите, что делает команда “echo «1» > /proc/sys/net/ipv4/ip_forward”? (Explain what echo «1» > /proc/sys/net/ipv4/ip_forward does.)

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