최종 업데이트 :
나는이 문제를 해결하기 위해 무엇을해야하는지 이미 알고 있었다. 나는 그것을 하는 방법 을 몰랐다 . 자동으로 수행 할 수있는 기성 도구가 있기를 바랐지만 찾을 수 없었습니다. 내 문제를 직접 해결하지는 못했지만 섹터 크기 문제에 대한 훌륭한 배경 지식을 제공하고 문제가 실제로 파티션 정렬 및 주소 지정이라는 확신을 얻었으므로 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를 사용하고 데이터를 복사 한 다음 다른 위치에 다시 붙여 넣어 한 번에 청크를 정렬합니다.
답변
부문 별 문제는 점점 복잡해지고 있습니다. 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
) 에 의존하며 , 대부분의 배포판은 gptfdisk
or 라는 패키지에 포함되어 gdisk
있습니다.
장기적으로 더 나은 솔루션은 섹터 크기 변환을 수행하지 않는 디스크를 연결하는 방법을 찾는 것입니다. 새로운 마더 보드에 직접 연결하면 문제가 해결됩니다. 또는 번역을 수행하지 않는 외부 인클로저를 찾을 수 있습니다. 실제로 일부 인클로저는 USB 포트에서는 번역을 수행하지만 eSATA 포트에서는 변환하지 않으므로 인클로저에 eSATA 포트가 있으면이를 사용해 볼 수 있습니다. 이 솔루션은 비용이 많이 들기 때문에 비용이 많이 들지 않지만 번역 엔클로저를 번역하지 않는 번역 엔클로저로 교환 할 수 있습니다.
나에게 발생하는 또 다른 옵션은 VirtualBox와 같은 가상 컴퓨터를 사용해 보는 것입니다. 이러한 도구는 디스크 장치에 액세스 할 때 512 바이트 섹터 크기를 가정하여 변환을 효과적으로 취소 할 수 있습니다. 또는 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를 실행하기 전에 필요에 따라 백업하십시오. 그런 다음 시작하십시오.
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
파티션이 더 있으면 복구 프로세스를 반복하십시오. 이제 끝났습니다.
답변
WD My Book 외부 인클로저에서 4TB 디스크를 제거 할 때이 문제가 발생했습니다. 문제는:
- MBR 파티션 테이블이 8 배 떨어져 있습니다.
- 섹터 크기가 512 인 경우 MBR 파티션 테이블이> 2TB를 처리 할 수 없습니다.
솔루션 : 파티션 테이블을 GPT로 다시 작성하여 512 바이트 섹터를 사용하도록 값을 변환하십시오.
필자의 경우 파티션은 1MB 오프셋에서 시작하여 디스크 끝 전에 종료되었습니다 (~ 856kB). 이는 파티션 앞의 MBR + GPT (17408 바이트)와 디스크 끝의 백업 GPT (16896 바이트)를 허용했기 때문에 좋습니다.
dd를 사용하여 두 지역의 이미지를 만들었습니다.
의 출력에 주목했습니다 fdisk -l /dev/sde
.
gdisk를 사용하여 첫 번째 파티션을 삭제했습니다. 원하는 경우 가능한 한 많은 공간을 사용하도록 정렬 값을 8 (4096)로 변경하십시오. 그런 다음 2048에서 시작하고 디스크 끝에서 끝으로 새 파티션을 만들었습니다. 나중에 파일 시스템을 확장하겠습니다.
고맙게도, 섹터 크기의 변경은 파일 시스템, LVM 또는 LUKS에 영향을 미치지 않습니다.