26.centos7基础学习与积累-012-文件和目录的属性

从头开始积累centos7系统运用

大牛博客:https://blog.51cto.com/yangrong/p5

1.文件的属性(文件的信息描述):

[root@python01 ~]# ls -lih
total 24K
100663363 -rw-------.  1 root root 1.6K May 24 23:28 anaconda-ks.cfg
101300544 -rw-r--r--.  1 root root  15K Oct  3  2017 epel-release-latest-7.noarch.rpm
   690709 drwxr-xr-x   7 root root  171 Jul 11 11:23 oldboy
 33575402 drwxr-xr-x  26 root root 4.0K Jun 18 10:50 test

节点号  文件类型及权限  属主及所归属的组  最近修改时间  文件或目录名

文字解释:

第一列:inode索引节点编号(人的身份证,全国唯一);

    系统读取文件时首先通过文件名找到inode,如何才能读取文件内容。

第二列:文件类型及权限(共11个字符,第一个字符为类型,后面9个字符为文件权限,最后的.点是与selinux相关的);

第三列:硬链接个数(详细参看ln命令的讲解);

第四列:文件或目录所属的用户(属主);

linux里面文件和程序的存在必须要有用户和组满足相应的存在需求。

第五列:文件或目录所属的组;

第六列:文件或目录的大小;

第七、八、九列:文件或目录的修改时间;默认月日时分

第十列:实际的文件名或目录名;文件名不算文件的属性

 2.索引节点inode

  硬盘要存储数据(房子住人),首先要分区(隔断),然后格式化创建文件系统(装修),最后存数据(住人)。

  inode,中文意思是索引节点(index node)。在每个linux存储设备或存储设备的分区(存储设备可以是硬盘、软盘,U盘... ...)

被格式化为ext4文件系统后,一般都有两个部分:第一部分是Inode(很少个),第二部分是Block(很多个)。

  Block是用来存储实际数据用的,例如:照片,视频等普通文件数据。

  而inode就是用来存储这些数据属性信息的(也就是ls -l的结果),inode包含的属性信息包括不限于文件大小、属主(用户)、归属的用户组、

文件权限、文件类型,修改时间,还包含指向文件实体的指针功能(inode节点--block的对应关系)等,但是inode唯独不包含文件名

   inode除了记录文件属性的信息外,还会为每个文件进行信息索引,所以就有了Inode的数值,操作系统根据指令,

即可通过inode的值最快的找到相对应的文件实体,文件inode,block之间的关系见下图

 

 [root@python01 ~]# stat epel-release-latest-7.noarch.rpm
  File: ‘epel-release-latest-7.noarch.rpm’
  Size: 15080           Blocks: 32         IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 101300544   Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2019-05-24 16:07:02.794093305 +0800
Modify: 2017-10-03 01:52:02.000000000 +0800
Change: 2019-05-24 16:06:56.308813213 +0800
 Birth: -

   第一列:inode值是101300544;查看一个文件或目录的inode,通过ls命令的-i参数即可。

  因为inode要存放文件属性信息,所以每个inode本身是有大小的,centos5系统inode的默认大小是128字节,

而centos6系列inode的默认大小是256字节,inode的大小在分区被格式化创建文件系统之后就无法更改了,格式化前可以指定inode大小,

但是一般工作环境没有这个需求。

  不同centos版本inode大小不同;

centos6

 [root@python01 ~]# dumpe2fs /dev/sda1
dumpe2fs 1.42.9 (28-Dec-2013)
dumpe2fs: Bad magic number in super-block while trying to open /dev/sda1
Couldn't find valid filesystem superblock.

查看剩余和使用中的inode

[root@python01 ~]# df -i
Filesystem                Inodes IUsed    IFree IUse% Mounted on
/dev/mapper/centos-root 24414208 58468 24355740    1% /
devtmpfs                  479656   392   479264    1% /dev
tmpfs                     482689     1   482688    1% /dev/shm
tmpfs                     482689  1232   481457    1% /run
tmpfs                     482689    16   482673    1% /sys/fs/cgroup
/dev/sda1                 256000   327   255673    1% /boot
/dev/mapper/centos-data 79134720    20 79134700    1% /data
tmpfs                     482689     1   482688    1% /run/user/0

 centos7

centos7的文件格式:xfs

[root@python01 ~]# xfs_growfs /dev/sda1|grep -i "isize"     
meta-data=/dev/sda1              isize=512    agcount=4, agsize=32000 blks

[root@python01 ~]# cat /etc/fstab

#
# /etc/fstab
# Created by anaconda on Fri May 24 23:24:42 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=1653bc45-1d10-4e98-805f-6615d99d551f /boot                   xfs     defaults        0 0
/dev/mapper/centos-data /data                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0

 磁盘空间是否满了,是由两项参数觉得的:

第一个是inode满了,

第二个是block满了,  磁盘满提示(no space on device left)

inode小结:

  1.磁盘被分区并格式化为ext4文件系统后会生成一定数量的Inode和block.

  2.inode称为索引节点,它的作用是存放文件的属性信息以及作为文件的索引(指向文件的实体)。

  3.ext3/ext4文件系统的block存放的是文件的实际内容。

  4.inode是磁盘上的一块存储空间,C6非启动分区inode默认大小256字节,C5是128字节。

  5.inode的表现形式是一串数字,不同的文件对应的inode(一串数字)在文件系统里是唯一的

  6.inode节点号相同的文件,互为硬链接文件,可以认为是一个文件的不同入口

  7.ext3/ext4文件系统下,一个文件被创建后至少要占用一个inode和一个block.

  8.ext3/ext4文件系统下,正常情况一个文件占用且只有占用一个Inode(人和身份证)

  9.block是用来存储实际数据的,它的大小一般有1k,2k,3k几种。其中引导分区等为1k,其他普通分区为4k(C6)

  10.如果一个文件很多,可能占多个block,如果文件很少,至少占一个,并且剩余空间浪费了。

  11.inode查看 xfs_growfs /dev/sda1 

  12.查看inode总量和使用量命令df -i

  13.查看文件的Inode信息方法:ls -li   stat /etc/hosts

  14.如何生成及指定inode大小  mkfs.ext4 -b 2048 -l 256 /dev/sdb

block小结:

1.磁盘读取数据是按block为单位读取的。

2.一个文件可能占用多个block,每读取一个block就会消耗一次磁盘I/O.

3.如果要提升磁盘IO性能,那么就要尽可能一次性读取数据尽量的多。

4.一个block只能存放一个文件的内容,无论内容有多小,如果block 4k,那存放1k的文件,剩余3k就浪费了。

5.block并非越大越好。block太大对应肖文杰存放就会浪费磁盘空间,例如:1000k的文件,block为4k,占用250个block;block为1k,占1000个block,访问效率谁更高?消耗IO分别为250次和1000次。

6.根据业务需求,确定默认的block大小,如果是大文件(大于16k)一般设置block大一点,小文件(小于1k)一般设置block小一点。

7.block太大例如4k,文件都是0.1k的,大量浪费磁盘空间,访问性能高。

8.block太小例如1k,文件都是1000k,消耗磁盘IO,访问性能低。

9.block的设置也是格式化分区的时候确定,mkfs.ext4 -b 2048 -I 256 /dev/sdb

10.文件较大时,block设置大一些会提升磁盘访问效率。

11.ext3/ext4文件一般设置为4k.

block=4k=1024*4=4096

[root@python01 ~]# xfs_growfs -i /dev/sda1|grep "bsize"
log size unchanged, skipping
data     =                       bsize=4096   blocks=128000, imaxpct=25
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=855, version=2

总的小结:

1.磁盘被分区格式化文件系统后,会分为inode和blcok两部分内容。

2.inode存放文件的属性以及指向文件实体的指针,文件名不在inode里,

一般在上级目录的block存放。

3.访问文件,通过文件名-->inode-->blocks.

4.inode一般情况默认大小256B,block大小1,2,4K,默认是4K,注意,引导分区等特殊分区除外。

5.通过df -i查看inode的数量及使用情况,centos6/--命令dumpe2fs /dev/sda3 centos7--命令xfs_growfs  /dev/sda1 查看inode及block的大小及数量。

通过inode删除文件,没有必要

[root@python01 ~]# ls -lhi

rm `find . -inum 159004`

find .inum 159004 -exec rm {} ;

文件删除恢复ext3grep,应该养成好习惯,先备份再操作,要能快速还原,不容易还原的,先通过多套测试环境测试,然后再操作。

面试题:一个100M(102400k)的磁盘分区,分别写入1k的文件或写入1M的文件,分别可以写多少个?

错误解答:很容易计算1k的个数:100*1024=102400个,1M文件的个数:100/1=100个。

假设block=4k  写入 1k文件的数量:

  假设inode数量够多的时候,就是block的数量,浪费3/4的容量= 25600

  假设inode数量小于block的数量,就是inode的数量

假设block=4k 写入1M的文件的数量:

  假设磁盘空间足够大,基本上就可以写入100/1M数量,一般情况inode和block都是足够。

a.上面的考试题考察的是文件系统inode和block的知识

b.inode是存放文件属性信息的(也包含指向文件实体的指针),默认大小128byte(c58),256byte(c64)l

c.block是存放文件时间内容的,默认大小1k(boot)或4k(费系统分区默认给4k),一般企业多用4k的block.

d.一个文件至少要占用一个inode及一个block。

e.默认较大分区常规企业真实场景情况下,inode数量足够的。而block数量消耗的会更快。

f.xfs--centos7中的文件系统默认 inode / block 等于1/4.

企业案例:

如果想磁盘写入数据提示如下错误:No space left on device,通过df -h查看磁盘空间,发现没有满,请问可能原因是什么?

解答:可能是inode数量被耗尽了。

企业工作中邮件临时队列/var/spool/clientmquene这里很容易被大量小文件占满导致no space left on device的错误。

clientmquene目录只有安装了sendmail服务,才会有,是sendmail邮件的临时队列,centos5.8默认就会装sendmail,centos6.6默认没有sendmail

删除此目录文件的方法:

/var/spool/clientmquene

find . -print|xargs rm

做定时任务删除此目录的文件

* * * * * /etc/init.d/snmp_cron.sh >/dev/null 2>&1

第二列的意义:

[root@python01 ~]# ls -lhi
total 24K
100663363 -rw-------.  1 root root 1.6K May 24 23:28 anaconda-ks.cfg
101300544 -rw-r--r--.  1 root root  15K Oct  3  2017 epel-release-latest-7.noarch.rpm
   690709 drwxr-xr-x   7 root root  171 Jul 11 11:23 oldboy
 33575402 drwxr-xr-x  26 root root 4.0K Jun 18 10:50 test

文件长格式第二列
文件类型表示符 文件类型说明
d(directory) 表示这是一个目录,如上文ext,在exr2fs中,目录是一个特殊的文件。
-(regular file) 表示这是一个普通的文件
l(link) 表示这是一个符号链接文件,实际上它指向另一个文件。
b(block) 表示块设备和其他的外围设备,是特殊类型的文件。
c(character) 表示字符设备文件
s(socket) 表示socket文件
p(named pipe) 表示管道文件

普通文件(regular file):

第一个属性为“-”,按照文件内容,又大略可以分为:

1.纯文本文件(ascll):文件内容可以直接读到数据,例如:字母、数字、特殊符号等等。可以用cat命令读文件,比如配置文件几乎都是这种类型的。

2.二进制文件(binary):linux中的命令程序就是属于这种格式。例如cat命令就是一个二进制文件。

3.数据格式文件(data):有些程序在运行的过程中会读取某些特定格式的文件,哪些特定格式的文件可以被称为数据文件。

例如:linux在用户登录时,都会讲登录的数据记录在/var/log/wtmp那个文件内,该文件是一个数据文件。通过last命令读出来。

cat命令会读出乱码。因为他属于一种特殊格式的文件。

补充:通过file命令可以查看文件的类型

[root@python01 ~]# ls -l /bin/ls
-rwxr-xr-x. 1 root root 117680 Oct 31  2018 /bin/ls

[root@python01 honortone]# ls -l
total 76
-rw-r--r-- 1 root root 12916 Aug 12 11:43 1.txt
-rw-r--r-- 1 root root 57572 Aug 12 09:25 aduser.txt

[root@python01 honortone]# which lastlog
/usr/bin/lastlog

存放命令的结果数据文件

[root@python01 honortone]# ls /var/log/lastlog
/var/log/lastlog

[root@python01 honortone]# last

[root@python01 honortone]# which last
/usr/bin/last

存放命令的结果数据文件

[root@python01 honortone]# ls /var/log/wtmp
/var/log/wtmp

file命令查看文件的类型

[root@python01 honortone]# file /bin/ls
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=ceaf496f3aec08afced234f4f36330d3d13a657b, stripped
[root@python01 honortone]# file /var/log/wtmp
/var/log/wtmp: data

last查看用户的登录信息:

root     pts/1        192.168.50.171   Mon Aug 12 11:44   still logged in   
root     pts/0        192.168.50.171   Mon Aug 12 09:16   still logged in   
root     pts/0        192.168.50.171   Fri Aug  9 09:50 - 17:14  (07:23)    
root     pts/0        192.168.50.171   Tue Jul 30 13:17 - 16:59  (03:42) 

lastlog显示用户最近登录登录的信息:

Username         Port     From             Latest
root             pts/1    192.168.50.171   Mon Aug 12 11:44:42 +0800 2019
bin                                        **Never logged in**
daemon                                     **Never logged in**

df汇报文件系统磁盘空间:

df -i 查看inode

df -h 人类可读

dumpe2fs查看文件系统内部信息(元数据-基本信息)

目录文件:

创建目录:mkdir

删除目录:rm -r    rmdir

查找长格式然后以目录(d)过滤

区分文件和目录方法一:

[root@python01 ~]# ls -l|grep "^d"
drwxr-xr-x   2 root root    37 Aug 12 11:43 honortone
drwxr-xr-x   7 root root   171 Jul 11 11:23 oldboy
drwxr-xr-x  26 root root  4096 Jun 18 10:50 test

区分文件和目录方法二:

[root@python01 ~]# ls -F
anaconda-ks.cfg  epel-release-latest-7.noarch.rpm  honortone/  oldboy/  test/

[root@python01 ~]# ls -F /etc/ |grep "/$"

tree 大树的意思,显示目录树,-L layer层数, -d显示目录

字符设备或块设备文件:

用不上:

ll -al /dev/tty

[root@python01 ~]# ll -al /dev/tty
crw-rw-rw- 1 root tty 5, 0 Jul 30 13:15 /dev/tty

块设备:

[root@python01 ~]# ll -al /dev/sda
brw-rw---- 1 root disk 8, 0 Jul 30 13:15 /dev/sda

创建块设备不讲

[root@python01 ~]# find /dev -type b
/dev/dm-2
/dev/dm-1
/dev/dm-0
/dev/sda2
/dev/sda1
/dev/sda
/dev/sr0

[root@python01 ~]# find /dev -type b|xargs ls -l
brw-rw---- 1 root disk  253, 0 Jul 30 13:15 /dev/dm-0
brw-rw---- 1 root disk  253, 1 Jul 30 13:15 /dev/dm-1
brw-rw---- 1 root disk  253, 2 Jul 30 13:15 /dev/dm-2
brw-rw---- 1 root disk    8, 0 Jul 30 13:15 /dev/sda
brw-rw---- 1 root disk    8, 1 Jul 30 13:15 /dev/sda1
brw-rw---- 1 root disk    8, 2 Jul 30 13:15 /dev/sda2
brw-rw---- 1 root cdrom  11, 0 Jul 30 13:15 /dev/sr0

字符设备:串口设备

[root@python01 ~]# find /dev -type c|xargs ls -l
crw-rw---- 1 root video    10, 175 Jul 30 13:15 /dev/agpgart
crw------- 1 root root     10, 235 Jul 30 13:15 /dev/autofs
crw------- 1 root root    248,   0 Jul 30 13:15 /dev/bsg/0:0:0:0
crw------- 1 root root    248,   1 Jul 30 13:15 /dev/bsg/2:0:0:0
crw------- 1 root root     10, 234 Jul 30 13:15 /dev/btrfs-control
crw-rw-r-- 1 root root    189,   0 Jul 30 13:15 /dev/bus/usb/001/001
crw-rw-r-- 1 root root    189, 128 Jul 30 13:15 /dev/bus/usb/002/001
crw-rw-r-- 1 root root    189, 129 Jul 30 13:15 /dev/bus/usb/002/002
crw-rw-r-- 1 root root    189, 130 Jul 30 13:15 /dev/bus/usb/002/003
crw------- 1 root root      5,   1 Jul 30 13:15 /dev/console

创建字符设备有点印象就可以了:

mknod erictse c 5 1

[root@python01 ~]# mknod erictse c 5 1
[root@python01 ~]# ls -l erictse
crw-r--r-- 1 root root 5, 1 Aug 12 16:49 erictse

创建块设备有点印象就可以了:

[root@python01 ~]# mknod erictseb b 5 1
[root@python01 ~]# ls -l erictseb      
brw-r--r-- 1 root root 5, 1 Aug 12 16:50 erictseb

链接文件

[root@python01 ~]# find /etc/ -type  l -name "init.d"|xargs ls -ld
lrwxrwxrwx. 1 root root 11 May 24 23:24 /etc/init.d -> rc.d/init.d

[root@python01 ~]# ls -l /etc/init.d /etc/rc.d/init.d  -d
lrwxrwxrwx. 1 root root 11 May 24 23:24 /etc/init.d -> rc.d/init.d
drwxr-xr-x. 2 root root 85 Jul 12 15:56 /etc/rc.d/init.d

拓展名:

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表示网页语言的文件。

6.conf表示系统配置文件。

7.rpm表示rpm安装包文件。

富人的思想:

1.越是免费的往往越是更贵的!

便宜的往往也是更贵的。

只选贵的,不选对的。

2.学习的投资永远是最有价值的投资。

投资自己的大脑永远是最有价值的投资

3.相信只有努力付出才能得到回报!

4.不断的向有经验的人学习

5.定好只是边界,百分百的投入

不管是新手还是老手,学习都一定要根据目标给自己划定正确的知识边界,这就好比MH370一样,如不定好坠楼方位,

动用再多的人力和物力也是难以搜寻到的!

没有清晰的知识边界的学习者,就像能瞎子掰苞米,学了后面的忘记前面的,复习前面的又忘掉后面的,将会一事无成!

6.行动失败了比不做要好的多

一个人不成功的原因往往并不是因为缺少能力和技术,而是缺少行动的魄力和勇气,以及持续坚持自己的行动并不断自我完善的品质

原文地址:https://www.cnblogs.com/ericchengge677/p/11196022.html