mkfs 명령을 사용하여 지정된 FAT12 파일 시스템 만들기

mkfs 명령을 사용하여 지정된 FAT12 파일 시스템 만들기

저는 현재 Linux 시스템에서 OS 개발을 하고 있습니다. 이 과정에서 파일(예: Disk.img)에 FAT12 파일 시스템을 만들고 싶습니다. mkfs 명령을 다음과 같이 사용합니다.

touch Disk.img
truncate Disk.img -s 1M
mkfs.vfat -F12 Disk.img

16진수 편집기로 볼 때 'SECTORS_PER_FAT'가 기본적으로 2인 것을 확인했습니다. 9로 만들고 싶은데요.. 어떻게 해야 하나요??

편집: BIOS 매개변수 블록에는 다음 정보가 있습니다(단순히 수동으로 수행하고 싶지 않고 대신 mkfs를 사용하고 싶습니다).

(이것은 어셈블리 조각입니다.http://www.brokenthorn.com/Resources/OSDev5.html)

bpbBytesPerSector:      DW 512
bpbSectorsPerCluster:   DB 1
bpbReservedSectors:     DW 1
bpbNumberOfFATs:    DB 2
bpbRootEntries:     DW 224
bpbTotalSectors:    DW 2880
bpbMedia:       DB 0xF0
bpbSectorsPerFAT:   DW 9    ;!!!!This is the thing I want to control!!!!
bpbSectorsPerTrack:     DW 18
bpbHeadsPerCylinder:    DW 2
bpbHiddenSectors:   DD 0
bpbTotalSectorsBig:     DD 0
bsDriveNumber:          DB 0
bsUnused:       DB 0
bsExtBootSignature:     DB 0x29
bsSerialNumber:         DD 0xa0a1a2a3
bsVolumeLabel:          DB "MOS FLOPPY "
bsFileSystem:           DB "FAT12   "

그런데... 총 클러스터 수와 클러스터당 섹터 수에 따라 FAT의 크기(섹터 수)가 자동으로 결정되어야 한다고 생각합니다... 따라서 BPB에서 섹터_당_지방을 정의하는 것은 중복될 수 있습니다... 의미는 다음과 같습니다. 임의의 값....

답변1

기본적으로 'SECTORS_PER_FAT'는 2입니다. 만들고 싶어요 9. 어떻게 해야 하나요?

이 숫자는 자동으로 계산되는 것 같습니다. 파일 할당 테이블에는 클러스터당 하나의 항목이 있고 클러스터 수는 유한하고 미리 알려져 있으므로 FAT에 더 많은 섹터를 할당할 필요가 없습니다.

귀하의 경우 2는 "기본적으로"가 아니며 대부분 파일 시스템 크기(크기 Disk.img)와 클러스터 크기에 의해 결정됩니다.

가능한 최소 클러스터 크기(예: 최소 논리 섹터 크기( -S512) 및 클러스터당 최소 섹터 수( -s1))를 선택합니다.

# 'touch' is not needed, 'truncate' is enough
truncate Disk.img -s 1M
mkfs.vfat -F12 -S512 -s1 Disk.img
# the below line extracts the value we're after
<Disk.img od -j22 -N2 -tu2 | awk 'NR==1{print $2}'

이는 주어진 파일 크기에 대한 최대 클러스터 수, 즉 FAT의 최대 항목 수, 최대 FAT 크기, FAT당 필요한 최대 섹터 수를 제공합니다. 아직은 6개밖에 안 됐어요.

이론적으로는 공식적으로 더 많은 섹터를 할당할 수 있고 파일 시스템이 유효할 것이라고 생각합니다. 요점은 모든 클러스터가 이미 이 6개 섹터의 항목에 포함되어 있기 때문에 FAT의 추가 섹터는 절대 사용되지 않는다는 것입니다. 실제로는 mkfs.vfat이와 같은 섹터를 낭비하지 않습니다.


거친1MiB를 계산하고 -S512 -s1FAT당 6개의 섹터를 제공합니다.

  1. 우리소홀히 하다클러스터 이외의 구조는 마치 모든 공간이 클러스터에 기여한 것처럼 보입니다. 클러스터 에는 -S512 -s10.5KiB가 소요됩니다. 1MiB는 정확히 2Ki의 클러스터를 보유합니다. 이 계산에서 클러스터 수는 다음과 같습니다.부풀어 오른엄격한 가치에 관해서.
  2. FAT12에서는 하나의 항목이 12비트(3바이트당 2개의 항목)를 차지하므로 1.5B입니다. 클러스터당 하나의 항목이 필요합니다. 2Ki 항목에는 3KiB가 필요합니다. 따라서 FAT는 3KiB를 차지해야 하며 이 숫자도부풀어 오른.
  3. 단일 섹터는 0.5KiB입니다. 3KiB를 저장하려면 6개의 섹터가 필요합니다. 3KiB는 다소 부풀려졌으므로많으면6개 섹터.

도구는 이 수치를 더 엄격하게 계산합니다.


FAT의 수( -f)는 거의 중요하지 않습니다. 클러스터가 별도의 FAT로 나누어지는 것은 아닙니다. 추가 FAT는 복사본일 뿐이며 각 FAT는 여전히 모든 클러스터에 서비스를 제공합니다. FAT가 많을수록 더 많은 공간을 차지하므로 클러스터 수가 약간 줄어듭니다. 파일 시스템의 일부 "임계값 크기"의 경우 이 현상은 FAT당 섹터 수에 영향을 미칩니다. 그러나 1MiB의 경우 -S512 -s1FAT당 필요한 섹터 수는 관계없이 6개입니다 -f(참고: 내 테스트에서는 mkfs.vfat4개 이상의 FAT 생성을 거부했습니다).

주어진 파일 시스템 크기에 대해 클러스터 수를 최대화한 후 FAT당 섹터 수를 늘리는 가장 쉬운 방법은 파일 시스템을 더 크게 만드는 것입니다. 1MiB에 대해 6개를 얻었으므로 아마도 1.5MiB에 대해 9개를 얻을 것입니다. 물론:

truncate Disk.img -s 1536k
mkfs.vfat -F12 -S512 -s1 Disk.img
<Disk.img od -j22 -N2 -tu2 | awk 'NR==1{print $2}'

Note 1536k는 9를 얻기 위한 최소 크기가 아닙니다. 테스트에서 1389k9를 주었고 1388k8을 주었습니다. 이제 -f숫자가 어떻게 영향을 미치는지 볼 수 있습니다. For 1389k -f2(기본값)는 9와 -f38을 제공합니다. For 1388k -f1는 9와 -f28을 제공합니다.


내 테스트베드:

  • 데비안 GNU/리눅스 9
  • mkfs.vfat심볼릭 링크로mkfs.fat
  • mkfs.fat버전: 4.1 (2017-01-24)

참고자료:

  1. FAT 파일 시스템작성자: Andries Brouwer
    (2002년의 내용이지만 그 이후로 FAT12가 크게 바뀌지 않은 것 같습니다)
  2. FAT 파일 시스템 설계위키피디아

관련 정보