首页 > 代码库 > 二、文件系统管理

二、文件系统管理

2.1、文件系统的分类

 文件系统是操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。常见的文件系统主要有:

  基本文件系统: Ext2, Ext3, Ext4, Reiserfs, xfs, JFS, NTFS
  交换分区: swap
  集群文件系统: GFS2, OCFS2
  网络文件系统: NFS, smbfs(CIFS)
  光盘: iso9660

文件系统主要特点
NTFS  NTFS文件系统是一个基于安全性的文件系统,是Windows NT所采用的独特的文件系统结构,它是建立在保护文件和目录数据基础上,同时照顾节省存储资源、减少磁盘占用量的一种先进的文件系统。
Ext2

  Ext是 GNU/Linux 系统中标准的文件系统,其特点为存取文件的性能极好,对于中小型的文件更显示出优势,这主要得利于其簇快取层的优良设计。

  其单一文件大小与文件系统本身的容量上限与文件系统本身的簇大小有关,在一般常见的 x86电脑系中,簇最大为 4KB,则单一文件大小上限为 2048GB,而文件系统的容量上限为 16384GB。

Ext3  Ext3是一种日志式文件系统,是对ext2系统的扩展, 兼容ext2。 优越性在于:由于文件系统都有快取层参与运作, 如不使用时必须将文件系统卸下,以便将快取层的资料写回磁盘中。 因此每当系统要关机时,必须将其所有的文件系统全部shutdown后才能进行关机   
Ext4  Ext4 是 Ext3 的改进版。更大的文件系统和更大的文件。无限数量的子目录。
Reiserfs  其特色为能很有效率地处理大型文件到众多小文件都可以用很高的效率处理;实务上 ReiserFS 在处理文件小于 1k 小文件时,甚至效率可以比ext3快约10倍。
XFS  作为 SGI 基于 IRIX 的产品(从工作站超级计算机)的底层文件系统来使用。一种健壮的、优秀的以及功能丰富的文件系统,并且这种文件系统所具有的可伸缩性能够满足最苛刻的存储需求。
JFS

 JFS( JOURNAL FILE SYSTEM),一种字节级日志文件系统,借鉴了数据库保护系统的技术,以日志的形式记录文件的变化。JFS通过记录文件结构而不是数据本身的变化来保证数据的完整性。这种方式可以确保在任何时刻都能维护数据的可访问性。

  该文件系统主要是为满足服务器(从单处理器系统到高级多处理器和群集系统)的高吞吐量和可靠性需求而设计、开发的

GFS  GFS是一个可扩展的分布式文件系统,用于大型的、分布式的、对大量数据进行访问的应用。它运行于廉价的普通硬件上,并提供容错功能。它可以给大量的用户提供总体性能较高的服务。
OCFS2  OCFS2是下一代的Oracle集群文件系统,它已经被设计成为一种为通用的文件系统。OCFS2能使运行在集群中所有节点并发的通过标准文件系统接口来访问存储备。
NFS  NFSNetwork File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。
smbfs(CIFS)  CIFS 是一个新提出的协议,它使程序可以访问远程Internet计算机上的文件并要求此计算机提供服务。CIFS 使用客户/服务器模式。
iso9660  ISO 9660文件系统(file system)是一个标准的CD-ROM文件系统,它允许您在PCMac和其它主要计算机平台上读取CD-ROM文件。
SWAP Linux中Swap(即:交换分区),类似于Windows虚拟内存,就是当内存不足的时候,把一部分硬盘空间虚拟成内存使用,从而解决内存容量不足的情况。

2.2、ext2文件系统

文件系统示意图:

技术分享

  • 超级块(Super Block):整个分区的文件系统信息,主要信息有:

 block 与 inode 的总量

 未使用与已使用的 inode / block 数量

 block 与 inode 的大小 (block 为 1, 2, 4K,inode 为 128 bytes)

 filesystem 的挂载时间、最近一次写入数据的时间、最近一次检验磁盘 (fsck) 的时间等文件系统的相关信息

 一个 valid bit 数值,若此文件系统已被挂载,则 valid bit 为 0 ,若未被挂载,则 valid bit 为 1 

  • 块组描述符表(GDT,Group Descriptor Table):存储一个块组的描述信息

  • 块位图(Block Bitmap):描述整个块组中哪些块已用哪些块空闲的

  • inode 位图( inode Bitmap):每个bit表示一个inode是否空闲可用

  • inode 表(inode Table):文件描述信息

该文件的存取模式(read/write/excute);

该文件的拥有者与群组(owner/group);

该文件的容量;

该文件创建或状态改变的时间(ctime);

最近一次的读取时间(atime);

最近修改的时间(mtime);

定义文件特性的旗标(flag),如 SetUID...;

该文件真正内容的指向 (pointer);

  • 数据块(Data Block):存放数据

2.3、创建文件系统命令mkfs/mke2fs

Ext4: mkfs -t ext4 = mkfs.ext4 = mke2fs -t ext4
Ext3: mkfs -t ext3 = mkfs.ext3 = mke2fs -t ext3 = mke2fs -j
mke2fs: 创建 ex2 系列的文件

选项:

  -j: 创建ext3类型文件系统 

  -L:指定分区卷标

  -t: {ext2|ext3|ext4}
  -b: 指定块大小, 默认为 4096; 可用取值为 1024、 2048 或 4096;
  -m#:指定预留给超级用户的块数百分比
  -i#:用于指定为多少字节的空间创建一个inode,默认为8192,给出的数值应该为块大小的2^n倍

  -N#:指定 inode 个数; 

  -F: 强制创建文件系统

  -E: 用户指定额外文件系统属性

配置文件:/etc/mke2fs.conf

[root@mylinux ~]# fdisk /dev/vdb           #创建分区
WARNING: DOS-compatible mode is deprecated. It‘s strongly recommended to
         switch off the mode (command ‘c‘) and change display units to
         sectors (command ‘u‘).
Command (m for help): m
Command action
   a   toggle a bootable flag
   b   edit bsd disklabel
   c   toggle the dos compatibility flag
   d   delete a partition
   l   list known partition types
   m   print this menu
   n   add a new partition
   o   create a new empty DOS partition table
   p   print the partition table
   q   quit without saving changes
   s   create a new empty Sun disklabel
   t   change a partition‘s system id
   u   change display/entry units
   v   verify the partition table
   w   write table to disk and exit
   x   extra functionality (experts only)
Command (m for help): n              #新建一个主分区
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1           
First cylinder (1-20805, default 1): 
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-20805, default 20805): +2G
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
[root@mylinux ~]# cat /proc/partitions 
major minor  #blocks  name
 252        0   20971520 vda
 252        1   20970496 vda1
 252       16   10485760 vdb
 252       17    2097616 vdb1
 253        0    5243584 dm-0
 253        1    2097648 dm-1
 253        2          1 dm-2
 253        3     102784 dm-3
[root@mylinux ~]# mke2fs -j /dev/vdb1   #对分区进行格式化,即创建文件系统
mke2fs 1.41.12 (17-May-2010)
/dev/vdb1 is apparently in use by the system; will not make a 文件系统 here!
[root@mylinux ~]#  dmsetup status
vdb5: 0 205569 linear 
vdb4: 0 2 linear 
vdb2: 0 4195296 linear 
vdb1: 0 10487169 linear 
[root@mylinux ~]# dmsetup remove_all
[root@mylinux ~]# mke2fs -j /dev/vdb1
mke2fs 1.41.12 (17-May-2010)
警告: 116 块未使用.
文件系统标签=
操作系统:Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
131328 inodes, 524288 blocks
26220 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=536870912
16 block groups
32768 blocks per group, 32768 fragments per group
8208 inodes per group
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912
正在写入inode表: 完成                            
Creating journal (16384 blocks): 完成
Writing superblocks and filesystem accounting information: 完成
This filesystem will be automatically checked every 20 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override. #文件系统创建成功
[root@mylinux ~]#

 2.4、ext2文件系统管理命令e2label/tune2fs/dumpe2fs/e2fsck

e2label: 用于查看或定义卷标

e2label 设备文件 [卷标]
[root@mylinux ~]# e2label /dev/vdb1 ext2fs   #为新建的文件系统创建卷标
[root@mylinux ~]# e2label /dev/vdb1          #查看卷标
ext2fs

tune2fs: 调整文件系统的相关属性

选项:

  -j: 不损害原有数据,将 ext2 升级为ext3 

  -L: 设定或修改卷标;

  -m#: 调整预留超级用户的块数百分比; 

  -r#: 指定预留块数;

  -o:  设定默认挂载选项; 

  -l:  显示超级块中的信息;

  -c#:指定挂载次数达到#次之后进行自检,0 或-1 表关闭此功能;
  -i#: 每挂载使用多少天后进行自检;0 或-1 表示关闭此功能;
  -O:  文件系统属性启用或禁用
[root@mylinux ~]# tune2fs -l /dev/vdb1   #查看文件系统信息
tune2fs 1.41.12 (17-May-2010)
Filesystem volume name:   ext2fs          #卷标
Last mounted on:          <not available>
Filesystem UUID:          a0296858-4e6a-46a9-8b7a-78e52815e702 #UUID号
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype sparse_super large_file
Filesystem flags:         signed_directory_hash 
Default mount options:    (none)
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              131328
Block count:              524288
Reserved block count:     26220
Free blocks:              498867
Free inodes:              131317
First block:              0
Block size:               4096
Fragment size:            4096
Reserved GDT blocks:      127
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8208
Inode blocks per group:   513
Filesystem created:       Mon Apr  3 16:51:52 2017
Last mount time:          n/a
Last write time:          Mon Apr  3 16:56:07 2017
Mount count:              0
Maximum mount count:      20
Last checked:             Mon Apr  3 16:51:52 2017
Check interval:           15552000 (6 months)
Next check after:         Sat Sep 30 16:51:52 2017
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:               256     
Required extra isize:     28
Desired extra isize:      28
Journal inode:            8
Default directory hash:   half_md4
Directory Hash Seed:      af5d9a37-ae00-404a-9dd1-3fd9556c20da
Journal backup:           inode blocks
[root@mylinux ~]# tune2fs -i 0 /dev/vdb1   #禁止时间检查
tune2fs 1.41.12 (17-May-2010)
Setting interval between checks to 0 seconds
[root@mylinux ~]# tune2fs -L ext3fs /dev/vdb1   #更改文件系统卷标
tune2fs 1.41.12 (17-May-2010)
[root@mylinux ~]# e2label /dev/vdb1
ext3fs

dumpe2fs: 显示文件系统属性信息

选项:

  -h: 只显示超级块中的信息 

  -b:列出保留为坏道的部分

[root@mylinux ~]# dumpe2fs /dev/vdb1    #查看文件系统属性
dumpe2fs 1.41.12 (17-May-2010)
Filesystem volume name:   ext3fs        #文件系统名称
Last mounted on:          <not available>
Filesystem UUID:          a0296858-4e6a-46a9-8b7a-78e52815e702
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype sparse_super large_file
Filesystem flags:         signed_directory_hash 
Default mount options:    (none)           #默认挂在参数
Filesystem state:         clean            #表示文件系统没有问题(clean)
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              131328           #Inode的总数
Block count:              524288           #block的总数
Reserved block count:     26220            
Free blocks:              498867           #可用block数量
Free inodes:              131317           #可用inode数量
First block:              0
Block size:               4096             #每个block的大小
Fragment size:            4096
Reserved GDT blocks:      127
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8208
Inode blocks per group:   513
Filesystem created:       Mon Apr  3 16:51:52 2017
Last mount time:          n/a
Last write time:          Mon Apr  3 17:05:42 2017
Mount count:              0
Maximum mount count:      20
Last checked:             Mon Apr  3 16:51:52 2017
Check interval:           0 (<none>)
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:               256               #每个inode的大小
Required extra isize:     28
Desired extra isize:      28
Journal inode:            8
Default directory hash:   half_md4
Directory Hash Seed:      af5d9a37-ae00-404a-9dd1-3fd9556c20da
Journal backup:           inode blocks
Journal features:         (none)
日志大小:             64M
Journal length:           16384
Journal sequence:         0x00000001
Journal start:            0
Group 0: (Blocks 0-32767)
  主 superblock at 0, Group descriptors at 1-1
  保留的GDT块位于 2-128
  Block bitmap at 129 (+129), Inode bitmap at 130 (+130)
  Inode表位于 131-643 (+131)
  32118 free blocks, 8197 free inodes, 2 directories
  可用块数: 650-32767
  可用inode数: 12-8208
Group 1: (Blocks 32768-65535)            #每一个数据块的内容
  备份 superblock at 32768, Group descriptors at 32769-32769  #备份超级快所在区域
  保留的GDT块位于 32770-32896
  Block bitmap at 32897 (+129), Inode bitmap at 32898 (+130)
  Inode表位于 32899-33411 (+131)
  32124 free blocks, 8208 free inodes, 0 directories
  可用块数: 33412-65535
  可用inode数: 8209-16416
...

e2fsck: 专用于修复 ext2/ext3 文件系统

-f: 强制检查; 

-p: 自动修复; 

-y:对问题自动回答为 yes

2.5、查看磁盘设备属性blkid/hdparm

blkid: 查询或查看磁盘设备的相关属性
  UUID(随机数,唯一标示磁盘设配) TYPE(类型)  LABEL(分区卷标)

[root@mylinux ~]# blkid
/dev/vda1: UUID="85564546-5aae-41bf-ad64-d334c6d13f15" TYPE="ext3" 
/dev/vdb1: LABEL="ext3fs" UUID="a0296858-4e6a-46a9-8b7a-78e52815e702" SEC_TYPE="ext2" TYPE="ext3"

hdparm:获取或设定 SATA/IDE 设备参数

[root@mylinux ~]# hdparm /dev/vdb
/dev/vdb:
 HDIO_DRIVE_CMD(identify) failed: Inappropriate ioctl for device
 readonly      =  0 (off)
 readahead     = 256 (on)
 geometry      = 20805/16/63, sectors = 20971520, start = 0

2.6、修复linux文件系统命令fsck

fsck: 检查并修复 Linux 文件系统

-t FSTYPE: 指定文件系统类型 

-a: 自动修复

-r:交互式修复错误

7、 交换分区 swap

交换分区必须单独分区,相当于虚拟内存。
fdisk 创建分区,调整分区类型为 82
mkswap -L LABEL 改变分区为交换分区
swapon [OPTION]...[DEVICE]

-a:启用所有的定义在/etc/fstab文件中的交换分区
-p #:指定优先级

swapoff 关闭交换设备或文件
free [OPTION] 查看物理内存与交换内存使用状态

-m: 以 MB 为单位 

-g: 以 GB 为单位

[root@mylinux ~]# free -m
             total       used       free     shared    buffers     cached
Mem:           996        535        461          0        165        193
-/+ buffers/cache:        176        819
Swap:            0          0          0
第一部分Mem行:
  total 内存总数: 996M
  used 已经使用的内存数: 535M
  free 空闲的内存数: 461M
  shared 当前已经废弃不用,总是0
  buffers Buffer 缓存内存数: 165M
  cached Page 缓存内存数:193M
  关系:total(1002M) = used(769M) + free(232M)
第二部分(-/+ buffers/cache):
 (-buffers/cache) used内存数:176M (指的第一部分Mem行中的used – buffers – cached)
 (+buffers/cache) free内存数: 819M (指的第一部分Mem行中的free + buffers + cached)
 -buffers/cache反映的是被程序实实在在吃掉的内存,
 +buffers/cache反映的是可以挪用的内存总数。

分区信息: /proc/partitions

[root@mylinux ~]# cat /proc/partitions  
major minor  #blocks  name     
 252        0   20971520 vda
 252        1   20970496 vda1
 252       16   10485760 vdb
 252       17    5243584 vdb1
 252       18    2097648 vdb2
 252       20          1 vdb4
 252       21     102784 vdb5
 253        0    5243584 dm-0
 253        1    2097648 dm-1
 253        2          1 dm-2
 253        3     102784 dm-3

内存信息: /proc/meminfo

[root@mylinux ~]# cat /proc/meminfo 
MemTotal:        1020128 kB    #总内存
MemFree:          473048 kB    #空闲内存
Buffers:          168872 kB    #缓冲区大小
Cached:           197324 kB    #缓存大小
SwapCached:            0 kB    #交换分区
Active:           320744 kB    #活跃使用中的高速缓冲存储器页面文件大小
Inactive:         136948 kB    #不经常使用的高速缓冲存储器页面文件大小
Active(anon):      91656 kB    #
Inactive(anon):       48 kB
Active(file):     229088 kB
Inactive(file):   136900 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB    #交换空间的总大小
SwapFree:              0 kB    #交换分区空前大小
Dirty:                76 kB    #等待被写回到磁盘的内存大小
Writeback:             0 kB    #正在被写回到磁盘的内存大小
AnonPages:         91512 kB    #未映射页的内存大小
Mapped:            19048 kB    #设备和文件等映射的大小
Shmem:               208 kB    #共享内存大小
Slab:              68084 kB    #内核数据结构缓存的大小,可以减少申请和释放内存带来的消耗
SReclaimable:      48880 kB    #可收回Slab的大小
SUnreclaim:        19204 kB    #不可收回Slab的大小(SUnreclaim+SReclaimable=Slab)
KernelStack:        1792 kB    #内核堆栈大小
PageTables:         3168 kB    #管理内存分页页面的索引表的大小
NFS_Unstable:          0 kB    #不稳定页表的大小
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:      510064 kB
Committed_AS:     363316 kB
VmallocTotal:   34359738367 kB #可以vmalloc虚拟内存大小
VmallocUsed:        7152 kB    #已经被使用的虚拟内存大小
VmallocChunk:   34359727228 kB 
HardwareCorrupted:     0 kB
AnonHugePages:     38912 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:        8184 kB
DirectMap2M:     1040384 kB

文件系统信息:/proc/filesystems

[root@mylinux ~]# cat /proc/filesystems 
nodev   sysfs
nodev   rootfs
nodev   bdev
nodev   proc
nodev   cgroup
nodev   cpuset
nodev   tmpfs
nodev   devtmpfs
nodev   binfmt_misc
nodev   debugfs
nodev   securityfs
nodev   sockfs
nodev   usbfs
nodev   pipefs
nodev   anon_inodefs
nodev   inotifyfs
nodev   devpts
nodev   ramfs
nodev   hugetlbfs
        iso9660
nodev   pstore
nodev   mqueue
        ext3
  • Buffer 和 Cache 的区别

  buffer 缓冲是为了提高内存和硬盘或其他 I/0 设备之间的数据交换的速度而设计;cache 缓存是为了提高 cpu 和内存之间的数据交换速度而设计。简单来说buffer是即将要被写入磁盘的,而cache 是被从磁盘中读出来的。


本文出自 “随风而飘” 博客,请务必保留此出处http://yinsuifeng.blog.51cto.com/10173491/1912693

二、文件系统管理