1USING VFAT 2---------------------------------------------------------------------- 3To use the vfat filesystem, use the filesystem type 'vfat'. i.e. 4 mount -t vfat /dev/fd0 /mnt 5 6No special partition formatter is required. mkdosfs will work fine 7if you want to format from within Linux. 8 9VFAT MOUNT OPTIONS 10---------------------------------------------------------------------- 11codepage=### -- Sets the codepage for converting to shortname characters 12 on FAT and VFAT filesystems. By default, codepage 437 13 is used. This is the default for the U.S. and some 14 European countries. 15iocharset=name -- Character set to use for converting between 8 bit characters 16 and 16 bit Unicode characters. Long filenames are stored on 17 disk in Unicode format, but Unix for the most part doesn't 18 know how to deal with Unicode. There is also an option of 19 doing UTF8 translations with the utf8 option. 20utf8=<bool> -- UTF8 is the filesystem safe version of Unicode that 21 is used by the console. It can be be enabled for the 22 filesystem with this option. If 'uni_xlate' gets set, 23 UTF8 gets disabled. 24uni_xlate=<bool> -- Translate unhandled Unicode characters to special 25 escaped sequences. This would let you backup and 26 restore filenames that are created with any Unicode 27 characters. Until Linux supports Unicode for real, 28 this gives you an alternative. Without this option, 29 a '?' is used when no translation is possible. The 30 escape character is ':' because it is otherwise 31 illegal on the vfat filesystem. The escape sequence 32 that gets used is ':' and the four digits of hexadecimal 33 unicode. 34posix=<bool> -- Allow names of same letters, different case such as 35 'LongFileName' and 'longfilename' to coexist. This has some 36 problems currently because 8.3 conflicts are not handled 37 correctly for POSIX filesystem compliance. 38nonumtail=<bool> -- When creating 8.3 aliases, normally the alias will 39 end in '~1' or tilde followed by some number. If this 40 option is set, then if the filename is 41 "longfilename.txt" and "longfile.txt" does not 42 currently exist in the directory, 'longfile.txt' will 43 be the short alias instead of 'longfi~1.txt'. 44 45quiet -- Stops printing certain warning messages. 46check=s|r|n -- Case sensitivity checking setting. 47 s: strict, case sensitive 48 r: relaxed, case insensitive 49 n: normal, default setting, currently case insensitive 50 51shortname=lower|win95|winnt|mixed 52 -- Shortname display/create setting. 53 lower: convert to lowercase for display, 54 emulate the Windows 95 rule for create. 55 win95: emulate the Windows 95 rule for display/create. 56 winnt: emulate the Windows NT rule for display/create. 57 mixed: emulate the Windows NT rule for display, 58 emulate the Windows 95 rule for create. 59 Default setting is `lower'. 60 61<bool>: 0,1,yes,no,true,false 62 63TODO 64---------------------------------------------------------------------- 65* Need to get rid of the raw scanning stuff. Instead, always use 66 a get next directory entry approach. The only thing left that uses 67 raw scanning is the directory renaming code. 68 69* Fix the POSIX filesystem support to work in 8.3 space. This involves 70 renaming aliases if a conflict occurs between a new filename and 71 an old alias. This is quite a mess. 72 73 74POSSIBLE PROBLEMS 75---------------------------------------------------------------------- 76* vfat_valid_longname does not properly checked reserved names. 77* When a volume name is the same as a directory name in the root 78 directory of the filesystem, the directory name sometimes shows 79 up as an empty file. 80* autoconv option does not work correctly. 81 82BUG REPORTS 83---------------------------------------------------------------------- 84If you have trouble with the VFAT filesystem, mail bug reports to 85chaffee@bmrc.cs.berkeley.edu. Please specify the filename 86and the operation that gave you trouble. 87 88TEST SUITE 89---------------------------------------------------------------------- 90If you plan to make any modifications to the vfat filesystem, please 91get the test suite that comes with the vfat distribution at 92 93 http://bmrc.berkeley.edu/people/chaffee/vfat.html 94 95This tests quite a few parts of the vfat filesystem and additional 96tests for new features or untested features would be appreciated. 97 98NOTES ON THE STRUCTURE OF THE VFAT FILESYSTEM 99---------------------------------------------------------------------- 100(This documentation was provided by Galen C. Hunt <gchunt@cs.rochester.edu> 101 and lightly annotated by Gordon Chaffee). 102 103This document presents a very rough, technical overview of my 104knowledge of the extended FAT file system used in Windows NT 3.5 and 105Windows 95. I don't guarantee that any of the following is correct, 106but it appears to be so. 107 108The extended FAT file system is almost identical to the FAT 109file system used in DOS versions up to and including 6.223410239847 110:-). The significant change has been the addition of long file names. 111These names support up to 255 characters including spaces and lower 112case characters as opposed to the traditional 8.3 short names. 113 114Here is the description of the traditional FAT entry in the current 115Windows 95 filesystem: 116 117 struct directory { // Short 8.3 names 118 unsigned char name[8]; // file name 119 unsigned char ext[3]; // file extension 120 unsigned char attr; // attribute byte 121 unsigned char lcase; // Case for base and extension 122 unsigned char ctime_ms; // Creation time, milliseconds 123 unsigned char ctime[2]; // Creation time 124 unsigned char cdate[2]; // Creation date 125 unsigned char adate[2]; // Last access date 126 unsigned char reserved[2]; // reserved values (ignored) 127 unsigned char time[2]; // time stamp 128 unsigned char date[2]; // date stamp 129 unsigned char start[2]; // starting cluster number 130 unsigned char size[4]; // size of the file 131 }; 132 133The lcase field specifies if the base and/or the extension of an 8.3 134name should be capitalized. This field does not seem to be used by 135Windows 95 but it is used by Windows NT. The case of filenames is not 136completely compatible from Windows NT to Windows 95. It is not completely 137compatible in the reverse direction, however. Filenames that fit in 138the 8.3 namespace and are written on Windows NT to be lowercase will 139show up as uppercase on Windows 95. 140 141Note that the "start" and "size" values are actually little 142endian integer values. The descriptions of the fields in this 143structure are public knowledge and can be found elsewhere. 144 145With the extended FAT system, Microsoft has inserted extra 146directory entries for any files with extended names. (Any name which 147legally fits within the old 8.3 encoding scheme does not have extra 148entries.) I call these extra entries slots. Basically, a slot is a 149specially formatted directory entry which holds up to 13 characters of 150a file's extended name. Think of slots as additional labeling for the 151directory entry of the file to which they correspond. Microsoft 152prefers to refer to the 8.3 entry for a file as its alias and the 153extended slot directory entries as the file name. 154 155The C structure for a slot directory entry follows: 156 157 struct slot { // Up to 13 characters of a long name 158 unsigned char id; // sequence number for slot 159 unsigned char name0_4[10]; // first 5 characters in name 160 unsigned char attr; // attribute byte 161 unsigned char reserved; // always 0 162 unsigned char alias_checksum; // checksum for 8.3 alias 163 unsigned char name5_10[12]; // 6 more characters in name 164 unsigned char start[2]; // starting cluster number 165 unsigned char name11_12[4]; // last 2 characters in name 166 }; 167 168If the layout of the slots looks a little odd, it's only 169because of Microsoft's efforts to maintain compatibility with old 170software. The slots must be disguised to prevent old software from 171panicking. To this end, a number of measures are taken: 172 173 1) The attribute byte for a slot directory entry is always set 174 to 0x0f. This corresponds to an old directory entry with 175 attributes of "hidden", "system", "read-only", and "volume 176 label". Most old software will ignore any directory 177 entries with the "volume label" bit set. Real volume label 178 entries don't have the other three bits set. 179 180 2) The starting cluster is always set to 0, an impossible 181 value for a DOS file. 182 183Because the extended FAT system is backward compatible, it is 184possible for old software to modify directory entries. Measures must 185be taken to ensure the validity of slots. An extended FAT system can 186verify that a slot does in fact belong to an 8.3 directory entry by 187the following: 188 189 1) Positioning. Slots for a file always immediately proceed 190 their corresponding 8.3 directory entry. In addition, each 191 slot has an id which marks its order in the extended file 192 name. Here is a very abbreviated view of an 8.3 directory 193 entry and its corresponding long name slots for the file 194 "My Big File.Extension which is long": 195 196 <proceeding files...> 197 <slot #3, id = 0x43, characters = "h is long"> 198 <slot #2, id = 0x02, characters = "xtension whic"> 199 <slot #1, id = 0x01, characters = "My Big File.E"> 200 <directory entry, name = "MYBIGFIL.EXT"> 201 202 Note that the slots are stored from last to first. Slots 203 are numbered from 1 to N. The Nth slot is or'ed with 0x40 204 to mark it as the last one. 205 206 2) Checksum. Each slot has an "alias_checksum" value. The 207 checksum is calculated from the 8.3 name using the 208 following algorithm: 209 210 for (sum = i = 0; i < 11; i++) { 211 sum = (((sum&1)<<7)|((sum&0xfe)>>1)) + name[i] 212 } 213 214 3) If there is free space in the final slot, a Unicode NULL (0x0000) 215 is stored after the final character. After that, all unused 216 characters in the final slot are set to Unicode 0xFFFF. 217 218Finally, note that the extended name is stored in Unicode. Each Unicode 219character takes two bytes. 220