美文网首页
作业-第03周--预习-Day13-文件核心属性知识(下)

作业-第03周--预习-Day13-文件核心属性知识(下)

作者: MineG | 来源:发表于2019-03-16 17:09 被阅读0次

    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
    

    相关文章

      网友评论

          本文标题:作业-第03周--预习-Day13-文件核心属性知识(下)

          本文链接:https://www.haomeiwen.com/subject/qyzrmqtx.html