
fdisk
(util-linux, v2.31.1)을 사용하여 1440 KiB 플로피 디스크 이미지를 분할하려고 합니다 .
그러나 어떤 단위를 사용하든 이 도구는 512바이트 섹터를 추가하는 것처럼 보이며 알 수 없습니다.왜.
이것이 내가 한 일입니다:
Created a new DOS disklabel [...]
Command (m for help): n
[...]
First sector (1-2879, default 1): 2048
Last sector, +sectors or +size{K,M,G,T,P} (63-2879, default 2879): +1K
Created a new partition 1 of type 'Linux' and of size 1.5 KiB.
와!1.5KiB!?
섹터 수를 사용해 보았지만 동일한 결과를 얻었습니다.
Last sector, +sectors [...]: +2
Created a new partition 1 of type 'Linux' and of size 1.5 KiB.
이제 충분히 큰 파일을 사용하면 fdisk
첫 번째 표기법과 다르게 동작합니다.
First sector (2048-131071, default 2048): 2048
Last sector, [...]: +1K
Created a new partition 1 of type 'Linux' and of size 1 KiB.
두 번째 것은 그렇지 않습니다.
Last sector, +sectors [...]: +2
Created a new partition 1 of type 'Linux' and of size 1.5 KiB.
이것이 예상되는 동작입니까? 그럴 것 같은데, 왜 그럴까요?
답변1
그러나 도구는 내가 사용하는 단위에 관계없이 512바이트 섹터를 추가하는 것처럼 보입니다.
...
이제 충분히 큰 파일을 사용하면 fdisk는 첫 번째 표기법과 다르게 동작합니다.
...
이것이 예상되는 동작입니까?
분명히 그렇습니다. 그리고 "플러스 원" 다양성의 버그인 것 같습니다.
에 대해 "+N" 또는 "+"(절대 섹터 번호 대신)를 지정하면 last sector
유틸리티는 이 수량을 새 파티션의 섹터 수(또는 크기)로 활용하고 이 숫자를 시작 섹터 번호.
즉, 적절한 계산이 이루어져야 합니다.
<last sector> = <start sector> + <sector count> - 1
그러나 분명히 유틸리티 회사는 이 총계에서 한 부문을 빼서 조정하는 것을 무시합니다.세다에게배수량.
새 파티션의 크기가 작은 경우(예: 섹터 2개만) 이 "+1" 버그는 매우 분명합니다.
장치의 사용 가능한 크기에 상관 관계/종속성이 있는 이유를 확인하려면 실제 소스 코드를 검사해야 합니다.
이 명백한 버그에 대한 해결 방법은 섹터 번호를 사용하여 마지막 섹터를 명시적으로 지정하는 것입니다.
예를 들어 시작 섹터가 2048이고 파티션 크기가 1K바이트인 경우 마지막 섹터를 2049로 지정합니다.
이 "추가" 섹터는 새 파티션의 끝에 있으므로 이 문제는 파티션 정렬과 관련이 없습니다.
새로운 파티션의 시작을 수정하기 위해 파티션 정렬(및 가드 실린더/트랙/섹터)이 적용됩니다.
즉, 섹터는 새 파티션 "앞"에 예약되며 어떤 파티션에도 속하지 않습니다.
해당 섹터는 할당되지 않고 본질적으로 낭비되며 어떤 파일 시스템에서도 사용할 수 없습니다.
정렬은 새 파티션의 크기에 영향을 주지 않습니다.
설명하는 문제는 정렬이 아닌 파티션 크기와 관련이 있습니다.
1440KiB 플로피 디스크 이미지를 분할하려고 합니다.
플로피 디스크는 파티션을 나누어서는 안 됩니다. 부트 섹터만 존재합니다.
MBR 및 파티션 테이블은 하드 디스크(및 SSD)용입니다.
부록
분명히 뭔가 코드가 있는 것 같은데유틸리티-리눅스-2.31.1/libfdisk/src/dos.c파티션의 끝 부분을 조정하려고 시도합니다.다음파티션이 정렬됩니다!
static int add_partition(struct fdisk_context *cxt, size_t n,
struct fdisk_partition *pa)
{
...
if (isrel && stop - start < (cxt->grain / fdisk_get_sector_size(cxt))) {
/* Don't try to be smart on very small partitions and don't align so small sizes */
isrel = 0;
if (stop > start)
stop -= 1;
DBG(LABEL, ul_debug("DOS: don't align end of tiny partition [start=%ju, stop=%ju, grain=%lu]",
(uintmax_t)start, (uintmax_t)stop, cxt->grain));
}
if (stop < limit && isrel && alignment_required(cxt)) {
/* the last sector has not been exactly requested (but
* defined by +size{K,M,G} convention), so be smart and
* align the end of the partition. The next partition
* will start at phy.block boundary.
*/
stop = fdisk_align_lba_in_range(cxt, stop, start, limit);
if (stop > start)
stop -= 1;
if (stop > limit)
stop = limit;
DBG(LABEL, ul_debug("DOS: aligned stop: %ju", (uintmax_t) stop));
}
일부 디버그 출력(예: 디버깅이 활성화된 유틸리티 버전)은 진행 상황을 명확히 하는 데 도움이 됩니다.