/ dev / sda의 메모리 내 (커널) 파티션 테이블을 읽는 방법은 무엇입니까?


14

실수로 / Part / sda 파티션 테이블을 GParted ( AskUbuntu 전체 기사 ) 로 덮어 썼습니다 . 아직 재부팅하지 않았고 파일 시스템을 계속 사용할 수 있기 때문에 커널 내부 메모리에서 파티션 테이블을 복구 할 수 있다고 들었습니다. 가능합니까? 그렇다면 어떻게 복구하고 복원합니까?

여기에 이미지 설명을 입력하십시오

답변:


25

예, /sys파일 시스템 으로이 작업을 수행 할 수 있습니다 .

/sys커널 및 커널 드라이버에 의해 동적으로 생성 된 가짜 파일 시스템입니다.
이 특정 경우에 가서 /sys/block/sda드라이브의 각 파티션에 대한 디렉토리를 볼 수 있습니다 . 이 당신이 필요로하는 해당 폴더에이 개 특정 파일은, start하고 size. start드라이브 시작부터의 오프셋을 포함하며 size파티션의 크기입니다. 파티션을 삭제하고에서 찾은 것과 동일한 시작 및 크기로 다시 만드십시오 /sys.

예를 들어 다음은 내 드라이브의 모습입니다.

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      133119       65536   83  Linux
/dev/sda2   *      133120   134340607    67103744    7  HPFS/NTFS/exFAT
/dev/sda3       134340608   974675967   420167680   8e  Linux LVM
/dev/sda4       974675968   976773167     1048600   82  Linux swap / Solaris

그리고 이것이 내가 가진 것입니다 /sys/block/sda:

sda1/
 start: 2048
 size: 131072
sda2/
 start: 133120
 size: 134207488
sda3/
 start: 134340608
 size: 840335360
sda4/
 start: 974675968
 size: 2097200


실행중인 시스템에서 파티션 테이블을 수정 한 후 정보가 정확한지 확인하기 위해 이것을 테스트했습니다.


1
때로는 질문에 찬성했을 때 "이것은 편리했습니다"라는 의미입니다. 당신의 공감은 "이것은 내 피부를 구했다"와 더 비슷합니다. 감사!
— Alex Hirzel

나는 없습니다 /dev/sdb/start. 이름이 ext_range? 으로 바뀌 었 습니까? 커널 :4.8.15-1-MANJARO
— Tom Hale

@TomHale 그것은 /sys/block/sdb/start아닙니다/dev/sdb/start
— Patrick

죄송합니다. 잘못된 디렉토리를 인용했습니다. 나는이 없다 stat가 있지만을 start.
— Tom Hale

파티션을 다시 만들 때 fdisk섹터 수를 직접 입력 할 수 있으므로 디스크에 쓰기 전에 값을 확인할 수 있으므로 usind 를 사용하는 것이 좋습니다 . 디스크를 성공적으로 복원했습니다 : 첫 번째 파티션을 만들고, 수락 한 다음 "+ size"(위에서)를 입력 start하고 두 번째 파티션 은 / sys ... 및 "+ size"를 다시 입력하는 등 ... 새 테이블을 쓰기 전의 파티션 크기 행운을 빕니다!
— Jörg Gottschlich

10

NO WARRANTY 와 함께이 문제를 해결하는 데 도움이되는 스크립트를 만들었습니다 . (하지만 가상 머신에서 테스트했습니다)

첫 번째 매개 변수에서 손상된 HD로 다음 스크립트 실행 : $ ./repart.sh sda

#!/bin/bash

HARDDISK=$1

PARTITIONS=$(ls -d /sys/block/${HARDDISK}/${HARDDISK}?/)

echo "unit: sectors" 
for i in $PARTITIONS; do
    DEVICE=$(basename $i)
    START=$(cat $i/start)
    SIZE=$(cat $i/size)
    echo "/dev/$DEVICE : start=$START, size=$SIZE, type=XX" 
done

출력은 sfdisk 형식입니다. 그러나 주의 ,이 파일을 사용하도록 수정해야합니다. 확장 파티션 유형 = 5에서 모든 논리 공간과 확장 시작과 첫 번째 논리 파티션 시작 사이의 공간을 사용하여 크기를 늘리십시오.

unit: sectors
/dev/sda1 : start=63, size=2040192, type=XX
/dev/sda2 : start=2040255, size=20482875, type=XX
/dev/sda3 : start=22523130, size=19197675, type=XX
/dev/sda4 : start=41720805, size=2, type=XX
/dev/sda5 : start=41720868, size=208782, type=XX

유형 을 XX에서 파티션 유형 수로 변경해야 합니다. 풋 부팅 가능한 첫 번째 줄에 파티션을.

unit: sectors
/dev/sda1 : start=63, size=2040192, type=83, bootable
/dev/sda2 : start=2040255, size=20482875, type=83
/dev/sda3 : start=22523130, size=19197675, type=fd
/dev/sda4 : start=41720805, size=208845, type=5
/dev/sda5 : start=41720868, size=208782, type=82

이 변경 사항을 적용하십시오

cat repart.sfdisk | sfdisk -f /dev/sda

파티션 테이블을 다시 읽습니다.

partprobe 
/sbin/blockdev --rereadpt

그럽 재설치

grub-install /dev/sda

1
sfdisk에 "-u B"스위치를 사용하고 sfdisk가 블록 크기로 카운트되는 경우 repart.sfdisk의 값을 조정해야 할 수도 있습니다 (일반적으로 2로 나눔) ( "Units = blocks of "sudo sfdisk -u B -l / dev / sda"에서 1024 바이트 ")를 제외한 512 바이트 (일반적으로 현재는 1024)입니다.
— Florian

1
처음에는 잘못 읽었습니다. Id = 5는 파티션 유형 5를 의미합니다. 이는 sda5가 아닌 sda4입니다. 또한 내 경우에는 ls -d / sys / block / sda / sda *가 sda1과 sda5 만 제공하므로 컨테이너가 누락 된 것 같습니다.
— wau

당신은 ls를 파싱해서는 안됩니다; 대신 find 사용
— cat

3

testdisk 를 사용해 보셨습니까 ? 다시 부팅 한 후에도 디스크를 검사하고 손실 된 파티션 테이블을 복구 할 수 있습니다.

데비안과 우분투에서도 사전 패키지로 제공됩니다. 아마도 다른 배포판 일 것입니다.

gparted CD를 부팅하는 경우 CD가 사전 설치되어 있는지 확인해야합니다.


그렇습니다. OP (askUbuntu)의 링크를 확인하십시오
— Marco
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.