Linux 文件删除原理_009
***了解Linux文件删除原理先了解一下文件inode索引节点,每个文件在Linux系统里都有唯一的索引节点(身份证号)
inode。如果文件存在硬链接,那这个文件和这个文件的硬链接的inode是相同的,并且可以创建许多硬链接。
参照了解inode索引节点 博客 https://www.cnblogs.com/zoulongbin/p/10456285.html
[root@oldboy test]# ls -li
total 0
140028 -rw-r--r-- 1 root root 0 Nov 16 17:25 file.txt
[root@oldboy test]# ln file.txt /tmp/file_hard_link1.txt
[root@oldboy test]# ln file.txt file_hare_link2.txt
[root@oldboy test]# ls -lih file.txt file_hare_link2.txt /tmp/file_hard_link1.txt
140028 -rw-r--r-- 3 root root 0 Nov 16 17:25 file_hare_link2.txt
140028 -rw-r--r-- 3 root root 0 Nov 16 17:25 file.txt
140028 -rw-r--r-- 3 root root 0 Nov 16 17:25 /tmp/file_hard_link1.txt
一个文件被删除需要满足两个条件:
i_link 硬链接数为0 并且 i_count 进程引用计数也为0,文件才算被删除,否则文件不能说被删除。
文件没被删除,文件的inode索引结点号系统是没有回收的,文件只有完全被删除了后,系统才
会回收文件inode索引节点,而后被创建的新文件使用。

实验
1、创建两文件之前先df –i查看分区inode,创建两个文件,一个file.txt,
内容testfile,另一个文件text.txt,内容abcdef,再查看分区inode变化
[root@oldboy test]# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda3 593344 55834 537510 10% /
tmpfs 125596 1 125595 1% /dev/shm
/dev/sda1 51200 38 51162 1% /boot
[root@oldboy test]# echo "testfile" > file.txt
[root@oldboy test]# echo "abcdef" > text.txt
[root@oldboy test]# ls -l
total 8
-rw-r--r-- 1 root root 9 Nov 16 18:22 file.txt
-rw-r--r-- 1 root root 7 Nov 16 18:23 text.txt
[root@oldboy test]# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda3 593344 55836 537508 10% /
tmpfs 125596 1 125595 1% /dev/shm
/dev/sda1 51200 38 51162 1% /boot
2、创建硬链接对inode大小没有影响
[root@oldboy test]# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda3 593344 55836 537508 10% /
tmpfs 125596 1 125595 1% /dev/shm
/dev/sda1 51200 38 51162 1% /boot
[root@oldboy test]# ln file.txt file_hard_link.txt
[root@oldboy test]# ln text.txt text_hard_link.txt
[root@oldboy test]# ls -lih
total 16K
140028 -rw-r--r-- 2 root root 9 Nov 16 18:22 file_hard_link.txt
140028 -rw-r--r-- 2 root root 9 Nov 16 18:22 file.txt
140787 -rw-r--r-- 2 root root 7 Nov 16 18:23 text_hard_link.txt
140787 -rw-r--r-- 2 root root 7 Nov 16 18:23 text.txt
[root@oldboy test]# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda3 593344 55836 537508 10% /
tmpfs 125596 1 125595 1% /dev/shm
/dev/sda1 51200 38 51162 1% /boot
3、删除text.txt文件本身外还要删除硬链接文件,这样才text.txt文件才算被删除
[root@oldboy test]# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda3 593344 55836 537508 10% /
tmpfs 125596 1 125595 1% /dev/shm
/dev/sda1 51200 38 51162 1% /boot
[root@oldboy test]# find /test/ -type f -name "text.txt" -delete
[root@oldboy test]# ls -l
total 12
-rw-r--r-- 2 root root 9 Nov 16 18:22 file_hard_link.txt
-rw-r--r-- 2 root root 9 Nov 16 18:22 file.txt
-rw-r--r-- 1 root root 7 Nov 16 18:23 text_hard_link.txt
[root@oldboy test]# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda3 593344 55836 537508 10% /
tmpfs 125596 1 125595 1% /dev/shm
/dev/sda1 51200 38 51162 1% /boot
[root@oldboy test]# find /test/ -type f -name "text_hard_link.txt" -delete
[root@oldboy test]# ls -l
total 8
-rw-r--r-- 2 root root 9 Nov 16 18:22 file_hard_link.txt
-rw-r--r-- 2 root root 9 Nov 16 18:22 file.txt
[root@oldboy test]# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda3 593344 55835 537509 10% /
tmpfs 125596 1 125595 1% /dev/shm
/dev/sda1 51200 38 51162 1% /boot
4、使用vim file.txt打开文件,然后打开另一个SSH删除file.txt和file_hard_link.txt后观察分区inode
[root@oldboy test]# vim file.txt
[root@oldboy test]# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda3 593344 55835 537509 10% /
tmpfs 125596 1 125595 1% /dev/shm
/dev/sda1 51200 38 51162 1% /boot
[root@oldboy test]# ls
file_hard_link.txt file.txt
[root@oldboy test]# find /test/ -type f -delete
[root@oldboy test]# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda3 593344 55835 537509 10% /
tmpfs 125596 1 125595 1% /dev/shm
/dev/sda1 51200 38 51162 1% /boot
[root@oldboy test]# ##退出file.txt编辑模式
[root@oldboy test]# ls
file.txt
[root@oldboy test]# find /test/ -type f -delete
[root@oldboy test]# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda3 593344 55834 537510 10% /
tmpfs 125596 1 125595 1% /dev/shm
/dev/sda1 51200 38 51162 1% /boot
企业案例1:Web服务器磁盘分区爆满故障深入解析
原因:
tomcat记录日志access_log过大导致分区爆满,直接删除了tomcatl日志文件access_log,删除access_log记录日志文件后使用df –h查看磁盘分区还是爆满。
创建模拟场景:
##yum安装httpd(tomcat)
[root@oldboy ~]# yum -y install httpd
[root@oldboy ~]# rpm -qa httpd
httpd-2.2.15-69.el6.centos.x86_64
##启动httpd服务
[root@oldboy ~]# /etc/init.d/httpd start
Starting httpd: httpd: apr_sockaddr_info_get() failed for oldboy
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
[ OK ]
##查看htttpd是否运行
[root@oldboy ~]# lsof -i :80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
httpd 2812 root 4u IPv6 15539 0t0 TCP *:http (LISTEN)
httpd 2814 apache 4u IPv6 15539 0t0 TCP *:http (LISTEN)
httpd 2815 apache 4u IPv6 15539 0t0 TCP *:http (LISTEN)
httpd 2816 apache 4u IPv6 15539 0t0 TCP *:http (LISTEN)
httpd 2817 apache 4u IPv6 15539 0t0 TCP *:http (LISTEN)
httpd 2818 apache 4u IPv6 15539 0t0 TCP *:http (LISTEN)
httpd 2819 apache 4u IPv6 15539 0t0 TCP *:http (LISTEN)
httpd 2820 apache 4u IPv6 15539 0t0 TCP *:http (LISTEN)
httpd 2821 apache 4u IPv6 15539 0t0 TCP *:http (LISTEN)
##关闭防火墙
[root@oldboy ~]# /etc/init.d/iptables stop
##修改httpd服务配置文件httpd.conf日志存放路径
[root@oldboy ~]# grep "#CustomLog logs/access_log" /etc/httpd/conf/httpd.conf
#CustomLog logs/access_log common
[root@oldboy logs]#sed -i 's@#CustomLog logs/access_log common@CustomLog /app/logs/access_log common@g' /etc/httpd/conf/httpd.conf
[root@oldboy logs]# grep "CustomLog /app/logs/access_log" /etc/httpd/conf/httpd.conf
CustomLog /app/logs/access_log common
##创建一个模拟的分区/dev/sdb,block大小8K
[root@oldboy ~]# dd if=/dev/zero of=/dev/sdb bs=8k count=10
10+0 records in
10+0 records out
81920 bytes (82 kB) copied, 0.000203364 s, 403 MB/s
##格式化/dev/sdb为ext3系统文件格式
[root@oldboy ~]# mkfs -t ext3 /dev/sdb
##创建一个/dev/sdb挂载点/app/logs
[root@oldboy ~]# mkdir -p /app/logs
#把/dev/sdb挂载到/app/logs
[root@oldboy ~]# mount -o loop /dev/sdb /app/logs/
[root@oldboy ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 8.8G 1.5G 7.0G 17% /
tmpfs 491M 0 491M 0% /dev/shm
/dev/sda1 190M 36M 145M 20% /boot
/dev/sdb 73K 14K 55K 21% /app/logs
[root@oldboy ~]# ls -l /app/logs/
total 12
drwx------ 2 root root 12288 Nov 16 19:27 lost+found
##重启httpd服务使配置文件生效
[root@oldboy ~]# /etc/init.d/httpd restart
Stopping httpd: [ OK ]
Starting httpd: httpd: apr_sockaddr_info_get() failed for oldboy
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
[ OK ]
[root@oldboy ~]# cat /app/logs/access_log
##把httpd服务首页内容修改成oldboy
[root@oldboy ~]# echo oldboy > /var/www/html/index.html
##访问httpd服务,使其产生日志记录
[root@oldboy ~]# curl 127.0.0.1
oldboy
[root@oldboy ~]# cat /app/logs/access_log
127.0.0.1 - - [16/Nov/2018:19:33:26 +0800] "GET / HTTP/1.1" 200 7
[root@oldboy ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 8.8G 1.5G 7.0G 17% /
tmpfs 491M 0 491M 0% /dev/shm
/dev/sda1 190M 36M 145M 20% /boot
/dev/sdb 73K 15K 54K 22% /app/logs
##打开一个新SSH窗口,使用这条命令自动刷访问,把tomcat的记录日志access_log增大,撑满/dev/sdb分区容量
[root@oldboy ~]# for n in `seq 1000`;do curl 127.0.0.1;done
[root@oldboy ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 8.8G 1.5G 7.0G 17% /
tmpfs 491M 0 491M 0% /dev/shm
/dev/sda1 190M 36M 145M 20% /boot
/dev/sdb 73K 71K 0 100% /app/logs
##删除/app/logs记录日志文件
[root@oldboy ~]# find /app/logs/ -type f -name "access_log" -delete
root@oldboy ~]# ls -lh /app/logs/
total 12K
drwx------ 2 root root 12K Nov 16 19:27 lost+found
##查看/dev/sdb分区容量依然爆满
[root@oldboy ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 8.8G 1.5G 7.0G 17% /
tmpfs 491M 0 491M 0% /dev/shm
/dev/sda1 190M 36M 145M 20% /boot
/dev/sdb 73K 73K 0 100% /app/logs
解决办法1:重启httpd服务
标注:使用这种办法是因为进程正在调用access_log记录日志文件,直接删除并不能直接删除这个文件,只能重启httpd服务释放,建议使用下面的解决办法2
[root@oldboy ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 8.8G 1.5G 7.0G 17% /
tmpfs 491M 0 491M 0% /dev/shm
/dev/sda1 190M 36M 145M 20% /boot
/dev/sdb 73K 73K 0 100% /app/logs
[root@oldboy ~]# /etc/init.d/httpd restart
Stopping httpd: [ OK ]
Starting httpd: httpd: apr_sockaddr_info_get() failed for oldboy
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
[ OK ]
[root@oldboy ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 8.8G 1.5G 7.0G 17% /
tmpfs 491M 0 491M 0% /dev/shm
/dev/sda1 190M 36M 145M 20% /boot
/dev/sdb 73K 14K 55K 21% /app/logs
解决办法2:不删除access_log文件,直接清空access_log文件内容
[root@oldboy ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 8.8G 1.5G 7.0G 17% /
tmpfs 491M 0 491M 0% /dev/shm
/dev/sda1 190M 36M 145M 20% /boot
/dev/sdb 73K 73K 0 100% /app/logs
[root@oldboy ~]# > /app/logs/access_log
[root@oldboy ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 8.8G 1.5G 7.0G 17% /
tmpfs 491M 0 491M 0% /dev/shm
/dev/sda1 190M 36M 145M 20% /boot
/dev/sdb 73K 14K 55K 21% /app/logs
感谢老男孩博客提供参考 https://blog.51cto.com/oldboy
Linux 文件删除原理_009的更多相关文章
- linux文件删除原理
文件删除的原理 linux的文件名是存在父目录的block里面的,并指向这个文件的inode节点,这个文件的inode节点在标记指向存放这个文件的block的数据块.我们删除文件,实际上不是清除ino ...
- linux文件属性之linux文件删除原理
Linux是通过link的数量来控制文件删除的,只有当一个文件不存在任何link的时候,这个文件才会被删除.一般来说,每个文件都有2个link计数器:i_count和i_nlink. i_count的 ...
- linux 文件删除原理
文件删除: i_link 文件的硬连接数 i_count 引用计数(有一个程序使用i_count加1) 文件删除的条件: i_link=0 and i_count=0 被进程占用的文件可以删除
- 软硬链接、文件删除原理、linux中的三种时间、chkconfig优化
第1章 软硬链接 1.1 硬链接 1.1.1 含义 多个文件拥有相同的inode号码 硬链接即文件的多个入口 1.1.2 作用 防止你误删除文件 1.1.3 如何创建硬链接 ln 命令,前面是源文件 ...
- Linux文件属性之Linux文件删除重要原理详解
Linux下文件删除的原理 只要dongdaxiafile(源文件).服务进程.dongdaxiaflie_hard_link(硬链接文件)三个中的任意一个存在文件不会被删除.
- Linux文件删除的原理
Linux文件iNode和block是否删除是通过 i_link 和 i_count 的计数值来判断的.只有i_count 和 I_link 同时为0 的 时候,文件的 iNode和block才 ...
- Linux文件删除,但是df之后磁盘空间没有释放
Linux 磁盘空间总是报警,查到到大文件,删除之后,df看到磁盘空间并没有释放. 查找了下发现系统对rm进行了alias ,因为Linux对删除操作没有回收站机制,对rm操作进行了自定义,对删除 ...
- Linux文件删除,但是df -hT之后磁盘空间没有释放
Linux 磁盘空间总是报警,查到到大文件,删除之后,df看到磁盘空间并没有释放. 查找了下发现系统对rm进行了alias ,因为Linux对删除操作没有回收站机制,对rm操作进行了自定义,对删除 ...
- Linux文件删除空间未释放
当系统空间使用量过大需要清理空间或者清理某个文件时,有时会出现执行了删除命令之后磁盘空间并没有释放,很多人首次遇到该情况时会比较困惑,在考虑是不是像windows系统的回收站一样,删除只是逻辑删除到回 ...
随机推荐
- [JOISC2014]たのしい家庭菜園
[JOISC2014]たのしい家庭菜園 题目大意: 给定一个长度为\(n(n\le3\times10^5)\)的序列\(A(A_i\le10^9)\).只能交换相邻两个数,问最少需要几步可以将它变成一 ...
- C++学习笔记51:排序
//直接插入排序函数模板 template <class T> void insertionSort(T a[], int n) { int i, ; T temp; ; i < n ...
- JS 函数表达式
定义函数的方式有两种, 一种是函数声明,一种就是函数表达式了 函数声明最常见了, sayHi(); // 函数声明会发生提升 function sayHi () { alert('Hi') } 函数表 ...
- 前端利器Emmet
前端利器Emmet Emmet可以通过缩写生成代码片段,可以提升前端开发的效率.使用方法就是输入HTML或者CSS的缩写,然后按tab键自动生成.原文在这里 后代 > <!-- nav&g ...
- Java基础知识--集合
集合类 数组和集合的比较:数组可以存储对象,也可以存储基本数据类型,但是缺点就是长度固定,不能改变:集合长度是可变的,但是集合只能存储对象,集合可以存储不同类型的对象. Java容器类库一共有两种主要 ...
- python之socket编程3
1 什么是粘包 只有TCP有粘包现象,UDP永远不会粘包 应用程序所看到的数据是一个整体,或说是一个流(stream),一条消息有多少字节对应用程序是不可见的,因此TCP协议是面向连接的,面向流的,收 ...
- JS_高程5.引用类型(1)Object类型
引用类型 在ECMASCript中,引用类型是一种数据结构,将数据和功能组织在一起,引用类型有时候也被称为对象定义,因为它们描述的是一类对象所具有的属性和方法.(注意:尽管ECMAScript从技术上 ...
- 几个常用的JS鼠标键盘事件例子
首先普及一下鼠标左右键值的相关方法: 1.event.x 鼠标横轴 2.event.y 鼠标纵轴 3.event.keycode 键盘值 4.events.button==0 默认.没有按任何按 ...
- u-boot-2018-09 分析 v1
下载地址: https://pan.baidu.com/s/1YcQ1XpFyzmNcr1afw1RhgQ 或者:
- ABAP非Unicode系统中字符串拼接(CONCATENATE)时吃字符问题
系统是老R3,非Unicdoe系统,某些表字段是从外界系统过来的,由于接口设计的固定长度,外界系统传超长字符串过来后,就可能从最后一个中文字符中间截断,这问题到还没什么,只不过显示时最后一个字符显示成 ...