일부 논리 파티션을 확장 파티션으로 변환하고 싶어서 따라했습니다.이 답변은 허용되었습니다.. 그런데 현재 파티션 테이블을 백업하는 단계에서 실수로 적혀있던 내용이 아닌 다음과 같이 입력하게 되었습니다.
sfdisk -f /dev/sda > /mnt/parts.txt
결과는 다음과 같습니다.
Disk /dev/sda: 30401 cylinders, 255 heads, 63 sectors/track
Old situation:
Units = cylinders of 8225280 bytes, blocks of 1024 bytes, counting from 0
Device Boot Start End #cyls #blocks Id System
/dev/sda1 0+ 304- 304- 2441214+ 82 Linux swap / Solaris
/dev/sda2 * 304+ 565- 262- 2097152 83 Linux
/dev/sda3 565+ 4486- 3921- 31495168 83 Linux
/dev/sda4 4486+ 30401- 25916- 208163840 5 Extended
/dev/sda5 4486+ 24026- 19540- 156954624 83 Linux
보시다시피 단위는 원통과 블록이므로 올바른 섹터 내보내기에 비해 정확도가 떨어질 수 있습니다.
문제는 파티션 테이블이 손상되어 이제 이 불완전한(또는 원래입니까?) 백업을 활용해야 한다는 것입니다.
지금까지 한 블록이 두 개의 섹터라는 것을 알고 섹터별로 파티션 테이블을 다시 작성해 보았습니다(실린더는 아무데도 연결되지 않음)(이것이 보편적인지는 모르겠지만 섹터별로 파티션 테이블을 내보내면 1 섹터 = 512바이트, 1블록 = 1024바이트...).
root@debian:/home/user# sfdisk -u S /dev/sda
Checking that no-one is using this disk right now ...
OK
Disk /dev/sda: 30401 cylinders, 255 heads, 63 sectors/track
Old situation:
Units = sectors of 512 bytes, counting from 0
Device Boot Start End #sectors Id System
/dev/sda1 1 4882429 4882429 82 Linux swap / Solaris
/dev/sda2 4882430 9076733 4194304 83 Linux
/dev/sda3 9076734 72067069 62990336 83 Linux
/dev/sda4 72067070 488394749 416327680 83 Linux
Input in the following format; absent fields get a default value.
<start> <size> <type [E,S,L,X,hex]> <bootable [-,*]> <c,h,s> <c,h,s>
Usually you only need to specify <start> and <size> (and perhaps <type>).
/dev/sda1 :1 4882429 S
/dev/sda1 1 4882429 4882429 82 Linux swap / Solaris
/dev/sda2 :4882430 4194304 L *
/dev/sda2 * 4882430 9076733 4194304 83 Linux
/dev/sda3 :9076734 62990336
/dev/sda3 9076734 72067069 62990336 83 Linux
/dev/sda4 :72067070 416327680 E
/dev/sda4 72067070 488394749 416327680 5 Extended
/dev/sda5 :72067071 313909248
/dev/sda5 72067071 385976318 313909248 83 Linux
/dev/sda6 :
/dev/sda6 385976320 488394749 102418430 83 Linux
/dev/sda7 :
No room for more
New situation:
Units = sectors of 512 bytes, counting from 0
Device Boot Start End #sectors Id System
/dev/sda1 1 4882429 4882429 82 Linux swap / Solaris
/dev/sda2 * 4882430 9076733 4194304 83 Linux
/dev/sda3 9076734 72067069 62990336 83 Linux
/dev/sda4 72067070 488394749 416327680 5 Extended
/dev/sda5 72067071 385976318 313909248 83 Linux
/dev/sda6 385976320 488394749 102418430 83 Linux
Warning: partition 1 does not end at a cylinder boundary
Warning: partition 2 does not start at a cylinder boundary
Warning: partition 2 does not end at a cylinder boundary
Warning: partition 3 does not start at a cylinder boundary
Warning: partition 3 does not end at a cylinder boundary
Warning: partition 4 does not start at a cylinder boundary
Warning: partition 4 does not end at a cylinder boundary
Warning: partition 5 does not end at a cylinder boundary
Warning: partition [6] does not start at a cylinder boundary
Warning: partition [6] does not end at a cylinder boundary
Warning: partition 6 does not end at a cylinder boundary
Do you want to write this to disk? [ynq] y
Successfully wrote the new partition table
Re-reading the partition table ...
If you created or changed a DOS partition, /dev/foo7, say, then use dd(1)
to zero the first 512 bytes: dd if=/dev/zero of=/dev/foo7 bs=512 count=1
(See fdisk(8).)
실린더 경계에는 파티션 시작/중지가 없습니다. 이게 무슨 뜻인지는 모르겠지만, 다음과 같이+그리고-, 이는 숫자가 반올림되었음을 의미하며 원래 내보내기에서는 이것이 정상이라고 생각합니다.
또한 출력이 동일한지 확인하기 위해 동일한 오류 명령을 실행했습니다.
Disk /dev/sda: 30401 cylinders, 255 heads, 63 sectors/track
Old situation:
Units = cylinders of 8225280 bytes, blocks of 1024 bytes, counting from 0
Device Boot Start End #cyls #blocks Id System
/dev/sda1 0+ 303- 304- 2441214+ 82 Linux swap / Solaris
/dev/sda2 * 303+ 565- 262- 2097152 83 Linux
/dev/sda3 565+ 4485- 3921- 31495168 83 Linux
/dev/sda4 4485+ 30401- 25916- 208163840 5 Extended
/dev/sda5 4485+ 24025- 19540- 156954624 83 Linux
/dev/sda6 24025+ 30401- 6376- 51209215 83 Linux
가깝지만 완전히 똑같지는 않습니다. 또한 gparted는 파티션 파일 시스템을 인식하지 못하는 것 같습니다(모든 것이 "알 수 없음").
또한 /dev/sda1이 304개의 실린더만큼 크지만 결국 303개의 실린더만 남게 되는 것이 어떻게 가능합니까?
해결책에 가까워졌다고 생각하지만 필요한 정확한 숫자를 얻을 수 없습니다. 계산을 잘못했거나 잘못했기 때문일 수 있습니다. 하지만 어떤 조합이 작동하는지 확인하기 위해 하나씩 변경할 수는 없습니다(할 수 있지만 bash 코딩 및 처리 시간이 좀 걸리고 무엇이 잘못되었는지 모르겠습니다).
최근에 이 디스크의 가장 중요한 내용을 백업했는데, 재설치나 파일 복사 없이 복구할 수 있다면 참 좋겠습니다.
답변1
이 문제를 직접 해결하는 것은 까다로울 수 있습니다. 작성한 손상된 파티션 테이블 외에 해당 디스크의 데이터를 수정하지 않았기를 바랍니다.
sfdisk, fdisk 등을 사용하여 파티션 테이블의 백업을 만드는 것이 좋습니다(실수로 잘못된 명령을 입력하지 않은 경우 :)). 그러나 추가 보험을 위해 dd를 사용하여 드라이브의 부팅 섹터를 백업하는 것을 좋아합니다.
누구세요틀림없이sda1은 블록 1에서 시작합니까, 아니면 추측입니까? 과거에는 MBR 및 (기본) 파티션 테이블을 유지하는 데 모두 필요했기 때문에 디스크 시작 부분에 1개의 블록만 사용하는 것이 일반적이었지만 최근에는 파티션 소프트웨어가 첫 번째 파티션을 위해 더 많은 공간을 예약하는 경우가 많습니다. 섹터 63은 드문 일이 아닙니다. 또한 파티셔닝 소프트웨어(gparted, IIRC)가 드라이브 시작 부분에 메가바이트를 예약한 다음 모든 후속 파티션을 메가바이트 경계로 강제 설정하는 것을 보았습니다.
이전 시스템에서는 파티션이 실린더 경계에서 시작되고 중지되는 것이 중요합니다. IOW, 디스크 시작 부분의 분할되지 않은 영역은 정수개의 실린더여야 하며, 각 후속 기본 파티션도 정수개의 실린더여야 합니다. 일반적으로 디스크 끝에도 할당되지 않은 공간이 있습니다. 그러나 이것은 일반적으로 수년 동안 문제가 되지 않았지만 관심이 있는 경우를 대비해 많은 파티셔닝 소프트웨어에서 여전히 이 문제를 언급하고 있습니다. :)
다만, 파티션하다섹터 경계에서 시작하고 중지해야 합니다. 이렇게 하면 첫 번째 목록의 블록 지향 데이터를 더 쉽게 분석할 수 있습니다. 따라서 2441214개 이상의 블록이 가능합니다.오직참조 2441214.5 블록 = 4882429 섹터 = 2499803648 바이트.
하지만 이 문제를 수동으로 해결하려고 하기보다는 이와 같은 도구를 사용하는 것을 진지하게 고려해야 합니다.테스트 디스크. 배포판에 설치했을 수도 있지만, 그렇지 않은 경우 저장소에 있어야 합니다.