| Ryusuke Konishi | 962281a | 2009-04-06 19:01:20 -0700 | [diff] [blame] | 1 | NILFS2 | 
|  | 2 | ------ | 
|  | 3 |  | 
|  | 4 | NILFS2 is a log-structured file system (LFS) supporting continuous | 
|  | 5 | snapshotting.  In addition to versioning capability of the entire file | 
|  | 6 | system, users can even restore files mistakenly overwritten or | 
|  | 7 | destroyed just a few seconds ago.  Since NILFS2 can keep consistency | 
|  | 8 | like conventional LFS, it achieves quick recovery after system | 
|  | 9 | crashes. | 
|  | 10 |  | 
|  | 11 | NILFS2 creates a number of checkpoints every few seconds or per | 
|  | 12 | synchronous write basis (unless there is no change).  Users can select | 
|  | 13 | significant versions among continuously created checkpoints, and can | 
|  | 14 | change them into snapshots which will be preserved until they are | 
|  | 15 | changed back to checkpoints. | 
|  | 16 |  | 
|  | 17 | There is no limit on the number of snapshots until the volume gets | 
|  | 18 | full.  Each snapshot is mountable as a read-only file system | 
|  | 19 | concurrently with its writable mount, and this feature is convenient | 
|  | 20 | for online backup. | 
|  | 21 |  | 
|  | 22 | The userland tools are included in nilfs-utils package, which is | 
|  | 23 | available from the following download page.  At least "mkfs.nilfs2", | 
|  | 24 | "mount.nilfs2", "umount.nilfs2", and "nilfs_cleanerd" (so called | 
|  | 25 | cleaner or garbage collector) are required.  Details on the tools are | 
|  | 26 | described in the man pages included in the package. | 
|  | 27 |  | 
|  | 28 | Project web page:    http://www.nilfs.org/en/ | 
|  | 29 | Download page:       http://www.nilfs.org/en/download.html | 
|  | 30 | Git tree web page:   http://www.nilfs.org/git/ | 
| Ryusuke Konishi | 6aff43f | 2010-01-02 21:41:53 +0900 | [diff] [blame] | 31 | List info:           http://vger.kernel.org/vger-lists.html#linux-nilfs | 
| Ryusuke Konishi | 962281a | 2009-04-06 19:01:20 -0700 | [diff] [blame] | 32 |  | 
|  | 33 | Caveats | 
|  | 34 | ======= | 
|  | 35 |  | 
|  | 36 | Features which NILFS2 does not support yet: | 
|  | 37 |  | 
|  | 38 | - atime | 
|  | 39 | - extended attributes | 
|  | 40 | - POSIX ACLs | 
|  | 41 | - quotas | 
| Ryusuke Konishi | fb6e711 | 2009-05-30 11:27:17 +0900 | [diff] [blame] | 42 | - fsck | 
| Ryusuke Konishi | 962281a | 2009-04-06 19:01:20 -0700 | [diff] [blame] | 43 | - defragmentation | 
|  | 44 |  | 
|  | 45 | Mount options | 
|  | 46 | ============= | 
|  | 47 |  | 
|  | 48 | NILFS2 supports the following mount options: | 
|  | 49 | (*) == default | 
|  | 50 |  | 
| Ryusuke Konishi | 773bc4f | 2010-07-05 13:00:08 +0900 | [diff] [blame] | 51 | barrier(*)		This enables/disables the use of write barriers.  This | 
|  | 52 | nobarrier		requires an IO stack which can support barriers, and | 
|  | 53 | if nilfs gets an error on a barrier write, it will | 
|  | 54 | disable again with a warning. | 
| Ryusuke Konishi | 277a6a3 | 2010-04-02 18:02:33 +0900 | [diff] [blame] | 55 | errors=continue		Keep going on a filesystem error. | 
|  | 56 | errors=remount-ro(*)	Remount the filesystem read-only on an error. | 
| Ryusuke Konishi | 962281a | 2009-04-06 19:01:20 -0700 | [diff] [blame] | 57 | errors=panic		Panic and halt the machine if an error occurs. | 
|  | 58 | cp=n			Specify the checkpoint-number of the snapshot to be | 
|  | 59 | mounted.  Checkpoints and snapshots are listed by lscp | 
|  | 60 | user command.  Only the checkpoints marked as snapshot | 
|  | 61 | are mountable with this option.  Snapshot is read-only, | 
|  | 62 | so a read-only mount option must be specified together. | 
|  | 63 | order=relaxed(*)	Apply relaxed order semantics that allows modified data | 
|  | 64 | blocks to be written to disk without making a | 
|  | 65 | checkpoint if no metadata update is going.  This mode | 
|  | 66 | is equivalent to the ordered data mode of the ext3 | 
|  | 67 | filesystem except for the updates on data blocks still | 
|  | 68 | conserve atomicity.  This will improve synchronous | 
|  | 69 | write performance for overwriting. | 
|  | 70 | order=strict		Apply strict in-order semantics that preserves sequence | 
|  | 71 | of all file operations including overwriting of data | 
|  | 72 | blocks.  That means, it is guaranteed that no | 
|  | 73 | overtaking of events occurs in the recovered file | 
|  | 74 | system after a crash. | 
| Ryusuke Konishi | 0234576 | 2009-11-20 03:28:01 +0900 | [diff] [blame] | 75 | norecovery		Disable recovery of the filesystem on mount. | 
|  | 76 | This disables every write access on the device for | 
|  | 77 | read-only mounts or snapshots.  This option will fail | 
|  | 78 | for r/w mounts on an unclean volume. | 
| Ryusuke Konishi | 802d317 | 2010-07-05 14:27:04 +0900 | [diff] [blame] | 79 | discard			This enables/disables the use of discard/TRIM commands. | 
|  | 80 | nodiscard(*)		The discard/TRIM commands are sent to the underlying | 
|  | 81 | block device when blocks are freed.  This is useful | 
|  | 82 | for SSD devices and sparse/thinly-provisioned LUNs. | 
| Ryusuke Konishi | 962281a | 2009-04-06 19:01:20 -0700 | [diff] [blame] | 83 |  | 
|  | 84 | NILFS2 usage | 
|  | 85 | ============ | 
|  | 86 |  | 
|  | 87 | To use nilfs2 as a local file system, simply: | 
|  | 88 |  | 
|  | 89 | # mkfs -t nilfs2 /dev/block_device | 
|  | 90 | # mount -t nilfs2 /dev/block_device /dir | 
|  | 91 |  | 
|  | 92 | This will also invoke the cleaner through the mount helper program | 
|  | 93 | (mount.nilfs2). | 
|  | 94 |  | 
|  | 95 | Checkpoints and snapshots are managed by the following commands. | 
|  | 96 | Their manpages are included in the nilfs-utils package above. | 
|  | 97 |  | 
|  | 98 | lscp     list checkpoints or snapshots. | 
|  | 99 | mkcp     make a checkpoint or a snapshot. | 
|  | 100 | chcp     change an existing checkpoint to a snapshot or vice versa. | 
|  | 101 | rmcp     invalidate specified checkpoint(s). | 
|  | 102 |  | 
|  | 103 | To mount a snapshot, | 
|  | 104 |  | 
|  | 105 | # mount -t nilfs2 -r -o cp=<cno> /dev/block_device /snap_dir | 
|  | 106 |  | 
|  | 107 | where <cno> is the checkpoint number of the snapshot. | 
|  | 108 |  | 
|  | 109 | To unmount the NILFS2 mount point or snapshot, simply: | 
|  | 110 |  | 
|  | 111 | # umount /dir | 
|  | 112 |  | 
|  | 113 | Then, the cleaner daemon is automatically shut down by the umount | 
|  | 114 | helper program (umount.nilfs2). | 
|  | 115 |  | 
|  | 116 | Disk format | 
|  | 117 | =========== | 
|  | 118 |  | 
|  | 119 | A nilfs2 volume is equally divided into a number of segments except | 
|  | 120 | for the super block (SB) and segment #0.  A segment is the container | 
|  | 121 | of logs.  Each log is composed of summary information blocks, payload | 
|  | 122 | blocks, and an optional super root block (SR): | 
|  | 123 |  | 
|  | 124 | ______________________________________________________ | 
|  | 125 | | |SB| | Segment | Segment | Segment | ... | Segment | | | 
|  | 126 | |_|__|_|____0____|____1____|____2____|_____|____N____|_| | 
|  | 127 | 0 +1K +4K       +8M       +16M      +24M  +(8MB x N) | 
|  | 128 | .             .            (Typical offsets for 4KB-block) | 
|  | 129 | .                  . | 
|  | 130 | .______________________. | 
|  | 131 | | log | log |... | log | | 
|  | 132 | |__1__|__2__|____|__m__| | 
|  | 133 | .       . | 
|  | 134 | .               . | 
|  | 135 | .                       . | 
|  | 136 | .______________________________. | 
|  | 137 | | Summary | Payload blocks  |SR| | 
|  | 138 | |_blocks__|_________________|__| | 
|  | 139 |  | 
|  | 140 | The payload blocks are organized per file, and each file consists of | 
|  | 141 | data blocks and B-tree node blocks: | 
|  | 142 |  | 
|  | 143 | |<---       File-A        --->|<---       File-B        --->| | 
|  | 144 | _______________________________________________________________ | 
|  | 145 | | Data blocks | B-tree blocks | Data blocks | B-tree blocks | ... | 
|  | 146 | _|_____________|_______________|_____________|_______________|_ | 
|  | 147 |  | 
|  | 148 |  | 
|  | 149 | Since only the modified blocks are written in the log, it may have | 
|  | 150 | files without data blocks or B-tree node blocks. | 
|  | 151 |  | 
|  | 152 | The organization of the blocks is recorded in the summary information | 
|  | 153 | blocks, which contains a header structure (nilfs_segment_summary), per | 
|  | 154 | file structures (nilfs_finfo), and per block structures (nilfs_binfo): | 
|  | 155 |  | 
|  | 156 | _________________________________________________________________________ | 
|  | 157 | | Summary | finfo | binfo | ... | binfo | finfo | binfo | ... | binfo |... | 
|  | 158 | |_blocks__|___A___|_(A,1)_|_____|(A,Na)_|___B___|_(B,1)_|_____|(B,Nb)_|___ | 
|  | 159 |  | 
|  | 160 |  | 
|  | 161 | The logs include regular files, directory files, symbolic link files | 
|  | 162 | and several meta data files.  The mata data files are the files used | 
|  | 163 | to maintain file system meta data.  The current version of NILFS2 uses | 
|  | 164 | the following meta data files: | 
|  | 165 |  | 
|  | 166 | 1) Inode file (ifile)             -- Stores on-disk inodes | 
|  | 167 | 2) Checkpoint file (cpfile)       -- Stores checkpoints | 
|  | 168 | 3) Segment usage file (sufile)    -- Stores allocation state of segments | 
|  | 169 | 4) Data address translation file  -- Maps virtual block numbers to usual | 
|  | 170 | (DAT)                             block numbers.  This file serves to | 
|  | 171 | make on-disk blocks relocatable. | 
| Ryusuke Konishi | 962281a | 2009-04-06 19:01:20 -0700 | [diff] [blame] | 172 |  | 
|  | 173 | The following figure shows a typical organization of the logs: | 
|  | 174 |  | 
|  | 175 | _________________________________________________________________________ | 
|  | 176 | | Summary | regular file | file  | ... | ifile | cpfile | sufile | DAT |SR| | 
|  | 177 | |_blocks__|_or_directory_|_______|_____|_______|________|________|_____|__| | 
|  | 178 |  | 
|  | 179 |  | 
|  | 180 | To stride over segment boundaries, this sequence of files may be split | 
|  | 181 | into multiple logs.  The sequence of logs that should be treated as | 
|  | 182 | logically one log, is delimited with flags marked in the segment | 
|  | 183 | summary.  The recovery code of nilfs2 looks this boundary information | 
|  | 184 | to ensure atomicity of updates. | 
|  | 185 |  | 
|  | 186 | The super root block is inserted for every checkpoints.  It includes | 
|  | 187 | three special inodes, inodes for the DAT, cpfile, and sufile.  Inodes | 
|  | 188 | of regular files, directories, symlinks and other special files, are | 
|  | 189 | included in the ifile.  The inode of ifile itself is included in the | 
|  | 190 | corresponding checkpoint entry in the cpfile.  Thus, the hierarchy | 
|  | 191 | among NILFS2 files can be depicted as follows: | 
|  | 192 |  | 
|  | 193 | Super block (SB) | 
|  | 194 | | | 
|  | 195 | v | 
|  | 196 | Super root block (the latest cno=xx) | 
|  | 197 | |-- DAT | 
|  | 198 | |-- sufile | 
|  | 199 | `-- cpfile | 
|  | 200 | |-- ifile (cno=c1) | 
|  | 201 | |-- ifile (cno=c2) ---- file (ino=i1) | 
|  | 202 | :        :          |-- file (ino=i2) | 
|  | 203 | `-- ifile (cno=xx)  |-- file (ino=i3) | 
|  | 204 | :        : | 
|  | 205 | `-- file (ino=yy) | 
|  | 206 | ( regular file, directory, or symlink ) | 
|  | 207 |  | 
|  | 208 | For detail on the format of each file, please see include/linux/nilfs2_fs.h. |