| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | The Linux NTFS filesystem driver | 
|  | 2 | ================================ | 
|  | 3 |  | 
|  | 4 |  | 
|  | 5 | Table of contents | 
|  | 6 | ================= | 
|  | 7 |  | 
|  | 8 | - Overview | 
|  | 9 | - Web site | 
|  | 10 | - Features | 
|  | 11 | - Supported mount options | 
|  | 12 | - Known bugs and (mis-)features | 
|  | 13 | - Using NTFS volume and stripe sets | 
|  | 14 | - The Device-Mapper driver | 
|  | 15 | - The Software RAID / MD driver | 
| Matt LaPlante | 2fe0ae7 | 2006-10-03 22:50:39 +0200 | [diff] [blame] | 16 | - Limitations when using the MD driver | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 17 | - ChangeLog | 
|  | 18 |  | 
|  | 19 |  | 
|  | 20 | Overview | 
|  | 21 | ======== | 
|  | 22 |  | 
|  | 23 | Linux-NTFS comes with a number of user-space programs known as ntfsprogs. | 
| Anton Altaparmakov | c002f42 | 2005-02-03 12:02:56 +0000 | [diff] [blame] | 24 | These include mkntfs, a full-featured ntfs filesystem format utility, | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 25 | ntfsundelete used for recovering files that were unintentionally deleted | 
|  | 26 | from an NTFS volume and ntfsresize which is used to resize an NTFS partition. | 
|  | 27 | See the web site for more information. | 
|  | 28 |  | 
|  | 29 | To mount an NTFS 1.2/3.x (Windows NT4/2000/XP/2003) volume, use the file | 
|  | 30 | system type 'ntfs'.  The driver currently supports read-only mode (with no | 
|  | 31 | fault-tolerance, encryption or journalling) and very limited, but safe, write | 
|  | 32 | support. | 
|  | 33 |  | 
|  | 34 | For fault tolerance and raid support (i.e. volume and stripe sets), you can | 
|  | 35 | use the kernel's Software RAID / MD driver.  See section "Using Software RAID | 
|  | 36 | with NTFS" for details. | 
|  | 37 |  | 
|  | 38 |  | 
|  | 39 | Web site | 
|  | 40 | ======== | 
|  | 41 |  | 
|  | 42 | There is plenty of additional information on the linux-ntfs web site | 
|  | 43 | at http://linux-ntfs.sourceforge.net/ | 
|  | 44 |  | 
|  | 45 | The web site has a lot of additional information, such as a comprehensive | 
| Matt LaPlante | 2fe0ae7 | 2006-10-03 22:50:39 +0200 | [diff] [blame] | 46 | FAQ, documentation on the NTFS on-disk format, information on the Linux-NTFS | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 47 | userspace utilities, etc. | 
|  | 48 |  | 
|  | 49 |  | 
|  | 50 | Features | 
|  | 51 | ======== | 
|  | 52 |  | 
| Anton Altaparmakov | 98b2703 | 2005-10-11 15:40:40 +0100 | [diff] [blame] | 53 | - This is a complete rewrite of the NTFS driver that used to be in the 2.4 and | 
|  | 54 | earlier kernels.  This new driver implements NTFS read support and is | 
|  | 55 | functionally equivalent to the old ntfs driver and it also implements limited | 
|  | 56 | write support.  The biggest limitation at present is that files/directories | 
|  | 57 | cannot be created or deleted.  See below for the list of write features that | 
|  | 58 | are so far supported.  Another limitation is that writing to compressed files | 
|  | 59 | is not implemented at all.  Also, neither read nor write access to encrypted | 
|  | 60 | files is so far implemented. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 61 | - The new driver has full support for sparse files on NTFS 3.x volumes which | 
|  | 62 | the old driver isn't happy with. | 
|  | 63 | - The new driver supports execution of binaries due to mmap() now being | 
|  | 64 | supported. | 
|  | 65 | - The new driver supports loopback mounting of files on NTFS which is used by | 
|  | 66 | some Linux distributions to enable the user to run Linux from an NTFS | 
|  | 67 | partition by creating a large file while in Windows and then loopback | 
|  | 68 | mounting the file while in Linux and creating a Linux filesystem on it that | 
|  | 69 | is used to install Linux on it. | 
|  | 70 | - A comparison of the two drivers using: | 
|  | 71 | time find . -type f -exec md5sum "{}" \; | 
|  | 72 | run three times in sequence with each driver (after a reboot) on a 1.4GiB | 
|  | 73 | NTFS partition, showed the new driver to be 20% faster in total time elapsed | 
|  | 74 | (from 9:43 minutes on average down to 7:53).  The time spent in user space | 
|  | 75 | was unchanged but the time spent in the kernel was decreased by a factor of | 
|  | 76 | 2.5 (from 85 CPU seconds down to 33). | 
|  | 77 | - The driver does not support short file names in general.  For backwards | 
|  | 78 | compatibility, we implement access to files using their short file names if | 
|  | 79 | they exist.  The driver will not create short file names however, and a | 
|  | 80 | rename will discard any existing short file name. | 
|  | 81 | - The new driver supports exporting of mounted NTFS volumes via NFS. | 
|  | 82 | - The new driver supports async io (aio). | 
|  | 83 | - The new driver supports fsync(2), fdatasync(2), and msync(2). | 
|  | 84 | - The new driver supports readv(2) and writev(2). | 
|  | 85 | - The new driver supports access time updates (including mtime and ctime). | 
| Anton Altaparmakov | 98b2703 | 2005-10-11 15:40:40 +0100 | [diff] [blame] | 86 | - The new driver supports truncate(2) and open(2) with O_TRUNC.  But at present | 
|  | 87 | only very limited support for highly fragmented files, i.e. ones which have | 
|  | 88 | their data attribute split across multiple extents, is included.  Another | 
|  | 89 | limitation is that at present truncate(2) will never create sparse files, | 
|  | 90 | since to mark a file sparse we need to modify the directory entry for the | 
|  | 91 | file and we do not implement directory modifications yet. | 
|  | 92 | - The new driver supports write(2) which can both overwrite existing data and | 
|  | 93 | extend the file size so that you can write beyond the existing data.  Also, | 
|  | 94 | writing into sparse regions is supported and the holes are filled in with | 
|  | 95 | clusters.  But at present only limited support for highly fragmented files, | 
|  | 96 | i.e. ones which have their data attribute split across multiple extents, is | 
|  | 97 | included.  Another limitation is that write(2) will never create sparse | 
|  | 98 | files, since to mark a file sparse we need to modify the directory entry for | 
|  | 99 | the file and we do not implement directory modifications yet. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 100 |  | 
|  | 101 | Supported mount options | 
|  | 102 | ======================= | 
|  | 103 |  | 
|  | 104 | In addition to the generic mount options described by the manual page for the | 
|  | 105 | mount command (man 8 mount, also see man 5 fstab), the NTFS driver supports the | 
|  | 106 | following mount options: | 
|  | 107 |  | 
|  | 108 | iocharset=name		Deprecated option.  Still supported but please use | 
|  | 109 | nls=name in the future.  See description for nls=name. | 
|  | 110 |  | 
|  | 111 | nls=name		Character set to use when returning file names. | 
|  | 112 | Unlike VFAT, NTFS suppresses names that contain | 
|  | 113 | unconvertible characters.  Note that most character | 
|  | 114 | sets contain insufficient characters to represent all | 
|  | 115 | possible Unicode characters that can exist on NTFS. | 
|  | 116 | To be sure you are not missing any files, you are | 
|  | 117 | advised to use nls=utf8 which is capable of | 
|  | 118 | representing all Unicode characters. | 
|  | 119 |  | 
|  | 120 | utf8=<bool>		Option no longer supported.  Currently mapped to | 
|  | 121 | nls=utf8 but please use nls=utf8 in the future and | 
|  | 122 | make sure utf8 is compiled either as module or into | 
|  | 123 | the kernel.  See description for nls=name. | 
|  | 124 |  | 
|  | 125 | uid= | 
|  | 126 | gid= | 
|  | 127 | umask=			Provide default owner, group, and access mode mask. | 
|  | 128 | These options work as documented in mount(8).  By | 
|  | 129 | default, the files/directories are owned by root and | 
|  | 130 | he/she has read and write permissions, as well as | 
|  | 131 | browse permission for directories.  No one else has any | 
|  | 132 | access permissions.  I.e. the mode on all files is by | 
|  | 133 | default rw------- and for directories rwx------, a | 
|  | 134 | consequence of the default fmask=0177 and dmask=0077. | 
|  | 135 | Using a umask of zero will grant all permissions to | 
|  | 136 | everyone, i.e. all files and directories will have mode | 
|  | 137 | rwxrwxrwx. | 
|  | 138 |  | 
|  | 139 | fmask= | 
|  | 140 | dmask=			Instead of specifying umask which applies both to | 
|  | 141 | files and directories, fmask applies only to files and | 
|  | 142 | dmask only to directories. | 
|  | 143 |  | 
|  | 144 | sloppy=<BOOL>		If sloppy is specified, ignore unknown mount options. | 
|  | 145 | Otherwise the default behaviour is to abort mount if | 
|  | 146 | any unknown options are found. | 
|  | 147 |  | 
|  | 148 | show_sys_files=<BOOL>	If show_sys_files is specified, show the system files | 
|  | 149 | in directory listings.  Otherwise the default behaviour | 
|  | 150 | is to hide the system files. | 
|  | 151 | Note that even when show_sys_files is specified, "$MFT" | 
|  | 152 | will not be visible due to bugs/mis-features in glibc. | 
|  | 153 | Further, note that irrespective of show_sys_files, all | 
|  | 154 | files are accessible by name, i.e. you can always do | 
|  | 155 | "ls -l \$UpCase" for example to specifically show the | 
|  | 156 | system file containing the Unicode upcase table. | 
|  | 157 |  | 
|  | 158 | case_sensitive=<BOOL>	If case_sensitive is specified, treat all file names as | 
|  | 159 | case sensitive and create file names in the POSIX | 
|  | 160 | namespace.  Otherwise the default behaviour is to treat | 
|  | 161 | file names as case insensitive and to create file names | 
|  | 162 | in the WIN32/LONG name space.  Note, the Linux NTFS | 
|  | 163 | driver will never create short file names and will | 
|  | 164 | remove them on rename/delete of the corresponding long | 
|  | 165 | file name. | 
|  | 166 | Note that files remain accessible via their short file | 
|  | 167 | name, if it exists.  If case_sensitive, you will need | 
|  | 168 | to provide the correct case of the short file name. | 
|  | 169 |  | 
| Anton Altaparmakov | c002f42 | 2005-02-03 12:02:56 +0000 | [diff] [blame] | 170 | disable_sparse=<BOOL>	If disable_sparse is specified, creation of sparse | 
|  | 171 | regions, i.e. holes, inside files is disabled for the | 
|  | 172 | volume (for the duration of this mount only).  By | 
|  | 173 | default, creation of sparse regions is enabled, which | 
|  | 174 | is consistent with the behaviour of traditional Unix | 
|  | 175 | filesystems. | 
|  | 176 |  | 
|  | 177 | errors=opt		What to do when critical filesystem errors are found. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 178 | Following values can be used for "opt": | 
|  | 179 | continue: DEFAULT, try to clean-up as much as | 
|  | 180 | possible, e.g. marking a corrupt inode as | 
|  | 181 | bad so it is no longer accessed, and then | 
|  | 182 | continue. | 
|  | 183 | recover:  At present only supported is recovery of | 
|  | 184 | the boot sector from the backup copy. | 
|  | 185 | If read-only mount, the recovery is done | 
|  | 186 | in memory only and not written to disk. | 
|  | 187 | Note that the options are additive, i.e. specifying: | 
|  | 188 | errors=continue,errors=recover | 
|  | 189 | means the driver will attempt to recover and if that | 
|  | 190 | fails it will clean-up as much as possible and | 
|  | 191 | continue. | 
|  | 192 |  | 
|  | 193 | mft_zone_multiplier=	Set the MFT zone multiplier for the volume (this | 
|  | 194 | setting is not persistent across mounts and can be | 
|  | 195 | changed from mount to mount but cannot be changed on | 
|  | 196 | remount).  Values of 1 to 4 are allowed, 1 being the | 
|  | 197 | default.  The MFT zone multiplier determines how much | 
|  | 198 | space is reserved for the MFT on the volume.  If all | 
|  | 199 | other space is used up, then the MFT zone will be | 
|  | 200 | shrunk dynamically, so this has no impact on the | 
|  | 201 | amount of free space.  However, it can have an impact | 
|  | 202 | on performance by affecting fragmentation of the MFT. | 
|  | 203 | In general use the default.  If you have a lot of small | 
|  | 204 | files then use a higher value.  The values have the | 
|  | 205 | following meaning: | 
|  | 206 | Value	     MFT zone size (% of volume size) | 
|  | 207 | 1		12.5% | 
|  | 208 | 2		25% | 
|  | 209 | 3		37.5% | 
|  | 210 | 4		50% | 
|  | 211 | Note this option is irrelevant for read-only mounts. | 
|  | 212 |  | 
|  | 213 |  | 
|  | 214 | Known bugs and (mis-)features | 
|  | 215 | ============================= | 
|  | 216 |  | 
|  | 217 | - The link count on each directory inode entry is set to 1, due to Linux not | 
|  | 218 | supporting directory hard links.  This may well confuse some user space | 
|  | 219 | applications, since the directory names will have the same inode numbers. | 
|  | 220 | This also speeds up ntfs_read_inode() immensely.  And we haven't found any | 
|  | 221 | problems with this approach so far.  If you find a problem with this, please | 
|  | 222 | let us know. | 
|  | 223 |  | 
|  | 224 |  | 
|  | 225 | Please send bug reports/comments/feedback/abuse to the Linux-NTFS development | 
|  | 226 | list at sourceforge: linux-ntfs-dev@lists.sourceforge.net | 
|  | 227 |  | 
|  | 228 |  | 
|  | 229 | Using NTFS volume and stripe sets | 
|  | 230 | ================================= | 
|  | 231 |  | 
|  | 232 | For support of volume and stripe sets, you can either use the kernel's | 
|  | 233 | Device-Mapper driver or the kernel's Software RAID / MD driver.  The former is | 
|  | 234 | the recommended one to use for linear raid.  But the latter is required for | 
|  | 235 | raid level 5.  For striping and mirroring, either driver should work fine. | 
|  | 236 |  | 
|  | 237 |  | 
|  | 238 | The Device-Mapper driver | 
|  | 239 | ------------------------ | 
|  | 240 |  | 
|  | 241 | You will need to create a table of the components of the volume/stripe set and | 
|  | 242 | how they fit together and load this into the kernel using the dmsetup utility | 
|  | 243 | (see man 8 dmsetup). | 
|  | 244 |  | 
|  | 245 | Linear volume sets, i.e. linear raid, has been tested and works fine.  Even | 
|  | 246 | though untested, there is no reason why stripe sets, i.e. raid level 0, and | 
|  | 247 | mirrors, i.e. raid level 1 should not work, too.  Stripes with parity, i.e. | 
|  | 248 | raid level 5, unfortunately cannot work yet because the current version of the | 
|  | 249 | Device-Mapper driver does not support raid level 5.  You may be able to use the | 
|  | 250 | Software RAID / MD driver for raid level 5, see the next section for details. | 
|  | 251 |  | 
|  | 252 | To create the table describing your volume you will need to know each of its | 
|  | 253 | components and their sizes in sectors, i.e. multiples of 512-byte blocks. | 
|  | 254 |  | 
|  | 255 | For NT4 fault tolerant volumes you can obtain the sizes using fdisk.  So for | 
|  | 256 | example if one of your partitions is /dev/hda2 you would do: | 
|  | 257 |  | 
|  | 258 | $ fdisk -ul /dev/hda | 
|  | 259 |  | 
|  | 260 | Disk /dev/hda: 81.9 GB, 81964302336 bytes | 
|  | 261 | 255 heads, 63 sectors/track, 9964 cylinders, total 160086528 sectors | 
|  | 262 | Units = sectors of 1 * 512 = 512 bytes | 
|  | 263 |  | 
|  | 264 | Device Boot      Start         End      Blocks   Id  System | 
|  | 265 | /dev/hda1   *          63     4209029     2104483+  83  Linux | 
|  | 266 | /dev/hda2         4209030    37768814    16779892+  86  NTFS | 
|  | 267 | /dev/hda3        37768815    46170809     4200997+  83  Linux | 
|  | 268 |  | 
|  | 269 | And you would know that /dev/hda2 has a size of 37768814 - 4209030 + 1 = | 
|  | 270 | 33559785 sectors. | 
|  | 271 |  | 
|  | 272 | For Win2k and later dynamic disks, you can for example use the ldminfo utility | 
|  | 273 | which is part of the Linux LDM tools (the latest version at the time of | 
|  | 274 | writing is linux-ldm-0.0.8.tar.bz2).  You can download it from: | 
|  | 275 | http://linux-ntfs.sourceforge.net/downloads.html | 
|  | 276 | Simply extract the downloaded archive (tar xvjf linux-ldm-0.0.8.tar.bz2), go | 
|  | 277 | into it (cd linux-ldm-0.0.8) and change to the test directory (cd test).  You | 
|  | 278 | will find the precompiled (i386) ldminfo utility there.  NOTE: You will not be | 
|  | 279 | able to compile this yourself easily so use the binary version! | 
|  | 280 |  | 
|  | 281 | Then you would use ldminfo in dump mode to obtain the necessary information: | 
|  | 282 |  | 
|  | 283 | $ ./ldminfo --dump /dev/hda | 
|  | 284 |  | 
|  | 285 | This would dump the LDM database found on /dev/hda which describes all of your | 
|  | 286 | dynamic disks and all the volumes on them.  At the bottom you will see the | 
|  | 287 | VOLUME DEFINITIONS section which is all you really need.  You may need to look | 
|  | 288 | further above to determine which of the disks in the volume definitions is | 
|  | 289 | which device in Linux.  Hint: Run ldminfo on each of your dynamic disks and | 
|  | 290 | look at the Disk Id close to the top of the output for each (the PRIVATE HEADER | 
|  | 291 | section).  You can then find these Disk Ids in the VBLK DATABASE section in the | 
|  | 292 | <Disk> components where you will get the LDM Name for the disk that is found in | 
|  | 293 | the VOLUME DEFINITIONS section. | 
|  | 294 |  | 
|  | 295 | Note you will also need to enable the LDM driver in the Linux kernel.  If your | 
|  | 296 | distribution did not enable it, you will need to recompile the kernel with it | 
|  | 297 | enabled.  This will create the LDM partitions on each device at boot time.  You | 
|  | 298 | would then use those devices (for /dev/hda they would be /dev/hda1, 2, 3, etc) | 
|  | 299 | in the Device-Mapper table. | 
|  | 300 |  | 
|  | 301 | You can also bypass using the LDM driver by using the main device (e.g. | 
|  | 302 | /dev/hda) and then using the offsets of the LDM partitions into this device as | 
|  | 303 | the "Start sector of device" when creating the table.  Once again ldminfo would | 
|  | 304 | give you the correct information to do this. | 
|  | 305 |  | 
|  | 306 | Assuming you know all your devices and their sizes things are easy. | 
|  | 307 |  | 
|  | 308 | For a linear raid the table would look like this (note all values are in | 
|  | 309 | 512-byte sectors): | 
|  | 310 |  | 
|  | 311 | --- cut here --- | 
|  | 312 | # Offset into	Size of this	Raid type	Device		Start sector | 
|  | 313 | # volume	device						of device | 
|  | 314 | 0		1028161		linear		/dev/hda1	0 | 
|  | 315 | 1028161		3903762		linear		/dev/hdb2	0 | 
|  | 316 | 4931923		2103211		linear		/dev/hdc1	0 | 
|  | 317 | --- cut here --- | 
|  | 318 |  | 
|  | 319 | For a striped volume, i.e. raid level 0, you will need to know the chunk size | 
|  | 320 | you used when creating the volume.  Windows uses 64kiB as the default, so it | 
|  | 321 | will probably be this unless you changes the defaults when creating the array. | 
|  | 322 |  | 
|  | 323 | For a raid level 0 the table would look like this (note all values are in | 
|  | 324 | 512-byte sectors): | 
|  | 325 |  | 
|  | 326 | --- cut here --- | 
|  | 327 | # Offset   Size	    Raid     Number   Chunk  1st        Start	2nd	  Start | 
|  | 328 | # into     of the   type     of	      size   Device	in	Device	  in | 
|  | 329 | # volume   volume	     stripes			device		  device | 
|  | 330 | 0	   2056320  striped  2	      128    /dev/hda1	0	/dev/hdb1 0 | 
|  | 331 | --- cut here --- | 
|  | 332 |  | 
|  | 333 | If there are more than two devices, just add each of them to the end of the | 
|  | 334 | line. | 
|  | 335 |  | 
|  | 336 | Finally, for a mirrored volume, i.e. raid level 1, the table would look like | 
|  | 337 | this (note all values are in 512-byte sectors): | 
|  | 338 |  | 
|  | 339 | --- cut here --- | 
| Matt LaPlante | fa00e7e | 2006-11-30 04:55:36 +0100 | [diff] [blame] | 340 | # Ofs Size   Raid   Log  Number Region Should Number Source  Start Target Start | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 341 | # in  of the type   type of log size   sync?  of     Device  in    Device in | 
|  | 342 | # vol volume		 params		     mirrors	     Device	  Device | 
|  | 343 | 0    2056320 mirror core 2	16     nosync 2	   /dev/hda1 0   /dev/hdb1 0 | 
|  | 344 | --- cut here --- | 
|  | 345 |  | 
|  | 346 | If you are mirroring to multiple devices you can specify further targets at the | 
|  | 347 | end of the line. | 
|  | 348 |  | 
|  | 349 | Note the "Should sync?" parameter "nosync" means that the two mirrors are | 
|  | 350 | already in sync which will be the case on a clean shutdown of Windows.  If the | 
|  | 351 | mirrors are not clean, you can specify the "sync" option instead of "nosync" | 
|  | 352 | and the Device-Mapper driver will then copy the entirey of the "Source Device" | 
|  | 353 | to the "Target Device" or if you specified multipled target devices to all of | 
|  | 354 | them. | 
|  | 355 |  | 
|  | 356 | Once you have your table, save it in a file somewhere (e.g. /etc/ntfsvolume1), | 
|  | 357 | and hand it over to dmsetup to work with, like so: | 
|  | 358 |  | 
|  | 359 | $ dmsetup create myvolume1 /etc/ntfsvolume1 | 
|  | 360 |  | 
|  | 361 | You can obviously replace "myvolume1" with whatever name you like. | 
|  | 362 |  | 
|  | 363 | If it all worked, you will now have the device /dev/device-mapper/myvolume1 | 
|  | 364 | which you can then just use as an argument to the mount command as usual to | 
|  | 365 | mount the ntfs volume.  For example: | 
|  | 366 |  | 
|  | 367 | $ mount -t ntfs -o ro /dev/device-mapper/myvolume1 /mnt/myvol1 | 
|  | 368 |  | 
|  | 369 | (You need to create the directory /mnt/myvol1 first and of course you can use | 
|  | 370 | anything you like instead of /mnt/myvol1 as long as it is an existing | 
|  | 371 | directory.) | 
|  | 372 |  | 
|  | 373 | It is advisable to do the mount read-only to see if the volume has been setup | 
|  | 374 | correctly to avoid the possibility of causing damage to the data on the ntfs | 
|  | 375 | volume. | 
|  | 376 |  | 
|  | 377 |  | 
|  | 378 | The Software RAID / MD driver | 
|  | 379 | ----------------------------- | 
|  | 380 |  | 
|  | 381 | An alternative to using the Device-Mapper driver is to use the kernel's | 
|  | 382 | Software RAID / MD driver.  For which you need to set up your /etc/raidtab | 
|  | 383 | appropriately (see man 5 raidtab). | 
|  | 384 |  | 
|  | 385 | Linear volume sets, i.e. linear raid, as well as stripe sets, i.e. raid level | 
| Matt LaPlante | 2fe0ae7 | 2006-10-03 22:50:39 +0200 | [diff] [blame] | 386 | 0, have been tested and work fine (though see section "Limitations when using | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 387 | the MD driver with NTFS volumes" especially if you want to use linear raid). | 
|  | 388 | Even though untested, there is no reason why mirrors, i.e. raid level 1, and | 
|  | 389 | stripes with parity, i.e. raid level 5, should not work, too. | 
|  | 390 |  | 
|  | 391 | You have to use the "persistent-superblock 0" option for each raid-disk in the | 
|  | 392 | NTFS volume/stripe you are configuring in /etc/raidtab as the persistent | 
| Matt LaPlante | fff9289 | 2006-10-03 22:47:42 +0200 | [diff] [blame] | 393 | superblock used by the MD driver would damage the NTFS volume. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 394 |  | 
|  | 395 | Windows by default uses a stripe chunk size of 64k, so you probably want the | 
|  | 396 | "chunk-size 64k" option for each raid-disk, too. | 
|  | 397 |  | 
|  | 398 | For example, if you have a stripe set consisting of two partitions /dev/hda5 | 
|  | 399 | and /dev/hdb1 your /etc/raidtab would look like this: | 
|  | 400 |  | 
|  | 401 | raiddev /dev/md0 | 
|  | 402 | raid-level	0 | 
|  | 403 | nr-raid-disks	2 | 
|  | 404 | nr-spare-disks	0 | 
|  | 405 | persistent-superblock	0 | 
|  | 406 | chunk-size	64k | 
|  | 407 | device		/dev/hda5 | 
|  | 408 | raid-disk	0 | 
|  | 409 | device		/dev/hdb1 | 
|  | 410 | raid-disl	1 | 
|  | 411 |  | 
|  | 412 | For linear raid, just change the raid-level above to "raid-level linear", for | 
|  | 413 | mirrors, change it to "raid-level 1", and for stripe sets with parity, change | 
|  | 414 | it to "raid-level 5". | 
|  | 415 |  | 
|  | 416 | Note for stripe sets with parity you will also need to tell the MD driver | 
|  | 417 | which parity algorithm to use by specifying the option "parity-algorithm | 
|  | 418 | which", where you need to replace "which" with the name of the algorithm to | 
|  | 419 | use (see man 5 raidtab for available algorithms) and you will have to try the | 
|  | 420 | different available algorithms until you find one that works.  Make sure you | 
|  | 421 | are working read-only when playing with this as you may damage your data | 
|  | 422 | otherwise.  If you find which algorithm works please let us know (email the | 
|  | 423 | linux-ntfs developers list linux-ntfs-dev@lists.sourceforge.net or drop in on | 
|  | 424 | IRC in channel #ntfs on the irc.freenode.net network) so we can update this | 
|  | 425 | documentation. | 
|  | 426 |  | 
|  | 427 | Once the raidtab is setup, run for example raid0run -a to start all devices or | 
|  | 428 | raid0run /dev/md0 to start a particular md device, in this case /dev/md0. | 
|  | 429 |  | 
|  | 430 | Then just use the mount command as usual to mount the ntfs volume using for | 
|  | 431 | example:	mount -t ntfs -o ro /dev/md0 /mnt/myntfsvolume | 
|  | 432 |  | 
|  | 433 | It is advisable to do the mount read-only to see if the md volume has been | 
|  | 434 | setup correctly to avoid the possibility of causing damage to the data on the | 
|  | 435 | ntfs volume. | 
|  | 436 |  | 
|  | 437 |  | 
| Matt LaPlante | 2fe0ae7 | 2006-10-03 22:50:39 +0200 | [diff] [blame] | 438 | Limitations when using the Software RAID / MD driver | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 439 | ----------------------------------------------------- | 
|  | 440 |  | 
|  | 441 | Using the md driver will not work properly if any of your NTFS partitions have | 
|  | 442 | an odd number of sectors.  This is especially important for linear raid as all | 
|  | 443 | data after the first partition with an odd number of sectors will be offset by | 
|  | 444 | one or more sectors so if you mount such a partition with write support you | 
|  | 445 | will cause massive damage to the data on the volume which will only become | 
|  | 446 | apparent when you try to use the volume again under Windows. | 
|  | 447 |  | 
|  | 448 | So when using linear raid, make sure that all your partitions have an even | 
|  | 449 | number of sectors BEFORE attempting to use it.  You have been warned! | 
|  | 450 |  | 
|  | 451 | Even better is to simply use the Device-Mapper for linear raid and then you do | 
|  | 452 | not have this problem with odd numbers of sectors. | 
|  | 453 |  | 
|  | 454 |  | 
|  | 455 | ChangeLog | 
|  | 456 | ========= | 
|  | 457 |  | 
|  | 458 | Note, a technical ChangeLog aimed at kernel hackers is in fs/ntfs/ChangeLog. | 
|  | 459 |  | 
| Anton Altaparmakov | e750d1c | 2006-03-23 17:04:12 +0000 | [diff] [blame] | 460 | 2.1.27: | 
|  | 461 | - Implement page migration support so the kernel can move memory used | 
|  | 462 | by NTFS files and directories around for management purposes. | 
|  | 463 | - Add support for writing to sparse files created with Windows XP SP2. | 
|  | 464 | - Many minor improvements and bug fixes. | 
| Anton Altaparmakov | 1cf3109f | 2006-02-24 10:48:14 +0000 | [diff] [blame] | 465 | 2.1.26: | 
|  | 466 | - Implement support for sector sizes above 512 bytes (up to the maximum | 
|  | 467 | supported by NTFS which is 4096 bytes). | 
|  | 468 | - Enhance support for NTFS volumes which were supported by Windows but | 
|  | 469 | not by Linux due to invalid attribute list attribute flags. | 
|  | 470 | - A few minor updates and bug fixes. | 
| Anton Altaparmakov | 98b2703 | 2005-10-11 15:40:40 +0100 | [diff] [blame] | 471 | 2.1.25: | 
|  | 472 | - Write support is now extended with write(2) being able to both | 
|  | 473 | overwrite existing file data and to extend files.  Also, if a write | 
|  | 474 | to a sparse region occurs, write(2) will fill in the hole.  Note, | 
|  | 475 | mmap(2) based writes still do not support writing into holes or | 
|  | 476 | writing beyond the initialized size. | 
|  | 477 | - Write support has a new feature and that is that truncate(2) and | 
|  | 478 | open(2) with O_TRUNC are now implemented thus files can be both made | 
|  | 479 | smaller and larger. | 
|  | 480 | - Note: Both write(2) and truncate(2)/open(2) with O_TRUNC still have | 
|  | 481 | limitations in that they | 
|  | 482 | - only provide limited support for highly fragmented files. | 
|  | 483 | - only work on regular, i.e. uncompressed and unencrypted files. | 
|  | 484 | - never create sparse files although this will change once directory | 
|  | 485 | operations are implemented. | 
|  | 486 | - Lots of bug fixes and enhancements across the board. | 
| Anton Altaparmakov | 7d333d6 | 2005-09-08 23:01:16 +0100 | [diff] [blame] | 487 | 2.1.24: | 
|  | 488 | - Support journals ($LogFile) which have been modified by chkdsk.  This | 
|  | 489 | means users can boot into Windows after we marked the volume dirty. | 
|  | 490 | The Windows boot will run chkdsk and then reboot.  The user can then | 
|  | 491 | immediately boot into Linux rather than having to do a full Windows | 
|  | 492 | boot first before rebooting into Linux and we will recognize such a | 
|  | 493 | journal and empty it as it is clean by definition. | 
|  | 494 | - Support journals ($LogFile) with only one restart page as well as | 
|  | 495 | journals with two different restart pages.  We sanity check both and | 
|  | 496 | either use the only sane one or the more recent one of the two in the | 
|  | 497 | case that both are valid. | 
|  | 498 | - Lots of bug fixes and enhancements across the board. | 
| Anton Altaparmakov | af859a4 | 2005-06-25 21:07:27 +0100 | [diff] [blame] | 499 | 2.1.23: | 
|  | 500 | - Stamp the user space journal, aka transaction log, aka $UsnJrnl, if | 
|  | 501 | it is present and active thus telling Windows and applications using | 
|  | 502 | the transaction log that changes can have happened on the volume | 
|  | 503 | which are not recorded in $UsnJrnl. | 
|  | 504 | - Detect the case when Windows has been hibernated (suspended to disk) | 
|  | 505 | and if this is the case do not allow (re)mounting read-write to | 
|  | 506 | prevent data corruption when you boot back into the suspended | 
|  | 507 | Windows session. | 
|  | 508 | - Implement extension of resident files using the normal file write | 
|  | 509 | code paths, i.e. most very small files can be extended to be a little | 
|  | 510 | bit bigger but not by much. | 
| Anton Altaparmakov | ba6d237 | 2005-06-26 22:12:02 +0100 | [diff] [blame] | 511 | - Add new mount option "disable_sparse".  (See list of mount options | 
|  | 512 | above for details.) | 
| Anton Altaparmakov | af859a4 | 2005-06-25 21:07:27 +0100 | [diff] [blame] | 513 | - Improve handling of ntfs volumes with errors and strange boot sectors | 
|  | 514 | in particular. | 
| Anton Altaparmakov | ba6d237 | 2005-06-26 22:12:02 +0100 | [diff] [blame] | 515 | - Fix various bugs including a nasty deadlock that appeared in recent | 
|  | 516 | kernels (around 2.6.11-2.6.12 timeframe). | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 517 | 2.1.22: | 
|  | 518 | - Improve handling of ntfs volumes with errors. | 
|  | 519 | - Fix various bugs and race conditions. | 
|  | 520 | 2.1.21: | 
|  | 521 | - Fix several race conditions and various other bugs. | 
|  | 522 | - Many internal cleanups, code reorganization, optimizations, and mft | 
|  | 523 | and index record writing code rewritten to fit in with the changes. | 
|  | 524 | - Update Documentation/filesystems/ntfs.txt with instructions on how to | 
|  | 525 | use the Device-Mapper driver with NTFS ftdisk/LDM raid. | 
|  | 526 | 2.1.20: | 
|  | 527 | - Fix two stupid bugs introduced in 2.1.18 release. | 
|  | 528 | 2.1.19: | 
|  | 529 | - Minor bugfix in handling of the default upcase table. | 
|  | 530 | - Many internal cleanups and improvements.  Many thanks to Linus | 
|  | 531 | Torvalds and Al Viro for the help and advice with the sparse | 
|  | 532 | annotations and cleanups. | 
|  | 533 | 2.1.18: | 
|  | 534 | - Fix scheduling latencies at mount time.  (Ingo Molnar) | 
|  | 535 | - Fix endianness bug in a little traversed portion of the attribute | 
|  | 536 | lookup code. | 
|  | 537 | 2.1.17: | 
|  | 538 | - Fix bugs in mount time error code paths. | 
|  | 539 | 2.1.16: | 
|  | 540 | - Implement access time updates (including mtime and ctime). | 
|  | 541 | - Implement fsync(2), fdatasync(2), and msync(2) system calls. | 
|  | 542 | - Enable the readv(2) and writev(2) system calls. | 
|  | 543 | - Enable access via the asynchronous io (aio) API by adding support for | 
|  | 544 | the aio_read(3) and aio_write(3) functions. | 
|  | 545 | 2.1.15: | 
|  | 546 | - Invalidate quotas when (re)mounting read-write. | 
|  | 547 | NOTE:  This now only leave user space journalling on the side.  (See | 
|  | 548 | note for version 2.1.13, below.) | 
|  | 549 | 2.1.14: | 
|  | 550 | - Fix an NFSd caused deadlock reported by several users. | 
|  | 551 | 2.1.13: | 
|  | 552 | - Implement writing of inodes (access time updates are not implemented | 
|  | 553 | yet so mounting with -o noatime,nodiratime is enforced). | 
|  | 554 | - Enable writing out of resident files so you can now overwrite any | 
|  | 555 | uncompressed, unencrypted, nonsparse file as long as you do not | 
|  | 556 | change the file size. | 
|  | 557 | - Add housekeeping of ntfs system files so that ntfsfix no longer needs | 
|  | 558 | to be run after writing to an NTFS volume. | 
|  | 559 | NOTE:  This still leaves quota tracking and user space journalling on | 
|  | 560 | the side but they should not cause data corruption.  In the worst | 
|  | 561 | case the charged quotas will be out of date ($Quota) and some | 
|  | 562 | userspace applications might get confused due to the out of date | 
|  | 563 | userspace journal ($UsnJrnl). | 
|  | 564 | 2.1.12: | 
|  | 565 | - Fix the second fix to the decompression engine from the 2.1.9 release | 
|  | 566 | and some further internals cleanups. | 
|  | 567 | 2.1.11: | 
|  | 568 | - Driver internal cleanups. | 
|  | 569 | 2.1.10: | 
|  | 570 | - Force read-only (re)mounting of volumes with unsupported volume | 
|  | 571 | flags and various cleanups. | 
|  | 572 | 2.1.9: | 
|  | 573 | - Fix two bugs in handling of corner cases in the decompression engine. | 
|  | 574 | 2.1.8: | 
|  | 575 | - Read the $MFT mirror and compare it to the $MFT and if the two do not | 
|  | 576 | match, force a read-only mount and do not allow read-write remounts. | 
|  | 577 | - Read and parse the $LogFile journal and if it indicates that the | 
|  | 578 | volume was not shutdown cleanly, force a read-only mount and do not | 
|  | 579 | allow read-write remounts.  If the $LogFile indicates a clean | 
|  | 580 | shutdown and a read-write (re)mount is requested, empty $LogFile to | 
|  | 581 | ensure that Windows cannot cause data corruption by replaying a stale | 
|  | 582 | journal after Linux has written to the volume. | 
|  | 583 | - Improve time handling so that the NTFS time is fully preserved when | 
|  | 584 | converted to kernel time and only up to 99 nano-seconds are lost when | 
|  | 585 | kernel time is converted to NTFS time. | 
|  | 586 | 2.1.7: | 
|  | 587 | - Enable NFS exporting of mounted NTFS volumes. | 
|  | 588 | 2.1.6: | 
|  | 589 | - Fix minor bug in handling of compressed directories that fixes the | 
|  | 590 | erroneous "du" and "stat" output people reported. | 
|  | 591 | 2.1.5: | 
|  | 592 | - Minor bug fix in attribute list attribute handling that fixes the | 
|  | 593 | I/O errors on "ls" of certain fragmented files found by at least two | 
|  | 594 | people running Windows XP. | 
|  | 595 | 2.1.4: | 
|  | 596 | - Minor update allowing compilation with all gcc versions (well, the | 
|  | 597 | ones the kernel can be compiled with anyway). | 
|  | 598 | 2.1.3: | 
|  | 599 | - Major bug fixes for reading files and volumes in corner cases which | 
|  | 600 | were being hit by Windows 2k/XP users. | 
|  | 601 | 2.1.2: | 
| Matt LaPlante | 5d3f083 | 2006-11-30 05:21:10 +0100 | [diff] [blame] | 602 | - Major bug fixes alleviating the hangs in statfs experienced by some | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 603 | users. | 
|  | 604 | 2.1.1: | 
|  | 605 | - Update handling of compressed files so people no longer get the | 
|  | 606 | frequently reported warning messages about initialized_size != | 
|  | 607 | data_size. | 
|  | 608 | 2.1.0: | 
|  | 609 | - Add configuration option for developmental write support. | 
|  | 610 | - Initial implementation of file overwriting. (Writes to resident files | 
|  | 611 | are not written out to disk yet, so avoid writing to files smaller | 
|  | 612 | than about 1kiB.) | 
|  | 613 | - Intercept/abort changes in file size as they are not implemented yet. | 
|  | 614 | 2.0.25: | 
|  | 615 | - Minor bugfixes in error code paths and small cleanups. | 
|  | 616 | 2.0.24: | 
|  | 617 | - Small internal cleanups. | 
|  | 618 | - Support for sendfile system call. (Christoph Hellwig) | 
|  | 619 | 2.0.23: | 
|  | 620 | - Massive internal locking changes to mft record locking. Fixes | 
|  | 621 | various race conditions and deadlocks. | 
|  | 622 | - Fix ntfs over loopback for compressed files by adding an | 
|  | 623 | optimization barrier. (gcc was screwing up otherwise ?) | 
|  | 624 | Thanks go to Christoph Hellwig for pointing these two out: | 
|  | 625 | - Remove now unused function fs/ntfs/malloc.h::vmalloc_nofs(). | 
|  | 626 | - Fix ntfs_free() for ia64 and parisc. | 
|  | 627 | 2.0.22: | 
|  | 628 | - Small internal cleanups. | 
|  | 629 | 2.0.21: | 
|  | 630 | These only affect 32-bit architectures: | 
|  | 631 | - Check for, and refuse to mount too large volumes (maximum is 2TiB). | 
|  | 632 | - Check for, and refuse to open too large files and directories | 
|  | 633 | (maximum is 16TiB). | 
|  | 634 | 2.0.20: | 
|  | 635 | - Support non-resident directory index bitmaps. This means we now cope | 
|  | 636 | with huge directories without problems. | 
|  | 637 | - Fix a page leak that manifested itself in some cases when reading | 
|  | 638 | directory contents. | 
|  | 639 | - Internal cleanups. | 
|  | 640 | 2.0.19: | 
|  | 641 | - Fix race condition and improvements in block i/o interface. | 
|  | 642 | - Optimization when reading compressed files. | 
|  | 643 | 2.0.18: | 
|  | 644 | - Fix race condition in reading of compressed files. | 
|  | 645 | 2.0.17: | 
|  | 646 | - Cleanups and optimizations. | 
|  | 647 | 2.0.16: | 
|  | 648 | - Fix stupid bug introduced in 2.0.15 in new attribute inode API. | 
|  | 649 | - Big internal cleanup replacing the mftbmp access hacks by using the | 
|  | 650 | new attribute inode API instead. | 
|  | 651 | 2.0.15: | 
|  | 652 | - Bug fix in parsing of remount options. | 
|  | 653 | - Internal changes implementing attribute (fake) inodes allowing all | 
|  | 654 | attribute i/o to go via the page cache and to use all the normal | 
|  | 655 | vfs/mm functionality. | 
|  | 656 | 2.0.14: | 
|  | 657 | - Internal changes improving run list merging code and minor locking | 
|  | 658 | change to not rely on BKL in ntfs_statfs(). | 
|  | 659 | 2.0.13: | 
|  | 660 | - Internal changes towards using iget5_locked() in preparation for | 
|  | 661 | fake inodes and small cleanups to ntfs_volume structure. | 
|  | 662 | 2.0.12: | 
|  | 663 | - Internal cleanups in address space operations made possible by the | 
|  | 664 | changes introduced in the previous release. | 
|  | 665 | 2.0.11: | 
|  | 666 | - Internal updates and cleanups introducing the first step towards | 
|  | 667 | fake inode based attribute i/o. | 
|  | 668 | 2.0.10: | 
|  | 669 | - Microsoft says that the maximum number of inodes is 2^32 - 1. Update | 
|  | 670 | the driver accordingly to only use 32-bits to store inode numbers on | 
|  | 671 | 32-bit architectures. This improves the speed of the driver a little. | 
|  | 672 | 2.0.9: | 
|  | 673 | - Change decompression engine to use a single buffer. This should not | 
|  | 674 | affect performance except perhaps on the most heavy i/o on SMP | 
|  | 675 | systems when accessing multiple compressed files from multiple | 
|  | 676 | devices simultaneously. | 
|  | 677 | - Minor updates and cleanups. | 
|  | 678 | 2.0.8: | 
|  | 679 | - Remove now obsolete show_inodes and posix mount option(s). | 
|  | 680 | - Restore show_sys_files mount option. | 
|  | 681 | - Add new mount option case_sensitive, to determine if the driver | 
|  | 682 | treats file names as case sensitive or not. | 
|  | 683 | - Mostly drop support for short file names (for backwards compatibility | 
|  | 684 | we only support accessing files via their short file name if one | 
|  | 685 | exists). | 
|  | 686 | - Fix dcache aliasing issues wrt short/long file names. | 
|  | 687 | - Cleanups and minor fixes. | 
|  | 688 | 2.0.7: | 
|  | 689 | - Just cleanups. | 
|  | 690 | 2.0.6: | 
|  | 691 | - Major bugfix to make compatible with other kernel changes. This fixes | 
|  | 692 | the hangs/oopses on umount. | 
|  | 693 | - Locking cleanup in directory operations (remove BKL usage). | 
|  | 694 | 2.0.5: | 
|  | 695 | - Major buffer overflow bug fix. | 
|  | 696 | - Minor cleanups and updates for kernel 2.5.12. | 
|  | 697 | 2.0.4: | 
|  | 698 | - Cleanups and updates for kernel 2.5.11. | 
|  | 699 | 2.0.3: | 
|  | 700 | - Small bug fixes, cleanups, and performance improvements. | 
|  | 701 | 2.0.2: | 
|  | 702 | - Use default fmask of 0177 so that files are no executable by default. | 
|  | 703 | If you want owner executable files, just use fmask=0077. | 
|  | 704 | - Update for kernel 2.5.9 but preserve backwards compatibility with | 
|  | 705 | kernel 2.5.7. | 
|  | 706 | - Minor bug fixes, cleanups, and updates. | 
|  | 707 | 2.0.1: | 
|  | 708 | - Minor updates, primarily set the executable bit by default on files | 
|  | 709 | so they can be executed. | 
|  | 710 | 2.0.0: | 
|  | 711 | - Started ChangeLog. | 
|  | 712 |  |