1 文件属性概述
Linux系统中的文件或目录的属性主要包括:索引节点(inode)、文件类型、权限属性、硬链接数、所归属的用户和用户组、最近修改时间等内容(文件名严格来说不属于文件的属性):
下面是我们执行ls –lih命令显示的结果:
文字解释 第一列:inode索引节点编号(如人的身份证全国唯一) 系统读取文件是首先通过文件名找到inode(全称:index node),然后才能读取文件到内容 第二列:文件类型及权限 共有10个字符,第一个字符代表为文件类型(-代表file,d代表directory),后九个字符代表为文件的权限(读、写、执行) 第三列:文件的硬链接个数 硬链接的个数好比对源文件的备份,对同一个文件的访问提供多个不同的入口,即使源文件删除了,我们依然可以访问文件本身的内容。
例如:一个超市有多个进出口,即使其中任何一个进出口封闭,我们依然可以去购物买到我们想要得东西 第四列:文件或目录所属的用户 属主,即创建文件的用户(文件的拥有者),当然我们也可以通过chown修改文件的拥有者 第五列:文件或目录所属的组 这里文件的所属用户组不是用户默认的用户组,我们可以授权给不同的用户组使其文件属于其组 第六列:文件或目录的大小 第七、八、九列:文件或目录的修改时间 查看文件属性里面的时间就是文件的修改时间mtime(全称:modify time) 第十列:实际的文件名或目录名 文件名是不属于文件的属性列表,文件名实际是属于它上一级目录的block块的内容
2 索引节点inode
2.1 inode概述
硬盘要存储数据(房子住人),首先要分区(隔断),然后要格式化创建文件系统(装修),最后存储数据(住人)。
Inode中文意思是索引节点(全称:index node)。在每个linux存储设备或存储设备的分区(存储设备可以是硬盘、软盘、U盘……)被格式化为ext4(Centos6.7)文件系统后,一般会生成两部分:第一部分是Inode索引节点(很多个),第二部分是Block块(很多个)。
Block是用来存储实际数据用的,例如:照片、视频、音乐等普通文件数据。
Inode是用来存储这些数据的属性信息(也就是ls –l的结果),inode包含的属性信息包括文件的大小、属主、归属的用户组、读写执行权限、文件类型、修改时间,还包含指向文件实体(block块)的指针功能(inode节点—block块的对应关系)等,但inode里面唯独不包含文件名。
Inode除了记录文件属性的信息外,还会为每个文件进行信息索引(指向文件实体的指针),所以就有了inode的数值。Linux操作系统根据指令,即可通过inode的值最快的找到相对应的文件实体。
文件—inode—block之间的关系图:
举例说明:
学校教室门口贴一张纸(inode),上面有学生的位置信息,以及学生的身高,体重等信息,座位就相当于block。
当我们使用ls查看某个文件或目录时,如果加上-i参数,就可以看到inode节点了,也可以使用stat查看inode以及其他的文件属性;比如文件—inode—block之间的关系图对应的例子:
方法一:ls –li 查看文件属性 [root@oldboy ~]# ls -li Wolf_File 410472 -rw-r--r-- 1 root root 12 Apr 13 23:08 Wolf_File 方法二:stat查看文件属性: [root@oldboy ~]# stat Wolf_File File: `Wolf_File\' Size: 12 Blocks: 8 IO Block: 4096 regular file Device: 803h/2051d Inode: 410472 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2018-04-13 23:08:56.841301484 +0800 #文件的查看时间 Modify: 2018-04-13 23:08:51.633299332 +0800 #文件的修改时间 Change: 2018-04-13 23:08:51.633299332 +0800 #文件权限改变的时间 [root@oldboy ~]#
第一列inode值是410472;查看一个文件或目录的inode,通过ls命令的-i参数即可。
因为inode要存放文件的属性信息及指向文件实体的指针索引信息,所以每个inode本身是有大小的,Centos5 系列inode的默认大小是128字节(byte),
而Centos6系列 inode的默认大小是256字节(byte),inode的大小在分区被格式化创建文件系统之后定下来的,格式化以后就无法更改inode的大小了,格式化前可以通过参数指定inode的大小,
但是一般企业工作环境没有这个需求。
不同Centos版本inode大小不同:
Centos6系列查看inode大小: [root@oldboy ~]# dumpe2fs /dev/sda1 | grep -i "inode size" ##/boot分区默认为128byte dumpe2fs 1.41.12 (17-May-2010) Inode size: 128 [root@oldboy ~]# dumpe2fs /dev/sda3 | grep -i "inode size" dumpe2fs 1.41.12 (17-May-2010) Inode size: 256 Centos5系列查看inode大小: 由于我这里没有Centos5系统版本,想验证的可自行安装Centos5系统,使用dumpe2fs /dev/sda3 | grep -i "inode size"命令去查看。
2.2 inode总结
################学会给阶段性的知识做小结是学好linux运维的好习惯################
u 硬盘被分区并格式化为ext4文件系统后会生成一定数量的inode和block
u inode称为索引节点,它的作用是存放文件的属性信息以及作为文件的索引(指向文件的实体)
u ext3/ext4文件系统的block存放的是文件的实际内容
u inode是磁盘上的一块存储空间,Centos6系列版本非启动分区inode默认大小为256byte,Centos5系列版本inode默认大小为128byte
u inode的表现形式是一串数字,不同的文件对应的inode(一串数字)在文件系统里是唯一的
u 在linux文件系统中,inode节点号相同的文件,互为硬链接文件,可以认为是一个文件的不同入口
u ext3/ext4文件系统下,一个文件被创建后至少要占用一个inode和一个block
u ext3/ext4文件系统下,正常情况一个文件占用且只能占用一个inode(人和身份证)
u block是用来存储实际数据的,每个block的大小一般有1k,2k,4k几种;其中引导分区等为1k,其他普通分区多为4k(Centos6)
u 如果一个文件很大(高清大片4G),需要占多个block,如果文件很小(0.01k),至少占一个block,并且这个block的剩余空间就浪费了,即无法再存储其他数据了
u 查看inode大小和总量
[root@oldboy ~]# dumpe2fs /dev/sda3 | grep -iE "block size|inode size" dumpe2fs 1.41.12 (17-May-2010) Block size: 4096 Inode size: 256 [root@oldboy ~]# dumpe2fs /dev/sda3 | grep -iE "block count|inode count" dumpe2fs 1.41.12 (17-May-2010) Inode count: 577088 Block count: 2307840 Reserved block count: 115392 注意:默认block count一般会大于inode count的数量
u 查看inode的总量是使用量(df -i)
[root@oldboy ~]# df -i Filesystem Inodes IUsed IFree IUse% Mounted on /dev/sda3 577088 52769 524319 10% / tmpfs 60785 1 60784 1% /dev/shm /dev/sda1 51200 38 51162 1% /boot /dev/sr0 0 0 0 - /mnt
u 查看文件的inode信息
方法一:ls –li文件inode [root@oldboy ~]# ls -li /etc/hosts 40 -rw-r--r--. 2 root root 158 Jan 12 2010 /etc/hosts 方法二:stat查看文件inode [root@oldboy ~]# stat /etc/hosts File: `/etc/hosts\' Size: 158 Blocks: 8 IO Block: 4096 regular file Device: 803h/2051d Inode: 40 Links: 2 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2018-04-20 00:00:50.701998104 +0800 Modify: 2010-01-12 21:28:22.000000000 +0800 Change: 2018-03-24 22:24:01.221267767 +0800
u 如何生成及指定inode大小
格式化/dev/sdb1分区时指定inode大小为256byte,block大小为2048字节即2k: [root@oldboy ~]# mkfs.ext4 -b 2048 -I 256 /dev/sdb1 mke2fs 1.41.12 (17-May-2010) 文件系统标签= 操作系统:Linux 块大小=2048 (log=1) 分块大小=2048 (log=1) Stride=0 blocks, Stripe width=0 blocks 66528 inodes, 530128 blocks 26506 blocks (5.00%) reserved for the super user 第一个数据块=0 Maximum filesystem blocks=537919488 33 block groups 16384 blocks per group, 16384 fragments per group 2016 inodes per group Superblock backups stored on blocks: 16384, 49152, 81920, 114688, 147456, 409600, 442368 正在写入inode表: 完成 Creating journal (16384 blocks): 完成 Writing superblocks and filesystem accounting information: 完成 This filesystem will be automatically checked every 20 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override. 查看inode和block的大小: [root@oldboy ~]# dumpe2fs /dev/sdb1 | grep -iE "block size|inode size" dumpe2fs 1.41.12 (17-May-2010) Block size: 2048 Inode size: 256 查看inode和block总量: [root@oldboy ~]# dumpe2fs /dev/sdb1 | grep -iE "block count|inode count" dumpe2fs 1.41.12 (17-May-2010) Inode count: 66528 Block count: 530128 Reserved block count: 26506
2.3 Block总结
u 磁盘读取数据是按block为单位读取的
u 一个文件可能占用多个block,同时每读取一个block就会消耗一次磁盘I/O
u 如果要提升磁盘I/O性能,那就要尽可能一次性读取数据尽量的多
u 一个block只能存放一个文件的内容,无论内容有多小,如果block默认是4K大小,那么存放一个1K的文件,剩余3K的就不能再存放别的文件,只能浪费了
u Block并非越大越好,block太大对于存放小文件就会浪费磁盘空间,例如:1000K的文件;block大小为4K,占用250个block,如果block默认为1K,则需要占1000个block;
访问效率谁更高?消耗I/O分别250次和1000次;当然是block大小为4K时访问效率更高
u 根据业务需求,确定默认的block大小,如果是大文件(大于16K)一般设置block大一点,小文件(小于1K)一般设置block小一点
u Block太大,例如4K,文件都是0.1K的则会大量浪费磁盘空间,但是访问效率高
u Block太小,例如1K,文件都是1000K的则会消耗大量的磁盘I/O,访问效率比较低
u Block大小设置也是格式化分区时确定的,命令为mkfs.ext4 -b 2048 -I 256 /dev/sdb1
u 企业里文件都会比较大(一般会大于4K),block设置大一些会提升磁盘访问效率
u ext3/ext4文件系统(Centos5和6),一般都设置为4K(Centos7默认文件系统为xfs)
2.4 inode与block汇总
u 磁盘被分区格式化文件系统后,会分为inode和block两部分内容
u Inode存放文件的属性以及指向文件实体的指针,文件名不包含在inode里,一般是存放在上级目录的block里
u 访问文件过程原理:文件名àinodeàblocks
u Inode一般情况默认大小为256byte,block大小为1K,2K,4K,默认为4K,注意:引导分区/boot等特殊分区除外
u 通过df –i查看inode的数量以及使用情况,dumpe2fs /dev/sda3查看inode及block的大小及总数量
u 一个文件至少要占用一个inode和一个block,多个文件可以占用同一个inode(硬链接),即相同文件
u 一个block只能被一个文件使用,如果文件很小block很大,剩余空间浪费,无法继续被其他文件使用
u Block不是越大越好,要根据业务的文件大小进行选择,一般Centos6就是默认4K
u 可以在格式化分区时指定inode和block大小(mkfs.ext4 -b 2048 -I 256 /dev/sdb1)
3 文件类型
3.1 Linux文件类型概述
在linux系统,可以说一切(包括目录、普通文件、设备等)皆文件。文件类型包含有普通文件、目录、字符设备文件、块设备文件、符号链接文件、管道文件等等
图一 文件类型对应说明图
文件类型标识符 |
文件类型说明 |
d(directory) |
表示这是一个目录 |
-(regular file) |
表示这是一个普通文件 |
l(link) |
表示这个一个符号链接文件,实际上它指向另一个文件,即windows快捷方式 |
b(block) |
表示块设备和其他外围设备,是特殊类型的文件(/dev) |
c(character) |
表示字符设备文件(/dev) |
s (socket) |
表示Socket文件,如:网络通信是产生的包 |
p(named pipe) |
表示管道文件 |
#####通过ls –l显示文件属性后,第一列的第一个字符就是用来区分文件类型的##### |
find命令查看文件类型(-type参数)
-type c File is of type c: b block (buffered) special c character (unbuffered) special d directory p named pipe (FIFO) f regular file l symbolic link; s socket D door (Solaris)
3.2 普通文件(按照文件内容分类)
- 纯文本文件(ASCII text):文件内容可以直接读取到文件数据,例如字母、数字等,可以使用cat命令读取文件,比如配置文件几乎都是纯文本文件
file命令查看文件类型: [root@oldboy ~]# file Wolf_File Wolf_File: ASCII text
- 二进制文件(binary):linux系统中的命令程序属于这种格式,例如cat命令就是一个二进制文件
file命令查看文件类型: [root@oldboy ~]# file /bin/cat /bin/cat: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped
- 数据格式文件(data):有些程序在运行的过程中就会读取某些特定格式的文件,那些特定格式的文件可以被称为数据文件;例如:linux在用户登录时,都会将登录信息记录在/var/log/wtmp(last命令的数据库文件)那个文件中,该文件是一个数据文件;通过last命令可以读取,使用cat命令读取会出现乱码;因为它属于一种特殊格式的文件。lastlog(/var/log/lastlog)查看linux系统所有用户的登录情况
file命令查看文件类型: [root@oldboy ~]# file /var/log/wtmp /var/log/wtmp: data [root@oldboy ~]# file /var/log/lastlog /var/log/lastlog: data
3.3 目录文件(directory)
[root@oldboy ~]# ls -ld oldboy/ drwxr-xr-x 2 root root 4096 Apr 14 20:00 oldboy/
如上文所示,当我们执行ls –ld 目录名时,可以看到第一列内容为drwxr-xr-x,第一个字符带d的文件就表示是目录,目录在linux系统中是比较特殊的文件
创建目录的命令可以用mkdir命令或者cp命令(带-r or –a参数),cp可以把一个目录复制为另一个目录;删除目录用rm –r或rmdir(删除空目录)命令
区别目录和文件:
ls –F命令在目录后面加/来区分文件和目录: [root@oldboy ~]# ls -F 1.py copied.txt install.log stu1/ teacher1/ Wolf_File copied.txt. install.log.syslog stu2/ teacher2/ anaconda-ks.cfg copied.txt.bak oldboy/ stu3/ tree命令显示当前目录下所有的文件: [root@oldboy ~]# tree . . |-- 1.py |-- Wolf_File |-- anaconda-ks.cfg |-- copied.txt |-- copied.txt. |-- copied.txt.bak |-- install.log |-- install.log.syslog |-- oldboy |-- stu1 |-- stu2 |-- stu3 |-- teacher1 | |-- a | `-- b `-- teacher2 |-- a `-- b 10 directories, 8 files tree命令只显示当前目录下的目录文件: [root@oldboy ~]# tree -d . . |-- oldboy |-- stu1 |-- stu2 |-- stu3 |-- teacher1 | |-- a | `-- b `-- teacher2 |-- a `-- b 10 directories tree命令只显示当前目录下一级目录: [root@oldboy ~]# tree -Ld 1 . . |-- oldboy |-- stu1 |-- stu2 |-- stu3 |-- teacher1 `-- teacher2 6 directories
3.4 文件类型实例
1) .tar、.tar.gz、.tgz、.zip、.tar.bz表示压缩文件,创建命令一般为tar,gzip,unzip等 2) .sh表示shell脚本文件,通过shell语言开发的程序 3) .pl表示perl语言文件,通过perl语言开发的程序 4) .py表示python语言文件,通过python语言开发的程序 5) .html、.htm、.php、.jsp、.do、.asp表示网页语言文件 6) .conf表示系统配置文件 7) .rpm表示rpm安装包文件
4 文件权限
4.1 文件权限概述
Linux中每个文件或者目录都有一组共9个基础权限位,每三位字符被分为一组,他们分别是属主权限位(占三个字符)、用户组权限位(占三个字符)、其他用户权限位(占三个字符);比如rwxr-xr-x,在linux中正是这9个字符权限位来控制文件属主、用户组以及其他用户的权限
文件权限示例图
文字解释: r(read)代表读权限,用数字4表示 w(write)代表写权限,用数字2表示 x(execute)代表执行权限,用数字1表示 -代表没有权限,用数字0表示 前三位:代表文件属主/用户(owner/user) 中三位:代表文件用户组(group) 后三位:代表其他用户(other) 说明:特殊权限位:t T s S x X
4.2 模拟演示环境
4.2.1 用户测试准备
[root@oldboy ~]# groupadd incahome #一个家庭(oldboy的家) [root@oldboy home]# useradd -g incahome oldboy #让家庭住人oldboy属于incahome这个家(模拟user) [root@oldboy home]# useradd -g incahome oldgril #incahome这个家的家庭成员(模拟用户组group) [root@oldboy home]# useradd test #外面的人,主人及家庭成员以外的人(other) [root@oldboy home]# id oldboy uid=502(oldboy) gid=502(incahome) groups=502(incahome) [root@oldboy home]# id oldgril uid=503(oldgril) gid=502(incahome) groups=502(incahome) [root@oldboy home]# id test uid=501(test) gid=501(test) groups=501(test)
如果oldboy用户存在的话就用下面修改用户组的命令进行修改
[root@oldboy home]# usermod -g incahome oldboy
4.2.2 创建文件的测试准备
[root@oldboy ~]# mkdir /oldboy -p [root@oldboy ~]# echo "echo oldboylinux" > /oldboy/test.sh [root@oldboy ~]# chmod +x /oldboy/test.sh [root@oldboy ~]# cat /oldboy/test.sh echo oldboylinux [root@oldboy ~]# ls -lh /oldboy/test.sh -rwxr-xr-x 1 root root 17 Apr 27 21:14 /oldboy/test.sh
4.2.3 范例:实操体会文件权限
模拟演练环境:
打开四个窗口分别用root、oldboy、oldgril、test用户登录
分别测试oldboy、oldgril、test用户对上述test.sh文件的权限
实操一:
[root@oldboy ~]# ls -lh /oldboy/test.sh -rwxr-xr-x 1 root root 17 Apr 27 21:14 /oldboy/test.sh
结论1:
oldboy、oldgril、test三个用户拥有同样的其他用户的权限,即读和执行,没有写的权限
实操二:
[root@oldboy ~]# chown oldboy.incahome /oldboy/test.sh [root@oldboy ~]# ls -l /oldboy/test.sh -rwxr-xr-x 1 oldboy incahome 17 Apr 27 21:14 /oldboy/test.sh
结论2:
oldboy用户拥有对应用户的权限,即读、写和执行的权限
oldgril用户拥有对应用户组(incahome)的权限,即读和执行的权限,没有写的权限
test用户拥有对应其他用户的权限,即读和执行的权限,没有写的权限
实操三:
[root@oldboy ~]# chmod g+w,o-x /oldboy/test.sh [root@oldboy ~]# ls -l /oldboy/test.sh -rwxrwxr-- 1 oldboy incahome 25 Apr 27 21:26 /oldboy/test.sh
总结文件测试结论:linux普通文件的读、写、执行权限说明:
1. 可读r:表示具有读取\阅读文件内容的权限 2. 可写w:表示具有新增、修改文件内容的权限 如果没有r配合,那么vi编辑文件会提示无法编辑(但可强制编辑),echo可以重定向或追加 特别提示:删除文件(修改文件名等)的权限是受父目录(即上一级目录)的权限控制,和文件本身(即文件名)权限无关 3. 可执行x:表示具有执行文件的权限 文件本身要能够执行 普通用户同时还需要具备r的权限才能执行 root只要有x的权限就能执行 win32下可执行文件:*.exe,*.bat,*.com linux下可执行文件:*.sh,*.py,*.perl等
4.2.4 企业面试题:请从linux文件系统的角度详细描述读取/oldboy/test.sh文件的过程
有关文件删除的说明:
Linux中的文件名是存在于父目录的block里面,并指向这个文件的inode节点,这个文件的inode节点再标记指向存放这个文件的block的数据块。
我们删除一个文件,实际上并不清楚inode节点和block的数据。只是在这个文件的父目录里面的block中,删除这个文件的名字和这个文件inode的对应关系,使这个文件名消失,并且无法指向这个文件的inode节点,
当没有文件名指向这个inode节点的时候,系统会同时释放inode节点和存放这个文件的数据块,并更新inode MAP和block MAP,让这些位置可以用于放置其他新的文件数据。
图一 详细描述读取/oldboy/test.sh文件的流程图
因此,修改和删除文件名都是在操作文件的上级目录的block,修改或删除的是文件名和inode的关联数据,所以删除文件是和上级目录权限关联
范例:实操体会目录权限
开启两个窗口通过两个用户演示上面的权限。一个是root,一个是oldboy用户,一个是oldgril用户,一个是test用户
演示环境准备:
[root@oldboy ~]# mkdir /oldboy/test -p [root@oldboy ~]# ls -ld /oldboy/test drwxr-xr-x 2 root root 4096 Apr 27 23:39 /oldboy/test
测试目录的rwx:
特别是文件的删除
总结目录测试结论:linux目录的读、写、执行权限说明:
1、可读r:表示具有浏览目录下面文件及子目录的权限,即ls dir 如果没有x权限,不能进到目录里,即无法(cd dir) 如果没有x权限,ls列表时可以看到所有文件名,但是会提示无权访问目录下文件 如果ls -l列表,所有的属性会带有问号,也会提示无权访问目录下文件,但可以看到所有文件名 2、可写w:表示具有增加、删除或修改目录内文件名(一般指文件名)的权限(需要x权限配合) 3、可执行x:表示具有进入目录的权限,例如:cd dir;但是没有r无法列表文件及目录,没有w无法新建和删除
4.3 文件权限更改命令
4.3.1 改变文件权限属性命令chmod
chmod - change file mode bits [root@oldboy ~]# which chmod /bin/chmod
chmod是用来改变文件和目录权限的命令,但只有文件的属主和超级用户root才有这种权限。通过chmod来改变文件或目录的权限有两种方法:一种是通过权限字母和操作符表达式的方法来设置权限;另一种是使用数字方法(常用)来设置权限。
4.3.2 chmod数字权限方法(推荐)
命令格式:
chmod [数字组合] 文件名
chmod [数字组合] 目录名 -R参数可递归生效(该目录下所有文件或子目录一起改变)
数字意义说明:
r 4 w 2 x 1 - 0 rwxr-xr-x 755 目录默认权限 rw-r--r-- 644文件默认权限
每个三位的权限代码(分别是属主、属组、其它用户)组合,有8种可能:
八进制 权限 0 --- 1 --x 2 -w- 3 -wx 4 r-- 5 r-x 6 rw- 7 rwx
演示实例:
[root@oldboy oldboy]# ls -l test.sh -rw-r--r-- 1 oldboy incahome 29 Apr 27 21:59 test.sh [root@oldboy oldboy]# chmod 665 test.sh [root@oldboy oldboy]# ls -l test.sh -rw-rw-r-x 1 oldboy incahome 29 Apr 27 21:59 test.sh [root@oldboy oldboy]# chmod 715 test.sh [root@oldboy oldboy]# ls -l test.sh -rwx--xr-x 1 oldboy incahome 29 Apr 27 21:59 test.sh
4.3.3 chmod字符式权限表示法
命令格式:
Chmod [用户类型] [+ | - | =] [权限字符] 文件名
表一 详细说明表
chmod |
用户类型 |
操作字符 |
权限字符 |
文件和目录 |
U(user) |
+(增加) |
r |
||
G(group |
|
- |
||
O(others) |
-(减少) |
w |
||
A(all) |
=(设置) |
x |
文字说明:
+:添加某个权限 -:取消某个权限 =:取消其他所有权限赋予给定的权限
演示实例:
[root@oldboy oldboy]# ls -l test.sh -rw-r--r-- 1 oldboy incahome 29 Apr 27 21:59 test.sh [root@oldboy oldboy]# chmod u+x test.sh [root@oldboy oldboy]# ls -l test.sh -rwxr--r-- 1 oldboy incahome 29 Apr 27 21:59 test.sh [root@oldboy oldboy]# chmod g+w test.sh [root@oldboy oldboy]# ls -l test.sh -rwxrw-r-- 1 oldboy incahome 29 Apr 27 21:59 test.sh [root@oldboy oldboy]# chmod u-x,g-w,o-r test.sh [root@oldboy oldboy]# ls -l test.sh -rw-r----- 1 oldboy incahome 29 Apr 27 21:59 test.sh [root@oldboy oldboy]# chmod a=rw test.sh [root@oldboy oldboy]# ls -l test.sh -rw-rw-rw- 1 oldboy incahome 29 Apr 27 21:59 test.sh [root@oldboy oldboy]#
4.3.4 Umask默认文件或权限分配命令
创建目录dir与创建文件file实例
[root@oldboy test]# mkdir dir [root@oldboy test]# touch file [root@oldboy test]# ls -lrt total 4 drwxr-xr-x 2 root root 4096 Apr 29 15:12 dir ->创建目录默认权限为755 -rw-r--r-- 1 root root 0 Apr 29 15:12 file –>创建文件默认权限为644 说明:root超级用户创建目录默认权限为755,文件默认权限为644
问题:为什么默认权限目录是755,文件是644而不是其他的值呢?
不管是操作系统还是网站站点目录,安全权限的临界点: 1)目录755,文件644是相对安全的权限 2)用户为root,用户组为root 注意:生产工作中一定尽量要文件和目录达到以上默认权限,其用户和属组都是root Linux系统默认权限的方针:允许浏览、查看,但禁止创建文件、修改文件内容以及执行文件
实际是由/etc/bashrc文件控制:
[root@oldboy ~]# umask 0022 ->root超级用户系统默认的umask值 [root@oldboy ~]# sed -n \'65,69p\' /etc/bashrc if [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then umask 002 else umask 022 fi umask值为002,举例: [oldboy@oldboy ~]$ ls -l file1 -rw-rw-r-- 1 oldboy oldboy 0 Apr 29 16:13 file1 [oldboy@oldboy ~]$ id uid=502(oldboy) gid=503(oldboy) groups=503(oldboy) [oldboy@oldboy ~]$ umask 0002 umask值为022,举例: [oldboy@oldboy ~]$ ls -l file -rw-r--r-- 1 oldboy incahome 0 Apr 29 16:07 file [oldboy@oldboy ~]$ id uid=502(oldboy) gid=502(incahome) groups=502(incahome) [oldboy@oldboy ~]$ umask 0022
文件权限计算方法:
root用户下默认文件权限计算方法 1)假设umask值为:022(所有位为偶数) 6 6 6 ==>文件的起始权限值 0 2 2 – ==>umask值(采用减法) ---------- 6 4 4 ==>创建文件默认权限值 2)假设umask值为:045(所有是奇数的位要加1) 6 6 6 ==>文件的起始权限值 0 4 5 – ==>umask值(采用减法) ---------- 6 2 1 ==>计算出来的权限值 0 0 1 + ==>由于umask最后一位是5,在其他用户位再加1(采用加法) --------- 6 2 2 ==>真实文件权限(即创建文件默认权限值)
4.3.5 特殊权限位
特殊权限位基本说明:
Linux系统基本权限位为9位权限,但还有额外3位权限位,共12位权限 suid s(有x) S 4 用户对应的权限位(用户对应的3位上) sgid s(有x) S 2 用户组对应的权限位(用户组对应的3位上) sticky t(有x) T 1 其他用户对应的权限位
如何查找系统(/usr/bin)目录中设置suid的命令
方法一: [root@oldboy oldboy]# find /usr/bin -type f -perm 4755 | xargs ls -l -rwsr-xr-x. 1 0 root 54240 Jan 30 2012 /usr/bin/at -rwsr-xr-x. 1 0 root 66352 Dec 8 2011 /usr/bin/chage -rwsr-xr-x. 1 0 root 51784 Nov 23 2013 /usr/bin/crontab -rwsr-xr-x. 1 0 root 71480 Dec 8 2011 /usr/bin/gpasswd -rwsr-xr-x. 1 0 root 36144 Dec 8 2011 /usr/bin/newgrp -rwsr-xr-x. 1 0 root 30768 Feb 22 2012 /usr/bin/passwd -rwsr-xr-x. 1 0 root 27576 Sep 20 2013 /usr/bin/pkexec 方法二: [root@oldboy oldboy]# find /usr/bin -type f -perm 4755 -exec ls -l {} \; 取消suid设置命令: [root@oldboy oldboy]# find /usr/bin -type f -perm 4755 | xargs chmod u-s [root@oldboy oldboy]# find /usr/bin -type f -perm 4755 -exec chmod u-s {} \;
如何查找系统(/usr/bin)目录中设置sgid的命令
[root@oldboy oldboy]# find /usr/bin -type f -perm 2755 | xargs ls -l -rwxr-sr-x. 1 0 nobody 125000 Nov 23 2013 /usr/bin/ssh-agent -rwxr-sr-x. 1 0 tty 12016 Nov 22 2013 /usr/bin/write
特殊权限对应数字总结:
suid 4000 权限字符s(S),用户位的x位上设置 授权方法:chmod 4755 /bin/rm 或chmod u+s /bin/rm sgid 2000 权限字符s(S),用户组位的x位上设置 授权方法:chmod 2755 /bin/rm 或chmod g+s /bin/rm 粘滞位1000权限字符t(T),其他用户位的x位上设置 授权方法:chmod 1777 /tmp 或chmod o+t /tmp 如果对应位有x则字符权限表现为小写,否则表现为大写 tmp经典的粘滞位目录案例,特点是谁都有写权限,因此安全成问题。常常是木马第一手跳板地点
特殊权限总结:
1)suid是什么、作用,passwd命令案例,如何设置使用rm案例 2)sgid是什么、作用,文件locate案例。共享目录用户组案例 3)粘滞位是什么、作用,/tmp目录案例 4)以数字及字符方式更改权限,chmod命令 5)更改文件用户和组,chown命令 6)更改用户组,chgrp命令 7)chattr更改文件属性(linux安全优化) 命令格式: chattr - change file attributes on a Linux file system chattr [ -RVf ] [ -v version ] [ mode ] files... The format of a symbolic mode is +-=[acdeijstuADST]. -R参数代表递归改变目录以及目录下面的文件的属性 mode指定模式 + 代表添加属性到已有其他属性的文件中 - 代表从已有属性文件中删除指定的属性 = 代表取消原有的属性设置成指定的属性 i 代表锁定文件使其不可变(linux安全优化常用模式)[immutable 不可变] a 代表文件只有追加属性(append only) 演示实例: [root@oldboy ~]# chattr +i /etc/{passwd,shadow,group,gshadow,inittab} [root@oldboy ~]# lsattr /etc/{passwd,shadow,group,gshadow,inittab} ----i--------e- /etc/passwd ----i--------e- /etc/shadow ----i--------e- /etc/group ----i--------e- /etc/gshadow ----i--------e- /etc/inittab [root@oldboy ~]# chattr -i /etc/{passwd,shadow,group,gshadow,inittab} [root@oldboy ~]# lsattr /etc/{passwd,shadow,group,gshadow,inittab} -------------e- /etc/passwd -------------e- /etc/shadow -------------e- /etc/group -------------e- /etc/gshadow -------------e- /etc/inittab 8)lsattr查看文件属性 命令格式: lsattr - list file attributes on a Linux second extended file sys-tem lsattr [ -RVadv ] [ files... ] 参数: -R 代表递归列出目录以及目录下面的文件的属性 -a 代表显示目录中所有文件,包含”.”与”..”隐藏文件 -d 代表只显示目录本身的属性,而不显示目录下包含的文件属性 演示实例: [root@oldboy ~]# lsattr /etc/{passwd,shadow,group,gshadow,inittab} -------------e- /etc/passwd -------------e- /etc/shadow -------------e- /etc/group -------------e- /etc/gshadow -------------e- /etc/inittab
4.3.6 chown改变文件所属关系
chown(change owner)
当我们要改变一个文件的属主,我们所使用的用户必须是该文件的属主而且同时是目标属组成员,或超级用户。只有超级用户才能改变文件的属主
chown语法:
chown [选项]…[所有者][:[用户组]] 文件……
模拟环境:
[root@oldboy oldboy]# ls -l test.sh -rw-rw-rw- 1 oldboy incahome 29 Apr 27 21:59 test.sh
常用的更改方法:
chown 用户 文件或目录 <==仅仅授权用户 演示实例: [root@oldboy oldboy]# chown oldgril test.sh [root@oldboy oldboy]# ls -l test.sh -rw-rw-rw- 1 oldgril incahome 29 Apr 27 21:59 test.sh chown :组 文件或目录 <==仅仅授权组 等同于“chgrp 组 文件或目录” 演示实例: [root@oldboy oldboy]# chown :oldboy test.sh [root@oldboy oldboy]# ls -l test.sh -rw-rw-rw- 1 oldgril oldboy 29 Apr 27 21:59 test.sh chown 用户:组 文件或目录 <==表示授权用户和组 演示实例: [root@oldboy oldboy]# chown test:test test.sh [root@oldboy oldboy]# ls -l test.sh -rw-rw-rw- 1 test test 29 Apr 27 21:59 test.sh chgrp 组 文件或目录 演示实例: [root@oldboy oldboy]# chgrp incahome test.sh [root@oldboy oldboy]# ls -l test.sh -rw-rw-rw- 1 test incahome 29 Apr 27 21:59 test.sh
强调:
1)其中的冒号”:”可以用点号”.”替代 2)要授权的用户和组名,必须是linux系统中实际存在的
5 软硬链接
5.1 链接概述
在linux系统中,链接可分为两种:一种为硬链接(Hard Link),另一种为软链接或符号链接(Symbolic Link or Soft Link);使用ln命令就是创建链接文件,在默认不带参数的情况下,执行ln命令创建的链接是硬链接
如果使用ln –s创建链接则为软链接,前面文件类型为l(字母L)的是软链接
软硬链接使用语法:
硬链接:ln 源文件 目标文件
软链接:ln –s 源文件 目标文件(目标文件事先不能存在)
5.2 硬链接
硬链接是指通过索引节点(Inode)来进行链接。在linux(ext2,ext3,ext4)文件系统中,保存在磁盘分区中的文件不管是什么类型都会给它分配一个编号,这个编号被称为索引节点编号(Inode index)简称Inode,即在系统中文件的编号。
在linux文件系统中,多个文件指向同一个索引节点(Inode)是正常允许的。这种情况的文件称为硬链接。提示:硬链接文件就相当于文件的另外一个入口。硬链接的作用之一是允许一个文件拥有多个有效路径名(多个入口),这样用户就可以建立硬链接到重要的文件,以防止“误删”源数据(很多硬件存储,如netapp存储中的快照功能就应用了这个原理,增加一个快照就多了一个硬链接)。为什么一个文件建立了硬链接就会防止数据误删呢?
因为文件系统(ext2)的原理是只要文件的索引节点(inode)还有一个以上的硬链接。只删除其中一个硬链接(即仅仅删除了该文件的链接指向)并不影响索引节点本身和其他的链接(即数据文件实体并未被删除),只有当文件的最后一个链接被删除后,此时如果有新数据要存储到硬盘上时或者系统通过类似fsck做磁盘检查的时候。被删除文件的数据块及目录的链接才会被释放,空间被新数据占用并覆盖。此时,数据就再也无法找回了。也就是说,在linux系统中,删除静态文件(没有进程调用)(目录也是文件)的条件是与之相关的所有硬链接文件均被删除
硬链接原理图:
硬链接示意图:
5.3 硬链接总结
1) 具有相同inode节点号的多个文件是互为硬链接文件 2) 删除硬链接文件或者删除源文件任意之一,文件实体并未被删除 3) 只有删除了源文件及所有对应的硬链接文件,文件实体才会被删除 4) 当所有的硬链接文件及源文件被删除后,再存放新的数据就会占用这个文件的空间,或者磁盘fsck检查的时候,删除的数据也会被系统回收(养成删除及多套环境测试的好习惯) 5) 硬链接文件就是文件的另一个入口(相当于超市的前后门) 6) 可以通过给文件设置硬链接文件,来防止重要文件被误删 7) 通过执行命令“ln 源文件 硬链接文件”,即可完成硬链接的创建 8) 硬链接文件是普通文件,因此可以使用rm命令删除 9) 对于静态文件(没有进程调用的文件)来讲,当对应硬链接数为0(i_link),文件就会被删除。i_link的查看方法(ls –l结果的第三列)
5.4 软链接
软链接(Soft Link)也称为符号链接(Symbolic link)。Linux里的软链接文件就类似于Windows系统中的快捷方式。Linux里的软链接文件实际上是一个特殊的文件,文件类型为l。软链接文件实际上可以理解为一个文本文件,这个文件中包含有软链接指向另一源文件的位置信息内容,因此,通过访问这个“快捷方式”就可以迅速定位到软链接所指向的源文件实体
软链接原理图:
查看软链接的value(源文件)值的方法:
readlink - print value of a symbolic link or canonical file name ##查看软链接value(源文件) [root@oldboy ~]# ls -ld /application/apache lrwxrwxrwx 1 root root 25 Mar 15 01:02 /application/apache -> /application/apache2.2.17 [root@oldboy ~]# readlink /application/apache /application/apache2.2.17 [root@oldboy ~]#
软链接的创建:
执行命令“ln –s 源文件 软链接文件”,即可完成软链接的创建
误区:创建软链接源文件是需要存在的,要创建的软链接文件是不能事先存在的
5.5 软链接总结
1) 软链接类似windows系统的快捷方式(readlink查看其指向)
2) 软链接类似一个文本文件,里面存放的是源文件的路径,指向源文件实体
3) 删除源文件,软链接文件依然存在,但是无法访问指向的源文件路径内容了
4) 失效的时候一般是白字红底闪烁提示soft_link_c -> a
5) 执行命令“ln –s 源文件 软链接文件”,即可完成创建(目标文件不能存在)
6) 软链接和源文件是不同类型的文件,也是不同的文件,inode也不相同
7) 软链接文件的文件类型为(l),是普通文件,可以使用rm命令删除
5.6 示例演示
文件示例(创建软硬链接)
[root@oldboy ~]# mkdir /test/oldboy -p [root@oldboy ~]# cd /test/oldboy/ [root@oldboy oldboy]# touch oldboyfile #创建一个测试文件oldboyfile [root@oldboy oldboy]# ln oldboyfile oldboyfile_hard_link #创建硬链接 [root@oldboy oldboy]# ln -s oldboyfile oldboyfile_soft_link #创建软链接 [root@oldboy oldboy]# ls -li total 0 142211 -rw-r--r-- 2 root root 0 Apr 16 05:36 oldboyfile 142211 -rw-r--r-- 2 root root 0 Apr 16 05:36 oldboyfile_hard_link 142212 lrwxrwxrwx 1 root root 10 Apr 16 05:37 oldboyfile_soft_link -> oldboyfile [root@oldboy oldboy]# readlink oldboyfile_soft_link #查看软链接value oldboyfile
目录示例(软硬链接)
[root@oldboy oldboy]# mkdir oldboydir #创建一个测试文件oldboydir [root@oldboy oldboy]# ln oldboydir oldboydir_hard_link ln: `oldboydir\': hard link not allowed for directory #为什么目录不允许创建硬链接?原因是创建目录硬链接不能够跨文件系统,如果不同的分区上面有相同的inode所以节点导致系统数据存储混乱,故不能创建硬链接(目录) [root@oldboy oldboy]# ln -s oldboydir oldboydir_soft_link #创建软链接,目录软链接在生产环境经常用到,硬链接用的不多 [root@oldboy oldboy]# ls -litr total 4 142211 -rw-r--r-- 2 root root 0 Apr 16 05:36 oldboyfile_hard_link 142211 -rw-r--r-- 2 root root 0 Apr 16 05:36 oldboyfile 142212 lrwxrwxrwx 1 root root 10 Apr 16 05:37 oldboyfile_soft_link -> oldboyfile 142215 drwxr-xr-x 2 root root 4096 Apr 16 05:43 oldboydir 142216 lrwxrwxrwx 1 root root 9 Apr 16 05:44 oldboydir_soft_link -> oldboydir
删除实例(软硬链接)
[root@oldboy oldboy]# echo "this is oldboyfile" >> oldboyfile #往创建的测试文件源文件 [root@oldboy oldboy]# cat oldboyfile this is oldboyfile [root@oldboy oldboy]# cat oldboyfile_hard_link this is oldboyfile [root@oldboy oldboy]# cat oldboyfile_soft_link this is oldboyfile [root@oldboy oldboy]# 结论:往源文件oldboyfile里写入内容后,它的软硬链接文件同样都有相同的内容
通过以上测试,我们可以得出以下几个结论:
- 删除软链接文件,对源文件和硬链接文件无任何影响
- 删除硬链接文件,对源文件和软链接文件无任何影响
- 删除源文件,对硬链接文件没有影响,但是会导致软链接文件失效,白字红底闪烁
- 同时删除源文件和硬链接文件,整个文件会真正的被删除
- 源文件和硬链接文件具有相同的索引节点号(inode),可以认为是同一个文件或一个文件的多个入口
- 源文件和软链接文件索引节点号(inode)不同,是不同的文件,软链接相当于源文件的快捷方式,包含源文件的位置指向
5.7 目录链接总结
1) 对于目录,是不可以创建硬链接,但可以创建软链接 2) 对于目录的软链接是生产环境运维中常用的技巧 3) 目录的硬链接是不能跨文件系统的(从硬链接的原理方面理解) 4) 每个目录下面都有一个硬链接“.”号和对应上级目录的硬链接“..” 5) 在父目录里创建一个子目录,父目录的链接数增加1(子目录里都有“..”来指向父目录)但是再在父目录里创建文件,父目录的链接数是不会增加了
请问下面的目录(oldboy)的链接数为什么为3?
[root@oldboy oldboy]# ls -lid ../oldboy/ -a 410473 drwxr-xr-x 3 root root 4096 4月 15 01:01 ../oldboy/ 原因如下:(oldboy目录本身,oldboy目录下的“.”,oldboy目录下test子目录的“..”) [root@oldboy oldboy]# ls -lid ../oldboy/ 410473 drwxr-xr-x 3 root root 4096 4月 15 01:01 ../oldboy/ [root@oldboy oldboy]# ls -lid ../oldboy/. 410473 drwxr-xr-x 3 root root 4096 4月 15 01:01 ../oldboy/. [root@oldboy oldboy]# ls -lid ../oldboy/test/.. 410473 drwxr-xr-x 3 root root 4096 4月 15 01:01 ../oldboy/test/.. [root@oldboy oldboy]#
6 Linux系统用户角色和组
6.1 用户角色划分介绍
首先,我们先说明Linux系统是一个多用户、多任务的操作系统。在linux系统中,由于角色的不同,权限和所完成的任务也是不同的;对于linux系统来说,用户的角色是通过UID和GID识别的:特别是UID,在linux系统运维工作中,一个UID是唯一标识一个系统的用户账号(相当于我们的身份证),linux系统仅能够识别的是UID和GID这样的数字。
用户的UID就相当于我们的身份证一样,用户名就相当于我们的名字。
UID(User Identify)中文用户ID,相当于各位的身份证,在系统中是唯一的
GID(Group Identify)中文用户组ID,相当于各位的家庭或者学校ID
Linux系统中用户角色划分为:超级用户(root)、普通用户(自建的用户,UID在500之后,如日常ssh远程登录管理linux操作系统)、虚拟用户(供系统服务进程调用的,如ngnix、apache、ntp等)
有关UID限制说明类比表
UID整数范围 |
UID用户角色 |
具备UID用户特性 |
0 |
超级用户(root皇帝) |
当用户的UID为0时,表示这个账号为超级管理员账号,如果要增加一个系统管理员账号的话,只需将该账号的UID改成0即可。生产环境不建议这么做,使用sudo替代即可。 |
1-499 |
虚拟用户(傀儡) |
这个范围是保留给系统使用的UID,之所以这样划分,是为了防止人为简历账户的UID和系统的UID之间冲突。并没有其他特殊的含义。在/etc/passwd文件中的虚拟用户的UID都会在这个范围内。除了0之外,所有的UID在使用上没有任何区别。安装系统后默认就会存在,且默认情况大多数不能登录系统shell为/sbin/nologin 满足条件:每个文件和进程,都需要对应一个用户和用户组 |
500-65535 |
普通用户(百姓) |
普通账户UID,当使用useradd gandalf建立账户时,默认情况下UID就是从500开始的。当然,我们也可以指定UID来创建或修改账户的UID |
6.2 用户和组的对应关系
用户和组的对应关系有:一对一、一对多、多对一和多对多,方便理解,我们通过图形的方式来展示这种对应关系
文字说明:
1) 一对一:即一个用户可以存在一个组中,也可以是组中唯一的成员。如:root 2) 一对多:即一个用户可以存在于多个用户组中。比如,上图中普通用户oldboy可以是sa组成员,也可以是java用户组成员,还可以是tech用户组成员,这里的oldboy用户具有sa、java、tech多个组的共同权限 3) 多对一:即多个用户可以存在于一个组中,这些用户具有和组相同的权限 4) 多对多:即多个用户可以存在多个组中,并且几个用户可以归属相同的组;其实多对多的关系是前面三条的扩展
6.3 用户和用户组涉及配置文件说明
新用户创建涉及到四个配置文件包括:/etc/passwd,/etc/shadow,/etc/group,/etc/gshadow,每创建一个新用户都会向这四个配置文件中追加一行用户内容信息
用户/etc/passwd配置文件7列说明:
root |
:x |
:0 |
:0 |
:root |
:/root |
:/bin/bash |
账户名称 |
:账户密码 |
:账户UID |
:账号组GID |
:用户说明 |
:用户家目录 |
:shell解释器 |
用户密码/etc/shadow配置文件说明:
小结论
useradd创建用户会更改/etc/passwd、/etc/shadow、/etc/group、/etc/gshadow passwd设置用户密码会更改/etc/shadow
用户组/etc/group配置文件说明
字段名称 |
注释说明 |
用户组名 |
该组的名称 |
用户组密码 |
通常不需要设置该密码,由于安全原因,该密码被记录在/etc/gshadow中,因此显示为“x”,类似用户密码被记录在/etc/shadow |
GID |
用户组ID |
用户组成员 |
加入这个组的所有用户账号 |
[root@oldboy ~]# grep "wheel" /etc/group wheel:x:10:gandalf |