使用“cp”命令复制稀疏文件
'cp' 支持稀疏文件并且可以很好地检测它,因此运行“cp”就足够了。
但是 cp 确实有一个 -sparse=WHEN 选项。
# cp --sparse=always sparse_file sparse_file.2
创建稀疏文件
我们可以使用 dd 命令创建稀疏文件:
# dd if=/dev/zero of=sparse_file bs=1 count=0 seek=512M 0+0 records in 0+0 records out 0 bytes (0 B) copied, 0.000381714 s, 0.0 kB/s
# ls -hl sparse_file -rw-r--r--. 1 root root 512M Sep 9 00:13 sparse_file
# du -sh sparse_file 0 sparse_file
要使用“ls”命令查看文件的磁盘使用情况,我们可以使用“-s”选项:
# ls -lhs sparse_file 0 -rw-r--r--. 1 root root 512M Sep 9 00:13 sparse_file
要使用“du”查看文件的表观大小,我们可以使用 -apparent-size 选项:
# du -h --apparent-size sparse_file 512M sparse_file
在使用 du 和 ls 命令时,我们是否曾经观察过某些文件的磁盘使用情况的差异。
例如:
$ du -sh /u02/ticoprd/redo/* 515M redo1a.rdo 524M redo3b.rdo 518M redo4a.rdo
$ ls -ltrh /u02/ticoprd/redo/* -rw-r----- 1 oticoprd dba 1.1G Aug 4 01:09 redo1a.rdo -rw-r----- 1 oticoprd dba 1.1G Aug 4 02:32 redo3b.rdo -rw-r----- 1 oticoprd dba 1.1G Aug 4 03:51 redo4a.rdo
我们可以看到“ls”命令显示的文件大小为 1.1GB,而“du”命令文件大小仅为 515MB。
这些文件是稀疏文件。
“ls”显示文件的外观大小,“du”显示驻留在磁盘上的文件的实际大小。
稀疏文件是一种计算机文件,当分配给文件的块大部分为空时,它会尝试更有效地使用文件系统空间。
这是通过将表示空块的简要信息(元数据)而不是构成块的实际“空”空间写入磁盘来实现的,使用较少的磁盘空间(即稀疏文件包含记录存在的零块,但没有磁盘上分配的空间)。
仅当块包含“真实”(非空)数据时,才会将完整块大小作为实际大小写入磁盘。
在读取稀疏文件时,文件系统在运行时透明地将表示空块的元数据转换为填充零字节的“真实”块。
应用程序不知道这种转换。
稀疏文件通常用于磁盘镜像、数据库快照、日志文件等。
稀疏文件的优点是只在实际需要时才分配存储:节省了磁盘空间,即使文件系统上的可用空间不足,也可以创建大文件。
缺点是稀疏文件可能会变得碎片化。
文件系统可用空间报告可能具有误导性,使用不明确支持它们的程序复制稀疏文件可能会复制文件的整个未压缩大小,包括不在磁盘上的稀疏的、大部分为零的部分 - 失去好处文件中的稀疏属性。
我们可以通过 /var/log/lastlog 文件看到这种行为。
# ls -lh /var/log/lastlog -rw-r--r--. 1 root root 144K Sep 8 22:45 /var/log/lastlog
# du -sh /var/log/lastlog 40K /var/log/lastlog