среда, 22 марта 2017 г.

Изменение размера корневого раздела в CentOS 7

Изменение корневого раздела (/) может быть не тривиальной задачей, если это нужно сделать бес загрузки с Live{CD/DVD/USB/etc}. Для увеличения раздела можно воспользоваться обычной resize2fs на примонтированном разделе, т.к. она уже давно поддерживает "on-line resizing". А вот для уменьшения раздела, его придётся хотя бы на время, но отмонтировать. Чтобы такое вытворить люди придумали множество интересных ухищрений, есть даже метод без единого ребута, который в исполнении моих кривых рученек чуть не запорол весь сервер. Впрочем, я всё же достиг желаемого.

Окружение

Сервер на CentOS 7, всего 2Гб ОЗУ и 300 Гб свободного места на диске. Диск побит на три раздела:
/dev/sda1 - ext2 - /boot
/dev/sda2 - LVM
/dev/sda3 - empty 300Gb

В LVM всего одна группа centos и один раздел root на 50ГБ.

Задача

Нужно уменьшить раздел root до 42Гб и добавить раздел swap в освободившееся место.

Решение

Т.к. у меня полно свободного места на sda3, я решил расширить LVM на этот раздел, добавить на него логический раздел на 50Гб и скопировать в него root. После этого можно будет загрузиться с копии root, проделать всё необходимое с основным разделом, после чего удалить копию.

За дело!

Первое что пришлось сделать - отключить на время SELinux, т.к. он не ожидает, что разделы начнут меняться.
# vim /etc/selinux/config
SELINUX=enforcing нужно заменить на SELINUX=disabled

Затем нужно перезагрузить сервер. Но можно попробовтаь переключить SELinux  в разрешающий режим
# setenforce Permissive

Также нужно отключить все активно работиющие с диском процессы.

Затем нужно увеличить размер Volume Group
# vgextend centos /dev/sda3

Создать раздел
# lvcreate -L 50G -n newroot centos

Теперь можно скопировать содержимое раздела
# dd if=/dev/centos/root of=/dev/centos/newroot bs=1M

Т.к. раздел копировался с работающей системы, то он наверняка будет с ошибками. Исправим их.
# e2fsck -f /dev/centod/newroot

Если всё прошло нормально, то можно заменить разделы местами:
# lvrename centos root oldroot
# lvrename centos newroot root

Теперь очень важно скрестить пальцы, прочитать несколько молитв и т.д. Ребут.

После загрузки можно изменять размер основного раздела. Но для начала имеет смысл убедиться в отсутствии ошибок
# e2fsck -f /dev/centos/oldroot

Теперь нужно уменьшить размер ФС, при этом её размер должен быть не больше, чем размер будущего раздела LVM. Я же сделал чуть меньше
# resize2fs /dev/centos/oldroot 40G

После этого нужно уменьшить размер раздела в LVM
# lvresize -L 42G /dev/centos/oldroot

И расширить размер ФС до LVM
# resize2fs /dev/centos/oldroot

Проверяю что получилось
# lvs
# lvdisplay
# fdisk -l

Пол дела сделано, можно снова загружаться с основного раздела
# lvrename centos root newroot
# lvrename centos oldroot root
# lvs

Если всего хорошо
# reboot

После загрузки нужно удалить лишнее
# lvremove /dev/centos/newroot
# vgreduce centos /dev/sda3
# pvremove /dev/sda3

Теперь можно создать раздел для swap
# lvcreate -n swap -l 100%FREE centos

И добавить swap в систему
# mkswap /dev/centos/swap
# echo "/dev/centos/swap swap swap defaults 0 0" >> /etc/fstab
# swapon -a

Проверяю
# cat /proc/swaps
# free

Отлично! Теперь можно обратно включить SELinux и перезагрузиться.

Однако... У меня SELinux решил заново расставить метки при загрузке (о чём выдал предупреждение в консоле), потому сервер грузился довольно долго.

Итог

Конечно это не самый "продвинутый" метод, но он для меня сработал. Я не думаю, что существует какое-нибудь универсальное решение задачи. Всегда стоит исходить из того, что имеется в распоряжении и что нужно получить.

Настройка входа SSH с авторизацией по ключам и включенным SELinux

Генерация публичного ключа

Для начала нужен ключ, по которму будет происходить авторизация. Если ещё нет ключа, то его нужно создать командой
$ ssh-keygen

Простой способ

Обнаружил, что в CentOS 7 добавли утилиту ssh-copy-id в базовый набор. Ей пользоваться немного проще.

Добавить ключ на удалённую машину server можно командой на клиентской машине
$ ssh-copy-id user@server
Где user нужное имя пользователя, а server адрес сервера.

Способ посложнее

Если же ssh-copy-id у вас нет, то можно скопировать ключ командами
$ cat ~/.ssh/id_rsa.pub | ssh user@server 'cat >> .ssh/authorized_keys'
$ ssh user@server 'chmod 600 .ssh/authorized_keys'
Где id_rsa.pub публичный ключ.

Возможные проблемы

В теории, команд выше должно быть достаточно. На практике иногда не работает.
Для начала стоит проверить права на файл $HOME/.ssh/authorized_keys, файл должен принадлежать пользователю и иметь права доступа 600.
Затем стоит проверить лог /var/log/audit/audit.log на предмет ошибок с меткой ssh_home_t. Если таковые имеются, исправить метки на удалённой машине командой
$ sudo restorecon -r -vv $HOME/.ssh

Взято отсюда