Перемещение linux системы на другой диск

Представьте, что вы купили SSD. Или захотели перенести свою установку linux на флэш-накопитель, чтобы им можно было воспользоваться где угодно. Или решили мигрировать между VPS хостингами. В общем, вам понадобилось мигрировать с одного диска на другой, так, чтобы ОС потом запустилась. Что тогда будете делать? В этой статье я продемонстрирую как это можно сделать, на примере Arch Linux системы с загрузкой через BIOS.

Шаг 1. Создать диск в виртуальной машине.

Так как данный процесс я показываю на виртуалке, покупать теробайтник не придется. В общем, вот:
new-drive-arch

Шаг 2. Разметка таблицы разделов на новом диски и их форматирование.

Дальнейшие действия будут проводиться в консоли от имени суперпользователя. Давайте для начала посмотрим текущую конфигурацию.
[root@localhost dmitriy]# ls /dev/sd*
/dev/sda /dev/sda1 /dev/sda2 /dev/sda3 /dev/sda4 /dev/sdb
[root@localhost dmitriy]# cat /etc/fstab
# UUID=2a7d7d88-0796-4097-94e6-cff95fe6616d LABEL=root
/dev/sda3 / ext4 rw,relatime,data=ordered 0 1

# UUID=f399afaa-d5a6-4b76-844e-6ebf755c6242 LABEL=var
/dev/sda2 /var ext4 rw,relatime,data=ordered 0 2

# UUID=a6dfd486-8049-430d-a162-8f995d79aa72 LABEL=home
/dev/sda4 /home ext4 rw,relatime,data=ordered 0 2

#UUID=435f27b2-094a-42f2-b167-bd431abf2956 LABEL=swap
/dev/sda1 swap swap defaults 0 0

Имеется два устройства /dev/sda и /dev/sdb. У диска sda имеется четыре раздела, в которые установлена система. Диск sdb таблицы разделов не имеет. Файл /etc/fstab был создан во время установки системы. В нем указано, как монтировать все четыре раздела. В данном случае, в первом столбце указаны разделы по имени устройства в devfs. Я не рекомендую такой вариант fstab’a поскольку в случае смены конфигурации компьютера /dev/sda может стать диском с другим именем (например, /dev/sdb), вместо указанных вами разделов будет сделана попытка примонтировать совсем другие разделы и, в итоге, система не сможет загрузиться. В этом случае, особенно будет проблематично работать с системой, установленной на флэшке. Есть два других способа указания раздела, по UUID и по LABEL и оба работают с ext2/3/4 разделами. UUID генерируется случайно, при форматировании раздела, и имеет крайне низкую вероятность коллизии. Поэтому в fstab рекомендуется указывать разделы именно по ним.
Приступим к разметке /dev/sdb.
[root@localhost dmitriy]# cfdisk /dev/sdb
В предложенном меню, выбираем dos(поскольку у нас BIOS система) и размечаем диск. Я сделал вариант попроще, чем ранее и не стал делать раздел для var.
Следующим шагом, после создание таблицы разделов, является форматирование разделов.
mkfs -t ext4 -L root /dev/sdb1
mkfs -t ext4 -L home /dev/sdb2
mkswap -L swap /dev/sdb3

Результат выполнения комманд
[root@localhost dmitriy]# mkfs -t ext4 -L root /dev/sdb1
mke2fs 1.42.13 (17-May-2015)
Creating filesystem with 786432 4k blocks and 196608 inodes
Filesystem UUID: 526c2488-bb2c-4cc9-aa81-ee838b4b968c
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912

Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done

[root@localhost dmitriy]# mkfs -t ext4 -L home /dev/sdb2
mke2fs 1.42.13 (17-May-2015)
Creating filesystem with 1048576 4k blocks and 262144 inodes
Filesystem UUID: c6b28205-018b-4281-9068-d83477c2daf3
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736

Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

[root@localhost dmitriy]# mkswap -L swap /dev/sdb3

Устанавливается пространство для swap версии 1, размер = 1023 MiB (1072689152 байт)
LABEL=swap, UUID=ad35eaee-736f-4829-85a7-f1101ca575de
Обратите внимание, что при создании раздела вам будет напечатан UUID вновь созданного раздела.

Шаг 3. Копирование файлов системы

Для начала, монтируем файловые системы откуда и куда нужно скопировать файлы в той иерархии, в которой они должны быть монтированы.
mkdir /mnt/src
mount /dev/sda3 /mnt/src
mount /dev/sda2 /mnt/src/var
mount /dev/sda4 /mnt/src/home

mkdir /mnt/dst
mount /dev/sdb1 /mnt/dst
mkdir /mnt/dst/home
mount /dev/sdb2 /mnt/dst/home

Кульминация, нужно скопировать файлы. Обратите внимание на флаги cp. -p нужен для того, чтобы файлы сохранили своих владельцев и права доступа. -r для того, чтобы файлы и папки копировались рекурсивно. -v можно опустить, но если вы его напишете, вы увидите, что копируется в данный момент.
cp -prv /mnt/src/* /mnt/dst/

Шаг 4. Привести ОС в работоспособное состояние

После копирования, нужно отредактировать /mnt/dst/etc/fstab. Если вы забыли UUID, их может подсказать программа blkid:
[root@localhost dmitriy]# blkid
/dev/sda1: LABEL="swap" UUID="435f27b2-094a-42f2-b167-bd431abf2956" TYPE="swap" PARTUUID="8a863ec7-01"
/dev/sda2: LABEL="var" UUID="f399afaa-d5a6-4b76-844e-6ebf755c6242" TYPE="ext4" PARTUUID="8a863ec7-02"
/dev/sda3: LABEL="root" UUID="2a7d7d88-0796-4097-94e6-cff95fe6616d" TYPE="ext4" PARTUUID="8a863ec7-03"
/dev/sda4: LABEL="home" UUID="a6dfd486-8049-430d-a162-8f995d79aa72" TYPE="ext4" PARTUUID="8a863ec7-04"
/dev/sdb1: LABEL="root" UUID="526c2488-bb2c-4cc9-aa81-ee838b4b968c" TYPE="ext4" PARTUUID="8de3692f-01"
/dev/sdb2: LABEL="home" UUID="c6b28205-018b-4281-9068-d83477c2daf3" TYPE="ext4" PARTUUID="8de3692f-02"
/dev/sdb3: LABEL="swap" UUID="ad35eaee-736f-4829-85a7-f1101ca575de" TYPE="swap" PARTUUID="8de3692f-03"

У меня получился такой fstab:
UUID=526c2488-bb2c-4cc9-aa81-ee838b4b968c / ext4 rw,relatime,data=ordered 0 1
UUID=c6b28205-018b-4281-9068-d83477c2daf3 /home ext4 rw,relatime,data=ordered 0 2
UUID=ad35eaee-736f-4829-85a7-f1101ca575de swap swap defaults 0 0

Дальнейшие шаги по реанимации проведем в chroot окружении, перед тем, как в него попасть, нужно примонтировать devfs, procfs и sysfs.
[root@localhost dmitriy]# mount --rbind /dev /mnt/dst/dev
[root@localhost dmitriy]# mount --rbind /proc /mnt/dst/proc
[root@localhost dmitriy]# mount --rbind /sys /mnt/dst/sys
chroot /mnt/dst

Будучи только в chroot окружении осталось только установить и скофигурировать GRUB и пересобрать initramfs. Начнем с GRUB:
[root@localhost dmitriy]# grub-install /dev/sdb
Выполняется установка для платформы i386-pc.
Установка завершена. Ошибок нет.
[root@localhost dmitriy]# grub-mkconfig -o /boot/grub/grub.cfg
Генерируется файл настройки grub …
Найден образ linux: /boot/vmlinuz-linux
Найден образ initrd: /boot/initramfs-linux.img
Found fallback initramfs image: /boot/initramfs-linux-fallback.img
завершено

initramfs, нужно пересобрать, поскольку туда попадает fstab где система на рам-диске найдет, как примонтировать корневую ФС. Этот шаг специфичен для дистрибутива. В Arch Linux, например, это делается с помощью mkinitcpio:
mkinitcpio -p linux

Результат выполнения
[root@localhost dmitriy]# mkinitcpio -p linux
==> Building image from preset: /etc/mkinitcpio.d/linux.preset: 'default'
-> -k /boot/vmlinuz-linux -c /etc/mkinitcpio.conf -g /boot/initramfs-linux.img
==> Starting build: 4.4.1-2-ARCH
-> Running build hook: [base] -> Running build hook: [udev] -> Running build hook: [autodetect] -> Running build hook: [modconf] -> Running build hook: [block] -> Running build hook: [filesystems] -> Running build hook: [keyboard] -> Running build hook: [fsck] ==> Generating module dependencies
==> Creating gzip-compressed initcpio image: /boot/initramfs-linux.img
==> Image generation successful
==> Building image from preset: /etc/mkinitcpio.d/linux.preset: 'fallback'
-> -k /boot/vmlinuz-linux -c /etc/mkinitcpio.conf -g /boot/initramfs-linux-fallback.img -S autodetect
==> Starting build: 4.4.1-2-ARCH
-> Running build hook: [base] -> Running build hook: [udev] -> Running build hook: [modconf] -> Running build hook: [block] ==> WARNING: Possibly missing firmware for module: aic94xx
==> WARNING: Possibly missing firmware for module: wd719x
-> Running build hook: [filesystems] -> Running build hook: [keyboard] -> Running build hook: [fsck] ==> Generating module dependencies
==> Creating gzip-compressed initcpio image: /boot/initramfs-linux-fallback.img
==> Image generation successful
Все, уходим, перезагружаемся с другого диска, система работает. В VirtualBox я не нашел другого способа выбрать жесткий диск для загрузки, кроме как убрать предыдущий диск или переткнуть нужный диск на номер по-младше:
new-drive-alone-arch

Итог

В других системах действия могут различаться, но данная статья показывает общую схему мероприятий, которые нужно проделать, чтобы перенести ОС на другой диск. Если разобраться в сути проделанных операций, то аналогичные действия можно проделать с любым другим линуксом.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

*