Вопрос или проблема
Я хотел бы перенести раздел на новый диск. Старый диск имеет размер сектора 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 байт, могут вызвать конфликты при попытке чтения и записи данных.
Правильный подход
Вместо копирования всего диска, рекомендуется следовать описанной вами схеме:
- Создать новую партицию на новом диске с помощью
fdisk
. - Использовать
dd
для копирования данных из старой партиции в новую, при условии, что размер блока и физический размер сектора нового диска соответствуют требованиям файловой системы. - Расширить файловую систему с использованием
resize2fs
.
Это гарантирует, что новая партиция будет создана с актуальными параметрами и не будет иметь проблем с выравниванием.
Влияние размера сектора на файловую систему
Ответ на ваш вопрос о том, влияет ли размер сектора на работу файловой системы, заключается в том, что файловые системы обычно не чувствительны к размеру сектора на нижнем уровне. Виртуальная файловая система (VFS) обеспечивает абстракцию, которая позволяет файловым системам работать независимо от физических особенностей носителей. Главное, чтобы размер блока (например, 4K) совпадал с физическим размером сектора, что, как правило, не вызывает проблем.
Тем не менее, важно убедиться, что при создании новой партиции размер блока соответствует размеру сектора, чтобы избежать возможных проблем с производительностью или совместимостью.
Общее заключение
Ваша методология по переносу партиций, а также последующее расширение файловой системы с использованием resize2fs
является правильной и адекватной. Если ваша новая партиция создавалась на основе правильных настроек и выровнена по 4K границам, то вы уменьшаете риски, связанные с конфликтацией форматов.
Рекомендации по безопасной работе
- Резервное копирование: Перед любыми операциями с дисками, включая
dd
, всегда создавайте резервные копии данных. - Проверка размеров блоков: Используйте команды, такие как
blockdev --getpbsz
иblockdev --getbsz
, чтобы проверить размеры физического блока и предполагаемого размера блока на диске. - Тестирование: После завершения операции рекомендуется проводить тестирование и проверку целостности данных с помощью
fsck
, чтобы быть уверенными в правильности процесса.
Следуя этим рекомендациям и подходам, вы сможете эффективно управлять переносом партиций между дисками с различными размерами секторов, минимизируя риск ошибок и потери данных.