mirror of
https://github.com/Dannecron/netology-devops.git
synced 2025-12-25 23:32:37 +03:00
fix all homeworks in 03-sysadmin
This commit is contained in:
@@ -3,21 +3,29 @@
|
||||
|
||||
## Q/A
|
||||
|
||||
1. Какого типа команда `cd`?
|
||||
### Задача 1
|
||||
|
||||
> Какого типа команда `cd`?
|
||||
|
||||
При вызове `type cd` будет выведено, что `cd is a shell builtin`, то есть команда встроенная в оболочку.
|
||||
Данная команда необходима для работы пользователя с терминалом и для работы других команд, именно поэтому она встроена в ядро операционной системы.
|
||||
|
||||
2. Какая альтернатива без pipe команде `grep <some_string> <some_file> | wc -l`?
|
||||
### Задача 2
|
||||
|
||||
> Какая альтернатива без pipe команде `grep <some_string> <some_file> | wc -l`?
|
||||
|
||||
Альтернативой является команда `grep -c <some_string> <some_file>`.
|
||||
|
||||
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/<n>
|
||||
```
|
||||
|
||||
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/<n>`.
|
||||
Так же любая программа с графическим интерфейсом может выполнить данное действие. Наблюдать данные возможно,
|
||||
если открыт терминал, подключённый к конкретной сессии.
|
||||
|
||||
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/<PID>/cmdline`, `/proc/<PID>/exe`.
|
||||
### Задача 11
|
||||
|
||||
> Используя `man`, опишите что доступно по адресам `/proc/<PID>/cmdline`, `/proc/<PID>/exe`.
|
||||
|
||||
Файл `/proc/<PID>/cmdline` - это файл, предназначенный только для чтения, который содержит в себе полную команду процесса, но только если процесс не зомби.
|
||||
Файл `/proc/<PID>/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` будет работать,
|
||||
|
||||
@@ -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/<PID>/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,8 +91,10 @@ PID COMM FD ERR PATH
|
||||
PS. На виртуальной машине не было установленных мануалов для системных вызовов. Чтобы их установить,
|
||||
нужно выполнить команду `sudo apt install manpages-dev`.
|
||||
|
||||
7. Чем отличается последовательность команд через `;` и через `&&` в bash?
|
||||
Есть ли смысл использовать в bash `&&`, если применить `set -e`?
|
||||
### Задача 7
|
||||
|
||||
> Чем отличается последовательность команд через `;` и через `&&` в bash?
|
||||
> Есть ли смысл использовать в bash `&&`, если применить `set -e`?
|
||||
|
||||
При использовании `&&` будет учитываться код выхода предыдущей выполненой команды. Если он не 0, то выполнение последовательности будет прервано.
|
||||
В случае же `;` последовательность будет выполнена в любом случае.
|
||||
@@ -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
|
||||
|
||||
@@ -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`, которую можно разделить на следующие блоки:
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||

|
||||
|
||||
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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||

|
||||
|
||||
6. Установите Nginx, настройте в режиме балансировщика TCP или UDP.
|
||||
### Задача 6
|
||||
|
||||
> Установите Nginx, настройте в режиме балансировщика TCP или UDP.
|
||||
|
||||
Установка nginx:
|
||||
|
||||
|
||||
@@ -3,19 +3,25 @@
|
||||
|
||||
## Q/A
|
||||
|
||||
1. Установите Bitwarden плагин для браузера. Зарегестрируйтесь и сохраните несколько паролей.
|
||||
### Задача 1
|
||||
|
||||
> Установите Bitwarden плагин для браузера. Зарегестрируйтесь и сохраните несколько паролей.
|
||||
|
||||

|
||||
|
||||
2. Установите Google authenticator на мобильный телефон. Настройте вход в Bitwarden акаунт через Google authenticator OTP.
|
||||
### Задача 2
|
||||
|
||||
> Установите Google authenticator на мобильный телефон. Настройте вход в Bitwarden акаунт через Google authenticator OTP.
|
||||
|
||||
Заместо `Google Authenticator` использовал приложение `Microsoft Authenticator`.
|
||||
|
||||

|
||||
|
||||
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
|
||||
</html>
|
||||
```
|
||||
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user