# Основы Linux

Справочник основных команд и работы со штатными компонентами

# Основные команды

### Файлы и каталоги

#### ls - просмотр содержимого каталога

Показывает список файлов и папок в текущем или указанном каталоге.

```
ls -lah /var/www/html
```

**Ключи:** `-l` (детальный вывод), `-a` (включить скрытые файлы), `-h` (человеко-читаемые размеры)

#### cd - смена каталога

Переход в другой каталог.

```
cd /var/www/html
```

Полезно: `cd ..` (на уровень вверх), `cd ~` или просто `cd` (домашний каталог)

#### mkdir - создание каталогов

Создает новые каталоги.

```
mkdir /var/www/new_site
mkdir -p /var/www/new_site/assets
```

**Ключи:** `-p` — создать промежуточные каталоги, если их нет

#### rm - удаление файлов и каталогов

Удаляет файлы и каталоги.

```
rm file.txt
rm -rf /var/www/old_site
```

**Ключи:** `-r` — рекурсивно (для каталогов), `-f` — без подтверждения

**Внимание:** Используйте `sudo` с осторожностью при удалении системных файлов!

### Управление пользователями

#### adduser / useradd - добавление пользователя

Создает нового пользователя в системе.

```
sudo adduser newuser
```

Пример с явным указанием домашнего каталога и оболочки:

```
sudo useradd -m -d /home/newuser -s /bin/bash newuser
```

#### passwd - назначение пароля пользователю

Назначает или меняет пароль для пользователя.

```
sudo passwd newuser
```

#### deluser / userdel - удаление пользователя

Удаляет пользователя из системы.

```
sudo deluser newuser
sudo userdel -r newuser  # удалить пользователя и его домашний каталог
```

#### usermod - изменение параметров пользователя

Назначение пользователя в группы, смена оболочки и домашнего каталога.

```
sudo usermod -aG sudo newuser   # добавить в группу sudo
sudo usermod -d /home/newhome newuser  # смена домашнего каталога
sudo usermod -s /bin/zsh newuser      # смена оболочки
```

#### groups - просмотр групп пользователя

```
groups newuser
```

### Поиск файлов

#### По имени

Ищет файлы по имени в указанном каталоге или во всей системе.

```
# поиск всех файлов с расширением .log в /var/log
find /var/log -name "*.log"
<p>#поиск файлов с точным именем
find /home/user -name "notes.txt"
</p>
```

#### По размеру

Ищет файлы определенного размера или диапазона размеров.

```
# найти файлы больше 100M в /var/www
find /var/www -type f -size +100M
<p>#найти файлы меньше 1K
find /home/user -type f -size -1k</p>
<p>#найти файлы размером от 10M до 100M
find / -type f -size +10M -size -100M
</p>
```

#### Дополнительно

Некоторые полезные опции команды `find`:

- `-type f` — искать только файлы
- `-type d` — искать только каталоги
- `-iname` — поиск без учета регистра: `find /home -iname "*.txt"`
- `-maxdepth N` — ограничить глубину поиска (например, только текущий каталог): `find /var/www -maxdepth 1 -name "*.html"`
- `-exec command {} \;` — выполнить команду для каждого найденного файла, например удалить: `find /tmp -type f -name "*.tmp" -exec rm {} \;`

### Права и разрешения

#### chmod - изменение прав на файлы и каталоги

Устанавливает права доступа для владельца, группы и других пользователей.

Формат: три цифры **XYZ** — владельцу, группе, остальным. Каждая цифра — сумма прав: 4 (чтение), 2 (запись), 1 (выполнение).

- 7 = 4+2+1 → rwx (читать, писать, выполнять)
- 6 = 4+2 → rw- (читать, писать)
- 5 = 4+1 → r-x (читать, выполнять)
- 4 = 4 → r-- (только читать)
- 0 = --- → нет прав

Примеры:

```
chmod 755 /var/www/html        # rwxr-xr-x: владелец все, группа/остальные читать+выполнять
chmod 644 /var/www/html/index.html # rw-r--r--: владелец читать+писать, группа/остальные только читать
chmod 700 ~/private               # rwx------: только владелец
```

Когда использовать:

- 755 — каталоги веб-сайта (все могут читать и выполнять, владелец пишет)
- 644 — файлы конфигурации (владелец пишет, все остальные только читают)
- 700 — приватные скрипты или файлы пользователя

#### chown - смена владельца и группы

Назначает владельца и группу для файла или каталога.

```
sudo chown www-data:www-data /var/www/html -R
```

**Ключи:** `-R` — рекурсивно применить ко всем файлам и папкам

Примеры использования:

- Назначить веб-серверу: `sudo chown -R www-data:www-data /var/www`
- Назначить пользователя и группу: `sudo chown user:group file.txt`

#### chgrp - смена группы

```
sudo chgrp www-data /var/www/html -R
```

### Системные команды

#### hostname - смена имени хоста

Показывает или изменяет имя хоста системы.

```
hostname                # текущий хост
sudo hostname newhost    # временно изменить имя хоста
sudo nano /etc/hostname  # для постоянного изменения
sudo nano /etc/hosts     # исправить запись старого имени
```

#### reboot / shutdown - перезагрузка и выключение

```
sudo reboot
sudo shutdown -h now
sudo shutdown -r +10    # перезагрузка через 10 минут
```

#### free / df / du - использование памяти и дисков

```
free -h               # RAM и swap
df -h                 # свободное место на дисках
du -sh /var/log        # размер каталога
```

#### ps / kill - управление процессами

```
ps aux | grep nginx
kill 12345
kill -9 12345  # принудительное завершение
```

### Полезно

- Для проверки прав: `ls -l /var/www/html`
- Для смены владельца только файлов, а не каталога: `sudo chown user:user file.txt`
- Для массовой смены прав на все скрипты: `chmod +x *.sh`
- Для создания резервной копии перед удалением: `cp -r /var/www/old /backup/old`

### Типичные ошибки

- Ошибка: нет прав на файл → используйте `sudo`
- Ошибка: не удалось изменить владельца → проверьте синтаксис `user:group`
- Ошибка: после chmod 777 все могут писать → избегайте на продуктивных серверах, использовать 755/644
- Ошибка: пользователь не может писать в каталог → проверить владельца и права каталога (`ls -ld /path`)

# Управление дисками (fdisk)

### Введение и меры предосторожности

ВНИМАНИЕ: Деструктивная операция!

<span style="white-space: pre-wrap;">`fdisk` — это мощный инструмент, который напрямую изменяет структуру вашего диска. Неправильное использование может привести к </span>**полной и необратимой потере всех данных**<span style="white-space: pre-wrap;"> на диске. Перед началом работы:</span>

- **Убедитесь, что у вас есть резервная копия**<span style="white-space: pre-wrap;"> всех важных данных.</span>
- **Дважды проверьте имя диска**<span style="white-space: pre-wrap;"> (например, `/dev/sdb`, а не `/dev/sda`), чтобы не отформатировать системный диск.</span>

`fdisk` — это стандартная утилита командной строки Linux для создания и управления таблицами разделов диска. Она поддерживает как старый формат MBR (Master Boot Record), так и современный GPT (GUID Partition Table).

### Пошаговое руководство: разметка нового диска

#### Шаг 1: Идентификация диска

Используйте `lsblk` для просмотра блочных устройств. Новый, неразмеченный диск обычно не будет иметь подразделов.

```
lsblk
```

Предположим, наш новый диск — `/dev/sdb`.

#### Шаг 2: Запуск fdisk

Запустите fdisk в интерактивном режиме для нужного диска.

```
sudo fdisk /dev/sdb
```

#### Шаг 3: Работа в интерактивном режиме (основные команды)

После запуска fdisk вы попадаете в его командную строку. Вот основные команды:

- `<span class="editor-theme-code">m</span>`<span style="white-space: pre-wrap;"> — показать меню помощи со всеми командами.</span>
- `<span class="editor-theme-code">p</span>`<span style="white-space: pre-wrap;"> — показать текущую таблицу разделов. Полезно для просмотра текущего состояния диска.</span>
- `<span class="editor-theme-code">g</span>`<span style="white-space: pre-wrap;"> — </span>**(Рекомендуется)**<span style="white-space: pre-wrap;"> создать новую, пустую таблицу разделов GPT. Это современный стандарт, снимающий ограничения MBR (диски &gt; 2ТБ, до 128 разделов).</span>
- `<span class="editor-theme-code">o</span>`<span style="white-space: pre-wrap;"> — создать новую, пустую таблицу разделов MBR. Используйте только для совместимости со старыми системами.</span>
- `<span class="editor-theme-code">n</span>`<span style="white-space: pre-wrap;"> — создать новый раздел. Утилита спросит номер раздела, первый и последний сектор. Можно указать размер, например, `+50G`.</span>
- `<span class="editor-theme-code">d</span>`<span style="white-space: pre-wrap;"> — удалить раздел. Утилита спросит номер раздела для удаления.</span>
- `<span class="editor-theme-code">t</span>`<span style="white-space: pre-wrap;"> — изменить тип раздела. Полезно для создания разделов под LVM (`Linux LVM`) или swap (`Linux swap`). Команда `L` выведет список всех доступных типов.</span>
- `<span class="editor-theme-code">w</span>`<span style="white-space: pre-wrap;"> — </span>**(Важно!)**<span style="white-space: pre-wrap;"> записать изменения на диск и выйти. Все сделанные вами изменения станут постоянными.</span>
- `<span class="editor-theme-code">q</span>`<span style="white-space: pre-wrap;"> — выйти без сохранения изменений. Безопасный способ отменить все, что вы сделали.</span>

#### Шаг 4: Обновление информации в ядре

После записи изменений (`w`), ядро Linux может не сразу "увидеть" новую таблицу разделов. Чтобы сообщить ядру об изменениях без перезагрузки, используйте `partprobe`.

```
sudo partprobe /dev/sdb
```

#### Шаг 5: Создание файловой системы

Теперь, когда раздел создан (например, `/dev/sdb1`), его нужно отформатировать, то есть создать на нем файловую систему. `ext4` — отличный выбор по умолчанию.

```
sudo mkfs.ext4 /dev/sdb1
```

После этого раздел готов к монтированию. Информацию о монтировании смотрите в соответствующей вкладке.

### Пример сессии: создание одного раздела на весь диск

Ниже приведен полный пример команд и ответов в `fdisk` для разметки диска `/dev/sdb` с одним разделом типа "Linux filesystem" с использованием GPT.

```
$ sudo fdisk /dev/sdb
<p>Welcome to fdisk (util-linux 2.37.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.</p>
<p>Device does not contain a recognized partition table.</p>
<p>Command (m for help): g
Created a new GPT disklabel (GUID: ...).</p>
<p>Command (m for help): n
Partition number (1-128, default 1): <ENTER>
First sector (2048-..., default 2048): <ENTER>
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-..., default ...): <ENTER></p>
<p>Created a new partition 1 of type 'Linux filesystem' and of size ...</p>
<p>Command (m for help): p
Disk /dev/sdb: ... GiB, ... bytes, ... sectors
...
Disklabel type: gpt
Disk identifier: ...</p>
<p>Device      Start   End Sectors  Size Type
/dev/sdb1    2048   ...     ...  ...G Linux filesystem</p>
<p>Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.</p>
```

# Монтирование (mount)

### Монтирование локальных дисков

<span style="white-space: pre-wrap;">Для автоматического подключения диска при загрузке системы его нужно добавить в файл </span>`<span class="editor-theme-code">/etc/fstab</span>`. Используйте UUID — это уникальный идентификатор, который не изменится, в отличие от имени `/dev/sdb1`.

##### Шаг А: Создайте точку монтирования

Это папка, куда будет "подключаться" ваш раздел.

```
sudo mkdir /mnt/data
```

##### Шаг Б: Узнайте UUID вашего раздела

```
sudo blkid /dev/sdb1
```

##### Шаг В: Добавьте строку в /etc/fstab

<span style="white-space: pre-wrap;">Откройте файл </span>`<span class="editor-theme-code">/etc/fstab</span>`<span style="white-space: pre-wrap;"> в текстовом редакторе (например, `sudo nano /etc/fstab`) и добавьте в самый конец файла следующую строку, заменив UUID на полученный выше.</span>

```
# Пример строки для /etc/fstab
UUID=a1b2c3d4-e5f6-7890-1234-567890abcdef  /mnt/data  ext4  defaults,nofail  0  2
```

Краткое описание опций:

- `<span class="editor-theme-code">defaults</span>`: стандартный набор опций (чтение/запись, авто-монтирование и т.д.).
- `<span class="editor-theme-code">nofail</span>`: важная опция. Если диск будет отключен, система все равно загрузится, не ожидая его.

##### Разбор последних двух параметров: `\[dump\]` и `\[pass\]`

Две последние цифры в строке `fstab` (`0 2`) управляют резервным копированием и проверкой файловой системы при загрузке.

- **Первая цифра (`dump`)**: Управляет утилитой резервного копирования `dump`.
    - `<span class="editor-theme-code">0</span>`: Не создавать резервную копию. Это стандартное значение для 99% систем, так как `dump` редко используется в наши дни.
    - `<span class="editor-theme-code">1</span>`: Создавать резервную копию.
- **Вторая цифра (`pass` или `fsck`)**: Определяет порядок проверки файловой системы (`fsck`) при загрузке.
    - `<span class="editor-theme-code">0</span>`: Не проверять. Используется для swap-разделов, сетевых файловых систем или виртуальных ФС.
    - `<span class="editor-theme-code">1</span>`<span style="white-space: pre-wrap;">: Проверять в первую очередь. </span>**Этот параметр должен использоваться ИСКЛЮЧИТЕЛЬНО для корневого раздела (`/`).**
    - `<span class="editor-theme-code">2</span>`<span style="white-space: pre-wrap;">: Проверять во вторую очередь. Используется для </span>**всех остальных**<span style="white-space: pre-wrap;"> локальных разделов, которые вы хотите проверять при загрузке (например, `/home`, `/var`, или, как в нашем примере, `/mnt/data`).</span>

**Итог:**<span style="white-space: pre-wrap;"> Для всех дополнительных дисков и разделов с данными (не корневых) самая правильная и распространенная комбинация — </span>`<span class="editor-theme-code">0 2</span>`.

### Монтирование сетевых папок

#### 1. SAMBA (CIFS) - для Windows-сетей

Это пошаговое руководство по настройке автоматического монтирования сетевых папок Windows.

##### Шаг 1: Установка клиента

```
sudo apt update && sudo apt install -y cifs-utils
```

##### Шаг 2: Создание файла с учетными данными

Чтобы не хранить пароль в открытом виде в `/etc/fstab`, создадим отдельный защищенный файл. Это самый безопасный подход.

```
# Создаем файл
sudo nano /etc/samba/credentials
<p>#Добавляем в него 2 строки
username=your_username
password=your_password</p>
<p>#Устанавливаем права (только root сможет его читать)
sudo chmod 600 /etc/samba/credentials</p>
```

##### Шаг 3: Создание точки монтирования

Это локальная папка, в которую будет "подключен" сетевой ресурс.

```
sudo mkdir /mnt/samba
```

##### Шаг 4: Добавление записи в /etc/fstab

<span style="white-space: pre-wrap;">Откройте файл </span>`<span class="editor-theme-code">/etc/fstab</span>`<span style="white-space: pre-wrap;"> в текстовом редакторе (например, `sudo nano /etc/fstab`) и добавьте в самый конец файла следующую строку. Замените значения на свои.</span>

```
# Запись для автоматического монтирования сетевой папки SAMBA
//server-ip/share_name /mnt/samba cifs credentials=/etc/samba/credentials,nofail,uid=1000,gid=1000,vers=3.0,iocharset=utf8,file_mode=0664,dir_mode=0775 0 0
```

Описание опций CIFS:

- `<span class="editor-theme-code">credentials</span>`: Путь к файлу с логином и паролем.
- `<span class="editor-theme-code">nofail</span>`: Критически важная опция. Позволяет системе загрузиться, даже если сетевой ресурс недоступен.
- `<span class="editor-theme-code">uid=1000,gid=1000</span>`: Устанавливает владельца и группу для смонтированных файлов. `1000` обычно соответствует первому пользователю в системе. Узнать свой UID можно командой `id`.
- `<span class="editor-theme-code">vers=3.0</span>`: Версия протокола SMB. `3.0` - хороший, современный выбор.
- `<span class="editor-theme-code">iocharset=utf8</span>`: Кодировка для имен файлов, важна для поддержки кириллицы.
- `<span class="editor-theme-code">file_mode=0664,dir_mode=0775</span>`: Явно задает права для файлов и папок.

#### 2. NFS - для Linux/Unix-сетей

NFS (Network File System) — это "родной" для Linux способ организации сетевого доступа к файлам.

Установка клиента:

```
sudo apt update && sudo apt install -y nfs-common
```

##### Пример 1: Стандартное и надежное монтирование (рекомендуется)

Этот пример использует опцию `hard`, которая заставляет программу "ждать", пока сервер не ответит, что обеспечивает целостность данных. `nfsvers=4` явно указывает использовать современную версию протокола.

```
server-ip:/path/to/share /mnt/nfs nfs defaults,nofail,hard,nfsvers=4,rsize=8192,wsize=8192 0 0
```

##### Пример 2: "Мягкое" монтирование для некритичных данных

Опция `soft` позволяет программе получить ошибку, если сервер не отвечает в течение определенного времени (`timeo`). Это полезно для ресурсов, где "быстрый отказ" лучше, чем "зависание" приложения.

```
server-ip:/path/to/non-critical/share /mnt/nfs-soft nfs defaults,nofail,soft,timeo=15 0 0
```

Описание опций NFS:

- `<span class="editor-theme-code">defaults</span>`: Набор стандартных опций (`<span class="editor-theme-code">rw</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">suid</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">dev</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">exec</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">auto</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">nouser</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">async</span>`<span style="white-space: pre-wrap;">, и </span>`<span class="editor-theme-code">hard</span>`).
- `<span class="editor-theme-code">nofail</span>`: Позволяет системе загрузиться, даже если NFS-сервер недоступен.
- `<span class="editor-theme-code">hard</span>`<span style="white-space: pre-wrap;"> / </span>`<span class="editor-theme-code">soft</span>`: Поведение при недоступности сервера. `hard` (по умолчанию) - программа "зависнет", ожидая ответа. `soft` - вернет ошибку по таймауту.
- `<span class="editor-theme-code">nfsvers=4</span>`: Явно указать версию протокола NFS. Рекомендуется использовать `4` или `3`.
- `<span class="editor-theme-code">timeo=15</span>`: Таймаут в десятых долях секунды (15 = 1.5 сек). Используется с опцией `soft`.
- `<span class="editor-theme-code">rsize=8192,wsize=8192</span>`: Размер блоков для чтения/записи. Может повлиять на производительность.

# Программный RAID (mdadm)

#### 1. Установка mdadm и создание RAID

Установите утилиту и создайте массив нужного уровня. Замените `/dev/sd\[b-e\]` на ваши диски. Перед этим убедитесь, что они не содержат нужных данных.

Установка:

```
sudo apt update && sudo apt install -y mdadm
```

Пример создания RAID 1 (зеркало, 2 диска):

```
sudo mdadm --create --verbose /dev/md0 --level=1 --raid-devices=2 /dev/sdb /dev/sdc
```

Пример создания RAID 5 (мин. 3 диска):

```
sudo mdadm --create --verbose /dev/md0 --level=5 --raid-devices=3 /dev/sdb /dev/sdc /dev/sdd
```

Пример создания RAID 6 (мин. 4 диска):

```
sudo mdadm --create --verbose /dev/md0 --level=6 --raid-devices=4 /dev/sdb /dev/sdc /dev/sdd /dev/sde
```

Пример создания RAID 10 (мин. 4 диска):

```
sudo mdadm --create --verbose /dev/md0 --level=10 --raid-devices=4 /dev/sdb /dev/sdc /dev/sdd /dev/sde
```

#### 2. Настройка и автоподключение RAID

После создания массив нужно отформатировать и настроить для автозагрузки.

Шаг А: Отформатируйте RAID-массив.

```
sudo mkfs.ext4 /dev/md0
```

Шаг Б: Сохраните конфигурацию массива, чтобы он собирался при загрузке.

```
sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf
```

Шаг В: Обновите initramfs, чтобы ядро знало о RAID на раннем этапе загрузки.

```
sudo update-initramfs -u
```

Шаг Г: Добавьте массив в `/etc/fstab` для автоматического монтирования, используя его UUID.

```
# Узнаем UUID массива
sudo blkid /dev/md0
<p>#Добавляем в /etc/fstab (замените UUID и /mnt/raid)
UUID=a1b2c3d4-e5f6-7890-1234-567890abcdef  /mnt/raid  ext4  defaults,nofail,discard  0  2</p>
```

Комментарии к опциям монтирования:

- `<span class="editor-theme-code">nofail</span>`: критически важно для RAID. Если массив не соберется при загрузке, система не "зависнет" в ожидании.
- `<span class="editor-theme-code">discard</span>`: полезная опция, если ваш RAID собран на SSD-дисках. Включает поддержку TRIM для повышения производительности и долговечности.

##### Разбор последних двух параметров: `\[dump\]` и `\[pass\]`

Две последние цифры в строке `fstab` (`0 2`) управляют резервным копированием и проверкой файловой системы при загрузке.

- **Первая цифра (`dump`)**: Управляет утилитой резервного копирования `dump`.
    - `<span class="editor-theme-code">0</span>`: Не создавать резервную копию. Это стандартное значение для 99% систем, так как `dump` редко используется в наши дни.
    - `<span class="editor-theme-code">1</span>`: Создавать резервную копию.
- **Вторая цифра (`pass` или `fsck`)**: Определяет порядок проверки файловой системы (`fsck`) при загрузке.
    - `<span class="editor-theme-code">0</span>`: Не проверять. Используется для swap-разделов, сетевых файловых систем или виртуальных ФС.
    - `<span class="editor-theme-code">1</span>`<span style="white-space: pre-wrap;">: Проверять в первую очередь. </span>**Этот параметр должен использоваться ИСКЛЮЧИТЕЛЬНО для корневого раздела (`/`).**
    - `<span class="editor-theme-code">2</span>`<span style="white-space: pre-wrap;">: Проверять во вторую очередь. Используется для </span>**всех остальных**<span style="white-space: pre-wrap;"> локальных разделов, которые вы хотите проверять при загрузке (например, `/home`, `/var`, или, как в нашем примере, `/mnt/data`).</span>

**Итог:**<span style="white-space: pre-wrap;"> Для всех дополнительных дисков и разделов с данными (не корневых) самая правильная и распространенная комбинация — </span>`<span class="editor-theme-code">0 2</span>`.

# UFW Firewall

### Что такое UFW?

UFW — это "оболочка" для `iptables`, созданная для упрощения настройки брандмауэра. Она идеально подходит для защиты отдельных серверов, так как позволяет управлять правилами с помощью простых и интуитивно понятных команд, не углубляясь в сложный синтаксис `iptables`.

### Базовое управление

#### Установка

Обычно UFW уже установлен в Ubuntu, но если нет, его можно легко установить.

```
sudo apt update && sudo apt install ufw
```

#### Просмотр статуса

Показывает, активен ли брандмауэр, и список текущих правил.

```
sudo ufw status verbose
```

#### Включение / Выключение

**Важно:**<span style="white-space: pre-wrap;"> Перед первым включением убедитесь, что вы добавили правило для SSH, иначе вы потеряете доступ к серверу!</span>

```
sudo ufw enable
```

```
sudo ufw disable
```

### Управление правилами

#### Настройка правил по умолчанию

Самая безопасная стратегия — запретить все входящие соединения и разрешить все исходящие. Это базовая настройка для любого сервера.

```
sudo ufw default deny incoming
```

```
sudo ufw default allow outgoing
```

#### Разрешение подключений

Добавление правил `allow` — основная задача при настройке. Это можно делать по имени сервиса, номеру порта или IP-адресу.

Разрешить SSH (обязательно!):

```
sudo ufw allow ssh
```

Разрешить HTTP и HTTPS:

```
sudo ufw allow http
```

```
sudo ufw allow https
```

Разрешить подключение к порту 5432 по протоколу TCP:

```
sudo ufw allow 5432/tcp
```

Разрешить подключения с определенного IP-адреса:

```
sudo ufw allow from 192.168.1.100
```

Разрешить подключения с IP-адреса на конкретный порт:

```
sudo ufw allow from 192.168.1.100 to any port 22
```

#### Удаление правил

Удалить правило можно, написав его в обратном порядке, или по номеру.

Удаление по описанию:

```
sudo ufw delete allow http
```

Удаление по номеру (более удобный способ):

```
# Сначала смотрим правила с номерами
sudo ufw status numbered
<p>#Затем удаляем правило по его номеру
sudo ufw delete 1</p>
```

# Справочник по SSH

### 1. Установка и базовая настройка

#### Установка SSH-сервера (на сервере)

Для Debian/Ubuntu серверная часть SSH устанавливается пакетом `openssh-server`.

```
sudo apt update && sudo apt install -y openssh-server
```

#### Настройка и безопасность (`/etc/ssh/sshd\_config`)

<span style="white-space: pre-wrap;">Это главный конфигурационный файл SSH-сервера. После внесения изменений \*\*необходимо перезапустить службу\*\*: </span>`<span class="editor-theme-code">sudo systemctl restart sshd</span>`. Ниже приведен пример безопасной конфигурации.

```
#Порт, на котором слушает SSH. 22 - стандарт. Для безопасности рекомендуется сменить.
Port 2222
<p>#Запретить вход для пользователя root. Всегда используйте обычного пользователя с sudo.
PermitRootLogin no</p>
<p>#Максимальное количество попыток ввода пароля перед разрывом соединения.
MaxAuthTries 3</p>
<p>#Отключить аутентификацию по паролю (самый важный шаг для безопасности!).
#После этого вход будет возможен ТОЛЬКО по SSH-ключу.
PasswordAuthentication no</p>
<p>#Включить аутентификацию по ключам.
PubkeyAuthentication yes</p>
<p>#Путь к файлу с разрешенными публичными ключами.
AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2</p>
<p>#Запретить вход пользователям с пустыми паролями.
PermitEmptyPasswords no</p>
<p>#Использовать PAM (Pluggable Authentication Modules). Важно для многих систем.
UsePAM yes</p>
```

**Ситуация из жизни:**<span style="white-space: pre-wrap;"> Вы настраиваете новый сервер в интернете. Первым делом после установки ОС вы заходите по временному паролю, настраиваете `sshd\_config` как в примере, добавляете свой SSH-ключ (см. раздел 2) и перезапускаете SSH. Только после этого сервер можно считать минимально защищенным.</span>

### 2. Работа с SSH-ключами (PublicKey Authentication)

#### Шаг А: Генерация ключей (на вашем компьютере)

Эта команда создает пару ключей: приватный (`id\_rsa`), который нужно хранить в секрете, и публичный (`id\_rsa.pub`), который вы будете копировать на серверы.

```
ssh-keygen -t rsa -b 4096
```

Вам будет предложено ввести пароль для ключа. Это дополнительный слой безопасности: даже если кто-то украдет ваш приватный ключ, он не сможет им воспользоваться без пароля.

#### Шаг Б: Копирование публичного ключа на сервер

Самый простой и безопасный способ — использовать утилиту `ssh-copy-id`. Она сама создаст нужные файлы и установит правильные права доступа на сервере.

```
ssh-copy-id username@your_server_ip
```

**Ситуация из жизни:**<span style="white-space: pre-wrap;"> Вы получили доступ к новому рабочему серверу. Чтобы не вводить пароль каждый раз и повысить безопасность, вы одной этой командой прописываете свой ключ на сервере. После этого можно отключать парольную аутентификацию.</span>

### 3. Примеры подключения и использования

#### 1. Простое подключение

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

```
ssh username@your_server_ip
```

#### 2. Подключение на нестандартный порт

Используется, если вы изменили порт в `sshd\_config` для повышения безопасности.

```
ssh -p 2222 username@your_server_ip
```

#### 3. Подключение с указанием конкретного ключа

Полезно, если у вас несколько ключей для разных проектов или серверов.

```
ssh -i ~/.ssh/my_other_key username@your_server_ip
```

#### 4. Копирование файла на сервер (SCP)

Простой способ загрузить файл на удаленный сервер.

```
scp /path/to/local/file.txt username@your_server_ip:/path/to/remote/directory/
```

#### 5. Копирование папки с сервера (SCP)

Ключ `-r` (рекурсивно) позволяет скопировать целый каталог.

```
scp -r username@your_server_ip:/path/to/remote/directory /path/to/local/destination
```

#### 6. Синхронизация каталогов (rsync)

Rsync — более мощный инструмент, чем scp. Он копирует только измененные файлы, что идеально для бэкапов и развертывания сайтов.

```
rsync -avz --progress /path/to/local/project/ username@your_server_ip:/var/www/project
```

#### 7. Локальный проброс порта (доступ к удаленной БД)

Позволяет безопасно подключиться к базе данных, работающей на удаленном сервере, как будто она запущена у вас локально.

```
ssh -L 5433:localhost:5432 username@your_server_ip
```

**Ситуация из жизни:**<span style="white-space: pre-wrap;"> На сервере работает PostgreSQL на порту 5432, но доступ к нему извне закрыт брандмауэром. Эта команда "пробрасывает" удаленный порт 5432 на ваш локальный порт 5433. Теперь вы можете подключиться к `localhost:5433` вашим любимым GUI-клиентом для баз данных.</span>

#### 8. Удаленный проброс порта (показать локальный проект)

Позволяет сделать ваш локальный веб-сервер доступным через публичный IP вашего удаленного сервера.

```
ssh -R 8080:localhost:3000 username@your_server_ip
```

**Ситуация из жизни:**<span style="white-space: pre-wrap;"> Вы разработали веб-приложение на своем ноутбуке (на порту 3000) и хотите показать его коллеге. Эта команда делает так, что при обращении к `your\_server\_ip:8080` трафик будет перенаправляться на ваш ноутбук.</span>

#### 9. Использование файла конфигурации (~/.ssh/config)

Чтобы не вводить каждый раз длинные команды, можно создать файл конфигурации. Создайте файл `~/.ssh/config` и добавьте в него блок:

```
Host my-prod-server
    HostName your_server_ip
    User your_username
    Port 2222
    IdentityFile ~/.ssh/prod_key
```

После этого для подключения достаточно выполнить короткую команду:

```
ssh my-prod-server
```

#### 10. Обратный SSH-туннель (доступ к машине за NAT)

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

На домашнем ПК (за NAT) выполните:

```
ssh -R 9090:localhost:22 user_on_public_server@public_server_ip
```

Эта команда говорит: "Подключись к публичному серверу и сделай так, чтобы трафик, приходящий на его порт 9090, перенаправлялся на мой локальный 22 порт".

Теперь, находясь на публичном сервере, вы можете подключиться к своему домашнему ПК:

```
ssh -p 9090 user_on_home_pc@localhost
```

# Bash скрипты

#### Шаг 1: Создание файла скрипта

<span style="white-space: pre-wrap;">Создайте файл с расширением </span>`<span class="editor-theme-code">.sh</span>`<span style="white-space: pre-wrap;">. Первая строка всегда должна быть "shebang" — </span>`<span class="editor-theme-code">#!/bin/bash</span>`. Он указывает системе, какой интерпретатор использовать для выполнения скрипта.

```
#!/bin/bash
#Это комментарий
echo "Привет, мир!"
```

#### Шаг 2: Предоставление прав на выполнение

<span style="white-space: pre-wrap;">По умолчанию текстовый файл не является исполняемым. Используйте команду </span>`<span class="editor-theme-code">chmod +x</span>`, чтобы это исправить.

```
chmod +x my_script.sh
```

#### Шаг 3: Запуск скрипта

<span style="white-space: pre-wrap;">Для запуска укажите путь к файлу. Если вы находитесь в том же каталоге, используйте </span>`<span class="editor-theme-code">./</span>`.

```
./my_script.sh
```

### Автоматизация с помощью Cron

<span style="white-space: pre-wrap;">Cron — это планировщик задач. Для редактирования задач текущего пользователя используется команда </span>`<span class="editor-theme-code">crontab -e</span>`<span style="white-space: pre-wrap;">. Каждая строка имеет формат: </span>`<span class="editor-theme-code">МИНУТА ЧАС ДЕНЬ_МЕСЯЦА МЕСЯЦ ДЕНЬ_НЕДЕЛИ /путь/к/команде</span>`.

- `<span class="editor-theme-code">* * * * *</span>`<span style="white-space: pre-wrap;"> — Каждую минуту.</span>
- `<span class="editor-theme-code">0 * * * *</span>`<span style="white-space: pre-wrap;"> — Каждый час, в 00 минут.</span>
- `<span class="editor-theme-code">0 */4 * * *</span>`<span style="white-space: pre-wrap;"> — Каждые 4 часа.</span>
- `<span class="editor-theme-code">5 3 * * *</span>`<span style="white-space: pre-wrap;"> — Каждый день, в 3:05 ночи.</span>
- `<span class="editor-theme-code">0 4 * * 0</span>`<span style="white-space: pre-wrap;"> — Каждое воскресенье, в 4:00 утра (0 - воскресенье).</span>

Пример записи для выполнения скрипта ежедневно в 2:30 ночи:

```
30 2 * * * /home/user/scripts/backup.sh >/dev/null 2>&1
```

<span style="white-space: pre-wrap;">Часть </span>`<span class="editor-theme-code">>/dev/null 2>&1</span>`<span style="white-space: pre-wrap;"> перенаправляет весь вывод (стандартный и ошибки) в "никуда", чтобы cron не отправлял вам письма по каждому запуску.</span>

### Практические шаблоны скриптов

#### 1. Резервное копирование каталога

Создает .tar.gz архив указанного каталога с датой в имени файла. Идеально для ежедневного бэкапа сайтов или важных документов.

```
#!/bin/bash
#Каталог, который нужно архивировать
SOURCE_DIR="/var/www/my-site"
# Каталог для хранения бэкапов
BACKUP_DIR="/mnt/backups/sites"
# Имя файла бэкапа с датой
BACKUP_FILENAME="my-site_$(date +%Y-%m-%d).tar.gz"
#Создание архива
tar -czf "$BACKUP_DIR/$BACKUP_FILENAME" -C "$(dirname "$SOURCE_DIR")" "$(basename "$SOURCE_DIR")"
echo "Бэкап $BACKUP_FILENAME успешно создан."
```

#### 2. Мониторинг дискового пространства

Проверяет использование диска в указанном разделе. Если использование превышает порог, отправляет письмо на почту.

```
#!/bin/bash
#Порог в процентах
THRESHOLD=90
#Раздел для проверки
PARTITION="/"
#Email для оповещений
ADMIN_EMAIL="admin@example.com"
#Получаем текущее использование в процентах (без знака %)
CURRENT_USAGE=$(df "$PARTITION" | grep -v Filesystem | awk '{print $5}' | sed 's/%//g')
if [ "$CURRENT_USAGE" -gt "$THRESHOLD" ]; then
  echo "ВНИМАНИЕ: На сервере $(hostname) заканчивается место на диске ($PARTITION). Занято: $CURRENT_USAGE%." | mail -s "Disk Space Alert" "$ADMIN_EMAIL"
fi
```

#### 3. Проверка и перезапуск сервиса

Проверяет, активен ли указанный сервис (например, nginx). Если нет, пытается его перезапустить и отправляет уведомление.

```
#!/bin/bash
SERVICE_NAME="nginx"
ADMIN_EMAIL="admin@example.com"
if ! systemctl is-active --quiet "$SERVICE_NAME"; then
    echo "Сервис $SERVICE_NAME не активен! Попытка перезапуска..."
    systemctl restart "$SERVICE_NAME"
    sleep 2
    if systemctl is-active --quiet "$SERVICE_NAME"; then
        echo "Сервис $SERVICE_NAME успешно перезапущен." | mail -s "Service Restart: $SERVICE_NAME" "$ADMIN_EMAIL"
    else
        echo "НЕ УДАЛОСЬ перезапустить сервис $SERVICE_NAME!" | mail -s "CRITICAL: Service Down: $SERVICE_NAME" "$ADMIN_EMAIL"
    fi
fi
```

#### 4. Очистка старых лог-файлов

Находит и удаляет файлы, которые не изменялись более N дней в указанном каталоге. Помогает освободить место.

```
#!/bin/bash
#Каталог с логами
LOG_DIR="/var/log/my_app"
#Удалять файлы старше N дней
DAYS=30
find "$LOG_DIR" -type f -name "*.log" -mtime +"$DAYS" -delete
echo "Старые логи в $LOG_DIR удалены."
```

#### 5. Уведомление о смене публичного IP

Полезно для домашних серверов с динамическим IP. Скрипт проверяет текущий IP и, если он изменился с последнего запуска, отправляет новый IP на почту.

```
#!/bin/bash
#Файл для хранения последнего известного IP
IP_FILE="/home/user/.last_ip"
ADMIN_EMAIL="myemail@example.com"
#Получаем текущий IP
CURRENT_IP=$(curl -s ifconfig.me)
if [ ! -f "$IP_FILE" ]; then
    echo "$CURRENT_IP" > "$IP_FILE"
fi
LAST_IP=$(cat "$IP_FILE")
<p>if [ "$CURRENT_IP" != "$LAST_IP" ]; then
echo "Новый IP-адрес: $CURRENT_IP" | mail -s "IP Address Changed" "$ADMIN_EMAIL"
echo "$CURRENT_IP" > "$IP_FILE"
fi</p>
```

#### 6. Аудит успешных входов по SSH

Отправляет на почту список последних успешных входов по SSH. Помогает отслеживать, кто и когда заходил на сервер.

```
#!/bin/bash
ADMIN_EMAIL="security@example.com"
(echo "Последние 10 успешных входов по SSH на $(hostname):"; echo; last -n 10) | mail -s "SSH Login Audit" "$ADMIN_EMAIL"
```

#### 7. Создание "снимка" состояния системы

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

```
#!/bin/bash
SNAPSHOT_FILE="/var/log/system_snapshots.log"
{ 
    echo "====== SNAPSHOT $(date) ======";
    echo "--- Uptime & Load Average ---";
    uptime;
    echo;
    echo "--- Memory Usage (MB) ---";
    free -m;
    echo;
    echo "--- Disk Usage ---";
    df -h;
    echo "====================================\n";
} >> "$SNAPSHOT_FILE"
```

#### 8. Массовое переименование файлов

Пример: заменяет пробелы на знаки подчеркивания во всех именах файлов в текущем каталоге. Исправлено для предотвращения перезаписи существующих файлов.

```
#!/bin/bash
#Перебираем все файлы и папки в текущем каталоге
for file in *; do
    # Проверяем, есть ли пробелы в имени
    if [[ "$file" == *" "* ]]; then
        # Заменяем пробелы на подчеркивания
        new_name=$(echo "$file" | tr ' ' '_')
        # ПРОВЕРКА: не перезаписать существующий файл
        if [ ! -e "$new_name" ]; then
            mv "$file" "$new_name"
            echo "Переименовано: '$file' -> '$new_name'\n"
        else
            echo "ОШИБКА: Файл '$new_name' уже существует. Пропуск '$file'.\n"
        fi
    fi
done
```

#### 9. Безопасное уведомление об обновлениях

Вместо рискованного авто-обновления, этот скрипт проверяет наличие доступных обновлений и отправляет их список администратору на почту. Это позволяет принять взвешенное решение об обновлении вручную.

```
#!/bin/bash
ADMIN_EMAIL="admin@example.com"
#Обновляем список пакетов в тихом режиме
apt-get update > /dev/null
#Получаем список пакетов, доступных для обновления
UPGRADABLE=$(apt-get -s upgrade | awk '/^Inst/ {print $2}')
if [ -n "$UPGRADABLE" ]; then
    (echo "На сервере $(hostname) доступны следующие обновления:"; echo; echo "$UPGRADABLE") | mail -s "System Updates Available" "$ADMIN_EMAIL"
fi
```

# Мониторинг и отладка

Работа со службами мониторинга, логирование, отладка

# Journalctl - справочник

Journalctl — это утилита для работы с системным журналом <b>systemd</b>.
<br>
Она объединяет логи всех сервисов и ядра в единое хранилище, доступное через команды фильтрации.  
В отличие от классических /var/log/syslog и /var/log/messages, journalctl позволяет быстро находить ошибки, фильтровать логи по времени, сервисам, приоритетам.
  <h5>Просмотр всех логов</h5>
  <p>Простая команда для просмотра системного журнала:</p>
  <pre><code>journalctl</code></pre>
  <p>Обычно логи будут длинные, поэтому часто используют <code>-e</code> (сразу перейти к концу).</p>
  <pre><code>journalctl -e</code></pre>
  <h5>Просмотр последних событий в реальном времени</h5>
  <pre><code>journalctl -f</code></pre>
  <p>Аналогично <code>tail -f /var/log/syslog</code>. Удобно использовать при отладке сервисов.</p>
  <h5>Фильтрация по сервису</h5>
  <p>Посмотреть логи конкретного сервиса:</p>
  <pre><code>journalctl -u nginx</code></pre>
  <p>В реальном времени:</p>
  <pre><code>journalctl -u nginx -f</code></pre>
  <h5>Фильтрация по времени</h5>
  <p>Примеры:</p>
  <pre><code>journalctl --since "2025-10-01" --until "2025-10-05"   # за указанный период
journalctl --since "2 hours ago"                        # за последние 2 часа
journalctl --since yesterday                            # за вчерашний день</code></pre>
  <h5>Фильтрация по приоритетам (уровням)</h5>
  <p>Приоритеты: <b>emerg, alert, crit, err, warning, notice, info, debug</b>.</p>
  <pre><code>journalctl -p err        # только ошибки
journalctl -p warning    # предупреждения
journalctl -p info       # информационные сообщения</code></pre>
  <h5>Просмотр логов загрузки</h5>
  <pre><code>journalctl -b      # текущая загрузка
journalctl -b -1   # предыдущая загрузка
journalctl -b -2   # позапрошлая загрузка</code></pre>
  <p>Очень полезно для анализа причин падения системы или kernel panic.</p>
  <h5>Просмотр логов ядра</h5>
  <pre><code>journalctl -k             # сообщения ядра
journalctl -k -p err      # только ошибки ядра</code></pre>
  <h5>Ограничение количества строк</h5>
  <pre><code>journalctl -n 50          # последние 50 строк
journalctl -n 100 -u ssh  # последние 100 строк сервиса ssh</code></pre>
  <h5>Вывод в удобочитаемом или машинном формате</h5>
  <pre><code>journalctl -o short       # стандартный вывод
journalctl -o json-pretty # JSON-формат, удобно для анализа
journalctl -o cat         # только текст сообщения</code></pre>
  <h5>Типичные ситуации и примеры использования</h5>
  <ul>
    <li>Сервис не запускается — смотрим причину:<br>
      <code>journalctl -u имя_сервиса -xe</code>
    </li>
    <li>Отслеживание ошибок SSH-подключений:<br>
      <code>journalctl -u ssh -p err -f</code>
    </li>
    <li>Анализ падения Nginx:<br>
      <code>journalctl -u nginx --since "10 min ago"</code>
    </li>
    <li>Поиск "OOM-killer" (система убила процесс из-за нехватки памяти):<br>
      <code>journalctl -k | grep -i oom</code>
    </li>
    <li>Выяснить, кто перезагружал систему:<br>
      <code>journalctl _COMM=systemd-logind | grep "Power key pressed"</code>
    </li>
  </ul>
  <h5>Типичные ошибки и решения</h5>
  <ul>
    <li><b>Ошибка:</b> логи не сохраняются после перезагрузки.<br>
        <b>Решение:</b> включить постоянное хранение:<br>
        <pre><code>sudo mkdir -p /var/log/journal
sudo systemctl restart systemd-journald</code></pre>
    </li>
    <li><b>Ошибка:</b> слишком большой размер логов.<br>
        <b>Решение:</b> очистка и настройка лимита:<br>
        <pre><code>sudo journalctl --vacuum-time=7d      # оставить только 7 дней
sudo journalctl --vacuum-size=500M    # ограничить размер 500 МБ</code></pre>
    </li>
  </ul>
</div>

# systemctl — справочник

<p><span class="accent">Systemctl</span> — утилита для управления <strong>systemd</strong> — системой инициализации и менеджером служб в Linux. Она отвечает за запуск и контроль демонов, таймеров, точек монтирования и других компонентов, описываемых <em>unit-файлами</em>.</p>
<h5>Кратко</h5>
<p class="small">systemd управляет набором объектов: сервисами, сокетами, таймерами, монтированиями и т.д. Каждый объект описывается unit-файлом; <code>systemctl</code> — основной интерфейс для взаимодействия с этими unit'ами и с самой системой.</p>
<h4 class="section-title">Что такое <span class="accent">unit-файл</span>?</h4>
<p>Unit-файл — это конфигурационный файл, который описывает, как именно systemd должен управлять конкретным компонентом (сервисом, сокетом, таймером и т.д.). Обычно имеют расширение <code>.service</code>, <code>.socket</code>, <code>.timer</code>, <code>.mount</code>, <code>.target</code> и т.д.</p>
<p><strong>Где хранятся:</strong></p>
<ul>
  <li><code>/usr/lib/systemd/system/</code> — unit-файлы поставщика (пакетов).</li>
  <li><code>/etc/systemd/system/</code> — локальные или переопределяющие unit-файлы администратора.</li>
</ul>
<p>Пример простого unit-файла (<code>nginx.service</code>):</p>
<pre><code>
Description=A high performance web server
After=network.target
[Service]
ExecStart=/usr/sbin/nginx -g 'daemon off;'
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target </code></pre>
<p class="note"><strong>Пояснение полей:</strong>
  <ul>
    <li><code>[Unit]</code> — метаинформация и зависимости (например, <code>After=</code>).</li>
    <li><code>[Service]</code> — команды запуска/остановки, поведение при сбое (<code>Restart</code>), пользователь и окружение.</li>
    <li><code>[Install]</code> — как unit включается в target'ы (автозапуск).</li>
  </ul>
</p>
<h4 class="section-title">Базовое управление</h4>
<h5>Проверка статуса сервиса</h5>
<p>Команда показывает состояние (active/failed), PID, путь к unit-файлу и последние строки логов:</p>
<pre><code>sudo systemctl status nginx</code></pre>
<h5>Запуск / Остановка / Перезапуск</h5>
<p>Запуск вручную (не влияет на автозапуск при следующей загрузке):</p>
<pre><code>sudo systemctl start nginx</code></pre>
<p>Остановка:</p>
<pre><code>sudo systemctl stop nginx</code></pre>
<p>Перезапуск (полностью остановит, затем запустит):</p>
<pre><code>sudo systemctl restart nginx</code></pre>
<p>Перезапустить только если сервис уже запущен:</p>
<pre><code>sudo systemctl try-restart nginx</code></pre>
<p class="small">Когда использовать: перезапуск обязателен при изменении конфигурации демона, но перед этим убедитесь, что unit-файл и конфигурация корректны.</p>
<h4 class="section-title">Автозагрузка сервисов</h4>
<h5>enable / disable</h5>
<p><code>enable</code> создаёт символьные ссылки unit'а в каталогах target'ов — сервис запустится при загрузке системы. <code>disable</code> убирает эти ссылки, но не мешает ручному запуску.</p>
<pre><code>sudo systemctl enable nginx
sudo systemctl disable nginx
systemctl is-enabled nginx</code></pre>
<p class="note">Важно: <code>enable</code> не запускает сервис немедленно — для этого используйте <code>start</code> или <code>restart</code>.</p>
<h4 class="section-title">Маскирование (mask / unmask)</h4>
<p>Иногда нужно гарантированно запретить запуск сервиса — даже случайный или зависимый запуск. Для этого используется <code>mask</code>, который перенаправляет unit на <code>/dev/null</code>.</p>
<pre><code>sudo systemctl mask nginx    # сервис нельзя будет запустить ни вручную, ни зависимостями
sudo systemctl unmask nginx  # снять маску</code></pre>
<p class="danger"><strong>Когда применять <code>mask</code>:</strong>
  <ul>
    <li>Нужно полностью заблокировать конфликтующий сервис (например, запрещаем start сетевого демона, если используем другой).</li>
    <li>Убрать возможность случайного запуска устаревших, небезопасных демонов (telnet, rsh и т.п.).</li>
    <li>Тестирование: временно запрещаем сервис, чтобы проверить поведение зависимостей.</li>
  </ul>
</p>
<h4 class="section-title">Работа с изменениями unit-файлов</h4>
<p>После добавления/изменения unit-файла <strong>systemd</strong> нужно пересканировать. Это делается командой:</p>
<pre><code>sudo systemctl daemon-reload</code></pre>
<p>Дальше обычно перезапускают сервис:</p>
<pre><code>sudo systemctl restart имя_сервиса</code></pre>
<p class="small">Если забыть <code>daemon-reload</code>, systemd будет использовать старую конфигурацию, даже если файл на диске изменён.</p>
<h4 class="section-title">Targets (аналог runlevels)</h4>
<p>В systemd понятие runlevel заменено на <em>targets</em> — наборы unit'ов, которые запускаются вместе.</p>
<ul>
  <li><code>multi-user.target</code> — многопользовательский режим без графики (аналог runlevel 3).</li>
  <li><code>graphical.target</code> — графический режим (аналог runlevel 5).</li>
  <li><code>rescue.target</code> — аварийный режим.</li>
</ul>
<pre><code>systemctl get-default               # посмотреть текущую цель
sudo systemctl set-default multi-user.target  # установить дефолтную цель
sudo systemctl isolate multi-user.target     # переключиться сразу</code></pre>
<h4 class="section-title">Логи: journalctl</h4>
<p>systemd использует журнал (journald). Для просмотра логов сервиса применяют:</p>
<pre><code>journalctl -u nginx         # все логи для unit
journalctl -u nginx -f      # следить в реальном времени</code></pre>
<p class="small">Полезно сочетать с временными фильтрами: <code>--since</code>, <code>--until</code>, и с <code>-p</code> (уровень приоритета).</p>
<h4 class="section-title">Полезные команды и списки</h4>
<pre><code>systemctl list-units --type=service        # активные службы
systemctl list-unit-files --type=service     # все файлы unit (включая disabled)
systemctl is-active ssh                       # быстро узнать, активен ли сервис
systemctl list-dependencies имя_сервиса       # показать зависимости</code></pre>
<h4 class="section-title">Типичные ошибки и их решения</h4>
<h5>1) Изменил unit-файл, но изменения не применились</h5>
<pre><code>sudo systemctl daemon-reload
sudo systemctl restart имя_сервиса</code></pre> <p class="small">Обязательная последовательность: <code>daemon-reload</code> → перезапуск/старт.</p>
<h5>2) <code>Failed to start ...</code></h5>
<p>Проверяем статус и логи:</p>
<pre><code>sudo systemctl status имя_сервиса
journalctl -xeu имя_сервиса</code></pre> <p>Частые причины: ошибка в пути в <code>ExecStart</code>, неверные права, конфликт портов, отсутствующие зависимости.</p>
<h5>3) Сервис запускается вручную, но не стартует при загрузке</h5>
<pre><code>systemctl is-enabled имя_сервиса
sudo systemctl enable имя_сервиса</code></pre> <p class="note">Проверьте также, не мешают ли target'ы или маскировка, и нет ли ошибок в <code>[Install]</code> блока unit-файла (например, <code>WantedBy=</code>).</p>
<h5>4) "Unit not found"</h5>
<p>Скорее всего unit-файл отсутствует или не установлен:</p>
<pre><code>systemctl list-unit-files | grep имя_сервиса</code></pre>
<p class="small">Возможные причины: пакет не установлен, unit называется иначе, или unit расположен в нестандартном каталоге.</p>
<h5>5) Unit помечен как <code>masked</code></h5>
<pre><code>systemctl is-enabled имя_сервиса   # покажет "masked"
sudo systemctl unmask имя_сервиса</code></pre>
<h4 class="section-title">Типы unit-файлов (кратко)</h4>
<ul>
  <li><code>.service</code> — сервис/демон.</li>
  <li><code>.socket</code> — сокет-активация; может запускать .service при подключении.</li>
  <li><code>.timer</code> — периодические/отложенные задания (альтернатива cron).</li>
  <li><code>.mount</code> — описание точки монтирования.</li>
  <li><code>.target</code> — агрегатор unit'ов (аналог runlevel).</li>
</ul>
<h4 class="section-title">Короткие рекомендации (best practices)</h4>
<ul>
  <li>Редактируйте unit-файлы в <code>/etc/systemd/system/</code> (локальные переопределения не затрутся при обновлении пакета).</li>
  <li>После правок — всегда <code>daemon-reload</code>, затем <code>restart</code> или <code>try-restart</code>.</li>
  <li>Используйте <code>Restart=on-failure</code> аккуратно; логируйте причины падений (через <code>StandardOutput</code>/<code>StandardError</code> или journald).</li>
  <li>Для временной блокировки сервиса применяйте <code>mask</code>. Для обычного отключения — <code>disable</code>.</li>
</ul>
  </div>

# top и htop

<div>
  <h4>Что такое top и htop?</h4>
  <p>
    <code>top</code> и <code>htop</code> — консольные утилиты для мониторинга процессов в Linux.  
    С их помощью можно в реальном времени отслеживать загрузку процессора, использование памяти, swap, uptime и управлять процессами.  
    Разница: <b>top</b> есть по умолчанию в любой системе, <b>htop</b> удобнее и нагляднее, но может требовать установки.
  </p>

  <h5>Установка htop</h5>
  <pre><code>sudo apt install htop   # Ubuntu/Debian
sudo yum install htop   # CentOS/RHEL
sudo dnf install htop   # Fedora</code></pre>

  <h5>Запуск</h5>
  <pre><code>top
htop</code></pre>

  <h5>Навигация и команды</h5>
  <ul>
    <li><b>top:</b> <code>P</code> — сортировка по CPU, <code>M</code> — по памяти, <code>k</code> — завершить процесс, <code>q</code> — выход.</li>
    <li><b>htop:</b> стрелки — перемещение, <code>F6</code> — сортировка, <code>F9</code> — убить процесс, <code>F10</code> — выход.</li>
  </ul>

  <h5>Примеры использования</h5>
  <pre><code>top -o %MEM             # отсортировать процессы по памяти
htop -u www-data        # показать процессы пользователя www-data
top -n 1 -b > /tmp/top.txt  # вывести результат в файл (batch mode)</code></pre>

  <h5>Типичные ситуации</h5>
  <ul>
    <li>Сервер "подвисает" → проверить процессы с высокой загрузкой CPU.</li>
    <li>Падает сервис → отследить, не уходит ли в swap (<b>htop</b> показывает swap в цветах).</li>
    <li>Подозрительная активность → сортировать по PID/памяти и найти виновника.</li>
  </ul>

  <h5>Типичные ошибки и решения</h5>
  <ul>
    <li><b>Ошибка:</b> htop не найден.<br>
        <b>Решение:</b> установить через пакетный менеджер (см. выше).</li>
    <li><b>Ошибка:</b> невозможно убить процесс.<br>
        <b>Решение:</b> использовать root-права:<br>
        <pre><code>sudo kill -9 PID</code></pre>
    </li>
  </ul>
</div>

# netstat, ss и ip

<div>
  <h4>Что такое netstat, ss и ip?</h4>
  <p>
    Эти утилиты используются для диагностики сетевых подключений и маршрутов:<br>
    - <b>netstat</b> — старая утилита (в пакете net-tools).<br>
    - <b>ss</b> — современная замена netstat.<br>
    - <b>ip</b> — инструмент для управления сетевыми интерфейсами, IP-адресами и маршрутами.
  </p>

  <h5>Базовые примеры</h5>
  <pre><code>ss -tuln                # список слушающих портов
ss -tulpn | grep 5432   # найти процесс на порту 5432
ip a                    # список интерфейсов и адресов
ip r                    # таблица маршрутов
ip link show up         # активные интерфейсы
netstat -anp            # (устар.) список соединений с PID</code></pre>

  <h5>Диагностика</h5>
  <ul>
    <li>Проверить, слушает ли nginx порт 80 → <code>ss -tuln | grep :80</code></li>
    <li>Кто слушает порт 22 → <code>ss -tulpn | grep :22</code></li>
    <li>Какой маршрут до 8.8.8.8 → <code>ip route get 8.8.8.8</code></li>
    <li>Сбросить интерфейс → <code>sudo ip link set eth0 down && sudo ip link set eth0 up</code></li>
  </ul>

  <h5>Типичные ошибки</h5>
  <ul>
    <li><b>Ошибка:</b> netstat не найден.<br>
        <b>Решение:</b> установить пакет <code>net-tools</code>.</li>
    <li><b>Ошибка:</b> сервис не слушает порт.<br>
        <b>Решение:</b> проверить конфиг сервиса и firewall (<code>ufw</code>/<code>iptables</code>).</li>
  </ul>
</div>

# Netplan

```
network:
  version: 2
  renderer: networkd
  ethernets:
    enp6s18: #название интерфейса
      dhcp4: no
      dhcp6: no
      addresses:
        - 10.177.178.47/24 #IP
      nameservers:
        addresses:
          - 10.177.178.42 #DNS
      routes:
        - to: default
          via: 10.177.178.1 #Gateway
```

Конфигурация для статики. Меняем по пути /etc/netplan/имя\_конфигурации.yaml.  
<span style="white-space: pre-wrap;">После изменения применяем команду: </span>

```
sudo netplan apply
```