首页 > 代码库 > Linux入门之磁盘管理(2)文件系统

Linux入门之磁盘管理(2)文件系统

Linux入门之磁盘管理(2)文件系统

linux分区构成完成之后,一般需要进行对其创建指定的文件系统,也就是我们常说的格式化,然后对其进行分区挂载,提供指定分区的访问点。不同的分区格式会在文件系统内部提供不同的对该分区的数据存储的格式分配,以及其内部模块会支持不同的分区的接口及方法调用,例如对一个文件的打开、读取、写入、关闭等功能,每个文件系统都会有各种不同的特点。

常见的系统文件系统:

linux

ext2ext3ext4xfs(SGI)btrfs(Oracle)reiserfsjfs(ATX)swap

windows

ntfsfat32

unix

FFS(fast)USF(unix)JFS2

注意:linux是识别fat32,只不过其类型显示为vfat格式

其它领域的文件系统:

网络文件系统:NFS, CIFS 

集群文件系统:GFS2OCFS2Oracle

分布式文件系统:cephmoosefsmogilefsglusterfsLustre

RAW:未经处理或者未经过格式化产生的文件系统


Linux中的文件系统划分:

按是否支持Journal(日志)功能分类:

日志性文件系统:ext3, ext4, xfs

非日志型文件系统:ext2, vfat

文件系统的组成部分:

内核中的模块:ext4xfs,  vfat

用户空间的管理工具:mkfs.ext4, mkfs.xfs, mkfs.vfat

注意:这里说明了如果内核实现未提供相应的模块,就是能使用格式化工具去格式化对应格式分区,但内核模块不识别,当然工具是建立在内核的基础上的。

Linux虚拟文件系统:VFS

用途:为了支持不同类型格式文件系统下数据和系统内核处理的连接,中间出现了虚拟文件系统,对外提供了一个同一的接口规范来是各种文件系统来调用以此让系统管理


使用命令查看当前系统内核支持的文件系统:

/proc/filesystems  (映射内核支持的所有文件系统列表)

[root@mzf ~]# cat /proc/filesystems
nodevdrm
    ext4

解析:这里有两列,nodev表示没有设备在使用此系统模块,而为空表示有设备使用了此文件系统


使用命令创建文件系统(格式化分区):

通用文件系统工具

mkfs  命令

用法:mkfs.FS_TYPE  /dev/DEVICE :注意这里是对分区操作

FS_TYPE:   ext4

        xfs

        ftrfs

        vfat

  mkfs  -t  FS_TYPE  /dev/DEVICE:通过-t类型指定文件系统类型

-L  LABEL  :格式化时指定一个卷标,默认不指定为空


专用创建ext文件系统

mke2fs  命令 

mke2fs:专门用于ext系列系统,不支持其创建它文件系统

用法:

mke2fs  [option]  /dev/DEVICE
      -t  {ext2|ext3|ext4}     #格式化为指定格式文件系统,默认不指定为ext2
      -b  {1024|2048|4096}          #设置每一个块占多少个字节,一般默认为4096
      -L  ‘LABEL’              #格式化时指定卷标
      -j                    #格式化为ext3
      -i #                   #指定多少#字节创建一个inode,不能小于block大小
      -N #                   #为数据空间创建多少#个inode
      -m #     #为管理员预留多少块占用,单位为百分比,默认为5%
      -O FEATURE  #启用指定特性,多个特性中间用 , 隔开
      -O ^FEATURE  #禁用指定特性


命令使用实例:

#查看/dev/sdb磁盘是否已经进行了分区,这里显示进行事先创建好了分区
[root@mzf ~]# fdisk -l /dev/sdb | grep ‘^/dev.*‘
/dev/sdb1     1        2914      131129+        83  Linux
/dev/sdb2     2915      14566      524340        83  Linux
/dev/sdb3     14567      37869     1048635        83  Linux
/dev/sdb4     37870      466033    19267380       5 Extended
/dev/sdb5     37870      61172     1048634+       83  Linux
#下面进行格式化,因为产生信息过多,这里我们全部写入一个文件
[root@mzf ~]# mke2fs /dev/sdb1 &> mksdb1.log

#分析格式化产生的信息:
#这里显示默认为预留了6556个块,也就是总块数的5%
[root@mzf ~]# cat mksdb1.log | grep -o ‘.*blocks.*)‘
6556 blocks (5.00%)

#查看/dev/sdb1被分配了多少个inode,多少个存数据的块,多少个分配块的分组
[root@mzf ~]# cat mksdb1.log | grep -o ‘^[0-9].*\(blocks\|groups\)$‘
32896 inodes, 131073 blocks
16 block groups

#查看/dev/sdb1分配了多少bytes来指定一个block
[root@mzf ~]# cat mksdb1.log | grep -o ‘^Blo.*e=[0-9]\+‘
Block size=1024

#格式化设置指定分区卷标名
[root@mzf ~]# mke2fs -L ‘mydata‘ /dev/sdb1  |&  grep -o ‘label=.*‘
label=mydata


使用命令查看设备属性信息:

指向设备的另一种方法,一般常见有3中:

指定设备名、设备卷标名、设备UUID


blkid  命令

用法:

blkid  [option]...  /path/to/dev
        -U  UUID:#根据指定的UUID来查找对应的设备
        -L  LABEL:#根据指定的卷标名来查找对应的设备


e2label  命令

专用于ext系列文件系统

e2label  DEVICE  [LABEL]


findfs  命令

findfs  [option]  LABEL=<label>  #根据指定卷标名查找出对于分区
findfs  [option]  UUID=<uuid>   #根据指定UUID查找出对应分区


使用案例:

#查看fstab中设置的分区格式信息
[root@mzf ~]# cat /etc/fstab | grep ‘^[^#[:space:]]‘
UUID=d4216951-0028-4b26-824e-89a2f661d008  /   ext4 defaults        1 1
UUID=2f1d03b9-c82a-45be-af0f-8766eff3f9ac   /boot  ext4  defaults        1 2
UUID=47433c93-6d04-46e5-bed0-8fd189874278  /testdir ext4 defaults        1 2
UUID=3d3cb745-3fe1-4482-9814-fc1bf9f7f76e swap  swap defaults          0 0
tmpfs   /dev/shm          tmpfs   defaults        0 0
devpts   /dev/pts          devpts   gid=5,mode=620     0 0
sysfs   /sys                  sysfs   defaults        0 0
proc    /proc            proc    defaults       0 0
#现在我们要根据UUID来找出boot分区,可以借助文本处理工具
[root@mzf ~]# cat /etc/fstab | sed -n ‘s/^UUID=\(.*\)[[:space:]]\/boot.*$/\1/gp‘
2f1d03b9-c82a-45be-af0f-8766eff3f9ac
#然后使用命令调用来根据UUID找出对应分区
[root@mzf ~]# blkid -U `sed -n ‘s/^UUID=\(.*\)[[:space:]]\/boot.*$/\1/gp‘ /etc/fstab` 
/dev/sda1
#这里显示/dev/sda1,是正确的,上面我们通过/etc/fstab显示的是/boot分区的UUID
#当然不确定可以也可以使用blkid进行详细查看
[root@mzf ~]# blkid /dev/sda1
/dev/sda1: UUID="2f1d03b9-c82a-45be-af0f-8766eff3f9ac" TYPE="ext4" 
#显示了其UUID,并且文件系统为ext4
#使用e2label设备并查看卷标
[root@mzf ~]# e2label /dev/sdb1 mydata
[root@mzf ~]# e2label /dev/sdb1 
mydata
#同样使用findfs通过管道来查询/boot分区
[root@mzf ~]# grep -o ‘.*/boot‘ /etc/fstab | grep -o ‘=.*\>[[:space:]]‘ | grep -o ‘[^=[:space:]]\+‘ | xargs -I {} findfs UUID={}
/dev/sda1
#使用findfs根据LABEL卷标名查询出,前提要操作的分区要有卷标名,不然会报错
[root@mzf ~]# findfs LABEL=`e2label /dev/sdb1`
/dev/sdb1


使用命令设置和查看分区详细信息:

tune2fs  命令  (注意:只用于支持ext类型文件系统类型

用法:

tune2fs  [option]  /dev/dev_part
    -l:       #查询指定文件超级快(super block)信息
     -L ‘LABEL’:  #修改卷标
     -m #:      #调整预留给管理员空间,可能会破坏数据
    -O :      #文件系统启用或禁用,-O  ^has_journal,不加^为启用
    -o :      #调整文件系统的默认挂载
    -U UUID:    #修改UUID号



dumpe2fs  命令  用于查询所有快组及分区数据信息

     -h:查看超级块信息


命令使用实例:

使用tune2fs查看超级块信息

tune2fs  -l  /dev/sdb1     #注意这里指定的是分区设备

技术分享

#如上图,超级块所记录的所有分区的元数据都会被以报表的形式而列举出来


修改指定分区卷标

#查看卷标
[root@mzf ~]# e2label /dev/sdb1
mydata
#设置卷标
[root@mzf ~]# tune2fs -L ‘data‘ /dev/sdb1
tune2fs 1.41.12 (17-May-2010)
#再次查看卷标
[root@mzf ~]# tune2fs -l /dev/sdb1 | grep ‘vol‘ | grep -o ‘[^[:space:]]\+$‘
data


修改预留百分比

#先查看此分区被分配了多少个块用于存储设备
[root@mzf ~]# tune2fs -l /dev/sdb1 | grep ‘Block.*count‘
Block count:              131073
#预留的总数大概是总数的1%
[root@mzf ~]# tune2fs -l /dev/sdb1 | grep ‘Rese.*count‘
Reserved block count:     1310
#现在重新调整预留百分比
[root@mzf ~]# tune2fs  -m 5 /dev/sdb1
tune2fs 1.41.12 (17-May-2010)
Setting reserved blocks percentage to 5% (6553 blocks)

解析:调整后的结果显示出来,%5预留,有6553block,但是这里要注意,如果,调整之前,该分区如果数据已经存满(分配完block),再去调整可能会有数据丢失或损坏。


添加或移除文件系统特性

#查看指定分区文件系统的特性
[root@mzf ~]# tune2fs -l /dev/sdb1 | sed -n ‘s/.*features:[[:space:]]\+\(.*\)$/\1/gp‘
has_journal ext_attr resize_inode dir_index filetype sparse_super
解析:这里出现了has_journal表示是ext3及以上的版本才会支持的
#现在去掉日志功能
[root@mzf ~]# tune2fs -O ^has_journal /dev/sdb1
tune2fs 1.41.12 (17-May-2010)
#查看/dev/sdb1的特性功能,已经没有了has_journal
[root@mzf ~]# tune2fs -l /dev/sdb1 | grep ‘features‘
Filesystem features:    ext_attr resize_inode dir_index filetype sparse_super


调整设备默认挂载选项

#查看设备默认挂载选项
[root@mzf ~]# tune2fs -l /dev/sdb1 | grep ‘^Default.*mount.*:‘
Default mount options:    (none)
#修改设备默认挂载选项为支持acl
[root@mzf ~]# tune2fs -o acl /dev/sdb1
tune2fs 1.41.12 (17-May-2010)
#再次查看,这里从没有变成了支持acl
[root@mzf ~]# tune2fs -l /dev/sdb1 | grep ‘^Default.*mount.*:‘
Default mount options:    acl

注意:如果同时设置多个默认挂载选项,可以使用 , 隔开


 

使用dumpe2fs查看所有含有super block信息备份的块组

#查看有多少个快组
[root@mzf ~]# dumpe2fs /dev/sdb1 2> /dev/null  | grep ‘^Group[[:space:]]‘ | wc -l
16
#列出所有包含有super block中的快组
[root@mzf ~]# dumpe2fs /dev/sdb1 2>/dev/null | grep -B2 ‘super.*block‘ | grep ‘[^-]‘ | grep -o ‘^Group[[:space:]][0-9]\+‘
Group 0                    # 0 号块组一般放primary super block
Group 1                    #以下的块组存放了super block的备份
Group 3
Group 5
Group 7
Group 9

解析:因为super block 保存了一个文件系统所产生的所有元数据,一旦受到破坏,可能整个文件系统都无法使用,这时有了超级块的备份存在,就可以通过备份进行文件系统的修复。


使用命令进行文件系统的检查、修复:

通用命令

fsck 命令

用法:

fsck   /dev/part_name  :     默认不指定为自动识别分区文件系统类型

fsck.TYPE                 指定文件系统类型:比如fsck.ext3

指定选项:

fsck  [option]   /dev/part_name
     -t  FS_TYPE   #同样指定文件系统类型:比如fsck  -t  xfs
     -a         #表示为自动修复
     -r          #交互式检查


专用于ext系列文件系统

e2fsck 命令

选项用法:

e2fsck  [option]  /dev/part_name
       -f     #表示为强制检查
       -y     #自动回答为yes

[root@mzf ~]# fsck -a /dev/sdb1 
fsck from util-linux-ng 2.17.2
data: clean, 11/32896 files, 5707/131073 blocks

注意:clean表示为block为没有损坏


本文出自 “神剑特兰克斯” 博客,请务必保留此出处http://mengzhaofu.blog.51cto.com/10085198/1843594

Linux入门之磁盘管理(2)文件系统