Перенос системи Linux на інший диск

Мають місце випадки, коли потрібно перенести всю систему на інший диск. Для прикладу,  диск почав “сипатись” або диск надто великого або малого об’єму, котрого нам не вистачає або ми не використовуємо по факту, або хочемо виправити “косяки” при попередній размітці диска на розділи. Хочу підкреслити, що мова не йде ні про який RAID1 чи тому подібне. Так от, як же все таки перенести всю систему на новий диск і не втратити при цьому всі файли, налаштування, ПО і саму роботоздатність системи? Насправді все доволі просто.

Перше, що нам потрібно, це підключити новий жорсткий диск (якщо він фізичний), або створити і додати новий такого ж розміру, або більше (або менше), якщо у нас віртуальна машина. Зрештою отримаємо наступну картину:

Як бачимо, у нас є диск /dev/sda, розміром 8Gb, який розбитий на 4 розділи, а також диск /dev/sdb на 10Gb – власне кажучи той, на котрий ми все це діло будемо переносити.
Пробіжимось по розділах диска /dev/sda:

  • sda1 – це BIOS Boot розділ розміром 1Mb – як говорить wiki,  цей розділ використовується завантажувачем GRUB для завантаження операційної системи
  • sda2 – містить завантажувальні файли (у тому числі файли завантажувача, ядро тощо)
  • sda3 – це розділ підкачки, він же swap
  • sda4 – власне кореневий розділ / з нашою системою

Далі за допомогою fdisk нам потрібно створити розділи на диску /dev/sdb але не меншого розміру, ніж зараз за фактом зайнятий.

Як працювати з fdisk я розбирав тут, тому зараз зупинятись на цьому не буду.

Отже, після всіх маніпуляцій /dev/sdb виглядає наступним чином:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Далі цих розділах потрібно створити файлові системи. Зробити це можна за допомогою утиліти mkfs:

mkfs.ext4 /dev/sdb2
mkswap /dev/sdb3
mkfs.ext4 /dev/sdb4

У мене це файлова система ext4, у вас може бути інша.

Розділ із файлами завантажувача /dev/sdb1 краще перенести з /dev/sda1 за допомогою утиліти dd. Як з нею працювати, я писав тут.

Отже, виконавши команду dd if=/dev/sda1 of=/dev/sdb1 bs=64k status='progress' отримуємо копію розділу /dev/sda1.

Майже половина шляху позаду.

Тепер потрібно змонтувати розділи /dev/sdb2 і /dev/sdb4 в якусь папку і перенести туди всі системні файли.

cd /mnt/
mkdir system_new
mkdir system_new/boot

Створимо у розділі /mnt папку system_new і в ній створимо папку boot.

В папку boot змонтуємо розділ /dev/sdb2, власне наш розділ /boot і за допомогою rsync перенесемо туди всі файли нашого робочого boot-розділу /dev/sda2:

mount /dev/sdb2 /mnt/system_new/boot

rsync -aAXpv /boot/* --progress /mnt/system_new/boot/

Після цього маємо наступну картину:

 

 

Тепер монтуємо розділ /dev/sdb4 в папку /mnt/system_new та копіюємо в нього файли за допомогою rsync.

mount /dev/sdb4 /mnt/system_new/
rsync -aAXv --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*"} / /mnt/system_new/

Крім цього, потрібно змонтувати в наші /mnt/system_new такі каталоги, як /proc, /sys, /dev. Зробити це можна за допомогою опції --bind команди mount:

mount --bind /proc /mnt/system_new/proc
mount --bind /sys /mnt/system_new/sys
mount --bind /dev /mnt/system_new/dev

Тепер потрібно відредагувати файл /mnt/system_new/etc/fstab, у якому знаходяться опції монтування розділів. Ми повинні вказати нові розділи UUID диска /dev/sdb, які монтуватимуться під час завантаження системи.
Переглянути UUID розділів можна за допомогою команди blkid. В результаті отримаємо ось таку картину:

Нас цікавлять UUID розділів /dev/sdb2 - /boot, /dev-sdb3 - swap, /dev/sdb4 - /.

Відкриваємо на редагування файл /mnt/systen_new/etc/fstab та змінюємо UUID для розділів /, /boot и swap
nano /mnt/systen_new/etc/fstab

Після редагування виглядає так:

 

 

 

 

 

 

 

 

 

Далі за допомогою chroot нам потрібно змінити кореневий каталог, щоб мати доступ до файлів, що знаходяться лише у ньому. Докладніше про chroot можна почитати тут. Для нас кореневим каталогом буде директорія /mnt/system_new, тому що в ній знаходяться всі файли нової ОС.

chroot /mnt/system_new/

Тепер потрібно встановити завантажувач grub на диск /dev/sdb:

grub-install /dev/sdb

Після цього оновимо ще конфігурацію grub:

update-grub

і на цьому все, ми пройшли всі кола монтування та копіювання. Хоча ні =)
Потрібно відмонтувати все, що раніше змонтували:

Для цього виходимо з chroot командою exit і пишемо:

umount /mnt/system_new/proc
umount /mnt/system_new/sys
umount /mnt/system_new/dev
umount /mnt/system_new/boot
umount /mnt/system_new

Вимикаємо систему shutdown -P now, витягуємо або відключаємо фізичний диск зі старою системою або прибираємо диск у налаштуваннях віртуальної машини і знову запускаємо систему.

Після завантаження системи (якщо все зробили правильно), можемо спостерігати таку картину:

 

 

 

 

 

 

 

 

 

 

 

 

 

Як бачимо, тепер у нас лише диск на 10Gb, на який ми успішно перенесли систему. Оскільки він єдиний у системі, він став /dev/sda.
Вітаю з успішним перенесенням системи =)