실수로 / Part / sda 파티션 테이블을 GParted ( AskUbuntu 전체 기사 ) 로 덮어 썼습니다 . 아직 재부팅하지 않았고 파일 시스템을 계속 사용할 수 있기 때문에 커널 내부 메모리에서 파티션 테이블을 복구 할 수 있다고 들었습니다. 가능합니까? 그렇다면 어떻게 복구하고 복원합니까?
실수로 / Part / sda 파티션 테이블을 GParted ( AskUbuntu 전체 기사 ) 로 덮어 썼습니다 . 아직 재부팅하지 않았고 파일 시스템을 계속 사용할 수 있기 때문에 커널 내부 메모리에서 파티션 테이블을 복구 할 수 있다고 들었습니다. 가능합니까? 그렇다면 어떻게 복구하고 복원합니까?
답변:
예, /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
실행중인 시스템에서 파티션 테이블을 수정 한 후 정보가 정확한지 확인하기 위해 이것을 테스트했습니다.
/dev/sdb/start
. 이름이 ext_range
? 으로 바뀌 었 습니까? 커널 :4.8.15-1-MANJARO
/sys/block/sdb/start
아닙니다/dev/sdb/start
stat
가 있지만을 start
.
fdisk
섹터 수를 직접 입력 할 수 있으므로 디스크에 쓰기 전에 값을 확인할 수 있으므로 usind 를 사용하는 것이 좋습니다 . 디스크를 성공적으로 복원했습니다 : 첫 번째 파티션을 만들고, 수락 한 다음 "+ size"(위에서)를 입력 start
하고 두 번째 파티션 은 / sys ... 및 "+ size"를 다시 입력하는 등 ... 새 테이블을 쓰기 전의 파티션 크기 행운을 빕니다!
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