fdisk가 가끔 반키비바이트를 추가하는 이유는 무엇입니까?

fdisk가 가끔 반키비바이트를 추가하는 이유는 무엇입니까?

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));
    }

일부 디버그 출력(예: 디버깅이 활성화된 유틸리티 버전)은 진행 상황을 명확히 하는 데 도움이 됩니다.

관련 정보