http://blog.csdn.net/haiross/article/category/1488205/2
block size: 是文件系統最小的單位,Ext2/Ext3/Ext4 的區塊大小可以是 1024、2048 或 4096 字節。 (Compaq Alpha 可
以使用 8192 字節區塊) mke2fs 一般缺省會把小於 512 MiB 的文件系統使用 1024 字節區塊格式化,等於或大於 512 MiB
的文件系統使用 4096 字節區塊。(實際是視乎 mke2fs.conf 中文件系統類型 small 和 default 的設定 blocksize)
【即Ext2/Ext3/Ext4 的區塊大小不是等於扇區的大小】
[root@fedora-12 ~]# tune2fs -l /dev/sda1
[root@localhost ~]# tune2fs -l /dev/sda1 tune2fs 1.39 (29-May-2006) Filesystem volume name: /boot Last mounted on: <not available> Filesystem UUID: 62eed73c-4f24-4250-a69a-2643755cba8a Filesystem magic number: 0xEF53 Filesystem revision #: 1 (dynamic) Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery sparse_super Default mount options: user_xattr acl Filesystem state: clean Errors behavior: Continue Filesystem OS type: Linux Inode count: 76304 Block count: 305200 Reserved block count: 15260 Free blocks: 272556 Free inodes: 76265 First block: 1 Block size: 1024 Fragment size: 1024 Reserved GDT blocks: 256 Blocks per group: 8192 Fragments per group: 8192 Inodes per group: 2008 Inode blocks per group: 251 Filesystem created: Mon Jun 29 17:30:27 2015 Last mount time: Mon Jul 18 22:44:31 2016 Last write time: Mon Jul 18 22:44:31 2016 Mount count: 143 Maximum mount count: -1 Last checked: Mon Jun 29 17:30:27 2015 Check interval: 0 (<none>) Reserved blocks uid: 0 (user root) Reserved blocks gid: 0 (group root) First inode: 11 Inode size: 128 Journal inode: 8 Default directory hash: tea Directory Hash Seed: 885973fc-263b-466d-8498-e427b59d511a Journal backup: inode blocks
block size: 是文件系統最小的單位,Ext2/Ext3/Ext4 的區塊大小可以是 1024、2048 或 4096 字節。 (Compaq Alpha 可
以使用 8192 字節區塊) mke2fs 一般缺省會把小於 512 MiB 的文件系統使用 1024 字節區塊格式化,等於或大於 512 MiB
的文件系統使用 4096 字節區塊。(實際是視乎 mke2fs.conf 中文件系統類型 small 和 default 的設定 blocksize)
mkfs -t ext3 -b 4096 /dev/sdb5
super block:
inode: 索引節點,Ext2/Ext3 文件系統的 inode 數目限制了整個文件系統可能最多擁有的文件數目
mke2fs 缺省會根據文件系統的大小來決定 inode 的數目,小於或等於 512 MiB 的檔系統會每 4kiB 有一個 inode,512
MiB 以上的文件系統則每 8kiB 有一個 inode。[1](實際是視乎 mke2fs.conf 中文件系統類型 small 和 default 的設定
inode_ratio)
要直接設定 inode 數目可以使用 mke2fs/mkfs.ext2/mkfs.ext3/mkfs 的選項 -N no-of-node,例如:
mke2fs -N 1000000 /dev/sdb5
mke2fs/mkfs.ext2/mkfs.ext3/mkfs 的選項 -i byte-per-inode 根據文件系統的大小來決定 inode 的數目,例如要文件系
統每 512 KiB 就有一個 inode,可以使用:
mke2fs -i 524288 /dev/sdb5 (byte-per-inode:每 512 KB 就由一個 inode來管理,多大的數據分一個inode ,比
blocksize更基礎)
mkfs.ext3 -T news /dev/sdb5
Inode 大小 (inode size)
現時 inode 的大小缺省為 256 字節,早期的 inode 只有 128 字節。較大的 inode 令文件系統較易擴充支援 POSIX ACL
和擴充屬性 (Extended Attrible) 等功能。inode 大小同樣在格式化后不能改變。
您可以加上 -I inode-size 指定 inode 大小:
mkfs.ext3 -I 128 /dev/sdb5
保留空間
Ext2/Ext3 缺省保留 5% 硬盤空間供系統管理員工作之用。設定保留空間大小可以使用 mke2fs/mkfs.ext2/mkfs.ext3/mkfs
的選項 -m percentage,例如要文件系統保留 12% 的空間,可以使用:
mkfs.ext2 -m 12 /dev/sdb5
格式化后仍可以使用命令 tune2fs -m 或 tune2fs -r 改變。
偵察壞區塊 (Bad block)
格式化時加上選項 -c,mke2fs 會掃描整個儲存裝置是否有壞區塊 (bad block),例如:
mkfs -t ext3 -c /dev/sdb6
如果使用選項 -cc,mke2fs 會寫一此資料入儲存裝置每個區塊並再讀取來測式壞區塊 - 比原本只讀更准確和但更慢的方法
偵察壞區塊,例如:
mkfs.ext2 -cc /dev/sdc1
日志大小 (Journal size)
格式化 ext3 或 ext4 時,mke2fs 會自動根據文件系統的大小划分日志 (journal) 的大小[2]:
* 少於 32,768 個區塊則划分 1024 個區塊作日志
* 少於 262,144 個區塊但大於或等於 32,768 個區塊則划分 4096 個區塊作日志
* 大於或等於 262,144 個區塊則划分 8192 個區塊作日志
您可以加上 -J size=日志大小 指定建立的日志大小,單位為 MiB,例如:
[root@localhost ~]# mke2fs -J size=128 /dev/sda1
格式化了 sdb1 為 ext3 並划分 128 MiB 的日志。(使用選項 -J 已穩示啟用日志功能,所以可以略去選項 -j) 留意日志
的大小只可以為 1024 至 102,400 個區塊。
William von Hagen[2]認為 mke2fs 自動划分的日志大小一般應該很適合,而無需要自訂。日志過小會令其容易被寫滿,有
機會減低文件系統效率。較大的日志對啟用 journaling 模式可能有幫助。但如果日志大於計算機實體內存大小,開機修復
文件系統時有機會不夠內存加載整個日志紀錄,不能自動修復。
如果有多於一顆硬盤,可以考慮使用外部日志 (external journal) 把文件系統和日志儲存在不同的硬盤,可以增加效能。
文件系統類型 (fs-type)
e2fsprog 1.39 之前中的 mkfs.ext2/mkfs.ext3/mke2fs 只支援 news 、 largefile 和 largefile4 三個文件系統類型。
e2fsprog 1.39 開始, mkfs.ext2/mkfs.ext3/mke2fs 使用設定文件 mke2fs.conf 自訂文件系統類型。[3] 現時一般
GNU/Linux 缺省的文件系統類型包括:
* small - 區塊大小 1 KiB,每 4 KiB 一個 inode,inode 大小 128 字節
* floppy - 區塊大小 1 KiB,每 8 KiB 一個 inode,inode 大小 128 字節
* news - 每 4 KiB 一個 inode
* largefile - 每 1 MiB 一個 inode
e2fsprogs 缺省的 mke2fs.conf 額外定義了 [4]:
* largefile4 - 每 4 MiB 一個 inode
* hurd - 區塊大小 4 KiB,inode 大小 128 字節
* ext3 - 開啟了 has_journal 功能
* ext4 - inode 大小 256 字節,開啟了 has_journal、extents、huge_file、flex_bg、uninit_bg、dir_nlink 和
extra_isize 功能
文件系統標簽 (Filesystem label)
文件系統標簽 (Filesystem label) 在個別文件系統又叫作 Volume Name,是文件系統中一個小欄目用作簡述該文件系統的
用途或其儲存數據。現時 GNU/Linux 都會用 USB 手指/IEEE1394 硬盤等可移除儲存裝置的文件系統標簽作為其掛載目錄的
名稱,方便使用者識別。而個別 GNU/Linux distribution 如 Fedora、RHEL 和 CentOS 等亦在 /etc/fstab 取代傳統裝置
文件名稱 (即 /dev/sda1 和 /dev/hdc5 等) 的指定開機時要掛載的文件系統,避免偶然因為 BIOS 設定或插入次序的改變
而引起的混亂。您可以使用選項 -L 標簽 在格式化時設定文件系統標簽:
mkfs.ext2 -L Photos /dev/sdc1
Ext2/Ext3/Ext4 的文件系統標簽不可以超過 16 個字符。往后可以使用命令 e2label 或 tune2fs -L 隨時改變。
以下是使用命令 mke2fs/mkfs.ext2 格式化一個約 8 GiB 的分割區成為 Ext2 文件系統的畫面:
# mke2fs /dev/sdb5
mke2fs 1.41.3 (12-Oct-2008)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
524288 inodes, 2096466 blocks (此例是個8GB的磁盤分區 2096466 x 4KB)
104823 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2147483648 (最大2TB)
64 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
Writing inode tables: done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 21 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
當中包括顯示了有關新建 Ext2 文件系統的以下資訊:
* 區塊大小 (Block size) - 上例為 4096 字節 (4 KiB)
* Fragment 大小 (Fragment size) - 實際上 Ext2/Ext3/Ext4 都不支援 fragment 功能,所以這值一定和區塊大小一
樣[5]
* inodes 數目 - 上例在整個文件系統建立了 524,288 個 inodes,亦是文件系統所可能擁有文件數目的上限
* 區塊數目 (blocks) - 上例在整個文件系統建立了 2,096,466 個區塊
* 保留區塊 (reserved blocks) - 上例在整個文件系統保留了約 5% 的空間共 104,823 個區塊 (約 409 MiB =
104,823 x 4 KiB) 給供系統管理員工作之用
* 文件系統區塊數目上限 (Maximum Filesystem blocks) - 現時 Ext2/Ext3 所能支援一個文件系統所可能擁有區塊數
目的上限,上例為 2,147,483,648。即表示文件系統大小上限為 8 TiB =2,147,483,648 x 4 KiB
* 區塊組數目 (block groups) - 上例在整個文件系統建立了 64 個區塊組
* 區塊/組 (blocks per group) - 每個區塊組的區塊數目,為 32,768。個區塊組約有 128 MiB = 32,768 * 4 KiB
* inodes/組 (inodes per group) - 每個區塊組的 inodes 數目,為 8192
* Superblock 備份 (Superblock backups) - Superblock 被備份在編號 32768、98304、163840、229376、294912、
819200、884736 和 1605632 區塊,即編號 1、3、5、7、9、25、27 和 49 區塊組
此外,最尾兩行亦顯示文件系統的最大掛載次數 (Maxmimum Mount count) 為 21 和最大檢查間距為 180 日,表示文件系
統每掛載超過 21 次或超過 180 日未有進行完整文件系統檢查都會啟動時進行完整檢查。
為避免多個文件系統需要在同一次啟動時進行完整文件系統檢查,mke2fs 會在格式化文件系統時用一個亂數來設定最大掛
載次數 (Maxmimum Mount count) 的值,所以此值每次格式化時都不同。
以下是使用命令 mke2fs -j/mkfs.ext3/mkfs.ext4 格式化一個約 8 GiB 的分割區成為 Ext3 或 Ext4 文件系統的畫面:
mke2fs 1.41.3 (12-Oct-2008)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
524288 inodes, 2096466 blocks
104823 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2147483648
64 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 27 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
和格式化 Ext2 的畫面幾乎相同,唯一分別只是多了個 “Creating journal” 建立日志的步驟罷了。此行同時顯示日志的
大小,上例為 32,768 個區塊 (128 MiB = 32,768 * 4 KiB)。
inode到底怎樣計算其數目以及怎樣改變其數目
Johnwoolee打電話問我如何計算一個固定大小的分區的inodes個數,也就是inodes和blocksize之間的計算關系。
我記得以前我接觸過這個問題,記得和一個比率參數有關系。再次參看mkfs.ext3的man手冊,記憶喚起來了,同時也增加了
新的認識。
mkfs.ext3缺省情況下,是根據blocksize和bytes-per-inode來計算出一個文件系統在格式化時有多少inodes的。不過,我
覺得應該之和bytes-per-inode有關,因為mkfs.ext3會根據每一個bytes-per-inode大小來創建一個inode,因此刨除保留塊
,超級塊外,一個分區剩下的大小除以這個bytes-per-inode就大約是inode的個數。
我做了一個實驗,3GB大小的磁盤,分別指定blocksize和bytes-per-inode,得到的inode個數列表如下:
---------------------------------------------------------------------------------------
blocksize bytes-per-inode number-inode
---------------------------------------------------------------------------------------
1024 1024 3072000
---------------------------------------------------------------------------------------
1024 2048 1536000
----------------------------------------------------------------------------------------
1024 4096 768000
----------------------------------------------------------------------------------------
2048 2048 1537088
----------------------------------------------------------------------------------------
2048 4096 768544
---------------------------------------------------------------------------------------
上面的實驗數據可以得出下面的結論:
(bytes-per-inode) * (number-inode) =~ 3GB (filesystem size)
因為在mkfs.ext3中,blocksize最小為1024,而bytes-per-inode最小不能小於blocksize,因此指定bytes-per-inode為1024
可以獲得最大inode個數。
當然,如果你還嫌不夠,-N的參數也許能滿足變態要求的你,-N表示你來指定希望的inodes個數,這下,你該滿足了吧。
不過,也不是不限制的,我嘗試指定filesystem size(bytes)個數時,報錯了。
root@wgzhao:~# mkfs.ext3 -n -N 3145728000 /dev/sdb
mke2fs 1.40.3 (05-Dec-2007)
mkfs.ext3: inode_size (128) * inodes_count (3145728000) too big for a
filesystem with 768000 blocks, specify higher inode_ratio (-i)
or lower inode count (-N).
當滿足inode_size * inodes_count的要求后,不一定能滿足其他要求,比如
root@wgzhao:~# mkfs.ext3 -n -N 21420000 /dev/sdb
mke2fs 1.40.3 (05-Dec-2007)
/dev/sdb: Cannot create filesystem with requested number of inodes while setting up superblock
太大的inodes個數,導致超級塊無法創建。
到底最大能為多少為inodes個數, 當不知道的時候,就窮舉,我針對我的這個3GB空間大小,得到最后的最大inodes值,為
12255232
接下來就是看看12255232這個數字有什么秘密隱藏在里面了。
3145728000 / 12255232 = 256.68 ~= 256
也就是說折算成bytes-per-inode應該是256了。
這樣的話,一個分區創建為ext3文件系統時,最大的inode個數大約是
filesystem size (bytes) / 256
為了驗證這個結果,我繼續做了一個測試,當我把分區擴大到4GB時,inode個數大約應該是
4294967296 / 256 = 16777216 個
# mkfs.ext3 -m 0 -n -N 16318465 /dev/sdb
mke2fs 1.40.3 (05-Dec-2007)
/dev/sdb: Cannot create filesystem with requested number of inodes while setting up superblock
# mkfs.ext3 -m 0 -n -N 16318464 /dev/sdb
mke2fs 1.40.3 (05-Dec-2007)
warning: 112 blocks unused.
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
16318464 inodes, 1023888 blocks
0 blocks (0.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=270536704
498 block groups
2056 blocks per group, 2056 fragments per group
32768 inodes per group
Superblock backups stored on blocks:
2056, 6168, 10280, 14392, 18504, 51400, 55512, 100744, 166536, 257000,
499608, 705208
實際最大值為16318465,比我預計的小了很多。
4294967296 / 16318465 = 263.1 <256
我想中間的差距應該是超級塊等信息占用了一些block吧,具體還不是太清楚。
順便給出一個文件系統最大磁盤大小數據表
文件系統 文件大小限制 文件系統大小限制 (看格式化的信息,更加標准)
----------------------------------------------------------------------------------------------------
ext2/3(1K bs) 16448 MB (~ 16 GB) 2048 GB (= 2 TiB)
ext2/3(2k bs) 256 GB 8192 GB (= 8 TiB)
ext2/3(4k bs) 2048 GB (= 2 TiB) 8192 GB (= 8 TiB)
ext2/3(8k bs) 65568 GB (~ 64 TiB) 32768 GB (= 32 TiB)
ReiserFS 3.5 2 GB 16384 GB (= 16 TiB)
ReiserFS 3.6(knl2.4) 1 EB 16384 GB (= 16 TiB)
XFS 8 EiB 8 EiB
JFS(512 bs) 8 EiB 512 TiB
JFS(4k bs) 8 EiB 4 PiB
NFSv2 (client side) 2 GB 8 EiB
NFSv3 (client side) 8 EiB 8 EiB
------------------------------------------------------------------------------------------------------
http://wiki.debian.org.hk/w/Format_disk_as_Ext2,_Ext3_or_Ext4
ext3日志模式
data=journal日志模式:記錄改變文件系統數據和元數據,寫2次數據塊
文件系統所有數據和元數據的改變都記入日志。這種模式減少了丟失每個文件所作修改的機會,但是它需要很多額外的磁盤訪問。例如,當一個新文件被創建時,它的所有數據塊都必須復制一份作為日志記錄。這是最安全和最慢的Ext3日志模式。
日志中記錄包括所有改變文件系統的數據和元數據。它是三種ext3日志模式中最慢的,也是最安全的一種。每個變化需要寫磁盤2次、日志寫1次。所有新數據首先被寫入日志,然后才被定位。意外發生過后,日志可以被重放,將數據與元數據帶回一致狀態。
ext3 被設計用來執行完整數據和元數據日志記錄。在這種方式下(稱之為“data=journal”方式),JBD 將所有對數據和元數據的更改都記錄到文件系統中。因為數據和元數據都被記錄,JBD 可以使用日志將元數據 和數據恢復到一致狀態。完整數據日志記錄的缺點是它可能會比較慢,但可以通過設置相對較大日志來減少性能損失。
文件系統所有數據和元數據的改變都記入日志。這種模式減少了丟失每個文件所作修改的機會,但是它需要很多額
data=ordered日志模式:先寫數據塊,再修改元數據
只有對文件系統元數據的改變才記入日志。然而,Ext3文件系統把元數據和相關的數據塊進行分組,以便把元數據寫入磁盤之前寫入數據塊。這樣,就可以減少文件內數據損壞的機會;例如,確保增大文件的任何寫訪問都完全受日志的保護。這是缺省的Ext3 日志模式。
僅記錄改變文件系統的元數據,且溢出文件數據要補充到磁盤中。這是缺省的ext3日志模式。文件數據的變化情況並不被記錄在日志中,但它們必須做,而且由 ext3的daemon程序在與之相關的文件系統元數據變化前執行,即在記錄元數據前要修改文件系統數據,這將稍微降低系統的性能(速度),然而可確保文件系統中的文件數據與相應文件系統的元數據同步。
ext3 添加了一種新的日志記錄方式,該方式提供完整日志記錄的好處而不會帶來嚴重的性能損失。這種新方式只對元數據進行日志記錄。但是,ext3 文件系統驅動程序保持對與每個元數據更新對應的特殊 數據塊的跟蹤,將它們分組到一個稱為事務的實體中。當事務應用於適當的文件系統時,數據塊首先被寫到磁盤。一旦寫入數據塊,元數據將隨后寫入日志。通過使用這種技術(稱為“data=ordered”方式),即使只有元數據更改被記錄到日志中,ext3 也能夠提供數據和元數據的一致性。ext3 缺省使用這種方式。
data=writeback日志模式:也只是記錄了元數據,同時寫元數據和數據塊,可能寫了元數據,數據塊還沒寫完。對文件數據的更新與記錄元數據變化可以不同步。
只有對文件系統元數據的改變才記入日志;這是在其他日志文件系統發現的方法,也是最快的模式。
僅記錄改變文件系統的元數據,但根據標准文件系統,寫程序仍要將文件數據的變化記錄在磁盤上,以保持文件系統一致性。這是速度最快的ext3日志模式。因為它只記錄元數據的變化,而不需等待與文件數據相關的更新如文件大小、目錄信息等情況,對文件數據的更新與記錄元數據變化可以不同步,即ext3是支持異步的日志。缺陷是當系統關閉時,更新的數據因不能被寫入磁盤而出現矛盾,這一點目前尚不能很好解決。
有趣的是,ext3 處理日志記錄的方式與 ReiserFS 和其它日志記錄文件系統所用的方式迥異。使用 ReiserFS、XFS 和 JFS 時,文件系統驅動程序記錄 元數據,但不提供 數據日志記錄。使用 僅元數據日志記錄,您的文件系統元數據將會異常穩固,因而可能永遠不需要執行徹底 fsck。然而,意外的重新引導和系統鎖定可能會導致最近修改 數據的明顯毀壞。Ext3 使用一些創新的解決方案來避免這些問題,我們將對此做稍微深入的研究。
但首先,重要的是確切理解僅元數據日志記錄最終是如何危害您的。舉例來說,假設您正在修改名為 /tmp/myfile.txt 的文件時,機器意外鎖定,被迫需要重新引導。如果您使用的是僅元數據日志記錄文件系統,譬如 ReiserFS、XFS 或者 JFS,文件系統元數據將容易地修復,這要感謝元數據日志,您不必耐着性子等待艱苦的 fsck 了。
但是,存在一種明顯的可能性:在將 /tmp/myfile.txt 文件裝入到文本編輯器時,文件不僅僅丟失最近的更改,而且還包含許多亂碼甚至可能完全不可讀的信息。這種情況並不總會發生,但它 可能並且經常發生。
下面解釋原因。典型的日志記錄文件系統(譬如 ReiserFS、XFS 和 JFS)對元數據有特別處理,但是對數據不夠重視。在上述示例中,文件系統驅動程序處於修改一些文件系統塊的過程中。文件系統驅動程序更新適當的元數據,但是沒有時間將其緩存中的數據刷新到磁盤的新塊中。因此,當您將 /tmp/myfile.txt 文件裝入文本編輯器時,文件的部分或全部包含亂碼 ― 在系統鎖定之前來不及初始化的數據塊。
一般情況下,建議使用缺省模式。如果要改變模式,要在/etc/fstab文件中為相應的文件系統加上data=模式選項。
對於journal和writeback模式都可以調整這個參數會有幫助。
ext3文件系統還涉及到如何cache中的數據刷到硬盤上。它是通過kupdate進程來實現定期刷的,默認是5秒檢查一次,將超過30秒的臟數據刷到硬盤。在as 3.0中可以通過修改/proc/sys/vm/bdflush來達到目的。
有些人在繁忙的服務器上 ― 特別是在繁忙的 NFS 服務器上 ― 使用 ext3 的 data=journal 方式時曾經碰到一個特殊的性能問題。每隔 30 秒,服務器就會遇到磁盤寫活動高峰,導致系統幾乎陷於停頓。如果您遇到這個問題,修復它很容易。只要以 root 用戶輸入以下命令,就可以調整 Linux“臟”緩沖區刷新算法:
調整 bdflush
echo 40 0 0 0 60 300 60 0 0 > /proc/sys/vm/bdflush
這些新的 bdflush 設置將導致 kupdate 每隔 0.6 秒而不是每隔 5 秒運行。另外,它們告訴內核每隔 3 秒而不是 30 秒(缺省值)刷新“臟”緩沖區。通過更有規律地將最近修改的數據刷新到磁盤,可以避免這些寫操作的高峰。以這種方式執行的效率比較低,因為內核不太有機會組合寫操作。但對於繁忙的服務器,寫操作將更一致地進行,並將極大地改進交互式性能。
參考:
ext3 文件系統塊大小 谷歌