Перенос CentOS 6 с LVM на диск меньшего объема

    Возникла необходимость заменить жесткий диск на сервере. Попутно было решено, что система будет переноситься не на новый 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

    Если перезагрузка прошла успешно, значит всё сделали правильно.