Возникла необходимость заменить жесткий диск на сервере. Попутно было решено, что система будет переноситься не на новый HDD, а на SSD, но меньшего объема.
Исходный жестки диск имеет объем 500Gb и вполне типичную разметку - /boot, расположенный на sda1 и раздел sdb2 с LVM и разделами /, /home и swap внутри. Целевой SSD имеет объем 480Gb, в системе определился, как sdb.
# fdisk -l
Disk /dev/sda: 500.1 GB, 500107862016 bytes
255 heads, 63 sectors/track, 60801 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0a2f0a2e
Device Boot Start End Blocks Id System
/dev/sda1 * 1 64 512000 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 64 60802 487873536 8e Linux LVM
Disk /dev/sdb: 480.1 GB, 480103981056 bytes
255 heads, 63 sectors/track, 58369 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xd457e3d5
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 1024M 0 rom
sda 8:0 0 465.8G 0 disk
├─sda1 8:1 0 500M 0 part /boot
└─sda2 8:2 0 465.3G 0 part
├─vg_centos1-lv_root (dm-0) 253:0 0 50G 0 lvm /
├─vg_centos1-lv_swap (dm-1) 253:1 0 4G 0 lvm [SWAP]
└─vg_centos1-lv_home (dm-2) 253:2 0 411.3G 0 lvm /home
Разбиваем sdb аналогичным образом:
# fdisk /dev/sdb
Вводим команды
n – создать новый раздел
p – тип раздела primary
1 – номер раздела
Далее указываем сектор, с которого необходимо начать разметку или просто нажимаем Enter
Далее указываем конечный сектор или просто размер раздела, я указал +500M
Создаем второй раздел
n – создать новый раздел
p – тип раздела primary
2 – номер раздела
Далее указываем сектор, с которого необходимо начать разметку или просто нажимаем Enter
Далее указываем конечный сектор или просто размер раздела, я указал +400G
Проверяем, нажимаем p:
Command (m for help): p
Disk /dev/sdb: 480.1 GB, 480103981056 bytes
255 heads, 63 sectors/track, 58369 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xd457e3d5
Device Boot Start End Blocks Id System
/dev/sdb1 1 65 522081 83 Linux
/dev/sdb2 66 52283 419441085 83 Linux
Часть диска оставляем не размеченной, это необходимо для обеспечения резервной области SSD.
Если всё устраивает, нажимаем
w – записать изменения,
q – выйти.
В итоге, получилось вот так:
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 1024M 0 rom
sda 8:0 0 465.8G 0 disk
├─sda1 8:1 0 500M 0 part /boot
└─sda2 8:2 0 465.3G 0 part
├─vg_centos1-lv_root (dm-0) 253:0 0 50G 0 lvm /
├─vg_centos1-lv_swap (dm-1) 253:1 0 4G 0 lvm [SWAP]
└─vg_centos1-lv_home (dm-2) 253:2 0 411.3G 0 lvm /home
sdb 8:16 0 447.1G 0 disk
├─sdb1 8:17 0 509.9M 0 part
└─sdb2 8:18 0 400G 0 part
Создадим файловую систему на sdb1, аналогичную sda1
# mkfs.ext4 /dev/sdb1
Теперь переносим раздел /boot с sda1 в sdb1
Монтируем sdb1 в /mnt
# mount /dev/sdb1 /mnt/
Копируем данные с сохранением всех атрибутов
# cp -aT /boot/ /mnt/
После переноса данных размонтируем разделы
# umount /dev/sdb1
# umount /dev/sda1
В fstab необходимо заменить UUID раздела sda1 на sdb1. Узнать UUID раздела sdb1 можно командой
# blkid /dev/sdb1
dev/sdb1: UUID="d6ab10b5-5584-42d9-a223-86d987745aec" TYPE="ext4"
Копируем UUID и правим /etc/fstab. Я сделал вот так:
/dev/mapper/vg_centos1-lv_root / ext4 defaults 1 1
#UUID=793897c8-7ecc-404c-b33d-cfee77616185 /boot ext4 defaults 1 2
UUID=d6ab10b5-5584-42d9-a223-86d987745aec /boot ext4 defaults 1 2
/dev/mapper/vg_centos1-lv_home /home ext4 defaults 1 2
/dev/mapper/vg_centos1-lv_swap swap swap defaults 0 0
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
Монтируем /boot и проверяем
# mount /boot
# mount
/dev/mapper/vg_centos1-lv_root on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
/dev/mapper/vg_centos1-lv_home on /home type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
/dev/sdb1 on /boot type ext4 (rw)
Готово.
Теперь устанавливаем grub на SSD.
# grub-install /dev/sdb
Инициализируем sdb2 для LVM
# pvcreate /dev/sdb2
Добавляем новый том в volume group (группа томов) старого диска. Для этого понадобится название volume group, его можно посмотреть командой:
# vgdisplay
--- Volume group ---
VG Name vg_centos1
…
Добавляем новый том в vg_centos1
# vgextend vg_centos1 /dev/sdb2
Перенесем логические томы /dev/vg_centos1/lv_root и /dev/vg_centos1/lv_swap с физического тома HDD sda2 на физический том SSD sdb2
# screen
# pvmove -v -i5 -n /dev/mapper/vg_centos1-lv_root /dev/sda2 /dev/sdb2
# pvmove -v -i5 -n /dev/mapper/vg_centos1-lv_swap /dev/sda2 /dev/sdb2
Логический том /dev/vg_centos1/lv_home переместить таким образом не получится, т.к. раздел на HDD занимает больше месте, чем есть на SSD. Для переноса на SSD создадим новый логический том меньшего размера и уже на него перенесем все данные. Можно сделать и другим способом – уменьшить размер файловой системы, а затем и логического тома lv_home, но это дополнительный риск повредить файловую систему, также, после этих изменений желательно будет перезагрузить сервер, а я этого лишний раз делать не хочу.
Создадим новый логический том размером 300Gb для нового раздела /home
# lvcreate -L300G -n home2 vg_centos1 /dev/sdb2
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 1024M 0 rom
sda 8:0 0 465.8G 0 disk
├─sda1 8:1 0 500M 0 part
└─sda2 8:2 0 465.3G 0 part
└─vg_centos1-lv_home (dm-2) 253:2 0 411.3G 0 lvm /home
sdb 8:16 0 447.1G 0 disk
├─sdb1 8:17 0 509.9M 0 part /boot
└─sdb2 8:18 0 400G 0 part
├─vg_centos1-lv_root (dm-0) 253:0 0 50G 0 lvm /
├─vg_centos1-lv_swap (dm-1) 253:1 0 4G 0 lvm [SWAP]
└─vg_centos1-home2 (dm-3) 253:3 0 300G 0 lvm
Готово.
Создаем файловую систему на новом логическом томе:
# mkfs.ext4 /dev/vg_centos1/home2
Новый раздел /home меньше старого, нужно убедиться, что на новом разделе хватит места для файлов.
# df -lh
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_centos1-lv_root
50G 39G 8.0G 83% /
tmpfs 2.0G 0 2.0G 0% /dev/shm
/dev/mapper/vg_centos1-lv_home
405G 165G 220G 43% /home
/dev/sdb1 486M 117M 345M 26% /boot
/dev/mapper/vg_centos1-home2
296G 63M 281G 1% /mnt
Занято 165Gb, места хватает.
Теперь нужно отмонтировать или перевести в режим только для чтения раздел /home. Для этого нужно остановить все службы, которые сейчас используют этот раздел. Посмотреть это можно с помощью программы fuser:
# fuser -v -m /home/
USER PID ACCESS COMMAND
/home/: iredadmin 15201 ..c.. httpd
В моем случае это Apache, т.е. сервис httpd, останавливаем его.
# service httpd stop
Перемонтируем раздел /home в режим только для чтения.
# mount -o remount,ro /home
Монтируем home2 в /mnt и копируем данные
# mount /dev/vg_centos1/home2 /mnt/
# cp -aT /home/ /mnt/
По завершении копирования отмонтируем разделы.
# umount /mnt/
# umount /home/
Теперь переименовываем логические томы.
# lvrename /dev/vg_centos1/lv_home /dev/vg_centos1/lv_home_old
# lvrename /dev/vg_centos1/home2 /dev/vg_centos1/lv_home
Монитруем раздел /home и запускаем Apache
# mount /home/
# service httpd start
Проверяем.
# df -lh
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_centos1-lv_root
50G 40G 7.4G 85% /
tmpfs 2.0G 0 2.0G 0% /dev/shm
/dev/sdb1 486M 117M 345M 26% /boot
/dev/mapper/vg_centos1-lv_home
296G 168G 114G 60% /home
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 1024M 0 rom
sda 8:0 0 465.8G 0 disk
├─sda1 8:1 0 500M 0 part
└─sda2 8:2 0 465.3G 0 part
└─vg_centos1-lv_home_old (dm-2) 253:2 0 411.3G 0 lvm
sdb 8:16 0 447.1G 0 disk
├─sdb1 8:17 0 509.9M 0 part /boot
└─sdb2 8:18 0 400G 0 part
├─vg_centos1-lv_root (dm-0) 253:0 0 50G 0 lvm /
├─vg_centos1-lv_swap (dm-1) 253:1 0 4G 0 lvm [SWAP]
└─vg_centos1-lv_home (dm-3) 253:3 0 300G 0 lvm /home
Готово. Теперь нужно вывести sda2 из группы томов и удалить на нем физический том. Для этого нужно отключить vg_centos1-lv_home_old.
# lvremove /dev/vg_centos1/lv_home_old
# vgreduce vg_centos1 /dev/sda2
# pvremove /dev/sda2
Готово.
У нас ещё осталось 46Gb свободного места в группе томов на sdb2, увеличим корневой раздел.
Расширяем логический том на всё доступное пространство
# lvextend -l +100%FREE /dev/vg_centos1/lv_root /dev/sdb2
Расширяем файловую систему:
# resize2fs /dev/vg_centos1/lv_root
Проверяем
# df -lh
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_centos1-lv_root
95G 38G 53G 42% /
tmpfs 2.0G 0 2.0G 0% /dev/shm
/dev/sdb1 486M 117M 345M 26% /boot
/dev/mapper/vg_centos1-lv_home
296G 168G 113G 60% /home
Для выхода из screen жмем:
Ctrl+A
k
y
Контрольная перезагрузка.
# reboot
Если перезагрузка прошла успешно, значит всё сделали правильно.