4096 바이트 섹터 디스크에서 512 바이트 섹터 MBR을 수정하는 방법은 무엇입니까?


23

최종 업데이트 :

나는이 문제를 해결하기 위해 무엇을해야하는지 이미 알고 있었다. 나는 그것을 하는 방법 을 몰랐다 . 자동으로 수행 할 수있는 기성 도구가 있기를 바랐지만 찾을 수 없었습니다. 내 문제를 직접 해결하지는 못했지만 섹터 크기 문제에 대한 훌륭한 배경 지식을 제공하고 문제가 실제로 파티션 정렬 및 주소 지정이라는 확신을 얻었으므로 Rod의 대답을 받아들입니다. 이 문제가 같은 문제를 겪고있는 사람들은 무엇이든하기 전에 주석을 포함하여 철저하고 신중하게 읽으십시오.


처음에

컴퓨터가 있고 더 많은 공간이 필요합니다. 새로운 500GB 드라이브와 USB 인클로저를 구입했습니다. 곧 인클로저의 드라이브를 파티션으로 나누고 컴퓨터로 옮길 경우 파티션을 인식하지 못하고 그 반대도 마찬가지입니다. 인클로저에 문제가 있다고 생각했지만 걱정하지 않았습니다.

그런 다음 비극

멋진 날, 내 컴퓨터는 더 이상 켜지지 않기로 결정했습니다. 마더 보드 (브랜드 제외, 인쇄 된 큰 MADE IN CHINA)가 죽었습니다. 필자는 파일 서버로 사용했으며 500GB 드라이브에는 손실 할 수없는 데이터가 가득합니다. 지금은 파산하여 새 컴퓨터를 구입할 수 없기 때문에 유일한 희망은 "결함이있는"USB 인클로저였습니다.

조사

여러 Linux 배포판, 랩톱, VirtualBox 및 인클로저로 무장하여 문제에 대한 법의학 분석을 수행했습니다. dmesg는 파티션 크기가 드라이브 끝 이상이라고보고했습니다. 그래서 하드 디스크 데이터 시트를 검토하고 처음부터 섹터 수를 계산하고 dd를 사용하여 수동으로 드라이브 경계를 테스트했으며 fdisk를 시작하기 전까지 모든 것이 정상으로 보였습니다.

    Note: Sector size is 4096 (not 512).

fdisk의 겸손 함 이 "노트"는 모든 문제의 근원이었습니다. 좀 더 조사한 후에 이러한 결론이 도출되었습니다.

  • USB 인클로저에 결함이 없습니다.

  • 현재 죽은 마더 보드의 SATA 컨트롤러는 적어도 "이상한"것입니다. 4096 바이트 섹터를 운영 체제에보고하지 않았으므로 OS는 행복하게 512 바이트 섹터 주소를 사용하여 MBR을 작성했습니다.

  • 이제 파티션에 액세스하려고하면 OS가 4096 바이트 섹터 드라이브에서 512 바이트 기반 주소를 사용하려고 시도하지만 물론 작동하지 않습니다.

질문

  • 따라서 16 진수 편집기에서 MBR을 수동으로 편집하는 것 외에 MBR의 주소를 4096 바이트 섹터 크기로 유효하게 수정하려면 어떻게해야합니까?

  • 파티션이 4096 바이트 섹터에 맞게 정렬되지 않았습니다. 다른 드라이브에 복사하거나 다른 드라이브에서 복사하지 않고 정렬 할 수있는 도구가 있습니까? (예비 드라이브가없는 경우) 또는 한 번에 조금씩 데이터를 측면으로 "이동"하는 도구를 만들어야합니까? 파티션은 ext3입니다.

감사!

최신 정보:

이 질문에서 dd를 사용하여 파티션을 이동시키는 영리한 방법이 있다는 것을 알았습니다. GNU / Linux에서 파티션을 이동하는 방법은 무엇입니까? 그러나 그것이 한 부문에서 작동하는지는 모르겠습니다. 나는 지금 그것을 테스트 할 수 없지만 시간이있을 때 할 것입니다.

업데이트 2 :

그래서 위의 방법을 사용하여 파티션을 성공적으로 정렬하고 16 진수 편집기에서 MBR을 수동으로 편집했습니다. HDD를 다시 연결하자마자 파티션이 자동으로 마운트되었습니다! 나는 이것을 권장하지 않지만, 프로세스 중에 I / O 오류가 있었고 모든 것을 잃어 버릴 수 있습니다. Rod의 답변에 대한 의견을 참조하십시오. 다른 파티션의 경우 위험을 감수하지 않으며 이전 HDD를 사용하고 데이터를 복사 한 다음 다른 위치에 다시 붙여 넣어 한 번에 청크를 정렬합니다.


컴퓨터 작동 방식에 대한 교훈을 줄 수있을 것입니다. (그리고 문제가 해결되면 현금으로 다른 하드 드라이브를 구입하십시오)
barlop

@barlop 감사합니다! ) 나는이 파티션 어려운 방법을 수정해야 할 것이다) =; 두 번째 작업이 지금 더 - 이동 없도록하지만 난 이미 내 직업과 대학 사이에 내 일을 분할해야
NothingsImpossible

1
오전 6시입니다.이 문제의 마지막 밤을 보냈습니다!
Leonel

1
좋아, 나는 반대 문제가있다 : 인클로저를 사용하여 포맷 된 1TB 디스크가 있습니다. 따라서 섹터 주소 당 4096 바이트를 사용하여 포맷되었습니다. MBR을 직접 편집하는 것이 불편합니다. 그리고 SATA (섹터 당 512 바이트)에서 HDD를 직접 사용해야합니다.
Leonel

1
@Leonel Linux fdisk를 사용 하여 MBR을 편집 할 수 있습니다 (나중에 이것을 배웠으므로 16 진 편집기 필요 없음). 각 시작점과 크기를 변경하고 적용하기 전에 변경 사항을 검토 할 수 있습니다. 따라서 : start fdisk, 현재 구성을 적어 두거나 (또는 ​​더 나은 MBR 백업 dd) 시작 주소와 크기 값에 8을 곱한 다음 변경하십시오. 계산기로 모든 것을 확인하고 값의 의미를 이해해야합니다. Size = End-Start + 1이라는 fdisk것을 알 수 있으며 1000 섹터 단위로 크기를 표시하므로 실제 값 등을보기 위해 전문가 모드를 켜야 할 수도 있습니다.
NothingsImossible

답변:


24

부문 별 문제는 점점 복잡해지고 있습니다. 2009 년 말까지 대부분의 하드 디스크는 512 바이트 섹터를 사용했습니다. 2009 년 말, 디스크 제조업체는 4096 바이트 섹터를 사용하는 소위 AF ( Advanced Format ) 디스크를 도입하기 시작했습니다 . 이 첫 번째 AF 디스크 (및 현재 모든 AF 디스크 AFAIK)는 각각의 4096 바이트 물리 섹터를 8 개의 512 바이트 논리 섹터 로 나눈 것으로 표시하는 컴퓨터에 대한 인터페이스를 제공합니다 . 이 변환을 통해 512 바이트 가정으로 구축 된 많은 BIOS를 포함한 이전 도구가 계속 작동 할 수 있습니다. 디스크에서 AF를 사용하는지 여부는 알 수 없지만 두 경우 모두 거의 512 바이트 논리 섹터 크기를 사용하므로 OS에 대한 인터페이스가 512 바이트 섹터를 사용해야합니다.

복잡한 문제는 특정 USB 디스크 인클로저입니다. 이러한 인클로저 중 일부는 AF와 반대로 작동합니다. 8 개의 디스크 섹터를 사용하여 새로운 4096 바이트 섹터로 묶습니다. 이 움직임의 원인이 무엇인지 잘 모르겠지만 실용적인 이점 중 하나는 2TiB보다 큰 디스크를 이전 MBR 파티셔닝 시스템과 함께 사용할 수 있다는 것입니다. 한 가지 주요 단점은 이러한 인클로저 중 하나에 파티션 된 디스크를 직접 또는 이러한 유형의 변환을 수행하지 않는 인클로저에서 사용할 수 없다는 것입니다. 마찬가지로이 변환없이 준비된 디스크는 이러한 인클로저로 전송 될 때 사용할 수 없습니다. 이 문제는 MBR 자체를 훨씬 뛰어 넘습니다. 디스크가 첫 번째 파티션을 (512 바이트) 섹터 2048로 시작하는 것으로 식별 할 수 있지만 OS가 (4096 바이트) 섹터 2048을 찾으려면그 파티션의 시작을 찾으십시오! 이 문제가 발생했습니다. 따라서 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

이것은의 파티션이 마운트됩니다 image.img/mnt. 이 스크립트는 GPT fdisk ( gdisk) 에 의존하며 , 대부분의 배포판은 gptfdiskor 라는 패키지에 포함되어 gdisk있습니다.

장기적으로 더 나은 솔루션은 섹터 크기 변환을 수행하지 않는 디스크를 연결하는 방법을 찾는 것입니다. 새로운 마더 보드에 직접 연결하면 문제가 해결됩니다. 또는 번역을 수행하지 않는 외부 인클로저를 찾을 수 있습니다. 실제로 일부 인클로저는 USB 포트에서는 번역을 수행하지만 eSATA 포트에서는 변환하지 않으므로 인클로저에 eSATA 포트가 있으면이를 사용해 볼 수 있습니다. 이 솔루션은 비용이 많이 들기 때문에 비용이 많이 들지 않지만 번역 엔클로저를 번역하지 않는 번역 엔클로저로 교환 할 수 있습니다.

나에게 발생하는 또 다른 옵션은 VirtualBox와 같은 가상 컴퓨터를 사용해 보는 것입니다. 이러한 도구는 디스크 장치에 액세스 할 때 512 바이트 섹터 크기를 가정하여 변환을 효과적으로 취소 할 수 있습니다. 또는 dd if=/dev/sdc of=/dev/sdb가상 머신 내 에서 디스크의 내용을 원시 ( )에서와 같이 복사 할 수 있습니다. 압축을 사용하여 내용을 복사 할 수 있으므로 이미지가 원본보다 적은 디스크 공간에 맞도록 할 수 있습니다.


매우 통찰력있는 대답이지만 내가 찾고있는 것이 아닙니다. 나는 이미 가상 머신 방법을 시도했지만 번역을 취소하지 않았습니다. 방금 집에 도착하여 dd를 사용하여 첫 번째 파티션 (작고 덜 중요한 파티션)을 정렬하고 밤새 실행하도록하겠습니다. 성공하면 아무도 대답하지 않으면 직접 MBR을 편집하려고합니다.
Nothings11

4
dd!를 통해 디스크 내용을 수정 하지 마십시오 . 당신이 아니라면 매우 신중하고 일을 이해하는 매우 잘 (또는이다 매우 운), 당신은 더 많은 가능성이 수정 그것보다 일을 휴지통입니다. 다음을 사용하여 파티션 테이블을 조정할 수 있습니다fdisk. 원본을 백업 한 다음 모든 파티션의 시작 지점을 8로 나눕니다 (그리고 다음 파티션의 시작 지점 직전에 종료 지점을 설정하십시오). 이것은 파티션 시작점 값이 모두 8의 배수 인 경우에만 가능합니다.
Rod Smith

1
이런 젠장! 정보에 대해서 감사드립니다. 지금 당장 Mac / Windows HDD를 SSD에 복제하려고했는데 마침내 문제를 확인할 수있었습니다. SSD 연결에 사용한 Rosewill SATA / IDE-USB 어댑터가이 "역변환을 수행하고있었습니다. "를 4096 바이트 섹터로! 따라서 ddUSB를 통해 연결된 상태 에서 클론을 수행 한 후 SSD의 GPT + 하이브리드 MBR이 넌센스처럼 보 였으며 클론이 실패했다고 생각했습니다. 그러나 오래된 HDD 대신 SSD를 마더 보드에 직접 연결하면 모든 것이 제대로 작동했습니다!
Eliot

1
이전 주석을 편집 할 수 없지만이 경우 정렬 도구는 쓸모가 없으며 최적화 목적으로 만 사용됩니다. 그러나 TestDisk를 사용할 수 있고 더 깊은 스캔 후 P를 눌러 파일을 나열하고 디스크의 내용을 복구하십시오 (이것은 데이터를 복구하는 방법이지만 바이트 섹터를 수정할 방법을 찾지 못했습니다) 오늘 ...).
gaborous

1
: 솔루션에서 문제와 힌트를 확인 흥미로운 읽기 (다리의 리눅스 루프백 장치를 통해 번역 에뮬레이션) goughlui.com/2013/10/02/...askubuntu.com/questions/337693/...을 . 그리고 추가 참고 사항으로, 물리적 크기와 일치하도록 논리적 크기를 강제로 편집하려고 시도했지만 드라이브가 여전히 인식되지 않았습니다. 그러나 포맷하면 마운트가 고정되지만 파일은 손실되므로 루프백 마운트 또는 테스트 디스크를 통해 복구하기 전에 파일을 더 잘 복구하십시오.
gaborous

4

이 스크립트는 레이드 또는 암호가있을 때로드 스미스 제안을 일반화했습니다. 보증이 없습니다. 자유롭게 개선하십시오! (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

우와! 좋은 작업!
NothingsImossible

3

이 작업을 수행하는 또 다른 매우 직접적인 방법은 parted의 복구 기능을 사용하는 것입니다. 그래도 새 디스크 레이블을 만들어야하므로 위험이 따릅니다. 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

파티션이 더 있으면 복구 프로세스를 반복하십시오. 이제 끝났습니다.


1
이것은 파티션 테이블을 mbr에서 gpt로 변환하는 데 완벽하게 작동했습니다. 이렇게하면 복제 된 2TB 디스크를 4TB로 확장 할 수 있습니다. 약간의 긴장이 내 파티션을 거기에두고 있지만 다른 방법보다 훨씬 빠릅니다.
OregonTrail

3

WD My Book 외부 인클로저에서 4TB 디스크를 제거 할 때이 문제가 발생했습니다. 문제는:

  1. MBR 파티션 테이블이 8 배 떨어져 있습니다.
  2. 섹터 크기가 512 인 경우 MBR 파티션 테이블이> 2TB를 처리 할 수 ​​없습니다.

솔루션 : 파티션 테이블을 GPT로 다시 작성하여 512 바이트 섹터를 사용하도록 값을 변환하십시오.

필자의 경우 파티션은 1MB 오프셋에서 시작하여 디스크 끝 전에 종료되었습니다 (~ 856kB). 이는 파티션 앞의 MBR + GPT (17408 바이트)와 디스크 끝의 백업 GPT (16896 바이트)를 허용했기 때문에 좋습니다.

dd를 사용하여 두 지역의 이미지를 만들었습니다.

의 출력에 주목했습니다 fdisk -l /dev/sde.

gdisk를 사용하여 첫 번째 파티션을 삭제했습니다. 원하는 경우 가능한 한 많은 공간을 사용하도록 정렬 값을 8 (4096)로 변경하십시오. 그런 다음 2048에서 시작하고 디스크 끝에서 끝으로 새 파티션을 만들었습니다. 나중에 파일 시스템을 확장하겠습니다.

고맙게도, 섹터 크기의 변경은 파일 시스템, LVM 또는 LUKS에 영향을 미치지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.