天天看點

Linux不需要磁盤碎片整理

Linux不需要磁盤碎片整理。

以下引自linux官方網站對碎片的解說:來源于

<a href="http://www.linux.org/docs/ldp/howto/Partition/appendix.html#fragmentation" target="_blank">http://www.linux.org/docs/ldp/howto/Partition/appendix.html#fragmentation</a>

引用:

10.4. Some facts about file systems and fragmentation

Disk space is administered by the operating system in units of blocks and fragments of blocks. In ext2, fragments and blocks have to be of the same size, so we can limit our discussion to blocks.

Files come in any size. They don't end on block boundaries. So with every file a part of the last block of every file is wasted. Assuming that file sizes are random, there is approximately a half block of waste for each file on your disk. Tanenbaum calls this "internal fragmentation" in his book "Operating Systems".

You can guess the number of files on your disk by the number of allocated inodes on a disk. On my disk

# df -i

Filesystem Inodes IUsed IFree %IUsed Mounted on

/dev/hda3 64256 12234 52022 19% /

/dev/hda5 96000 43058 52942 45% /var

there are about 12000 files on / and about 44000 files on /var. At a block size of 1 KB, about 6+22 = 28 MB of disk space are lost in the tail blocks of files. Had I chosen a block size of 4 KB, I had lost 4 times this space.

Data transfer is faster for large contiguous chunks of data, though. That's why ext2 tries to preallocate space in units of 8 contigous blocks for growing files. Unused preallocation is released when the file is closed, so no space is wasted.

Noncontiguous placement of blocks in a file is bad for performance, since files are often accessed in a sequential manner. It forces the operating system to split a disk access and the disk to move the head. This is called "external fragmentation" or simply "fragmentation" and is a common problem with MS-DOS file systems. In conjunction with the abysmal buffer cache used by MS-DOS, the effects of file fragmentation on performance are very noticeable. DOS users are accustomed to defragging their disks every few weeks and some have even developed some ritualistic beliefs regarding defragmentation.

None of these habits should be carried over to Linux and ext2. Linux native file systems do not need defragmentation under normal use and this includes any condition with at least 5% of free space on a disk. There is a defragmentation tool for ext2 called defrag, but users are cautioned against casual use. A power outage during such an operation can trash your file system. Since you need to back up your data anyway, simply writing back from your copy will do the job.

The MS-DOS file system is also known to lose large amounts of disk space due to internal fragmentation. For partitions larger than 256 MB, DOS block sizes grow so large that they are no longer useful (This has been corrected to some extent with FAT32). Ext2 does not force you to choose large blocks for large file systems, except for very large file systems in the 0.5 TB range (that's terabytes with 1 TB equaling 1024 GB) and above, where small block sizes become inefficient. So unlike DOS there is no need to split up large disks into multiple partitions to keep block size down.

Use a 1Kb block size if you have many small files. For large partitions, 4Kb blocks are fine.

  希望有能力、有閑暇地朋友能對上面的官方材料進行翻譯,我的能力有所不及,這裡僅僅做一些闡述。

  這段linux官方資料主要介紹了外部碎片(external fragmentation)、内部碎片(internal fragmentation)的概念及相關情況,說明了linux檔案系統在磁盤還有5%空閑空間的情況下是不需要碎片整理的。(Linux native file systems do not need defragmentation under normal use and this includes any condition with at least 5% of free space on a disk.)。而在實際使用中,磁盤在還有8%左右未使用時就會有警告産生,是以碎片整理是不用考慮的。

  産生碎片整理想法的主要在兩類朋友中,一類是受windows思想影響的朋友,還有一類是對作業系統原理有一定程度了解的朋友。

  我在這裡先簡單地說明一些問題。

  所有地作業系統都會産生磁盤碎片,這正是某些朋友産生疑慮的原因。這個碎片在上面地官方資料中稱為内部碎片。它是這樣産生的,假設一個磁盤的空間有20k,它的基本存儲機關為簇,設有兩個檔案,一個7k,一個1k。當簇的大小為4k時,磁盤分為了5個簇,兩個檔案共占用3個簇,即使用了12k,其中浪費地空間就是4k,也就是産生了内部碎片4k。是以我們就了解了:内部碎片主要是造成磁盤空間的浪費。請注意:windows的磁盤碎片整理功能所整理的碎片不是這個碎片,也無法對這個碎片進行操作,它所對應的碎片概念是外部碎片。

  那麼,可以對内部碎片進行優化處理嗎?答案是肯定的。以上面的例子來說,如果把每一簇分成2k,那麼20k的磁盤就分為了10個簇,7k和1k兩個檔案共占用了5個簇,10k的空間,浪費的空間,即内部碎片為2k。

  由此可見,簇分的越小,所浪費的空間越少。這也是NTFS比FAT32優秀的一個地方。在Win 2000的FAT32檔案系統的情況下,分區大小在2GB~8GB時簇的大小為4KB;分區大小在8GB~16GB時簇的大小為8KB;分區大小在 16GB~32GB時,簇的大小則達到了16KB。而Win 2000的NTFS檔案系統,當分區的大小在2GB以下時,簇的大小都比相應的FAT32簇小;當分區的大小在2GB以上時(2GB~2TB),簇的大小 都為4KB。相比之下,NTFS可以比FAT32更有效地管理磁盤空間,最大限度地避免了磁盤空間的浪費。

  有的朋友會進一步的思考,那麼為什麼檔案系統不是把簇分的非常的小呢?這裡就引出了另一個問題,檔案通路查找的問題。還是以上面的例子說明,當我們要查找使用一個檔案時,就需要通過頁表來進行通路。打個比方,你住的地方就好比是檔案所占用的簇,但是要找到你,就得通過你的住址來進行通路,而通路檔案則是通過檔案配置設定表。如果住的人多,位址也就很多,那麼要查到你住的位址所花的時間也就很多。同樣的道理,當簇分的越小,記錄簇的位址也就越大,查找檔案所在的簇所花的時間也就越多。當簇為4k時,簇的位址是5個,而簇為2k時,簇的位址是10個。因而簇的大小是在空間和時間上取得平衡的一個結果。

  這裡也對另一個問題作一些提示,有些第三方分區軟體可以自定義簇的大小,建議采用預設值,否則會在某些情況下産生一些問題。

  有的朋友會進一步提問:那麼為什麼在普通情況下NTFS分的簇會比FAT32的要小,而通路速度會差不多呢?這又牽涉到檔案通路機制等等問題。這裡我就不再介紹了,其實這個問題我也不能完全說清,有興趣的朋友可以找一些作業系統方面的資料進行閱讀,可以在一定程度上解決這個問題。

  好,下面開始我們的重點:linux不需要碎片整理!

  windows概念下的碎片,在上面linux官方資料中稱為外部碎片,它就是影響性能的那個碎片概念。(This is called "external fragmentation" or simply "fragmentation" and is a common problem with MS-DOS file systems. )而linux一般不會産生這種碎片。外部磁盤碎片應該稱為檔案碎片,是因為檔案被分散儲存到整個磁盤的不同地方,而不是連續地儲存在磁盤連續的簇中形成的。

  當應用程式所需的實體記憶體不足時,一般作業系統會在硬碟中産生臨時交換檔案,用該檔案所占用的硬碟空間虛拟成記憶體。虛拟記憶體管理程式會對硬碟頻繁讀寫,産生大量的碎片,這是産生硬碟碎片的主要原因。

  其他如IE浏覽器浏覽資訊時生成的臨時檔案或臨時檔案目錄的設定也會造成系統中形成大量的碎片。檔案碎片一般不會在系統中引起問題,但檔案碎片 過多會使系統在讀檔案的時候來回尋找,引起系統性能下降,嚴重的還要縮短硬碟壽命。另外,過多的磁盤碎片還有可能導緻存儲檔案的丢失。

  上面所說的就是windows如何産生外部碎片的,其實這與檔案系統所使用的資料結構有關。對于FAT來說,使用的是chain式的結構來記錄一個檔案所使用的簇。這種方式的好處就是有助于檔案的動态增長的需要。但是卻帶了碎片的問題,使得讀寫檔案的時候,磁頭頻繁移動。對于CD-ROM,由于是 read-only的,是以不存在資料增長的問題,是以,采用了連續的方法來記錄資料,也不會産生碎片,而linux的ext等檔案格式與CD-ROM的存儲有相似之處。

  下面這篇文章通俗易懂地解說了為什麼linux不需要碎片整理以及windows為什麼需要碎片整理:

  請注意,官方資料所說的是linux檔案系統在磁盤還有5%空閑空間的情況下是不需要碎片整理的。(Linux native file systems do not need defragmentation under normal use and this includes any condition with at least 5% of free space on a disk.)。而在實際使用中,磁盤在還有8%左右未使用時就會有警告産生,是以碎片整理是不用考慮的。

  而下文中說的是20%。

為什麼Linux不需要磁盤碎片整理

作者:OneAndOneIs2

翻譯:rainking

有一個關于Linux的問題經常被問及:為什麼Linux不需要磁盤碎片整理呢?在這裡,我試圖就“為什麼有的檔案系統比另一些檔案系統更加需要磁盤碎片整理”給出一個簡單的,非技術性的答案。

我将試圖用一個ASCII矩陣來解釋所有的原理,而不是用那些枯燥而晦澀的術語來打擊大家的積極性。下面就是我将用來解釋原理的矩陣:

a b c d e f g h i j k l m n o p q r s t u v w x y z

a 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

b 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

c 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

d 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

e 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

f 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

g 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

h 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

i 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

j 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

k 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

l 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

m 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

n 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

o 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

p 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

q 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

r 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

s 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

t 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

u 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

v 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

w 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

x 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

y 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

z 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

以上這個矩陣就可以簡單的用來表示一個很小的硬碟,初始狀态是空的,全部都被0填充。在矩陣頂部和左側的a-z都是用來定位每一個資料的。最左上角的那個0就是aa,最右上角的那個0就是za,最左下角的就是az。

我将以一個大家都非常非常熟悉的檔案系統開始,一個經常需要磁盤碎片整理的系統—FAT。其實無論Windows使用者還是Linux使用者都會用到FAT檔案系統。因為USB閃盤一般都使用這個檔案系統。FAT是一個非常非常重要的檔案系統,雖然它經常需要磁盤碎片整理。

我現在在磁盤上加入一個檔案,于是磁盤看起來會變成這個樣子:

a T O C h e l l o . t x t a e l e 0 0 0 0 0 0 0 0 0 0

d 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 T O C

e H e l l o , _ w o r l d 0 0 0 0 0 0 0 0 0 0 0 0 0 0

(為了看起來更加清楚,g-z的空行被省略了)

正如你所看到的,前4行是TOC(Table Of Contents),即所謂的内容表。TOC會存儲磁盤上所有檔案的位置。在我上面的例子中,TOC包含了一個名字叫做“hello.txt”的檔案,并且這個檔案的内容是從ae到le的。往下看ae到le之間的内容,我們能看到這個檔案的内容是“Hello,_world”

到目前為止,一切都正常對嗎?好,那我們再來添加一個檔案:

a T O C h e l l o . t x t a e l e b y e . t x t m e z

b e 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

e H e l l o , _ w o r l d G o o d b y e , _ w o r l d

正如你所見,第二個檔案被緊接着放置在第一個檔案之後。這樣的好處是你所有的檔案都會緊密地放置在一起,這樣讀取它們将會非常的迅速和友善。要知道磁盤上最慢的就是讀寫頭的移動了,它移動的越少,則讀取的速度越快。

但是,當我們需要修改第一個檔案的時候,問題就出來了。現在假設我們需要在“hello.txt”檔案的尾部加入兩個感歎号,我們就會遇到問題:沒有空間!檔案“bye.txt”擋住了“hello.txt”的去路。這時候我們有兩個解決方法,但是沒有一個是完美的。

1 我們把檔案“hello.txt”删掉,然後再“bye.txt”後面加入修改過後的“hello.txt”。

2 我們把檔案“hello.txt”拆成兩部分存儲,這樣在“bye.txt”之前就不會有空的磁盤空間了。

第一種種方式表現出來就是這樣:

a T O C h e l l o . t x t a f n f b y e . t x t m e z

e 0 0 0 0 0 0 0 0 0 0 0 0 G o o d b y e , _ w o r l d

f H e l l o , _ w o r l d ! ! 0 0 0 0 0 0 0 0 0 0 0 0

第二種種方式表現出來就是這樣:

a T O C h e l l o . t x t a e l e a f b f b y e . t x

b t m e z e 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

f ! ! 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

這就是為什麼FAT格式的檔案系統經常需要磁盤碎片整理的原因。所有的檔案都緊挨着存放,是以任何時候,隻要一個檔案需要增大,就會産生碎片。而任何檔案被删除了,就會留下一個空白區域。于是很快磁盤就會變成一堆亂糟糟的随便和空白,效率就會變低了。

而Linux 卻用一種不同的方式來處理這種問題。對于單使用者來說Windows的檔案系統已經夠好的了,但是Linux生來就是為多使用者設計的系統,它總是假設在同一時間有多個使用者試圖去操作不同的檔案。是以Linux相對FAT檔案系統,使用了另一種方法來設計自己的檔案系統。Linux檔案系統看起來是這樣的:

a T O C h e l l o . t x t h n s n 0 0 0 0 0 0 0 0 0 0

n 0 0 0 0 0 0 0 H e l l o , _ w o r l d 0 0 0 0 0 0 0

當我們添加了檔案以後就變成這樣了:

a T O C h e l l o . t x t h n s n b y e . t x t d u q

b u 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

u 0 0 0 G o o d b y e , _ w o r l d 0 0 0 0 0 0 0 0 0

這種檔案系統的好處是磁盤的磁頭可以一直位于中間位置,而所有的檔案平均下來都會非常近。

當我們仍然給“hello.txt”加入兩個感歎号時,我們來看看這會引起多大的麻煩:

a T O C h e l l o . t x t h n u n b y e . t x t d u q

n 0 0 0 0 0 0 0 H e l l o , _ w o r l d ! ! 0 0 0 0 0

對了!一點麻煩都沒有!

Windows總是試圖把檔案存儲在盡量靠近磁盤開始位置的地方,這導緻當磁盤使用率變高的時候它經常會産生磁盤碎片。

Linux卻在整個磁盤上存儲檔案,是以當檔案的大小需要改變的時候,總是有足夠的空間。

當然當磁盤使用率接近飽和的時候Linux也會需要檔案整理。但是隻要磁盤還有20%以上的可用空間,那麼這種整理是基本不會發生的。

還有一點必須了解的是,即使當一個作業系統說某個磁盤已經完全碎片整理完畢了,但是根據一個磁盤的實體結構,碎片仍然會存在。因為磁盤總是由很多盤片和磁道組成的。

讓我們來看看一個磁盤有兩個盤片,aa到zm是第一個,an到zz是第二個。

一下的檔案系統是有碎片的,因為檔案橫跨了行m和n。而這兩行不是在一個盤片上的。要讀取這個檔案,磁盤的磁頭必須從盤片1的最末尾跨越到盤片2的最開始。

a T O C h e l l o . t x t r m e n 0 0 0 0 0 0 0 0 0 0

m 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 H e l l o , _ w o

n r l d ! ! 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

最後,希望我以上的解釋能讓你明白為什麼Linux不需要磁盤碎片整理,如果你還是沒有明白,請盡管提出讓你疑惑的地方。

  對windows進行磁盤碎片整理的朋友,這裡也做一點小小的友情提示。

  1、整理磁盤碎片的時候,要關閉其他所有的應用程式,包括螢幕保護程式,最好将虛拟記憶體的大小設定為固定值。不要對磁盤進行讀寫操作。

  2、整理磁盤碎片的頻率要控制合适,過于頻繁的整理也會縮短磁盤的壽命。一般經常讀寫的磁盤分區一周整理一次。

  最後想說說思考的話題。

  那些想在linux下進行磁盤碎片整理的朋友,你們考慮過兩個事實嗎?

  第一,為什麼類unix系統産生幾十年了,沒有人做一個磁盤碎片整理軟體?而即使是到現在,在這個論壇上也沒有朋友提到過遇到linux病毒,我們仍然能找到許多類unix防毒軟體?我就至少能列出3種免費防毒軟體。

  第二,很多類unix作業系統都是長年累月不關機的,諸如銀行、電信、軍工等系統,你能想象它們停止磁盤讀寫,在長達幾小時内進行磁盤碎片整理所帶來的後果嗎?這些機器的磁盤讀寫量可是比家用機大多了。

#由于我水準有限,錯誤疏漏之處難免,歡迎各位批評指證。

#26樓的朋友提出 davix 寫道:

linux沒有官方網站

  我再次查證後,還是認為引用材料是權威性的。理由如下:

  第二,org頂級域名是orgonization的縮寫,也就是說非營利性組織會使用這種域名。例如:

  而域名申請有如下規定:不得使用公衆知曉的其他國家或者地區名稱、外國地名、國際組織名稱。

   引用:

Linux information and technical support is available from a wide variety of locations. There are the "official" routes such as the Linux Software Map, Linux Documentation Project, HOWTOs, and FAQs (Frequently Asked Questions). 

繼續閱讀