### (第一章:走进Linux) **Linux之父:林纳斯.托瓦兹** ###### Linux发行版本 centos Ubuntu Linux Mint ###### 红帽认证 红帽认证是由红帽linux公司推出的,主要包括红帽认证系统管理员(RHCSA),红帽认证工程师(RHCE)和红帽认证架构师(RHCA)。是以实际操作能力为基础的测试项目,主要考察考生在实际操作系统中的实践能力。红帽培训和测试非常注重培养实际的动手实战能力! ------ ###### Linux操作系统 Linux操作系统:企业中做服务器操作系统,安全、高效、稳定等特性 Windows操作系统:娱乐、办公、影音.... ------ ###### 创建虚拟机 cpu处理器 mem内存 disk磁盘 都是可以变化的 网络采用默认模式(桥接 网络地址转换 仅主机) 2.给虚拟机分配镜像 3.安装操作系统 时区: Asia/Shanghai 安装方式: 最小化安装 图形化安装 磁盘分区: 磁盘:20G Windows:C盘 系统盘 Linux分区: / 根分区 根据实际需求可以进行磁盘的分区 ------ ###### IDC数据中心 服务器 网络设备(路由器+交换机+防火墙)网线 机柜 空调 ------ ###### 物理设备 服务器分类: cpu、mem、主板、硬盘、网卡接口、VGA接口、HDMI接口、USB接口、管理接口... 机架式服务器 塔式服务器 刀片式服务器 ------ ###### 云产品/云分类 云产品:云服务器、云存储、云安全..... 云分类:公有云:华为云 阿里云 腾讯云 百度智云 青云 ulcoud云 .... 亚马逊云 微软云 == 公有云提供商 私有云 混合云 容器云 ------ ### (第二章:Linux基础命令) ###### Linux基础命令 **LS** -lh:人性化显示 主要是文件大小 -d:查看目录本身 -i:查看文件inode号 -a:查看所有包括隐藏文件 ls ../ 查看上一级目录的内容 ls ./ 查看当前目录下的内容 Linux系统中以 **. **开头的都是隐藏文件 同时查看: ls /root /tmp 报错:要查看的这目录不存在 [root@xingdiancloud-server ~]# ls /abc **ls: cannot access /abc: No such file or directory**(要查看的目录不存在) 白色的代表是一个普通文件 蓝色代表目录 天蓝色代表链接文件 ------ **cd** cd - : 原路返回 返回到上一次的目录 cd ../ : 返回上一级目录 cd ../../ 返回上一级的上一级 cd ~ : 回家 绝对路径:凡是以根开头的路径都是绝对路径 相对路径:不以根开头的路径都是相对路径 ------ **date** 获取当前日期:date +%F 获取当前时间:date +%H:%M:%S 获取周几:date +%w ------ ###### Linux目录结构 bin:默认存放命令文件 二进制文件 程序文件 (普通用户) /usr/bin sbin:默认存放命令文件 二进制文件 程序文件(管理员用户) /usr/sbin **which:获取命令对应的二进制文件存放位置** root:默认存放root用户的家目录 home:默认存放普通用户的家目录 etc:默认存放配置文件的目录 dev:默认存放设备文件 proc:默认存放虚拟文件 var:默认存放可变化的文件 ------ ###### Linux文件管理 **创建一个以当前日期命名的文件:** touch $(date +%F) touch /opt/`date +%F` -p:递归创建 -v:显示创建过程 **同时创建多个/多级目录**: 在/opt/目录下创建名为a和b的目录,在a目录下创建c和d,在b目录下创建e,在d目录下创建f和g,在g目录下创建success目录,一条命令 mkdir /opt/{a/{c,d/{f,g/success}},b/e} -p ------ ###### 拷贝/移动/删除 拷贝:cp -v 显示拷贝的过程 cp /root/qfb /opt/qianfengb //拷贝+改名(/opt目录下没有qianfengb的目录) cp /root/qfh /root/qfi /opt //把多个文件拷贝到统一目录下 **拷贝目录**:cp -r ------ 移动:mv 语法格式:mv 源文件/源目录 目的地 ------ **删除**: rm 语法格式:rm -rf 文件名/目录名 rm -rf ./* 这命令不能在根目录下执行 ------ ###### 文件 两种方式:交互式:vim/vi 非交互式:sed 模式: 编辑模式 i 命令模式 esc 尾行命令模式 : / 编辑模式:编辑模式:i I a A o向下另起一行 O向上另起一行 (i o) ------ **命令模式:** G:光标移动到最后一行 gg:光标移动到首行: dd:删除光标所在行 2dd:删除2行 如果光标在首行dG u:撤销 yy:复制 p:粘贴 D:删除光标后的内容(光标所在行) **尾行命令模式:** w:保存 q:退出 !:强制 wq:保存退出 wq!:强制保存退出 q!:强制退出 ###### 替换 语法格式:行 s(替换) / # @ (分隔符) g(全局替换 可选) :%s/root/ROOT/ 从首行到最后一行查找替换,只能替换每一行第一个匹配到的 :%s/root/ROOT/g 从首行到最后一行查找替换,只要匹配到全部替换 **案例** :5,10 s/.*/#&/ 在第5行到第10行每一行开头加一个# :4,9 s/^#// 每一个服务都有一个配置文件,以#开头的内容 都是这个配置文件的注释 **临时查看和取消行号** set nu :set nonu 永久设定,需要修改配置文件 /etc/vimrc 添加set nu参数 **可视块和可视行:** 可视块 选中块 ctrl + v 可视行 选中行 V **案例:** 块删除:选中要删除的块 ctrl + v (上下左右键) d 块插入:选中要插入的行,ctrl + v I 写要插入的内容# 2次Esc ###### 查看 cat 参数-n(显示行号) 文件名 head 指定行数 从前往后 默认看前十行 | 管道 前一条命令的结果交给后面的命令执行 tail 指定行数 从后往前 默认看后十行 企业中经常统计一个网站的访问量,获取IP地址访问我次数最多的 [root@proxy nginx]# cat access.log| awk '{print $1}' | sort | uniq -c | sort -k1 -nr | head -3 grep 过滤 可以过滤文件中的内容查看 [root@xingdiancloud-server ~]# grep 'sshd' passwd 企业案例: 实时查看文件内容 进行故障排查的时候,可以使用实时查看的命令看日志文件,从而获取故障的原因 tailf 文件 tail -f 文件 tail -F 文件 tail -f 等同于--follow=descriptor,根据文件描述符进行追踪,当文件改名或被删除,追踪停止 tail -F 等同于--follow=name --retry,根据文件名进行追踪,并保持重试,即该文件被删除或改名后,如果再次创建相同的文件名,会继续追踪 ###### 文件类型(七类) 普通文件 - 目录文件 d 链接文件 l 字符设备文件 c 块设备文件 b 套接字文件 s 管道文件 p ------ ###### help和man help:相当与命令的说明书,可以使用help获取到该命令使用方法和相关参数 man: 1类 8类可以获取命令的使用方法 5类 可以获取配置文件的使用方法或相关信息 8类 掌握这两个工具help\man就掌握了Linux中所有命令的使用 **free:查看系统中内存的使用情况 df:查看系统磁盘使用情况** ### (第三章:用户和组) ###### 用户 特性:多用户多任务 多个用户在同一个系统中同一时间执行的不同的任务,他们互补影响 权限管理机制,每一个用户拥有自己的权限 默认的自带的超级管理用户:root 超级管理员用户 root 标识 UID 0 系统用户 标识 UID 1~999 包含1和999 0=1000 ------ ###### 用户组 一个用户至少包含一个组,一个组里可以有多个用户,同一个用户可以同时属于多个组 ------ ###### 用户管理 语法格式:useradd [参数] 用户名 [root@xingdiancloud-server ~]# cat /etc/passwd //系统中所有用户的信息 ``` 以冒号作为分隔符,每一部分有每一部分的作用 mameng:x:1001:1001::/home/mameng:/bin/bash 用户名:密码占位符:用户标识UID:组标识GID:描述:用户家目录:登录shell ``` **判断一个用户是否可以登录,看登录shell;** 如果登录shell为 /bin/bash /bin/sh /usr/bin/sh /usr/bin/bash 以为着该用户可以登录到系统 如果登录shell为/sbin/nologin /bin/nologin 都不能登录 ``` [root@xingdiancloud-server ~]# cat /etc/shells //查看可用的登录shell /bin/sh /bin/bash /usr/bin/sh /usr/bin/bash ``` ###### 参数 ``` 创建一个不能登录的用户 [root@xingdiancloud-server ~]# useradd -s /sbin/nologin baixu 指定家目录创建用户 [root@xingdiancloud-server ~]# useradd -d /opt/wangying wangying 指定UID创建用户,UID要保持唯一性,有意义 [root@xingdiancloud-server ~]# useradd -u 2000 xushuo 指定GID创建用户,GID得存在 [root@xingdiancloud-server ~]# useradd -g 1002 lishenbiao 创建系统用户 [root@xingdiancloud-server ~]# useradd -r zhaoqi 创建一个系统用户,并且指定该用户的登录shell为/sbin/nologin [root@xingdiancloud-server ~]# useradd -r -s /sbin/nologin lilong ``` ------ ###### 查看用户 cat /etc/passwd id 命令 默认查看当前用户的信息 UID GID Groups id 用户名 指定用户查看 **重点:可以使用id命令判断一个用户是否存在** ``` [root@xingdiancloud-server ~]# id zhaoqi uid=998(zhaoqi) gid=996(zhaoqi)groups=996(zhaoqi) [root@xingdiancloud-server ~]# id huanghongid: huanghong: no such user ``` su - 切换用户 ------ ###### 修改 usermod [参数] 用户名 ``` 修改某用户,让其不可登录 [root@xingdiancloud-server ~]# usermod -s /sbin/nologin mameng ``` 修改用户的UID [root@xingdiancloud-server ~]# usermod -u 2002 mameng 该报错是因为该用户正在被使用,正在被使用的用户无法修改其属性 [root@xingdiancloud-server ~]# usermod -u 2002 mameng usermod: user mameng is currently used by process 6684 解决方案: 利用pkill 指定用户将该用户对应的进程干掉 [root@xingdiancloud-server ~]# pkill -9 -u mameng pkill 进程管理的命令 -9 信号 杀死(进程) -u 指定用户 mameng ``` 修改用户的名字 usermod -l 新名字 旧名字 修改用户名 ``` 对于一个用户来说,默认有一个主组,(创建用户时自动创建),我们也可以给用户增加附加组,usermod -G 组名 用户名,但是如果这个用户没有附加组 该命令就变成给用户添加附加组,但如果该用户有附加组,那么该命令才是修改附加组 **增加: usermod -aG 组名 用户名** **删除:userdel [参数] 用户** **删除用户: userdel -r 用户名 强制删除,删除该用户所有的内容** cat /etc/shadown 中存放的是用户的密码信息(第二列,密码是经过加密处理的) ``` usermod -L 锁定账号 usermod -U 解锁账号 ``` ------ ###### 组 创建组:groupadd 组名 groupadd hr [root@xingdiancloud-server ~]# cat /etc/group hr:X:2004: 组名:密码占位符:组标识 GID :成员、用户 [root@xingdiancloud-server ~]# groups qf 查看用户的组 修改组: groupmod 组名 组ID groupmod -n 新组名 旧组名 groupmod -g 新ID 组名 gpasswd 给组添加用户 == 给用户添加附加组 [root@xingdiancloud-server ~]# gpasswd -a user10(用户) hr(组) Adding user user10 to group hr 给组添加账户 [root@xingdian ~]# gpasswd -a user10 grp2 Adding user user10 to group grp2 同时添加多个用户到组: [root@xingdian ~]# gpasswd -M jim,tom,wing 组名 从组删除账户 [root@xingdian ~]# gpasswd -d user10 grp2 删除组: groupdel 组名 但是,如果改组是某个用户的主组,也就是说这个组是在创建用户的时候创建的,那么不能用groupdel删除,用userdel -r ,删除用户,组自然就被删除 ------ ###### 给用户提权 ``` 方法一:gpasswd gpasswd -a user100 wheel 方法二:usermod usermod -aG wheel user100 方法三:vim /etc/sudoers 在最后添加 配置文件110行 zhangsan ALL=(ALL) NOPASSWD: ALL ``` ### (第四章:Linux权限管理) ###### 基本权限 U:User 用户 所有者 G:Group 组 所属组 O:Other 其他人 r:读 4 w:写 2 x:执行 1 -:没有权限 0 第一个字符:r 第二个字符:w 第三个字符:x 如果所有者具备读写执行的权限: rwx 如果所有者不具备任何权限:--- 如果所有者只具备写权限:-w- 644文件默认权限 755目录默认权限 最高权限:777 ------ ###### 权限的设置(chmod) 修改基本权限:chmod ``` 数字方式: [root@xingdiancloud-server ~]# chmod 564 xingdian //这个文件权限:所有者读和执行,所属组读和写,其他人读 [root@xingdiancloud-server ~]# chmod 777 xingdian 所有者、所属组、其他人都是读、写、执行 [root@xingdiancloud-server ~]# chmod 000 xingdian 所有者、所属组、其他人没有任何权限 ``` ``` 字母方式: [root@xingdiancloud-server ~]# chmod u+x xingdian //增加,给xingdian文件所有者增加x权限 [root@xingdiancloud-server ~]# chmod u=rwx passwd //赋值,给passwd文件所有者赋值权限为rwx [root@xingdiancloud-server ~]# chmod u-w xingdian //减少,给xingdian文件去掉w权限 [root@xingdiancloud-server ~]# chmod ugo=rwx xingdian ``` ------ ###### 案例1 设置mameng这个文件所有者读和写,其他人执行和读,所属组保持不变 ``` 字母: chmod u=rw,o=rx mamen 数字: chmod 645 mameng ``` ------ 创建一个文件名为qf,创建一个目录名为dir100,在opt目录下创建,qf的权限需要为所有者读写执行,其他人读和写,dir100所有人拥有读写执行 touch /opt/qf mkdir /opt/dir100 chmod u=rwx,o=rw /opt/qf chmod 777 /opt/dir100 ###### 扩展 chmod 777 /var/www/html/* -R chmod 777 /var/www/html -R ``` 将/opt/dir目录下所有内容设置权限为777,包括dir1目录下的所有文件,也包括了dir目录 [root@xingdiancloud-server opt]# chmod 777 /opt/dir -R 将/opt/dir目录下所有内容设置权限为644,包括dir1目录下的所有文件,不包括了dir目录 [root@xingdiancloud-server opt]# chmod 644 dir/* -R ``` ------ ###### 修改所有者所属组(chown) ``` 修改xingdian文件所有者为user1000,所属组为group2000 [root@xingdiancloud-server ~]# useradd user1000 [root@xingdiancloud-server ~]# groupadd group2000 [root@xingdiancloud-server ~]# chown user1000.group2000 xingdian ``` ``` 修改xingdian文件的所有者为user1001 [root@xingdiancloud-server ~]# useradd user1001 [root@xingdiancloud-server ~]# chown user1001 xingdian ``` ``` 修改xingdian文件的所属组为group2001 (chgrp 该命令只能修改所属组) [root@xingdiancloud-server ~]# groupadd group2001 [root@xingdiancloud-server ~]# chown .group2001 xingdian ``` ###### 案例2 ``` 将/opt/dir目录下所有内容的所有者设置为user1000,所属组设置为group2000,包括dir1目录下的所有文件,也包括了dir目录 [root@xingdiancloud-server opt]# chown user1000.group2000 /opt/dir -R ``` ``` 将/opt/dir目录下所有内容的所有者设置为user1001,所属组设置为group2001,包括dir1目录下的所有文件,不包括了dir目录 [root@xingdiancloud-server opt]# chown user1001.group2001 /opt/dir/* -R ``` ###### r w x ---> 文件 目录 的影响 针对文件: 如果一个文件有r权限: 读取文件的内容 cat vim/vi(读) 如果一个文件有w权限: 编辑该文件 vi vim echo(写入文件) 如果一个文件有x权限: 执行该文件(脚本) ./ / ------ 就算一个文件没有执行权限,我们可以使用bash或者sh的命令执行文件 但是如果一个文件没有执行权限,不能用./或者/执行文件 ------ 针对目录: r:读目录的内容 ls w:创建和删除内容 touch mkdir rm x:切换目录 cd 关于删除目录下的内容,有没有权限删除,取决于目录的权限,跟目录里面我们要删除的文件或者目录来说没有关系 ------ ###### 高级权限 suid权限:给命令文件设置权限,当给命令文件设置了suid权限后,无论那个用户执行该命令,都会变成这个命令文件所有者的用户去执行 符号 s 对象 u 文件 chmod u+s 文件(命令文件) chmod u-s 文件(命令文件) ------ sgid权限:组继承权限 对象 g 符号 s 针对目录 目录的所属组假设是hr,如果设定了sgid权限,那么在该目录下创建的所有新文件都会继承目录的属组hr chmod g+s 目录名 chmod g-s 目录名 ------ sticky权限:防止别人误删除 符号 t 对象 o 针对目录 chmod o+t 目录名 chmod o-t 目录名 ------ 扩展:suid 4 sgid 2 sticky 1 ------ ###### Linux启动级别 0 停机 init 0 == shutdown now 1 单用户模式,用于系统维护 2 多用户模式,但不启动NFS 3 完整的多用户模式,带有显示登录 init 3 4 预留,未使用 5 图形界面 init 5 6 重新启动 init 6 == reboot ------ ###### swap分区 换分区 防止OOM 防止内存的溢出而造成系统崩溃 内存 === 物理设备 === 内存条 swap === 交换内存 === 磁盘空间 充当 内存空间 物理内存8G 磁盘空间100G 分区 / 95G /boot 1G /swap 4G ------ ###### umask 权限掩码 (了解) 创建文件的时候,文件的默认权限跟umask有关联 默认情况下,umask的值为022,所创建的文件默认权限644,目录默认权限755 修改umask: umask + 掩码 最大777 最小000 文件默认权限最大 666 目录默认权限最大 777 ------ ###### 文件属性(会用) a:能看 能追加 不能删除 i:只能看,其他什么都不能干 chattr + - lsattr 查看 ------ ### (第五章:Linux进程管理) ###### 查看进程(静态) 得到想要的信息 静态:ps ps aux a 只能查看所有终端进程 u 显示进程拥有者 x 显示系统内所有进程 ------ 第一列:进程的拥有者 第二列:PID 进程ID 唯一标识一个进程 第三列:cpu使用进程的百分比 第四列:mem使用进程的百分比 第七列:终端 第八列:进程的状态 最后一列:进程的名字 ------ USER: 运行进程的用户 PID: 进程ID %CPU: CPU占用率 %MEM: 内存占用率 VSZ: 占用虚拟内存 RSS: 占用实际内存 驻留内存 TTY: 进程运行的终端 STAT: 进程状态 man ps (/STATE) START: 进程的启动时间 TIME: 进程占用CPU的总时间 COMMAND: 进程文件,进程名 ------ R 运行 S 可中断睡眠 Sleep T 停止的进程 Z 僵尸进程 X 死掉的进程 ------ 获取当前系统中每个进程对应mem的使用情况。(pid %mem command) 获取当前系统中每个进程对应cpu的使用情况。(pid %cpu command) ``` 获取当前系统中每个进程对应mem的使用情况并且只要最多的前三 [root@xingdiancloud-server ~]# ps axo command,%mem,pid --sort -%mem | head -4 指定了字段 COMMAND %MEM PID /usr/bin/python2 -Es /usr/s 1.7 955 /usr/lib/polkit-1/polkitd - 1.5 625 /usr/sbin/NetworkManager -- 0.8 650 [root@xingdiancloud-server ~]# ps aux --sort -%mem | head -4 没有指定字段 ``` pid :进程ID ppid :父进程ID ------ ###### 获取PID ``` 如何获取一个进程PID,后面可以使用PID对进程进行管理 sshd [root@xingdiancloud-server ~]# ps aux | grep sshd [root@xingdiancloud-server ~]# ps axo command,pid | grep sshd [root@xingdiancloud-server ~]# cat /run/sshd.pid 只显示主进程 [root@xingdiancloud-server ~]# pidof sshd 1206 954 [root@xingdiancloud-server ~]# pgrep sshd 954 1206 ``` ------ ###### 扩展 查看(lsof) yum -y install lsof 服务的端口,服务运行,进程存在,服务不运行,进程不存在,服务的端口如果存在,进程一定在 Linux系统中每个服务都有对应的端口,常见的:sshd=22 httpd=80 [root@xingdiancloud-server ~]# lsof -i:80 [root@xingdiancloud-server ~]# lsof -i:22 查看当前系统的平均负载: 静态:uptime w 动态:top cpu空闲率:静态:vmstat 动态:top 内存使用情况:静态:free -m/g 动态:top ------ ###### W who w who 都可以看到谁正在远程连接我,能够获取到对方的IP地址、终端编号、对应的用户 w 还可以看服务器的运行时间,用户数量,平均负载 用户: 1.获取那些服务器正在连接我 w who 2.获取当前服务器的平均负载、运行时间 w ###### 企业案例 1.如何判断一个服务是否处于运行状态 ps aux lsof 2.当发现服务器cpu飙升到200%,如何获取对应的进程信息/获取是由那些进程造成的 ps aux --sort -%cpu | head ------ ###### 动态查看(top/htop) 命令:top htop 快捷键: P 将%cpu排序 M 将%mem排序 R 排序反转 ------ ``` top(命令) [root@xingdian ~]# top -d 1 每隔一秒钟显示一次 [root@xingdian ~]# top -d 1 -p 10126 查看指定进程的动态信息 [root@xingdian ~]# top -d 1 -p 10126,1 [root@xingdian ~]# top -d 1 -u apache 查看指定用户的进程 [root@xingdian ~]# top -d 1 -b -n 2 > top.txt 将2次top信息写入到文件 ``` ``` 1.安装 yum -y install epel-release [root@xingdian ~]# yum -y install wget [root@xingdian ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo [root@xingdian ~]# yum -y install htop 2.使用 htop ``` ------ ###### 网络进程(Tcp) root@xingdiancloud-server ~]# yum -y install net-tools 系统中安装的服务。 服务对应的端口 ssh 22 httpd 80 dhcp 68 ftp 21 ``` netstat -auntpl ss -auntpl -a:所有 -u:查看UDP进程 -p:pid -n:显示数字 -l:监听 -t:查看TCP进程 ``` ###### 数据传输 tcp:传输控制协议 udp:用户数据报协议 1.判断服务是否处于运行状态 ss -antpl 看到了80端口 ps top lsof 2.系统那些进程使用TCP进行数据传输 ss -antpl netstat -antpl ss -anupl 3.TCP状态 11 ``` CLOSED(关闭状态)。初始状态,表示TCP连接未建立 LISTEN(监听状态)。服务器等待客户端连接的状态 SYN_SENT(同步已发送状态)。客户端发送连接请求后等待服务器确认的状态。 SYN_RECEIVED(同步已接收状态)。服务器接收到客户端连接请求并发送确认后的状态。 ESTABLISHED(已建立状态)。表示TCP连接已成功建立,双方可以进行数据传输。 FIN_WAIT_1(等待对方FIN报文状态)。表示TCP连接的一方发送了关闭连接请求。 FIN_WAIT_2(等待对方关闭连接请求状态)。表示TCP连接的一方等待对方发送关闭连接请求。 TIME_WAIT(等待状态)。表示TCP连接关闭后的等待状态,用于确保数据的可靠传输。 CLOSE_WAIT(等待关闭状态)。表示TCP连接的一方接收到了对方的FIN报文,但尚未发送ACK。 LAST_ACK(最后确认状态)。表示TCP连接关闭前的最后确认状态,等待对方的FIN报文。 CLOSING(关闭状态)。表示TCP连接正在进行关闭过程 ``` ###### kill(信号) 进程管理、控制 kill家族 kill killall pkill 信号 1 重新加载进程或重新加载配置文件 9 杀死进程 15 正常关闭(默认) 18 激活进程 19 挂起进程 yum -y install psmisc //这是在安装killall ``` 如果是命令对应的进程或者该服务就一个进程:kill -9 pid 干掉该进程 如果是服务的进程,该服务有多个进程:pkill -9 进程名字 或者 killall -9 进程名字 干掉该服务 ``` 重新加载进程或者重新加载配置文件,目的就是为了让修改后的配置文件生效 sshd服务 假设修改了他的配置文件 为了让修改的配置文件生效 [root@xingdiancloud-server ~]# ps aux | grep sshd [root@xingdiancloud-server ~]# kill -1 4954 这种方案,生效后服务对应进程的PID没有变 重启 [root@xingdiancloud-server ~]# systemctl restart sshd 这种方案,生效后服务对应进程的PID会改变 ``` 案例: [root@xingdiancloud-harbor ~]# pkill -9 -t pts/2 //指定终端干掉 [root@xingdiancloud-server ~]# pkill -9 -u xingdian //干掉指定用户进程 ``` ### (第六章:Linux管道和重定向) ###### 文件描述符 进程用文件描述符来管理打开的文件 ``` 0:标准输入 1:标准正确输出 2:标准错误输出 $$:当前终端的PID echo $$ 获取当前终端的PID ``` ------ ###### 重定向 ``` >覆盖 > >追加 > 1> 标准正确输出重定向覆盖 > 1>> 标准正确输出重定向追加 > 2> 标准错误输出重定向覆盖 > 2>> 标准错误输出重定向追加 > & === 1+2 混合输出 > < 输入 导入 ``` ------ 例: mysql 数据库文件 数据的导入 将db.sql的数据库文件写入到db的库中,利用了重定向 输入/导入 ``` mysql -uroot -pQianFeng@123 db < db.sql ``` 服务器连通性检测 ping 脚本:默认使用非交互式命令 if 判断 如果 bash sh 执行脚本,脚本可以不需要有执行权限 ./ / 执行脚本,脚本需要有执行权限 检测局域网中那些IP可用,那些IP不可用,检测局域网有那些主机 如果能够ping通,说明这个IP是可用还是不可用 10.9.25.100 ping通 这个IP正在被使用 不可用 10.9.25.0/24 ------ ``` 利用重定向生成一个多行文件(脚本) [root@xingdiancloud-server ~]# cat >> /opt/xingdian.b < xingdian > diandian > hello > hi > eof 脚本生产多行文件 [root@xingdiancloud-server ~]# cat a.sh #!/bin/bash cat >> /opt/xingdian.o < create database nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; Query OK, 1 row affected (0.00 sec) //授权nextclouduser用户可以访问nextcloud的库,并设置密码为123456 MariaDB [(none)]> grant all on nextcloud.* to nextclouduser@'localhost' identified by '123456'; Query OK, 0 rows affected (0.00 sec) //刷新授权表,让授权生效 MariaDB [(none)]> flush privileges; Query OK, 0 rows affected (0.00 sec) //退出 MariaDB [(none)]> exit Bye 得到了库:nextcloud 得到了用户:nextclouduser 得到了密码:123456 配置apache 修改文件管理器的路径: /etc/httpd/conf/ [root@xingdian ~]# cd /etc/httpd/conf [root@xingdian conf]# rm -rf httpd.conf [root@xingdian conf]# yum -y install wget [root@xingdian conf]# wget http://10.9.12.206:30120/directlink/10/httpd.conf 上传项目 [root@xingdian conf]# cd [root@xingdian ~]# wget http://10.9.12.206:30120/directlink/10/nextcloud-22.0.0.zip 安装解压工具 [root@xingdian ~]# yum -y install unzip 解压 [root@xingdian ~]# unzip nextcloud-22.0.0.zip [root@xingdian ~]# cp -r nextcloud /var/www/ 重启apache [root@xingdian ~]# systemctl restart httpd [root@xingdian ~]# chmod 777 /var/www/nextcloud/ -R ``` ------ ###### 管道 sort (排序 默认从小到大) -r 反转 -n 数值 -k 指定字段 uniq 去重 (只能对一个字段 必须要排序在去重) -c 统计 awk 可以利用这个命令获取想要的数据 基本使用 利用行和列获取数据 ``` 例:获取当前系统中所有的用户名 cat /etc/passwd | awk -F: '{print $1}' ``` $1 第一列 $10 第十列 $NF 最后一列 $(NF-1) 倒数第二列 ------ ``` 获取当前系统中所有的登录shell [root@xingdiancloud-server ~]# cat /etc/passwd | awk -F: '{print $NF} ``` ``` 系统中都用到了那些登录shell [root@xingdiancloud-server ~]# cat /etc/passwd | awk -F: '{print $NF}' |sort | uniq ``` ``` 统计一下每个登录shell被使用了几次 [root@xingdiancloud-server ~]# cat /etc/passwd | awk -F: '{print $NF}' |sort | uniq -c ``` ``` 获取被使用次数最多的登录shell [root@xingdiancloud-server ~]# cat /etc/passwd | awk -F: '{print $NF}' |sort | uniq -c | sort -nr -k1 | head -1 ``` ``` 获取当前系统内存空闲量 [root@xingdiancloud-server ~]# free -m | awk 'NR==2{print $4}' ``` ``` 获取根分区使用磁盘的百分比 df -Th | awk 'NR==6{print $6}' ``` ***wc -l 统计行数*** ``` access.log 日志文件 nginx访问日志 (熟练管道) 1.获取到所有的IP地址 cat access.log | awk '{print $1}' 2.获取到所有IP的个数(统计某一网站访问次数;统计某一网站PV量) cat access.log | awk '{print $1}' |wc -l 3.获取所有的IP地址(去重)(统计某一网站访问的人有那些) cat access.log | awk '{print $1}' | sort -n |uniq 4.统计某一网站访问人数(UV) cat access.log | awk '{print $1}' | sort -n |uniq |wc -l 5.每个IP地址的个数(每个IP访问的次数) cat access.log | awk '{print $1}' | sort | uniq -c 6.获取访问次数前三的人/IP地址 cat access.log | awk '{print $1}' | sort | uniq -c |sort -rn -k1 | head -3(第七章:Linux磁盘管理) ``` ------ ### (第七章:Linux磁盘管理) ###### 存储介绍 NAS SAN DAS ------ 分布式存储 HDFS CEPH 云存储 对象存储 minio OSS 块存储 文件系统存储 ------ ###### 磁盘分区 工作原理 分区方式 MBR fdisk GPT gdisk fdisk 是磁盘分区的命令 也是磁盘管理工具 ``` [root@xingdiancloud-server ~]# fdisk -l /dev/sdb ``` fdisk n:添加分区 p:主分区 e:扩展分区 p:查看分区 w:保存退出 扩展分区不能被直接使用,需要在划分逻辑分区才能被使用 gdisk n:添加分区 (1-128) p:查看分区 d:删除分区 w:保存退出 q:退出不保存 可以转换 GPT-->MBR MBR-->GPT fdisk --> MBR gdisk --> 分区 lsblk(查看磁盘分区) df -Th(已经挂在设备的相关信息) fdisk -l gdisk -l ------ ###### 磁盘格式化 格式化:磁盘或者磁盘分区设定文件系统类型 ***面试题:磁盘有空间,本身容量100G,现在还显示10G,但是无法存放数据*** ***ext家族文件系统,inodes耗尽造成无法存储文件*** 格式化命令: mkfs.xfs -f 设备名称 mkfs.ext4 设备名称 ------ ###### 临时挂载 挂载:mount 临时挂载: mount [参数] 设备名称 挂载点(目录) mount -o rw,remount /sysroot mount /dev/sdd /mnt 例: [root@xingdiancloud-server ~]# mount /dev/sdb1 /opt/share-1 [root@xingdiancloud-server ~]# mount -o rw CentOS-7-x86_64-Minimal-2009.iso /opt/centos/ 挂载点:原则上自定义 比如:假设/var/lib/mysql 这个目录里面存放项目数据,单独挂载一个磁盘来存储数据库 ------ ###### 卸载:umount umount 挂载点、设备名称 ###### 永久挂载 /etc/fstab 添加相关的参数实现永久挂载 第一列:设备(设备名称/dev/sdb;设备UUID标识;暂时不讲) 第二列:挂载点(本质就是目录) 第三列:文件系统类型(xfs ext4 nfs) 第四列:属性 rw remount defaults 第五列+第六列:0 0 不备份 不检查 /dev/sdc /opt/share-2 ext4 defaults 0 0 (重点) UUID="25d22b48-8e46-494b-a12c-ae80a4297800" /opt/share-1 xfs defaults 0 0 生效: mount -a 或者 重启服务器 磁盘 [分区--管理方式] 格式化 挂载 被使用 卸载:先umount手动卸载,一定要把配置文件对应的参数删除,这才是永久卸载 ------ ###### LVM逻辑卷 LVM逻辑卷管理 1.服务器添加磁盘 2.磁盘变成PV ``` [root@xingdiancloud-server ~]# pvcreate /dev/sdb /dev/sdc /dev/sdd 或者 [root@xingdiancloud-server ~]# pvcreate /dev/sd{b..d} ``` 3.将PV变成VG(可以创建一个也可以创建多个) ``` [root@xingdiancloud-server ~]# vgcreate vg1 /dev/sd{b..c} [root@xingdiancloud-server ~]# vgcreate vg2 /dev/sdd ``` 4.创建逻辑卷 ``` root@xingdiancloud-server ~]# lvcreate -L 5G -n lv1 vg1 ``` 格式化 ``` [root@xingdiancloud-server ~]# mkfs.xfs -f /dev/vg1/lv1 ``` 挂载 ``` [root@xingdiancloud-server ~]# mkdir /opt/lv1 [root@xingdiancloud-server ~]# mount /dev/vg1/lv1 /opt/lv1/ ``` ------ ###### 物理卷 查看: pvs pvdisplay 删除: pvremove PV名字 (注意:如果正在被使用,不要轻易删除) 卷组: 查看: ``` vgs vgdisplay ``` 删除: ``` vgremove vg名字 ``` 逻辑卷: 查看: ``` lvs lvdisplay ``` -l:指的是LE的个数 LE个数*LE大小=容量 [root@xingdiancloud-server ~]# lvcreate -l 1280 -n lv2 vg1 删除 [root@xingdiancloud-server ~]# lvremove /dev/vg1/lv2 ------ ###### xfs扩容 假设:有一个逻辑卷 lv1 容量用完了 我还要继续往lv1对应的挂载点目录存放数据 解决方案: lv扩容 1.看vg容量,如果vg有空闲,直接给lv扩容! image-20240408200347296 2.如果vg容量没有了,先给VG扩容,在给lv扩容 3.如果pv有,直接给vg扩容 4.如果PV没有了,先创建PV 案例:lv空间不足,但是vg有空闲 LVM在线扩容 热扩容 1.判断vg空闲 vgs 看空闲量 2.lv扩到多少 10G ``` lvextend -L 10G [lv path] ``` 增加到到少g 3.lv path 怎么看 lvdisplay lvm的lv扩容 4.lvs/lvdisplay验证 容量是否发生了变化 lvs 看的是 10G ,发生了变化,但是df -Th看的时候没有 5.文件系统扩容 (不同文件系统,扩容时命令不同;先以 xfs为例,lv1是xfs的文件系统) xfs_growfs [要扩容的lv的path] ``` [root@xingdiancloud-server ~]# xfs_growfs /dev/vg1/lv1 ``` 6.验证文件系统扩容 df -Th ------ ###### ext4扩容 准备一个正在被使用LV并且文件系统ext4 ``` 准备工作: [root@xingdiancloud-server ~]# lvcreate -L 2G -n lv2 vg1 [root@xingdiancloud-server ~]# mkfs.ext4 /dev/vg1/lv2 [root@xingdiancloud-server ~]# mkdir /opt/lv2 [root@xingdiancloud-server ~]# vi /etc/fstab /dev/vg1/lv2 /opt/lv2 ext4 defaults 0 0 [root@xingdiancloud-server ~]# mount -a ``` 验证:df -Th 扩容:使用vgs看到。vg有容量,直接给LV扩容 [root@xingdiancloud-server ~]# lvextend -L 5G /dev/vg1/lv2 判断了文件系统为ext4,所以使用 [root@xingdiancloud-server ~]# resize2fs /dev/vg1/lv2 验证:df -Th ------ ###### 案例(根扩容) 案例:给根扩容 1.查看vg卷组是否有余量 有的话直接lvextend -L 容量 路径 没有,查看PV,确定是否有空闲的PV ``` 有:vgextend centos PV name ``` 如果没有PV,先增加PV,判断是否有磁盘 有磁盘:pvcreate /def/sdf ``` 2.lvextend -L 30G /dev/centos/root扩大到30G ``` 至此完成了lv 的扩容 路径通过lvdisplay查看 ``` 3.xfs_growfs /dev/centos/root(文件系统扩容,先判断根分区的文件系统类型)[df -Th 或者blkid] ``` ``` 4.df -Th ``` ------ ###### 练习题 创建lv1 ext4 lv2 xfs 分别为100M 200M 实现开机自动挂载到/d1 /d2目录下,扩容vg(20G),将sdb的数据迁移到sdc上。 扩容lv1到500M,lv2增加300M,将sdb从卷组中删除,然后格式化sdc,要求成功。 ``` # 创建逻辑卷lv1和lv2 lvcreate -L 100M -n lv1 myvg lvcreate -L 200M -n lv2 myvg # 格式化lv1为ext4,lv2为xfs mkfs.ext4 /dev/myvg/lv1 mkfs.xfs /dev/myvg/lv2 # 创建挂载点并设置开机自动挂载 mkdir /d1 /d2 echo "/dev/myvg/lv1 /d1 ext4 defaults 0 0" >> /etc/fstab echo "/dev/myvg/lv2 /d2 xfs defaults 0 0" >> /etc/fstab # 挂载新创建的文件系统 mount -a # 将sdc加入卷组 pvcreate /dev/sdc vgextend myvg /dev/sdc # 扩容lv1到500M,lv2增加300M lvresize -L +400M /dev/myvg/lv1 lvresize -L +300M /dev/myvg/lv2 # sdb的数据迁移并不需要特别操作,因为我们在扩大卷组后直接扩展了逻辑卷大小,数据不会丢失。 # 将sdb从卷组中删除 vgreduce --removemissing myvg # 确认sdb已从卷组中移除后再进行下一步操作 pvdisplay # 查看当前的物理卷信息 # 格式化sdc(这里假设不再使用sdc作为存储数据的设备) pvremove /dev/sdc ``` ------ ###### 交换分区 swap分区==交换分区 free -m 看到swap的值都为0, [root@xingdiancloud-server ~]# free -m 看到swap的值都为0,所以该服务器没有交换分区 直接把一个磁盘的容量给交换分区用 直接把一个lv的容量给交换分区用 为例 直接把一个分区的容量给交换分区用 ``` 1.创建一个lv [root@xingdiancloud-server ~]# lvcreate -L 3G -n lv3 vg1 2.格式化,由于未来该lv用来做swap分区,所以格式化的命令为mkswap [root@xingdiancloud-server ~]# mkswap /dev/vg1/lv3 3.挂载到swap [root@xingdiancloud-server ~]# vi /etc/fstab /dev/vg1/lv3 swap swap defaults 0 0 [root@xingdiancloud-server ~]# mount -a 6.激活 [root@xingdiancloud-server ~]# swapon /dev/vg1/lv3 7.验证 free -m ``` ------ ###### 磁盘阵列 现在的物理服务器自带RAID(RAID卡) 1.RAID介绍 即独立磁盘冗余阵列,通常简称为磁盘阵列。简单地说, RAID 是由多个独立的高性能磁盘驱动器组成的磁盘子系统,从而提供比单个磁盘更高的存储性能和数据冗余的技术。 2.功能 (1)通过对磁盘上的数据进行条带化,实现对数据成块存取,减少磁盘的机械寻道时间,**提高了数据存取速度**。 (2)通过对一个阵列中的几块磁盘同时读取,减少了磁盘的机械寻道时间,提高数据存取速度。 (3)通过镜像或者存储奇偶校验信息的方式,实现了对数据的冗余保护 ------ RAID 0 ``` 优点: (1)充分利用I/O总线性能使其带宽翻倍,读/写速度翻倍。 (2)充分利用磁盘空间,利用率为100%。 缺点: (1)不提供数据冗余。 (2)无数据检验,不能保证数据的正确性。 (3)存在单点故障。 应用场景: (1)对数据完整性要求不高的场景,如:日志存储,个人娱乐 (2)要求读写效率高,安全性能要求不高,如图像工作站 ``` ------ RAID 1 ``` 优点: (1)提供数据冗余,数据双倍存储。 (2)提供良好的读性能 缺点: (1)无数据校验 (2)磁盘利用率低,成本高 应用场景: 存放重要数据,如数据存储领域 ``` RAID 5 ``` 优点: (1)读写性能高 (2)有校验机制 (3)磁盘空间利用率高 缺点: (1)磁盘越多安全性能越差 应用场景: 数据安全性高,如数据金融、库、存储等。 ``` 安装RAID:资源库 ------ ###### 文件链接(软硬链接) 软链接: ln -s 源文件(绝对路径) 目的地(绝对路径) 普通文件和目录都支持软链接 软链接源文件跟链接文件inode号不同 软链接文件源文件删除后,链接文件不可用 软链接可以跨分区 ------ 硬链接: ln 源文件(绝对路径) 目的地(绝对路径) 文件可以创建硬链接,目录不可以 硬链接inode不变 硬链接源文件删除后,链接文件可以使用 硬链接不可以跨分区 ------ ### (第八章:文件查找) ###### 查找(find) 语法格式:find + 位置/路劲 + 条件+值 -name文件名字 -i忽略大小写 -size文件大小 -type文件类型 ------ ###### 按文件属主、属组找: [root@xingdian ~]# find /home -user jack //属主是jack的文件 [root@xingdian ~]# find /home -group hr //属组是hr组的文件 ​ ------ ###### 按文件权限: find -perm 644 按权限查找 [root@xingdian ~]# find -perm 644 -ls [root@xingdian ~]# find -perm -644 -ls [root@xingdian ~]# find -perm -600 -ls [root@xingdian ~]# find -perm -222 -ls atime 访问时间 ctime 改变时间 mtime 修改时间 -perm 指定 644 755 400 -644 包含 ``` -a and 条件都要满足 -o or 条件满足其中一个\(\) \:符号回归本意 转义符 ``` ------ ###### 查找的条件 -name -size -mtime -user -not ! 取反 ------ ###### 按照文件类型查找 目录文件 d 链接文件 l 字符设备文件 c 块设备文件 b 套接字文件 s 管道文件 p -group -type 按照类型查找 普通文件 f 文件类型 d s p l b c ------ ###### -regex 正则 多个条件 -a 并且/和 -o 或者 动作: 默认-print 显示详细信息 -ls ``` 注意:在多个条件的时候 无论使用-a 还是使用-o 把条件都用\( \) 括起来 ``` 正则: .* 任意多个字符 [0-9] [a-z] [0-9a-z] [A-Z] [0-9A-Z] [a-zA-Z] + 出现多次 ------ ###### 动作 -ls -print [root@xingdian opt]# find /opt/ -name "file1" -delete -delete删除 -exec -ok -ok和-exec 的区别 -ok需要人工确认 y 文件操作: mv cp rm(去掉) 压缩 ``` 查找opt目录下所有以2结尾的文件移动到/mnt目录下 [root@xingdian opt]# find /opt/ -name "*4" -ok mv {} /mnt \; [root@xingdian opt]# find /opt/ -name "*4" -ok 文件操作命令(cp mv rm) {承接查到的内容} 目的地 \; ``` ``` [root@xingdian opt]# find /opt/ -name "*2" |xargs -i mv {} /mnt/ [root@xingdian opt]# find /opt/ -name "*5" |xargs -I {} mv {} /tmp ``` ------ ### (第九章:打包压缩) ###### tar打包压缩/解压缩 压缩包;Linux:.zip .tar.gz .tar.bz2 .tar.xz .tgz ``` 打包压缩 tar cf 路径/压缩包的名字 压缩的文件 ``` tar包: 之所以会得到不同格式的压缩包,是因为调用的压缩方式不同 .tar.gz gzip z .tar.bz2 bzip2 j .tar.xz xz J ``` 解压缩 tar xf 压缩包的名字 指定位置解压 -C [root@xingdian ~]# tar xf logstash-7.3.2.tar.gz -C /opt/ ``` ------ ###### zip包 ``` 解压缩 unzip 压缩包名字 (yum -y install unzip) 指定位置解压缩: [root@xingdian ~]# unzip -d /opt/ nextcloud-22.0.0.zip ``` ------ ###### 案例 1 查找/etc目录下所有以.conf结尾的文件并进行压缩,压缩到/opt目录下命名为conf.tar.gz [root@xingdian opt]# find /etc -name "*.conf" |xargs -i tar rf /opt/conf-1.tar.gz {} ------ ###### 扩展 nginx 服务 日志文件 access.log 日志轮转 对日志文件切割 旧日志文件打包.gz ``` .gz gunzip ``` 如果没有gunzip,使用yum -y install gzip gunzip access.log.gz ------ ###### 案例 2(拷贝海量小文件) scp -r 源文件 目的地 ``` [root@xingdian ~]# scp -r nextcloud 10.9.12.209:/opt/ 文件多速度慢 压缩后拷贝: [root@xingdian ~]# tar cf nextcloud.tar.gz nextcloud [root@xingdian ~]# scp -r nextcloud.tar.gz 10.9.12.209:/opt/ ``` ------ ### (第十章:软件包管理) ###### Linux软件包类型: 二进制包 .rpm 源码包 编译 .tar.gz tar.xz mysql-community-common-5.7.12-1.el7.x86_64.rpm yum-utils-1.1.30-14.el6.noarch.rpm ntfs-3g-2011.4.12-5.el5.x86_64.rpm 软件名字 版本号 发布版本 平台架构 后缀 安装软件 获取对应包 网址: https://rpmfind.net/ (注意:操作系统版本) ftp://ftp.redhat.com 软件官网(mysql ) 安装软件时,都有依赖关系,特别是二进制包 案例:源码包编译安装 Linux 很多的发行版本 Ubuntu DPKG dpkg (apt ) Centos rpm (yum rpm) ------ ###### YUM官方源使用(更换YUM源) 基础仓库 : BASE仓库 扩展仓库文件 :EPEL仓库 ``` 更换YUM 源(阿里源:https://mirrors.aliyun.com) 1.删除自带的:rm -rf /etc/yum.repos.d/* 2.获取BASE仓库 获取BASE源 curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo 3.获取epel仓库 获取EPEL源 curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo 4.清空yum缓存;在重新加载yum缓存[加快软件的安装速度] yum clean all yum makecache 或者 yum makecache fast ``` 注意: 判断如否有wget的命令,如果没有先安装(前提有BASE仓库),然后在使用wget -O wget -O ------ 在系统中有一些软件BASE和EPEL仓库中没有,来自于软件官网 BASE和EPEL中mariadb,没有mysql 数据库 mysql ``` mysql仓库文件所对应的安装包,安装该包,就能得到mysql的仓库文件 yum -y install https://dev.mysql.com/get/mysql80-community-release-el7-11.noarch.rpm ``` WEB服务器 Nginx ``` [root@ziyang yum.repos.d]# vi /etc/yum.repos.d/nginx.repo [nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true [nginx-mainline] name=nginx mainline repo baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/ gpgcheck=1 enabled=0 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true ``` ------ ###### YUM安装/删除/查找 ``` yum -y install l //安装 yum -y remove //卸载 yum -y reinstall //重新安装 yum provides vim //复制软件包名称 yum provides //查找某一命令对应的软件包 yum list //列出所有包 yum repolist //列出所有的仓库(可用仓库) ``` ``` 安装软件方式: yum -y install httpd yum -y install nginx sl wget yum -y install https://dev.mysql.com/get/mysql80-community-release-el7-11.noarch.rpm yum -y install /opt/mysql80-community-release-el7-11.noarch.rpm yum -y install /opt/*.rpm ``` 普通包 组包 grouplist groupinstall ###### 补充 1.ifconfig 查不到对应的软件包 包:net-tools 2.yum这个软件包管理的命令 自动解决依赖关系 ------ ###### Yum仓库延伸 1.yum仓库文件内容 一个仓库配置文件[epel.repo]有多个仓库 ``` [epel] 标签 name=xingdian 指定仓库的名字 baseurl=http://mirrors.aliyun.com/epel/7/$basearch 仓库的地址 ftp:// file:// httpd:// 和 ftp:// 网络地址 file:// 本地地址 enabled= 0 1 0关闭 1开启 仓库是否启用 默认该参数的值为1 gpgcheck= 0 1 0关闭 1 开启 gpgkey ``` ------ 2.yum命令 配置文件 /etc/yum.conf cachedir= 指定缓存位置/目录 keepcache= 0 1 0关闭 1开启 缓存功能 案例: 开启yum的缓存功能,可以在安装软件的过程中保留软件包 修改/etc/yum.conf 把keepcache的值改为1 开启缓存功能 缓存软件包 cachedir所定义的目录下找对应包 /var/cache/yum/x86_64/7 根据该软件所对应的仓库进入到对应的目录下找到packages目录,包就在该目录下 ------ 3.yum-config-manager 控制仓库是否可用 enable:启用 disable:禁用 yum-config-manager 对应的软件 yum-utils [root@ziyang ~]# yum-config-manager --disable base[仓库标签] 关闭base仓库 [root@ziyang ~]# yum-config-manager --enable base 启用改仓库 注意: 修改配置文件 启用仓库属于交互式 使用yum-config-manager的方式启用关闭仓库属于非交互式(用于脚本使用) ------ ###### 软件包管理rpm 和yum的区别:yum可以自动解决依赖关系,而rpm只能手动解决依赖关系 安装:rpm -ivh+软件包 卸载 :rpm -e 获取安装的所有 软件包:rpm -qa 判断一个软件是否安装: rpm -qa | grep 软件名称 ------ ###### rpm手动解决依赖关系 ``` 以Apache为例 rpmfind.net 获取相关的软件包 1.获取apache的rpm包 [root@xingdian ~]# wget https://rpmfind.net/linux/centos/7.9.2009/updates/x86_64/Packages/httpd-2.4.6-97.el7.centos.x86_64.rpm 2.安装 [root@xingdian ~]# rpm -ivh httpd-2.4.6-97.el7.centos.x86_64.rpm error: Failed dependencies: /etc/mime.types is needed by httpd-2.4.6-97.el7.centos.x86_64 httpd-tools = 2.4.6-97.el7.centos is needed by httpd-2.4.6-97.el7.centos.x86_64 libapr-1.so.0()(64bit) is needed by httpd-2.4.6-97.el7.centos.x86_64 libaprutil-1.so.0()(64bit) is needed by httpd-2.4.6-97.el7.centos.x86_64 3.先找到/etc/mime.types所对应的软件包,然后或该软件 [root@xingdian ~]# yum provides /etc/mime.types [root@xingdian ~]# wget https://rpmfind.net/linux/centos/7.9.2009/os/x86_64/Packages/mailcap-2.1.41-2.el7.noarch.rpm [root@xingdian ~]# rpm -ivh mailcap-2.1.41-2.el7.noarch.rpm 4.继续解决依赖关系 [root@xingdian ~]# rpm -ivh httpd-2.4.6-97.el7.centos.x86_64.rpm error: Failed dependencies: httpd-tools = 2.4.6-97.el7.centos is needed by httpd-2.4.6-97.el7.centos.x86_64 libapr-1.so.0()(64bit) is needed by httpd-2.4.6-97.el7.centos.x86_64 libaprutil-1.so.0()(64bit) is needed by httpd-2.4.6-97.el7.centos.x86_64 5.获取第二个依赖关系的包httpd-tools;下载安装 [root@xingdian ~]# rpm -ivh httpd-tools-2.4.6-97.el7.centos.x86_64.rpm error: Failed dependencies: libapr-1.so.0()(64bit) is needed by httpd-tools-2.4.6-97.el7.centos.x86_64 libaprutil-1.so.0()(64bit) is needed by httpd-tools-2.4.6-97.el7.centos.x86_64 6.获取该模块对应的安装包apr [root@xingdian ~]# yum provides libapr-1.so.0 [root@xingdian ~]# wget https://rpmfind.net/linux/centos/7.9.2009/os/x86_64/Packages/apr-1.4.8-7.el7.x86_64.rpm [root@xingdian ~]# rpm -ivh apr-1.4.8-7.el7.x86_64.rpm 7.继续获取需要解决的依赖关系 [root@xingdian ~]# rpm -ivh httpd-tools-2.4.6-97.el7.centos.x86_64.rpm error: Failed dependencies: libaprutil-1.so.0()(64bit) is needed by httpd-tools-2.4.6-97.el7.centos.x86_64 8.获取该模块对应的安装包libaprutil-1.so.0(apr-utils) [root@xingdian ~]# yum provides libaprutil-1.so.0 [root@xingdian ~]# wget https://rpmfind.net/linux/centos/7.9.2009/os/x86_64/Packages/apr-util-1.5.2-6.el7.x86_64.rpm [root@xingdian ~]# rpm -ivh apr-util-1.5.2-6.el7.x86_64.rpm 9.安装httpd-tools [root@xingdian ~]# rpm -ivh httpd-tools-2.4.6-97.el7.centos.x86_64.rpm 10.安装httpd [root@xingdian ~]# rpm -ivh httpd-2.4.6-97.el7.centos.x86_64.rpm ``` ------ ###### 自制yum源 仓库包的名字以.repo结尾 ``` 1.准备包(rpmfind,iso镜像获取) 2.准备目录存放rpm包(注意自己服务器的环境) [root@xingdian ~]# mkdir /opt/centos-packages [root@xingdian ~]# cp *.rpm /opt/centos-packages/ 3.将该目录变成软件包目录 [root@xingdian ~]# createrepo /opt/centos-packages/ 4.编写仓库文件调用 [xingdiancloud] name=xingdiancloud native packages baseurl=file:///opt/centos-packages enabled=1 5.验证 yum repolist ``` ------ ###### 源安装(编译安装) 源编译安装nginx https://nginx.org/ nginx的官网 ``` 1.获取nginx的源码包 wget https://nginx.org/download/nginx-1.24.0.tar.gz 解压:tar xf nginx-1.24.0.tar.gz 2.编译安装准备所需要的环境 yum -y install apr apr-util ncurses ncurses-devel openssl-devel bison gcc gcc-c++ make 3.配置 ./configure --prefix=/opt/httpd 指定安装位置 4.编译 make 5.安装 make install ``` ###### apache编译安装 1.获取源码包,可以从官网获取;也可以从资源库获取 httpd.apache.org 2.准备编译安装所需要的环境 yum -y install openssl-devel pcre-devel expat-devel libtool gcc gcc-c++ wget make apr 和 apr-util 放到指定位置 httpd源码包解压后的目录下的srclib,并且需要改名 apr apr-util https://apr.apache.org/download.cgi 3.配置 (进入到解压目录下 在进行配置) ./configure --prefix=/opt/apache 4.编译 make 5.安装 make install 运行:进入到安装目录下的bin目录 执行 ./httpd 看到80端口,就可以用浏览器访问测试 ------ love 获取项目源码包:wget http://10.9.12.206:30120/directlink/1/safeware/love.zip 安装解压工具:yum -y install unzip 解压源码包:unzip love.zip 拷贝源码到网站发布目录下:cp -r love/* /opt/nginx/html/ 启动nginx : /opt/nginx/sbin/nginx 执行的是安装目录下的sbin目录下nginx的文件 关闭nginx: killall -9 nginx 访问之前关闭防火墙和selinux systemctl stop firewalld systemctl disable firewalld setenforce 0 vim /etc/sysconfig/selinux.conf SELINUX=disabled ------ ### (第十一章:网络协议) #### OSI七层模型及各自特点 应用层:HTTP HTTPS 表示层:数据的模式,数据的加密解密等 会话层:建立删除维护会话 传输层:数据传输 (TCP UDP) 网络层:路由和选路 数据链路层:源MAC地址 物理层:约定接口类型,传输速度,线缆针脚 数据----比特流(0、1)发送出去 ------ #### TCP/IPV4的四层/五层模型 TCP/IPV4 4层模型: 应用层(应用层+表示层+会话层) 传输层 网络层 网络接口层(物理层+数据链路层) TCP/IPV4 5层模型: 应用层(应用层+表示层+会话层) 传输层 网络层 网络接口层 物理层 数据链路层 ------ #### 数据封装和解封装的流程 封装:发送数据的过程 解封装:接受数据的过程 应用层产生一个数据,向外发送一个请求百度的指令(DATA→(加一个tcp)TCP+DATA→形成数据段→IP+TCP+DATA(IP地址包含源ip地址和目的ip地址)→形成数据包→帧头+IP+TCP+DATA+帧尾(帧头里有源MAC和目的MAC{通过ARP获取})→形成数帧(数据链路层对数据包进一步封装帧头和帧尾,形成数据帧)→ ![image-20240416091911327](C:\Users\14653\AppData\Roaming\Typora\typora-user-images\image-20240416091911327.png) ------ #### 常见网络设备及作用(路由器+交换机) 交换机:交换机主要用于在局域网内部进行高效的分发和传输数据 路由器:路由器则主要解决不同网络之间的互联互通问题,并执行复杂的网络管理和安全策略 ------ #### ARP协议的工作流程 发起方查找本地ARP缓存: 当主机A需要与主机B通信且只知道主机B的IP地址时,主机A首先会在自身的ARP缓存表中查找是否有主机B对应的MAC地址记录。 ARP缓存未命中: 如果主机A的ARP缓存表中没有找到主机B的MAC地址,主机A就需要通过发送ARP请求来获取。 发送ARP请求: 主机A构造一个ARP请求广播帧,这个帧中包含主机B的IP地址,并询问拥有这个IP地址的设备其MAC地址是什么。此ARP请求帧会在同一局域网内广播。 接收ARP请求: 局域网内的所有主机都会接收到ARP请求,但只有主机B的IP地址与请求中的IP地址相匹配时,才会做出响应。 发送ARP响应: 主机B接收到请求后,会构造一个ARP响应单播帧,其中包含主机B的IP地址和MAC地址,并将这个响应帧发送给主机A。 更新ARP缓存: 主机A收到主机B的ARP响应后,会提取主机B的MAC地址,并将主机B的IP地址与MAC地址的映射关系保存在本地的ARP缓存表中,以便后续直接使用MAC地址进行数据链路层的通信。 数据传输: 现在主机A知道了主机B的MAC地址,就可以将IP数据包封装在以主机B MAC地址为目的地址的帧中,然后通过数据链路层发送出去,实现了IP地址到MAC地址的转换,进而完成了数据的传输。 总之,ARP协议的作用就是在网络层的IP地址与数据链路层的MAC地址之间架起一座桥梁,使不同网络层面上的通信得以顺利进行 ------ #### TCP、UDP协议各自的特点 TCP:传输控制协议: 面向连接的协议 传输可靠 重传机制 UDP:用户数据报协议 非面向连接的协议 传输不可靠 应用于直播 传输速度更快 ------ #### TCP的三次握手 建立链接 TCP链接 3次握手 TCP报文中的指针,如果TCP报文被标注为ACK,该TCP的报文就是确认消息的报文 SYN:同步消息 建立连接时发送SYN ACK:确认消息 FIN:断开链接的报文 客户端向服务器端发送了一个建立连接的请求[SYN报文] 服务器收到改报文后确认这个建立连接的报文,给客户端确认[ACK]并也发送同步消息报文[SYN]客户端收到后回复确认报文[ACK报文]至此TCP三次握手建立成功 第一步:客户端向服务器发送一个SYN(同步)信号,请求建立连接,并附带一个随机的序列号X。 第二步:服务器收到SYN后,回复一个SYN+ACK(同步+确认)信号,表示同意建立连接,同时也携带一个自己的随机序列号Y,并确认客户端的序列号(X+1)。 第三步:客户端收到服务器的SYN+ACK后,再次发送一个ACK(确认)信号,确认服务器的序列号(Y+1),至此,双方都确认了对方的意图和能力,连接建立成功。 三次握手确保了双方都能正确发送和接收数据,同时确定了数据传输的初始序号,为后续的稳定、可靠数据传输打下了基础。 ------ #### TCP四次分手 1. **第一次挥手**:首先,主动关闭连接的一方(客户端)会发送一个FIN(Finish,结束)标志位为1的报文段给对方,表示自己已经没有数据要发送了。此时,客户端进入FIN-WAIT-1状态。 2. **第二次挥手**:服务器端接收到这个FIN报文段后,会回复一个ACK(Acknowledgement,确认)标志位为1的报文段,确认序号为收到的FIN报文段的序号加1,表示已经收到了客户端关闭连接的请求。然后服务器端进入CLOSE-WAIT状态,而客户端收到这个ACK后进入FIN-WAIT-2状态。 3. **第三次挥手**:当服务器端把所有缓存的数据发送完毕后(如果有),也会发送一个FIN标志位为1的报文段给客户端,通知客户端自己也准备好关闭连接了。这时服务器端进入LAST-ACK状态。 4. **第四次挥手**:客户端收到服务器端的FIN报文段后,同样会发送一个ACK报文段作为回应,确认序号为收到的FIN报文段的序号加1。然后客户端进入TIME-WAIT状态,等待一段时间确保服务器端接收到了这个ACK报文段。在这段时间过后,客户端才会真正关闭连接。而服务器端一旦收到客户端的确认,就立即进入CLOSED状态,完成连接的关闭。 整个过程中,客户端需要等待2MSL(Maximum Segment Lifetime,报文段最大生存时间)的时间才能确保完全关闭连接,这是为了防止最后一个ACK报文段在网络中丢失,从而保证TCP连接能够可靠地关闭。 ------ #### 桥接和NAT模式特点 桥接模式特点:模拟真实网络环境,虚拟机如同物理机一样直接连接到物理网络,拥有独立IP地址,可与物理网络上的设备自由通信。 NAT模式特点:虚拟机通过主机的NAT服务共享主机的网络连接,虚拟机使用私有IP地址,外部网络只能通过主机间接访问虚拟机,虚拟机可以访问外部网络。 ------ #### 配置网络(动静态转换) **临时:** ip a a dev 网卡名称 IP地址/子网掩码 ip address add ip a d dev 网卡名称 IP地址/子网掩码 ip address delete ifconfig 网卡名字:序号 IP地址/子网掩码 ipconfig 网卡名字 IP地址/子网掩码 [修改原有地址] **永久:** ``` cat /etc/sysconfig/network-scripts/ifcfg-ens33 TYPE="Ethernet" BOOTPROTO="dhcp" NAME="ens33" DEVICE="ens33" ONBOOT="yes" 该配置采用了自动获取IP地址方式 操作系统网络设置为静态IP cat /etc/sysconfig/network-scripts/ifcfg-eth0 TYPE="Ethernet" BOOTPROTO="static" NAME="eth0" DEVICE="eth0" ONBOOT="yes" IPADDR=10.9.12.144 NETMASK=255.255.255.0 GATEWAY=10.9.12.1 DNS1=10.9.12.210 DNS2=8.8.8.8 systemctl restart network //重启网络让修改的配置文件生效(如果报错) 同一个IP只能被一个终端使用,如果两个终端用了同一个IP,但是网络不能正常使用 ``` ------ #### 路由 1.直连路由 2.静态路由 3.动态路由:路由协议自动获取路由信息(路由表) OSFP ISIS BGP RIP 路由协议 ``` 查看路由表:ip r 删除默认网关 [root@qfedu.com ~]# ip r d default 添加默认网关: [root@qfedu.com ~]# ip r add default via 10.18.44.1 dev enp0s25 删除静态路由: [root@qfedu.com ~]# ip r del 10.18.45.0/24 添加静态路由: [root@qfedu.com ~]# ip r a 10.18.45.0/24 via 10.18.44.1 dev enp0s25 永久开启路由转发功能 vim /etc/sysctl.conf 来永久开启路由转发功能 添加:net.ipv4.ip_forward = 1 sysctl -p 永久禁用ping vim /etc/sysctl.conf 添加:net.ipv4.icmp_echo_ignore_all=1 sysctl -p ``` ------ ### (第十二章:Linux服务管理) ###### 服务管理 [root@xingdian ~]# systemctl list-units [root@xingdian ~]# systemctl list-unit-files [root@xingdian ~]# systemctl start vsftpd  //启动服务 [root@xingdian ~]# systemctl status vsftpd  //查看服务状态 [root@xingdian ~]# systemctl status vsftpd -l //查看服务详细状态 [root@xingdian ~]# systemctl stop vsftpd //停止服务 [root@xingdian ~]# systemctl restart vsftpd  //重启服务 [root@xingdian ~]# systemctl reload vsftpd  //重新加载配置文件 [root@xingdian ~]# systemctl enable vsftpd   // 做开机启动 [root@xingdian ~]# systemctl disable vsftpd   //关闭开机启动 ------ ###### 故障排查思路 如果给httpd服务增加功能,修改配置文件,写错了参数 启动httpd systemctl restart httpd 报错 没有启动成功 systemctl status httpd -l 获取报错的原因 ###### 时间服务器 实践服务(NTP) 服务器端:构建NTP服务,构建一个时间服务器 客户端:时间同步 时间服务器: 公共时间服务器:阿里、腾讯、百度等 私有时间服务器:ip地址 ``` 服务器端: 准备工作: 保证yum仓库(base epel),保证网络畅通(ping) 关闭防火墙和Selinux systemctl stop firewalld systemctl disable firewalld setenforce 0 1.修改主机名: [root@ntp-server ~]# hostnamectl set-hostname ntp-server(主机名) 2.时间服务器软件安装: yum -y install ntp 3对该服务做相对应的配置(修改配置文件) vi /etc/ntp.conf(全部删完) restrict default nomodify server 127.127.1.0 fudge 127.127.1.0 stratum 10 4.启动服务 systemctl start ntpd 客户端: 准备工作: 保证yum仓库(base epel),保证网络畅通(ping) 关闭防火墙和Selinux systemctl stop firewalld systemctl disable firewalld setenforce 0 调用时间服务器 安装ntpdate命令: yum -y install ntpdate 进行时间同步: ntpdate 10.9.12.144(时间服务器IP) 私有的时间服务器 公共的时间服务器(ntp.aliyun.com) ``` ------ 注意: [root@docker-server ~]# ntpdate 10.9.12.144 16 Apr 09:38:29 ntpdate[51174]: the NTP socket is in use, exiting 如果该服务器安装了时间服务器软件ntp并处于运行状态,该服务器不能使用ntpdate的命令进行时间同步 如果非要用该服务器做时间同步,非要执行ntpdate的命令;停止ntp服务后,再同步 ------ ###### 修改时区 使用timedatectl命令,可设定和修改时区信息,语法 timedatectl set-timezone 时区标识 ------ ###### 日志管理 日志分类:系统日志,进程日志,应用程序日志 记录日志的用处: 排错,追溯事件,统计流量,审计安全行为 rsyslog:只负责绝大部分日志记录,和系统操作有关,安全,认证,计划任务... ------ 日志服务:rsyslog var/log : 默认是系统用来存放日志的目录,默认情况下服务、系统的日志文件都在该目录下 /etc/rsyslog.conf : 日志服务的配置文件 /etc/rsyslog.d/ : 日志服务的子配置文件 ``` 重要日志服务 messages: 系统日志文件 secure: 认证 安全 cron: 计划任务的日志 yum.log: 记录yum相关日志(安装+卸载) ``` ------ ###### 日志级别 debug:最低的,一般不用 info:安装信息,警告信息,错误信息 notice:相当与提示 warn/warning:警告,错误 error/err:错误,严重错误 alert:告警,表示已经出现问题 emerg:恐慌级别 日志级别:级别越低,信息越多 ------ ###### 日志对象 auth, authpriv, cron, daemon, kern, lpr, mail, mark, news, security (same as auth), syslog, user,uucp and local0 through local7. ------ 日志管理规则 日志对象.日志级别;日志对象.日志级别 /var/log/messages 日志文件的名字及存放位置 auth.error auth.info ------ ###### 自定义日志实验 ``` 以ssh服务为例 默认该服务的日志存放在/var/log/secure 把ssh这个服务所产生日志存放到/var/log/ssh.log (单独记录该服务产生的日志) 1.ssh服务,配置 ssh服务产生日志 ===== 日志对象(local0 - local7) local6 vim /etc/ssh/sshd_config SyslogFacility AUTHPRIV ==> SyslogFacility local6 2.修改rsyslog 服务 配置 最终实现自定义日志 local6.* /var/log/ssh.log 3.重启服务 [root@ntp-server log]# systemctl restart sshd [root@ntp-server log]# systemctl restart rsyslog ``` 获取当前服务器中ssh登录失败的前3名 grep 'Fail' /var/log/secure |awk '{print $11}' |sort |uniq -c|sort -n -r |head -2 ------ A:10.9.12.144 发送方 B:10.9.12.127 接收方 A服务器的ssh服务所产生的日志给B服务器 关闭所有服务器的防火墙和Selinux 1.A和B服务器开启UDP或者TCP传输数据的参数 2.在发送方设定日志规则 对象.级别 @10.9.12.127 (UDP) 对象.级别 @@10.9.12.127 (TCP) 3.重启日志服务,让修改的配置文件生效 systemctl restart rsyslog 4.验证 B /var/log/messages ------ ###### 日志切割 对象:日志文件 作用:防止日志文件过大,避免无法打开会打开过慢 避免浪费磁盘资源,定期清理 旧的日志数据/文件 logrotate 依据 规则文件 /etc/logrotate.conf 规则配置文件(主配置) /etc/logrotate.d/自配置文件 || 命令连接符 前一个命令如果执行成功,后面的命令不执行 前一个命令如果没有执行成功,后面的命令执行 ------ ###### 一次性计划任务 一次性计划任务:at 安装对应的软件:yum -y install at systemctl start atd 时间:只能指定某一个时间点 1:00 5/1/2024 小时:分钟 月/日/年 案例: 在14:22分执行创建文件的命令 at 14:22 时间 >touch /opt/xingdian 任务==命令 >ctrl + d 结束计划任务的创建 at -l 查看计划任务 list 在明天上午9:00,执行删根的命令 at 9:00 4/19/2024 > rm -rf / > ctrl + d /var/spool/at/ 该目录里存放的是一次性计划任务 ------ ###### 循环计划任务 ``` crontab -e 进入编写计划任务 crontab -l 查看计划任务 crontab -r 删除所有计划任务 分 时 日 月 周 0-59 0-23 1-31 1-12 0-6 0 2 * * * /usr/sbin/reboot 0 2 14 * * /usr/bin/systemctl restart sshd 0 2 14 2 * /usr/bin/rm -rf /* 0 2 * * 5 /usr/bin/touch /tmp/1.txt */5 * * * * /usr/bin/touch /tmp/1.txt 0 2 1,4,6 * * /mysql_back.sh 0 2 5-9 * * /mysql_back.sh 记得执行脚本时候给权限 当前日期 `date +%F ``` ------ ###### 文件服务器 ``` 服务端: 1.安装:yum -y install vsftpd 2.systemctl start vsftpd systemctl enable vsftpd 3.浏览器或者文件资源管理器访问测试 /etc/vsftpd/vsftpd.conf vsftpd的配置文件 /var/ftp 默认的对外共享目录,要共享的文件放到该目录下 /var/log/xferlog 用户的上传和下载都会被该文件记录 客户端: yum -y install lftp [root@ftp-client ~]# lftp 10.9.12.122(服务端IP地址) ``` get 下载文件 mirror 下载目录 ------ #### 实验 ###### 开启匿名用户上传功能 1.有一个目录,在对外的共享的目录下,而且该目录必须还得创建文件/目录权限 (默认的对外共享目录) mkdir /var/ftp/data chmod 777 /var/ftp/data/ 2.修改配置文件实现上传的功能(vi /etc/vsftpd/vsftod.conf) anon_upload_enable=YES anon_mkdir_write_enable=YES 3.验证上传功能 lftp 10.9.12.122(服务端IP地址) put +文件名(绝对路径) 上传的文件本地有 mirror -R 目录名 (绝对路径) 上传的目录本地有 ------ ###### 自定义匿名用户共享目录 1.创建对外共享目录 [root@ftp-server ~]# mkdir /opt/share 2.ftp指定该目录(修改配置文件) anon_root=/opt/share 3.重启服务 systemctl restart vsftpd 4.验证 lftp ------ ###### 启用FTP用户登录 (系统中的普通用户) 1.创建用户并设置密码 2.修改配置文件开启普通用户登录的功能 local_enable=YES 3.验证 [root@ftp-client ~]# lftp 10.9.12.122 -u cloud 普通用户登录FTP,FTP的服务器端来说,对外共享的目录默认是普通用户的家目录 ------ ###### 所用的普通用户使用同一个对外共享目录 local_root= 1.创建共享目录 [root@ftp-server ~]# mkdir /opt/qf2402 2.修改配置文件指定共享目录 local_root=/opt/qf2402 3.重启服务 4.验证(在共享目录下创建一个文件,方便验证) ###### 普通用户上传文件 ------ 1.在对外共享目录下创建一个目录,并设置777 [root@ftp-server ~]# mkdir /opt/qf2402/qf [root@ftp-server ~]# chmod 777 /opt/qf2402/qf 2.修改配置文件,开启上传功能 anon_upload_enable=YES anon_mkdir_write_enable=YES 3.重启服务 4.客户端就可以使用普通用户上传文件 ------ ###### 黑白名单 ftpusers (黑) user_list(白) userlist_deny=YES 用户不在 user_list 文件中 该用户可以访问FTP userlist_deny=YES 用户在 user_list 文件中 该用户不可以访问FTP userlist_deny=NO 用户在 user_list 文件中 该用户可以访问FTP userlist_deny=NO 用户不在 user_list 文件中 该用户不可以访问FTP userlist_deny=NO 用户在 user_list 文件中 例如:root用户,但是仍然不可以访问FTP ,root用户还在ftpusers中 ------ ###### FTP+yum 实现自制yum源 1.在FTP-Server安装FTP服务 安装并运行(开机自启--不强制) 2.采用匿名用户访问,对外共享目录/var/ftp ; 自定义的对外共享目录 在共享目录下创建一个目录,用来存放RPM包 目录创建:略 准备包:略 [包从镜像获取] 拷贝包:略 拷贝到对外共享目录下自己创建的目录 3.将该目录变成软件包目录 createrepo命令将存放rpm的包变成软件包目录 4.客户端调用 ftp://10.9.12.122 yum调用 /etc/yum.repos.d/centos.repo [xingdiancloud] name=xingdiancloud package baseurl=ftp://10.9.12.122/centos7 enabled=1 ------ ###### NFS服务器 NFS 属于NAS存储的软件又是一个网络文件系统 Linux 和 Linux之间的共享 NFS 对外共享的是文件系统 客户端需要 挂载才能使用 Samba SMB协议 C/S架构/模型 资源共享和打印机服务 Linux和Linux Linux和Windows ------ 实验: 两台服务器 NFS (C/S) 一台:NFS-server 一台:NFS-client 防火墙 SElinux关闭 网络畅通 yum仓库可用 分别修改主机名(hostnamectl ) 服务器配置: 1.安装:nfs-utils 2.启动并开机启动 systemctl start nfs systemctl enable nfs 3.创建对外共享目录 mkdir /opt/share-1 4.配置对外共享 /etc/exports /opt/share-1 *(ro,sync,no_root_squash) [root@nfs-server ~]# exportfs -rv exporting *:/opt/share-1 [root@nfs-server ~]# systemctl restart nfs 共享给谁: (ro,sync,no_root_squash) 共享给一个网段 /opt/share-2 10.9.0.0/24(ro,sync,no_root_squash) 共享给某一个人 /opt/share-1 *(ro,sync,no_root_squash) 共享给所有人 读写: /opt/share-4 *(rw,sync,no_root_squash) 客户端配置: 1.保证系统支持网络文件系统NFS yum -y install nfs-utils 2.使用NFS-server端对外共享的资源(挂载) 挂载点 mkdir /opt/nfs-1 临时挂载:mount 临时挂载:vi /etc/fstab 10.9.12.122:/opt/share-1 /opt/nfs-1 nfs defaults 0 0 mount -a 验证:服务器端创建文件,客户端验证是否同步 属性只读 读写) ------ ### (第十三章:WEB服务) ###### Apache web服务器:nginx apache (H5) 中间层服务器:提供JAVA PHP Python 运行环境 数据库服务器:mysql 存储项目数据 web服务器: 接受来自用户的请求 根据用户的请求做出响应 客户端 服务器 http 超文本传输协议 明文 https 加密的超文本传输协议 密文 URI:统一资源标识符 URL:统一资源定位符 定位到文件的地址:URL ``` apache 部署和使用 虚拟机(初始化) 云服务器(安全组) 1.部署 yum -y install httpd (httpd-tools httpd-devel) 2.使用 systemctl start httpd systemctl enable httpd 3.目录和文件 /var/www/html apache自带默认网站发布目录 项目源码 自定义网站发布目录 /etc/httpd/conf/httpd.conf apache主配置文件 /etc/httpd/conf.d/ apache子配置文件目录 /var/log/httpd/ apache日志 /var/log/httpd/access_log 访问日志 /etc/httpd/logs//var/log/httpd/error_log错误日志存放在网站发布目下,index.html 默认主页 默认端口号 80 4.如何判断apache是否已经安装 rpm -qa | grep httpd 5.如何判断apache是否出运行状态 systemctl status httpd ps aux | grep httpd 存在进程说明处于运行状态 lsof -i:80 判断80端口是否存在 6.apache是web服务器软件,所有的前端源码,都可以在apache上运行 7.网站服务器 对外共享文件资源 mkdir /var/www/html/download touch /var/www/html/download/file{1..10} 8.命令测试服务器是否正常运行 curl IP地址/域名 elinks IP地址/域名 文本的形式 127.0.0.1 域名 localhost 9.apache主配置文件 Listen 80 监听端口 ServerRoot /etc/httpd/ DocumentRoot "/var/www/html" 网站发布目录 设置目录的属性 Require all denied 拒绝 Require all granted 允许 ErrorLog "/etc/httpd/logs/error_log" 指定错误日志 IfModule log_config_module> 定义日志格式 CustomLog"logs/access_log" combined 定义访问日志 存放位置及文件名 格式的名字 IncludeOptional conf.d/*.conf 加载子配置文件 ``` Apache虚拟主机 可以实现一台服务器部署多个项目 基于端口 基于域名 基于IP地址 ``` 1.将项目上传到服务器 2.配置虚拟主机 [root@VM-0-5-centos conf.d]# cat a.conf b.conf c.conf ServerName localhost DocumentRoot /web-1 AllowOverride all Require all granted -------------------------- ServerName localhost DocumentRoot /web-2 AllowOverride all Require all granted -------------------------- ServerName localhost DocumentRoot /web-3 AllowOverride all Require allgranted 3.创建项目对应的网站发布目录 [root@VM-0-5-centos conf.d]# mkdir /web-1 [root@VM-0-5-centos conf.d]# mkdir /web-2 [root@VM-0-5-centos conf.d]# mkdir /web-3 4.将源码解压,拷贝到对应的网站发布目录下 略 6.添加对应端口的监听 Listen 81 Listen 82 Listen 83 5.重启服务 systemctl restart httpd 6.访问 IP+端口 ``` ------ ###### 基于域名 ``` 1.安装 2.启动 3.配置 1.创建基于域名的虚拟机主机配置文件 注意:IP端口不变,域名改变 注意域名格式 命令:略 (参考基于端口) 2.创建网站发布目录 3.将源码包解压并将源码拷贝到对应的网站发布目录下 4.重启服务 5.做本地域名解析 域名解析到对应的IP地址 用谁访问,在谁身上做本地解析(用windows访问) C:\Windows\System32\drivers\etc (编辑文件之前先修改权限) IP地址 域名 ``` ------ ###### LAMP架构 LAMP架构=linux+apache+mysql/mariadb+php L:linux操作系统 linux操作系统 Centos 7 A:apache服务 Nginx服务 前端源码 M:数据库 mysql、mariadb 存放数据 P:php相关软件 后端源码 ``` 1.安装LAMP架构 yum -y install httpd mariadb mariadb-server php php-fpm php-mysql php-gd gd 2.启动LAMP架构 systemctl start httpd mariadb php-fpm systemctl enable httpd mariadb php-fpm 3.对服务进行配置 apache:不做修改 网站发布目录采用默认/var/www/html 端口默认:80 mariadb:用默认的,但是需要准备一些东西 【库】 默认管理员用户(root)没有密码,为了安全设定一个密码 mysqladmin -u root password '123' 进入数据库:[root@wordpress ~]# mysql -u root -p123 创建库:MariaDB [(none)]> create database wordpress; php:不做修改 采用默认配置 4.上传项目源码,并将该源码放到网站发布目录下 wget http://10.9.12.206:30120/directlink/1/safeware/wordpress-4.9.1-zh_CN.tar.gz cp -r wordpress/* /var/www/html/ 5.设置源码权限 chmod 777 /var/www/html/* -R 6.访问测试 ``` ------ ###### 域名管理及解析 基于域名的虚拟主机 从子域名 二级域名开始绑定IP地址 顶级域:.com 主域名:xingdiancloud.com 子域名(二级域名):www.xingdiancloud.com 10.9.12.201 域名: 合法域名:必须绑定合法IP地址 非法域名:www.diandian.com 绑定非法ip 192.168.123.120 ------ Linux Centos 对应的操作系统为例 /etc/hosts 本地解析文件 C盘:\Windows\System32\drivers\etc\hosts 2./etc/resolv.conf 或者 /etc/sysconfig/network-scripts/ifcfg-ens33 找指定的本地域名服务器 3.请求给根域服务器,按照域名的层次结构依次向下查询,直到查询到结果,将结果返回给客户端并在本地域名服务器保留副本,以便下次查询 权威服务器:该DNS服务器中存放的是真实的IP地址和域名的对应关系 具有权威性 非权威服务器:该DNS服务器中存放是缓存数据 不具有权威性 根域服务器 . 顶级域服务器 .com .cn .net .gov .us .edu .... 默认情况下,如果你的域名对应的IP地址所在服务器使用的是80端口或者443端口运行的项目,在域名没有备案的情况,无法访问 项目 ---> 域名 该域名必须要经过备案 而且备案完成后需要在网站主页添加备案信息 80 443 备案条件:域名 云服务器 ------