Часть 03. Базовая настройка системы
Часть 03. Базовая настройка системы: локаль, время, имя, память
«Система без базовой настройки — это как человек без паспорта и часов. Вроде живёт, а кто он и когда — неизвестно.» — Воланд
Глава 1. Настройка локали ru_RU.UTF-8
Локаль (locale) — набор параметров, определяющих язык, кодировку, формат дат и чисел. Без правильной локали в логах появятся кракозябры, а кириллица будет отображаться некорректно.
Проверяем, какая локаль установлена сейчас:
locale
Ожидаемый вывод (по умолчанию):
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
...
LC_ALL=
Генерируем русскую локаль:
sudo locale-gen ru_RU.UTF-8
Ожидаемый вывод:
Generating locales (this might take a while)...
ru_RU.UTF-8... done
Generation complete.
Устанавливаем её как основную:
sudo update-locale LANG=ru_RU.UTF-8 LANGUAGE=ru_RU:ru LC_ALL=ru_RU.UTF-8
Команда выполняется без вывода.
Применяем изменения в текущей сессии:
export LANG=ru_RU.UTF-8 LANGUAGE=ru_RU:ru LC_ALL=ru_RU.UTF-8
Проверяем результат:
locale
Ожидаемый вывод:
LANG=ru_RU.UTF-8
LANGUAGE=ru_RU:ru
LC_CTYPE="ru_RU.UTF-8"
LC_NUMERIC="ru_RU.UTF-8"
LC_TIME="ru_RU.UTF-8"
...
LC_ALL=ru_RU.UTF-8
Все переменные теперь указывают на ru_RU.UTF-8.
Воланд удовлетворённо улыбнулся:
«Теперь сервер понимает, на каком языке с ним говорят. Русский, грамотный, с правильной кодировкой. И дата будет отображаться так, как привыкли мы, а не какой-нибудь техасец.»
Глава 2. Часовой пояс и синхронизация времени
Текущее время на сервере не обязано совпадать с нашим, но для удобства анализа логов и работы планировщика лучше установить правильный часовой пояс.
Проверяем текущие настройки времени:
timedatectl
Ожидаемый вывод (пример):
Local time: Sun 2025-01-14 15:30:00 MSK
Universal time: Sun 2025-01-14 12:30:00 UTC
RTC time: Sun 2025-01-14 12:30:00
Time zone: Etc/UTC (MSK, +0300)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no
Устанавливаем московский часовой пояс:
sudo timedatectl set-timezone Europe/Moscow
Команда выполняется без вывода.
Проверяем результат:
timedatectl
Ожидаемый вывод:
Local time: Sun 2025-01-14 15:30:00 MSK
Universal time: Sun 2025-01-14 12:30:00 UTC
RTC time: Sun 2025-01-14 12:30:00
Time zone: Europe/Moscow (MSK, +0300)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no
NTP service: active — синхронизация времени через NTP включена и работает автоматически через systemd-timesyncd.
Коровьев прищурился на часы:
«Время — вещь удивительная. В Лондоне полдень, а у нас уже три часа дня. Но серверу всё равно — он работает и в UTC, и в MSK. Мы ставим время не ради сервера, а для нашего удобства: чтобы логи показывали, когда именно что-то произошло, а не когда солнце было в зените.»
Глава 3. Имя хоста (hostname)
Провайдеры часто дают серверам безликие имена вроде vps-12345. Меняем на осмысленное.
Проверяем текущее имя:
hostnamectl
Ожидаемый вывод (пример, имя может отличаться):
Static hostname: vps-12345
Icon name: computer-vm
Chassis: vm
Machine ID: xxxxxx
Boot ID: xxxxxx
Virtualization: kvm
Operating System: Ubuntu 24.04 LTS
Kernel: Linux 6.8.0-xx-generic
Architecture: x86_64
Устанавливаем новое имя хоста:
sudo hostnamectl set-hostname srv02-Helsinki
Команда выполняется без вывода.
Обновляем файл /etc/hosts, чтобы новое имя сопоставлялось с локальным адресом:
sudo sed -i 's/127\.0\.1\.1.*/127.0.1.1\tsrv02-Helsinki/' /etc/hosts
Проверяем результат:
hostnamectl
Ожидаемый вывод:
Static hostname: srv02-Helsinki
Icon name: computer-vm
...
Имя поменялось и теперь видно в приглашении командной строки.
Воланд задумчиво кивнул:
«Теперь у сервера есть имя. Не какое-то "vps-12345", а настоящее — srv02-Helsinki. Знаете, это важно — знать, как зовут того, кому вы поручаете свои секреты.»
Глава 4. Swap-файл 4 ГБ
Swap (файл подкачки) — область на диске, которую ядро Linux использует как расширение оперативной памяти. Когда RAM заканчивается, ядро вытесняет неиспользуемые страницы памяти на диск, освобождая место для активных процессов.
На сервере 2 ГБ оперативной памяти. Для базовых утилит этого хватает, но запуск Nginx, PHP-FPM и VPN может быстро исчерпать этот лимит. Без swap при заполнении RAM сработает OOM-killer (Out Of Memory killer) — он просто завершит самый крупный процесс (обычно веб-сервер или БД), чтобы спасти систему от зависания.
Swap не делает сервер быстрее — он страхует от падений. Пока данные в swap не уходят (используется немного), всё хорошо. Если swap заполняется — значит, не хватает физической памяти и пора увеличивать RAM на сервере.
Создаём swap-файл размером 4 ГБ (оптимально для системы с 2 ГБ RAM):
sudo fallocate -l 4G /swapfile
Команда выполняется без вывода.
Проверяем размер:
ls -lh /swapfile
Ожидаемый вывод:
-rw-r--r-- 1 root root 4.0G Jan 14 15:35 /swapfile
Ограничиваем права доступа — swap-файл содержит дампы памяти, в которых могут быть пароли и ключи:
sudo chmod 600 /swapfile
Форматируем файл под swap:
sudo mkswap /swapfile
Ожидаемый вывод:
Setting up swapspace version 1, size = 4 GiB (4294967296 bytes)
no label, UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Включаем swap:
sudo swapon /swapfile
Команда выполняется без вывода.
Проверяем, что swap активен:
sudo swapon --show
Ожидаемый вывод:
NAME TYPE SIZE USED PRIO
/swapfile file 4G 0B -2
Добавляем автоматическое подключение swap после перезагрузки:
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
Настраиваем параметр vm.swappiness — он определяет, насколько охотно ядро сбрасывает данные в swap. По умолчанию 60 — слишком агрессивно. Для сервера с 2 ГБ RAM оптимально 10:
echo 'vm.swappiness=10' | sudo tee /etc/sysctl.d/99-swappiness.conf
Применяем настройку без перезагрузки:
sudo sysctl vm.swappiness=10
Ожидаемый вывод:
vm.swappiness = 10
Проверяем общую картину памяти:
free -h
Ожидаемый вывод:
total used free shared buff/cache available
Mem: 1.9Gi 1.2Gi 224Mi 3.6Mi 726Mi 755Mi
Swap: 4.0Gi 13Mi 4.0Gi
Воланд предупреждает:
«Swap — это не замена оперативной памяти. Это последняя линия обороны. Если ваш сервер постоянно работает с заполненным swap — это как дышать через трубочку: жив, но качества жизни нет. Вам нужен сервер с большей RAM.»
Глава 5. Обновление системы
Образ ОС от провайдера может содержать устаревшие пакеты с известными уязвимостями. Обновляем всё:
sudo apt update
Ожидаемый вывод (сокращён):
Hit:1 http://archive.ubuntu.com/ubuntu noble InRelease
...
Reading package lists... Done
Building dependency tree... Done
Устанавливаем обновления:
sudo apt upgrade -y
Ожидаемый вывод (пример):
Reading package lists... Done
Building dependency tree... Done
...
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Если есть обновления — будут показаны пакеты для установки. После завершения чистим мусор:
sudo apt autoremove -y && sudo apt autoclean
Ожидаемый вывод:
Reading package lists... Done
Building dependency tree... Done
...
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Воланд, просматривая список обновлённых пакетов:
«Сорок сороков обновлений. Сорок сороков дыр, которые кто-то уже закрыл, пока вы читали это руководство. Сервер — как квартира: чем дольше не менять замки, тем больше желающих зайти без приглашения.»
Финал части: Резюме Воланда
| Параметр | Статус |
|---|---|
Системная локаль ru_RU.UTF-8 |
✅ |
Часовой пояс Europe/Moscow |
✅ |
| NTP-синхронизация | ✅ |
Hostname srv02-Helsinki |
✅ |
| Swap 4 ГБ | ✅ |
vm.swappiness = 10 |
✅ |
| Системные пакеты обновлены | ✅ |
Воланд подводит итог третьей части:
«Система настроена. Есть имя, есть время, есть язык, есть запас памяти на чёрный день. Теперь можно ставить защиту — фаервол. Чтобы ни одна незваная душа не прошмыгнула мимо стражи.»
Комментарии
Комментарии пока не подключены.