Linux基础知识笔记

韩顺平2021Linux课程,视频地址:【小白入门 通俗易懂】2021韩顺平 一周学会Linux_哔哩哔哩_bilibili


Linux 基础知识

目录结构(一切皆为文件)

常用:

/bin (/usr /bin,/usr/local/bin) :存放常用命令

/home :存放普通用户的主目录

/root :系统管理员主目录

/etc :所有系统管理所需要的配置文件和子目录,比如mysql中的my.conf。

/usr :用户应用程序都放在该目录,类似windows中的program files。

/boot :存放启动linux时使用的一些核心文件,包括一些连接文件以及镜像文件 [勿动]。

/media :linux会自动识别一些设备,例如U盘,识别后,将识别的设备挂载到该目录

/mnt :系统提供该目录是为了让用户临时挂载别的文件系统,可以把外部的存储挂载在/mnt/上,然后进入该目录查看内容,如虚拟机与主机共享的文件夹。

/usr/local:用户级的程序目录,可以理解为C:/Progrem Files/。用户自己编译的软件默认会安装到这个目录下。

/usr/src:系统级的源码目录

/usr/local/src:用户级的源码目录

/var :存放不断扩充修改的文件,包括各种日志文件。

了解:

/opt :给主机额外安装软件所摆放的目录,如安装oracle数据库就可放到该目录,默认为空。可以理解为D:/Software,opt有可选的意思,当你不需要时,直接rm -rf掉即可。在硬盘容量不够时,也可将/opt单独挂载到其他磁盘上使用。

/dev :类似windows的设备管理器,把所有硬件用文件的形式存储。

/lib :系统开机所需要最基本的动态连接共享库,类似windows里的DLL文件,几乎所有应用程序都需要这些共享库。

/sbin :系统管理员使用的系统管理程序

/lost+found :一般是空目录,当系统非法关机后就存放一些文件。

/proc :虚拟目录,系统内存的映射,访问该目录来获取系统信息[勿动]。

/srv (service缩写) :存放一些服务启动之后需要提取的数据[勿动]。

/sys :存放文件系统sysfs [勿动]。

/tmp :存放临时文件 。

/selinux :一种安全子系统,控制程序只能访问特定文件,有三种工作模式。


vim的使用

打开: vim/vi 文件名

正常模式,可以复制粘贴

复制:yy(复制当前行),5yy复制当前行开始向下5行

删除:dd(删除当前行),5dd删除当前行开始向下5行

粘贴:p 粘贴

编辑:i/I 进入插入模式

跳转最后一行:G

跳转第一行:gg

跳转到某一行:行数,shift+g

撤销输入:u

恢复撤销: ctrl+r

命令模式

保存:编辑结束后按Esc退出,按冒号 :或 / 斜杠进入命令模式,输入 wq(保存退出)或q(退出)或 q!(强制退出,不保存)

文字查找:/关键字 按n选中下一个

显示行号: :set nu

不显示行号: :set nonu


关机&重启命令

shutdown -h now 立刻关机

shutdown -h 1 一分钟之后关机

shutdown -r now 重启计算机

halt 关机

reboot 立刻重启

sync 把内存的数据同步到磁盘

tip :目前所有关机&重启命令都已经在关机前进行sync,但仍要小心。


用户管理

切换用户:su - 用户名 / su 用户名

显示用户信息:id 用户名

注销 :在shell界面中(运行级别为3)输入logout/exit,root ——>用户

默认添加(/home):useradd 用户名

指定目录添加:useradd -d /home/目录 用户名

新增用户并分组:useradd -g 用户组 用户名

修改用户分组:usermod -g 新组名 用户名

修改用户分组并更改登录初始目录:usermod -d 目录名 用户名 改变该用户登陆的初始目录 tip:用户需要有进入新目录的权限

将用户添加到某一个组中:usermod -aG 新组名 用户名

修改当前用户密码:passwd(通用)

修改某一个用户密码:passwd 用户名

删除用户,保留家目录:userdel 用户名

删除用户,不保留主目录:userdel -r 用户名

查看当前登录用户:whoami / who am I (切换用户后仍显示连接时登录的用户)

用户组 group

——类似角色

新增组:groupadd 组名

删除组:groupdel 组名

修改组名:groupmod -n 新组名 原组名

  • 没有指定组时(默认生成root用户相同的组)

用户和组相关文件

/etc/passwd

  • 用户(user)配置文件,记录用户的各种信息

  • 每行的含义:用户名:口令:用户标识号:注释性描述:主目录:登录shell

/etc/shadow

  • 口令的配置文件

  • 每行的含义:登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志

/etc/group

  • 组的配置文件,记录Linux包含的组的信息

  • 每行含义:组名:口令:组标识号:组内用户列表


指定运行级别

  • 指定运行级别(7个级别)

    1. 关机,系统停机状态,默认运行级别不能设置为0,否则不能正常启动

    2. 单用户【找回丢失密码】,root权限,用于系统维护,禁止远程登录

    3. 多用户状态没有网络服务(NFS),不支持网络

    4. 完全的多用户状态有网络服务,(multi-user.target)登陆后进入控制台命令行模式

    5. 系统未使用保留给用户

    6. X11控制台,图形界面(终端界面,shell界面),(graphical.target)登录后进入GUI模式

    7. 系统正常关闭并重启,默认运行级别不能设置为6,否则不能正常启动

  • 系统的运行级别配置文件:/etc/inittab

  • 切换到指定运行级别的指令:init [012356]

获取当前运行级别:systemctl get-default

设置运行级别:systemctl set-default 级别名称


帮助指令

  • man [命令或配置文件](功能描述:获得帮助信息)

  • help 命令 (功能描述:获得shell内置命令的帮助信息)


文件目录类

  • pwd (功能描述:显示当前工作目录的绝对路径)

  • ls [选项] [目录或是文件]

    -a : 显示当前目录所有的文件和目录,包括隐藏的

    -l : 以列表的方式显示信息

    • ls -l命令,输出文件/目录的 10 位基本信息字符串 (0 - 9 位)

      #其中第 0 位为此文件/目录的文件类型
      #d / l / c / b --> 目录(文件夹) / 链接 (快捷方式) / 字符设备 (键盘、鼠标等) / 块设备 (硬盘等)
    • lsattr -a命令,同样查看输出字符串的第 0 位,规则同 ls -l 指令的输出

  • ll 以列表的方式显示信息,包括隐藏文件

  • cd [参数](功能描述:切换到指定的目录)

    cd ~ 或者cd 回到自己的家目录

    cd .. 回到当前目录的上一级目录

  • mkdir [选项] 目录名称

    -p:创建多级目录。

    mkdir -pv /home/{*.txt,*.sql}:创建多个目录或文件

    mkdir -pv /home/fd /home/df:创建多个目录

  • rmdir 目录名称:删除空目录。

  • touch 文件名称 (功能描述:创建空文件。可以一次性创建多个文件)

  • cp [选项] 资源路径 目标目录路径/ :拷贝文件到指定目录;

    -r:递归复制整个文件夹。

    强制覆盖不提示的方法:cp命令改为\cp

  • rm [选项] 资源名称:移除文件或目录;rm -rf 目录名称(可删除非空目录)

    -r:递归删除整个文件夹;

    -f:强制删除不提示。

  • mv:移动文件与目录或重命名

    mv oldfilename newfilename(功能描述:同目录下为重命名)mv pig.txt ca.txt

    mv 源资源路径 目标资源目录(功能描述:不同目录下为移动文件)

    mv /home/pig.txt /root/(只移动文件)

    mv /home/pig.txt /root/ca.txt (移动文件并改名)

    mv /home/ca.txt /home/(移动整个目录)

  • cat [选项] 要查看的文件

    -n :显示行号

    使用细节:cat只能浏览文件,而不能修改文件,为了浏览方便,一般会带上管道命令 | more

    cat -n /etc/profile | more

  • more指令是一个基于VI编辑器的文本过滤器,它以全屏幕的方式按页显示文本文件的内容。more指令中内置了若干快捷键(交互的指令)

操作功能说明
空白键(Space)向下翻一页
Enter向下翻一行
q立刻离开more,不再显示该文件内容
Ctrl + F向下滚动一屏
Ctrl + B返回上一屏
=输出当前行的行号
:f输出文件名和当前行的行号
  • less指令用于分屏插卡文件内容,它的功能与more指令类似,但是比more指令更强大,支持各种显示终端。less指令在显示文件内容时,会根据显示需要加载内容,对于大型文件阅览具有较高的效率。

操作功能说明
空格:下一页
pagedown:同上,下一页
pageup:上一页
/XXX:向下搜寻字符XXX,n=向下查找,N=向上查找
?XXX:向上搜寻字符XXX,n=向上查找,N=向下查找
q:退出
  • echo [选项] [要输出的内容] 输出内容到控制台

    echo $HOSTNAME / echo "helloword"

    使用细节:要输出的内容可以是其他指令的执行结果,echo指令可配合其他指令使用

  • head [选项] [要输出的内容] 默认显示文件头10行的内容

    显示文件的开头部分。-n 5:看前面5行内容。

  • tail [选项] [要输出的内容]默认显示文件中尾10行的内容

    -n 5 :看后面5行内容。

    -f :实时追踪该文档的所有更新

  • >/>> 输出重定向:覆写/追加,没有该文件则会创建

    指令> 指令执行结果覆盖到的文件 指令 >> 指令执行结果追加到文件

    ls -l > AAA将当前工作目录下的文件列表覆盖写入 AAA 文件中 ls -al >> AAA 将当前工作目录下的所有文件列表追加到 AAA 文件的末尾 cat 文件1 > 文件2 将 文件1 的内容覆盖写入 文件2 中 echo 内容 >> 文件

  • ln -s 创建软连接也称为符号链接(类似快捷方式)

    ln -s [原文件/目录路径] [软链接名]在当前工作目录下创建软链接 ln -s [原文件/目录路径] [指定目录+软链接名]在指定目录下创建软链接

    tip :pwd指令显示的路径为软链接所在路径

  • history 指令历史记录

  • 显示所有的历史命令 history

  • 显示最近 10 条历史指令 history 10

  • 执行历史编号为 5 的指令

    !5

  • wc 计数指令

    wc [参数] [文件]

    -l line:计算行数 -c 计算字节数 -m 计算字符数 -w 计算单词数

    tip:若不加文件,则通常使用管道分隔符|,计算其他指令输出的计数

    计算 ls -l 输出中,以“d”开头的记录条数: ls -l /opt/ | grep "d" | wc -l


时间日期类

  • date 显示当前时间

    date 显示当前时间 date +%Y 显示当前年份 data +%m 显示当前月份 date +%d 显示当前日 date "+%Y-%m-%d %H:%M:%S" 显示”年-月-日 时:分:秒“ date -R 显示UTC标准时间格式 date +%c 根据当前时区地区设置显示的完整时间(中国显示:XX年XX月XX日 星期X XX时XX分XX秒) date +%D 显示“年/月/日” date +%T 显示“时:分:秒”

  • date -s 设置当前日期

    date -s 时间字符串

    1. 时间字符串格式 a. Sun, 29 Feb 2004 16:21:42 -0800 b. 2004-02-29 16:21:42 c. next Thursday

    2. 时间字符串要加双引号 “ ”

  • cal 显示日历

    cal [选项] [日 月 年]

    cal 2022


搜索查找类

  • find指令将从指定目录下递归的便利各个子目录,将满足条件的文件或者目录显示在终端

    find [搜索范围] [选项]

    find -name 名称表达式查找内容 名称表达式:

    • 可用通配符:*

    • 可用正则表达式

      使用正则表达式时,单独使用 -regex 参数,不加 -name/uer/size等单数) 可有多个表达式,并用逻辑运算符连接(-and/-or/-not)

    find -user 用户名文件所有者

    find -size 大小表达式文件大小

    • +aG大小大于a GB

    • -bM大小小于b MB

    • cK大小等于c KB

  • locate 根据索引快速检索文件

    locate指令可以快速定位文件路径

    locate指令利用事先创建的文件和目录索引数据库实现文件快速搜索。

    locate指令无需遍历查找文件,只需要查询索引数据库,因此速度较快。 但为保证查询结果的准确度,管理员必须要定期更新 locat数据库。

    locate 文件名

    tip在第一次运行locate指令前,需要使用updatedb指令创建locate索引数据库

  • grep:过滤查找,表示将前一个命令的处理结果输出传递给后面的命令处理。经常跟管道一起使用。

    • grep [选项] 查找内容 源文件

    • -n:显示匹配行及行号。

    • -i:忽略大小写字母。

    • -v:只选中不匹配的行

    • cat hello.txt | grep "yes"

  • which 查看指令所在目录 which +指令名


压缩和解压缩

  • gzip/gunzip指令

    gzip +文件名 功能描述:压缩文件,智能将文件压缩为 *.gz 文件 gunzip +文件名 功能描述:解压缩.gz压缩文件

  • zip/unzip 指令

  • zip用于压缩文件为zip 格式,unzip 用于将zip格式文件解压 压缩zip文件和目录:zip [选项] XXX.zip 要压缩的文件/目录 解压缩zip文件:unzip [选项] XXX.zip zip常用选项

    • -r 递归压缩,用于压缩整个目录

    unzip常用选项

    • -d [目录] :解压到指定目录

  • tar 指令 打包指令,打包后的文件是.tar.gz的文件 tar [选项] +要打包的文件/目录(可有多个文件/目录)

选项功能
-c产生.tar打包文件
-v显示详细信息
-f指定压缩后的文件名
-z打包同时压缩
-x解包.tar文件

tar -zcvf pc.tar.gz /home/pig.txt /home/cat.txt

tar -zxvf myhome.tar.gz /opt/tmp2/


组权限和权限管理

linux中的每个用户,必须属于一个组,不能独立于组外。 linux中的每个文件/目录,都有且仅有一个所有者。

  • 在liunx中有 所有者、所在组、其他组 等概念

    • 所有者:文件/目录的所有者,一般来说文件/目录由谁创建则所有者就是谁,可以修改。

    • 所在组:用于多个相同权限用户的管理,用户必须属于至少一个组,一个用户可以属于多个组,一个组可以包含多个用户。

    • 其他组:对一个文件而言,除了所有者所属用户组以外的其他用户组,成为其他组,其他组对此文件也可设定一定权限。

  • ll 查看文件的所有者

    ls -alh 列表显示、显示所有文件、按常见单位显示 列表显示的内容(从左往右):

    权限、包含的文件/目录总数、所有者、所在组、文件大小(字节)、修改时间、名称

修改所有者和所在组

  • chown 修改文件/目录的所有者/所在组

    chown [选项] 新用户名:新用户组 文件名/目录名

    chown 新用户名 文件名/目录名 将文件/目录所有者修改为对应用户,所在组不变 chown :新用户组 文件名/目录名 将文件/目录所在组更改,所有者不变 chown 新用户名AAA:新组名BBB 文件名/目录名 将文件/目录所有者/所在组 修改为 AAA/BBB

    -R 修改目录及其子文件、子目录的所有者和所在组 -h 修改子文件中的软链接,而不是修改软链接指向的文件 -v 显示详细操作

  • chgrp修改文件/目录所在组

    chgrp [参数] 新组名 文件/目录名

    -R 修改此目录下所有子目录/子文件的所在组 -h 修改此目录下软链接的所在组,而不是修改软链接指向的文件的所在组

权限介绍

权限示例:drwxr-xr-x 2 hcx hcx 4096 7月 1 22:18 Videos/

前边包含 r/w/x/- 等字符的部分,有 10 位。为文件类型、对应文件/目录的权限。

  • 第 0 位:文件类型(d, -, l, c, b) d:目录(directory,即文件夹) -:普通文件 l:链接(link,即快捷方式) c:字符设备(character devices),如鼠标、键盘 b:块设备(block devices),如硬盘等

  • 第 1-3 位:所有者(Owner)的权限

  • 第 4-6 位:所在组(Group)的权限

  • 第 7-9 位:其他组(Other)的权限

权限介绍(rwx的含义)

  • 对文件的 rwx r:可读(read)——可以读取、查看文件内容 w:可写(write)——可以修改,只有同时对文件所在目录具备写权限才能删除文件。 x:可执行(execute)——可以执行 -:不具备此权限

  • 对目录的 rwx r:可读(read)——可以查看此目录包含的内容,可用ls指令 w:可写(write)——可以创建,修改,重命名目录,可在此目录内新建、重命名、删除子文件/子目录,但不一定能进入文件或修改文件内容 x:可执行(execute)——可以进入此目录 -:不具备此权限

修改权限

chmod [选项] 权限表达式 文件/目录名

-R 递归的修改权限,同时修改目录、子目录、子文件的权限 -v 权限修改的详细信息

  • 字母形式详解 u=rwx,g+rw,o-r u,g,o三者顺序任意,省略不写则权限不变,逗号前后不能有间隔 u = 所有者 (用户,user) 权限,g = 所在组 (组,group) 权限,o = 其他组 (others) 权限 a = 所有组(包括以上全部 3 者)的权限 r,w,x三者顺序任意,省略不写则认为无此权限 r = 可读 (read),w = 可写 (write),x = 可执行 (execute) =+-为权限的设置模式

  • 数字形式详解

    chmod 751 文件/目录名: 所有者:7 = 111 = rwx,所在组:5 = 101 = r-x,其他组:1= 001= --x

    3 位 10 进制数字,分别表示:所有者、所在组、其他组的权限


crond任务调度

crond是linux下用来周期性执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。Linux下的任务调度分为两类,系统任务调度和用户任务调度。

  • 任务调度:系统定时、按照一定周期或规则,执行特定的命令或程序

  • 任务调度分类:

    1. 系统任务:某些重要的任务需要周而复始的执行,如病毒扫描等

    2. 个别用户任务:个别用户希望执行的任务,如对 mysql 数据库的备份

crontab定时任务(周期性)

crontab [选项]

-e 编辑 crontab 定时任务 ​ -l 查询 crontab 任务/列出当前有那些任务调度 ​ -r 删除当前用户所有的 crontab 任务/终止任务调度 ​ service crond restart重启任务调度

  • 示例

    设置任务调度文件:/etc/crontab

    设置个人任务调度,执行crontab -e命令

    输入任务到调度文件中

    如:*/1 * * * * ls -l /etc/ > /tmp/to.txt(每小时每分钟执行该命令)

  • 参数说明

项目含义范围
第一个“*”一小时当中的第几分钟0-59
第二个“*”一天当中的第几小时0-23
第三个“*”一个月当中的第几天1-31
第四个“*”一年当中的第几月1-12
第五个“*”一周当中的星期几0-7(0和7都代表星期日)
  • 特殊符号说明

    • *:代表任何时间。比如第一个*就代表一小时中每分钟都执行一次的意思。

    • ,:代表不连续的时间。比如“0 8,12,16 * * *命令”,就代表在每天的8点0分,12点0分,16点0分都执行一次命令。

    • -:代表连续的时间范围。比如“0 5 * * 1-6命令”,代表在周一到周六的凌晨5点0分执行命令。

    • /n:代表每隔多久执行一次。比如“*/10 * * * * 命令”,代表每隔10分钟就执行一遍命令。

  • 定时Shell脚本举例

    vim *.sh ,编辑任务,给*.sh增加执行权限chmod u+x *.shcrontab -e ,执行shell脚本

at定时任务(一次性)

  1. at命令时一次性定时计划任务,at的守护进程atd会以后台模式运行,检查作业队列并运行

  2. 默认情况下,atd守护进程每 60 秒检查作业队列。队列有作业时,检查作业运行时间,若计划时间与当前时间匹配,则运行此作业。

  3. at定时任务的最小间隔为 1 分钟

  4. at命令是一次性定时计划任务,一个作业执行后不再执行该计划 在使用at命令时,一定要保证atd进程启动,可使用相关指令查看

    ps -ef | grep atd(检测atd是否在运行)

at命令格式:at [选项] [时间],输入命令,Ctrl+D结束命令

  • 守护进程 atd 查看状态 service atd status systemctl status atd ps -ef | grep "atd" ps -aux | grep "atd"

  • 守护进程 atd 启动/停止/重启/查看进程状态 service atd start/stop/restart/status systemctl start/stop/restart/status atd

  • at命令选项

选项含义
-m当指定的任务被完成后,将给用户发送邮件,即使没有标准输出
-Iatq的别名,查看系统中没有执行的工作任务
-datrm的别名,删除已经设置的任务
-v显示任务将被执行的时间
-c打印任务的内容到标准输出
-V显示版本信息
-q <队列>使用指定队列
-f <文件>从指定文件读入任务而不是从标准输入读入
-t <时间参数>以时间参数的形式提交要运行的任务
  • at时间定义

选项含义
hh:mm小时:分钟,加入该时间已经过去,放在第二天执行,Eg: at 04:00
midnight晚上12点
noon中午12点
teatime下午4点
12小时制在时间后加am或pm,Eg: at 05:00 pm,指定日期需要在指定时间后
month day(月 日)
mm/dd/yy(月/日/年)
dd.mm.yy(日.月.年)
相对计时法now + cout time-units,Eg: now + 5 minutes
today,tomorrow直接指定

磁盘分区,挂载

磁盘分区与Linux文件系统

  1. Linux 系统中的文件系统的总体结构是一定的:只有一个根目录,根目录下的目录结构独立且唯一(如 /boot、/dev、/bin、/etc 目录等都是唯一的),Linux 中的磁盘分区都是文件系统中的一部分

  2. Linux采用”载入“的方法,它的整个文件系统中包含一整套的文件和目录,且将一个分区和一个目录联系起来,此时要载入的一个分区将使它的存储空间在一个目录下获得。

  3. 任何目录或其父目录都要挂载到硬盘的某个分区下。如需要将某一分区挂载到根目录下,Linux 系统才能正常工作

  4. 某个分区所挂载的目录,称为此分区的挂载点

  5. 磁盘的不同分区可以挂载到 Linux 文件系统的不同分区下,但不能同时挂载到一个相同的目录

驱动器标识

在 linux 系统中,会将硬盘和分区进行标识,表达不同分区的功能:

Linux 硬盘有两种:IDE 硬盘 和 SCSI 硬盘(大部分)

  • IDE 硬盘: 驱动器标识为:hdx~ hd表示分区所在设备的类型,这里hd= IDE 硬盘 x为盘号,区分不同硬盘间的功能

    标识功能
    a基本盘
    b基本从属盘
    c辅助主盘
    d辅助从属盘

    ~为分区号,区分同一硬盘上不同分区的功能

    标识功能
    1-4主分区 或 扩展分区
    5开始逻辑分区
  • SCSI 硬盘: 驱动器标识为:sdx~ sd 表示分区所在设备的类型,这里sd= SCSI 硬盘 x为盘号,区分不同硬盘间的功能 (盘号功能标识同 IDE 硬盘) ~ 为分区号,区分同一硬盘上不同分区的功能 (分区号功能标识同 IDE 硬盘)

查看所有设备挂载情况

lsblk [选项]

-a 查看所有设备(包括空设备) -f 查看文件系统信息 -m 查看设备权限 -t 查看分区详细信息

  • 查看基本信息:lsblk 和 lsblk -a

NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT

字符类型
NAME驱动器标识
MAJ主-设备号
MIN次-设备号
RM可热插拔设备
SIZE分区/硬盘大小(默认使用易读的格式:K/M/G/T 等)
RO只读设备
TYPE分区所在的设备类型(同NAME中的类型)
MOUNTPOINT挂载点
  • 查看 Linux 文件系统信息:lsblk -f

NAME FSTYPE LABEL UUID MOUNTPOINT

字符类型
NAME驱动器标识
FSTYPE文件系统类型
LABLE文件系统 LABLE
UUID分区唯一标识符
MOUNTPOINT挂载点

若仅分区,没有格式化,则FSTYPE和UUID均为空白

  • 查看分区权限信息:lsblk -m

NAME SIZE OWNER GROUP MODE

字符类型
NAME驱动器标识
SIZE分区/硬盘大小(默认使用易读的格式:K/M/G/T 等)
OWNER分区所有者
GROUP分区所在组
MODE分区权限(英文字符模式,类似ls -l指令的显示样式)

fdisk MBR-硬盘分区

  • 硬件设备路径在/dev/目录下。硬盘设备不包含分区号,如sdbhda

  • 虚拟机添加硬盘

  • 分区

    • fdisk /dev/sdb

      fdisk [选项] 硬盘

      -l list:列出所有硬盘的分区信息

    • fdisk 命令菜单(常用指令)

    指令含义
    m显示 fdisk 命令菜单帮助
    p显示磁盘分区(功能同fdisk -l +硬盘路径 )
    n新增分区
    d删除分区
    q放弃更改并退出 fdisk 指令
    w保存更改并退出 fdisk 指令
  • 格式化

    • mkfs -t ext4 /dev/sdb1 ext4为分区类型

    • mkfs [选项] [-t <分区格式>] <设备分区路径>选项: -v verbose:显示详情

    • 分区格式(文件系统类型)

      • Linux 下的文件系统格式

        分区类型描述
        swap交换文件。用于实现虚拟内存的功能
        ext2具有极快的速度和极小的CPU占用率,可用于硬盘和移动存储设备。默认格式,若不填写分区格式,则格式化为ext2格式
        ext3ext2 格式的升级版。增加日志功能,可回溯追踪
        ext4ext3 格式的升级版。日志式文件系统,支持1EB(1024*1024TB),最大单文件16TB,支持连续写入可减少文件碎片。
        xfs可以管理500T的硬盘。
        brtfs针对固态盘做优化
        vfat即 Windows 系统的 FAT32 格式
      • 扩展知识:Windows 下的文件系统格式

        标识描述
        FAT16MS—DOS和win95采用的磁盘分区格式,采用16位的文件分配表,只支持2GB的磁盘分区,最大单文件2GB,且磁盘利用率低
        FAT32采用32位的文件分配表,支持最大分区128GB,最大文件4GB
        NTFS支持最大分区2TB,最大文件2TB,安全性和稳定性非常好,不易出现文件碎片
  • 命令行挂载,重启后失效

    • mount /dev/sdb1 /newdisk/

    • mount 硬盘分区 目录

    • 卸载:mount 待卸载的硬盘分区mount 待卸载的目录

  • 设置自动挂载

    挂载:将分区与 Linux 系统的文件目录做映射。映射的目录成为此分区的挂载点。

    卸载:将分区从挂载点分离,卸载后的分区才能执行重新格式化、重新分区等操作,卸载后的分区可重新挂载到新的挂载点。

    • 修改/etc/fstab实现挂载

    • 添加后执行mount -a即刻生效

磁盘情况查询

  • 查询系统整体磁盘使用情况:df -h

  • 查询指定目录的磁盘占用情况(默认当前目录):

    du [选项] [目录]

    -s summary:只显示目录总的大小 -a all:所有内容的大小 (若不使用这个选项,则只显示子目录的大小,不显示文件的大小) -h 易读的大小单位(K/M/G 等) --max-depth=XX显示的子目录深度(若不指定,则默认显示所有深度) -c 列出所有子目录大小的同时,也显示目录的总大小

磁盘实用指令

  1. 统计/home文件夹下文件的个数:ls -l /home | grep "^-" | wc -l

  2. 统计/home文件夹下目录的个数:ls -l /home | grep "^d" | wc -l

  3. 统计/home文件夹下文件的个数,包括子文件夹里的:ls -lR /home | grep "^-" | wc -l

  4. 统计文件夹下目录的个数,包括子文件夹里的:ls -lR /home | grep "^d" | wc -l

  5. 以树状显示目录结构:tree [目录]


网络配置

  • ifconfig查询网络信息

  • ping [参数] 主机名称/IP地址/主机网址

    -c <次数> count:完成次数。ping 通对应次数后,命令自动退出 -I <网络界面名> interface:网络界面。ping 指令使用的网卡 -R route:输出路由过程 -4 ipv4:只使用 ipv4 网络 -6 ipv6:只使用 ipv6 网络

    • 使用网卡 ens33 ,测试 5 次,测试与 192.168.5.20 的连接性ping -c 5 -I ens33 192.168.5.20

指定IP

  • 直接修改配置文件来指定IP,Ubuntu20

    • cd /etc/netplan

    • 备份旧配置文件内容

    • 编辑配置文件 network: version: 2 renderer: NetworkManager ethernets: enp0s5: # 网卡名称 dhcp4: no # 关闭dhcp dhcp6: no addresses: [10.211.55.10/24] # 静态ip gateway4: 10.211.55.1 # 网关 nameservers: addresses: [8.8.8.8, 114.114.114.114] #dns

    • sudo netplan apply 配置生效

  • 直接修改配置文件来指定IP,并可以连接到外网(程序员推荐)

    编辑vi /etc/sysconfig/network-scripts/ifcfg-ens33 要求:将ip 地址配置的静态的,比如: ip 地址为192.168.200.130

    ifcfg-ens33 文件说明

    DEVICE=eth0 #接口名(设备,网卡)
    ​
    HWADDR=00:0C:2x:6x:0x:xx #MAC 地址
    ​
    TYPE=Ethernet #网络类型(通常是Ethemet)
    ​
    UUID=926a57ba-92c6-4231-bacb-f27e5e6a9f44 #随机id
    ​
    \#系统启动的时候网络接口是否有效(yes/no)
    ONBOOT=yes
    ​
    \#IP 的配置方法[none|static|bootp|dhcp](引导时不使用协议|静态分配IP|BOOTP 协议|DHCP 协议)
    BOOTPROTO=static
    \#IP 地址
    IPADDR=192.168.200.130
    \#网关
    GATEWAY=192.168.200.2
    \#域名解析器
    DNS1=192.168.200.2

    重启网络服务或者重启系统生效 service network restart 、reboot

  • 查看主机名称hostname

    hostname [参数]

    -I 显示当前系统的 IP 地址

更改主机名:vim /etc/hostname,编辑后重启

systemctl 指令来修改主机名:systemctl set-hostname lilixxs-test

设置hosts映射

  • 在 Windows 中修改 hosts 映射,可通过ping +虚拟机主机名 检测与虚拟机的连接 Wnidows 中 hosts 映射文件的地址 C:\Windows\System32\drivers\etc\hosts Windows 中 hosts 映射文件的格式

    设置 hosts 映射:IP 地址为 192.168.3.20,主机名为 lilixxs-centos 192.168.3.20 lilixxs-centos

  • 在 Linux 中修改 hosts 映射,可通过 ping +虚拟机主机名 检测与主机的连接

    打开 /etc/hosts 设置 hosts 映射:IP 地址为 192.168.3.30,主机名为 lilixxs-pc 192.168.3.30 lilixxs-pc 可见 Linxu 与 Windows 的 hosts 映射文件格式相同

Windows 系统下,本机 DNS 缓存的查询/清理 查询本机的 DNS 缓存

ipconfig /displaydns

清空本机的 DNS 缓存

ipconfig /flushdns

进程管理

  • 基本介绍

    • 在 Linux 中,每个执行的程序都成为一个进程,系统对每一个进程都会分配一个 ID 标识号 (PID),用于查找、识别和控制此进程

    • 进程有两种存在形式:前台、后台 前台:用户在屏幕上能看到并操作的进程,处于前台模式 后台:进程在运行,但屏幕上不显示的形式

    • 服务器的进程/服务,大多都以后台的形式运行(前台程序一般为命令行程序),而且会常驻在系统中(不自动结束进程,保持一直运行)。如 tomcat,nginx,mysql 等程序

ps指令

ps用于查看当前系统、当前时刻,有哪些程序正在执行,以及各个程序的执行状况

  • ps指令输出的结果,是指令执行瞬间的结果,不能自动刷新 要使用自动刷新的进程查看器,指令为:top

  • ps [参数]ps [常见组合]

  • 常用参数

    参数意义
    -a显示当前系统有shell控制的进程
    -u显示执行进程的用户信息
    -x显示没有shell控制的进程,通常配合-a参数使用
    -e显示所有进程信息,等同于-A参数
    -l列表形式,显示更详细的信息
    -funix形式,显示所有信息
    -p <PID>显示对应PID的进程
  • 常见组合:

    指令意义
    ps -ef按照基本格式,显示系统的所有进程信息
    ps -aux按照 BSD 格式的指令,显示系统的所有进程信息
    ps -axjf按照 BSD 格式的指令,显示系统的所有进程信息和进程数
    ps -ejH按照 Unix 格式的指令,显示系统的所有进程信息和进程数

    推荐用 BSD 格式,信息丰富、结果显示易懂

  • BSD 系统格式输出如下 ps aux

  • USER:启动进程的用户名 PID:进程分配的 ID 标识号,可用于进程搜索、控制 %CPU:此进程当前的 CPU 占用率 %MEM:此进程当前的物理内存占用率 VSZ:此进程占用的虚拟内存大小 RSS:此进程占用的物理内存大小 TTY:由启动此进程的 shell 控制的参数,终端名称 STAT:此进程的状态(英文缩写形式)

    • 参数意义
      D短期等待 uninterruptible sleep (usually IO)
      R正在运行 running or runnable (on run queue)
      S睡眠 interruptible sleep (waiting for an event to complete)
      T停止stopped by job control signal
      t调试跟踪时停止stopped by debugger during the tracing
      s表示该进程是会话的先导进程
      Xdead (should never be seen)
      Z僵死进程 defunct ("zombie") process, terminated but not reaped by its parent

    START:此进程的启动时间,时间格式:月日(MmmDD) TIME:累计占用的 CPU 时间 (仅计算使用CPU时的时间累计,空闲不占用CPU时不算占用时间),时间格式:HH:MM(小时:分) COMMAND:启动进程所用的命令和参数,如果过长会被截断显示

  • ps -ef

    • UID:启动进程的用户 ID,对应/etc/passwd文件和id命令中的UID PID:进程分配的 ID 标识号,可用于进程搜索、控制 PPID:父进程的 ID 标识号,与进程数父子进程关系对应 C:此进程当前的 CPU 占用率 STIME:此进程的启动时间,时间格式:月日(MmmDD) TTY:由启动此进程的 shell 控制的参数 TIME:累计占用的 CPU 时间 (仅计算使用CPU时的时间累计,空闲不占用CPU时不算占用时间),时间格式:HH:MM(小时:分) CMD:进程的执行指令 (完整路径 + 参数)

kill/kill all终止进程

若某个指令执行中需要人为停止,或处于异常状态占用大量资源,可以考虑终止该进程。

  • kill 通过进程 ID (PID) 终止进程 kill [参数] PID

  • killall 通过进程名 (NAME) 终止进程

    killall [参数] 进程名

    1. killall 进程名支持通配符

    2. killall 指令可将满足条件的所有进程一并终止

  • 参数

    -l 信号,如果不加信号的编号参数,则使用“-l”参数会列出全部的信号名称(如-9) -a 当处理当前进程时,不限制命令名和进程号的对应关系 -p 指定kill 命令只打印相关进程的进程号,而不发送任何信号 -s 指定发送信号 -u 指定用户

-9:强制终止进程(无视 Linux 系统的保护机制)

-2:即Ctrl+C结束前台程序的kill命令

默认情况下,如果不指定信号,kill 等价于 kill -15 。 kill -15 执行时,系统向对应的程序发送SIGTERM(15)信号,该信号是可以被执行、阻塞和忽略的,所以应用程序接收到信号后,可以做一些准备工作,再进行程序终止。

  • 示例

    1. 踢掉某个用户

      • ps -aux | grep sshd,找到该进程的PID(root启动的进程),kill 进程号

    2. 终止sshd服务,在适当时候开启

      • kill 进程号,打开:/bin/systemctl start sshd.service

    3. 终止多个文本编辑器 gedit,killall gedit

    4. 强制终止一个终端,终端 shell 是一种受系统保护的进程,若要强制终止,需要增加参数 -9

      • ps -aux | grep bashkill -9 进程号

  • 查看进程树ptree [参数]

    • -u user:显示启动进程的用户名 -p pid:显示进程的 ID (PID)


服务管理

开机流程

开机——>BIOS——>/boot——>systemd进程1——>运行级别——>运行级别对应服务

  • 服务 (Services) 是一种特殊的进程,以后台的形式运行。通常监听某些端口、等待其他程序的请求等。服务是管理进程的特殊进程,因此服务也被称为“守护进程”。 常见的服务如 firewalld Linxu 系统防火墙、mysqld(MySQL 的守护进程)、sshd等

  • 服务的命名通常由软件厂商决定。一般来说,“进程名 + d”作为此进程服务(守护进程)的名称。如 MySQL 进程名为 mysql,则其服务(守护进程)名为 mysqld

  • systemctl命令相对service命令更加强大,不仅能控制服务,还可修改系统设置、提供高级的控制选项

  • service 服务管理(即将要废除的命令) 基本语法 service 服务名 [操作] 常见操作1:服务的启动/停止/重启/重载/状态查询 service 服务名 start/stop/restart/reload/status 常见操作2:查看所有服务状态 service --status-all

    • 只有部分服务可被service命令管理,可被service命令管理的用户定义的部分服务。 此部分服务所在目录:/etc/init.d/ 系统定义的服务(Systemd 服务)可被service命令管理。 但这里实际是系统智能识别service指令,将其转换为systemctl命令,以保证兼容性 系统服务详见:setup命令 --> 系统服务 setup命令使用 TAB 键进行菜单切换,使用空格键进行选择/取消选择 系统服务所在目录:/usr/lib/systemd/system/

    • reloadrestart 的区别 相同点:都会刷新配置,重新加载配置文件 reload:重新加载配置文件,但服务不会中断。不对已建立连接的服务造成影响,若配置出错,则使用之前的配置。又称为“平滑重启” restart:重新加载配置文件,服务会有短时的中断。若配置出错,则会导致服务的长时间中断

  • chkconfig服务管理,重启机器后才能生效,可管理服务同service

    查询 / 设定一个服务在不同运行级别能否启用

    查询所有服务的运行级别 chkconfig --list 查询某一服务的运行级别,不知道完整的服务名(需要配合 grep 指令进行筛选) chkconfig --list | grep "服务名" 知道完整的服务名 chkconfig 服务名 --list 设置服务在 级别 X 下自动启动/停止 chkconfig --level X 服务名 on/off 加入自定义服务 test chkconfig --add test 删除服务 test chkconfig --del test

systemctl管理

systemctl命令可控制 Linux 系统中的所有服务

  • 服务启动/停止/重启/重载/查看状态 systemctl start/stop/restart/reload/status 服务名

  • systemctl管理的服务在/usr/lib/systemd/system查看

  • 查看所有服务的自启动状态

    systemctl list-unit-files [|grep 服务名] 服务的状态如下: masked 此服务禁止自启动 static 该服务无法自启动,只能作为其他文件的依赖 enabled 已配置为自启动 disabled 未配置为自启动

  • systemctl is-enabled 服务名,查看某一服务是否自启动。

    • 使用systemctl命令,设置自启动状态,会同时设置服务级别3、5的自启动状态

    • systemctl enable 服务名(设置服务开机自启动)

    • systemctal disable 服务名(关闭服务开机自启动)

  • 加入自定义服务 test:systemctl load test

  • 查看服务状态systemctl status 服务名

  • 使用 start/stop 参数,立刻生效,但重启后会根据自启动配置重新停止/启动服务

    动作Systemd 指令(systemctl)SysV Init 指令(service & chkconfig)
    启动服务systemctl start 服务名service 服务名 start
    停止某服务systemctl stop 服务名service 服务名 stop
    加入自定义服务systemctl load 服务名chkconfig --add 服务名
    删除服务删除在systemd目录下的配置文件chkconfig --del 服务名
    查询所有服务的自启动情况(运行级别)systemctl is-enabled 服务名chkconfig --list | grep 服务名
    查询服务是否开机启动systemctl is-enabled 服务名chkconfig list-unit-files | grep 服务名
    设置服务开机启动(服务级别3、5)systemctl enable 服务名chkconfig --level 5 服务名 on chkconfig --level 3 服务名 on
    设置服务开机禁用(服务级别3、5)systemctl disable 服务名chkconfig --level 5 服务off chkconfig --level 3 服务名 off

防火墙(端口控制)

  • 关闭或启用防火墙,立即生效,但只是临时生效,重启系统后,回归默认设置。

  • 打开端口/允许协议 firewall-cmd --permanent --add-port=端口号/协议 关闭端口/禁用协议 firewall-cmd --permanent --remove-port=端口号/协议 查询端口/协议是否开启 firewall-cmd --query-port=端口/协议 查询防火墙所有端口/协议配置 firewall-cmd --list-ports 重载防火墙 firewall-cmd --reload 也可考虑使用systemctl或service命令重载 firewalld 服务 systemctl reload firewalldservice firewalld reload

  • 使用防火墙指令前,需要启用防火墙 systemctl start firewalldservice firewalld start 为保证防火墙持续工作,应设置防火墙服务为开机自启动 systemctl enanble firewalldchkconfig --level 3/5 firewalld on 打开、关闭端口的操作需要重载防火墙才能生效 使用 防火墙指令 重载 firewall-cmd --reload permanent参数 表明永久设置。若不使用此参数,则重启后设置将被清除

动态监控进程

top命令与ps命令相似。两者都能显示系统中的进程信息。 但top命令输出的结果一直保持置顶且可以动态刷新。类似于 Windows 系统中的 任务管理器 top [参数]

-d 秒数 delay-time:指定动态刷新的周期秒数。默认为刷新周期=3s -i:不显示闲置或僵死的进程 -p 进程PID:指定显示对应进程 ID (PID) 的进程

  • 全局选项: h : 界面帮助 Z : 改变配色 B : 标题显示为粗体 E或e : 改变计量单位(KB/MB/GB/PB/EB) d : 设置自动刷新时间 (同top -d命令) q : 退出 top 界面

  • 汇总显示: l : 平均负载 t : CPU总占用率 m :内存总信息 分项调整 : F或f进入 空格 : 选中/不选中 <–> 显示/不显示 左右 : 显示设定 <–> 排序设定 q : 保存并退出

  • 排序 P : 以 CPU 占用率排序。这是显示的默认排序选项 M : 以内存占用率排序 N : 以进程 ID (PID) 排序 R : 改变升序/倒序

  • 进程控制 k kill:终止进程 (要指定 PID 和信号量,强制结束的信号量 = 9) u user:监控特定用户的进程 (要指定用户名)

监控网络状态

netstat [参数]

  • 常用参数 -a all:显示所有端口 (默认只显示已连接的端口) -n numeric:不解析端口号 (直接输出端口号结果,默认输出端口对应的进程) -p 显示端口与进程调用 (PID) 的关系

  • 常用组合: -an 输出所有端口号信息 -ap 输出所有端口与 PID 间的信息

  • 内容解析

    • Proto protocol:协议,常见的如 tcp、udp 等 Recv-Q 网络接收队列。表示收到的数据已经在本地接收缓冲,但是还有多少没有被进程取走。若接收队列一直处于阻塞状态,可能是遭受了拒绝服务攻击,或系统响应进程出现问题、系统负载过大。 Send-Q 网络发送队列。对方没有收到的数据 或 还没有返回 Ack 确认的数据。如果发送队列不能很快的清零,可能是有应用向外发送数据包过快,或者是对方接收数据包不够快。 Local Address 本机地址。格式:IP地址/主机名:端口/使用此连接的进程名 Foreign Address 外部地址。格式:IP地址/主机名:端口/使用此连接的进程名 PID 进程 ID。仅在-p选项时输出 State 状态。共有12种可能,对应 TCP/IP 协议

    STATE状态
    LISTEN正在侦听来自远方的连接请求
    SYN_SENT在发送连接请求后等待匹配的连接请求
    SYN_RECV在收到和发送一个连接请求后等待对连接请求的确认
    ESTABLISHED连接已建立,数据可以传送给用户
    FIN_WAIT1等待远程TCP的连接中断请求,或先前的连接中断请求的确认
    CLOSE_WAIT等待从本地用户发来的连接中断请求
    FIN_WAIT2从远程TCP等待连接中断请求
    LAST_ACK等待原来发向远程TCP的连接中断请求的确认
    TIME_WAIT等待足够的时间以确保远程TCP接收到连接中断请求的确认
    CLOSING等待远程TCP对连接中断的确认
    CLOSED无连接
    UNKNOWN未知状态

监听TCP端口-tcpdump

Linux tcpdump命令用于倾倒网络传输数据。

执行tcpdump指令可列出经过指定网络界面的数据包文件头,在Linux操作系统中,你必须是系统管理员。

tcpdump [-adeflnNOpqStvx][-c<数据包数目>][-dd][-ddd][-F<表达文件>][-i<网络界面>][-r<数据包文件>][-s<数据包大小>][-tt][-T<数据包类型>][-vv][-w<数据包文件>][输出数据栏位]
  • -a 尝试将网络和广播地址转换成名称。

  • -c<数据包数目> 收到指定的数据包数目后,就停止进行倾倒操作。

  • -d 把编译过的数据包编码转换成可阅读的格式,并倾倒到标准输出。

  • -dd 把编译过的数据包编码转换成C语言的格式,并倾倒到标准输出。

  • -ddd 把编译过的数据包编码转换成十进制数字的格式,并倾倒到标准输出。

  • -e 在每列倾倒资料上显示连接层级的文件头。

  • -f 用数字显示网际网络地址。

  • -F<表达文件> 指定内含表达方式的文件。

  • -i<网络界面> 使用指定的网络截面送出数据包。

  • -l 使用标准输出列的缓冲区。

  • -n 不把主机的网络地址转换成名字。

  • -N 不列出域名。

  • -O 不将数据包编码最佳化。

  • -p 不让网络界面进入混杂模式。

  • -q 快速输出,仅列出少数的传输协议信息。

  • -r<数据包文件> 从指定的文件读取数据包数据。

  • -s<数据包大小> 设置每个数据包的大小。

  • -S 用绝对而非相对数值列出TCP关联数。

  • -t 在每列倾倒资料上不显示时间戳记。

  • -tt 在每列倾倒资料上显示未经格式化的时间戳记。

  • -T<数据包类型> 强制将表达方式所指定的数据包转译成设置的数据包类型。

  • -v 详细显示指令执行过程。

  • -vv 更详细显示指令执行过程。

  • -x 用十六进制字码列出数据包资料。

  • -w<数据包文件> 把数据包数据写入指定的文件。


包管理工具

rpm/yum适用于Redhat、CentOS、Suse等平台;apt-get/dpkg适用于Debian、Ubuntu等平台;zypper适合于Suse平台。

rpm

  • 常用指令

    • 查询 rpm -qa 列出所有在本机上安装的程序 rpm -qa | grep 软件名关键词 查询某一软件是否安装 rpm -q 软件名 查询某一软件是否安装 rpm -qi 软件名查询一个软件包的具体信息 rpm -ql 软件名 查询软件包中包含的文件 rpm -qf 完整文件路径查询某一文件所属的包 卸载 rpm 软件包:rpm -e RPM包的名称 强制卸载,不论其他软件是否依赖此软件,增加参数--nodeps 安装 rpm 软件包:rpm -ivh rpm包完整路径

    • 参数详解: -i install:安装 -v verbose:显示安装详细信息 -h hash:显示安装进度条 升级软件:rpm -Fvh rpm包完整路径 F freshen:安装/升级。若已经安装则升级 -vverbose:显示安装详细信息 -h hash:显示安装进度条 初始化 rpm 数据库:rpm --initdb 重建 rpm 数据库:rpm --rebuilddb rpm 命令、yum 命令都依赖 rpm 数据库进行本机软件管理。若 rpm 数据库损坏,可尝试重建 rpm 数据库

yum

yum是一个底层基于rpm,连接软件源,实现软件安装、管理的高层次前端软件包管理工具。 yum可自动从指定的软件源(服务器/本地)下载 rpm 安装包并自动安装,自动处理依赖关系,并自动安装需要的依赖包。

  • 查询 搜索软件包:yum search [参数] 模糊软件名 常用参数:installed/all/updates <–> 已安装的/全部(默认值)/可升级的 软件名可模糊查询

    • 查询软件包:yum list [参数] 精确软件名 常用参数:installed/all/updates <–> 已安装的/全部(默认值)/可升级的 软件名需要精确名称

    • yum list (all) | grep软件名 搜索所有软件。all 可以不输入

    • 查询软件包的具体信息:yum info 软件包名 软件包名需要精确名称

    • 查看软件源(仓库):yum repolist [参数] 常用参数:all/enabled/disabled <–> 所有仓库/启用的仓库(默认值)/禁用的仓库

  • 根据软件源(仓库)管理 安装指定的软件包 yum install 软件名1 软件名2 ...

    • 重新安装软件包 yum reinstall 软件名1 软件名2 ...

    • 升级软件包

    升级到最新版本:yum update 软件名1 软件名2 ...

    • 查询可安装的版本:yum search --showduplicate 模糊软件名yum list --showduplicate 精确软件名

    • 升级到指定版本:yum update-to 软件名-版本 删除软件包 yum remove 软件名1 软件名2 ...

    • 检测可升级的软件包 yum check-update

  • 根据本地 rpm 数据库管理

    • 安装本地 rpm 软件包 yum localinstall rpm包完整路径 常用选项:--nogpgcheck免除gpg秘钥检验

    • 升级本地 rpm 软件包 yum localupdate rpm包完整路径 常用选项:--nogpgcheck免除gpg秘钥检验

apt-get

apt-get [参数]

  • 升级

    apt-get update // 更新源文件,并不会做任何安装升级操作

    apt-get upgrade // 升级所有已安装的包

    apt-get install packagename // 安装指定的包

    apt-get install packagename --only-upgrade // 仅升级指定的包

    apt-get install packagename --reinstall // 重新安装包

    apt-get -f install // 修复安装

    apt-get build-dep packagename // 安装相关的编译环境

    apt-get source packagename // 下载该包的源代码

    apt-get dist-upgrade // 升级系统

    apt-get dselect-upgrade // 使用 dselect 升级

  • 查询&显示

    apt-cache search packagename // 查询指定的包   

    apt-cache show packagename // 显示包的相关信息,如说明、大小、版本等

    apt-cache depends packagename // 了解使用该包依赖哪些包

    apt-cache rdepends packagename // 查看该包被哪些包依赖

  • 删除

    apt-get remove packagename // 删除包   

    apt-get remove packagename -- purge // 删除包,包括删除配置文件等

    apt-get autoremove packagename --purge // 删除包及其依赖的软件包+配置文件等(只对6.10有效,推荐使用)

  • 清理

    apt-get clean // 清理无用的包

    apt-get autoclean // 清理无用的包

    apt-get check // 检查是否有损坏的依赖

  • apt-get upgrade更新时忽略指定包 // 使用这个命令可以将指定的包的版本hold住,这样在更新的时候就会忽略掉这个包。

    apt-mark hold packagename // 将 hold 替换为 unhold 就可以取消对这个包版本的锁定了。

    apt-mark unhold packagename


系统设置

  • 环境变量,能使系统在任意位置均能访问到对应的文件

  • 环境变量地址:/etc/profile文件

  • 添加环境变量:export $环境变量名=环境变量指向的完整路径

  • 应用环境变量: 保存profile文件 输入source /etc/profile

  • 查看当前环境变量:$环境变量名


Shell脚本

Shell 是一个命令行解释器,它为用户提供了一个系统级程序:向 Linux 内核发送请求以便运行程序。用户可用 Shell 来启动、挂起、停止,甚至是编写一些处理程序

Shell 脚本是一种脚本语言,Shell 脚本时一种解释性的脚本语言,执行前不需要额外编译,执行时逐语句编译,但效率低一些

  • 脚本格式要求

    • 开头-指定使用的 Shell

      • 通常指定 bash (root 权限下):#!/bin/bash

      • 通常指定 bash (非 root 权限下):#!/usr/bin/bash

    • Shell 操作相关指令 看系统中的 Shell:chsh -l 切换到新 Shell:exec Shell名称 为某用户设定默认 Shell:chsh -s 新Shell完整路径 [用户名]

  • 脚本常用的执行方式

    • 赋予脚本可执行权限(x),然后直接访问脚本文件

    • 使用sh命令,脚本文件不需要执行权限(x),不论所有者和所在组是谁,脚本都能运行

  • Shell 变量介绍

    Shell 变量有 4 种:系统变量、用户自定义变量、位置参数变量、预定义变量

    • 用户自定义变量:用户自定义的变量,可在脚本 / shell 中定义,变量名、变量值都可自定义,只能在此 bash 中使用;

    • 环境变量:主要保存与系统操作环境相关的数据,在系统中可被全局调用的变量。可以自定义,但有部分系统预设的环境变量更改可能导致问题;

    • 位置参数变量:主要用于向脚本当中传递参数或数据,脚本可通过对应指令获取传入的变量数据

    • 预定义变量:预先设置好的可用于脚本的变量,类似于脚本专用的环境变量,变量名、变量的作用均是固定的。

  • 显示shell中所有变量:set

环境变量

  • 查看某一环境变量: set | grep 环境变量名 echo $环境变量名

  • 设置某一环境变量:export 环境变量名=值

    • 打开对应环境变量文件,在对应的环境变量文件中进行操作

    • 利用>>输出重定向将指令添加到对应的环境变量文件

  • 格式注意事项:

    1. 等号(=)两侧不能有空格

    2. 等号左边的环境变量名:不能有美元符号($)

    3. 等号右边的表达式:若引用其他环境变量,要加美元符号($)

  • 更新环境变量:source 环境变量所在文件夹 修改环境变量文件后,要更新环境变量,才能正确调用此变量

用户自定义变量

  • 在脚本 或 Shell 中定义的变量,可被此 脚本/Shell 及其子 Shell 调用。有两种自定义变量:普通变量、静态变量。

  • 定义/更改变量:变量名=值

  • 撤销变量:unset 变量名

  • 声明静态变量:readonly 变量名=值,静态变量相当与常量,不能改值,也不能撤销。

  • 将指令的返回结果交给变量,C=`date`C=$(date)(推荐)

  • shell的多行注释:

    :<<!   #需要换行
    内容
    !

位置参数变量(传入实参)

  • 在执行一个 Shell 脚本时,如果希望获取到输入命令行中时,一同输入的参数的信息,就可使用位置参数变量

  • $n选择对应位置的参数 n为数字,$0为脚本文件路径(myshell),$1-$9代表第1-9个参数,${25}代表第25个参数(10以上的参数,数字需要用大括号{}包含) $#返回输入的命令中的参数个数 $*选择命令行中的所有参数,并将所有参数看做一个参数返回 $@选择命令行中的所有参数,并将每个参数区别对待(返回值类似数组)

预定义变量

shell设计者已经定义好的变量,只能在脚本中使用的变量

  • 语法 $$ 当前进程的进程 ID (PID),即执行此脚本时的进程 ID $! 最近运行的进行的 ID (最近运行的进程 PID) $? 上一次执行的命令的返回状态

    • 0 = 上一指令正常执行

    • 其他数字 = 上个指令执行有问题,具体返回值可由命令自己决定

tip*.sh &以后台方式运行脚本


运算符

  • 语法

    • 除法默认为整除

    • $((表达式))$[表达式](推荐)

    • $(expr 表达式)expr 表达式:只能实现 两个操作数 的计算

      #!/bin/bash
      #计算(2+3)*4
      rs1=$(((2+3)*4))
      rs2=$[(2+3)*4]
      temp=expr 2 + 3
      rs3=expr temp \* 4 #expr中的乘法需加转义字符

条件判断

  • 语法

    • 单独使用条件表达式 test 条件表达式 若条件满足,则返回 TRUE (= 0);若条件不满足,则返回 FALSE (> 0)

    • 配合其他语句实现选择分支、循环逻辑 [ 条件表达式 ]:条件表达式与两边 [] 括号必须有空格间隔,运算符与两边的参数页要有空格 若条件满足,则返回 TRUE (= 0);若条件不满足,则返回 FALSE (> 0)

    • 与if语句配合

    • 二元运算符 [ 条件表达式 ] && 满足条件执行语句 || 不满足条件执行语句 类似其他语言中的条件?满足执行语句:不满足执行语句

      条件表达式与两边 [] 括号必须有空格间隔,

  • 条件表达式

    • 字符串比较 -z 字符串 :字符串是否为空。可用于判断变量是否存在、用户是否有输入等 -n 字符串 :字符串是否为非空 字符串1 == 字符串2 两字符串是否相等 (将两变量转换为字符串进行比较) 字符串1 = 字符串2 同上,但为避免与赋值混淆,通常不这样写 字符串1 != 字符串2 两字符串是否不相等

    • 整数比较 整数1 -gt 整数2:> ,大于 (greater than) 整数1 -ge 整数2:≥ ,大于等于 (greater equal) 整数1 -lt 整数2:< ,小于 (less than) 整数1 -le 整数2:≤ ,小于等于 (little equal) 整数1 -eq 整数2:= ,等于 (equal) 整数1 -ne 整数2:≠ ,不等于 (not equal)

    • 文件权限判断

      • 根据文件权限进行判断 -r 文件完整路径 readable:可读 -w 文件完整路径 writable:可写 -x 文件完整路径 executable:可执行

      • 判断主要事项:文件的权限与文件的所在组、所有者、当前用户的所在组均有关系

    • 文件类型判断

      • 根据文件类型进行判断 -f 文件完整路径 file:文件存在且是常规文件 -e 文件完整路径 exist:文件存在 -d 文件完整路径 directory:文件存在并是个目录

        • 注意:这里的判断并不精确,不论 所有者、所在组、其他组,只要其中任意一个有对应权限,就会判断为TRUE (输出 = 0)

    • 两个文件进行比较 文件1完整路径 -nt 文件2完整路径 newer than:文件1 比 文件2 新(修改时间新) 文件1完整路径 -ot 文件2完整路径 older than:文件1 比 文件2 旧(修改时间旧) 文件1完整路径 -ef 文件2完整路径 equal file:文件1 与 文件2 是否为同一个文件(Inode 号是否相同)可用于判断硬链接

    • 多重条件判断 条件1 -o 条件2 OR:逻辑或。条件1 或 条件2 满足,则为 TRUE 条件1 -a 条件2 AND:逻辑与。条件1 与 条件2 满足,则为TRUE ! 条件1 逻辑非。条件1 不满足,则为真

  • if语句

    if [ 条件表达式1 ]; then
        满足 条件表达式1 时执行的条件
    elif [ 条件表达式2 ]; then
        满足 条件表达式2 时执行的条件
    else
        以上所有条件都不满足时的
    fi

    类似其他语言中的if条件语句,但注意最后的结束语句是fi 可省略elif和else部分 也可将then至于下一行,此时[]后不需要分号;

    if [ 条件表达式 ]
    then
        满足 条件表达式1 时执行的条件
    elif [ 条件表达式2 ]
    then
        满足 条件表达式2 时执行的条件
    else
        以上所有条件都不满足时的
    fi
    • 细节

      • if指令中的 条件表达式,遵从前文 Shell 的运算符的相关规则

        • 有 4 种运算符:字符串比较、整数值比较、文件权限比较、文件类型比较

        • 条件表达式 与两侧的 []中括号 要有空格

        • 条件表达式中的运算符两侧要有空格

      • if指令中,除了if...then...fi部分一定要有,elif...then...和else...部分可以没有

      • exit指令,类似于其他语言的break指令

        • 若不使用此指令,则程序会按顺序执行所有判断

        • 若使用此指令,则程序在执行此指令时会立即突出脚本,并返回对应的返回值(返回值可用 $? 进行查询,可用于报错和异常状态返回)


case语句

  • case $变量名 in
    "值1")
        若变量值 = 值1,则执行此处语句
    ;;
    "值2")
        若变量值 = 值2,则执行此处语句
    ;;
    (...可有多个 case ...)
    *)
        若以上变量值都不满足,则执行此处语句
    ;;
    esac
    • case 中的语句后,;;相当于其他语句中的break语句的作用,;;可另起一行,也可紧跟指令

    • 每个条件判断语句中,"值XX"与)之间可有空格,也可无空格 其他语言常用的default分支,这里写法是*)

    • 这里比较的实质是将所有变量转换为字符串,因此比较值要用 双引号""括起来

    • 分支结束以esac结尾


for循环

  • 枚举:类似其他语言中的foreach语句,变量i相当于枚举变量

    # 1. 对变量的枚举:循环变量 依次等于 值1、值2、...、值n
    for 循环变量 in 值1 值2 ... 值n   
    do
        循环执行的程序代码
    done
    
    # 2. 对指令执行输出的枚举:循环变量依次等于变量执行输出结果中的每一个
    for 循环变量 in $(指令)
    do
        循环执行的程序代码
    done
    
    • 对变量的枚举

      1. 对传入参数(位置参数变量)的枚举:使用 "$@",要使用 双引号"",否则输出不正确

    • 对指令执行输出的枚举

      1. 指令格式:$(指令)指令

      2. 指令输出中的间隔:制表符、换行符等。枚举根据这些符号进行变量的依次输出

  • 循环:类似其他语言中的for语句,变量相当于计数变量

    for (( 初始值;循环控制条件;每次循环变量的变化 ))   # 这里:变量值 = 初始值 + 循环次数 * 每次循环变化量
    do
        循环执行的程序代码
    done

    循环的条件写法 初始值、循环控制条件、每次循环量的变化 之间,用 分号;来分隔,可加空格,也可不加空格

while循环

当条件满足时,一直循环运行语句;直到条件不满足时,退出循环

while [ 条件表达式 ]
do 
    满足条件所执行的语句
done
# 1+……+n
i=0
while [ $i -le $1]
do 
    SUM=$[ $SUM + $i]
    $i=$[ $i + 1]
done

until循环

while语句相反,若不满足条件,则一直循环执行指令;直到满足条件后,退出指令

until [ 条件表达式 ]
do
    不满足条件所执行的语句
done

read 读取控制台输入

通过控制台,与用户实现交互并获取用户输入的数据。

  • read [参数] [变量1 变量2 变量3]

  • 常用参数 -p "提示文字" 指定提示的文字(用户看到文字后输入对应的数据) -t 时间(整数) 设定读取用户输入值的等待时间,单位秒(s)。若超时用户仍未输入,则不再等待直接执行指令

  • 变量:存储用户输入的变量名

    1. 若输入多个变量,则根据分隔符将变量依次存放到变量中

    2. 若只输入一个变量,则将用户所有输入(除了换行符)都存入此变量中

    3. 若未输入变量,则用户的所有输入默认存放于$REPLY变量中

    4. 若输入变量个数 > read 指令的变量数,则最后一个变量将用户输入的所有值存入此变量

  • 若输入变量个数 < read 指令的变量数,则未被赋值的变量为空值 (可用[ -n -z ]判断表达式进行判断)

    #交互方式读取用户输入的参数,并限时 10s
    read -p "input a value in 10s please: " -t 10 USER_INPUT2

函数

Shell 中的函数有两种:系统函数、自定义函数

  • 系统函数

    • basename 获取文件名

      去掉文件完整路径的多级路径 (和后缀名),返回文件名 (去掉后缀的文件名)

      # 可以在shell或cmd执行
      basename 文件的完整路径 [文件后缀]
      basename [pathname] [suffix]
      basename [string] [suffix]
      basename /home/aaa/test.txt .txt #test
    • dirname 获取路径(与上面相反

      去掉文件完整路径中的文件名和后缀,返回文件路径

      # 可以在shell或cmd执行
      dirname 文件的绝对路径
      dirname /home/aaa/test.txt #/home/aaa

  • 自定义函数

    • [function] 函数名 [()]
      {
      	函数指令;
      	[return 返回值;]
      }
      示例:
      function getSum()
      {
      	SUM=$[$n1+$n2]
      	echo"SUM"
      }
      read -p "输入n1" n1
      read -p "输入n2" n2
      getSum $n1 $n2
      • 建议函数开头的省略写法 function 函数名{} 函数名() {}

      • 返回值:整数值,范围 0-255。若不需要返回值可省略,默认返回值 = 0,返回值只能使用预定义变量$?来获取

      • 指令 和 return 语句最后的双引号;均可省略

      • 函数定义可在调用的语句之前,也可在调用的语句之后

    • 调用函数

      • 函数名 [传入参数1 传入参数2 ... 传入参数n],不需要括号

      • 若函数不需要传入参数,则传入参数部分可以省略

      • 在函数中调用传入参数,使用位置参数变量$1$2等。注意当传入参数大于等于 10 个后,要用 {} 将数字括起来,如第 11 个参数 ${11}


备份数据库

#!/bin/bash 
#*.sh存放在/usr/sbin/
BACK_UP=/data/backup/db
DATA_TIME=${date +%Y-%m-%d_%H:%M:%S}
echo $DATA_TIME
HOST=localhost
USER=root
PASS_WD=root
DATABASE=testdb
# 判断是否存在该目录,否则创建目录
[ ! -d "${BACK_UP}/${DATA_TIME}" ] && mkdir -p "${BACK_UP}/${DATA_TIME}"
mysqldump -u${USER} -p${PASS_WD} --host=${HOST} --databases ${DATABASE} | gzip > ${BACK_UP}/${DATA_TIME}/$DATA_TIME.sql.gz
#将文件处理成tar.gz
cd ${BACK_UP}
tar -zcvf $DATA_TIME.tar.gz ${DATA_TIME}
#删除对应备份目录
rm -rf ${BACKUP}/${DATA_TIME}
#删除10天前的备份文件
find ${BACK_UP} -atime +10 -name "*.tar.gz" -exec rm -rf {} \;
echo "备份数据库${DATABASE}完成"
crontab -e 
#编辑定时任务,每天凌晨2:30
30 2 * * * /usr/sbin/*.sh #光标要移回前面

Linux运维知识

日志

  • 日志文件是重要的系统信息文件,其中记录了许多重要的系统事件,包括用户的登录信息、系统的启动信息、系统 的安全信息、邮件相关信息、各种服务相关信息等。

  • 日志对于安全来说也很重要,它记录了系统每天发生的各种事情,通过日志来检查错误发生的原因,或者受到攻击 时攻击者留下的痕迹。

  • 可以这样理解日志是用来记录重大事件的工具

/var/log/目录就是系统日志文件的保存位置

日志文件说明
/var/log/boot.log系统启动日志
/var/log/cron记录与系统定时任务相关的日志
/var/log/cups/记录打印信息的日志
/var/log/dmesg记录了系统在开机时内核自检的信总,也可以使用dmesg目录直接查看内核自检信息
/var/log/btmp记录错误登录的日志,这个文件是二进制文件,不能直接用VI查看,而要使用lastb命令查看,命令如下:sudo lastb
/var/log/lasllog记录系统中所有用户最后一次的登录时间的日志,这个文件也是二进制文件,要使用lastlog命令查看
/var/log/mailog记录邮件信息的日志
/var/log/message记录系统重要消息的日志,这个日志文件中会记录Linux系统的绝大多数重要信息,如果系统出现问题,首先要检查这个日志文件
/var/log/secure记录验证和授权方面的信息,只要涉及账户和密码的程序都会记录,比如系统登录,ssh的登录,su切换用户,sudo授权,甚至添加用户和修改用户密码都会记录在这个日志文件中
/var/log/wtmp永久记录所有用户的登录,注销信息,同时记录系统的后动,重启,关机事件,是二进制文件,使用last命令查看
/var/log/ulmp记录当前已经登录的用户的信息,这个文件会随着用户的登录和注销而不断变化,只记录当前登录用户的信息,这个文件不能用Vi查看,而要使用w,who,users等命令查看

由日志服务rsyslogd记录的日志文件,日志文件的格式包含以下4列:

  • 事件产生的时间

  • 产生事件的服务器的主机名

  • 产生事件的服务名或程序名

  • 事件的具体信息


日志管理服务 rsyslogd

  • 查询Linux中的rsyslogd服务是否启动

    • ps aux | grep "rsyslog" | grep -v "grep"

  • 查询rsyslogd服务的自启动状态

    • systemctl list-unit-files | grep rsyslog

  • 配置文件:/etc/rsyslog.conf

  • 编辑文件时的格式为:*.* 存放日志文件,第一个*表示日志类型,第二个*表示日志级别

    • 日志类型含义
      authpam产生的日志
      authprivssh.ftp等登录信息的验证信息
      corn时间任务相关
      kern内核
      lpr打印
      mail邮件
      mark(syslog)-rsyslog服务内部的信息,时间标识
      news新闻组
      user用户程序产生的相关信息
      uucpunix to nuix copy主机之间相关的
      local 1-7自定义的日志设备
    • 日志级别意义
      debug有调试信息的,日志通信最多
      info一般信息日志,最常用
      notice最具有重要性的普通条件的信息
      warning警告级别
      err错误级别,阻止某个功能或者模块不能正常工作的信息
      crit严重级别,阻止整个系统或者整个软件不能正常工作的信息
      alert需要立刻修改的信息
      emerg内核崩溃等重要信息
      none什么都不记录

      从上到下,级别从低到高,记录信息越来越少


日志轮替

——把旧的日志文件移动并改名,同时建立新的空日志文件,当旧日志文件超出保存的范围之后,就会进行删除

  • 日志轮替文件命名

    • 使用logrotate(全局的日志轮替策略/规则)进行日志轮替管理,要想改变日志轮替文件名字,通过/etc/logrotate/conf配置文件中"dateext"参数

    • 如果配置文件中有"dateext"参数,那么日志会用日期来作为日志文件的后缀,例如"secure-20201010",这样日志文件名不会重叠,也就不需要日志文件的改名,只需要指定保存日志个数,删除多余的日志文件

    • 如果配置文件中没有"dateext"参数,日志文件就需要进行改名,当第一次进行日志轮替时,当前的"secure"日志会自动改名为"secure.1",然后新建"secure"日志,用来保存新的日志。当第二次进行日志轮替时,"secure.1"会自动改名,当前的"secure"日志会自动改名为"secure.1",然后新建"secure"日志,用来保存新的日志,以此类推

  • logrotate配置文件

    # rotate log files weekly, 每周对日志文件进行一次轮替
    weekly
    # keep 4 weeks worth of backlogs, 共保存4 份日志文件,当建立新的日志文件时,旧的将会被删除
    rotate 4
    # create new (empty) log files after rotating old ones, 创建新的空的日志文件,在日志轮替后
    create
    # use date as a suffix of the rotated file, 使用日期作为日志轮替文件的后缀
    dateext
    # uncomment this if you want your log files compressed, 日志文件是否压缩。如果取消注释,则日志会在转储的同时进
    行压缩
    #compress
    #RPM packages drop log rotation information into this directory
    include /etc/logrotate.d
    # 包含/etc/logrotate.d/ 目录中所有的子配置文件。也就是说会把这个目录中所有子配置文件读取进来,
    ​
    #下面是单独设置,优先级更高。
    # no packages own wtmp and btmp -- we'll rotate them here
    /var/log/wtmp {
    monthly # 每月对日志文件进行一次轮替
    create 0664 root utmp # 建立的新日志文件,权限是0664 ,所有者是root ,所属组是utmp 组
    minsize 1M # 日志文件最小轮替大小是1MB 。也就是日志一定要超过1MB 才会轮替,否则就算时间达到
    一个月,也不进行日志转储
    rotate 1 # 仅保留一个日志备份。也就是只有wtmp 和wtmp.1 日志保留而已
    }
    /var/log/btmp {
    missingok # 如果日志不存在,则忽略该日志的警告信息
    monthly
    create 0600 root utmp
    rotate 1
    }

    参数说明

    daily :日志的轮替周期是每天
    weekly :日志的轮替周期是每周
    monthly :日志的轮替周期是每月
    rotate 数字 :保留的日志文件的个数。0 指没有备份
    compress :日志轮替时,旧的日志进行压缩
    create mode owner group :建立新日志,同时指定新日志的权限与所有者和所属组。
    mail address :当日志轮替时,输出内容通过邮件发送到指定的邮件地址。
    missingok :如果日志不存在,则忽略该日志的警告信息
    notifempty :如果日志为空文件,则不进行日志轮替
    minsize :大小日志轮替的最小值。也就是日志一定要达到这个最小值才会轮替,否则就算时间达到也不轮替
    size :大小日志只有大于指定大小才进行日志轮替,而不是按照时间轮替。
    dateext :使用日期作为日志轮替文件的后缀。
    sharedscripts :在此关键字之后的脚本只执行一次。
    prerotate/endscript :在日志轮替之前执行脚本命令。
    postrotate/endscript :在日志轮替之后执行脚本命令。
    • 把自己的日志加入日志轮替

      • 第一种方法是直接在/etc/logrotate.conf 配置文件中写入该日志的轮替策略(如上)

      • 第二种方法是在/etc/logrotate.d/目录中新建立该日志的轮替文件,在该轮替文件中写入正确的轮替策略,因为该目录 中的文件都会被“include”到主配置文件中,所以也可以把日志加入轮替。(推荐)

  • 日志轮替机制原理

    • 日志轮替之所以可以在指定的时间备份日志,是依赖系统定时任务。在/etc/cron.daily/目录,就会发现这个目录中是有logrotate 文件(可执行),logrotate 通过这个文件依赖定时任务执行的。

  • 查看内存日志

    • journalctl 可以查看内存日志, 这里我们看看常用的指令 journalctl##查看全部 journalctl -n 3 ##查看最新3 条 journalctl –since 19:00 –until 19:10:10 #查看起始时间到结束时间的日志可加日期 journalctl -p err ##报错日志 journalctl -o verbose ##日志详细内容 journalctl _PID=1245 _COMM=sshd ##查看包含这些参数的日志(在详细日志查看) 或者journalctl | grep sshd

      注意: journalctl 查看的是内存日志, 重启清空

  • 制作minLinux系统

    • 启动流程介绍:

      • 制作Linux 小系统之前,再了解一下Linux 的启动流程: 1、首先Linux 要通过自检,检查硬件设备有没有故障 2、如果有多块启动盘的话,需要在BIOS 中选择启动磁盘 3、启动MBR 中的bootloader 引导程序 4、加载内核文件 5、执行所有进程的父进程、老祖宗systemd 6、欢迎界面

      • 在Linux 的启动流程中,加载内核文件时关键文件: 1)kernel 文件: vmlinuz-3.10.0-957.el7.x86_64 2)initrd 文件: initramfs-3.10.0-957.el7.x86_64.img


内核源码阅读介绍

  • 介绍

    • /boot :和系统引擎相关的代码

    • /fs :存放linux支持的文件系统代码

    • /init :存储了 Linux 内核的初始化 相关代码 ; 该 初始化代码 关联到了 内存的各个组件 的入口 ;

      • time_init();#初始化运行时间

      • tty_init();#tty(终端)初始化

      • trap_init();#陷阱门(硬件中断向量)初始化

      • sched_init();#调度程序初始化

      • buffer_init();#缓存管理初始化

      • hd_init();#硬盘初始化

      • sti();#所有初始化工作完后,开启中断

      • move_to_user_mode();切换到用户模式

    • /include :存放linux核心需要的头文件,比如:asm,linux,sys

    • /kernel :和系统内核相关的源码

    • /lib :存放库代码

    • /mm :和内存管理相关的代码

    • /tools :工具相关代码


内核升级

  • 下载&解压最新版

    • wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.11.2.tar.gz tar -zxvf linux-5.8.16.tar.gz

  • 升级步骤

    • uname -a // 查看当前的内核版本 yum info kernel -q //检测内核版本,显示可以升级的内核 yum update kernel //升级内核 yum list kernel -q //查看已经安装的内核


备份与恢复

实体机无法做快照,如果系统出现异常或者数据损坏,后果严重, 要重做系统,还会造成数据丢失。所以我们可 以使用备份和恢复技术 linux 的备份和恢复很简单, 有两种方式:

  1. 把需要的文件(或者分区)用TAR 打包就行,下次需要恢复的时候,再解压开覆盖即可

  2. 使用dump 和restore 命令

如果linux 上没有dump 和restore 指令,需要先按照 yum -y install dump yum -y install restore

  • dump 支持分卷和增量备份(所谓增量备份是指备份上次备份后修改/增加过的文件,也称差异备份)。

    dump [ -cu] [-123456789] [ -f <备份后文件名>] [-T <日期>] [ 目录或文件系统] dump []-wW -c : 创建新的归档文件,并将由一个或多个文件参数所指定的内容写入归档文件的开头。

    • -0123456789: 备份的层级。0 为最完整备份,会备份所有文件。若指定0 以上的层级,则备份至上一次备份以来 修改或新增的文件, 到9 后,可以再次轮替.

    -f: <备份后文件名>: 指定备份后文件名 -j : 调用bzlib 库压缩备份文件,也就是将备份后的文件压缩成bz2 格式,让文件更小 -T <日期>: 指定开始备份的时间与日期 -u : 备份完毕后,在/etc/dumpdares 中记录备份的文件系统,层级,日期与时间等。 -t : 指定文件名,若该文件已存在备份文件中,则列出名称 -W :显示需要备份的文件及其最后一次备份的层级,时间,日期。 -w :与-W 类似,但仅显示需要备份的文件。

    • 应用案例1

    将/boot 分区所有内容备份到/opt/boot.bak0.bz2 文件中,备份层级为“0” dump -0uj -f /opt/boot.bak0.bz2 /boot

    • 应用案例2

    在/boot 目录下增加新文件,备份层级为“1”(只备份上次使用层次“0”备份后发生过改变的数据), 注意比较看看 这次生成的备份文件boot1.bak 有多大 dump -1uj -f /opt/boot.bak1.bz2 /boot 通过dump 命令在配合crontab 可以实现无人值守备份。

    只有分区支持增量备份,备份文件或目录,不再支持增量备份,即只能使用0级别备份。

  • 使用restore 完成恢复

    restore 命令用来恢复已备份的文件,可以从dump 生成的备份文件中恢复原文件

    restore [模式选项] [选项]

    • 说明下面四个模式, 不能混用,在一次命令中, 只能指定一种。 -C :使用对比模式,将备份的文件与已存在的文件相互对比。 -i:使用交互模式,在进行还原操作时,restors 指令将依序询问用户 -r:进行还原模式 -t : 查看模式,看备份文件有哪些文件

    • 选项 -f <备份设备>:从指定的文件中读取备份数据,进行还原操作

    • 应用案例1

      • restore 命令比较模式,比较备份文件和原文件的区别 restore -C -f boot.bak1.bz2 //注意和最新的文件比较

    • 应用案例2

      • restore 命令查看模式,看备份文件有哪些数据/文件 restore -t -f boot.bak0.bz2

    • 应用案例3

      • restore 命令还原模式, 注意细节: 如果你有增量备份,需要把增量备份文件也进行恢复, 有几个增量备份文件,就要恢复几个,按顺序来恢复即可。 mkdir /opt/boottmp cd /opt/boottmp restore -r -f /opt/boot.bak0.bz2 //恢复到第1 次完全备份状态 restore -r -f /opt/boot.bak1.bz2 //恢复到第2 次增量备份状态

    • 应用案例4

      • restore 命令恢复备份的文件,或者整个目录的文件 基本语法: restore -r -f 备份好的文件 mkdir etctmp cd etctmp/ restore -r -f /opt/etc.bak0.bz2


Linux 可视化管理

Webmin 是功能强大的基于Web 的Unix/linux 系统管理工具。管理员通过浏览器访问Webmin 的各种管理功能并完 成相应的管理操作。除了各版本的linux 以外还可用于:AIX、HPUX、Solaris、Unixware、Irix 和FreeBSD 等系统

安装webmin&配置

也可以使用wget http://download.webmin.com/download/yum/webmin-1.700-1.noarch.rpm

  • 安装:rpm -ivh webmin-1.700-1.noarch.rpm

    重置密码/usr/libexec/webmin/changepass.pl /etc/webmin root test root 是webmin 的用户名,不是OS 的, 这里就是把webmin 的root 用户密码改成了test

    修改webmin 服务的端口号(默认是10000 出于安全目的) vim /etc/webmin/miniserv.conf # 修改端口

    将port=10000 修改为其他端口号,如port=6666

    重启webmin /etc/webmin/restart # 重启 /etc/webmin/start # 启动 /etc/webmin/stop # 停止

    防火墙放开6666 端口 firewall-cmd –zone=public –add-port=6666/tcp –permanent # 配置防火墙开放6666 端口 firewall-cmd –reload # 更新防火墙配置 firewall-cmd –zone=public –list-ports # 查看已经开放的端口号

  • 登录webmin http://ip:6666 可以访问了 用root 账号和重置的新密码test

bt宝塔

bt 宝塔Linux 面板是提升运维效率的服务器管理软件,支持一键LAMP/LNMP/集群/监控/网站/FTP/数据库/JAVA 等 多项服务器管理功能。

  • 安装和使用

  1. 安装:yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh

  2. 安装成功后控制台会显示登录地址,账户密码,复制浏览器打开登录,

  • 使用介绍, 比如可以登录终端, 配置,快捷安装运行环境和系统工具, 添加计划任务脚本

  • 如果bt 的用户名,密码忘记了,使用bt default 可以查看


Linux面试题

统计访问量和连接数

  • 分析日志t.log(访问量),将各个ip 地址截取,并统计出现次数,并按从大到小排序(腾讯)

    http://192.168.200.10/index1.html http://192.168.200.10/index2.html http://192.168.200.20/index1.html http://192.168.200.30/index1.html http://192.168.200.40/index1.html http://192.168.200.30/order.html http://192.168.200.10/order.html cat t.txt | cut -d ‘/‘ -f 3 | sort | uniq -c | sort -nr

    cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。

    cut [-bn] [file] cut [-c] [file] cut [-df] [file]

    参数:

    • -b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。

    • -c :以字符为单位进行分割。

    • -d :自定义分隔符,默认为制表符。

    • -f :与-d一起使用,指定显示哪个区域。

    • -n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的 范围之内,该字符将被写出;否则,该字符将被排除

    uniq 可检查文本文件中重复出现的行列。

    uniq [-cdu][-f<栏位>][-s<字符位置>][-w<字符位置>][--help][--version][输入文件][输出文件]

    参数

    • -c或--count 在每列旁边显示该行重复出现的次数。

    • -d或--repeated 仅显示重复出现的行列。

    • -f<栏位>或--skip-fields=<栏位> 忽略比较指定的栏位。

    • -s<字符位置>或--skip-chars=<字符位置> 忽略比较指定的字符。

    • -u或--unique 仅显示出一次的行列。

    • -w<字符位置>或--check-chars=<字符位置> 指定要比较的字符。

    • --help 显示帮助。

    • --version 显示版本信息。

    • [输入文件] 指定已排序好的文本文件。如果不指定此项,则从标准读取数据;

    • [输出文件] 指定输出的文件。如果不指定此选项,则将内容显示到标准输出设备(显示终端)。

    sort 可针对文本文件的内容,以行为单位来排序。

    sort [-bcdfimMnr][-o<输出文件>][-t<分隔字符>][+<起始栏位>-<结束栏位>][--help][--verison][文件][-k field1[,field2]]

    参数说明

    • -b 忽略每行前面开始出的空格字符。

    • -c 检查文件是否已经按照顺序排序。

    • -d 排序时,处理英文字母、数字及空格字符外,忽略其他的字符。

    • -f 排序时,将小写字母视为大写字母。

    • -i 排序时,除了040至176之间的ASCII字符外,忽略其他的字符。

    • -m 将几个排序好的文件进行合并。

    • -M 将前面3个字母依照月份的缩写进行排序。

    • -n 依照数值的大小排序。

    • -u 意味着是唯一的(unique),输出的结果是去完重了的。

    • -o<输出文件> 将排序后的结果存入指定的文件。

    • -r 以相反的顺序来排序。

    • -t<分隔字符> 指定排序时所用的栏位分隔字符。

    • +<起始栏位>-<结束栏位> 以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位。

    • --help 显示帮助。

    • --version 显示版本信息。

    • [-k field1[,field2]] 按指定的列进行排序。

统计连接到服务器的各个ip 情况,并按连接数从大到小排序(腾讯)

netstat -an | grep ESTABLISHED | awk -F "" '{print $5}' | cut -d “:” -f 1 | sort | uniq -c| sort -nr

awk -F " " '{print $5}':以" "作为分隔符,打印第5行

找回Mysql root密码

  1. 在/etc/my.cnf中添加语句:skip-grant-tables #跳过权限表

  2. 重启服务:service mysqld restart

  3. 重新登录,进入mysql Database;查看user表中的字段,authentication_string

  4. 更新密码(使用password函数加密):update user set authentication_string=password("123456") where user='root';

  5. 刷新:flush privileges;

  6. 退出Mysql,删除/etc/my.cnf中添加的语句

  7. 重启服务

访问量排名和tcpdump

  • 统计日志访问量排名前两个的IP访问情况

    • cat acces.log | awk -F " " '{print $1}' | sort | uniq -c | sort -nr | head -2

  • 使用tcpdump监听本机,将来自某一个IP和端口的数据,保存到日志中

    • tcpdump -i ens33 host 192.168.88.140 and port 22 >> /opt/interview/tcpdump.log

  • 常用的Nginx模块,用来做什么

    rewrite模块:实现重写功能

    access模块:来源控制

    ssl模块:安全加密

    ngx_http_gzip_module:网络传输压缩模块

    ngx_http_proxy_module模块实现代理

    ngx_http_upstream_module模块实现定义后端服务器列表

    ngx_cache_putge实现缓存清除功能

系统权限划分

 

 

 

  • chattr命令用于改变文件属性。

    1. a:让文件或目录仅供附加用途。

    2. b:不更新文件或目录的最后存取时间。

    3. c:将文件或目录压缩后存放。

    4. d:将文件或目录排除在倾倒操作之外。

    5. i:不得任意更动文件或目录。

    6. s:保密性删除文件或目录。

    7. S:即时更新文件或目录。

    8. u:预防意外删除。

  • 这项指令可改变存放在ext2文件系统上的文件或目录属性,这些属性共有以下8种模式:

  • chattr [-RV][-v<版本编号>][+/-/=<属性>][文件或目录...]
  • -R 递归处理,将指定目录下的所有文件及子目录一并处理。

      -v<版本编号> 设置文件或目录版本。

      -V 显示指令执行过程。

      +<属性> 开启文件或目录的该项属性。

      -<属性> 关闭文件或目录的该项属性。

      =<属性> 指定文件或目录的该项属性。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值