Sfdisk скопировать разметку диска
Состояние перевода: На этой странице представлен перевод статьи fdisk. Дата последней синхронизации: 1 февраля 2022. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.
fdisk из пакета util-linux - интерактивная консольная утилита, которая может создать таблицу разделов и разделы на жестком диске и управлять ими. В таблице разделов описано разбиение жесткого диска на разделы.
Эта статья объясняет fdisk(8) и связанную с ней утилиту sfdisk(8) .
Совет: Для базовых функций разметки можно использовать cfdisk(8) с текстовым пользовательским интерфейсом.
Задание 2 (Эмуляция отказа одного из дисков)
- Если вы поставили галочку hot swap, то вам доступно удаление дисков на лету:
- Выполните удаление диска ssd1 в свойствах машины.
- Найдите директорию, где хранятся файлы вашей виртуальной машины и удалите ssd1.vmdk.
- Убедитесь что ваша виртуальная машина по-прежнему работает
- Выполните перезагрузку виртуальной машины и убедитесь что она по-прежнему работает
- Проверьте статус RAID-массива: cat /proc/mdstat
- Добавьте в интерфейсе VM новый диск такого же размера и назовите его ssd3.
- Выполните операции:
- Посмотрите что новый диск приехал в систему командой fdisk -l
- Скопируйте таблицу разделов со старого диска на новый: sfdisk -d /dev/XXXX | sfdisk /dev/YYY
- Посмотрите результат командой fdisk -l
- Добавьте в рейд массив новый диск: mdadm --manage /dev/md0 --add /dev/YYY
- Посмотрите результат: cat /proc/mdstat . Вы должны увидеть что началась синхронизация
Теперь нужно вручную выполните синхронизацию разделов, не входящих в RAID. Для этого воспользуемся утилитой dd, скопировав с "живого" диска на новенький, который вы недавно поставили:
Опишите своими словами что вы сделали и какой результат получили в итоге проделанного задания.
Результат: удалён диск ssd1, сохранен диск ssd2, добавлен диск ssd3.
▍ 1.1. Отмонтируем смонтированные файловые системы
Список смонтированных файловых систем проще всего посмотреть командой df .
Отмонтируем (по имени раздела или конечной папки):
4. Перенос Volume Groups в LVM
Оказывается, где-то в формате LVM жёстко прописывается размер сектора. Поэтому вместо клонирования пришлось добавить новые разделы в Volume Group. Перенести информацию с помощью pvmove. Удалить старые разделы из Volume Group.
Но перед этих в настройках /etc/lvm/lvm.conf нужно раскомментировать возможность нахождения в одной VG дисков с разным размером сектора.
Объявляем раздел на новом физическом диске частью LVM-инфраструктуры:
Расширяем им Volume Group:
Переносим данные со старого диска на новый:
Удаляем старый диск из Volume Group:
Создание новой таблицы
Важно: Если вы создадите новую таблицу разделов на диске с данными, то все данные на нём будут удалены. Убедитесь, что это действительно то, что вы хотите сделать.
Чтобы создать новую таблицу разделов и удалить всю текущую информацию о разделах, введите o для таблицы разделов MBR или g для таблицы разделов GUID (GPT). Пропустите эти шаги, если необходимая таблица уже была создана.
Сортировка разделов
В ситуации, когда, например, новый раздел создаётся между двумя существующими или раздел удаляется, нумерация разделов может перестать соответствовать их реальному расположению на диске, и для исправления можно выполнить сортировку. В этом примере используется /dev/sda .
Если вы не используете постоянные имена для блочных устройств, то вам может понадобиться обновить файлы конфигурации, в которых используется нумерация разделов, в частности /etc/fstab и/или /etc/crypttab .
Примечание: Перед использованием новых разделов ядро должно перечитать обновлённую таблицу. Перезагрузитесь или попросите ядро перечитать таблицу разделов.
Я хочу сделать резервную копию всей схемы разделов жесткого диска, включая логические диски, чтобы я мог восстановить эту схему на другой диск. Я не хочу копировать содержимое разделов, только макет. Для основного и расширенного разделов это просто:
Но когда дело доходит до компоновки логических разделов, мне интересно, существует ли среди стандартных инструментов подобный способ сохранения макета? Я предполагаю, что основная проблема заключается в поиске смещений в местоположениях EBR, потому что с этим dd все остальное сделает. Имейте в виду, что я должен иметь возможность поместить все обратно на (возможно) чистый диск и, таким образом, восстановить тот же макет. Использование инструментов разделения вроде fdisk или parted хорошо, но я должен быть в состоянии автоматизировать их использование (создание сценариев), и они не должны зависеть ни от каких пакетов, связанных с X - только командная строка.
В моем плане резервного копирования это делается вручную в небольшом скрипте Python с использованием модуля struct, но я скорее надеялся, что есть более простой способ.
Вы можете использовать sfdisk для этой задачи.
Для таблиц разделов GPT это требуется sfdisk из util-linux 2.26 или новее. Он был переписан с нуля поверх libfdisk .
Это копирует UUID без изменений, а не генерирует новые. Таким образом, новый диск - это клон оригинала, а не просто еще один диск с такой же разметкой. Обратите внимание, что Linux /dev/disk/by-uuid/ смотрит на UUID файловой системы, но не на UUID в таблице разделов. sfdisk создаст новые UUID, если вы отредактируете UUID из дампа (для каждого раздела и UUID для самой таблицы разделов в начале файла).
Я не знаю наверняка, но единственное ограничение, которое приходит мне в голову, это ограничение размера в 2 ТБ для раздела, наложенное схемой таблицы разделов msdos. Чтобы преодолеть этот предел, вместо этого можно использовать GPT, но AFAIK sfdisk не может работать с GPT. Я не знаю, есть ли какой-либо другой лимит или sfdisk сообщит, если он не справится.
Для современного компьютера диск с 4К сектором выглядит предпочтительнее, чем с олдскульным 512B. Так как почти все современные ФС имеют размер кластера по-умолчанию 4KiB или больше. Поэтому использование 512B сектора несколько снижает производительность, а также увеличивает коэффициент умножения записи (Write Amplication) у SSD, что уменьшает ресурс.
Более того, сложно найти современные диски более 4ТБ с сектором 512N. Если диск и рапортует сектор в 512 байт, то, как правило, это 512E — эмулируемый, который используется в основном для совместимости со старыми контроллерами. А в реальности на физическом уровне используется 4К или даже больше (больше в основном у SSD).
Поэтому при покупке нового диска я выбрал диск с сектором 4КiB. И передо мной встала задача клонирования старого диска с 512B сектором (GPT) на новый c сектором 4KiB. Я хотел сохранить установленные Linux, Windows 10, Windows 7 и тома LVM, чтобы не заниматься переустановками ОС. В процессе чего всплыло несколько подводных камней.
Начну с того, что всем советую загрузочные диски (как и прочие, которые >= 2ТБ) делать в разметке GPT. Ибо это очень удобно.
Для GPT-дисков уже не нужна магия хитрых загрузчиков, которые записываются в MBR и многоступенчатым образом загружают вначале себя, а потом и операционную систему.
Достаточно записать загрузчик в специальный EFI-раздел, указать в биосе, что мы хотим загружать именно этот загрузчик и всё. Если биос неудобный или с усеченным функционалом, то я использую программу Hasleo EasyUEFI.
Итак, вернёмся к моей задаче. У меня на диске стоят в мультизагрузке :
- Calculate Linux (btrfs)
- Windows 10 LTSC (ntfs)
- Windows 7 (ntfs)
ВНИМАНИЕ
Данная лабораторная работа связана с такой тонкой материей как сохранность данных — это такая область, которая позволяет из-за мельчайшей ошибки — одной лишней буквы или цифры потерять все ваши данные.
Поскольку вы выполняете лабораторную работу вам ничего не грозит, разве что придется начать делать ее заново.
В реальной жизни все гораздо серьезнее, поэтому следует очень внимательно вводить имена дисков, понимая что именно вы выполняете текущей командой и с какими дисками работаете.
Второй важный момент — именование дисков и разделов: в зависимости от ситуации номера дисков могут отличаться от тех значений, что представлены в командах в лабораторной работе.
Так, например, если удалить диск sda из массива, а затем добавить новый диск, то новый диск будет отображаться в системе с именем sda. Если же выполнить перезагрузку перед добавлением нового диска, то новый диск будет иметь имя sdb, а старый станет именоваться sda
Лабораторная работа должна выполняться под суперпользователем (root) поскольку большая часть команд требует повышенных привилегий и не имеет смысла постоянно повышать привилегии через sudo.
Советы и рекомендации
▍ 3.2. Моя утилита ntfs_512_to_4k
Вооружившись описанием формата NTFS boot-сектора, я написал свою утилитку для его модификации после клонирования.
Естественно, я полностью отказываюсь от любой ответственности, если вы будете её использовать. Однако мне она помогла. Вот репозиторий на GitHub.
Примеры использования:
Показать информацию из загрузочного сектора NTFS и его копии.
Переделать информацию в загрузочных секторах NTFS из 512 в 4К-секторы (после клонирования)
Откатить изменения в загрузочных секторах с 4К на 512B-сектора
Но есть одна тонкость. Backup NTFS boot сектор хранится в последнем секторе раздела. А точнее в первых 512 байтах последнего сектора. Что даёт его разное положение в зависимости от размера сектора. Поскольку я не был уверен, что в последних 8 секторах нет никакой важной информации, то перед использованием своей проги я немного уменьшил размер NTFS-фс, применил свой скрипт, а потом опять её увеличил. Вот так это выглядело:
5. Клонирование раздела c BTRFS
Прошло отлично. Никаких коррекций загрузочных секторов не потребовалось.
Требования к инструментам для выполнения л\р:
- Средства виртуализации, например Virtualbox
- Установочный образ linux, например Debian9
- Наличие интернета для скачивания нескольких пакетов
- Подключение по ssh к установленной VM (опционально)
3. Клонируем разделы с NTFS
Поскольку по умолчанию размер кластера у NTFS равен 4К, то я думал никаких проблем не возникнет. Как же я ошибался!
NTFS спроектирована неидеально. Она выходит за пределы своего уровня абстракции, совершает access violation, о которых говорил Эдуард Шишкин (разработчик ReiserFS 4) в своём интервью. А именно непонятно, зачем в первый сектор NTFS записан размер сектора физического диска, размер NTFS в секторах, число скрытых секторов.
Посмотреть информацию об NTFS под Linux:
Из-за того, что в NTFS жёстко зашит размер сектора, разделы в Windows, в диспетчере дисков, отображаются как «RAW». И недоступны для чтения.
Что интересно, размер сектора диска совершенно безразличен Linux-драйверу ntfs-3g . Разделы NTFS под Linux прекрасно видны даже после клонирования 512B -> 4KiB.
Решать проблему «RAW» можно несколькими способами.
На текущий момент ни одна утилита для клонирования не умеет корректно клонировать NTFS-разделы между дисками с разным размером сектора, в том числе Clonezilla. Единственная программа, которая анонсирует эту функцию — это HdClone. Но она это делает топорно и не совсем верно, что лучше использовать мою самописную утилиту.
Вдохновившись анонсированной функций клонирования с 512 на 4К я решил попробовать эту прогу. Но в бесплатной версии не было функции клонирования отдельных разделов. Мне было жалко платить 20 евро и решил найти хакнутую программу. Нашёл. Проверил 10 антивирусами. Всё ОК. Запустил. И на всех моих дисках была испорчена $MFT. Я пока ещё не разобрался были ли они зашифрованы или просто испорчены, так как никакого требования не было оставлено.
Если вы хорошо владеете отладчиком и сможете разобраться с тем, что именно произошло, жду вас в личке для взаимовыгодного сотрудничества.
Потом я уже ради чистоты эксперимента я использовал официальную версию. И что? Она склонировала NTFS-раздел некорректно. Не заполнила NTFS backup boot-сектор. И, насколько я помню, chkdsk увидел ошибки на NTFS-разделе после клонирования.
▍ 3.3. Windows 10 и Windows 7
Windows 10 после коррекции NTFS заработала отлично.
А вот Windows 7 мне не удалось заставить работать. Совсем. Видимо при установке куда-то в неё записывается размер сектора диска и она выдаёт самые разнообразные ошибки, но не хочет работать, если он изменился.
Для корректного перенесения Windows 7 я попробовал использовать xcopy и robocopy с ключами для копирования всех прав. Но это не помогло. Windows 7 так и не смогла запуститься.
2. Клонирование EFI-раздела.
Вот тут и подстерёг меня первый подводный камень. На дисках с сектором 512 байт размер EFI раздела составляет около 100М. Но мы не можем просто склонировать этот раздел на конечный диск. Потому как для EFI-раздела есть требование, что число секторов в нём должно быть не менее 65527.
Для расширенного формата дисков объемом в машинном формате (4 КБ на сектор) минимальный размер составляет 260 Мб из-за ограничения формата файла FAT32. Минимальный размер раздела для дисков FAT32 вычисляется как размер сектора (4 КБ) x 65527 = 256 МБ.
Это ограничение не затрагивает диски расширенного формата 512e, так как их размер эмулированного сектора составляет 512 байт. 512 байт x 65527 = 32 МБ, что меньше, чем минимальный размер в 100 МБ для этой секции. Документация Microsoft.
У меня раздел на старом диске был как раз около 100МБ. Поэтому мне пришлось вначале создать структуру разделов с увеличенным EFI-разделом на диске-приёмнике, а потом клонировать каждый раздел в отдельности.
Соответственно, на диске-приёмнике я создал EFI-раздел размером 270МБ. Отформатировал его, а потом скопировал все файлы со старого раздела на новый.
Создание FAT32 на разделе 4К-диска:
Монтируем старый и новый EFI-разделы:
Копирование файлов загрузчиков со старого EFI-раздела на новый:
Используемые утилиты
- Просмотр информации о дисках:
- lsblk -o NAME,SIZE,FSTYPE,TYPE,MOUNTPOINT
- fdisk -l
- Просмотр информации и работа с LVM
- pvs
- pvextend
- pvcreate
- pvresize
- vgs
- vgreduce
- lvs
- lvextend
- Просмотр информации и работа с RAID:
- сat /proc/mdstat
- mdadm
- Точки монтирования:
- mount
- umount
- cat /etc/fstab
- cat /etc/mtab
- Переразметка диска:
- fdisk /dev/XXX
- Копирование разделов:
- dd if=/dev/xxx of=/dev/yyy
- Работа с таблицей разделов:
- partx
- sfdisk
- mkfs.ext4
- Работа с загрузчиком:
- grub-install /dev/XXX
- update-grub
- misc
- lsof
- apt
- rsync
Перемещение разделов
Важно: Разделы нельзя использовать в процессе их перемещения. Поскольку перемещение требует перезаписи всего раздела на диске, это медленная и потенциально опасная операция. Настоятельно рекомендуется создавать резервные копии! Согласно man-странице sfdisk, «эта операция рискованна и не является атомарной».
Запись изменений на диск
Для записи новой таблицы на диск и выхода используйте команду w .
Создание таблицы разделов и самих разделов
Первый шаг в разметке диска — создание таблицы разделов. После этого создаются собственно разделы в соответствии с желаемой схемой разметки. Смотрите статью Разметка диска, чтобы решить, что выбрать для использования: MBR или GPT.
Перед началом вы можете сделать резервную копию вашей текущей таблицы разделов и схемы.
В недавних версиях fdisk отказались от устаревшей системы использования цилиндров в качестве стандартной единицы измерения, как и от совместимости с MS-DOS по умолчанию. fdisk автоматически выполняет выравнивание по 2048 512-байтовым секторам (1 МиБ), что должно быть совместимо со всеми расширенными форматами HDD и подавляющим большинством SSD. Это означает, что с настройками по умолчанию вы получите правильное выравнивание.
Чтобы использовать fdisk, запустите программу с именем блочного устройства, которое вы хотите изменить. В этом примере используется /dev/sda :
Это откроет интерактивный режим fdisk, где вы можете вводить команды.
▍ 1.2. Отключаем активные Volume Groups в LVM
Иначе это может привести к непредсказуемым последствиям, так как ядро может запутаться — будет две одинаковые Volume Groups и на какую-то из них ему нужно писать данные.
Классические способы ( dd , cat , pv ) прекрасно подходят для клонирования LVM-разделов, если диски имеют одинаковый размер сектора. Но в моём случае после клонирования ими LVM-раздел не запустился. Оказалось, что в него всё-таки жёстко вшит размер сектора. Ниже я расскажу, как это обошёл. vgchange делать не пришлось.
Материалы для изучения
- RAID
- LVM
- Именование дисков в ОС Linux
- Что такое раздел
- Что такое таблица разделов и где она хранится
- Что такое grub
Задание 1 (Установка ОС и настройка LVM, RAID)
Создайте новую виртуальную машину, выдав ей следующие характеристики:
- 1 gb ram
- 1 cpu
- 2 hdd (назвать их ssd1, ssd2 и назначить равный размер, поставить галочки hot swap и ssd)
- SATA контроллер настроен на 4 порта:
Начать установку Linux и дойдя до выбора жестких дисков сделать следующее:
-
Partitioning method: manual, после чего вы должны увидеть такую картину:
- Partition size: 512M
- Mount point: /boot
- Create MD device
- Software RAID device type: Выберите зеркальный массив
- Active devices for the RAID XXXX array: Выбрать оба диска
- Spare devices: Оставить 0 по умолчанию
- Active devices for the RAID XX array: выбрать разделы, которые вы создавали под raid
- Finish
- logical volume name: root
- logical volume size: 2\5 от размера вашего диска
- logical volume name: var
- logical volume size: 2\5 от размера вашего диска
- logical volume name: log
- logical volume size: 1\5 от размера вашего диска
Закончить установку ОС, поставив grub на первое устройство (sda) и загрузить систему.
Выполните копирование содержимого раздела /boot с диска sda (ssd1) на диск sdb (ssd2)
Выполнить установку grub на второе устройство:
Посмотреть диски в системе:
Найдите диск на который не была выполнена установка grub и выполните эту установку:
Опишите своими словами что вы сделали и какой результат получили в итоге проделанного задания.
После выполнения этого задания рекомендуется сохранить резервную копию папки с виртуальной машиной или сделать vagrant box.
Результат: Виртуальная машина с дисками ssd1, ssd2.
Резервное копирование и восстановление таблицы разделов
Вы можете захотеть сделать резервное копирование таблицы разделов и схемы разделов диска перед их изменениями. Вы также можете использовать резервное копирование для копирования одинаковых разметок разделов на другие диски.
Вы можете использовать sfdisk для таблиц разделов GPT и MBR, чтобы сохранить разметку разделов вашего устройства в файл с параметром -d / --dump . Выполните следующую команду для устройства /dev/sda :
Файл должен выглядеть примерно так для одного раздела ext4 размером 1 ГиБ:
Чтобы позже восстановить эту разметку, вы можете выполнить:
Создание разделов
Создайте новый раздел с помощью команды n . Вам нужно будет ввести тип раздела, номер раздела, начальный сектор и конечный сектор.
Тип раздела
При исплоьзовании MBR fdisk спросит тип раздела. Введите p для создания первичного раздела или e для создания расширенного. Может быть до четырёх основных разделов.
fidsk не спрашивает ID типа раздела и по умолчанию использует 'Linux filesystem'; вы сможете изменить его позже.
Номер раздела
Номер раздела — это номер, присвоенный разделу, например, раздел с номером 1 на диске /dev/sda будет /dev/sda1 . Номера разделов могут не совпадать с реальным порядком разделов на диске, в этом случае их можно отсортировать.
Рекомендуется использовать номер по умолчанию, который предложит fdisk.
Первый и последний сектор
Первый сектор должен быть указан в абсолютном выражении с использованием номеров секторов. Последний сектор может быть задан с использованием абсолютного положения в секторах или в виде позиций, измеряемых в кибибайтах ( K ), мебибайтах ( M ), гибибайтах ( G ), тебибайтах ( T ) или пебибайтах ( P ).
Позиция последнего сектора может быть задана в:
- в абсолютном выражении от начала диска. Например, 40M в качестве первого сектора указывает позицию 40 МиБ от начала диска.
- в относительном выражении, предваряя размер символами +размер или -размер . Например, +2G указывает на позицию через 2 ГиБ после начального сектора, а -200M указывает на позицию 200 МиБ перед последним доступным сектором.
Нажатие Enter без ввода значения использует значение по умолчанию, которое является началом самого большого доступного блока для первого сектора и концом того же блока для последнего сектора.
- При разметке всегда рекомендуется использовать значения по умолчанию для первого и последнего секторов раздела. Кроме того, стоит указывать относительные размеры разделов с помощью нотации +размер и не использовать разделы меньше 1 МиБ. Такие разделы всегда будут выровнены в соответствии со свойствами устройства.
- На диске MBR оставьте неразмеченными как минимум 33 512-байтовых сектора (16,5 КиБ) в конце диска на случай, если вам понадобится преобразовать MBR в GPT. требует тип EFI System . требует раздел загрузки BIOS с типом BIOS boot при установке GRUB на диск с разметкой GPT.
- Рекомендуется использовать Linux swap для любого раздела подкачки, так как systemd будет автоматически монтировать его.
Повторяйте эту процедуру, пока не получите желаемые разделы.
Изменение типа раздела
У каждого раздела есть определённый тип. MBR использует partition ID; GPT использует GUID типов разделов.
Нажмите t , чтобы изменить идентификатор типа раздела. Используемое по умолчанию значение Linux filesystem должно быть подходящим для большинства случаев.
- Введите L для просмотра списка внутренних кодов fdisk.
- При использовании GPT рекомендуется следовать Discoverable Partitions Specification, поскольку systemd-gpt-auto-generator(8) будет монтировать их автоматически.
Contents
Загрузочный раздел
Вы можете отметить раздел как загрузочный, введя a .
6. Заключение
Как мы видим сложности возникают при клонировании EFI-раздела, NTFS-файловых систем, а также Volume Groups от LVM. Но они решаемые.
Благодарности
— За изображение спасибо TripletConcept. Его лучше смотреть в полном размере в отдельном окне.
Небольшое отступление: данная л\р является синтетической.
Некоторые задания которые здесь описаны можно сделать гораздо проще, но поскольку задача л/р — познакомиться с функционалом raid, lvm то некоторые операции искусственно усложнены.
▍ 3.4. Скрытые разделы Windows
Если посмотреть вывод gdisk , то мы увидим кроме основного раздела Windows ещё 2 скрытых раздела с кодами 2700 и 0C01, размерами примерно 500MiB и 16MiB.
Код 2700 соответствует разделу со средой восстановления. Этот раздел отформатирован в NTFS. Поэтому с ним поступаем как и было объяснено выше.
Посмотрим размер сектора, который зашит с помощью ntfsinfo и скорректируем, если нужно.
А вот с разделом с кодом 0C01 (обозначение «Microsoft reserved» в gdisk ) оказалась какая-то странность. На всех компьютерах, где я его смотрел, он не имел никакой файловой системы и был заполнен нулями. Поэтому я просто склонировал его dd .
Установка
fdisk и связанные с ним утилиты входят в состав пакета util-linux , который является частью мета-пакета base .
Чтобы просмотреть таблицы разделов и разделы на блочном устройстве, вы можете запустить fdisk, указав устройство (например: /dev/sda ), /dev/nvme0n1 , /dev/mmcblk0 , и т.д.):
Задание 3 (Добавление новых дисков и перенос раздела)
Это самое сложное и объемное задание из всех представленных. Очень внимательно проверяйте что вы делаете и с какими дисками и разделами. Рекомендуется снять копию перед его выполнением. Это задание независимо от задания №2, его можно выполнять после задания №1 с поправкой на имена дисков.
Вторая часть задания этой лабораторной должна привести в точно такое же состояние которое было после выполнения первой части.
Для того чтобы вам было проще работать могу рекомендовать не удалять физически диски с хостовой машины, а только лишь отсоединять их в свойствах машины. С точки зрения ОС в ВМ это будет выглядеть абсолютно одинаково, но вы сможете в случае чего подключить диск обратно и продолжить выполнение работы откатившись на пару пунктов назад, в случае если у вас возникли проблемы. Например вы могли выполнить неверно или забыть скопировать на новый диск раздел /boot. Я могу лишь посоветовать несколько раз перепроверять с какими дисками и разделами вы работаете, а еще лучше выписать на листочек соответствие дисков, разделов и "физическому" номеру диска. Красивое и понятное дерево рисует команда lsblk , пользуйтесь ей как можно чаще для анализа того что вы сделали и что нужно сделать.
Представьте себе что ваш сервер работал долгое время на 2-х ssd дисках, как вдруг.
Проэмулируйте отказ диска ssd2, удалив из свойств ВМ диск и перезагрузившись.
Посмотрите текущее состояние дисков и RAID:
Вам повезло — начальство разрешило закупить несколько новых дисков:
2 SATA большого объема для давно назревшей задачи вынесения раздела с логами на отдельный диск. 2 SSD на замену погибшему, а также на замену пока еще функционирующему.
Следует учитывать, что корзина сервера поддерживает установку только 4х дисков. одновременно, поэтому добавить все диски сразу нельзя.
Объем HDD выбрать в 2 раза больше чем SSD.
Объем SSD выбрать в 1,25 раза больше бывших SSD.
Добавьте один новый ssd диск, назвав его ssd4, а после добавления проверьте что произошло:
В первую очередь следует озаботиться сохранностью данных старого диска. На этот раз мы будем переносить данные с помощью LVM:
В первую очередь необходимо скопировать файловую таблицу со старого диска на новый:
Подставьте вместо x,y правильные диски и разберите что делает данная команда.
С помощью команды dd скопируйте данные /boot на новый диск:
Если /boot остался смонтирован на старом диске, его следует перемонтировать на живой диск:
Установите загрузчик на новый ssd диск:
Зачем мы выполняем эту операцию?
Создайте новый рейд-массив с включением туда только одного нового ssd диска:
Команда приведенная выше не отработает без указания специального ключа.Прочитайте справку и добавьте этот ключ к команде.
Следующим этапом необходимо настроить LVM
-
Выполните команду pvs для просмотра информации о текущих физических томах.
Создайте новый физический том включив в него ранее созданный RAID массив:
Увеличим размер Volume Group system с помощью такой команды:
Выполните команды и запишите что вы увидели и что поменялось.
На каком физическом диске сейчас находятся LV var, log, root?
Выполните перемещение данных со старого диска на новый, подставив правильные имена устройств.
Повторите операцию для всех logical volume.
Выполните команды и запишите что вы увидели и что поменялось.
Изменим наш VG, удалив из него диск старого raid. Подставьте правильное имя raid.
Выполните команды и запишите что вы увидели и что поменялось.
Удалите ssd3 диск и добавьте ssd5, hdd1, hdd2 согласно вышеописанным ТЗ, в итоге получив:
- ssd4 — первый новый ssd
- ssd5 — второй новый ssd
- hdd1 — первый новый hdd
- hdd2 — второй новый hdd
Проверьте что произошло после добавления дисков:
Восстановим работу основного raid массива:
Выполните копирование таблицы разделов, подставив правильные диски:
Обратите внимание, что когда мы скопировали таблицу разделов со старого диска лказалось что новый размер не использует весь объем жесткого диска. Поэтому в скором времени нам потребуется изменить размер этого раздела и расширить raid. Убедитесь в этом сами, введя команду:
Скопируйте загрузочный раздел /boot с диска ssd4 на ssd5:
Установите grub на новый диск (ssd5).
Изменим размер второго раздела диска ssd5.
Запустите утилиту для работы с разметкой дисков:
Перечитаем таблицу разделов и проверим результат:
Добавим новый диск к текущему raid массиву (не забудьте подставить правильные диски):
Расширим количество дисков в нашем массиве до 2-х штук:
Посмотрите результат: у нас размечено 2 массива, но оба раздела входящие в этот массив имеют разные размеры:
Увеличим размер раздела на диске ssd4
Запустите утилиту для работы с разметкой дисков:
Перечитаем таблицу разделов и проверим результат.
Обратите внимание, теперь sda2, sdc2 разделы имеют размер > чем размер raid-устройства.
На этом этапе размер raid можно теперь расширить:
Просмотрите lsblk и запишите что изменилось.
Однако, хоть мы и изменили размер raid, сами размеры vg root,var,log не изменились
Посмотрите чему равен размер PV:
Расширим размер нашего PV:
Посмотрите чему равен размер PV:
Добавим вновь появившееся место VG var, root:
На этом этапе вы завершили миграцию основного массива на новые диски. работа с ssd1,ssd2 закончена.
Наша следующая задача — переместить /var/log на новые диски, для этого создадим новый массив и lvm на hdd дисках.
Посмотрим какие имена имеют новые hdd диски:
Создадим raid массив:
Создадим новый PV на рейде из больших дисков:
Создадим в этом PV группу с названием data:
Создадим логический том размером всего свободного пространства и назовем его val_log:
Отформатируем созданные раздел в ext4:
Перенесем данные логов со старого раздела на новый
Примонтируем временно новое хранилище логов:
Выполним синхронизацию разделов:
Выясним какие процессы работают сейчас с /var/log:
Останавливаем эти процессы:
Выполним финальную синхронизацию разделов (тех данных что могли измениться с момента последней синхронизации):
Поменяем местами разделы:
Проверяем что получилось:
Самое важно на этом этапе — не забыть изменить таблицу раделов (ext4, например). Поскольку как бы мы не изменяли всякие raid, lvm — пока ФС на разделе не будет уведомлена о том что теперь размер раздела изменился, мы не сможем использовать новое пространство. Используйте команду resize2fs для изменения ФС.
-
Выполним перезагрузку. Если вы все сделали правильно — вы снова попадете в вашу ОС (это нужно для того чтобы убедиться что все работает. Никакого смысла кроме самопроверки этот шаг не несет)
Выполните проверки, что все что мы хотели сделать действительно было сделано:
[ОПЦИОНАЛЬНО] Выполните действия
-
Перезагрузитесь нажимая F12, чтобы указать при загрузке разные диски, для того чтобы убедиться что вы можете загрузиться с любого из ssd дисков, так чтобы мы не боялись отказа одного из них.
Теперь у вас есть ненужный LV log в VG system. Распределите это пространство между root или var, но вместо использования конструкции 100%FREE укажите размер руками с помощью ключа -L:
Связаться со мной:
У нас есть сервер в котором 2 диска: /dev/sda и /dev/sdb. Эти диски собраны у нас в софтверный RAID1 с помощью mdadm. Один из дисков вышел из строя, в нашем случае это /dev/sdb.
I. Удаление диска из массива
Перед заменой диска желательно убрать диск из массива. Для начала проверим как размечен диск в массиве:
В данном случае массив собран так. Что md0 состоит из sda2 и sdb2, md1 из sda3 и sdb3, md2 из sda4 и sdb4. На этом сервере md0 это /boot, md1 — своп, md2 — корень. Убираем sdb из всех устройств.
Если разделы из массива не удаляются, это как в нашем случае. Mdadm не считает диск неисправным и использует его, и при удалении мы увидим ошибку, что устройство используется. В этом случае перед удалением помечаем диск как сбойный.
А затем снова выполним команды по удалению разделов из массива. Все, мы удалили сбойный диск из массива. Теперь можем писать в датацентр запрос на замену диска.
II. Добавление диска в массив после замены
1. Определение таблицы разделов(GPT или MBR) и перенос её на новый диск
После замены поврежденного диска нужно добавить новый диск в массив. Для этого надо определить какая у нас таблица разделов: GPT или MBR. Для этого будем использовать gdisk Установим gdisk:
Где /dev/sda — исправный диск находящийся в raid. В выводе будет примерно это для MBR:
И примерно это для GPT:
Перед добавлением диска в массив нам нужно на нем создать разделы в точности такие же как и на sda. В зависимости от разметки диска это делается по разному.
Копирование разметки для GPT:
Здесь надо быть внимательным. Первым пишется диск на который копируется разметка, а вторым с которого копируют. Если перепутать их местами, то разметка на изначально исправном диске будет уничтожена. Даем диску новый случайный UIDD:
Копирование разметки для MBR:
Здесь наоборот первым пишется диск с которого переносим разметку, а вторым на который переносим. Если разделы не видны в системе, то можно перечитать таблицу разделов командой:
2. Добавление диска в массив
Когда мы создали разделы на /dev/sdb, то можно добавлять диск в массив.
III. Установка загрузчика
После добавления диска в массив нужно установить на него загрузчик. Если сервер загружен в нормальном режиме, то это делается одной командой:
Если сервер загружен в recovery или rescue, т.е с live cd, то установка загрузчика выглядит следующим образом. Монтируем корневую файловую систему в /mnt:
Монтируем /dev, /proc и /sys:
Затем делаем chroot в примонтированную систему:
И устанавливаем grub на sdb:
Теперь можно попробовать загрузится в нормальный режим.
P.S. Если при установке загрузчика возникнет ошибка Could not find device for /boot/boot: not found or not a block device то вам сюда.
▍ 1.5. А что насчёт TRIM?
Можно попробовать увеличить скорость клонирования, если перед клонированием сделать TRIM целого диска-приёмника.
Или одного раздела.
После клонирования (простыми программами типа dd , pv , cat ) можно тримнуть склонированную файловую систему. Но делать это нужно лишь после того, как диск-источник удалён, а склонированная ФС подмонтирована.
Если вы дата-параноик, то не делайте этого, так как потом не сможете с диска восстановить удалённые файлы.
Естественно, ваш диск должен поддерживать TRIM. Многие корпоративные накопители его не поддерживают, так как для у них достаточно резервного пространства и не нужны непредсказуемые задержки от TRIM.
Рейд-массивы тоже, как правило, TRIM не поддерживают, так как содержание ячеек после TRIM по стандартам не определено, а рейд-массиву нужно считать контрольные суммы.
Манипуляции с TRIM перед/после клонирования вряд ли дадут какой-то существенный выигрыш, но хуже точно не будет.
▍ 3.1. Пересоздаём загрузочный сектор NTFS c помощью программы TestDisk
Прекрасная программа, которая есть как под Windows, так и в большинстве репозиториев Linux. В данном случае опция «Rebuild BS» выручает, но и она не всегда корректно работает.
Проблема в том, что эта функция работает исходя из битовой карты и $MFT. Для целей восстановления данных — это хороший подход, но для клонирования лучше просто пересчитать NTFS boot sector. Чтобы не делать это руками, я написал скрипт, о котором ниже.
Лабораторная работа состоит из 3-х частей:
- Настройка работоспособной системы с использованием lvm, raid.
- Эмуляция отказа одного из дисков.
- Замена дисков на лету, с добавлением новых дисков и переносом разделов.
▍ 1.4. Таблица разделов
Из-за того, что 4К-сектор больше в 8 раз, чем 512B потребуется после клонирования ещё изменить таблицу разделов. Так как разделы задаются в секторах. Это можно сделать вручную по раздельно с помощью gdisk , а можно использовать sfdisk .
В таблице которую показывает gdisk (внутренняя команда p ) можно увидеть что-то подобное:
Мы видим размер логического и физического секторов, а также в таблице есть начальные и конечные сектора. Стартовый сектор нам достаточно разделить на 8, чтобы получить номер сектора для 4К-диска, а вот конечный сектор считает по чуть более сложной формуле. Мы прибавляем 1, делим на 8, и вычитаем 1. В консоли выполнить вычисления можно так:
Или примерно так:
Можно отредактировать все разделы оптом. Мы записываем таблицу разделов в файл, а потом редактируем его.
И заливаем заново на диск:
После любого изменения таблицы дисков желательно дать ядру знать об этом командой:
▍ 1.3. Клонирование стандартными утилитами
Вначале я просто склонировал один диск на другой.
Классический способ это:
Хотя, лично я предпочитаю вот такой:
Программа pv показывает полосу копирования, текущую скорость, ожидаемое время и использует/подбирает размер блока для более быстрого копирования.
Если на системе нет ни pv , ни dd то можно использовать cat :
В этом случае тоже будет всё скопировано быстро, то без всяких плюшек типа полосы копирования. Некоторые админы шаманского типа считают, что cat — самая оптимизированная прога для копирования потоков данных и поэтому делают так:
Сочетают оптимизированность cat и плюшки pv . По моим прикидкам достаточно pv . Я не смог увидеть какого-то существенного выигрыша.
Также можно клонировать разделы по отдельности. В конечном итоге мне так и пришлось сделать, так как всплыло несколько проблем (о них ниже).
Вышеперечисленные способы клонирование, естественно, работают когда источник (source) по размеру меньше или равен назначению (target).
Вообще во многих случаях клонировать удобно используя флэшку с Clonezilla. Но, как выяснилось, она не может корректно отработать случай с клонированием с 512B диска на 4КiB-диск. Хотя в остальном Clonezilla хороша. Она умеет клонировать только занятые сектора, что существенно экономит время.
1. Клонирование
Читайте также: