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

Вопрос или проблема

Я хотел бы перенести раздел на новый диск. Старый диск имеет размер сектора 512 байт, в то время как новый имеет размер сектора 4096 байт. Я пытался выполнить команду dd для полного диска, но это завершилось неудачей, потому что раздел на старом диске не был выровнен по 4K границам. Поэтому я создал раздел с нуля на новом диске, используя fdisk, затем скопировал этот раздел между дисками с помощью dd. Наконец, я расширил файловую систему на новом диске с помощью resize2fs. Похоже, что это сработало, так как я могу смонтировать новый раздел (пока только в режиме только для чтения) и просматривать файлы, а fsck говорит, что он чист.

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

Вы не сказали, какая команда dd у вас не сработала вначале. Тем не менее, я потратил немного времени на проверку исходного кода команды dd (из пакета coreutils) и, похоже, у нас здесь есть проблема.

1852   /* Некоторые устройства требуют выравнивания по границе сектора или страницы
1853      (например, устройствам символического диска).  Выравните входной буфер по
1854      границе страницы, чтобы охватить все аспекты.  Обратите внимание, что из-за алгоритма
1855      swab у нас должно быть как минимум один байт в странице перед
1856      входным буфером;  таким образом, мы выделяем 2 страницы лишнего пространства в
1857      реальном буфере.  8k выше размера блока никому не помешает.
1858 
1859      Выравнивание по странице необходимо на любом ядре Linux, которое поддерживает
1860      либо патч SGI для необработанного ввода-вывода, либо патч Стивена Твидиса для необработанного ввода-вывода.
1861      Это необходимо при доступе к необработанным (т.е. специальным символам) дисковым
1862      устройствам на Unixware или других системах, производных от SVR4.  */

Если вы предоставите сообщение об ошибке, я смогу провести дальнейший поиск. Но, по моему мнению, именно здесь мы столкнулись с проблемой. То есть выравнивание 512-байтовой страницы с 4-кибибайтной страницей кажется неправильным.

Теперь, что касается второй части, вы создали раздел второго диска (с помощью fdisk) с размером сектора 512 байт. Однако размер сектора, который большинство современных дисков сообщает ОС, составляет 1 Миб (4096 Киб).

В функции update_sector_offset в файле fdisk.c вы увидите

/*
             * Выравнивание начала разделов по:
             *
             * a) топологии
             *  a2) выравниванию
             *  a1) или физическому сектору (minimal_io_size, также известному как "grain")
             *
             * b) или по умолчанию 1 Миб (2048 секторов, по умолчанию для Windows Vista)
             *
             * c) или для очень маленьких устройств использовать 1 физ. сектор
             */
            sector_t x = 0;

            if (fdisk_dev_has_topology(cxt)) {
                    if (cxt->alignment_offset)
                            x = cxt->alignment_offset;
                    else if (cxt->io_size > 2048 * 512)
                            x = cxt->io_size;
            }
            /* по умолчанию 1 Миб */
            if (!x)
                    x = 2048 * 512;

            sector_offset = x / cxt->sector_size;

*cxt — это дескриптор структуры fdisk.

Так что эта часть мне не ясна. То есть, если ваш новый диск сообщал размер сектора как 4096 Киб или 512 байт.

Теперь, перейдем к последней части.

Нет, файловые системы на самом деле не заботятся о размере сектора. И пока размер блока составляет 4 Киб, все должно быть в порядке, потому что, поскольку размер виртуальной страницы (в контексте mm) составляет 4 Киб, mmaped IO нужно выравнивать с этим. На моем ноутбуке размер блока и физический размер сектора одинаковы.

$ sudo blockdev --getpbsz /dev/sda
[sudo] пароль для chakraborty: 
4096

$ sudo blockdev --getbsz /dev/sda
4096

Ввод-вывод происходит в контексте размера блока, а не размера сектора. Если из-за физического размера сектора файловая система сталкивается с какой-либо проблемой, я был бы очень удивлен. Однако VFS не опускается так далеко. VFS находится между приложением, выполняющим ввод-вывод, и самой файловой системой. То, что мы обсуждаем, находится ниже уровня VFS.

Ответ или решение

Использование команды dd для работы с дисками с различными размерами секторов

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

Проблематичность использования команды dd

Ваша начальная попытка использовать команду dd для создания образа всего диска не удалась из-за того, что партиция на старом диске не была выровнена по 4K границам. В этом случае использование dd для копирования всего диска может привести к проблемам, связанным с невыравненными записями. Стандартные значения размера сектора, такие как 512 байт и 4096 байт, могут вызвать конфликты при попытке чтения и записи данных.

Правильный подход

Вместо копирования всего диска, рекомендуется следовать описанной вами схеме:

  1. Создать новую партицию на новом диске с помощью fdisk.
  2. Использовать dd для копирования данных из старой партиции в новую, при условии, что размер блока и физический размер сектора нового диска соответствуют требованиям файловой системы.
  3. Расширить файловую систему с использованием resize2fs.

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

Влияние размера сектора на файловую систему

Ответ на ваш вопрос о том, влияет ли размер сектора на работу файловой системы, заключается в том, что файловые системы обычно не чувствительны к размеру сектора на нижнем уровне. Виртуальная файловая система (VFS) обеспечивает абстракцию, которая позволяет файловым системам работать независимо от физических особенностей носителей. Главное, чтобы размер блока (например, 4K) совпадал с физическим размером сектора, что, как правило, не вызывает проблем.

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

Общее заключение

Ваша методология по переносу партиций, а также последующее расширение файловой системы с использованием resize2fs является правильной и адекватной. Если ваша новая партиция создавалась на основе правильных настроек и выровнена по 4K границам, то вы уменьшаете риски, связанные с конфликтацией форматов.

Рекомендации по безопасной работе

  1. Резервное копирование: Перед любыми операциями с дисками, включая dd, всегда создавайте резервные копии данных.
  2. Проверка размеров блоков: Используйте команды, такие как blockdev --getpbsz и blockdev --getbsz, чтобы проверить размеры физического блока и предполагаемого размера блока на диске.
  3. Тестирование: После завершения операции рекомендуется проводить тестирование и проверку целостности данных с помощью fsck, чтобы быть уверенными в правильности процесса.

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

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

Капча загружается...