Страницы

суббота, 27 октября 2012 г.

Часть III. Перенос системы на другой диск. MBR-to-GPT.

Возникла задача перенести установленную систему Ubuntu Server 12.04 на микросервере, находящуюся на комплектном жестком диске на другой диск, в зарезервированный раздел(ы).

Про разметку дисков микросервера можно посмотреть в заметке о GPT - LVM - RAID - 3TB.

Комплектный жесткий диск (250ГБ), был размечен, в своё время, установщиком Ubuntu Server, в автоматическом режиме, а это таблица разделов MBR, да еще и с логическими разделами. Это непорядок, тем более,сейчас осуществляю переход на GPT, чтобы снять ограничения.

Целевой 3ТБ жесткий диск Seagate ST3000DM001, размечен в современную разметку GPT.  На нём существуют специально выделенные разделы под основную и резервные Linux системы.

Трудности переноса Ubuntu на другой диск (миграция MBR на GPT)

Просто копирование файлов не помогает. В Linux есть специальные файлы и каталоги. Для них специальный подход. Также, т.к. современные Linux системы имеют дело с уникальными идентификаторами GUID, то и для них, - специальных подход.

HP Proliant Microserver N40L имеет обычный BIOS, а не современную систему UEFI. Поэтому, микросерверу для загрузки нужен диск с разметкой MBR.
Комплектный диск был размечен в MBR и нормально загружался. Но для повышения гибкости микросервера, он будет преобразован.
Разметка в MBR на современных дисках, с 4KiB физическими секторами, влечёт падение производительности, из-за устаревших требований MBR разметки - начало раздело кратно 63 сектору.

Т.е. современный компьютер, должен иметь биос с поддержкой GPT разметки (а это UEFI биос), уметь с неё загружаться и должны быть диски, правильно размененные в GPT. А выравнивание, при разметке в GPT, выполнится утилитами, такими как gdisk.
На а в нашем случае - загрузчик, с MBR, будет на флешке, и проблема выравнивания и загрузки с GPT, нас не сильно коснется.

Задача

Перенести систему с комплектного загрузочного диска на 3TБ диск в один из зарезервированных ранее разделов для Ubuntu Linux. Попутно, разделить систему, данные системы и пользовательские данные. После этого, преобразовать комплектный жесткий диск в GPT. Перенести только систему обратно. После этого, создать загрузочный том на маленькой флешке, с загрузчиком GRUB2, для загрузки системы либо с 3TБ диска, либо с 250ГБ.
По максимуму, забыть про MBR и более не размечать диски в ней.

Флешку можно подключить к внутреннему разъему микросервера, а можно просто повесить сзади микросервера, вынув её после загрузки.

Исполнение

Для переноса системы, можно выполнить загрузку с другого носителя, приостановив работу микросервера.Загружаюсь с usb-ssd.
Далее, понадобятся 4 (в моём случае) точки монтирования.Одна укажет путь к корневой системе исходного (250ГБ) диска, вторая - путь к корневой системе целевого раздела 3ТБ диска, третья - путь к разделу home целевого раздела 3 TБ, четвертая - путь к разделу данных.

Перенос будет состоять из нескольких этапов.
1. Форматирование целевого раздела корневой файловой системы (/), в EXT4.
2. Форматирование целевого раздела домашней папки (/home), в EXT4.

. Простое копирование простых файлов корневой файловой системы исходного диска
. Перенос полезных данных из папки /home исходного раздела, в папку на раздел данных. Т.к. сейчас полезные данные, не относящиеся к микросерверу храняться внутри папки /home, в подпапках.
. Простое копирование остатков папки home, в целевой раздел. Перенос данных относящихся к микросерверу на раздел /home на целевом диске.
. Изменение необходимых файлов на целевом разделе: цель: /etc/fstab,
. Создание специальных каталогов и специальных файлов
- Настройка загрузки

Итак, целевой диск, в моём случае 3ТБ: /dev/sda
Раздел корневой системы целевого диска, будущая точка монтирования (/): /dev/sda7
Раздел домашней папки. будущая точка монтирования (/home): /dev/sda8.
Раздел подкачки (swap), будущей системы: /dev/sda4.

Форматирование
Форматирование - очень опасная операция, часто приводящая к случайной порче полезных данных, по невнимательности. На свой страх и риск.

Форматирование 2 разделов, одной строкой, с указанием меток:

# mkfs.ext4 -L two-root /dev/sda7 && mkfs.ext4 -L two-home  /dev/sda8

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

Монтирование

Монтирование отформатированных целевых разделов, в точки временного монтирования. Можно примонтировать в путь /mnt/two-root /mnt/two-home, можно в иные места, не суть. Единственно что можно заметить здесь, это использовать короткие имена точке монтирования, дабы не превысить ограничение длины пути в Linux.

# mkdir /mnt/two-root
# mkdir /mnt/two-home
# mount -t ext4 /dev/sda7 /mnt/two-root
# mount -t ext4 /dev/sda8 /mnt/two-home


Перенос корневой файловой системы (корня,root).

Можно пойти несколькими путями. Использовать утилиту tar, утилиту rsync, простое копирование (cp-ax), dump/restore.
Но, при любом способе, надо контролировать следующие условия: права файлов, даты файлов и каталогов, жесткие и мягкие ссылки, именованные каналы, сокеты, точки монтирования, специальные файловые системы.

Точки монтирования (например дисков с пользовательскими данными), должны исключаться из копирования (при переносе корня), либо должны предварительно быть отмонтироваными. Известные точки монтирования: /mnt - /media /home Специальные файловые системы /dev /sys /proc. Но конечный список определятся местными условиями.


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

Учебный пример: перенос файлов содержащих .backup в имени, в другую папку, посредством утилиты tar (последовательный архив):

# tar -c --exclude=place1 *.backup | tar -x --directory=/mnt/two-home/

здесь опции:
-c - создание архива
--exclude= - исключение объектов по шаблону
*.backup - это файлы которые будут архивироваться
| - символ конвейера (pipe) в Linux/Unix, перенаправление вывода команды слева в команду справа.
-x - извлечение архива
--directory= - смена каталога, на тот куда будет произведено извлечение архива
Работает tar  в каталоге запуска и копирует все файлы с расширением backup.


Выполнив такую команду, мы избегаем формирование огромного файла архива корневой системы (а это лишнее место хранения), а сразу, по мере поступления файлов в архив, разархивируем их в целевой каталог. При этом, не используем сжатия, так что всё работает достаточно быстро.
Если при этом использовать такую известную утилиту NetCat (nc) - то архив можно передать и на другую машину в сети (другой микросервер).

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

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


Рабочий пример микросервера: перенос корневой системы
т.к. у меня 1 раздел, на котором и root и home, то при копировании root, я исключаю home, и копирую потом отдельно.

Прежде чем копировать, надо оценить имеющееся место на целевом разделе.

Всё копирование, делаем из каталога источника, чтобы избежать указания длинных путей.
# cd /mnt/src-root

# tar -cp --exclude=home --exclude=proc --exclude=sys --exclude=dev --exclude=mnt --exclude=media . | tar -x --directory=/mnt/two-root

Также, я отдельной командой скопировал каталог конфигураций etc, были какие-то сложности.
# tar -cp  etc | tar -x --directory=/mnt/two-root

Скопировал содержимое папки home (а не саму папку), в корень будущего раздела /home:

# tar -cp --exclude=backup  home/* | tar -x --directory=/mnt/two-home

Также, я отдельной командой скопировал папку backup из каталога home в другое место

# tar -cp home/backup | tar -x --directory=/mnt/backup


Выяснение UUID:
# blkid | grep sda7
 dev/sda7: LABEL="two-root" UUID="7fd88c8d-6ec2-4142-94ff-b70987654321" TYPE="ext4"
# blkid | grep sda8
 dev/sda7: LABEL="two-home" UUID="7fd88c8d-6ec2-4142-94ff-b71234567890" TYPE="ext4"

Редактирование /etc/fstab на целевом разделе:
# nano /mnt/two-root/etc/fstab

Замена UUID точек монтирования / и /home на полученные на предидущем этапе. Монтирование по уникальному идентификатору раздела, позволяет, например, переставить жесткие диски (а они тут же поменяют имена устройств) и спокойно, ядру, загрузить корневую файловую систему и домашнюю.
Каждая точка монтирования на своей строке, добавить комментарии - дату изменения, метку системы, что делалось.

Раздел подкачки указал просто устройство, т.к. uuid не нашел (раздел не форматированный) - /dev/sda4

Выдержка из fstab:

# <file system> <mount point>   <type>  <options>       <dump>  <pass>

proc            /proc           proc    nodev,noexec,nosuid 0       0

UUID=7fd88c8d-6ec2-4142-94ff-b70987654321 /               ext4    errors=remount-ro 0   1

UUID=7fd88c8d-6ec2-4142-94ff-b71234567890 /home           ext4    errors=remount-ro 0   1

# временно указано устройство, а не UUID
/dev/sda4       none    swap    sw      0       0


Создание точек монтирования специальных файловых систем:
# mkdir /mnt/two-root/proc
# mkdir /mnt/two-root/sys
# mkdir /mnt/two-root/dev

Обычные точки монтирования:
# mkdir /mnt/two-roor/media
# mkdir /mnt/two-roor/mnt


В принципе, на этом этапе, всё, можно воспользоваться обновлением загрузчика (update-grub) на текущей запущенной системе, он обновиться, найдет новые системы и пропишет строки запуска и попробовать перезагрузиться в новую систему, используя стартовый носитель (usb-ssd), как загрузчик.
# update-grub
Найден Ubuntu 12.04.1 LTS (12.04) на /dev/sda7
Найден openSUSE 11.4 (x86_64) на /dev/sdc2
Найден Ubuntu 12.04.1 LTS (12.04) на /dev/sde1


Новая сформированная система (резервная копия основной системы микросервера) найдена на /dev/sda7.
Откопался даже эксперимент с OpenSuse на каком-то дискe, про который я уже и забыл :-)
Также откопалась основная система микросервера на комплектном диске /dev/sde1.
Просто загрузчик на новом диске, ещё не знал, про наличие других систем и мог загрузить только свою.


А можно, заняться установкой загрузчика, но с дисками GPT - это нетривиальный процесс. Т.к. на микросервере BIOS, то нужен диск размеченный в MBR - у меня будет флешка.
В микросервере, есть удобная функциональность, стандартный внутренний USB-порт на плате. Туда подключу флеш-накопитель. Размечу его в MBR.
Сделаю несколько разделов.
Первый раздел, выделю для загрузчика. Второй раздел выделю для образа дополнительного загрузочного диска. Третий раздел - либо UDF, либо exFAT. Пока не решил, как будет.

Установка загрузчика GRUB2 на загрузочный том (флешку)

Загрузчику нужно где-то хранить свои файлы. GRUB2 хранит обычно в папке /boot/grub, иногда просто /grub.

Загружаемся в любой системе, желательно поновее (12.10).

Инсталляция загрузчика выполняется командой grub-install, с опциями.

Флешка у меня в этот раз, была /dev/sdf

# fdisk /dev/sde
Диск /dev/sde: 7743 МБ, 7743995904 байт
113 головок, 57 секторов/треков, 2348 цилиндров, всего 15124992 секторов
Units = секторы of 1 * 512 = 512 bytes
Размер сектора (логического/физического): 512 байт / 512 байт
I/O size (minimum/optimal): 512 bytes / 512 bytes
Идентификатор диска: 0x000be372

Устр-во Загр     Начало       Конец       Блоки   Id  Система
/dev/sde1              63      392672      196305   83  Linux



Boot раздел флешки (/dev/sde1) был примонтирован в /media/iam/boot.

Выполняем установку загрузчика GRUB2:

# grub-install --boot-directory=/media/iam/boot /dev/sdf

Этим мы меняем поведение установщика и он, вместо текущего корня, устанавливае Grub 2 в указанную директорию (файлы GRUB2, конфигурационный файл, меню и пр.), а в само устройство /dev/sdf прописывает загрузочный boot-sector.

Теперь надо обновить список операционных систем, доступных для загрузки, сгенерировав главный конфигурационный файл GRUB2, следующей командой:

# grub-mkconfig -o /media/iam/boot/grub/grub.cfg

Может возникнуть вопрос, почему не update-grub. Update-grub обновляет по умолчанию файл, /boot/grub/grub.cfg, а этот файл находится в корне загруженной системы. А это нам не надо, хотя можно тоже освежить.

Далее, я выключаю микросервер, отключаю диск с которого шла загрузка и включаю микросервер. В BIOS выставляю опцию - загрузки с USB и гружусь.
Если всё правильно, то появиться меню загрузчика и будет список готовых для загрузки операционных систем. Выбираю загрузку установленной настольной системы Ubuntu Gnome 12.10 (на /dev/sdb5).
Также, после перезагрузки проверяю загружаемость микросервера с комплектного диска, с резервной системы на диске /dev/sda7.

Замеченная особенность, загрузочная флешка автомонтируется при запуске графического рабочего стола Gnome Shell. Если её отключить, то перезагрузка не сработает и надо выключить микросервер, чтобы заработало.
В принципе, её можно убрать из автомонтирования, либо не отключать - самое простое.

Соединение GPT и MBR в Hybrid MBR

Технология нестандартная, но используемая. Существенным недостатком является, то что вся настройка (долгая) может легко слететь при любой установке, любой системы. Обычно через время, всё это забывается и благополучно переписывается. Системы проверки корректности структуры разметки, также могут не понять режим Hybrid MBR и исправить ошибку :-)
Существенным плюсом, не требуется флешка для загрузки с GPT дисков.
Если есть желание, то можно потренироваться [см. Ресурсы.1].

Использование rsync для переноса корневой системы

Rsync также может быть использован для переноса корневой системы [см. Ресурсы п. 2].


Как-то так:
# rsync -qaHEAXh --progress --exclude 'home' --exclude 'dev' --exclude 'proc' --exclude 'sys' --exclude 'media' --exclude 'mnt' /mnt/src-root/* /mnt/two-root 
потом и для home.

Часто практикуется синхронизация рабочей копии системы с резервной по расписанию.

Ну и обратная операция, когда всё проверено и работает так как надо, можно приступить к форматированию комплектно диска в GPT и обратный перенос. Файл заметки большой, а команд не так много.
При обратной операции попробую rsync.

Всё.



Ресурсы

1. Hybrid MBR. http://www.rodsbooks.com/gdisk/hybrid.html
2. Перенос Ubuntu на другой винчестер. http://lin.in.ua/articles/2-Debian/4-Opisanie_processa_perenosa_Ubuntu_Debian_na_drygoj_vinchester.html
3. О выравнивании разделов. http://www.linux.org.ru/wiki/en/%D0%92%D1%8B%D1%80%D0%B0%D0%B2%D0%BD%D0%B8%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D0%BE%D0%B2_%D0%B4%D0%B8%D1%81%D0%BA%D0%B0




Комментариев нет: