成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Linux文件系統之sparse文件處理與傳輸

系統 Linux
Sparse文件是Linux文件系統的一個高級特性,能夠實現磁盤的超負載使用(overload)。它最經典的應用就是為虛擬機創建虛擬硬盤以及數據庫快照。

[[189529]]

0. 什么是sparse文件

當用戶申請一塊很大的存儲空間時,由于最開始并沒有寫入數據(全是空),此時文件系統為了節省存儲資源,提高資源利用率,不會分配實際存儲空間,只有當真正寫入數據時,操作系統才真正一點一點地分配空間,比如一次64KB。于是這個文件看起來很大,而占用空間很小,實際占用空間只與用戶填的數據量有關。該文件看起來像一個大盒子,但可能裝的東西不多,空洞很大,因此稱為稀疏文件(Sparse file)。Sparse文件是Linux文件系統的一個高級特性,能夠實現磁盤的超負載使用(overload)。它最經典的應用就是為虛擬機創建虛擬硬盤以及數據庫快照,比如我們使用qemu-img創建一個大小為20GB的raw文件(注意qcow2格式不是sparse文件):

  1. fgp@node1:~$ qemu-img create -f raw test.raw 20G 
  2. Formatting 'test.raw', fmt=raw size=21474836480 
  3. fgp@node1:~$ qemu-img info test.raw 
  4. image: test.raw 
  5. file format: raw 
  6. virtual size: 20G (21474836480 bytes) 
  7. 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文件:

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

以上命令從第1024 * 1M處開始寫文件(相當于中間空了1GB空間),寫入/dev/zero,實際寫入了0個塊(count=0),因此實際上并沒有寫入任何數據。我們使用ls -lh查看其大小:

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

可見該文件顯示為1G。

我們再使用du -h命令查看其占用磁盤空間大小:

  1. ~$ du -h sparse_file 
  2. 0   sparse_file 

我們發現實際占用磁盤空間為0。

我們也可以直接使用ls的-s參數查看文件實際占用空間大小:

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

其中***列為實際占用磁盤空間大小,第6列為文件大小(虛擬大小)。

另外使用truncate命令可以隨意調節文件大小(如果該文件不存在則會自動創建),比如:

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

以上我們把sparse_file文件大小調為1TB,實際上就是往后面追加空洞(extended part (hole) reads as zero bytes),因此不會占用實際磁盤空間。當然也可以縮小文件大小,但是如果比文件數據占用空間還小的話,就會截取數據,因此部分數據會丟失。

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

以上我們把該文件縮減為500MB。

2. sparse文件處理

sparse文件在處理時也存在一些問題,比如我們使用sed對一個sparse文件進行處理。

  1. fgp@node1:~/tmp$ echo "Hello World" >test.raw 
  2. fgp@node1:~/tmp$ truncate -s 1G test.raw 
  3. fgp@node1:~/tmp$ ls -slh 
  4. total 68K 
  5. 4.0K -rw-rw-r-- 1 fgp fgp 1.0G May 28 14:52 test.raw 
  6. fgp@node1:~/tmp$ sed -i 's/Hello/HELLO/g' test.raw 
  7. fgp@node1:~/tmp$ ls -slh 
  8. total 1.1G 
  9. 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命令對文件進行歸檔:

  1. fgp@node1:~/tmp$ qemu-img create -f raw test.raw 1G 
  2. Formatting 'test.raw', fmt=raw size=1073741824 
  3. fgp@node1:~/tmp$ time tar -cf test.tar test.raw 
  4.  
  5. real    0m2.145s 
  6. user    0m0.012s 
  7. sys 0m1.640s 
  8. fgp@node1:~/tmp$ time tar -cJf test.tar.xz test.raw 
  9.  
  10. real    1m0.692s 
  11. user    0m59.060s 
  12. sys 0m1.048s 
  13. fgp@node1:~/tmp$ ls -lsh 
  14. total 1.1G 
  15.    0 -rw-r--r-- 1 fgp fgp 1.0G May 28 15:37 test.raw 
  16. 1.1G -rw-rw-r-- 1 fgp fgp 1.1G May 28 15:37 test.tar 
  17. 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文件副本的稀疏性質:

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

我們看看和cp命令類似的命令scp,scp用于遠程拷貝文件(遠程傳輸文件):

  1. fgp@node1:~$ scp sparse_file localhost:~/sparse_file.copy 
  2. sparse_file                                            100% 2048MB  97.5MB/s   00:21 
  3. fgp@node1:~$ ls -slh sparse_file* 
  4.    0 -rw-rw-r-- 1 fgp fgp 2.0G May 26 16:39 sparse_file 
  5. 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則會自動填滿數據,拷貝整個文件:

  1. fgp@node1:~$ cp --sparse=never sparse_file sparse_file.copy.2 
  2. fgp@node1:~$ ls -lhs sparse_file* 
  3.    0 -rw-rw-r-- 1 fgp fgp 2.0G May 26 16:39 sparse_file 
  4. 2.1G -rw-rw-r-- 1 fgp fgp 2.0G May 26 16:42 sparse_file.copy 
  5. 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文件,減少磁盤占用空間:

  1. fgp@node1:~$ cp --sparse=always sparse_file.copy sparse_file.copy.3 
  2. fgp@node1:~$ ls -lsh sparse_file* 
  3.    0 -rw-rw-r-- 1 fgp fgp 2.0G May 26 16:39 sparse_file 
  4. 2.1G -rw-rw-r-- 1 fgp fgp 2.0G May 26 16:42 sparse_file.copy 
  5. 2.1G -rw-rw-r-- 1 fgp fgp 2.0G May 26 16:50 sparse_file.copy.2 
  6.    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參數:

  1. fgp@node1:~/tmp$ time tar -cSf test.tar test.raw 
  2.  
  3. real    0m0.002s 
  4. user    0m0.000s 
  5. sys 0m0.000s 
  6. fgp@node1:~/tmp$ time tar -cSJf test.tar.xz test.raw 
  7.  
  8. real    0m0.011s 
  9. user    0m0.000s 
  10. sys 0m0.008s 
  11. fgp@node1:~/tmp$ ls -slh 
  12. total 16K 
  13.    0 -rw-r--r-- 1 fgp fgp 1.0G May 28 15:37 test.raw 
  14.  12K -rw-rw-r-- 1 fgp fgp  10K May 28 15:42 test.tar 
  15. 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文件處理:

  1. fgp@node1:~$ rsync  -av --sparse --progress sparse_file localhost:~/sparse_file.copy 
  2. fgp@localhost's password
  3. sending incremental file list 
  4. sparse_file 
  5.   2,147,483,648 100%   74.67MB/s    0:00:27 (xfr#1, to-chk=0/1) 
  6.  
  7. sent 2,148,008,037 bytes  received 35 bytes  66,092,556.06 bytes/sec 
  8. total size is 2,147,483,648  speedup is 1.00 
  9. fgp@node1:~$ ls -lhs sparse_file* 
  10. 0 -rw-rw-r-- 1 fgp fgp 2.0G May 26 16:39 sparse_file 
  11. 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格式后再傳輸:

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

轉化成qcow2格式后,不再是sparse文件,因此不會存在以上問題。由以上輸出我們發現,該文件只有196K,因此傳輸量大幅度減少。

【本文是51CTO專欄作者“付廣平”的原創文章,如需轉載請通過51CTO獲得聯系】

戳這里,看該作者更多好文

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2011-01-13 13:18:38

Linux網絡文件

2021-05-31 07:50:59

Linux文件系統

2011-01-13 14:10:30

Linux文件系統

2020-07-22 14:53:06

Linux系統虛擬文件

2023-09-27 23:19:04

Linuxmount

2021-06-06 16:55:22

Linux文件系統

2021-04-12 05:44:44

Linux文件系統

2009-12-22 15:12:33

Linux擴展文件系統

2009-12-25 09:58:46

linux劃分文件系統

2010-03-19 16:16:28

Java Socket

2019-09-20 10:04:45

Linux系統虛擬文件

2018-08-24 10:10:25

Linux文件系統技術

2009-12-14 13:14:57

2021-11-01 13:38:55

Linux文件系統

2018-01-10 12:42:09

Linux磁盤文件系統

2009-12-22 09:43:13

Linux文件系統組織

2021-01-22 10:40:08

Linux文件內存

2016-12-27 10:48:59

Linux命令磁盤與文件系統

2017-08-14 13:35:36

Linux共享內存tmpfs文件系統

2023-08-08 09:52:13

系統端架構NFS
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕一区二区三区四区 | 久久久激情视频 | 一区二区在线 | 91久久精品一区二区三区 | 亚洲精品在线视频 | 日韩中文字幕视频 | 亚洲一区二区在线 | 中文字幕精品一区久久久久 | 天天操天天射综合 | 欧美日韩精品在线一区 | 污片在线观看 | 国产美女在线观看 | 亚洲精品高清视频在线观看 | 中文字幕第一页在线 | 免费黄色片视频 | 日本欧美国产在线观看 | 成av在线 | 日韩一区二区三区在线 | 成人免费视频观看视频 | 在线观看国产视频 | 国产精品1区 | 91伊人网| 中文字幕一级毛片视频 | 亚洲色欲色欲www | 中文字幕 国产精品 | 成人精品一区二区三区 | 亚洲国产精品久久久久秋霞不卡 | 欧美福利一区 | 国产在线一区二区 | 日韩欧美视频 | 综合久久综合久久 | 婷婷在线视频 | 女人精96xxx免费网站p | 欧美精品一区二区三区一线天视频 | 亚洲成人播放器 | 亚洲精品成人av久久 | 国产免费一区二区 | 一a级片 | 日韩国产欧美 | 国产十日韩十欧美 | 国产91成人 |