一、文件属性概况
Linu系统中的文件和目录的属性主要包括:
- 索引节点(inode)
- 文件类型
- 权限属性
- 连接数
- 所归属的用户和用户组
- 最近的修改时间
...
可以通过 ls -lhi(ls -li与其区别是文件大小表示不同) 命令查看:
[root@localhost project]# ls -lhi
total 0
25537624 -rw-r--r-- 1 root root 0 Oct 26 23:05 1.txt
25542507 drwxr-xr-x. 2 root root 6 Oct 13 22:58 test1
2890 drwxr-xr-x. 3 root root 47 Oct 10 22:03 test3
17290833 drwxr-xr-x. 2 root root 6 Oct 13 21:20 test4
25542468 drwxr-xr-x. 2 root root 6 Oct 13 21:43 test5
其上每一列说明如下:
其中:
- 第一列为inode索引号
- 第二列为文件类型和权限(第1个字符为文件类型,2-10为权限)
- 第三列为硬连接个数(通过ln命令创建)
- 第四列为文件或目录的属主和属组
- 第五列为文件或目录的大小
- 第六列为文件或目录最近的修改时间
- 第七列为文件或目录的名称
举例说明:
[root@localhost etc]# ls -lhi sysconfig/kdump 25399276 -rw-r--r--. 1 root root 1.5K Nov 7 2016 sysconfig/kdump
- inode索引号为25399276
- 文件类型为普通文件,因为第二列第一个字符为“-”
- 文件权限是第二列(2-10个字符查看),属主可读、可写、可执行(rw-),文件归属用户组可读(r--),其它用户可读(r--)
- 硬连接个数为1(就是它本身)
- 属主为root,属组为root
- 文件大小为1.5k
- 最近修改时间为Nov 7 2016
- 文件名为kdump
二、inode与block
Linux的存储设备被格式化为文件系统后会被分为两部分:
- inode(索引节点)
- block
其中inode是用来存储数据属性(文件类型、属主、文件大小等)信息的,但是不包含文件名;block是用来存储数据的。inode除了存储属性外,还会进行文件的索引,所以就产生了inode值,这也就是通过inode快速查找文件实体内容。
举个例子就是inode相当于书的目录,block相当于每一页的内容,通过目录可以快速的翻到那一页的内容。通过 ls -li 既可以查看到inode信息:
[root@localhost project]# ls -li
total 0
25537624 -rw-r--r-- 1 root root 0 Oct 26 23:05 1.txt
25542507 drwxr-xr-x. 2 root root 6 Oct 13 22:58 test1
2890 drwxr-xr-x. 3 root root 47 Oct 10 22:03 test3
17290833 drwxr-xr-x. 2 root root 6 Oct 13 21:20 test4
25542468 drwxr-xr-x. 2 root root 6 Oct 13 21:43 test5
其中第一列就是inode的值。inode存放的是文件的属性信息,所以它是有大小的。inode的大小是在文件系统被格式化就无法更改的,系统会根据磁盘大小自动给一个合适的大小(128或者256字节)。可以通过以下命令查看各分区inode的大小以及占用情况:
[root@localhost project]# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda3 6712832 32055 6680777 1% /
devtmpfs 230957 377 230580 1% /dev
tmpfs 233408 1 233407 1% /dev/shm
tmpfs 233408 447 232961 1% /run
tmpfs 233408 16 233392 1% /sys/fs/cgroup
/dev/sda1 102400 330 102070 1% /boot
tmpfs 233408 1 233407 1% /run/user/0
对于block系统也会给一个默认值(1k~4k),最大为4k,也就是说超过4k大小的文件,最少都需要两个以上的block来盛放它。
一个block只能存放一个文件的内容,尽管这个block没有放满,新的文件也需要重新打开block来存放,block的大小需要根据具体的业务需求来适当的给定:
- 对于业务中小文件比较多的需求,block小一些比较好,这样比较省空间,否则容易造成空间浪费;当然不利的就是读取效率低(磁盘I/O高)
- 对于业务中大文件比较多的需求,block大一些比较好,这样效率比较高,因为减少了磁盘的I/O读写
总之,block分大了容易造成空间浪费,分小了影响磁盘性能,在实际业务中应该根据当前需求来应对。Inode和block在磁盘格式化文件系统时可以指定其大小,一般也不太需要这样做。
有时候,通过命令 df -h 查看磁盘空间没满,但是已经存不进数据了,这种情况是Inode已经耗尽了。所以确定一个磁盘分区究竟能放入多少个文件,需要分情况:
- Inode先耗尽,以Inode来计算文件的个数
- block先耗尽,以block来计算文件的个数(根据文件大小与block大小比较),如果文件大小小于block大小,文件个数就是block个数
三、文件类型
(一)文件类型介绍
在Windows系统中,文件的扩展名就可以代表文件的类型,比如:
- jpeg、png等扩展名就是图片类型
- doc、docx等扩展名就是文档类型
- mp4、avi等扩展名就是视频类型
...
但是在Linux中文件类型与扩展名没有任何关系,之所以Linux中的文件有扩展名也是为了兼容Windows中用户的习惯。那么Linux中是如何查看文件类型呢?
(二)文件类型的种类
通过执行 ls -l 或者 ls -al 查看:
[root@localhost /]# ls -l total 20 lrwxrwxrwx. 1 root root 7 Oct 1 14:26 bin -> usr/bin dr-xr-xr-x. 4 root root 4096 Oct 1 14:46 boot drwxr-xr-x 19 root root 3180 Oct 26 22:43 dev drwxr-xr-x. 78 root root 8192 Oct 26 22:43 etc drwxr-xr-x. 4 root root 32 Oct 11 22:27 home lrwxrwxrwx. 1 root root 7 Oct 1 14:26 lib -> usr/lib lrwxrwxrwx. 1 root root 9 Oct 1 14:26 lib64 -> usr/lib64 drwxr-xr-x. 2 root root 6 Nov 5 2016 media ...
可以看到结果中的第一列一共有10个字符,其中2-10个字符是和权限相关的,第一个字符就是文件类型可以看到目前有l(符号链接类型)和d(目录类型)。当然Linux中还有其它一些类型,总的来说分文以下几类:
- 普通文件(-)
- 目录文件(d)
- 字符设备或块设备文件(c/b)
- 套接口文件(s)
- 符号链接文件(l)
- 管道文件(p)
(三)文件类型详解
1、普通文件
通过ls -l查看文件属性:
[root@localhost project]# ls -l total 0 -rw-r--r-- 1 root root 0 Oct 26 23:05 1.txt
可以看到第一列第一个字符是“-”,这就是表示该文件类型是普通文件,一般通过touch、echo、tar等命令创建的文件。
2、目录文件
[root@localhost project]# ls -l total 0 -rw-r--r-- 1 root root 0 Oct 26 23:05 1.txt drwxr-xr-x. 2 root root 6 Oct 13 22:58 test1 drwxr-xr-x. 3 root root 47 Oct 10 22:03 test2
第一列第一个字符是“d”,表示该文件类型是目录文件,创建目录通过mkdir或者cp(-r或者-a参数)命令创建或者复制目录。那么如何通过名称来区分是文件还是目录呢?
[root@localhost project]# ls -F 1.txt test1/ test3/ test4/ test5/
通过 ls -F命令可以查看,如果名称后面跟着的是“/”那么就是目录,以此可以进行文件或者目录的过滤。
# 方法一 [root@localhost project]# ls -F | grep "/$" test1/ test3/ test4/ test5/ # 方法二 [root@localhost project]# ls -l | grep "^d" drwxr-xr-x. 2 root root 6 Oct 13 22:58 test1 drwxr-xr-x. 3 root root 47 Oct 10 22:03 test3 drwxr-xr-x. 2 root root 6 Oct 13 21:20 test4 drwxr-xr-x. 2 root root 6 Oct 13 21:43 test5
3、字符设备及块设备
[root@localhost ~]# ll -l /dev/tty* crw-rw-rw- 1 root tty 5, 0 Oct 27 21:06 /dev/tty crw--w---- 1 root tty 4, 0 Oct 27 21:06 /dev/tty0 crw--w---- 1 root tty 4, 1 Oct 27 21:06 /dev/tty1 crw--w---- 1 root tty 4, 10 Oct 27 21:06 /dev/tty10 ...
在/dev下的上面的文件是第一个字符是以“c”开头,这种类型就是字符设备文件,是串行端口的接口设备。
[root@localhost ~]# ll -l /dev/sda* brw-rw---- 1 root disk 8, 0 Oct 27 21:06 /dev/sda brw-rw---- 1 root disk 8, 1 Oct 27 21:06 /dev/sda1 brw-rw---- 1 root disk 8, 2 Oct 27 21:06 /dev/sda2 brw-rw---- 1 root disk 8, 3 Oct 27 21:06 /dev/sda3
上面的第一列的第一个字符是以“b”开头,这种文件类型是块设备文件,存储数据使用的接口设备,比如硬盘、光驱等。
4、套接口文件
假如安装了MySQL服务,它是有这个mysql.sock文件的,该文件属性的第一个字符是“s”,这类文件通常用于数据连接,比如MySQL服务启动后监听3306端口的请求连接,MySQL客户端通过mysql.sock套接字文件连接MySQL服务端。
5、符号链接文件
[root@localhost ~]# ll / total 20 lrwxrwxrwx. 1 root root 7 Oct 1 14:26 bin -> usr/bin dr-xr-xr-x. 4 root root 4096 Oct 1 14:46 boot drwxr-xr-x 19 root root 3180 Oct 27 21:06 dev drwxr-xr-x. 78 root root 8192 Oct 27 21:06 etc drwxr-xr-x. 4 root root 32 Oct 11 22:27 home lrwxrwxrwx. 1 root root 7 Oct 1 14:26 lib -> usr/lib lrwxrwxrwx. 1 root root 9 Oct 1 14:26 lib64 -> usr/lib64 ...
符号链接文件通过“l”来表示,可通过ln命令创建软连接进行实现。
6、管道文件
[root@localhost ~]# find / -type p|xargs ls -l prw------- 1 root root 0 Oct 27 21:06 /run/systemd/inhibit/1.ref prw------- 1 root root 0 Oct 27 21:06 /run/systemd/initctl/fifo prw------- 1 root root 0 Oct 27 21:19 /run/systemd/sessions/2.ref
管道文件属性的第一个字符是“p”,也就是说管道文件的类型是使用p来表示的。它是用来解决多个程序访问同一个文件所造成的错误问题。
(四)文件扩展名
Linux下文件扩展名没什么太大的实际意义,但是为了兼顾Windows下用户习惯,不同的文件类型还是会用不同的扩展名来表示。比如:
- .conf 配置文件
- .rpm rpm安装包文件
- .tar、.tgz、.zip、.gz、.bz2等均是压缩文件
- .py、.pl、.php、.html/htm等是脚本或者程序文件
...
四、文件权限
第二列共10个字符,其中第1个字符已经说明为文件类型,第2-9个字符文件权限,这里详细说明一下文件权限:
权限位共9个字符被分成3组,每3个字符一组,分别对应的是属主的权限位、属组的权限位以及其它用户的权限位,其中:
- r表示对该文件持有可读权限
- w表示对该文件持有可写权限
- x表示如果该文件为可执行文件,就是拥有该文件的可执行权限
- -表示对该文件无任何权限
五、用户和用户组
Linux系统可以进行多用户同时登陆,多个用户可以通过ssh工具同时登录Linux处理不同的任务,所以Linux中有很多用户,但是为了进行用户管理以及用户权限的管理,就涉及到用户角色与用户组。
(一)用户、角色管理
在Linux中不同角色的用户,其拥有的权限是不同,通过uid与gid来进行识别:
uid | 角色 | 用户特性 |
0 | 超级用户 | 如果设置一个用户为超级用户,可以修改uid为0,但尽量不要这样做,可以使用sudo代替 |
1-499 | 虚拟用户 | 这个返回的uid是给系统使用的uid,避免人为创建的uid与系统的uid冲突 |
500-65535 | 普通用户 | 当使用useradd命令创建用户时,其uid就从500开始的 |
系统中为什么会有虚拟用户呢?因为系统运行服务时是需要用户角色的,比如运行httpd等服务都是在一个用户角色下运行的,所以系统会默认创建这样一个角色。再比如运行MySQL服务时,也会创建一个用户角色用于专门运行MySQL服务,当然这个角色可以没有登录系统的权限:
# 添加用户组 [root@localhost etc]# groupadd mysql -g 51 # 添加用户mysql,并且指定属于mysql用户组 [root@localhost etc]# useradd mysql -u 51 -s /sbin/nologin -g mysql
(二)用户组管理
用户组就是具有相同特性用户的集合,它的作用就是方便用户权限的管控,只需要将权限分配给用户组,然后再将用户分配到某一组即可。用户和组的关系:
- 一对一 一个用户可以属于一个用户组
- 一对多 一个用户可以属于多个用户组
- 多对一 多个用户可以属于一个用户组
- 多对对 多个用户可以属于多个用户组
用户和用户组是有配置文件,相关文件有:/etc/passwd、/etc/shadow、/etc/group、/etc/gshadow
1、/etc/passwd(用户基本配置文件)
[root@localhost ~]# vim /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown ...
该配置文件中每一行表示一个账户信息,其中每一行有7列,中间以“:”分割:
列(字段) | 说明 | 举例 |
账号名称 | 用户的账号名称,唯一的 | root |
账号密码 | 出于安全考虑,该地方使用x代替,实际密码放置于/etc/shadow文件中 | x |
uid | 用户账号uid,范围为0-65535 | 0 |
gid | 用户组,创建用户时默认创建一个同名的用户组,gid的范围为0-65535 | 0 |
用户说明 | 该字段是对该用户的描述说明 | root |
用户家目录 | 用户登录后首先进入的目录,一般与用户名相同的目录 | /root |
shell解释器 | 当前用户登录后使用的shell解释器,默认的shell为bash | /bin/bash |
2、/etcshadow
该文件是用户存放系统账户密码的文件,那么为什么要分开放呢?因为每个用户登录都需要取得uid和gid用户判断权限,这样/etc/passwd文件的权限为644,所有的用户都是可读的,这样带来安全隐患。所以系统就把加密后的密码存放于/etc/shadow文件中。
[root@localhost ~]# vim /etc/shadow root:$6$4njBFoI9/wZMbi35$Je3wm9auNKcYCfbjFkyWdhkC65NTrTMXtDFQxy
NLW3vJd9LIu/rkkQzBzRp86CKqY94.nnQZMaKlMU0n3NDfV.::0:99999:7::: bin:*:17110:0:99999:7::: daemon:*:17110:0:99999:7::: adm:*:17110:0:99999:7::: lp:*:17110:0:99999:7::: ...
该文件中每一行表示一个账户的密码信息,每一行中间以“:”隔离,共有9列:
列(字段) | 说明 | 举例 |
账号名称 | 用户的账号名称,唯一的 | root |
账号密码 | 加密后的账号密码 | $6$4njBF... |
最近更改密码的天数 | 从1970年1月1日到最近用户更改密码的天数 | |
禁止修改密码的天数 | 从1979年1月1日到用户可以更改密码的天数 | |
用户必须更改密码的天数 | 从1979年1月1日到用户必须更改密码的天数 | |
警告用户更改密码的天数 | 在密码即将过期的前多少天提醒用户更改密码的天数 | |
禁用天数 | 密码过期后禁用账户的天数 | |
标志 | 保留 |
3、/etc/group
该文件是用户组的配置文件:
[root@localhost ~]# vim /etc/group root:x:0: bin:x:1: daemon:x:2: sys:x:3: adm:x:4: tty:x:5: disk:x:6: ...
每一行表示一个用户组的信息,每一行通过“:”被分成4个字段:
列(字段) | 说明 | 举例 |
用户组名 | 用户组名称 | root |
用户组密码 | 出于安全考虑,该地方使用x代替,实际密码放置于/etc/gshadow文件中 | x |
gid | 用户组id | 0 |
用户组成员 | 属于该用户组的所有用户账号 |
该文件中包括用户组和用户的信息,以及用户和用户组的关系,比如那些用户属于哪些组。
4、/etc/gshadow
[root@localhost ~]# vim /etc/gshadow root::: bin::: daemon::: sys::: adm::: tty::: ...
该文件是用户组密码加密文件,每一行有4个字段:
列(字段) | 说明 | 举例 |
用户组名 | 用户组名称 | root |
用户组密码 | 用户组密码,可以为空 | |
用户组管理员账号 | 用户组管理员,该字段可以为空。如果有多个管理员,中间以逗号隔开 | |
用户组成员 | 加入这个组的所有用户账号。如果有多个用户,中间以逗号隔开 |
六、文件修改时间
在文件的属性中,第五列和第七列分别为文件或者目录的大小、文件或者目录的名称,第六列为文件修改时间。
[root@localhost project]# stat test.txt File: ‘test.txt’ Size: 0 Blocks: 0 IO Block: 4096 regular empty file Device: 803h/2051d Inode: 25537617 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2020-10-31 13:22:46.743306208 +0800 Modify: 2020-10-31 13:22:46.743306208 +0800 Change: 2020-10-31 15:03:27.279981276 +0800 Birth: -
上面红色有三个时间分别是:
- Access 最后访问时间
- Modify 最后修改时间
- Change 状态改变时间
当做下面的操作后三个时间的变化如下:
- 创建(比如:touch命令)一个文件后A、C、M三个时间一样
- 读取(比如:cat命令等)文件,A变;C、M不变
- 修改(比如:vim命令等)文件内容,C、M变;A不变
文件属性中的时间就是上面三个时间中的Modify(最后修改时间)。