Мають місце випадки, коли потрібно перенести всю систему на інший диск. Для прикладу, диск почав “сипатись” або диск надто великого або малого об’єму, котрого нам не вистачає або ми не використовуємо по факту, або хочемо виправити “косяки” при попередній размітці диска на розділи. Хочу підкреслити, що мова не йде ні про який RAID1 чи тому подібне. Так от, як же все таки перенести всю систему на новий диск і не втратити при цьому всі файли, налаштування, ПО і саму роботоздатність системи? Насправді все доволі просто.
Перше, що нам потрібно, це підключити новий жорсткий диск (якщо він фізичний), або створити і додати новий такого ж розміру, або більше (або менше), якщо у нас віртуальна машина. Зрештою отримаємо наступну картину:
Як бачимо, у нас є диск /dev/sda, розміром 8Gb, який розбитий на 4 розділи, а також диск /dev/sdb на 10Gb – власне кажучи той, на котрий ми все це діло будемо переносити.
Пробіжимось по розділах диска /dev/sda:
sda1
– це BIOS Boot розділ розміром 1Mb – як говорить wiki, цей розділ використовується завантажувачем GRUB для завантаження операційної системиsda2
– містить завантажувальні файли (у тому числі файли завантажувача, ядро тощо)sda3
– це розділ підкачки, він же swapsda4
– власне кореневий розділ / з нашою системою
Далі за допомогою 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
.
Вітаю з успішним перенесенням системи =)