mirror of
https://github.com/Dannecron/netology-devops.git
synced 2025-12-25 23:32:37 +03:00
reorganize homeworks structure for parts 1-3
This commit is contained in:
7
src/homework/03-sysadmin/3.1/double_square_braket.sh
Executable file
7
src/homework/03-sysadmin/3.1/double_square_braket.sh
Executable file
@@ -0,0 +1,7 @@
|
||||
#!/bin/bash
|
||||
|
||||
[[ -d /tmp ]]
|
||||
echo $?
|
||||
|
||||
[[ -d /tmp/some-dir ]]
|
||||
echo $?
|
||||
70
src/homework/03-sysadmin/3.1/readme.md
Normal file
70
src/homework/03-sysadmin/3.1/readme.md
Normal file
@@ -0,0 +1,70 @@
|
||||
Выполнение [домашнего задания](https://github.com/netology-code/sysadm-homeworks/blob/devsys10/03-sysadmin-01-terminal/README.md)
|
||||
по теме "Работа в терминале, лекция 1".
|
||||
|
||||
## Q/A
|
||||
|
||||
1. Какие ресурсы выделены для виртуальной машины по умолчанию?
|
||||
|
||||
```
|
||||
RAM: 1024 MB
|
||||
CPU: 2
|
||||
VRAM: 4 MB
|
||||
HDD: 64GB
|
||||
```
|
||||
|
||||
2. Как добавить оперативной памяти или ресурсов процессора виртуальной машине?
|
||||
|
||||
В конфигурацию `Vargrantfile` необходимо добавить следующие строки:
|
||||
```
|
||||
config.vm.provider "virtualbox" do |v|
|
||||
v.memory = 2048
|
||||
v.cpus = 4
|
||||
end
|
||||
```
|
||||
|
||||
3. `man bash`
|
||||
1. какой переменной можно задать длину журнала history, и на какой строчке manual это описывается?
|
||||
|
||||
При помощи проставления переменной `HISTSIZE`. Описание находится на 591 строке мануала.
|
||||
Показать строки возможно при помощи указания кастомного пейджера для команды `man`:
|
||||
```shell
|
||||
man --pager="less -N" bash
|
||||
```
|
||||
|
||||
2. что делает директива `ignoreboth` в bash?
|
||||
|
||||
Значение `ignoreboth` проставляется для переменной `HISTCONTROL` и является сокращением для значений `ignorespace` и `ignoredups`.
|
||||
Конкретно это означает, что команды, которые начинаются с пробела или совпадают с предыдущей записью в истории, не попадут в файл истории `bash`.
|
||||
|
||||
3. В каких сценариях использования применимы скобки `{}` и на какой строчке man bash это описано?
|
||||
|
||||
Фигурные скобки используются при написании сложных команд (`Compound Commands`). Про это написано на 196 строке мануала.
|
||||
|
||||
4. Как создать однократным вызовом touch 100000 файлов? Получится ли аналогичным образом создать 300000? Если нет, то почему?
|
||||
|
||||
Создать множество файлов можно написанием сложной команды `touch {1..100000}`. Создать более `ARG_MAX` файлов в рамках одного запуска не получится.
|
||||
На текущей версии linux данная переменная равна 2097152.
|
||||
|
||||
5. Что делает конструкция `[[ -d /tmp ]]`
|
||||
|
||||
Возвращает 0, если `/tmp` существует и это директория, или 1, в ином случае.
|
||||
Скрипт, проверяющий данный ответ находится в файле [double_square_braket.sh](double_square_braket.sh).
|
||||
|
||||
4. Добейтесь в выводе type -a bash в виртуальной машине наличия первым пунктом в списке.
|
||||
|
||||
Подобного можно добиться, сделав три шага:
|
||||
* Создать новую директорию `mkdir /tmp/new_path_directory`
|
||||
* Сделать символическую ссылку для баша `ln -s /usr/bin/bash /tmp/new_path_directory/bash`
|
||||
* Изменив переменную окружения `PATH` с помощью `export PATH=/tmp/new_path_directory:${PATH}`
|
||||
|
||||
Таким образом вывод команды будет таким, как в задаче:
|
||||
```shell
|
||||
type -a bash
|
||||
bash is /tmp/new_path_directory/bash
|
||||
bash is /usr/bin/bash
|
||||
bash is /bin/bash
|
||||
```
|
||||
5. Чем отличается планирование команд с помощью `batch` и `at`?
|
||||
|
||||
Ничем, это одна и та же команда.
|
||||
|
||||
111
src/homework/03-sysadmin/3.2/readme.md
Normal file
111
src/homework/03-sysadmin/3.2/readme.md
Normal file
@@ -0,0 +1,111 @@
|
||||
Выполнение [домашнего задания](https://github.com/netology-code/sysadm-homeworks/blob/devsys10/03-sysadmin-02-terminal/README.md)
|
||||
по теме "Работа в терминале, лекция 2".
|
||||
|
||||
## Q/A
|
||||
|
||||
1. Какого типа команда `cd`?
|
||||
|
||||
При вызове `type cd` будет выведено, что `cd is a shell builtin`, то есть команда встроенная в оболочку.
|
||||
Данная команда необходима для работы пользователя с терминалом и для работы других команд, именно поэтому она встроена в ядро операционной системы.
|
||||
|
||||
2. Какая альтернатива без pipe команде `grep <some_string> <some_file> | wc -l`?
|
||||
|
||||
Альтернативой является команда `grep -c <some_string> <some_file>`.
|
||||
|
||||
3. Какой процесс с PID 1 является родителем для всех процессов в вашей виртуальной машине Ubuntu 20.04?
|
||||
|
||||
Найти родителя всех процессов можно вызвав команду `pstree -p | grep \(1\)`.
|
||||
Ответ: процесс с PID 1 - `systemd`.
|
||||
|
||||
4. Как будет выглядеть команда, которая перенаправит вывод stderr `ls` на другую сессию терминала?
|
||||
|
||||
Откроем два терминала на виртуальной машине. Для каждого из них будет создан новый файл в директории `/dev/pts/`.
|
||||
Таким образом, если мы хотим перенаправить stderr команды, то нужно выполнить следующие действия:
|
||||
перенаправить вывод stderr в stdout, затем перенаправить stdout в `/dev/pts/<n>`, где <n> - целое число, идентификатор сессии терминала.
|
||||
Полный пример команды:
|
||||
|
||||
```shell
|
||||
ls /some/invalid/dir 2>&1 1>&/dev/pts/<n>
|
||||
```
|
||||
|
||||
5. Получится ли одновременно передать команде файл на stdin и вывести ее stdout в другой файл?
|
||||
|
||||
Да, подобное можно реализовать следующим способом.
|
||||
|
||||
```shell
|
||||
touch in_file
|
||||
echo "abc" > in_file
|
||||
echo "bcd" >> in_file
|
||||
grep abc < in_file 1>&out_file
|
||||
cat out_file
|
||||
```
|
||||
|
||||
Содержимое out_file является выводом команды grep, а именно одна строка `abc`.
|
||||
|
||||
6. Получится ли находясь в графическом режиме, вывести данные из PTY в какой-либо из эмуляторов TTY? Сможете ли вы наблюдать выводимые данные?
|
||||
|
||||
Да, подобное возможно. Достаточно, например, открыть новую сессию терминала в графической оболочке и выполнить перенаправление потока в `/dev/pts/<n>`.
|
||||
Так же любая программа с графическим интерфейсом может выполнить данное действие. Наблюдать данные возможно,
|
||||
если открыт терминал, подключённый к конкретной сессии.
|
||||
|
||||
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?
|
||||
|
||||
Да, такая возможность есть. Сначала необходимо запустить терминал с новым перенаправлением, как в предыдущем вопросе: `bash 5>&1`.
|
||||
Затем уже можно выполнить перенаправление потоков следующим образом:
|
||||
|
||||
```shell
|
||||
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`? Как еще можно получить аналогичный по содержанию вывод?
|
||||
|
||||
Данная команда выведет все переменные окружения, которые инициализированы в текущей сессии терминала.
|
||||
Аналогичный результат может быть достигнут вызовом команд `printenv` или `env`.
|
||||
|
||||
10. Используя `man`, опишите что доступно по адресам `/proc/<PID>/cmdline`, `/proc/<PID>/exe`.
|
||||
|
||||
Файл `/proc/<PID>/cmdline` - это файл, предназначенный только для чтения, который содержит в себе полную команду процесса, но только если процесс не зомби.
|
||||
Файл `/proc/<PID>/exe` - это файл-символическая ссылка, содержащая актуальный полный путь до выполняемой команды.
|
||||
|
||||
11. Узнайте, какую наиболее старшую версию набора инструкций SSE поддерживает ваш процессор с помощью `/proc/cpuinfo`
|
||||
|
||||
Выполним команду `cat /proc/cpuinfo | grep sse`. В выводе можно найти такие версии, как `sse`, `sse2`, `ssse3`, `sse4_1`, `sse4_2`.
|
||||
Таким образом, ответом на вопрос будет `sse4_2`.
|
||||
|
||||
12. Почему команда `ssh localhost 'tty'` внутри виртуальной машины выдаёт ошибку `not a tty`
|
||||
|
||||
Изначально, нужно понять, что происходит при выполнении исходной команды. Судя по мануалу команды `ssh`,
|
||||
`localhost` является пунктом назначения, куда будет произведено подключение,
|
||||
а `tty` - это команда, которая будет выполнена на удалённом сервере. Из того же мануала следует,
|
||||
что при указании команды будет произведено выполнение команды, а не логин пользователя. То есть,
|
||||
команда будет выполнена без выделения отдельной сессии для пользователя,
|
||||
а значит команда `tty` в данном случае действительно не сможет найти запущенный экземпляр терминала.
|
||||
|
||||
Изменить поведение можно принудительно заставив `ssh` создать новую сессию, для этого нужно добавить ключ `-t`,
|
||||
то есть выполнить команду `ssh -t localhost 'tty'`.
|
||||
|
||||
13. Необходимо переместить запущенный процесс из одной сессии в другую с использованием утилиты `reptyr`
|
||||
|
||||
На виртуальной машине утилита не установлена, поэтому установим её `sudo apt install reptyr`.
|
||||
В качестве примера запустим утилиту `screen`, которая запустит новую сессию внутри себя.
|
||||
В другом подключении через ssh к виртуальной машине запустим "долгий" процесс, например, `less .bash_history`.
|
||||
Внутри сессии `screen` найдём PID процесса `less`, для этого выполним команду `lsof | grep less`.
|
||||
Затем выполним команду `reptyr <PID>`.
|
||||
|
||||
К сожалению, полностью перенести процесс не получилось, есть какие-то странные ошибки по типу `Operation not permitted`
|
||||
или "зависания" второго терминала, если выполнить команду от администратора.
|
||||
|
||||
14. Узнайте что делает команда `tee` и почему в отличие от `sudo echo` команда с `sudo tee` будет работать.
|
||||
|
||||
Команда `tee` читает стандартный поток ввода и пишет его в стандартный поток вывода и файлы.
|
||||
В отличие от `echo` перенаправление идёт в рамках одного процесса, именно поэтому `sudo tee` будет работать,
|
||||
так как процесс берёт стандартный поток ввода от текущего пользователя, затем начинает запись с повышенными привилегиями.
|
||||
122
src/homework/03-sysadmin/3.3/readme.md
Normal file
122
src/homework/03-sysadmin/3.3/readme.md
Normal file
@@ -0,0 +1,122 @@
|
||||
Выполнение [домашнего задания](https://github.com/netology-code/sysadm-homeworks/blob/devsys10/03-sysadmin-03-os/README.md)
|
||||
по теме "3.3. Операционные системы, лекция 1".
|
||||
|
||||
## Q/A
|
||||
|
||||
1. Какой системный вызов делает команда `cd`?
|
||||
|
||||
Для удобства поиска перенаправим вывод команды `strace` в утилиту `less`
|
||||
|
||||
```shell
|
||||
strace /bin/bash -c 'cd /tmp' 2>&1 | less
|
||||
```
|
||||
|
||||
Далее, найдём в трейсе упоминание директории `tmp`, указанной в команде. Таким образом, обнаружим, что команда `cd`
|
||||
делает системный вызов `chdir("/tmp")`.
|
||||
|
||||
2. Используя `strace` выясните, где находится база данных `file` на основании которой она делает свои догадки.
|
||||
|
||||
При использовании команды `file` на любом файле, `strace` выведет такую строку:
|
||||
|
||||
```
|
||||
openat(AT_FDCWD, "/usr/share/misc/magic.mgc", O_RDONLY) = 3
|
||||
```
|
||||
|
||||
Предположительно, `/usr/share/misc/magic.mgc` - это и есть база данных для команды `file`.
|
||||
|
||||
3. Предложите способ обнуления открытого удаленного файла (чтобы освободить место на файловой системе)
|
||||
|
||||
Зная PID процесса и то, что каждый процесс пишет свои потоки в файлы в директории `/proc/<PID>/fd`.
|
||||
Таким образом, можно найти конкретный поток, который пишет в файл, вызвав команду
|
||||
|
||||
```shell
|
||||
ls -la /proc/1988/fd/
|
||||
|
||||
total 0
|
||||
dr-x------ 2 vagrant vagrant 0 Feb 16 03:25 .
|
||||
dr-xr-xr-x 9 vagrant vagrant 0 Feb 16 03:25 ..
|
||||
lrwx------ 1 vagrant vagrant 64 Feb 16 03:25 0 -> /dev/pts/0
|
||||
lrwx------ 1 vagrant vagrant 64 Feb 16 03:25 1 -> /dev/pts/0
|
||||
lrwx------ 1 vagrant vagrant 64 Feb 16 03:25 2 -> /dev/pts/0
|
||||
lr-x------ 1 vagrant vagrant 64 Feb 16 03:25 3 -> /tmp/do_not_delete_me
|
||||
```
|
||||
|
||||
В данном случае, поток под номером 3 держит соединение с искомым файлом. Таким образом, чтобы обнулить данный файл,
|
||||
достаточно направить пустую строку в данный поток:
|
||||
|
||||
```shell
|
||||
echo "" > /proc/1988/fd/3
|
||||
```
|
||||
|
||||
4. Занимают ли зомби-процессы какие-то ресурсы в ОС (CPU, RAM, IO)?
|
||||
|
||||
Нет, zombie-процессы не используют никаких ресурсов операционной системы.
|
||||
Единственное, что они занимают - это идентификатор процесса.
|
||||
|
||||
5. На какие файлы вы увидели вызовы группы `open` за первую секунду работы утилиты `opensnoop-bpfcc`?
|
||||
|
||||
За первую секунду работы утилиты был произведён следующий вывод:
|
||||
|
||||
```shell
|
||||
sudo opensnoop-bpfcc
|
||||
|
||||
PID COMM FD ERR PATH
|
||||
833 vminfo 5 0 /var/run/utmp
|
||||
619 dbus-daemon -1 2 /usr/local/share/dbus-1/system-services
|
||||
619 dbus-daemon 19 0 /usr/share/dbus-1/system-services
|
||||
619 dbus-daemon -1 2 /lib/dbus-1/system-services
|
||||
619 dbus-daemon 19 0 /var/lib/snapd/dbus-1/system-services/
|
||||
```
|
||||
|
||||
6. Какой системный вызов использует `uname -a`? Приведите цитату из man по этому системному вызову,
|
||||
где описывается альтернативное местоположение в /proc, где можно узнать версию ядра и релиз ОС.
|
||||
|
||||
Утилита `uname` использует системный вызов `uname`, мануал к которому можно прочитать командой `man 2 uname`.
|
||||
|
||||
Цитата из мануала
|
||||
> Part of the utsname information is also accessible via /proc/sys/ker‐nel/{ostype, hostname, osrelease, version, domainname}.
|
||||
|
||||
PS. На виртуальной машине не было установленных мануалов для системных вызовов. Чтобы их установить,
|
||||
нужно выполнить команду `sudo apt install manpages-dev`.
|
||||
|
||||
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,
|
||||
> 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.
|
||||
|
||||
То есть, если данная команда будет выполнена в связке с другими командами, то она не сможет прервать выполнение последовательности.
|
||||
Таким образом, для данной команды использование `&&` и `;` будет иметь одинаковое поведение.
|
||||
|
||||
8. Из каких опций состоит режим bash `set -euxo pipefail` и почему его хорошо было бы использовать в сценариях?
|
||||
|
||||
Параметр `-e` уже был рассмотрен в предыдущем вопросе.
|
||||
|
||||
`-u` - пишет ошибку в stderr, когда скрипт пытается обратиться к несуществующей переменной, но при этом не останавливает его работу.
|
||||
Если запущен интерактивный режим, то его работа никогда не прерывается.
|
||||
|
||||
`-x` - пишет в stderr трейс (последовательность выполнения системных вызовов) для каждой команды перед её выполнением.
|
||||
|
||||
`-o` - устанавливает настройку работы последовательности команд. В данном случае значение `pipefail` говорит о том,
|
||||
что статус работы всей последовательности будет значение последней команды с ненулевым кодом выхода или 0, если все команды выполнились успешно.
|
||||
|
||||
9. Используя `-o stat` для `ps`, определите, какой наиболее часто встречающийся статус у процессов в системе.
|
||||
|
||||
Выполним данную команду на виртуальной машине
|
||||
```shell
|
||||
ps -o stat
|
||||
|
||||
STAT
|
||||
Ss
|
||||
R+
|
||||
```
|
||||
|
||||
Таким образом, самым встречающимся статусом является `Ss`. Первая буква - это непосредственно статус (`S - interruptible sleep (waiting for an event to complete)`),
|
||||
вторая - дополнительная информация (`s - is a session leader`).
|
||||
220
src/homework/03-sysadmin/3.4/readme.md
Normal file
220
src/homework/03-sysadmin/3.4/readme.md
Normal file
@@ -0,0 +1,220 @@
|
||||
Выполнение [домашнего задания](https://github.com/netology-code/sysadm-homeworks/blob/devsys10/03-sysadmin-04-os/README.md)
|
||||
по теме "3.4. Операционные системы, лекция 2".
|
||||
|
||||
## Q/A
|
||||
|
||||
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),
|
||||
а именно:
|
||||
|
||||
```shell
|
||||
wget https://github.com/prometheus/node_exporter/releases/download/v1.3.1/node_exporter-1.3.1.linux-amd64.tar.gz
|
||||
tar xvfz node_exporter-1.3.1.linux-amd64.tar.gz
|
||||
cd node_exporter-1.3.1.linux-amd64
|
||||
sudo mv node_exporter /usr/local/bin/
|
||||
```
|
||||
|
||||
Проверим, что всё работает, выполнив команду
|
||||
|
||||
```shell
|
||||
node_exporter --help
|
||||
|
||||
usage: node_exporter [<flags>]
|
||||
|
||||
Flags:
|
||||
-h, --help Show context-sensitive help (also try --help-long and --help-man).
|
||||
<...>
|
||||
```
|
||||
|
||||
Затем, создадим простой unit-файл по пути `/etc/systemd/system`:
|
||||
|
||||
```shell
|
||||
sudo touch /etc/systemd/system/prometheus_node_exporter.service
|
||||
```
|
||||
|
||||
И добавим в него следующее содержимое:
|
||||
|
||||
```unit file (systemd)
|
||||
[Unit]
|
||||
Description=Prometheuth node exporter service
|
||||
StartLimitIntervalSec=0
|
||||
[Service]
|
||||
Type=simple
|
||||
Restart=always
|
||||
RestartSec=1
|
||||
User=vagrant
|
||||
ExecStart=/usr/local/bin/node_exporter
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
|
||||
Затем запустим сервис, проверим, что он имеет статус "запущен", проверим работоспособность самого приложения и остановим выполнение:
|
||||
|
||||
```shell
|
||||
sudo systemctl start prometheus_node_exporter
|
||||
sudo systemctl status prometheus_node_exporter
|
||||
|
||||
● prometheus_node_exporter.service - Prometheuth node exporter service
|
||||
Loaded: loaded (/etc/systemd/system/prometheus_node_exporter.service; disabled; vendor preset: enabled)
|
||||
Active: active (running) since Wed 2022-02-23 03:52:14 UTC; 2s ago
|
||||
Main PID: 1520 (node_exporter)
|
||||
Tasks: 4 (limit: 1112)
|
||||
Memory: 2.2M
|
||||
CGroup: /system.slice/prometheus_node_exporter.service
|
||||
└─1520 /usr/local/bin/node_exporter
|
||||
|
||||
Feb 23 03:52:14 vagrant node_exporter[1520]: ts=2022-02-23T03:52:14.087Z caller=node_exporter.go:115 level=info collector=thermal_zone
|
||||
Feb 23 03:52:14 vagrant node_exporter[1520]: ts=2022-02-23T03:52:14.087Z caller=node_exporter.go:115 level=info collector=time
|
||||
<...>
|
||||
|
||||
curl -I http://localhost:9100/metrics
|
||||
|
||||
HTTP/1.1 200 OK
|
||||
Content-Type: text/plain; version=0.0.4; charset=utf-8
|
||||
Date: Wed, 23 Feb 2022 04:01:31 GMT
|
||||
|
||||
sudo systemctl stop prometheus_node_exporter
|
||||
sudo systemctl status prometheus_node_exporter
|
||||
|
||||
sudo systemctl status prometheus_node_exporter
|
||||
● prometheus_node_exporter.service - Prometheuth node exporter service
|
||||
Loaded: loaded (/etc/systemd/system/prometheus_node_exporter.service; disabled; vendor preset: enabled)
|
||||
Active: inactive (dead)
|
||||
|
||||
<...>
|
||||
Feb 23 04:02:22 vagrant systemd[1]: Stopping Prometheuth node exporter service...
|
||||
Feb 23 04:02:22 vagrant systemd[1]: prometheus_node_exporter.service: Succeeded.
|
||||
Feb 23 04:02:22 vagrant systemd[1]: Stopped Prometheuth node exporter service.
|
||||
```
|
||||
|
||||
Для добавления конфигурации через файл, необходимо создать файл с переменной окружения `EXTRA_OPTS`:
|
||||
|
||||
```shell
|
||||
sudo mkdir -p /usr/local/lib/node_exporter
|
||||
sudo touch /usr/local/lib/node_exporter/conf.env
|
||||
sudo chmod +r /usr/local/lib/node_exporter/conf.env
|
||||
echo "EXTRA_OPTS=--collector.cpu.info" | sudo tee /usr/local/lib/node_exporter/conf.env
|
||||
```
|
||||
|
||||
Затем сделать изменения в unit-файле:
|
||||
* В блок `[Service]` добавить новую строку `EnvironmentFile=-/usr/local/lib/node_exporter/conf.env`
|
||||
* В ключ `ExecStart` после полного пути до приложения добавить вывод переменной окружения `$EXTRA_OPTS`
|
||||
|
||||
Далее проверить, что приложение запускается с дополнительным флагом:
|
||||
|
||||
```shell
|
||||
sudo systemctl start prometheus_node_exporter
|
||||
sudo systemctl status prometheus_node_exporter
|
||||
|
||||
● prometheus_node_exporter.service - Prometheuth node exporter service
|
||||
Loaded: loaded (/etc/systemd/system/prometheus_node_exporter.service; disabled; vendor preset: enabled)
|
||||
Active: active (running) since Wed 2022-02-23 04:18:07 UTC; 4s ago
|
||||
Main PID: 1820 (node_exporter)
|
||||
Tasks: 4 (limit: 1112)
|
||||
Memory: 2.3M
|
||||
CGroup: /system.slice/prometheus_node_exporter.service
|
||||
└─1820 /usr/local/bin/node_exporter --collector.cpu.info
|
||||
<...>
|
||||
```
|
||||
|
||||
2. Приведите несколько опций, которые вы бы выбрали для базового мониторинга хоста по CPU, памяти, диску и сети.
|
||||
|
||||
По умолчанию в `node_exporter` включено достаточно много различной информации (~1000 строк). Поэтому, на мой взгляд,
|
||||
для начала стоит включить только следующие флаги:
|
||||
* `--collector.disable-defaults` - отключение всех коллекторов по умолчанию
|
||||
* `--collector.cpu` - отображение статистики по CPU
|
||||
* `--collector.filesystem` - отображение статистики по файловой системе (например, количество использованного места)
|
||||
* `--collector.meminfo` - отображение статистики по памяти
|
||||
* `--collector.os` - отображение информации об операционной системе
|
||||
* `--collector.time` - отображение информации о текущем системном времени
|
||||
|
||||
3. Ознакомьтесь с метриками, которые по умолчанию собираются `Netdata`, и с комментариями, которые даны к этим метрикам.
|
||||
|
||||
`netdata` отображает следующие метрики:
|
||||
* `cpu` - утилизация CPU по всем ядрам
|
||||
* `load` - текущая загрузка системы (количество процессов, которые используют или ожидают различные системные ресурсы), поделённая на три усреднённых значения.
|
||||
* `disk` - текущие показатели I/O для физических дисков
|
||||
* `ram` - информация об оперативной памяти
|
||||
* `swap` - информация о файлах подкачки
|
||||
* `network` - информация о пропускной способности физических сетевых интерфейсов
|
||||
* и другие
|
||||
|
||||
Доступны так же подробные графики по каждой из категорий.
|
||||
|
||||
4. Можно ли по выводу `dmesg` понять, осознает ли ОС, что загружена не на настоящем оборудовании, а на системе виртуализации?
|
||||
|
||||
В `dmesg` можно найти следующий вывод `Detected virtualization oracle.` от `systemd`. Таким образом да, можно понять, что система осознаёт,
|
||||
что находится внутри виртуальной машины, а не на физическом оборудовании.
|
||||
|
||||
5. Как настроен `sysctl fs.nr_open` на системе по-умолчанию? Какой другой существующий лимит не позволит достичь такого числа?
|
||||
|
||||
```shell
|
||||
sysctl fs.nr_open
|
||||
fs.nr_open = 1048576
|
||||
```
|
||||
|
||||
`fs.nr_open` является системным лимитом на количество открытых файлов для пользователя.
|
||||
Для текущей сессии bash можно посмотреть и изменить ограничение при помощи команды `ulimit -n`.
|
||||
Для конкретных групп и пользователей ограничения можно задать в файле `/etc/security/limits.conf`.
|
||||
|
||||
6. Запустите любой долгоживущий процесс в отдельном неймспейсе процессов; покажите, что ваш процесс работает под PID 1 через `nsenter`.
|
||||
|
||||
Запустим процесс `bash` в изолированном пространстве имён:
|
||||
|
||||
```shell
|
||||
sudo unshare -f --pid --mount-proc /bin/bash
|
||||
ps aux
|
||||
|
||||
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
|
||||
root 1 0.2 0.3 8960 3988 pts/0 S 03:22 0:00 /bin/bash
|
||||
root 8 0.0 0.3 10616 3352 pts/0 R+ 03:22 0:00 ps aux
|
||||
```
|
||||
|
||||
Затем, в отдельной терминальной сессии подключимся к созданной сессии, для начала, найдя её в списке запущенных процессов через `ps`.
|
||||
|
||||
```shell
|
||||
ps au --forest -C unshare
|
||||
|
||||
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
|
||||
vagrant 2177 0.0 0.4 9092 4632 pts/1 Ss 03:23 0:00 -bash
|
||||
vagrant 2345 0.0 0.3 10616 3400 pts/1 R+ 03:34 0:00 \_ ps au --forest -C unshare
|
||||
vagrant 2081 0.0 0.4 9092 4512 pts/0 Ss 03:21 0:00 -bash
|
||||
root 2123 0.0 0.4 11016 4660 pts/0 S 03:22 0:00 \_ sudo unshare -f --pid --mount-proc /bin/bash
|
||||
root 2124 0.0 0.0 7232 528 pts/0 S 03:22 0:00 \_ unshare -f --pid --mount-proc /bin/bash
|
||||
root 2125 0.0 0.3 8960 3988 pts/0 S+ 03:22 0:00 \_ /bin/bash
|
||||
|
||||
sudo nsenter --target 2125 --pid --mount
|
||||
|
||||
ps aux
|
||||
|
||||
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
|
||||
root 1 0.0 0.3 8960 3988 pts/0 S+ 03:22 0:00 /bin/bash
|
||||
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` расскажет, какой механизм помог автоматической стабилизации.
|
||||
Как настроен этот механизм по-умолчанию, и как изменить число процессов, которое можно создать в сессии?
|
||||
|
||||
Команда - это `fork bomb`, которую можно разделить на следующие блоки:
|
||||
|
||||
```shell
|
||||
:() # define a function named :, () defines a function in bash
|
||||
{
|
||||
: | :; # the pipe needs two instances of this function, which forks two shells
|
||||
}
|
||||
; # end function definition
|
||||
: # run it
|
||||
```
|
||||
|
||||
В `dmesg` можно увидеть следующее сообщение:
|
||||
|
||||
```shell
|
||||
cgroup: fork rejected by pids controller in /user.slice/user-1000.slice/session-10.scope
|
||||
```
|
||||
|
||||
Число процессов можно изменить с помощью команды `ulimit -u <num>`.
|
||||
391
src/homework/03-sysadmin/3.5/readme.md
Normal file
391
src/homework/03-sysadmin/3.5/readme.md
Normal file
@@ -0,0 +1,391 @@
|
||||
Выполнение [домашнего задания](https://github.com/netology-code/sysadm-homeworks/blob/devsys10/03-sysadmin-05-fs/README.md)
|
||||
по теме "3.5. Файловые системы".
|
||||
|
||||
## Q/A
|
||||
|
||||
1. Разряженные файлы
|
||||
|
||||
Суть таких файлов в том, чтобы разделить реальные данные последовательностью нуль-символов (`\x00`), которые не занимают реального места на физическом носителе.
|
||||
При этом сами данные записываются на разных фрагментах на физическом диске.
|
||||
|
||||
Например, если есть разряжённый файл размером в 4KB, то он может быть поделён на 4 блока по 1KB и записан на диск именно такими фрагментами.
|
||||
Это позволяет сделать запись туда, где доступно 1-2KB (например, после удаления другого файла),
|
||||
но куда оригинальный файл целиком не поместится.
|
||||
|
||||
2. Могут ли файлы, являющиеся жесткой ссылкой на один объект, иметь разные права доступа и владельца? Почему?
|
||||
|
||||
Не могут. Причина в том, что жёсткие ссылки всегда ссылаются на одну `Inode` (идентификатор объекта файла внутри ОС).
|
||||
То есть, все файлы, которые имеют одну `Inode` будут синхронизированы по: содержимому, правам доступа и другим мета-данным.
|
||||
|
||||
3. Реконфигурация виртуальной машины
|
||||
|
||||
В текущую конфигурацию [`vagrant`](/src/vagrant/Vagrantfile) добавлена конфигурация дисков:
|
||||
|
||||
```
|
||||
config.vm.provider :virtualbox do |vb|
|
||||
lvm_experiments_disk0_path = "/tmp/lvm_experiments_disk0.vmdk"
|
||||
lvm_experiments_disk1_path = "/tmp/lvm_experiments_disk1.vmdk"
|
||||
vb.customize ['createmedium', '--filename', lvm_experiments_disk0_path, '--size', 2560]
|
||||
vb.customize ['createmedium', '--filename', lvm_experiments_disk1_path, '--size', 2560]
|
||||
vb.customize ['storageattach', :id, '--storagectl', 'SATA Controller', '--port', 1, '--device', 0, '--type', 'hdd', '--medium', lvm_experiments_disk0_path]
|
||||
vb.customize ['storageattach', :id, '--storagectl', 'SATA Controller', '--port', 2, '--device', 0, '--type', 'hdd', '--medium', lvm_experiments_disk1_path]
|
||||
end
|
||||
```
|
||||
|
||||
После запуска ВМ (`vagrant up`) можно проверить, что файлы дисков из конфигурации были созданы:
|
||||
|
||||
```shell
|
||||
ls /tmp | grep lvm
|
||||
lvm_experiments_disk0.vmdk
|
||||
lvm_experiments_disk1.vmdk
|
||||
```
|
||||
|
||||
4. Используя `fdisk`, разбейте первый диск на 2 раздела: 2 Гб, оставшееся пространство.
|
||||
|
||||
Найдём диски, которые были подключены на предыдущем шаге
|
||||
|
||||
```shell
|
||||
sudo fdisk -l
|
||||
|
||||
<...>
|
||||
|
||||
Disk /dev/sdb: 2.51 GiB, 2684354560 bytes, 5242880 sectors
|
||||
Disk model: VBOX HARDDISK
|
||||
Units: sectors of 1 * 512 = 512 bytes
|
||||
Sector size (logical/physical): 512 bytes / 512 bytes
|
||||
I/O size (minimum/optimal): 512 bytes / 512 bytes
|
||||
|
||||
|
||||
Disk /dev/sdc: 2.51 GiB, 2684354560 bytes, 5242880 sectors
|
||||
Disk model: VBOX HARDDISK
|
||||
Units: sectors of 1 * 512 = 512 bytes
|
||||
Sector size (logical/physical): 512 bytes / 512 bytes
|
||||
I/O size (minimum/optimal): 512 bytes / 512 bytes
|
||||
|
||||
<...>
|
||||
```
|
||||
|
||||
Проведём операцию на диске `/dev/sdb`. Утилита `fdisk` - интерактивная, поэтому вводить команды нужно непосредственно после её запуска.
|
||||
|
||||
```shell
|
||||
sudo fdisk /dev/sdb
|
||||
|
||||
Changes will remain in memory only, until you decide to write them.
|
||||
Be careful before using the write command.
|
||||
|
||||
Device does not contain a recognized partition table.
|
||||
Created a new DOS disklabel with disk identifier 0x0c6b10a9.
|
||||
|
||||
Command (m for help): g
|
||||
Created a new GPT disklabel (GUID: F75C9D4B-5A47-7540-8A8D-D7448C95BCE5).
|
||||
|
||||
Command (m for help): n
|
||||
Partition number (1-128, default 1): 1
|
||||
First sector (2048-5242846, default 2048): 2048
|
||||
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-5242846, default 5242846): +2G
|
||||
|
||||
Created a new partition 1 of type 'Linux filesystem' and of size 2 GiB.
|
||||
|
||||
Command (m for help): n
|
||||
Partition number (2-128, default 2): 2
|
||||
First sector (4196352-5242846, default 4196352):
|
||||
Last sector, +/-sectors or +/-size{K,M,G,T,P} (4196352-5242846, default 5242846):
|
||||
|
||||
Created a new partition 2 of type 'Linux filesystem' and of size 511 MiB.
|
||||
|
||||
Command (m for help): w
|
||||
The partition table has been altered.
|
||||
Calling ioctl() to re-read partition table.
|
||||
Syncing disks.
|
||||
```
|
||||
|
||||
Проверим, что всё прошло успешно
|
||||
|
||||
```shell
|
||||
sudo fdisk -l /dev/sdb
|
||||
Disk /dev/sdb: 2.51 GiB, 2684354560 bytes, 5242880 sectors
|
||||
Disk model: VBOX HARDDISK
|
||||
Units: sectors of 1 * 512 = 512 bytes
|
||||
Sector size (logical/physical): 512 bytes / 512 bytes
|
||||
I/O size (minimum/optimal): 512 bytes / 512 bytes
|
||||
Disklabel type: gpt
|
||||
Disk identifier: F75C9D4B-5A47-7540-8A8D-D7448C95BCE5
|
||||
|
||||
Device Start End Sectors Size Type
|
||||
/dev/sdb1 2048 4196351 4194304 2G Linux filesystem
|
||||
/dev/sdb2 4196352 5242846 1046495 511M Linux filesystem
|
||||
```
|
||||
|
||||
5. Используя `sfdisk`, перенесите данную таблицу разделов на второй диск.
|
||||
|
||||
Перенесём таблицу разделов с `/dev/sdb` на `/dev/sdc`.
|
||||
|
||||
```shell
|
||||
sudo sfdisk --dump /dev/sdb > /tmp/sdb.dump
|
||||
|
||||
sudo sfdisk /dev/sdc < /tmp/sdb.dump
|
||||
|
||||
Checking that no-one is using this disk right now ... OK
|
||||
|
||||
Disk /dev/sdc: 2.51 GiB, 2684354560 bytes, 5242880 sectors
|
||||
Disk model: VBOX HARDDISK
|
||||
Units: sectors of 1 * 512 = 512 bytes
|
||||
Sector size (logical/physical): 512 bytes / 512 bytes
|
||||
I/O size (minimum/optimal): 512 bytes / 512 bytes
|
||||
|
||||
>>> Script header accepted.
|
||||
>>> Script header accepted.
|
||||
>>> Script header accepted.
|
||||
>>> Script header accepted.
|
||||
>>> Script header accepted.
|
||||
>>> Script header accepted.
|
||||
>>> Created a new GPT disklabel (GUID: F75C9D4B-5A47-7540-8A8D-D7448C95BCE5).
|
||||
/dev/sdc1: Created a new partition 1 of type 'Linux filesystem' and of size 2 GiB.
|
||||
/dev/sdc2: Created a new partition 2 of type 'Linux filesystem' and of size 511 MiB.
|
||||
/dev/sdc3: Done.
|
||||
|
||||
New situation:
|
||||
Disklabel type: gpt
|
||||
Disk identifier: F75C9D4B-5A47-7540-8A8D-D7448C95BCE5
|
||||
|
||||
Device Start End Sectors Size Type
|
||||
/dev/sdc1 2048 4196351 4194304 2G Linux filesystem
|
||||
/dev/sdc2 4196352 5242846 1046495 511M Linux filesystem
|
||||
|
||||
The partition table has been altered.
|
||||
Calling ioctl() to re-read partition table.
|
||||
Syncing disks.
|
||||
```
|
||||
|
||||
Проверим, что всё прошло успешно
|
||||
|
||||
```shell
|
||||
sudo fdisk -l /dev/sdc
|
||||
Disk /dev/sdc: 2.51 GiB, 2684354560 bytes, 5242880 sectors
|
||||
Disk model: VBOX HARDDISK
|
||||
Units: sectors of 1 * 512 = 512 bytes
|
||||
Sector size (logical/physical): 512 bytes / 512 bytes
|
||||
I/O size (minimum/optimal): 512 bytes / 512 bytes
|
||||
Disklabel type: gpt
|
||||
Disk identifier: F75C9D4B-5A47-7540-8A8D-D7448C95BCE5
|
||||
|
||||
Device Start End Sectors Size Type
|
||||
/dev/sdc1 2048 4196351 4194304 2G Linux filesystem
|
||||
/dev/sdc2 4196352 5242846 1046495 511M Linux filesystem
|
||||
```
|
||||
|
||||
6. Соберите `mdadm` `RAID1` на паре разделов 2 Гб.
|
||||
|
||||
Разделы, которые необходимо объединить в `RAID1`: `/dev/sdb1` и `/dev/sdc1`.
|
||||
|
||||
```shell
|
||||
sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1
|
||||
mdadm: Defaulting to version 1.2 metadata
|
||||
mdadm: array /dev/md0 started.
|
||||
```
|
||||
|
||||
7. Соберите `mdadm` `RAID0` на второй паре маленьких разделов
|
||||
|
||||
Разделы, которые необходимо объединить в `RAID0`: `/dev/sdb2` и `/dev/sdc2`.
|
||||
|
||||
```shell
|
||||
sudo mdadm --create /dev/md1 --level=0 --raid-devices=2 /dev/sdb2 /dev/sdc2
|
||||
mdadm: Defaulting to version 1.2 metadata
|
||||
mdadm: array /dev/md1 started.
|
||||
```
|
||||
|
||||
8. Создайте 2 независимых PV на получившихся md-устройствах
|
||||
|
||||
```shell
|
||||
sudo pvcreate /dev/md0
|
||||
Physical volume "/dev/md0" successfully created.
|
||||
sudo pvcreate /dev/md1
|
||||
Physical volume "/dev/md1" successfully created.
|
||||
|
||||
sudo pvdisplay
|
||||
"/dev/md0" is a new physical volume of "<2.00 GiB"
|
||||
--- NEW Physical volume ---
|
||||
PV Name /dev/md0
|
||||
VG Name
|
||||
PV Size <2.00 GiB
|
||||
Allocatable NO
|
||||
PE Size 0
|
||||
Total PE 0
|
||||
Free PE 0
|
||||
Allocated PE 0
|
||||
PV UUID hNpE2z-h7m3-W1HT-dBIh-Xm24-6Zal-dhtPfl
|
||||
|
||||
"/dev/md1" is a new physical volume of "1017.00 MiB"
|
||||
--- NEW Physical volume ---
|
||||
PV Name /dev/md1
|
||||
VG Name
|
||||
PV Size 1017.00 MiB
|
||||
Allocatable NO
|
||||
PE Size 0
|
||||
Total PE 0
|
||||
Free PE 0
|
||||
Allocated PE 0
|
||||
PV UUID PB8hEQ-bZGA-M6Xe-tOQV-1CAb-DRSf-syoUSA
|
||||
```
|
||||
|
||||
9. Создайте общую volume-group на этих двух PV.
|
||||
|
||||
```shell
|
||||
sudo vgcreate test_vg /dev/md0 /dev/md1
|
||||
Volume group "test_vg" successfully created
|
||||
|
||||
sudo vgdisplay
|
||||
--- Volume group ---
|
||||
VG Name test_vg
|
||||
System ID
|
||||
Format lvm2
|
||||
Metadata Areas 2
|
||||
Metadata Sequence No 1
|
||||
VG Access read/write
|
||||
VG Status resizable
|
||||
MAX LV 0
|
||||
Cur LV 0
|
||||
Open LV 0
|
||||
Max PV 0
|
||||
Cur PV 2
|
||||
Act PV 2
|
||||
VG Size <2.99 GiB
|
||||
PE Size 4.00 MiB
|
||||
Total PE 765
|
||||
Alloc PE / Size 0 / 0
|
||||
Free PE / Size 765 / <2.99 GiB
|
||||
VG UUID 7xcN3Z-o9Ca-iXl2-5eao-iA4e-cEVJ-YgSajr
|
||||
```
|
||||
|
||||
10. Создайте LV размером 100 Мб, указав его расположение на PV с `RAID0`.
|
||||
|
||||
```shell
|
||||
sudo lvcreate --size=100MB test_vg /dev/md1
|
||||
Logical volume "lvol0" created.
|
||||
|
||||
sudo lvdisplay
|
||||
--- Logical volume ---
|
||||
LV Path /dev/test_vg/lvol0
|
||||
LV Name lvol0
|
||||
VG Name test_vg
|
||||
LV UUID 1fJJLO-zJeY-924D-O9gn-N1Cz-fyQ6-mnA7Z3
|
||||
LV Write Access read/write
|
||||
LV Creation host, time vagrant, 2022-03-02 02:55:17 +0000
|
||||
LV Status available
|
||||
# open 0
|
||||
LV Size 100.00 MiB
|
||||
Current LE 25
|
||||
Segments 1
|
||||
Allocation inherit
|
||||
Read ahead sectors auto
|
||||
- currently set to 4096
|
||||
Block device 253:1
|
||||
```
|
||||
|
||||
11. Создайте `mkfs.ext4` ФС на получившемся `LV`
|
||||
|
||||
```shell
|
||||
sudo mkfs.ext4 /dev/test_vg/lvol0
|
||||
mke2fs 1.45.5 (07-Jan-2020)
|
||||
Creating filesystem with 25600 4k blocks and 25600 inodes
|
||||
|
||||
Allocating group tables: done
|
||||
Writing inode tables: done
|
||||
Creating journal (1024 blocks): done
|
||||
Writing superblocks and filesystem accounting information: done
|
||||
```
|
||||
|
||||
12. Смонтируйте этот раздел в любую директорию.
|
||||
|
||||
```shell
|
||||
mkdir /tmp/new
|
||||
sudo mount /dev/test_vg/lvol0 /tmp/new
|
||||
```
|
||||
|
||||
13. Поместите туда тестовый файл.
|
||||
|
||||
```shell
|
||||
sudo wget https://mirror.yandex.ru/ubuntu/ls-lR.gz -O /tmp/new/test.gz
|
||||
|
||||
--2022-03-02 03:04:07-- https://mirror.yandex.ru/ubuntu/ls-lR.gz
|
||||
Resolving mirror.yandex.ru (mirror.yandex.ru)... 213.180.204.183, 2a02:6b8::183
|
||||
Connecting to mirror.yandex.ru (mirror.yandex.ru)|213.180.204.183|:443... connected.
|
||||
HTTP request sent, awaiting response... 200 OK
|
||||
Length: 22388361 (21M) [application/octet-stream]
|
||||
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`.
|
||||
|
||||
```shell
|
||||
sudo lsblk
|
||||
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
|
||||
loop0 7:0 0 55.4M 1 loop /snap/core18/2128
|
||||
loop2 7:2 0 70.3M 1 loop /snap/lxd/21029
|
||||
loop3 7:3 0 55.5M 1 loop /snap/core18/2284
|
||||
loop4 7:4 0 43.6M 1 loop /snap/snapd/14978
|
||||
loop5 7:5 0 61.9M 1 loop /snap/core20/1361
|
||||
loop6 7:6 0 67.9M 1 loop /snap/lxd/22526
|
||||
sda 8:0 0 64G 0 disk
|
||||
├─sda1 8:1 0 1M 0 part
|
||||
├─sda2 8:2 0 1G 0 part /boot
|
||||
└─sda3 8:3 0 63G 0 part
|
||||
└─ubuntu--vg-ubuntu--lv 253:0 0 31.5G 0 lvm /
|
||||
sdb 8:16 0 2.5G 0 disk
|
||||
├─sdb1 8:17 0 2G 0 part
|
||||
│ └─md0 9:0 0 2G 0 raid1
|
||||
└─sdb2 8:18 0 511M 0 part
|
||||
└─md1 9:1 0 1017M 0 raid0
|
||||
└─test_vg-lvol0 253:1 0 100M 0 lvm /tmp/new
|
||||
sdc 8:32 0 2.5G 0 disk
|
||||
├─sdc1 8:33 0 2G 0 part
|
||||
│ └─md0 9:0 0 2G 0 raid1
|
||||
└─sdc2 8:34 0 511M 0 part
|
||||
└─md1 9:1 0 1017M 0 raid0
|
||||
└─test_vg-lvol0 253:1 0 100M 0 lvm /tmp/new
|
||||
```
|
||||
|
||||
15. Протестируйте целостность файла
|
||||
|
||||
```shell
|
||||
sudo gzip -t /tmp/new/test.gz
|
||||
echo $?
|
||||
|
||||
0
|
||||
```
|
||||
|
||||
16. Используя `pvmove`, переместите содержимое PV с `RAID0` на `RAID1`.
|
||||
|
||||
```shell
|
||||
sudo pvmove /dev/md1 /dev/md0
|
||||
/dev/md1: Moved: 16.00%
|
||||
/dev/md1: Moved: 100.00%
|
||||
```
|
||||
|
||||
17. Сделайте `--fail` на устройство в вашем `RAID1` md.
|
||||
|
||||
```shell
|
||||
sudo mdadm --fail /dev/md0 /dev/sdb1
|
||||
mdadm: set /dev/sdb1 faulty in /dev/md0
|
||||
```
|
||||
|
||||
18. Подтвердите выводом `dmesg`, что `RAID1` работает в деградированном состоянии
|
||||
|
||||
```shell
|
||||
sudo dmesg | tail -n 5
|
||||
[ 2711.025093] 02:44:35.853387 timesync vgsvcTimeSyncWorker: Radical guest time change: 81 954 170 807 000ns (GuestNow=1 646 189 075 853 355 000 ns GuestLast=1 646 107 121 682 548 000 ns fSetTimeLastLoop=true )
|
||||
[ 3814.237420] EXT4-fs (dm-1): mounted filesystem with ordered data mode. Opts: (null)
|
||||
[ 3814.237429] ext4 filesystem being mounted at /tmp/new supports timestamps until 2038 (0x7fffffff)
|
||||
[ 4328.371203] md/raid1:md0: Disk failure on sdb1, disabling device.
|
||||
md/raid1:md0: Operation continuing on 1 devices.
|
||||
```
|
||||
|
||||
19. Протестируйте целостность файла, несмотря на "сбойный" диск он должен продолжать быть доступен
|
||||
|
||||
```shell
|
||||
sudo gzip -t /tmp/new/test.gz
|
||||
echo $?
|
||||
0
|
||||
```
|
||||
215
src/homework/03-sysadmin/3.6/readme.md
Normal file
215
src/homework/03-sysadmin/3.6/readme.md
Normal file
@@ -0,0 +1,215 @@
|
||||
Выполнение [домашнего задания](https://github.com/netology-code/sysadm-homeworks/blob/devsys10/03-sysadmin-06-net/README.md)
|
||||
по теме "3.6. Компьютерные сети, лекция 1".
|
||||
|
||||
## Q/A
|
||||
|
||||
1. Работа c HTTP через телнет.
|
||||
|
||||
```shell
|
||||
telnet stackoverflow.com 80
|
||||
Trying 151.101.1.69...
|
||||
Connected to stackoverflow.com.
|
||||
Escape character is '^]'.
|
||||
GET /questions HTTP/1.0
|
||||
HOST: stackoverflow.com
|
||||
|
||||
HTTP/1.1 301 Moved Permanently
|
||||
cache-control: no-cache, no-store, must-revalidate
|
||||
location: https://stackoverflow.com/questions
|
||||
x-request-guid: 345ccd64-092f-4bed-a6bb-f55d978ab74a
|
||||
feature-policy: microphone 'none'; speaker 'none'
|
||||
content-security-policy: upgrade-insecure-requests; frame-ancestors 'self' https://stackexchange.com
|
||||
Accept-Ranges: bytes
|
||||
Date: Wed, 09 Mar 2022 02:50:15 GMT
|
||||
Via: 1.1 varnish
|
||||
Connection: close
|
||||
X-Served-By: cache-hhn4072-HHN
|
||||
X-Cache: MISS
|
||||
X-Cache-Hits: 0
|
||||
X-Timer: S1646794215.885878,VS0,VE156
|
||||
Vary: Fastly-SSL
|
||||
X-DNS-Prefetch-Control: off
|
||||
Set-Cookie: prov=a65f8cdf-ae94-33aa-2d32-b4ba53feba61; domain=.stackoverflow.com; expires=Fri, 01-Jan-2055 00:00:00 GMT; path=/; HttpOnly
|
||||
```
|
||||
|
||||
В ответ пришёл статус код `301`, который означает постоянное перемещение с запрашиваемой страницы.
|
||||
|
||||
2. Повторите задание 1 в браузере, используя консоль разработчика F12.
|
||||
|
||||
Код ответа при заходе на сайт `http://stackoverflow.com`: `Status Code: 307 Internal Redirect`.
|
||||
Наиболее долгих по загрузке запрос - это запрос на загрузку самой страницы после редиректа (`https://stackoverflow.com/`).
|
||||
Скриншот консоли браузера:
|
||||
|
||||

|
||||
|
||||
3. Какой IP адрес у вас в интернете?
|
||||
|
||||
Чтобы узнать текущий внешний ip-адрес, можно воспользоваться онлайн сервисами, такими как [myip.com](https://www.myip.com/) или [whoer.net](https://whoer.net/).
|
||||
В дополнение к этому, можно использовать только консоль и команду `dig`:
|
||||
|
||||
```shell
|
||||
dig +short myip.opendns.com @resolver1.opendns.com
|
||||
46.181.144.146
|
||||
|
||||
dig TXT +short o-o.myaddr.l.google.com @ns1.google.com
|
||||
"46.181.144.146"
|
||||
```
|
||||
|
||||
Ответ: `46.181.144.146`.
|
||||
|
||||
4. Какому провайдеру принадлежит ваш IP адрес? Какой автономной системе AS?
|
||||
|
||||
```shell
|
||||
whois 46.181.144.146
|
||||
|
||||
<...>
|
||||
|
||||
% Information related to '46.181.128.0/18AS39927'
|
||||
|
||||
route: 46.181.128.0/18
|
||||
descr: Goodline.info
|
||||
origin: AS39927
|
||||
mnt-by: ELT-MNT
|
||||
created: 2010-12-22T11:28:33Z
|
||||
last-modified: 2010-12-22T11:28:33Z
|
||||
source: RIPE
|
||||
```
|
||||
|
||||
Ответ: оператор - `Goodline.info`, AS - `AS39927`.
|
||||
|
||||
5. Через какие сети проходит пакет, отправленный с вашего компьютера на адрес 8.8.8.8? Через какие AS?
|
||||
|
||||
По умолчанию утилита `traceroute` не установлена в системе ubuntu. Для её установки достаточно выполнить команду
|
||||
|
||||
```shell
|
||||
sudo apt install traceroute
|
||||
```
|
||||
|
||||
Ответ:
|
||||
|
||||
```shell
|
||||
traceroute -A 8.8.8.8
|
||||
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
|
||||
1 router.asus.com (192.168.1.1) [*] 5.960 ms 3.192 ms 3.129 ms
|
||||
2 46-181-144-129.shah-95-kmr-cr01-6500.net.elt (46.181.144.129) [AS39927] 6.523 ms 6.484 ms 6.446 ms
|
||||
3 172.16.23.174 (172.16.23.174) [*] 6.577 ms 6.539 ms 6.502 ms
|
||||
4 172-16-22-178.kras-136-kmr-asbr01-asr.net.elt (172.16.22.178) [*] 5.984 ms 10.393 ms 10.354 ms
|
||||
5 host_91_221_180_4.milecom.ru (91.221.180.4) [AS13094] 56.869 ms 56.832 ms 56.796 ms
|
||||
6 108.170.250.34 (108.170.250.34) [AS15169] 54.496 ms 51.426 ms 108.170.250.66 (108.170.250.66) [AS15169] 51.329 ms
|
||||
7 * * *
|
||||
8 108.170.232.251 (108.170.232.251) [AS15169] 72.746 ms 72.14.238.168 (72.14.238.168) [AS15169] 62.523 ms 172.253.65.82 (172.253.65.82) [AS15169] 64.747 ms
|
||||
9 216.239.46.139 (216.239.46.139) [AS15169] 68.148 ms 72.14.236.73 (72.14.236.73) [AS15169] 69.164 ms 172.253.51.241 (172.253.51.241) [AS15169] 69.121 ms
|
||||
10 * * *
|
||||
11 * * *
|
||||
12 * * *
|
||||
13 * * *
|
||||
14 * * *
|
||||
15 * * *
|
||||
16 * * *
|
||||
17 * * *
|
||||
18 * * *
|
||||
19 * dns.google (8.8.8.8) [AS15169] 57.661 ms 56.687 ms
|
||||
```
|
||||
|
||||
6. Повторите задание 5 в утилите mtr. На каком участке наибольшая задержка - delay?
|
||||
|
||||
```shell
|
||||
mtr -w 8.8.8.8
|
||||
Start: 2022-03-09T10:25:09+0700
|
||||
HOST: host Loss% Snt Last Avg Best Wrst StDev
|
||||
1.|-- router.asus.com 0.0% 10 2.9 3.3 2.5 4.6 0.8
|
||||
2.|-- 46-181-144-129.shah-95-kmr-cr01-6500.net.elt 0.0% 10 4.0 4.0 2.5 5.5 1.1
|
||||
3.|-- 172.16.23.174 0.0% 10 4.1 4.4 3.1 6.0 0.9
|
||||
4.|-- 172-16-22-178.kras-136-kmr-asbr01-asr.net.elt 0.0% 10 4.3 4.2 3.5 5.5 0.6
|
||||
5.|-- host_91_221_180_4.milecom.ru 0.0% 10 57.9 55.7 54.5 57.9 1.0
|
||||
6.|-- 108.170.250.146 0.0% 10 55.7 55.4 54.4 56.4 0.7
|
||||
7.|-- 209.85.249.158 50.0% 10 58.7 63.8 58.7 81.0 9.6
|
||||
8.|-- 216.239.57.222 0.0% 10 62.5 62.3 61.5 64.3 0.9
|
||||
9.|-- 142.250.238.181 0.0% 10 66.4 66.0 65.3 66.9 0.5
|
||||
10.|-- ??? 100.0 10 0.0 0.0 0.0 0.0 0.0
|
||||
11.|-- ??? 100.0 10 0.0 0.0 0.0 0.0 0.0
|
||||
12.|-- ??? 100.0 10 0.0 0.0 0.0 0.0 0.0
|
||||
13.|-- ??? 100.0 10 0.0 0.0 0.0 0.0 0.0
|
||||
14.|-- ??? 100.0 10 0.0 0.0 0.0 0.0 0.0
|
||||
15.|-- ??? 100.0 10 0.0 0.0 0.0 0.0 0.0
|
||||
16.|-- ??? 100.0 10 0.0 0.0 0.0 0.0 0.0
|
||||
17.|-- ??? 100.0 10 0.0 0.0 0.0 0.0 0.0
|
||||
18.|-- ??? 100.0 10 0.0 0.0 0.0 0.0 0.0
|
||||
19.|-- dns.google 0.0% 10 58.5 58.5 57.6 60.3 0.8
|
||||
```
|
||||
|
||||
Наибольшая задержка была на 7-ом хопе с худшим показателем в 81ms.
|
||||
|
||||
7. Какие DNS сервера отвечают за доменное имя `dns.google`? Какие A записи?
|
||||
|
||||
```shell
|
||||
dig dns.google
|
||||
|
||||
; <<>> DiG 9.16.1-Ubuntu <<>> dns.google
|
||||
;; global options: +cmd
|
||||
;; Got answer:
|
||||
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 59679
|
||||
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
|
||||
|
||||
;; OPT PSEUDOSECTION:
|
||||
; EDNS: version: 0, flags:; udp: 65494
|
||||
;; QUESTION SECTION:
|
||||
;dns.google. IN A
|
||||
|
||||
;; ANSWER SECTION:
|
||||
dns.google. 370 IN A 8.8.4.4
|
||||
dns.google. 370 IN A 8.8.8.8
|
||||
|
||||
;; Query time: 8 msec
|
||||
;; SERVER: 127.0.0.53#53(127.0.0.53)
|
||||
;; WHEN: Ср мар 09 10:28:19 +07 2022
|
||||
;; MSG SIZE rcvd: 71
|
||||
```
|
||||
|
||||
Ответ: dns-сервера с ip-адресами `8.8.4.4` и `8.8.8.8`. Оба адреса являются `A`-записями.
|
||||
|
||||
9. Проверьте PTR записи для IP адресов из задания 7. Какое доменное имя привязано к IP?
|
||||
|
||||
```shell
|
||||
dig -x 8.8.4.4
|
||||
|
||||
; <<>> DiG 9.16.1-Ubuntu <<>> -x 8.8.4.4
|
||||
;; global options: +cmd
|
||||
;; Got answer:
|
||||
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33111
|
||||
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
|
||||
|
||||
;; OPT PSEUDOSECTION:
|
||||
; EDNS: version: 0, flags:; udp: 65494
|
||||
;; QUESTION SECTION:
|
||||
;4.4.8.8.in-addr.arpa. IN PTR
|
||||
|
||||
;; ANSWER SECTION:
|
||||
4.4.8.8.in-addr.arpa. 53775 IN PTR dns.google.
|
||||
|
||||
;; Query time: 4 msec
|
||||
;; SERVER: 127.0.0.53#53(127.0.0.53)
|
||||
;; WHEN: Ср мар 09 10:33:09 +07 2022
|
||||
;; MSG SIZE rcvd: 73
|
||||
|
||||
dig -x 8.8.8.8
|
||||
|
||||
; <<>> DiG 9.16.1-Ubuntu <<>> -x 8.8.8.8
|
||||
;; global options: +cmd
|
||||
;; Got answer:
|
||||
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 3893
|
||||
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
|
||||
|
||||
;; OPT PSEUDOSECTION:
|
||||
; EDNS: version: 0, flags:; udp: 65494
|
||||
;; QUESTION SECTION:
|
||||
;8.8.8.8.in-addr.arpa. IN PTR
|
||||
|
||||
;; ANSWER SECTION:
|
||||
8.8.8.8.in-addr.arpa. 6386 IN PTR dns.google.
|
||||
|
||||
;; Query time: 4 msec
|
||||
;; SERVER: 127.0.0.53#53(127.0.0.53)
|
||||
;; WHEN: Ср мар 09 10:33:34 +07 2022
|
||||
;; MSG SIZE rcvd: 73
|
||||
```
|
||||
BIN
src/homework/03-sysadmin/3.6/stackoverflow.png
Normal file
BIN
src/homework/03-sysadmin/3.6/stackoverflow.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 349 KiB |
119
src/homework/03-sysadmin/3.7/readme.md
Normal file
119
src/homework/03-sysadmin/3.7/readme.md
Normal file
@@ -0,0 +1,119 @@
|
||||
Выполнение [домашнего задания](https://github.com/netology-code/sysadm-homeworks/blob/devsys10/03-sysadmin-07-net/README.md)
|
||||
по теме "3.7. Компьютерные сети, лекция 2".
|
||||
|
||||
## Q/A
|
||||
|
||||
1. Проверьте список доступных сетевых интерфейсов на вашем компьютере. Какие команды есть для этого в Linux и в Windows?
|
||||
|
||||
В Linux можно выполнить команду `ip link`, которая покажет все сетевые интерфейсы, включая виртуальные.
|
||||
Для Windows аналогом данной команды является вызов `ipconfig /all`.
|
||||
|
||||
2. Какой протокол используется для распознавания соседа по сетевому интерфейсу? Какой пакет и команды есть в Linux для этого?
|
||||
|
||||
Для получения информации о соседнем устройстве используется протокол [LLDP](https://en.wikipedia.org/wiki/Link_Layer_Discovery_Protocol).
|
||||
Данный протокол в ОС Linux реализован в утилите `lldpd`.
|
||||
|
||||
3. Какая технология используется для разделения L2 коммутатора на несколько виртуальных сетей? Какой пакет и команды есть в Linux для этого? Приведите пример конфига.
|
||||
|
||||
Технология имеет название [VLAN](https://en.wikipedia.org/wiki/Virtual_LAN).
|
||||
В Linux для управления виртуальными сетями используется пакет `vlan`, а именно утилита `vconfig` (устарела, рекомендуется использовать утилиту `ip route`).
|
||||
|
||||
Вся конфигурация так или иначе хранится в файле `/etc/network/interfaces`, содержимое которого будет выглядеть примерно так
|
||||
|
||||
```
|
||||
auto eth0.1400
|
||||
iface eth0.1400 inet static
|
||||
address 192.168.1.1
|
||||
netmask 255.255.255.0
|
||||
vlan_raw_device eth0
|
||||
```
|
||||
|
||||
4. Какие типы агрегации интерфейсов есть в Linux? Какие опции есть для балансировки нагрузки? Приведите пример конфига.
|
||||
|
||||
В конфигурации Linux предусмотрены следующие типы агрегации:
|
||||
* static/manual - ручная статическая настройка
|
||||
* dynamic - динамическая
|
||||
|
||||
Типы балансировки нагрузки:
|
||||
* `balance-rr` - балансировка по принципу [Round-robin](https://en.wikipedia.org/wiki/Round-robin_scheduling).
|
||||
* `active-backup` - один активный интерфейс, в случае выхода из строя которого, трафик перенаправляется на запасной.
|
||||
* `balance-xor` - "эксклюзивный ИЛИ", при котором происходит сопоставление MAC-адреса из запроса к MAC-адресу интерфейса. Эта связь используется в дальнейшем для всех запросов.
|
||||
* `broadcase` - транслирование запроса на все интерфейсы.
|
||||
* `802.3ad` - динамическая политика агрегации по стандарту [IEEE 802.3ad](https://www.ieee802.org/3/hssg/public/apr07/frazier_01_0407.pdf)
|
||||
* `balance-tlb` - балансировка трафика в зависимости от нагрузки интерфейсов.
|
||||
* `balance-alb` - надстройка над `balance-tlb`, убирающая необходимость специальной поддержки со стороны интерфейса.
|
||||
|
||||
Настройка производится в том же файле `/etc/network/interfaces`. Пример конфигурации с балансировкой нагрузки по типу `active-backup`,
|
||||
когда основным является интерфейс `eth0`, а `wlan0` - запасным, который активируется при выходе из строя основного:
|
||||
|
||||
```
|
||||
# Define slaves
|
||||
auto eth0
|
||||
iface eth0 inet manual
|
||||
bond-master bond0
|
||||
bond-primary eth0
|
||||
bond-mode active-backup
|
||||
|
||||
auto wlan0
|
||||
iface wlan0 inet manual
|
||||
wpa-conf /etc/network/wpa.conf
|
||||
bond-master bond0
|
||||
bond-primary eth0
|
||||
bond-mode active-backup
|
||||
|
||||
# Define master
|
||||
auto bond0
|
||||
iface bond0 inet dhcp
|
||||
bond-slaves none
|
||||
bond-primary eth0
|
||||
bond-mode active-backup
|
||||
bond-miimon 100
|
||||
```
|
||||
|
||||
5. Сколько IP адресов в сети с маской `/29` ? Сколько `/29` подсетей можно получить из сети с маской `/24`. Приведите несколько примеров `/29` подсетей внутри сети `10.10.10.0/24`.
|
||||
|
||||
Всего в сети с маской `/29` находятся 8 IP адресов, 2 из которых зарезервированы.
|
||||
|
||||
Всего в сети с маской `/24` могут использоваться 256 IP адреса.
|
||||
Таким образом, если на каждую сеть с маской `/29` нужен пул из 8 адресов,
|
||||
то в оригинальную сеть поместится 256 / 8 = 32 подсети с маской `/29`.
|
||||
|
||||
Примеры подсетей с маской `/29` внутри сети `10.10.10.0/24`:
|
||||
* `10.10.10.1/29`
|
||||
* `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 хостов внутри подсети.
|
||||
|
||||
Так как самые ходовые сети, используемые для внутренних сетей, уже заняты, то остаётся только вариант с сетью `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?
|
||||
|
||||
Работа с ARP-таблицами:
|
||||
* linux
|
||||
|
||||
```shell
|
||||
# вывод данных таблицы
|
||||
ip neigh
|
||||
# полная очистка
|
||||
ip neigh flush all
|
||||
# удаление одного ip-адреса
|
||||
ip neigh del <ip-address> lladdr <link-layer address> <device>
|
||||
# пример удаления адреса
|
||||
ip neigh del 192.168.1.3 lladdr 02:01:02:03:04:05 dev eth0
|
||||
```
|
||||
|
||||
* windows
|
||||
|
||||
```shell
|
||||
# вывод данных таблицы
|
||||
arp -a
|
||||
# полная очистка
|
||||
arp -d *
|
||||
# удаление одного ip-адреса
|
||||
arp -d <ip-address>
|
||||
# пример удаление адреса
|
||||
arp -d 192.168.1.3
|
||||
```
|
||||
BIN
src/homework/03-sysadmin/3.8/network.png
Normal file
BIN
src/homework/03-sysadmin/3.8/network.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 40 KiB |
1
src/homework/03-sysadmin/3.8/network.xml
Normal file
1
src/homework/03-sysadmin/3.8/network.xml
Normal file
@@ -0,0 +1 @@
|
||||
<mxfile host="app.diagrams.net" modified="2022-03-17T03:03:17.629Z" agent="5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36 OPR/83.0.4254.70" etag="NbVIYXF-muBXRySHjtu2" version="14.6.7" type="device"><diagram name="Page-1" id="c37626ed-c26b-45fb-9056-f9ebc6bb27b6">7Vpbc5s6EP41fgzDTVwec23PTM9MZjLT9jx1ZJCBE0BUyLHdX39WRoAExHEcu2566swEtBIrsd+3q13ZM+e6WH9guEr/pjHJZ7YZr2fOzcy2LTMM4SIkm0YS+lYjSFgWy0G94CH7QdonpXSZxaTWBnJKc55VujCiZUkirskwY3SlD1vQXJ+1wgkZCR4inI+lX7KYp1JqmWbf8ZFkSSqnDpDsmOPoMWF0Wcr5SlqSpqfArRo5tE5xTFeKyLmdOdeMUt7cFetrkguzthZrnrt7prdbMiMl3+uByMeeP18Ei9ixHXNxYaFGxRPOl9IOf5WcsJJwuWK+aQ0EqgALaFzBa1RCGOV0CZqvVmnGyUOFIyFcAT1AlvIih5YFt1vbELEEs3m4sYFoRLTIoraDM/rY2V48uKAlv8NFlgtKfSYsxiWWYskfC0x4NbaCNMwTYZysFZG0ygdCC8LZBobIXrdFSJIX+dIwK4UKLeCpwoKOHljSL+l09zjAjYRiT1iQPbZ+DGyVzS3DNBPneE7yq46I1zSnrB9Yc8z4XSbm31qalPGl8Jh+BEiUfh0J+whI1HTJIvLM27qBdHfMEsJfYKqww05EGckxz550r34LOpeLB/Or/z2J2Wd8Yf24nJv+lwt75Dc7EaOMpzShJc5ve+nAMfoxnyitJLD/Es430sR4yakO+0tAknXGv4p7A8nWP0rPzVptbJTGPWEZ2ImwjjBgM6kIte2tKiPs2r26bWujtoYKJ7E8DnMm4XorV+Sj9zSD5fVRI/QNU/nYWgxxTaQrbF5F6lCj9EAtQnowcryBouZ1R4qACnijDKvEgHrX8pE2j+2HO9cFr7trPNw0K+i9qjP1YWGwhXeXl7V7UbFORF5iRFkdUQM8C8hWy6vuNDGu087pFuAsbbScwaSOF8BbtiFQ6VlsP5PBUWwzGSQSn0QQvqd1xjNaQt+cck4LZcBlniWigwv33ndb/ImboCvixCSF1W3QDMfboO8apneiUGtNkMDLubSBxgbv+5K2HRf11jqXMMByq3XfCXeJvKpaog7rfqAjvBpQV0SHzvYRrAGdOQUewBUSrBVlj+0awDDNMvSlzVkrsULbsLzAsAyIDXe2++yD7ytpG5FzgsLP8tXx9ThpTSRtAOFE0uYcIWmb5Kp7aMACm1bbkPUNl/G3CrbLKiUM57VRRTow26hO2O0TEcH91wppWLYiUjZhF8JvnpUwaVuzmceBHiLTIFCNkPeDiTB1KtzHZdSbcc9x1Rj1D/aDbQqFo21qhH444fbeqYoB71D0CxqTQkKfQgJfGxFM19wfFXk1QJ8U3xHRrm7E33GQ9wZej8a4O+4YdxScCHf/ZdzHFZpWvvVllVpVdX2vKan6Ws/01WLPcF9d7s0Oqs52JW8vFmjuNPAKslOnL63sjXWcPTj9sb3BPrFv5WYPMpLucPOFyu2AYmnSinvUS+cgpGdrxw+G/R4Yic7JSBf5hhkqHz3RDfzD+OkMThaG+dCJ6RkejZ5HJGcQ6NxE74Gc3jnJiQJIwGzPD4IQql3fHJLTNWzTRMgMPRRaqN2RX8tVzxxUdz85lrbTKWyN06gaMRbSGa7TVM+BJI3V/EyKRhnVMPEqsjjeHhRP1ep6gX6E7MpxBgZH43LanWCVfaqiyhofsv/eCIDLDCqb7qTibBg4/zcMwoEX+OdG4OAzpQL+G/zpzxHCONR5+jcZEwcIyJnYP51TYbzH+dE5Eve2dGxSI+s9ZEbWWStJV3wR8mzebjuBceB3gkPGWrY1VHXqfGh8yvV77wSuNdqN7ZPtBdDsfwbUQNb/zMq5/Q8=</diagram></mxfile>
|
||||
231
src/homework/03-sysadmin/3.8/readme.md
Normal file
231
src/homework/03-sysadmin/3.8/readme.md
Normal file
@@ -0,0 +1,231 @@
|
||||
Выполнение [домашнего задания](https://github.com/netology-code/sysadm-homeworks/blob/devsys10/03-sysadmin-08-net/README.md)
|
||||
по теме "3.8. Компьютерные сети, лекция 3".
|
||||
|
||||
## Q/A
|
||||
|
||||
1. Подключитесь к публичному маршрутизатору в интернет. Найдите маршрут к вашему публичному IP
|
||||
|
||||
```shell
|
||||
telnet route-views.routeviews.org
|
||||
Trying 128.223.51.103...
|
||||
Connected to route-views.routeviews.org.
|
||||
|
||||
<...>
|
||||
|
||||
User Access Verification
|
||||
|
||||
Username: rviews
|
||||
|
||||
route-views>show ip route 46.181.144.146
|
||||
Routing entry for 46.180.0.0/15
|
||||
Known via "bgp 6447", distance 20, metric 0
|
||||
Tag 6939, type external
|
||||
Last update from 64.71.137.241 7w0d ago
|
||||
Routing Descriptor Blocks:
|
||||
* 64.71.137.241, from 64.71.137.241, 7w0d ago
|
||||
Route metric is 0, traffic share count is 1
|
||||
AS Hops 3
|
||||
Route tag 6939
|
||||
MPLS label: none
|
||||
|
||||
route-views>show bgp 46.181.144.146
|
||||
BGP routing table entry for 46.180.0.0/15, version 150820343
|
||||
Paths: (23 available, best #22, table default)
|
||||
Not advertised to any peer
|
||||
Refresh Epoch 1
|
||||
3333 31133 39927, (aggregated by 65423 192.168.21.211)
|
||||
193.0.0.56 from 193.0.0.56 (193.0.0.56)
|
||||
Origin IGP, localpref 100, valid, external, atomic-aggregate
|
||||
path 7FE1040964D8 RPKI State not found
|
||||
rx pathid: 0, tx pathid: 0
|
||||
Refresh Epoch 1
|
||||
8283 1299 39927, (aggregated by 65423 192.168.21.136)
|
||||
94.142.247.3 from 94.142.247.3 (94.142.247.3)
|
||||
Origin IGP, metric 0, localpref 100, valid, external, atomic-aggregate
|
||||
Community: 1299:30000 8283:1 8283:101
|
||||
unknown transitive attribute: flag 0xE0 type 0x20 length 0x18
|
||||
value 0000 205B 0000 0000 0000 0001 0000 205B
|
||||
0000 0005 0000 0001
|
||||
path 7FE0A25887D8 RPKI State not found
|
||||
rx pathid: 0, tx pathid: 0
|
||||
Refresh Epoch 1
|
||||
4901 6079 31133 39927, (aggregated by 65423 192.168.21.211)
|
||||
162.250.137.254 from 162.250.137.254 (162.250.137.254)
|
||||
Origin IGP, localpref 100, valid, external, atomic-aggregate
|
||||
Community: 65000:10100 65000:10300 65000:10400
|
||||
path 7FE154880220 RPKI State not found
|
||||
rx pathid: 0, tx pathid: 0
|
||||
<...>
|
||||
```
|
||||
|
||||
2. Создайте dummy0 интерфейс в Ubuntu. Добавьте несколько статических маршрутов. Проверьте таблицу маршрутизации.
|
||||
|
||||
Создание dummy-интерфейса:
|
||||
|
||||
```shell
|
||||
echo "dummy" | sudo tee -a /etc/modules
|
||||
sudo touch /etc/modprobe.d/dummy.conf
|
||||
echo "options dummy numdummies=1" | sudo tee /etc/modprobe.d/dummy.conf
|
||||
sudo ip link add dummy0 type dummy
|
||||
```
|
||||
|
||||
Добавление маршрутов и вывод таблицы маршрутизации:
|
||||
|
||||
```shell
|
||||
sudo ip route add 10.2.2.2/32 dev eth0
|
||||
sudo ip route add 10.2.2.3/32 via 10.0.2.16
|
||||
ip route
|
||||
default via 10.0.2.2 dev eth0 proto dhcp src 10.0.2.15 metric 100
|
||||
10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.15
|
||||
10.0.2.2 dev eth0 proto dhcp scope link src 10.0.2.15 metric 100
|
||||
10.2.2.2 dev eth0 scope link
|
||||
10.2.2.3 via 10.0.2.16 dev eth0
|
||||
```
|
||||
|
||||
3. Проверьте открытые TCP порты в Ubuntu, какие протоколы и приложения используют эти порты? Приведите несколько примеров.
|
||||
|
||||
Для вывода открытых TCP-портов используем утилиту `ss` со следующими флагами:
|
||||
* `-t` вывод только TCP-портов
|
||||
* `-l` вывод портов в состоянии `LISTEN`, то есть открытые для прослушивания
|
||||
* `-n` использовать числовое представление портов (например, `:ssh` -> `:22`)
|
||||
*
|
||||
|
||||
```shell
|
||||
ss -tln
|
||||
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
|
||||
LISTEN 0 4096 127.0.0.53%lo:53 0.0.0.0:*
|
||||
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
|
||||
LISTEN 0 128 [::]:22 [::]:*
|
||||
```
|
||||
|
||||
В данном случае открыты только порты для соединения по `ssh` (порты `:22`) и для [`systemd-resolved`](https://www.freedesktop.org/software/systemd/man/systemd-resolved.service.html) (порт `:53`).
|
||||
|
||||
4. Проверьте используемые UDP сокеты в Ubuntu, какие протоколы и приложения используют эти порты?
|
||||
|
||||
По аналогии с предыдущим заданием используем утилиту `ss`, заменив флаг `-t` на `-u`
|
||||
|
||||
```shell
|
||||
ss -ulpn
|
||||
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
|
||||
UNCONN 0 0 127.0.0.53%lo:53 0.0.0.0:*
|
||||
UNCONN 0 0 10.0.2.15%eth0:68 0.0.0.0:*
|
||||
```
|
||||
|
||||
Порт `:53` предназначается для использования [`systemd-resolved`](https://www.freedesktop.org/software/systemd/man/systemd-resolved.service.html),
|
||||
а порт `68` используется для получения информации о динамической IP-адресации от DHCP-сервера.
|
||||
|
||||
5. Используя diagrams.net, создайте L3 диаграмму вашей домашней сети или любой другой сети, с которой вы работали.
|
||||
|
||||
В качестве сети взята стандартная домашняя сеть с wi-fi-роутером.
|
||||
|
||||
Файл [network.xml](network.xml) для открытия в [diagrams.net](https://diagrams.net).
|
||||
|
||||

|
||||
|
||||
6. Установите Nginx, настройте в режиме балансировщика TCP или UDP.
|
||||
|
||||
Установка nginx:
|
||||
|
||||
```shell
|
||||
sudo apt install nginx
|
||||
|
||||
sudo service nginx status
|
||||
● nginx.service - A high performance web server and a reverse proxy server
|
||||
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
|
||||
Active: active (running) since Thu 2022-03-17 03:14:31 UTC; 24s ago
|
||||
Docs: man:nginx(8)
|
||||
Main PID: 1830 (nginx)
|
||||
Tasks: 3 (limit: 1107)
|
||||
Memory: 5.0M
|
||||
CGroup: /system.slice/nginx.service
|
||||
├─1830 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
|
||||
├─1831 nginx: worker process
|
||||
└─1832 nginx: worker process
|
||||
```
|
||||
|
||||
Далее, определим, что есть два ip-адреса, на которые необходимо сделать проксирование и балансировку трафика:
|
||||
* `10.2.2.2`
|
||||
* `10.2.2.3`
|
||||
|
||||
Оба ip-адреса слушают следующие порты: `:25` - upd-трафик, `:80` - tcp-трафик.
|
||||
|
||||
Настроим nginx на прослушивание порта `:80` для обоих типов трафика с дальнейшей балансировкой и проксированием.
|
||||
|
||||
Добавим новый блок конфигурации в файл `/etc/nginx/nginx.conf`:
|
||||
|
||||
```
|
||||
stream {
|
||||
upstream tcp_backend {
|
||||
server 10.2.2.2:80;
|
||||
server 10.2.2.3:80;
|
||||
}
|
||||
|
||||
upstream upd_backend {
|
||||
server 10.2.2.2:25;
|
||||
server 10.2.2.3:25;
|
||||
}
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
proxy_pass tcp_backend;
|
||||
}
|
||||
|
||||
server {
|
||||
listen 80 udp;
|
||||
proxy_pass upd_backend;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Дополнительно, нужно убрать конфигурацию приветственной страницы, которая работает по умолчанию и слушает порт `80`:
|
||||
|
||||
```shell
|
||||
sudo rm -f /etc/nginx/sites-enabled/default
|
||||
```
|
||||
|
||||
Проверим, что конфигурация в порядке:
|
||||
|
||||
```shell
|
||||
sudo nginx -t
|
||||
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
|
||||
nginx: configuration file /etc/nginx/nginx.conf test is successful
|
||||
```
|
||||
|
||||
Затем нужно применить конфигурацию nginx
|
||||
|
||||
```shell
|
||||
sudo nginx -s reload
|
||||
sudo systemctl status nginx
|
||||
● nginx.service - A high performance web server and a reverse proxy server
|
||||
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
|
||||
Active: active (running) since Mon 2022-03-21 03:37:24 UTC; 6s ago
|
||||
Docs: man:nginx(8)
|
||||
Process: 1364 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
|
||||
Process: 1367 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
|
||||
Main PID: 1376 (nginx)
|
||||
Tasks: 3 (limit: 1107)
|
||||
Memory: 3.3M
|
||||
CGroup: /system.slice/nginx.service
|
||||
├─1376 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
|
||||
├─1377 nginx: worker process
|
||||
└─1378 nginx: worker process
|
||||
```
|
||||
|
||||
Проверим, что nginx принимает соединение на порт `80`
|
||||
|
||||
```shell
|
||||
curl -v --max-time 5 http://localhost:80
|
||||
* Trying 127.0.0.1:80...
|
||||
* TCP_NODELAY set
|
||||
* Connected to localhost (127.0.0.1) port 80 (#0)
|
||||
> GET / HTTP/1.1
|
||||
> Host: localhost
|
||||
> User-Agent: curl/7.68.0
|
||||
> Accept: */*
|
||||
>
|
||||
* Operation timed out after 5001 milliseconds with 0 bytes received
|
||||
* Closing connection 0
|
||||
curl: (28) Operation timed out after 5001 milliseconds with 0 bytes received
|
||||
```
|
||||
|
||||
В данном случае добавили `--max-time 5`, чтобы быстрее получить ошибку, так как nginx пытается проксировать запрос на несуществующий адрес.
|
||||
BIN
src/homework/03-sysadmin/3.9/bitwarden-2fa.png
Executable file
BIN
src/homework/03-sysadmin/3.9/bitwarden-2fa.png
Executable file
Binary file not shown.
|
After Width: | Height: | Size: 135 KiB |
BIN
src/homework/03-sysadmin/3.9/bitwarden.png
Executable file
BIN
src/homework/03-sysadmin/3.9/bitwarden.png
Executable file
Binary file not shown.
|
After Width: | Height: | Size: 37 KiB |
268
src/homework/03-sysadmin/3.9/readme.md
Normal file
268
src/homework/03-sysadmin/3.9/readme.md
Normal file
@@ -0,0 +1,268 @@
|
||||
Выполнение [домашнего задания](https://github.com/netology-code/sysadm-homeworks/blob/devsys10/03-sysadmin-09-security/README.md)
|
||||
по теме "3.9. Элементы безопасности информационных систем".
|
||||
|
||||
## Q/A
|
||||
|
||||
1. Установите Bitwarden плагин для браузера. Зарегестрируйтесь и сохраните несколько паролей.
|
||||
|
||||

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

|
||||
|
||||
3. Установите apache2, сгенерируйте самоподписанный сертификат, настройте тестовый сайт для работы по HTTPS.
|
||||
|
||||
Вместо `apache2` будем производить настройку уже установленного в виртуальную машину `nginx` (установка производилась в [дз 3.8:6](/src/homework/03-sysadmin/3.8sysadmin/3.8/readme.md#Q/A)).
|
||||
|
||||
Первым шагом необходимо сгенерировать сертификат:
|
||||
|
||||
```shell
|
||||
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
|
||||
-keyout /etc/ssl/private/nginx-selfsigned.key \
|
||||
-out /etc/ssl/certs/nginx-selfsigned.crt \
|
||||
-subj "/C=RU/ST=Moscow/L=Moscow/O=Company Name/OU=Org/CN=site.localhost"
|
||||
|
||||
sudo ls -lah /etc/ssl/private/ | grep nginx
|
||||
-rw------- 1 root root 1.7K Mar 28 03:01 nginx-selfsigned.key
|
||||
|
||||
sudo ls -lah /etc/ssl/certs/ | grep nginx
|
||||
-rw-r--r-- 1 root root 1.4K Mar 28 03:01 nginx-selfsigned.crt
|
||||
```
|
||||
|
||||
Воспользуемся [конфигуратором](https://ssl-config.mozilla.org/#server=nginx&version=1.17.7&config=modern&openssl=1.1.1k&guideline=5.6),
|
||||
чтобы сгенерировать основу конфигурации для сервера. Получим следующую конфигурацию, которую расположим в файле `/etc/site-available/ssl`:
|
||||
|
||||
```
|
||||
server {
|
||||
listen 443 ssl http2;
|
||||
listen [::]:443 ssl http2;
|
||||
server_name site.localhost;
|
||||
|
||||
ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
|
||||
ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
|
||||
ssl_session_timeout 1d;
|
||||
ssl_session_cache shared:MozSSL:10m; # about 40000 sessions
|
||||
ssl_session_tickets off;
|
||||
|
||||
# modern configuration
|
||||
ssl_protocols TLSv1.3;
|
||||
ssl_prefer_server_ciphers off;
|
||||
|
||||
# HSTS (ngx_http_headers_module is required) (63072000 seconds)
|
||||
add_header Strict-Transport-Security "max-age=63072000" always;
|
||||
|
||||
# OCSP stapling
|
||||
ssl_stapling on;
|
||||
ssl_stapling_verify on;
|
||||
|
||||
location / {
|
||||
root /var/www/html;
|
||||
index index.html index.htm;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Переведём новую конфигурацию в боевые настройки и проверим, что всё в порядке:
|
||||
|
||||
```shell
|
||||
sudo ln -s /etc/nginx/sites-available/ssl /etc/nginx/sites-enabled/ssl.conf
|
||||
|
||||
sudo nginx -t
|
||||
nginx: [warn] "ssl_stapling" ignored, issuer certificate not found for certificate "/etc/ssl/certs/nginx-selfsigned.crt"
|
||||
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
|
||||
nginx: configuration file /etc/nginx/nginx.conf test is successful
|
||||
```
|
||||
|
||||
Перезапускаем сервис `nginx`, проверяем его состояние:
|
||||
|
||||
```shell
|
||||
sudo service nginx reload
|
||||
sudo service nginx status
|
||||
service nginx status
|
||||
● nginx.service - A high performance web server and a reverse proxy server
|
||||
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
|
||||
Active: active (running) since Mon 2022-03-28 02:53:00 UTC; 21min ago
|
||||
Docs: man:nginx(8)
|
||||
Process: 2256 ExecReload=/usr/sbin/nginx -g daemon on; master_process on; -s reload (code=exited, status=0/SUCCESS)
|
||||
Main PID: 736 (nginx)
|
||||
Tasks: 3 (limit: 1107)
|
||||
Memory: 13.3M
|
||||
CGroup: /system.slice/nginx.service
|
||||
├─ 736 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
|
||||
├─2257 nginx: worker process
|
||||
└─2258 nginx: worker process
|
||||
```
|
||||
|
||||
При помощи `curl`, убедимся, что сервер работает корректно:
|
||||
|
||||
```shell
|
||||
curl https://site.localhost --resolve 'site.localhost:127.0.0.1'
|
||||
curl: (60) SSL certificate problem: self signed certificate
|
||||
|
||||
# проигнорируем ошибки самоподписного сертификата
|
||||
curl -k https://site.localhost --resolve 'site.localhost:127.0.0.1'
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Welcome to nginx!</title>
|
||||
<style>
|
||||
body {
|
||||
width: 35em;
|
||||
margin: 0 auto;
|
||||
font-family: Tahoma, Verdana, Arial, sans-serif;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Welcome to nginx!</h1>
|
||||
<p>If you see this page, the nginx web server is successfully installed and
|
||||
working. Further configuration is required.</p>
|
||||
|
||||
<p>For online documentation and support please refer to
|
||||
<a href="http://nginx.org/">nginx.org</a>.<br/>
|
||||
Commercial support is available at
|
||||
<a href="http://nginx.com/">nginx.com</a>.</p>
|
||||
|
||||
<p><em>Thank you for using nginx.</em></p>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
4. Проверьте на TLS уязвимости произвольный сайт в интернете
|
||||
|
||||
```shell
|
||||
git clone --depth 1 https://github.com/drwetter/testssl.sh.git
|
||||
cd testssl
|
||||
./testssl.sh -U --sneaky https://metagamerscore.com
|
||||
|
||||
Start 2022-03-28 10:31:09 -->> 217.61.246.126:443 (metagamerscore.com) <<--
|
||||
|
||||
rDNS (217.61.246.126): --
|
||||
Service detected: HTTP
|
||||
|
||||
|
||||
Testing vulnerabilities
|
||||
|
||||
Heartbleed (CVE-2014-0160) not vulnerable (OK), no heartbeat extension
|
||||
CCS (CVE-2014-0224) not vulnerable (OK)
|
||||
Ticketbleed (CVE-2016-9244), experiment. not vulnerable (OK)
|
||||
ROBOT Server does not support any cipher suites that use RSA key transport
|
||||
Secure Renegotiation (RFC 5746) supported (OK)
|
||||
Secure Client-Initiated Renegotiation not vulnerable (OK)
|
||||
CRIME, TLS (CVE-2012-4929) not vulnerable (OK)
|
||||
BREACH (CVE-2013-3587) potentially NOT ok, "gzip" HTTP compression detected. - only supplied "/" tested
|
||||
Can be ignored for static pages or if no secrets in the page
|
||||
POODLE, SSL (CVE-2014-3566) not vulnerable (OK)
|
||||
TLS_FALLBACK_SCSV (RFC 7507) No fallback possible (OK), no protocol below TLS 1.2 offered
|
||||
SWEET32 (CVE-2016-2183, CVE-2016-6329) not vulnerable (OK)
|
||||
FREAK (CVE-2015-0204) not vulnerable (OK)
|
||||
DROWN (CVE-2016-0800, CVE-2016-0703) not vulnerable on this host and port (OK)
|
||||
make sure you don't use this certificate elsewhere with SSLv2 enabled services
|
||||
https://censys.io/ipv4?q=DA0C37574C249C089F819CDC857AFDD834D0ADA90888D97A0B81071AB288732E could help you to find out
|
||||
LOGJAM (CVE-2015-4000), experimental not vulnerable (OK): no DH EXPORT ciphers, no DH key detected with <= TLS 1.2
|
||||
BEAST (CVE-2011-3389) not vulnerable (OK), no SSL3 or TLS1
|
||||
LUCKY13 (CVE-2013-0169), experimental not vulnerable (OK)
|
||||
Winshock (CVE-2014-6321), experimental not vulnerable (OK)
|
||||
RC4 (CVE-2013-2566, CVE-2015-2808) no RC4 ciphers detected (OK)
|
||||
|
||||
|
||||
Done 2022-03-28 10:31:34 [ 27s] -->> 217.61.246.126:443 (metagamerscore.com) <<--
|
||||
```
|
||||
|
||||
5. Установите на Ubuntu ssh сервер, сгенерируйте новый приватный ключ. Скопируйте свой публичный ключ на другой сервер. Подключитесь к серверу по SSH-ключу.
|
||||
|
||||
На виртуальной машине уже установлен ssh-сервер и настроен один ssh-ключ для подключения к машине с хоста.
|
||||
Таким образом сгенерируем новый ssh-ключ для пользователя `vagrant` и попробуем подключиться как пользователь `root` через ssh-сервер.
|
||||
|
||||
Генерация приватного и открытого ssh-ключей:
|
||||
|
||||
```shell
|
||||
ssh-keygen
|
||||
Generating public/private rsa key pair.
|
||||
Enter file in which to save the key (/home/vagrant/.ssh/id_rsa):
|
||||
Enter passphrase (empty for no passphrase):
|
||||
Enter same passphrase again:
|
||||
Your identification has been saved in /home/vagrant/.ssh/id_rsa
|
||||
Your public key has been saved in /home/vagrant/.ssh/id_rsa.pub
|
||||
The key fingerprint is:
|
||||
SHA256:id08L1eU83CEIr5iolPo2NKg+J7palNIO0o7D7agGuU vagrant@vagrant
|
||||
The key's randomart image is:
|
||||
+---[RSA 3072]----+
|
||||
| ..|
|
||||
| . . .o |
|
||||
| . . .= .|
|
||||
| . o +. . = |
|
||||
|. + .. S +. . .|
|
||||
| B... o o .o . |
|
||||
|*+E* o o .. o |
|
||||
|B*=o* o |
|
||||
|**Xo . |
|
||||
+----[SHA256]-----+
|
||||
```
|
||||
|
||||
Добавим открытый ключ в файл `authorized_keys` для пользователя `root`:
|
||||
|
||||
```shell
|
||||
cat .ssh/id_rsa.pub | sudo tee /root/.ssh/authorized_keys
|
||||
```
|
||||
|
||||
Проверим, что всё работает:
|
||||
```shell
|
||||
ssh -l root 127.0.0.1
|
||||
Welcome to Ubuntu 20.04.4 LTS (GNU/Linux 5.4.0-104-generic x86_64)
|
||||
<...>
|
||||
root@vagrant:~#
|
||||
```
|
||||
|
||||
6. Переименуйте файлы ключей из задания 5. Настройте файл конфигурации SSH клиента, так чтобы вход на удаленный сервер осуществлялся по имени сервера.
|
||||
|
||||
```shell
|
||||
mv ~/.ssh/id_rsa ~/.ssh/localhost_key
|
||||
mv ~/.ssh/id_rsa.pub ~/.ssh/localhost_key.pub
|
||||
```
|
||||
|
||||
Добавим новую конфигурацию в файл `~/.ssh/config`:
|
||||
|
||||
```
|
||||
host local-root
|
||||
hostname 127.0.0.1
|
||||
user root
|
||||
identityfile ~/.ssh/localhost_key
|
||||
```
|
||||
|
||||
Проверим, что всё работает:
|
||||
```shell
|
||||
ssh local-root
|
||||
Welcome to Ubuntu 20.04.4 LTS (GNU/Linux 5.4.0-104-generic x86_64)
|
||||
<...>
|
||||
root@vagrant:~#
|
||||
```
|
||||
|
||||
7. Соберите дамп трафика утилитой tcpdump в формате pcap, 100 пакетов. Откройте файл pcap в Wireshark.
|
||||
|
||||
```shell
|
||||
sudo tcpdump -c 100 -w dump.pcap
|
||||
|
||||
tcpdump -r dump.pcap
|
||||
reading from file dump.pcap, link-type EN10MB (Ethernet)
|
||||
<...>
|
||||
```
|
||||
|
||||
Для просмотра полученного файла в `Wireshark`, установим утилиту на хосте:
|
||||
|
||||
```shell
|
||||
sudo apt install wireshark
|
||||
```
|
||||
|
||||
Теперь, скопируем файл из виртуальной машины на хост, чтобы была возможность открыть его без проблем:
|
||||
|
||||
```shell
|
||||
scp -P 2222 vagrant@127.0.0.1:/home/vagrant/dump.pcap ./dump.pcap
|
||||
```
|
||||
|
||||
Затем запустим графическое отображение утилиты и откроем в ней файл:
|
||||
|
||||

|
||||
BIN
src/homework/03-sysadmin/3.9/wireshark.png
Normal file
BIN
src/homework/03-sysadmin/3.9/wireshark.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 493 KiB |
119
src/homework/03-sysadmin/notes.md
Normal file
119
src/homework/03-sysadmin/notes.md
Normal file
@@ -0,0 +1,119 @@
|
||||
# Linux operating system
|
||||
|
||||
## Streams
|
||||
|
||||
Базовые потоки:
|
||||
* `0` - stdin (`/proc/<pid>/fd/0`)
|
||||
* `1` - stdout (`/proc/<pid>/fd/1`)
|
||||
* `2` - stderr (`/proc/<pid>/fd/2`)
|
||||
|
||||
Для перенаправления потока можно использовать `X>&Y`, где `X` поток, который нужно перенаправить,
|
||||
`Y` - поток, в который нужно направить данные (может быть стандартным файлом).
|
||||
|
||||
## Kernel
|
||||
|
||||
Версия ядра: `uname -r`.
|
||||
Версия дистрибутива: `cat /etc/issue` (debian-based), `cat /etc/redhat-release` (centos-based).
|
||||
|
||||
Посмотреть всю конфигурацию системы: `sysctl -a`.
|
||||
|
||||
Логи системы: `dmesg`, `syslog`.
|
||||
|
||||
## Systemctl
|
||||
|
||||
* `systemctl list-units --all`
|
||||
* `systemctl status <service>`
|
||||
* `systemctl cat <service>` - просмотреть файл настроек сервиса
|
||||
* `systemctl list-dependencies <service>`
|
||||
```shell
|
||||
systemctl list-dependencies docker
|
||||
|
||||
docker.service
|
||||
● ├─containerd.service
|
||||
● ├─docker.socket
|
||||
● ├─system.slice
|
||||
● ├─network-online.target
|
||||
● │ └─NetworkManager-wait-online.service
|
||||
● └─sysinit.target
|
||||
● ├─apparmor.service
|
||||
<...>
|
||||
```
|
||||
* `journalctl -f`
|
||||
* `journalctl -f -u docker`
|
||||
|
||||
## Filesystems
|
||||
|
||||
* `stat <file>`
|
||||
|
||||
### File types
|
||||
|
||||
* regular file (`ls -la` - `-`)
|
||||
* directory (`ls -la` - `d`)
|
||||
* hardlink (`ls -la` - `l`)
|
||||
|
||||
1 файл - 1 hardlink
|
||||
1 директрория - минимум 2 hardlink (у пустой директории - 2, +1 за каждую директорию внутри)
|
||||
|
||||
* symlink (`ls -la` - `l`)
|
||||
* pipe (`ls -la` - `p`)
|
||||
|
||||
Перенаправление потоков, только однонаправленный
|
||||
`mkfifo <pipe>`
|
||||
|
||||
* socket (`ls -la` - `s`)
|
||||
|
||||
Двунаправленный поток, производительнее, чем pipe. Используется для взаимодействия между процессами.
|
||||
|
||||
### File access
|
||||
|
||||
`chown`, `chmod`, `umask`
|
||||
|
||||
Права по умолчанию:
|
||||
* `file`: `666 - umask`
|
||||
* `dir`: `777 - umask`
|
||||
|
||||
Дополнительные права доступа:
|
||||
* `sticky` - создание доступно всем, удаление только файлы пользователя
|
||||
* `setuid`
|
||||
* `setgid`
|
||||
|
||||
`lsattr`/`chattr`
|
||||
|
||||
### Raid
|
||||
|
||||
`mdadm`
|
||||
|
||||
### LVM
|
||||
|
||||
`lvs`, `vgs`, `vgdisplay`, `pvdisplay`
|
||||
|
||||
### Partitions
|
||||
|
||||
`fdisk -l`/`fdisk`, `sfdisk`
|
||||
|
||||
### Filesystems
|
||||
|
||||
`mkfs`, `mount`, `/etc/fstab`
|
||||
|
||||
## Network
|
||||
|
||||
* `ping <domain/ip>`
|
||||
* `whois <ip>`
|
||||
* `whois -h whois.radb.net <ip>`
|
||||
* `bgpq3 -J <AS>`
|
||||
* `traceroute -An <ip>`
|
||||
* `mtr -zn <ip>`
|
||||
* `dig +trace @8.8.8.8 <domain>`
|
||||
* `dig -x <ip>`
|
||||
* `telnet <domain/ip> <port>`
|
||||
* `ipcalc <network ip>/<mask>`
|
||||
|
||||
### SSH
|
||||
|
||||
* `ssh-copy-id user@server` - добавление ssh-ключа на сервер для пользователя
|
||||
* `ssh-keygen -F server` - проверка ssh-сертификатов сервера
|
||||
* `ssh-keygen -R server` - удаление записи сервера из `known_hosts`
|
||||
|
||||
### Web-servers
|
||||
|
||||
* ssl config generation: https://ssl-config.mozilla.org/
|
||||
Reference in New Issue
Block a user