Перенос системы Linux на другой диск
Такая задача возникает достаточно редко. Обычно, проще переустановить систему заново, чем переносить уже установленную версию на другой жёсткий диск или другой раздел. Но если у вас там есть важные программы, которые нежелательно удалять, или вы меняли настолько много настроек в системе, что её установка заново займёт намного больше времени, чем её перенос, то перенос будет предпочтительнее. Инструкция написана под разметку диска.
Перенос системы можно разделить на несколько этапов:
- Разметка диска, новый диск лучше разметить в точном соответствии старому диску
- Копирование файлов, при копировании нужно переносить не только файлы, но и параметры в виде ссылок, владельцев и т.д.
- Правка
/etc/fstab
, в файле записаны данные для монтирования дисков - Установка загрузчика
Grub
, без загрузчика система не запустится
Разметка диска
На работающей системе переключимся на root пользователя:
sudo -i
Проверим какие диски подключены, это можно сделать через консоль:
fdisk -l
Или программу GParted
которая содержит графическое ядро:
gparted
Для установки GParted
используйте команду:
sudo apt-get install gparted
В моем случае старый диск /dev/sda
и новый /dev/sdb
не размеченный.
Разобьем новый диск /dev/sdb
аналогично старому /dev/sda
используя команду в консоли, но можно это сделать и при помощи графической программы GParted
:
sfdisk -d /dev/sda | sfdisk --force /dev/sdb
Дальше нам необходимо отформатировать разделы и подогнать файловые системы нового диска под старый, для этого лучше всего подходит программа GParted
.
Копирование файлов rsync
Этот способ подходит для переноса системы с диска на диск.
Создадим пустую директорию на старом диске newhdd
:
mkdir /newhdd
Смонтируем в неё основной раздел /dev/sdb1
нового диска:
mount /dev/sdb1 /newhdd
Cкопируем в новый примонтированный раздел всю информацию, по сути копируя данные в папку newhdd
мы бедем переносить файлы операционной системы со старого диска на новый:
rsync -aAXv --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/newhdd/*"} / /newhdd/
Команда rsync
копирует всё что есть в новое расположение. Опции -aAX
включают сохранение всех метаданных файла, символических ссылок, владельцев, групп, и так далее в рамках файловой системы.
Дириктории dev
proc
sys
tmp
run
исключаются специально, они содержат динамические данные которые нет смысла переносить.
Создание архива системы утилитой tar
Я обычно создаю архив, а потом его куда-нибудь копирую, чтобы иметь резервную копию системы.
Создаем копию корня /
файловой системы:
tar -cvpzf /systemKoren.tar.gz --exclude /systemKoren.tar.gz --exclude /dev --exclude /sys --exclude /proc --exclude /tmp --exclude /run --exclude /home /
Дириктории dev
proc
sys
tmp
run
исключаются специально, они содержат динамические данные которые нет смысла переносить, дириктория hom
исключается для экономии места, ее мы будем архивировать отдельно.
Создаем копию раздела home
, для этого нам нужно перейти в сам раздел, это нужно что-бы заархивировать только файлы и папки находящиеся внутри раздела home
:
cd /home
Заархивируем только файлы и папки, для этого в конце подставляем знак *
обозначаюший все файлы и папки:
tar -cvpzf /systemHome.tar.gz *
Распаковка архива
Создадим пустую директорию на старом диске newhdd
:
mkdir /newhdd
Монтируем в папку newhdd
раздел нового диска в котором будет корень /
файловой системы:
mount /dev/sdb2 /newhdd
Распаковываем в папку newhdd
архив systemKoren.tar.gz
:
tar xvzf /systemKoren.tar.gz -C /newhdd
Создадим пустую папку /home
котороу исключили из архива:
mkdir /newhdd/home
Размантируем папку newhdd
:
umount /dev/sdb2 /newhdd
Монтируем в папку newhdd
раздел нового диска в котором будет home
файловой системы:
mount /dev/sdb3 /newhdd
Распаковываем в папку newhdd
архив systemHome.tar.gz
:
tar xvzf /systemHome.tar.gz -C /newhdd
Размантируем папку newhdd
:
umount /dev/sdb3 /newhdd
Правка /etc/fstab
Далее будем работать только с новой системой. Первым делом нужно исправить файл автоматического монтирования /etc/fstab
, чтобы там был указан правильный UUID разделов. Узнать UUID нужного раздела можно в GParted
.
Монтируем в папку newhdd
раздел нового диска в котором будет корень /
файловой системы:
mount /dev/sdb2 /newhdd
Замените полученным UUID
:
nano /newhdd/etc/fstab
Установка загрузчика
Создаем папки которые добавили в исключение (если делали архив):
mkdir /newhdd/sys
mkdir /newhdd/proc
mkdir /newhdd/dev
mkdir /newhdd/run
Примонтируем на новый диск папки /sys, /proc, /dev, из работающей системы:
mount --bind /sys /newhdd/sys
mount --bind /proc /newhdd/proc
mount --bind /dev /newhdd/dev
Монтируем в дирикторию /newhdd/boot/efi
раздел нового диска в котором будет загрузчик файловой системы:
mount /dev/sdb1 /newhdd/boot/efi
Затем нужно войдите в chroot окружение новой операционной системы, команда помогает изменить видимый корневой каталог вашей файловой системы:
chroot /newhdd
Затем установите загрузчик в дирикторию /newhdd/boot/efi
, при монтировании не нужно указывать конкретный раздел, загрузчик устанавливается на весь диск в целом /dev/sdb
:
grub-install /dev/sdb
Осталось только создать конфигурационный файл для загрузчика:
update-grub2
Перезагрузка
Выйдите из chroot-окружения командой:
exit
Размантируйте диски:
umount /newhdd/sys
umount /newhdd/proc
umount /newhdd/dev
umount /newhdd/boot/efi
umount /newhdd
Осталось перезагрузить компьютер. В BIOS вашего компьютера нужно выбрать диск, на который вы переносили Linux, в качестве первого источника для загрузки. После загрузки вы будете уже в новой операционной системе.
Быстрый перенос при помощи TimeShift
Я подробно писал о резервном копировании используя графическую утелиту TimeShift, если у вас есть резервная копия сделаная через TimeShift
, перенос Linux займет максимум 10 минут и пару шагов действий:
- Подключаем новый жесткий диск к работающей системе, если система повреждена а резервная копия находилась на другом жестком диске, можно подключится через Лайв СД и установить TimeShift
- Размечаем новый жесткий диск в соответствии старому. Главное соблюсти разметку (форматирование) и что бы все файлы поместились в разделах, точного соответствия по количеству мигобайт не требуется
- Сопоставляем разделы на новом жестком диске куда TimeShift должен выложить файлы
- Запускаем TimeShift и дожидаемся конца операции
На практике у меня возникла проблема только с программами установленными в формате SNAP
пакета и утелитой snapd
. Порывшись в сети нашел способ как это исправить.
Удаление снапов и утелиты snapd
Получаем список установленных снапов:
snap list
Останавливаем службы:
sudo systemctl disable snapd.service
sudo systemctl disable snapd.socket
sudo systemctl disable snapd.seeded.service
Удаляем все снапы по списку, полученному на первом шаге:
sudo snap remove firefox
sudo snap remove snap-store
sudo snap remove gtk-common-themes
sudo snap remove gnome-3-38-2004
sudo snap remove core18
sudo snap remove snapd-desktop-integration
Удаляем мусор, оставшийся от снапа:
sudo rm -rf /var/cache/snapd/
Теперь можно полностью удалить сам снап:
sudo apt purge snapd
И наконец можно удалить то, что осталось от снапа в хомяке ~/snap
. Там могут быть полезные вещи, на например, профиль Firefox. Поэтому сохраняешь нужные данные, и после этого:
rm -rf ~/snap
Установка утелиты snapd и альтернативного SNAP магазина
Обновляем пакеты:
sudo apt update
sudo apt upgrade
Обновляем полностью весь дистрибутив с разрешением удаления конфликтующих пакетов:
sudo apt dist-upgrade
Устанавливаем пакет:
sudo apt install snapd
Устанавливаем пакет:
sudo apt install gnome-software-plugin-snap
Устанавливаем альтернативный SNAP магазин:
sudo snap install snap-store
Если в процесе получаем ошибку:
error : cannnot perform the following tasks :
remove data for the official snap "firefox" (1969) (Unlinkat /var/snap/firefox/common/host-hunspell/en_US.aff: read-only file system)
Единственный способ победить, нужно отмантировать раздел:
umount /var/snap/firefox/common/host-hunspell
На всякий случай оставляю ссылки на оригиналы статей один, два, три.