LinuxCentos7.6使用

2023年 9月 16日 34.5k 0

Linux

Linux基本介绍

LInux中内核版 和 发行版本的关系

内核:只提供操作系统的基本功能和特性,如内存管理,进程调度,文件管理等等。

Linux内核: www.kernel.org/

发行版:基于linus维护的linux内核,是由一些厂商集成了漂亮易用的桌面和常用的软件而发布的商品。

  • 即是 内核 + 软件 + 工具 + 可完全安装程序

常见的发行版

ReaHat

应该称为Redhat系列,包括RHEL(Redhat Enterprise Linux,也就是所谓的Redhat Advance Server,收费版本)、Fedora Core(由原来的Redhat桌面版本发展而来,免费版本)、CentOS(RHEL的社区克隆版本,免费)。Redhat应该说是在国内使用人群最多 的Linux版本,甚至有人将Redhat等同于Linux,而有些老鸟更是只用这一个版本的Linux。所以这个版本的特点就是使用人群数量大,资料非 常多,言下之意就是如果你有什么不明白的地方,很容易找到人来问,而且网上的一般Linux教程都是以Redhat为例来讲解的。

Debian

几大基础发行版之一,Ubuntu就是基于Debian的。它的基本有如下特点:

  • Free,最符合开源精神的发行版。默认不包含任何专有驱动
  • 不求新,但求稳。软件包通常选择比较稳定的版本而不是最新的版本
  • 系统的开发维护完全是由社区驱动的
  • APT软件包管理
  • 图形化安装方式对新手友好
  • Ubuntu

    国内乃至全球热门的Linux发行版。也是各种推荐入门Linux爱好者安装的一个Linux发行版。它的特点主要有以下:

  • 安装简单
  • Unity 3D图形界面,比较华丽(因人而异)
  • 对一些专有驱动支持比较好,例如显卡驱动
  • 社区比较活跃,几乎遇到的问题都可以找到答案
  • CentOS

    现在是大名鼎鼎的RedHat Linux的社区版(可以说是剔除了专有代码的RedHat),其特点就是相当相当的稳定,版本更新紧跟RedHat。非常适合作为服务器操作系统使用。

    Linux 系统目录结构

    /- 根

    每一个文件和目录从根目录开始。 只有root用户具有该目录下的写权限。请注意,/root是root用户的主目录,这与/不一样

    /bin中 - 用户二进制文件

    包含二进制可执行文件。 在单用户模式下,你需要使用的常见Linux命令都位于此目录下。系统的所有用户使用的命令都设在这里。 例如:ps、ls、ping、grep、cp

    /sbin目录 - 系统二进制文件

    就像/bin,/sbin同样也包含二进制可执行文件。 但是,在这个目录下的linux命令通常由系统管理员使用,对系统进行维护。例如:iptables、reboot、fdisk、ifconfig、swapon命令

    /etc - 配置文件

    包含所有程序所需的配置文件。 也包含了用于启动/停止单个程序的启动和关闭shell脚本。例如:/etc/resolv.conf、/etc/logrotate.conf

    hosts:设备名称(或域名)到ip地址的解析,相当于本地存在的dns功能。

    /dev - 设备文件

    包含设备文件。 这些包括终端设备、USB或连接到系统的任何设备。例如:/dev/tty#### /dev/usbmon0

    /proc - 进程信息

    包含系统进程的相关信息。 这是一个虚拟的文件系统,包含有关正在运行的进程的信息。例如:/proc/{pid}目录中包含的与特定pid相关的信息。 这是一个虚拟的文件系统,系统资源以文本信息形式存在。例如:/proc/uptime

    /var - 变量文件

    var代表变量文件。 这个目录下可以找到内容可能增长的文件。 这包括 - 系统日志文件(/var/log);包和数据库文件(/var/lib);电子邮件(/var/mail);打印队列(/var/spool);锁文件(/var/lock);多次重新启动需要的临时文件(/var/tmp);

    /tmp - 临时文件

    包含系统和用户创建的临时文件。 当系统重新启动时,这个目录下的文件都将被删除。

    /usr - 用户程序

    包含二进制文件、库文件、文档和二级程序的源代码。 /usr/bin中包含用户程序的二进制文件。如果你在/bin中找不到用户二进制文件,到/usr/bin目录看看。例如:at、awk、cc、less、scp。 /usr/sbin中包含系统管理员的二进制文件。如果你在/sbin中找不到系统二进制文件,到/usr/sbin目录看看。例如:atd、cron、sshd、useradd、userdel。 /usr/lib中包含了/usr/bin和/usr/sbin用到的库。 /usr/local中包含了从源安装的用户程序。例如,当你从源安装Apache,它会在/usr/local/apache2中。

    /home - HOME目录

    所有用户用home目录来存储他们的个人档案。 例如:/home/john、/home/nikita

    /boot - 引导加载程序文件

    包含引导加载程序相关的文件。 内核的initrd、vmlinux、grub文件位于/boot下。 例如:initrd.img-2.6.32-24-generic、vmlinuz-2.6.32-24-generic

    /lib - 系统库

    包含支持位于/bin和/sbin下的二进制文件的库文件. 库文件名为 ld或lib.so.* 例如:ld-2.11.1.so,libncurses.so.5.7

    /opt - 可选的附加应用程序

    opt代表可选的。 包含从个别厂商的附加应用程序。 附加应用程序应该安装在/opt/或者/opt/的子目录下。

    /mnt - 挂载目录

    临时安装目录,系统管理员可以挂载文件系统。

    /media - 可移动媒体设备

    用于挂载可移动设备的临时目录。 举例来说,挂载CD-ROM的/media/cdrom,挂载软盘驱动器的/media/floppy;

    /srv - 服务数据

    srv代表服务。 包含服务器特定服务相关的数据。 例如,/srv/cvs包含cvs相关的数据。

    Linxu 安装

    Linux安装流程

    下一步->Accept 下一步->去掉 下一步->下一步->序列号

    若缺少虚拟网卡VMware1和VMware8缺失,自救方法如下:

    方法1:版本出问题,使用更高级的VMware17

    方法2:安装插件cc.exe(一般无用)

    方法3:软件内部的虚拟网络编辑器,点击还原默认设置(R)或添加网络(E)(一定概率成功)

    方法4:部分电脑出现有道云和VMware冲突,卸载有道云

    Linux部署环境流程

    配置镜像CentOS-7.x

    典型(小白)自定义(高手)->稍后安装操作系统->Linux CentOS 7 64位

    ->重命名CentOS7_base 默认位置更改->设置最大磁盘20G(初始3G)->finished

    重点配置->编辑虚拟机设置

    配置内存大小:32G->8G、16G->4G、8G->2G

    配置处理器数量:默认单核,多核操作非高性能电脑不使用

    配置镜像CD/DVD:点击使用ISO映像文件,找镜像的位置

    配置网络适配器:默认NAT模式

    后四项删除仅剩显示器,节约硬盘提高性能

    Linux启动部署流程

    选择语言:English(排除部分软件不支持中文的问题)

    选择时区:选择中国地图部分,默认且仅有Shanghai

    System:配置网络信息(重点:不配置则无法连网)

    • 开启网卡按钮:点击OFF->ON,截图网络数据
    • 注意点:不能把ON点回去,否则该虚拟机无法再次连网

    配置密码root password:admin、默认账号为root

    VM网络配置

    VM三种连接方式

    桥接模式

    优点:VMWare虚拟出来的操作系统就像是局域网中的一台独立的主机,虚拟系统可以和外部系统直接通讯,外网和内网互通

    缺点:容易导致IP冲突,网段限制

    桥接模式是跟物理机在同一个网段,并且和物理机用的同一个路由器。主机网卡通过虚拟网桥连接到虚拟机交换机,交换机内部再映射到内部的网络,虚拟机直接占用主机的网段

    NAT模式(网络地址转换模式)

    优点:避免了IP因为网络地址不够造成的冲突

    缺点:只能内网到外网,外网到内网需要配置

    原理:允许一个整体机构以一个公用IP地址出现在Internet上,即把内部私有网络地址翻译成合法网络IP地址的技术。它是一种把内部私有网络地址(IP地址)翻译成合法网络IP地址的技术。

    因为IP数据段由于字节数目一定,所以资源是有限的,如果为每一个设备分配一个IP地址,那么极其消耗IP资源,所以NAT起到的作用是,对外只暴露一个IP地址,当有内部连接要通讯的时候,通过NAT将内网IP转换成对外的IP,充当了网关的作用。

    NAT模式有个单独的路由器,且不同于物理机的网段, NAT模式显示通过自己的路由器,再找到物理机的路由器,来和物理机进行通信的。 这里可以提示一下,一般路由器的默认地址是第一位(1)或者最后一位(254) 但是这里NAT模式的网段为什么要从2开始呢?

    假定以下条件

    • 物理机

      • IP 192.168.1.3
      • 子网掩码 255.255.255.0
      • 默认网关 192.168.1.1
    • 虚拟机

      • IP 192.168.100.10
      • 子网掩码 255.255.255.0
      • 默认网关 192.168.100.2
      • 首选DNS服务器:192.168.1.1

    NAT的路由器把物理机的路由器192.168.1.1标记成192.168.100.1 这样NAT的路由器的192.168.100.2去找192.168.100.1的时候,实际去找的是192.168.1.1。可理解为物理机映射到物理机的路由器

    物理机IP        物理机路由器    NAT路由器         虚拟机IP
    192.168.1.3 --> 192.168.1.1 --> 192.168.100.2 --> 192.168.100.10
    ​
    

    NAT配置过程

  • 打开VMware的“编辑”,然后打开“虚拟网络编辑器”点击“更改设置”
  • 点击NAT模式,选择NAT模式。然后填写子网IP192.168.x.0 x就是我们可以随便选择的网段,范围1~254,这里我选的100。即是192.168.100.0
  • 既然我们知道了不能从1开始,那么就要去手动设置一下。点击NAT模式,将网关IP修改为192.168.100.x,x的范围[2,254]
  • NAT模式、桥接模式的区别
    NAT模式概述

    NAT是“Network Address Translation”的缩写,中文意思是“网络地址转换”,它允许一个整体机构以一个公用IP(Internet Protocol)地址出现在Internet上。顾名思义,它是一种把内部私有网络地址(IP地址)翻译成合法网络IP地址的技术。

    为什么要这样干呢?因为IP数据段由于字节数目一定,所以资源是有限的,如果为每一个设备分配一个IP地址,那么极其消耗IP资源,所以NAT起到的作用是,对外只暴露一个IP地址,当有内部连接要通讯的时候,通过NAT将内网IP转换成对外的IP,充当了网关的作用。

    NAT在外部公网(internet)上正常使用可以使多台计算机共享Internet连接。 通过这种方法,申请一个合法IP地址,就把整个局域网中的计算机通过NAT接入到了Internet中。 这时NAT屏蔽了内部网络,所有内部网计算机对于公共网络来说是不可见的, 而内部网计算机用户通常不会意识到NAT的存在。这里提到的内部地址, 是指在内部网络中分配给节点的私有IP地址,这个地址只能在内部网络中使用, 不能被路由(一种网络技术,可以实现不同路径转发)。

    路由

    默认网关:指的是数据流从本地网络路由至远端设备的目的地。 IP地址中专门保留了三个区域作为私有地址,其地址范围如下: 10.0.0.0/8:10.0.0.0~10.255.255.255 172.16.0.0/12:172.16.0.0~172.31.255.255 192.168.0.0/16:192.168.0.0~192.168.255.255

    NAT将这些无法在互联网上使用的保留IP地址翻译成可以在互联网上使用的合法IP地址。 而全局地址是指合法的IP地址,它是由NIC(网络信息中心)或者ISP(网络服务提供商,比如常说的中国移动、中国电信)分配的地址, 对外代表一个或多个内部局部地址,是全球统一的可寻址的地址。

    NAT技术类型
    • NAT有三种类型:

      • 静态NAT(Static NAT) :设置起来最为简单和最容易实现的一种。内部网络中的每个主机都被永久映射成外部网络中的某个合法的地址
      • 动态地址NAT(Pooled NAT) :动态地址NAT则是在外部网络中定义了一系列的合法地址,采用动态分配的方法映射到内部网络。类似连接池的原理。
      • 网络地址端口转换NAPT(Port-Level NAT) :NAPT则是把内部地址映射到外部网络的一个IP地址的不同端口上

    动态地址NAT:只是转换IP地址,它为每一个内部的IP地址分配一个临时的外部IP地址,主要应用于拨号,对于频繁的远程联接也可以采用动态NAT。当远程用户联接上之后,动态地址NAT就会分配给他一个IP地址,用户断开时,这个IP地址就会被释放而留待以后使用。

    网络地址端口转换NAT:NAPT普遍应用于接入设备中,它可以将中小型的网络隐藏在一个合法的IP地址后面。NAPT与动态地址NAT不同,它将内部连接映射到外部网络中的一个单独的IP地址上,同时在该地址上加上一个由NAT设备选定的TCP端口号。

    NAT模式总结

    家用路由器一般都是NAT模式,内网用户默认都是192.168.1.x网段,而路由器充当默认网关的角色,所有内网发出的包都将经过路由器,路由器在公网有唯一的IP,所有的包经过路由器修改其源IP都改为了公网IP了,并且会随机映射一个对外端口。当应答回到路由器时,路由器会根据此前的映射关系,将目标IP和PORT改为原先发送请求的内网用户的IP和PORT,这样对于内网用户来说是感知不到路由器的存在的,大家共用路由器的对外IP访问外网。当然,因为大家都在内网同一个网段(路由器基于DHCP分配),所以内网用户互相通讯也没有问题。

    桥接模式

    桥接模式下,VMWare虚拟出来的操作系统就像是局域网中的一台独立的主机,它可以访问网内任何一台机器。 在桥接模式下,你需要手工为虚拟系统配置IP地址、子网掩码,而且还要和宿主机器处于同一网段,这样虚拟系统才能和宿主机器进行通信。同时,由 于这个虚拟系统是局域网中的一个独立的主机系统,那么就可以手工配置它的TCP/IP配置信息,以实现通过局域网的网关或路由器访问互联网。

    使用桥接模式的虚拟系统和宿主机器的关系,就像连接在同一个Hub上的两台电脑。想让它们相互通讯,你就需要为虚拟系统配置IP地址和子网掩码,否则就无法通信。

    主机模式

    独立系统,所有的虚拟系统可以相互通信,但虚拟系统和真实网络是隔离开的。虚拟系统和真实网络可以相互通信,相当于两台机器通过双绞线互连;虚拟网络是一个全封闭的网络,唯一能够访问的就是主机,不同于NAT的地方就是主机模式没有NAT服务,故虚拟网络不能连接到Internet。

    补充命令

    cal 日历

    image-20230719154151943

    date 日期

    帮助指令

    获取指令帮助、配置文件帮助和编程帮助等信息

    man [命令或配置文件]
    

    获取shell内置命令的帮助信息

    help 命令
    

    查看用户登录信息

    w 用户名

    w root
    

    命令输出:

    • USER : 登陆的用户名
    • TTY : 登陆终端
    • FROM : 从哪个IP地址登陆
    • LOGIN@ : 登陆时间
    • IDLE : 用户闲置时间
    • JCPU : 指的是和该终端连接的所有进程占用时间.这个事件并不包括去后台作业的时间,但却包括当前正在运行的后台作业所占用时间;
    • PCPU : 是指当前进程所占用的时间
    • WHAT : 当前正在运行的命令

    who

    who
    

    命令输出:

    • 用户名
    • 登陆终端
    • 登陆时间(登陆来源IP地址)

    last 查询当前登陆和过去登陆的用户信息

    last
    
    • last命令默认时读取/var/log/wtmp文件数据

    命令输出

    • 用户名
    • 登陆终端
    • 登陆IP
    • 登陆时间
    • 退出时间(在线时间)

    lastlog 最后一次登录时间

    lastlog
    

    命令输出

    • 用户名
    • 登陆终端
    • 登陆IP
    • 最后一次登陆时间

    history 查看操作历史

    history
    

    开机、重启和用户登录

    关机和重启

    # 务必在关机或者重启之前调用该指令
    sync 将内存数据同步到磁盘
    
    
    shutdown -参数 时间刻度 立刻关机【谨慎】
    -h 关机
    -r 重启
    时间刻度:
    now 马上
    n:n分钟后执行,n是一个整数
    
    shutdown -h now 马上关机
    
    # 等价指令
    reboot 立马重启    shutdown -r now
    halt 立刻关机    shutdown -h now
    

    用户登录/切换用户

    # 用户登录
    su -用户名
    # 高权限切换低权限用户不需要密码
    # 当需要返回到原来用户时,使用exit/logout
    
    用户注销
    logout
    

    用户注销

    # 运行级别3有效,图形运行级别无效
    logout
    

    用户管理

    添加用户

    useradd -参数 参数值 用户名
    无参数:创建用户成功后,会自动创建和用户的同名的目录
    -d 创建用户,并给新创建的用户指定家目录
    -g 创建用户并指定组名
    

    指定/修改用户密码

    password 用户名
    # 当用户权限不够时,常通过su -用户名切换到高权限用户
    

    删除用户

    userdel -参数 用户名
    无参数:删除用户,但保留家目录
    -r:删除用户同时删除用户的家目录【谨慎】
    -f:强制删除用户,即使用户已登录 
    

    查用户信息

    id 用户名
    # 用户不存在时,返回无该用户
    

    切换用户

    su -用户名
    # 高权限切换低权限用户不需要密码
    # 当需要返回到原来用户时,使用exit/logout
    

    查看当前用户/登录用户

    # 方式1
    whoami
    # 方式2,注意要大写
    who am i
    

    用户组

    新增组

    groupadd 组名
    

    删除组

    groupdel 组名
    

    修改用户的组

    usermode -g 用户组 用户名
    

    用户和组相关文件

    /etc/passwd 文件

    image-20230721144229889

    用户配置文件:记录用户的各种信息

    每行含义:用户名:密码:用户的UID:组标号:注释性描述:家目录:登录Shell

    • 用户名
    • 用户的密码,用x替代
    • 用户的uid,一般情况下root为0,1-499默认为系统账号,有的更大些到1000,500-65535为用户的可登录账号,有的系统从1000开始。
    • 用户的gid,linux的用户都会有两个ID,一个是用户uid,一个是用户组id,在我们登录的时候,输入用户名和密码,其实会先到/etc/passwd查看是否有你输入的账号或者用户名,有的话将该账号与对应的UID和GID(在/etc/group中)读出来。然后读出主文件夹与shell的设置,然后再去检验密码是否正确,正确的话正常登录。
    • 用户的账号说明解释
    • 用户的家目录文件夹
    • 用户使用的shell,如果换成/sbin/nologin/就是默认没有登录环境的。
    /etc/shadow 文件

    口令配置文件

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

    /etc/group 文件

    组group配置文件:记录Linux包含的组的信息

    实用指令

    帮助指令

    man

    man 命令名:查看帮助命令
      f 下一页
      b 上一页
      q退出
    
    
    man ls
    #查看ls的帮助
    

    help

    命令 --help
    #获取命令选项的帮助
    实例:
    	ls --help
    
    命令 --help		:简洁版帮助
    
    • 但是不适用内部命令,例如cd, help cd
    • 命令特殊时,使用help 命令 比如: help cd

    指定运行级别【单次有效】

    • 运行级别说明

      • 0:关机(千万不能把initdefault 设置为0
      • 1:单用户:用于找回丢失密码
      • 2:多用户没有网络服务
      • 3:多用户有网络服务:实际开发最常用,性能消耗小【GUI消耗很多的性能】
      • 4: 没有用到
      • 5:图形界面:学习时使用较多
      • 6:重新启动(千万不要把initdefault 设置为6)
    • CentOS7运行级别说明

      • centos7后对/etc/inittab文件进行了简化

        # 多用户有网络服务-级别3
        # multi-user.target: analogous to runlevel 3
        # 图形界面-级别5
        # graphical.target: analogous to runlevel 5
        #
        # 显示当前默认级别
        systemctl get-default
        #
        # 设置默认级别
        systemctl set-default 级别的字符
        
        # 设置级别 为 多用户有网络服务
        systemctl set-default multi-user.target
        
    # 切换运行级别
    init [0123456]
    

    文件目录类

    pwd指令

    • 显示当前工作目录的绝对路径
    pwd
    

    ls指令

    • 显示目录内容列表
    ls [选项] [目录或文件]
    -a 显示当前目录所有的文件和目录,包括隐藏的【Linux隐藏文件以.开头】
    -l 以列表形式显示信息
    
    ls -l可以简写为ll,同时还可衔接上其他的参数,例如ll -a,等价 ls -al
    

    cd指令

    • 切换用户到指定的工作目录
    cd [选项] 绝对或相对路径
    
    ~ 切换到家目录 cd ~
    : 切换到家目录 cd :
    .. 返回到当前目录的上一级目录
    

    mkdir

    • 创建目录
    mkdir [选项] 要创建的目录
    
    -p 创建多级目录
    

    rmdir

    • 删除目录
    # 删除的是空目录,如果目录中有内容时无法删除
    rmdir [选项] 要删除的空目录
    
    # 强制删除非空目录
    # r:递归 f:对象为文件或目录
    rm -rf 要删除的没记录
    

    touch指令

    • 创建空文件
    # 建议带上后缀,虽然Linux不区分后缀,但方便程序员区分文件类型
    touch 文件名称
    

    cp指令

    • 拷贝或移动文件到指定目录
    cp [选项] 源文件 目的地
    
    -r 递归复制整个文件夹
    
    # 强行覆盖并不提示
    cp,将cp替换成cp即可不提示信息
    

    rm指令

    • 移除文件或目录
    rm [选项] 要删除的文件或目录
    
    -r 递归删除整个文件夹
    -f 强制删除不提示
    

    mv指令

    • 移动文件或目录
    mv 源移动的文件与目录 目的地
    
    # 如果在目的地上存在同名的,那么就是重命名
    # 不存在,则为移动
    

    cat指令

    • 显示文件内容【部分显示】
    # 目录查看不了
    # 只能查看,不能修改
    # 通常和管道命令 | more分流显示
    # 或和 | grep 字段进行文件过滤
    cat [选项] 要查看的文件 
    
    -n 显示行号
    
    = 输出当前行的行号
    q 退出
    回车 下一行
    空格 下一页
    

    more指令

    • 显示文件内容【全屏显示文本文件内容】

    缺点:只能向前浏览,无法向后,而且是一次加载完后再显示

    more 要查看的文件
    
    常用操作
    回车 下一行
    空格 下一页
    q 退出
    = 输出当前行的行号
    :f 输出文件名和当前行
    

    less指令

    • 分屏上下翻页浏览文件内容【比more更加强大】

    优点:根据需要加载,可向前向后

    less 要查看的文件
    
    常用操作
    -N 显示行数
    
    空格/pagedown 下一页
    pageup 上一页
    
    g 移动到文件开头
    G 移动到文件结尾
    10g 移动到第10行
    /关键字 查找指定的关键字,n:向下查找下一个该关键字,N向上查找上一个关键字
    q 退出
    

    echo指令

    • 输出内容到控制台
    echo [选项] [输出内容]
    
    常用的输出内容
    $PATH 环境变量
    $HOSTNAME 本地用户名
    

    head指令

    • 显示文件的开头部分
    • 默认显示文件前10行内容
    head [选项] [参数] 要显示的文件
    
    -n:后边接一个整数,表示显示开头的前几行
    head -n 10 文件名
    

    tail指令

    • 显示文件的结尾部分
    • 默认显示文件后10行内容
    tail [选项] [参数] 要显示的文件
    
    -n:后边接一个整数,表示显示结尾的前几行
    -f:实时显示文件最新追加的内容,即是文档的所有更新
    

    >指令 和 >>指令

    • 输出重定向 >>追加

    通常搭配其他指令一起使用,以下提供几个使用参考

    # 将列表内容覆盖写入a.txt中
    ls -l > a.txt
    
    # 将列表内容追加写入a.txt中
    ls -l >> a.txt
    
    # 将文件a.txt覆盖到b.txt中
    cat a.txt > b.txt
    
    # 将字符串"aaa"追加到a.txt
    echo "aaa" >> a.txt
    

    ln指令

    • 用来为文件创建链接
    • 软件也称为符号连接,类似于Windows中的快捷方式
    • 链接类型分为硬链接和符号链接两种,默认的链接类型是硬链接。如果要创建符号链接必须使用"-s"选项
    • 符号链接文件不是一个独立的文件,它的许多属性依赖于源文件,所以给符号链接文件设置存取权限是没有意义的。
    # 给源文件床创建一个软链接
    ln -s [源文件或目录] [软连接名]
    

    history指令

    • 查看执行过的历史命令
    history [选项] 
    -n 只列出最近的n条记录
    

    vim

    文本编辑工具, VI是visual interface的缩写,即可视化接口。vim 即 vi IMproved,在 vi 的基础上做了很多改进

    vim的安装

    如果没有vim的那么请使用yum进行安装

    yun install -y vim  
    
    vim的工作模式

    vim一般有6种工作模式。

    • 普通模式:使用vim打开一个文件时默认模式,也叫命令模式,允许用户通过各种命令浏览代码、滚屏等操作。

    • 插入模式:也可以叫做编辑模式,在普通模式下敲击 i 、a 或 o 就进入插入模式,允许用户通过键盘输入、编辑。

      • i : 在光标所在字符前开始插入
      • a : 在光标所在字符后开始插入
      • o : 在光标所在行的下面另起一新行插入
      • s : 删除光标所在的字符并开始插入
      • I : 在光标所在行的行首开始插入 如果行首有空格则在空格之后插入
      • A : 在光标所在你行的行尾开始插入
      • O : 在光标所在行的上面另起一行开始插入
      • S : 删除光标所在行并开始插入
    • 命令行模式:在普通模式下,先输入冒号:,接着输入命令,就可以通过配置命令对vim进行配置了,如改变颜色主题、显示行号等,这些配置命令也可以保存到/etc/vim/vimrc配置文件中,每次打开默认配置执行。

    • 可视化模式:在普通模式下敲击前盘上的 v 键,就进入可视化模式,然后移动光标就可以选中一块文本,常用来完成文本的复制、粘贴、删除等操作。

    • 替换模式:如果我们想修改某个字符,不需要先进入插入模式,删除,然后再输入新的字符,直接在普通模式下,敲击R键就可以直接替换。

    • EX模式:类似于命令行模式,可以一次运行多个命令

    vim的各种工作模式可以通过不同的键进行切换,用户统一使用ESC键返回到普通模式。

    打开文件和关闭文件
    打开文件
    vi  /path/to/file
    
    关闭文件
    在末行模式下
    wq: 保存退出
    q!: 退出不保存
    
    移动光标
    逐字符移动: 
    	h:左移动
    	l:右移动
    	j:向下移动
    	k:向上移动
    行内跳转:
    0:跳转到行首
    $: 跳转到行尾
    行间跳转;(末行模式)
    num: 跳转到某一行(末行模式)
    G: 跳转行最后一行(编辑模式)
    gg: 跳转到第一行(编辑模式)
    
    翻屏操作
    在编辑模式下:
    ctrl+f 向下翻一页
    ctrl+b 向上翻一页
    
    删除命令
    dd: 删除光标所在行 (编辑模式)
    3dd:从光标行开始删除3行(编辑模式)
    : 1,4d 删除第一行到第四行(末行模式)
    
    复制 和 粘贴命令
    yy 复制光标所在行 (编辑模式)
    2yy 从光标行开始复制2行(编辑模式)
    p: 粘贴命令
    
    查找
    文件的查找
    /parttern 从前往后查找
    ?parttern 从后往前查找
    操作
    	n:  下一个匹配的字符串
    	N: 上一个匹配的字符串
    
    set number 设置行号    
    或者 
    set nu
    
    取消行号
    set nu!
    

    日期时间类

    date指令

    显示系统时间与日期
    # 显示当前日期时间 
    date [选项] [格式化日期]
    
    
    默认 显示日期时间
    -s 设置日期
    
    # 常用的年月日时分秒(得带双引号),因为做了显示格式的拼接
    date "+%Y-%m-%d %H:%M:%S"
    
    # 常用格式
    %Y 年
    %m 月
    %d 天
    %H 时
    %M 分
    %S 秒
    %u 1-7星期数,1代表星期一
    
    设置系统时间与日期
    date -s 字符串时间
    
    # 设置系统的时间和日期
    date -s "2020-01-01 21:56:12"
    

    cal指令 显示当前日历

    cal [选项] [月份] [年份]
    
    -m 星期一作为一周的第一天
    
    # 显示当前日历
    cal 
    # 显示2020年1月的日历
    cal -m 1 2020
    

    搜索查找类

    find指令 文件搜索

    find 范围 选项
    
    作用
    1. 避免大范围搜索,会非常耗费系统资源
    2. find是在系统当中搜索符合条件的文件名.如果需要匹配,使用通配符匹配,通配符是完全匹配
    
    常用选项
    -name 查询方式 按照指定的文件名查找文件
    -user 用户名 查找属于指定用户名所有文件
    -nouser 查找没有所有者的文件
    -size 文件大小 按照指定的文件大小查找文件(通常是指定一个范围)
      +n 大于
      -n 小于
      单位 k M G
    atime	文件访问时间
    	+n n天 前 访问的文件, 流入+10 10前
    	n  n天 当天 访问的文件 10 前10当天
    	-n n天 内 访问的文件 -10 10天内
    
    ctime	改变文件属性时间
    	+n n天 前 修改属性的文件
        n  n天 当天 修改属性的文件
        -n n天 内 修改属性的文件
    mtime	修改文件时间
    	+n n天 前 修改的文件
        n  n天 当天 修改文件
        -n n天 内 修改文件
    
    
    # 按拥有者查找/opt下用户名为nobody的文件
    find /opt -user nohody
    # 查找整个Linux系统下大于200M的文件
    find / -size +200M
    
    按文件名查找
    find / -name install.log
    #避免大范围搜索,会非常耗费系统资源
    #在根目录下查找, find是在系统当中搜索符合条件的文件名.如果需要匹配,使用通配符匹配,通配符是完全匹配
    find / -name install*.log
    
    #在root目录下, 按名字查询: 不区分大小写
    find /root -iname install.log   
    
    按时间查询
    find /var/log -mtime +10
    #查找10天前修改的文件
    
    -10		10天内修改文件
    10			10天当天修改的文件
    +10		10天前修改的文件
    
    atime	文件访问时间
    ctime	改变文件属性时间
    mtime	修改文件时间
    
    按文件查找
    find  / -size 25k
    #查找文件大小是25KB的文件,注意k是小写的.
    
    -25k		小于25KB的文件
    25k		等于25KB的文件
    +25k		大于25KB的文件
    
    find / -size 25M
    #查找文件大小是25MB的文件,注意M是大写的.
    
    按用户查找
    find /root -user root   #按照所有者搜索
    	
    find /root -nouser  #查找没有所有者的文件
    

    locate指令 比 find 好用的文件查找工具

    • 优点:可以快速定位文件的路径

    • 原理:先建立一个包括系统内所有档案名称及路径的数据库,之后当寻找时就只需查询这个数据库。无需遍历整个文件系统。为了保证查询结果的精确度,管理员必须要定期更新locate时刻

    • 注意事项:locate指令是基于数据库进行查询的,所以第一次运行的时候需要创建locate数据库(必须要管理员来运行)

      # 直接执行即可
      updatedb
      
    locate 搜索文件
    
    # 搜索/opt下的redis开头的文件
    locate /opt/redis
    

    which指令 查找并显示给定命令的绝对路径

    which 指令
    
    # 查找ls指令所在的目录
    which ls
    

    grep指令 字符串搜索 和 管道符号 |

    grep
    • grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)
    • 可使用正则表达式搜索文本,并把匹配的行打印出来。用于过滤/搜索的特定字符。可使用正则表达式能配合多种命令使用
    grep [选项] 查找内容 源文件
    
    常用选项
    -n 显示匹配行以及行号
    -i 忽略字母大小写
    
    # 在hello.txt 文件中,查找"yes"所在行,并显示行号
    # 方法一
    cat -n /home/hello.txt | grep yes
    # 方法二
    grep -n yes /home/hello.txt
    
    管道符号 |
    • 表示将前一个命令的处理结果输传递给后面的命令处理(类似责任链模式)

    压缩和解压类

    gzip/gunzip 指令

    • gzip:压缩文件,文件经过gzip压缩后会多".gz"的扩展名,即是*.gz文件。文本类文件压缩率在60%~70%

      gzip 文件
      
    • gunizp:解压文件,解压*.gz形式的文件

      gunzip 文件.gz
      

    案例

    压缩/home下的hello.txt文件
    gzip /home/hello.txt
    
    # 解压/home下的hello.txt.gz文件
    gunzip /home/hello.txt.gz
    

    zip/unzip指令

    • 文件经它压缩后会另外产生具有“.zip”扩展名的压缩文件

    • zip

      # 压缩的内容可以为文件或目录
      # XXX.zip为压缩后的文件的命名
      zip [选项] XXX.zip 将要压缩的内容
      
      常用选项
      -r 递归压缩:即是压缩目录, 如果不指定-r, 那么只会压缩文件夹,该文件夹的文件是不会压缩的
      
    • unzip

      # 解压
      unzip [选项] XXX.zip
      
      -d 目录:指定解压后文件存放的目录
      

    案例

    # 将/home下的所有文件/目录压缩称myhome.zip
    zip -r myhome.zip /home/
    
    # 将myhome.zip解压到/opt/tmp目录下(存在/opt/tmp)
    unzip -d /opt/tmp/ /home/myhome.zip
    

    tar指令 打包并压缩

    打包和压缩的概念:

    • 打包:指将一大堆文件或目录变成一个总的文件
    • 压缩:指将一个大的文件通过一些压缩算法变成一个小文件
    • 为什么要区分这两个概念呢?这源于Linux中很多压缩程序只能针对一个文件进行压缩,这样当你想要压缩一大堆文件时,你得先将这一大堆文件先打成一个包(tar命令),然后再用压缩程序进行压缩(gzip bzip2命令)。

    -f: 打包压缩后的包名,切记,后面只能打包压缩后的包名。

    # 打包目录,压缩后的文件格式.tar.gz
    tar [选项] XXX.tar.gz 打包的内容
    多个打包内容使用空格间隔
    
    
    常用选项
    -z 打包同时压缩
    -c 产生.tar打包文件
    -x 解包.tar文件
    -v 显示详情信息
    -f 指定压缩后的文件名,这个参数是最后一个参数,后面只能接压缩文件名
    -C 指定目录
    
    
    
    # 案例
    # 解压多个文件,将/home/pig/txt 和 /home/cat.txt 压缩称pc.tar.gz
    tar -zcvf pc.tar.gz /home/pig.txt /home/cat.txt
    
    # 将pc.tar.gz 解压到/opt/tmp2目录下(存在该目录)
    tar -zxvf pc.tar.gz -C /opt/tmp2
    

    组管理和权限管理

    组介绍:Linux中的用户必须属于一个组,不能独立于组外

    • 所有者,当前文件/目录的所有者,一般为创建者,可以修改
    • 所在组:当前用户所有的组,某个用户创建一个文件后,这个文件的所在组就是该用户所在的组(默认)
    • 其他组:除了文件的所有者,以及文件所有者所在的组,其他用户都是都是文件的其它组
    • 改变用户所在组:修改用户的组,方便进行权限管理。注意!要root劝降才能修改某个用户所在的组
    • 理解:所在者--自己 所在组--家人 其他组--外人

    组管理

    文件/目录 所有者

    一般为文件的创建者,谁创建该文件,那么所有者就是谁,可以手动更改所有者

    • 查看文件的所有者

      ls -ahl
      
    • 修改文件所有者

      chown 用户名 文件名
      
      -R 如果是目录,则使其下的所有子文件或目录递归生效
      
      
      # 使用root创建一个apple.txt,然后修改所有者为tom(tom用户存在)
      touch apple.txt
      chown tom apple.txt
      

    文件/目录 所在组

    组的创建
    groupadd 组名
    
    查看文件/目录所在组
    ls -ahl
    
    修改文件/目录所在的组
    chgrp 组名 文件/目录
    

    修改用户所在组

    usermod -g 新组名 用户名
    usermod -d 目录名 用户名 # 改变该用户登录的初始目录。!!!用户需要有进入新目录的权限!否则不了!
    

    权限管理

    权限的概念

    计算资源:(一切皆文件)

    权限:定义资源或服务的访问能力,称之为权限

    定义某一个特定的人资源或者服务的访问能力, 用户

    定义一类用户具有访问某个资源或服务的能力. 用户组(存放一些列用户的容器),同时用户组还拥有具有访问某个资源的权限

    定义一个资源的权限:

    • 用户具有该资源的权限(文件所有者,属主)
    • 用户组具有该资源的权限(属组)
    • 其他用户(既不是属主,也不是属组)

    文件权限:

    r, 可读 可以执行类似cat命令的操作

    w, 可写 可以编辑或者删除此文件

    x 可执行

    ls -l显示的内容

    -rw-r--r--. 1 root root 231 4月 1 2020 .bashrc

    解析:

    -rw-r--r--:文件类型 所有者权限 所属组权限 其他组权限

    1:如果是文件则代表硬链接数, 是目录则代表子目录数量

    root :所有者

    root :所属组

    231:文件大小(单位是字节),如果是文件夹,就显示一个固定的值4096

    4月 1 2020:最后修改的日期

    .bashrc:文件名

    权限位置划分说明

    0-9位说明(一共10位,0为基底)

    • 0位(d,-,l,c,b)文件类型

      • l:软链接,相当于Windows的快捷方式
      • d:目录,相当于Windows的文件夹
      • c:字符设备文件,比如鼠标,键盘
      • b:块设备,比如硬盘
    • 1-3位

      • 所有者拥有的权限
    • 4-6位

      • 所属组中用户拥有的权限
    • 7-9位

      • 除了所有者, 所属组之外的其他用户的对该文件的权限

    rwx权限含义详解

    注意:文件和目录的rwx含义是不一样

    文件的rwx
    • r:可读(read),可以读取,查看
    • w:可写(write),可以修改,但是不代表可以删除该文件,删除一个文件的前提的是对该文件所在的目录有执行的权限
    • x:可执行(execute),可以被执行
    目录的rwx
    • r:可读(read),可以读取,ls查看目录的内容
    • w:可写(write),可以修改,对目录内创建+删除+重命名目录
    • x:可执行(execute),可以进入该目录

    可用数字代表所拥有的权限r=4,w=2,x=1,数组可以组合,例如rw=4+2=6

    chmod 修改权限

    参数

    -R, --recursive:对目录以及目录下的文件递归执行更改权限操作。
    

    权限

    • 符号权限

      • u符号代表当前用户。
      • g符号代表和当前用户在同一个组的用户,以下简称组用户。
      • o符号代表其他用户。
      • a符号代表所有用户。
      • +符号代表添加目标用户相应的权限。
      • -符号代表删除目标用户相应的权限。
      • =符号代表添加目标用户相应的权限,删除未提到的权限
    • 数字权限

      • r符号代表读权限以及八进制数4
      • w符号代表写权限以及八进制数2
      • x符号代表执行权限以及八进制数1
      • X符号代表如果目标文件是可执行文件或目录,可给其设置可执行权限。
    通过"+"、"-"、"="变更权限
    # + 增加权限
    chmod u+rwx,g+rx 文件/目录名
    # - 减少权限
    chmod u-rx 文件/目录名
    # = 赋值权限
    chmod u=rwx,g=rwx,o=rx 文件/目录名
    
    通过数字变更权限
    chmod u=7,g=5 文件/目录名
    
    chmoe u=5 文件/目录名
    
    # 可以混用
    chmoe u=7,g=rwx,o=5 文件/目录名
    

    Sudo 单次提升权限

    提升权限的原理: root把本来只能超级用户执行的命令赋予普通用户执行, sudo的操作对象是系统命令

    sudo的操作对象是系统命令

    visudo
    #实际修改的是/etc/sudoers文件
    
    root ALL=(ALL) ALL
    #用户名 被管理主机的地址=(可使用的ip地址) 授权命令(绝对路径)
    %wheel ALL=(ALL) ALL
    #%组名 被管理注解的地址=(可使用的ip地址) 授权命令(绝对路径)
    
    
    
    # 添加一个用户
    useradd whitebrocade
    # 设置用户的密码
    passwd  root
    
    # 为该用户设置指定的权限
    whitebrocade ALL = (ALL)  /usr/sbin/shutdown
    
    # 切换到 whitebrocade 用户后,使用sudo命令执行shutdown
    sudo shutdown -h now
    

    定时任务调度

    crond 任务调度

    crontab进行定时任务设置

    任务调度:指系统在某个时间执行的特定命令或程序

    任务调度分类:

    • 系统工作:有些工作必须周而复始地执行,如病毒扫描
    • 个别用户工作:个别用户希望执行某些程序,如sql备份
    crontab [选项]
    
    -e 编辑crontab定时任务
    -l 查询当前用户的crontab任务
    -r 删除当前用户所有的crontab任务  
    
    service crond restart:重启任务调度
    
    # crontab编写定时任务语法
    顺序:分 时 日 月 周 命令
    minute   hour   day   month   week   command 
    
    # 字段说明
    minute: 表示分钟,0到59
    hour:表示小时,0到
    day:表示日期,从1到31
    month:表示月份,1到12
    week:表示星期几,从0到7,这里的0和7代表星期日。
    command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。
    
    # 5个日期时间字段可使特殊字符
    星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
    逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
    中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
    正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次
    
    案例
    每天凌晨2点备份数据库中地所有数据库(重名会覆盖) 
    0 2 * * * mysqldump -u root -p123456 -A -> /home/all.sql.bak
    

    at定时任务 在指定时间执行一个任务

    • at的守护进程atd会以后台模式运行,检查作业队列来运行

    • 默认情况下,atd守护进程每60秒检查作业队列

      • 有作业时:检查作业运行的时间,如果时间与当前时间匹配,就运行此作业
    • 执行完一个任务后,不再执行此任务(从队列中取出)

    • 使用at命令的时候,一定要保证atd进程启动

      • 使用ps -ef | grep atd查看atd进程是否运行
    at [选项] [时间]
    Ctrl + D 结束at命令的输入,输出两次
    
    
    常用选项
    -I atq的别名,at -I 等价 atq
    -d atrm的别名,at -d 等价 atrm
    -m 当指定的任务被完成后,给用户发邮件
    -v 显示任务将被执行的时间
    -c 打印任务的内容到标准输出
    -V 显示版本信息
    -q  使用指定的队列
    -f  从指定文件读入任务而不是标准输入读入
    -t  以是按参数的形式提交要运行的任务
    

    磁盘分区、挂载

    分区

    原理

    • Linux只有一个根目录,一个独立且唯一的文件结构,Linux每一个分区都是用来组成整个文件系统的一部分
    • Linux使用“载入”的处理方法,它的整个文件系统包含了一整套的文件和目录,且将一个分区和一个目录联系起来(映射),这时要载入的一个分区将使它的存储空间在一个目录下获得

    硬盘说明

    Linux硬盘分IDE硬盘和SCSI硬盘,目前基本都是SCSI硬盘

    • IDE(Integrated Drive Electronics)接口,也称为ATA接口,以前主要用于连接机械硬盘,

      • 对于IDE硬盘,驱动器标识符为“hdx~”,其中“hd”表明分区所在的设备的类型,这里指IDE硬盘。

      • “x”为盘号

        • a:基本盘
        • b:基本从属盘
        • c:辅助主盘
        • d:辅助从属盘
      • “~”代表分区,前四个区用数字1到4表示,他们使主分区或扩展分区,第5开始就是逻辑分区

    • SCSI(Small Computer System Interface)接口,主要用于连接服务器级别的硬盘和硬盘阵列。

      • SCSI硬盘驱动器标识符为“sdx~”,"sd"来表示发呢去所在设备的类型,其余则和IDE硬盘的表示方法一样

    列出块设备信息

    lsblk
    lsblk -f
    

    磁盘情况查询

    # 查询指定目录磁盘使用情况,默认为当前目录
    df -h
    
    -s 指定目录占用大小汇总
    -h 带计量单位, 以KB以上的单位来显示
    -a 所有文件
    --max-deph=子目录深度
    

    挂载

    软连接 和 硬连接

    概念

    链接: Linux具有为一个文件起多个名字的功能,称为链接。被链接的文件可以存放在相同的目录下,但是必须有不同的文件名,而不用在硬盘上为同样的数据重复备份。另外,被链接的文件也可以有相同的文件名,但是存放在不同的目录下,这样只要对一个目录下的该文件进行修改,就可以完成对所有目录下同名链接文件的修改。对于某个文件的各链接文件,我们可以给它们指定不同的存取权限,以控制对信息的共享和增强安全性。

    ln命令会保持每一处链接文件的同步性,也就是说,不论你改动了哪一处,其它的文件都会发生相同的变化。

    文件链接有两种形式,即硬链接和符号链接。

    ln功能说明:是为某一个文件在另外一个位置建立一个同步的链接,当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在其它的目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间。

    • inode:是文件系统中存储文件元信息(文件的创建者、大小、日期等)的区域,称为节点索引。

    image-20230715100212534

    硬连接

    建立硬链接时,在另外的目录或本目录中增加目标文件的一个目录项,这样,一个文件就登记在多个目录中

    创建硬链接后,己经存在的文件的索引节点号(inode)会被多个目录文件项使用。一个文件的硬链接数可以在目录的长列表格式的第二列中看到,无额外链接的文件的链接数为1,有1个文件链接时,连接数为2,也就说硬链接并没创建新文件,而是以链接数进行一个控制

    在默认情况下,ln命令创建硬链接, 每个硬链接都指向同一个索引节点。ln命令会增加链接数,rm命令会减少链接数。删除一个硬链接不会影响其他硬链接,只有当最后一个硬链接被删除后, 也就是一个文件的链接数为0,文件内容才会被删除, 否则不会从文件系统中物理删除该文件。

    对硬链接有如下限制:

    • 不能对目录文件做硬链接
    • 不能在不同的文件系统之间做硬链接。就是说,链接文件和被链接文件必须位于同一个文件系统中, 不同分区的文件不能进行连接
    软连接

    符号链接也称为软链接,是将一个路径名链接到一个文件。这些文件是一种特别类型的文件

    与硬链接不同的是,符号链接确实是一个新文件,当然它具有不同的索引节点号;而硬链接并没有建立新文件。软件链接建立了文件!!!但是这个文件是指向索引节点的

    软硬链接的区别
    • 删除源文件或软目录, 删除的是数据, 不会删除连接,此时软链接会失效,硬链接不会

      • 如果再次创建同源的源文件或目录, 那么软连接将继续指向该文件的新数据。
    • 软链接 可以为文件和目录(允许不存在)创建链接,硬链接 只可以为文件创建链接

    • 软链接 可以跨文件系统,硬链接 必须是同一个文件系统

    • 软链接的文件权限 可以和源文件不一样,硬链接的文件权限 一定和源文件一样

    • 符号链接的大小是其链接文件的路径名中的字节数

      • 当用ln -s命令列出文件时,可以看到符号链接名后有一个箭头指向源文件或目录,例如lrwxrwxrwx … 14 jun 20 10:20 /etc/motd->/original_file其中,表示“文件大小”的数字“14”恰好说明源文件名original_file由14个字符构成。
    应用场景

     软链接:作为可执行文件的快捷方式。

     硬链接:备份重要文件。

    # 软链接(源文件必须写成绝对路径)
    ln -s SOURCE TARGET
    
    [root@localhost ~]# ln -s /home/file /tmp/soft_file
    
    # 硬链接, 默认即是硬连接, 如果想要创建软连接的话, 那么携带参数-s
    ln SOURCE TARGET
    
    [root@localhost ~]# ln /home/file /tmp/hard_file
    
    挂载 和 软链接的区别

    在Linux中,挂载(mount)和软链接(symbolic link)都是实现文件系统之间连接的机制,但两者有以下关键区别:

  • 挂载是将一个文件系统附加到一个指定的目录上,这个目录成为挂载点。挂载之后,通过挂载点就可以访问被挂载的文件系统。
  • 软链接是一个特殊的文件,其包含一个指向另一个文件或目录的引用路径。软链接可以让一个文件或目录在文件系统的不同位置出现。
  • 挂载是在目录级别上的,它将两个文件系统连接起来,文件系统之间的数据独立存储。软链接是在文件/目录级别上的。
  • 挂载不会复制文件,是真正访问另一个文件系统。软链接只是引用,不会占用实际空间。
  • 挂载依赖文件系统的支持,需要内核支持。软链接可以在任意文件系统上创建。
  • 挂载通常是临时的,重启后失效,需要在/etc/fstab配置自动挂载。软链接是持久的。
  • 挂载需要root权限。软链接可以任何用户创建。
  • 总之,挂载是跨文件系统的目录级别连接和访问,更强大也更复杂。软链接只是文件内引用,更加轻量级。

    磁盘情况-实用指令

    # 统计/opt文件夹下文件的个数
    ls -l /opt |  grep "^-" | wc -l
    
    # 统计/opt文件夹下目录的个数
    ls -l /opt | grep "^d" | wc -l
    
    # 统计/opt文件夹下文件的个数,包括子文件夹里
    ls -lR /opt | grep "^-" | wc -l
    
    # 以树状显示目录结构tree目录
    # 如果该命令不存在,那么就使用yum install -y tree进行安装
    tree /home/
    

    网络配置

    网络基本概念

    • ip地址:在网络通信中主机的标识符(好比手机号码)
    • mac地址:主机的物理网卡的唯一标识符(好比身份证号码)
    • 子网掩码:用于区分主机的IP地址中的网络地址和主机地址,并由此确定该主机的IP地址的网段
    • 网关:就是一个网络中的主机连接到另一个网络的主机的关口
    • DNS:域名解析服务器,把域名解析成对应的IP地址

    Linux网络环境配置

    方法一:自动获取

    说明:登录后,通过界面的来设置自动获取ip(如果ip冲突了,自动切换ip)

    特点:Linux启动会自动获取IP

    缺点:IP地址可能变换

    方法二:指定ip

    说明:直接修改配置文件来指定IP,并可以连接外网

    步骤

  • 编辑 vim /etc/sysconfig/network-scripts/ifcfg-ens33

    有些它不叫ifcfg-ens33, 叫ifcfg-ens0等, 具体叫网卡名叫什么名字都不一定

    在/etc/sysconfig/network-script在这个目录下面,存放的是网络接口(网卡)的脚本文件(控制文件),ifcfg-eth0是默认的第一个网络接口,如果机器中有多网络接口,那么名字就将依此类推ifcfg-eth1,ifcfg-eth2,ifcfg-eth3......(这里面的文件是相当重要的,涉及到网络能否正常工作),但是我们有多个网卡, 所以得到了后面称为ifcfg-en33

  • ifcfg-ens33文件说明

    # 网络类型, 理解成网卡类型也行,通常使Ethernet, 表示接口类型为以太网
    TYPE="Ethernet"
    # 不使用代理
    PROXY_METHOD="none"
    # 非Only用于浏览器的接口
    BROWSER_ONLY="no"
    # IP的配置方法[none|static|bootp|dhcp]
    # 对应的设置(引导时不使用协议|静态分配IP|BOOTP协议|DHCP协议)
    # DHCP协议是自动分配IP, 当某个ip冲突的时候, 网卡会重新选区其它未使用的IP进行分配
    # static协议是固定的IP, 由我们自己手动配置IP, 当出现IP冲突时, 需要我们手动解决
    BOOTPROTO="dhcp"
    # 默认路由接口
    DEFROUTE="yes"
     # IPv4配置失败不会致命
    IPV4_FAILURE_FATAL="no"
    # 启用IPv6
    IPV6INIT="yes"
    # 启用IPv6自动配置
    IPV6_AUTOCONF="yes"
    # 默认IPv6路由接口
    IPV6_DEFROUTE="yes"
    # IPv6配置失败不会致命
    IPV6_FAILURE_FATAL="no"
     # 使用稳定的IPv6地址以保证隐私
    IPV6_ADDR_GEN_MODE="stable-privacy"
    # 接口名
    NAME="ens33"
    # 随机id
    UUID="c64e4ad0-d49d-4419-b84a-149493779ca6"
    # 接口名(设备,网卡), 现在理解成网卡名
    DEVICE="ens33"
    # 系统启动的时候网卡是否自启动(yes/no),不用想, 肯定得自动启动
    ONBOOT="yes"
    
  • 新增以及要修改的(注意字母不要写错了!!!!写错了不起作用!)

    # 修改
    BOOTPROTO="static"
    ONBOOT="yes"
    
    #新增
    # ip地址随意写
    # 0, 2, 255不可以写
    # 0: 做网段IP
    # 2: 做网关地址
    # 255: 做广播地址
    IPADDR="xxx.xxx.xxx.xxx"    #新增:配置静态IP地址,按需配置
    # 子网掩码通常时255.255.255.0,可以去vm中配置里看
    NETMASK="255.255.255.0"   #新增:配置子网掩码
    # 要和VM 中的虚拟网络编辑器中 NAT设置的网关IP配置要一样,否者无法联网
    # 网关配置IP通常和子网IP前三段一致,最后一段不同,网关最后一个通常取2
    GATEWAY="xxx.xxx.xxx.xxx"   #新增:配置网关
    # DNS解析, 通常使用8.8.8.8或者是8.8.8.4
    DNS1="8.8.8.8"        #新增:配置DNS
    
    
    # 参考配置
    IPADDR="192.168.132.101"
    NETMASK="255.255.255.0"
    GATEWAY="192.168.132.2"
    # DNS解析
    DNS1="8.8.8.8"
    DNS2="8.8.8.4"
    
  • 修改/etc/resolv.conf

    这个文件时

    vim /etc/resolv.conf
    
    # Generated by NetworkManager
    nameserver 8.8.8.8
    nameserver 8.8.8.4
    
  • 设置完后要重新启动服务

    service network restart
    # 或者
    systemctl restart network
    
  • 修改主机名和host映射(云服务器的话通常会设置)

    • 为了方便记忆给Linux系统设置主机名

      # 查看主机名
      hostname
      
      # 注意!!修改后要重新启动才生效!!!!
      # 修改/etc/hostname文件,指定新的主机名
      vim /etc/hostname
      
  • 设置hosts映射(可不设置)

    作用:可以在本机通过主机名找到该Linux系统

    windows 映射文件为
    C:WindowsSystem32driversetchosts
    
    配置格式
    ip地址 自定义主机名
    例如
    192.168.200.130 CentOS_Study
    
    
    Linux在/etc/hosts中
    配置格式同window一样
    
  • 如果重启动网络服务失败

    方法1 修改mac地址
    # 1 虚拟机设置 --> 网络适配器 -> MAC地址
    # 2 修改  /etc/sysconfig/network-scripts/ifcfg-ens33 中 HWADADDR 的值为mac地址
    HWADADDR="mac地址"
    
    方法2 禁用NetworkManager
    # 1 关闭NetworkMananger服务
    # systemctl stop NetworkManager
    
    # 2 禁止NetworkMananger服务开机自启动
    systemctl disable NetworkManager
    
    # 3 重启network服务
    systemctl restart network
    

    主机名解析过程分析(Host、DNS)

    • Hosts:一个文本文件,用来记录IP和Hostname的映射关系
    • DNS:域名系统(Domain Name System),是互联网上作为域名和IP地址相互映射的一个分布式数据库

    以用户在浏览器输入www.baidu.com为例进行分析

  • 浏览器先检查浏览器缓存中有没有该域名解析IP地址(这个都是本地缓存的,还没到hosts映射文件中)
    • 有:调用该IP完成解析

    • 没有:检查DNS解析器缓存

      • 有:直接返回IP完成解析
  • 一般来说,当电脑第一次成功访问某个网站后,在一定时间内,浏览器和操作系统会缓存该网站的IP地址(DNS解析记录)

  • 如果本地解析器缓存没有找到对应的映射,检查系统中hosts文件中有没有配置对应的域名IP映射

    • 有:完成解析返回
  • 如果本地DNS解析器缓存和hosts文件中均没有找到对应的IP,则到域名服务DNS进行解析

  • 防火墙

    firewall-cmd 防火墙服务指令

    firewall-cmd [选项 ... ]
    
    --help 帮助命令
    -- state 防火墙状态
    --permanent 永久固化【通常搭配打开和关闭端口使用】
    --add-port=端口/协议 打开端口号【临时打开,永久需要和--permanent一起使用,临时打开不需要reload,reload会导致临时打开端口失效】
    --remover-port=端口/协议 关闭端口号【临时关闭,永久需要和--permanent一起使用】
    --reload 重新加载【永久关闭防火墙才需要重新加载】
    
    --list-services 查看所有开放的服务
    --list-port 查看所有开放的端口
    --query-port=端口/协议 查看指定的端口是否打开
    --zone-public 公共区域, 如果不指定那么就默认操作default zone, default zone通常映射到public zone公共区域。所以没有指定zone时,配置的规则会默认应用到public公共区域。
     	也就说如果不指定zone参数的效果例如 firewall-cmd --add-port=80/tcp , 实际上也是等价于 firewall-cmd --zone=public --add-port=80/tcp, 也就是说,默认都会影响公共区域public zone的规则。如果需要配置内部或可信区域,则必须使用--zone=trusted等指定。
    不指定时容易错误配置公共区域,导致服务器开放了不安全的端口。
    
    
    
    
    # 常用命令
    # 永久开放redis的6379端口
    firewall-cmd --zone-public --permanent --add-port=6379/tcp
    # 永久开放mysql的8080端口
    firewall-cmd --zone-public --permanent --add-port=8080/tcp
    

    进程管理

    基本介绍

  • Liniux中,每一个执行的程序都是成为一个进程。每一个进程都分配一个ID号(PID,进程号)

  • 每一个进程都可能以两种方式存在 。前台和后台,由于屏幕无法看到进程,通常使用后台方式执行

    • 前台:用户目前的屏幕上可以操作的
    • 后台:后台进程实际操作的
  • 一般系统的服务都是以后台进程的方式存在的,而且常驻在系统中,直到关机才结束

  • ps指令 报告当前系统的进程状态

    # 列出目前所有的正在内存当中的程序
    ps -aux | grep xxx【展示风格】
    
    # 列出所有进程
    ps -ef | greps xxx 【全格式,B22SD风格】
    
    
    -a 所有进程
    -u:以用户为主的格式来显示程序状况。
    -e 所有程序
    -f:显示UID,PPIP,C与STIME栏位
    
    
    # 例如
    [root@Cenos-study ~]# ps -aux | grep python
    root        842  0.0  1.6 359016 29816 ?        Ssl  18:28   0:00 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid
    root       1229  0.0  0.9 574288 17512 ?        Ssl  18:28   0:01 /usr/bin/python2 -Es /usr/sbin/tuned -l -P
    root     104364  0.0  0.0 112828   976 pts/2    S+   21:39   0:00 grep --color=auto python
    
    
    [root@Cenos-study ~]# ps -ef | grep python
    root        842      1  0 18:28 ?        00:00:00 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid
    root       1229      1  0 18:28 ?        00:00:01 /usr/bin/python2 -Es /usr/sbin/tuned -l -P
    root     105669  88143  0 21:40 pts/2    00:00:00 grep --color=auto python
    

    指令执行结果字段说明

    • USER:用户名

    • PID :进程号

    • %CPU:该进程使用掉的 CPU 资源百分比

    • %MEM:该进程所占用的物理内存百分比

    • VSZ :该进程使用掉的虚拟内存量 (Kbytes)

    • RSS :该进程占用的固定的内存量 (Kbytes)

    • TTY :该进程是在那个终端机上面运作,若与终端机无关,则显示 ?,另外, tty1-tty6 是本机上面的登入者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。

    • STAT:该程序目前的状态,主要的状态有

      • R :该程序目前正在运作,或者是可被运作
      • S :睡眠
      • T :该程序目前正在侦测或者是停止了
      • Z :僵死进程
      • D:短期等待
      • N:该进程拥有比普通优先级更低的优先级
    • START:该进程被触发启动的时间

    • TIME :该进程实际使用 CPU 运作的时间

    • COMMAND:启动进程使用的命令和参数,过长会被截断显示

    终止进程 kill 和 killall

    # 通过进程号杀死进程
    kill [选项] 进程号
    
    # 使用进程的名称来杀死一组进程
    # 在系统因负载过大而变慢的很有用
    killall 进程名称
    
    常用选项
    -9 强制进程立刻停止
    
    
    案例
    # 终止远程登录服务sshd
    kill sshd对应的进程号
    

    查看进程树 pstree

    pstree [选项]
    
    
    -p 显示进程PID
    -u 显示进程所属用户
    

    free 查看内存占用

    free
    
    内存占用情况:
    total:内存总数;
    used:已经使用的内存数;
    free:空闲的内存数;
    buffers Buffer:缓存内存数;
    cached Page:缓存内存数。
    

    service 服务管理

    • 介绍:服务(service)本质就是进程,但是运行在后台,监听某个端口,等待其他程序的请求,也称为守护进程
    • 在CentOS7.0后很多服务不再使用service而是systemctl
    • service指令管理的服务在/etc/init.d查看

    service 控制系统服务的实用工具

    service 服务名 [start|stop|restart|reload|status]
    
    start 启动
    stop 关闭
    restart 重新启动
    reload 重新加载
    status 显示服务状态
    

    开机流程说明

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

    chkconfig指令 检查或设置系统的各种服务

    可以通过chkconfig命令给服务的各个运行级别设置自启动/关闭

    • chkconfig指令管理的服务在 /etc/init.d
    • 重新设置服务后自启动或关闭,需要重启机器reboot才生效
    chkconfig(选项)
    --list 列出所有的系统服务
    chkconfig --level 等级 服务名 on/off 服务在指定的级别开启/关闭自启动
    

    systemctl指令 系统服务管理器指令

    • systemctl = service + chkconfig的组合
    • systemctl管理的服务在 /user/lib/systemd/system
    systemctl [选项] 服务名
    
    常用选项
    start 启动服务
    stop 关闭服务
    restart 重新启动服务
    status 查看服务的状态
    list-unit-files 显示开机自启动的服务,可以通过grep过滤
    enable 设置服务开启自启动
    disable 设置服务关闭自启动
    is-enabled 查看该服务是否开机自启动
    reload 重新加载
    

    防火墙服务开启关闭

    # 查看防火墙
    systemctl status firewalld
    
    # 关闭防火墙(临时关闭,下次开机后防火墙又会自启动)
    systemctl stop firewalld
    
    # 开启防火墙
    systemctl start firewalld
    
    # 永久关闭防火墙(关闭自启动)
    systemctl disable firewalld
    

    top 动态监控进程

    top和ps类似,都是显示正在执行的进程,但是top可以在执行一段时间可以更新正在运行的进程

    top [选项]
    
    常用选项
    -d 秒数 #指定top命令每个几秒更新,默认3秒
    -i 使top不显示任何显示或僵死进程
    -p 通过指定监控进程ID来监控单独一个进程的状态
    
    
    交互操作
    P 以CPU使用率排序,默认为该项
    M 以内存的使用率排序
    N 以PID排序
    k 终止一个进程
    q 退出top
    
    任务进程
    第一行:
    10:01:23 — 当前系统时间
    126 days, 14:29 — 系统已经运行了126天14小时29分钟(在这期间没有重启过)
    2 users — 当前有2个用户登录系统
    load average: 1.15, 1.42, 1.44 — load average后面的三个数分别是1分钟、5分钟、15分钟的负载情况。
    
    第二行:
    Tasks — 任务(进程),系统现在共有183个进程,其中处于运行中的有1个,182个在休眠(sleep),stoped状态的有0个,zombie状态(僵尸)的有0个。
    
    第三行:cpu状态
    6.7% us — 用户空间占用CPU的百分比。
    0.4% sy — 内核空间占用CPU的百分比。
    0.0% ni — 改变过优先级的进程占用CPU的百分比
    92.9% id — 空闲CPU百分比
    0.0% wa — IO等待占用CPU的百分比
    0.0% hi — 硬中断(Hardware IRQ)占用CPU的百分比
    0.0% si — 软中断(Software Interrupts)占用CPU的百分比
    
    第四行:内存状态
    8306544k total — 物理内存总量(8GB)
    7775876k used — 使用中的内存总量(7.7GB)
    530668k free — 空闲内存总量(530M)
    79236k buffers — 缓存的内存量 (79M)
    
    第五行:swap交换分区
    2031608k total — 交换区总量(2GB)
    2556k used — 使用的交换区总量(2.5M)
    2029052k free — 空闲交换区总量(2GB)
    4231276k cached — 缓冲的交换区总量(4GB)
    
    第五行以下:
    PID — 进程id
    USER — 进程所有者
    PR — 进程优先级
    NI — nice值。负值表示高优先级,正值表示低优先级
    VIRT — 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
    RES — 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
    SHR — 共享内存大小,单位kb
    S — 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
    %CPU — 上次更新到现在的CPU时间占用百分比
    %MEM — 进程使用的物理内存百分比
    TIME+ — 进程使用的CPU时间总计,单位1/100秒
    COMMAND — 进程名称(命令名/命令行)
    

    netstart 监控网络状态

    netstat [选项]
    
    -a 所有端口
    -n 使用ip地址而非域名服务器
    -p 显示哪个进程在调用 
    -l 监听的端口
    -t 显示TCP传输协议的连线情况
    -u 显示UDP传输协议的连线情况
    
    常用选项组合
    -an 以ip地址的形式显示所有端口
    -anp 以ip地址的形式显示所有端口,并显示调用的进程
    -tl 显示TCP正在监听的端口
    -ul 显示UDP正在监听的端口
    

    ping指令 测试主机之间网络的连通性

    ping ip地址/主机名
    

    nohup 后台启动服务

    nohup 命令
    
    # 例如后台启动redis服务
    nohup redis-server
    
    # 后台运行Java程序
    # 必须指定日志输出
    # 那么在缺省情况下该服务的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件
    nohup java -jar smmp-0.0.1-SNAPSHOT.jar > /opt/ssmp.log
    
    
    # 又例如
    nohup command > myout.file 2>&1 &
    
    # 在后台运行command命令,并将其标准输出和标准错误都重定向到myout.file文件中
    # 2>&1中的符号说明:
    # 2 - 表示标准错误文件描述符(file descriptor)
    # & - 表示重定向操作
    # 1 - 表示标准输出文件描述符
    # 所以2>&1的意思是将标准错误(2)重定向到标准输出(1)。
    # 在Linux中,每个命令运行时会打开三个文件描述符:
    # 0 - 标准输入
    # 1 - 标准输出
    # 2 - 标准错误
    # 我们可以使用> FILE, 2> FILE对任意一个或多个文件描述符进行重定向。
    # 而2>&1是一种将标准错误重定向到标准输出的捷径写法,等同于2>FILE 1>FILE二次重定向。
    # 所以,这个命令的全部功能是:
    # nohup 使命令在后台不挂起运行
    # command represent要运行的命令
    # >myout.file 将标准输出重定向到myout.file
    # 2>&1 将标准错误也重定向到标准输出
    # & 将整个命令在后台运行
    

    rpm

    rpm:互联网下载包的打包以及安装工具,生成具有.RPM扩展名的文件

    rpm包名基本格式:名称-版本号.适用操作系统

    • i686、i86表示32位系统,noarch表示通用
    rpm [选项]
    
    -q 碰到任何问题,优先询问用户,其他选项一般都会携带q一起执行
    -a 查询所有rpm软件包
    -q 包名 #查询某个软件包是否安装
    -i 软件包名 #查软件的信息【单独执行就是下载,如果搭配qi就是查询软件包的信息】
    -l 软件包名 #查询软件包中的文件
    -f 文件全路径名 查询文件包所属的软件包
    -e 包名 #卸载rpm包【如果有其他软件包依赖与要卸载的软件包,卸载时会产生错误信息】,增加参数--nodeps,可以强制删除,但是不推荐,因为依赖于该依赖包的程序可能无法执行
    -v 提示
    -h 进度条
    
    rpm 常用命令
    安装一个包 
    # rpm -ivh rpm包全路径名称
    rpm -ivh --nodeps   :如果该RPM包的安装依赖其它包,即使其它包没装,也强迫安装。 
    --force 即使覆盖属于其它包的文件也强迫安装 
    
    查询一个包是否被安装 
    # rpm -q 
    
    得到被安装的包的信息 
    # rpm -qi  
    
    列出该包中有哪些文件 
    # rpm -ql  
    
    列出服务器上的一个文件或目录属于哪一个RPM包 
    #rpm -qf 
    
    列出所有被安装的rpm package 
    # rpm -qa 
    
    卸载一个包 
    # rpm -e 
    
    #例如强制卸载firefox的软件包C
    rpm -e --nodeps firefox
    

    yum

    yum:是一个shell前端软件包管理器,基于RPM包管理,能够从指定的服务器自动下载RPM包并安装(要连网) ,可以自动处理依赖性关系,并一次安装所有依赖的软件包

    CentOS7远程yum源配置

    yum 的配置文件在 /etc/yum.repos.d 目录下 ,其中有多个配置文件,每一个配置文件中都可以配置一个或多个repository, 但是最终会被合并为一个交给系统,所以多个文件只是为了方便管理。

    实际使用时,选择其中一个配置即可

    配置步骤

  • 备份,将 CentOS-Base.repo 为CentOS-Base.repo.backup

    cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
    
  • 下载新的 http:#mirrors.aliyun.com/repo/Centos-7.repo,并命名为CentOS-Base.repo

    # CentOs7, 阿里云 和 中科大 二选一即可
    # 阿里云
    sudo wget -O CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
    
    # 中科大
    sudo wget -O CentOS-Base.repo https://lug.ustc.edu.cn/wiki/_export/code/mirrors/help/centos?codeblock=3
    
    # 更新元数据
    sudo yum clean all
    
    # 更新新的元数据缓存
    sudo yum makecache
    
  • yum指令

    yum [选项]
    
    list 查找所有软件列表
    install 软件包名 #下载软件包
    remove  软甲包名 # 卸载软件包
    update 更新软件包
    

    搭建JavaEE环境

    安装JDK8

  • 创建临时文件夹,mkdir /opt/jdk

  • 通过Xftp上传jdk包到jdk下

  • 进入到临时文件夹

    cd /opt/jdk
    
  • 解压dk包 【注意替换成自己的版本】

    tar -zxvf jdk-8u261-linux-x64.tar.gz
    
  • 创建文件夹,存放Java安装的

    mkdir /user/local/java
    
  • 将临时文件夹解压的jdk包移动到软件安装目录

    mv jdk1.8.0_261 /usr/local/java/
    
  • 配置环境变量的配置文件【环境变量的配置文件在/etc/profile】

    vim /etc/profile
    
    
    # java安装的目录,注意时usr,不是user
    exprot JAVA_HOME=/usr/local/java/jdk1.8.0_261
    # 拼接环境环境变量,并添加到path中
    # 注意必须要通过冒号连接环境变量,否则可能很多命令因为找不到环境变量而报错
    export PATH=$PATH:$JAVA_HOME/bin
    
  • 更新环境变量

    source /etc/profile
    
  • 输入一下三个指令,如果均有输出就代表安装成功

    java
    javac
    java -version
    
  • 安装JDK11

    新建目录, 并将下载的好jdk-11.0.20_linux-x64_bin.tar.gz上传到该目录下

    mkdir -p /opt/java
    

    执行下述命令

    mkdir -p /usr/local/software
    ln -s /opt/java/jdk-11.0.20 /opt/java/software/jdk-11 # 软连接到opt/目录下的jdk11
    

    在jdk1.8之后,就不在提供jre了,即使安装后也会报一个没有jre的错误,这时候可以使用cmd命令自己生成jre。

    进入jdk目录根目录中执行

    ./bin/jlink --module-path jmods --add-modules java.desktop --output jre
    

    编辑环境变量, 在头顶添加一下配置文件

    vim /etc/profile
    
    # jdk
    export JAVA_HOME=/usr/local/software/jdk-11
    # jre
    export JRE_HOME=$JAVA_HOME
    

    image-20230721212310561

    更新环境变量

    source /etc/profile
    

    使用yum安装JDK

    查找本地旧的jdk依赖

    rpm -qa | grep java
    

    删除本地Java相关的依赖

    • 查找
    yum -e --nodeps 对应的文件
    

    查找相关的jdk

    yum list | grep jdk
    

    安装jdk

    yum install 指定的版本
    

    配置环境变量

    • Linux环境变量是以冒号:分隔开的

      当jdk大于8后需要手动指定, JRE_HOME

    export JAVA_HOME=/usr/lib/jvm/jdk版本
    export PATH=$PATH:$JAVA_HOME/bin
    export JRE_HOME=$JAVA_HOME # 当jdk版本大于8的时候需要指定
    export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    

    刷新环境

    • 重新加载配置文件; 否则需要重新连接才生效。
    source /etc/profile
    

    测试是否安装成功

    # 查看path路径中是否添加上了
    echo $PATH
    
    # 同理
    echo $CLASSPATH
    
    # 查看Java版本是否是我们安装的版本
    java -version
    java
    javac
    

    安装Tomcat

  • 检查系统上是否安装了mysql( 若安装了就需要先卸载再使用我们自己的)

    • rpm -qa |grep -i tomcat                          #查看
      rpm -e --nodeps tomcat....   #卸载
      # 卸载的命令根据查找出来值进行修改
      
  • 创建临时文件夹,用来存放Tomcat压缩包

    makdir /opt/tomcat
    
  • 通过Xftp上传到/opt/tomcat

  • 进入到临时文件夹

    cd /opt/tomcat
    
  • 解压到当前目录

    tar -zxvf apache-tomcat-8.5.59.tar.gz
    
  • 创建安装目录

    mkdir /usr/local/tomcat
    
  • 移动tomcat解压文件到安装目录

    mv apache-tomcat-8.5.59 /usr/local/tomcat/
    
  • 配置Tomcat环境变量

    # vim编辑环境变量配置文件
    vim /etc/profile
    
    # 新增内容,tomcat环境配置
    export CATALINA_HOME=/usr/local/tomcat/apache-tomcat-8.5.59
    # 拼接环境变量
    export PATH=$PATH:$CATALINA_HOME/bin
    
  • 刷新环境变量配置

    source /etc/profile
    
  • 开放防火墙的8080端口,以至于远程可以访问tomcat

  •    # 注意是永久开放,后续要重载防火墙设置才能生效
       firewall-cmd --permanent --add-port=8080/tcp
    
  • 重载一下防火墙的设置

    firewall-cmd --reload
    
  • 查看8080端口是否打开

    firewall-cmd --query-port=8080/tcp
    
  • 打印环境变量,查看是否配置成功

    echo $PATH
    
  • 启动tomcat,如果环境变量配置好了,那么任何一处都可以适用以下两个命令,没配置成功就只能在tomcat/bin目录执行这个两个命令

    # 启动
    startup.sh
    
    # 关闭
    shutdown.sh
    
    # 访问http:127.0.0.1:8080
    
  • 安装Redis

  • Redis官方下载对应的redis的tar.gz,注意是Linux的版本 这里以redis7.0.11的安装为例子

    • # 或者通过命令直接下载到Linux
      # 避免上传
      wget http://download.redis.io/redis-stable.tar.gz
      
  • 在服务器的/opt下新建文件夹redis

    # 进入/opt目录下
    cd /opt
    # 新建redis
    mkdir redis
    
    # 进入redis目录
    cd redis
    
  • 上传redis压缩包到/usr/redis中,并解压压缩包

    tar -zxvf  redis-7.0.5.tar.gz
    
  • 查看是否有redis的依赖环境gcc

    gcc --version
    

    image-20230619185857974

  • 安装基本环境gcc

    yum install -y gcc
    
  • 进入安装目录/opt/redis/redis-7.0.11

    # 进入目录 
    /opt/redis/opt/redis/redis-7.0.11
    # 执行编译
    # make用于编译程序,生成二进制可执行文件
    make
    
  • 安装

    # make install用于安装二进制文件,复制到系统目录中并设置环境变量
    # # make install PREFIX=[安装位置目录]
    # 现在没有指定安装路径,那么redis会默认安装到/usr/local/bin
    make install
    
    # 如果是自定义安装目录
    # 如果指定的目录不存在会创建,需要注意的是如果指定了安装了路径,那么需要记住该位置,后续会用于修改配置
    # 在自定义安装目录下会生产bin目录
    
    # 这个命令的执行安装了什么内容?
    安装的内容有
    redis-benchmark :性能测试工具,可以在自己本机运行,看看自己本机性能如何
    redis-check-rdb:修复有问题的dump.rdb文件
    redis-sentinel:Redis集群使用
    redis-check-aof:修复有问题的AOF文件
    redis-cli:客户端,操作入口
    redis-server:Redis服务器启动命令
    
    • 如果是自定义安装,那么需要注意配置环境变量

      # 编辑环境变量
      vim /etc/profile
      
      
      # 在文末最后添加
      # 指向make install PREFIX=[安装位置目录]中输入的[安装位置目录]
      # 这里以/usr/local/redis/redis-7.0.11为例子
      export REDIS_HOME=/usr/local/redis/redis-7.0.11
      # 指向bin路径
      export PATH=$PATH:$REDIS_HOME/bin
      
      # esc 退出编辑模式,输入:wq保存退出
      
      # 刷新环境变量配置文件
      source /etc/profile
      
  • 修改配置redis.conf配置文件

    • 修改redis.conf配置文件前先备份

    • 重点修改的地方

      • 修改前 修改后 含义
        daemonize yes,也就说默认是前台模式启动 daemonize no 后台启动
        默认为bind 127.0.0.1 -::1,也说 只能本机连接redis 如果有就修改成bind 0.0.0.0,没有新增 表示任意主机都连接redis
        protected-mode yes protected-mode no 关闭保护模式,如果不关闭的话,那么远程是无法连接的
        默认没有requirepass,也就是没有密码 找到requirepass,添加 requirepass 123456 设置redis连接的密码
      • 实际开发中移动要修改的

        • 连接端口
        • 复杂的连接密码
    • # 修改配置文件之前先备份
      # 我解压的目录是/opt/redis/redis-7.0.11
      # 对应的配置文件也在这里,所以直接在原地备份一个,备份文件起名为redis.conf.backup
      cp /opt/redis/redis-7.0.11/redis.conf /opt/redis/redis-7.0.11/redis.conf.backup
      
      #打开配置文件
      vim /opt/redis/redis-7.0.11/redis.conf
      
      # 1. 关闭守护线程模式
      # 注释daemonize yes
      # 添加daemonize no
      
      # 2. 设置远程IP访问
      # 注释bind 127.0.0.1 -::1/
      #  新增 bind 0.0.0.0
      
      # 3. 关闭保护模式
      # 注释 protected-mode yes 
      # 添加 protected-mode no
      
      # 4. 添加密码 
      # requirepass 123456
      
      
      # 保存退出
      wq!
      
    • 修改号配置文件后需要重新启动配置文件

      • 先关闭redis-server,重启

      • # 查找redis相关的进程
        ps -ef | grep redis
        

        image-20230619194710048

      • # 根据查找的结果 杀死对应的进程
        # 我这里是116755 对应就是redis-server进程
        # 杀死 116755进程
        
        # kill -9 pid
        kill -9 116755
        
        # 再次查询进程中是否还有相关的redis进程
        
      • 重新启动redis-server即可

  • 开放防火墙6379端口

    • 查看已近开放的防火墙端口

      # 查看防火墙是否开始,并顺便开启防火墙
      # 查看所有开放的端口
      firewall-cmd --reload
      
    • 开放6379端口

      # 永久开放6479端口
      # 注意!注意!密码一定要设置复杂一些
      firewall-cmd --permanent --add-port=6379/tcp
      
    • 重新加载防火墙

      • 如果不刷新, 那么生效
      # 重新加载防火墙
      firewall-cmd --reload
      
    • 重新查询所有开放的端口, 看是否已经开放了6379端口

    • # 查看所有开放的端口
      firewall-cmd --list-port
      
  • 后台启动redis

    # 使用指定配置文件启动redis-server
    /usr/local/bin/redis-server /opt/redis/redis-7.0.11/redis.conf
    
  • 本机连接redis

    # 启动redis客户端 redis-cli 
    redis-cli
    # 输入密码
    auth 132456
    SAle8ZJofZy6NRxcVzQb
    

    image-20230619201356235

  • 远程连接redis

    image-20230619204612561

  • Redis配置文件-普通了解

    ################# 网络配置 ##################
    
    # 绑定的ip, 只允许127.0.0.1的用户访问
    # 配置远程访问的话必须要注释掉这个
    # 如果是内网可以直接绑定 127.0.0.1, 或者忽略; 0.0.0.0是外网,任意用户都可以访问
    bind 127.0.0.1 
    # 保护模式 
    # 远程访问redis的话,那么必须将保护模式修改成false
    protected-mode yes 
    # 端口设置
    port 6379 
    
    
    
    ################## 通用GENERAL ##################
    
    # 以守护进程的方式运行,默认是 no,我们需要自己开启为yes!
    # 通常都会修改,避免以前台的方式启动
    daemonize yes  
    # 如果以后台的方式运行,我们就需要指定一个 pid 文件! 
    pidfile /var/run/redis_6379.pid
    # 日志 
    # Specify the server verbosity level. 
    # This can be one of:
    # debug (a lot of information, useful for development/testing) 
    # verbose (many rarely useful info, but not a mess like the debug level) 
    # notice (moderately verbose, what you want in production probably) 生产环境 
    # warning (only very important / critical messages are logged)
    loglevel notice 
    # 日志的文件位置名 
    logfile "" 
    # 数据库的数量,默认是 16 个数据库 
    databases 16 
    # 是否总是显示LOGO
    always-show-logo yes
    
    ################## 快照(RDB) ##################
    # 如果900s内,如果至少有一个1 key进行了修改,我们及进行持久化操作 
    save 900 1 
    # 如果300s内,如果至少10 key进行了修改,我们及进行持久化操作 
    save 300 10 
    # 如果60s内,如果至少10000 key进行了修改,我们及进行持久化操作 
    save 60 10000 
    
    
    ################## security 安全##################
    # 密码,初始为空,也就说不需要密码,如果设置了密码,那么需要使用auth 密码进行登录才能进入
    requirepass
    
    
    ################## 限制clients ##################
    
    #设置能连接上redis的最大客户端的数量 
    maxclients 10000  
    #redis 配置最大的内存容量 
    maxmemory 
    #内存到达上限之后的处理策略
    maxmemory-policy noeviction
    # 处理策略如下
    # 1、volatile-lru:只对设置了过期时间的key进行LRU(默认值) 
    # 2、allkeys-lru : 删除lru算法的key 
    # 3、volatile-random:随机删除即将过期key 
    # 4、allkeys-random:随机删除 
    # 5、volatile-ttl : 删除即将过期的 
    # 6、noeviction : 永不过期,返回错误
    
    
    ################## append only模式 aof配置(持久化保存) ##################
    #  #默认是不开启aof模式的,默认是使用rdb方式持久化的,在大部分所有的情况下,rdb完全够用! 
    appendonly no 
    # 持久化的文件的名字
    appendfilename "appendonly.aof"   
    # appendfsync always # 每次修改都会 sync。消耗性能 
    appendfsync everysec # 每秒执行一次 sync,可能会丢失这1s的数据! 
    # 不执行 sync,这个时候操作系统自己同步数据,速度最快
    # appendfsync no  !
    

    安装MySQL5.7版本

  • 新建文件夹/opt/mysql,并进入

    mkdir /opt/mysql
    
    cd /opt/mysql
    
  • 下载MySQL安装包或者使用Xftp上传

    wget http:#dev.mysql.com/get/mysql-5.7.26-1.el7.x86_64.rpm-bundle.tar
    
    # 解压
    tar -xvf mysql-5.7.26-1.el7.x86_64.rpm-bundle.tar
    
  • 删除CentOS7.6自带的类Mysql数据库mariadb(会和冲突)

    # 查看mari开头的安装包,一共两个
    rpm -qa | grep mari
    
    rpm -e --nodeps mariadb-libs强制删除
    rpm -e --nodeps marisa
    
  • 依次运行几条命令

    # 安装环境
    rpm -ivh mysql-community-common-5.7.26-1.el7.x86_64.rpm
    # 安装依赖
    rpm -ivh mysql-community-libs-5.7.26-1.el7.x86_64.rpm
    # 安装客户端
    rpm -ivh mysql-community-client-5.7.26-1.el7.x86_64.rpm
    # 安装服务端
    rpm -ivh mysql-community-server-5.7.26-1.el7.x86_64.rpm
    
  • 启动MySQL服务

    systemctl start mysqld.service
    
  • 设置用户密码(mysql自动给root用户设置随机密码,第一次需要修改)

    # 查看MySQL设置的root随机用户密码
    grep "password" /var/log/mysqld.log
    
    # 复制查出的密码
    
    # 登录用户(注意-p之后不能输入密码,只能命令行中输入)
    mysql -uroot -p
    输入密码
    
    # 设置密码策略为0级别,生产环境不可用!!!!
    set global validate_password_policy=0;
    
    
    # 修改密码(root用户只能本地登录)
    set password for 'root'@'localhost' =password('12345678');
    
    
    # 刷新权限,是新密码生效
    flush privileges;
    
  • 设置MySQL远程登录

    # 切换到mysql数据库
    use mysql
    
    # 查看数据库有访问区权限的信息
    # 第一次设置,通常host都是为localhost
    select user, host from user;
    
    # mysql5.7版本之前的授权
    # all privileges,所有权限,或者单独指定select,update,delete 
    # "*.*"代表所有资源所有权限,第一个*表示数据库名称,第二个*表示表名
    # 'root'@%”其中root代表账户名,%代表所有的访问地址
    # IDENTIFIED BY '12345678',这个'12345678'是指远程访问密码,可自定义
    grant all privileges on *.* TO 'root'@'%' identified by '自定义远程访问密码' with grant option;
    # 刷新权限
    flush privileges;
    
    
    
    
    # mysql8执行授权
    # 创建用户
    CREATE USER 'root'@'%' IDENTIFIED BY 'root';
    # 授权
    grant all privileges on *.* to 'root'@'%' ;
    # 刷新权限
    flush privileges;
    
    grant all privileges on *.* TO 'root'@'%' identified by '12345678' with grant option;
    
  • 开放MySQL对应的端口(不开放无法远程连接)

    # 查3306端口是否被开放
    firewall-cmd --query-port=3306/tcp
    # 查所有开放的端口
    firewal-cmd --list-ports
    
    # 开放3306端口
    firewall-cmd --permanent --add-port=3306/tcp
    # 刷新防火墙
    firewall-cmd --reload
    
  • 定期备份数据库shell脚本

    数据库备份sh脚本

    #!/bin/bash
    
    # 数据库访问主机
    HOST=localhost
    
    # 数据库用户名
    DB_USER=root
    
    # 数据库密码
    DB_PASSWORD=12345678
    
    # 要删除距离当前时间指定天数
    DL_NUM=10
    
    # 备份目录
    BACKUP=/data/backup/db
    
    # 获取当前的日期时间
    DATETIME=$(date +%Y-%m-%d_%H:%M:%S)
    
    # 测试时间是否获取到
    # echo $DATETIME
    
    # 创建备份目录专门存放,如果存在就使用,如果不存在就创建目录
    # 如果不是一个目录,就创建(!取反,-d表示文件存在且是一个目录)
    [ ! -d "${BACKUP}/${DATETIME}" ] && mkdir -p "${BACKUP}/${DATETIME}"
    
    # 所有数据库备份,并压缩为gz格式
    mysqldump -u${DB_USER} -p${DB_PASSWORD} --host=${HOST} --all-databases  | gzip > ${BACKUP}/${DATETIME}/$DATETIME.sql.gz
    
    # 进入备份目录
    cd ${BACKUP}
    
    # 打包,${DATETIME}的文件以及子目录下的打包为$DATETIME.tar.gz格式
    tar -zcvf $DATETIME.tar.gz ${DATETIME}
    
    # 打包后删除,打包前的文件${DATETIME},该目录以及该目录下的子目录
    rm -rf ${BACKUP}/${DATETIME}
    
    # 删除指天数前的备份文件
    find ${BACKUP} atime +${DL_NUM} -name "*.tar.gz" -exec rm -rf {} ;
    
    # 提示信息
    echo "备份数据库所有数据库成功"
    

    指定时间备份

  • 编辑计时器设置

    # 编辑
    crontab -e
    # 查看
    crontab -l
    # 删除
    crontab -r
    
  • 编写调度任务crontab -e

    # 写定时调度任务,指定两点半备份数据库
    # 分钟 时 日 月 周 命令
    # 每天两点半执行一次脚本
    30 2 * * * /opt/sqlBck/mysql_db_backup.sh
    
  • Shell编程

    Shell基本介绍

    Shell概述

    shell是一个命令行解释器,为用户提供一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止或编写一些程序

    Shell脚本格式要求

  • 脚本必须以 #!/bin/bash开头
  • 脚本需要有可执行的权限(即是是root用户创建的sh脚本也需要手动添加可执行权限)
  • Shell脚本常用执行方式

  • 输入脚本的绝对路径或相对路径(一定要有执行权限!!! )

    # 例如/opt/shcode下有一个hello.sh脚本
    
    # 使用绝对路径执行sh脚本
    /opt/shcode/hello.sh
    
    # 使用相对路径执行sh脚本,假定目前已经在/opt/shcode/目录下
    ./hello.sh
    
  • sh命令执行(无需执行权限也能执行)

    # 绝对路径执行
    sh /opt/shcode/hello.sh
    
    # 相对路径执行,假定在/opt/shcode/下
    sh hello.sh
    
  • Shell语法

    shell注释

  • 单行注释

    # 注释内容
    
  • 多行注释(":$i"
    done

    ehco "-------"

    for j in "$@"
    do
    echo "$j"
    done

    预定义变量

    基本介绍:shell设计者提前定义好的变量,可以直接在shell脚本中使用

    # 当前进程的进程号,即是PID
    $$
    
    # 后台运行的最后一个进程的进程号
    $!
    
    
    # 最后一次执行命令返回的状态
    # 如果这个变量的值为0,证明命令正确执行
    # 如果不为0(具体的数字,由命令自己决定),那么证明上一个命令执行不正确
    $?
    

    执行脚本

    #!/bin/bash
    
    echo "当前执行的线程id=$$"
    
    # 以后台的方式运行一个脚本,并获取他的进程号
    # 该脚本存在才行
    /opt/shcode/hello.sh &
    echo "最后一个执行的线程id=$!"
    
    echo "执行的结果=$?"
    

    运算符

    # $(("运算式"))
    # $[运算式]
    # expr 运算式
    
    注意事项
    1 expr运算符间要有空格,如果希望将expr的结果赋值给某个变量,就是用反引号``
        例如:expr 1 + 2
              A=`expr 1 + 3`
    2 expr后边的乘、除、取余 分别为 * / %
    

    条件判断

    条件判断和if-elif判断
    if [ 条件判断式 ]
    then
      代码
    elif [条件判断式]
    then
      代码
    fi
    

    注意事项

  • 条件和中括号必须要有空格

  • fi作为判断条件的结尾

  • 判断后必须得衔接then

  • 非空返回true 空返回false,这里的空指字符串的空串

    • 例如:[ 1 ] 返回true [ "" ] 返回false
  • 0返回true 1返回false

  • &&且 ||或 !取反同样适用

  • 常用判断条件汇总

    • = 字符串比较

    • 两个整数比较

      • -lt 小于
      • -le 小于等于
      • -eq 等于
      • -gt 大于
      • -ge 大于等于
      • -ne 不等于
    • 按文件权限进行判断

      • -r 有读权限
      • -w 有写权限
      • -x 有执行权限
    • 按照文件类型进行判断

      • -f 文件存在并且是一个常规的文件
      • -e 文件存在
      • -d 文件存并且是一个目录

    实例shell脚本

    #!/bin/bash
    # 判断/opt/shcode/hello.txt目录中是否存在该文件
    if [ -f /opt/shcode/hello.txt ]
    then 
      ehco "存在该文件"
    fi
    
    
    # 根据输入的参数,判断大于等于60输出“及格了”,小于60输出“不及格”
    if [ $1 -ge 60 ]
    then
      echo "及格了"
    elif [ $1 -lt 60 ]
    then
      echo "不及格"
    fi
    
    case语句
    case $变量名 in
    "值1")
      如果变量的值等于值1,就执行
    ;;
    "值2")
      如果变量的值等于值2,就执行
    ;;
    # 其他分支
    *)
      如果都不匹配,就执行这段代码
    ;;
    esac
    

    注意事项

  • "值1")单独起一行
  • 每种情况必须以两个英文分号收尾
  • case语句结尾必须使用esac
  • 实例脚本

    #!/bin/bash
    case $1 in
    "1")
     echo "周一"
    ;;
    "2")
     echo "周二"
    ;;
    *)
     echo "其他"
    ;;
    esac
    
    for循环
    # 基本语法1
    for 变量 in 值1 值2 值3...
    do
     程序/代码
    done
    
    
    # 基本语法2
    for (( 初始值; 循环控制条件; 变量变化 ))
    do
      程序/代码
    done
    

    注意事项

  • for和双括号之间有空格
  • 双括号和值也有空格
  • 实例代码

    #!/bin/bash

    # 打印命令行的参数,体会$*和$@的区别

    echo "in语法"
    for i in "$*"
    do
    echo "$i"
    done

    ehco "-------"
    echo "双括号语法"
    for j in "$*"
    do
    echo "$j"
    done

    ehco "-------"
    ehco "输入的值为$1,"
    # 根据输入的值n,从1到n累加
    SUM=0
    for ((i=1; i

    相关文章

    服务器端口转发,带你了解服务器端口转发
    服务器开放端口,服务器开放端口的步骤
    产品推荐:7月受欢迎AI容器镜像来了,有Qwen系列大模型镜像
    如何使用 WinGet 下载 Microsoft Store 应用
    百度搜索:蓝易云 – 熟悉ubuntu apt-get命令详解
    百度搜索:蓝易云 – 域名解析成功但ping不通解决方案

    发布评论