Страницы

Показаны сообщения с ярлыком MBR. Показать все сообщения
Показаны сообщения с ярлыком MBR. Показать все сообщения

суббота, 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




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

Монтирование образа диска, с разделами. Mount dd-image

Монтирование образа диска с разделами, из командной строки, может быть не такой простой.

Создадим образ диска (например флешки), либо возьмем имеющийся, созданной какой-либо программой, например dd.

Для примера, можно потренироваться на простом образе:

Создадим файл-образ:
iam@mir:$ truncate --size=128MiB test.img
Это пустой файл.

Разметка образа в старую систему MBR (хотя можно также использовать GPT - gdisk).
iam@mir:$ fdisk test.img

Создадим 2 любых первичных раздела:

и посмотрим что получилось (первый раздел 64MiB, второй - что осталось):

iam@mir:$ fdisk -l test.img


Диск test.img: 134 МБ, 134217728 байт
255 головок, 63 секторов/треков, 16 цилиндров, всего 262144 секторов
Units = секторы of 1 * 512 = 512 bytes
Размер сектора (логического/физического): 512 байт / 512 байт
I/O size (minimum/optimal): 512 bytes / 512 bytes
Идентификатор диска: 0xdcf09775

Устр-во Загр     Начало       Конец       Блоки   Id  Система
test.img1            2048      127047       62500   83  Linux
test.img2          127048      262143       67548   83  Linux

Кстати видно, что утилита fdisk из последних версий, осуществляет выравнивание разделов, иначе бы, начало первого раздела было с сектора 63, а не 2048. 


Итак, основная идея - использование опции offset и sizelimit команд losetup и mount. Это потенциально позволит взять любой кусок из файла и примонтировать его.

Для получения смещения первого раздела, вычислим 2048 х 512 = 1048576
Для получения смещения второго раздела, вычислим 127048 х 512 = 65048576

Примонтируем первый раздел образа, как петлевое устройство /dev/loop7
iam@mir:$ sudo losetup --offset=1048576 --sizelimit=64MiB /dev/loop7 test.img

Посмотрим:
iam@mir:$ sudo losetup -a
/dev/loop7: [0804]:3823823 (/home/iam/test.img), offset 1048576, sizelimit 67108864

Сделаем файловую систему на разделе. Я предпочитаю UDF.
iam@mir:$ sudo mkudffs /dev/loop7
start=0, blocks=16, type=RESERVED 
start=16, blocks=3, type=VRS 
start=19, blocks=237, type=USPACE 
start=256, blocks=1, type=ANCHOR 
start=257, blocks=16, type=PVDS 
start=273, blocks=1, type=LVID 
start=274, blocks=32237, type=PSPACE 
start=32511, blocks=1, type=ANCHOR 
start=32512, blocks=239, type=USPACE 
start=32751, blocks=16, type=RVDS 
start=32767, blocks=1, type=ANCHOR

Можно отмонтировать петлевое устройство:
iam@mir:$ sudo losetup -d /dev/loop7

Проверяем, правильно ли всё сделали - монтируем:

root@mir:# mount test.img /mnt/udf -o loop,offset=1048576

Если всё правильно, в синтаксисе не ошиблись, то можно читать писать в каталог /mnt/udf

Отмонтируем наш 64MiB раздел:
root@mir:# sync && umount /mnt/udf

Со вторым разделом, можно проделать тоже самое.