Linux

摘要

本篇博客参考中科方德国产操作系统的培训课程,对其主要内容进行总结,以便加深理解和记忆

写在前面

最近有幸参加了中科方德公司在我们学校举办的为期23天的、免费的、国产操作系统的系列课程。培训从Linux基础讲起,到Shell编程、Linux下的GUI开发、调试方法和通信机制、通过Wine的windows应用兼容、Linux服务器相关的存储和网络知识,最后到云计算的内容,中间也贯穿着许多国产操作系统和中科方德国产OS的介绍。初步、系统地搭建起了以Linux为基础的知识体系,让我收获了很多。

另外,需要对此次中科方德来给我们进行培训的老师、助理、HR等表达感谢,即使坚持到最后参加的同学不多,但他们仍然认真负责地给我们授课、解答、回访…

值得一提的是,这次培训让我比较喜欢的地方是授课老师都是来自一线的技术人员而非专门的培训老师,此次培训并非是一个老师一讲到底,而是由来自全国不同地区、不同部门的老师分别授课,各自讲授自己部门核心业务的部分。

由于笔者的时间和能力有限,此次博客仅记录了部分感兴趣的内容,且总结内容较为基础。最后想给中科方德打一个小广告

  • 公司简介和小礼品
  • 培训讲义
  • 方德桌面OS
  • 方德云服务器桌面

1.Linux介绍

Linux内核官网

1)Linux与Windows

  • Linux操作系统相比于Windows操作系统,其安全性、健壮性更好,且开源
  • 软件管理方式
    • Windows的安装程序几乎都是以.exe发布的,除了系统提供的系统基础库外,软件包需要调用的库大都封装在自己的exe安装文件内一起安装。优点:依赖关系简单,缺点:软件包庞大
    • Linux提供了软件包管理(rpm和deb),软件包之间存在层次关系。这些层次、调用关系通过软件包之间的依赖管理,其优缺点正好与Windows相反。
  • 二进制格式
    • Windows上的二进制可执行文件大多为.exe和.msi
    • Linux上的二进制可执行文件为.elf

2)Linux内核

  • Linux是一个典型的宏内核结构,其内核源码大部分是由C语言编写的,少部分是由汇编语言编写的。

  • Linux版本号由内核版本发行版本组成,如5.4.0-100-generic,内核版本号5.4.0三个数字分别为内核主版本号(很少变化,只有当发生重大变化的代码变化或内核变化才会发生)、内核次版本号(指一些重大修改的内核,偶数表示稳定版、奇数表示开发中版本)、内核修改版本号(指轻微修订的内核,一般为有安全补丁、bug修复、新功能或驱动程序时变化)100为发行版本号,generic表示当前内核版本为通用版本

3)Linux发行版

4)Linux的常见应用领域

  • 服务器领域、云计算平台
  • 嵌入式系统领域
  • 桌面应用领域
  • 移动端

5)Linux系统安装

  • Linux系统的系统安装,实际上是将一个可安装的镜像(通常为ISO文件)按照一定的分区要求,将OS相关数据复制到目标硬件的存储设备上,并通过一定的配置,使得该镜像在目标设备上正常运行的过程。

  • 安装到实体机器时需要提供安装介质(U盘、光盘等)或通过配置好的网络进行批量安装。

    • 分区和格式化:boot分区、根分区、swap分区

    • 文件安装/复制

    • 配置:引导配置、其他配置(时区、键盘布局、帐户等)

  • BIOS概述:BIOS是一种工业界标准的固件接口,负责启动计算机并提供基本的输入输出功能,同时也提供系统设置和配置选项,确保计算机硬件和操作系统之间的正确交互。

  • UEFI和Legacy:UEFI和Legacy BIOS都是计算机启动过程中的固件系统

    • UEFI提供了更多的功能和灵活咩咩咩咩性(如GUI、更强大的硬盘驱动器支持、更高的安全性和可靠性、更快的启动速度)
    • 然而一些旧的OS和软件可能无法与UEFI兼容,因此需多计算机现在仍在使用Legacy BIOS
  • MBR和GPT:

    • MBR是一种传统的分区表格式,最多可以记录4个主分区或3个主分区和1个扩展分区,扩展分区可以再分为多个逻辑分区。
    • GPT是一种相对较新的分区表格式,支持最多128个分区,没有主分区和扩展分区之分,每个分区都有唯一的GUID标识符。GPT分区具有更好的扩展性和可靠性,支持更大的磁盘容量和更高级的安全性和恢复特性,但一些旧的计算机和操作系统可能不支持GPT分区表
  • 文件系统:文件系统定义了OS在存储设备上进行文件和数据管理的机制

  • 分区和分区表:

    • 分区是指将磁盘划分为多个逻辑部分,每个部分可以独立地格式化、分配文件和执行OS
    • 分区表则是记录这些分区的信息(如分区的位置、大小和文件系统类型等)分区表通常存储在磁盘的第一个扇区,也称引导扇区
  • 挂载点:Linux是典型的树形结构,根目录是整个文件系统的入口。系统中的其他分区都挂载在根目录下

6)国产操作系统和方德桌面操作系统

  • “2+8+N”信创“三步走”战略 国产化替代。
  • 方德桌面操作系统安装(虚拟机)
    • 下载镜像
    • 通过virtualbox虚拟机
    • 新建虚拟机,设置名称(自定义)、类型(Linux)、版本(Debian64-bit)、内存4GB以上,硬盘20/50GB以上
    • 打开虚拟机的设置,存储、添加演示镜像
    • 进入系统
    • 安装系统
    • 重启系统,注意设置中移除刚才添加的演示镜像

2.Linux基本概念与命令

1)Linux文件系统层次结构

Linux的目录结构是根据FHS(Filesystem Hierarchy Standard)定义的,其目录结构是以/为起点的树形结构,所有文件都位于根目录下。在Linux系统中,目录结构和分区设备是没有关系的,即不同的目录可以跨越不同的磁盘设备或分区

目录名说明
/根目录
/boot存放linux系统的内核文件和启动时用到的一些引导文件,如有独立的boot分区,该分区应挂载到这个目录上
/home用户家目录,包含系统中所有的用户以及存放的用户数据
/root系统管理员root的家目录
/bin系统启动运行所常用的命令文件(如ls等),不能包含子目录
/sbin放置系统管理所使用的命令文件(如fdisk、shutdown等)
/devLinux设备文件目录,系统启动时根据本机的设备支持情况创建响应的设备节点,通过访问设备文件访问设备
/lib包含linux系统的共享文件和内核模块文件。/lib/modules目录存放核心可加载模块
/lib64包含64位版本linux系统的共享文件和内核模块
/tmp临时文件目录,任何人都可以访问
/run一个临时文件系统,存放运行时数据(如进程、进程锁、socket)
/mnt手动为某些设备(如磁盘)挂载提供挂载目录
/media由系统自动为某些设备(光盘、U盘等)挂载提供挂载目录
/opt存放第三方应用程序的文件
/var存放系统执行过程中经常变化的数据(如系统日志、打印队列、数据库文件)
/etc存放linux系统上大部分的配置文件,重要的配置文件有/etc/fstab、/etc/passwd、/etc/pam.d、/etc/x11。建议修改配置文件前先进行备份
/usr包含可供所有用户使用的程序和数据
/srv存放一些服务启动之后需要访问的资料目录
/proc一个虚拟的文件系统,不存在磁盘上,而是由内核在内存中产生,用于提供系统的相关信息,如系统核心、外部设备、网络状态,比较重要的文件有:/proc/cupinfo(保存cs的cpu信息)
/sys也是虚拟文件系统,提供设备信息和相关接口

2)用户帐户与文件权限

  • Linux的帐户类型
    • 个人帐户:超级用户root、系统用户、普通用户:
      • 超级用户root:拥有全部权限的特权用户,用于执行个中系统管理任务(安装删除软件、配置系统服务、更改文件权限、创建删除用户等)默认情况下,root的UID为0,提示符为#。一般情况下,不推荐直接使用root,而是将一个普通用户授予管理员权限,通过sudo执行管理任务
      • 系统帐户:Linux系统正常工作必须的内建用户,一般用于管理服务。系统用户不能用来登录,如bin、daemon、lp等用户。系统用户的UID一般为1-999。通常将shell设置为/sbin/nologin来表示不支持该帐户登录
      • 普通用户帐户:为了让使用者能够使用Linux系统资源建立的,用户新建的帐号一般就是普通帐号,字符提示为$,UID默认为1000-60000。普通用户根据其能否提权等操作,又可以划分为具有管理员权限的用户和不具有管理员权限的用户
    • 用户组
  • Linux的用户管理文件
    • Linux下使用文本文件来记录和管理用户与用户组
    • /etc/passwd:记录用户信息,用冒号分割,分为7段:用户名:密码占位符:UID:GID:帐户信息:帐户目录:Shell版本
    • /etc/shadow:记录用户密码信息,用冒号分割,分为9段:用户名:密码:最后一次修改时间的天数:两次修改密码最小间隔天数:多少天后需要再次修改密码:从发出警告到密码正式失效的天数:禁止登录用户名还有效的天数:用户禁止登录的时间:标志字段
    • /etc/group:记录用户组信息,用冒号分割,分为4段:用户组名称:组密码:GID:组成员
    • /etc/login.defs:登录配置,如普通用户的最小起始ID,密码加密算法,HOME权限等
  • 常用的帐户相关操作
# 查看用户(已登录帐户信息)
who
# cat /etc/passwd
whoami
# 创建帐户
useradd -m [用户名]
useradd -m test
# 修改密码
passwd [用户名]
# 添加帐户到组
adduser [帐户名] [用户组]
adduser test sudo
# 修改帐户信息
usermod [帐户名]
# 删除用户
userdel [帐户名]
  • 文件权限控制:Linux系统对文件权限控制严格,若想对某个文件执行某种操作,必须有相应的权限

    • 自主式权限控制DAC(Discretionary Access Control):主体(进程)用户自己的凭证来标识身份(euid、egid),客体(文件)通过uid和gid来标识自己的身份。进程对文件的操作只有读R、写W、执行X三种。DAC的UGO规则简单(User、Group、Other)每种类型都有自己的RWX掩码。这种简洁的控制使得DAC检查的开销小,但权限粒度太大
    • 强制访问控制MAC(Mandatory Access Control)

    类型:所有者权限:组权限:other权限(r可读:w可写:x可以被执行)

    权限说明
    -rw-------(600)只有所有者可读可写
    -rw-r–r–(644)只有所有者才有读写权限,其余只有读权限
    -rwx------(700)只有所有者才有读写执行的权限
    -rwxr-xr-x(755)所有者读写执行,其余读和执行
    -rwx–x–x(711)所有者读写执行,其余执行
    -rw-rw-rw-(666)每个人都可读写
    -rwxrwxrwx(777)所有人都可读写执行
  • 常用的文件权限相关操作
# 查看文件权限
ls -l
ls -l {file}
# 修改文件权限,若不指定用户则默认为all,-R级联设置(文件夹及其子文件夹中的内容)
chmod [ugoa] [+-=] [rwx] {file}
chmod {root_num} {file}
chmod 777 {file}
# 修改文件所属或所属组
chown [-R] {属主名} {file}
chown [-R] {属主名}:{属组名} {file}
# 修改文件所属的用户组
chgrp [-R] {file} ...
  • 文件类型:一切皆文件

    • 文件类型
    类型说明
    普通文件如mp4、pdf等
    目录文件目录文件包含了此目录中各文件的文件名与指向文件的指针,打开目录相当于打开目录文件
    字符设备文件和块设备文件这些文件隐藏在/dev/目录下,当进行设备读取或与外设交互时才会使用(如光驱属于块设备文件、串口设备属于字符设备文件)Linux系统中只有这两种设备文件
    套接字文件一般隐藏在/var/run/目录下,用于进程间的网络通信
    符号链接文件类似于windows中的快捷方式,指向另一文件的简介指针
    管道文件类似于windows中的快捷方式,指向另一文件的简介指针
    • 文件相关的操作
# 查看文件
ls 
# 创建文件
touch、cat、echo、vim
# 查看文件内容
cat、more、head、tail
# 复制文件
cp
# 删除文件
rm
# 移动文件
mv
# 文件编辑
grep、sed、cut、awk、vim
# 改变路径
cd
# 查看当前路径
pwd
# 创建目录
mkdir
# 删除目录
rmdir

3)文件系统管理工具

①常用的文件系统类型

  • Windows:fat16(msdos)、fat32(vfat)、NTFS
  • Linux:ext2、ext3、ext4、btrfs、xfs等
  • 光盘:iso9660、udf

②常用的文件系统的相关操作

  • 分区工具:fdisk、parted、gparted
  • 文件系统格式化工具:mkfs.ext4、mkfs.vfat、mkfs.btrfs、mkfs.ntfs
  • 统计文件大小:df、du
  • 文件系统检查:fsck
  • 文件系统挂载:mount、umount

③文件挂载相关文件

  • /etc/fstab:定义了系统启动过程中必须|自动挂载的文件系统(静态挂载信息的文件),如根分区、HOME分区等。系统启动时,systemd服务会自动地从这个文件中读取信息,并且会自动将此文件中指定的文件系统挂载到指定的目录。文件内容有6个字段(文件系统设备标识、挂载点、文件系统类型、挂载选项、挂载时是否dump、挂载时是否做文件系统检查)
  • /etc/mtab、/etc/mounts:都是指向/proc/self/mounts的链接文件,记录系统中动态挂载的各种文件系统

④mount指令

# 1.查看挂载的文件系统(输出挂载的所有文件系统)
mount
# 输出指定类型的文件系统
mount -t {type}
# e.g.只输出tmpfs类型的文件系统
mount -t {tmpfs}

# 2.格式化并挂载磁盘
# 将磁盘分区格式化为指定的文件系统(谨慎操作)
sudo mkfs -t ext4 /dev/sdb1
# 将该分区挂载到/mnt目录
sudo mount /dev/sdb1 /mnt

# 3.挂载光驱
# 将设备/dev/cdrom挂载到/mnt目录中,然后就可以在/mnt目录下访问光驱中的内容了
sudo mount /dev/sr0 /mnt
# 以只读的方式挂载
sudo mount -o ro /dev/sdb1 /mnt
# 将只读的挂载重新挂载为读写模式
mount /mnt -o rw,remount

# 4.挂载ISO文件
# 将projects目录下的所有内容打包到test.iso文件中
mkisofs -o test.iso projects/
# 将该iso文件挂载到/mnt目录下
sudo mount test.iso /mnt
# 挂载一个设备到多个目录
sudo mount -o ro vdisk.img ./testdir

# 5.格式化U盘、挂载U盘
# 找到U盘位置
sudo fdisk -l
# 格式化优盘,-t参数指明哪种文件系统格式
sudo mkfs -t vfat /dev/sdc4
# 挂载U盘到指定目录
# FAT32格式
sudo mount -t vfat {U盘位置} {挂载目录位置:/media/u}
# ntfs格式
sudo mount -t ntfs {U盘位置} {挂载目录位置:/media/u}
# 卸载U盘
sudo umount {挂载目录:media/u}

4.系统启动框架

init进程

Linux OS的启动首先从BIOS(Basic Input/Output System)开始启动,进而从磁盘加载MBR(Master Boot Record),接下来进入bootloader,载入内核Kernel,完成内核的初始化。内核初始化的最后一步需要产生第一个进程,负责产生其他的用户进程。这个特殊的进程就是pid为1的init进程(是所有进程的祖先,不可kill)

init进程负责组织和运行许多独立的或相关的初始化工作,因此也被称为init系统。init系统可以定义、管理和控制init进程的各种行为,从而让计算机系统进入到用户所需的运行模式。

Linux的初始化init系统主要包括三种:SysvinitUpstartSystemd。init系统也是在不断的发展变化中,大体的演进路线为:sysvinit→upstart→systemd。RHEL5默认的是SysVinit,RHEL6则是upstart的昙花一现。到了RHEL7时代,systemd成为了主角,即便它重量功能面广的特定不符合Unix小而美的特点。

②Sysvinit

Sysvinit是system V风格的init系统,它源于UNIX的System V系统。

运行过程:init程序是Sysvinit的主要程序,一般位于/svbin/目录下。内核启动init程序后,init程序首先读取/etc/inittab文件,分析文件内容,获得以下配置信息:

  • 系统需要进入的运行级别

**系统运行级别(runlevel)**用于确定系统进入的预定的运行模式(Systemd的runlevel与之兼容

等级系统目标说明
0shutdown.target关机
1rescue.target单用户模式,该模式下,用户登录不需要密码,默认网卡驱动不被加载,一些服务受限
2multi-user.target多用户模式,NFS服务不开启(不支持网络文件系统)
3multi-user.target命令行模式(完全支持用户模式)
4multi-user.target保留
5graphical.target图形用户模式
6reboot.target重启系统
S/s一般用于系统故障后的排错和恢复
  • 获取组合键的定义
  • 定义电源fail/restore脚本
  • 启动getty和虚拟控制台

获取系统运行级别之后,根据运行级别顺序依次执行以下位置的启动脚本,从而将系统初始化为预设的运行级别:

  • /etc/rc.d/rc.sysinit:重要的系统初始化服务:设定运行级别后,Linux执行的第一个用户层文件,服务包括设定PATH、设定网络配置(/etc/sysconfig/network)、启动swap分区、设定/proc等
  • /etc/rc.d/rc和/etc/rc.d/rcX.d(X为运行级别):根据不同的renlevel,rc脚本打开对应的rcX.d目录,并开始运行此目录下的脚本文件(S开头为系统启动时的脚本文件,S后为序号,升序执行;K开头为关闭系统时的脚本文件,K后为序号,升序执行)
  • /etc/rc.d/rc.local:用户个性化服务,当系统运行到该脚本时系统初始、化脚本都执行完毕,系统已经可以正常工作。

(/etc/init.d/ 各种服务的初始存放位置)

③3种init系统比较

名称比较
SysVinit概念简单清晰,主要依赖于Shell脚本。但由于是顺序执行导致启动太慢,容易hang在fstab和nfs的挂载上。现已废弃,仅在旧版或部分嵌入式中存在
UpStart基于事件的启动系统,程序并行运行,但有依赖关系的时候还是顺序执行
Systemd所有程序并行运行,对于依赖关系,被依赖的程序给所依赖的程序发送成功运行的信号,但实际自身仍在启动过程中

Systemd

systemd的第一个目标是default.target(一般指向lib/systemd/graphical.target的软链接)

###### 管理系统 ######
# 1.重启系统
sudo systemctl reboot
# 2.关闭系统,切断电源
sudo systemctl poweroff
# 3.cpu停止工作
sudo systemctl halt
# 4.暂停系统
sudo systemctl suspend
# 5.系统休眠
sudo systemctl hibernate
# 6.系统进入交互式休眠状态
sudo systemctl hybrid-sleep
# 7.启动救援状态(单用户模式)
sudo systemctl rescue

###### 查看启动耗时 ######
# 1.查看启动耗时
systemd-analyze
# 2.查看每个服务的启动耗时
systemd-analyze blame
# 3.图形化显示每个服务启动的时间轴,结果保存在init.svg
systemd-analyze plot > init.svg
# 4.显示瀑布状的启动过程流
systemd-analyze critical-chain
# 5.显示指定服务的启动流
systemd-analyze critical-chain atd.service

###### Unit资源管理 ######
# Systemd可以管理所有系统资源,不同资源统称为Unit,有12种:
# Service unit:系统服务
# Target unit:多个unit构成的一个组
# Device Unit:硬件设备
# Mount Unit:文件系统的挂载点
# Automount unit:自动挂载点
# Path Unit:文件或路径
# Scope Unit:不是由Systemd启动的外部进程
# Slice Unit:进程组
# Snapshot Unit:Systemd快照,可以切回到某个快照
# Socket Unit:进程间通信的socket
# Swap Unit:swap文件
# Timer Unit:定时器
# 列出正在运行的Unit
systemctl list-units
# 列出所有Unit包括没有找到配置文件的或启动失败的
systemctl list-units --all

###### 自定义服务 ######
# 1.在/usr/lib/systemd/system下新建服务脚本
vim /usr/lib/systemd/system/zdy.service
# 2.服务脚本内容
# 复制代码...
[Unit]
Description=描述
Environment=环境变量或参数
After=network.target

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

[Install]
WantedBy=multi-user.target
# 复制代码...

# 3.添加或修改配置文件后,重新加载
systemctl daemon-reload
# 4.设置自动启动(实际是在/etc/systemd/system/multi-user.target.wants/添加服务文件的链接
systemctl enable zdy

###### 服务管理 ######
# 启动服务
systemctl start {服务名}
# 停止服务
systemctl stop {服务名}
# 重启服务
systemctl restart {服务名}
# 查看服务状态
systemctl status {服务名}
# 重新加载服务的配置文件
systemctl reload {服务名}
# 启用服务
systemctl enable {服务名}
# 禁用服务
systemctl disable {服务名}
# 打印服务列表
systemctl list-unit-files --type=service

6)定时任务

crond是Linux系统种常用的定时任务工具之一,它可以在指定的时间间隔内运行指定的命令(或运行脚本)

其原理是:在指定的时间间隔内不断检测系统种指定的任务配置文件crontab,一旦发现有需要执行的任务,就会按照预定的时间执行相应的命令。如果执行成功,crond会将执行结果记录到指定的目录,若失败,crond会进行多次尝试,若仍然失败,则会将错误信息写入日志文件并通知管理员进行处理。

①crontab文件格式

在crontab文件中,每一行都代表一项任务:

# 前5个字段为时间,最后一个字段为要执行的命令
# 在每个时间位,可以使用特殊字符:
# *表示所有时间
# 逗号隔开可以表示序列:1,2,5,8
# -可以表示范围,2-6
# /可以指定时间间隔,0-23/2表示一天每隔2小时,也可以配合*号使用,如*/2

# 脚本中涉及的路径要写全局路径,注意引入环境变量
minute hour day month week command

②定时任务执行

# 1.新建crontab文件
# 1.1设置环境变量EDITOR
# 1.2编辑home目录下的.profile文件,在其中加入一行:EDITOR=vi;export EDITOR
# 1.3创建一个名为<user>.cron文件,在其中加入以下内容:
0,15,30,45 18-06 * * * /bin/echo 'date' > /dev/console
# 列出crontab文件
crontab -l
# 编辑crontab文件
crontab -e
# 删除crontab文件
crontab -r
#  恢复丢失的crontab文件
crontab <filename>

③注意事项

  • 新建cron job不会立即执行,至少要过2分钟才执行,若重启cron则立即执行
  • 当crontab突然失效时,可以尝试/etc/init.d/crond restart解决问题,或看日志中某个job有没有被执行/报错 tail -f /var/log/cron
  • 不能随意运行crontab -r删除指令,它从crontab目录(/var/spool/cron)中删除用户的crontab文件,删除了用户,该用户的所有crontab也都会丢失
  • 在crontab中%有特殊含义(换行),使用的话必须进行转义%,如+\%Y\%m\%d

3.Shell编程

1)vim

2)shell编程

  • shell命令解析分类
    • sh(Bourne shell)、bash(GNU Bourne shell)、zsh(Z-shell)、csh(C shell)、ksh(Korn shell)等
    • 可通过/etc/shells查看系统支持的shell
  • 注释、变量(数据类型)、输入、基本运算、流程控制
  • shell调试

4.桌面操作系统框架

1)桌面操作系统概述

桌面操作系统就是在操作系统上增加了**桌面环境(Desktop Environment)**的相关组件,是人机交互的关键部分,包括管理器、任务条、开始菜单、控制面板、文件管理器等。

2)桌面操作系统的启动

  • 按下电源和固件阶段:按下电源,计算机开始通电,最重要的是要接通CPU的电路,然后通过CPU的针脚让CPU运行起来,只有CPU运行起来才能执行相关代码跳到第一个程序:BIOS或UEFI上,将CPU控制权交给BIOS或UEFI固件程序
  • BIOS/UEFI的固件阶段:各种硬件自检,将磁盘分区中的内核加载到内存中,进入内核启动阶段,CPU控制权移交给内核,内核开始工作
  • 内核启动阶段:内核镜像完成自解压缩,然后跳转到start_kernel()函数,内核就真正启动了。PID=0的0号进程启动,从/boot分区找到init ramdisk并解压,得到了内核空间的根文件系统,调用集成在inittramfs中的systemd程序,其PID=1
  • systemd阶段:做内核启动的必要操作后,systemd会将虚根切换为真实的根分区,并进入真正的用户空间阶段,systemd从此成为了用户空间的总管进程,即所有用户空间进程1的祖先进程
  • lightdm显示管理器:lightdm是由systemd启动的显示管理服务,它启动XServer,然后启动登录界面greeter,用户一旦登录完成后就启动用户会话(user server),启动桌面环境主程序
  • 桌面环境:桌面环境主程序将加载窗口管理器、桌面背景、任务栏、开始菜单、文件管理器等,最终完成桌面OS的启动

3)主流桌面环境

gnome:Ubuntu/Centos

cinnamon:Mint

mate:麒麟

deepin:统信

4)桌面环境组件

名称说明
显示管理器lightdm用户登录、X标准显示管理、启动登录界面、开始用户会话、引导桌面环境主程序
会话管理器cdos-session用户登录、注销、切换用户会话等会话管理和操作
窗口管理器mutter窗口合成、窗口装饰、窗口操作、工作区等
文件管理器nemo本地/远程文件展示、桌面、文件操作等
桌面cdos-desktop任务栏、开始菜单、应用/窗口切换、托盘等
控制中心cdos-control-center系统/桌面组件及应用的控制/设置
系统设置守护进程cdos-settings-daemon响应/配合控制中心或其他控制方式,执行相应的后端操作
锁屏屏幕保护和锁屏等
部分中间件gtk、glib、gvfs等类库,电源管理、用户管理、设备管理
部分服务网络服务、声音服务、共享服务等

5)桌面环境基础

  • GLib & GIO(接口/类型一致性)

GLib是整个OS的基础,它定义了许多标准的、常用的接口和类型,包括基本类型和限制的定义、标准宏、类型转化、字节序、存储分配、警告和断言、消息记录、计时器、字符串工具、hook函数、动态加载模块、多线程等。同时也提供了许多数据类型及相关操作,如存储块、双向链表、单向链表、哈希表、动态列表等

GIO提供一套标准的针对文件系统定义的接口

  • GObject(实现/规范一致性)

Glib对象系统提供了一套以C语言编写的面向对象程序的标准和规范

  • GTK(应用一致性)

GTK是一种图形用户界面GUI工具包

6)桌面环境核心库

名称说明
libcairo矢量图形绘图的免费函数库,采用cairo的重要项目Gtk++、Pango、Gnome、Mozilla、OpenOffice
gvfsGNOME桌面系统的虚拟文件系统,用来代替过时的gnome-vfs虚拟文件系统
libgdk标准Xlib函数调用的一个基本封装,Xlib提供了访问人恶化X服务器的底层方式
libclutter类似于GTK的图形库,基于stage和actor的设计思想
libmuter窗口管理器接口
libpango文字和图形渲染
libnotify系统通知消息库
libgdk-pixbuf图片图像相关基础库
libnm网络相关基础库
libpulse声音相关基础库
libaccountsservice用户信息相关基础库

7)标准与规范

常用国标

名称说明
GB_T 18030信息技术中文编码字符集
GB_T 25646中文Linux用户界面规范
GB_T 25655中文Linux桌面OS技术要求
GB_T 25656中文Linux应用编程界面API规范

常用规范和约定

freedesktop.org GNOME Development Debian – 说明文档

名称说明
系统目录FHS定义
家目录xdg目录规则
桌面主题
图标主题
应用分类标准分类和自定义分类
应用启动器应用启动器文件编写、标准字段和自定义字段
系统服务服务启动文件的编写,标准字段和自定义字段
接口文档基于动态库生成开发文档(手册)
插件/模块插件/模块的编写和使用,插件机制的实现
GSettings设置和修改用户应用配置信息
DBus
国际化和本地化多语言支持
错误和异常处理日志分级存储
语言绑定多语言兼容开发

5.GTK图形编程

The GTK Project - A free and open-source cross-platform widget toolkit Linux之GTK系列教程-CSDN博客

1)概述

  • 图形化开发工具
    • Windows:WPF、WinForm
    • Android:SDK
    • IOS
    • 跨平台:QT、Java Swing、GTK

GTK在桌面领域应用广泛,Gnome是在GTK的基础上开发完成的,是桌面环境基础的三驾马车(GLib&GIO、GObject、GTK)之一

GTK+(GIMP Toolkit)是一套在GIMP基础上发展而来的高级的、可伸缩的、跨平台的图形化工具包,提供一套完备的图形构件,遵循LGPL许可证。GTK+整个函数库都是由C语言编写的,是一种面向对象式的API。Glib是GTK+的基础,面向对象的机制由GObject提供。

2)环境搭建

# 安装GTK工具库
sudo apt install libgtk3.0*
# 检验安装是否成功
pkg-config --cflags --libs gtk+-3.0
# 如果报错gtk+-3.0 not found,则意味着 pkg-config 找不到 gtk+-3.0.pc 文件,该文件包含了编译和链接 GTK 3.0 库所需的信息,执行以下代码(若已安装仍找不到,则需要添加系统环境变量)
sudo apt-get install libgtk-3-dev


# 安装devhelp工具(API帮助文档)
sudo apt-get install devhelp
# 运行工具
devhelp

# 安装code blocks:
sudo apt-get install codeblocks
# 运行
codeblocks
# gcc编译.c程序
gcc {文件名.c}
# 运行.out文件,注意非GUI程序需要在命令行下才能执行,且要标识路径
./{文件名.out}

3)hello-word程序

#include <gtk/gtk.h>
int main(int argc, char* argv[])
{
	//定义控件之前进行初始化函数
	gtk_init(&argc,&argv);
    //创建顶层窗口
	GtkWidget*window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    //显示窗口
	gtk_widget_show(window);
    //进入主事件循环
    gtk_main();
    return 0;
}

4)容器布局

水平布局GtkHBox、垂直布局GtkVBox、表格布局GtkTable、固定布局GtkFixed

5)控件

窗口、容器、按钮GtkButton、标签GtkLabel、图片GtkImage、进度条GtkProgressBar、行编辑GtkEntry、笔记本控件GtkNotebook

6)信号与回调函数

7)glade

glade是GTK+的可视化开发工具

# 下载安装
sudo apt install glade
# 运行
glade
# 读取glade文件(界面设计的导出文件.glade)
GtkBuilder *builder = gtk_builder_new();
gtk_builder_add_from_file(builder,"{路径.glade}",NULL);
# 获取glade文件中的控件
GtkWidget *window = GTK_WIDGET(gtk_builder_get_object(builder,"window1"));

6.QT图形编程

1)概述

QT是一个跨平台的C++图形用户界面应用程序,可以开发GUI程序以及控制台工具、服务器,还具有多线程、访问DB、图像处理、音视频处理、网络通信、文件操作等。

QT是面向对象的框架,使用特殊的代码生成扩展(元对象编译器 Meta Object Compiler,moc)以及一些宏。QT很容易扩展,且允许真正地组件编程。

QT的优势:跨平台、开源、丰富的API库、支持2D/3D图形渲染,支持OpenGL、QML脚本开发

2)QT安装

QT对5.15及以上版本已经停止提供离线安装包,但支持在线安装

  • 离线安装包:https://download.qt.io/archive/qt/5.9/5.9.2/;文件名为qt-opensource-linux-x64-5.9.2.run
  • 在线安装包:清华大学开源镜像:https://mirrors.tuna.tsinghua.edu.cn/qt/official_releases/online_installers/;文件名为qt-unified-linux-x64-online.run
  • 源码编译安装:清华大学开源镜像:https://mirrors.tuna.tsinghua.edu.cn/qt/atchive/at/5.15/5.15.9/single/;文件名为qt-everywhere-opensource-src-5.15.9.tar.xz

3)QT Creator:QT的IDE

# 安装
# qmake 是一个协助简化跨平台开发构建过程的工具,是QT附带的工具之一
# CMake是一个跨平台的安装编译工具
# qtchooser:是一个qt版本管理软件
sudo apt install cmake qtbase5-dev qtdeclarative5-dev qtchooser qtcreator

4)QT工具集介绍

5)QT模块

6)信号与槽

7)QT控件、布局与事件

控件:QMainWindow、QLabel、QLineEdit、QTextEdit、QPushButton、QRadioButton、QCheckBox、QComboBox

布局:垂直布局QVBoxLayout、水平布局QHBoxLayout、网格布局QGridLayout、表单布局QFormLayout、分组布局QStackedLayout

事件:键盘事件、鼠标事件、绘图事件、定时器事件、焦点事件、大小改变事件;事件过滤器

8)QT样式表:QSS

9)QT对话框

7.DBUS

1)DBus概述

  • 概述

DBus(D-Bus),全称为Desktop Bus,是一种在Linux和其他Unix-like操作系统上运行的系统的总线,用于进程之间的通信

DBus被认为是一个基于消息的系统,使得应用程序之间的相互通信便得更加容易和可靠,它提供了一个机制,允许不同的应用程序通过DBus进行通信,并可以发送和接受异步消息。所以,DBus可以提用于桌面程序之间的通信,系统服务的管理,设备管理,以及进程间的协作等

DBus在Linux桌面系统、嵌入式系统和服务器系统中都得到了广泛的应用,据有高效、灵活、可扩展、可靠和安全等特点,成了Linux系统中的重要组件之一

  • 特点

    • 低延迟:天然的避免来回传递和支持异步
    • 低开销:DBus使用二进制协议,无需转化为xml文本格式(针对单机的IPC而非网络通信)
    • 高可用:基于消息机制而非字节流机制
  • 架构

    • 底层接口层:主要由libdbus函数库提供DBus所有功能
    • 总线层:主要由Message bus daemon这个总线守护进程提供的,在linux系统启动时运行,负责进程间的消息路由和传递,其中包括Linux内核Linux桌面环境的消息传递,总线守护进程可以与多个应用程序连接,可以将来自一个应用程序的消息路由到多个其他应用程序
    • 应用封装层:基于特定应用程序框架,将DBus底层接口封装成友好的wrapper库,如libdbus-c、libdbus-glib、libdbus-python、libdbus-qt

Bus Daemon Process是运行在Linux系统中的一个后台守护进程,充当DBus结构的总线层。DBus运行时会调用底层接口层的libdbus库,完成DBus的核心功能。应用程序通过调用Wrapper库与DBus Daemon Process进行通信。Wrapper库实现c、glib、python、qt等DBus接口的封装,方便开发人员调用DBus程序

  • 相关概念
    • 会话总线(Session Buses):由普通进程创建,可能存在多个。在某个用户登录后启动,属于某个用户私有,是该用户的应用程序用来通话的通道
    • 系统总线(System Bus):在系统启动时就被创建,是一个持久的总线,供内核和后台进程使用,具有较高的安全性,常用于发送系统消息(如插入一个新的存储设备、建立新的网络连接)
    • 总线名称(Bus Name):标识一个应用和消息系统的连接:
      • 公共名:服务的标识,如org.freedsktop.Accounts,一个公共名可以对应多个连接,即多个应用连接到该公共名的服务。消息总线会依次给每个连接提供相同的服务。
      • 唯一名:如1:3,每个连接都有一个唯一名(但每个连接未必都有公共名,只有唯一名而没有公共名的连接被称为私有连接
    • 对象路径(Object Paths):Object Paths类似于一个文件路径,表示一个服务,该路径在连接中是唯一的。一个DBus连接服务可以有多个Object Path,表示这个连接中提供不同的服务
    • DBus 接口(interfaces):在每个Object Path下都包含一个或多个接口,包括消息总线中提供的标准接口,也包括需要具体去实现的接口。一个接口就是多个方法和信号的集合
    • Methods和Signals:方法可以被调用,信号会被广播,感兴趣的对象可以处理这个信号(以及携带的数据)
    • 代理对象(Proxies):用于模拟在其他进程中的远程对象,代理对象是一个正常的普通对象,高层接口可以使用代理。当调用代理对象的方法时,代理对象内部会转换成DBus的方法调用,而DBus的底层接口必须手动创建方法调用的消息,然后发送。同时必须手动接收和处理返回的消息
  • 数据类型

DBus类似于静态语言,使用”强类型“数据格式。在DBus上传递的所有数据都需要声明其对应的类型,其数据类型是由**类型签名(Type Signatures)**定义的,类型签名使用以下标记:

类型说明
a数组,如as表示字符串数组
b布尔
d双精度浮点数
gSIGNATURE类型签名
i32位整型
n16位整型
oObject Path 对象路径
q16位无符号数
sUTF-8字符串
t64位无符号数
u32位无符号数
v可以存放任意数据类型的容器,数据中包含类型信息
x64位整型
y8位无符号整型
()结构体,如a(i(ii)),类似于[int,{int,int}],可以嵌套
{}键值对,如a{us},类似于[k-v,…]

2)DBus工具数据

D-Feet是DBus常用的调试工具,由Python编写(数据类型使用Python数据类型),可以方便的向DBus服务传递数据

# 下载安装DBus
sudo apt-get install d-feet

3)DBus编程

  • C API
# 安装DBus-C库
sudo apt-get install libdbus-1-dev dbus-1-doc
  • Python API
import dbus
from gi.repository import GLib
import dbus.mainloop.glib
  • QT API
QT +=core gui dbus
#include<QtBus/QtDBus>
  • 过程
    • 服务端编写xml配置文件、服务端向系统总线注册服务、服务端编写对接收到消息的过滤、转发、处理等函数、[服务端发送消息]
    • 客户端注册连接服务端、客户端向服务端发送消息并得到返回

4)将DBus服务做成Linux系统服务

通过linux的systemd服务可以将DBus服务设置为开机启动,且易于管理

###### 将DBus服务端添加到服务 ######
# 1.文件创建
cd /usr/lib/systemd/system/
cat server.service
vim server.service
# 2.内容编辑
[Unit]
Description=Sample DBus Service

[Service]
ExecStart=/usr/bin/server
Restart=always

[Install]
WantedBy=multi-user.target

###### 设置DBus程序以root权限运行 ######
# 在/etc/dbus-1/system.d/下创建server.conf的配置文件,在对应位置添加内容
<busconfig>
    <! Only root can own the service -->
    <policy user="root">
        <allow own="com.example.SampleService" />
    </policy>
    
    <policy context="default">
    	<allow send_destination="com.example.SampleService" send_interface="org.freedesktop.DBus.Properties" />
    	<allow send_destination="com.example.SampleService" send_interface="org.freedesktop.DBus.Introspectable" />
    	<allow send_destination="com.example.SampleService" send_interface="com.example.SampleInterface" />
    </policy>
</busconfig>

###### 服务管理 ######
# 设置服务开机启动
sudo systemctl enabled server.service
# 启动服务
sudo systemctl start server.service
# 停止服务
sudo systemctl stop server.service
# 重启服务
sudo systemctl restart server.service
# 查看服务状态
sudo systemctl status server.service

8.GDB

gcc/g++编译源程序,编译后的可执行文件可以通过加-g参数和gdb进行调试

1)基本命令

###### gbd下载 ######
# 1.检测gdb是否安装
gdb --version
# 2.安装gdb
sudo apt-get install gdb
# 3.编译源文件时,增加可调试参数
gcc -g {hello.c} -o {hello}
# 4.gdb进入编译
gdb {hello}

###### gbd下载(|后为命令缩写) ######
# 设置主程序参数
set args 
# 设置断点
break | b
# 运行程序
run | r
# 执行当前行,若当前行包含函数调用,不会进入函数
next | n
# 执行当前行,若当前行包含函数则进入函数,执行第一条语句(若为库函数或第三方函数,则由于无源码,则无法进入)
step | s
# 显示变量或表达式的值
print | p
# 继续运行程序
continue | c
# 设置变量的值
set var name=value
# 退出gdb环境
quit

2)调试core文件

core文件内存的映像,当程序崩溃时,就会产生文件名为core的文件(准确地说是core dump文件),存储内存相应的信息,用于对程序的调试,其默认的生成位置与可执行程序在同一目录下。

# 程序挂掉时,默认不会生成core文件
# 查看系统参数,若后面的数字为0,则代表不生成core文件
ultimit -a
# 将core文件大小设置为无限制,即生成core文件
ulimit -c unlimited
# 查看某程序的core文件
gdb {程序名} {core文件名}

3)调试正在运行的程序

# 获取运行中程序的进程id
ps -ef | grep runing{程序名}
# 调试指定进程,程序在输入调试命令后会暂停
sudo gdb -p {进程id}
# 查看程序的函数调用栈
bt

4)调试多进程程序

# 设置调试模式:表示调试当前进程时,其他进程是否继续运行:on为其他进程继续运行,off为其他进程挂起
set detach-on-fork [on|off]
# 调试父进程
set follow-fork-mode parent
# 调试子进程
set follow-fork-mode child
# 查看调试的进程信息
info inferiors
# 切换当前调试的进程(注意进程编号并非进程id)
inferior {进程编号}

5)调试多线程程序

# 查看当前运行的进程
ps aux | grep {程序名}
# 查看当前运行的轻量级进程(即线程)
ps -aL | grep {程序名}
# 查看主线程和子线程的关系
pstree -p {主线程id}

# 查看断点信息
info b
# 查看线程信息(编号前的*表示当前线程)
info threads
# 切换线程
thread {线程编号}

# 只运行当前线程
set scheduler-locking on
# 运行全部线程(默认)
set scheduler-locking off

# 指定某线程执行某gdb命令
thread apply {线程id} {cmd}
# 全部线程执行某gdb命令
thread apply all {cmd}

6)调试服务程序运行日志

  • 调试多进程|线程程序的问题

单纯的设置断点或单步追踪可能会干扰多进程或多线程之间的竞争状态,从而看到一个假象。在多进程或多线程开发环境中,一旦某个进程或线程被设置断点,则另外的进程可以继续执行,并破坏并发场景。

解决方法:写系统日志

  • 系统日志

Linux系统的系统日志是记录系统操作和事件的重要工具,可以帮助管理员诊断问题、追踪故障和监视系统性能。在Linux系统中,系统日志通常存储在/var/log目录下,由各种不同的日志文件组成,每个文件都记录特定类型的事件和信息

常见的系统日志有:

文件路径说明
/var/log/messages最重要的系统日志文件,记录所有系统事件,包括启动、关机、网络服务的启动和停止、内核消息等
/var/log/syslog记录所有系统日志,包括系统消息、网络服务的启停、内核消息等。是多个Linux系统的默认系统日志之一
/var/log/auth.log记录所有身份验证的事件,如用户登录,sudo命令的使用等
/var/log/kern.log记录内核消息和驱动程序事件,如硬件故障、设备驱动程序的加载和卸载
/var/log/boot.log记录系统启动时的日志,若系统启动异常时则可查看此日志
/var/log/cron记录所有与cron相关的事件,如计划任务的执行、计划任务的错误等
/var/log/mail.log记录邮件服务器的消息和事件,包括发送和接收邮件、SMTP邮件服务器事件

/var/log/syslog是非常重要的日志文件,记录了如:系统启动和开机时间、网络连接断开和错误、系统硬件和软件错误、系统安全事件,如用户登录和权限问题、应用程序启动错误和停止等

// Linux C中,写syslog日志是标准库的一部分,使用该库,必须有root权限或syslog权限组的成员才能访问该库函数
#include <syslog.h>
int main(){
    /**
    	description:打开日志
    	param1:程序名称
    	param2:参数选项(此处用的是进程ID)
    	param3:日志设施常量(此处为用户级别的消息)
    **/
    openlog("SampleProgram",LOG_PID,LOG_USER);
    /**
    	descirption:写日志
    	param1:日志设施常量
    	param2:内容
    **/
    syslog(LOG_INFO,"This is a test log.");
    /**
    	description:关闭日志
    **/
    closelog();
}
# 读syslog日志
# 读最近的20条日志
sudo tail -n 20 /var/log/syslog
# 查看特定应用程序的日志
sudo grep apache /var/log/syslog
# 查找特定日期范围的日志
sudo grep "May 1" /var/log/syslog
# 检查系统启动和关机的时间
sudo grep "systemd" /var/log/syslog | grep "Started" tail -n 1

日志管理工具logrotate,可以进行日志的切割和定期删除。其配置文件在/etc/logrotate.conf(主配置)和/etc/logrotate.d/*(子配置)中

  • rsyslog

ryslog是linux中用来实现日志功能的服务,是一个现代化、高性能、可扩展的日志守护进程用于管理系统日志记录,接收来自各种应用程序和系统组件的日志消息,并将其写入本地日志文件或远程日志服务器中。rsyslog代替传统的syslogd守护进程

设施facility:用于定义日志消息的来源,方便对日志进行分类

目录名说明
kern内核信息
user用户程序产生的相关信息
mail邮件系统信息
daemon守护进程产生的信息
authpam认证系统信息
syslog日志系统自身信息
authprivssh、ftp等登录信息
cron系统执行定时任务产生的信息
lpr打印相关信息
mark服务内部信息,时间标识
uucpUnix-to-Unix Copy,两个unix之间的相关通信
local0-local7保留,本地使用

日志级别priority:定义不同消息的级别

日志等级说明(等级升序,记录的信息越来越少)
debug包含详细的开发情报的信息,通常只在调试一个程序时使用
info通用性信息,一般用来提供有用的信息
notice正常信息,但较为重要,可能需要处理
warning警告信息
error/err错误信息
crit严重级别,如磁盘错误
alert需要立即修改的信息,如系统数据库被破坏
emerg紧急情况,内核崩溃等信息
none什么也不记录

rsyslog:rsyslog的配置文件用于定义日志的来源、目标和处理规则,主配置文件为/etc/ryslog.conf/etc/rsyslog.d/*目录下

# MODULES模块:相关模块配置
#################
#### MODULES ####

module(load="imuxsock")	# 配置加载本地系统日志
module(load="imklog")	# 配置加载内核日志
#module(load="immark")	# privides --MARK-- message capability

# 配置加载UDP传输模式
#module(load="imudp")
#input(type="imudp" port="514")

# 配置加载TCP传输模式
#module(load="imtcp")
#input(type="imtcp" port="514")

# GLOBAL DIRECTIVES:全局配置
# 配置rsyslog守护进程的全局属性,如日志文件的默认属性FileOwner、FileGroup、Umask等

# RULES规则:选择器selector+动作action,selector指定源和日志等级,action部分指定操作
kern.* /var/log/kern.log	# 收集内核日志到/var/log/kern.log
user.* /var/log/user.log	# 收集user相关日志到/var/log/user.log

9.Wine开发

1)方德鸳鸯火锅平台

基于开源Wine深度改造和升级,全面兼容Windows应用,丰富国产操作系统生态

2)Wine介绍

Wine官网

Wine(Wine is Not an Emulator)是一个能够在多种POSIX-compliant操作系统(如Linux、macOS以及BSD等)上运行Windows应用程序的兼容器

Wine不是像虚拟机或模拟器一样模仿内部的Windows逻辑,而是将Windows API的调用改成调用动态的POSIX调用,免除了性能和一些其他行为的内存占用,使得可以干净地集成Windows应用

Wine特点:

  • 二进制兼容性
    • 加载64、32、16位Windows 9x/NT/2000/XP/Vista/7/8/10和Windows 3.x程序和库
    • 用户Win32兼容内存布局、异常处理、线程和进程
    • 设计用于POSIX兼容操作系统(Linux、macOS、FreeBSD、Android)
    • 与Windows的“bug-for-bug”兼容
  • Win32接口支持
    • 支持基于DirectX的游戏和应用程序(Direct3D支持高达DirectX 12)
    • 支持基于OpenGL和Vulkan的游戏和应用程序
    • DirectShow支持,使用GStreamer进行编/解码器
    • Direct2D、DirectWrite支持
    • 支持MMDevice API、XAudio、WinMM、DirectSound音频API
    • 通过PostScript驱动程序打印到主打印机系统(通常为CPUS)
    • 增强型图元文件(EMF)和Windows图元文件(WMF)驱动程序
  • 允许Windows程序接口
    • 基于X11的图形,允许远程显示到任何X终端
    • 基于macOS和Android的显卡
    • X11、TrueType(.ttf/.ttc)和Windows Bitmap(.fon)字体
    • 通过ALSA、OSS、PuiseAudio、Core Audio等声音设备
    • 通过XIM支持多语言键盘和CJK输入法
    • 调制解调器、串行设备
    • 网络(TCP/IP和IPX)
    • ASPI扫描仪
    • Windows平板电脑通过Xinput(如Wacom)
    • 通过v412的视频捕获设备
    • HID设备通过IOHid(MacOS)、evdev(Linux)、hidraw(Linux)、SDL2
  • API覆盖范围和可移植性
    • 专为与Win32的源代码和二进制兼容性设计
    • 兼容Win32的头文件、Win32 API测试套件
    • 可在各种C编译器上编译
    • 允许混合使用Win32和POSIX代码
    • 允许在一个地址空间中混合使用ELF(.so)和PE(dll/.exe)二进制文件
    • 资源编译器、消息编译器、IDL编译器
    • 广泛、统一的代码支持
    • 国际化Wine支持16种语言
    • 内置调试器和可配置的跟踪消息

3)Wine框架

  • Windows模型
  • 用户模式进程:
    • 固定的系统支持进程,如登录进程、会话管理器进程
    • 服务进程,宿纳了Windows服务,如进程管理器和假脱机服务
    • 用户应用程序:Win32位、Win64位、Win3.1 16位、ms-dos 16位、POSIX 32位、OS/2 32位
    • 环境子系统服务进程,实现了OS环境的部分支持
  • Windows内核组件
    • Windows执行体,包含基本的操作系统服务,如内存管理、进程、线程管理,安全性、I/O、网络、跨进程通信
    • Windows内核:由一组底层的SO功能构成,如线程调度、终端和异常处理分发、处理器同步。提供了一组例程和几处对象。执行体的其他部分利用这些例程和对象实现更高层次的功能
    • 设备驱动程序:硬件设备驱动程序,也包含文件系统和网络驱动程序。其中硬件设备驱动程序将用户的I/O函数调用转换为特定的硬件设备请求
    • 硬件抽象层:将内核、设备驱动程序和Windows执行体其他部分和与平台相关的硬件差异隔离开
    • 窗口和图形系统:实现了图形用户界面函数,如对窗口的处理、用户界面控件和绘制等
  • Windows 9x体系架构
  • Windows NT 体系结构
  • Linux系统架构

内核是Linux系统的核心,主要负责:系统内存管理、软件程序管理、硬件设备管理、文件系统管理

  • Wine架构
  • Wine server

Wine server是一个单线程的守护进程,是在Linux上实现的一个Windows内核数据结构和机制的补丁。

Windows应用通过Wine server在Linux上运行的过程:

域socket是Linux进程间通信的一种方式,编程接口类似于网络socker,它可以用来传递文件描述符

应用启动后,建立管道,并通过域socket将管道的一端发送给对方,然后通过管道监听进行通信

系统启动过程:

4)Wine源码下载、编译与使用

  • 源码下载

Wine官网开始部分即可下载稳定版与开发版:

[Wine官方依赖库](https://wiki.winehq.org/Building_Wine)(编译Wine源码时所需的依赖)
  • 源码结构
目录说明
dlls存放了所有API的实现(kernel32、gdiplus等)
fonts重新实现windows字体
document自述文件的翻译
include头文件
libslibwine的源代码
loaderWine启动、加载相关的代码,以及安装在初始wineprefix中的一些文件
nls多国语言资源文件、字符转换
po翻译
programs外部程序的代码,如注册表管理工具regedit
serverwineserver实现
tools用于构建Wine的本地工具
其他文件configure.ac、configure
  • 源码编译

对源码进行编译以获得可以执行的wine程序

a.构建debian11子系统

通过debootstrap构建debian子系统的目的是为了在编译wine源码时提供干净的系统环境,在原本的系统上编译可能会出现问题,因此构建一个子系统来进行隔离。但是在后续对wine的使用中,我们仍然是在主系统中使用,而非子系统。(当然也可以直接在主系统中编译,省略此步)

debootstrap是debian/ubuntu下的一个工具,用来构建一套基本的系统(根文件系统)生成的目录符合Linux文件系统标准(FHS),即包含了/boot、/etc等目录,但它比发行版的Linux的体积小的多,功能也没有那么强大,只能算是“最基本的系统”

b.编译安装wine(以下示例为32位,64位略)

# 1.安装debootstrap
sudo apt install debootstrap

# 2.构建文件系统
sudo debootstrap --arch {平台} {发行版本号} {目录} {}
# Debian-x86
sudo debootstrap --arch i386 bullseye /home/{用户名}/debian11/debian11_i386 http://ftp.cn.debian.org/debian/
# Debian-x64
sudo debootstrap --arch amd64 bullseye /home/{用户名}/debian11/debian11_amd64 http://ftp.cn.debian.org/debian/
# 源可以使用清华源:http://mirrors.tuna.tsinghua.edu.cn/debian/

# 3.修改debian子系统的系统名,该步骤仅仅是为了便于区分主系统和子系统
cd /home/{用户名}/debian11/debian11_i386/etc/
vim debian_chroot
# 添加文件内容(若为64版本,则为debian11_amd64)
debian11_i386

# 4.将wine-{版本}源码拷贝进子系统的root目录下面(从主系统进行copy)

# 5.进入debian子系统
cd debian11/debian11_i386
sudo chroot .

# 6.运行依赖安装的脚本文件

# 7.在子系统中,进入到/root/wine-{版本}目录,进行配置
./configure

# 8.开始编译wine,其中的8为cpu核数
make -j8

# 9.安装wine到子系统的opt目录
make install DESTDIR=/opt/wine-{版本号}-x86

# 10.修改对安装后wine目录的访问权限
sudo chown -R {用户名}:{用户名} /home/{用户名}/debian11/debian11_i386/opt/wine-{版本号}-x86

# 11.验证wine是否安装成功,注意要在主系统中验证
exit
cd /home/{用户名}/debian11/debian11_i386/opt/wine-{版本}-x86/usr/local/bin
wine --version
  • wine使用(注意在主系统中使用)
# 1.容器创建(一个wine容器就是一个windows环境)
# 在用户目录下创建APPS目录,用于放置wine的容器
cd ~
mkdir APPS
# 指定容器位置
WINEPREFIX=~/APPS/{容器名:test-01}
# 启动wine的容器配置页面并生成容器
WINEPREFIX=~/APPS/{容器名:test-01} /home/{用户名}/debian11/debian11_i386/opt/wine-{版本}-x86/usr/local/bin/winecfg
# 更新容器(相当于windows重启)
WINEPREFIX=~/APPS/{容器名:test-01} /home/{用户名}/debian11/debian11_i386/opt/wine-{版本}-x86/usr/local/bin/wineboot

# 2.wine安装windows应用
# 将windows安装包下载到系统中(注意这里演示的为32位)
WINEPREFIX=~/APPS/{容器名:test-01} /home/{用户名}/debian11/debian11_i386/opt/wine-{版本}-x86/usr/local/bin/wine {安装包.exe}

# 3.wine运行应用(windows应用被安装在容器的drivec中)
WINEPREFIX=~/APPS/{容器名:test-01} /home/{用户名}/debian11/debian11_i386/opt/wine-{版本}-x86/usr/local/bin/wine {应用的可执行程序.exe}

5)Wine应用调试与修复

  • Winetricks

Winetricks是一个辅助脚本,用于下载和安装在Wine中运行某些程序所需的各种发行运行时库(可能包括使用闭源库替换Wine的组件)

下载地址

# 1.下载 Winetricks
cd ~/下载|download
wget https://raw.githubusercontent.com/Winetricks/winetricks/master/src/winetricks
chmod +x winetricks
cp winetricks /home/{用户名}/debian11/debian11_i386/opt/wine-{版本}-x86/usr/local/bin/

# 2.启动winetricks
WINEPREFIX=~/APPS/{容器名:test-01} WINE=/home/{用户名}/debian11/debian11_i386/opt/wine-{版本}-x86/usr/local/bin/wine /home/{用户名}/debian11/debian11_i386/opt/wine-{版本}-x86/usr/local/bin/winetricks

# 3.配置winetricks:选择默认的Wine容器、案桌Windows DLL或组件、添加库和组件、安装字体、修改设置、其他选项

# 4.配置容器时,可看作对windows系统的配置,在wine后加不同参数可以进行不同的配置,如下命令,其余配置项见下参数
# winecfg 运行Wine配置程序
# wine regedit 运行注册表
# wine taskmgr 运行任务管理器
# wine explorer 运行资源管理器
# wine uninstaller 运行卸载程序
# wine cmd 运行cmd
# 终端打开“C盘目录” 运行命令提示窗口(作为调试)
# 打开容器目录 浏览容器中的软件
# 删除容器 删除容器中所有数据和应用
WINEPREFIX=~/APPS/{容器名:test-01} /home/{用户名}/debian11/debian11_i386/opt/wine-{版本}-x86/usr/local/bin/wine regedit
# 对注册表进行介绍:
# HKEY_LOCAL_MACHINE:该基本的KEY包含关于Windows安装的一切(对应wine容器目录中的system.reg文件)
# HKEY_USERS:包含每个用户安装的配置数据(对应wine容器目录中的user.reg文件,userdef.reg对应HKEY_USERS\DEFAULT)
# HKEY_CLASSES_ROOT:这是HKEY_LOCAL_MACHINE\Software\Classes的一个链接,它包含了描述类的东西,如文件关联,OLE文档处理程序和COM类
# HKEY_CURRENT_USER:这是HKEY_USERS\{当前用户名}的一个链接,即个人配置注册表

# 5.应用修复
# 5.1应用修复的一种情况是容器中却少某些Windows下的DLL库,这时可以通过winetricks下载
# 5.2应用修复的另一种情况时,是应用运行时并不却少库文件,但运行时wine提供的(或下载的DLL)源码出错,这时只能分析依赖库源码的错误位置和问题、修改、重新编译、打包

# 6.应用封包
# 6.1将[修改后]的wine源码放到容器中
# 6.2将.exe和图标放入容器中(注意修改可执行程序到图标的链接,双击即可)
# 6.3进行一些配置文件、安装、卸载脚本的编写
# 打包
dpkg -b {目录} deb
dpkg -i {包名}.deb
dpkg -r {目录}

10.高可用存储技术

1)高可用存储技术概述

  • 高可用存储技术:是指为了提高存储系统可靠性、可用性和性能,而采用的一系列技术和手段;能实现数据备份和容灾恢复等功能
    • RAID(Redundant Array of Independent Disks):是一种通过多个磁盘组成逻辑卷,实现数据冗余和性能提升的技术,常用的包括:RAID 0、RAID 1、RAID 5、RAID 6等
    • SAN(Storage Area Network):是一种基于存储网络的数据存储技术,将存储设备(磁盘阵列、磁带库等)通过高速网络(光纤通道、iSCSI)与服务器连接起来,使得多台服务器可以共享存储设备。SAN技术支持多种不同的存储协议,如Fibre Channel、iSCSI等,可以满足不同场景和需求
    • NAS(Network Attached Storage):NAS是一种基于网络连接的数据存储技术,将存储设备(磁盘阵列、磁带库等)通过网络(如以太网)与服务器连接起来,使得多台服务器可以通过共享文件系统访问存储设备。NAS技术支持多种不同的协议,如NFS、CIFS等,可以与不同的OS和应用进行集成
    • 分布式存储技术:将数据分散存储在多个节点上,使得数据能够在多个节点之间进行备份和共享的技术。常用的分布式存储技术包括HDFS、Ceph、GlusterFS等
    • 数据复制和数据同步技术:将数据复制到多个节点上,并保持多个节点之间数据的一致性技术,包括Mysql主从复制、MongoDB副本集、Redis Sentinel等
    • 快照和备份技术:将存储设备的当前状态保存下来,以便在发生故障或数据丢失时进行恢复的技术,包括磁盘快照、增量备份、全量备份等
  • NFS上的主要高可用存储技术(网络中发生故障的点主要在网卡、链路和网关)
    • NFS:在网络上实现文件共享的协议,可以将服务器上的文件系统共享给多个客户端,从而实现文件的共享和访问。NFS可以提高文件共享的效率和可用性,同时降低文件和管理成本
    • RAID
    • LVM:在Linux上实现逻辑卷管理的技术,LVM可以将多个物理磁盘或分区抽象成一个逻辑卷组,然后再将逻辑卷组划分成一个或多个逻辑卷,从而实现灵活的存储管理和数据备份
    • iSCSI:在IP网络上实现存储设备共享的协议,它可以将存储设备抽象成一个逻辑上的卷,然后通过网络连接,使得多个主机可以共享这个卷,iSCSI可以提高存储设备的可用性,同时降低存储设备的成本和维护难度
  • 优点
    • 提高数据的可靠性和可用性:在硬件软件故障或其他异常情况下保证数据存储系统的正常运行,并提供可靠的数据备份和恢复能力,从而提高数据的可靠性和可用性
    • 提高存储系统的性能:将多个存储设备组合起来,实现数据的分布和负载均衡,从而提高存储系统的性能和吞吐量
    • 简化系统管理和维护:可以通过自动化的故障转移和数据备份机制,降低系统管理和维护的成本和复杂度
    • 提高存储的可扩展性:可以通过添加更多的存储设备或节点,实现存储系统的动态扩展,从而满足也无的不断增长需求
    • 提高业务的连续性和可靠性:通过数据的冗余备份和故障转移,实现业务的连续性和可靠性,从而保证业务的正常运行和稳定发展
  • 应用场景
    • 企业数据中心
    • 云计算和大数据平台
    • 金融、医疗和电信
    • 视频监控和物联网应用

2)RAID存储技术

  • 产生背景:容量小、速度慢、故障率高,磁盘技术赶不上CPU技术发展。1988 《A Case of Redudant Array of Inexpensive Disks》发表(小容量磁盘 + 廉价 = 大容量、高性能、高可靠)
  • 概述:RAID(冗余磁盘阵列)是一种将多个磁盘组合起来来提高存储性能和数据可靠性的技术
  • 特点
    • 容量更大:合并多块磁盘,海量存储,可达PB级
    • 高性能:分散存储、提高数据传输率
    • 安全性更好:数据镜像和冗余、数据校验和容错
    • 管理性更好:虚拟的逻辑驱动器、可动态增减、可自动重建,统一管理
  • 实现方式
    • 硬件RAID:成本高、性能高、受限于设备、高可靠性和稳定性
    • 软件RAID:成本低、性能低、灵活度高、可靠性一般
    • 软硬混合RAID
  • RAID级别
  • 软RAID实现
# mdadm命令
    # mode参数详解
        # -C:创建raid
        # -A:装配,一般用于重组raid
        # -G:改变raid中的设备参数(容量、设备数)
        # -F:监控,监控RAID写入日志
        # 无:管理/查询,用于增加或删除热备盘;报告或修改RAID中的设备信息
    # <raiddevice> /dev/md#
    # <component-device>:任意块设备,硬盘或分区均可
    # options:
    	# -C模式:
    		# -v:设置设备名为/dev/md0,md0即创建后的RAID名
    		# -a:yes参数表示自动创建设备文件
    		# -n:指定使用几块磁盘创建RAID
    		# -l:指定RAID级别
    	# 管理模式:
    		# -f 标记为错误
    		# -r 移出磁盘
    		# -a:向raid添加磁盘,作为热备盘
mdadm [mode] <raiddevice> [options] <component-devices>

# 1.创建RAID:合并4块磁盘,路径为/dev/md0,RAID名为md0,RAID级别为10,
mdam -Cv /dev/md0 -l 10 -n 4 /dev/sd[bcde]
# 查看创建信息
cat /proc/mdstat

# 2.格式化RAID
mkfs -t ext4 /etc/md0
# 查看信息
mdadm -D/dev/md0

# 3.挂载RAID
mkdir /raid
mount /dev/md0 /RAID
# 开机挂载RADI
mount /dev/md0 /RAID ext4 defaults 0 0
# 查看RAID信息
mdadm -D /dev/md0

# 4.模拟某个磁盘损坏,当RAID1磁盘阵列中存在一个故障盘时并不应影响RAID10的使用
# 标记错误
mdadm /dev/md0 -f /dev/sdn
# 查看RAID信息
mdadm -D /dev/md0

# 5.磁盘替换:先接入一块新粗盘然后再替换
mdadm /dev/md0 -a /dev/sdf
mdadm /dev/md0 -r /dev/sdb
mdadm -D/dev/md0

# 6.热备
# 创建raid5,使用sd[bcd]做数据盘,sde做热备份
mdadm -C -v /dev/md0 -l 5 -n 3 /dev/sd[bcd] -x 1 /dev/sde
# 查看RAID信息
mdadm -D /dev/md0
# 模拟/dev/sdb故障,热备自动接上
mdadm /dev/md0 -f /dev/sdb
# 查看RAID信息
mdadm -D /dev/md0

3)LVM存储技术

LVM(local volume manager)逻辑卷管理是一种在Linux系统上管理磁盘存储的技术。LVM在硬分区和文件系统之间增加了一个逻辑层,为文件系统屏蔽底层磁盘分区布局,并提供一个抽象的盘卷,在盘卷上建立文件系统

  • 物理磁盘被分为多个物理卷PV,每个物理卷可以是一个物理磁盘或磁盘分区
  • 多个物理卷可以组合成一个卷组,卷组是逻辑卷的容器
  • 逻辑卷LV是分配给文件系统或其他应用的逻辑存储设备

LVM的优点:

  • 卷组VG可以使多个磁盘空间看起来像一个大硬盘
  • 逻辑卷LV可以创建跨多个硬盘空间的分区
  • 在使用逻辑卷LV时,可以在空间不足时动态调节大小,不需要考虑逻辑卷LV在硬盘上的位置,不用担心没有可用的连续空间
  • 可以在线对卷组VG、逻辑卷LV进行创建、删除、调整大小等操作,但LVM上的文件系统也需要重新调节大小
  • LVM允许创建快照,保存文件系统的备份

LVM主要元素构成:

LVM操作:

# 1.添加两块物理磁盘,可直接创建物理卷,也可用fdisk先创建分区,分区类型必须为Linux LVM(8e),这里创建物理卷
pvcreate /dev/sdb /dev/sdc
# 查看物理卷,此时vg为空。下面解释物理卷字段含义:
# PV NAME:物理卷路径, /dev/sdb、/dev/sdc
# VG Name:卷组名称
# PV Size:物理卷大小
# Allocatable:是否可分配
# PE Size:块大小
# Total PE:总块数
# Free PE:空闲的块数
# Allocated PE:分配的块数
# PV UUID:物理卷的UUID
pvdispaly

# 2.创建卷族VG,将物理卷加入卷组
vgcreate myvg /dev/sdb /dev/sdc
# 查看卷组
vgdisplay

# 3.创建逻辑卷,割出8GB容量,并查看
lvcreate -n mylv -L 8G myvg
lvdisplay
lsblk

# 4.格式化卷为ext4文件系统
mkfs. ext4 /dev/myvg/mylv

# 5.挂载并使用卷
mkdir /myvol
mount /dev/myvg/mylv /myvol/
# 开机挂载
mount /dev/myvg/mylv /myvol/ ext4 defaults 0 0
df -h /myvol
ls -l /myvol

# 6.扩容逻辑卷
# 卸载挂载的卷
unmount /myvol
# 检测卷组剩余空间大小
vgdisplay
# 扩展逻辑卷到指定大小
lvextend  -r -L 9G /dev/myvg/mylv
# 重新挂载硬盘
mount /dev/myvg/mylv /myvol

# 7.缩容逻辑卷
# 卸载挂载的卷
unmount /myvol
# 缩容逻辑卷到7G
lvresize -r -L 4G /dev/myvg/mylv
# 重新挂载硬盘
mount /dev/myvg/mylv /myvol

# 8.逻辑卷快照:LVM采用写时复制技术,备份效率非常高,创建快照时不用停止服务。快照大小无需同原始卷一样大,可以跟随数据变化手动或自动扩容,建议大小一样
# 做快照
lvcreate -s -n snap -L 4G /dev/myvg/my
# 还原卷
unmount /myvol
lvconvert --merge /dev/myvg/snap

# 9.删除逻辑卷
# 卸载逻辑卷
unmount /myvo
# 删除逻辑卷设备
lvremove /dev/my_store/my_vol
# 删除卷组
vgremove my_store
# 删除物理卷
pvremove /dev/sdb/dev/sdc

4)iSCSI存储技术

  • 简介

iSCSI是Internet小型计算机系统接口,又称IP-SAN,可以简单地理解为一种基于网络和scsi协议下的存储技术,利用了TCP/IP的860、3260端口作为通信的渠道。两台计算机之间利用iSCSI协议来交换SCSI命令,可以让计算机通过高速局域网将SAN模拟成为本地的存储装置

优点:克服了传统SCSI接口设备物理局限性;实现了跨区域的存储资源共享;可在不停机状态下扩展存储容量;将存储资源分为多个服务器共同使用

缺点:受到网速制约

  • 拓扑结构
  • 部署iSCSI

iSCSI技术在工作形式上分为服务器端和客户端,iSCSI服务端用于存放硬件存储资源,为客户端提供可用的存储资源。iSCSI客户端可以远程访问服务端的存储资源

###### 部署iSCSI服务端 ######
# 1.安装并启动targetd服务
yum install -y scsi-target-utils
systemctl start targetd
systemctl enable targetd
# 2.配置iscsi服务共享资源
vim /etc/tgt/targets.conf
<target iqn.2021-07.com:lxdisk>
	backing-store /dev/sdb
</target>
systemctl enable tgtd
# 3.重新启动并配置防火墙
systemctl restart tgtd
firewall-cmd-permanent --add-port=3260/tcp
# 或关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

###### 配置iSCSI客户端 ######
# 1.安装客户端软件并配置
yum install -y iscsi-initiator-utils
vim /etc/iscsi/initiatorname.iscsi
# 写入服务端资源名称
systemctl restart iscsid
systemctl enable iscsid
# 2.iSCSI客户端发小、登录、认证
iscsiadm -m discovery -t st -p {ip:192.168.227.128}
iscsiadm -m node -T iqn.2017-07.com:lxdisk -p {ip:port 192.168.227.128:3260} --login
# 3.格式化挂载和使用
# 此时客户端多了一个设备/dev/sdb,将其格式化
mkfs.ext4 /dev/sdb
mount /dev/sdb /iscsi
# iscsiadm -u 可将设备卸载

5)NFS存储技术

  • 概述

简介:NFS(Network File System)即网络文件系统,它的主要功能是通过网络让不同计算机系统之间可以共享文件或目录。NFS与Samba服务类似,但一般Samba服务常用于办公局域网共享,而NFS常用于互联网中小型网站集群架构后端的数据共享。NFS文件系统是通过NFS协议实现的。

NFS协议:NFS协议是由Sun公司开发的,可以跨越不同OS和硬件平台使得不同计算机之间可以共享数据和资源。它支持访问控制、文件锁定和文件系统的安全性等特性,可以通过使用安全套接字层SSL或网络安全协议IPsec来保护数据的传输安全性。NFS协议支持多种不同的版本,包括NFSv2、v3、v4等,每个版本有不同的特性和功能。

NFS工作原理:在NFS服务器上,管理员将共享目录或文件夹标记为NFS可共享,当客户端需要访问这些文件或目录时,它们会向NFS服务器发送请求,在服务器上执行相应操作,并将结果返回给客户端。客户端可以通过挂载将NFS共享的目录作为本地文件系统的一部分来访问它们。

  • NFS参数

NFS参数用于配置和优化FNS服务器和客户端的配置,以提高NFS文件系统的性能和和可靠性;NFS参数设置通过NFS服务器上的配置文件/etc/exports实现

# 1.格式:[共享的目录] [主机名或IP](参数...)
/nfs_data 192.168.1.*(rw,sync,root_squash)
# 2.主机名或ip
# 192.168.152.13 指定IP的主机
# nfsclient.test.com 指定域名的主机
# 192.168.1.0/24 指定网段中的所有主机
# *.test.com 指定域下的所有主机
# * 所有主机
# 3.参数
# ro 只读
# rw 读写
# root_squash 当NFS客户端以root访问时,映射为NFS服务器的匿名用户
# no_root_squash 当NFS客户端以root访问时,映射为NFS服务器的root用户
# all_squash 无论NFS客户端用什么账户访问时,都被映射为NFS服务器的匿名用户
# sync 同时将数据写入内存和硬盘中,保证不丢失数据
# async 优先将数据保存到内存,再写入硬盘,效率提高但有丢失数据的风险
  • NFS的搭建和使用
# 1.搭建NFS服务器
# 安装NFS服务器软件
yum install nfs-utils
# 创建共享目录。并设置足够的权限确保他人有权写入
mkdir /nfs_data
chomd -Rf 777 /nfs_data
# 配置NFS服务器,编辑配置文件/etc/exports,添加要共享的目录和相关配置参数
vim /etc/exports
/nfs_data 192.168.1.*(rw,sync,root_squash)
# 重启NFS服务,在NFS服务器上重启NFS服务以使配置生效
sudo systemctl restart nfs-server
sudo systemctl restart rpcbind
# 开放NFS端口:永久开放public区域的2049、20048端口
firewall -cmd --zone=public --add-port=2049/tcp --permanent
firewall -cmd --zone=public --add-port=20048/tcp --permanent

# 2.配置NFS客户端
# 测试NFS共享
showmount -e 192.168.1.14
# 配置NFS客户端
mount -t nfs <nfs-server-ip>:/nfs_share /mnt/nfs
mount -t nfs 191.168.1.14 /opt/data /data

# 3.NFS开机挂载
192.168.1.104: /nfs_data /remote_nfs nfs defaults 0 0

11.高可用网络技术

1)高可用网络技术

  • 概述

高可用(High Availability,HA)网络技术:是指通过一系列方法和技术,降低网络故障的影响,提高网络系统的可靠性和稳定性的技术。确保网络在遇到故障或异常情况时,仍能继续向外提供业务服务能力。

  • 一些网络技术

    • 冗余技术:通过在关键部件和设备上增加备份,实现在单个部件发生故障时,系统仍能正常运行,如硬件冗余、链路冗余、数据冗余
    • 负载均衡:指将网络流量分散到多个服务器或设备上,提高网络的吞吐量,确保服务质量,如DNS负载均衡、硬件负载均衡器、软件负载均衡等
    • 故障检测与修复技术:主要用于实时监控网络状态,及时发现故障并进行自动故障切换。包含心跳机制、故障转移、数据同步
    • 集群技术:指将多态服务器或设备组成一个逻辑单元,共同提供服务。集群技术可以提高系统的可靠性和性能,包括主备集群、负载均衡集群、高性能计算集群
    • 网络协议与标准:网络高可用技术依赖于一些网络协议与标准:如HSRP、VRRP、BGP
  • NFS上主要高可用网络技术:

    • 链路聚合(含Bonding、Team):OS内核支持链路聚合技术,可以将多个物理网卡绑定成为一个逻辑网卡,提高带宽和可靠性。当其中一个物理网卡出现故障时,数据流会自动切换到其他可用的物理网卡上,保证网络的持续可用性
    • 网络故障切换(含VRRP):OS内核提供了一些网络故障切换机制,如VRRP协议、CARP协议等,可以在多个网络设备之间实现IP地址的自动切换,从而提高网络的可用性
  • 高可用网络技术的优点:提高网络的可用性;提高网络性能;提高容错能力;降低成本;提高安全性

  • 高可用网络技术应用场景:数据中心、云计算、高性能计算、工业控制

2)Bonding技术

bonding也称多网卡绑定,就是将多个物理网卡绑定成一个逻辑网卡,使用同一个IP工作

  • 实现原理
    • Bond设备:Bond技术创建一个虚拟的网络设备,称为Bond设备
    • 接口绑定:Bond技术将多个物理网络接口绑定在Bond设备上,形成一个虚拟的网络接口
    • 负载均衡算法:Bond技术支持多种负载均衡算法,如轮询、哈希、最小连接数等
    • 动态故障转移:Bond技术可以在一个或多个物理网络接口故障时,自动将流量重定向到正常的接口上,从而实现动态故障转移
    • MAC地址管理:Bond技术管理Bond设备的Mac地址,以及绑定在Bond设备上的物理网络接口的MAC地址
    • 配置和管理:Boud技术提供了丰富的配置选项,可以根据实际需求自定义网络接口的属性和行为
    • Bond技术位于OSI7层模型的第二层(数据链路层)和第三层(网络层)之间,在第二层实现了多个物理网络接口的绑定和负载均衡,在第三层实现了动态故障转移和多路径冗余等功能
  • bonding配置的前置准备
# NFS所有版本均支持bonding技术,Bonding由内核驱动实现
# 1.检查系统是否支持网卡绑定,TAB键补全
cat /boot/config-4.19.113-26.nfs4.x86_64 | grep -i bonding
# 2.检查OS是否已经加载了bonding内核模块
lsmod | grep bonding
# 3.若没加载bonding内核模块,则进行加载
modprobe bonding
# 4.检查网络接口是否网卡绑定(并非所有网络接口都支持网卡绑定)
# 列出当前系统中支持网卡绑定的网卡
cat /proc/net/bonding/*
  • bonding工作模式
模式名称说明
round-robin(mode=0)轮转策略,轮流在每一个slave网卡上发送数据包,提供负载均衡和容错能力
active-backup(mode=1)主备策略,只有一个slave被激活,只有当active的slave的接口down时,才会激活其它slave接口
XOR(mode=2)基于所选择的hash策略,本模式也提供负载均衡和容错能力
broadcast(mode=3)广播策略,向所有的slave接口发送数据包,本模式提供容错能力
802.3ad(mode=4)动态链路聚合,根据802.3ad标准利用所有的slave建立聚合链路
balance-tlb(mode=5)自适应传输负载均衡:根据每个slave的负载(相对速度)决定从哪个接口发送数据包,从当前接口接收数据包。如果接收的slave接口故障,其它slave接口将接管它的mac地址继续接收
balance-alb(mode=6)自适应负载均衡

mode1 5 6不需要交换机设置;mode 0 2 3 4需要交换机设置

  • bonding配置

图形化方式配置bonding:

1.创建bond:应用程序 -> 系统工具 -> 设置 -> 网络 -> 更多网络设置 -> 点击窗口左下角的+号 -> 选择绑定 -> 并新建

2.为bond绑定网卡:修改默认的轮询模式为主备(或其他模式) -> 点击添加按钮,并选择以太网,点击新建 -> 选择网卡设备,并保存 -> 重复添加第二块网卡

3.为bond配置ip:回到绑定主设置界面 -> 选择IPV4为新的bond设备分配ip地址:选择ipv4设置,方法改为手动,填写ip地址、子网掩码与网关,填写完勾选需要IPV4地址,点击保存按钮

4.激活bond

# 查看网卡连接状态
nmcli connection show
# 启用激活网卡:子接口被激活,bond就被激活;bond关闭,子接口就被关闭
nmcli connection up 'bond0 从机 1'
nmcli connection up 'bond0 从机 2'
# 查看双网卡bond
nmcli connection show

5.bonding测试验证

# 将ens33网卡down掉
nmcli connection down ens33-port
# 测试连接状态
ping 192.168.227.150

# 注意修改bond参数后一般重新加载配置,并重启网卡或服务
nmcli connection reload
nmcli connection down xxx
nmcli connection up
systemctl restart NetworkManager

# 使用bond后原来的网卡需要调整:
# 法1:取消自动连接
# 法2:删除配置文件
# 法3:设置配置文件noboot为no

使用配置文件创建bond

# 1.编辑网卡配置文件
# bond0网卡配置(略)
# 物理网卡配置(略)
# 2.启用激活网卡/重启网卡服务
nmcli connection up b-ens33 && nmcli connection up b-ens37
systemctl restart NetworkManager
# 3.检查状态
ip a.

使用命令创建bond

# 1.创建mode1的bond
nmcli connection add type bond con-name bond0 ifname bond0 mode 2
# 2.将网卡添加到bond
nmcli connection add type bond-slave con-name bond-slave-0 ifname ens33 master bond0
nmcli connection add type bond-slave con-name bond-slave-1 ifname ens37 master bond0
# 3.配置bond的ip
nmcli connection modify bond0 ipv4.addresses '192.168.227.150/24' ipv4.gateway '192.168.227.1' ipv4.method manual
# 4.激活重启bond
nmcli connection up bond-slave-0
nmcli connection up bond-slave-1
nmcli connection up bond0
# 5.检查
nmcli connection show
ip a

3)Team技术

  • 概述

Team也称网络组,是链路聚合的一种方式,将多个网卡聚合在一起,从而实现容错和提高吞吐量。网络组由内核驱动和teamd守护进程实现

  • Team运行模式
  • Team配置

图形方式配置Team:

1.创建Team:打开网络连接 -> 点击左下角的+号 -> 选择组队,并创建

2.为Team绑定网卡:点击添加并选择以太网,并点击新建;选择网卡设备,并保存;重复添加第二块网卡

3.选择team模式:回到组队主设置界面;点击高级-运行者,Rnner选择负载均衡并确定

4.配置IP:回到组队主设置界面;选择IPV4为新的team设备配置ip地址:选择ipv4设置,方法改为手动,填写ip地址、子网掩码与网关,填写完勾选需要IPV4地址,点击保存按钮

5.激活team

# 查看网卡连接状态
nmcli connectionb show
# 启用激活网卡
nmcli connection up 'team0 从机1'
nmcli connection up 'team0 从机2'
# 验证双网卡team
nmcli connection show && teamdctl team0 stat

使用配置文件创建team(略)

使用命令创建Team:

# nmcli命令介绍:nmcli是NetworkManager的cli
# 语法:nmcli [选项...] 对象 [命令] [参数...]
# 对象:help|general(常规信息)|networking(整个网络)|radio(无线开关)|connection(连接配置)|device(网络接口:显示或管理网络接口)|agent|monitor
nmcli connection up/down
nmcli connection add/modify
nmcli connection show

# 1.查看网卡
nmcli connection show
# 2.创建team网口,配置网络参数
nmcli connection add type team con-name team0 ifname team0 config '{"runner":{"name":"activebackup"}}'
# 3.加入指定网卡(将ens33和ens77加入到team0)
nmcli connection add con-name ens33-port ifname ens33 type team-slave master team0
nmcli connection add con-name ens37-port ifname ens37 type team-slave master team0
# 4.配置team0的ip地址
nmcli connection modify team0 ipv4.method manual ipv4.address '192.168.227.150/24' ipv4.gateway '192.168.227.1'
# 5.重新加载team0配置
nmcli connection reload
systemctl restart NetworkManager
# 重新查看网络状态
nmcli connection show
# 6.激活team0配置
nmcli connection up ens33-port
nmcli connection up ens37-port
nmcli connection up team0
# 7.重新查看网络状态,查看team0状态
nmcli connection show
teamdctl team0 start

Team测试验证:

# 1.将ens33网卡down掉
nmcli connection down ens33-port
# 2.测试team连接状态
ping 192.168.227.150
  • Bonding与Team对比(两者相似但存在一定区别)
    • 支持的OS不同:bonding技术内置于Linux内核,只支持Linux系统;team技术由Rat Hat开发,支持Linux和Windows
    • 实现机制不同:bonding基于网卡driver实现,需要专用的bonding driver来聚合网卡;team由用户空间的team daemon实现,不需要特定的网卡driver,更加通用
    • 功能差异:bonding更注重网卡聚合和容错,team在此基础上增加了更高级的负载均衡和通道选择;team支持LACP聚合,bonding对LACP的支持较弱;team可以根据实时流量和拓扑变化动态选择通道和接口,bonding的选择较为静态
    • 性能差异:team在大流量和复杂拓扑环境下,可以实现更高的网络吞吐量和更优的负载均衡;bonding的性能会略低于team,尤其在LACP场景下

4)VRRP技术

  • 简介

VRRP(Vitrual Router Redundancy Protocol)虚拟路由冗余:是一种网络协议,用于在多个路由器之间共享一个虚拟ip地址,实现网络的高可用。当主要路由器故障时,备份路由器可以自动接管虚拟IP地址,确保网络的连通性;虚拟IP可以与设备上某台设备的IP地址一致,也可以不一致。它使用ARP协议进行交互,只在同一子网内生效。

  • VRRP的状态和选举
名称说明
Initialize(不可用状态)此状态下设备不会对VRRP通告报文做任何处理,通常设备启动时或设备检测遇到故障时会进入Initialize状态
Master此状态下会承担虚拟路由设备的所有转发工作,并定期向整个虚拟内网发送VRRP通告报文
Backup此状态下不会承担虚拟路由设备的转发,并定期接收Master设备的VRRP通告报文,判断Master的工作状态是否正常

选举机制:

由几台路由器组成的虚拟路由器又称为VRRP备份组,一个VRRP备份组在逻辑上为一台路由器,VRRP备份组建立后,各设备会根据所配置的优先级来选取Master设备

  • 工作原理
  • 配置
# 配置前提
# 所有参与VRRP的设备处于同一局域网,且网卡开启了multicast组播功能
ifconfig
# 各设备安装KEEPALIVED
sudo yum install keepalived
# 开放端口,并确保两台服务器之间的网络连通性
systemctl disable --now firewalld
setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=diabled/' /etc/selinux/config
# 配置Master、backup服务器上的配置文件:/etc/keepalived/keepalived.conf
# 测试VRRP:关闭Master的keepalive
systemctl restart keepalive

12.云计算

1)云计算概述

  • 简介

云计算是一种灵活方便的按需计算模式,可以通过网络访问和使用计算资源的共享池(如网络、服务器、存储、应用程序服务),以最少的管理付出,达到各种计算资源迅速的配置和推出

云的提供者角度:虚拟化资源、高自动化、简化和标准化、动态调整、开发的成本增长

云的用户角度:简单实用、单位付费、资产变费用、标准付费、灵活交付

  • 特点
    • 虚拟化技术:应用虚拟化和资源虚拟化,突破了时空局限
    • 动态可扩展:高效运算能力,在原有服务器基础上增加云计算功能使得计算速度迅速提高
    • 按需部署:不同的用户对资源的需求不同,云计算平台能够根据用户的需求快速配备计算能力和资源
    • 兼容性高:兼容低配置机器、不同厂商的硬件产品,还能使外设获得更高计算性能
    • 可靠性高:单点服务器出现故障,可以通过虚拟化技术将分布在不同物理服务器上的应用进行恢复,或利用动态扩展功能部署新的服务器进行计算
    • 性价比高:将资源放在虚拟资源池中统一管理,一定程度上优化了物理资源,用户不再需要昂贵、大存储的主机,一方面减少费用,另一方面计算性能并不逊于大型主机
  • 云计算的服务模式
    • 软件即服务(SaaS):消费者使用应用程序,但并不掌握OS、硬件或网络基础架构,是一种服务观念的基础,软件服务提供商以租赁的形式提供用户服务,而非够买(如提供一组帐号密码)
    • 平台即服务(PaaS):消费者使用主机操作应用程序,消费者掌控运作应用程序的环境(也拥有部分主机掌控权),但并不掌握OS、硬件或网络的基础架构。平台通常是应用程序基础架构。
    • 基础设施即服务(laaS):消费者使用“基础计算资源”,消费者能掌控OS、存储空间、已部署的应用程序和网络组件,但不掌握云基础架构
  • 云计算的部署方式
    • 公有云:公有云资源由第三方云服务提供商拥有和运营,通过Internet提供,所有硬件、软件和其他支持性基础结构均为云提供商所拥有和管理
    • 私有云:由专供一个企业或组织使用的云计算资源构成,服务和基础结构始终在私有网络上进行维护、硬件和软件专供组织使用
    • 社区云:由中多利益相仿的组织掌控和使用,社区成员共同使用云资料和应用程序
    • 混合云:公有云和私有云接合,用户通常将非企业关键信息外包,并在公有云上处理,将关键服务和资料在私有云上处理
  • 国内私有/公有云市场分析

2)云计算的实现:虚拟化技术

  • 虚拟化(Virtualization)是一种资源管理技术,是云计算的技术实现,虚拟化是将计算机的各种实体资源(CPU、内存等)给予抽象、转换后的呈现,并可供分割、组合成一个或多个电脑配置环境。由此,打破实体结构间不可切割的障碍,使用户可以比原本的配置更好的方式来应用这些电脑硬件资源。这些资源的新虚拟部分,不受现有资源的架构方式,地域或物理配置所限制。
  • 虚拟化技术分类:完全虚拟化;半/标准虚拟化
  • 虚拟化方式
    • 完全虚拟化:又称硬件辅助虚拟化技术,是最初使用的虚拟化技术,它在虚拟机VM和硬件之间加了一个软件层Hypervisor。Hypervisor在虚拟服务器和底层硬件之间建立了一个抽象层,能捕获CPU指令集,位指令访问硬件控制器和外设充当中介,它运行在逻辑硬件上,充当操作系统,而由Hypervisor管理的虚拟服务器运行客户端系统。全虚拟化在性能方面不如裸机,因为Hypervisor需占用一些资源,给CPU带来开销
    • 半虚拟化(Para Virtualization):将客户端系统进行了修改,增加了专门的API,这些API可以将客户端OS发出的指令进行最优化,即不需要Hypervisor耗费资源进行翻译操作,因此Hypervisor的工作负担变得很小,其缺点是需要修改客户端OS
    • KVM虚拟化(Kernel-based Virtual Machine):是集成到Linux内核的Hypervisor,是X86架构且支持硬件支持虚拟化(Intel VT或AMD-V)的Linux全虚拟化解决方法,它是Linux的一个小模块,但利用了Linux做了大量的事,如任务调度、内存管理以及与硬件设备交互等
    • Xen虚拟化:Xen是运行在裸机上的虚拟化管理程序(Hypervisor),支持全虚拟化和半虚拟化,Xen支持Hypervisor和虚拟机相互通信,其优势在于半虚拟化时未经修改的OS也可以直接在Xen上运行
    • 硬件虚拟化
      • 英特尔虚拟化技术(IVT,Intel Virtualization Technology):由英特尔开发的一种虚拟化技术,利用IVT在系统上的客户端系统通过虚拟机查看器(VMM,Virtual Machine Monitor)来虚拟一套硬件设备,以供客户OS使用。这些技术以往在VMWare和Virtual PC上都通过软件实现,而IVT硬件支持可以加速此类软件的运行
      • AMD虚拟化(AMD Vritualization),是AMD64位X86架构提供的虚拟化扩展的名称,但有时会用Pacifica来指代它

3)云计算开源管理工具-OpenStack

  • 简介

OpenStack是一个云操作系统,主要是部署laaS,通过大数据中心可以控制大型的计算、存储、网络等资源池,实现公有云和私有云的部署和管理,所有管理通过前端界面即可完成(也可通过 Web API)

  • OpenStack架构
  • 云平台模块

OpenStack采用分布式架构,按照功能不同分为多个模块组件,各个组件之间通过统一的RESTful风格的API调用,实现系统的松耦合,采用Python语言开发。其模块有:

名称解释
Compute Service(“Nova”)计算资源生命周期管理组件
NetWork Service(“Neutron”)提供云计算环境下的虚拟网络功能
Block Storage Service(“Cinder”)管理计算实例所使用的块级存储
Object Storage Service(“Swift”)对象存储,用于永久类型的静态数据的长期存储
Image Service(“Glance”)提供了虚拟机镜像的发现、注册、获取服务
Identity Service(“Keystone”)提供用户信息管理,位其他组提供认证服务
Dashboard(“Horizon”)管理、控制OpenStack服务的Web控制面板

4)云计算平台——产品实例

AWS、Azure、阿里云、腾讯云、华为云…

架构

控制节点的高可用负载均衡、计算节点的高可用、弹性伸缩、后端存储、逻辑管理、云数据库、显卡虚拟化支持、容器支持

5)Docker技术

6)k8s

  • 简介

K8s是Kubernetes的简称,它是一个可移植的、可扩展的开源平台,用于管理容器化的工作负载和服务,可使用声明式配置和自动化

  • 用途
    • 服务发现和负载均衡:Kubernetes可以使用DNS名称或自己的IP公开容器,若进入容器的流量很大,Kubernetes可以负载均衡并分配网络流量,从而使部署稳定
    • 存储编排:Kubernetes支持自动挂载存储系统,如本地存储、云存储
    • 自动部署和回滚:可以使用Kubernetes描述已部署容器的所需状态,它可以以受控的速率将实际状态改为期待状态
    • 自动完成装箱计算:K8s允许你设置每个容器所需的CPU和内存资源,当容器指定了资源请求时,K8s可以做出更好的决策来管理容器的资源
    • 自我修复:Kubernets重新启动失败的容器、替换容器、杀死不响应用户定义的容器,并在准备好服务之前不将其通告给客户端
    • 密钥与配置管理:K8s允许你存储和管理敏感信息,如密码、OAuth令牌、ssh密钥,可以在不重建容器镜像的情况下,部署、更新密钥和应用程序配置,也不会在堆栈配置中暴露密钥
  • 基础概念
    • Pod:是k8s能被运行的最小的逻辑单元,1个pod里可以运行多个容器,它们共享环境、存储卷和IP空间。Pod控制器是Pod启动的一种模板,用来保证K8s李启动的pod始终按照预期状态运行。其余pod控制器还有:
      • Deployment(使用最多的控制器)、DaemonSet(每个节点起一个)
      • ReplicaSet(Deployment管理ReplicaSet,ReplicaSet管理pod)
      • StatefulSet(管理有状态应用)
      • Job(执行一次性任务)、Cronjob(job类型的控制器)
    • Name:k8s内部使用“资源”定义每一种逻辑概念,因此每种资源都应该有自己的名称,“名称”通常定义在“资源”的元数据信息里。资源的种类有:api版本、类别、元数据、定义清单、状态等
    • Namespace
    • Label:便于分类管理资源对象,一个标签可以对应多个资源;一个资源可以有多个标签。
    • Service:一个Service是一种抽象,它定义了一组Pods的逻辑集合和一个用于访问它们的策略。一个Service可以看作一组提供相同服务的Pod的对外访问接口,作用于通过标签选择器来定义的Pod
    • Ingress:Ingress是K8s集群里在OSI中第7层应用层对外的接口.Service只能进行L4流量调度(ip+port),Ingress则可以调度不同业务域、不同URL访问路径的业务流量
  • K8s架构

K8s遵循传统的CS架构,客户端可以通过RESTful API或直接使用kubectl与K8s进行通信。每一个K8s集群都由一组Master节点和一系列的Worker节点组成,其中Master节点主要负责存储集群状态并为K8s对象分配和调度资源

节点介绍:

Node:kube-kubelet(部署容器,监控容器)、kube-proxy(提供容器间的网络)

Master:主要负责接收客户端请求,按排容器的执行并运行控制循环,将集群的状态向目标进行迁移。Master节点内部由7个组件组成:

名称说明
APIServer(kube-apiserver 中央管理器)调度管理集群
Controller(kube-controller-manager控制器)管理容器、监视容器
Scheduler(kube-scheduler调度器)调度容器
Flannel提供集群间网络
Etcd数据库
Kubelet部署容器,监控容器
kube-proxy提供容器间的网络
  • k8s安装

安装Kubernetes(k8s)保姆级教程-博客园

###### 环境准备(两台机器) ######
# 1.将系统中的yum源换成阿里源
# 2.同时关闭系统中的dnsmasq服务,它和k8s使用的端口有冲突
# 3.关闭senlinux和防火墙,让k8s集群之间不做额外配置即可正常通信
# 4.关闭swap,swap开启时通过cgroups设置的内存上限就会失效
# 5.调整内核参数,以解决Service同节点的通信问题

###### 安装依赖和k8s服务 ######
# 1.安装docker,下载repo文件后更新yum缓存后安装docker
# 2.docker换源
# 3.安装k8s服务
# 4.配置驱动,docker的Cgroup Driver和kubelet的Cgroup Driver不一致,需要修改为一致

###### 初始化master节点 ######
# 1.执行kubeadm init 指令
kubeadm init {kubernetes-version:指定k8s版本,根据下载的k8s安装包来配置} {apiserver-advertise-ip:设置apiserver绑定的ip,此处选择master的ip} {image-repository:拉取control plane images的镜像源} {service-cidr:指定service服务的ip范围} {pod-network-cidr:指定pod的网络范围,它会把范围传递给后面的node节点}
# 2.创建kubectl配置文件:非root用户使用kubectl工具,需进行以下配置
# 3.添加网络组件:使用calico实现网络配置

###### 添加node节点 ######
# 1.获取token:在master节点查看node节点需要的token值(该token存在有效期,过期后可通过该命令重新生成)
# 2.创建配置文件:创建kubectl配置文件,让此node节点同样可以使用kubectl命令
  • k8s使用
# 1.Pod部署
# Pod是k8s中的基本单位,容器不会直接分配到主机上,而是会封装到Pod对象中。Pod通常表示单个应用程序,由一个或多个关系密切的容器构成。这些容器拥有同样的生命周期,作为一个整体一起编排到Node上共享环境、存储卷和IP空间
# 创建模板文件:examplepod.yml
# api版本号,v1为稳定版本
apiVersion v1
# 表示要创建的资源对象类型
kind Pod
# 资源对象的元数据,此处只使用了资源名称
metadata:
	name examplepod
# 资源对象的具体配置
spec:
	# 容器集合,此处只有一个容器
	containers:
		# 要创建的容器名
		name: examplepod-container
		# 容器的镜像地址
		image: busybox
		# 镜像的下载策略,Always、Never、ifNotPresent
		imagePullPolicy: ifNotPresent
		# 容器的启动命令列表(若不指定,则使用镜像自带的命令)
		command: ['sh','-c']
		# 启动参数列表
		args: ['echo "Hello k8s! replaced";sleep 3600]
		# 端口设置:主机端口和容器端口的映射
		ports:
			name: portforngxin
			containerPort: 80
			hostPort: 8082
			protocol: TCP
	# 存储卷设置:将存储附加到容器上,不管是数据卷还是数据卷容器,其存留时间通常会超过其他容器的生命周期
	volumes:
		name: filedata
		emptyDir: {}

# 2.Pod基本操作
# 创建Pod
kubectl apply -f examplepod.yml
# 查询pod
kubectl get pod examplepod
# 对pod的状态进行持续监控
kubectl get pod examplepod -w
# 获取pod的更多信息
kubectl get pod examplepod --output yaml
kubectl get pod examplepod --output json
# 查询pod的全部信息
kubectl describe pods examplepod
# 查询pod自身输出的日志信息
kubectl logs examplepod
# 修改pod
kubectl replace -f examplepod.yml --force
# 删除pod
kubectl delete pod examplepod
kubectl delete -f examplepod.yml
# 查询pod所有字段的定义
kubectl explain pod

7)方德云桌面解决方案与高阶操作

云计算产品方案 - 中科方德-国产操作系统 (nfschina.com)

桌面服务、计算管理、存储管理、网络管理、镜像管理、日志管理、资源报表、用户管理、运维中心、系统管理

13.Wine开发进阶

Wine64位应用适配

  • 环境搭建

1)构建debian11 32、64位子系统

2)通过预备的脚本文件对wine-7.17源码进行编译和构建32、64位(在home/{user}/下创建两个文件夹、下载所需的两个依赖、将wine-7.17源码拷贝到wine_build_code目录下,并对其中的config文件夹赋权限、运行脚本./01-build_wine_install.sh remake 7.17)具体的编译思想为:分别先编译36、64版本,再将32位打到64位中重新编译

  • 应用安装

1)创建容器(注意使用指定的wine)

WINEPREFIX=~/APPS/nds-win-u  /home/jldx/build_wine_edit/build_install_dir/wine-7.17-amd64/usr/local/bin/winecfg

指定使用win10版本

2)安装依赖

  • 安装gecko
WINEPREFIX=~/APPS/nds-win-u  /home/jldx/build_wine_edit/build_install_dir/wine-7.17-amd64/usr/local/bin/wine uninstaller

(将gecko、mono、fonts复制到/home/jldx/build_wine_edit/build_install_dir/wine-7.17-amd64/usr/local/share/wine目录下)

  • winetricks安装.net 4.8

将winetricks 脚本下载复制到/home/jldx/build_wine_edit/build_install_dir/wine-7.17-amd64/usr/local/bin/目录,并加权限chmod +x winetricks

WINEPREFIX=~/APPS/nds-win-u WINE=/home/jldx/build_wine_edit/build_install_dir/wine-7.17-amd64/usr/local/bin/wine /home/jldx/build_wine_edit/build_install_dir/wine-7.17-amd64/usr/local/bin/winetricks

选择默认的wine容器,安装windows DLL或组件,安装donet48

  • 安装ie8
WINEPREFIX=~/APPS/nds-win-u WINE=/home/jldx/build_wine_edit/build_install_dir/wine-7.17-amd64/usr/local/bin/wine /home/jldx/build_wine_edit/build_install_dir/wine-7.17-amd64/usr/local/bin/winetricks

选择默认的wine容器,安装windows DLL或组件,安装ie8

  • 安装完成

安装完成后,运行winecfg把windows的版本改回win10

WINEPREFIX=~/APPS/nds-win-u  /home/jldx/build_wine_edit/build_install_dir/wine-7.17-amd64/usr/local/bin/winecfg

3)应用安装

WINEPREFIX=~/APPS/nds-win-u /home/jldx/build_wine_edit/build_install_dir/wine-7.17-amd64/usr/local/bin/wine /home/jldx/桌面/wine/第2阶段/02-软件/Nex3D2022/Nex3D.exe

4)应用启动(注意命令行中有空格的话要用单引号或双引号)

WINEPREFIX=~/APPS/nds-win-u /home/jldx/build_wine_edit/build_install_dir/wine-7.17-amd64/usr/local/bin/wine '/home/jldx/APPS/nds-win-u/drive_c/Program Files/NDS/Nex3D 2022/Program/Nex3D.exe'

第一次运行会失败,忽略重启即可

  • 应用问题与修复

新建零件 -> 保存 (保存失败)

开启bcrypt通道再次运行

WINEPREFIX=~/APPS/nds-win-u WINEDEBUG=fixme-all,+bcrypt /home/jldx/build_wine_edit/build_install_dir/wine-7.17-amd64/usr/local/bin/wine '/home/jldx/APPS/nds-win-u/drive_c/Program Files/NDS/Nex3D 2022/Program/Nex3D.exe'

调试:wine-7.17/dlls/bcrypt/gnutls.c/key_asymmetric_encrypt()

问题修复:wine-7.17/dlls/bcrypt/gnutls.c/key_asymmetric_import

重新编译wine源码:

./01-build_wine_install.sh make 7.17

(最后将wine-7.17-3D将wine-7.17进行替换,重新编译)

14.视频捕获机制:Directshow

  • Windows音视频框架

  • DirectShow框架介绍

    • Microsoft DirectShow 是 Microsoft Windows 平台上流式传输媒体的体系结构,提供高质量的多媒体流的捕获和播放
    • DirectShow基于组件对象模型 (COM) ,若要编写DirectShow应用程序或组件,必须了解COM 客户端编程
    • DirectShow是一种开放体系结构,这意味着只要有筛选器来分析和解码它,它就可以支持任何格式
    • 头文件:Dshow.h 所有DirectShow应用程序
    • 库文件:Strmiids.lib (CLSID 导出类标识符) 和接口标识符 (IID)
    • 基类:Windows SDK 提供了一组 C++ 类,如果编写自定义DirectShow筛选器,建议使用这些类
    • DEFINE_GUID宏解决了在源代码中声明 extern 对 GUID 值的引用的问题
  • 筛选器和筛选图形

DirectShow的构建基块是一个名为筛选器的组件。它用于对多媒体流执行某些操作。 例如,DirectShow筛选器可以:读取文件、从视频捕获设备获取视频、解码各种流格式,例如 MPEG-1 视频、将数据传递到图形或声卡。

筛选器接收输入并生成输出。 例如,如果筛选器解码 MPEG-1 视频,则输入为 MPEG 编码流,输出是一系列未压缩的视频帧。
在DirectShow中,应用程序通过将筛选器链连接在一起来执行任何任务,以便一个筛选器的输出成为另一个筛选器的输入。 一组连接的筛选器称为 筛选器图:

从广义上讲,有三个任务DirectShow应用程序必须执行:应用程序创建筛选器Graph管理器的实例;应用程序使用筛选器Graph管理器生成筛选器图。 图形中的确切筛选器集将取决于应用程序;应用程序使用筛选器Graph管理器来控制筛选器图并通过筛选器流式传输数据。 在此过程中,应用程序还将响应来自筛选器Graph管理器的事件。处理完成后,应用程序将释放筛选器Graph管理器和所有筛选器

15.自动化测试

  • 自动化测试与方德自动化测试框架介绍

1)介绍

概念:自动化测试是将以人工驱动的测试行为转换为机器执行的测试行为

主要类型:基于代码的白盒和灰盒测试(UT);基于界面工具的操作测试(IT/ST);协议级测试(PT)

为什么要自动化测试:产品迭代速度快(尤其是移动APP);多种软硬件测试环境;越来越多的公司采用敏捷开发快速迭代的开发模式

优点:避免重复工作、提高测试效率、保证每次测试的一致性和可重复性、更好的利用资源(周末/晚上的资源空闲时段)、节省人力资源、缩短开发周期让产品更快投放市场、提高软件测试的准确性和精确度

场景:软件需求变动不频繁、产品更新维护周期长、比较频繁的回归测试、自动化测试脚本可复用

2)方德持续集成测试环境框架介绍

技术实现:

名称技术
控制终端/前端ant-vue,vue
后端微服务FastAPI
数据库mysql
分布式消息队列Celery + redis
持续集成工具Jenkins
OS方德服务器操作系统

功能:

功能名称功能介绍
节点管理CRUD不同平台测试机的信息
任务管理测试任务管理,创建单个或批量任务,异步任务分配执行,任务进度状态查看
任务模板
定时任务
执行模式脚本执行模式(白盒或灰盒脚本);基于界面工具的执行模式(方德Lance自动化测试工具);定制执行模式

3)方德自动化测试工具介绍

产品功能介绍

架构设计

实现方式:

名称技术
客户端界面pyQt
图像/数据处理OpenCV、Pandas、gonomescreenshot
窗口事件pynput、pyautogui(基于xlib)

环境搭建

  • Pandas

Pandas是python中基于numpy、matplotlib的第三方数据分析库,可以与Scipy、scikit-learn、Matplotlib等库进行整合

1)数据结构:Series、DataFrame

2)读写csv、excel

3)数据访问、数据处理、数据统计

  • OpenCV

1)主要功能和模块介绍

名称介绍
内置数据结构和输入/输出内置丰富的与图像处理有关的DS,如Image、Point、Rectangle等;core模块实现了各种几本的数据结构;imgcodecs模块提供了图像文件的读写功能
图像处理操作图像过滤、几何图像变换、绘图、色彩空间转换、直方图
图形用户界面操作highgui模块提供了图像的图形窗口操作功能,如创建窗口显示图象、视频,令窗口响应键盘和鼠标事件、操作窗口中图像的某个区域
视频分析video模块提供了视频分析功能,如分析连续帧之间的运动、跟踪视频中的目标;videostrab模块提供了视频稳定处理功能,可以解决拍摄视频时的抖动问题;optflow模块提供了与光流操作相关的算法
3D重建calib3d模块提供了3D重建,可根据2D图像创建3D场景
特征提取features2d模块提供了特征提取功能,可以从2D图像中检测和提取对象的特征
对象检测objdetect和xobjdetect模块了对象检查功能,可在图形中检测给定图像的位置
机器学习
视深度学习支持Caffe、Tensorflow、Torch、Darknet等深度学习框架
计算摄影通过图像处理技术来改善像机拍摄的图像,如高动态范围成像、全景图像、图像补光等;photo、xphoto模块提供了与计算摄影有关的算法,stitching模块提供了全景图像成像
人脸检测和识别
表面匹配surface_matching模块提供了3D对象识别算法和3D特征的姿态估计算法,用于根据图像的深度和强度信息识别3D对象
文本检测和识别

2)OpenCV-Python

OpenCV-Python是原始OpenCV C++实现的Python包装器,是OpenCV库的Python接口,需要依赖Numpy库

OpenCV文档 OpenCV-Python示例

3)基础

图像基础:二值图、灰度图、数字图像;Numpy;读/写/显示图;颜色通道、通道拆分;图像运算;读写视频、视频解码格式;绘图:直线、矩形、圆、椭圆;图像变形:缩放、翻转;图像处理:阈值、cv2.threshold()全局阈值处理(二值化阈值处理、反二值化阈值处理、截断阈值处理、低阈值零处理、0tsu算法阈值处理、三角算法阈值处理)、cv2.adaptiveThreshold自适应阈值处理、cv2.blur滤波、cv2.GaussianBlur高斯滤波;图像直方图:用于统计图像内各个灰度级出现的次数,横坐标表示灰度级、纵坐标表示灰度级的数量(计算直方图cv2.calcHist、直方图对比cv2.compareHist、直方图反投影cv2.calcBackProject

跨平台的可以模拟鼠标进行自动操作的python库

16.日志服务

系统日志是记录OS运行状态和发生事件的重要手段之一,可用于故障排查、安全监控、性能优化、合规要求等,管理系统日志对于系统的稳定性、安全性、性能和合规性都有重要意义

  • rsyslog日志服务

1)介绍

rsyslog是一个功能强大的日志记录守护进程,提供了更多的日志处理和管理功能,是syslog的增强版,其优点/特点为:

①支持更多的日志记录方式:它可以从各种来源(系统内核、应用程序、网络连接等)读取日志消息;

②支持更多的日志存储方式:它可以将这些日志消息记录到指定位置(文件、DB、远程主机等)

③多线程、支持多种协议(UDP、TCP、SSL、TLS、RELP)、支持加密协议:SSL、TSL、RELP

④强大的过滤器,实现过滤日志信息中的任何部分内容、可以自定义输出格式

方德OS中的日志记录就由rsyslog服务负责,同时也可以使用syslog的方式访问

2)rsyslog服务配置

# 开启服务
systemctl status/start/stop syslog
# systemctl status/start/stop rsyslog

rsyslog配置文件:

①/etc/rsyslog.conf:主配置文件,包含了全局配置信息和基本规则

②/etc/rsyslog.d:额外配置文件目录,可含多个文件;按照文件名的字母顺序依次加载,可以覆盖扩展主配置文件中的规则

resyslog.conf配置说明:

①MODULES:定义消息来源,通过加载不懂模块实现接收不同的日志信息,甚至接收其他设备的日志信息(指定协议、端口)

$Modload imuxsock:从本地系统读取(如通过logger命令)、$ModLoad imjournal从journal中读取、$ModLoad imklog从内核读取、$ModLoad imudp使用UDP协议,也可用TCP协议、$UDPServerRun 514开启UDP514端口

②RULES:定义过滤规则和转发规则

过滤器:根据不同的条件过滤出不同日志信息,如:if $programname == 'apache2' then /var/log/apache2.log将Apache消息写入/var/log/apache2.log文件

动作:收到日志后需要执行的动作,一般为日志写入远程文件或发送到远程服务器,如:local0.* @192.168.1.100:514

GLOBAL DIRECTIVES:输出(存储位置格式)

①定义日志输出格式:Stemplate myFormat,"%timegenerated% %HOSTNAME% %syslogtag% %msg% \n "

②指定输出格式:*.* /vat/log/messages;myFormat

日志级别:

服务名称 [连接符号] 日志等级 日志记录位置
authpriv . * /var/log/secure

①服务名称

服务名称并非是linux服务,而是rsyslog自己定义的日志类型

名称(日志类型)说明
authpam产生的日志
authprivssh等登录日志的验证消息
cron计划任务日志
kern内核日志
lpr打印日志
mail邮件日志
uucp主机之间相关的通信
news新闻组

系统日志级别

级别解释
0 emerg系统不可用
1 altert必须立即采取行动
2 crit严重情况
3 err非常严重错误
4 warning警告
5 notice正常但重要
6 info一般信息
7 debug调试级别信息
none什么都不记录

3)rsyslog日志文件和日志格式

rsyslog日志文件默认位于/var/log下,一般有:

文件路径解释
/var/log/messages最常用的日志文件,记录了系统启动、运行和关闭过程中产生的所有信息,包括内核启动信息、系统服务启动信息、用户登录信息等
/var/log/secure记录安全事件的日志文件,包括用户登录成功或失败、sudo命令执行、ssh连接等安全相关事件
/var/log/dmesg记录内核启动和运行期间的消息,包括硬件监测信息、驱动加载信息等
/var/log/boot.log记录系统启动时的所有消息,包括系统服务的启动信息、硬件检测信息等
/var/log/cron记录所有与cron计划任务相关的信息,包括计划任务的执行情况、错误信息等
/var/log/audit/audit.log记录系统的审计事件,包括用户的登录、文件访问、系统配置更改等

rsyslog日志格式:

事件产生的时间 产生事件的服务器主机名 产生事件的服务名或程序名 事件的具体信息
Jun 5 03: 20: 46 localhost sshd[1630]: Accepted password for root from 192.168.0.104 port 4229 ssh2

4)日志转发配置

# 服务端:确定使用TCP或UDP传输数据、加载imtcp、imudp模块、开放服务端口
vi /etc/rsyslog.conf
$ModLoad imtcp
$ InputTCPServerRu = 514
# 通过程序名称,输出到不同log文件中
if $programname == 'my' then /var/log/my.log
# 也可以通过消息设备,输出到不同log文件中
# local 0.* /var/log/abc.log

# 客户端:将local0设备的日志转发到远程服务器,@代表UDP,@@代表TCP,用TCP传输更稳定
vi /etc/rsyslog.conf
local0.* @@192.168.1.100:514
  • 日志服务journald

1)介绍和原理

systemd-journald是systemd系统管理工具的一部分,可以从系统内核、启动过程、系统和应用的标准输出过程中收集日志,以二进制文件形式(相比于传统的文本格式,可以提供更高效的读写性能,每一条日志信息都包含了一个头部和正文,头部包含了时间戳、日志级别、进程ID等信息,正文则是日志内容)存储到/run/log下,系统重启后会消失。systemd-journal提供日志转储功能,日志信息在内存中存储在一个环形缓冲区,当缓冲区满时,则会转储到磁盘中。

其日志数据目录为:/run/log/journal/系统id中(系统id可由bootctl查看,与Machine ID一致)

2)配置文件

其配置文件为:/etc/systemd/journald.conf,一些配置信息为:

# 日志存储方式:auto默认,自动选择存储方式;volatile只存储在内存中;persistent只存储在硬盘中
Storage=auto
# 日志保留时间,超过指定时间段的日志将被自动删除
MaxRetentionSec
# 设置日志的最大使用量、单个文件大小、最大文件数
SystemMaxUse
SystemMaxFileSize
SystemMaxFiles
# 设置是否将日志转发到syslog或输出到控制台
ForwardToSyslog
ForwardToWall
# 设置日志压缩、加密、分割方式和大小等参数
Compress
Seal
SplitMode
SplitSize
SplitIntervalSec

3)使用

systemd-journal提供了丰富的查询和过滤功能,可以通过journalctl命令和API调用实现

# journalctl直接执行,默认列出所有日志条目
journalctl
# -k 查看内核日志
# -b 查看系统本次启动的日志
# -u 查看指定服务的日志
journalctl -u sshd
# 指定日志条数
journalctl -n 5
# -f 追踪日志
# _pID 根据进程id查看
# 根据级别查看
journalctl -p err
# 查看指定时间的日志
journalctl -S "2022-3-19"
# --disk-usage 查看当前日志占用磁盘空间的大小

4)与syslog对比

①技术架构

rsyslog:是一款独立的日志管理工具,可以在各自不同系统上使用

systemd-journald:是systemd系统管理工具的一部分,与systemd的其他组件紧密结合(system-logind)可以提供更高效、可靠、灵活的日志记录和管理功能

②日志格式

rsyslog:支持多种日志格式,包括传统的syslog格式、RFC、5424格式、JSON格式等

systemd-journald:采用二进制格式存储

③日志存储

rsyslog:支持将日志信息输出到文件、远程服务器、数据库等多种方式

systemd-journald:将日志写入内存和磁盘,支持自动转储和压缩功能

④日志查询和过滤

均提供丰富的查询和过滤等功能

⑤集成性

rsyslog:可以与其他日志工具集成,如logrotate、syslog-ng等

systemd-journal:可以与systemd其他组件集成,如systemd-logind、systemd-networkd等

JOURNAL日志在Linux系统中逐渐被广泛使用,很多Linux发行版本都默认启动JOURNAL日志系统,逐渐减少对syslog的依赖

  • 日志轮转服务logrotate

1)介绍

logrotate是一个用于轮转系统日志文件的工具,可以定期将日志文件进行轮转,即压缩、删除或备份旧的日志文件,创建新的日志文件。通过配置文件来控制轮转行为,可设置轮转的频率、保留的日志文件数、压缩方式等参数

# 查看、开启、关闭轮转服务
systemctl status/start/stop logrotate

logrotate运行原理:定时启动 -> 轮转条件判断 -> 轮转方式 -> 轮转执行 -> 结束

logrotate不仅能对rsyslog产生的日志文件有效,对其他任何文件(甚至如wtmp二进制文件)都有效

2)配置

主配置文件:/etc/logrotate.conf 额外配置文件:/etc/logrotate.d

# rotate:保留旧文件数,指定要保留的旧日志文件的数量
# size:轮转条件1,指定日志文件的最大大小,若日志文件超过该大小,就会被轮转。可以使用k、M、G等后缀表示千字节、兆字节、千兆字节等
# daily、weekly、monthly:轮转条件2,指定日志文件的频率,将日志文件按天、周、月轮转,默认按周
# dateext:指定在轮转日志文件时,是否在日志文件名中添加日期后缀
# compress:在轮转日志文件时,是否压缩旧的日志文件
# delaycompress:在轮转日志文件时,是否要延迟压缩旧的日志文件,直到下次轮转时才进行压缩
# notifempty:在轮转日志文件时,如果日志文件为空,是否执行轮转操作
# create:日志轮转方式1,指定在轮转日志时,是否创建一个新的空日志文件(重命名旧日志文件,创建新日志文件)
# copytruncate:日志轮转方式2,指定在轮转日志文件时,是否直接截断旧日志文件的内容,并将截断的内容复制到一个新的日志文件中(复制旧日志文件,然后清空原日志文件)

# 配置实例1
# /etc/logrotate.conf
cat /etc/logrotate.conf
# 将日志文件按周轮转
weekly
# 保留4个文件,超过的旧日志文件会被删除
rotate 4
# 轮转后创建新的空日志文件
create
# 在轮转后使用日期做文件名后缀
dateext
# 单独配置实例最好放在该目录下
include /etc/logrotate.d

# 配置实例2
# /etc/logorotate.d/syslog
cat /etc/logrotate.d/syslog
# 针对该日志文件的轮转策略
/var/log/messages{
	# 使用日期作为旧文件名后缀
	nodateext
	# 如果日志文件不存在,logrotate不报错继续执行
	missingok
	# 每小时执行一次日志轮转
	hourly
	# 轮转时不创建新文件
	copytruncate
	# 压缩格式为gzip
	compress
	# 若日志文件为空,则不执行轮转操作
	notifempty
	# 保留4个文件
	rotate 4
	# 日志文件达到指定大小时才执行轮转操作
	size 500M
}
  • 日志审计auditd

1)介绍

auditd是系统中的一个审计框架,用于记录系统和应用程序的安全相关事件和行为,并提供审计日志查询和分析功能,auditd可以监控系统中的文件访问、进程操作、网络通信、用户登录等行为,并将相关的事件记录在审计日志中,以供后续的查询和分析。auditd也是日志管理的一部分,是一款用于管理和记录系统安全相关事件和行为的工具

相关工具:

auditctl:即时控制审计守护进程行为的工具,如开启、关闭审计,添加审计规则等

aureport:查看和生成审计报告的工具

ausearch:查找审计事件的工具

相关配置文件:

/etc/audit/auditd.conf:auditd工具的配置文件

/etc/audit/audit.relues:记录审计规则的文件

2)auditd服务和配置

auditd守护进程

# 查看、启用auditd守护进程
systemctl status/enable auditd

如果auditd内核模块启动了(auditctl -s查询enabled为1),但用户空间的auditd守护进程没有运行,审计日志无人接管,日志就会被写到/var/log/messages中

# /etc/audit/auditd.conf
# 日志存储的位置
log_file
# 指定一个单独的audit log文件的最大SIZE,单位是M,默认为8M
max_log_file
# 当日志达到最大size后要执行的动作,设置为KEEP_LOGS时,可以避免日志被重写
max_log_file_action

3)审计规则

auditd根据一组规则运行,规则定义了日志文件中需要获取什么内容。审计规则有两种类型:文件系统规则(也称文件监控,记录文件或目录的访问);系统调用规则(记录任何指定程序所做的系统调用)

审计规则的定义:默认审计是空的,需要自定义规则:临时规则(通过auditctl生成,重启后会失效);永久规则(在/etc/audit/audit.rules文件中定义)

4)auditctl命令

# 1.控制参数
# 设置使用标识:0关闭,1开启,2锁定,一般在设置其他规则后设置,防止他人修改规则,只有重启后该标识才能修改
auditctl -e 1
# 列出所有当前配置的规则
auditctl -l
# 删除所有当前加载的规则
auditctl -D
# 查询audit内核状态
auditctl -s
# 设置内核中audit缓冲空间的最大值
auditctl -b
# 内核如何处理critical errors:0=slient 1=printk 2=panic,1为默认值
auditctl -f

# 2.制定临时规则
# 2.1文件系统规则
auditctl -w path_to_file -p permissions -k key_name
# -w path:指定要监控的路径
# -p :指定要触发审计的文件/目录的访问权限rwxa:r读取权限,w写入权限,x执行权限,a attr属性
# -k: 添加标签,方便使用ausearch查找
# 实例:记录所有对/etc/passwd文件的写入和属性修改
auditctl -w /etc/passwd -p wa -k passwd_changes
# 2.2系统调用规则
auditctl -S system_call -a action,filter -F field=value -k key_name
# -S:system_call:系统调用的名称,可以使用多个用空格各开,系统调用的名字可以在/usr/include/asm/unistd_64.h中查看
# -a action和filter:系统调用的事件,action可以为always和never,filter可以为task,exit,user,exclude
# -F field=value:附加选项,修改规则以匹配特定架构、Group ID、Process ID等事件,具体可以参考https://linux.die.net/man/8/auditctl
# 实例:每次使用系统调用adjtimex或settimeofday时,且为64位架构,记录审计日志
# -k: 添加标签,方便使用ausearch查找
auditctl -a always,exit -F arch=b64 -S adjtimex -S settimeofday -k time_change

# 3.制定永久规则:
# 将如sudo auditctl -w /etc/passwd -p rwxa等规则写入/etc/audit/audit.rules或/etc/audit/rules.d/audit.rules
# 重启服务
service auditd restart

# 4.审计日志查看和生成报表
# 通过日志查看
cat /var/log/audit/audit.log | grep time_change
# 通过命令查看
ausearch -k time_change
ausearch -f /mnt
# 生成audit报表:柱状图
# 日志时间范围报表
aureport -t
# 关于异常事件响应的报表
aureport -r
# 关于可执行文件的报表
aureport -x
# 默认情况在/var/log/audit目录喜爱的所有日志文件都会生成一个报表,也可以使用以下命令来指定一个不同的文件
aureport options -if file_name
  • 日志监控与分析

1)日志监控方法

# 1.实时监控日志
tail -f
# 实时监控/var/log/messages文件的变化
tail -f /var/log/messages
watch -n
# 每隔5s执行一次last命令并显示结果
watch -n 5 last
# 实时查看最新的日志信息
journalctl -f

# 2.集中监控:使用rsyslog和syslog-ng等工具将日志信息输出到文件、远程服务器、数据库等多种方式,通过第三方软件查看监控日志信息

2)日志分析方法

文本文件:包含syslog、RFC 5424、JSON等格式;syslog以及大多数日志文件,可以使用tail、more、less、cat、grep、sed、awk等文本处理工具查看

二进制文件:JOURNAL日志、wtmp、btmp、lastlog等,需要使用特定命令(who、w、users、last、lastb等)查询获取信息

日志文件类型作用
/var/log/messages文本型记录linux内核消息及各种应用程序的公共日志消息
/var/log/cron文本型记录cron计划任务产生的事件消息
/var/log/audit/audit.log文本型记录系统审计日志
/var/log/cups文本型记录打印信息的日志
/var/log/secure文本型记录用户认证相关的安全事件信息
/var/log/lastlog二进制型记录每个用户最近的登录事件
/var/log/wtmp二进制型记录每个用户登录、注销、系统启动和停机事件
/var/log/btmp二进制型记录失败的、错误的登录尝试和验证事件

17.系统性能调优

  • 系统调优流程

1)衡量系统现状:包括当前系统的请求次数、响应时间、资源消耗等信息

2)设定调优目标:根据用户所能接受的响应速度或普遍经验估算所需达到的目标,最好能有量化的数据

3)寻找性能瓶颈:找出造成目前系统性能不足的最大瓶颈

4)性能调优:确定优化策略,选择其中收益比最高的优化方案,进行优化

5)优化部署后,继续衡量系统的状况,如已达到目标,则可结束此次调优,若未达到目标,则需要查看是否产生了新的性能瓶颈;或可以继续考虑上一步制定的其他优化方案,直到达成调优目标或论证在目前的体系结构上无法继续调优为止

  • 更改内核参数

1)proc文件系统

proc文件系统提供了一个访问正在运行的内核的接口,使管理员在联机状态下可以监控和更改内核。/proc/sys下属目录包含大量控制参数,系统依据这些参数运行(全部参数查询

# 实时(临时)调优方法:修改/proc立即生效,注意不恰当的调整会带来危险,重启后又会恢复为默认值

# 1.使用echo value方式直接追加到文件里
echo  "3" >> /proc/sys/vm/drop_caches

# 2.使用sysctl命令,在更改前会检查数据一致性
sysctl vm.drop_caches=3
# 使设置立即生效
sysctl -p

2)sysctl.conf配置文件

sysctl.conf是关于控制方面的系统级别的配置文件,在系统启动时自动加载;如在系统运行过程中修改,需重启系统或source刷新文件后才生效

# 刷新配置文件
source /etc/sysctl.conf
# 永久调优方法:使用vi编辑/etc/sysctl.conf文件
# e.g.当free低于100M时,开始回收cache内存,以释放内存
vm.min_free_kbytes=102400
  • CPU性能调优

1)进程优先级

优先级类型:

名称类型说明
SCHED_FIFO静态先进先出,一直运行到IO阻塞
SCHED_RR静态相同优先级使用轮询策略
CHED_OTHER动态基于CFS策略自动调优,其优先级是通过进程的虚拟运行时间确定的,nice值仍会影响进程的虚拟运行时间
SCHED_BATCH动态基于优先级的抢占式调度策略,使用nice调节
SCHED_IDLE动态运行优先级非常低的程序,比nice19还低
SCHED_DEADLINE动态基于截止时间的调度策略
# 1.查看进程优先级调度策略
chrt -m

# 2.静态优先级调优方法
# 以指定轮询策略,优先级60运行程序
chrt -r 60 bash
# 查看新打开的bash调度策略
chrt -p $$
# 查看已运行程序的策略和优先级
chrt -p 46453
# 调整已经运行程序为FIFO策略,优先级为60
chrt -fp 46453

# 3.SCHED_BATCH调优方法:nice与优先级有对应关系:20-19;60-99
# 启动时指定
nice -n [-20~19] cmd
# 启动后修改
nice -n [-20~19] pid

2)CPU亲和力(Affinity)

CPU亲和力是将一个或多个进程(线程)绑定到一个或多个CPU上,它用位掩码表示,如pid 50859的亲和力掩码为:f(1111),说明它可以运行在0-3CPU上

逻辑CPUCPU0CPU1CPU2CPU3
位掩码1101001000
# 1.查看最近一次线程运行的CPU核(PSR)
ps -eLF | head -10
ps -eo pid.psr.cmd | grep 50859

# 2.CPU亲和力调优方法:taskset
# 查看CPU亲和力
taskset -p 50859
# 启动时指定cpu1运行bash
tastset -c | bash
# 查看当前程序
taskset -p $$
# 启动后修改cpu0,1,3运行程序
taskset -cp 0,1,3 $$

3)NUMA系统

早期CPU通过一个共享总线访问系统内存,容易引发竞争产生平静。NUMA的主存通过单独的总线直接连接CPU

# 查看瓶颈:如果出现numa_miss和other_node高值尝试使用renice或taskset更改节点
cat /sys/devices/system/node/node0/numastat

# NUMA调优
# 查看CPU在node中如何划分,以下命令会显示node与内存之间访问的相关权重,值越低速度越快
numactl -hardware
# 查看node内存分布
cat /sys/devices/system/node/node0/meminfo
# 调整进程运行node
# 在node0上运行进程,所有分配的内存在node0和node1上
numactl --cpubind-0 --membind=0.1 <process>
# 设置优选node1,显示结果状态
numactl --preferred=1
numactl -show
# 重置共享内存文件的策略为默认的localalloc策略
numactl --localalloc /dev/shm/file
  • 内存性能调优

1)限制程序可用内存

系统中内存管理从进程级别的调整变为应用程序级别的调整

# 1.查看一个进程使用了哪些虚拟地址
pmap {pid}
cat /proc/{pid}/maps
cat /proc/{pid}/smaps

# 2.优化方法
# 修改unit配置文件,在[Service]块中添加MemoryLimit限制
vim /etc/systemd/system/syslog.service
[Service]
# syslog设置为1G
MemoryLimit=1G
# 刷新配置
systemctl daemon-reload

2)OOM Killer

系统内存不足时会调用OOM Killer(out of Memory Killer)杀死一个或多个进程来释放内存,以满足需求。为进程设置一个不良分数(badnessscore)可以避免被杀死,oom adj值从-17到15;0表示不改变(默认);-17表示不能被杀死;其他值会影响oom_score,并可能被杀掉,负值意味着有较小机会会被内核终结

# 查看不良分数
cat /proc/{pid}/oom_score
# 优化不良分数
echo -17 /proc/{pid}/oom_adj
# 列出所有进程的oom_score值
for file in /proc/*/oom_score; do echo -n "$(basename $(dirname $file))"; cat $file; done | sort -nk 2
# 将输出发送到dmesg
echo f > /proc/sysrq-trigger

3)内存分页回写

内存分页状态

名称说明
Free分页有效,可立即被分配
Inactive Clean分页使用不活跃,数据同磁盘上的数据一致,或为刚分配的分页
Inactive Dirty分页使用不活跃,数据同磁盘的数据不一致,未被写回,也称脏数据
Active分页使用活跃,不能释放
# 1.查看分页
# 系统所有分页
cat /proc/meminfo
# 进程分页状态
cat /proc/{pid}/smaps

# 2.优化:系统会周期性回写脏数据,调整回写参数可以降低内存占用
# 经过多久(百分之1秒)脏数据才有资格写入到磁盘
vm. dirty_expire_centisecs=300
# 内核多长时间(厘秒)唤醒flush线程写出一次数据
vm. dirty_writeback_centisecs=500
# 脏数据达到系统内存的百分比,内核开始回写
vm. dirty_background_ratio=10
# 一个进程所拥有的脏数据达到系统总内存的百分比,该进程阻塞,回写脏页
vm. dirty_ratio=30

4)调整swap趋势与内存回收

>=100
<100
内存不足
交换内存
计算swap趋势
交换
回收内存
不交换

调整swap趋势:

内存交换机制:vm. swappiness控制换出运行时内存的相对权重,会严重影响swap趋势。swappiness对如何使用swap分区有很大关系,值越大,表示越积极地使用swap分区;值越小,表示越积极地使用物理内存。

将swappiness设为100时,swap趋势一定大于100,可以大大提高IO密集型工作的性能;设置为0时,强制系统尽可能少地swap

# 积极使用物理内存
echo "0" > /proc/sys/vm/swappiness
# 积极使用swap
sysctl -w vm.swappiness=100
# 刷新配置
sysctl -p

内存回收:

内存回收机制:系统内存不足时(free)开始释放缓存

# 查看
free
# 当free低于100M时,开始回收cache,以释放内存
sysctl -w vm.min_free_kbytes=102400
# 强制把cahche写入磁盘,防止丢失数据
sync
# 1表示清除pagecache
echo 1 > /proc/sys/vm/drop_caches
# 2表示清除slab分配器中的对象,包括dentries(目录项缓存)和inode缓存
echo 2 > /proc/sys/vm/drop_caches
# 3表示清除1-2
echo 3 > /proc/sys/vm/drop_caches

5)使用多个swap

swap空间的位置和数量对swap性能有很大影响,同一优先级pri的swap可以同时写入

优化策略

# 1.在一个机械硬盘上,在磁盘的外部边缘放置swap分区,将得到更好的吞吐量(磁盘边缘的IO速度更快)
parted /dev/sdb mkpart primary linux-swap 0% 4GB

# 2.创建多个swap分区,病设置同一优先级,多swap分区或文件的可以并行读写
mkswap /dev/sdb
mkswap /dev/sdc
swapon -p 5 /dev/sdb
swapon -p 5 /dev /sdc
  • 磁盘IO性能调优

1)冗余磁盘阵列

磁盘的数量是IO的关键,用数量换IO,用空间缓安全

优化:

# 用vdd和vde创建raid0的盘md0
mdadm -Cv /dev/md0 -l 0 -n 2 /dev/vdd /dev/vde
# 格式化文件系统
mkfs -t xfs /dev/md0
# 查看并检查信息
mdadm -D /dev/md0
# 挂载使用
mount /dev/md0 /mnt/raid

2)IO调度的选择和调整

系统支持4种IO调度算法

名称说明
mq-deadline基于多队列的IO调度算法
kyber基于预测模型的IO调度算法
bfq基于块级别反馈的IO调度算法
none未启动任何IO调度算法(默认)
# 查看当前IO调度
cat /sys/block/sda/queue/scheduler
# 调整IO调度算法(如下调整为deadline)
echo "mq-deadline" > /sys/block/sda/queue/scheduler

3)文件系统的选择和调整

不同文件系统的吞吐能力不同:

JFS、XFS适合于:高端数据仓库、科研工作量、大型SMP服务器和流媒体服务器

ReiserFS、Ext3适合于:文件、Web、邮件服务器

Ext2适合于:性能比数据完整性更重要时(它没有日志功能)

# 查看文件系统类型
df -Th
# 更换文件系统和挂载
mkfs.xfs /dev/sda1
mount -t xfs /dev/sda1 /mnt
  • 网络性能调优

1)网卡绑定

增加带宽是提高网络性能的关键

# 创建mode1的bond
nmcli connection add type bond con-name bond0 ifname bond0 mode 2
# 将网卡添加到bond
nmcli connection add type bond-slave con-name bond-slave-0 ifname ens33 master bond0
nmcli connection add type bond-slave con-name bond-slave-1 ifname ens37 master bond0
# 配置bond的ip信息
nmcli connection modify bond0 ipv4 address '192.168.227.150/24' ipv4 gateway '192.168.227.1' ipv4.method manual
# 激活启动bond
nmcli connection up bond-slave-0
nmcli connection up bond-slave-1
nmcli connection up bond0
# 检查
nmcli connection show
ip -a

2)网卡速度参数

网卡支持10Mb/s、100Mb/s、1000Mb/s,支持全双工和半双工模式。现在一般都使用1000Mb/s,在全双工模式下,网卡的自动协商可以和对端设备自动协商最高速率

# 查看
ethtool ens33
# 优化
# 临时设置
ethtool -s ens33 autoneg off speed 1000 deplex full
# 永久设置:写入网卡配置文件
cat /etc/sysconfig/network-scripts/ifcfg-ens33
ETHTOOL_OPTS="OPTIONS"

3)增加网络缓冲区

分配更多的内存资源给网络缓冲区,可以使系统处理更多的网络数据包

# 设置接收socket的内存默认值和最大值到一个更高的值
/proc/sys/net/core/rmem_default
/proc/sys/net/core/rmem_max
# 设置发送socket的内存默认值和最大值到一个更高的值
/proc/sys/net/core/wmem_default
/proc/sys/net/core/wmem_max
# 调整可选内存buffers的最大值到一个更高的值
/proc/sys/net/core/optmem_max

4)适当关闭网络过滤器和防火墙可以提高网络性能

不要使用过多的、复杂的规则;有条件可以关闭

### iptables服务 ###
# 停止iptables服务
systemctl stop iptables
# 禁止iptables服务开启自启
systemctl disable iptables
### firewalld服务 ###
systemctl stop firewalld
systemctl disable firewalld

5)调整TCP/IP

# 禁用以下参数防止黑客针对服务器的ip地址进行欺骗攻击
sysctl -w net. ipv4 conf. eth0. accept source route=0
sysctl -w net. ipv4 conf. lo.accept source route=0
sysctl -w net. ipv4 conf. default. accept source route=0
sysctl -w net. ipv4 conf. all. accept source route=0
# 配置服务器忽略来自别列为网关机器的重定向(重定向可以被用来进行攻击,因此只需要允许它们来自信任的源)
sysctl -w net. ipv4. conf. eth0. secure redirects=1
sysctl -w net. ipv4. conf. lo. secure redirects=1
sysctl -w net. ipv4. conf. default. secure redirects=1
sysctl -w net. ipv4. conf. all. secure redirects=1
# 禁用ICMP的重定向
sysctl -w net. ipv4. conf. eth0. accept redirects=1
sysctl -w net. ipv4. conf. lo. accept redirects=1
sysctl -w net. ipv4. conf. default. accept redirects=1
sysctl -w net. ipv4. conf. all. accept redirects=1
  • 限制资源的使用

1)用户资源限制

/etc/security/limits.conf可以进行用户资源限制,该文件通过PAM登陆的用户资源限制(即配置针对单一用户或用户组设置并生效)

该文件由4个字段组成:

名称解释
domain表示用户或用户组的名称,*表示所有用户和用户组
typesoft:达到软限制发出警告;hard:达到硬限制系统将不再分配对应资源
item资源名称
value资源值
# 限制test用户组中的任何用户,仅可以登陆系统2次
@test soft maxlogins 2
@test hard maxlogins 2

可以使用ulimit工具查看和设置limits.conf文件的内容

2)最大文件句柄数

# 全局设置(所有用户合计):系统可以打开的最大文件数量
# 查看:默认为369402
cat /proc/sys/fs/file-max
# 修改
echo fs. file-max=102400 /etc/sysctl.conf
sysctl -psource /etc/sysctl.conf

# 单用户设置
# 查看
ulimit -n
# 修改:普通账号可操作的文件句柄数
echo * soft nofile 65535 >> /etc/security/limits.conf
echo * hard nofile 65535 >> /etc/security/limits.conf
# 退出重新登陆生效

3)最大创建线程数

# 全局设置
cat /proc/sys/kernel/pid_max
echo "kernel.pid_max = 65535" >> /etc/sysctl.conf
sysctl -p
# 单用户设置
ulimit -u
echo * soft|hard nproc 65535 >> /etc/security/limits.conf
# 退出重新登陆生效
  • 性能监控工具(使用时具体查询)
名称说明
free查看内存
vmstat查看进程和内存:获取有关进程、虚存、页面交换空间和CPU活动信息,这些信息反应了系统的负载情况
sar(System Activity Reporter)系统活动报告:是目前Linux上最全面的系统性能分析工具之一,可以从:文件读写、磁盘IO、CPU效率等方面报告
iostat属于sysstat软件包(yum install sysstat),主要用于磁盘IO和CPU的统计
top用于实时显示process的动态
netstat查看服务和监听端口
tepdump可以将网络中传送的数据包完全截下来进行分析,它支持对网络层、协议、主机、端口进行过滤

18.方德高可用集群软件

高可用集群简称HA集群,是一组大规模并行处理器的集合,集群中各节点之间可以互相通信,目的是提高系统的带宽和可用性,常用的有:高可用集群、负载均衡集群、共享存储、磁盘镜像或这几类交叉融合

  • 方德高可用集群特点

    • Web端图形化管理界面
    • 智能可靠的切换策略:节点故障时短时间切换、故障排除后服务自动回迁
    • 多样化的集群模式:双机热备、双击互备、多机备份、共享存储热备、多种容错保护
    • 确保数据一致性:多心跳机制、仲裁机制、防护设备支持、邮件报警
    • 多CPU架构支持
    • 多存储方式支持:磁盘共享、磁盘镜像(DRBD分布式设备复制,数据写入本地时会实时复制到另一镜像设备)
    • 应用监控和定制化服务、支持高级服务类型(克隆、资源群组、资源排序、资源协同等)
  • 双机热备部署实例(使用方德高可用集群软件)

环境准备:

1)集群所有节点服务器都需要部署方德高可用集群软件

2)监控应用准备:集群管理应用的安装和配置;设置集群管理应用服务的开启动;集群应用共享存储

3)网络环境:业务网络(节点服务器一个网卡配置业务网段,虚拟IP需要和业务网络在同一网段);心跳网络配置(节点服务器一个网卡配置心跳网段,不需要配置网关;若双机集群,节点服务器和心跳网线直连;若为节点集群,节点服务器和心跳服务器可以通过交换机连接);心跳网络和业务网络建议使用不同网段;集群内节点间的网络需要正常通信

4)存储:方德高可用集群支持:SAN、SAS、磁盘镜像(应用软件的初始数据保存到存储系统中)

# 1.安装高可用集群软件
# Node1、Node2节点
rpm -ivh nfs-ha-suite-standard-3.0.2-5.nfs.x86_64.rpm
# 查看软件包是否安装成功
rpm -qa | grep nfs-ha-suit

# 2.安装高可用集群软件
nfs-ha-install

# 3.安装应用软件
# 高可用集群节点上安装apache和mariadb服务
yum install httpd -y
yum install mariadb mariadb-server -y
# 测试apache和mariadb服务是否正常
systemctl start httpd
systemctl status httpd
systemctl start mariadb
systemctl status mariadb
mysql -u root -p
# 停止两服务
systemctl stop httpd
systemctl stop mariadb
# 禁止应用开机自启,后续使用高可用管控服务启停
systemctl disable httpd
systemctl disable mariadb

# 4.防火墙放行端口
firewall-cmd --add-port=2224/tcp --permanent
firewall-cmd --add-port=5405/tcp --permanent
firewall-cmd --add-port=7789/tcp --permanent
firewall-cmd --reload

# 5.卸载高可用集群
/usr/bin/nfs-ha-uninstall
rpm -e nfs-ha-suite-lite

# 6.镜像磁盘搭建
# 创建DRBD磁盘,两节点均添加一个3G的磁盘,可使用lsblk命令查看
# 两节点修改/etc/drbd.d/global_common.conf文件
# 两节点自定义资源文件/etc/drbd.d/mystore.res
# 初始化已定义资源并定义服务(两节点)
# 创建mystore
drbdadm create-md mystore
# 启动drbd服务和磁盘
systemctl enable drbd
systemctl start drbd
# 查看drbd磁盘
lsblk
drbdadm status
# 设置node1为primary状态
drbdadm primary mystore --force
# node1创建文件系统
mkfs.ext4 /dev/drbd0
# node1手动挂载测试
mouont /dev/drbd0 /data
umount /mnt/drbd
# 设置node1恢复为secondary状态
drbdadm secondary mystore

# 7.双机热备部署
# 两节点启动pcsd服务并设置开机启动
systemctl start pcsd
systemctl enable pcsd
systemctl start pcsd
systemctl enable pcsd
# 查看服务是否启动
systemctl status pcsd
  • 方德高可用集群软件使用

ULR:https://{ip}:2224 用户名:admin 密码:nfschina123

WEB端:创建高可用集群、集群节点状态、集群资源类型、添加pingvip、Filesystem、mariadb、apache、VIP资源、资源组、集群状态查看、数据迁移到镜像磁盘、邮件报警配置与测试

终端:

# 1.查看任意节点状态
pcs status
# 2.切换节点
# 暂停节点
pcs node standby node1
# 恢复节点
pcs node unstandby node2
# 3.启动和停止集群
pcs cluster stop --all
pcs cluster start --all
  • 故障模拟实践

19.方德负载均衡软件

  • Nginx介绍

1)负载均衡产品介绍

负载均衡是支持应用程序资源池中平均分配网络流量的一种方法。负载均衡器是位于用户与服务器组之间的设备,充当不可见的协调者,确保均等使用所有资源服务器。其作用有:提高系统的可用性和可靠性;提高系统的性能和吞吐量;提高系统的可扩展性和灵活性

2)负载均衡技术类型:硬件负载均衡;软件负载均衡;混合负载均衡

3)Nginx发行版介绍

名称介绍官网发行单位
开源NginxWeb服务器、反代服务器、负载均衡器https://nginx.org/en/download.html开源社区
Nginx plus商业解决方案https://www.nginx.comF5
Openresty封装了Lua脚本http://openresty.org/en/download.html开源社区
Tengine以C的形式,模块化开发各个功能http://tengine.taobao.org/download_cn.html淘宝开源

4)Nginx目录介绍

5)Nginx进程模型

客户端发送命令的实际执行者是Worker进程

# 强制退出nginx
./nginx -s stop
# 优雅推出nginx
./nginx -s quit
# 重新加载配置文件
./nginx -s reload
# 检查配置文件的准确性
./nginx -s -t

6)Nginx代理模式介绍

正向代理:

​ 正向代理是为客户端服务器代理,客户端指定代理服务器和目标服务器,请求经代理服务器转发获取目标服务器的数据

​ 场景:翻墙

​ 用途:突破访问限制、提高访问速度(代理服务器可设置大缓存命中时直接返回请求结果)、隐藏客户端信息

反向代理:

​ 反向代理是为服务端服务器代理,客户端指定代理服务器,而无需指定目标服务器,请求经代理服务器按一定规则转发获取目标服务器的数据

​ 场景:负载均衡(Nginx的代理模式)

​ 用途:隐藏服务信息、负载均衡、提高访问速度(代理服务器设缓存)、为服务端提供安全保护、服务端与客户端解耦,增加扩容灵活度和并发量

  • Nginx负载均衡策略与配置

1)负载均衡策略

名称策略
轮询(round-robin)每个请求按访问次序逐一分配到不同的后端服务器
权重(weight)在轮询的基础上增加weight权重,适合于服务器的硬件配置差别较大的情况
依据IP分配(ip_hash)确保同一IP的客户端请求一直发送到同一服务器,以保证Session会话
最少连接(least_conn)总是选择连接数最少的服务器
依据URL分配(url_hash)按URL的hash结果分配请求,每个url定向到同一后端服务器,后端服务器为缓存服务器时比较有效
依据Cookie分配(sticky)确保同一Cookie的客户端请求一直发送到同一服务器,以保证同一会话

2)配置文件

vim /usr/local/nginx/conf/nginx.config
###### 1.main全局配置 ######
# 1.1当worker进程执行时,它由OS的哪个用户进行执行,默认为nobody
#user  nobody;
# 1.2工作进程数:通常与CPU核数保持一致,或CPU核数-1
worker_processes  1;
# 1.3错误日志的存放路径和对应级别(从低到高):debug、info、notice、warn、error、crit
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
# 1.4nginx启动时的进程id
#pid        logs/nginx.pid;

###### 2.配置工作模式和连接数 ######
events {
	# 2.1nginx使用的内核模型,Linux系统中使用的是epoll
    # use epoll;
    # 2.2每个worker进程,允许客户端的最大连接数
    worker_connections  1024;
}

###### 3.http模块相关配置 ######
http {
	# 3.1导入的指令,可以导入外部的文件
    include       mime.types;
    # 3.2默认type类型
    default_type  application/octet-stream;
	# 3.3定义日志格式,给这种格式起名为main
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';
    #     root        /usr/project_package/lincat-storage-ui;
    # 3.4使用上述定义格式
    #access_log  logs/access.log  main;
	# 3.5高效传输文件的模式(一定要开启)
    sendfile        on;
    # 3.6和sendfile一起使用,但数据包累计到一定大小后再发送,主要用于提升文件传输速率
    #tcp_nopush     on;
	# 3.7客户端连接服务器的超时时间,单位为s。不使用该参数时,客户端向服务端发送多个请求,每个请求都要建立独立的连接,使用该参数后,仅建立一个连接,一个请求处理后再用该连接处理下一个请求
    #keepalive_timeout  0;
    keepalive_timeout  65;
	# 3.8开启后,传输html、cs、js体积变小,速度更快,更节省带宽,但会消耗CPU性能
    #gzip  on;
    # 3.8.1最小压缩限制,小于1字节的文件不会被压缩
    #gzip_min_length 1;
    # 3.8.2压缩比(文件越大,压缩越多,但CPU消耗会更大)
    #gzip_comp_level 3;
    # 3.8.3定义压缩文件的类型
    #gzip_types test/plian application/javascript

	###### 4.虚拟主机配置(可以有多个) ######
    server {
    	# 4.1监听端口号
        listen       8000;
        # 4.2定义ip和域名
        server_name  101.43.182.203;
        # 4.3字符编码
        #charset koi8-r;
		# 4.4日志名称 位置 格式
        #access_log  logs/host.access.log  main;
		# 4.5路由匹配:ip:port/location
        location / {
        	# 4.5.1目录根
            root   /usr/project_package_ui/lincat-storage-ui/;
            # 4.5.2返回首页
            index  index.html;
        }
		# 4.6错误返回页
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    
    ###### 5.集群(内网服务器)配置 ######
    upsstream cgi{
    	server {1p:port};
    	server {1p:port};
    	check interval=1000 rise=3 fall=5 timeout=3000 type=tcp port=80;
    	# 5.1限制一台upstream服务器的最大连接数,默认为0表示不做任何限制(使用多个worker process由于涉及共享内存的原因,连接数总会超过max_conns
    	#max_conns 2;
    	# 5.2状态标识,标记为永不可用
    	# down;
    	# 5.3标记一台服务器为备用机,备用机不会被用户访问到,只在其他服务器全挂掉后,备用机才会被访问
    	#backup;
    	# 5.4最大失败次数:若达到最大失败次数,Nginx则认为其处于宕机,则会将其剔除到集群外
    	#max_fails 2;
    	# 5.5失败的时间段:与最大次数配合使用,15s内若请求失败次数达到2次,则认为该服务器宕机,剔除集群,15s后再将其加进集群
    	#fail_timeout 15
    }
}
  • 应用场景

Nginx的应用场景分两种情况:

应用服务的入口在根目录下:Ngnix直接指向服务ip和port

应用服务的入口不在根目录下:配置一层Nginx做转发

  • 方德负载均衡软件

基于Nginx研发的Web端负载均衡软件(rpm安装)

主要功能:服务器状态管理、节点状态管理、负载管理、监听管理

20.Openstack部署

  • Openstack部署方式演变
方式说明特点
手工部署环境准备-安装中间件-安装后端-安装前端-验证部署自由度最高;步骤多、易出错;二次开发难
Packstack部署基于rpm安装的自动部署:环境准备-安装packstack-编辑应答文件-部署自由度较高;难度低;二次开发较难;升级组件难度未降低
Kolla一期基于ansible和虚拟化部署:环境准备-安装docker、Kolla-编辑变量文件-部署自由度较高;难度低;二次开发容易;依赖容器化更安全;升级组件较简单
Kolla二期基于ansible和虚拟化部署:环境准备-安装k8s、Kolla-编辑变量文件-部署自由度较高;难度低;二次开发容易;依赖容器化更安全;升级组件容易;可以获得k8s相关特性
  • Packstack部署方案

  • Kolla部署方案

  • Ansible介绍

  • 方德Openstack-控制器:集成部署方案

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值