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里防火墙:
CentOS6
是iptables
, CentOS7
是firewalld
作用:
防护计算机,防止被入侵。
查看状态:(没有强调,默认是 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 MAP
和block MAP
今后让这些位置可以用于放置其他文件数据。
3.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
数据块,此时,文件就会被真正的回收了。
小结:
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