I am trying to prepare an MS-DOS disk image file (for later dd to a USB
device) but am having difficulties getting newfs_msdos to work in this way.
This is under 5.4-RELEASE.
Firstly, newfs_msdos seems to insist on a block-special device; it won't
talk to a disk file. OK, no problem, I'll fake it using an md device.
I'll
make an image file exactly the right size for my USB device:
Jan 15 11:19:39 mappit kernel: umass0: EM102I Mp3 Player, rev 1.10/0.12, addr 2
Jan 15 11:19:41 mappit kernel: da0 at umass-sim0 bus 0 target 0 lun 0
Jan 15 11:19:41 mappit kernel: da0: <EM102I Mp3 Player FLASH v1.0>
Removable Direct Access SCSI-0 device
Jan 15 11:19:41 mappit kernel: da0: 1.000MB/s transfers
Jan 15 11:19:41 mappit kernel: da0: 125MB (256000 512 byte sectors: 64H 32S/T
125C)
Here we go:
# dd if=/dev/zero of=test.img bs=512 count=256000
256000+0 records in
256000+0 records out
131072000 bytes transferred in 6.334723 secs (20691039 bytes/sec)
# mdconfig -a -t vnode -f test.img
md0
# newfs_msdos -s 131072000 /dev/md0
newfs_msdos: Cannot get number of sectors, Operation not supported
#
Hmm. Attempting to provide some suitable parameters don't seem to help:
# newfs_msdos -s 131072000 -S 512 -b 4096 -c 8 -u 256 /dev/md0
newfs_msdos: Cannot get number of sectors, Operation not supported
OK, so let's try pretending it's a floppy disk:
# newfs_msdos -f 1440 -s 131072000 /dev/md0
newfs_msdos: warning: sectors/FAT limits file system to 3070 clusters
/dev/md0: 3070 sectors in 3070 FAT12 clusters (512 bytes/cluster)
bps=512 spc=1 res=1 nft=2 rde=224 mid=0xf0 spf=9 spt=18 hds=2 hid=0
bsec=131072000
# mount -t msdos /dev/md0 /mnt
# df -k | grep md0
/dev/md0 1152 1 1151 0% /mnt
# umount /dev/md0
That's not right - the filesystem has been sized for a 1440K floppy, even
though I said (using -s) that the disk size was larger than that.
So let's try overriding some parameters:
# newfs_msdos -f 1440 -s 131072000 -S 512 -b 4096 -c 8 -u 256 /dev/md0
newfs_msdos: warning: sectors/FAT limits file system to 3070 clusters
/dev/md0: 24560 sectors in 3070 FAT12 clusters (4096 bytes/cluster)
bps=512 spc=8 res=1 nft=2 rde=224 mid=0xf0 spf=9 spt=256 hds=2 hid=0
bsec=131072000
# mount -t msdos /dev/md0 /mnt
msdosfs: /dev/md0: Invalid argument
Ugh, that's not even recognised by the kernel as a DOS filesystem!
Anyway, it seems to be saying we're limited to 3070 clusters, and 3070 x 4K
is only 12MB which is too small for the disk image I have. So let's try
FAT16:
# newfs_msdos -F 16 -f 1440 -s 131072000 -S 512 -b 4096 -c 8 -u 256 /dev/md0
newfs_msdos: warning: sectors/FAT limits file system to 2302 clusters
newfs_msdos: 2302 clusters too few clusters for FAT16, need 4096
Nope, that fails completely. (Why? Given a cluster size of 4K, that
filesystem needs around 32,000 clusters)
Let's try fiddling with the sectors per FAT. I have no idea what to use, but
earlier examples had spf=9, so let's try 20 instead:
# newfs_msdos -a 20 -F 16 -f 1440 -s 131072000 -S 512 -b 4096 -c 8 -u 256
/dev/md0
newfs_msdos: warning: sectors/FAT limits file system to 5118 clusters
/dev/md0: 40944 sectors in 5118 FAT16 clusters (4096 bytes/cluster)
bps=512 spc=8 res=1 nft=2 rde=224 mid=0xf0 spf=20 spt=256 hds=2 hid=0
bsec=131072000
OK that's seems to be getting there. 20 sectors per FAT limits me to 5118
clusters, and I need about 32000, which implies spf=(32000/5118)*20 = 125.
For safety let's try 150:
# newfs_msdos -a 150 -F 16 -f 1440 -s 131072000 -S 512 -b 4096 -c 8 -u 256
/dev/md0
newfs_msdos: warning: sectors/FAT limits file system to 38398 clusters
/dev/md0: 307184 sectors in 38398 FAT16 clusters (4096 bytes/cluster)
bps=512 spc=8 res=1 nft=2 rde=224 mid=0xf0 spf=150 spt=256 hds=2 hid=0
bsec=131072000
Now that's a bit worrying. It's saying that my filesystem is 307184
sectors
large, when the underlying disk image is only 256000 sectors. In any case,
it still won't mount:
# mount -t msdos /dev/md0 /mnt
msdosfs: /dev/md0: Invalid argument
So - how should I go about creating an MS-DOS filesystem in this image file?
Thanks,
Brian.