第七课 文件系统的维护

第七课 文件系统的维护
。ext2/ext3文件系统的优化与高级特性
。磁盘检查
。磁盘配额
。自动挂载分区

优化ext2/ext3文件系统
  文件系统优化原理同时适用于ext2/ext3
  假设/dev/sda2是一个linux文件系统分区,它是一个ext2或者ext3格式的,我们在使用的时候一般不用管这个分区上的文件到底是如何存放的,如果我们不知道这个数据的存放原理的话,我们是无法对其进行优化的,下面我们看这个数据到底是如何存放的:实际上这个分区存在这样的一个逻辑结构:分区上是一个一个的数据块,像一个小房间一样,数据是放在每一个小房间里面的,然后每个小房间的数据拼起来是一个文件,这里假设一个小块的大小是1k(Block size:1k),1k是小块的尺寸,每个分区在格式化的时候,就是要创建这样的1k大小的小块小格子,这样的数据块,当然这是逻辑结构的,如果一个文件有4k的话,那么文件肯定要使用这里的4个小块,如果没有到1k的话,同样占用一个小格子,如果有2k大小的话就占2块小格子,这些小格子我们称为存储单元,它也是最小存储单元,当文件系统为一个文件分配数据块的时候,就以最小的存储单元为单位来为它分配的,如果一个文件大小不到1k,只有几个字节,那么它也会为这个文件分配1k的空间,直到这个文件写满整个1k的空间,在为它分配第二个数据块,这是文件系统的存储原理。那么相应的我们也可以把这个最小存储单元的尺寸放大一点,比如我们将一块设置为4k(Block size:4k),如果一个文件是4k的,那么一个文件占一块就够了,如果一个文件不到4k,那么它也使用1块空间,直到它填满才使用第二个数据块。其中我们看到一个现象,如果你的文件很大的话,而这个数据块很小的话,这个文件就会被分割成很多的小块,比如文件是4k的,文件就会被分割成4块放在4个小格子里面,来存储这个文件,可是这个分割的时间和读写的时候寻址的时间都会浪费额外的开销,cpu 内存都会花费额外的资源。如果一个块分得大一点,那么这个4k的文件就一次写入一个块里面去了,就会省一点时间,提高你的磁盘效率。所以我们优化就是根据我们文件实际存储情况来优化这个块的大小来进行优化,反过来说,也不是这个块越大越好的。如果你的文件全部是小文件,全部是1k以下的,那么你创建文件的时候呢,你就可以分得小一点,比如说文件全都是1k的,1k不到,你的一个文件占一块,那么你的1块里面呢,只占用空间块1/4不到,每个文件都会浪费它的存储空间,对硬盘的空间是一种严重的浪费。所以我们在实际使用硬的时候,要根据这个硬盘里,存放的文件类型,大小,尺寸决定到底使用多大的数据块,决定好以后,我们在格式化的时候呢,就不能简单的使用mkfs来格式化了,我们要使用-b的这样一个选项,告诉它使用1块里并以指定大小(1024)为单位来格式化,使用命令 mkfs ext3 -b 1024 /dev/sda2就会将sd2格式化成了一个存储单元为1024字节的更小的一个单元,每个数据块都是1024字节。如果我要提高数据块的容量,增加块的尺寸,那你将尺寸设置大一点,1024改为4096,但是这个尺寸不是说你随便可以改的,在linux内核里默认的情况只能是三种情况1024 2048 4096,如果要更大的块的话,你需要修改你的文件系统修改你的内核。
现在我们看一下这个文件系统的数据块大小对实际数据存储的影响:
# fdisk /dev/sda
# p  pring the partition table
# t  change a partion's system id

# mkfs.ext3 -b 1024 /dev/sda1
# mkfs.ext3 -b 4096 /dev/sda3

# mount /dev/sda1 /mnt/d1
# mount /dev/sda2 /mnt/d2

# echo "hi" > /mnt/d1/test
# echo "hi" > /mnt/d2/test

# ls -lh /mnt/d[12]/test
字符串的结尾控制字符算一个字符
# du -sh /mnt/d[12]

# ls /mnt/d1/

# mkdir /mnt/d1/dir
# mkdir /mnt/d2/dir

# echo "hi" > /mnt/d1/dir/test
# echo "hi" > /mnt/d2/dir/test
# ls -lh /mnt/d[12]

# ls -lh /mnt/d[12]/dir/test

# du -sh /mnt/d[12]/dir

从数据块上来决定该如何格式化,下面我们来看另外的一种优化的条件,这里是一个节点的概念。
File1... 1,2    块1    块2
File2... 3,4    块3    块4
在我们读写数据的时候,所有的数据都要写进数据块里面,在数据块的寻址的时候需要根据数据块的编号来寻址,我们编号顺序可以按照1234来编写,每个数据块编一个号,如果一个文件File1占用了2个数据块,那么这个文件在索引区里面会有2个节点分配给它,File1... 1,2 区我们称为索引区或者节点区,因为文件的列表全保存在索引区,块区是实际的存放数据的位置,数据区的块里面,每个数据块的索引编号保存在索引区里面,这样一来,如果File1和File2同时都使用了2个数据块,那么这个文件列表里面就会有索引1和2,当文件1在读取的时候,他会读取1、2块,也就是在寻址是2次,1和2,同样道理File2也是一样,3和4 两次,如果将两个数据块合成一组的话,下面这种情况
File1... 1   1块   块
File2... 2   2块   块
这样就能稍微提高一下效率,此时我们将两块编成一组,File1的两个数据块为一组编为1,File2的两个数据块为一组编为2,这样在寻址的时候,通过1就能寻找到两个数据块,通过2就能寻找到两个数据块,那么一个文件通过一次寻址就够了,就没有必要寻找两次.File1... 1 这个节点代表的块数2个,2这个节点代表的块数2块,我们利用mkfs格式化的时候,为了制定1和2节点代表的块数,可以使用-i选项,-i 就表示每一个节点代表多少个数据块,它实际上是使用多大的数据块,如果-b 4096 -i8192,我们可以看到8196正好是4096的两倍,这意味着每个数据块大小4096,每2个数据块编一个组,这样可以对大文件寻址的时候快一点.(mkfs.ext3 -b 4096 -i 8196 /dev/sda2)
如果想一块编一个号为一组的话,-b 和 -i为一样大小4096
mkfs.ext3 -b 4096 -i 4096 /dev/sda2
示范:
# df
# umount /mnt/d1
# umount /mnt/d2

# mkfs.ext3 -b 4096 -i 4096 /dev/sda1
# mkfs.ext3 -b 4096 -i 8192 /dev/sda2
这样sda1 sda2就有不同的寻址方式了,怎么看,我们使用# tune2fs(检查linux系统ext*类型文件系统的属性) 工具来看
# tune2fs -l /dev/sda1 | more (打印sda1分区的属性,寻找它的节点和块的信息)
Inode count: 20096节点数
Block count: 20073块数
节点数和块数是比较接近的,它们之间还有一点差别,因为它还有一部分数据块是用来保留,保留目录和文件的索引区的,所以它们看起来是接近于1比1

# tune2fs -l /dev/sda2 | more
Inode count: 17088节点数
Block count: 34138块数
节点数约为块数的1/2
这样sda2比较适合存放大文件
保留块概念
保留块 -为管理员保留的磁盘管理空间,默认为总数据块的5%(为了防止硬盘分区使用太慢,管理员无法编辑配置文件,最终使系统无法管理,所以总是为管理员保留了一定的保留空间)这意味着你的硬盘空间越大,这个5%的保留块的值越多.我们可以手工修改这个百分比
mkfs.ext3 -b 4096 -i 8192 -m 2 /dev/sda2 (-m 2 保留百分比为2%)
设置保留块的数量占总数的百分比为2%

示范:
# mkfs.ext3 -b 4096 -i 8192 -m 5 /dev/sda2  (5%)
# tune2fs -l /dev/sda2 | more
Reserved block count:1706 保留块数(5%)
# tune2fs -l /dev/sda2 | grep Reserved (将这个值过滤出来)
Reserved block count:1706

# mkfs.ext3 -b 4096 -i 8192 -m 2 /dev/sda2  (2%)
# tune2fs -l /dev/sda2 | more
Reserved block count:682 保留块数(2%)
# tune2fs -l /dev/sda2 | grep Reserved (将这个值过滤出来)
Reserved block count:682

这个方法可以帮我们节省一定的硬盘空间,防止因为保留空间造成的磁盘浪费
通过# df能够感觉得出来
# df -lj
1K-块          已用              可用
3020140  >    791272     +      2075452

这个值可以使用tune2fs来修改:

调整ext2/ext3文件系统
。tune2fs - 调整ext2/ext3文件系统特性的工具
  o -l <device>  查看文件系统信息
  o -c <count> 设置强制自动检查的挂载次数
  o -i <n day> 设置强制自动检查的间隔时间
  o -m <percentage> 保留块的百分比
  o -j 将ext2文件系统转换为ext3格式
示范:
# tune2fs -l /dev/sda1
Mount count:0 挂载次数
Maximum mount count:27 最大挂载次数
# mount /dev/sda1 /mnt/d1
#tune2fs -l /dev/sda1
Mount count:1 挂载次数 (每挂载一次计数器加1,达到最大挂载次数时,默认会强制自检)
Maximum mount count:27 最大挂载次数
我们可以使用-c选项来改最大挂载次数

# tune2fs -c 2 /dev/sdb1
Setting maximum mount count to 2
# tune2fs -l /dev/sda1 | grep -i "mount count" 直接过滤出mount count (-i表示忽略大小写)
Mount count:1
Maximum mount count:2
# umount /mnt/d1
# mount /dev/sda1 /mnt/d1
# tune2fs -l /dev/sda1 |grep -i "mount count"
Mount count:2 达到最大挂载次数,在系统重启时默认进行自动检查
Maximum mount count:2
# umount /mnt/d1
# mount /dev/sda1 /mnt/d1
# tune2fs -l /dev/sda1 |grep -i "mount count"
Mount count:3 达到最大挂载次数,在系统重启时默认进行自动检查 ,我们在使用的时候不会造成什么影响,只影响系统的启动过程
Maximum mount count:2
# umount /dev/sda1
# tune2fs -c -1 /dev/sda1 (-1时,mount count永远不会达到这个值,此时文件系统永远不需要自动检查的)
通常情况下,当Mount count超过Maximum mount count的时候,强制自检,然后把Mount count清零,计数器会变0,然后慢慢再加起来,把Mount count 变成0后,就不可能达到-1,所以这样的情况用远不会发生,结果就是sda1永远不会被自检。(-c -1)

下面看-i(interval间隔时间)
# tune2fs -l /dev/sda1 | more
Check interval:  15552000(6 months)
永远不要自检,改为-1
# tune2fs -c -1 -i 0 /dev/sda1
# tune2fs -l /dev/sda1 |more
Check interval:  0 <(none)>
万一要自检,我们手工进行:# fsck

改变保留块百分比:
# tune2fs -l /dev/sda1|grep -i "Reserved"
Reserved block count:682
# tune2fs -m 10 /dev/sda1
Setting reserved blocks percentage to 10 (8410 blocks)
# tune2fs -l /dev/sda1|grep -i "Reserved"
Reserved block count:3410

转换ext2为ext3格式
# mkfs.ext2 /dev/sda1
# mount /dev/sda1 /mnt
# df -T
/dev/sda1 ext2
# cp /ect/servieces /mnt
# ls /mnt
lost+found servieces
# tune2fs -j /dev/sda1
# cp /etc/services /mnt
# umount /mnt/
# mount /dev/sda1 /mnt
# df -T
/dev/sda1 ext3
# more /mnt/
# more /mnt/services
# df -T
/dev/sda1 ext3
ext2可以转换为ext3,但是ext3不能转换为ext2,但是ext3可以挂载ext2:(# mount -t ext2 /dev/sda1 /mnt)
# umount /mnt
# mount ext2 /dev/sda1 /mnt(强制将 sda1以ext2挂载到/mnt目录)
# df -T
/dev/sda1 ext2
# umount /mnt
# tune2fs -l /dev/sda1
Filesystem features    has journal(说明有日志,看不到这一项说明没有日志)
# mkfs.ext2 /dev/sda2
# tune2fs -l /dev/sda2
Filesystem features    (看不到has journal一项说明没有日志,是使用的ext2格式)
# tune2fs -l /dev/dsa2 |grep features



文件系统检查工具
。fsck - 检查文件系统数据 完整性的工具(开机自动自检的12)
用法一: # fsck -t ext2 /dev/sda1
用法一: # fsck.ext2 /dev/sda1

示范:
# fsck.ext23 /dev/sda1
# more /etc/fstab
对有些分区长时间不检的话,会不好,所以我们可以手工自检
# df
# mkfs.ext2 /dev/sda1
# mkfs -t ext2 /dev/sda1
如果出现有问题,会提示是否需要修复,我们按Y进行修复,
如果自动修复错了,我们可以用fsck.ext3 -Y(表示yes) /dev/sdb1(自动修改错误)
。e2fsck - 检查ext2/ext3文件系统的工具(危险!)

使用磁盘配额

。磁盘配额作用是限制普通用户使用的磁盘空间,不至于因为个别人的浪费影响所有人的使用(只能限制在一个具体的分区上)
。需要内核支持(默认内核都是支持的)
。只有ext2/ext3文件系统目前被支持
。需要用户程序quota软件包

磁盘配额配置过程
。使用usrquota,grpquota选项挂载一个分区,激活内核的支持
# mount -o usrquota,grpquota /dev/sdb1 /mnt/d1 或
# mount =o remount,usrquota,grpquota
。init 1(进入单用户环境)
。quotackeck -cvuga检查并且创建磁盘配额的数据库文件
。edquota -u <username> 为指定用户分配磁盘空间和节点数量
。quota命令可以查看用户的配额使用情况
演示:
# df
# mkfs.ext3 /dev/sda1
# mount /dev.sda1 /mnt/sda1 -o usrquota,grpquota
# mount
# more /etc/mtab
# quotacheck -cvuga
# ls /mnt/sda1
# quotaon -a
# edquota -u redhat
# df
# ls /mnt/sda1
# mkdir /mnt/sda1/redhat
# chown redhat /mnt/sda1/redhat
# su - redhat
$ cd /mnt/sda1/redhat
$ quota
$ pwd
$ ls -lh
$ ls -ld
$ dd if=/dev/zero of=file1 bs-1k count=1024
$ quota
$ dd if=/dev/zero of=file1 bs-1k count=1024
$ dd if=/dev/zero of=file2 bs-1k count=1024
$ dd if=/dev/zero of=file3 bs-1k count=1024
$ dd if=/dev/zero of=file4 bs-1k count=1024
$ quota
$ ls
$ df
$ ls
$ ls -ld .
$ touch aa
$ ls
$ rm file3
$ ls
$ dd if=/dev/zero of=file2 bs-1k count=2048
$ ls -lh
$ ls df
$ dd if=/dev/zero of=file1 bs-1k count=2048
$ quota
$ ls
$ echo "hi" > test
$ ls -l
$ quota
$ ls
$ rm *
$ ls
$ quota
$ exit
# quota -u redhat
# repquota 打印所有用户的磁盘配额的情况
# repquota-a
# edquota -t
# quotaoff /mnt/sda1
# edquota -u redhat
# quotaon  /dev/sda1
# mount
# vi /etc/fstable
# man edquota
# vi /etc/fstab
# df
# ls /mnt/sda1




你可能感兴趣的:(数据结构,c,linux,redhat,配置管理)