Linux

星期四, 12月 12, 2024 | 59分钟阅读

MyraZ
Linux

关于 Liunx 的学习。

GNU/Linux 简介与下载

简介

  1991 年芬兰学生 Linus Torvalds 开发了一个业余项目,创建了一个类似 UNIX 的操作系统,起名为 Linux(李呢克斯) 并开源。他认为这个业余项目已经开发完成,本想把它抛在脑后,做一些新的、其他的有趣的项目。就在这个时候,他开始收到各种问题与建议,以及别人提交的补丁。于是他开始不断更新 Linux。

  这就是早期的 Linux 内核,由芬兰人林纳斯·托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个人爱好而编写。而现如今我们一般称 Linux 为 GNU/Linux。

  尽管有很多⼈为 GNU 做出贡献,但是作为操作系统,GNU 的发展仍未完成,其中最⼤的问题是具有完备功能的内核尚未被开发成功。GNU 的内核,称为 Hurd,是⾃由软件基⾦会发展的重点,但是其发展尚未成熟。⼀个没有内核的操作系统,就相当于没有灵魂的躯壳,好在值得庆幸的是,GNU 不必再等 Hurd 了,因为有了 Linux,Linux 实际上只是⼀个内核,这正是 GNU 系统的⼀个重要空⽩,⽽ GNU 系统也为 Linux 内核提供了⾮常多且必要的系统组件,⼈们把 Linux 和 GNU 系统结合起来组成⼀个完整的⾃由系统——⼀个带有 Linux 的 GNU 系统。换句话说,就是 GNU/Linux 系统。

  其实说到这⾥,GNU 的含义就很宽泛了:

  • 可以指代操作系统——GNU 操作系统
  • 可以指代软件——GNU 软件
  • 可以指代为了完成这个操作系统⽽发起的庞⼤的⼯程——GNU ⼯程
  • 或者是想要完成 GNU 系统/⼯程⽽聚集在⼀起的⼀帮⼈——GNU 组织
  • 甚⾄ GNU 是⼀种精神或者信仰

分支

  Linux 发行线路图 GitHub 地址:https://github.com/FabioLolix/LinuxTimeLine/releases

RedHat

RHEL

CentOS

Debain

Debain
Ubuntu

选择

  • 企业级应用:RHEL/CentOS
  • 桌面平台:Ubuntu
  • 开源服务器:CentOS

下载

  本文使用 CentOS 7 作为主要讲解版本,其生命周期到 2024 年 6 月 30 日:

  • Linux 官网:https://linux.org/
  • Linux 下载页面:https://linux.org/pages/download/
  • CentOS 下载地址:https://wiki.centos.org/Download
  • 阿里云 CentOS 镜像站:https://mirrors.aliyun.com/centos-vault/
  • CentOS7.6 下载地址:http://vault.centos.org/7.6.1810/

  安装镜像文件版本解析

  • DVD.iso:标准安装版
  • Everything.iso:完整版,集成所有软件
  • Minimal.iso:最小安装版,自带的软件最少,用什么装什么(学习阶段我们使用这个镜像)
  • NetInstall.iso:网络安装镜像,联网进行安装,可自行选择需要安装的软件
  • LiveGNOME.iso:GNOME 桌面版
  • LiveKDE.iso:KDE 桌面版
  • LiveCD.iso:光盘上运行的系统,类拟于 Windows PE

虚拟机安装与配置

虚拟化技术

  • 可以更好的利用计算机闲置的资源
  • 我们可以在计算机中虚拟出多台虚拟机帮助我们执行程序或者业务
  • 虚拟机的各种组成理论上和真实主机是一样的
  • 如果要使用这种技术只需要安装对应的软件即可
    • VMware
    • Virtualbox
    • VirtualMachine

安装VMware

  本文使用 Windows 10 操作系统安装 VMware Workstation 16 来进行讲解。鼠标双击我准备好的VMware-workstation-full-16.1.0-17198959.exe文件,然后按以下步骤完成安装:

  勾选我接收许可协议中的条款,点击下一步。

  根据个人习惯自定义安装位置,点击下一步。

  学习阶段我们使用破解版,就不给人家添麻烦了,把下面两个选项都取消勾选,点击下一步。

  自行选择是否创建快捷方式,点击下一步。

  点击安装,耐心等待。

  点击许可证,输入我给大家准备好的密钥。

  输入密钥后点击输入即可。

  最后点击完成退出安装向导,整个安装流程结束。

  安装完成后第一时间检查网络连接是否有VMnet1VMnet8,如果没有卸载虚拟机清理注册表并重新安装。

  接下来,打开虚拟机软件,点击编辑首选项修改虚拟机默认创建位置:

创建虚拟机

  创建虚拟机前请先检查电脑是否开启虚拟化。打开任务管理器,在性能选项中查看虚拟化信息。如果没开启需要进入 BIOS 系统进行开启(不同类型的电脑进入方式不同),这方面内容请自行搜索。

  接下来,请按以下流程完成虚拟机创建。

  点击自定义,定制化安装虚拟机。

  选择硬件兼容性,可以调整是否向下兼容,本文就使用默认值了。

  选择刚才下载好的 CentOS7 镜像文件。

  根据个人习惯修改虚拟机创建位置并填写虚拟机名称。

  根据需求设置虚拟机处理器数量。

  根据需求设置虚拟机内存大小。

  选择 NAT 网络模式。

  选择 IO 控制器类型,默认即可。

  选择磁盘类型,默认即可。

  选择创建新虚拟磁盘。

  设置最大磁盘大小,学习大数据推荐使用 100G。这里并不是马上分配 100G 出去,而是用多少分多少,最大上限 100G,所以切记不要勾选立即分配所有磁盘空间,否则会立刻将物理磁盘 100G 分配给该虚拟机。

  设置虚拟磁盘名称,默认即可。

  点击完成,虚拟机创建结束。

配置虚拟机

初始化

  选择刚才创建好的虚拟机,点击开启此虚拟机。

  底部提示信息直接关闭即可,然后点击屏幕用键盘上下键切换至Install CentOS 7,回车。

  接下来耐心等待虚拟机初始化,直到出现选择语言界面,选择英文并点击Continue

  点击DATE & TIME设置时区和时间,后面通过命令也可以实现修改。

  设置完成后点击Done返回。

  点击INSTALLATION DESTINATION设置硬盘分区。

  选择自定义分区并点击Done开始设置。

  点击号开始设置分区。

  引导分区/boot设置256M并点击Add mount point进行添加。

  交换分区swap设置2G并点击Add mount point进行添加。

  然后选择/并点击Add mount point将剩余所有空间分配给/分区。

  分区设置完成后点击Done

  点击Accept Changes接受修改内容。

  接下来点击Begin Installation开启安装。

  安装时可通过ROOT PASSWORD给虚拟机设置密码。

  设置密码后点击Done返回安装界面,耐心等待安装。

  USER CREATION用于创建用户,我们暂时不创建,使用默认用户root即可。后期我们学习通过命令创建用户-组-权限等。

  直到出现以下界面,表示虚拟机安装完成,点击Reboot重启虚拟机。

  输入默认用户root与密码回车登入虚拟机。注意:考虑到安全问题,输入密码时是不会显示在屏幕上的。

网络

  首先打开虚拟机的虚拟网络编辑器,查看 NAT 设置中的 IP 段和网关信息。

  NAT 设置中的 IP 段和网关信息如下。

  然后输入以下命令打开网络配置文件:

vi /etc/sysconfig/network-scripts/ifcfg-ens33

注意:切记不要手动输入,使用Tab键自动补齐,因为有的人是 ifcfg-ens33 有的是 ifcfg-ens32 防止出错。

  原文件内容如下:

TYPE=Ethernet         # 网卡类型(通常是 Ethernet 以太网)
PROXY_METHOD=none     # 代理方式:为关闭状态
BROWSER_ONLY=no       # 只是浏览器:否
BOOTPROTO=static      # 网卡的引导协议(static:静态IP  dhcp:动态IP  none:不指定,不指定容易出现各种各样的网络受限)
DEFROUTE=yes          # 默认路由
IPV4_FAILURE_FATAL=no # 是否开启 IPV4 致命错误检测
IPV6INIT=yes          # IPV6 是否自动初始化:是(现在还未用到 IPV6,不会有任何影响)
IPV6_AUTOCONF=yes     # IPV6 是否自动配置:是
IPV6_DEFROUTE=yes     # IPV6 是否可以为默认路由:是
IPV6_FAILURE_FATAL=no # 是否开启 IPV6 致命错误检测
IPV6_ADDR_GEN_MODE=stable-privacy # IPV6 地址生成模型
NAME=ens33            # 网卡物理设备名称
UUID=070892f0-514c-46c5-8593-c379854dcce1 # 通用唯一识别码,每一个网卡都会有,不能重复,否则两台 Linux 机器只有一台可上网
DEVICE=ens33          # 网卡设备名称,必须和‘NAME’的值一样
ONBOOT=yes            # 是否开机启动网络,要想网卡开机就启动或通过`systemctl restart network`控制网卡,必须设置为 yes
IPADDR=192.168.88.100 # 本机 IP
NETMASK=255.255.255.0  # 子网掩码
GATEWAY=192.168.88.2  # 默认网关
DNS1=192.168.88.2     # DNS 服务器
DNS2=114.114.114.114   # DNS 服务器
DNS3=8.8.8.8           # DNS 服务器

  我们只需要修改 2 行,删除 1 行,新增 6 行即可。首先i键进入编辑模式,然后开始编辑文件:

  修改

ONBOOT=yes
BOOTPROTO=static
  • ONBOOT=yes:是否开机启动网络
  • BOOTPROTO=static:使用静态网络 IP,就是自己手动设置(dhcp 表示动态获取网络 IP,也就是自动获取)

  删除

UUID=xxxxx
  • UUID=xxxxx:每一个网卡都会有,不能重复,否则两台 Linux 机器只有一台可上网。因为后期我们会通过这台虚拟机克隆新的虚拟机,所以删除UUID

  新增

IPADDR=192.168.88.100
NETMASK=255.255.255.0
GATEWAY=192.168.88.2
DNS1=192.168.88.2
DNS2=114.114.114.114
DNS3=8.8.8.8

  文件操作完毕后Esc退出编辑模式,然后:进入底行模式:wq保存并退出文件。

  然后输入以下命令重启网络:

systemctl restart network

  然后ping一下百度,如果出现以下效果则表示网络配置成功(Ctrl + C 终止 ping 命令的执行)。

防火墙

  防火墙(英语:Firewall)技术是通过有机结合各类用于安全管理与筛选的软件和硬件设备,帮助计算机网络于其内、外网之间构建一道相对隔绝的保护屏障,以保护用户资料与信息安全性的一种技术。

  也可以理解为保护本机的端口不被别人访问,如果端口需要被别人访问到,需要添加端口的防火墙例外。为了方便学习,我们直接将防火墙关闭并禁用,命令如下:

# 查看防火墙状态
systemctl status firewalld
# 本次服务内关闭防火墙(重启虚拟机后会自动开启)
systemctl stop firewalld
# 启动防火墙
systemctl start firewalld
# 重启防火墙
systemctl restart firewalld
# 禁用防火墙服务
systemctl disable firewalld

SELINUX

  SELinux 是「Security-Enhanced Linux」的简称,是美国国家安全局「NSA=The National Security Agency」 和SCC(Secure Computing Corporation)开发的 Linux 的一个扩张强制访问控制安全模块。我们在使用 Linux 系统过程中,SELinux 对未知软件的安装有可能会拒绝或者警告,同样为了方便学习,我们禁用这个功能。

  使用以下命令打开 SELinux 的配置文件:

vi /etc/selinux/config

  修改SELinux=disabled,然后:wq保存并退出。

  • enforcing:强制执行
  • permissive:放行
  • disabled:禁用

关闭虚拟机

  可以通过以下命令关闭虚拟机:

  • halt:相当于直接拔掉电源,不推荐。
  • poweroff:直接关闭机器,但是有可能当前虚拟机有其他用户正在使用,不推荐。
  • shutdown -h now:马上关闭计算机 ,但是会给其他用户发送消息,推荐。
  • reboot:重启虚拟机。

快照与克隆

拍摄快照

  可以通过拍摄快照记录当前虚拟机的状态,以防出问题时可以及时还原。虚拟机运行时也可以拍摄快照,只不过速度会非常慢,且运行时虚拟机也会不停的产生数据,为了防止数据丢失或出错,建议关闭虚拟机后再拍摄快照。

转到

  后期可通过快照管理器选择回到某一个历史快照的节点。

克隆

  除此之外,还可以通过克隆复制虚拟机的当前状态或某一个历史快照节点。

  克隆又分为链接克隆完整克隆

  • 链接克隆
    • 当前节点文件夹只存储差异性数据
    • 相同数据存放在原始节点上
    • 优点:节省硬盘空间
    • 缺点:耦合性大
  • 完整克隆
    • 就是基于原始节点完全拷贝到新节点的文件夹中
    • 优点:耦合性抵
    • 缺点:硬盘空间使用大
    • 推荐使用完整克隆

  虚拟机基于不同节点拍摄多个快照后效果如下:

修改克隆机配置

  网络信息:参考配置虚拟机中的修改网络信息。

  主机名:

  • hostname node01:本次启动中有效,重启虚拟机后还是原来的名字。
  • vi /etc/hostname:修改完成后需要重启生效。

移除虚拟机

  可以通过右键虚拟机→移除来移除此虚拟机,但是这种方式只是将虚拟机从 VMware 界面中移除而并非从磁盘上删除。

  如果要从磁盘上删除虚拟机,使用以下方式或自行找到虚拟机存储在磁盘上的位置并进行删除。

连接虚拟机

  • Xshell:负责向虚拟机输入命令
  • Xftp:负责向虚拟机传输文件

Linux的文件系统

万事万物皆文件

  文件系统:操作系统如何管理文件,内部定义了一些规则或者定义。在 Linux 中所有的东西都是以文件的方式进行操作,在 Linux 中,文件的访问和 Window 的不一样。Window 依靠的是通过盘符进行访问,而 Linux 维护着一个树状结构的文件模型,只有一个根节点,他的名字叫做/,一个节点上可以有多个子节点。

  在 Linux 中,查找文件的方式分为:

  • 相对路径
    • 以当前路径为基准点,查找其他资源
    • vi ../etc/sysconfig/network
  • 绝对路径
    • 以根目录为基准点,查找其他资源
    • vi /etc/sysconfig/network-scripts/ifcfg-ens33

Linux二级文件目录

/bin:
bin是Binary的缩写, 这个目录存放着最经常使用的命令。

/boot:
这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。

/dev :
dev是Device(设备)的缩写, 该目录下存放的是Linux的外部设备,在Linux中访问设备的方式和访问文件的方式是相同的。

/etc:
这个目录用来存放所有的系统管理所需要的配置文件和子目录。

/home:
用户的主目录,在Linux中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的。

/lib:
这个目录里存放着系统最基本的动态连接共享库,其作用类似于Windows里的DLL文件。几乎所有的应用程序都需要用到这些共享库。

/lost+found:
这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件。

/media:
linux 系统会自动识别一些设备,例如U盘、光驱等等,当识别后,linux会把识别的设备挂载到这个目录下。

/mnt:
系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在/mnt/上,然后进入该目录就可以查看光驱里的内容了。

/opt:
 这是给主机额外安装软件所摆放的目录。比如你安装一个ORACLE数据库则就可以放到这个目录下。默认是空的。

/proc:
这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。
这个目录的内容不在硬盘上而是在内存里,我们也可以直接修改里面的某些文件,
比如可以通过下面的命令来屏蔽主机的ping命令,使别人无法ping你的机器:
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

/root:
该目录为系统管理员,也称作超级权限者的用户主目录。

/sbin:
s就是Super User的意思,这里存放的是系统管理员使用的系统管理程序。

/selinux:
 这个目录是Redhat/CentOS所特有的目录,Selinux是一个安全机制,类似于windows的防火墙,但是这套机制比较复杂,这个目录就是存放selinux相关的文件的。

/srv:
 该目录存放一些服务启动之后需要提取的数据。

/sys:
这是linux2.6内核的一个很大的变化。该目录下安装了2.6内核中新出现的一个文件系统 sysfs 。
sysfs文件系统集成了下面3种文件系统的信息:针对进程信息的proc文件系统、针对设备的devfs文件系统以及针对伪终端的devpts文件系统。该文件系统是内核设备树的一个直观反映。
当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中被创建。

/tmp:
这个目录是用来存放一些临时文件的。

/usr:
 这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于windows下的program files目录。

/usr/bin:
系统用户使用的应用程序。

/usr/sbin:
超级用户使用的比较高级的管理程序和系统守护程序。

/usr/src:
内核源代码默认的放置目录。

/var:
这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。

/run:
是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。如果你的系统上有 /var/run 目录,应该让它指向 run。

Linux的文件操作

Linux 命令在线查询:https://www.linuxcool.com/

  • cd:改变当前工作目录

    • cd -返回到上一次所在目录
    • cd -P如果切换的目标目录是一个符号链接,则直接切换到符号链接指向的目标目录(不走软链接,走真实地址)
    • cd -L如果切换的目标目录是一个符号链接,则直接切换到符号链接名所在的目录(走软链接,cd /xxx 默认就是 -L)
  • ls/ll:显示出指定目录下所有的文件,文件的类型如下:

    • -普通文件
    • d文件夹
    • l软连接
  • mkdir:创建文件目录

    • mkdir -p a/b/c/d/e/f 会自动创建文件父目录
    • mkdir -p lucky/{1,2,3,4,5} 或者 mkdir -p lucky/{1..5} 一次可以创建多个子目录
  • rmdir:删除空文件夹,可以安全的删除文件目录

    • rmdir: failed to remove ‘a1’: Directory not empty
    • rmdir: failed to remove ‘baidu’: Not a directory
  • cp:拷贝文件或者文件目录

    • cp 源文件 目标目录
      • cp abcd /opt
      • cp /opt/abcd ./
    • 拷贝文件夹
      • cp -r lucky /opt
      • 拷贝文件夹下所有的内容
      • cp: omitting directory ‘/root/a1’
  • mv

    • 移动文件或者文件夹
      • mv a1 /opt
      • mv abc /opt
    • 修改文件名称
      • mv a abcd
  • rm

    • 删除文件
      • rm install.log
      • rm -f install.log
    • 删除文件夹
      • rm -r abcd
      • rm -rf abcd 谨慎使用,从删库到跑路
  • touch

    • 如果没有就创建一个文件
    • 如果该文件已经存在,修改文件的三个时间,将三个时间改为当前时间
  • stat

    • 查看文件的状态
    • Inode 当前文件在文件系统的唯一标识,类似于ID
    • 时间
      • access 访问时间
      • modify 修改文件内容时间
      • change 修改文件元数据信息时间
        • 文件大小 ,文件所有者 ,文件权限
        • 对于文件的描述信息
  • ln

  如果要想说清楚 ln 命令,则必须先解释下 ext 文件系统(Linux 文件系统)是如何工作的。Linux 目前使用的是 ext4 文件系统。如果用一张示意图来描述 ext4 文件系统,则如下:

  ext4 文件系统会把分区主要分为两大部分(暂时不提超级块):小部分用于保存文件的 inode(i 节点)信息;剩余的大部分用于保存 block 信息。

  inode 的默认大小为 128 Byte,用来记录文件的权限(r、w、x)、文件的所有者和属组、文件的大小、文件的状态改变时间(ctime)、文件的最近一次读取时间(atime)、文件的最近一次修改时间(mtime)、文件的数据真正保存的 block 编号。每个文件需要占用一个 inode。大家如果仔细查看,就会发现 inode 中是不记录文件名的,那是因为文件名记录在文件所在目录的 block 中。

  block 的大小可以是 1KB、2KB、4KB,默认为 4KB。block 用于实际的数据存储,如果一个 block 放不下数据,则可以占用多个 block。例如,有一个 10KB 的文件需要存储,则会占用 3 个 block,虽然最后一个 block 不能占满,但也不能再放入其他文件的数据。这 3 个 block 有可能是连续的,也有可能是分散的。

  由此,我们可以知道以下 2 个重要的信息:

  1. 每个文件都独自占用一个 inode,文件内容由 inode 的记录来指向;
  2. 如果想要读取文件内容,就必须借助目录中记录的文件名找到该文件的 inode,才能成功找到文件内容所在的 block 块。

  了解了 Linux 系统底层文件的存储状态后,接下来学习 ln 命令。

  ln 命令用于给文件创建链接,根据 Linux 系统存储文件的特点,链接的方式分为以下 2 种:

  • 软链接:类似于 Windows 系统中给文件创建快捷方式,即产生一个特殊的文件,该文件用来指向另一个文件,此链接方式同样适用于目录。
  • 硬链接:我们知道,文件的基本信息都存储在 inode 中,而硬链接指的就是给一个文件的 inode 分配多个文件名,通过任何一个文件名,都可以找到此文件的 inode,从而读取该文件的数据信息。

  ln 命令的基本格式如下:

[root@localhost ~]# ln [选项] 源文件 目标文件

  选项:

  • -s:建立软链接文件。如果不加 “-s” 选项,则建立硬链接文件;
  • -f:强制创建。如果目标文件已经存在,则删除目标文件后再建立链接文件;

  创建硬链接:

# 建立硬链接文件,目标文件没有写文件名,会和原名一致
# 也就是 /tmp/test.txt 是硬链接文件
# 修改任意一个文件其他文件跟着一起改变,删除其中一个其他文件不受影响
[root@localhost ~]# touch filehard.txt
[root@localhost ~]# ln /root/filehard.txt /tmp/fh.txt
[root@localhost ~]# stat filehard.txt 
  File: ‘filehard.txt’
  Size: 0         	Blocks: 0          IO Block: 4096   regular empty file
Device: fd00h/64768d	Inode: 67172200    Links: 2
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2022-05-02 21:03:07.193973621 +0800
Modify: 2022-05-02 21:03:07.193973621 +0800
Change: 2022-05-02 21:03:12.817973309 +0800
 Birth: -
[root@localhost ~]# stat /tmp/fh.txt 
  File: ‘/tmp/fh.txt’
  Size: 0         	Blocks: 0          IO Block: 4096   regular empty file
Device: fd00h/64768d	Inode: 67172200    Links: 2
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2022-05-02 21:03:07.193973621 +0800
Modify: 2022-05-02 21:03:07.193973621 +0800
Change: 2022-05-02 21:03:12.817973309 +0800
 Birth: -

  仔细观察 Inode,创建硬链接的两个文件 Inode 都为 67172200,但是两个文件的名字却不一样。在回过头理解刚才那句话:硬链接指的就是给一个文件的 inode 分配多个文件名,通过任何一个文件名,都可以找到此文件的 inode,从而读取该文件的数据信息。所以删除这两文件任何一个,另一个都不会受到影响。

  创建软链接:

# 建立软链接文件
# 修改任意一个文件其他文件跟着一起改变,删除源文件,软链接文件会失效
[root@localhost ~]# touch filesoft.txt
[root@localhost ~]# ln -s /root/filesoft.txt /tmp/fs.txt
[root@localhost ~]# stat filesoft.txt 
  File: ‘filesoft.txt’
  Size: 0         	Blocks: 0          IO Block: 4096   regular empty file
Device: fd00h/64768d	Inode: 67172203    Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2022-05-02 21:06:06.389963709 +0800
Modify: 2022-05-02 21:06:06.389963709 +0800
Change: 2022-05-02 21:06:06.389963709 +0800
 Birth: -
[root@localhost ~]# stat /tmp/fs.txt 
  File: ‘/tmp/fs.txt’ -> ‘/root/filesoft.txt’
  Size: 18        	Blocks: 0          IO Block: 4096   symbolic link
Device: fd00h/64768d	Inode: 33555087    Links: 1
Access: (0777/lrwxrwxrwx)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2022-05-02 21:06:25.332962661 +0800
Modify: 2022-05-02 21:06:17.901963072 +0800
Change: 2022-05-02 21:06:17.901963072 +0800
 Birth: -

  仔细观察 Inode,创建软链接的两个文件 Inode 都不一样。在回过头理解刚才那句话:类似于 Windows 系统中给文件创建快捷方式,即产生一个特殊的文件,该文件用来指向另一个文件。所以删除链接文件没事,如果删除源文件那么链接文件将失效。

  还有值得注意的是,如果创建软链接时使用了相对路径,那么移动链接文件也会造成软链接的失效,所以创建软链接时建议使用绝对路径。但是如果移动了源文件,软链接也会失效。

读取文件信息

  • cat

    • 将整个文档加载到内存中,并进行一次性显示
    • 除非后面使用管道,传递数据
  • tac

    • 将整个文档加载到内存中,并进行一次性按行逆序显示
  • more less

    • 分页查看文档内容
    • 快捷键
      • 回车 下一行
      • 空格 下一页
      • b 回退
      • q 退出
  • head

    • 从文章开始读取N行
    • 默认如果超过10行读取10行,否则读取现在行数
    • head -5 profile
  • tail

    • 从文章末尾读取N行
    • head -3 profile | tail -1
      • 利用管道只读取第N行
      • 管道的作用就相当于把前面的结果以参数的方式传递给后面的命令
    • 读取新增数据
      • ping www.baidu.com »baidu
      • tail -F baidu
      • 如果f:
        • 它会监听指定inode的文件数据变化,但是当文件被删除后
        • 即使创新创建,inode也会发生变化,于是监听失败
      • 如果F
        • 他会监听指定名字的文件,如果文件被删除后,重新创建
        • 他会重新监听新文件的数据变化,监听不受影响
  • find

    • 查找指定的文件
    • find 要查找的范围 -name 名字
    • find /etc -name profile
  • basename

    • 剔除目录部分,只显示文件名
    • basename /etc/rc.d/rc.local
  • dirname

    • 剔除非目录部分,只显示目录名
    • dirname /etc/rc.d/rc.local

VI和VIM编辑器

image-20201028093327125

打开文件

  • 正常打开
    • vi profile
  • 打开文件,并将光标置于第8行
    • vi +8 profile
  • 打开最后一行
    • vi + profile
    • 按n查找下一个,按N查找上一个
  • 打开指定搜索单词的位置
    • vi +/if profile

三种模式

  使用 Vim 编辑文件时,存在 3 种工作模式,分别是命令模式编辑模式底行模式,这 3 种工作模式可随意切换,如下图所示。

  • 命令模式:每一个按键都有其具体的功能。
  • 编辑模式:输入什么就是什么。
  • 底行(命令行)模式:保存文件或对文件中的指定内容执行查找或替换等操作。
命令模式

  使用 Vim 编辑器打开文件时,默认处于命令模式。此模式下,可使用方向键(上、下、左、右键)或 k(上)j(下)h(左)l(右)移动光标的位置,还可以对文件内容进行复制、粘贴、替换、删除等操作。

  • G:跳转至文件末尾。
  • gg:跳转至文件第一行。
  • 数字gg:跳转到指定行,例如:2gg,跳转到第 2 行。
  • ^:跳转至行首。
  • $:跳转至行末。
  • w:跳到下个单词处。
  • 数字w:跳转到指定个数的单词处。
  • yw:复制一个单词。
  • 3yw:复制三个单词。
  • yy:复制一行。
  • 3yy:复制三行。
  • p:粘贴复制内容。
  • 6p:粘贴 6 次。
  • dw:删除一个单词。
  • 3dw:删除三个单词。
  • dd:删除一行。
  • 3dd:删除三行。
  • u:回退到上一步的操作。
  • Ctrl + r:回退u执行的操作。
  • .:重复上一步操作。
  • x:剪切当前光标处字符。
  • 3x:剪切三个字符。
  • r:替换,然后输入一个字符替换,例如:r1,光标处字符会被替换为1
  • 3r:替换三个字符。
  • kjhl:方向键,分别对应上下左右。
  • ZZ:保存并退出。
  • ZQ:不保存退出。
  • Ctrl + s:锁屏。
  • Ctrl + q:解锁。
编辑模式

  这个没什么好说的,就和正常文本输入一样,输入什么就是什么。

底行模式
  • :set nu:打开行号。
  • :set nonu:关闭行号。
  • /要查找的内容:搜索指定的字符串。
    • n:查找下一个。
    • N:查找上一个。
  • s/要查找的内容/替换为的内容/修饰符:替换字符串。
    • /i:忽略大小写。
    • /g:替换当前行所有,不加/g只替换当前行的第一个。
    • 3,8s/abc/lucky/g:替换指定行,不加/g只替换指定行的第一个。
    • %s/要查找的内容/替换为的内容/g:替换全文,不加 % 表示只替换光标所在行。
  • :w:保存。
  • :q:退出。
  • :wq:保存并退出。
  • q!:强制退出,不保存。

  如果上次异常退出(比如文件正在编辑忽然断电或者直接把 Shell 窗口关闭了)会保留同名隐藏文件。

  每次启动会给与提示。如果确定当前文件没问题,请删除隐藏文件。

  • o:只读模式打开文件。
  • e:读写模式打开文件。
  • r:通过.swp文件恢复文件内容。
  • d:删除.swp文件。
  • q:退出文件。
  • a:终止操作(也会退出文件)。

打开文件

  • vi 文件名:正常打开。
  • vi +8 文件名:打开文件并跳转至第 8 行。
  • vi + 文件名:打开文件并跳转至最后一行。
  • vi +/要查找的内容 文件名:打开文件并搜索指定的字符串。
    • n:查找下一个。
    • N:查找上一个。

image-20201028093247981

计算机间的数据传输

Window - Linux

  • lrzsz
    • 需要手动安装:yum -y install lrzsz
    • rz:将文件从window上传到Linux
    • sz 文件:将文件从Linux传输到Window
    • 安装完 lrzsz 插件以后,还支持使用鼠标拖拽文件至 Xshell 的方式来上传文件
  • xftp
    • 较为通用的文件传输方式

Linux - Linux

scp

  Linux 机器之间互相传输文件使用scp命令即可。s:SSH 协议的意思,cp:拷贝。

  scp表示安全复制,该命令可以在两个位置之间安全地复制文件和目录。使用 scp,可以复制文件:

  • 从本地系统到远程系统;
  • 从远程系统到本地系统。

  使用 scp 传输数据时,文件是加密的,因此任何敏感内容都不会在传输过程中被篡改。

  scp命令格式如下:

[root@localhost ~]# scp 源数据地址(source) 目标数据地址(target)
# A 端的 ~/test 目录拷贝到 B 端的 ~ 目录,B 端 ~ 目录下会出现 test 目录
[root@localhost ~]# scp -Crp -l 1 test/ root@192.168.88.100:~

  常用选项:

  • -C(大写):允许传输过程中压缩,可提高效率
  • -r:递归传输整个目录(如果传输的是文件则不需要这个参数)
  • -p(小写):保留源文件的修改时间和访问权限等
  • -P(大写):指定远程主机的 ssh 端口
  • -l:limit 限制传输带宽 KB/s,-l 1表示限制每秒 1kb 的传输效率
  • -v:详细模式,打印有关其进度的调试消息的选项,这有助于调试连接、身份验证和配置问题(调试可以使用)

  如果是第一次连接到目标服务器,会得到一个提示,如下:

  输入 yes 确定与目标主机继续连接后会将该主机添加到当前设备的已知主机列表中,以后在这台电脑上再次连接目标服务器时将不会再提示上面的警告。

已知主机列表文件叫known_hosts/root/.ssh/known_hosts

  然后需要输入目标服务器的密码进行身份认证,认证通过后即可正常操作。

  拷贝结束,查看目标服务器如下:

  如果源数据地址是另一台服务器呢?那就是把别的服务器的文件拷贝到本机,例如:

[root@localhost ~]# scp root@192.168.88.100:/etc/profile ~

  只不过,因为 SSH 协议是一个验证授权的网络协议,所以每次传输都需要输入密码。有没有什么办法可以解决这个问题?当然有,我们可以使用非对称加密公私钥实现免密操作,关于这块的内容后面会详细的讲解,这里先略过。

提示:scp 无法实现文件同步功能,例如某一端删除了某些文件,使用 scp 后另一端对应的文件并不会被删除。

rsync

  rsync也是一个比较实用的命令,用于通过远程 Shell 在两个位置之间同步文件,它通传输源和目标之间的差异来提供更快的文件传输。使用前需要先安装命令(传输的双方都必须安装 rsync):

[root@localhost ~]# yum -y install rsync

  既然都有了scp,还需要用到rsync吗?当然,因为增量备份和在拷贝目录时,排除掉目录中的某些文件这两个场景 scp 就满足不了。

  rsync命令格式如下:

[root@localhost ~]# scp 源数据地址(source) 目标数据地址(target)
# A端的~/test目录拷贝到B端的~目录,B端~目录下不会出现test目录,而是把A端的~/test目录下的所有文件拷贝到B端的~目录
[root@localhost ~]# rsync -az --exclude 'log' --bwlimit=1 test/ root@192.168.88.100:~
# A 端的 ~/test 目录拷贝到 B 端的 ~ 目录,B 端 ~ 目录下会出现 test 目录
[root@localhost ~]# rsync -az --exclude 'log' --bwlimit=1 test/ root@192.168.88.100:~/test

  常用选项:

  • -r:递归传输目录下所有文件
  • -a:归档模式,保持所有文件属性。递归同步并保留符号链接、组、所有者和权限,它比-r更常用
  • -v:显示 rsync 过程的详细信息,-vvvv可以获取更加详细的信息
  • -z:传输时进行压缩处理
  • -exclude=PATTERN:排除不需要传输的文件格式
  • -exclude-from=FILE:排除 FILE 中指定格式的文件
  • -bwlimit:限制 I/O 带宽 KB/s
  • --partial:恢复因某些原因而中断的传输
  • --progress:显示传输进度
  • -P(大写):由两个参数组成。--partial:恢复某些原因而中断的传输,--progress:显示传输进度
  • --delete:从目标目录中删除无关文件。例如某一端删除了某些文件,使用该参数后另一端对应的文件也会被删除
区别
  • scp 通过安全的 SSH 连接进行文件传输(总是安全的),rsync 不是加密传输,rsync 必须通过 SSH 传输才能安全;
  • 如果要传输大文件,并且传输在完成之前断开连接,rsync 会从中断的地方继续传输,而 scp 没有;
  • rsync 默认是只拷贝有变动的文件,scp 是全量拷贝,所以 rsync 很适合做增量备份。

  rsync 比较端与端的文件并只传输更改文件的更改部分,当你第一次传输文件时,它的行为与 scp 非常相似,但是对于大多数文件未更改的第二次传输,它推送的数据将比 scp 少得多。这也是一种重新启动失败传输的便捷方法,你只需重新发出相同的命令,它就会从上次中断的地方开始,而 scp 将从头开始。

  通常情况下,用 scp 比较多,因为它使用起来更加简单。但对于重复性任务,请使用 rsync,因为在多次调用时,它将利用已传输的数据,执行速度非常快且节省资源,并且在拷贝目录时,还支持排除掉目录中的某些文件。它是在网络上保持两个目录同步的绝佳工具。

  此外,在处理大文件时,请使用带有 -P 选项的 rsync。如果传输被中断,可以通过重新发出命令从它停止的地方恢复传输。

注意:在做备份的时候,最好限制一下 I/O 带宽,不然很容易因为备份占用了太多 I/O,影响机器其它的应用程序。

总结

  rsync 和 scp 在文件夹均不存在时,执行时间相差不大,但是文件夹存在的情况下差异很大。原因是 scp 是复制:若目的地文件不存在则新建,若存在则覆盖。而 rsync 是同步,比较两边文件是否相同,相同的话,就什么都不做,若存在差异就直接更新。

  起到同步的作用时用 rsync 会快一些,起到复制作用时两者均可(目的地无文件)。视情况来选择 rsync 或 scp,如果小文件非常多(过万),且只改动了一两个,使用 rsync 就不见得比 scp 快,因为 scp 无脑全部覆盖,rsync 还需要一个个去比较,比较会浪费大量时间。

文件大小

  • 分区信息
    • df -h
  • 指定文件目录大小
    • du -h –max-depth=1 apache-tomcat-7.0.61
  • swap
    • 一个特殊分区,以硬盘代替内存
    • 当内存使用满的时候,可以将一部分数据写出到swap分区

文件压缩

tar

  • 主要针对的文件是 lucky.tar.gz
  • 解压缩
    • tar -zx(解压)v(过程)f(文件) lucky.tar.gz
  • 压缩
    • tar -zc(压缩)f(文件) tomcat.tar.gz(压缩后的名字) apache-tomcat-7.0.61(源文件)
    • tar -zxf tomcat.tar.gz -C /opt/
      • -C 指定解压缩的文件目录

zip和unzip

  • 安装
    • yum install zip unzip -y
  • 压缩
    • zip -r tomcat.zip apache-tomcat-7.0.61
  • 解压缩
    • unzip tomcat.zip

Linux的网络信息

主机名称

  • 临时修改
    • hostname bdp
  • 长久修改
    • vi /etc/hostname

DNS解析

  • 域名解析服务
  • 可以将域名转换为IP地址
  • DNS域名劫持
  • 修改主机域名
    • vi /etc/hosts

    • 将来我们需要把所有的虚拟机都配置hosts文件

    • 192.168.31.101 bd1601

    • 192.168.31.102 bd1602

网络相关命令

  • ifconfig
    • 查看当前网卡的配置信息
    • 这个命令属于 net-tools中的一个命令,但是Centos7中minimal版并没有集成这个包
    • 所以7的时候需要自己手动安装
    • 如果没有ifconfig ,可以使用ip addr 临时代替
  • netstat
    • 查看当前网络的状态信息
    • 一个机器默认有65536个端口号[0,65535]
    • 这是一个逻辑的概念,将来我们需要使用程序监听指定的端口,等待别人的访问
    • 一个端口只能被一个程序所监听, 端口已经被占用
    • netstat -anp
    • netstat -r 核心路由表 == route
  • ping
    • 查看与目标IP地址是否能够连通
  • telnet
    • 查看与目标IP的指定端口是否能够连通
    • yum install telnet -y
    • telnet 192.168.31.44 22
  • curl
    • restful 我们所有的资源在网络上中都有唯一的定位
    • 那么我们可以通过这个唯一定位标识指定的资源
    • http://localhost:8080/lucky/user.action/666
    • curl -X GET http://www.baidu.com

主机间的相互免秘钥

加密算法

  加密算法总体可分为三大类:

  • 散列算法(摘要算法)
  • 对称加密算法
  • 非对称加密算法

  相关在线加密网站:

服务器相互免秘钥

  接下来使用最初始的example虚拟机克隆一个完整虚拟机出来,现在服务器环境如下:

主机名 IP
node01 192.168.88.101
node02 192.168.88.102
生成密钥

  首先第一步要做的是生成密钥对,运行以下命令生成密钥对:

ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
[root@node01 ~]# ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
Generating public/private rsa key pair.
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:V61ce0q2+FB3Fu2xZOFo0hVxMFORgiyDIZpJmz9v/vg root@node01
The key's randomart image is:
+---[RSA 2048]----+
|   . . .o . . +OB|
|  . * .. o o.o+++|
|   *      o..++*.|
|    .      ooooo+|
|     o  S . o =.*|
|      o  .   = *.|
|       o    o o  |
|      o .    o   |
|       ooE    .  |
+----[SHA256]-----+

  运行以上命令后会在~/.ssh/目录下生成一对密钥对。

[root@node01 ~]# ls ~/.ssh/
id_rsa  id_rsa.pub  known_hosts
拷贝公钥

  接下来,你想免秘钥登录谁,只需要把自己的公钥传递给对方主机即可。这个公钥文件必须放在对方主机的~/.ssh/authorized_keys文件中。可以使用命令将公钥文件自动传递过去,命令如下:

ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.88.102
[root@node01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.88.102
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.88.102 (192.168.88.102)' can't be established.
ECDSA key fingerprint is SHA256:U4EWd869KRKqbW0b2wROWkc7+i+dBW3WHgy+IILYDMI.
ECDSA key fingerprint is MD5:99:5a:c0:d8:e4:ec:73:fe:3c:f5:c0:b6:14:7f:d4:0f.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.88.102's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@192.168.88.102'"
and check to make sure that only the key(s) you wanted were added.

注意:第一次建立连接时会弹出一个警告,需要输入 yes 将该主机添加到当前设备的已知主机列表中。这个警告是可以忽略的,一会我们讲如何忽略。

  查看对方主机的~/.ssh/authorized_keys文件如下:

[root@node02 ~]# cat ~/.ssh/authorized_keys 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDOENHCwG21/zMYmSZtY/QbDpMS5coPcvhlEkmzTEXzi5PMx30qYZRaClsp9C8z7Qa0t3IFKeqp3+g0ZdGYkqEUmCYqwQH9ESnEuHaKKzM04YlfYFV7m9uqtmaOwCfSXJ5bEFKqP5/xBT5MsplK4KYgS4MjS1zQO0EDo19HJauG/9gFYwjBaMOqdsBN2qqjzOOXpDhgXgeY1NQjw9l7yd4P/EE/K9vzFi8T9ssQTBaf9hNRtVKq4cyddfyQ9p0OZVARRo+h2TDyzb4jOyApAD3aGCBO2wiXuW98mMwGCVy+xELM2FiDpIYZi0MKcwWcXsSMaKqHBuOpIYcjZgRlYboz root@node01

  传输文件测试是否已免密:

[root@node01 ~]# scp /etc/profile root@192.168.88.102:~
profile                                                     100% 1819     2.0MB/s   00:00

  通过测试发现已无需输入密码即可进行文件传输,至此,免密流程结束。注意:免密操作是单方面的,如果希望 node02 操作 node01 也免密的话,需要将上述流程在 node02 机器上也做一次。

SSH 公钥检查

  SSH 公钥检查是一个重要的安全机制,可以防范中间人劫持等黑客攻击。但是在特定情况下,严格的 SSH 公钥检查会破坏一些依赖 SSH 协议的自动化任务,就需要一种手段能够绕过 SSH 的公钥检查。

  SSH 连接远程主机时,会检查主机的公钥。如果是第一次该主机,会显示该主机的公钥摘要,提示用户是否信任该主机,如下:

[root@node01 ~]# ssh root@node02
The authenticity of host 'node02 (192.168.88.102)' can't be established.
ECDSA key fingerprint is SHA256:U4EWd869KRKqbW0b2wROWkc7+i+dBW3WHgy+IILYDMI.
ECDSA key fingerprint is MD5:99:5a:c0:d8:e4:ec:73:fe:3c:f5:c0:b6:14:7f:d4:0f.
Are you sure you want to continue connecting (yes/no)? 

  当选择接受,就会将该主机的公钥追加到文件~/.ssh/known_hosts中。当再次连接该主机时,就不会再提示该问题了,因为每次远程登录 Linux 的时候,Linux 都要检查一下当前访问的计算机的公钥是不是在~/.ssh/know_hosts中,这个文件是 OpenSSH 记录的。当下次访问相同计算机时,OpenSSH 会核对公钥,如果公钥不同,OpenSSH 会发出警告,避免你受到 DNS Hijack 之类的攻击。

  所以在首次连接服务器时,会弹出公钥确认的提示,并且这会导致某些自动化任务由于初次连接服务器而任务中断。或者由于~/.ssh/known_hosts文件内容被清空,导致自动化任务中断。那怎么解决呢?继续往下看。

忽略主机名校验和 host 校验

  现在我们已经与 192.168.88.102 机器实现了免秘钥,但是每次都要输入 IP 属实有些麻烦,还好之前我们在 /etc/hosts 文件中已经添加了对应 IP 域名的映射,如下:

192.168.88.101 node01
192.168.88.102 node02

  那么我们以后便可以使用如下方式来进行通信:

[root@node01 ~]# ssh root@node02
The authenticity of host 'node02 (192.168.88.102)' can't be established.
ECDSA key fingerprint is SHA256:U4EWd869KRKqbW0b2wROWkc7+i+dBW3WHgy+IILYDMI.
ECDSA key fingerprint is MD5:99:5a:c0:d8:e4:ec:73:fe:3c:f5:c0:b6:14:7f:d4:0f.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'node02' (ECDSA) to the list of known hosts.
Last login: Tue May  3 17:37:48 2022 from 192.168.88.1

  虽然这次没有要求输入密码,但是烦人的提示信息又出现了。也不是说多敲一个 yes 有多累人,只是后期我们可能会使用脚本登入其他机器执行一些命令,这时候这个提示信息就会卡住脚本的执行,所以我们必须将其处理。

  解决方案:

  • 本次生效:ssh -o StrictHostKeyChecking=no root@node01
  • 永久生效:修改/etc/ssh/ssh_config文件的配置,在Host *节点下配置以下信息:
# 严格的密钥检查 no
StrictHostKeyChecking no
# 如果不希望生成已知主机列表文件,可以将已知主机列表文件信息写入黑洞(不会再生成 known_hosts 文件)
#UserKnownHostsFile /dev/null

  SSH 对主机公钥的检查等级是根据StrictHostKeyChecking变量来配置的,如下:

  • StrictHostKeyChecking=no:最不安全的级别,当然也没有那么多烦人的提示了,相对安全的内网建议使用。如果访问的计算机的公钥在本地不存在,会自动添加到文件中(默认是known_hosts),并且给出一个警告。
  • StrictHostKeyChecking=ask:默认的级别,就是出现刚才的提示。如果连接和公钥不匹配,给出提示,并拒绝登录。
  • StrictHostKeyChecking=yes:最安全的级别,如果连接和公钥不匹配,拒绝连接,不会提示详细信息。

  最终效果如下:

  这样以后再也不会弹出将该主机添加到当前设备的已知主机列表中的提示信息了。

  如果将已知主机列表文件信息写入了黑洞,那么远程访问时会弹出以下警告:

Warning: Permanently added 'node02,192.168.88.102' (ECDSA) to the list of known hosts.

  这个警告不影响任何操作,只是看着比较碍眼。解决办法:在文件夹~/.ssh/下创建config文件,命令如下:

vim ~/.ssh/config

  在新建的文件中写入如下内容:LogLevel=quiet

日期与时间

时间命令

  • 查看时区
    • ll /etc/localtime
      • /etc/localtime -> ../usr/share/zoneinfo/America/Los_Angeles
  • 设置时区
    • ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  • date
    • 查看当前系统时间
  • cal 查看日历
    • cal 2020
  • 修改时间
    • date -s 11:11:11
    • date -s 2019-11-11
    • date -s ‘2019-11-11 11:11:11’

日期自动同步

  • 首先安装时间同步的服务
  • yum -y install ntp
  • 自动同步网络时间中心
  • ntpdate cn.ntp.org.cn

用户-组-权限

用户

  useradd命令可以用来创建新的用户或更改用户的信息。帐号建好之后,再用passwd设定帐号的密码。使用useradd指令所建立的帐号,实际上是保存在/etc/passwd文本文件中。

  该命令基本格式如下:

[root@node01 ~]# useradd [选项] [用户名]

  选项:

  • -D:改变新建用户的预设值
  • -c:添加备注文字
  • -d:新用户每次登陆时所使用的家目录
  • -e:用户终止日期,日期的格式为 YYYY-MM-DD
  • -f:用户过期几日后永久停权。当值为 0 时用户立即被停权,而值为 -1 时则关闭此功能,预设值为 -1
  • -g:指定用户对应的用户组
  • -G:定义此用户为多个不同附属组的成员
  • -m:用户目录不存在时则自动创建
  • -M:不建立用户家目录,优先于 /etc/login.defs 文件设定
  • -n:取消建立以用户名称为名的群组
  • -r:建立系统帐号
  • -u:指定用户 id

  新增用户(默认会创建同名的组和家目录):

[root@node01 ~]# useradd zhangsan
[root@node01 ~]# ls /home/
zhangsan

  设置密码:

[root@node01 ~]# passwd zhangsan

  查看用户:

[root@node01 ~]# id zhangsan
uid=1000(zhangsan) gid=1000(zhangsan) groups=1000(zhangsan)

  或者:

[root@node01 ~]# cat /etc/passwd
# 用户名❌编号:组编号::家目录:命令目录
root❌0:0:root:/root:/bin/bash
bin❌1:1:bin:/bin:/sbin/nologin
daemon❌2:2:daemon:/sbin:/sbin/nologin
adm❌3:4:adm:/var/adm:/sbin/nologin
lp❌4:7:lp:/var/spool/lpd:/sbin/nologin
sync❌5:0:sync:/sbin:/bin/sync
shutdown❌6:0:shutdown:/sbin:/sbin/shutdown
halt❌7:0:halt:/sbin:/sbin/halt
mail❌8:12:mail:/var/spool/mail:/sbin/nologin
operator❌11:0:operator:/root:/sbin/nologin
games❌12💯games:/usr/games:/sbin/nologin
ftp❌14:50:FTP User:/var/ftp:/sbin/nologin
nobody❌99:99:Nobody:/:/sbin/nologin
systemd-network❌192:192:systemd Network Management:/:/sbin/nologin
dbus❌81:81:System message bus:/:/sbin/nologin
polkitd❌999:998:User for polkitd:/:/sbin/nologin
sshd❌74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix❌89:89::/var/spool/postfix:/sbin/nologin
ntp❌38:38::/etc/ntp:/sbin/nologin
zhangsan❌1000:1000::/home/zhangsan:/bin/bash

  查看用户和密码:

[root@node01 ~]# cat /etc/shadow
root:$6$OJ.nzd7e3KH03dE.$qHPy8tAxamIKiBVFx6kwoSmm8iKxC2dEAqIDyN5vOFFVrT3uXYQQOyeDhUsJTz1oBupwHezbx4k8JZrBv4lJN0::0:99999:7:::
bin:*:18353:0:99999:7:::
daemon:*:18353:0:99999:7:::
adm:*:18353:0:99999:7:::
lp:*:18353:0:99999:7:::
sync:*:18353:0:99999:7:::
shutdown:*:18353:0:99999:7:::
halt:*:18353:0:99999:7:::
mail:*:18353:0:99999:7:::
operator:*:18353:0:99999:7:::
games:*:18353:0:99999:7:::
ftp:*:18353:0:99999:7:::
nobody:*:18353:0:99999:7:::
systemd-network:!!:19113::::::
dbus:!!:19113::::::
polkitd:!!:19113::::::
sshd:!!:19113::::::
postfix:!!:19113::::::
ntp:!!:19148::::::
zhangsan:$6$o1vesFCG$RG6Z5H92mEaGdivBMlAdga9qHoERElMF1Uz0cjOB1Rx/Lop.SLoLJ5JQdZd5LI0HGxyiARQ0rtYyzDlBJc.OS1:19116:0:99999:7:::

  修改用户:

# 修改用户名(组名称和家目录是不会被修改的)
usermod -l newname oldname
# 锁定用户(禁止登录)
usermod -L zs
# 解锁用户
usermod -U zs

  删除用户(默认会删除组和家目录):

userdel -r zs

  添加新用户 lisi,设置家目录为 /tmp/lisi ,用户过期时间为 2022/06/01 过期后两天停权:

[root@node01 ~]# useradd -e '2022/06/01' -f 2 -d /tmp/lisi lisi

  添加用户并指定组:

[root@node01 ~]# useradd -g zhangsan zhangsan

  添加用户并指定附属组:

[root@node01 ~]# useradd zhangsan -g zhangsan -G zs,zhangs

  切换用户:

[root@node01 ~]# su - lisi

注意:使用 su 命令时,有 - 和没有 - 是完全不同的,- 选项表示在切换用户身份的同时,连当前使用的环境变量也切换成指定用户的。我们知道,环境变量是用来定义操作系统环境的,因此如果系统环境没有随用户身份切换,很多命令无法正确执行。

举个例子,普通用户 zhangsan 通过 su 命令切换成 root 用户,但没有使用 - 选项,这样情况下,虽然看似是 root 用户,但系统中的 $PATH 环境变量依然是 zhangsan 的(而不是 root 的),因此当前工作环境中,并不包含 /sbin、/usr/sbin 等超级用户命令的保存路径,这就导致很多管理员命令根本无法使用。不仅如此,当 root 用户接受邮件时,会发现收到的是 zhangsan 用户的邮件,因为环境变量 $MAIL 也没有切换。

  groupadd命令用于创建一个新的工作组,新工作组的信息将被添加到系统文件中。

  创建组:

[root@node01 ~]# groupadd java

  修改组:

[root@node01 ~]# groupmod -n newgroup oldgroup
[root@node01 ~]# groupmod -n bigdata java

  查看用户对应的组:

# 查看当前用户对应的组
[root@node01 ~]# groups
root
# 查看其他用户对应的组
[root@node01 ~]# groups zhangsan
zhangsan : zhangsan

  修改用户的组:

# -g 修改主组(只能一个)
[root@node01 ~]# usermod zhangsan -g bigdata
[root@node01 ~]# groups zhangsan
zhangsan : bigdata
# -G 修改附属组(可以多个)
[root@node01 ~]# groupadd c
[root@node01 ~]# groupadd python
[root@node01 ~]# usermod zhangsan -G c,python
[root@node01 ~]# groups zhangsan
zhangsan : bigdata python c

  删除组:

[root@node01 ~]# groupdel python

权限

[root@node01 ~]# ll /
total 16
lrwxrwxrwx.   1 root root    7 May  1 21:18 bin -> usr/bin
dr-xr-xr-x.   5 root root 4096 May  1 21:22 boot
drwxr-xr-x   20 root root 3220 May  2 10:52 dev
drwxr-xr-x.  74 root root 8192 May  2 11:40 etc
drwxr-xr-x.   2 root root    6 Apr 11  2018 home
lrwxrwxrwx.   1 root root    7 May  1 21:18 lib -> usr/lib
lrwxrwxrwx.   1 root root    9 May  1 21:18 lib64 -> usr/lib64
drwxr-xr-x.   2 root root    6 Apr 11  2018 media
drwxr-xr-x.   2 root root    6 Apr 11  2018 mnt
drwxr-xr-x.   2 root root    6 Apr 11  2018 opt
dr-xr-xr-x  109 root root    0 May  2 10:52 proc
dr-xr-x---.   2 root root  135 May  2 14:50 root
drwxr-xr-x   22 root root  620 May  2 10:52 run
lrwxrwxrwx.   1 root root    8 May  1 21:18 sbin -> usr/sbin
drwxr-xr-x.   2 root root    6 Apr 11  2018 srv
dr-xr-xr-x   13 root root    0 May  2 17:45 sys
drwxrwxrwt.   7 root root  132 May  2 11:47 tmp
drwxr-xr-x.  13 root root  155 May  1 21:18 usr
drwxr-xr-x.  19 root root  267 May  1 21:25 var

  前面我们提到过,在文件的详细信息中显示的这 7 列含义分别如下:

  • 第 1 列:规定了不同的用户对文件所拥有的权限,第 1 列的第一个字符又表示了当前文件的类型:
    • -:普通文件
    • d:文件夹
    • l:软链接
  • 第 2 列:引用计数,文件的引用计数代表该文件的硬链接个数,而目录的引用计数代表该目录有多少个一级子目录。
  • 第 3 列:所有者,也就是这个文件属于哪个用户。默认所有者是文件的建立用户。
  • 第 4 列:所属组,默认所属组是文件建立用户的有效组,一般情况下就是建立用户的所在组。
  • 第 5 列:文件大小,默认单位是字节。
  • 第 6 列:文件修改时间,文件状态修改或文件数据修改时间都会更改,注意这个时间不是文件的创建时间。
  • 第 7 列:文件名或目录名,如果是软链接会显示软链接真正的地址。

  这里面第 1 列中的权限信息,完整如下图:

将 rwx 看做二进制数,有权限表示 1,没有表示 0。那么 rwx 就可以表示为:111,二进制 111 就是十进制 7。

  第 1 列信息被分为四部分,分别是:

  • 文件的类型:第 1 个字符。
  • 文件所有者的权限:第 2~4 个字符,分别对应rwx,没有权限用-表示。
  • 文件所属组用户的权限:第 5 ~ 7 个字符,分别对应rwx,没有权限用-表示。
  • 其他用户的权限:第 8~10 个字符,分别对应rwx,没有权限用-表示。

  这一小节我们就来学习一下如何修改权限相关信息。

修改权限

修改文件所属信息

  权限分别对应了用户、组、其他,那我们就可以直接修改文件所属信息来达到权限的控制。

  修改文件所属用户和组信息命令为:chown 用户:组 文件名

[root@node01 ~]# ll file1.txt
# root 用户可以读写,root 组用户可以读,其他用户可以读
-rw-r--r-- 1 root root 17 May  3 14:55 file1.txt

[root@node01 ~]# chown zhangsan file1.txt
[root@node01 ~]# ll file1.txt
# zhangsan 用户可以读写,root 组用户可以读,其他用户可以读
-rw-r--r-- 1 zhangsan root 17 May  3 14:55 file1.txt

[root@node01 ~]# chown zhangsan:bigdata file1.txt
[root@node01 ~]# ll file1.txt
# zhangsan 用户可以读写,bigdata 组用户可以读,其他用户可以读
-rw-r--r-- 1 zhangsan bigdata 17 May  3 14:55 file1.txt

# 修改文件夹时,-R 让子目录迭代修改
[root@node01 ~]# chown -R zhangsan:bigdata t1/
[root@node01 ~]# ll -d t1/
# zhangsan 用户可以读写执行,bigdata 组用户可以读执行,其他用户可以读执行
drwxr-xr-x 3 zhangsan bigdata 16 May  3 14:15 t1/
UGO 模型

  UGO 模型分别表示 User 用户、Group 组用户、Other 其他用户。通过修改 UGO 可以直接确定当前文件在不同模型下所对应的具体权限。修改命令如下:

[root@node01 ~]# ll file2.txt 
-rw-r--r-- 1 root root 16 May  3 11:33 file2.txt
[root@node01 ~]# chmod u+x file2.txt
[root@node01 ~]# ll file2.txt 
-rwxr--r-- 1 root root 16 May  3 11:33 file2.txt

[root@node01 ~]# chmod go+wx file2.txt
[root@node01 ~]# ll file2.txt 
-rwxrwxrwx 1 root root 16 May  3 11:33 file2.txt

[root@node01 ~]# chmod ugo-wx file2.txt
[root@node01 ~]# ll file2.txt 
-r--r--r-- 1 root root 16 May  3 11:33 file2.txt

  通过以上操作可以实现对文件不同权限模型进行具体的修改,但是有些时候使用起来还是有些麻烦。看下面这个例子:

[root@node01 ~]# ll file2.txt 
-rwxrwxrwx 1 root root 16 May  3 11:33 file2.txt

  比如我们的需求是移除 GO 的写和执行权限保留读权限,移除 U 的执行权限保留读和写的权限。这样就需要我们至少写两遍该命令:

  • 先移除 UGO 写和执行权限,然后给 U 添加写权限。
  • 或者先移除 GO 写和执行权限,然后再移除 U 执行权限。

  这时候我们就可以使用 777 模型来设置权限。

777 模型

  Linux 做了一个非常巧妙的设计,把权限 rwx 分别对应数字 4 2 1,这样一来权限就拥有了以下组合:

  • 0 = ---
  • 1 = --x
  • 2 = -w-
  • 3 = -wx
  • 4 = r--
  • 5 = r-x
  • 6 = rw-
  • 7 = rwx

  以上只代表一组权限,权限被分为 3 组,如果 3 组权限都是读写执行的话,就是 777 了。这就是所谓的 777 模型。

  再回头看刚才的需求,我们只需要一次命令即可搞定,如下:

[root@node01 ~]# chmod 644 file2.txt
[root@node01 ~]# ll file2.txt 
-rw-r--r-- 1 root root 16 May  3 11:33 file2.txt

赋予权限

  在某些情况下我们可以赋予普通用户一些超级用户的命令,例如创建用户的命令我们可以交给一个特定的用户去操作。但是默认情况下是不允许的,因为这个命令属于sbin命令即超级用户才可以使用的命令。

[zhangsan@node01 ~]$ whereis useradd
useradd: /usr/sbin/useradd /usr/share/man/man8/useradd.8.gz

  怎么解决这个问题呢?可以通过修改/etc/sudoers配置文件的方式来赋予普通用户这个权限。注意:修改这个文件需要使用命令visudo打开。添加如下图红色框中内容:

  以上配置支持通配符*,如果想赋予更多权限/sbin/user*或者/sbin/*即可。

  然后 zhangsan 用户就可以使用 useradd 来创建用户了,但是需要在命令前添加sudo,如下:

[zhangsan@node01 ~]$ sudo useradd test
[sudo] password for zhangsan: 
[zhangsan@node01 ~]$ ls /home/
test  zhangsan

管道与重定向

管道

  管道|就是将前面命令的结果作为参数传递给后面的命令,例如:

[root@node01 ~]# ping -c 1 baidu.com | grep from | cut -d ' ' -f 4
220.181.38.251

[root@node01 ~]# head -10 anaconda-ks.cfg | tail -3
# Run the Setup Agent on first boot
firstboot --enable
ignoredisk --only-use=sda

重定向

  Linux 中的重定向就是将原本要输出到屏幕中的数据,重新指向某个特定的文件中,或者定向到黑洞(/dev/null)中。

默认的输入设备(标准输入)—— 键盘

默认的输出设备(标准输出/错误输出)—— 屏幕

  简单的理解就是:利用重定向操作符重新定义命令涉及的默认的输入和输出设备对象,即利用重定向操作符将命令输入和输出数据流从默认设备重定向到其他位置。

  重定向有什么用呢?

  • 当程序执行输出的信息比较多时,需要保存下来在进行分页查看。
  • 后台执行的程序一般都会有输出,不希望它输出干扰到终端。
  • 执行定时的备份任务,希望备份的结果保留下来时。
  • 当重复创建用户,会提示一些错误信息,可以直接将信息丢弃。
  • 希望将错误日志与正确日志,分别输出保存到不同文件时。

  在 Linux 系统中,有标准输入,标准输出和错误输出,分别对应 0,1,2 这三个文件描述符,在每个进程诞生之际就伴随其左右,通过以下命令就能看出来:

[root@node01 ~]# ll /proc/$$/fd
total 0
lrwx------ 1 root root 64 May  4 10:21 0 -> /dev/pts/0
lrwx------ 1 root root 64 May  4 10:21 1 -> /dev/pts/0
lrwx------ 1 root root 64 May  4 10:21 2 -> /dev/pts/0
lrwx------ 1 root root 64 May  4 15:13 255 -> /dev/pts/0
名称 文件描述符 作用
标准输入(STDIN) 0 默认是键盘,也可以是文件或其他命令的输出
标准输出(STDOUT) 1 默认输出到屏幕
错误输出(STDERR) 2 默认输出到屏幕
文件名称(filename) 3+

  所以,当我们执行命令时,标准输出的内容默认都会输出到屏幕中,例如:

[root@node01 ~]# ls /usr/local/
bin  etc  games  include  lib  lib64  libexec  sbin  share  src
[root@node01 ~]# ping baidu.com
PING baidu.com (220.181.38.148) 56(84) bytes of data.
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=1 ttl=128 time=33.6 ms
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=2 ttl=128 time=33.2 ms

  当然错误输出也一样:

[root@node01 ~]# ls /ete
ls: cannot access /ete: No such file or directory

输出重定向

  如果想收集这些内容或者不希望它输出干扰到终端,可以使用重定向将其进行处理:

  • >:将输出内容追加到目标文件,如果文件不存在,就创建文件;如果文件存在,就将其清空。例如:echo > .bash_history,将文件内容清空(文件大小变成 0 字节)。
  • >>:将输出内容追加到目标文件,如果文件不存在,就创建文件;如果文件存在,则将新的内容追加到文件末尾,该文件中的原有内容不受影响。

  例如:

[root@node01 ~]# ping -c 5 baidu.com >> baidu.txt
[root@node01 ~]# cat baidu.txt 
PING baidu.com (220.181.38.251) 56(84) bytes of data.
64 bytes from 220.181.38.251 (220.181.38.251): icmp_seq=1 ttl=128 time=32.9 ms
64 bytes from 220.181.38.251 (220.181.38.251): icmp_seq=2 ttl=128 time=33.7 ms
64 bytes from 220.181.38.251 (220.181.38.251): icmp_seq=3 ttl=128 time=33.7 ms
64 bytes from 220.181.38.251 (220.181.38.251): icmp_seq=4 ttl=128 time=36.6 ms
64 bytes from 220.181.38.251 (220.181.38.251): icmp_seq=5 ttl=128 time=31.6 ms

--- baidu.com ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4047ms
rtt min/avg/max/mdev = 31.693/33.765/36.672/1.634 ms

[root@node01 ~]# ls /usr/local/ 1> usr_local.txt
[root@node01 ~]# cat usr_local.txt 
bin
etc
games
include
lib
lib64
libexec
sbin
share
src

  错误信息需要指定文件描述符,因为默认的文件描述符是 1:

[root@node01 ~]# ls /ete > error.txt
ls: cannot access /ete: No such file or directory
[root@node01 ~]# ls /ete 2> error.txt
[root@node01 ~]# cat error.txt 
ls: cannot access /ete: No such file or directory

  如果我既要收集正确的也要收集错误的,怎么使用呢?

[root@node01 ~]# ls /etc/ /ete > test.txt 2>&1

  输出到黑洞:

[root@node01 ~]# ls /etc /abc > /dev/null 2>&1

输入重定向

  输入重定向是指不使用系统提供的标准输入端口,而进行重新的指定。一般是将输入的内容重定向到文件中。

  语法:<(等价 0<),将输入内容追加到目标文件。

  例如:

# 使用 /etc/passwd 文件作为输入端,并通过 grep 匹配 root 相关信息,将匹配结果输出至屏幕
[root@node01 ~]# grep root < /etc/passwd
root❌0:0:root:/root:/bin/bash
operator❌11:0:operator:/root:/sbin/nologin

# 使用 /etc/passwd 文件作为输入端,并通过 grep 匹配 root 相关信息,将匹配结果覆盖输出至文件
[root@node01 ~]# grep root > /root/grep_test.txt < /etc/passwd
[root@node01 ~]# grep root > /root/grep_test.txt < /etc/passwd
[root@node01 ~]# cat grep_test.txt 
root❌0:0:root:/root:/bin/bash
operator❌11:0:operator:/root:/sbin/nologin

# 使用 /etc/passwd 文件作为输入端,并通过 grep 匹配 root 相关信息,将匹配结果追加输出至文件
[root@node01 ~]# grep root >> /root/grep_test.txt < /etc/passwd
[root@node01 ~]# cat grep_test.txt 
root❌0:0:root:/root:/bin/bash
operator❌11:0:operator:/root:/sbin/nologin
root❌0:0:root:/root:/bin/bash
operator❌11:0:operator:/root:/sbin/nologin

# 使用键盘作为输入端,并通过 grep 匹配 root 相关信息,将匹配结果追加输出至文件
# EOF 表示 End of File,表示文件结尾。EOF 可以为任意字符,如果希望停止输入,可以再次输入 EOF
[root@node01 ~]# grep root >> /root/grep_test.txt << EOF
> root
> zhangsan
> lisi
> EOF
[root@node01 ~]# cat grep_test.txt 
root❌0:0:root:/root:/bin/bash
operator❌11:0:operator:/root:/sbin/nologin
root❌0:0:root:/root:/bin/bash
operator❌11:0:operator:/root:/sbin/nologin
root

# 也可以使用提前编辑好的内容作为输入端,例如以下为使用输入重定向配置 Nginx 系统服务
cat > /usr/lib/systemd/system/nginx.service << EOF
[Unit]
Description=Nginx
Documentation=https://nginx.org/
After=network.target

[Service]
Type=forking
PIDFile=/opt/bd/nginx/logs/nginx.pid
ExecStartPre=/opt/bd/nginx/sbin/nginx -t
ExecStart=/opt/bd/nginx/sbin/nginx
ExecReload=/opt/bd/nginx/sbin/nginx -s reload
ExecStop=/opt/bd/nginx/sbin/nginx -s quit
Restart=no
PrivateTmp=true

[Install]
WantedBy=multi-user.target
EOF

Linux的系统进程

进程信息

  • ps -ef
    • UID PID PPID C STIME TTY TIME CMD
    • UID 所属用户
    • PID 当前进程编号
    • PPID 当前进程编号的父进程编号
  • ps -ef | grep redis
  • ps -aux
    • 所有信息
  • ps -aux –sort -pcpu
  • top
    • 当前服务器内存使用率

后台进程

  只需要在命令的后面添加一个&符号即可将进程切换为后台执行,例如:

[root@node01 ~]# ping www.baidu.com >> baidu.txt &
[1] 2513
[root@node01 ~]# tail -f baidu.txt 
64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=2 ttl=128 time=15.3 ms
64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=3 ttl=128 time=11.5 ms
64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=4 ttl=128 time=12.2 ms
64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=5 ttl=128 time=12.7 ms
64 bytes from 36.152.44.95 (36.152.44.95): icmp_seq=6 ttl=128 time=10.7 ms

  查看当前用户开启的后台进程:

[root@node01 ~]# jobs -l
[1]+  2513 Running                 ping www.baidu.com >> baidu.txt &

  以上方式开启的后台进程,当退出终端时进程就一并结束了。可以使用nohup命令防止后台进程被挂起,nohup 英文全称 no hang up(不挂起),用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。

[root@node01 ~]# nohup ping www.baidu.com >> baidu.txt 2>&1 &
[1] 2577

注意:需要配合 2>&1 来使用,否则 nohup: ignoring input and redirecting stderr to stdout。简单的理解就是,错误信息会被输出到屏幕。

杀死进程

  • kill -9 17599

Linux的软件安装

环境变量

  设置环境变量有几种方式:

  • profile(/etc/profile)

    • 用于设置系统级的环境变量和启动程序,在这个文件下配置会对所有用户生效。
    • 当用户登录(login)时,文件会被执行,并从/etc/profile.d目录的配置文件中查找 shell 设置。
    • Linux 每次修改完成之后,需要重新加载文件 source /etc/profile
  • 自定义环境变量脚本(/etc/profile.d)

    • /etc/profile.d目录下新增.sh格式的自定义环境变量文件
  • bashrcbash_profile

    • bashrc文件只会对指定的shell类型起作用

    • 系统级的位于/etc/bashrc,对所有用户生效

    • 用户级的~/.bashrc,对当前用户生效。

    • 文件存储于~/.bash_profile,该文件是一个用户级的设置,可以理解为某一个用户的 profile 目录下。

    • 这个文件同样也可以用于配置环境变量和启动程序,但只针对单个用户有效。

  • shell

    • 不赞成使用这种方法,因为换个 Shell,你的设置就无效了,因此这种方法仅仅是临时使用,以后要使用的时候又要重新设置,比较麻烦
  • 例如:

    • 当我们执行一个命令的时候,默认从当前路径开始查找
    • 如果当前路径找不到对应的命令文件,从环境变量$PATH查找
    • $PATH的配置文件在 /etc/profile
      • window 路径与路径之间用;(分号)连接
      • Linux 路径与路径之间用:(冒号)连接
  • 常见的环境变量

PATH:决定了shell将到哪些目录中寻找命令或程序
HOME:当前用户主目录
MAIL:是指当前用户的邮件存放目录。
SHELL:是指当前用户用的是哪种Shell。
HISTSIZE:是指保存历史命令记录的条数。
LOGNAME:是指当前用户的登录名。
HOSTNAME:是指主机的名称,许多应用程序如果要用到主机名的话,通常是从这个环境变量中来取得的。
LANG/LANGUGE:是和语言相关的环境变量,使用多种语言的用户可以修改此环境变量。

安装方式

  软件的安装方式大致分为以下几种:

  • 使用安装包安装。
    • RedHat/CentOS:rpm
    • Debain/Ubuntu:deb
    • Windows:.exe.msi
    • macOS:dmg
  • 绿色版软件,解压即安装,解压就可以使用。
  • 使用yum命令安装,例如yum install wget
  • 使用源码编译安装,例如:Redis、Nginx 等。

rpm

  rpm命令来自于英文语句 “RedHat Package Manager” 的缩写,中文译为红帽软件包管理器,其功能是用于在 Linux/RedHat 系列系统下对软件包进行安装、卸载、查询、验证、升级等工作。

  该命令基本格式如下:

[root@node01 ~]# rpm [选项] 软件包

  常用选项:

  • -a:查询所有的软件包
  • -b-t:设置包装套件的完成阶段,并指定套件档的文件名称
  • -c:只列出组态配置文件,本参数需配合 -l 参数使用
  • -d:只列出文本文件,本参数需配合 -l 参数使用
  • -e:卸载软件包
  • -f:查询文件或命令属于哪个软件包
  • -h:安装软件包时列出标记
  • -i:安装软件包
  • -l:显示软件包的文件列表
  • -p:查询指定的rpm软件包
  • -q:查询软件包
  • -R:显示软件包的依赖关系
  • -s:显示文件状态,本参数需配合 -l 参数使用
  • -U:升级软件包
  • -v:显示命令执行过程
  • -vv:详细显示指令执行过程

  以 JDK 为例,准备好 RPM 包jdk-8u351-linux-x64.rpm,可以去官网自己下载然后上传至服务器,或直接使用wget命令下载至服务器。

  安装软件包并显示安装过程:

[root@node01 ~]# rpm -ivh jdk-8u351-linux-x64.rpm 
warning: jdk-8u351-linux-x64.rpm: Header V3 RSA/SHA256 Signature, key ID ec551f03: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:jdk1.8-2000:1.8.0_351-fcs        ################################# [100%]
Unpacking JAR files...
	tools.jar...
	plugin.jar...
	javaws.jar...
	deploy.jar...
	rt.jar...
	jsse.jar...
	charsets.jar...
	localedata.jar...

[root@node01 ~]# java -version
java version "1.8.0_351"
Java(TM) SE Runtime Environment (build 1.8.0_351-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.351-b10, mixed mode)

  显示系统已安装过的全部 RPM 软件包:

[root@node01 ~]# rpm -qa

  配合管道符查询指定软件的 RPM 软件包:

[root@node01 ~]# rpm -qa | grep jdk
jdk1.8-1.8.0_351-fcs.x86_64

  查询某个软件的安装路径:

[root@node01 ~]# rpm -ql jdk1.8-1.8.0_351-fcs.x86_64

  卸载某个通过 RPM 软件包安装的服务:

[root@node01 ~]# rpm -evh jdk1.8-1.8.0_351-fcs.x86_64

  升级某个软件包:

[root@node01 ~]# rpm -Uvh jdk-8u351-linux-x64.rpm 

注意:待安装的 rpm 包所需的系统环境需提前安装好,否则安装 rpm 包时会报错。

压缩包

  以 Tomcat 为例,准备好压缩包apache-tomcat-9.0.72.tar.gz,可以去官网自己下载然后上传至服务器,或直接使用wget命令下载至服务器。

  创建目录:

[root@node01 ~]# mkdir -p /opt/yjx/tomcat

  解压至指定目录:

[root@node01 ~]# tar -zxf apache-tomcat-9.0.72.tar.gz -C /opt/yjx/

  这种方式需要自己配置环境变量,编辑环境变量文件:

[root@node01 ~]# vim /etc/profile

  在环境变量文件中添加以下信息:

export TOMCAT_HOME=/opt/yjx/apache-tomcat-9.0.72
export PATH=$TOMCAT_HOME/bin:$PATH

  重新加载环境变量文件:

[root@node01 ~]# source /etc/profile
[root@node01 ~]# version.sh 
Using CATALINA_BASE:   /opt/yjx/apache-tomcat-9.0.72
Using CATALINA_HOME:   /opt/yjx/apache-tomcat-9.0.72
Using CATALINA_TMPDIR: /opt/yjx/apache-tomcat-9.0.72/temp
Using JRE_HOME:        /usr/java/jdk1.8.0_351-amd64
Using CLASSPATH:       /opt/yjx/apache-tomcat-9.0.72/bin/bootstrap.jar:/opt/yjx/apache-tomcat-9.0.72/bin/tomcat-juli.jar
Using CATALINA_OPTS:   
Server version: Apache Tomcat/9.0.72
Server built:   Feb 18 2023 09:25:13 UTC
Server number:  9.0.72.0
OS Name:        Linux
OS Version:     3.10.0-1160.el7.x86_64
Architecture:   amd64
JVM Version:    1.8.0_351-b10
JVM Vendor:     Oracle Corporation

yum

  yum命令是基于 RPM 的软件包管理器,它可以使系统管理人员交互和自动化地更新与管理 RPM 软件包,能够从指定的服务器自动下载 RPM 包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载、安装。

  yum 提供了查找、安装、删除某一个、一组甚至全部软件包的命令,而且命令简洁而又好记。该命令基本格式如下:

[root@node01 ~]# yum [选项]

  常用选项:

  • -h:显示帮助信息
  • -y:对所有的提问都回答“yes”
  • -c:指定配置文件
  • -q:安静模式
  • -v:详细模式
  • -t:检查外部错误
  • -d:设置调试等级(0-10)
  • -e:设置错误等级(0-10)
  • -R:设置yum处理一个命令的最大等待时间
  • -C:完全从缓存中运行,而不去下载或者更新任何头文件
  • install:安装rpm软件包
  • update:更新rpm软件包
  • check-update:检查是否有可用的更新rpm软件包
  • remove:删除指定的rpm软件包
  • list:显示软件包的信息
  • search:检查软件包的信息
  • info:显示指定的rpm软件包的描述信息和概要信息
  • clean:清理yum过期的缓存
  • shell:进入yum的shell提示符
  • resolvedep:显示rpm软件包的依赖关系
  • localinstall:安装本地的rpm软件包
  • localupdate:显示本地rpm软件包进行更新
  • deplist:显示rpm软件包的所有依赖关系
替换 yum 源

  由于yum是自动帮我们下载并安装软件,所以我们最关心的就是资源的源头在哪,如果在国外那漂洋过海的去下载岂不是很慢。而 CentOS 默认的 yum 源基本都在国外,导致 yum 在线安装及更新速度很慢。为了解决这个问题,国内一些大公司搭建了自己的开源镜像站并且开源免费供大家使用,比如阿里和网易的,下面我们着重介绍一下国内 yum 源如何使用。

  请先确保自己安装了wget,如未安装请先运行yum -y install wget命令进行安装。

# 查看 wget
yum list wget
# 若未安装请运行以下命令安装
yum -y install wget

  优秀的程序员修改东西一定要养成备份的习惯,备份以后就可以大胆的进行尝试了。首先备份系统自带 yum 源配置文件/etc/yum.repos.d/CentOS-Base.repo

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

  然后根据对应的 CentOS 版本,运行以下命令下载阿里 yum 源或者网易 yum 源至 yum 源配置文件存放目录。

# 阿里 yum 源
# CentOS 8
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo
# CentOS 7
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# CentOS 6
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
# CentOS 5
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-5.repo

# 网易 yum 源
# CentOS 8
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.163.com/.help/CentOS8-Base-163.repo
# CentOS 7
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo
# CentOS 6
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.163.com/.help/CentOS6-Base-163.repo
# CentOS 5
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.163.com/.help/CentOS5-Base-163.repo

  yum 会将下载的软件包文件 rpm 和软件头文件 header 存放在硬盘缓存中,如果觉得占用磁盘空间,可以将这些内容进行清除以释放磁盘空间。由于已经切换成为国内 yum 源,所以我们将之前缓存的文件都清除一下,然后重新生成缓存。

# 清除头文件
yum clean headers
# 清除包文件
yum clean packages
# 清除所有文件,包括头文件和包文件
yum clean all
# 生成缓存,将服务器上的软件包信息先在本地进行缓存,以提高搜索和安装软件的速度
yum makecache

  完成以上操作以后,就可以愉快的在线下载并安装资源了。

安装 rpm 包

  安装 rpm 包:

yum [-y] install [rpm包名]
yum -y install net-tools
yum -y install oracle-database-ee-21c-1.0-1.ol8.x86_64.rpm

提示:yum install 命令配合 rpm 文件安装,会将安装 rpm 包时缺失的其他依赖包一并安装。

  卸载 rpm 包:

yum [-y] remove [rpm包名]

  升级 rpm 包:

yum [-y] update [rpm包]

源码

  通过源码安装也是 Linux 比较常见的一种方式,只不过是这几种安装方式里最麻烦的一种。我们就拿 Nginx 举例带大家走一遍流程。

  首先去 Nginx 官网下载源码包并上传至服务器,或者直接使用wget下载至服务器。

wget https://nginx.org/download/nginx-1.24.0.tar.gz

  Nginx 是基于 C 语言开发的,HTTP 模块使用了 pcre 来解析正则表达式,且可以使用 zlib 对 HTTP 包的内容进行 gzip 压缩,Nginx 不仅支持 HTTP 协议,还支持 HTTPS,HTTPS 需要 openssl 提供支持,所以安装 Nginx 之前必须先安装它所依赖的环境。

yum -y install gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl-devel

  解压:

tar -zxvf nginx-1.24.0.tar.gz

  使用源码安装需要先编译再安装:

# 切换至 nginx 的解压目录
cd nginx-1.24.0
# 创建 nginx 的安装目录
mkdir -p /opt/yjx/nginx
# 配置 nginx 的安装目录
./configure --prefix=/opt/yjx/nginx/
# 编译并安装
make && make install

Nginx 运行时默认加载的配置文件为nginx.conf,根据不同的安装方式存放的位置也不相同。

yum 安装的方式会存放在/etc/nginx/nginx.conf

刚才的安装方式会存放在/opt/yjx/nginx/conf/nginx.conf

  Nginx 常用命令:

# 切换目录
[root@node01 ~]# cd /opt/yjx/nginx/
# 帮助
[root@node01 nginx]# sbin/nginx -h
# 查看版本
[root@node01 nginx]# sbin/nginx -v 或者 -V
# 检测配置文件是否有语法错误,默认检测 conf/nginx.conf
[root@node01 nginx]# sbin/nginx -t -c /opt/yjx/nginx/conf/nginx.conf
# 启动并通过 -c 指定启动时加载的配置文件,默认加载 conf/nginx.conf
[root@node01 nginx]# sbin/nginx -c /opt/yjx/nginx/conf/nginx.conf
# 平滑的重启,重新加载配置
[root@node01 nginx]# sbin/nginx -s reload
# 完整有序的停止
[root@node01 nginx]# sbin/nginx -s quit
# 快速停止
[root@node01 nginx]# sbin/nginx -s stop

  启动 Nginx 以后,浏览器访问:http://192.168.100.101:80/ 结果如下:

  以 Tomcat 为例,Nginx 配置反向代理负载均衡案例如下。

  • 负载均衡(Load Balance)是由多台服务器以对称的方式组成一个服务器集群,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助。经过某种负载分管技术,将外部发送来的中央请求均匀分配到对称结构中的某一台服务器上。
  • 正向代理(forward proxy):是一个位于客户端和目标服务器之间的服务器(代理服务器),为了从目标服务器取得内容,客户端向代理服务器发送一个请求并指定目标,然后代理服务器向目标服务器转交请求并将获得的内容返回给客户端。比如国内访问谷歌,直接访问是不行的,我们可以通过一个能够访问谷歌的正向代理服务器,请求发到代理服务器,由代理去谷歌获取数据并返回,这样就变相的实现了访问谷歌的需求。
  • 反向代理(Reverse Proxy):与正向代理正好相反,反向代理中的代理服务器,代理的是服务器那端。代理服务器接收客户端请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给客户端,此时代理服务器对外表现为一个反向代理服务器的角色。反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。

  总结:

  • 正向代理,就是代理服务器代理了客户端,去和目标服务器进行交互。现实生活中的场景:黄牛买票。
  • 反向代理,就是代理服务器代理了目标服务器,去和客户端进行交互。现实生活中的场景:房屋中介。

系统服务

  对于 Linux 而言,可以使用 systemd 添加系统服务,甚至还可以设置为开机自启服务。systemd 是目前 Linux 系统上主要的系统守护进程管理工具,由于 init(/etc/rc.d/init.d/) 一方面对于进程的管理是串行化的,容易出现阻塞情况,另一方面 init 也仅仅是执行启动脚本,并不能对服务本身进行更多的管理。所以从 CentOS 7 开始也由 systemd 取代了 init 作为默认的系统进程管理工具。

  systemd 所管理的所有系统资源都称作 Unit,通过 systemd 命令集可以方便的对这些 Unit 进行管理。比如 systemctl、hostnamectl、timedatectl、localctl 等命令,这些命令虽然改写了 init 时代用户的命令使用习惯(不再使用 chkconfig、service 等命令),但确实也提供了很大的便捷性。

  systemd 是内核启动后的第一个用户进程,PID 为 1,是所有其它用户进程的父进程。

[root@node01 ~]# ps -ef
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 14:50 ?        00:00:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 22

特点

  • 最新系统都采用 systemd 管理(RedHat7,CentOS7,Ubuntu15,…);
  • CentOS7 支持开机并行启动服务,显著提高开机启动效率;
  • CentOS7 关机只关闭正在运行的服务,而 CentOS6,全部都关闭一次;
  • CentOS7 服务的启动与停止不再使用脚本进行管理,也就是 /etc/rc.d/init.d 下不在有脚本;
  • CentOS7 使用 systemd 解决原有模式缺陷,比如原有 service 不会关闭程序产生的子进程。

语法

  systemctl [command] [unit](配置的服务名称)

  • start:启动指定的 Unit,例如systemctl start nginx
  • stop:关闭指定的 Unit,例如systemctl stop nginx
  • restart:重启指定的 Unit,例如systemctl restart nginx
  • reload:重载指定的 Unit,例如systemctl reload nginx
  • enable:系统开机时自动启动指定的 Unit,例如systemctl enable nginx
  • disable:系统开机时不自动运行指定的 Unit,例如systemctl disable nginx
  • status:查看指定的 Unit 当前运行状态,例如systemctl status nginx

服务目录说明

# 系统管理员安装的单元, 优先级更高
/etc/systemd/system/*
# 运行时动态创建unit文件的目录
/run/systemd/system/*
# 系统或第三方软件安装时添加的配置文件。存放 systemctl 脚本
/usr/lib/systemd/system/*

  CentOS 7 的服务 systemctl 脚本存放在:/usr/lib/systemd/,有系统和用户之分,即:/usr/lib/systemd/system 和 /usr/lib/systemd/user。

  • 每一个 Unit 都需要有一个配置文件用于告知 systemd 对于服务的管理方式;
  • 配置文件存放于 /usr/lib/systemd/system/ ,设置开机启动后会在 /etc/systemd/system 目录建立软链接文件;
  • 每个 Unit 的配置文件配置默认后缀名为 .service;
  • 在 /usr/lib/systemd/system/ 目录中分为 system 和 user 两个目录,一般将开机不登陆就能运行的程序存在系统服务里,也就是 /usr/lib/systemd/system;
  • 配置文件使用方括号分成了多个部分,并且区分大小写。

服务配置说明

  每一个服务以.service结尾,一般会分为三个部分:[Unit]、[Service] 和 [Install]。

  [Unit]:记录 Unit 文件的通用信息,主要是对这个服务的说明,内容,文档介绍以及对一些依赖服务定义。

  • Description:服务的描述。
  • Documentation :服务的文档。
  • Requires:当前 Unit 依赖的其他 Unit,如果它们没有运行,当前 Unit 会启动失败。
  • Wants:与当前 Unit 需要的其他 Unit,如果它们没有运行,当前 Unit 不会启动失败。
  • BindsTo:与当前 Unit 绑定的其他 Unit,如果它们退出,会导致当前 Unit 停止运行。
  • Before:用于定义该服务应该在哪个目标(target)之前启动。
  • After:用于定义该服务应该在哪个目标(target)之后启动。
  • Conflicts:这里指定的 Unit 不能与当前 Unit 同时运行。
  • Condition…:运行当前 Unit 必须满足的条件,否则不会运行。
  • Assert…:运行当前 Unit 必须满足的条件,否则会报启动失败。

  [Service]:记录 Service 的信息,用于定义服务本体。

  • Type:用于定义服务的类型。Type=simple表示服务是一个简单的后台进程,默认选项。systemd会认为一旦该进程启动,服务就处于运行状态。

    • simple:默认,最简单的服务类型。意思就是说启动的程序就是主体程序,这个程序要是退出那么一切皆休。
    • forking:标准 Unix Daemon 使用的启动方式。启动程序后会调用 fork() 函数,把必要的通信频道都设置好之后父进程退出,留下守护进程的子进程(以 fork 方式从父进程创建子进程,创建后父进程会立即退出)。
    • oneshot:这一选项适用于只执行一项任务、随后立即退出的服务。可能需要同时设置 RemainAfterExit=yes 使得 systemd 在服务进程退出之后仍然认为服务处于激活状态。
    • dbus:这个程序启动时需要获取一块 DBus 空间,所以需要和 BusName= 一起用。只有它成功获得了 DBus 空间,依赖它的程序才会被启动。
    • notify:这个程序在启动完成后会通过 sd_notify 发送一个通知消息。所以还需要配合 NotifyAccess 来让 Systemd 接收消息,后者有三个级别:none,所有消息都忽略掉;main,只接受我们程序的主进程发过去的消息;all,我们程序的所有进程发过去的消息都算。NotifyAccess 要是不写的话默认是 main。(当前服务启动完毕,会通知 Systemd,再继续往下执行)
  • ExecStart:启动当前服务的命令或可执行文件的路径。

  • ExecStop:停止当前服务的命令或可执行文件的路径。

  • ExecStartPre:启动当前服务之前执行的命令。

  • ExecStartPost:启动当前服务之后执行的命令。

  • ExecReload:重启当前服务时执行的命令。

  • WorkingDirectory:进程工作目录,也就是说在执行前会先切换到这个目录。

  • UserGroup:用于运行服务的用户和用户组。

  • Restart:定义服务的重新启动策略。

    • no(默认值):退出后不会重启;

    • always:不管是什么退出原因,总是重启;

    • on-success:只有正常退出时(退出状态码为 0),才会重启;

    • on-failure:非正常退出时(退出状态码不为 0),包括被信号终止和超时,才会重启;

    • on-abnormal:只有被信号终止和超时,才会重启;

    • on-abort:只有在收到没有捕捉到的信号终止时,才会重启;

    • on-watchdog:超时退出,才会重启。

    • 如 ssh 服务设置为 on-failure,表示任何意外的失败,就将重启 sshd。如果 sshd 正常停止(比如执行 systemctl stop 命令),它就不会重启。

  • RestartSec:自动重启当前服务间隔的秒数。

  • TimeoutSec:定义 Systemd 停止当前服务之前等待的秒数。

  • RemainAfterExit:值为 yes 或 no,表示进程退出以后,服务仍然保持执行。这样的话,一旦使用 systemctl stop 命令停止服务,ExecStop 指定的命令就会执行。通常和 type=oneshot 配合使用。

  • Environment:指定环境变量。

  • EnvironmentFile:指定当前服务的环境参数文件,该文件的 key=value 键值对,可以用 $key 的形式,在当前配置文件中获取。

  • StandardOutput:服务的标准输出日志,例如StandardOutput=file:/var/log/your-service.log

  • StandardError:服务的错误输出日志,例如StandardError=file:/var/log/your-service-error.log

  • PIDFile:方便 systemd 能够跟踪服务的主进程,对于Type=forking的服务很有用。

  • PrivateTmp:该值为 true 时,表示给服务分配独立的临时空间。服务启动时会在 /tmp 目录下生成目录,用于存放服务的临时文件。

  • [Install]:服务的安装信息,一般设置为多用户的multi-user.target

    • WantedBy:它的值是一个或多个 Target,当前 Unit 激活时(enable)符号链接会放入 /etc/systemd/system 目录下面以 Target 名 + .wants 后缀构成的子目录中;
    • RequiredBy:它的值是一个或多个 Target,当前 Unit 激活时,符号链接会放入 /etc/systemd/system 目录下面以 Target 名 + .required 后缀构成的子目录中;
    • Alias:当前 Unit 可用于启动的别名(比如 master.service 文件名字,正常 systemctl status master.service,设置别名叫 Alias=nm,那你就可以 systemctl status nm.service 查看实际是 master.service 的服务了)
    • Also:当前 Unit 激活(enable)时,会被同时激活的其他 Unit。
    • *.target级别:
      • 0runlevel0.target,poweroff.target:关闭系统。
      • 1runlevel1.target,rescue.target:进入救援模式。
      • 2runlevel2.target,multi-user.target:进入非图形界面的多用户方式。
      • 3runlevel3.target,multi-user.target:进入非图形界面的多用户方式。
      • 4runlevel4.target,multi-user.target:进入非图形界面的多用户方式。
      • 5runlevel5.target,graphical.target:进入图形界面的多用户方式。
      • 6runlevel6.target,reboot.target:重启系统。
      • 如:WantedBy=multi-user.target 在 multi-user.target 启用时,我们的服务就会被启用了。

演示案例

  Tomcat 服务 tomcat.service。

cat > /usr/lib/systemd/system/tomcat.service << EOF
[Unit]
Description=Tomcat
Documentation=https://tomcat.apache.org/
After=network.target

[Service]
Type=simple
ExecStart=/opt/yjx/apache-tomcat-9.0.72/bin/catalina.sh run
ExecStop=/usr/bin/pkill -f tomcat
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

  Nginx 服务 nginx.service。

cat > /usr/lib/systemd/system/nginx.service << EOF
[Unit]
Description=Nginx
Documentation=https://nginx.org/
After=network.target

[Service]
Type=forking
PIDFile=/opt/yjx/nginx/logs/nginx.pid
ExecStartPre=/opt/yjx/nginx/sbin/nginx -t
ExecStart=/opt/yjx/nginx/sbin/nginx
ExecReload=/opt/yjx/nginx/sbin/nginx -s reload
ExecStop=/opt/yjx/nginx/sbin/nginx -s quit
Restart=no
PrivateTmp=true

[Install]
WantedBy=multi-user.target
EOF

常用命令

# 重载 systemd 配置,修改完 systemd 配置文件后需重载才会生效
systemctl daemon-reload
# 启动服务
systemctl start 服务名
# 查看服务状态
systemctl status 服务名
# 重启服务
systemctl restart 服务名
# 停止服务
systemctl stop 服务名
# 设置服务开机启动
systemctl enable 服务名
# 取消服务开机启动
systemctl disable 服务名

日志管理

  通过 systemd 设置的系统服务的日志通常会被systemd以及其journald日志系统所管理。这些日志可以通过journalctl命令来访问和检查。以下是如何查看通过 systemd 配置的系统服务日志的示例。

# 查看服务的实时日志。将 your-service-name 替换为你设置的服务名称
journalctl -u your-service-name -f
# 查看服务的日志历史。默认情况下,它会显示所有的相关日志,从最早到最新
journalctl -u your-service-name
# 以时间范围过滤日志。你可以使用 --since 和 --until 选项来过滤特定时间范围内的日志。例如,查看过去一小时内的服务日志
journalctl -u your-service-name --since "1 hour ago"

  这些命令将输出与你指定的服务相关的日志信息,包括服务的启动、停止、重启、错误等事件。请注意,这些日志是由systemdjournald管理的,因此在某些情况下,你可能需要适当的权限来查看所有日志。

  如果你希望将服务的日志输出重定向到特定的文件而不是仅在journald中查看,可以在你的服务的.service文件中配置日志输出路径,然后使用journalctl或其他工具来查看文件内容。

安装 MySQL 数据库

MySQL 的下载地址:https://downloads.mysql.com/archives/community/

# 安装 MySQL 依赖
yum -y install perl net-tools openssl-devel
# 卸载 mariadb
rpm -qa | grep mariadb
rpm -e --nodeps mariadb-libs-5.5.60-1.el7_5.x86_64
# 安装 MySQL
tar -xvf mysql-8.0.18-1.el7.x86_64.rpm-bundle.tar
rpm -ivh mysql-community-common-8.0.18-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-8.0.18-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-8.0.18-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-8.0.18-1.el7.x86_64.rpm
rpm -ivh mysql-community-devel-8.0.18-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-compat-8.0.18-1.el7.x86_64.rpm

# 启动 MySQL
systemctl start mysqld

# 查找密码并登陆 MySQL
cat /var/log/mysqld.log | grep password
mysql -u root -p

# 修改 MySQL 密码
SET GLOBAL validate_password.policy = low;
SET GLOBAL validate_password.length = 6;
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';

# 允许远程用户登录访问 MySQL
USE mysql;
UPDATE user SET host = '%' WHERE user = 'root';
COMMIT;
FLUSH PRIVILEGES;
EXIT

# 接下来即可使用 Navicat 等客户端工具连接 MySQL

Linux的定时任务

  在 Linux 系统中的 crond 是一个定时计划任务服务,该服务默认开机启动。定时计划任务,故名意思就计划好的任务,到了时间就会自动执行。用户只要按照正确的格式(分、时、日、月、星期、命令)写入到配置文件中,那么就会按照预定的周期时间自动的执行下去。

  该服务用于配置的命令为crontab ,crontab 来自于英文词组“cron table”的缩写,其功能是管理定时计划任务。

语法格式

  该命令基本格式如下:

[root@node01 ~]# crontab [选项]

  常用选项:

  • -e:编辑任务
  • -l:列出任务
  • -r:删除任务
  • -u:指定用户(只有 root 权限可以设置)

  管理当前用户的定时任务:

[root@node01 ~]# crontab -e
* * * * * date >> /root/date.txt
  • 前面 5 个 * 星号分别代表 minute、hour、day、month、week。command 是任务执行的命令。

  管理指定用户的定时任务(只有 root 权限可以设置):

[root@node01 ~]# crontab -eu zhangsan
* * * * * date >> /root/date.txt

  查看当前用户的定时任务:

[root@node01 ~]# crontab -l
* * * * * date >> /root/date.txt

  查看指定用户的定时任务(只有 root 权限可以设置):

[root@node01 ~]# crontab -lu zhangsan
no crontab for zhangsan

  删除当前用户的所有定时任务,如需移除单项或非全部,可用 -e 编辑:

[root@node01 ~]# crontab -r

  删除指定用户的所有定时任务,如需移除单项或非全部,可用 -e 编辑:

[root@node01 ~]# crontab -ru zhangsan

编辑任务

  编辑定时任务的格式为:* * * * * command,由 6 项参数组成,前面 5 个 * 星号分别代表 minute、hour、day、month、week。command 是任务执行的命令。

特殊符号

  • *:星号,代表每个时刻。如 5 个星号就是每 1 分钟,每 1 个小时,每 1 天,每 1 个月,每 1 周。简单理解就是每时每刻,每 1 分钟执行一次命令。
  • ,:逗号,代表分隔字段。例如:15,20,45 * * * * command代表每小时的第 15 分、20 分、45 分执行命令。

  • -:减号,代表一段时间的范围。例如:10 7-10 * * * command代表每天的 7 点 到 10 点这个时间范围,逢第 10 分钟执行命令。也就是7点10分、8点10分、9点10分、10点10分执行命令。

  • /n:/ 代表间隔,n 代表数字,也就是每隔 n 个单位间隔的意思。例如:*/5 * * * * command代表每隔 5 分钟执行命令一次。

  范例:

# 每分钟执行
* * * * * command

# 每小时的第3和第15分钟执行
3,15 * * * * command

# 在上午8点到11点的第3和第15分钟执行
3,15 8-11 * * * command

# 每隔两天的上午8点到11点的第3和第15分钟执行
3,15 8-11 */2 * * command

# 每个星期一的上午8点到11点的第3和第15分钟执行
3,15 8-11 * * 1 command

# 每晚的21:30重启xxxxx
30 21 * * * /etc/init.d/xxxxx restart

# 每月1、10、22日的3:30重启
30 3 1,10,22 * * /etc/init.d/xxxxx restart

# 每周六、周日的1:10重启xxxxx
10 1 * * 6,0 /etc/init.d/xxxxx restart

# 每天18:00至23:00之间每隔30分钟重启
0,30 18-23 * * * /etc/init.d/xxxxx restart

# 每星期六的晚上23:00重启xxxxx
0 23 * * 6 /etc/init.d/xxxxx restart

# 每一小时重启xxxxx
0 */1 * * * /etc/init.d/xxxxx restart

# 凌晨1点到6点之间,每隔一小时重启xxxxx 
0 1-6/1 * * * /etc/init.d/xxxxx restart

# 每月的6号与每周一到周三的11点重启xxxxx
0 11 6 * mon-wed /etc/init.d/xxxxx restart

# 一月一号的6点重启xxxxx
0 6 1 jan * /etc/init.d/xxxxx restart

# 每小时执行/etc/cron.hourly目录内的脚本
0 */1 * * * root run-parts /etc/cron.hourly
说明:如果去掉 run-parts 参数的话,后面就写要运行的某个脚本名,而不是目录名

在线编写 Crontab:https://crontab.guru/examples.html

© 2024 - 2025 雪中烛

 

我是谁

我是MyraZ.

👉百度

Me

Cut out summary from your post content here.

The remaining content of your post.

Desc2

Cut out summary from your post content here.

The remaining content of your post.