REFLINK ILLUSTRATED
This page illustrates the use of reflink to both explain the feature and to show the usage of some utilities that are required to create and monitor reflinks. These utilities are available for download.
Let us start by noting the available space in the volume. It shows 47GB free.
# df -h . Filesystem Size Used Avail Use% Mounted on /dev/sdd1 50G 3.3G 47G 7% /ocfs2
Now let us create a 5GB file.
# dd if=/dev/zero of=myfile bs=1M count=5000
As expected, the available space drops by 5GB.
# df -h . Filesystem Size Used Avail Use% Mounted on /dev/sdd1 50G 8.2G 42G 17% /ocfs2
Let us use the shared-filefrag utility to note all the extents in the file along with the physical block locations and length of each extent.
# shared-filefrag -v myfile Filesystem type is: 7461636f File size of myfile is 5242880000 (1280000 blocks, blocksize 4096) ext logical physical expected length flags 0 0 1280257 256 1 256 1257985 1280512 20480 2 20736 1280513 1278464 8192 3 28928 870913 1288704 30720 4 59648 903169 901632 30720 5 90368 935425 933888 30720 6 121088 967681 966144 30720 7 151808 999937 998400 30720 8 182528 1064449 1030656 30720 9 213248 1096705 1095168 30720 10 243968 1128961 1127424 30720 11 274688 1161217 1159680 30720 12 305408 1193473 1191936 30720 13 336128 1225729 1224192 30720 14 366848 1290241 1256448 30720 15 397568 1322497 1320960 30720 16 428288 1354753 1353216 30720 17 459008 1387009 1385472 30720 18 489728 1419265 1417728 30720 19 520448 1451521 1449984 30720 20 551168 1483777 1482240 30720 21 581888 1516033 1514496 30720 22 612608 1548289 1546752 30720 23 643328 1580545 1579008 30720 24 674048 1612801 1611264 30720 25 704768 1645057 1643520 30720 26 735488 1677313 1675776 30720 27 766208 1709569 1708032 30720 28 796928 1741825 1740288 30720 29 827648 1774081 1772544 30720 30 858368 1806337 1804800 30720 31 889088 1838593 1837056 30720 32 919808 1870849 1869312 30720 33 950528 1903105 1901568 30720 34 981248 1935361 1933824 30720 35 1011968 1967617 1966080 30720 36 1042688 1999873 1998336 30720 37 1073408 2032129 2030592 30720 38 1104128 2064385 2062848 30720 39 1134848 2096641 2095104 30720 40 1165568 2128897 2127360 30720 41 1196288 2161153 2159616 30720 42 1227008 2193409 2191872 30720 43 1257728 2225665 2224128 22272 eof myfile: 44 extents found
Let us now create 4 reflinks of the same file.
# reflink myfile myfile-ref1 # reflink myfile myfile-ref2 # reflink myfile myfile-ref3 # reflink myfile myfile-ref4
The directory listing shows us 5 files of 5GB each.
# ls -l total 25600000 -rw-r--r-- 1 root root 5242880000 Sep 23 12:48 myfile -rw-r--r-- 1 root root 5242880000 Sep 23 12:57 myfile-ref1 -rw-r--r-- 1 root root 5242880000 Sep 23 12:57 myfile-ref2 -rw-r--r-- 1 root root 5242880000 Sep 23 12:57 myfile-ref3 -rw-r--r-- 1 root root 5242880000 Sep 23 12:57 myfile-ref4
However, df shows no decrease in available space. It still shows 42 GB free.
# df -h . Filesystem Size Used Avail Use% Mounted on /dev/sdd1 50G 8.2G 42G 17% /ocfs2
The shared-filefrag utility shows the same extent layout as before with the exception that all the extents are flagged shared.
# shared-filefrag -v myfile Filesystem type is: 7461636f File size of myfile is 5242880000 (1280000 blocks, blocksize 4096) ext logical physical expected length flags 0 0 1280257 256 shared 1 256 1257985 1280512 20480 shared 2 20736 1280513 1278464 8192 shared 3 28928 870913 1288704 30720 shared 4 59648 903169 901632 30720 shared 5 90368 935425 933888 30720 shared 6 121088 967681 966144 30720 shared 7 151808 999937 998400 30720 shared 8 182528 1064449 1030656 30720 shared 9 213248 1096705 1095168 30720 shared 10 243968 1128961 1127424 30720 shared 11 274688 1161217 1159680 30720 shared 12 305408 1193473 1191936 30720 shared 13 336128 1225729 1224192 30720 shared 14 366848 1290241 1256448 30720 shared 15 397568 1322497 1320960 30720 shared 16 428288 1354753 1353216 30720 shared 17 459008 1387009 1385472 30720 shared 18 489728 1419265 1417728 30720 shared 19 520448 1451521 1449984 30720 shared 20 551168 1483777 1482240 30720 shared 21 581888 1516033 1514496 30720 shared 22 612608 1548289 1546752 30720 shared 23 643328 1580545 1579008 30720 shared 24 674048 1612801 1611264 30720 shared 25 704768 1645057 1643520 30720 shared 26 735488 1677313 1675776 30720 shared 27 766208 1709569 1708032 30720 shared 28 796928 1741825 1740288 30720 shared 29 827648 1774081 1772544 30720 shared 30 858368 1806337 1804800 30720 shared 31 889088 1838593 1837056 30720 shared 32 919808 1870849 1869312 30720 shared 33 950528 1903105 1901568 30720 shared 34 981248 1935361 1933824 30720 shared 35 1011968 1967617 1966080 30720 shared 36 1042688 1999873 1998336 30720 shared 37 1073408 2032129 2030592 30720 shared 38 1104128 2064385 2062848 30720 shared 39 1134848 2096641 2095104 30720 shared 40 1165568 2128897 2127360 30720 shared 41 1196288 2161153 2159616 30720 shared 42 1227008 2193409 2191872 30720 shared 43 1257728 2225665 2224128 22272 shared,eof myfile: 44 extents found
The md5sum utility confirms that the data in the files are identical.
# md5sum myfile* f0c4910bd1b40aecaad309d2a8999e66 myfile f0c4910bd1b40aecaad309d2a8999e66 myfile-ref1 f0c4910bd1b40aecaad309d2a8999e66 myfile-ref2 f0c4910bd1b40aecaad309d2a8999e66 myfile-ref3 f0c4910bd1b40aecaad309d2a8999e66 myfile-ref4
The shared-du utility shows us a total usage of 25000 MB but a footprint of 5000 MB. That is expected as all files share the same set of extents on disk. (The number in parenthesis is the total shared extents for that file.)
# shared-du -m -c --shared-size myfile* 5000 (5000) myfile 5000 (5000) myfile-ref1 5000 (5000) myfile-ref2 5000 (5000) myfile-ref3 5000 (5000) myfile-ref4 25000 total 5000 footprint
Now let us overwrite the first 2GB in the original file.
# dd if=/dev/urandom of=myfile bs=1M count=2000 conv=notrunc
The directory listing does not change other than the mtime of the original file.
# ls -l total 25600000 -rw-r--r-- 1 root root 5242880000 Sep 23 13:16 myfile -rw-r--r-- 1 root root 5242880000 Sep 23 12:57 myfile-ref1 -rw-r--r-- 1 root root 5242880000 Sep 23 12:57 myfile-ref2 -rw-r--r-- 1 root root 5242880000 Sep 23 12:57 myfile-ref3 -rw-r--r-- 1 root root 5242880000 Sep 23 12:57 myfile-ref4
But the available space drops 2GB to 40GB.
# df -h . Filesystem Size Used Avail Use% Mounted on /dev/sdd1 50G 11G 40G 21% /ocfs2
The md5sum utility shows that the file written to after the reflink has changed. The data in the other files remains unchanged.
# md5sum myfile* 2c7ed599daf24fbce0960c516d0e8bba myfile f0c4910bd1b40aecaad309d2a8999e66 myfile-ref1 f0c4910bd1b40aecaad309d2a8999e66 myfile-ref2 f0c4910bd1b40aecaad309d2a8999e66 myfile-ref3 f0c4910bd1b40aecaad309d2a8999e66 myfile-ref4
Th shared-du utility shows us that the footprint has increased by 2GB.
# shared-du -m -c --shared-size myfile* 5000 (3000) myfile 5000 (5000) myfile-ref1 5000 (5000) myfile-ref2 5000 (5000) myfile-ref3 5000 (5000) myfile-ref4 25000 total 7000 footprint
Finally the shared-filefrag utility that shows us different extents in the overwritten areas of the file.
# shared-filefrag -v myfile Filesystem type is: 7461636f File size of myfile is 5242880000 (1280000 blocks, blocksize 4096) ext logical physical expected length flags 0 0 2247937 8448 1 8448 2257921 2256384 30720 2 39168 2290177 2288640 30720 3 69888 2322433 2320896 30720 4 100608 2354689 2353152 30720 5 131328 2386945 2385408 30720 6 162048 2419201 2417664 30720 7 192768 2451457 2449920 30720 8 223488 2483713 2482176 30720 9 254208 2515969 2514432 30720 10 284928 2548225 2546688 30720 11 315648 2580481 2578944 30720 12 346368 2612737 2611200 30720 13 377088 2644993 2643456 30720 14 407808 2677249 2675712 30720 15 438528 2709505 2707968 30720 16 469248 2741761 2740224 30720 17 499968 2774017 2772480 12032 18 512000 1441537 2786048 8448 shared 19 520448 1451521 1449984 30720 shared 20 551168 1483777 1482240 30720 shared 21 581888 1516033 1514496 30720 shared 22 612608 1548289 1546752 30720 shared 23 643328 1580545 1579008 30720 shared 24 674048 1612801 1611264 30720 shared 25 704768 1645057 1643520 30720 shared 26 735488 1677313 1675776 30720 shared 27 766208 1709569 1708032 30720 shared 28 796928 1741825 1740288 30720 shared 29 827648 1774081 1772544 30720 shared 30 858368 1806337 1804800 30720 shared 31 889088 1838593 1837056 30720 shared 32 919808 1870849 1869312 30720 shared 33 950528 1903105 1901568 30720 shared 34 981248 1935361 1933824 30720 shared 35 1011968 1967617 1966080 30720 shared 36 1042688 1999873 1998336 30720 shared 37 1073408 2032129 2030592 30720 shared 38 1104128 2064385 2062848 30720 shared 39 1134848 2096641 2095104 30720 shared 40 1165568 2128897 2127360 30720 shared 41 1196288 2161153 2159616 30720 shared 42 1227008 2193409 2191872 30720 shared 43 1257728 2225665 2224128 22272 shared,eof myfile: 44 extents found