Базовая система: локаль, время, имя, память

«Система без базовой настройки — это как человек без паспорта и часов. Вроде живёт, а кто он и когда — неизвестно. — Воланд»

Введение

Настоящее руководство настраивает фундамент сервера, на который лягут все остальные сервисы. Мы начинаем с уже работающего SSH-сервера, к которому можем подключиться пользователем uservpn и имеем права sudo (пока — без пароля, как настроено в предыдущем руководстве).

По сравнению с предыдущим документом сервер всё ещё «голый»: не установлена правильная локаль, часовой пояс, скорее всего, стандартный европейский, hostname — набор символов, выданных провайдером, а swap-файл отсутствует. На сервере с 1 ГБ оперативной памяти отсутствие swap — это как ходить по канату без страховки.

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

Входные данные: вы подключены к серверу по SSH пользователем uservpn. Команды с sudo не запрашивают пароль.


Раздел 1. Настройка локали

1.1. Что такое локаль

Локаль (locale) — набор параметров, определяющих язык, кодировку, форматирование дат, чисел и валют для программ в системе. Без правильно настроенной локали вы получите «кракозябры» в логах, некорректное отображение кириллицеских символов и проблемы с сортировкой текста.

В Ubuntu по умолчанию часто установлена одна en_US.UTF-8. Мы добавим ru_RU.UTF-8 и сделаем её основной — сервер-то наш русскоязычный.

1.2. Текущее состояние

Проверьте текущие настройки локали:

locale

Ожидаемый вывод на чистом сервере — всё значения C или en_US.UTF-8:

LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
...
LC_ALL=

Проверьте, какие локали уже сгенерированы:

locale -a

1.3. Установка пакета локалей и генерация ru_RU.UTF-8

Установите пакет локалей (если ещё не установлен) и сгенерируйте русскую локаль:

sudo apt install -y locales
sudo locale-gen ru_RU.UTF-8

Ожидаемый результат:

Generating locales (this might take a while)...
  ru_RU.UTF-8... done
Generation complete.

1.4. Установка основной локали

Настройте ru_RU.UTF-8 как системную локаль по умолчанию:

sudo update-locale LANG=ru_RU.UTF-8 LANGUAGE=ru_RU:ru LC_ALL=ru_RU.UTF-8

После этого примените изменения в текущей сессии:

export LANG=ru_RU.UTF-8
export LANGUAGE=ru_RU:ru
export LC_ALL=ru_RU.UTF-8

1.5. Проверка

Проверьте результат:

locale

Ожидаемый вывод — все значения ru_RU.UTF-8:

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

Также убедитесь, что локаль доступна в списке сгенерированных:

locale -a | grep ru_RU

Ожидаемый вывод:

ru_RU.utf8

Воланд удовлетворённо улыбнулся:
«Теперь сервер понимает, на каком языке с ним говорят. Раньше он был как иностранец, не знающий ни одного наречия. Теперь — он наш. Русский, грамотный, с правильной кодировкой. И дата будет отображаться так, как привыкли мы, а не какой-нибудь техасец.»


Раздел 2. Часовой пояс

2.1. Что такое часовой пояс, timedatectl и NTP

Часовой пояс (timezone) — правило, определяющее сдвиг местного времени относительно UTC. Серверы провайдеров часто по умолчанию стоят в UTC или Europe/London. Это неудобно: логи, cron-задачи, время создания файлов — всё будет показывать «не наше» время.

NTP (Network Time Protocol) — протокол синхронизации системных часов с серверами точного времени. Без NTP часы сервера постепенно «уплывают» — на несколько миллисекунд в сутки, но за год это накапливается до минут. Расхождение во времени ломает аутентификацию TLS, проверку сертификатов, журналы событий и работу VPN-туннелей.

Утилита timedatectl — часть systemd — управляет системным временем, часовым поясом и синхронизацией NTP. В Ubuntu 24.04 служба systemd-timesyncd уже включена по умолчанию и автоматически синхронизирует часы с серверами NTP Canonical. Настраивать NTP вручную (устанавливать chrony или ntp) на нашем сервере не нужно. В этом можно убедиться:

timedatectl show --property=NTPSynchronized --value

Ожидаемый вывод:

yes

Если вы видите yes — время уже синхронизируется. Если no — запустите службу:

sudo systemctl enable --now systemd-timesyncd

После этого проверьте статус:

timedatectl status

В строке System clock synchronized: должно быть yes:.

2.2. Проверка текущего часового пояса

timedatectl

Ожидаемый вывод (фрагмент):

               Local time: Вт 2025-04-29 10:00:00 UTC
           Universal time: Вт 2025-04-29 10:00:00 UTC
                 Time zone: UTC (UTC, +0000)

Если в строке Time zone написано UTC или что-то отличное от Europe/Moscow — меняем.

2.3. Установка часового пояса

sudo timedatectl set-timezone Europe/Moscow

2.4. Проверка

timedatectl

Ожидаемый результат:

               Local time: Вт 2025-04-29 13:00:00 MSK
           Universal time: Вт 2025-04-29 10:00:00 UTC
                 Time zone: Europe/Moscow (MSK, +0300)

Обратите внимание: местное время теперь на 3 часа впереди UTC. MSK — московское стандартное время.

Коровьев прищурился на часы:
«Время — вещь удивительная. В Амстердаме полдень, а у нас уже три часа дня. Но серверу, видите ли, всё равно — он работает и в UTC, и в MSK. Мы ставим время не ради сервера, а для нашего удобства: чтобы логи показывали, когда именно Анна зашла на сервер, а не когда солнце в Лондоне было в зените.»


Раздел 3. Hostname

3.1. Что такое hostname и зачем его менять

Hostname — имя компьютера в сети. Провайдеры обычно присваивают серверам имена вроде vps-12345 или server-abc, что ни о чём не говорит. Мы хотим осмысленное имя — psjsrv01, чтобы при входе в терминал сразу было понятно, на каком сервере вы находитесь, а не гадать по IP-адресу.

3.2. Текущее состояние

Проверьте текущее имя:

hostnamectl

Ожидаемый вывод:

 Static hostname: vps-12345
       Icon name: computer-vm
         Chassis: vm
      Machine ID: ...
         Boot ID: ...
  Virtualization: kvm
Operating System: Ubuntu 24.04 LTS
          Kernel: Linux 6.8.0-xx-generic
    Architecture: x86-64

3.3. Установка hostname

sudo hostnamectl set-hostname psjsrv01

3.4. Обновление /etc/hosts

Файл /etc/hosts связывает IP-адреса с именами. После смены hostname нужно обновить его, чтобы система могла корректно резолвить собственное имя.

Откройте текущую версию:

cat /etc/hosts

Пример содержимого:

127.0.0.1    localhost
127.0.1.1    vps-12345
::1          localhost ip6-localhost ip6-loopback

Измените строку 127.0.1.1, заменив старое hostname на psjsrv01. Выполните:

sudo sed -i 's/127\.0\.1\.1.*/127.0.1.1\tpsjsrv01/' /etc/hosts

Проверьте результат:

cat /etc/hosts

Ожидаемый результат:

127.0.0.1    localhost
127.0.1.1    psjsrv01
::1          localhost ip6-localhost ip6-loopback

3.5. Проверка

Проверьте новое имя:

hostnamectl

Ожидаемый вывод:

 Static hostname: psjsrv01

Воланд задумчиво кивнул:
«Теперь у сервера есть имя. Не какое-то "vps-12345", а настоящее — psjsrv01. Знаете, это важно — знать, как зовут того, кому вы поручаете свои тайны. Бездомные, кстати, тоже сначала дают кличку, а потом уже доверяют.»


Раздел 4. Swap-файл

4.1. Что такое swap и почему он нужен

Swap (файл подкачки) — область на диске, которую ядро Linux использует как «дополнительную оперативную память». Когда RAM заполняется, ядро перемещает наименее активные страницы памяти на диск, освобождая место для текущих задач.

На сервере с 1 ГБ RAM swap обязателен. Без него при заполнении памяти срабатывает OOM-killer (Out Of Memory killer) — механизм, который без разбора убивает процессы, потребляющие больше всего памяти. И он часто выбирает самый «жирный» процесс — вашу CMS или VPN.

Мы используем swap-файл, а не swap-раздел. Файл гибче: его можно создать, изменить размер или удалить без переразметки диска.

4.2. Создание swap-файла на 2 ГБ

Создайте файл нужного размера командой fallocate:

sudo fallocate -l 2G /swapfile

Проверьте, что файл создан:

ls -lh /swapfile

Ожидаемый вывод:

-rw-r--r-- 1 root root 2.0G ... /swapfile

4.3. Установка правильных разрешений

Swap-файл должен быть доступен только root. Иначе любой пользователь сможет прочитать его содержимое и, теоретически, извлечь чувствительные данные из памяти.

sudo chmod 600 /swapfile

Проверьте:

ls -lh /swapfile

Ожидаемый результат:

-rw------- 1 root root 2.0G ... /swapfile

4.4. Форматирование и активация

Разметьте файл как swap-область:

sudo mkswap /swapfile

Ожидаемый вывод:

Setting up swapspace version 1, size = 2 GiB (2147479552 bytes)
no label, UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Активируйте swap:

sudo swapon /swapfile

Проверьте, что swap активен:

sudo swapon --show

Ожидаемый результат:

NAME      TYPE  SIZE USED PRIO
/swapfile file   2G   0B   -2

Также проверьте через free:

free -h

В строке Swap: должны отображаться 2.0G в колонке total.

4.5. Добавление в /etc/fstab для автоматического монтирования

Swap, активированный командой swapon, пропадёт после перезагрузки. Чтобы этого не произошло, добавьте запись в /etc/fstab:

echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

Проверьте, что запись добавлена:

tail -1 /etc/fstab

Ожидаемый вывод:

/swapfile none swap sw 0 0

4.6. Настройка vm.swappiness

vm.swappiness — параметр ядра, определяющий, насколько активно система будет использовать swap. Диапазон: от 0 до 100.

Значение Поведение
0 Swap используется только при критической нехватке памяти
10 Система предпочитает RAM, но при необходимости сбрасывает фоновые данные
60 Значение по умолчанию в Ubuntu — умеренно активное использование swap
100 Агрессивный swap — всё, что можно, уходит на диск

Зачем менять значение по умолчанию? На сервере с 1 ГБ RAM и 2 ГБ swap значение 60 означает, что ядро начнёт активно сбрасывать данные на диск слишком рано. Это приведёт к тому, что даже при наличии свободной памяти часть данных окажется на медленном диске, и производительность упадёт. Значение 10 скажет ядру: «Используй RAM по максимуму, а swap — только когда совсем прижмёт». Для сервера с малым объёмом памяти это оптимальный баланс.

Установите значение:

sudo sysctl vm.swappiness=10

Проверьте:

sysctl vm.swappiness

Ожидаемый вывод:

vm.swappiness = 10

Для сохранения параметра после перезагрузки создайте конфигурационный файл:

echo 'vm.swappiness=10' | sudo tee /etc/sysctl.d/99-swappiness.conf

Проверьте:

cat /etc/sysctl.d/99-swappiness.conf

Ожидаемый вывод:

vm.swappiness=10

Воланд предупреждает:
«Swap — это не замена оперативной памяти. Это последняя линия обороны. Если ваш сервер постоянно работает с заполненным swap — это как дышать через трубочку: жив, но качество жизни… нет, вам нужен сервер с большей RAM.»


Раздел 5. Обновление пакетов системы

5.1. Зачем обновлять

После развёртывания сервера от провайдера образ может быть не первой свежести: в нём содержатся устаревшие пакеты, включая потенциальные уязвимости безопасности. Перед установкой любого ПО — обновляемся.

5.2. Обновление списков пакетов

sudo apt update

Ожидаемый вывод (фрагмент):

Hit:1 http://archive.ubuntu.com/ubuntu noble InRelease
Get:2 http://archive.ubuntu.com/ubuntu noble-updates InRelease [126 kB]
...
All packages are up to date.

5.3. Обновление установленных пакетов

sudo apt upgrade -y

Флаг -y подтверждает установку обновлений автоматически. Процесс может занять несколько минут, в зависимости от количества пакетов.

5.4. Очистка

После обновления удалите загруженные архивные файлы пакетов — они занимают место на диске, а на сервере с 60 ГБ каждый мегабайт на счету:

sudo apt autoremove -y && sudo apt autoclean

Ожидаемый результат — сообщение о количестве освобождённого места или Пакеты не требуют обновления.

Воланд, просматривая список обновлённых пакетов:
«Сорок семь обновлений. Сорок семь дыр, которые кто-то уже закрыл, пока вы читали это руководство. Сервер — как квартира: чем дольше не закрываете замки, тем больше желающих зайти без приглашения.»


Раздел 6. Итоги

На данном этапе мы имеем:

Что Статус
Локаль ru_RU.UTF-8 установлена
Часовой пояс Europe/Moscow
Hostname psjsrv01
Swap-файл 2 ГБ активен
vm.swappiness = 10
Системные пакеты обновлены

Приложение А: сводная проверка

Одной командой — проверка всех параметров:

echo "=== Hostname ===" && hostnamectl --static && \
echo "=== Часовой пояс ===" && timedatectl show --property=Timezone --value && \
echo "=== Локаль ===" && locale | head -1 && \
echo "=== Swap ===" && swapon --show --noheadings && \
echo "=== Swappiness ===" && sysctl -n vm.swappiness

Ожидаемый вывод:

=== Hostname ===
psjsrv01
=== Часовой пояс ===
Europe/Moscow
=== Локаль ===
LANG=ru_RU.UTF-8
=== Swap ===
/swapfile  file  2G  ...
=== Swappiness ===
10

Следующее руководство: настройка фаервола UFW.


Конец документа. Настроившему — порядок, забывшему swap — сюрприз от OOM-killer, пропустившему apt update — уязвимости из 2024 года.