/ 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.