一、文件系统介绍:
(1)、Ext2: 是 GNU/Linux 系统中标准的文件系统,其特点为存取文件的性能极好,对于中小型的文件更显示出优势,这主要得利于其簇快取层的优良设计。其单一文件大小与文件系统本身的容量上限与文件系统本身的簇大小有关,在一般常见的 x86 电脑系统中,簇最大为 4KB, 则单一文件大小上限为 2048GB, 而文件系统的容量上限为 16384GB。但由于目前核心 2.4 所能使用的单一分割区最大只有 2048GB,因此实际上能使用的文件系统容量最多也只有 2048GB。
(2)、Ext3: 顾名思义,它就是 ext2 的下一代,也就是在保有目前 ext2 的格式之下再加上日志功能。目前它离实用阶段还有一段距离,也许在下一版的核心就可以上路了。 ext3是一种日志式文件系统。日志式文件系统的优越性在于:由于文件系统都有快取层参与运作,如不使用时必须将文件系统卸下,以便将快取层的资料写回磁盘中。因此每当系统要关机时,必须将其所有的文件系统全部卸下后才能进行关机。另外Linux中还有一种专门用于交换分区的swap文件系统,Linux使用整个分区来作为交换空间,而不象Windows使用交换文件。一般这个SWAP格式的交换分区是主内存的2倍。
(3)、Ext4: Linux kernel 自 2.6.28 开始正式支持新的文件系统 Ext4。 Ext4 是 Ext3 的改进版,修改了 Ext3 中部分重要的数据结构,而不仅仅像 Ext3 对 Ext2 那样,只是增加了一个日志功能而已。Ext4 可以提供更佳的性能和可靠性,还有更为丰富的功能:
(3)、Ext4日志文件系统的特点:
1. 与 Ext3 兼容。执行若干条命令,就能从 Ext3 在线迁移到 Ext4,而无须重新格式化磁盘或重新安装系统。原有 Ext3 数据结构照样保留,Ext4 作用于新数据,当然,整个文件系统因此也就获得了 Ext4 所支持的更大容量。13. 默认启用 barrier。磁盘上配有内部缓存,以便重新调整批量数据的写操作顺序,优化写入性能,因此文件系统必须在日志数据写入磁盘之后才能写 commit 记录,若 commit 记录写入在先,而日志有可能损坏,那么就会影响数据完整性。Ext4 默认启用 barrier,只有当 barrier 之前的数据全部写入磁盘,才能写 barrier 之后的数据。(可通过 "mount -o barrier=0" 命令禁用该特性。)
三、实例解析:
[root@stationxx root]# mke2fs -j /dev/hda8
mke2fs 1.24a (02-Sep-2001)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
.. .. ..
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 30 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
[root@stationxx root]# tune2fs -j /dev/hda9
tune2fs 1.24a (02-Sep-2001)
Creating journal inode: done
This filesystem will be automatically checked every 31 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
[root @stationxx root]#mke2fs -J device=/dev/hda8 /dev/hda2
[root @stationxx root] # umount /dev/hda8
[root @stationxx root] #e2fsck -fy /dev/hda8
总而言之,ext3日志文件系统是目前linux系统由ext2文件系统过度到日志文件系统最为简单的一种选择,实现方式也最为简洁。由于是直接从ext2文件系统发展而来,系统由ext2文件系统过渡到ext3日志文件系统升级过程平滑,可以最大限度地保证系统数据的安全性。目前linux系统要使用日志文件系统,最保险的方式就是选择ext3文件系统。
5、将ext3文件系统转换为ext4文件系统
如何从 ext3 升级到 ext4?首先需要确保 Linux kernel 是支持 ext4 的,其次要注意 /boot 分区最好使用 ext3,因为现在系统上的 grub 很可能不支持 ext4,需要有这个 commit 的特别版本 grub 才能支持 ext4. 用下面的命令转换:
# cd /; umount /dev/sda1
# tune2fs -O extents,uninit_bg,dir_index /dev/sda1
记住,转换成 ext4 后必须用 fsck 扫描,否则不能 mount,-p 参数说明 “自动修复” 文件系统:
# fsck -pf /dev/sda1
挂载 ext4 文件系统:
# mount -t ext4 /dev/sda1 /path/to/
四、问题解答:
1.测试目的:touch一个新的空文件占用磁盘空间吗? 占用的话占用多少?
创建一个空文件,消耗掉了一个inode。那么inode的节点大小是多少呢,使用dumpe2fs命令可以帮助我们查看到这个东东的实际大小。它告诉我们每个inode的大小是128Byte(ext3),256Byte(ext4)。当然这个大小每台机器都会不一样,它实际上是在系统格式化磁盘的时候决定的。
2.测试目的:新建一个空目录占用磁盘空间吗?占用多少?
原来目录也是会占用一个inode节点的,新建一个空目录会占用磁盘空间4KB + inode size。 哦,这个在你的系统上也不一定是4K,它实际上一个block size。同样在dumpe2fs下可以看到。
3. 测试目的:ext3文件系统下filename最大字符长度
测试平台:RHEL5U3_x64
测试过程:
LENTH=`for i in {1..255};do for x in a;do echo -n $x;done;done`
touch $LENTH
当增加到256时,touch报错,File name too long
linux系统下ext3文件系统内给文件/目录命名,最长只能支持127个中文字符,英文则可以支持255个字符
4. 测试目的:ext3文件系统下一级子目录的个数限制
测试平台:RHEL5U3_x64
测试过程:
[root@fileserver maxdir]# for i in {1..32000};do mkdir $i;done
mkdir: cannot create directory `31999': Too many links
mkdir: cannot create directory `32000': Too many links
ext3文件系统一级子目录的个数为31998(个)。
Linux为了cpu的搜索效率而规定的,要想改变数目大概要重新编译内核.
5. 测试目的:ext3文件系统下目录1个block可以存放多少目录项
测试平台:RHEL5U3_x64
测试过程:
[root@fileserver maxdir]# for i in {1..339};do mkdir $i;done
[root@fileserver maxdir]# ll -d
drwxr-xr-x. 2 root root 4096 Jan 2 15:12 .
[root@fileserver maxdir]# mkdir 340
[root@fileserver maxdir]# ll -d
drwxr-xr-x. 2 root root 12288 Jan 2 15:12 .
说明:
这是资料截图。inode 指i_node节点编号,rec_len指离下个目录项的偏移,后面的看看也知道的吧。由于name不定长,所以需要name_lens。所以一个目录项至少12字节。一个目录块4096字节,可以放多少目录项呢。答案是2+339 =341 。2指 . 和 .. 两个目录项 , 339 为自己创建的文件的目录项。通过测试也证明了我的猜测。你如果创建340个文件,那目录块就会立马变大到12kb。(为什么不是8kb,有谁知道?)。
事实上,你删除目录里的文件把目录项删除后,空余的盘块是不会回收的。也就是说,目录的大小只增不减。
6. 测试目的:ext3文件系统下单个目录里的最大文件数
测试平台: RHEL5U3_x64
测试过程:
单个目录下的最大文件数似乎没什么特别限制,也是受限于所在文件系统的inode数限制:
df -i或者使用tune2fs -l /dev/sdaX或者dumpe2fs -h /dev/sdaX查看可用inode数,后两个命令
输出结果是一样的,但是跟df所得出的可用inode数会有些误差,至今不明白什么原因。
网上常用两种解决办法:
1) 重新mkfs,ext3默认block大小4096 Bytes,block设置小一些inode数设置大一些
2) 使用loopback文件系统临时解决:
在/usr中(也可以在别处)创建一个大文件,然后做成loopback文件系统,将原来的文件移到这个
文件系统中,并将它mount到/usr下合适的位置。这样可以大大减少你/usr中的文件数目。但是系统
性能会有点损失。
7. 测试目的: 打开文件数限制(文件句柄、文件描述符)
测试平台: RHEL5U3_x64
ulimit -n 65535设置,或者/etc/security/limit.conf里设置用户打开文件数、进程数、CPU等