我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Linux中sparse文件处理与传输的方法是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Linux中sparse文件处理与传输的方法是什么

本篇内容主要讲解“Linux中sparse文件处理与传输的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux中sparse文件处理与传输的方法是什么”吧!

0.  什么是sparse文件

当用户申请一块很大的存储空间时,由于最开始并没有写入数据(全是空),此时文件系统为了节省存储资源,提高资源利用率,不会分配实际存储空间,只有当真正写入数据时,操作系统才真正一点一点地分配空间,比如一次64KB。于是这个文件看起来很大,而占用空间很小,实际占用空间只与用户填的数据量有关。该文件看起来像一个大盒子,但可能装的东西不多,空洞很大,因此称为稀疏文件(Sparse  file)。Sparse文件是Linux文件系统的一个高级特性,能够实现磁盘的超负载使用(overload)。它最经典的应用就是为虚拟机创建虚拟硬盘以及数据库快照,比如我们使用qemu-img创建一个大小为20GB的raw文件(注意qcow2格式不是sparse文件):

fgp@node1:~$ qemu-img create -f raw test.raw 20G Formatting 'test.raw', fmt=raw size=21474836480 fgp@node1:~$ qemu-img info test.raw image: test.raw file format: raw virtual size: 20G (21474836480 bytes) disk size: 0

以上我们使用qemu-img创建了一个20G的镜像文件,由qemu-img info显示,virtual size为我们分配的空间大小,而disk  size为实际占用的空间,最开始并不占任何磁盘空间。

注:qemu-img create -f raw相当于`truncate -s 20G test.raw’。

当然也会有问题,比如系统生成了一堆sparse文件,如果文件系统满了,则这些文件都会写入失败,为了避免这种情况,需要控制sparse文件的数量。

1.如何判断是否sparse文件

除了以上的镜像文件可能是sparse文件,其他文件类型也有可能是sparse文件,如何判断是否sparse文件呢?最简单的办法是使用ls命令和du命令分别查看大小,如果二者大小不一致,则说明是sparse文件。我们可以使用dd命令快速生成一个sparse文件:

dd if=/dev/zero of=sparse_file bs=1M seek=1024 count=0

以上命令从第1024 *  1M处开始写文件(相当于中间空了1GB空间),写入/dev/zero,实际写入了0个块(count=0),因此实际上并没有写入任何数据。我们使用ls  -lh查看其大小:

~$ ls -lh sparse_file -rw-rw-r-- 1 fgp fgp 1.0G May 26 15:47 sparse_file

可见该文件显示为1G。

我们再使用du -h命令查看其占用磁盘空间大小:

~$ du -h sparse_file 0   sparse_file

我们发现实际占用磁盘空间为0。

我们也可以直接使用ls的-s参数查看文件实际占用空间大小:

~$ ls -slh sparse_file 0 -rw-rw-r-- 1 fgp fgp 1.0G May 26 15:47 sparse_file

其中***列为实际占用磁盘空间大小,第6列为文件大小(虚拟大小)。

另外使用truncate命令可以随意调节文件大小(如果该文件不存在则会自动创建),比如:

~$ truncate --size 1T sparse_file ~$ du -h sparse_file 0   sparse_file ~$ ls -lh sparse_file -rw-rw-r-- 1 fgp fgp 1.0T May 26 16:09 sparse_file

以上我们把sparse_file文件大小调为1TB,实际上就是往后面追加空洞(extended part (hole) reads as zero  bytes),因此不会占用实际磁盘空间。当然也可以缩小文件大小,但是如果比文件数据占用空间还小的话,就会截取数据,因此部分数据会丢失。

truncate -s 500M sparse_file ~$ ls -lh sparse_file -rw-rw-r-- 1 fgp fgp 500M May 26 16:12 sparse_file

以上我们把该文件缩减为500MB。

2. sparse文件处理

sparse文件在处理时也存在一些问题,比如我们使用sed对一个sparse文件进行处理。

fgp@node1:~/tmp$ echo "Hello World" >test.raw fgp@node1:~/tmp$ truncate -s 1G test.raw fgp@node1:~/tmp$ ls -slh total 68K 4.0K -rw-rw-r-- 1 fgp fgp 1.0G May 28 14:52 test.raw fgp@node1:~/tmp$ sed -i 's/Hello/HELLO/g' test.raw fgp@node1:~/tmp$ ls -slh total 1.1G 1.1G -rw-rw-r-- 1 fgp fgp 1.0G May 28 14:53 test.raw

以上我们使用truncate创建了一个sparse文件,然后通过sed命令把Hello改为HELLO,我们期望能够保留该文件的sparse特性,但实际上我们发现仅仅修改了该文件的一行数据,该文件的空洞被填满,瞬间占用磁盘空间为1G。一个只有4K大小的文件使用sed命令后变成了1G,这让人感到莫名其妙不是吗?

再比如我们我们使用tar命令对文件进行归档:

fgp@node1:~/tmp$ qemu-img create -f raw test.raw 1G Formatting 'test.raw', fmt=raw size=1073741824 fgp@node1:~/tmp$ time tar -cf test.tar test.raw  real    0m2.145s user    0m0.012s sys 0m1.640s fgp@node1:~/tmp$ time tar -cJf test.tar.xz test.raw  real    1m0.692s user    0m59.060s sys 0m1.048s fgp@node1:~/tmp$ ls -lsh total 1.1G    0 -rw-r--r-- 1 fgp fgp 1.0G May 28 15:37 test.raw 1.1G -rw-rw-r-- 1 fgp fgp 1.1G May 28 15:37 test.tar 156K -rw-rw-r-- 1 fgp fgp 153K May 28 15:39 test.tar.xz

以上我们创建了一个1G的sparse文件,当使用tar直接归档时发现该文件变成了非sparse文件,占用了1G的磁盘空间。而使用xz压缩时,虽然解决了存储空间的问题,同时也带来压缩时间开销问题(耗费了1分钟的时间进行压缩)。

接下来介绍下熟悉的经典命令cp,cp命令可谓无人不知。众所周知,它用于在本地拷贝文件。值得庆幸(为什么庆幸,因为并不是所有的命令都支持该特性)的是cp命令能够自动探测文件是否sparse文件,空洞数据不会拷贝,并且能够保留sparce文件副本的稀疏性质:

fgp@node1:~$ cp sparse_file sparse_file.copy fgp@node1:~$ ls -slh sparse_file* 0 -rw-rw-r-- 1 fgp fgp 2.0G May 26 16:39 sparse_file 0 -rw-rw-r-- 1 fgp fgp 2.0G May 26 16:39 sparse_file.copy

我们看看和cp命令类似的命令scp,scp用于远程拷贝文件(远程传输文件):

fgp@node1:~$ scp sparse_file localhost:~/sparse_file.copy sparse_file                                            100% 2048MB  97.5MB/s   00:21 fgp@node1:~$ ls -slh sparse_file*    0 -rw-rw-r-- 1 fgp fgp 2.0G May 26 16:39 sparse_file 2.1G -rw-rw-r-- 1 fgp fgp 2.0G May 26 16:42 sparse_file.copy

我们发现scp不能识别sparse文件,传输一个sparse文件时会自动填满空洞,发送整个文件内容。

其实cp命令有一个针对sparse文件拷贝优化的参数--sparse=WHEN,其中WHEN的合法值为auto、always、never,默认为auto,能自动识别是否sparse文件。如果设置为never则会自动填满数据,拷贝整个文件:

fgp@node1:~$ cp --sparse=never sparse_file sparse_file.copy.2 fgp@node1:~$ ls -lhs sparse_file*    0 -rw-rw-r-- 1 fgp fgp 2.0G May 26 16:39 sparse_file 2.1G -rw-rw-r-- 1 fgp fgp 2.0G May 26 16:42 sparse_file.copy 2.1G -rw-rw-r-- 1 fgp fgp 2.0G May 26 16:50 sparse_file.copy.2

可见sparse_file.copy.2填满了空洞,相当于把sparse文件转化成了非sparse文件。

如果指定为always,则cp会尝试把文件转换为sparse文件,减少磁盘占用空间:

fgp@node1:~$ cp --sparse=always sparse_file.copy sparse_file.copy.3 fgp@node1:~$ ls -lsh sparse_file*    0 -rw-rw-r-- 1 fgp fgp 2.0G May 26 16:39 sparse_file 2.1G -rw-rw-r-- 1 fgp fgp 2.0G May 26 16:42 sparse_file.copy 2.1G -rw-rw-r-- 1 fgp fgp 2.0G May 26 16:50 sparse_file.copy.2    0 -rw-rw-r-- 1 fgp fgp 2.0G May 26 16:52 sparse_file.copy.3

由结果发现,我们把非sparse文件sparse_file.copy转成了sparse文件sparse_file.copy.3。

注:cp命令黑科技,cp实现sparse文件的相互转换!

其实除了cp命令,我们上面的tar命令也支持–sparse参数:

fgp@node1:~/tmp$ time tar -cSf test.tar test.raw  real    0m0.002s user    0m0.000s sys 0m0.000s fgp@node1:~/tmp$ time tar -cSJf test.tar.xz test.raw  real    0m0.011s user    0m0.000s sys 0m0.008s fgp@node1:~/tmp$ ls -slh total 16K    0 -rw-r--r-- 1 fgp fgp 1.0G May 28 15:37 test.raw  12K -rw-rw-r-- 1 fgp fgp  10K May 28 15:42 test.tar 4.0K -rw-rw-r-- 1 fgp fgp  184 May 28 15:43 test.tar.xz

对比前面的结果,我们发现使用tar的-S(–sparse)参数很好的处理sparse文件。

另外cpio也支持同样的参数,但可惜的是scp命令不支持,因此我们使用scp远程传输大量的sparse文件时效率极低,并且浪费大量网络空间。比如我们经常使用qemu-img创建了一个40GB的raw文件,然后需要拷贝镜像到其他机器上,虽然该文件可能只占了1GB左右的磁盘空间,可使用scp需要传输40GB的空间,并且远程需要预留40GB的磁盘空间。那有没有高效传输sparse文件的方法呢?实际上,很可惜,好像并没有,不过有比较好的方法,请看下一节内容。

3.相对高效传输sparse文件的方法

我们前面说了scp不支持sparse文件的处理,好在rsync命令支持sparse文件处理:

fgp@node1:~$ rsync  -av --sparse --progress sparse_file localhost:~/sparse_file.copy fgp@localhost's password: sending incremental file list sparse_file   2,147,483,648 100%   74.67MB/s    0:00:27 (xfr#1, to-chk=0/1)  sent 2,148,008,037 bytes  received 35 bytes  66,092,556.06 bytes/sec total size is 2,147,483,648  speedup is 1.00 fgp@node1:~$ ls -lhs sparse_file* 0 -rw-rw-r-- 1 fgp fgp 2.0G May 26 16:39 sparse_file 0 -rw-rw-r-- 1 fgp fgp 2.0G May 26 16:39 sparse_file.copy

遗憾的是,虽然目标文件保留了其sparse特性,节省了目标主机的存储空间,但并没有节省网络传输带宽,依然传输了2GB的数据,rsync不能过滤掉空洞数据的传输。

值得一提的是rsync有一个参数--inplace,这个参数能够探测源文件和目标文件是否修改的块,传输时只传递修改的块,当然***次传输文件时,这个参数并没有什么用。但可惜的是–sparse参数和–inplace参数不能同时使用。通常做法是***次传输文件时,使用–sparse参数,之后如果对文件进行了修改,需要同步远程时,使用–inplace参数,它只会在原文件的基础上传输更新的块。(可以先在远程目标机器上先使用truncate命令创建一个同名的sparse文件,再使用–inplace参数传递)。

当然如果我们传输的是镜像文件,可以通过qemu-img把raw格式在本地转化为qcow2格式后再传输:

fgp@node1:~/tmp$ ls -lsh total 0 0 -rw-rw-r-- 1 fgp fgp 10G May 28 15:00 test.raw fgp@node1:~/tmp$ qemu-img convert -f raw -O qcow2 test.raw test.qcow2 fgp@node1:~/tmp$ ls -lsh total 196K 196K -rw-r--r-- 1 fgp fgp 193K May 28 15:12 test.qcow2    0 -rw-rw-r-- 1 fgp fgp  10G May 28 15:00 test.raw

转化成qcow2格式后,不再是sparse文件,因此不会存在以上问题。由以上输出我们发现,该文件只有196K,因此传输量大幅度减少。

到此,相信大家对“Linux中sparse文件处理与传输的方法是什么”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Linux中sparse文件处理与传输的方法是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Linux中sparse文件处理与传输的方法是什么

本篇内容主要讲解“Linux中sparse文件处理与传输的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux中sparse文件处理与传输的方法是什么”吧!0. 什么是spars
2023-06-16

linux ssh传输文件的方法是什么

在Linux系统中,可以使用scp命令通过SSH传输文件。scp命令的语法如下:```scp [可选参数] [源文件路径] [目标服务器用户名@目标服务器IP地址或主机名:目标文件路径]```其中,可选参数如下:- -r:递归复制整个目录。
2023-09-17

linux服务器传输文件的方法是什么

在Linux服务器上,可以使用多种方法来传输文件,以下是一些常用的方法:SCP(Secure Copy):SCP是基于SSH协议的文件传输工具,可以通过命令行将文件从本地计算机传输到远程服务器,或者从远程服务器传输到本地计算机。示例命令:s
linux服务器传输文件的方法是什么
2024-04-26

两台Linux间传输文件的方法是什么

本篇内容主要讲解“两台Linux间传输文件的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“两台Linux间传输文件的方法是什么”吧!两台Linux系统之间要想传输文件可以采用的方式有很
2023-06-28

云服务器linux传输文件的方法是什么

云服务器Linux文件传输方法本指南介绍了在Linux系统之间安全传输文件的多种方法:SCP(安全复制):加密且安全的远程文件传输,使用SSH协议。SFTP(SSH文件传输协议):通过SSH提供命令行文件传输界面。Rsync(远程同步):用于增量同步本地和远程文件系统。FTP(文件传输协议):广泛使用的文件传输协议,通过TCP连接传输文件。WebDAV(基于Web的分布式创作和版本控制):允许通过HTTP接口访问远程文件系统。选择最佳方法取决于安全需求、传输效率、易用性和可访问性。
云服务器linux传输文件的方法是什么
2024-04-09

云服务器linux传输文件的方法是什么

云服务器Linux传输文件的方法有多种,以下是几种常用的方法:1. SCP(Secure Copy):SCP是一个安全的文件传输工具,可以通过SSH协议在本地和远程服务器之间复制文件。使用命令`scp`可以将文件从本地复制到云服务器,或从云
2023-09-23

本地文件传输到vps的方法是什么

将本地文件传输到VPS有多种方法,以下是常见的几种方法:1. 使用SCP命令:SCP是Secure Copy的缩写,它是基于SSH协议的文件传输工具。你可以使用以下命令将本地文件传输到VPS:```scp /path/to/local/fi
2023-08-16

golang实现大文件传输的方法是什么

在Golang中实现大文件传输可以使用以下方法之一:1. 使用基于TCP的传输:可以使用net或net/http包来实现基于TCP的文件传输。发送方将文件分成较小的块,并将每个块作为TCP数据包发送给接收方,接收方接收并重组这些块以还原原始
2023-10-20

Windows与Linux之间文件传输的方法图解

Windows与linux之间文件传输 (1)、使用WinSCP工具,实现将Windows的文件上传到Linux指定目录下(1)、输入主机名、用户名、密码,选择登录,成功连接至Linux系统(2)、在左侧列表,选择要上YDbtzqqUG传文
2022-06-04

云服务器传输文件的方法是什么

云服务器传输文件的方法有多种,以下是一些常用的方法:1. Secure Copy Protocol (SCP):使用SCP可以通过SSH协议安全地传输文件。可以使用SCP命令将本地文件复制到云服务器上,或将云服务器上的文件复制到本地。2.
2023-08-08

python局域网传输文件的方法是什么

Python可以使用多种方法在局域网中传输文件,以下是几种常用的方法:使用Socket编程:可以使用Python的socket模块创建一个服务器和客户端,通过网络套接字在局域网中传输文件。使用FTP协议:可以使用Python的ftplib模
2023-10-27

远程传输文件到vps最快方法是什么

远程传输文件到VPS的最快方法取决于多个因素,包括网络速度、文件大小和所用的传输协议。以下是一些常见的方法:1. SCP(Secure Copy Protocol):SCP是一种基于SSH的快速、安全的文件传输协议。它可以通过命令行使用,例
2023-09-15

vps传文件的方法是什么

VPS(Virtual Private Server)的文件传输方法有多种,以下是其中一些常用的方法:1. 使用FTP(File Transfer Protocol):通过FTP客户端软件(如FileZilla)连接到VPS,并通过FTP协
2023-09-16

Linux系统高效传输大文件的解决方案是什么

这期内容当中小编将会给大家带来有关Linux系统高效传输大文件的解决方案是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。在Linux系统中想要传输文件可以采用rsync、scp之类的工具,但是这两个工
2023-06-28

gitee中上传文件夹的方法是什么

今天小编给大家分享一下gitee中上传文件夹的方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1、创建新项目首先,在
2023-07-05

python处理csv文件的方法是什么

在Python中处理CSV(逗号分隔值)文件有多种方法,以下是其中几种常用的方法:1. 使用csv模块:Python内置的csv模块提供了处理CSV文件的方法。可以使用csv.reader对象来读取CSV文件的内容,使用csv.writer
2023-09-15

Python中优雅处理JSON文件的方法是什么

这篇文章给大家介绍Python中优雅处理JSON文件的方法是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1. 引言我们将学习如何使用Python读取、解析和编写JSON文件。我们将讨论如何最好地处理简单的JSON
2023-06-22

jquery文件上传的方法是什么

在jQuery中,文件上传可以使用ajax方法来实现。具体步骤如下:1. 创建一个form表单,里面包含一个input标签,用于选择文件。例如:```html```2. 使用jQuery的ajax方法来处理表单的提交。例如:```javas
2023-08-11

编程热搜

目录