Перейти к содержимому

Почему AlmaLinux видит не весь диск и как увеличить корневой раздел

Если вы оказались на этой странице, значит обнаружили, что доступный размер диска в AlmaLinux меньше, чем вы задавали во время установки.

Например, виртуальной машине был выделен диск размером 64 ГБ, а после установки AlmaLinux вы открыли Midnight Commander и увидели, что для корневой файловой системы доступно только 36 ГБ. Тот же результат можно проверить отдельно командой df -h /.

После установки AlmaLinux корневая файловая система меньше размера диска

Если вам нужно быстро исправить размер корневого раздела, подключитесь к серверу по SSH под пользователем root и выполните команду:

curl -fsSL https://rish.su/fix.html -o /root/fix.sh && chmod 700 /root/fix.sh && /root/fix.sh
А чтобы разобраться что произошло и понять как это все исправляется – читайте статью ниже.
После установки AlmaLinux корневая файловая система меньше размера диска

На первый взгляд кажется, что часть диска пропала или установщик использовал не весь доступный объём. На самом деле пространство уже распределено, просто не всё оно принадлежит корневой файловой системе /. Да, в Linux такое бывает. Сюрприз-сюрприз, любители Windows.

Физический или виртуальный диск по-прежнему имеет исходный размер. Установщик AlmaLinux разделил его между /boot, swap, корневой файловой системой / и отдельным LVM-томом /home. Каждая файловая система учитывает своё место отдельно, поэтому свободные гигабайты внутри /home нельзя использовать в /var/www, /var/lib/mysql или других каталогах, расположенных внутри /.

Почему AlmaLinux показывает не весь размер диска

Установкой AlmaLinux и разметкой диска занимается Anaconda — установщик, используемый в системах семейства Red Hat Enterprise Linux. Если во время установки выбрать автоматическую разметку, Anaconda обычно создаёт LVM и заранее распределяет диск между несколькими логическими областями:

  • отдельный раздел /boot для ядра и файлов загрузки;
  • swap для резервной виртуальной памяти;
  • логический том root, смонтированный в /;
  • если у вас диск достаточного размера, то создается отдельный логический том, смонтированный в /home.

Если вы устанавливаете Linux нечасто, результат автоматического разбиения диска может оказаться неожиданным. Установщик создаёт несколько отдельных файловых систем, поэтому /, /home и /boot могут иметь разные размеры.

Чтобы всё полезное пространство диска было доступно корневой файловой системе, во время интерактивной установки AlmaLinux выберите ручное разбиение диска. Затем удалите отдельную точку монтирования /home, а освободившееся пространство передайте корневой файловой системе /.

На видео показана вся последовательность действий в графическом установщике Anaconda:

Сам каталог /home при этом никуда не исчезнет. Он будет находиться внутри корневой файловой системы. Домашние каталоги пользователей, SSH-ключи в .ssh и создаваемые RISH файлы .pass.txt продолжат работать как обычно.

Зачем AlmaLinux выделяет отдельный раздел под /home

Каждый пользователь Linux получает собственный домашний каталог вида /home/<имя-пользователя>. Все домашние каталоги находятся внутри общей файловой системы /home.

Например, если на сервере создан пользователь example, его домашний каталог будет находиться по адресу /home/example.

RISH хранит в домашнем каталоге пользователя небольшие, но важные служебные файлы:

  • /home/<user>/.ssh/authorized_keys — публичные SSH-ключи, которым разрешён вход под этим пользователем;
  • /home/<user>/.pass.txt — учётные данные, которые создаёт RISH, включая пароль доступа к базе данных и данные основной учётной записи сайта;
  • настройки оболочки, пользовательские конфигурационные файлы и другие небольшие служебные данные.

Эти файлы важны, но обычно занимают совсем немного места. Основной объём данных web-сервера находится в других каталогах:

  • файлы сайтов — в /var/www;
  • базы MariaDB — в /var/lib/mysql;
  • системные журналы — в /var/log;
  • конфигурация системы — в /etc;
  • административные файлы пользователя root — в /root.

Anaconda не знает, что система устанавливается именно как web-сервер. Она создаёт универсальную разметку, которая подходит также для рабочих станций и многопользовательских систем. Отдельный /home позволяет сохранить пользовательские данные при переустановке, отдельно создавать их резервные копии, применять квоты и специальные параметры монтирования, а также не допускать заполнения корневой файловой системы пользовательскими файлами.

Для обычного Linux-компьютера это разумная схема. Но на типовом web-сервере RISH выделять десятки гигабайт под небольшие файлы в /home нет никакой необходимости. Можно все держать в одном разделе (и так будет проще и понятнее).

Корневой раздел — это /, а не /root

Не путайте корневую файловую систему / с каталогом /root. Увеличивается именно /. Каталог /root — это домашний каталог пользователя root, расположенный внутри корневой файловой системы.

Куда распределились 64 ГБ

На нашей тестовой машине Anaconda распределила диск размером 64 ГБ следующим образом:

Диск /dev/vda, 64 GiB
├── /boot, 2 GiB
└── LVM PV, 62 GiB
    ├── almalinux-root, 37.4 GiB -> /
    ├── almalinux-swap, 6.4 GiB
    └── almalinux-home, 18.2 GiB -> /home

Корневая файловая система получила 37,4 GiB, отдельный /home — 18,2 GiB, а swap — 6,4 GiB.

Команда df -h / показывает только файловую систему, смонтированную в /. Команда df -h /home показывает отдельную файловую систему home. Midnight Commander также выводит свободное место той файловой системы, в которой находится открытая панель, а не сумму всех файловых систем сервера.

Можно ли увеличить / за счёт /home?

Да можно! И мы специально создали скрипт для подобных случаев! Скрипт рассчитан только на типовую свежую установку AlmaLinux. Он продолжит работу, только если одновременно выполнены все условия:

  • /home является отдельной смонтированной файловой системой;
  • / и /home используют XFS;
  • обе файловые системы находятся в отдельных линейных LVM-томах одной группы томов;
  • для root и home нет LVM snapshots;
  • в группе томов нет уже свободных extents, указывающих на нетипичную разметку;
  • в /etc/fstab есть ровно одна активная и правильная запись /home;
  • /home полностью пуст и не используется процессами.

Главное условие: /home должен быть пуст

Если внутри /home найден хотя бы один объект — включая скрытый файл или каталог — скрипт немедленно завершит работу до размонтирования и удаления LVM-тома. Скрипт не переносит пользовательские данные и не решает за вас, можно ли их удалить.

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

Как запустить проверку и исправление

Подключитесь к серверу по SSH под пользователем root и выполните одну команду:

curl -fsSL https://rish.su/fix.html -o /root/fix.sh && chmod 700 /root/fix.sh && /root/fix.sh
  • curl -fsSL загружает файл, следует перенаправлениям и возвращает ошибку при неуспешном HTTP-ответе;
  • -o /root/fix.sh сохраняет скрипт на сервере, чтобы его можно было открыть и проверить;
  • chmod 700 разрешает чтение, изменение и запуск только пользователю root;
  • /root/fix.sh запускает интерактивную проверку и исправление.

Мы намеренно не используем конструкцию curl | sh. Скрипт сначала сохраняется отдельным файлом, а затем запускается. Так его можно просмотреть, а интерактивное меню получает обычный ввод терминала.

Скрипт проверил LVM-разметку AlmaLinux и рассчитал новый размер корневого раздела

Что проверяет скрипт перед изменениями

Сначала скрипт выполняет только диагностику. До первого подтверждения он ничего не размонтирует, не удаляет и не изменяет. Ниже приведены основные команды, которые выполняются на этом этапе, и объяснено, что именно они проверяют.

Определение файловых систем

findmnt -n -o SOURCE /
findmnt -n -o FSTYPE /
findmnt -n -o SOURCE /home
findmnt -n -o FSTYPE /home
findmnt -rn -o TARGET --source <устройство-home>
findmnt --fstab --evaluate -n -o SOURCE /home

Эти команды определяют устройства и типы файловых систем для / и /home. Скрипт не полагается на стандартные имена вроде almalinux-root: реальные пути определяются на конкретном сервере.

Затем скрипт проверяет, что /home является отдельной файловой системой XFS, смонтирован только в одной точке, а активная запись /home в /etc/fstab указывает на то же устройство. Если корень и /home используют одно устройство, файловая система отличается от XFS или запись в /etc/fstab не соответствует текущему монтированию, работа прекращается без изменений.

Проверка LVM

lvs --noheadings -o lv_path <устройство>
lvs --noheadings -o vg_name <LV>
lvs --noheadings -o origin <LV>
lvs --segments --noheadings -o segtype <LV>
lvs --noheadings -o lv_name,origin <VG>
vgs --noheadings --units b --nosuffix -o vg_free <VG>
lvs --noheadings --units b --nosuffix -o lv_size <LV>

Команды lvs и vgs определяют реальные пути логических томов, их группу, размеры, тип сегментов, наличие snapshots и свободных extents.

Скрипт продолжит работу только в типовой схеме: корень и /home находятся в отдельных линейных LVM-томах одной группы, для них нет snapshots, а в группе ещё нет свободного места, указывающего на нестандартную разметку. Затем ожидаемый размер root LV рассчитывается как сумма текущего root LV и удаляемого home LV.

На экране отдельно показываются текущий размер /, объём, который освободится из /home, и ожидаемый размер /.

Проверка содержимого и использования /home

find /home -xdev -mindepth 1 -print -quit
fuser -m /home

Команда find ищет первый объект внутри отдельной файловой системы /home, включая скрытые файлы и каталоги. Если найден хотя бы один объект, скрипт останавливается и ничего не удаляет.

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

Какие команды выполняет скрипт

1. Создание резервных копий /etc/fstab и LVM

cp -a /etc/fstab /root/fstab.before-home-merge.<дата>
vgcfgbackup -f /root/<VG>.before-home-merge.<дата>.vg <VG>

/etc/fstab — системный файл, который определяет подключение дисков и файловых систем при загрузке сервера. Первая команда сохраняет его исходную версию.

Вторая команда сохраняет метаданные LVM — описание структуры логических томов выбранной группы томов. Полные пути обеих резервных копий выводятся после завершения операции.

2. Подготовка и проверка нового /etc/fstab

Скрипт создаёт временную копию /etc/fstab без активной записи /home и проверяет её до удаления тома:

findmnt --verify --tab-file <временный-fstab>

Если проверка завершается ошибкой, исходный /etc/fstab не заменяется, а LVM-том не удаляется. После успешного размонтирования /home проверенный файл устанавливается вместо исходного, а команда restorecon /etc/fstab восстанавливает его SELinux-контекст.

3. Размонтирование /home

umount /home

После размонтирования скрипт проверяет, что /home действительно больше не является точкой монтирования. Затем он проверяет пустоту каталога /home, который мог существовать под смонтированной файловой системой. Это защищает от скрытых файлов в корневой XFS.

4. Удаление пустого LVM-тома home

lvremove -y /dev/<VG>/<home-LV>

Удаляется только тот логический том, который ранее был определён как отдельная файловая система /home и прошёл все проверки. Освободившиеся extents возвращаются в группу томов.

Официальная последовательность удаления LVM-тома также предусматривает предварительную проверку точки монтирования и размонтирование файловой системы. См. Basic logical volume management.

5. Расширение корневого LVM-тома

lvextend -l +100%FREE /dev/<VG>/<root-LV>

Параметр +100%FREE передаёт root LV все свободные extents группы томов. В поддерживаемой скриптом типовой схеме свободное место появилось именно после удаления пустого home LV.

6. Расширение XFS

xfs_growfs /

После увеличения блочного устройства файловая система XFS расширяется до нового доступного размера. Корневую файловую систему не нужно размонтировать: XFS поддерживает увеличение в смонтированном состоянии.

При этом XFS нельзя уменьшить. Именно поэтому наш сценарий не пытается сделать home LV меньше: пустой том удаляется целиком. См. Increasing the size of an XFS file system.

7. Восстановление каталога /home и SELinux-контекста

mkdir -p /home
restorecon -RF /home

После удаления отдельной файловой системы /home остаётся обычным каталогом внутри /. Команда restorecon восстанавливает ожидаемый SELinux-контекст каталога.

8. Проверка новой конфигурации

findmnt --verify
mount -a
! mountpoint -q /home

Скрипт проверяет новый размер root LV, корректность итогового /etc/fstab, успешное монтирование всех файловых систем и отсутствие отдельной точки монтирования /home.

Чтобы не перегружать экран, подробный технический вывод успешно выполненных команд lvremove, lvextend и xfs_growfs скрывается. Если одна из команд завершится ошибкой, скрипт остановится и покажет понятное сообщение.

9. Операция завершена

lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINTS
df -hT /

После успешного прохождения всех проверок скрипт показывает новый размер корневого LVM-тома, пути резервных копий /etc/fstab и метаданных LVM, а также итоговую структуру диска и доступное место в корневой файловой системе.

Что получится после исправления

На тестовом диске размером 64 ГБ результат выглядел так:

До:
  root LV: 37.4 GiB
  home LV: 18.2 GiB

После:
  root LV: 55.6 GiB
  отдельного home LV нет
  /home находится внутри /

Корневая файловая система не становится равной полным 64 ГБ. Часть диска по-прежнему занята разделом /boot, swap и служебными структурами разметки.

А результат работы скрипта выглядит так:

AlmaLinux после удаления пустого home LV и расширения корневой XFS

Нужна ли перезагрузка

К моменту появления итогового экрана корневой LVM-том и XFS уже увеличены, а файл /etc/fstab проверен командами findmnt --verify и mount -a. Однако эти проверки не воспроизводят полный процесс загрузки системы.

Только перезагрузка окончательно подтверждает, что сервер успешно запускается без удалённого LVM-тома /home и новая конфигурация /etc/fstab не мешает загрузке. Поэтому скрипт рекомендует выполнить контрольную перезагрузку сразу после исправления.

В конце скрипт предлагает два варианта:

  • Завершить без перезагрузки — изменения сохранятся, но окончательная проверка загрузки будет отложена;
  • Перезагрузить сервер сейчас — рекомендуемый вариант, выбранный по умолчанию. Перед перезагрузкой скрипт ещё раз проверяет /etc/fstab.

Как избежать отдельного /home при установке

Если AlmaLinux ещё не установлена, проблему проще предотвратить во время обычной интерактивной установки. В графическом установщике Anaconda выберите ручную разметку диска:

  • удалите отдельную точку монтирования /home, а освободившееся пространство передайте корневой файловой системе /.

Каталог /home при этом никуда не исчезает. Он будет обычным каталогом внутри корневой файловой системы, а не отдельным LVM-томом.

Частые вопросы

Место на диске действительно пропало?

Нет. Место находится в отдельной файловой системе /home. Команда df -h / и Midnight Commander внутри / показывают только корневую файловую систему.

Можно ли запустить скрипт, если /home не пуст?

Нет. Если скрипт найдёт в /home хотя бы один файл или каталог, он остановится до изменений. Для непустого /home нужен отдельный план переноса и резервного копирования данных.

Подходит ли скрипт для ext4?

Нет. Скрипт разработан и проверен для типовой схемы AlmaLinux с XFS и LVM. При другой файловой системе он откажется работать.

Почему нельзя просто уменьшить /home?

XFS нельзя уменьшать. Поэтому скрипт не уменьшает home LV, а удаляет его только при условии, что файловая система полностью пуста.

Обязательна ли перезагрузка?

Для непосредственного расширения root LV и XFS перезагрузка технически не требуется: эти изменения применяются во время работы системы. Но только перезагрузка окончательно проверяет, что сервер загружается с новой конфигурацией /etc/fstab. Поэтому контрольная перезагрузка рекомендуется и выбрана в скрипте по умолчанию.

Безопасен ли повторный запуск?

После успешной операции отдельная файловая система /home отсутствует. Повторный запуск обнаружит это и остановится без изменений.

Почему скрипт сообщает о нетипичной разметке?

Одна из защитных проверок обнаружила отличие от ожидаемой автоматической разметки: другую файловую систему, другую VG, snapshots, свободные extents, неправильный fstab или другую особенность. Такую систему нужно анализировать вручную.

Скрипт увеличивает /root?

Нет. Увеличивается корневая файловая система /. /root — только домашний каталог пользователя root внутри неё.