Представьте, что вы купили SSD. Или захотели перенести свою установку linux на флэш-накопитель, чтобы им можно было воспользоваться где угодно. Или решили мигрировать между VPS хостингами. В общем, вам понадобилось мигрировать с одного диска на другой, так, чтобы ОС потом запустилась. Что тогда будете делать? В этой статье я продемонстрирую как это можно сделать, на примере Arch Linux системы с загрузкой через BIOS.
Шаг 1. Создать диск в виртуальной машине.
Так как данный процесс я показываю на виртуалке, покупать теробайтник не придется. В общем, вот:
Шаг 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
Шаг 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
Итог
В других системах действия могут различаться, но данная статья показывает общую схему мероприятий, которые нужно проделать, чтобы перенести ОС на другой диск. Если разобраться в сути проделанных операций, то аналогичные действия можно проделать с любым другим линуксом.
I was looking through some of your posts on this website and I conceive this website is
really informative! Keep on posting.!