作业-第04周--课堂-Day13-linux文件核心属性知识(下)

Day13课堂笔记

1. Selinux与firewalld

1.1 Selinux

[root@oldboyedu ~]# ls -lhi
total 32K
33631870 -rw-r--r--. 1 root root      4 Mar 13  2019 a.txt

第二列结尾的. 是标识selinux的符号
1、selinux是什么?
是一种安全规则,能让Linux系统更安全的一套规则。但是这个规则太严格了,一般的情况下都会关闭selinux。自己开启防火墙,用其他手段来实现同样的安全目的。
2、怎么关掉Selinux?
查看方法:

[root@oldboyedu ~]# getenforce 
Enforcing

临时关掉:

[root@oldboyedu ~]# setenforce 
usage:  setenforce [ Enforcing | Permissive | 1 | 0 ]
[root@oldboyedu ~]# setenforce 0
[root@oldboyedu ~]# getenforce 
Permissive

永久关闭:

[root@oldboyedu ~]#vim /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected. 
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted
root@oldboyedu ~]# grep dis /etc/selinux/config
#     disabled - No SELinux policy is loaded.
SELI###1.1 SelinuxNUX=disabled

1.2 firewalld

Linux里防火墙:

CentOS6iptablesCentOS7firewalld

作用:

防护计算机,防止被入侵。

查看状态:(没有强调,默认是 CentOS7

[root@oldboyedu ~]#systemctl status firewalld.service 

开启firewalld:

CentOS6

 service iptables start 
或者
 /etc/init.d/iptables start

CentOS7

[root@oldboyedu ~]# systemctl start firewalld.service 
[root@oldboyedu ~]# systemctl status firewalld.service 
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: active (running) since Sun 2020-10-04 20:48:49 CST; 1s ago
     Docs: man:firewalld(1)
 Main PID: 7003 (firewalld)
   CGroup: /system.slice/firewalld.service
           └─7003 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

Oct 04 20:48:48 oldboyedu systemd[1]: Starting firewalld - dynamic firewall daemon...
Oct 04 20:48:49 oldboyedu systemd[1]: Started firewalld - dynamic firewall daemon.

开机自启动:

CentOS6

chkconfig iptables off

CentOS7

[root@oldboyedu ~]# systemctl enable firewalld.service 
Created symlink from /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service to /usr/lib/systemd/system/firewalld.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/firewalld.service to /usr/lib/systemd/system/firewalld.service.

CentOS7就是一个命令systemctl

2. 硬链接属性

2.1 链接的概念

在Linux系统中,链接可分为两种:硬链接(hard link)和软连接(soft link)或符号链接(symbolic link)。软连接文件的文件类型为l(字母L)。

  • 创建硬链接语法:ln 源文件 目标文件。
  • 创建硬链接语法:ln -s 源文件 目标文件(目标文件不能事先存在)。

2.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)时,文件就被删除。
  • 创建硬链接只能针对文件,不能针对目录。

2.3 软链接知识与实践

软连接(Soft Link)也称符号链接(symbolic link),相当于Windows系统中的快捷方式。

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  ~]# 

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  ~]# 

工作中为什么会使用软链接。

第一个用途:
不使用软连接:
安装软件:/application/nginx-1.10
过半年后:/application/nginx-1.20
工作中,开发等还是会引用/application/nginx-1.10路径。就会导致错误。
而使用软连接后:
安装软件:/application/nginx-1.10===>/application/nginx(让开发用)
过半年后: /application/nginx-1.20===>/application/nginx(让开发用)

第二个用途:
假如/etc/对应的分区要满了,没法放很多文件,但是程序还想通过/etc/目录访问文件。
此时,我们可以把文件放入/opt/oldboy下,然后做一个到/etc/oldboy的软链接。

[root@oldboyedu /data]# mkdir /opt/oldboy
[root@oldboyedu /data]# touch /opt/oldboy/{1..3}.txt
[root@oldboyedu /data]# ln -s /opt/oldboy/ /etc/oldboy
[root@oldboyedu /data]# ls /etc/oldboy
1.txt  2.txt  3.txt
[root@oldboyedu /data]# ll /opt/oldboy
total 0
-rw-r--r--. 1 root root 0 Oct  4 22:02 1.txt
-rw-r--r--. 1 root root 0 Oct  4 22:02 2.txt
-rw-r--r--. 1 root root 0 Oct  4 22:02 3.txt

软链接知识小结

  • 软连接类似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)答案例:硬链接用处不多,可以用来对重要文件做快照防止误删,而对目录建立软链接在工作中很常用。

3. linux系统文件删除原理

3.1 从ext文件系统角度描述文件删除原理

linux系统下文件名是存在父目录的block里面,并指向这个文件的inode节点,这个文件的inode节点再指向存放这个文件的block数据块。 我们删除一个文件,实际上并不是清除了inode节点和block数据块。只是在这个文件的父目录里面的block中,删除了这个文件的名字,从而使这个文件名消失,并且无法指向这个文件的inode节点。 当没有文件名指向这个inode节点的时候,会同时释放inode节点和存放这个文件的block数据块,并更新inode MAPblock MAP今后让这些位置可以用于放置其他文件数据。

3.2 从文化引用角度深入描述文件删除的原理

当创建文件的硬链接的时候,对应的i_link数会增加。当一个文件被某一个进程引用时,对应i_count数就会增加。 对于删除命令rm而言,实际就是减少i_link。那么如果一个文件正在被某个进程调用,而用户却执行rm操作把文件删除了,这会出现什么情况?
用户执行rm操作文件后,再执行ls或其他文件管理命令,无法再找到这个文件了,但是调用这个被删除的文件的进程却在继续执行,依然能从文件中正确的读取及写入内容,这又是为什么呢? 这是因为rm操作只是将i_link减少了,如果没有其他的链接i_link就为0了,但由于该文件依然被进程引用,因此文件对应的i_count并不为0,所以即使执行rm操作,但系统并没有真正删除这个文件,当只有i_linki_count都为0的时候,这个文件才会真正被删除。也就是说还需接解除该进程对这个文件的调用才行。 那么当文件没有被调用时,执行了rm操作删除文件后是否还可以找回被删除的文件呢? rm操作只是将文件的i_link减少了,实际就是将文件名到inode的链接删除了。即使i_link减少到0了,此时并没有删除文件的实体(block数据块)。此时,如果即使停止机器工作,数据是可以找回的,如果此时继续写入数据,那么新数据就可能会被分配到被删除的block数据块,此时,文件就会被真正的回收了。


小结:
1、静态文件:没有进程或程序正在访问的文件。
所有的硬链接数为0(i_link),即所有硬链接都被干掉了,包括自身。
硬链接的数量的代表变量符号 i_link

rm -f oldboy.txt oldboy_hard_link 

执行完 其实文件也没删,关机停止运行。
a.系统定时清理没有文件名的inode
b.磁盘检查会清理。
c.增加新文件时优先占用没有文件名的inode
恢复的工具:debugfs,ext3grep等等。
亡羊补牢其实不可取的,违反运维的三大核心原则。
多备份,操作前备份,异服务器和异地备份。

2、动态文件:有程序或进程访问的文件
删除原理:
a、所有硬链接删除。i_link为0。
b、i_count是进程调用文件的数量(引用计数)。所有进程调用都要停止取消。i_count为0。


3.3 有关文件删除企业故障案例1

下面模拟文件被删除了(硬链接数为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

3.4 有关文件删除企业故障案例2(基本同上)

环境准备,命令集合如下:

mkdir -p /app/logs                           #<==创建用于挂载的目录。
dd if=/dev/zero of=/dev/sdc bs=8K  count=10  #<==创建指定大小的文件。
mkfs.ext4 /dev/sdc                           #<==格式化。
mount -o loop /dev/sdc /app/logs             #<==挂载。
df -h                                        #<==检查挂载结果。

实践:

[root@oldboyedu /data]# cd /app/logs/
[root@oldboyedu /app/logs]# touch nginx.log
[root@oldboyedu /app/logs]# tail -f nginx.log 
[root@oldboyedu /app/logs]# cat /etc/services >>nginx.log 
cat: write error: No space left on device
[root@oldboyedu /app/logs]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3        19G  1.9G   18G  10% /
devtmpfs        980M   80K  980M   1% /dev
tmpfs           991M     0  991M   0% /dev/shm
tmpfs           991M  9.5M  981M   1% /run
tmpfs           991M     0  991M   0% /sys/fs/cgroup
/dev/sda1       253M  136M  118M  54% /boot
tmpfs           199M     0  199M   0% /run/user/0
/dev/loop0       73K   71K     0 100% /app/logs

明明删除了,结果还是100%。

[root@oldboyedu /app/logs]# rm -f nginx.log 
[root@oldboyedu /app/logs]# lsof|grep nginx
tail      7927         root    3r      REG                7,0     57344         12 /app/logs/nginx.log (deleted)

[root@oldboyedu /app/logs]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3        19G  1.9G   18G  10% /
devtmpfs        980M   80K  980M   1% /dev
tmpfs           991M     0  991M   0% /dev/shm
tmpfs           991M  9.5M  981M   1% /run
tmpfs           991M     0  991M   0% /sys/fs/cgroup
/dev/sda1       253M  136M  118M  54% /boot
tmpfs           199M     0  199M   0% /run/user/0
/dev/loop0       73K   71K     0 100% /app/logs

重来:
模拟进程读文件:

[root@oldboyedu /app/logs]# touch nginx.log
[root@oldboyedu /app/logs]# tail -f nginx.log 

ln nginx.log nginx_hard.log

当前:
i_link=2
i_count=1

模拟把文件变大,让分区满

[root@oldboyedu /app/logs]# cat /etc/services >>nginx.log 
cat: write error: No space left on device
[root@oldboyedu /app/logs]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3        19G  1.9G   18G  10% /
devtmpfs        980M   80K  980M   1% /dev
tmpfs           991M     0  991M   0% /dev/shm
tmpfs           991M  9.5M  981M   1% /run
tmpfs           991M     0  991M   0% /sys/fs/cgroup
/dev/sda1       253M  136M  118M  54% /boot
tmpfs           199M     0  199M   0% /run/user/0
/dev/loop0       73K   71K     0 100% /app/logs

分区满了:清理,删除。

删除源文件

[root@oldboyedu /app/logs]# rm -f nginx.log 

结果:
i_link=1
i_count=1

ctrl+c中断 进程调用文件
结果:

i_link=1
i_count=0

删除硬链接文件

[root@oldboyedu /app/logs]# rm -f nginx_hard.log 

结果:
i_link=0
i_count=0

[root@oldboyedu /app/logs]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3        19G  1.9G   18G  10% /
devtmpfs        980M   80K  980M   1% /dev
tmpfs           991M     0  991M   0% /dev/shm
tmpfs           991M  9.5M  981M   1% /run
tmpfs           991M     0  991M   0% /sys/fs/cgroup
/dev/sda1       253M  136M  118M  54% /boot
tmpfs           199M     0  199M   0% /run/user/0
/dev/loop0       73K   14K   54K  21% /app/logs

你可能感兴趣的:(作业-第04周--课堂-Day13-linux文件核心属性知识(下))