Потрібно перенести /home на окремий LVM-том без перезавантаження та простою сервісів? Це реально. Ми зробимо «живу» міграцію за допомогою rsync, перевіримо дані, швидко перемкнемо точки монтування та підготуємо план відкату на випадок проблем. Поїхали! 🙂

Що підготуємо заздалегідь

Ми будемо працювати через термінал Linux. Знадобляться права root або sudo, вільний простір у Volume Group (VG) для нового LVM-тома, а також базові навички з управління файлами. Рекомендовано мати актуальне резервне копіювання системи — хоча ми й мігруємо без простою, підстрахуватися ніколи не зайве. Перевірте також використання диска, щоб правильно підібрати розмір нового тому.

# Огляд томів і файлових систем
lsblk -f
vgs; lvs; pvs

# Перевіряємо, чи /home це звичайна директорія, а не окремий розділ
findmnt /home

# Оцінюємо обсяг даних для нового LV
du -sh /home

Покрокова міграція /home на LVM без простою

1) Створюємо LVM-том і файлову систему

# Припустимо, ваша VG називається vg0 і ви хочете 200G під /home
sudo lvcreate -L 200G -n home vg0

# Форматуємо (ext4 приклад, підійде і xfs)
sudo mkfs.ext4 -L HOME /dev/vg0/home

# Монтуємо тимчасово
sudo mkdir -p /mnt/newhome
sudo mount -o noatime /dev/vg0/home /mnt/newhome

# Перевіряємо
df -h /mnt/newhome

2) Початкове копіювання (онлайн)

Використаємо rsync із збереженням прав, ACL і xattr, щоб не втратити налаштування доступу.

sudo rsync -aAXH --info=progress2 --numeric-ids /home/ /mnt/newhome/

3) Атомне перемикання з майже нульовою паузою

Фокус у тому, що якщо /home — звичайна директорія на кореневому розділі, ми можемо швидко перейменувати її, змонтувати новий том у «свіжу» порожню /home та зробити фінальний дельта-обмін. Відкриті дескриптори в старому /home продовжать працювати, а нові логіни потраплятимуть на новий том.

# Коротка підготовка: обмежимо створення нових сесій (необов'язково)
# Наприклад, на сервері: тимчасово забороніть нові SSH-логіни у sshd_config (optional)
# або повідомте користувачів про зміну.

# Перемикаємося
sudo mv /home /home.old
sudo mkdir /home
sudo chmod 755 /home
sudo chown root:root /home

# Монтуємо новий LVM-том у /home
sudo mount /dev/vg0/home /home

# Фінальний дельта-обмін, щоб догнати зміни
sudo rsync -aAXH --delete --numeric-ids /home.old/ /home/

4) Прописуємо постійне монтування у /etc/fstab

Рекомендується використовувати UUID для надійності.

UUID=$(blkid -s UUID -o value /dev/vg0/home)
echo "UUID=$UUID  /home  ext4  defaults,noatime  0  2" | sudo tee -a /etc/fstab

# Перевіряємо синтаксис та тестуємо монтування
sudo mount -a && echo "fstab OK" || echo "fstab FAIL"

5) Перевірка цілісності та вживання

# Порівнюємо вміст (сухий прогін)
sudo rsync -aAXHvn --delete --numeric-ids /home.old/ /home/

# Переконуємось, що ніхто не тримає старий /home.old
sudo lsof +D /home.old || true

# Перевіряємо монтування і використання
findmnt /home
df -h /home

Якщо все добре, залиште /home.old на кілька днів як резервну копію і потім видаліть, звільнивши місце.

# Коли будете готові очистити
sudo rm -rf /home.old

Альтернативні способи

Варіант з systemd-монтуванням

Замість fstab можна створити unit-файл /etc/systemd/system/home.mount, що дає контроль над порядком монтування та залежностями. Але для більшості сценаріїв fstab достатньо.

Копіювання через tar|pv|tar

Якщо не хочете rsync, можна копіювати потоком збереження атрибутів. Проте rsync зручніший для дельти.

(cd /home && sudo tar cpf - .) | pv | (cd /mnt/newhome && sudo tar xpf -)

Шифрування

Потрібне шифрування? Типова схема: LUKS на блочному пристрої → всередині LUKS створити PV/VG/LV → файлову систему. Процедура копіювання не змінюється.

GUI-спосіб (з KDE Partition Manager)

Якщо ви на Desktop і маєте встановлений KDE Partition Manager, ним можна створити LV і відформатувати його (LVM підтримується). Далі все одно знадобиться термінал Linux для rsync і швидкого перемикання /home. Кроки:

  • Відкрити KDE Partition Manager → вибрати VG → створити LV «home» потрібного розміру.
  • Створити файлову систему ext4/xfs на LV, задати мітку HOME.
  • Змонтувати LV у /mnt/newhome.
  • Повернутися до кроків з rsync і перемикання, як у розділі вище.

FAQ

Чи справді без простою?

Так, «гаряче» копіювання + швидке перейменування /home → /home.old і монтування нового /home забезпечує практично нульову паузу. Відкриті файли лишаються доступними через /home.old, нові сесії підуть у новий /home.

Що, якщо /home уже окремий розділ/том?

Тоді замість перейменування виконайте копіювання між старим і новим томами, потім перемкніть запис у fstab на новий LV і перемонтуйте. Можна тимчасово використати іншу точку монтування і зробити швидкий switchover.

ext4 чи xfs?

Обидва підходять. Для xfs: створюйте з reflink=1 за потреби клонування: mkfs.xfs -m reflink=1 /dev/vg0/home.

SELinux/ACL/атрибути?

rsync із ключами -aAXH зберігає ACL і xattr. На системах із SELinux після міграції виконайте:

sudo restorecon -RFv /home

Квоти користувачів?

Якщо використовували дискові квоти, увімкніть їх на новому /home (опції у fstab та репобудова quotа-баз).

Як підібрати розмір LV?

Оцініть du -sh /home і залиште запас 20–30%. У LVM легко розширити LV і ФС пізніше.

Що, якщо mount -a впав?

Перевірте правильність UUID, тип ФС та опції. За потреби тимчасово закоментуйте рядок у /etc/fstab, змонтуйте вручну і знову протестуйте.

План швидкого відкату

Якщо після перемикання щось пішло не так:

# 1) Повертаємо старий /home
sudo umount /home || true
sudo rm -rf /home
sudo mv /home.old /home

# 2) Прибираємо запис про новий том із /etc/fstab (або коментуємо його)
# 3) Перевіряємо
sudo mount -a
findmnt /home

# За потреби залишаємо новий LV як резерв або видаляємо
# sudo lvremove /dev/vg0/home

Порада від Kernelka

Залиште /home.old на тиждень як страховку, а ще краще — налаштуйте регулярні інкрементальні бекапи (наприклад, через systemd timers і rsync/borg). Також виміряйте навантаження на диски перед і після міграції — це підкаже, чи варто вмикати noatime, змінювати планувальник I/O або збільшити кеш. І пам’ятайте: акуратне планування економить години troubleshooting 😉

Підсумок

  • Створили LVM-том, відформатували й змонтували як /mnt/newhome.
  • Скопіювали дані rsync, швидко перемкнули /home через перейменування.
  • Зафіксували монтування у /etc/fstab і перевірили цілісність.
  • Залишили /home.old на випадок відкату й підчистили після перевірки.
  • Ознайомилися з альтернативами та планом швидкого відновлення.