一、什么是文件系统
计算机的文件系统是一种存储和组织计算机数据的方法,它使得对其访问和查找变得容易,文件系统使用文件和树形目录的抽象逻辑概念代替了硬盘和光盘等物理设备使用数据块的概念,用户使用文件系统来保存数据不必关心数据实际保存在硬盘(或者光盘)的地址为多少的数据块上,只需要记住这个文件的所属目录和文件名。在写入新数据之前,用户不必关心硬盘上的那个块地址没有被使用,硬盘上的存储空间管理(分配和释放)功能由文件系统自动完成,用户只需要记住数据被写入到了哪个文件中。
二、文件系统的组成元素
文件名:在文件系统中,文件名是用于定位存储位置。
元数据(Metadata):其它文件保存信息常常伴随着文件自身保存在文件系统中。文件长度可能是分配给这个文件的区块数,也可能是这个文件实际的字节数。文件最后修改时间也许记录在文件的时间戳中。有的文件系统还保存文件的创建时间,最后访问时间及属性修改时间。(不过大多数早期的文件系统不记录文件的时间信息)其它信息还包括文件设备类型(如:区块数,字符集,套接口,子目录等等),文件所有者的ID,组ID,还有访问权限(如:只读,可执行等等)。
数据(Data):实际存放的内容
安全访问:针对基本文件系统操作的安全访问可以通过访问控制列表或capabilities实现。研究表明访问控制列表难以保证安全,这也就是研发中的文件系统倾向于使用capabilities的原因。然而目前多数商业性的文件系统仍然使用访问控制列表。
三、文件系统的分类
a.磁盘文件系统:磁盘文件系统是一种设计用来利用数据存储设备来保存计算机文件的文件系统,最常用的数据存储设备是磁盘驱动器,可以直接或者间接地连接到计算机上。例如:FAT、exFAT、NTFS、HFS、HFS+、ext2、ext3、ext4、ODS-5、btrfs。有些文件系统是进程文件系统(也有译作日志文件系统)或者追踪文件系统。
b.闪存文件系统:闪存文件系统是一种设计用来在闪存上储存文件的文件系统。
c.数据库文件系统:文件管理方面的一个新概念是一种基于数据库的文件系统的概念。不再(或者不仅仅)使用分层结构管理,文件按照他们的特征进行区分,如文件类型、专题、作者或者亚数据进行区分。于是文件检索就可以按照SQL风格甚至自然语言风格进行。
d.网络文件系统:网络文件系统(NFS,Network File System)是一种将远程主机上的分区(目录)经网络挂载到本地系统的一种机制。
说明:随着Linux的不断发展,它所支持的文件格式系统也在迅速扩充,Linux系统核心可以支持十多种文件系统类型:Btrfs、JFS、ReiserFS、ext、ext2、ext3、ext4、XFS、ISO 9660、XFS、Minx、MSDOS、UMSDOS、VFAT、NTFS、HPFS、NFS、SMB、SysV、PROC等。 注意:部分Linux发行版默认不支持NTFS文件系统,解决方法是安装ntfs-3g或ufsd等NTFS驱动程序。部分Linux发行版对NTFS的支持度并不高。
四、文件系统结构:
/boot:引导文件存放目录,内核文件(vmlinuz)、引导加载器 (bootloader, grub)都存放于此目录
/bin:供所有用户使用的基本命令;不能关联至独立分区, OS启动即会用到的程序
/sbin:管理类的基本命令;不能关联至独立分区, OS启动即 会用到的程序
/lib:启动时程序依赖的基本共享库文件以及内核模块文件 (/lib/modules)
/lib64:专用于x86_64系统上的辅助共享库文件存放位置
/etc:配置文件目录
/home/USERNAME:普通用户家目录
/root:管理员的家目录
/media:便携式移动设备挂载点
/mnt:临时文件系统挂载点
/dev:设备文件及特殊文件存储位置
b: block device,随机访问
c: character device,线性访问
/opt:第三方应用程序的安装位置
/srv:系统上运行的服务用到的数据
/tmp:临时文件存储位置
/usr:Unix Software Resource universal shared, read-only data
bin: 保证系统拥有完整功能而提供的应用程序
sbin:
lib: 32位使用
lib64:只存在64位系统
include: C程序的头文件(header files)
share:结构化独立的数据,例如doc, man等
local:第三方应用程序的安装位置
bin, sbin, lib, lib64, etc, share
/var: variable data files cache: 应用程序缓存数据目录 lib: 应用程序状态信息数据 local:专用于为/usr/local下的应用程序存储可变数据; lock: 锁文件 log: 日志目录及文件 opt: 专用于为/opt下的应用程序存储可变数据; run: 运行中的进程相关数据;通常用于存储进程pid文件 spool: 应用程序数据池 tmp: 保存系统两次重启之间产生的临时数据
/proc: 用于输出内核与进程信息相关的虚拟文件系统
/sys:用于输出当前系统上硬件设备相关信息虚拟文件系统
/selinux: security enhanced Linux, selinux相关的安全策 略等信息的存储位置
五、Linux上的应用程序的组成部分
二进制程序: /bin, /sbin, /usr/bin, /usr/sbin, /usr/local/bin, /usr/local/sbin
库文件: /lib, /lib64, /usr/lib, /usr/lib64, /usr/local/lib, /usr/local/lib64
配置文件: /etc, /etc/DIRECTORY, /usr/local/etc
帮助文件: /usr/share/man, /usr/share/doc, /usr/local/share/man, /usr/local/share/doc
六、Linux下的文件类型及文件命名规则
文件类型:
其实在Linux系统中主要就是两种文件,一种是常规文件(regular file),另一种就是目录(directory)。开始可能觉得很奇怪,目录怎么会是文件呢?其实目录只是存储了该目录下的文件或子目录的名称和对应i-node(包含了基本上关于对应文件所有信息的结构)的编号的一个特殊文件而已。当然,除了上述的两种文件类型,还有:块设备文件(Block special device),字符设备文件(character special device),FIFO(管道),Socket(套接字),Symbolic link(符号链接)这几种文件类型。具体的在这里就不展开了。如在上图中第一位为‘-’,则表示该文件为常规文件,其他类型的文件通过该位显示的字符应该也很容易判断出来。
-:普通文件
d: 目录文件
b: 块设备
c: 字符设备
l: 符号链接文件
p: 管道文件pipe
s: 套接字文件socket
蓝色-->目录 绿色-->可执行文件 红色-->压缩文 件 浅蓝色-->链接文件 灰色-->其他文件
文件命名规则:
包括路径在内文件名称最长4095个字节,用/分隔的路径不能超过255个字节。除了斜杠和NUL,所有字符都有效.但使用特殊字符的目录名和文件不推荐使用,有些字符需要用引号来引用它们。标准Linux文件系统(如ext4),文件名称大小写敏感。例如: MAIL, Mail, mail, mAiL
文件权限:
下面我们就来看看后9位字符代表的意思。说是9位,其实我们把它们分成3组,每组代表的意思是差不多的。我们都知道Linux系统是一个多用户的系统,所以对于一个文件而言,可能有除创建者以外的其他人想要对文件进行操作。这时我们就有必要对文件的操作权限进行设置了。这三组字符从左到右针对的对象依次是文件的创建者(user),文件创建者的同组成员(group),除以上二者以外的其他用户(others)。而每组的3个字符,从左到右依次显示为 rwx 其中r代表读的权限,w代表写的权限,x代表可执行的权限。如下图所示,我想读一个名字叫new的文件,但是它的所有权限都被屏蔽了。当我输入命令: more new的时候,shell就会提示权限不足。对于其他操作也可类推获得。但是在Linux中有一个神一般存在的用户,就是传说中的root或者叫超级用户(superuser)。它有对系统的一切权限,可以对任意文件进行操作,所以之前提到的那些限制对它是没有效果的。
链接数:
再往右显示的数字1代表的是,该文件有1个链接。其中链接又分硬链接(hard link)和符号链接(symbolic link)两种类型。此处显示的应为硬链接数。其中硬链接是直接执行文件对应的inode的,而符号链接则没有,它只是包含了所链接文件的位置信息,类似于windows中的快捷方式。需要注意的是,很多时候,你所谓的删除一个文件,只是删除了该文件的一个链接。想要真正删除一个文件的内容,必须满足两个条件:1.文件的链接数为0。2.没有进程打开该文件。
UID和GID:
前面已经说过了,一个文件肯定是由一个用户创建的。那么自然在文件信息中需要保存,该文件的创建者,也就是user-ID简称UID,同时还有该创建者所在组的ID,group-ID,简称GID。所以接下来显示的monster monster就分别对应了文件创建者monster和monster所在的组。
文件大小:
然后显示的就是对应文件的大小了,例子中的文件大小显示的是0,单位是字节。需要注意的是:如果文件的类型是字符链接,那么它的大小就是它所执行的文件的文件名的字符数。
文件时间:
接下来显示的就是文件时间了。对于一个文件,一般保存了3个时间:1.st_mtime,上一次文件修改的时间(modification time),2.st_atime,上一次文件打开的时间(access time)3.st_ctime,上一次文件状态改变的时间(changed status time)。其中最令人困惑的肯定是st_mtime和st_ctime,文件修改了,那状态不就改变了么?状态改变,那肯定就是文件修改了啊?其实不是这样的,第一个st_mtime指的是文件内容的修改,而st_ctime的状态指的是文件对应的inode中存储的 信息的改变,例如各种权限啊,UID,GID等等。所以说是完全不一样的。
文件名:
显示在最后的自然就是文件名,对于文件名想说的是,它并不保存在文件对应的inode当中,而是保存在对应的目录文件中。这就引发了一个非常有意思的现象,就是我们想要删除一个文件的时候,我们并不需要该文件的任何权限,而是需要该文件所在目录的写权限和执行权限。因为我们删除一个文件就是要将减少该文件对应inode的链接数,并将文件名从对应的目录文件中去掉。
文件系统的建立
linux mkfs
指令:mkfs
使用权限 : 超级使用者
使用方式 : mkfs [-V] [-t fstype] [fs-options] filesys [blocks] [-L Lable]
说明 : 建立 linux 档案系统在特定的 partition 上
参数 :
device : 预备检查的硬盘 partition,例如:/dev/sda1
-V : 详细显示模式
-t : 给定档案系统的型式,Linux 的预设值为 ext2
-c : 在制做档案系统前,检查该partition 是否有坏轨
-l bad_blocks_file : 将有坏轨的block资料加到 bad_blocks_file 里面
block : 给定 block 的大小
-L:建立lable
补充说明:
mkfs本身并不执行建立文件系统的工作,而是去调用相关的程序来执行。例如,若在"-t" 参数中指定ext2,则
mkfs会调用mke2fs来建立文件系统.使用时如省略指定【块数】参数,mkfs会自动设置 适当的块数.
例子 :
在 /dev/hda5 上建一个 msdos 的档案系统,同时检查是否有坏轨存在,并且将过程详细列出来 :
mkfs -V -t msdos -c /dev/hda5
mfks -t ext3 /dev/sda6 //将sda6分区格式化为ext3格式
mkfs -t ext2 /dev/sda7 //将sda7分区格式化为ext2格式
扩展知识:mkfs的使用示例
[root@localhost beinan]# mkfs -t 文件系统 存储设备
注:
这里的文件系统是要指定的,比如 ext3 ;reiserfs ;ext2 ;fat32 ;msdos 等... ...
设备比如是一个硬盘的分区,软盘,光驱等.. ... 在格式化分区之前,您得懂得如何查看硬盘分区情况,并有针对性的格式化;比如用 fdisk -l 来查看; 请参考:《Linux 查看磁盘分区、文件系统、使用情况的命令和相关工具介绍》 比如我想格式化一个移动U盘中的一个分区;全景应该是:
[root@localhost beinan]# fdisk -l
Disk /dev/hda: 80.0 GB, 80026361856 bytes
255 heads, 63 sectors/track, 9729 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/hda1 * 1 765 6144831 7 HPFS/NTFS
/dev/hda2 766 2805 16386300 c W95 FAT32 (LBA)
/dev/hda3 2806 9729 55617030 5 Extended
/dev/hda5 2806 3825 8193118+ 83 Linux
/dev/hda6 3826 5100 10241406 83 Linux
/dev/hda7 5101 5198 787153+ 82 Linux swap / Solaris
/dev/hda8 5199 6657 11719386 83 Linux
/dev/hda9 6658 7751 8787523+ 83 Linux
/dev/hda10 7752 9729 15888253+ 83 Linux
Disk /dev/sda: 1035 MB, 1035730944 bytes
256 heads, 63 sectors/track, 125 cylinders
Units = cylinders of 16128 * 512 = 8257536 bytes
Device Boot Start End Blocks Id System
/dev/sda1 1 25 201568+ 83 Linux
/dev/sda2 26 125 806400 5 Extended
/dev/sda5 26 50 201568+ 83 Linux
/dev/sda6 51 76 200781 83 Linux
我们可以看到有sda这个设备,所以可以用 fdisk -l /dev/sda专门来显示他的分区情况;比如我想格式化 /dev/sda6 分区为 ext3文件系统,则为:
[root@localhost beinan]# mkfs -t ext3 /dev/sda6
mke2fs 1.37 (21-Mar-2005)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
50200 inodes, 200780 blocks
10039 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=67371008
25 block groups
8192 blocks per group, 8192 fragments per group
2008 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: 注:在这里直接回车;
done
This filesystem will be automatically checked every 26 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
这样就格式化好了,sda6现在就是ext3文件系统了;我们就可以用mount 加载这个分区,然后使用这个文件系统;
[root@localhost beinan]# mkdir /mnt/sda6
[root@localhost beinan]# chmod 777 /mnt/sda6
[root@localhost beinan]# mount /dev/sda6 /mnt/sda6
当然您也可以把分区格式化成其它的文件系统;比如我们把 /dev/sda6格式化为ext3 、ext2、reiserfs、fat32、msdos 文件系统,命令格式如下;
[root@localhost beinan]# mkfs -t ext3 /dev/sda6
[root@localhost beinan]# mkfs -t ext2 /dev/sda6
[root@localhost beinan]# mkfs -t reiserfs /dev/sda6
[root@localhost beinan]# mkfs -t fat32 /dev/sda6
[root@localhost beinan]# mkfs -t msdos /dev/sda6
... ...
2)mkfs.ext3 mkfs.reiserfs mkfs.ext2 mkfs.msdos mkfs.vfat mke2fs 的介绍;
我们先说了一个mkfs 工具后,我们再来介绍 mkfs.ext3 mkfs.reiserfs mkfs.ext2 mkdosfs mkfs.msdos mkfs.vfat ,其实mkfs 在执行的命令的时候,也是调用的这个工具,这也是我先把mkfs介绍的主要原因; 通过文件名,我们就知道这些工具是支持什么文件系统;这些命令为我们提供了更多的方便;
[root@localhost beinan]# mkfs.ext3 /dev/sda6 注:把该设备格式化成ext3文件系统
[root@localhost beinan]# mke2fs -j /dev/sda6 注:把该设备格式化成ext3文件系统
[root@localhost beinan]# mkfs.ext2 /dev/sda6 注:把该设备格式化成ext2文件系统
root@localhost beinan]# mke2fs /dev/sda6 注:把该设备格式化成ext2文件系统
[root@localhost beinan]# mkfs.reiserfs /dev/sda6 注:把该设备格式化成reiserfs文件系统
[root@localhost beinan]# mkfs.vfat /dev/sda6 注:把该设备格式化成fat32文件系统
[root@localhost beinan]# mkfs.msdos /dev/sda6 注:把该设备格式化成fat16文件系统,msdos文件系统就是fat16;
[root@localhost beinan]# mkdosfs /dev/sda6 注:把该设备格式化成fat16文件系统,同mkfs.msdos
... ...
2)mkswap 把一个分区格式化成为swap交换区;
[root@localhost beinan]# mkswap /dev/sda6 注:创建此分区为swap 交换分区
[root@localhost beinan]# swapon /dev/sda6 注:加载交换分区;
[root@localhost beinan]# swapoff /dev/sda6 注:关闭交换分区;
我们查看系统已经加载的swap交换分区;
[root@localhost beinan]# swapon /dev/sda6 注:加载交换分区;
[root@localhost beinan]# swapon -s
Filename Type Size Used Priority
/dev/hda7 partition 787144 0 -1
/dev/sda6 partition 225144 0 -3
<code>
为什么我的系统有两个交换分区?因为我用移动U盘做的实验,主要是为写教程之用;sda6是我在U盘上建的swap分区;
如果让swap开机就加载,应该改 /etc/fstab文件,加类似如下一行;
<code>
/dev/sda6 swap swap defaults 0 0 注:把此行中的/dev/hda7 改为您的交换分区就行;
或者把命令行直接写入 /etc/rc.d/rc.local中也行;
swapon /dev/sda6
如果您的硬盘不能再分区,您可以创建一个swap文件
[root@localhost beinan]# dd if=/dev/zero of=/tmp/swap bs=1024 count=524288 注:创建一个大小为512M 的swap 文件,在/tmp目录中;您可以根据自己的需要的大小来创建swap 文件;
读入了 524288+0 个块
输出了 524288+0 个块
[root@localhost beinan]# mkswap /tmp/swap 注:把/tmp/swap 文件,创建成swap 交换区
Setting up swapspace version 1, size = 536866 kB
no label, UUID=d9d8645d-92cb-4d33-b36e-075bb0a2e278
[root@localhost beinan]# swapon /tmp/swap 注:挂载swap
[root@localhost beinan]# swapon -s
Filename Type Size Used Priority
/dev/hda7 partition 787144 888 -1
/tmp/swap file 524280 0 -2
注意:其实我们在安装系统的时候,就已经划分了交换分区;查看/etc/fstab,应该swap的行;如果您在安装系统时没有添加swap,可以通过这种办法来添加
在/dev/hda5
上建一个msdos的档案系统,同时检查是否有坏轨存在,并且将过程详细列出来:
mkfs -V -t msdos -c /dev/hda5
mkfs -t ext3 /dev/sda6 //将sda6分区格式化为ext3格式
mkfs -t ext2 /dev/sda7 //将sda7分区格式化为ext2格式
格式化
mke2fs 选项 分区名(文件系统名) make ext2 file system(命令默认格式化为ext2)
-b 指定block的大小{1024k|2048k|4096k}
-c 检测磁盘坏块
-j 加入日志功能,即格式化成ext3
-L 分区标签lable指定
-i byte/inode byte-per-inode 多少字节分配一个节点
-n 指明节点的个数
-m 指明管理空间 默认为5%
分区属性修改 tunable ext2 file system 调节ext2文件系统(在不重新格式化的情况下对分区属性进行修改)
tune2fs 选项 分区名(文件系统名)
-j 加入日志功能
-L 重新加卷标
-l 查看super block中信息
-i 指定自检周期(0或-1关闭)可以按时间和挂载次数所谓度量标准
-m 调整管理空间
-c 指定挂载N此后自检
-o 设定分区默认挂载选项
手动发起自检
fsck 选项 分区名(文件系统名)
-t 手动发起自检
-a 遇到错误时自动修复
fuser命令
查看当前正在占用文件系统、服务的进程
-v 详细显示
-m 所有使用文件系统的进程
-k 杀死进程、踢出用户
blkid 文件系统的UUID
/dev/mapper/vol0-home: UUID="c24712e8-e628-4812-b39a-fc61a00fbc26" TYPE="ext3"
/dev/mapper/vol0-root: UUID="4fc1b7c4-8342-4ad6-9ee1-8ad5a4c3893d" TYPE="ext3"
/dev/sda3: LABEL="SWAP-sda3" TYPE="swap"
/dev/sda1: LABEL="/boot" UUID="65a27343-1a4a-4b7a-b60d-5d8366bea062" TYPE="ext3"
mount 文件系统的挂载信息
/dev/mapper/vol0-root on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/mapper/vol0-home on /home type ext3 (rw)
df –lh磁盘使用率、挂载信息
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vol0-root
29G 2.4G 25G 9% /
/dev/mapper/vol0-home
1.9G 37M 1.8G 2% /home
/dev/sda1 99M 21M 74M 22% /boot
tmpfs 252M 0 252M 0% /dev/shm
/dev/sda5 9.2G 150M 8.6G 2% /mnt/sda5
df –ilh磁盘inode使用率、挂载信息
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/mapper/vol0-root
7.4M 101K 7.3M 2% /
/dev/mapper/vol0-home
496K 342 496K 1% /home
/dev/sda1 26K 36 26K 1% /boot
tmpfs 63K 1 63K 1% /dev/shm
/dev/sda5 1.2M 11 1.2M 1% /mnt/sda5
free –m 查看内存缓存虚拟内存使用情况
total used free shared buffers cached
Mem: 503 228 274 0 39 105
-/+ buffers/cache: 83 419
Swap: 509 0 509
dumpe2fs 显示文件系统块组信息
虚拟内存
通过fdisk建立swap属性的文件系统(t选项 选择id=81的swap)
使用mkswap命令进行格式化
swapon 挂载虚拟内存
-a挂载所有虚拟内存
swapoff卸载虚拟内存
另附一篇很详细的文件系统管理的文章
https://blog.csdn.net/freeking101/article/details/78223455?locationNum=3&fps=1