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

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

실수로 /dev/sda 파티션 테이블을 GParted로 덮어썼습니다(전체 내용은 AskUbuntu를 참조하세요.). 아직 재부팅하지 않았고 파일 시스템을 완전히 사용할 수 있으므로 커널 메모리에서 파티션 테이블을 복구할 수 있다는 말을 들었습니다. 그게 가능합니까? 그렇다면 어떻게 복구하고 복원할 수 있나요?

여기에 이미지 설명을 입력하세요.

답변1

예, /sys파일 시스템을 사용하여 이 작업을 수행할 수 있습니다.

/sys커널 및 커널 드라이버에 의해 동적으로 생성된 가짜 파일 시스템입니다. 이 특별한 경우에는 드라이브의 각 파티션
으로 이동하여 디렉터리를 볼 수 있습니다. /sys/block/sda이 폴더에는 필요한 2개의 특정 파일이 있으며 . start는 드라이브 시작 부분의 오프셋과 파티션 크기를 포함합니다. 파티션을 삭제하고 .sizestartsize/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


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

답변2

이 문제를 해결하기 위해 스크립트를 작성했습니다.보증 없음. (하지만 가상 머신에서 테스트했습니다)

아래와 같이 손상된 HD를 첫 번째 매개변수로 사용하여 다음 스크립트를 실행합니다.

user@host:~$ ./repart.sh sda

콘텐츠 repart.sh:

#!/bin/bash

echo "unit: sectors" 
for i in /sys/block/$1/$1?/; do
    printf '/dev/%s : start=%d, size=%d, type=XX\n' "$(basename $i)" "$(<$i/start)" "$(<$i/size)"
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

답변3

시도해 봤어?테스트 디스크? 재부팅 후에도 디스크를 스캔하고 손실된 파티션 테이블을 복구할 수 있습니다.

Debian용으로 사전 패키지되어 있으며 Ubuntu에서도 사용할 수 있습니다. 아마도 다른 배포판일 수도 있습니다.

gparted CD를 부팅하는 경우 CD에 사전 설치되어 있는지 확인하는 것이 좋습니다.

관련 정보