Day13 预习笔记
1. 硬链接属性
1.1 链接的概念
在Linux系统中,链接可分为两种:硬链接(hard link)和软连接(soft link)或符号链接(symbolic link)。软连接文件的文件类型为l(字母L)。
- 创建硬链接语法:ln 源文件 目标文件。
- 创建硬链接语法:ln -s 源文件 目标文件(目标文件不能事先存在)。
1.2 硬链接知识与实践
硬链接是指通过索引节点进行的链接,在Linux系统中,多个文件名指向同一个索引节点是正常且允许的。这种情况下的两个文件就叫做互为硬链接文件,本质就是相同文件的两个名字。硬链接文件就相当于原始文件的另外一个访问入口。
[root@oldboyedu ~]# echo "I am oldboy" >oldboyfile
[root@oldboyedu ~]# ln oldboyfile oldboyfile_hard_link
[root@oldboyedu ~]# cat oldboyfile
I am oldboy
[root@oldboyedu ~]# cat oldboyfile_hard_link
I am oldboy
[root@oldboyedu ~]# ls -li oldboyfile oldboyfile_hard_link
33637537 -rw-r--r-- 2 root root 12 Mar 16 14:44 oldboyfile
33637537 -rw-r--r-- 2 root root 12 Mar 16 14:44 oldboyfile_hard_link
[root@oldboyedu ~]# rm -f oldboyfile
[root@oldboyedu ~]# ls -li oldboyfile oldboyfile_hard_link
ls: cannot access oldboyfile: No such file or directory
33637537 -rw-r--r-- 1 root root 12 Mar 16 14:44 oldboyfile_hard_link
[root@oldboyedu ~]# cat oldboyfile_hard_link
I am oldboy
[root@oldboyedu ~]# ln oldboyfile_hard_link oldboyfile
[root@oldboyedu ~]# ls -li oldboyfile oldboyfile_hard_link
33637537 -rw-r--r-- 2 root root 12 Mar 16 14:44 oldboyfile
33637537 -rw-r--r-- 2 root root 12 Mar 16 14:44 oldboyfile_hard_link
[root@oldboyedu ~]# cat oldboyfile
I am oldboy
[root@oldboyedu ~]#
硬链接知识小结
- 具有相同Inode节点号的多个文件互为硬链接文件,本质是相同文件不同文件名。
- 删除硬链接文件或者删除源文件任意之一,文件实体并未删除。
- 只有删除了源文件及所有对应的硬链接文件,文件实体才会被删除。
- 待所有的硬链接文件及源文件被删除后,在存放新的数据会占用这个文件的空间,或者磁盘fsck检查的时候,删除的数据也会被系统回收(养成删除及使用多套环境测试的好习惯)。
- 硬链接就是文件的另一个入口。
- 可以通过给文件设置硬链接文件,来防止重要文件被误删。
- 通过执行命令“ln 源文件 硬链接文件”,即可完成创建硬链接。
- 硬链接是普通文件,可以用rm命令删除。
- 对应静态文件(没有进程正在调用的文件)来讲,当对应硬链接数为0(i_link)时,文件就被删除。
- 创建硬链接只能针对文件,不能针对目录。
1.3 软链接知识与实践
软连接(Soft Link)也称符号链接(symbolic link),相当于Windows系统中的快捷方式。
1.3.1 文件的软连接示例:
文件的软连接示例如下:
[root@oldboyedu ~]# ls -li oldboyfile oldboyfile_hard_link
33637537 -rw-r--r-- 2 root root 12 Mar 16 14:44 oldboyfile
33637537 -rw-r--r-- 2 root root 12 Mar 16 14:44 oldboyfile_hard_link
[root@oldboyedu ~]# ln -s oldboyfile oldboyfile_soft_link
[root@oldboyedu ~]# ls -li oldboyfile*
33637537 -rw-r--r-- 2 root root 12 Mar 16 14:44 oldboyfile
33637537 -rw-r--r-- 2 root root 12 Mar 16 14:44 oldboyfile_hard_link
33637538 lrwxrwxrwx 1 root root 10 Mar 16 15:06 oldboyfile_soft_link -> oldboyfile
[root@oldboyedu ~]# cat oldboyfile_soft_link
I am oldboy
[root@oldboyedu ~]# readlink oldboyfile_soft_link
oldboyfile
[root@oldboyedu ~]# rm -f oldboyfile
[root@oldboyedu ~]# cat oldboyfile_soft_link
cat: oldboyfile_soft_link: No such file or directory
[root@oldboyedu ~]# ls -li oldboyfile*
33637537 -rw-r--r-- 1 root root 12 Mar 16 14:44 oldboyfile_hard_link
33637538 lrwxrwxrwx 1 root root 10 Mar 16 15:06 oldboyfile_soft_link -> oldboyfile
[root@oldboyedu ~]#
1.3.2 目录的软连接示例:
目录的软连接示例如下:
[root@oldboyedu ~]# mkdir oldboydir
[root@oldboyedu ~]# ln oldboydir oldboydir_hard_link
ln: ‘oldboydir’: hard link not allowed for directory
[root@oldboyedu ~]# ln -s oldboydir oldboy_soft_link
[root@oldboyedu ~]# ls -lirt
total 88
33574978 -rw-------. 1 root root 1647 Mar 4 11:24 anaconda-ks.cfg
34152165 -rw-r--r-- 1 root root 74376 Mar 15 10:42 cmatrix-1.2a.tar.gz
34152166 drwxrwxrwx 2 500 500 4096 Mar 15 10:49 cmatrix-1.2a
33129 drwxr-xr-x 2 root root 6 Mar 16 12:31 data
33637537 -rw-r--r-- 1 root root 12 Mar 16 14:44 oldboyfile_hard_link
33637538 lrwxrwxrwx 1 root root 10 Mar 16 15:06 oldboyfile_soft_link -> oldboyfile
17242942 drwxr-xr-x 2 root root 6 Mar 16 15:11 oldboydir
33637539 lrwxrwxrwx 1 root root 9 Mar 16 15:13 oldboy_soft_link -> oldboydir
[root@oldboyedu ~]#
软链接知识小结
- 软连接类似Windows的快捷方式(可以通过readlink查其指向)。
- 软连接类似一个文本文件,里面存放的是源文件的路径,指向源文件实体。
- 删除源文件,软连接文件依然存在,但是无法访问指向源文件路径内容了。
- 执行命令“ln -s 源文件 软连接文件”,即可完成创建软链接。
- 软连接和源文件是不同类型的文件,也是不同的文件,Inode号也不相同。
- 软连接文件的文件类型为字母l,可以用rm命令删除。
- 软连接文件不仅可以针对文件,也可以针对目录(企业中常用)。
企业面试:请描述Linux中软连接和硬链接的区别
1)答分类:在Linux系统中,连接分两种:一种被称为硬链接(Hard Link),另一种被称为软连接(soft link)或符号链接(symbolic link)。
2)答概念:硬链接文件与源文件的Inode节点号相同,而软连接文件相当于Windows下面的快捷方式(Inode节点号与源文件不同)。
3)答创建:默认不带参数的情况下,ln命令创建的是硬链接,带-s参数的ln命令创建的是软连接。
4)答特点:
a. 不能对目录创建硬链接,但可以创建软连接,对目录的软连接会经常被用到。
b. 软连接可以跨文件系统,硬链接不可以跨文件系统。
c. 删除软链接,对源文件及硬链接文件无任何影响。
d. 删除文件的硬链接,对源文件及软链接文件无任何影响。
e. 删除链接文件的源文件,对硬链接文件无影响,会导致其软链接失效(红底白字闪烁状)。
f. 同时删除源件及其硬链接文件,整个文件才会被真正的删除。
5)答案例:硬链接用处不多,可以用来对重要文件做快照防止误删,而对目录建立软链接在工作中很常用。
2. linux系统文件删除原理
2.1 从ext文件系统角度描述文件删除原理
linux系统下文件名是存在父目录的block里面,并指向这个文件的inode节点,这个文件的inode节点再指向存放这个文件的block数据块。 我们删除一个文件,实际上并不是清除了inode节点和block数据块。只是在这个文件的父目录里面的block中,删除了这个文件的名字,从而使这个文件名消失,并且无法指向这个文件的inode节点。 当没有文件名指向这个inode节点的时候,会同时释放inode节点和存放这个文件的block数据块,并更新inode MAP和block MAP今后让这些位置可以用于放置其他文件数据。
2.2 从文化引用角度深入描述文件删除的原理
当创建文件的硬链接的时候,对应的i_link数会增加。当一个文件被某一个进程引用时,对应i_count数就会增加。 对于删除命令rm而言,实际就是减少i_link。那么如果一个文件正在被某个进程调用,而用户却执行rm操作把文件删除了,这会出现什么情况?
用户执行rm操作文件后,再执行ls或其他文件管理命令,无法再找到这个文件了,但是调用这个被删除的文件的进程却在继续执行,依然能从文件中正确的读取及写入内容,这又是为什么呢? 这是因为rm操作只是将i_link减少了,如果没有其他的链接i_link就为0了,但由于该文件依然被进程引用,因此文件对应的i_count并不为0,所以即使执行rm操作,但系统并没有真正删除这个文件,当只有i_link及i_count都为0的时候,这个文件才会真正被删除。也就是说还需接解除该进程对这个文件的调用才行。 那么当文件没有被调用时,执行了rm操作删除文件后是否还可以找回被删除的文件呢? rm操作只是将文件的i_link减少了,实际就是将文件名到inode的链接删除了。即使i_link减少到0了,此时并没有删除文件的实体(block数据块)。此时,如果即使停止机器工作,数据是可以找回的,如果此时继续写入数据,那么新数据就可能会被分配到被删除的block数据块,此时,文件就会被真正的回收了。
2.3 有关文件删除企业故障案例
下面模拟文件被删除了(硬链接数为0),但是还有进程调用的情况。
操作步骤和命令集如下:
1)安装httpd web服务。
[root@oldboyedu ~]# yum install httpd -y
...
[root@oldboyedu ~]# systemctl start httpd.service
[root@oldboyedu ~]# systemctl stop firewalld
[root@oldboyedu ~]# cd /etc/httpd/conf
编辑配置文件,让日志记录到/app/logs/下面。
[root@oldboyedu /etc/httpd/conf]# sed -i 's@#CustomLog logs/access_log common@CustomLog /app/logs/access_logcommon@g' httpd.conf
[root@oldboyedu /etc/httpd/conf]#
2)创建一个小的文件系统,用于存放上述access_log日志。
[root@oldboyedu ~]# dd if=/dev/zero of=/dev/sdc bs=8K count=10
10+0 records in
10+0 records out
81920 bytes (82 kB) copied, 0.00013485 s, 607 MB/s
[root@oldboyedu ~]# ls -l /dev/sdc
-rw-r--r-- 1 root root 81920 Mar 16 16:24 /dev/sdc
[root@oldboyedu ~]# mkfs -t ext4 /dev/sdc
mke2fs 1.42.9 (28-Dec-2013)
/dev/sdc is not a block special device.
Proceed anyway? (y,n) y
Filesystem too small for a journal
Discarding device blocks: done
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
16 inodes, 80 blocks
4 blocks (5.00%) reserved for the super user
First data block=1
1 block group
8192 blocks per group, 8192 fragments per group
16 inodes per group
Allocating group tables: done
Writing inode tables: done
Writing superblocks and filesystem accounting information: done
[root@oldboyedu ~]# tune2fs -c -1 /dev/sdc
tune2fs 1.42.9 (28-Dec-2013)
Setting maximal mount count to -1
[root@oldboyedu ~]# mkdir -p /app/logs
[root@oldboyedu ~]# mount -o loop /dev/sdc /app/logs
[root@oldboyedu ~]# echo "oldboy" > /var/www/html/index.html
3)重启httpd服务,确保日志记录到了上述文件系统挂载的/app/logs下面。
[root@oldboyedu ~]# systemctl restart httpd.service
4)写个循环脚本访问httpd,使得httpd日志充满/app/logs整个空间。
for n in 'seq 10000';do curl -s 127.0.0.1 >/dev/null;done
[root@oldboyedu ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 19G 1.8G 18G 10% /
devtmpfs 476M 52K 476M 1% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 7.7M 479M 2% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda1 253M 136M 117M 54% /boot
tmpfs 98M 0 98M 0% /run/user/0
/dev/loop0 73K 73K 0 100% /app/logs
以下是一个错误的删除方案。
[root@oldboyedu ~]# rm -f /app/logs/access_log
[root@oldboyedu ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 19G 1.8G 18G 10% /
devtmpfs 476M 52K 476M 1% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 7.7M 479M 2% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda1 253M 136M 117M 54% /boot
tmpfs 98M 0 98M 0% /run/user/0
/dev/loop0 73K 73K 0 100% /app/logs
查看被删除的但仍由httpd进程占用的日志系统文件名。
[root@oldboyedu ~]# lsof | grep del
httpd 6184 root 7w REG 7,0 55260 12 /app/logs/access_log (deleted)
httpd 38178 root 7w REG 7,0 55260 12 /app/logs/access_log (deleted)
httpd 38483 root 7w REG 7,0 55260 12 /app/logs/access_log (deleted)
以下是解决问题的方法。
第一步,执行快捷键Ctrl+c 停掉模拟访问测试脚本。
for n in 'seq 10000';do curl -s 127.0.0.1 >/dev/null;done
第二步,重启Http服务,目的是取消httpd对删除的access.log文件的调用
[root@oldboyedu ~]# systemctl restart httpd.service
然后查看处理的结果
[root@oldboyedu ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 19G 1.8G 18G 10% /
devtmpfs 476M 52K 476M 1% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 7.7M 479M 2% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda1 253M 136M 117M 54% /boot
tmpfs 98M 0 98M 0% /run/user/0
/dev/loop0 73K 14K 54K 21% /app/logs
下面介绍一下较好的处理方案
此时,我们选择清空日志而不删除日志,因为企业中的Web日志都是定期轮询的,并且它会自动备份且清理过期的日志
[root@oldboyedu ~]# > /app/logs/access_log