Linux运维从入门到精通
龟速更新ing!(虽然还有好多没更新)
默认安装好了centos7
如何实现Linux的远程连接?
首先我要知道主机的IP地址,有了IP电脑才能知道要访问的对象
ip -a #获取IP地址 #如果没有用可以使用ifconfig在自己主机上的IP地址一般使用的是ens33这张网卡,所以只要看ens33下的这个IP就行了
获取了IP地址以后就可以打开SSH软件建立会话
建立SSH链接没有特殊情况的话端口号是22
问题:ens33网卡没有IPV4
cd /etc/sysconfig/network-scripts/进入网络配置文件目录。
输入vi ifcfg-ens33编辑网卡配置文件。
将ONBOOT=no改为ONBOOT=yes,表示开机自动启动网卡。
保存并退出vi,输入:wq。
service network restart 重启网络
这样ens33网卡的IPV4就出现了(至少我是这样的)
Linux的目录结构
Linux系统是单根结构,意思就是Linux的所有目录起始目录都是/
而windows是但根结构,有CDEF这些盘,属于多根结构
Linux的设计师这么设计的原因是所有东西都是从根目录开头使文件比较好找
Linux的基本命令
命令格式:命令 -选项 参数
ls:查看目录下全部文件
-l 长格式化,相当于显示更多详细的信息
-lh 将长格式化中所显示出来的内存进行单位换算(K/M/G)
-a 显示隐藏文件
cp:复制命令
-r 复制的对象使文件夹
cp -r A B
从A复制到B
pwd:显示当前用户的home目录
mkdir:创建文件夹
-p 告诉mkdir有多少个层级一件创建,同时也可以在同级目录下创建多个文件夹。就比如说
/etc/{a,b,c}tough:创建文件
cat:查看文件全部内容
more:分页查看
mv:移动文件
rm:删除文件
-rf 强制删除(慎用)
which:返回要找文件的绝对路径
find:在指定目录下搜索文件
find [搜索起始路径] -name "文件名"grep:在文件中搜索关键字
-l 只统计行数(以回车统计换行)
-w 只统计单词数
-c 只统计字节数
-m 只统计字符数
|管道符
将左边命令的标准输出,作为右边命令的标准输入
echo:在屏幕上输出内容,类似于高级语言中的print
在echo中不能够直接输出文件中的内容。比如说我现在有一个文件a,文件a中写了1234。我现在想让echo输出1234我不能直接写echo a,这样的话他的返回结果就是a。那如果想要返回结果是1234的话那么就要这么写
echo 'a' echo $(a) $()=''#作用是一样的就是先执行里面的内容
>:覆盖写入
>>:前面的结果输出到后面去,追加写入
tail:默认显示文件后10行
-n 指定显示尾部行数
-f 持续跟踪文件尾部变化,实时显示新内容
Linux用户和权限
当我们输入ls -l查看详细信息时候会出现类似以下内容:
-rw-r--r--. 1 root root 96009 6月 5 2025 build_chain.sh字段1(权限字符串)
字段2(硬链接数):1或2
字段3(所有者)
字段4(所属组)
字段5(大小)
字段1由10个字符构成
第一个字符表示文件类型
-普通文件
d目录
l软连接
b块设备文件
c字符设备文件
将剩下的9个字符平分成三份-
第一段表示所有者
第二段表示所属组
第三段表示其他人
rwx权限的含义
r:阅读权限
w:写权限
x:执行权限
Linux下检查权限的顺序
- 检查是否为文件所有者
- 检查是否属于文件所属组
- 应用其他用户权限
我们修改权限的命令是chmod
用户类别u:所有者,g:所属组,o:其他,a:所有
操作符+:添加,-:移除;=:设置
权限字符r:读,w:写,x:执行
例如
chmod u+x file.txt #给文件的所有者添加执行权限 chmod g-w,o-r file.txt #给所属组移除写权限,给其他用户移除读取权限 chmod u=rwx,g=rx,o=file.txt #一次性设置所有用户权限,覆盖原有设置chmod数字模式
r=4,w=2,x=1,无权限=0
要什么权限就是把数字相加就好了
修改文件所有者
chown:可以修改文文件的所有者和所有组
chown [选项] [所有者][:[组]] 文件名 -R:递归修改目录及其所有内容的归属Linux系统服务管理:systemctl命令
systemctl是管理系统服务的主命令行工具,是systemmd的前端接口。主要是启动/重启/停止服务、查看状态、设置开机自启等。
服务是后台持续运行、提供特定功能且无需交互的程序。
systemctl[选项][命令][服务单元名称]#核心语法结构 #核心命令包括start/stop/status/enable(开机自启)/restart/reloadLinux系统监控与日志查看
top命令是Linux中比较常用的一个监控实时工具包,类似于Windows中的任务管理器,可以动态显示进程资源占用情况,如cpu,内存,并排序。
htop是top命令的增强版,支持鼠标交互、有进程树、可以批量kill进程,但是需要另外安装。
sudo yum install -y htop #CentOS sudo apt install -y htop #Ubuntu无法下载htop
在学习的过程中我无法下载htop,首先告诉我下载失败,我去问了万能的deepseek大人,deepseek大人告诉我
CentOS 7已停止维护(2024年6月30日结束生命周期),官方镜像源已迁移到归档仓库
并且给出了解决方案
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup #备份原有repo文件 curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo # 使用阿里云镜像源(CentOS 7归档) yum clean all yum makecache #清理缓存并生成新缓存执行完以后是不报错了,但是显示没有htop这个包,教程告诉我要先安装一个拓展仓库,然后再去安装htop
yum install epel-release -y至此解决所有问题可以开始下载htop
比较常用的交互命令
鼠标点击排序/选择
/快速搜索进程
t切换进程树视图
k杀死选中进程
接下来我们要用命令查看磁盘空间
主要分为df和du命令
df命令报告文件系统的磁盘空间使用情况,显示整个磁盘分区的信息
-h 人类可读
-t 显示类型
du命令估算文件或目录占用的磁盘空间,显示具体项目的大小
-h 可读
-s 总计
-c 汇总
-a 所有
Linux的日志主要存储在/var/log目录下
常见的日志文件主要有
messages:系统主日志
secure:安全认证日志
cron:定时任务日志
boot.log:系统启动日志
系统轮转会自动归档、压缩和删除旧日志
Linux日期、时间与时区管理
date命令可以查看时间
默认格式下不符合中文阅读习惯
常用的格式化符号
%Y年份,%m二位数月份,%H24小时制小时(00-23),%S秒
Linux网络传输:端口与端口查看
在Linux中的/etc/services告诉我们Linux默认保留端口的文档
netstat适用于显示网络连接、路由表和协议统计信息的命令行工具
常用的选项组和
-a显示所有连接
-n以数字的形式显示地址和端口
-p显示关联的进程PID和名称
-t只显示TCP连接
-u只显示UDP连接
Shell脚本
shell就是一个命令解释器,如果没有shell的话就没有办法使用命令。
如何写shell脚本?
shell的种类比较多,如bash,sh,csh,ksh等等。为什么会有那么多?这是因为随着Linux和unix的发展而划分出的流派。
使用哪一种会在文件头部写明。比如
#!/bin/bash就相当于告诉系统等一会儿用这个执行。
再Shell脚本中,使用‘=’进行变量赋值,如var=value,并通过‘$var‘来使用变量
#!/bin/bash #定义目录名称 DIRNAME='/data/backup' mkdir -p ${DIRNAME} echo "变量的值为:${DIRNAME}"if语句的基本格式
if[条件]; then #bool为真执行 fi if [条件]; then #bool为真执行 elif[条件]; then #bool为真执行 else #bool为假执行 fi#条件式举例说明 条件式判断文件夹是否存在 if[ -d data ]; then echo '目录存在' fi #检测文件是否存在 if [ -f /etc/hosts ]; then echo "系统hosts文件存在" fi #!!!![]首尾内部必须添加空格,不然会报错。不要问我怎么知道的#!/bin/bash for i in {1..5} do echo "数值:$i" done #进阶一点的写法就是可以看文件 for i in $(ls /) do echo "$i" done #要批量创建用户 for i in ${cat /shell/uname.log} #告诉系统以这个文件里的内容作为循环变量,他是一行一行读取的 do useradd ${i} echo "用户创建成功" doneMysql安装
#case语句基本语法 case 变量 in 模式1) 执行操作1 ;;#双分号代表结束 模式2 | 模式3) #多条件用|分割 执行操作2 ;; *)#默认分支(其他情况) 执行操作 ;; esac #结束标记MySQL5.7默认没有在CentOS官方的仓库中,无法直接通过yum指令去安装,我们需要手动添加yum仓库。
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022然后我们就可以开始安装mysql了,我们要安装的是MySQL5.7社区版服务,指令如下
yum -y install mysql-community-server提示找不到这个包
我按照这个指令操作,但是现实没有相对应的mysql包,于是我又去求助了万能的deepseek大人
添加MySQL官方Yum仓库
# 下载MySQL仓库安装包(适用于CentOS 7) wget https://repo.mysql.com/mysql80-community-release-el7-11.noarch.rpm # 如果wget不可用,用curl替代 curl -O https://repo.mysql.com/mysql80-community-release-el7-11.noarch.rpm安装仓库包
rpm -Uvh mysql80-community-release-el7-11.noarch.rpm检查仓库是否启用
yum repolist enabled | grep mysql安装MySQL服务器
yum install mysql-community-server -y由于我忘记了root密码
所以采取以下方法进行操作
我这里用的是mysql8,如果是mysql5.7的话好像会有出入,应该是字段会不一样(我看过帖子的目测)
- vi /etc/my.cnf
- 到文件最下方输入skip-grant-tables然后wq退出。
- 然后按照正常方法进入mysql,由于我们输入了skip-grant-tables跳过验证,所以我们可以无需密码就进入mysql。
- 把mysql.user表中属于root的authentication_string填写为空,然后再退出。
update user set authentication_string = '' WHERE User = 'root' AND Host = 'localhost'; - 回到my.cnf把skip-grant-tables删除,然后重启。
- 重新设置密码,如果直接在第四步设置,由于skip-grant-tables的存在会导致操作失败
UPDATE user SET authentication_string = '要设置的密码' WHERE User = 'root' AND Host = 'localhost';
权限管理
创建用户
CREATE USER 'username'@'host' IDENTIFIED BY 'password';创建本地用户
CREATE USER 'dev'@'localhost' IDENTIFIED BY '!Aa123456'创建远程登录用户
CREATE USER 'consumer'@'%' IDENTIFIED BY '!Aa123456'要注意的是主机地址可以是localhost(本地),%(任意ip)或者具体ip
密码需要复合安全策略(8位及以上,含大小写字母、数字、符号)
给用户授权格式
GRANT AUTHORITY_LIST ON DATABASE.TABLE TO 'USERNAME'@'HOST'全局权限
GRANT ALL PRIVILEGES ON *.* TO 'USERNAME'@'HOST'剩下的就是正常按照按照sql语句中的关键字作为权限符
SELECT,INSERT,UPDATE,DELETE,CREATE,ALTER,DROP,INDEX……
列级权限会跟上述格式有些出入,在这里举个例子
GRANT SELECT(ID,NAME),UPDATE(PRICE) ON MYDB.ORIDYCTS TO 'USERNAME'@"HOST"要注意的是,输入完以后要使用FLUSH PRIVILEGES来刷新权限,如果要撤销权限的话只用吧GRANT改成REVOKE就可以了
数据库备份
mysql使用mysqldump工具来备份
使用mysqldump可以到处数据库结构和数据,生成sql语句,便于数据迁移和备份。
我安装的版本默认已经提供了mysqldump,别的版本尚且不知
基本语法
我在实操的时候发现-p[password]的这种方法不知道为什么一直报错,但是直接-p再输入密码就是好的。
mysqldump -u[username] -p[password] [option] [databasename] [tablename] > backupname.sql如果要备份多个表只用将[tablename]变成table1 table2这样子就行了可以使用--where进行筛选
mysqldump -u root -p [databasename] table1 table2 --where="id<1000" > backupfilename.sql备份单个数据库
mysqldump -u root -p --single-transaction --routines --events databasename > backupfilename.sql--single-transaction 确保InnoDB表一致性
--routines和--events 包含存储过程和定时任务
MySQL高级特性
MySQL是可以多实例运行的,就是可以在一台服务器上运行多个MySQL。
他的资源是隔离的,可以针对不同的性能进行调优
由于是多实例,每个实例都有独立的数据目录、配置文件、端口号、日志文件
独立的进程和资源调配(cpu、内存)
- 设置mysql开机自启
sudo systemctl enable mysqld - 创建第二个实例的数据目录
sudo mkdir -p /data/mysql2 sudo chown -R mysql:mysql /data/mysql2 #创建日志目录 sudo mkdir -p /var/log/mysql2 sudo chown -R mysql:mysql /var/log/mysql2多个实例共用一个启动文件
- 配置文件
[mysqld] basedir = /usr/local/mysql datadir =/data/mysql socket=/tmp/mysql2.sock port=3307 log-error=/data/mysql2/mysql-error.log pid-file=/data/mysql2/mysql.pid skip-name-resolve=1 symbolic-llinks=0 explicit-defaults_for_timestamp=1 key_buffer_size=256M server-id=2 - 初始化实例
mysqld --defaults-file=/etc/my.cnf.d/mysql2.cnf --initialize --user=mysql - 然后在我们配置的log-error的地方会生成密码,我们查看文件获取密码
ammmm多实例报错了,过两天补
Redis
安装redis
yum update yum install epel-release yum -y install redisredis的配置文件位于/etc/redis/redis.conf或者/etc/redis.conf
redis默认只能本地访问,如果要让别人访问的话就要修改bind配置,修改成0.0.0.0
设置一个访问密码的话就要修改requirepass,我找到的话是在480行,被注释掉了
设置开机自启
systemctl start redis&systemctl enable redisredis提供了专门得命令端叫做redis-cli
一般设置redis的键值
set key value get keyHash一般具有极高的唯一性,用于快速检索。
列表一般用于消息队列,支持从两端插入和弹出属性,如PUSH和RPRP。通过LRANGE命令可以获取列表中指定范围的元素,实现数据的分页和批量处理。BLPOP和BRPOP命令允许用户对列表进行阻塞式弹出,常用于实现消息队列。
集合是redis中的一种数据类型,用于存储不重复的无序字符串,redis提供了SADD、SMEMBERS命令来添加获取集合中的元素。可以运用于如用户的关注列表。
有序集合Zset一般会关联一个二double类型的分数,根据分数进行排序。ZSet提供了丰富的操作命令,如ZADD添加元素、ZRANGE获取指定范围元素、ZREVRANK获取元素的逆序排名等。
Redis的主从复制
redis主从复制可以避免单点损坏和数据丢失。原理其实就是redis允许将数据从A复制到B,当A节点发生故障可以由B节点接管。
