Как исправить 512-байтовый сектор MBR на диске диска 4096 байт?

Окончательное обновление:

Я уже знал, что мне нужно сделать, чтобы решить эту проблему; Я просто не знал, как это сделать. Я надеялся, что будет готовый инструмент, чтобы сделать это автоматически, но не смог найти. Я принимаю ответ Рода, потому что, несмотря на то, что я не решаю проблему самостоятельно, он дает очень хороший опыт по проблеме размера сектора и дает мне уверенность в том, что проблема действительно связана с выравниванием разделов и адресацией. Для тех, кто приходит к этому вопросу с такой же проблемой, прочитайте его тщательно и тщательно, включая комментарии, прежде чем что-либо делать.


В начале

У меня был компьютер и мне нужно больше места. Я купил новый диск емкостью 500 ГБ и USB-накопитель. Вскоре я заметил, что если бы я разбил диск на корпусе и переместил его на компьютер, он не узнал бы разделы (и наоборот). Я предположил, что это проблема с корпусом, и не беспокоился об этом.

Затем, трагедия

Замечательный день, мой компьютер решил больше не включаться. Выключает материнскую плату (без брака, просто большой СДЕЛАНО В КИТАЕ, напечатанном на ней) мертв. Я использую его как файловый сервер, и этот накопитель на 500 ГБ теперь заполнен данными, которые я не могу потерять. Я сейчас сломался и не могу позволить себе новый компьютер, поэтому единственной надеждой явился «дефектный» USB-корпус.

Расследование

Вооружившись несколькими дистрибутивами Linux, ноутбуком, VirtualBox и корпусом, я сделал судебный анализ по этой проблеме. Dmesg сообщил, что размер раздела не превышает конечный диск. Поэтому я просмотрел таблицы данных жесткого диска, подсчитал количество секторов с нуля, проверил границы жестких дисков вручную с помощью dd, и все выглядело нормально, пока я не запустил fdisk, и он сказал:

Note: Sector size is 4096 (not 512). 

Как скромно fdisk. Эта «заметка» была корнем всех проблем. После того, как были сделаны другие выводы, были сделаны следующие выводы:

  • Корпус USB не неисправен.

  • Контроллер SATA на ныне мертвой материнской плате – это, по крайней мере, «странный». Он не сообщил о 4096-байтовых секторах операционной системе, поэтому ОС с радостью создала MBR с использованием адресов в 512 байт.

  • Теперь, когда я пытаюсь получить доступ к разделу, ОС пытается использовать 512-байтовые адреса на 4096-байтовом секторном диске, и, конечно же, это не сработает.

Вопрос

  • Итак, как я могу исправить адреса в MBR, чтобы они были действительны при размере сектора 4096 байт, кроме ручного редактирования MBR в hex-редакторе и

  • Разделы не выровнены для 4096-байтовых секторов. Есть ли какой-нибудь инструмент, позволяющий выровнять их помимо копирования на другом диске и из него? (У меня нет запасных дисков), или мне нужно будет создать какой-то инструмент, который «сдвигает» данные в сторону небольшого куска за раз? Разделы – ext3.

Благодаря!

Обновить:

Я нашел, что есть умный способ использовать dd для переключения раздела на место в этом вопросе: Как переместить раздел в GNU / Linux? Но я не знаю, будет ли это работать на кусочке сектора. Я не могу проверить это прямо сейчас, но буду делать, когда у меня будет время.

Обновление 2:

Поэтому я успешно выровнял раздел, используя вышеописанный метод, и отредактировал вручную MBR в шестнадцатеричном редакторе. Как только я снова подключу жесткий диск, раздел грома автоматически устанавливается! Я не рекомендую это, хотя во время процесса были ошибки ввода-вывода, и я мог потерять все, см. Комментарий к Роду. Для другого раздела я не буду рисковать и буду использовать старый жесткий диск и выровнять куски за один раз, скопировав данные, а затем вставив их обратно в другую позицию.

4 Solutions collect form web for “Как исправить 512-байтовый сектор MBR на диске диска 4096 байт?”

Проблемы с размером сектора становятся довольно сложными. До конца 2009 года на большинстве жестких дисков использовались 512-байтовые сектора, и это было так. В конце 2009 года производители дисков начали вводить так называемые диски Advanced Format (AF), которые используют 4096-байтовые сектора. Эти первые диски AF (и, AFAIK, все диски AF сегодня) представляют собой интерфейс к компьютеру, который показывает каждый 4096-байтовый физический сектор как разделенный на восемь 512-байтовых логических секторов. Это преобразование позволяет более старым инструментам, включая многие BIOS, которые были построены с 512-байтовыми предположениями, продолжать работать. Я не знаю, использует ли ваш диск AF или нет, но в любом случае он почти наверняка использует размер логического сектора размером в 512 байт, что означает, что интерфейс к ОС должен использовать 512-байтовые сектора.

Усложнением являются определенные корпуса USB-дисков. Некоторые из этих корпусов делают обратное то, что делает AF: они занимают восемь дисковых секторов и объединяют их в один новый 4096-байтовый сектор. Я не уверен, что за этим стоит рассуждение, но одним из практических преимуществ является то, что диски с более чем 2TiB могут использоваться со старой системой разделения MBR. Одним из основных недостатков является то, что диск, разделенный в одном из этих корпусов, не может использоваться напрямую или в корпусе, который не выполняет этот тип перевода. Аналогично, диск, подготовленный без этого перевода, не может использоваться, когда он переносится в такой корпус. Обратите внимание, что эта проблема выходит далеко за рамки самого MBR; Ваш диск может идентифицировать первый раздел как начальный (512-байтовый) сектор 2048, но если ваша операционная система будет искать сектор (4096 байт), он не найдет начало этого раздела! Вы столкнулись с этой проблемой. Таким образом, ваша первоначальная мысль о том, что ошибка USB-корпуса ближе к знаку, чем ваша недавняя мысль о том, что ваша материнская плата испортила ее. Таким образом, я никогда не слышал о размере сектора, перевозящего материнскую плату. (Однако некоторые аппаратные RAID-устройства делают это.)

Я не знаю, как заставить Linux корректировать представление о размере сектора, но если у вас достаточно свободного места на диске, это может сделать небольшая копия диска на другой диск. Например:

 dd if=/dev/sdb of=~/image.img 

Это скопирует ваш диск с /dev/sdb (диск USB, при необходимости отрегулируйте) в файл ~/image.img . Затем вы можете использовать следующий скрипт для монтирования разделов изображения:

 #!/bin/bash gdisk -l $1 > /tmp/mount_image.tmp let StartSector=`egrep "^ $2|^ $2" /tmp/mount_image.tmp | fmt -u -s | sed -e 's/^[ \t]*//' | head -1 | cut -d " " -f 2` let StartByte=($StartSector*512) echo "Mounting partition $2, which begins at sector $StartSector" mount -o loop,offset=$StartByte $1 $3 rm /tmp/mount_image.tmp 

Сохраните скрипт как, скажем, mount_image и используйте его следующим образом:

 ./mount_image ~/image.img 2 /mnt 

Это установит раздел 2 image.img в /mnt . Обратите внимание, что сценарий зависит от GPT fdisk ( gdisk ) , который в большинстве дистрибутивов содержится в пакете gptfdisk или gdisk .

В конечном итоге лучшим решением является поиск способа подключения диска, который не будет выполнять преобразование в размер сектора. Прямое подключение к новой материнской плате должно сделать трюк; Или вы можете найти внешнее приложение, которое не выполняет перевод. На самом деле, некоторые приложения делают перевод на USB-порты, но не на порты eSATA, поэтому, если ваш корпус имеет порт eSATA, вы можете попробовать его использовать. Я понимаю, что эти решения, вероятно, будут стоить денег, которые, как вы говорите, у вас нет, но, возможно, вы можете обменять свой переводный корпус на тот, который не выполняет перевод.

Другой вариант, который возникает для меня, – попробовать использовать виртуальную машину, такую ​​как VirtualBox. Такой инструмент может принимать размер сектора по 512 байт при доступе к дисководу, эффективно отменяя перевод; Или вы можете скопировать содержимое диска raw (как в dd if=/dev/sdc of=/dev/sdb ) в виртуальной машине, которое может скопировать содержимое со сжатием, что позволит изображению поместиться на меньшем диске Чем оригинальные.

Этот сценарий обобщил предложение Рода Смита, когда у вас есть рейд или криптография. Нет гарантий. Не стесняйтесь улучшать его! (Обновлено с последним обнаружением mdadm)

 #!/bin/sh # # This script solve the following problem: # # 1. create a GPT partition on a large disk while attached directly via SATA # when the device present itself with 512 bytes of block size: # sd 3:0:0:0: [sda] 5860533168 512-byte logical blocks: (3.00 TB/2.72 TiB) # # 2. try to use a SATA to USB adapter like ID 067b:2773 Prolific Technology, Inc. # this present the device with 4096 bytes of block size: # sd 19:0:0:0: [sdc] 732566646 4096-byte logical blocks: (3.00 TB/2.72 TiB) # # 3. The kernel is unable to read correctly the partition table with # the USB adaper. # # # With the current tools (kernel and gdisk) in debian wheezy is # possible to use losetup to remap the partitions to loop devices so # you can use them as usual with any filesystem, raid or crypto # # I still do not know if this issue is originated by the adapter or by # the disk and if there are any others workarounds. # # Known version of the software: # $ apt-show-versions linux-image-3.2.0-4-amd64 # linux-image-3.2.0-4-amd64/wheezy uptodate 3.2.54-2 # $ apt-show-versions gdisk # gdisk/wheezy uptodate 0.8.5-1 attach_device() { device="$1"; MYTMPDIR=`mktemp -d` trap "rm -rf $MYTMPDIR" EXIT # gdisk on the device use the 4096 sector size # but we need to force it to 512 # this is a knwon workaround from http://superuser.com/a/679800 # basically we make a copy of the gpt partition table on a file dd if="/dev/$device" bs=16384 count=1 of="$MYTMPDIR/gpt" 2> /dev/null # we extract the offset and the size of each partition # # FIXME: the "+ 1" seems strange, but it is needed to get the same # size value from: # # blockdev --getsize64 # # without the "+ 1" some funny things happens, for example # you will not be able to start a recognized md device: # # md: loop1 does not have a valid v1.2 superblock, not importing! # md: md_import_device returned -22 # # even if # # mdadm --examine /dev/loop1 # # does not complaint gdisk -l \ "$MYTMPDIR/gpt" 2> /dev/null | \ awk '/^ *[0-9]/ {printf "%.0f %.0f\n", $2 * 512, ($3 - $2 + 1) * 512}' > $MYTMPDIR/offset-size # we create a loop device with the give offset and size while read line; do offset=$(printf "$line" | cut -d ' ' -f 1); size=$(printf "$line" | cut -d ' ' -f 2); losetup --verbose --offset "$offset" --sizelimit "$size" `losetup -f` /dev/$device; done < $MYTMPDIR/offset-size; } detach_device() { device="$1"; for loopdevice in `losetup -a | grep "$device" | cut -d : -f 1`; do losetup --verbose --detach "$loopdevice"; done; } usage() { cat <<EOF Usage: - $0 -h to print this help - $0 sda to attach the gpt partitions of sda - $0 -d sda to detach the gpt partitions of sda EOF } detach=0; while getopts hd action do case "$action" in d) detach=1;; h) usage;; esac done shift $(($OPTIND-1)) if [ $# -ne 1 ]; then usage; fi if [ "x$detach" = "x0" ]; then attach_device $1; else detach_device $1; fi 

Другой, довольно прямой способ сделать это – использовать функцию спасения parted. Это требует, чтобы вы создали новый ярлык диска, поэтому он связан с рисками. Разделенные действуют непосредственно на диск, поэтому делайте резервные копии по мере необходимости перед запуском parted. Затем запустите:

 parted /dev/sdb 

Parted сообщит вам что-то в этом роде, пытаясь прочитать диск с разным размером сектора, чем с которым была создана таблица разделов:

 Error: /dev/sdb: unrecognised disk label 

Используйте mklabel для создания нового MBR или GPT в соответствии с тем, что вы ранее использовали

 (parted) mklabel New disk label type? mbr 

Затем запустите спасение, чтобы найти свой старый раздел

 (parted) rescue Start? 0 End? 4001GB Information: A ext4 primary partition was found at 1049kB -> 2000GB. Do you want to add it to the partition table? Yes/No/Cancel? y 

Повторите процесс спасения, если у вас больше разделов. Теперь вы закончили.

У меня возникла эта проблема, когда я удалил диск 4 ТБ из внешнего корпуса WD My Book. Проблема в:

  1. Таблица разделов MBR отключена в 8 раз и
  2. Таблица разделов MBR не может обрабатывать> 2TB, когда размер сектора равен 512.

Решение. Перепишите таблицу разделов в GPT, преобразуя значения в 512 секторов.

В моем случае раздел начинался с смещения 1 МБ и заканчивался (~ 856 КБ) до конца диска. Это хорошо, потому что тогда он разрешал MBR + GPT (17408 байт) перед разделом и резервным GPT (16896 байт) в конце диска.

Я сделал изображения обоих регионов на всякий случай (используя dd).

Я отметил вывод fdisk -l /dev/sde .

Я использовал gdisk для удаления первого раздела. Если вы хотите, вы можете сделать то же, что и я, и изменить значение выравнивания на 8 (4096), чтобы использовать как можно больше места. Затем я создал новый раздел с началом в 2048, а конец в конце диска. Я буду расширять файловую систему позже.

К счастью, изменение размера сектора не влияет на файловую систему, LVM или LUKS.

  • Самый быстрый способ восстановить исходный MBR Windows 7?
  • Необходимо исправить Windows MBR без использования компакт-диска
  • Windows 7 продолжает менять MBR при загрузке
  • Двойная загрузка Linux с Windows 7
  • Clonezilla не удается клонировать с несогласованными GPT и разделом MBR
  • Не удается увеличить объем
  • Клонирование установки Windows на жесткий диск 3 ТБ; MBR для GPT
  • Окна не могут запустить ошибку 0x490
  • Windows (с использованием загрузки UEFI на GPT-диске) больше не будет загружаться после добавления жесткого диска MBR
  • Удаление руткита из MBR .. без форматирования?
  • Перенос Windows 7 на новый жесткий диск / раздел
  • Давайте будем гением компьютера.