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


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

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


5
2017-12-22 07:04


Источник


использование dump а также restore - они работают на более высоком уровне и не зависят от геометрии диска. - Kondybas
Как dd сработал, когда вы попытались скопировать полный диск? - sendmoreinfo
Извините, я так плохо это сказал. Сам dd не терпел неудачу, просто я не мог использовать раздел, который был скопирован. fdisk -l предупредил, что раздел не был привязан к границам сектора, и не было устройства для скопированного раздела (например, был только файл / dev / sdd и no / dev / sdd1). - pavon


Ответы:


Вы не сказали нам, что изначально вы пытались выполнить команду 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 KiB не кажется правильным.

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

В функции 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 KiB или 512 байт.

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

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

$ sudo blockdev --getpbsz /dev/sda
[sudo] password for chakraborty: 
4096

$ sudo blockdev --getbsz /dev/sda
4096

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


3
2017-12-22 10:54



На моем новом диске размер блока и размер физического блока равны 4096, а старый диск имеет размер блока 4096 и размер физического блока 512 (как указано в блокеdev). Так что вы говорите, что файловая система заботится только о размере блока, а не о размере физического блока, который не изменился, и поэтому у меня не должно быть никаких проблем. Имеет смысл. Благодаря! - pavon
Да, если размер физического сектора старого диска составляет 512 байт, это ясно объясняет проблему. Вы не можете выровнять 512-байтовый диск с дисковой границей 4096 KiB. И ваш новый диск не должен иметь никаких проблем, вот и все. Кстати, если ответ вам помог, не стесняйтесь отмечать его как правильный ответ :) - Soham Chakraborty