Я чувствую, что мне нужно переставить системные разделы для перемещения данных, ранее находящихся под корневой файловой системой, в выделенные точки монтирования. Все тома находятся в LVM, так что это относительно просто: создать новые тома, перенести в них данные, сжать корневую файловую систему, а затем смонтировать новые тома в соответствующих точках.
Проблема заключается в шаге 3, уменьшающем корневую файловую систему. Используются файловые системы ext4, поэтому поддерживается онлайн изменение размера; однако при монтировании файловые системы могут только расширяться. Чтобы сжать раздел, требуется размонтировать его, что, конечно, невозможно для корневого раздела при нормальной работе.
Кажется, что ответы в Интернете вращаются вокруг загрузки LiveCD или другого аварийного носителя, выполнения операции сжатия, а затем загрузки обратно в установленную систему. Тем не менее, рассматриваемая система является удаленной, и у меня есть доступ только через SSH. Я могу перезагрузиться, но загрузка аварийного диска и выполнение операций с консоли невозможна.
Как я могу размонтировать корневую файловую систему, поддерживая удаленный доступ к оболочке?
pivot_root
туда. Вот пример: dreamlayers.blogspot.co.uk/2012/10/running-linux-from-ram.html - это сложно, но если у вас есть тестовый бокс, чтобы попробовать его, стоит подумать.Ответы:
При решении этой проблемы информация, представленная по адресу http://www.ivarch.com/blogs/oss/2007/01/resize-a-live-root-fs-a-howto.shtml, имела ключевое значение. Однако это руководство относится к очень старой версии RHEL, и различная информация устарела.
Приведенные ниже инструкции предназначены для работы с CentOS 7, но их должно быть достаточно легко перенести в любой дистрибутив, на котором работает systemd. Все команды запускаются от имени пользователя root.
Убедитесь, что система находится в стабильном состоянии
Убедитесь, что никто не использует его, и ничего более важного не происходит. Вероятно, будет хорошей идеей прекратить предоставление сервисов, таких как httpd или ftpd, просто для того, чтобы внешние соединения не нарушали работу посередине.
Размонтировать все неиспользуемые файловые системы
Это напечатает несколько предупреждений «Target is busy» для самого корневого тома и для различных временных / системных FS. Это может быть проигнорировано на данный момент. Важно то, что файловые системы на диске не остаются подключенными, кроме самой корневой файловой системы. Проверьте это:
Если вы видите, что файловые системы на диске все еще смонтированы, значит, что-то еще работает, чего не должно быть. Проверьте, что он использует
fuser
:Сделать временный корень
Это создает очень минимальную корневую систему, которая нарушает (среди прочего) просмотр man-страниц (нет
/usr/share
), пользовательские настройки (нет/root
или/home
) и так далее. Это сделано намеренно, так как это поощрение не оставаться в такой фальсифицированной корневой системе больше, чем необходимо.На этом этапе вы также должны убедиться, что установлено все необходимое программное обеспечение, так как оно также обязательно нарушит работу менеджера пакетов. Просмотрите все шаги и убедитесь, что у вас есть необходимые исполняемые файлы.
Поворот в корень
systemd заставляет монтирование разрешать совместное использование поддерева по умолчанию (как с
mount --make-shared
), и это приводитpivot_root
к сбою. Следовательно, мы отключаем это глобально сmount --make-rprivate /
. Системные и временные файловые системы перемещаются оптом в новый корень. Это необходимо, чтобы заставить его работать вообще; сокеты для связи с systemd, между прочим, живут/run
, и поэтому нет способа заставить запущенные процессы закрыть его.Убедитесь, что удаленный доступ пережил переход
После перезапуска sshd убедитесь, что вы можете войти, открыв другой терминал и снова подключившись к машине через ssh. Если вы не можете исправить проблему, прежде чем двигаться дальше.
После того, как вы подтвердите, что вы можете подключиться снова, выйдите из оболочки, которую вы используете в данный момент, и снова подключитесь. Это позволяет оставшимся разветвленным
sshd
выходам и гарантирует, что новый не держит/oldroot
.Закройте все еще используя старый рут
Это напечатает список процессов, все еще удерживающих старый корневой каталог. В моей системе это выглядело так:
Вам нужно разобраться с каждым из этих процессов, прежде чем вы сможете размонтировать
/oldroot
. Подход грубой силы простоkill $PID
для каждого, но это может сломать вещи. Чтобы сделать это более мягко:Это создает список запущенных сервисов. Вы должны быть в состоянии сопоставить это со списком процессов
/oldroot
, выполняемых , а затем выполнитьsystemctl restart
для каждого из них. Некоторые службы отказываются входить во временный корень и переходить в состояние отказа; это на самом деле не имеет значения на данный момент.Если корневой диск, размер которого вы хотите изменить, является диском LVM, вам также может потребоваться перезапустить некоторые другие работающие службы, даже если они не отображаются в списке, созданном
fuser -vm /oldroot
. Если вы обнаружите, что не можете изменить размер диска LVM при выполнении шага 7, попробуйтеsystemctl restart systemd-udevd
.Некоторые процессы не могут быть решены с помощью простых
systemctl restart
. Для меня они включеныauditd
(который не любит быть убитым черезsystemctl
, и поэтому просто хотелkill -15
). С ними можно разобраться индивидуально.Последний процесс, который вы найдете, как правило,
systemd
сам по себе. Для этого бегиsystemctl daemon-reexec
.Как только вы закончите, таблица должна выглядеть так:
Размонтировать старый рут
На этом этапе вы можете выполнять любые необходимые вам манипуляции. Первоначальный вопрос требовал простого
resize2fs
вызова, но вы можете сделать все, что захотите; Еще один вариант использования - перенос корневой файловой системы из простого раздела в LVM / RAID / любой другой.Поверните корень назад
Это прямое изменение шага 4.
Утилизировать временный корень
Повторите шаги 5 и 6, за исключением использования
/tmp/tmproot
вместо/oldroot
. Затем:Поскольку это tmpfs, в этот момент временный корень растворяется в эфире, и его больше никогда не увидеть.
Положите вещи на свои места
Снова смонтируйте файловые системы:
На этом этапе вы также должны обновить
/etc/fstab
иgrub.cfg
в соответствии с любыми изменениями, которые вы сделали на шаге 7.Перезапустите все неисправные службы:
Разрешить общие поддеревья снова:
Запустите остановленные сервисные единицы - вы можете использовать эту единственную команду:
И вы сделали.
Большое спасибо Эндрю Вуду, который разработал эту эволюцию на RHEL4, и Стиву, который предоставил мне ссылку на первое.
источник
umount /oldroot/boot
конечно, на этапе 6). Я связываю ваш ответ с другими вопросами SE, на которые не было ответа или отрицательного ответа.umount /oldroot/boot
перед вамиumount /oldroot
mount --move
tmpfs, но это не поддерживается.telinit u
может делать то, что вы хотите./oldroot/tmp
котором я/oldroot
не мог размонтироваться , но не показывалсяfuser
и неlsof
выводился.Если вы уверены, что делаете, то есть не экспериментируете, вы можете подключиться к initrd, который является неинтерактивным и быстрым способом.
В системе на основе Debian вот как.
Смотрите код: https://github.com/szepeviktor/debian-server-tools/blob/master/debian-resizefs.sh
Есть еще один пример: https://github.com/szepeviktor/debian-server-tools/blob/master/debian-convert-ext3-ext4.sh
источник