Я хочу переместить раздел на новый диск. Старый диск имеет размер сектора 512 байт, а новый - 4096 байт. Я попытался выполнить dd полного диска, но это не удалось, потому что раздел на старом диске не был выровнен по границам 4K. Поэтому вместо этого я создал раздел с нуля на новом диске с помощью fdisk, а затем скопировал этот раздел между дисками с помощью dd. Наконец, я расширил файловую систему на новом диске с помощью resize2fs. Кажется, это сработало, так как я могу смонтировать новый раздел (пока только для чтения) и просмотреть файлы, а fsck говорит, что он чистый.
Но я все еще сомневаюсь, безопасно ли это делать. Например, заботится ли FS о размере сектора таким образом, чтобы это нарушило работу, или она защищена от этого слоем VFS или самим HD?
Вы не сказали нам, какую команду dd вы пробовали изначально, но она не удалась. Однако я потратил немного времени на проверку исходного кода команды dd (из пакета coreutils) и, похоже, здесь возникла проблема.
1852 /* Some devices require alignment on a sector or page boundary
1853 (e.g. character disk devices). Align the input buffer to a
1854 page boundary to cover all bases. Note that due to the swab
1855 algorithm, we must have at least one byte in the page before
1856 the input buffer; thus we allocate 2 pages of slop in the
1857 real buffer. 8k above the blocksize shouldn't bother anyone.
1858
1859 The page alignment is necessary on any Linux kernel that supports
1860 either the SGI raw I/O patch or Steven Tweedies raw I/O patch.
1861 It is necessary when accessing raw (i.e. character special) disk
1862 devices on Unixware or other SVR4-derived system. */
Если вы дадите сообщение об ошибке, я могу продолжить поиск. Но для меня это то, где нас ударили. То есть выравнивание границы страницы 512 байт с границей страницы 4 КиБ кажется неправильным.
Теперь, переходя ко второй части, вы создали раздел второго диска (с помощью fdisk) размером 512 байт. Однако размер сектора, заявленный большинством современных дисков для ОС, составляет 1 Мбайт, то есть 4096 КиБ.
В функции update_sector_offset файла fdisk.c вы увидите
/*
* Align the begin of partitions to:
*
* a) topology
* a2) alignment offset
* a1) or physical sector (minimal_io_size, aka "grain")
*
* b) or default to 1MiB (2048 sectrors, Windows Vista default)
*
* c) or for very small devices use 1 phy.sector
*/
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;
}
/* default to 1MiB */
if (!x)
x = 2048 * 512;
sector_offset = x / cxt->sector_size;
* cxt - это дескриптор структуры fdisk.
Итак, эта часть мне непонятна. То есть, если ваш новый диск объявил размер сектора как 4096 КиБ или 512 байт.
Теперь перейдем к последней части.
Нет, файловые системы на самом деле не заботятся о размере сектора. И пока размер блока составляет 4 КиБ, все должно быть в порядке, потому что, поскольку размер виртуальной страницы (в контексте мм) равен 4 КиБ, ввод-вывод mmaped должен быть согласован с этим. В моем ноутбуке размер блока и размер физического сектора одинаковы.
$ sudo blockdev --getpbsz /dev/sda
[sudo] password for chakraborty:
4096
$ sudo blockdev --getbsz /dev/sda
4096
Ввод-вывод происходит в контексте размера блока, а не размера сектора. Если из-за размера физического сектора FS столкнется с какой-либо проблемой, я буду очень удивлен. Однако VFS не зашла так далеко. VFS находится между приложением, выполняющим ввод-вывод, и фактической файловой системой. То, что мы обсуждаем, находится ниже уровня VFS.