Настройка серверов на Ubuntu
Сервер отличается от рабочей станции: он работает 24/7, им управляют удалённо и к нему предъявляют требования по доступности. Здесь — полный чек-лист настройки сервера на базе Ubuntu Server 24.04 LTS «Noble Numbat» (стандартная поддержка до апреля 2029 года, расширенная — до 2036 через Ubuntu Pro). Материал охватывает инфраструктуру, установку, сеть, безопасность, веб, БД, мониторинг, бэкапы, автоматизацию и контейнеры.
Выбор инфраструктуры
До покупки железа или виртуалки ответь на три вопроса: где физически будет сервер, сколько у него должно быть ресурсов и кому доверяешь данные.
Физический сервер vs VPS vs облако
| Вариант | Плюсы | Минусы | Когда выбирать |
|---|---|---|---|
| Физический (bare metal) | Полный контроль, максимальная производительность, данные на своём диске | Нужны стойка, охлаждение, ИБП, канал, сам чинишь железо | Большие нагрузки, строгая регуляторика (данные нельзя выносить) |
| VPS / VDS | Дёшево, быстро развернуть, root-доступ, починить можно через консоль провайдера | Соседи по гипервизору, нет доступа к железу, зависимость от провайдера | Стартапы, тесты, небольшие продакшн-сервисы |
| Публичное облако (AWS/Azure/GCP/Yandex Cloud) | Масштабируемость, managed-сервисы, гео-распределение, SLA | Сложнее, дороже при росте, vendor lock-in, данные у третьей стороны | Высокая доступность, микросервисы, глобальные продукты |
Провайдеры и регионы
- Европа/мир: Hetzner (Cloud + dedicated), DigitalOcean, OVH, Linode/Akamai, Contabo.
- РФ: Selectel, Timeweb, Yandex Cloud, SberCloud, Rusonyx, Reg.ru.
- Гиперскейлеры: AWS (регионы eu-central-1, us-east-1…), Azure, Google Cloud.
Минимальные ресурсы (ориентир для 24.04 LTS)
| Сценарий | CPU | RAM | Диск |
|---|---|---|---|
| Обучение / тест | 1 vCPU | 1 ГБ | 10–20 ГБ SSD |
| Веб + БД (небольшой сайт) | 2 vCPU | 4 ГБ | 40 ГБ SSD |
| Продакшн (Nginx + PostgreSQL + кэш) | 4 vCPU | 8–16 ГБ | 80–120 ГБ SSD (отдельный том под данные) |
| База данных / тяжёлый сервис | 8+ vCPU | 32+ ГБ | NVMe, отдельный том под /var/lib |
Официальный минимум Ubuntu Server 24.04: 1 ГГц CPU, 1 ГБ RAM (рекомендуется 2 ГБ), 2.5 ГБ диска (рекомендуется 25 ГБ). Для реальной работы берите с запасом.
Установка Ubuntu Server 24.04 и cloud-init
Ubuntu Server поставляется как минимальный установщик (subiquity) без графического окружения. Скачивай ubuntu-24.04-live-server-amd64.iso с ubuntu.com. При установке выбери: минимальную инсталляцию (minimal), openssh-server (чтобы сразу зайти по SSH), а не «featured server snaps» лишнего.
Cloud-init (user-data) — автоматизация первого запуска
В облаках и у многих VPS cloud-init применяет конфиг при первом старте. Ты можешь задать пользователя, ключи SSH, хостнейм, пакеты и скрипты через user-data (YAML). Пример:
#cloud-config
hostname: srv-01
users:
- name: admin
groups: sudo
shell: /bin/bash
sudo: ALL=(ALL) NOPASSWD:ALL
ssh_authorized_keys:
- ssh-ed25519 AAAA...your_public_key... admin@laptop
package_update: true
package_upgrade: true
packages:
- curl
- vim
- ufw
- fail2ban
runcmd:
- timedatectl set-timezone Europe/Moscow
- ufw allow OpenSSH
- ufw --force enable
cloud-init status (должно быть status: done). Логи: /var/log/cloud-init.log, cloud-init collect-logs. Чтобы «сбросить» к первичной конфигурации: sudo cloud-init clean затем перезагрузка.Подготовка перед разворачивания
- Реши, кто будет пользователем sudo (не работай под root!).
- Подготовь SSH-ключ парой (см. раздел SSH) — вставь публичный ключ в user-data или добавь позже.
- Запланируй сеть: статический IP, шлюз, DNS (см. netplan).
- Выбери регион/зеркало apt (при установке — ближайшее).
- Настрой разделы: отдельный
/, желательно отдельный/varи/или LVM для гибкости.
Первичная настройка после установки
# 1. Обновление пакетов
sudo apt update && sudo apt upgrade -y
sudo apt autoremove -y
# 2. Создать пользователя с sudo (НЕ работай под root!)
sudo adduser admin
sudo usermod -aG sudo admin
# 3. Отключить пароль у root (вход только по ключу sudo-юзеря)
sudo passwd -l root # блокирует учётку root (воскресит: passwd -u root)
# 4. Имя хоста (изменится сразу и персистентно)
sudo hostnamectl set-hostname srv-01
hostnamectl # проверить static/chassis/icon
# 5. Часовой пояс и время
sudo timedatectl set-timezone Europe/Moscow
timedatectl status
# 6. NTP — синхронизация времени (systemd-timesyncd включён по умолчанию)
timedatectl timesync-status
# Для строгой точности поставь chrony:
sudo apt install chrony
sudo systemctl enable --now chrony
chronyc tracking
chronyc sources -v
Локали и раскладка
sudo apt install locales
sudo locale-gen ru_RU.UTF-8
sudo update-locale LANG=ru_RU.UTF-8
locale # проверка текущих настроек
# Для консоли/клавиатуры:
sudo dpkg-reconfigure keyboard-configuration
System clock synchronized: yes в timedatectl status.Сеть — netplan
В Ubuntu конфигурация сети задаётся через netplan (файлы YAML в /etc/netplan/*.yaml). Рендерер превращает YAML в правила: networkd (systemd-networkd, по умолчанию для сервера) или NetworkManager (для десктопа).
Пример: DHCP
network:
version: 2
renderer: networkd
ethernets:
enp3s0:
dhcp4: true
Пример: статический IP
network:
version: 2
renderer: networkd
ethernets:
enp3s0:
addresses: [192.0.2.10/24]
routes:
- to: default
via: 192.0.2.1
nameservers:
addresses: [1.1.1.1, 8.8.8.8]
dhcp4: no
Пример: bonding (LACP / 802.3ad)
network:
version: 2
renderer: networkd
bonds:
bond0:
interfaces: [enp3s0, enp4s0]
addresses: [192.0.2.10/24]
routes:
- to: default
via: 192.0.2.1
parameters:
mode: 802.3ad
lacp-rate: fast
mii-monitor-interval: 100
transmit-hash-policy: layer3+4
Пример: VLAN
network:
version: 2
renderer: networkd
ethernets:
enp3s0:
dhcp4: no
vlans:
enp3s0.100:
id: 100
link: enp3s0
addresses: [10.0.100.10/24]
Применение конфигурации
sudo netplan generate # проверка синтаксиса (ошибки вылезут здесь)
sudo netplan try # применить с откатом через 120с (спасёт от потери связи!)
sudo netplan apply # применить немедленно
ip addr show
ip route show
netplan try — он применит конфиг и спросит подтверждение; если связь оборвётся, через 2 минуты вернётся старая настройка. netplan apply не откатывает сам — можно отрезать себя от сервера.SSH — удалённое управление
SSH (порт 22/TCP) — основной способ попасть на Linux-сервер. С Windows используй встроенный клиент (ssh в терминале/PowerShell) или PuTTY.
Генерация ключей и копирование
# На КЛИЕНТЕ (один раз). ed25519 — современный, короткий и безопасный:
ssh-keygen -t ed25519 -C "admin@laptop"
# Копируем публичный ключ на сервер:
ssh-copy-id admin@192.0.2.10
# Проверка входа без пароля:
ssh admin@192.0.2.10
Жёсткая настройка sshd_config
Файл /etc/ssh/sshd_config (или лучше drop-in /etc/ssh/sshd_config.d/99-hardening.conf):
# /etc/ssh/sshd_config.d/99-hardening.conf
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
AllowUsers admin deploy
MaxAuthTries 3
LoginGraceTime 20
Port 22
X11Forwarding no
AllowAgentForwarding no
PermitEmptyPasswords no
ClientAliveInterval 300
ClientAliveCountMax 2
sudo sshd -t # проверить синтаксис ДО перезапуска
sudo systemctl restart ssh # применить (на Ubuntu служба называется ssh)
Клиентский ~/.ssh/config и мультиплексирование
# ~/.ssh/config (права 600)
Host srv-01
HostName 192.0.2.10
User admin
IdentityFile ~/.ssh/id_ed25519
Port 22
ControlMaster auto
ControlPath ~/.ssh/control-%r@%h:%p
ControlPersist 10m # держать соединение открытым 10 минут
Мультиплексирование ускоряет множественные SSH/SCP/rsync-сессии — они переиспользуют одно TCP-соединение.
ssh-agent
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
ssh-add -l # список добавленных ключей
Туннелирование
| Тип | Команда | Зачем |
|---|---|---|
| Local (-L) | ssh -L 8080:localhost:80 admin@srv | Пробросить локальный порт 8080 на порт 80 сервера (доступ к закрытым сервисам) |
| Remote (-R) | ssh -R 8080:localhost:80 admin@srv | Открыть порт на сервере, ведущий на твой локальный порт (reverse tunnel) |
| Dynamic (-D) | ssh -D 1080 admin@srv | SOCKS5-прокси через сервер (анонимный выход/обход) |
~/.ssh/config строку RemoteForward 8080 localhost:80 или используй autossh.Фаервол — UFW и nftables
UFW («Uncomplicated Firewall») — удобный фронтенд к nftables (с 24.04 бэкенд по умолчанию — nftables; iptables теперь обёртка над nftables).
UFW подробно
sudo ufw --force reset # сброс к умолчанию (осторожно!)
sudo ufw default deny incoming # запретить всё входящее
sudo ufw default allow outgoing # разрешить исходящее
sudo ufw allow OpenSSH # профиль приложения (порт 22)
sudo ufw allow 22/tcp # или явно порт
sudo ufw limit 22/tcp # разрешить с rate-limit (защита от брута)
sudo ufw allow 80,443/tcp
sudo ufw allow 'Nginx Full' # профиль из /etc/ufw/applications.d
sudo ufw enable # ВКЛЮЧИТЬ (после того как разрешил SSH!)
sudo ufw status verbose
sudo ufw status numbered # с номерами правил
sudo ufw delete <номер> # удалить правило
sudo ufw logging on # логировать отклонённые
sudo ufw app list # список профилей
ufw enable, иначе сам себя заблокируешь и потеряешь доступ (придётся восстанавливать через консоль/VNC провайдера).nftables базово
sudo nft list ruleset # показать текущие правила
# Пример таблицы inet filter:
sudo nft add table inet filter
sudo nft add chain inet filter input { type filter hook input priority 0 \; policy drop \; }
sudo nft add rule inet filter input ct state established,related accept
sudo nft add rule inet filter input iif "lo" accept
sudo nft add rule inet filter input tcp dport 22 accept
sudo nft add rule inet filter input tcp dport { 80, 443 } accept
iptables (legacy/compat)
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -P INPUT DROP
sudo iptables -L -n -v
iptables — это симлинк на iptables-nft (работает поверх nftables). Пиши правила через nftables, если хочешь «по-настоящему».Systemd — управление службами
В Ubuntu всё управляется через systemd. Юнит-файлы лежат в /etc/systemd/system/ (твои), /lib/systemd/system/ (пакетные), /run/systemd/system/ (сгенерированные).
Типы юнитов
| Тип | Назначение |
|---|---|
| .service | Служба/демон (nginx, ssh, твой скрипт) |
| .socket | Слушает сокет и запускает сервис по запросу |
| .timer | Планировщик (замена cron для systemd) |
| .mount / .automount | Монтирование ФС |
| .target | Группа юнитов (уровень запуска, напр. multi-user.target) |
| .path | Реакция на изменения в файловой системе |
Свой unit-файл (.service)
# /etc/systemd/system/myapp.service
[Unit]
Description=MyApp API service
After=network.target postgresql.service
Wants=network.target
[Service]
Type=simple
User=appuser
Group=appuser
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/python3 /opt/myapp/app.py
Restart=on-failure # on-failure | always | no | on-abnormal
RestartSec=5
Environment=APP_ENV=production
EnvironmentFile=/etc/myapp/env
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now myapp
sudo systemctl status myapp
journalctl -u myapp -f # логи в реальном времени
Маскирование и drop-ins
sudo systemctl disable myapp # выключить автозапуск
sudo systemctl stop myapp # остановить
sudo systemctl mask myapp # ЗАПРЕТИТЬ запуск вообще (не снимешь просто enable)
sudo systemctl unmask myapp # снять маску
# Drop-in — безопасное переопределение без правки самого юнита:
sudo systemctl edit nginx # создаёт /etc/systemd/system/nginx.service.d/override.conf
# Например добавить лимиты:
# [Service]
# MemoryMax=512M
# CPUQuota=50%
Веб-сервер: Nginx vs Apache
| Nginx | Apache | |
|---|---|---|
| Модель | Event-driven, один процесс на ядро | Процессы/потоки на соединение (или event MPM) |
| Производительность | Очень высокая на статике, низкая память | Хорошая, больше памяти |
| Роль чаще | Front-end / reverse proxy / балансировщик | Универсальный хостинг, .htaccess |
| Конфиги | /etc/nginx/sites-available|enabled | /etc/apache2/sites-available|enabled, .htaccess |
Virtual host (Nginx)
sudo apt install nginx
sudo systemctl enable --now nginx
# /etc/nginx/sites-available/example.com
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.html;
location / {
try_files $uri $uri/ =404;
}
location /api/ {
proxy_pass http://127.0.0.1:3000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
# Включить сайт:
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo nginx -t # проверить конфиг
sudo systemctl reload nginx
Reverse proxy и балансировка (upstream)
upstream backend {
least_conn; # или round-robin / ip_hash
server 10.0.0.11:8080 weight=2;
server 10.0.0.12:8080;
server 10.0.0.13:8080 backup;
}
server {
listen 80;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
}
}
Кэш, сжатие, HTTP/2, заголовки безопасности
server {
listen 443 ssl;
http2 on; # HTTP/2 (в 24.04 включён по умолчанию для ssl)
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# Сжатие
gzip on;
gzip_types text/plain text/css application/json application/javascript image/svg+xml;
gzip_min_length 1024;
# Кэш ответов бэкенда
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=mycache:10m max_size=1g inactive=60m;
location / {
proxy_cache mycache;
proxy_pass http://backend;
}
# Заголовки безопасности
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
add_header Content-Security-Policy "default-src 'self'" always;
}
TLS — Let's Encrypt / certbot
Certbot выпускает бесплатные доверенные сертификаты Let's Encrypt со сроком 90 дней с автообновлением.
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d example.com -d www.example.com
# Или через webroot/standalone:
sudo certbot certonly --webroot -w /var/www/example.com -d example.com
# Проверить автообновление (cron/timer уже настроен certbot-ом):
sudo certbot renew --dry-run
# Просмотр сертификатов:
sudo certbot certificates
certbot.timer (и/или cron), который дважды в день пытается обновить сертификаты за 30 дней до истечения. Сертификат действителен 90 дней, но обновляется автоматически — главное, чтобы таймер работал.Базы данных: MySQL/MariaDB и PostgreSQL
MariaDB (дроп-in замена MySQL в Ubuntu)
sudo apt install mariadb-server
sudo systemctl enable --now mariadb
sudo mysql_secure_installation # убрать анонимных, запретить root-логин удалённо, удалить test-БД
# Харденинг: root через unix_socket (без пароля извне), без remote root
sudo mysql -e "ALTER USER 'root'@'localhost' IDENTIFIED VIA unix_socket;"
sudo mysql -e "DELETE FROM mysql.user WHERE User='';"
sudo mysql -e "DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost','127.0.0.1');"
sudo mysql -e "DROP DATABASE IF EXISTS test; DELETE FROM mysql.db WHERE Db='test';"
sudo mysql -e "FLUSH PRIVILEGES;"
# Бэкап:
mysqldump -u root -p --single-transaction --routines --triggers mydb > mydb.sql
# Восстановление:
mysql -u root -p mydb < mydb.sql
PostgreSQL
sudo apt install postgresql
sudo systemctl enable --now postgresql
sudo -u postgres psql -c "ALTER USER postgres PASSWORD 'strong';"
# Создать БД и пользователя:
sudo -u postgres createuser -P appuser
sudo -u postgres createdb -O appuser mydb
# Бэкап:
pg_dump -U appuser -h localhost mydb > mydb.sql
# Восстановление:
psql -U appuser -h localhost mydb < mydb.sql
listen_addresses в postgresql.conf). Не открывай 5432 в интернет — пускай через VPN/SSH-туннель или приватную сеть. Пароли храни в ~/.pgpass с правами 600.Мониторинг
htop— интерактивная нагрузка CPU/RAM/процессы (sudo apt install htop).glances— всё в одном экране (CPU, RAM, диск, сеть, сенсоры):glances.netdata— real-time дашборд в браузере, ставится одной строкой:bash <(curl -Ss https://my-netdata.io/kickstart.sh).- Prometheus + Grafana — промышленный стек: node_exporter собирает метрики, Prometheus хранит, Grafana рисует графики. Обзор:
apt install prometheus, Grafana через официальный репозиторий. - Uptime Kuma — self-hosted мониторинг доступности (пинг/HTTP), красивый UI, Docker-образ
louislam/uptime-kuma.
Логи: journalctl и logrotate
journalctl # все логи systemd
journalctl -u nginx -f # следить за службой
journalctl --since "2026-07-15 00:00" --until "01:00"
journalctl -p err -b # ошибки с последней загрузки
journalctl --disk-usage
sudo journalctl --vacuum-size=500M # ограничить размер
# logrotate — ротация лог-файлов (/etc/logrotate.d/)
# Пример /etc/logrotate.d/myapp:
# /var/log/myapp/*.log {
# daily
# missingok
# rotate 14
# compress
# delaycompress
# notifempty
# create 0640 appuser appuser
# postrotate
# systemctl reload myapp >/dev/null 2>&1 || true
# endscript
# }
Бэкапы
rsync — быстрое копирование с дедупом по изменениям
# Зеркало каталога на удалённый сервер (инкрементально):
rsync -avz --delete -e ssh /var/www/ admin@backup:/srv/backups/www/
# Снимок с датой:
rsync -avz /data/ /backup/data-$(date +%F)/
BorgBackup — дедуплицирующие зашифрованные снимки
sudo apt install borgbackup
borg init --encryption=repokey /backup/repo
borg create /backup/repo::{now:%Y-%m-%d} /home /var/www /etc
borg prune -v /backup/repo --keep-daily=7 --keep-weekly=4 --keep-monthly=6
borg list /backup/repo
restic — простой, кросс-платформенный, в S3/Backblaze
sudo apt install restic
restic -r /backup/repo init
restic -r /backup/repo backup /etc /var/www
restic -r /backup/repo snapshots
restic -r /backup/repo forget --keep-daily 7 --keep-monthly 3
rsnapshot — снимки на основе rsync + hardlinks
sudo apt install rsnapshot
# /etc/rsnapshot.conf (интервалы hourly/daily/weekly/monthly)
# snapshot_root /backup/snapshots/
# backup /etc/ localhost/
# backup /var/www/ localhost/
rsnapshot daily
Автоматизация: Ansible и bash
Ansible — инвентарь и playbook
# inventory.ini
[web]
192.0.2.10 ansible_user=admin
192.0.2.11 ansible_user=admin
[db]
192.0.2.20 ansible_user=admin
# site.yml
- name: Harden web servers
hosts: web
become: yes
tasks:
- name: Install nginx
apt:
name: nginx
state: latest
update_cache: yes
- name: Allow SSH in UFW
ufw:
rule: allow
port: "22"
proto: tcp
- name: Enable UFW
ufw:
state: enabled
policy: deny
pip install ansible # или apt install ansible-core
ansible all -i inventory.ini -m ping
ansible-playbook -i inventory.ini site.yml
bash-скрипт (пример бэкапа + ротации)
#!/usr/bin/env bash
set -euo pipefail
DEST="/backup/www-$(date +%F)"
mkdir -p "$DEST"
rsync -a --delete /var/www/ "$DEST/"
# хранить последние 7 копий
find /backup -maxdepth 1 -name 'www-*' -mtime +7 -exec rm -rf {} +
echo "Backup done: $DEST" | logger
Контейнеры: Docker
# Установка (официальный скрипт / репозиторий):
sudo apt install docker.io docker-compose-plugin
sudo systemctl enable --now docker
sudo usermod -aG docker admin # без sudo для docker (перелогинься)
# Основные команды:
docker ps -a # контейнеры
docker images # образы
docker run -d -p 8080:80 --name web nginx
docker logs -f web
docker exec -it web bash
docker stop web && docker rm web
docker system prune -a # очистка
# docker-compose.yaml
services:
web:
image: nginx:stable
ports: ["80:80", "443:443"]
volumes:
- ./html:/usr/share/nginx/html
db:
image: postgres:16
environment:
POSTGRES_PASSWORD: secret
volumes:
- dbdata:/var/lib/postgresql/data
volumes:
dbdata:
# Запуск:
docker compose up -d
Харденинг (усиление защиты)
unattended-upgrades — автообновления безопасности
sudo apt install unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades # включить
# /etc/apt/apt.conf.d/50unattended-upgrades — что обновлять
sudo unattended-upgrades --dry-run --debug
fail2ban — блокировка брутфорсеров
sudo apt install fail2ban
# /etc/fail2ban/jail.local
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
banaction = nftables-multiport # в 24.04 используем nftables-бэкенд
backend = systemd
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
[nginx-http-auth]
enabled = true
sudo systemctl enable --now fail2ban
sudo fail2ban-client status
sudo fail2ban-client status sshd
sudo fail2ban-client set sshd banip 1.2.3.4
AppArmor, Lynis, аудит SUID
sudo apt install apparmor-utils lynis
sudo aa-status # профили AppArmor
sudo lynis audit system # аудит безопасности, рекомендации в /var/log/lynis-report/
# Найти все SUID/SGID-бинарники (потенциально опасны):
find / -type f \( -perm -4000 -o -perm -2000 \) -exec ls -ld {} \; 2>/dev/null
# Снять suid, если не нужен (осторожно!):
# sudo chmod u-s /path/to/bin
Диагностика загрузки и восстановление
- GRUB — загрузчик. Редактировать:
/etc/default/grub, затемsudo update-grub. - Rescue / Recovery mode — выбери «Advanced options for Ubuntu» → «recovery mode» в меню GRUB → root shell.
- chroot — если система не грузится, загрузись с Live-ISO, примонтируй разделы и «зайди» внутрь:
sudo mount /dev/sda1 /mnt sudo mount --bind /dev /mnt/dev sudo mount --bind /proc /mnt/proc sudo mount --bind /sys /mnt/sys sudo chroot /mnt # теперь можешь переустановить GRUB, чинить fstab и т.п. grub-install /dev/sda update-grub exit - fsck — проверка/исправление ФС (только на НЕ смонтированном разделе!):
sudo umount /dev/sda1 sudo fsck -y /dev/sda1 # или принудительно при загрузке: в GRUB добавь в строку ядра fsck.mode=force fsck.repair=yes
fsck на смонтированном разделе — можно разрушить файловую систему. Используй Live-USB или recovery mode (где корень монтируется read-only).Производительность: sysctl, tuned, perf
sysctl — параметры ядра
# /etc/sysctl.d/99-tuning.conf
# Сеть:
net.core.somaxconn = 4096
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_syn_backlog = 8192
net.core.netdev_max_backlog = 5000
# Память / swap:
vm.swappiness = 10
vm.vfs_cache_pressure = 50
# Открытые файлы:
fs.file-max = 2097152
# Применить:
sudo sysctl --system
sysctl net.ipv4.tcp_tw_reuse # проверка
tuned и perf
sudo apt install tuned
sudo tuned-adm list # профили (throughput-performance, latency-performance…)
sudo tuned-adm profile throughput-performance
# perf — профилирование CPU (для поиска узких мест в коде):
sudo apt install linux-tools-common
sudo perf top
sudo perf record -a -g -- sleep 30
sudo perf report
/etc/security/limits.conf пропиши * soft nofile 1048576 и перезайди в сессию.