LINUX文件系统体系结构
用户空间(User space)包含一些应用程序(例如,文件系统的使用者)和 GNU C 库(glibc),它们为文件系统调用(打开、读取、写和关闭)提供用户接口。系统调用接口(System call interface)的作用就像是交换器,它将系统调用从用户空间发送到内核空间(Kernel space)中的适当端点。
VFS(Virutal file systems) 是底层文件系统的主要接口。这个组件导出一组接口,然后将它们抽象到各个文件系统,各个文件系统的行为可能差异很大。有两个针对文件系统对象的缓存(inode 和 dentry)。它们缓存最近使用过的文件系统对象。每个文件系统实现(比如 ext2、JFS 等等)导出一组通用接口,供 VFS 使用。缓冲区缓存会缓存文件系统和相关块设备之间的请求。
主要结构
Linux 以一组通用对象的角度看待所有文件系统。这些对象是超级块(superblock)、inode、dentry 和文件。超级块在每个文件系统的根上,超级块描述和维护文件系统的状态。文件系统中管理的每个对象(文件或目录)在 Linux 中表示为一个 inode。inode 包含管理文件系统中的对象所需的所有元数据(包括可以在对象上执行的操作)。另一组结构称为 dentry,它们用来实现名称和 inode 之间的映射,有一个目录缓存用来保存最近使用的 dentry。dentry 还维护目录和文件之间的关系,从而支持在文件系统中移动。最后,VFS 文件表示一个打开的文件(保存打开的文件的状态,比如写偏移量等等)。
虚拟文件系统层
VFS 作为文件系统接口的根层。VFS 记录当前支持的文件系统以及当前挂装的文件系统。
超级块
超级块结构表示一个文件系统。它包含管理文件系统所需的信息,包括文件系统名称(比如 ext2)、文件系统的大小和状态、块设备的引用和元数据信息(比如空闲列表等等)。超级块通常存储在存储媒体上,但是如果超级块不存在,也可以实时创建它。
Linux系统下可使用的文件系统有:
基本文件系统:ext2, ext3, ext4, reiserfs, xfs, btrfs, swap
光盘:iso9660
Windows: fat32(vfat), ntfs
Unix: ffs, ufs, jfs, jfs2
网络文件系统:nfs, cifs
集群文件系统:ocfs2, gfs2
分布式文件系统:ceph, moosefs, mogilefs, hdfs, gfs, glusterfs
(1)日志型文件系统:非日志型文件系统:ext2
日志型文件系统:ext3
(2)swap:交换分区
创建文件系统:
在分区上执行格式化(高级格式化)要使用某种文件系统,满足两个条件:
(1)内核中:支持此种文件系统
(2)用户空间:有文件系统管理工具
系统文件一般的管理工具:
mkfs命令
使用格式: mkfs [-V] [-t fstype] [fs-options] filesys [blocks] [-L Lable]
作用:创建文件系统
参数
-V : 详细显示模式 -t : 给定文件系统的格式 -c : 在制做档案系统前,检查该partition 是否有坏轨 -l bad_blocks_file : 将有坏轨的block资料加到 bad_blocks_file 里面 block : 给定 block 的大小 -L:建立lable
实例:
设定sda2分区的文件格式为ext3,以下两种方式同样可以实现
[root@localhost ~]# mkfs.ext3 /dev/sda2
[root@localhost ~]# mkfs -t ext3 /dev/sda2
mke2fs命令
使用格式:mke2fs [OPTION]... DEVICE
常用参数
-t:{ext2|ext3|ext4} 指定需使用的文件系统
-b: {1024|2048|4096} 指定块大小
-L : 'LABEL' 设定标签
-j: mke2fs -t ext3 创建使用ext3卷号的文件系统
-i #: 指定每个inode的字节数
-N #: 指定inode的数量
-m #: 预留磁盘空间占据多大百分比的空间为后期管理使用;
-O: FEATURE[,...] 指定分区特性
-O: ^FEATURE: 关闭此特性
实例:
(1) 使用fdisk创建分区
fdisk /dev/sda
(2)创建分区后,使用partx /dev/sda3 重新激活分区表
[root@localhost~]# partx /dev/sda
#1: 2048- 4098047 ( 4096000 sectors, 2097 MB)
# 2: 4098048-106498047 (102400000 sectors, 52428 MB)
# 3:106498048-110703914 ( 4205867sectors, 2153 MB)
(3)创建文件系统为ext4,指定块大小为1024,卷标为“test”
[root@localhost~]# mke2fs -t ext4 -b 1024 -L test /dev/sda3
(4)使用blkid命令查看结果
[root@localhost~]# blkid /dev/sda3
/dev/sda3:LABEL="test" UUID="22c70ef3-9497-4b48-b5c9-5067c5b71710"TYPE="ext4"
文件系统属性查看及调整工具
e2label命令
使用格式:e2lable DEVICE [LABEL]
作用: 查看分区的卷标及设置
[root@localhost~]# e2label /dev/sda3 test
tune2fs命令
显示ext系列文件系统的属性,或调整其属性;
-l:显示超级块中的信息;显示整个文件的属性及布局等相关信息;
-L: 'LABEL':修改卷标;
-m#: 调整预留给管理员的管理空间百分比;
-j:ext2 --> ext3
-O:文件系统属性的启动或关闭
-o:文件系统默认挂载选项的启用或关闭
dumpe2fs命令
-h: 仅显示超级块信息
文件系统检测:
fsck(Filesystem check)命令
fsck-t type
fsck.type
-a: 自动修复错误
-r: 交互式修复错误
-f: 强制检测
e2fsck命令:ext系列文件系统专用的检测修复工具;
-y: 自动回答为“yes”
-f:force
文件系统的挂载和使用
将额外文件系统与根文件系统某现存的目录建立起关联关系,进而使得此目录做为其它文件系统访问入口的行为,称之为挂载;
解除此关联关系的过程为卸载。
挂载点:mount point, 设备挂载至目录;
注意:挂载点在挂载在之后,其内部原有的文件会被暂时隐藏;建立使用空目录做为挂载点
常用的挂载命令有
mount
格式为:mount [-afFhnrvVw] [-L<标签>] [-o<选项>] [-t<文件系统类型>] [设备名] [加载点]
作用: 加载指定的文件系统。
常用参数和选项: -a 加载文件/etc/fstab中设置的所有设备。 -f 不实际加载设备。可与-v等参数同时使用以查看mount的执行过程。 -F 需与-a参数同时使用。所有在/etc/fstab中设置的设备会被同时加载,可加快执行速度。 -h 显示在线帮助信息。 -L<标签> 加载文件系统标签为<标签>的设备。 -n 不将加载信息记录在/etc/mtab文件中。 -o<选项> 指定加载文件系统时的选项。有些选项也可在/etc/fstab中使用。这些选项包括: async 以非同步的方式执行文件系统的输入输出动作。 atime 每次存取都更新inode的存取时间,默认设置,取消选项为noatime。 auto 必须在/etc/fstab文件中指定此选项。执行-a参数时,会加载设置为auto的设备,取消选取为noauto。 defaults 使用默认的选项。默认选项为rw、suid、dev、exec、anto nouser与async。 dev 可读文件系统上的字符或块设备,取消选项为nodev。 exec 可执行二进制文件,取消选项为noexec。 noatime 每次存取时不更新inode的存取时间。 noauto 无法使用-a参数来加载。 nodev 不读文件系统上的字符或块设备。 noexec 无法执行二进制文件。 nosuid 关闭set-user-identifier(设置用户ID)与set-group-identifer(设置组ID)设置位。 nouser 使一位用户无法执行加载操作,默认设置。 remount 重新加载设备。通常用于改变设备的设置状态。 ro 以只读模式加载。 rw 以可读写模式加载。 suid 启动set-user-identifier(设置用户ID)与set-group-identifer(设置组ID)设置位,取消选项为nosuid。 sync 以同步方式执行文件系统的输入输出动作。 user 可以让一般用户加载设备。 -r 以只读方式加载设备。 -t<文件系统类型> 指定设备的文件系统类型。常用的选项说明有: minix Linux最早使用的文件系统。 ext2 Linux目前的常用文件系统。 msdos MS-DOS 的 FAT。 vfat Win85/98 的 VFAT。 nfs 网络文件系统。 iso9660 CD-ROM光盘的标准文件系统。 ntfs Windows NT的文件系统。 hpfs OS/2文件系统。Windows NT 3.51之前版本的文件系统。 auto 自动检测文件系统。 -v 执行时显示详细的信息。 -V 显示版本信息。 -w 以可读写模式加载设备,默认设置。
unmount:卸载命令
# umount DEVICE
# umount MOUNT_POINT
实例:
(1) 创建挂载点 /mnt/test
[root@localhost ~]# mkdir /mnt/test
(2)把/dev/sda3挂载到/mnt/test上
[root@localhost ~]# mount /dev/sda3 /mnt/test
(3)使用df �Ch 命令查看
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/789-LogVol01
47G 3.5G 41G 8% /
tmpfs 491M 224K 491M 1% /dev/shm
/dev/sda1 1.9G 37M 1.8G 3% /boot
/dev/sr0 3.7G 3.7G 0 100% /mnt/iso
/dev/sda3 2.0G 3.1M 1.9G 1% /mnt/test
使用umount命令卸载
[root@localhost ~]# umount /mnt/test/
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/789-LogVol01
47G 3.5G 41G 8% /
tmpfs 491M 224K 491M 1% /dev/shm
/dev/sda1 1.9G 37M 1.8G 3% /boot
/dev/sr0 3.7G 3.7G 0 100% /mnt/iso
交换分区
查看内存(memory)及交换分区(swap)的命令
free
-m: 以MB为单位
-g: 以GB为单位
[root@localhost ~]# free -m
total used free shared buffers cached
Mem: 981 710 270 3 62 312
-/+ buffers/cache: 336 645
Swap: 1999 0 1999
创建交换分区
mkswap
格式:mkswap [option] DEVICE
-L 'LABEL' 指定卷标
swapon:启用交换分区
格式:swapon [option] [DEVICE]
-a: 激活所有交换分区
-p PRIORITY: 设定其优先级
swapoff:禁用交换分区
格式:swapoff [option] [DEVICE]
实例:
创建一个交换分区
[root@localhost ~]# mkswap /dev/sda3 Setting up swapspace version 1, size = 2102928 KiB no label, UUID=023db09a-ccd8-4714-ad69-337b744e2843 [root@localhost ~]# swapo swapoff swapon [root@localhost ~]# swapo swapoff swapon [root@localhost ~]# swapon /dev/sda3 [root@localhost ~]# swapon �Cs Filename Type SizeUsed Priority /dev/dm-1 partition 2047996 0 -1 /dev/sda3 partition 2102928 0 -2
文件系统等空间占用信息的查看工具
df命令
作用:报告文件系统磁盘空间的使用情况
格式:df [OPTION]... [FILE]... POSIX 选项: [-kP]
常用参数
df: disk free 显示磁盘空间
-h: human-readable 用常见的格式显示出大小
-i: inode数量 用信息索引点代替块表示使用状况
-P: 以Posix兼容的格式输出
du: disk usage
-s: summary
文件系统上的链接文件:
硬链接:
特性:(1)两个路径指向同一个inode
(2)不能对目录进行;
(3)不能跨分区进行
注意:指向同一个inode的多个不同路径; 创建文件的硬链接会增加inode的引用计数;删除硬链接仅是删除其一个访问路径,只到最后一个路径被删除;
符号链接(软链接):
特性:(1)链接文件的数据指向另一个文件路径
(2)可以对目录进行;
(3)可以跨分区;
注意:指向的是另一个文件路径,而非inode。对文件创建符号链接不会增加其引用计数;删除原文件,符号链接文件也将无法;
ln [-s] SRC DEST
-s:symbolic link
-v:verbose
作业
创建一个10G文件系统,类型为ext4,要求开机可自动挂载至/mydata目录
(1) 创建分区
[root@localhost ~]# fdisk /dev/sda Command (m for help): n Command action e extended p primary partition (1-4) e 因只能分四个主分区,之前已有3个在用,因此此处第4个分区分为 Selected partition 4 extended(扩展) First cylinder (6892-15665, default 6892): Using default value 6892 Last cylinder, +cylinders or +size{K,M,G} (6892-15665, default 15665): Using default value 15665 Command (m for help): n First cylinder (6892-15665, default 6892): Using default value 6892 Last cylinder, +cylinders or +size{K,M,G} (6892-15665, default 15665): +10G Command (m for help): p Device Boot Start End Blocks Id System /dev/sda1 * 1 256 2048000 83 Linux Partition 1 does not end on cylinder boundary. /dev/sda2 256 6630 51200000 8e Linux LVM /dev/sda3 6630 6891 2102933+ 83 Linux /dev/sda4 6892 15665 70477155 5 Extended /dev/sda5 6892 8197 10490413+ 83 Linux
(2)使用kpatx命令刷新分区表后,查看/proc/partitions下的分区信息
[root@localhost ~]# kpartx /dev/sda5 [root@localhost ~]# cat /proc/partitions major minor #blocks name 7 0 3804160 loop0 8 0 125829120 sda 8 1 2048000 sda1 8 2 51200000 sda2 8 3 2102933 sda3 8 4 31 sda4 8 5 10490413 sda5 253 0 49147904 dm-0 253 1 2048000 dm-1
(3)使用mke2fs命令创建文件系统ext4
[root@localhost ~]# mke2fs -t ext4 /dev/sda5 (4)使用blkid命令查看 [root@localhost ~]# blkid /dev/sda5 /dev/sda5: UUID="b6d1d8c9-6496-4e85-9d0f-026b3756c11e" TYPE="ext4"
(4)创建挂载点并使用mount命令挂载上去;最后编辑/etc/fstab文件
[root@localhost ~]# mkdir /dev/sda5 /mnt/test [root@localhost ~]# mount /dev/sda5 /mnt/test/ [root@localhost ~]# vim /etc/fstab
(5)使用mount�Ca命令再检查一次,使用df命令输出结果。
[root@localhost~]# mount -a [root@localhost~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/789-LogVol01 47G 3.5G 41G 8% / tmpfs 491M 224K 491M 1% /dev/shm /dev/sda1 1.9G 37M 1.8G 3% /boot /dev/sr0 3.7G 3.7G 0 100% /mnt/iso /dev/sda5 9.8G 23M 9.3G 1% /mnt/test