Linux文件系统介绍
本文采用Centos7.2
Linux的发行版众多,这是不是意味着我们学习过一个发行版后,如果要使用另一个发行版则要从头开始学习呢?
答案是否定的:因为众多的Linux发行版都采用FHS(Filesystem Hierarchy Standard)这种文件组织形式,类似于Windows操作系统中c盘的文件目录,即c盘下都有Windows、Program File、Program File(x86)等的文件夹。FHS采用树形结构组织文件。
我们来看下Linux的目录结构图:
[root@centos7 /]# lsbin boot dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
从图上我们可以看出两点:
1、文件和目录被组织成一个单根(/)倒置书结构
2、文件系统从根目录下开始,用"/"表示
下面我们来介绍下Linux下文件名规则
1、包括路径在内文件名称最长4095个字节,用/分隔的路径不能超过255个字节
2、Linux下不同的文件有其对应的颜色:
蓝色-->目录、绿色-->可执行文件-->、红色-->压缩文件、浅蓝色-->链接文件
灰色-->其他文件,这里并未一一列出
3、除了斜杠和NUL,所有字符都有效,但使用特殊字符的目录名和文件不推荐使用,
有些字符需要用引号来引用它们。
4、标准Linux文件系统(如EXT4),文件名称大小写敏感。例如:MAIL,Mail,mail不同。
简单说下Linux文件系统结构(摘录于官方文档)
/bin : Essential user command binaries (for use by all users)
/sbin : System binaries
/boot : Static files of the boot loader
/dev : Device files
/etc: Host-specific system configuration
/home : User home directories (optional)
/lib : Essential shared libraries and kernel modules
File | Description |
---|---|
libc.so.* | The dynamically-linked C library (optional) |
ld* | The execution time linker/loader (optional)运行时加载器/链接器 |
module | kernel modules |
/lib<qual> : Alternate format essential shared libraries (optional)
/media : Mount point for removeable media
/mnt : Mount point for a temporarily mounted filesystem
/opt : Add-on application software packages
/root : Home directory for the root user (optional)
/sbin : System binaries
/srv : Data for services provided by this system
/tmp : Temporary files
The /usr Hierarchy Unix System Resource (shared read-only)
Directory | |
---|---|
bin | Most user commands |
include | Header files included by C programs |
lib | Libraries |
local | Local hierarchy (empty after main installation) |
sbin | Non-vital system binaries |
share | Architecture-independent data |
The /var Hierarchy
Directory | Description |
---|---|
cache | Application cache data |
lib | Variable state information |
local | Variable data for /usr/local |
lock | Lock files |
log | Log files and directories |
opt | Variable data for /opt |
run | Data relevant to running processes |
spool | Application spool data |
tmp | Temporary files preserved between system reboots |
/proc:基于内存的虚拟文件系统,用于为内核及进程存储其相关信息
/sys:sysfs 虚拟文件系统提供了一种比 proc 更为理想的访问内核数据的途径
其主要作用在于为管理Linux设备提供一种统一模型的接口
一个应用应用程序的组成部分为:
二进制程序、库文件、配置文件、帮助文件
因此:在Linux系统上,它们所对应的目录分别为:
二进制程序:/bin,/sbin/,usr/bin,/usr/sbin,/usr/local/bin,/usr/local/sbin
库文件:/lib,/lib64,/usr/lib,/usr/lib64
配置文件:/etc,/etc/DIRECTOYR,/usr/local/etc
帮助文件:/usr/share/man,/usr/share/doc,/usr/local/share/man,
/usr/local/share/doc
Linux的哲学思想之一是一切皆文件;因此,我们在使用Linux时绝大部分都是在和文件打交道。shell提供了一套完整的字符串模式匹配规则,我们把它们称为元字符。当shell遇到这些字符时,会把它们当做特殊字符,而不是文件名中普通字符。我们把它们叫做通配符。
下面是常用的文件通配符:
*:匹配任意长度的任意字符
?:匹配任意单个字符
[]:匹配指定范围内的任意单个字符
其中有几个预定于的字符类:
[[:digit:]]:任意数字,相当于0-9
[[:lower:]]:任意小写字母
[[:upper:]]:任意大写字母
[[:alpha:]]:任意大小写字母
[[:alnum:]]:任意数字或字母
[[:space:]]:空格
[[:punct:]]:标点符号
[^]:匹配指定范围外的任意单个字符
查看帮助可以使用
[root@centos7 ~]# man 7 glob
这里给出几个实例来加深大家对文件通配符的理解
1.显示/var/目录下所有以l开头,以一个小写字母结尾,且中间出现一位任意字符的文件或目录
2.显示/etc/目录下,所有以m开头,以非数字结尾的目录或文件
3.显示/etc/目录下,所有以.conf结尾,且以m,n,r,p开头的文件或目录
答案:
[root@centos7 ~]# ls -d /var/l?[[:lower:]]/var/lib /var/log[root@centos7 testdir]# ls -d /etc/m*[^0-9]/etc/machine-id /etc/mail.rc /etc/man_db.conf /etc/mke2fs.conf /etc/modules-load.d /etc/mtab /etc/multipath /etc/my.cnf.d/etc/magic /etc/makedumpfile.conf.sample /etc/maven /etc/modprobe.d /etc/motd /etc/mtools.conf /etc/my.cnf[root@centos7 ~]# ls -d /etc/[mnrp]*.conf /etc/man_db.conf /etc/nfsmount.conf /etc/pbm2ppa.conf /etc/request-key.conf /etc/mke2fs.conf /etc/nsswitch.conf /etc/pnm2ppa.conf /etc/resolv.conf/etc/mtools.conf /etc/numad.conf /etc/radvd.conf /etc/rsyncd.conf
文件系统之索引节点:
1、对一个硬盘进行格式化,实际上就是在硬盘内写入文件系统
2、文件系统将我们的硬盘空间分为元数据区和数据区
3、数据区被分为大小相同的数据块
4、元数据区被分为大小相同的节点,我们称为索引节点(index node)
5、一个节点【inode】(索引节点)是在一个表项,包含有关文件的信息(元数据),包括:
文件类型,权限,UID,GID
链接数(指向这个文件名路径名称个数)
该文件的大小和不同的时间戳
指向磁盘上文件的数据块指针
有关文件的其他数据
我们用一幅图来加深大家都inode的理解:
Linux下查找文件的方式:
对上图做下简单的说明:
例如:我们要查找的文件为/var/log/messages,左边为元数据区(数字代表inode号),右边为数据区
1、/首先可以找到自己的inode号(/为何可以找到,我们这里不做解释)
2、/根inode中的元数据内容指出了/的数据块位置
3、找到/的数据区,内容为/下的所有目录或文件列表及其对应的inode号
4、找到var及其对应的inode号(inode为8 如图)
5、回到inode为8的元数据区,查看var对应的数据块
6、找到var的数据块,var的数据块内容为var下的所有目录或文件列表及其对应的inode号
7、找到log及其对应的inode号(inode为3 如图)
8、回到inode为3的元数据区,查看log对应的数据块
9、找到log的数据块,log的数据块内容为log下的所有目录或文件列表及其对应的inode号
10、找到messages及其对应的inode号(inode为2 如图)
11、回到inode为2的元数据区,查看messages对应的数据块
12、找到messages的数据块;因为messages为文件,所以按其大小会占据多个数据块,
且内容为文本文件或者二进制数据流。
这里我们可以知道:一个目录是目录下的文件名和文件inode号之间的映射(目录不会占用数据块空间)
综上,我们可以考虑下我们在执行cp、rm、mv命令时,磁盘上的数据分别是如何发生变化的。
在执行cp命令时:
分配一个空闲的inode号,在inode表中生成新条目,在目录中创建一个目录项,将名称与inod 编号相关联,拷贝数据生成新的文件
在执行rm命令时
链接数递减,从而释放的inode号可以被重用,把数据块放在空闲列表中,删除目录项。
数据实际上不会马上被删除,但当另一个文件使用数据块时将被覆盖
在执行mv命令时
用新的文件名创建对应新的目录项
删除旧目录条目对应的旧的文件名
不影响inode表(除时间戳)或磁盘上的数据位置,没有数据被移动
如果目标和源在一个不同的文件系统,mv相当于cp和rm
当我们用ls -l 查看文件时,发现其文件类型开头为"l"我们称这类文件为链接文件
[root@centos7 ~]# ls -l /binlrwxrwxrwx. 1 root root 7 Jul 21 02:46 /bin -> usr/bin
同时,链接文件又分为:软链接和硬链接
我们仍然使用文件系统来说明软链接和硬链接的概念及其区别:
软链接
从图上我们可以看出,文件的查找方式是一样的:
但是,当查找到/bin/的inode时,其元数据区存储的并不是/bin所对应的数据块位置而仅仅是一个路径名称,就是它所指向的真实文件的路径名称,然后按照这个路径重新开始找。
[root@centos7 ~]# ls -l /binlrwxrwxrwx. 1 root root 7 Jul 21 02:46 /bin -> usr/bin[root@centos7 ~]# ls -ld /usr/bindr-xr-xr-x. 2 root root 40960 Jul 29 19:47 /usr/bin
/bin目录大小仅仅为7个字节
/usr/bin目录为大概为40K
对此我们做个总结:
1、一个符号链接指向另一个文件
2、ls -l的显示链接的名称和引用的文件
3、一个符号链接的内容是它引用文件的名称
4、可以对目录进行
5、可以跨分区
6、指向的是另一个文件的路径;其大小为指向的路径字符串的长度;不增加或减少目标文件inode的引用计数;
语法:
ln -s filename [linkname]
硬链接
从图可以看出 /file1.txt和/root/file2.txt有其相同的inode号 即:指向相同的数据块,
相当于同一个文件,只是多了一条访问路径;
[root@centos7 /]# ls -ld file1.txt file2.sh -rw-r--r--. 2 root root 12 Jul 29 11:42 file1.txt-rw-r--r--. 2 root root 12 Jul 29 11:42 file2.sh
总结:
1、创建硬链接会增加额外的记录项以引用文件
2、对应于同一文件系统上一个物理文件
3、每个目录引用相同的inode号
4、创建时链接数递增
5、删除文件时:
rm命令递减计数的链接
文件要存在,至少有一个链接数
当链接数为零时,该文件被删除
6、不能跨越驱动器或分区
语法:
ln filename [linkname]