From dd9731b3d5d36181a19dde68d19ee0129aa3ca9c Mon Sep 17 00:00:00 2001 From: dannc Date: Fri, 6 May 2022 11:28:52 +0700 Subject: [PATCH] fix all homeworks in 03-sysadmin --- src/homework/03-sysadmin/3.2/readme.md | 56 ++++++++++++++----- src/homework/03-sysadmin/3.3/readme.md | 42 ++++++++++---- src/homework/03-sysadmin/3.4/readme.md | 34 ++++++++---- src/homework/03-sysadmin/3.5/readme.md | 76 +++++++++++++++++++------- src/homework/03-sysadmin/3.6/readme.md | 34 +++++++++--- src/homework/03-sysadmin/3.7/readme.md | 28 +++++++--- src/homework/03-sysadmin/3.8/readme.md | 24 ++++++-- src/homework/03-sysadmin/3.9/readme.md | 30 +++++++--- 8 files changed, 239 insertions(+), 85 deletions(-) diff --git a/src/homework/03-sysadmin/3.2/readme.md b/src/homework/03-sysadmin/3.2/readme.md index 0ffd6c2..5c3e99f 100644 --- a/src/homework/03-sysadmin/3.2/readme.md +++ b/src/homework/03-sysadmin/3.2/readme.md @@ -3,21 +3,29 @@ ## Q/A -1. Какого типа команда `cd`? +### Задача 1 + +> Какого типа команда `cd`? При вызове `type cd` будет выведено, что `cd is a shell builtin`, то есть команда встроенная в оболочку. Данная команда необходима для работы пользователя с терминалом и для работы других команд, именно поэтому она встроена в ядро операционной системы. -2. Какая альтернатива без pipe команде `grep | wc -l`? +### Задача 2 + +> Какая альтернатива без pipe команде `grep | wc -l`? Альтернативой является команда `grep -c `. -3. Какой процесс с PID 1 является родителем для всех процессов в вашей виртуальной машине Ubuntu 20.04? +### Задача 3 + +> Какой процесс с PID 1 является родителем для всех процессов в вашей виртуальной машине Ubuntu 20.04? Найти родителя всех процессов можно вызвав команду `pstree -p | grep \(1\)`. Ответ: процесс с PID 1 - `systemd`. -4. Как будет выглядеть команда, которая перенаправит вывод stderr `ls` на другую сессию терминала? +### Задача 4 + +> Как будет выглядеть команда, которая перенаправит вывод stderr `ls` на другую сессию терминала? Откроем два терминала на виртуальной машине. Для каждого из них будет создан новый файл в директории `/dev/pts/`. Таким образом, если мы хотим перенаправить stderr команды, то нужно выполнить следующие действия: @@ -28,7 +36,9 @@ ls /some/invalid/dir 2>&1 1>&/dev/pts/ ``` -5. Получится ли одновременно передать команде файл на stdin и вывести ее stdout в другой файл? +### Задача 4 + +> Получится ли одновременно передать команде файл на stdin и вывести ее stdout в другой файл? Да, подобное можно реализовать следующим способом. @@ -42,20 +52,26 @@ cat out_file Содержимое out_file является выводом команды grep, а именно одна строка `abc`. -6. Получится ли находясь в графическом режиме, вывести данные из PTY в какой-либо из эмуляторов TTY? Сможете ли вы наблюдать выводимые данные? +### Задача 6 + +> Получится ли находясь в графическом режиме, вывести данные из PTY в какой-либо из эмуляторов TTY? Сможете ли вы наблюдать выводимые данные? Да, подобное возможно. Достаточно, например, открыть новую сессию терминала в графической оболочке и выполнить перенаправление потока в `/dev/pts/`. Так же любая программа с графическим интерфейсом может выполнить данное действие. Наблюдать данные возможно, если открыт терминал, подключённый к конкретной сессии. -7. Выполните команду `bash 5>&1`. К чему она приведет? Что будет, если вы выполните `echo netology > /proc/$$/fd/5`? Почему так происходит? +### Задача 7 + +> Выполните команду `bash 5>&1`. К чему она приведет? Что будет, если вы выполните `echo netology > /proc/$$/fd/5`? Почему так происходит? Насколько я понимаю, команда `bash 5>&1` создаёт новую терминальную сессию с перенаправлением потока из `5` в `1`, то есть в `stdout`. Но так как `5` - это не стандартный идентификатор потока, поэтому оболочка создаст новый файл `/proc/$$/fd/5`. Данный файл будет алиасом для stdout, поэтому выполнение `echo` выведет содержимое в терминал, как это сделал бы обычный вызов команды без перенаправлений потока. -8. Получится ли в качестве входного потока для pipe использовать только stderr команды, не потеряв при этом отображение stdout на pty? +### Задача 8 + +> Получится ли в качестве входного потока для pipe использовать только stderr команды, не потеряв при этом отображение stdout на pty? Да, такая возможность есть. Сначала необходимо запустить терминал с новым перенаправлением, как в предыдущем вопросе: `bash 5>&1`. Затем уже можно выполнить перенаправление потоков следующим образом: @@ -66,22 +82,30 @@ ls -la /tmp/wrong_dir 2>&1 1>&5 | less Таким образом в команду `less` попадёт следующий текст: `ls: cannot access '/tmp/wrong_dir': No such file or directory`. -9. Что выведет команда `cat /proc/$$/environ`? Как еще можно получить аналогичный по содержанию вывод? +### Задача 9 + +> Что выведет команда `cat /proc/$$/environ`? Как еще можно получить аналогичный по содержанию вывод? Данная команда выведет все переменные окружения, которые инициализированы в текущей сессии терминала. Аналогичный результат может быть достигнут вызовом команд `printenv` или `env`. -10. Используя `man`, опишите что доступно по адресам `/proc//cmdline`, `/proc//exe`. +### Задача 11 + +> Используя `man`, опишите что доступно по адресам `/proc//cmdline`, `/proc//exe`. Файл `/proc//cmdline` - это файл, предназначенный только для чтения, который содержит в себе полную команду процесса, но только если процесс не зомби. Файл `/proc//exe` - это файл-символическая ссылка, содержащая актуальный полный путь до выполняемой команды. -11. Узнайте, какую наиболее старшую версию набора инструкций SSE поддерживает ваш процессор с помощью `/proc/cpuinfo` +### Задача 12 + +> Узнайте, какую наиболее старшую версию набора инструкций SSE поддерживает ваш процессор с помощью `/proc/cpuinfo` Выполним команду `cat /proc/cpuinfo | grep sse`. В выводе можно найти такие версии, как `sse`, `sse2`, `ssse3`, `sse4_1`, `sse4_2`. Таким образом, ответом на вопрос будет `sse4_2`. -12. Почему команда `ssh localhost 'tty'` внутри виртуальной машины выдаёт ошибку `not a tty` +### Задача 13 + +> Почему команда `ssh localhost 'tty'` внутри виртуальной машины выдаёт ошибку `not a tty` Изначально, нужно понять, что происходит при выполнении исходной команды. Судя по мануалу команды `ssh`, `localhost` является пунктом назначения, куда будет произведено подключение, @@ -93,7 +117,9 @@ ls -la /tmp/wrong_dir 2>&1 1>&5 | less Изменить поведение можно принудительно заставив `ssh` создать новую сессию, для этого нужно добавить ключ `-t`, то есть выполнить команду `ssh -t localhost 'tty'`. -13. Необходимо переместить запущенный процесс из одной сессии в другую с использованием утилиты `reptyr` +### Задача 14 + +> Необходимо переместить запущенный процесс из одной сессии в другую с использованием утилиты `reptyr` На виртуальной машине утилита не установлена, поэтому установим её `sudo apt install reptyr`. В качестве примера запустим утилиту `screen`, которая запустит новую сессию внутри себя. @@ -104,7 +130,9 @@ ls -la /tmp/wrong_dir 2>&1 1>&5 | less К сожалению, полностью перенести процесс не получилось, есть какие-то странные ошибки по типу `Operation not permitted` или "зависания" второго терминала, если выполнить команду от администратора. -14. Узнайте что делает команда `tee` и почему в отличие от `sudo echo` команда с `sudo tee` будет работать. +### Задача 15 + +> Узнайте что делает команда `tee` и почему в отличие от `sudo echo` команда с `sudo tee` будет работать. Команда `tee` читает стандартный поток ввода и пишет его в стандартный поток вывода и файлы. В отличие от `echo` перенаправление идёт в рамках одного процесса, именно поэтому `sudo tee` будет работать, diff --git a/src/homework/03-sysadmin/3.3/readme.md b/src/homework/03-sysadmin/3.3/readme.md index 1c5b4dd..7343948 100644 --- a/src/homework/03-sysadmin/3.3/readme.md +++ b/src/homework/03-sysadmin/3.3/readme.md @@ -3,7 +3,9 @@ ## Q/A -1. Какой системный вызов делает команда `cd`? +### Задача 1 + +> Какой системный вызов делает команда `cd`? Для удобства поиска перенаправим вывод команды `strace` в утилиту `less` @@ -14,7 +16,9 @@ strace /bin/bash -c 'cd /tmp' 2>&1 | less Далее, найдём в трейсе упоминание директории `tmp`, указанной в команде. Таким образом, обнаружим, что команда `cd` делает системный вызов `chdir("/tmp")`. -2. Используя `strace` выясните, где находится база данных `file` на основании которой она делает свои догадки. +### Задача 2 + +> Используя `strace` выясните, где находится база данных `file` на основании которой она делает свои догадки. При использовании команды `file` на любом файле, `strace` выведет такую строку: @@ -24,7 +28,9 @@ openat(AT_FDCWD, "/usr/share/misc/magic.mgc", O_RDONLY) = 3 Предположительно, `/usr/share/misc/magic.mgc` - это и есть база данных для команды `file`. -3. Предложите способ обнуления открытого удаленного файла (чтобы освободить место на файловой системе) +### Задача 3 + +> Предложите способ обнуления открытого удаленного файла (чтобы освободить место на файловой системе) Зная PID процесса и то, что каждый процесс пишет свои потоки в файлы в директории `/proc//fd`. Таким образом, можно найти конкретный поток, который пишет в файл, вызвав команду @@ -48,12 +54,16 @@ lr-x------ 1 vagrant vagrant 64 Feb 16 03:25 3 -> /tmp/do_not_delete_me echo "" > /proc/1988/fd/3 ``` -4. Занимают ли зомби-процессы какие-то ресурсы в ОС (CPU, RAM, IO)? +### Задача 4 + +> Занимают ли зомби-процессы какие-то ресурсы в ОС (CPU, RAM, IO)? Нет, zombie-процессы не используют никаких ресурсов операционной системы. Единственное, что они занимают - это идентификатор процесса. -5. На какие файлы вы увидели вызовы группы `open` за первую секунду работы утилиты `opensnoop-bpfcc`? +### Задача 5 + +> На какие файлы вы увидели вызовы группы `open` за первую секунду работы утилиты `opensnoop-bpfcc`? За первую секунду работы утилиты был произведён следующий вывод: @@ -68,8 +78,10 @@ PID COMM FD ERR PATH 619 dbus-daemon 19 0 /var/lib/snapd/dbus-1/system-services/ ``` -6. Какой системный вызов использует `uname -a`? Приведите цитату из man по этому системному вызову, - где описывается альтернативное местоположение в /proc, где можно узнать версию ядра и релиз ОС. +### Задача 5 + +> Какой системный вызов использует `uname -a`? Приведите цитату из man по этому системному вызову, +> где описывается альтернативное местоположение в /proc, где можно узнать версию ядра и релиз ОС. Утилита `uname` использует системный вызов `uname`, мануал к которому можно прочитать командой `man 2 uname`. @@ -79,15 +91,17 @@ PID COMM FD ERR PATH PS. На виртуальной машине не было установленных мануалов для системных вызовов. Чтобы их установить, нужно выполнить команду `sudo apt install manpages-dev`. -7. Чем отличается последовательность команд через `;` и через `&&` в bash? - Есть ли смысл использовать в bash `&&`, если применить `set -e`? +### Задача 7 + +> Чем отличается последовательность команд через `;` и через `&&` в bash? +> Есть ли смысл использовать в bash `&&`, если применить `set -e`? При использовании `&&` будет учитываться код выхода предыдущей выполненой команды. Если он не 0, то выполнение последовательности будет прервано. В случае же `;` последовательность будет выполнена в любом случае. В случае `set -e` параметр имеет следующее определение ->When this option is on, if a simple command fails for any of the reasons listed in Consequences of Shell Errors or returns an exit status value >0, +> When this option is on, if a simple command fails for any of the reasons listed in Consequences of Shell Errors or returns an exit status value >0, > and is not part of the compound list following a while, until, or if keyword, > and is not a part of an AND or OR list, > and is not a pipeline preceded by the ! reserved word, then the shell shall immediately exit. @@ -95,7 +109,9 @@ PS. На виртуальной машине не было установлен То есть, если данная команда будет выполнена в связке с другими командами, то она не сможет прервать выполнение последовательности. Таким образом, для данной команды использование `&&` и `;` будет иметь одинаковое поведение. -8. Из каких опций состоит режим bash `set -euxo pipefail` и почему его хорошо было бы использовать в сценариях? +### Задача 8 + +> Из каких опций состоит режим bash `set -euxo pipefail` и почему его хорошо было бы использовать в сценариях? Параметр `-e` уже был рассмотрен в предыдущем вопросе. @@ -107,7 +123,9 @@ PS. На виртуальной машине не было установлен `-o` - устанавливает настройку работы последовательности команд. В данном случае значение `pipefail` говорит о том, что статус работы всей последовательности будет значение последней команды с ненулевым кодом выхода или 0, если все команды выполнились успешно. -9. Используя `-o stat` для `ps`, определите, какой наиболее часто встречающийся статус у процессов в системе. +### Задача 9 + +> Используя `-o stat` для `ps`, определите, какой наиболее часто встречающийся статус у процессов в системе. Выполним данную команду на виртуальной машине ```shell diff --git a/src/homework/03-sysadmin/3.4/readme.md b/src/homework/03-sysadmin/3.4/readme.md index f108529..0b83951 100644 --- a/src/homework/03-sysadmin/3.4/readme.md +++ b/src/homework/03-sysadmin/3.4/readme.md @@ -3,7 +3,9 @@ ## Q/A -1. Создайте самостоятельно простой unit-файл для [node_exporter](https://github.com/prometheus/node_exporter) +### Задача 1 + +> Создайте самостоятельно простой unit-файл для [node_exporter](https://github.com/prometheus/node_exporter) Для начала необходимо установить `node_exporter` в систему. Для этого воспользуемся [официальным гайдом](https://prometheus.io/docs/guides/node-exporter/#installing-and-running-the-node-exporter), а именно: @@ -119,7 +121,9 @@ sudo systemctl status prometheus_node_exporter <...> ``` -2. Приведите несколько опций, которые вы бы выбрали для базового мониторинга хоста по CPU, памяти, диску и сети. +### Задача 2 + +> Приведите несколько опций, которые вы бы выбрали для базового мониторинга хоста по CPU, памяти, диску и сети. По умолчанию в `node_exporter` включено достаточно много различной информации (~1000 строк). Поэтому, на мой взгляд, для начала стоит включить только следующие флаги: @@ -130,7 +134,9 @@ sudo systemctl status prometheus_node_exporter * `--collector.os` - отображение информации об операционной системе * `--collector.time` - отображение информации о текущем системном времени -3. Ознакомьтесь с метриками, которые по умолчанию собираются `Netdata`, и с комментариями, которые даны к этим метрикам. +### Задача 3 + +> Ознакомьтесь с метриками, которые по умолчанию собираются `Netdata`, и с комментариями, которые даны к этим метрикам. `netdata` отображает следующие метрики: * `cpu` - утилизация CPU по всем ядрам @@ -143,12 +149,16 @@ sudo systemctl status prometheus_node_exporter Доступны так же подробные графики по каждой из категорий. -4. Можно ли по выводу `dmesg` понять, осознает ли ОС, что загружена не на настоящем оборудовании, а на системе виртуализации? +### Задача 4 + +> Можно ли по выводу `dmesg` понять, осознает ли ОС, что загружена не на настоящем оборудовании, а на системе виртуализации? В `dmesg` можно найти следующий вывод `Detected virtualization oracle.` от `systemd`. Таким образом да, можно понять, что система осознаёт, что находится внутри виртуальной машины, а не на физическом оборудовании. -5. Как настроен `sysctl fs.nr_open` на системе по-умолчанию? Какой другой существующий лимит не позволит достичь такого числа? +### Задача 5 + +> Как настроен `sysctl fs.nr_open` на системе по-умолчанию? Какой другой существующий лимит не позволит достичь такого числа? ```shell sysctl fs.nr_open @@ -159,7 +169,9 @@ fs.nr_open = 1048576 Для текущей сессии bash можно посмотреть и изменить ограничение при помощи команды `ulimit -n`. Для конкретных групп и пользователей ограничения можно задать в файле `/etc/security/limits.conf`. -6. Запустите любой долгоживущий процесс в отдельном неймспейсе процессов; покажите, что ваш процесс работает под PID 1 через `nsenter`. +### Задача 6 + +> Запустите любой долгоживущий процесс в отдельном неймспейсе процессов; покажите, что ваш процесс работает под PID 1 через `nsenter`. Запустим процесс `bash` в изолированном пространстве имён: @@ -195,10 +207,12 @@ root 21 0.0 0.3 8960 4000 pts/1 S 03:35 0:00 -bash root 52 0.0 0.3 10616 3252 pts/1 R+ 03:36 0:00 ps aux ``` -7. Найдите информацию о том, что такое `:(){ :|:& };:`. - Запустите эту команду в своей виртуальной машине. Некоторое время все будет "плохо", после чего (минуты) – ОС должна стабилизироваться. - Вызов `dmesg` расскажет, какой механизм помог автоматической стабилизации. - Как настроен этот механизм по-умолчанию, и как изменить число процессов, которое можно создать в сессии? +### Задача 7 + +> Найдите информацию о том, что такое `:(){ :|:& };:`. +> Запустите эту команду в своей виртуальной машине. Некоторое время все будет "плохо", после чего (минуты) – ОС должна стабилизироваться. +> Вызов `dmesg` расскажет, какой механизм помог автоматической стабилизации. +> Как настроен этот механизм по-умолчанию, и как изменить число процессов, которое можно создать в сессии? Команда - это `fork bomb`, которую можно разделить на следующие блоки: diff --git a/src/homework/03-sysadmin/3.5/readme.md b/src/homework/03-sysadmin/3.5/readme.md index 97492de..5e4775a 100644 --- a/src/homework/03-sysadmin/3.5/readme.md +++ b/src/homework/03-sysadmin/3.5/readme.md @@ -3,7 +3,9 @@ ## Q/A -1. Разряженные файлы +### Задача 1 + +> Разряженные файлы Суть таких файлов в том, чтобы разделить реальные данные последовательностью нуль-символов (`\x00`), которые не занимают реального места на физическом носителе. При этом сами данные записываются на разных фрагментах на физическом диске. @@ -12,12 +14,16 @@ Это позволяет сделать запись туда, где доступно 1-2KB (например, после удаления другого файла), но куда оригинальный файл целиком не поместится. -2. Могут ли файлы, являющиеся жесткой ссылкой на один объект, иметь разные права доступа и владельца? Почему? +### Задача 2 + +> Могут ли файлы, являющиеся жесткой ссылкой на один объект, иметь разные права доступа и владельца? Почему? Не могут. Причина в том, что жёсткие ссылки всегда ссылаются на одну `Inode` (идентификатор объекта файла внутри ОС). То есть, все файлы, которые имеют одну `Inode` будут синхронизированы по: содержимому, правам доступа и другим мета-данным. -3. Реконфигурация виртуальной машины +### Задача 3 + +> Реконфигурация виртуальной машины В текущую конфигурацию [`vagrant`](/src/vagrant/Vagrantfile) добавлена конфигурация дисков: @@ -40,7 +46,9 @@ lvm_experiments_disk0.vmdk lvm_experiments_disk1.vmdk ``` -4. Используя `fdisk`, разбейте первый диск на 2 раздела: 2 Гб, оставшееся пространство. +### Задача 4 + +> Используя `fdisk`, разбейте первый диск на 2 раздела: 2 Гб, оставшееся пространство. Найдём диски, которые были подключены на предыдущем шаге @@ -116,7 +124,9 @@ Device Start End Sectors Size Type /dev/sdb2 4196352 5242846 1046495 511M Linux filesystem ``` -5. Используя `sfdisk`, перенесите данную таблицу разделов на второй диск. +### Задача 5 + +> Используя `sfdisk`, перенесите данную таблицу разделов на второй диск. Перенесём таблицу разделов с `/dev/sdb` на `/dev/sdc`. @@ -174,7 +184,9 @@ Device Start End Sectors Size Type /dev/sdc2 4196352 5242846 1046495 511M Linux filesystem ``` -6. Соберите `mdadm` `RAID1` на паре разделов 2 Гб. +### Задача 6 + +> Соберите `mdadm` `RAID1` на паре разделов 2 Гб. Разделы, которые необходимо объединить в `RAID1`: `/dev/sdb1` и `/dev/sdc1`. @@ -184,7 +196,9 @@ mdadm: Defaulting to version 1.2 metadata mdadm: array /dev/md0 started. ``` -7. Соберите `mdadm` `RAID0` на второй паре маленьких разделов +### Задача 7 + +> Соберите `mdadm` `RAID0` на второй паре маленьких разделов Разделы, которые необходимо объединить в `RAID0`: `/dev/sdb2` и `/dev/sdc2`. @@ -194,7 +208,9 @@ mdadm: Defaulting to version 1.2 metadata mdadm: array /dev/md1 started. ``` -8. Создайте 2 независимых PV на получившихся md-устройствах +### Задача 8 + +> Создайте 2 независимых PV на получившихся md-устройствах ```shell sudo pvcreate /dev/md0 @@ -228,7 +244,9 @@ sudo pvdisplay PV UUID PB8hEQ-bZGA-M6Xe-tOQV-1CAb-DRSf-syoUSA ``` -9. Создайте общую volume-group на этих двух PV. +### Задача 9 + +> Создайте общую volume-group на этих двух PV. ```shell sudo vgcreate test_vg /dev/md0 /dev/md1 @@ -257,7 +275,9 @@ sudo vgdisplay VG UUID 7xcN3Z-o9Ca-iXl2-5eao-iA4e-cEVJ-YgSajr ``` -10. Создайте LV размером 100 Мб, указав его расположение на PV с `RAID0`. +### Задача 10 + +> Создайте LV размером 100 Мб, указав его расположение на PV с `RAID0`. ```shell sudo lvcreate --size=100MB test_vg /dev/md1 @@ -282,7 +302,9 @@ sudo lvdisplay Block device 253:1 ``` -11. Создайте `mkfs.ext4` ФС на получившемся `LV` +### Задача 11 + +> Создайте `mkfs.ext4` ФС на получившемся `LV` ```shell sudo mkfs.ext4 /dev/test_vg/lvol0 @@ -295,14 +317,18 @@ Creating journal (1024 blocks): done Writing superblocks and filesystem accounting information: done ``` -12. Смонтируйте этот раздел в любую директорию. +### Задача 12 + +> Смонтируйте этот раздел в любую директорию. ```shell mkdir /tmp/new sudo mount /dev/test_vg/lvol0 /tmp/new ``` -13. Поместите туда тестовый файл. +### Задача 13 + +> Поместите туда тестовый файл. ```shell sudo wget https://mirror.yandex.ru/ubuntu/ls-lR.gz -O /tmp/new/test.gz @@ -317,7 +343,9 @@ Saving to: ‘/tmp/new/test.gz’ 2022-03-02 03:04:09 (9.33 MB/s) - ‘/tmp/new/test.gz’ saved [22388361/22388361] ``` -14. Прикрепите вывод `lsblk`. +### Задача 14 + +> Прикрепите вывод `lsblk`. ```shell sudo lsblk @@ -347,7 +375,9 @@ sdc 8:32 0 2.5G 0 disk └─test_vg-lvol0 253:1 0 100M 0 lvm /tmp/new ``` -15. Протестируйте целостность файла +### Задача 15 + +> Протестируйте целостность файла ```shell sudo gzip -t /tmp/new/test.gz @@ -356,7 +386,9 @@ echo $? 0 ``` -16. Используя `pvmove`, переместите содержимое PV с `RAID0` на `RAID1`. +### Задача 16 + +> Используя `pvmove`, переместите содержимое PV с `RAID0` на `RAID1`. ```shell sudo pvmove /dev/md1 /dev/md0 @@ -364,14 +396,18 @@ sudo pvmove /dev/md1 /dev/md0 /dev/md1: Moved: 100.00% ``` -17. Сделайте `--fail` на устройство в вашем `RAID1` md. +### Задача 17 + +> Сделайте `--fail` на устройство в вашем `RAID1` md. ```shell sudo mdadm --fail /dev/md0 /dev/sdb1 mdadm: set /dev/sdb1 faulty in /dev/md0 ``` -18. Подтвердите выводом `dmesg`, что `RAID1` работает в деградированном состоянии +### Задача 18 + +> Подтвердите выводом `dmesg`, что `RAID1` работает в деградированном состоянии ```shell sudo dmesg | tail -n 5 @@ -382,7 +418,9 @@ sudo dmesg | tail -n 5 md/raid1:md0: Operation continuing on 1 devices. ``` -19. Протестируйте целостность файла, несмотря на "сбойный" диск он должен продолжать быть доступен +### Задача 19 + +> Протестируйте целостность файла, несмотря на "сбойный" диск он должен продолжать быть доступен ```shell sudo gzip -t /tmp/new/test.gz diff --git a/src/homework/03-sysadmin/3.6/readme.md b/src/homework/03-sysadmin/3.6/readme.md index f789e6f..5c404cc 100644 --- a/src/homework/03-sysadmin/3.6/readme.md +++ b/src/homework/03-sysadmin/3.6/readme.md @@ -3,7 +3,9 @@ ## Q/A -1. Работа c HTTP через телнет. +### Задача 1 + +> Работа c HTTP через телнет. ```shell telnet stackoverflow.com 80 @@ -34,7 +36,9 @@ Set-Cookie: prov=a65f8cdf-ae94-33aa-2d32-b4ba53feba61; domain=.stackoverflow.com В ответ пришёл статус код `301`, который означает постоянное перемещение с запрашиваемой страницы. -2. Повторите задание 1 в браузере, используя консоль разработчика F12. +### Задача 2 + +> Повторите задание 1 в браузере, используя консоль разработчика F12. Код ответа при заходе на сайт `http://stackoverflow.com`: `Status Code: 307 Internal Redirect`. Наиболее долгих по загрузке запрос - это запрос на загрузку самой страницы после редиректа (`https://stackoverflow.com/`). @@ -42,7 +46,9 @@ Set-Cookie: prov=a65f8cdf-ae94-33aa-2d32-b4ba53feba61; domain=.stackoverflow.com ![stackoverflow.png](stackoverflow.png) -3. Какой IP адрес у вас в интернете? +### Задача 3 + +> Какой IP адрес у вас в интернете? Чтобы узнать текущий внешний ip-адрес, можно воспользоваться онлайн сервисами, такими как [myip.com](https://www.myip.com/) или [whoer.net](https://whoer.net/). В дополнение к этому, можно использовать только консоль и команду `dig`: @@ -57,7 +63,9 @@ dig TXT +short o-o.myaddr.l.google.com @ns1.google.com Ответ: `46.181.144.146`. -4. Какому провайдеру принадлежит ваш IP адрес? Какой автономной системе AS? +### Задача 4 + +> Какому провайдеру принадлежит ваш IP адрес? Какой автономной системе AS? ```shell whois 46.181.144.146 @@ -77,7 +85,9 @@ source: RIPE Ответ: оператор - `Goodline.info`, AS - `AS39927`. -5. Через какие сети проходит пакет, отправленный с вашего компьютера на адрес 8.8.8.8? Через какие AS? +### Задача 5 + +> Через какие сети проходит пакет, отправленный с вашего компьютера на адрес 8.8.8.8? Через какие AS? По умолчанию утилита `traceroute` не установлена в системе ubuntu. Для её установки достаточно выполнить команду @@ -111,7 +121,9 @@ traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets 19 * dns.google (8.8.8.8) [AS15169] 57.661 ms 56.687 ms ``` -6. Повторите задание 5 в утилите mtr. На каком участке наибольшая задержка - delay? +### Задача 6 + +> Повторите задание 5 в утилите mtr. На каком участке наибольшая задержка - delay? ```shell mtr -w 8.8.8.8 @@ -140,7 +152,9 @@ HOST: host Loss% Snt Last Avg Наибольшая задержка была на 7-ом хопе с худшим показателем в 81ms. -7. Какие DNS сервера отвечают за доменное имя `dns.google`? Какие A записи? +### Задача 7 + +> Какие DNS сервера отвечают за доменное имя `dns.google`? Какие A записи? ```shell dig dns.google @@ -168,7 +182,9 @@ dns.google. 370 IN A 8.8.8.8 Ответ: dns-сервера с ip-адресами `8.8.4.4` и `8.8.8.8`. Оба адреса являются `A`-записями. -9. Проверьте PTR записи для IP адресов из задания 7. Какое доменное имя привязано к IP? +### Задача 9 + +> Проверьте PTR записи для IP адресов из задания 7. Какое доменное имя привязано к IP? ```shell dig -x 8.8.4.4 @@ -212,4 +228,4 @@ dig -x 8.8.8.8 ;; SERVER: 127.0.0.53#53(127.0.0.53) ;; WHEN: Ср мар 09 10:33:34 +07 2022 ;; MSG SIZE rcvd: 73 -``` \ No newline at end of file +``` diff --git a/src/homework/03-sysadmin/3.7/readme.md b/src/homework/03-sysadmin/3.7/readme.md index eeefd0e..324dceb 100644 --- a/src/homework/03-sysadmin/3.7/readme.md +++ b/src/homework/03-sysadmin/3.7/readme.md @@ -3,17 +3,23 @@ ## Q/A -1. Проверьте список доступных сетевых интерфейсов на вашем компьютере. Какие команды есть для этого в Linux и в Windows? +### Задача 1 + +> Проверьте список доступных сетевых интерфейсов на вашем компьютере. Какие команды есть для этого в Linux и в Windows? В Linux можно выполнить команду `ip link`, которая покажет все сетевые интерфейсы, включая виртуальные. Для Windows аналогом данной команды является вызов `ipconfig /all`. -2. Какой протокол используется для распознавания соседа по сетевому интерфейсу? Какой пакет и команды есть в Linux для этого? +### Задача 2 + +> Какой протокол используется для распознавания соседа по сетевому интерфейсу? Какой пакет и команды есть в Linux для этого? Для получения информации о соседнем устройстве используется протокол [LLDP](https://en.wikipedia.org/wiki/Link_Layer_Discovery_Protocol). Данный протокол в ОС Linux реализован в утилите `lldpd`. -3. Какая технология используется для разделения L2 коммутатора на несколько виртуальных сетей? Какой пакет и команды есть в Linux для этого? Приведите пример конфига. +### Задача 3 + +> Какая технология используется для разделения L2 коммутатора на несколько виртуальных сетей? Какой пакет и команды есть в Linux для этого? Приведите пример конфига. Технология имеет название [VLAN](https://en.wikipedia.org/wiki/Virtual_LAN). В Linux для управления виртуальными сетями используется пакет `vlan`, а именно утилита `vconfig` (устарела, рекомендуется использовать утилиту `ip route`). @@ -28,7 +34,9 @@ iface eth0.1400 inet static vlan_raw_device eth0 ``` -4. Какие типы агрегации интерфейсов есть в Linux? Какие опции есть для балансировки нагрузки? Приведите пример конфига. +### Задача 4 + +> Какие типы агрегации интерфейсов есть в Linux? Какие опции есть для балансировки нагрузки? Приведите пример конфига. В конфигурации Linux предусмотрены следующие типы агрегации: * static/manual - ручная статическая настройка @@ -70,7 +78,9 @@ iface bond0 inet dhcp bond-miimon 100 ``` -5. Сколько IP адресов в сети с маской `/29` ? Сколько `/29` подсетей можно получить из сети с маской `/24`. Приведите несколько примеров `/29` подсетей внутри сети `10.10.10.0/24`. +### Задача 5 + +> Сколько IP адресов в сети с маской `/29` ? Сколько `/29` подсетей можно получить из сети с маской `/24`. Приведите несколько примеров `/29` подсетей внутри сети `10.10.10.0/24`. Всего в сети с маской `/29` находятся 8 IP адресов, 2 из которых зарезервированы. @@ -83,13 +93,17 @@ iface bond0 inet dhcp * `10.10.10.9/29` * `10.10.10.19/29` -6. Задача: вас попросили организовать стык между 2-мя организациями. Диапазоны `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16` уже заняты. Из какой подсети допустимо взять частные IP адреса? Маску выберите из расчета максимум 40-50 хостов внутри подсети. +### Задача 6 + +> Задача: вас попросили организовать стык между 2-мя организациями. Диапазоны `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16` уже заняты. Из какой подсети допустимо взять частные IP адреса? Маску выберите из расчета максимум 40-50 хостов внутри подсети. Так как самые ходовые сети, используемые для внутренних сетей, уже заняты, то остаётся только вариант с сетью `100.64.0.0/10`. Если рассчитывать на 40-50 хостов в рамках данной сети, то можно взять подсеть `100.64.0.0/26`, у которой будет диапазон доступных адресов `100.64.0.1 - 100.64.0.62`. -7. Как проверить ARP таблицу в Linux, Windows? Как очистить ARP кеш полностью? Как из ARP таблицы удалить только один нужный IP? +### Задача 7 + +> Как проверить ARP таблицу в Linux, Windows? Как очистить ARP кеш полностью? Как из ARP таблицы удалить только один нужный IP? Работа с ARP-таблицами: * linux diff --git a/src/homework/03-sysadmin/3.8/readme.md b/src/homework/03-sysadmin/3.8/readme.md index e38552d..0dbbe2f 100644 --- a/src/homework/03-sysadmin/3.8/readme.md +++ b/src/homework/03-sysadmin/3.8/readme.md @@ -3,7 +3,9 @@ ## Q/A -1. Подключитесь к публичному маршрутизатору в интернет. Найдите маршрут к вашему публичному IP +### Задача 1 + +> Подключитесь к публичному маршрутизатору в интернет. Найдите маршрут к вашему публичному IP ```shell telnet route-views.routeviews.org @@ -58,7 +60,9 @@ Paths: (23 available, best #22, table default) <...> ``` -2. Создайте dummy0 интерфейс в Ubuntu. Добавьте несколько статических маршрутов. Проверьте таблицу маршрутизации. +### Задача 2 + +> Создайте dummy0 интерфейс в Ubuntu. Добавьте несколько статических маршрутов. Проверьте таблицу маршрутизации. Создание dummy-интерфейса: @@ -82,7 +86,9 @@ default via 10.0.2.2 dev eth0 proto dhcp src 10.0.2.15 metric 100 10.2.2.3 via 10.0.2.16 dev eth0 ``` -3. Проверьте открытые TCP порты в Ubuntu, какие протоколы и приложения используют эти порты? Приведите несколько примеров. +### Задача 3 + +> Проверьте открытые TCP порты в Ubuntu, какие протоколы и приложения используют эти порты? Приведите несколько примеров. Для вывода открытых TCP-портов используем утилиту `ss` со следующими флагами: * `-t` вывод только TCP-портов @@ -100,7 +106,9 @@ LISTEN 0 128 В данном случае открыты только порты для соединения по `ssh` (порты `:22`) и для [`systemd-resolved`](https://www.freedesktop.org/software/systemd/man/systemd-resolved.service.html) (порт `:53`). -4. Проверьте используемые UDP сокеты в Ubuntu, какие протоколы и приложения используют эти порты? +### Задача 4 + +> Проверьте используемые UDP сокеты в Ubuntu, какие протоколы и приложения используют эти порты? По аналогии с предыдущим заданием используем утилиту `ss`, заменив флаг `-t` на `-u` @@ -114,7 +122,9 @@ UNCONN 0 0 Порт `:53` предназначается для использования [`systemd-resolved`](https://www.freedesktop.org/software/systemd/man/systemd-resolved.service.html), а порт `68` используется для получения информации о динамической IP-адресации от DHCP-сервера. -5. Используя diagrams.net, создайте L3 диаграмму вашей домашней сети или любой другой сети, с которой вы работали. +### Задача 5 + +> Используя diagrams.net, создайте L3 диаграмму вашей домашней сети или любой другой сети, с которой вы работали. В качестве сети взята стандартная домашняя сеть с wi-fi-роутером. @@ -122,7 +132,9 @@ UNCONN 0 0 ![network.png](network.png) -6. Установите Nginx, настройте в режиме балансировщика TCP или UDP. +### Задача 6 + +> Установите Nginx, настройте в режиме балансировщика TCP или UDP. Установка nginx: diff --git a/src/homework/03-sysadmin/3.9/readme.md b/src/homework/03-sysadmin/3.9/readme.md index d74cb18..d30099f 100644 --- a/src/homework/03-sysadmin/3.9/readme.md +++ b/src/homework/03-sysadmin/3.9/readme.md @@ -3,19 +3,25 @@ ## Q/A -1. Установите Bitwarden плагин для браузера. Зарегестрируйтесь и сохраните несколько паролей. +### Задача 1 + +> Установите Bitwarden плагин для браузера. Зарегестрируйтесь и сохраните несколько паролей. ![bitwarden](bitwarden.png) -2. Установите Google authenticator на мобильный телефон. Настройте вход в Bitwarden акаунт через Google authenticator OTP. +### Задача 2 + +> Установите Google authenticator на мобильный телефон. Настройте вход в Bitwarden акаунт через Google authenticator OTP. Заместо `Google Authenticator` использовал приложение `Microsoft Authenticator`. ![birtwarden](bitwarden-2fa.png) -3. Установите apache2, сгенерируйте самоподписанный сертификат, настройте тестовый сайт для работы по HTTPS. +### Задача 3 -Вместо `apache2` будем производить настройку уже установленного в виртуальную машину `nginx` (установка производилась в [дз 3.8:6](/src/homework/03-sysadmin/3.8sysadmin/3.8/readme.md#Q/A)). +> Установите apache2, сгенерируйте самоподписанный сертификат, настройте тестовый сайт для работы по HTTPS. + +Вместо `apache2` будем производить настройку уже установленного в виртуальную машину `nginx` (установка производилась в [дз 3.8](/src/homework/03-sysadmin/3.8/readme.md#Задача 6)). Первым шагом необходимо сгенерировать сертификат: @@ -131,7 +137,9 @@ Commercial support is available at ``` -4. Проверьте на TLS уязвимости произвольный сайт в интернете +### Задача 4 + +> Проверьте на TLS уязвимости произвольный сайт в интернете ```shell git clone --depth 1 https://github.com/drwetter/testssl.sh.git @@ -172,7 +180,9 @@ cd testssl Done 2022-03-28 10:31:34 [ 27s] -->> 217.61.246.126:443 (metagamerscore.com) <<-- ``` -5. Установите на Ubuntu ssh сервер, сгенерируйте новый приватный ключ. Скопируйте свой публичный ключ на другой сервер. Подключитесь к серверу по SSH-ключу. +### Задача 5 + +> Установите на Ubuntu ssh сервер, сгенерируйте новый приватный ключ. Скопируйте свой публичный ключ на другой сервер. Подключитесь к серверу по SSH-ключу. На виртуальной машине уже установлен ssh-сервер и настроен один ssh-ключ для подключения к машине с хоста. Таким образом сгенерируем новый ssh-ключ для пользователя `vagrant` и попробуем подключиться как пользователь `root` через ssh-сервер. @@ -217,7 +227,9 @@ Welcome to Ubuntu 20.04.4 LTS (GNU/Linux 5.4.0-104-generic x86_64) root@vagrant:~# ``` -6. Переименуйте файлы ключей из задания 5. Настройте файл конфигурации SSH клиента, так чтобы вход на удаленный сервер осуществлялся по имени сервера. +### Задача 6 + +> Переименуйте файлы ключей из задания 5. Настройте файл конфигурации SSH клиента, так чтобы вход на удаленный сервер осуществлялся по имени сервера. ```shell mv ~/.ssh/id_rsa ~/.ssh/localhost_key @@ -241,7 +253,9 @@ Welcome to Ubuntu 20.04.4 LTS (GNU/Linux 5.4.0-104-generic x86_64) root@vagrant:~# ``` -7. Соберите дамп трафика утилитой tcpdump в формате pcap, 100 пакетов. Откройте файл pcap в Wireshark. +### Задача 7 + +> Соберите дамп трафика утилитой tcpdump в формате pcap, 100 пакетов. Откройте файл pcap в Wireshark. ```shell sudo tcpdump -c 100 -w dump.pcap