文件属性:
# 重点: 磁盘空间不足 和 软链接与硬链接的区别
查看文件的属性:
# ls lhi 文件 [root@NEO ~]# ls -lhi /etc/hosts 130078 -rw-r--r--. 2 root root 180 Mar 14 18:35 /etc/hosts # 上面输出信息 每列的含义: 130078 ===> inode 号码,文件的号码(相当于人的身份证号码) - ===> 第1个 - :表示文件的类型 rw-r--r-- ===> 文件的权限 . ===> 与 selinux 有关 2 ===> 文件的硬链接数量 root ===> 文件的所有者 root ===> 用户属于的家族 180 ===> 文件大小 Mar 14 18:35 ===> 文件的修改时间 /etc/hosts ===> 文件名 (注意:文件名不是文件的属性)
1. inode 和 block 简介
# 获得一个硬盘 到 可以向硬盘中存放数据的过程: # 硬盘(房子) --- 分区(划分隔断) --- 格式化创建文件系统(装修成不同风格) --- 挂载(安装门窗)
inode 和 block
# inode 1) 含义:index node(索引节点) 用来存放文件属性的空间;通过inode号码找到这个空间的 文件名不存放在 inode 中 (所以文件名不属于文件属性) 2) 怎么来的? 格式化创建文件系统时创建的 3) 特点: 1. inode存放文件属性 2. 存放了block的位置(指向block的指针) 3. 创建一个文件就要占用一个inode 4. inode 节点号相同的文件,互为硬链接文件,可以认为是一个文件的不同入口。 5. inode 在某一个文件系统(分区)中,是唯一的 4) 怎么用/看 inode ls -i (看某些文件的 inode 号码) 或者 df -i (系统里面inode用了多少、剩余多少) [root@NEO ~]# ls -i 405404 anaconda-ks.cfg 138447 data 390150 install.log.syslog [root@NEO ~]# ls -li total 16 405404 -rw-------. 1 root root 1061 Oct 16 00:49 anaconda-ks.cfg 138447 drwxr-xr-x. 2 root root 4096 Mar 8 15:55 data 390150 -rw-r--r--. 1 root root 5890 Oct 16 00:47 install.log.syslog [root@NEO ~]# ls -lih total 16K 405404 -rw-------. 1 root root 1.1K Oct 16 00:49 anaconda-ks.cfg 138447 drwxr-xr-x. 2 root root 4.0K Mar 8 15:55 data 390150 -rw-r--r--. 1 root root 5.8K Oct 16 00:47 install.log.syslog [root@NEO ~]# [root@NEO ~]# df -i Filesystem Inodes IUsed IFree IUse% Mounted on /dev/sda3 593344 55426 537918 10% / tmpfs 60748 1 60747 1% /dev/shm /dev/sda1 51200 39 51161 1% /boot # block 1)含义: 数据块 block是实际存放数据的位置 2)怎么来的? 格式化创建文件系统时创建的 3)特点: 1. block是实际存放数据的位置 2. block的大小:4k (centos 6.x默认的大小) 1k 8k 3. 创建大文件会占用多个 block,如果文件很小(如 1k),4k 剩余的空间会被浪费 4. 创建一个非空文件要占用一个 inode 和至少1个 block 5. 每读取一个 block 就会消耗一次磁盘I/O(input/output 磁盘读写) 4) 怎么看/用 block ? df -h (磁盘block使用情况) ls -lh (查看一个文件的大小) [root@NEO ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 8.8G 1.5G 6.9G 18% / tmpfs 238M 0 238M 0% /dev/shm /dev/sda1 190M 40M 141M 22% /boot
No space left on device (磁盘空间不足--因为block满了)
# 1. 看看到底哪里满了 [root@NEO ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 8.8G 1.5G 6.9G 18% / tmpfs 238M 0 238M 0% /dev/shm /dev/sda1 190M 40M 141M 22% /boot [root@NEO ~]# du -sh /* 8.0K /app 7.6M /bin 38M /boot 8.0K /data 220K /dev 30M /etc 24K /home 214M /lib 27M /lib64 16K /lost+found 4.0K /media 4.0K /mnt 24K /neozheng 36K /oldboy 28K /opt du: cannot access `/proc/1893/task/1893/fd/4': No such file or directory du: cannot access `/proc/1893/task/1893/fdinfo/4': No such file or directory du: cannot access `/proc/1893/fd/4': No such file or directory du: cannot access `/proc/1893/fdinfo/4': No such file or directory 0 /proc 64K /root 16M /sbin 4.0K /selinux 4.0K /srv 0 /sys 19M /tmp 1.1G /usr 94M /var # 2. 看看是哪个目录占的空间大,最终定位到目录或文件 [root@NEO ~]# du -sh /* |grep G du: cannot access `/proc/1894/task/1894/fd/4': No such file or directory du: cannot access `/proc/1894/task/1894/fdinfo/4': No such file or directory du: cannot access `/proc/1894/fd/4': No such file or directory du: cannot access `/proc/1894/fdinfo/4': No such file or directory 1.1G /usr [root@NEO ~]# du -sh /usr/* |grep G # du -sh 命令:查看每个目录占多大的空间; grep G 命令:查找占的空间大的目录 # 3. 问清楚是否可以删除,然后再操作
企业案例:如果向磁盘写入数据提示如下错误: No space left on device (磁盘空间不足),通过 df -h 查看磁盘空间,发现没满,请问可能原因是什么?企业场景什么情况下会导致这个问题发生?
# 可能原因: inode 用完了 # 创建环境的命令: mkdir -p /app/logs dd if=/dev/zero of=/dev/sdc bs=8k count=10 ls -l /dev/sdc mkfs.ext4 /dev/sdc # mkfs 是用来格式化的;mk -- make ,f -- file ,s -- system mount -o loop /dev/sdc /app/logs # mount 是 挂载 的命令 [root@NEO tmp]# cd /app/logs/ [root@NEO logs]# touch stu{1..6}.log touch: cannot touch `stu6.log': No space left on device [root@NEO logs]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 8.8G 1.5G 6.9G 18% / tmpfs 238M 0 238M 0% /dev/shm /dev/sda1 190M 40M 141M 22% /boot /dev/sdc 73K 14K 55K 21% /app/logs [root@NEO logs]# df -i Filesystem Inodes IUsed IFree IUse% Mounted on /dev/sda3 593344 55426 537918 10% / tmpfs 60748 1 60747 1% /dev/shm /dev/sda1 51200 39 51161 1% /boot /dev/sdc 16 16 0 100% /app/logs [root@NEO logs]# # 从上面的示例,也是 block 还没用完, 但 inode 用完了
文件属性的文件类型:
- 指代 f,file,即 普通文件 d 指代 d,directory,目录 l 指代 l,softlink,软链接(相当于windows中的快捷方式) # linux下的普通文件也分为3种: [root@NEO lost+found]# ls -l /tmp/etc.tar.gz /bin/ls /etc/hosts -rwxr-xr-x. 1 root root 117048 Mar 23 2017 /bin/ls -rw-r--r--. 2 root root 180 Mar 14 18:35 /etc/hosts -rw-r--r-- 1 root root 9732526 Mar 16 02:45 /tmp/etc.tar.gz [root@NEO lost+found]# 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.18, stripped # 可执行的文件(二进制文件,命令) [root@NEO lost+found]# file /etc/hosts /etc/hosts: ASCII text # 普通文本文件 [root@NEO lost+found]# file /tmp/etc.tar.gz /tmp/etc.tar.gz: gzip compressed data, from Unix, last modified: Sat Mar 16 02:45:23 2019 # 压缩包(数据文件,data) [root@NEO lost+found]# # file 命令: 显示文件的详细类型
扩展名:
windows 通过扩展名区分不同类型的文件 linux中,扩展名是用来给我们看的,你可以随便改,不影响使用,如下: [root@NEO ~]# mv /tmp/etc-exclude.tar.gz /tmp/etc.txt [root@NEO ~]# file /tmp/etc.txt /tmp/etc.txt: gzip compressed data, from Unix, last modified: Sat Mar 16 02:45:50 2019 [root@NEO ~]# # 并且 tar 命令也可以解压 etc.txt 文件 # linux 中常见的扩展名: .sh # 脚本文件(把一堆命令放在一起,可以运行) .conf # 配置文件 # 用户 和 用户组 简介: 对于一个文件/目录来说,用户可以分为3类: 所有者,所属的用户组 和 陌生人 138447 drwxr-xr-x. 2 root root 4.0K Mar 8 15:55 data 这个root 代指 所有者 这个root 代指所有者所属的组的名字(用户组) # 假设我是 oldboy 用户,那么我与这个文件有什么关系 ? # 查询用户信息的命令: id 用户名 # 包含 用户名 及其所属的 用户组(groups=) [root@NEO ~]# id oldboy uid=500(oldboy) gid=500(oldboy) groups=500(oldboy) [root@NEO ~]# # 所以 oldboy 用户 对于这个文件来说就是 陌生人 # linux 中存在于系统中的用户如何分类 ? UID ===> user id, 用户的id号码,相当于 身份证号码,在系统中是唯一的 (UID用的比较多) GID ===> group id,用户组的id号码,相当于 户口本号码 UID 1. 皇帝 root 0 2. 傀儡 虚拟用户 1-499 作用:为了满足系统中每个进程要有一个对应的用户(虚拟用户是无法使用的,无法切换,即无法使用 su -) 3. 贫民百姓 普通用户 500以上 # 如何保护root用户? 1. 禁止root 远程登陆 2. 修改 ssh 默认的端口号 22 3. 定期分析 /var/log/secure (该文件记录着用户的登陆信息)
与用户有关的文件
/etc/passwd # 存放的是用户的信息 /etc/shadow # 存放的是用户密码的信息 /etc/group # 存放的是用户组的信息 /etc/gshadow # 存放的是用户组密码的信息 # /etc/passwd [root@NEO ~]# cat /etc/passwd ... root :x:0 :0 :root :/root :/bin/bash oldboy:x:500 :500: :/home/oldboy :/bin/bash # 冒号是分隔符 # 第一列:用户名字 # 第二列:原来存放密码的地方 # 第三列:UID # 第四列:GID # 第五列:用户的说明信息(默认为空) # 第六列:用户的家目录 # 第七列:用户使用的shell(用户使用的命令解释器;centos 默认的 shell是 /bin/bash) # /bin/bash ---> centos 默认的命令解释器 # /sbin/bash ---> 也是命令解释器,但如果用户的命令解释器为 /sbin/bash,那么用户无法登陆系统(相当于傀儡用户)
linux 9位权限说明与计算
# 权限的种类: # r 4 ---> read;可以读取文件内容(可以用 cat 查看) # w 2 ---> write;可以修改文件内容 # x 1 ---> execute;可以运行文件 (命令、脚本) # - 0 ---> 什么权限都没有 [root@NEO ~]# ls -l /etc/hosts -rw-r--r--. 2 root root 180 Mar 14 18:35 /etc/hosts -rw-r--r--. # 第1个 - :文件类型为普通文件 # rw- :所有者拥有的权限; 420 --> 6 # r-- :用户组拥有的权限; 420 --> 4 # r-- :陌生人对这个文件拥有的权限; 420 --> 4
软链接 和 硬链接
# 软链接: # 软链接相当于 windows 中的快捷方式;也叫 符号链接 # 怎么来的? # 创建软链接的命令: ln -s [root@NEO oldboy]# ln -s oldboy.txt oldboy.txt-soft [root@NEO oldboy]# ls -l oldboy.txt* -rw-r--r-- 1 root root 30 Mar 16 03:28 oldboy.txt lrwxrwxrwx 1 root root 10 Mar 19 04:42 oldboy.txt-soft -> oldboy.txt # 这个就是软链接 (软链接是一种新的文件类型) # 特点: 1. 存放着源文件的位置 2. 源文件被删除,软链接就找不到源文件 3. 主要是为了节约时间 # 硬链接 # 硬链接相当于超市(即 文件内容)的前后门(即 文件),可通过不同的大门进入超市 # 在同一个分区(文件系统中),两个或多个文件的 inode 号码相同,则这些文件互为 硬链接 文件 # 怎么来的? # 创建 硬链接 的命令: ln [root@NEO oldboy]# ln oldboy.txt oldboy.txt-hard [root@NEO oldboy]# ls -lhi oldboy.txt* 140131 -rw-r--r-- 2 root root 30 Mar 16 03:28 oldboy.txt 140131 -rw-r--r-- 2 root root 30 Mar 16 03:28 oldboy.txt-hard # 查看硬链接会涉及到 inode 号码,所以要用 -lhi ;上面的 2 表示 硬链接数量 (即文件有几个入口) # 特点: 1. 硬链接相当于 超市的入口,硬链接的数量就是 文件一共有多少个入口 2. 假设硬链接数是2,删除硬链接或源文件后,文件还能断续使用;如果硬链接和源文件都被删除,则该文件被删除(即 硬链接数量为0) # 硬链接主要用于防止文件被误删,但硬链接不能防止文件被误清空、误修改(此时需要备份 cp;备份会占用更多的空间,但硬链接不会多占空间) # 软链接 和 硬链接的区别(面试题): 解答: 1)如何创建: a) 默认不带参数情况下, ln 命令创建的是硬链接,带 -s 参数的 ln 命令创建的是软链接 2)含义: a) 硬链接文件与源文件的 inode 节点号相同,而软链接文件相当于 windows 下面的 快捷方式 (inode节点号与源文件不同) 3)特点: a) 不能对目录创建硬链接(只能对文件创建硬链接),但可以创建软链接,对目录的软链接会经常用到 b) 软链接可以跨文件系统,硬链接不可以跨文件系统 4)怎么没的?(源文件、软链接、硬链接与删除) a) 删除软链接文件,对源文件及硬链接文件无任何影响 b) 删除文件的硬链接文件,对源文件及软链接文件无任何影响 c) 删除软链接文件的源文件,对硬链接文件无影响,但会导致其软链接失效(红底白字闪烁状) d) 同时删除源文件及其硬链接文件,整个文件才会被真正的删除
linux 中彻底删除一个文件的原理:
1) 删除这个文件所有相关的硬链接 - rm (rm命令删除的是硬链接,只是删除了文件的入口) 2) 这个文件的进程调用数也为0
linux 中彻底删除一个文件的条件:
1. 硬链接数量为0 2. 进程调用数为0 # 磁盘空间不足:某个文件没有被彻底删除,导致的磁盘空间满了 # 一般情况下,大多数服务(包括脚本)在运行时,是不能删除当前正在写入的日志文件的 # 解决办法: 查找机器自身的服务,然后重启 apache 和 tomcat # 模拟的思路:向 /var/log/secure 追加8亿行,然后删除该文件 (因为这个文件一直在运行) [root@NEO ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 8.8G 1.5G 7.0G 18% / tmpfs 238M 0 238M 0% /dev/shm /dev/sda1 190M 40M 141M 22% /boot [root@NEO ~]# seq 800000000 >>/var/log/secure ^C [root@NEO ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 8.8G 8.8G 0 100% / tmpfs 238M 0 238M 0% /dev/shm /dev/sda1 190M 40M 141M 22% /boot [root@NEO ~]# du -sh /* |grep G du: cannot access `/proc/1656/task/1656/fd/4': No such file or directory du: cannot access `/proc/1656/task/1656/fdinfo/4': No such file or directory du: cannot access `/proc/1656/fd/4': No such file or directory du: cannot access `/proc/1656/fdinfo/4': No such file or directory 1.1G /usr 7.5G /var [root@NEO ~]# du -sh /var/* |grep G 7.4G /var/log [root@NEO ~]# du -sh /var/log/* |grep G 7.4G /var/log/secure [root@NEO ~]# m -f /var/log/secure [root@NEO ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 8.8G 8.8G 0 100% / ### 删除 /var/log/secure 后 磁盘仍然被占满 tmpfs 238M 0 238M 0% /dev/shm /dev/sda1 190M 40M 141M 22% /boot [root@NEO ~]# du -sh /* |grep G du: cannot access `/proc/1664/task/1664/fd/4': No such file or directory du: cannot access `/proc/1664/task/1664/fdinfo/4': No such file or directory du: cannot access `/proc/1664/fd/4': No such file or directory du: cannot access `/proc/1664/fdinfo/4': No such file or directory 1.1G /usr # 显示磁盘只占用了 1.1 个 G [root@NEO ~]# lsof |grep delete rsyslogd 1236 root 2w REG 8,3 7867312270 260317 /var/log/secure (deleted) # (deleted) --- 标记,表示这个文件的硬链接数量为0、但进程调用数不为0 软件名称 软件大小(单位为字节) 文件名 # 原因:系统中某个文件没有被彻底删除 # 如何找出硬链接数为0,进程调用数不为0 的文件? # lsof 命令: 能显示出系统中所有的文件 # 解决办法:重启反对应的软件/服务 [root@NEO ~]# /etc/init.d/rsyslog restart # 重启 /etc/log/secure 的命令 Shutting down system logger: [ OK ] Starting system logger: [ OK ] [root@NEO ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 8.8G 1.5G 7.0G 18% / # 此时磁盘空间就恢复了 tmpfs 238M 0 238M 0% /dev/shm /dev/sda1 190M 40M 141M 22% /boot
磁盘空间不足案例总结:
1. block 满了: 如正常 500G的空间但存放了501G的视频 2. inode 满了:大量的小文件 3. block满了:文件没有被彻底删除导致磁盘空间不足;硬链接数为0 但进程调用数不为0
Linux 文件属性之 三种时间
linux修改、访问、改变时间简介:
# mtime :modified time,文件的修改时间 --- 文件内容的变化时间(最常用的时间, ls -l 命令显示的也是文件的修改时间) # ctime :change time , 文件属性的改变时间,如 硬链接数量、文件大小、文件权限等 # atime :access time ,文件的访问时间 (cat 一次) # stat 命令: 显示文件的三种时间 [root@NEO ~]# cd /oldboy/ [root@NEO oldboy]# ls -l oldboy.txt -rw-r--r-- 2 root root 30 Mar 16 03:28 oldboy.txt [root@NEO oldboy]# stat oldboy.txt File: `oldboy.txt' Size: 30 Blocks: 8 IO Block: 4096 regular file Device: 803h/2051d Inode: 140131 Links: 2 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2019-03-16 03:29:35.999220892 +0800 Modify: 2019-03-16 03:28:38.741224512 +0800 Change: 2019-03-19 04:58:46.160174337 +0800 [root@NEO oldboy]# [root@NEO oldboy]# echo hello >>oldboy.txt [root@NEO oldboy]# stat oldboy.txt File: `oldboy.txt' Size: 36 Blocks: 8 IO Block: 4096 regular file Device: 803h/2051d Inode: 140131 Links: 2 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2019-03-16 03:29:35.999220892 +0800 Modify: 2019-03-25 05:25:10.432437899 +0800 Change: 2019-03-25 05:25:10.432437899 +0800 [root@NEO oldboy]# # 上面的ctime 改变是因为文件大小变了 # ctime 时间的改变: 如添加硬链接 [root@NEO oldboy]# ln oldboy.txt oldboy.txt-hard [root@NEO oldboy]# stat oldboy.txt File: `oldboy.txt' Size: 36 Blocks: 8 IO Block: 4096 regular file Device: 803h/2051d Inode: 140131 Links: 2 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2019-03-16 03:29:35.999220892 +0800 Modify: 2019-03-25 05:25:10.432437899 +0800 Change: 2019-03-25 05:29:54.906456408 +0800 [root@NEO oldboy]# # 添加硬链接时,只有 ctime 时间改变 # 这三种时间是文件属性的一部分,文件属性又都放到 inode 中,inode 又放在硬盘里 # atime [root@NEO oldboy]# stat oldboy.txt File: `oldboy.txt' Size: 36 Blocks: 8 IO Block: 4096 regular file Device: 803h/2051d Inode: 140131 Links: 2 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2019-03-16 03:29:35.999220892 +0800 Modify: 2019-03-25 05:25:10.432437899 +0800 Change: 2019-03-25 05:29:54.906456408 +0800 [root@NEO oldboy]# cat oldboy.txt I am oldboy,myqq is 123456789 hello [root@NEO oldboy]# stat oldboy.txt File: `oldboy.txt' Size: 36 Blocks: 8 IO Block: 4096 regular file Device: 803h/2051d Inode: 140131 Links: 2 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2019-03-25 05:35:31.232457722 +0800 Modify: 2019-03-25 05:25:10.432437899 +0800 Change: 2019-03-25 05:29:54.906456408 +0800 [root@NEO oldboy]# # 注意:只有修改文件内容后的那次 cat 文件,文件的 atime 才能改变