从头开始积累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.行动失败了比不做要好的多
一个人不成功的原因往往并不是因为缺少能力和技术,而是缺少行动的魄力和勇气,以及持续坚持自己的行动并不断自我完善的品质