Linux入门之磁盘管理(2)文件系统
linux分区构成完成之后,一般需要进行对其创建指定的文件系统,也就是我们常说的格式化,然后对其进行分区挂载,提供指定分区的访问点。不同的分区格式会在文件系统内部提供不同的对该分区的数据存储的格式分配,以及其内部模块会支持不同的分区的接口及方法调用,例如对一个文件的打开、读取、写入、关闭等功能,每个文件系统都会有各种不同的特点。
常见的系统文件系统:
linux:
ext2、ext3、ext4;xfs(SGI);btrfs(Oracle);reiserfs;jfs(ATX);swap
windows:
ntfs、fat32
unix:
FFS(fast);USF(unix);JFS2
注意:linux是识别fat32,只不过其类型显示为vfat格式
其它领域的文件系统:
网络文件系统:NFS, CIFS
集群文件系统:GFS2、OCFS2(Oracle)
分布式文件系统:ceph、moosefs、mogilefs、glusterfs、Lustre
RAW:未经处理或者未经过格式化产生的文件系统
Linux中的文件系统划分:
按是否支持”Journal”(日志)功能分类:
日志性文件系统:ext3, ext4, xfs
非日志型文件系统:ext2, vfat
文件系统的组成部分:
内核中的模块:ext4,xfs, vfat
用户空间的管理工具:mkfs.ext4, mkfs.xfs, mkfs.vfat
注意:这里说明了如果内核实现未提供相应的模块,就是能使用格式化工具去格式化对应格式分区,但内核模块不识别,当然工具是建立在内核的基础上的。
Linux虚拟文件系统:VFS
用途:为了支持不同类型格式文件系统下数据和系统内核处理的连接,中间出现了虚拟文件系统,对外提供了一个同一的接口规范来是各种文件系统来调用以此让系统管理
使用命令查看当前系统内核支持的文件系统:
/proc/filesystems (映射内核支持的所有文件系统列表)
[[email protected] ~]# 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磁盘是否已经进行了分区,这里显示进行事先创建好了分区 [[email protected] ~]# 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
#下面进行格式化,因为产生信息过多,这里我们全部写入一个文件 [[email protected] ~]# mke2fs /dev/sdb1 &> mksdb1.log
#分析格式化产生的信息: #这里显示默认为预留了6556个块,也就是总块数的5% [[email protected] ~]# cat mksdb1.log | grep -o ‘.*blocks.*)‘ 6556 blocks (5.00%)
#查看/dev/sdb1被分配了多少个inode,多少个存数据的块,多少个分配块的分组 [[email protected] ~]# cat mksdb1.log | grep -o ‘^[0-9].*\(blocks\|groups\)$‘ 32896 inodes, 131073 blocks 16 block groups
#查看/dev/sdb1分配了多少bytes来指定一个block [[email protected] ~]# cat mksdb1.log | grep -o ‘^Blo.*e=[0-9]\+‘ Block size=1024
#格式化设置指定分区卷标名 [[email protected] ~]# 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中设置的分区格式信息 [[email protected] ~]# 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分区,可以借助文本处理工具 [[email protected] ~]# cat /etc/fstab | sed -n ‘s/^UUID=\(.*\)[[:space:]]\/boot.*$/\1/gp‘ 2f1d03b9-c82a-45be-af0f-8766eff3f9ac #然后使用命令调用来根据UUID找出对应分区 [[email protected] ~]# blkid -U `sed -n ‘s/^UUID=\(.*\)[[:space:]]\/boot.*$/\1/gp‘ /etc/fstab` /dev/sda1 #这里显示/dev/sda1,是正确的,上面我们通过/etc/fstab显示的是/boot分区的UUID
#当然不确定可以也可以使用blkid进行详细查看 [[email protected] ~]# blkid /dev/sda1 /dev/sda1: UUID="2f1d03b9-c82a-45be-af0f-8766eff3f9ac" TYPE="ext4" #显示了其UUID,并且文件系统为ext4
#使用e2label设备并查看卷标 [[email protected] ~]# e2label /dev/sdb1 mydata [[email protected] ~]# e2label /dev/sdb1 mydata
#同样使用findfs通过管道来查询/boot分区 [[email protected] ~]# grep -o ‘.*/boot‘ /etc/fstab | grep -o ‘=.*\>[[:space:]]‘ | grep -o ‘[^=[:space:]]\+‘ | xargs -I {} findfs UUID={} /dev/sda1 #使用findfs根据LABEL卷标名查询出,前提要操作的分区要有卷标名,不然会报错 [[email protected] ~]# 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 #注意这里指定的是分区设备
#如上图,超级块所记录的所有分区的元数据都会被以报表的形式而列举出来
修改指定分区卷标
#查看卷标 [[email protected] ~]# e2label /dev/sdb1 mydata #设置卷标 [[email protected] ~]# tune2fs -L ‘data‘ /dev/sdb1 tune2fs 1.41.12 (17-May-2010) #再次查看卷标 [[email protected] ~]# tune2fs -l /dev/sdb1 | grep ‘vol‘ | grep -o ‘[^[:space:]]\+$‘ data
修改预留百分比
#先查看此分区被分配了多少个块用于存储设备 [[email protected] ~]# tune2fs -l /dev/sdb1 | grep ‘Block.*count‘ Block count: 131073 #预留的总数大概是总数的1% [[email protected] ~]# tune2fs -l /dev/sdb1 | grep ‘Rese.*count‘ Reserved block count: 1310 #现在重新调整预留百分比 [[email protected] ~]# tune2fs -m 5 /dev/sdb1 tune2fs 1.41.12 (17-May-2010) Setting reserved blocks percentage to 5% (6553 blocks)
解析:调整后的结果显示出来,%5预留,有6553个block,但是这里要注意,如果,调整之前,该分区如果数据已经存满(分配完block),再去调整可能会有数据丢失或损坏。
添加或移除文件系统特性
#查看指定分区文件系统的特性 [[email protected] ~]# 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及以上的版本才会支持的 #现在去掉日志功能 [[email protected] ~]# tune2fs -O ^has_journal /dev/sdb1 tune2fs 1.41.12 (17-May-2010) #查看/dev/sdb1的特性功能,已经没有了has_journal [[email protected] ~]# tune2fs -l /dev/sdb1 | grep ‘features‘ Filesystem features: ext_attr resize_inode dir_index filetype sparse_super
调整设备默认挂载选项
#查看设备默认挂载选项 [[email protected] ~]# tune2fs -l /dev/sdb1 | grep ‘^Default.*mount.*:‘ Default mount options: (none) #修改设备默认挂载选项为支持acl [[email protected] ~]# tune2fs -o acl /dev/sdb1 tune2fs 1.41.12 (17-May-2010) #再次查看,这里从没有变成了支持acl [[email protected] ~]# tune2fs -l /dev/sdb1 | grep ‘^Default.*mount.*:‘ Default mount options: acl
注意:如果同时设置多个默认挂载选项,可以使用 , 隔开
使用dumpe2fs查看所有含有super block信息备份的块组
#查看有多少个快组 [[email protected] ~]# dumpe2fs /dev/sdb1 2> /dev/null | grep ‘^Group[[:space:]]‘ | wc -l 16 #列出所有包含有super block中的快组 [[email protected] ~]# 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
[[email protected] ~]# fsck -a /dev/sdb1 fsck from util-linux-ng 2.17.2 data: clean, 11/32896 files, 5707/131073 blocks
注意:clean表示为block为没有损坏