Как перенести linux на другой диск
Перейти к содержимому

Как перенести linux на другой диск

  • автор:

Как перенести всю систему Linux на другой диск? [дубликат]

У меня появился новый диск, но я не хочу по новой ставить систему. Есть ли способы полностью перенести всю систему Linux (Kali Linux), а так же все данные на другой диск?

Отслеживать
задан 6 янв 2019 в 10:51
user303264 user303264

абсолютно точно так же, как и любую другую систему: быстрее всего — переставить блочное устройство, дольше — скопировать файлы с одного блочного устройства на другое.

6 янв 2019 в 11:14

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Есть много подходов. Можно воспользоваться утилитой dd :

dd if=/dev/sda of=/dev/sdb bs=64K conv=noerror,sync 

Если переносится не весь диск, а только один раздел, то:

dd if=/dev/sda1 of=/dev/sdb1 bs=64K conv=noerror,sync 

А можно воспользоваться чем то типа https://clonezilla.org/, которые позволяют загрузиться с usb flash или dvd и копировать диски или разделы.

  • После копирования стоит обратить внимание на /etc/fstab . Если диски монтируются на основе UUID нужно будет прописать новые значения для разделов.
  • Если новый диск имеет больший размер, то надо будет создать на нем либо дополнительный раздел, либо увеличить размер текущего раздела. Тут все уже зависит от выбранной файловой системы.

Можно также просто примонтировать оба диска и скопировать данные с одного на другой. В этом случае можно будет избежать последующей корректировки размеров разделов. Но в этом случае, на диск вручную придется устанавливать загрузчик.

Перенос системы LINUX на другой винчестер с переразбивкой разделов

Когда-то давным давно в далекой-далекой галактике мне понадобилось перенести мою систему linux с одного винчестера на другой, а пользоваться проприетарщиной ужас, как не хотелось. Погуглив и поискав с помощью других поисковиков я нашел для себя решение, которое линукс-админу может показаться смешным, а меня оно тогда здорово выручило.

В общем — вот оно. Бейте ногами, режьте на части. Встречайте!

Первое, что нам необходимо сделать — это разметить новый жесткий диск в соответствии с желаниями и, возможно, исключив ошибки предыдущей разметки (если на исходном диске что то не нравится).

Разберем на конкретном примере моей системы. Я собираюсь перенести систему с HDD=80Gb на HDD=20Gb.

Мой диск, объемом 80Gb размечен следующим образом:

/dev/hda1 — /boot (250 Mb)
/dev/hda2 — swap (1Gb)
/dev/hda3 — extended (20Gb) (включает в себя /dev/hda5, /dev/hda6, /dev/hda7, /dev/hda8)
/dev/hda5 — / (5Gb)
/dev/hda6 — /tmp (512Mb)
/dev/hda7 — /usr (10Gb)
/dev/hda8 — /var (5Gb)
/dev/hda4 — /home (54Gb)

/home очень сильно забит информацией, потому его в клонирование я не включаю.

Выставив перемычки как положено, я подключаю новый HDD в систему. Он принял метку hdb
Можно разметить его с помощью ЛЮБОЙ удобной для вас утилиты. Мне было проще воспользоваться GPARTED — так визуально понятнее, да и видно там сразу, сколько реально места занято данными на той или иной партиции, что поможет определить стоит ли выделять столько много (или мало) места.

Я разметил новый диск (/dev/hdb) следующим образом:

/dev/hdb1 — /boot (250 Mb)
/dev/hdb2 — swap (1Gb)
/dev/hdb3 — extended (14Gb) (включает в себя /dev/hdb5, /dev/hdb6, /dev/hdb7, /dev/hdb8)
/dev/hdb5 — / (1Gb)
/dev/hdb6 — /tmp (512Mb)
/dev/hdb7 — /var (5Gb)
/dev/hdb8 — /usr (7Gb)
/dev/hdb4 — /home (4Gb)

Следующим шагом надо подмонтировать все созданные разделы на новом HDD к существующей системе.
Для этого на существующей системе я создал директорию /backup, в которой создал поддиректории /boot, /root, /var, /usr (/tmp — не надо), в соответствии с разделами на которые я разделил новый HDD.
Далее осуществляем само монтирование:

sudo mount /dev/hdb1 /backup/boot
sudo mount /dev/hdb5 /backup/root
sudo mount /dev/hdb7 /backup/var
sudo mount /dev/hdb8 /backup/usr

Вот и подобрались к самому интересному, но отнюдь не самому простому месту, к копированию данных.
В отличии от Windows Linux позволяет скопировать себя ПОЛНОСТЬЮ. Но надо помнить один важный момент — в системе есть аттрибуты на директории и файлы, а так же симлинки и хардлинки. Так вот необходимо так скопировать систему, чтоб все эти связи не растерялись. Для такой процедуры, по мнению больших специалистов, лучше всего подходит команда tar.
Смысл в том, что мы НЕ БУДЕМ архивировать файлы на диск, а будем их переносить через так называемую «трубу» или «поток» на приемный HDD.

Для упрощения процедуры переноса я написал скрипт backup.sh:

#!/bin/sh
cd /
tar -cf — dev initrd.img opt srv bin cdrom etc initrd lib sbin sys vmlinuz | (cd /backup/root; tar -xvpf -)
cd /boot
tar -cf — * | (cd /backup/boot; tar -xvpf -)
cd /var
tar -cf — * | (cd /backup/var; tar -xvpf -)
cd /usr
tar -cf — * (cd /backup/usr; tar -xvpf -)

немного объясню, что к чему:

«cd /»
— переход в root

«tar -cf — dev initrd.img opt srv bin cdrom etc initrd lib sbin sys | (cd /backup/root; tar -xvpf -)
» — заtarивание перечисленных директорий и файлов с передачей их на расtarивание на приемный HDD.

Узнать какие директории и файлы надо переносить несложно. Просто выполните команду «ls /» тем самым получив листинг вашей системы начиная с /.
В моем случае это:

ls /
backup boot dev home initrd.img media opt root srv tmp var
bin cdrom etc initrd lib mnt proc sbin sys usr vmlinuz

Из всего этого «добра» нам нужно выделить то что будет находиться в /.
Так, как я выделил отдельные партиции на диске под /boot, /var, /tmp, /usr и /home, получается что их на данном шаге нужно пропустить. Следовательно берем только dev initrd.img opt srv var
bin cdrom etc initrd lib sbin sys vmlinuz

А с остальными проще:
cd /boot
— заходим в существующий /boot

tar -cf — * | (cd /backup/boot; tar -xvpf -)
переносим все содержимое /boot в /backup/boot

Итак запускаем скрипт backup.sh и идем отдыхать на некоторое время. У меня все заняло около 10 минут.

Теперь еще один важный момент на который я вначале не обратил внимание, за что поплатился лишним временем и головной болью.

НЕДОСТАТОЧНО просто скопировать данные на партиции /var, /tmp, /usr.
После всех процедур переноса нам необходимо СОЗДАТЬ эти директории на приемном диске, как точки монтирования тех самых партиций (и все те точки монтирования, которые мы исключили при переносе — /home, /media, /tmp, /var, /mnt, /proc, /usr) ОБЯЗАТЕЛЬНО С ТЕМИ ЖЕ аттрибутами! То есть:

sudo mkdir /backup/root/home
sudo mkdir /backup/root/media
sudo mkdir /backup/root/tmp
sudo mkdir /backup/root/var
sudo mkdir /backup/root/mnt
sudo mkdir /backup/root/proc
sudo mkdir /backup/root/usr

какие выставить аттрибуты на директории можно узнать набрав команду ls -la / на исходной системе. Но кроме /tmp везде должен быть владелец root группа root и права 766. На /tmp надо поставить права 777.

Теперь надо на приемном HDD поправить fstab, если необходимо (если вдруг вы СОВСЕМ ПО ДРУГОМУ разметили диск). А так же поправить menu.lst загрузчика GRUB.

В UBUNTU что в fstab, что в menu.lst все диски прописаны через UUID а не просто /dev/hda.
узнать какой у вашего диска UUID можно с помощью команды: ls -l /dev/disk/by-uuid, на выводе должно получиться что то вроде:

lrwxrwxrwx 1 root root 10 2008-02-17 17:45 11815c66-5ae7-4497-9039-51de9adef664 -> ../../hda2
lrwxrwxrwx 1 root root 10 2008-02-17 17:45 78711a48-6776-4474-8fa8-87016aad83a2 -> ../../hda6
lrwxrwxrwx 1 root root 10 2008-02-17 17:45 83fded3d-37c4-4d85-a965-a7bbe326178a -> ../../hda7
lrwxrwxrwx 1 root root 10 2008-02-17 17:45 a60e482c-8260-48fb-a19e-f5f906d4d444 -> ../../hda8
lrwxrwxrwx 1 root root 10 2008-02-17 17:45 bc7607fe-3bf2-4bc1-adce-8ab749a271c9 -> ../../hda1
lrwxrwxrwx 1 root root 10 2008-02-17 17:45 cacd40ea-ac88-4143-b5d9-5cb477eeb85d -> ../../hda4
lrwxrwxrwx 1 root root 10 2008-02-17 17:45 d4404ea9-0a8e-4a4c-b72d-10a5edd697be -> ../../hda5

вот нам нужны как раз цифры «11815c66-5ae7-4497-9039-51de9adef664», к примеру. Это UUID партиции swap (в моем случае).

в menu.lst правим следующие строки:

# kopt=root=UUID=d4404ea9-0a8e-4a4c-b72d-10a5edd697be ro
(не смотрите что строка закомментирована, при обновлении ядра именно отсюда берется информация)

kernel /vmlinuz-2.6.22-14-generic root=UUID=d4404ea9-0a8e-4a4c-b72d-10a5edd697be ro quiet splash locale

kernel /vmlinuz-2.6.22-14-generic root=UUID=d4404ea9-0a8e-4a4c-b72d-10a5edd697be ro single

Не забудьте тот факт, что хоть система и скопирована на диск, но она пока не умеет загружаться, потому что мы не установили загрузчик.
Делается это просто:
Берем установочный диск UBUNTU и грузимся.
переходим в консоль ctrl+f1

sudo su
grub
find /grub/stage1
root (hd0,0) сюда пишем то что выдала предыдущая команда
setup (hd0) сюда пишем то же самое но до первой запятой.
quit

Все — отсединяем диск от системы, подключаем, проверяем. У меня все заработало.

Так как я не переносил /home — то система ругнулась на то что я как пользователь есть а вот домашней папки у меня нет. Я поступил варварским способом — userdel %username% , а затем adduser %username% .

Просто мне было НЕВАЖНО. И лень расставлять аттрибуты. А таким образом система сделала все за меня.

P.S. Не ругайте сильно за, возможно, устаревший способ, но на тот момент он работал и работал хорошо! (Тот момент можете вычислить по версии ядра упомянутого в этой статье).

Как перенести систему на другой диск?

Нужно перенести систему на другой физический диск. Я собрался просто установить на него ту же Ubuntu 22.04, затем перегрузится в лайв режиме и скопировать все файлы со старого диска в новый. Затем поправить UUID в /ect/fstab.

Ничего не упускаю?

Suntechnic ★★★★★
11.03.23 15:13:32 MSK

  • Ответить на это сообщение
  • Ссылка

Почему просто не скопировать раздел и поставить загрузчик?

GREAT-DNG ★★★
( 11.03.23 15:16:40 MSK )
Последнее исправление: GREAT-DNG 11.03.23 15:18:09 MSK (всего исправлений: 1)

  • Ответить на это сообщение
  • Ссылка

Я просто делаю cp -ax и правлю fstab

alex1101 ☆
( 11.03.23 15:17:34 MSK )

  • Ответить на это сообщение
  • Показать ответ
  • Ссылка

перед копированием обнови системы

Bad_ptr ★★★★★
( 11.03.23 15:23:40 MSK )

  • Ответить на это сообщение
  • Ссылка

Загрузчик. Ещё ты должен из chroot переставить загрузчик.

Vsevolod-linuxoid ★★★★★
( 11.03.23 16:16:10 MSK )

  • Ответить на это сообщение
  • Ссылка

Я просто делаю pvmove и устанавливаю grub(-install) на новый диск

futurama ★★★★★
( 11.03.23 16:17:12 MSK )

  • Ответить на это сообщение
  • Ссылка

Когда я менял hdd на ssd я сделал просто dd ))

symon2014 ★★
( 11.03.23 16:24:48 MSK )

  • Ответить на это сообщение
  • Ссылка

Про capabilities не забудь

targitaj ★★★★★
( 11.03.23 17:46:40 MSK )

  • Ответить на это сообщение
  • Показать ответ
  • Ссылка

Xe0N ★
( 11.03.23 17:57:14 MSK )

  • Ответить на это сообщение
  • Ссылка

Я делаю так: на исходной системе (из лайв-сиди):

  • tar -czf /mnt/full.tgz —numeric-owner —exclude=swapfile .
  • getfacl -R -s -n . > /mnt/file.acl
  • getfattr -R -d -m — . > /mnt/file.attr 2>/dev/null

На целевой системе (тоже из лайв-сиди):

  • tar -xf /mnt/full.tgz —numeric-owner
  • setfacl —restore=/mnt/file.acl
  • setfattr —restore /mnt/file.attr
  • rmdir lost+found
  • mklost+found
  • fallocate -l 4G swapfile
  • chmod 600 swapfile
  • mkswap swapfile

Если инсталлируете на EFI из BIOSa, нужно удостовериться, что на исходной системе инсталлирован grub-efi. Тогда, когда сделаете chroot , grub не будет ругаться. Ну и, конечно, /etc/fstab подправить.

forest22 ★
( 11.03.23 19:16:04 MSK )
Последнее исправление: forest22 11.03.23 19:17:29 MSK (всего исправлений: 1)

  • Ответить на это сообщение
  • Показать ответ
  • Ссылка

Раньше cp -ax и поправить загрузчик.

А сейчас у меня есть playbook, который за 10 минут развернёт мне обычную домашнюю систему

overmind88 ★★★★★
( 11.03.23 19:31:22 MSK )

  • Ответить на это сообщение
  • Ссылка

Ответ на: комментарий от targitaj 11.03.23 17:46:40 MSK

Suntechnic ★★★★★
( 11.03.23 20:46:18 MSK ) автор топика

  • Ответить на это сообщение
  • Показать ответ
  • Ссылка

Ответ на: комментарий от alex1101 11.03.23 15:17:34 MSK

Короче не сработало. Просто не грузится. Черный экран. И так как в ноуте третье место по диск оказалось под sata ssd, то не получается воткнуть три диска — переставлять приходится (((

Suntechnic ★★★★★
( 11.03.23 20:48:01 MSK ) автор топика

  • Ответить на это сообщение
  • Показать ответ
  • Ссылка

Ответ на: комментарий от Suntechnic 11.03.23 20:46:18 MSK

targitaj ★★★★★
( 11.03.23 20:48:27 MSK )

  • Ответить на это сообщение
  • Ссылка

Ответ на: комментарий от Suntechnic 11.03.23 20:48:01 MSK

Перенос Ubuntu на SSD (комментарий) — вот тут я новичку реальный пример переноса делал.

Vsevolod-linuxoid ★★★★★
( 11.03.23 21:03:33 MSK )

  • Ответить на это сообщение
  • Ссылка

mkfs.ext4 … /dev/sdb2 mkdir -p /mnt/ mount /dev/sda1 /mnt/src mount /dev/sdb2 /mnt/dst rsync -avh /mnt/src/. /mnt/dst правим /etc/fstab …

uwuwuu
( 11.03.23 21:14:30 MSK )

  • Ответить на это сообщение
  • Ссылка

Я как-то пробывал стандартными метода перенесли систему с одного диска на другой с Debian 9, у меня тогда нерешаемые проблемы возникли с правами на доступ к файлам из-за pam.

nager ☆
( 14.03.23 11:22:32 MSK )

  • Ответить на это сообщение
  • Показать ответ
  • Ссылка

мне очень помогла документация из openwrt.

рекомендую сперва посмотреть какая структура файловой системы, сколько томов и куда подключены.

Начинай с рута /, а лучше если сделать

mkdir /oldroot mkdir /newroot mount -o bind / /oldroot mount /dev/(newdisk) /newroot 

это поможет дать доступ к корневому каталогу без остальных каталогов. ну и отсюда /oldroot в /newroot копируешь файлы, мне нравится rsync. но можно cp, tar и другие.

Затем действуешь также по остальным томам. и не забудь обновить /etc/fstab на новые uuid томов.

Nurmukh ★★★
( 14.03.23 18:07:30 MSK )

  • Ответить на это сообщение
  • Ссылка

Ответ на: комментарий от forest22 11.03.23 19:16:04 MSK

getfacl -R -s -n . > /mnt/file.acl getfattr -R -d -m - . > /mnt/file.attr 2>/dev/null 

По-моему, вторая команда включает в себя первую, нет? Но всё равно спасибо, я раньше только одним tar или cp -a ограничивался, думал, он сохраняет все атрибуты.

Проблема в том что ctime сбрасывается.

Xenius ★★★★★
( 17.03.23 08:58:00 MSK )

  • Ответить на это сообщение
  • Показать ответы
  • Ссылка

Ответ на: комментарий от Xenius 17.03.23 08:58:00 MSK

Насчёт ctime не знаю.

Насчёт getfacl / getfattr сделайте просто из корня и посмотрите образовавшиеся текстовые файлы. У меня на небольшой системе они по прибл. 5 КБ.

forest22 ★
( 17.03.23 10:32:57 MSK )

  • Ответить на это сообщение
  • Показать ответ
  • Ссылка

Ответ на: комментарий от forest22 17.03.23 10:32:57 MSK

Там нет опции чтобы не прыгать на другие файловые системы. Почти все записи в /dev и /proc

Ещё в одном треде getcap упоминали.

Xenius ★★★★★
( 17.03.23 10:35:34 MSK )

  • Ответить на это сообщение
  • Показать ответ
  • Ссылка

Ответ на: комментарий от Xenius 17.03.23 10:35:34 MSK

А вы попробуйте из лайв-сиди. У меня никуда не прыгает. Я делаю эту процедуру в двух случаях:

  • перенос системы (как у ТС)
  • бекап консистентного состояния системы. Файлы в /home я исключаю опцией —exclude в tar е. Дот-файлы включаю.

forest22 ★
( 17.03.23 10:46:54 MSK )

  • Ответить на это сообщение
  • Показать ответ
  • Ссылка

Ответ на: комментарий от forest22 17.03.23 10:46:54 MSK

Я не хочу перезагружать систему только из-за проверки этой штуки.

Xenius ★★★★★
( 17.03.23 10:51:26 MSK )

  • Ответить на это сообщение
  • Показать ответы
  • Ссылка

Ответ на: комментарий от Xenius 17.03.23 08:58:00 MSK

Вообще, в tar е есть опции —xattrs , —acls , но я их не использую, потому что тар в последний раз с ними ругался, что он не может что-то там «create» в контексте ACL. Возможно, это связано с этим багом — https://savannah.gnu.org/bugs/?61934 . Стал делать как раньше — с getfacl / getfattr .

forest22 ★
( 17.03.23 10:56:03 MSK )
Последнее исправление: forest22 17.03.23 10:58:31 MSK (всего исправлений: 1)

  • Ответить на это сообщение
  • Ссылка

Ответ на: комментарий от Xenius 17.03.23 10:51:26 MSK

forest22 ★
( 17.03.23 10:57:00 MSK )

  • Ответить на это сообщение
  • Ссылка

Ответ на: комментарий от nager 14.03.23 11:22:32 MSK

Потому что cp и rsync по умолчанию не копируют владельца и права

uwuwuu
( 17.03.23 11:05:59 MSK )

  • Ответить на это сообщение
  • Ссылка

Я собрался просто установить на него ту же Ubuntu 22.04

Может лучше Linux Mint?

iZEN ★★★★★
( 17.03.23 11:08:06 MSK )

  • Ответить на это сообщение
  • Показать ответ
  • Ссылка

Ответ на: комментарий от Xenius 17.03.23 10:51:26 MSK

Понадобится еще не раз:

rsync -av --exclude= / /mnt 

Звезды вроде не нужны. Я эту команжду лет 5 назад записал.

Я что-то запамятывал, что не все файлы нужно копировать, потому как есть куча виртуальных файлов и устройств. Всякие /tmp, /run, /proc даже создавать не надо, их вроде система сама создает, если не существует

Да-да, копировать файлы можно прямо на «живой» системе. Вероятность что что-то сломается есть, но я раньше всегда так делал… но УМВР это плохой аргумент все же. На сервере так лучше не делать, потому как если индекс каким-то корявым будет, то базу похеришь

uwuwuu
( 17.03.23 11:09:43 MSK )
Последнее исправление: uwuwuu 17.03.23 11:15:28 MSK (всего исправлений: 2)

  • Ответить на это сообщение
  • Показать ответ
  • Ссылка

Минниахметов Равиль Юрисович

Поскольку все данные, настройки и объекты операционной системы Linux — это файлы, то чтобы перенести операционную систему на другой диск нужно скопировать определенные файлы и папки, сохраняя структуру и разрешения файлов.
Получим права суперпользователя:
sudo -i

Определим какие диски подключены в операционной системе:
fdisk -l

Произведем разметку нужного диска (например, /dev/sdb) аналогично установленному (например, /dev/sda):
fdisk -d /dev/sda | sfdisk —force /dev/sdb

Отформатируем вновь созданные разделы:
Для основного раздела Linux:
mkfs.ext4 /dev/sdb1
и для swap
mkswap /dev/sdb3

Создаем директорию и смонтируем в нее системный раздел нужного диска:
mkdir /mnt/hdd
mount /dev/sdb1 /mnt/hdd

Скопируем в папку /mnt/hdd всю информацию со старого системного раздела. Для этого запускаем утилиту cp с опциями -a, -r и -x. Первая опция включает сохранение исходных прав и метаданных файла, вторая — рекурсивный обход файловой системы, а третья ограничивает рекурсию только текущей файловой системой:
cp -rxa /bin/ /boot/ /etc/ /home/ /lib/ /lib64/ /opt/ /root/ /sbin/ /tmp/ /usr/ /var/ /initrd.img vmlinuz /mnt/hdd
или
sudo cp -rxa / /mnt/hdd
и
cd /mnt/hdd
mkdir /dev /proc /srv /sys /mnt
chmod 777 /tmp

Поскольку будут скопированы только файлы из текущей файловой системы, то если каталоги /boot, /home или другие находятся на других разделах или дисках, то их нужно скопировать отдельно:
mkdir /mnt/hdd/
cp -rxa /boot /mnt/hdd/boot/
cp -rxa /home /mnt/hdd/home/

Далее будем работать только с новой системой. Первым делом нужно исправить файл /etc/fstab, чтобы там был указан правильный UUID корневого раздела. Определяем UUID нужного раздела командой:
lsblk -o NAME,UUID
или
blkid /dev/sdb1

Заменим полученный UUID, значение этого параметра корневого раздела в /mnt/hdd/etc/fstab:
vi /mnt/hdd/etc/fstab

Далее нужно установить загрузчик Grub в новом Linux. Примонтируем в него папки /sys, /proc и /dev:
mount —bind /sys /mnt/hdd/sys
mount —bind /proc /mnt/hdd/proc
mount —bind /dev /mnt/hdd/dev

Войдем в chroot окружение:
chroot /mnt/hdd

Устанавливаем загрузчик на тот диск, на который перенесли Linux /dev/sdb:
grub-install /dev/sdb

Создадим конфигурационный файл для загрузчика:
update-grub2

Выходим из chroot-окружения командой:
exit

Размонтируем системные каталоги и системный раздел:
umount /mnt/hdd/sys
umount /mnt/hdd/proc
umount /mnt/hdd/dev
umount /mnt/hdd

Перезагружаем компьютер. В системном BIOS-е компьютера нужно выбрать диск, на который переносили Linux, в качестве первого источника для загрузки.

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

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