Linux系统中的文件或目录的属性主要包括:索引节点(inode)、文件类型、权限属性、链接数、所归属的用户和用户组、最近修改时间等内容。
[root@oldboy ~]# ls -lhi
total 36K
390149 -rw-r--r--. 1 root root 22K Nov 16 11:33 install.log
390150 -rw-r--r--. 1 root root 5.8K Nov 16 11:30 install.log.syslog
ls -lhi共显示10列内容,分别介绍所指内容:
inode 中文意思是索引节点(index node)。在每个Linux存储设备或存储设备的分区(存储设备可以是硬盘、软盘、U盘…)被格式化为ext4(Centos6.7)文件系统,一般生成两部分:第一部分是Inode(很多个),第二部分是Block(很多个)。
Block 是用来存储实际数据用的,例如:照片、视频等普通文件数据。
而Inode就是用来存储这些数据属性信息的(也就是ls -l的结果),inode属性信息包括不限于问价大小、属主(用户)、归属的用户组、文件权限、文件类型、修改时间,还包含指向文件实体的指针的功能(inode节点–block的对应关系)等,但是,inode里面唯独不包含文件名,文件名一般在上级目录的block里。
Inode除了记录文件属性的信息外,还会为每个文件进行信息索引,所以就有了inode的数值。操作系统根据指令,即可通过inode的值最快的找到相对应的文件实体。文件,inode,block 之间的关系见下图:
#stat 显示文件和文件系统状态(查看文件属性)
[root@oldboy test]# stat file1.txt
File: `file1.txt'
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 803h/2051d Inode: 140162 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2017-12-15 07:31:09.754991273 -0500
Modify: 2017-12-15 07:31:09.754991273 -0500
Change: 2017-12-15 07:31:09.754991273 -0500
因为inode 要存放文件的属性信息,所以每个inode 本身是有大小的,Centos5系列inode的默认大小是128 字节,而Centos6系列inode 的默认大小是256 字节,inode的大小在分区被格式化创建文件系统之后定下来,被格式化之后就无法更改inode的大小了,格式化前可以通过参数指定inode大小,但是一般企业工作环境没这个需求。
dumpe2fs /dev/sda*:可以查看指定分区的
#用grep加 -i 选项不区分大小写检索
[root@oldboy ~]# dumpe2fs /dev/sda1 | grep -i "inode size"
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
查看文件系统inode总量以及剩余量
[root@oldboy ~]# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda3 593344 55756 537588 10% /
tmpfs 125514 1 125513 1% /dev/shm
/dev/sda1 51200 38 51162 1% /boot
文件系统 inode节点数 已使用数 剩余数 已使用百分比 挂载点
查看磁盘的使用量
[root@oldboy ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 8.8G 1.5G 6.9G 18% /
tmpfs 491M 0 491M 0% /dev/shm
/dev/sda1 190M 35M 146M 19% /boot
磁盘空间是否满了,是由两项参数决定的:第一个是inode是否满了,第二个block是否满了,任何一项满了,磁盘就不能再放东西了。
ext3/ext4
文件系统的block 存放的是文件的实际内容。256
字节,Centos5 是128 字节。ext3/ext4
文件系统下,一个文件在创建后至少要占用一个indoe和一个block。ext3/ext4
文件系统下,正常情况下一个文件占用且只能占用一个indoe(人和身份证)1k
,2k
,3k
几种。其中引导分区多为1k,其他普通分区多为4k(Centos6) [root@oldboy ~]# dumpe2fs /dev/sda3|egrep -i "block size|Inode size"
dumpe2fs 1.41.12 (17-May-2010)
Block size: 4096
Inode size: 256
[root@oldboy ~]# dumpe2fs /dev/sda3|egrep -i "block count|Inode count"
dumpe2fs 1.41.12 (17-May-2010)
Inode count: 593344
Block count: 2373376
Reserved block count: 118668
默认一般情况下Block数量大于inode数量
查看inode的总量和使用命令df -i
查看文件的inode:
ls -i or stat filename
如何生成及制定inode大小
格式化命令:mkfs.ext4 -b 2048 -I 256 /dev/sdb
[root@oldboy test]# ll -i file1.txt
140162 -rw-r--r--. 1 root root 0 Dec 15 07:31 file1.txt
[root@oldboy test]# rm `find . -inum 140162`
[root@oldboy test]# find . -inum 140162 -exec rm {} \;
文件删除备份ext3grep
一个100M(100000K)的磁盘分区,分别写入1K的文件或写入1M的文件,分别可以写都少个?
假设B 4K 写入1k文件的数量基本上就是block数量
假设 inode 数量够多的时候,就是BLOCK的数量。浪费3/4的容量。
假设 inode 数量小于block的数量,就是inode的数量。浪费3/4的容量。
假设B 4K 写入1M的文件
总block数量/250block=存放1M的数量
硬盘空间多大,基本上就可以写入100/1M数量,一般情况inode和block都是做够。
正确答案:
如果向磁盘写入数据提示如下错误:No space left on device,通过df -h查看磁盘空间,发现没满,请问可能是什么原因?企业场景什么情况下会导致这个问题发生呢?
解答:可能是inode数量倍消耗尽了。发生的原因就是小文件特别(如/var/spool/clientmquene这里很容易被大量小文件占满导致No space left on device的错误。而这个目录只有安装了sendmail服务才会有,是sendmail邮件的临时队列。centos5.8默认会安装sendmail服务,而centos6.6默认没有sendmail服务,但是有postfix。)
Linux系统不同于windows系统,两者之间的文件类型和文件扩展名也有很大的差异,两者之间所代表的含义不同。
例如:
windows下文件扩展名:.jpg、.txt、.doc、.pdf、.gif、.exe、.bat等等。
Linux下的文件类型却和扩展名没什么关系。
在Linux系统中,可以说是一切(包括目录、普通文件)皆为文件。文件类型包含有普通文件(-)、目录(d)、字符设备文件(c)、块设备文件(b)、符号链接文件(l)、管道文件(p)等等。
可用ls -l 来查看。
[root@oldboy test]# ls -l
total 4
crw-rw-rw-. 1 root root 1, 5 Nov 21 09:53 character
drwxr-xr-x. 2 root root 4096 Dec 15 07:31 dir
-rw-r--r--. 1 root root 0 Dec 15 16:34 file
lrwxrwxrwx. 1 root root 4 Dec 15 16:34 link -> file
创建: touch、cp、tar、echo、cat、>、>>等工具。
删除: 可用rm命令。
按照内容,有大致可分为三种
PS:通过file命令可以查看文件类型。
通过file命令可以查看文件类型
[root@oldboy test]# file file
file: ASCII text
[root@oldboy test]# file /var/log/lastlog
/var/log/lastlog: data
创建: mkdir、cp
删除: rmdir、rm -r
ls -F或ls -p来区分目录
[root@oldboy test]# ls -F
character dir/ file link@
[root@oldboy test]# ls -p
character dir/ file link
进入/dev目录下查看一个字符文件
[root@oldboy dev]# ll tty
crw-rw-rw-. 1 root tty 5, 0 Nov 21 09:53 tty
进入/dev目录下查看一个块设备文件
[root@oldboy dev]# find /dev/ -type b | xargs ls -l
brw-rw----. 1 root disk 8, 1 Nov 22 06:31 sda1
brw-rw----. 1 root disk 8, 2 Nov 21 09:53 sda2
字符设备和块设备一般都在/dev/目录下,块设备就是存放数据的,如/dev/sda等创建字符文件和块设备文件(不重要,了解即可)
[root@oldboy test]# mknod oldboy c 5 1
[root@oldboy test]# mknod oldboy1 b 5 1
[root@oldboy test]# ll oldboy *
crw-r--r--. 1 root root 5, 1 Dec 15 17:46 oldboy
brw-r--r--. 1 root root 5, 1 Dec 15 17:46 oldboy1
套接字文件也是一类特殊的文件,这类文件通常用在网络之间进行数据连接,如:我们可以启动一个城西来监听客户端的请求,客户端可以通过套接字来进行数据通信。简单了解即可。
查找一个套接字文件
[root@oldboy ~]# find / -type s | xargs ls -l
srw-rw-rw-. 1 root root 0 Nov 21 09:53 /dev/log
符号链接文件也被称之为软连接文件
查找链接文件
[root@oldboy test]# ll link
lrwxrwxrwx. 1 root root 4 Dec 15 16:34 link -> file
#/etc/rc.d/init.d和/etc/init.d这两个文件是一个文件
[root@oldboy test]# ll /etc/rc.d/init.d /etc/init.d -d
lrwxrwxrwx. 1 root root 11 Nov 16 11:27 /etc/init.d -> rc.d/init.d
drwxr-xr-x. 2 root root 4096 Dec 15 06:31 /etc/rc.d/init.d
可用ln -s创建软连接文件
[root@oldboy test]# ln -s file link
FIFO也是一个特殊的文件类型,主要是解决多个程序同时访问一个文件所造成的错误,第一个字符为p。FIFO是fifo–>first-in first-out的缩写。
[root@oldboy ~]# find / -type p | xargs ls -l
prw--w--w-. 1 postfix postfix 0 Dec 15 17:59 /var/spool/postfix/public/pickup
prw--w--w-. 1 postfix postfix 0 Dec 15 17:57 /var/spool/postfix/public/qmgr
r read(读) 4
w write (写) 2
x execute (执行) 1
- 没有权限 0
这9个,三位一组,第一组为属主的权限,用户权限位、第二组为属组权限位、第三组为其他用户的权限位。
在Linux系统中,链接可分为两种:一种为硬链接(HardLink),另一种为软连接或符号链接(Symbolic Link or Soft Link)。ln直接创建的为硬链接,加-s参数创建的链接为软连接。
格式:
硬链接:ln 源文件 目标文件
软连接:ln -s 源文件 目标文件(目标文件不能事先存在)
硬链接是指通过索引节点(Inode)来进行链接。在Linux文件系统中,多个文件名指向同一个索引节点(Inode)是正常且允许的这种情况的文件就称为硬链接。提示:硬链接文件就相当于文件的另外一个入口。硬链接的作用之一是允许一个文件拥有多个有效路径名(多个入口),这样用户就可以建立硬链接到重要的文件,以防止“误删”源数据(很多硬件存储,如netapp存储中的快照功能就应用了这个原理,增加一个快照就多了一个硬链接)。为什么一个文件建立了硬链接就会防止数据误删呢?
因为文件系统(ext2) 的原理是,只要文件的索引节点(Inode Index)还有一个以上的硬链接。只删除其中一个硬链接(即仅仅删除了该文件的链接指向)并不影响索引节点本身和其它的链接(即数据文件实体并未被删除),只有当文件的最后一个链接被删除后,此时如果有新数据要存储到硬盘上时或者系统通过类似fsck做磁盘检查的时候。被删除文件的数据块及目录的链接才会被释放,空间被新数据占用并覆盖。此时,数据就再也无法找回了。也就是说,在linux系统中,删除静态文件(没有进程调用) (目录也是文件)的条件是与之相关的所有硬链接文件均被删除。
[root@oldboy test]# echo 1 > a
[root@oldboy test]# cat a
1
[root@oldboy test]# ll a
-rw-r--r--. 1 root root 2 Dec 15 19:25 a
[root@oldboy test]# ln a b
[root@oldboy test]# ll a
-rw-r--r--. 2 root root 2 Dec 15 19:25 a
[root@oldboy test]# ll -i a b
140170 -rw-r--r--. 2 root root 2 Dec 15 19:25 a
140170 -rw-r--r--. 2 root root 2 Dec 15 19:25 b
软链接(Soft Link)也称为符号链接(Symbolic Link)。Linux里的软链接文件类似于Windows系统里的快捷方式。Linux里的软链接文件实际上是一个特殊的文件,文件类型是 l。软链接文件实际上可以理解为一个文本文件,这个文件中包含有软链接指向另一源文件的位置信息内容,因此,通过访问这个“快捷方式”就可以迅速定位到软链接所指向的源文件实体。
软链接图解
查看软链接的value:
[root@oldboy test]# readlink link
file
#可以看到link这个软链接文件是指向file这个文件的
创建软链接
#加个 -s 参数即可
[root@oldboy test]# ln -s file link
为什么说“.”代表当前目录,因为“.”和oldboy的inode号相同
[root@oldboy test]# ll -a oldboy/. oldboy/ -ldi
140162 drwxr-xr-x. 2 root root 4096 Dec 16 00:14 oldboy/
140162 drwxr-xr-x. 2 root root 4096 Dec 16 00:14 oldboy/.
为什么说“…”代表上一层目录,因为“…/test”和oldboy/…的inode号相同
[root@oldboy test]# ll -a oldboy/.. ../test/ -ldi
140161 drwxr-xr-x. 3 root root 4096 Dec 16 00:14 oldboy/..
140161 drwxr-xr-x. 3 root root 4096 Dec 16 00:14 ../test/
#为什么上面硬链接数为3?
[root@oldboy test]# ll -a oldboy/.. ../test/ ../test/. -ldi
140161 drwxr-xr-x. 3 root root 4096 Dec 16 00:14 oldboy/..
140161 drwxr-xr-x. 3 root root 4096 Dec 16 00:14 ../test/
140161 drwxr-xr-x. 3 root root 4096 Dec 16 00:14 ../test/.
linux的文件名是存在父目录的bolck里面,并指向这个文件的inode节点,这个文件的inode节点再标记指向存放这个文件的bolck的数据块。我们删除一个文件,实际上并不清除inode 节点和block
的数据。只是在这个文件的父目录里面的bolck中,删除这个文件的名字,从而使这个文件名消失,并且无法指向这个文件的inode节点,当没有文件名指向这个inode 节点的时候,会同时释放inode节点和存放这个文件的数据块,并更新inode MAP和block MAP今后让这些位置可以用于放置其他文件数据。
删除原理图:
说明:以上图形i_link=2和i_count=1
i_link(硬链接数量)为0,文件就被删除。。
i_count(进程引用计数)为0,文件就被删除。
文件删除的条件i_link=0并且i_count=0
企业案例1:Web服务器磁盘满故障深入解析
参考博客:http://oldboy.blog.51cto.com/2561410/612351
企业案例2:磁盘满的另外的故障(inode满)
小文件:sendmail产生的日志文件,很小
Linux/Unix是一个多用户、多任务的操作系统。
在linux系统中用户是分角色的,在Linux系统中,由于角色不同,权限和所完成的任务也不同;
值得注意的是,对于linux系统来说,用户的角色是通过UD和GID识别的;特别是UID,在linux系统运维工作中,一个UID是唯一标识一个系统用户的帐号(相当于我们的身份证)。用户系统帐号的名称(如oldboy)其实给人(管理员)看的,linux系统能够识别的仅仅是UID和GID这样的数字。用户的UID就相当于我们的身份证一样,用户名就相当于我们的名字。
UID(User Identify) 中文:用户ID,相当于我们的身份证,在系统里是唯一的
GID(Group Identity)中文:组ID,相当于我们的家庭或我们学校的ID。
用户分为三类:
(1)超级用户:
默认是root用户,其UID和GID均为0.root用户在每台unix/Linux操作系统重都是唯一且真是存在的,通过它可以登录系统,可以操作系统中任何文件和命令,拥有最高的管理权限。在生产环境中,一般会禁止root账号通过ssh远程连接服务器(保护好皇帝),当然,也会更改默认的ssh端口(保护好皇宫),以加强系统安全。
企业工作中:没有特殊需求,应尽量在普通用户下操作任务,而不是root。
在Linux系统中,uid为0的用户就是超级用户,但是通常不这么做,二十sudo管理提权,可以细到每个命令权限分配。
(2)普通用户
这类用户一般是由具备系统管理员rpot的权限的运维或系统管理人员添加的。例如:oldboy
这类用户可以登录系统,但仅具备操作自己家目录中的文件及目录的权限,除此之外,还可以进入、或浏览相关目录(/etc,/var/log),但是无法创建、修改和删除;
普通用户: 比喻皇帝的臣民,干坏事时,国家有法律管束你。为普通用户授权(sudo),封官。布衣也可以提权。
su - root,角色切换,农民起义,推翻皇帝,自己当皇帝。
sudo ls 授权、风管,尚方宝剑。可以为皇帝办事,有一定权限,但还是自己。
(3)虚拟用户
与真实普通用户区分开来,这类用户最大的特点是安装系统后默认就会存在,且默认情况大多数不能登录系统,但是,他们是系统正常运行不可缺少的,它们的存在主要是方便系统管理,满足相应的系统进程对文件属主的要求。例如:系统默认的bin、adm、nobody、mail用户等。由于服务器业务角色的不同,有部分用不到的系统服务被禁止开机执行,因此,在做系统安全优化时,被禁止开机启动了的服务对应的虚拟用户也是可以处理掉的(删除或注释)
Linux安全优化
超级用户: 0
虚拟用户: 1-499
普通用户: 500-65535
Linux系统下的账户文件主要有/etc/passwd、/etc/group、/etc/shadow、/etc/gshadow四个文件。
/etc/passwd #->用户的配置文件
/etc/shadow #->用户影子口令文件
密码文件/etc/passwd:
字段解释:
shell解释器:
[root@oldboy ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh
影子口令文件/etc/shadow
由于passwd文件必须要被所有的用户读,所以会带来安全隐患。而shadow文件就是为了解决这个安全隐患而增加的。看一下这个文件的权限:
[root@oldboy ~]# ls -l /etc/shadow
----------. 1 root root 721 Dec 16 01:36 /etc/shadow
这样是很安全的。
shadow字段说明:
和组相关的配置文件:
/etc/group
/etc/gshadow
用id来查看用户的uid和gid等信息
[root@oldboy ~]# id root
uid=0(root) gid=0(root) groups=0(root)
[root@oldboy ~]# useradd rsq
[root@oldboy ~]# id rsq
uid=500(rsq) gid=500(rsq) groups=500(rsq)
ls -lhi 的7、8、9是时间(默认是修改时间)
modify修改 -mtime(修改文件内容的时候)
change改变时间 -ctime(属性改变)
access访问时间 -atime(访问文件内容的时候)
一般若改变文件内容的时候modify和change都会发生改变,一般改变文件内容,文件的大小就会发生改变,即属性发生改变。
规范时间的参数 --time-style=long-iso
[root@oldboy test]# ll
total 4
drwxr-xr-x. 2 root root 4096 Dec 16 00:14 oldboy
[root@oldboy test]# ll --time-style=long-iso
total 4
drwxr-xr-x. 2 root root 4096 2017-12-16 00:14 oldboy
#显示的更全
[root@oldboy test]# ll --time-style=full
total 4
drwxr-xr-x. 2 root root 4096 2017-12-16 00:14:58.405967561 -0500 oldboy
显示文件的各种时间戳
[root@oldboy oldboy]# stat oldboyfile
File: `oldboyfile'
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 803h/2051d Inode: 140163 Links: 2
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2017-12-15 23:01:22.281943883 -0500
Modify: 2017-12-15 23:01:22.281943883 -0500
Change: 2017-12-15 23:01:35.873966214 -0500
简单的测试各种时间戳改变
[root@oldboy oldboy]# cat w
123
[root@oldboy oldboy]# stat w
File: `w'
Size: 4 Blocks: 8 IO Block: 4096 regular file
Device: 803h/2051d Inode: 140165 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2017-12-16 07:54:39.700956755 -0500
Modify: 2017-12-16 00:14:40.480969366 -0500
Change: 2017-12-16 06:51:03.002957994 -0500
[root@oldboy oldboy]# echo 321 > w
[root@oldboy oldboy]# stat w
File: `w'
Size: 4 Blocks: 8 IO Block: 4096 regular file
Device: 803h/2051d Inode: 140165 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2017-12-16 07:54:39.700956755 -0500
Modify: 2017-12-16 07:55:09.555960261 -0500
Change: 2017-12-16 07:55:09.555960261 -0500
[root@oldboy oldboy]# cat w
321
[root@oldboy oldboy]# stat w
File: `w'
Size: 4 Blocks: 8 IO Block: 4096 regular file
Device: 803h/2051d Inode: 140165 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2017-12-16 07:55:45.973957462 -0500
Modify: 2017-12-16 07:55:09.555960261 -0500
Change: 2017-12-16 07:55:09.555960261 -0500
[root@oldboy oldboy]# chown root.test w
[root@oldboy oldboy]# stat w
File: `w'
Size: 4 Blocks: 8 IO Block: 4096 regular file
Device: 803h/2051d Inode: 140165 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 501/ test)
Access: 2017-12-16 07:55:45.973957462 -0500
Modify: 2017-12-16 07:55:09.555960261 -0500
Change: 2017-12-16 08:00:41.921954381 -0500
第十列 文件名 不在文件inode里,而是在上级目录的block中