赞
踩
本篇博客参考中科方德国产操作系统的培训课程,对其主要内容进行总结,以便加深理解和记忆
最近有幸参加了中科方德公司在我们学校举办的为期23天的、免费的、国产操作系统的系列课程。培训从Linux基础讲起,到Shell编程、Linux下的GUI开发、调试方法和通信机制、通过Wine的windows应用兼容、Linux服务器相关的存储和网络知识,最后到云计算的内容,中间也贯穿着许多国产操作系统和中科方德国产OS的介绍。初步、系统地搭建起了以Linux为基础的知识体系,让我收获了很多。
另外,需要对此次中科方德来给我们进行培训的老师、助理、HR等表达感谢,即使坚持到最后参加的同学不多,但他们仍然认真负责地给我们授课、解答、回访…
值得一提的是,这次培训让我比较喜欢的地方是授课老师都是来自一线的技术人员而非专门的培训老师,此次培训并非是一个老师一讲到底,而是由来自全国不同地区、不同部门的老师分别授课,各自讲授自己部门核心业务的部分。
由于笔者的时间和能力有限,此次博客仅记录了部分感兴趣的内容,且总结内容较为基础。最后想给中科方德打一个小广告。
1)Linux与Windows
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都是计算机启动过程中的固件系统
MBR和GPT:
文件系统:文件系统定义了OS在存储设备上进行文件和数据管理的机制
分区和分区表:
挂载点:Linux是典型的树形结构,根目录是整个文件系统的入口。系统中的其他分区都挂载在根目录下
6)国产操作系统和方德桌面操作系统
1)Linux文件系统层次结构
Linux的目录结构是根据FHS(Filesystem Hierarchy Standard)定义的,其目录结构是以/
为起点的树形结构,所有文件都位于根目录下。在Linux系统中,目录结构和分区设备是没有关系的,即不同的目录可以跨越不同的磁盘设备或分区
目录名 | 说明 |
---|---|
/ | 根目录 |
/boot | 存放linux系统的内核文件和启动时用到的一些引导文件,如有独立的boot分区,该分区应挂载到这个目录上 |
/home | 用户家目录,包含系统中所有的用户以及存放的用户数据 |
/root | 系统管理员root的家目录 |
/bin | 系统启动运行所常用的命令文件(如ls等),不能包含子目录 |
/sbin | 放置系统管理所使用的命令文件(如fdisk、shutdown等) |
/dev | Linux设备文件目录,系统启动时根据本机的设备支持情况创建响应的设备节点,通过访问设备文件访问设备 |
/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)用户帐户与文件权限
用户名:密码占位符:UID:GID:帐户信息:帐户目录:Shell版本
用户名:密码:最后一次修改时间的天数:两次修改密码最小间隔天数:多少天后需要再次修改密码:从发出警告到密码正式失效的天数:禁止登录用户名还有效的天数:用户禁止登录的时间:标志字段
用户组名称:组密码:GID:组成员
# 查看用户(已登录帐户信息) who # cat /etc/passwd whoami # 创建帐户 useradd -m [用户名] useradd -m test # 修改密码 passwd [用户名] # 添加帐户到组 adduser [帐户名] [用户组] adduser test sudo # 修改帐户信息 usermod [帐户名] # 删除用户 userdel [帐户名]
文件权限控制:Linux系统对文件权限控制严格,若想对某个文件执行某种操作,必须有相应的权限
类型:所有者权限:组权限: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)文件系统管理工具
①常用的文件系统类型
②常用的文件系统的相关操作
③文件挂载相关文件
④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系统主要包括三种:Sysvinit、Upstart、Systemd。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与之兼容)
等级 | 系统目标 | 说明 |
---|---|---|
0 | shutdown.target | 关机 |
1 | rescue.target | 单用户模式,该模式下,用户登录不需要密码,默认网卡驱动不被加载,一些服务受限 |
2 | multi-user.target | 多用户模式,NFS服务不开启(不支持网络文件系统) |
3 | multi-user.target | 命令行模式(完全支持用户模式) |
4 | multi-user.target | 保留 |
5 | graphical.target | 图形用户模式 |
6 | reboot.target | 重启系统 |
S/s | 一般用于系统故障后的排错和恢复 |
获取系统运行级别之后,根据运行级别顺序依次执行以下位置的启动脚本,从而将系统初始化为预设的运行级别:
(/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>
③注意事项
+\%Y\%m\%d
1)vim
2)shell编程
/etc/shells
查看系统支持的shell1)桌面操作系统概述
桌面操作系统就是在操作系统上增加了**桌面环境(Desktop Environment)**的相关组件,是人机交互的关键部分,包括管理器、任务条、开始菜单、控制面板、文件管理器等。
2)桌面操作系统的启动
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是整个OS的基础,它定义了许多标准的、常用的接口和类型,包括基本类型和限制的定义、标准宏、类型转化、字节序、存储分配、警告和断言、消息记录、计时器、字符串工具、hook函数、动态加载模块、多线程等。同时也提供了许多数据类型及相关操作,如存储块、双向链表、单向链表、哈希表、动态列表等
GIO提供一套标准的针对文件系统定义的接口
Glib对象系统提供了一套以C语言编写的面向对象程序的标准和规范
GTK是一种图形用户界面GUI工具包
6)桌面环境核心库
名称 | 说明 |
---|---|
libcairo | 矢量图形绘图的免费函数库,采用cairo的重要项目Gtk++、Pango、Gnome、Mozilla、OpenOffice |
gvfs | GNOME桌面系统的虚拟文件系统,用来代替过时的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 | |
国际化和本地化 | 多语言支持 |
错误和异常处理 | 日志分级存储 |
语言绑定 | 多语言兼容开发 |
The GTK Project - A free and open-source cross-platform widget toolkit Linux之GTK系列教程-CSDN博客
1)概述
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"));
1)概述
QT是一个跨平台的C++图形用户界面应用程序,可以开发GUI程序以及控制台工具、服务器,还具有多线程、访问DB、图像处理、音视频处理、网络通信、文件操作等。
QT是面向对象的框架,使用特殊的代码生成扩展(元对象编译器 Meta Object Compiler,moc)以及一些宏。QT很容易扩展,且允许真正地组件编程。
QT的优势:跨平台、开源、丰富的API库、支持2D/3D图形渲染,支持OpenGL、QML脚本开发
2)QT安装
QT对5.15及以上版本已经停止提供离线安装包,但支持在线安装
qt-opensource-linux-x64-5.9.2.run
qt-unified-linux-x64-online.run
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对话框
1)DBus概述
DBus(D-Bus),全称为Desktop Bus,是一种在Linux和其他Unix-like操作系统上运行的系统的总线,用于进程之间的通信
DBus被认为是一个基于消息的系统,使得应用程序之间的相互通信便得更加容易和可靠,它提供了一个机制,允许不同的应用程序通过DBus进行通信,并可以发送和接受异步消息。所以,DBus可以提用于桌面程序之间的通信,系统服务的管理,设备管理,以及进程间的协作等
DBus在Linux桌面系统、嵌入式系统和服务器系统中都得到了广泛的应用,据有高效、灵活、可扩展、可靠和安全等特点,成了Linux系统中的重要组件之一
特点
架构
Bus Daemon Process是运行在Linux系统中的一个后台守护进程,充当DBus结构的总线层。DBus运行时会调用底层接口层的libdbus库,完成DBus的核心功能。应用程序通过调用Wrapper库与DBus Daemon Process进行通信。Wrapper库实现c、glib、python、qt等DBus接口的封装,方便开发人员调用DBus程序
org.freedsktop.Accounts
,一个公共名可以对应多个连接,即多个应用连接到该公共名的服务。消息总线会依次给每个连接提供相同的服务。DBus类似于静态语言,使用”强类型“数据格式。在DBus上传递的所有数据都需要声明其对应的类型,其数据类型是由**类型签名(Type Signatures)**定义的,类型签名使用以下标记:
类型 | 说明 |
---|---|
a | 数组,如as表示字符串数组 |
b | 布尔 |
d | 双精度浮点数 |
g | SIGNATURE类型签名 |
i | 32位整型 |
n | 16位整型 |
o | Object Path 对象路径 |
q | 16位无符号数 |
s | UTF-8字符串 |
t | 64位无符号数 |
u | 32位无符号数 |
v | 可以存放任意数据类型的容器,数据中包含类型信息 |
x | 64位整型 |
y | 8位无符号整型 |
() | 结构体,如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编程
# 安装DBus-C库
sudo apt-get install libdbus-1-dev dbus-1-doc
import dbus
from gi.repository import GLib
import dbus.mainloop.glib
QT +=core gui dbus
#include<QtBus/QtDBus>
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
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/*
(子配置)中
ryslog是linux中用来实现日志功能的服务,是一个现代化、高性能、可扩展的日志守护进程,用于管理系统日志记录,接收来自各种应用程序和系统组件的日志消息,并将其写入本地日志文件或远程日志服务器中。rsyslog代替传统的syslogd守护进程
设施facility:用于定义日志消息的来源,方便对日志进行分类
目录名 | 说明 |
---|---|
kern | 内核信息 |
user | 用户程序产生的相关信息 |
邮件系统信息 | |
daemon | 守护进程产生的信息 |
auth | pam认证系统信息 |
syslog | 日志系统自身信息 |
authpriv | ssh、ftp等登录信息 |
cron | 系统执行定时任务产生的信息 |
lpr | 打印相关信息 |
mark | 服务内部信息,时间标识 |
uucp | Unix-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
1)方德鸳鸯火锅平台
基于开源Wine深度改造和升级,全面兼容Windows应用,丰富国产操作系统生态
Wine(Wine is Not an Emulator)是一个能够在多种POSIX-compliant操作系统(如Linux、macOS以及BSD等)上运行Windows应用程序的兼容器
Wine不是像虚拟机或模拟器一样模仿内部的Windows逻辑,而是将Windows API的调用改成调用动态的POSIX调用,免除了性能和一些其他行为的内存占用,使得可以干净地集成Windows应用
Wine特点:
3)Wine框架
内核是Linux系统的核心,主要负责:系统内存管理、软件程序管理、硬件设备管理、文件系统管理
Wine server是一个单线程的守护进程,是在Linux上实现的一个Windows内核数据结构和机制的补丁。
Windows应用通过Wine server在Linux上运行的过程:
域socket是Linux进程间通信的一种方式,编程接口类似于网络socker,它可以用来传递文件描述符
应用启动后,建立管道,并通过域socket将管道的一端发送给对方,然后通过管道监听进行通信
系统启动过程:
4)Wine源码下载、编译与使用
在Wine官网开始部分即可下载稳定版与开发版:
目录 | 说明 |
---|---|
dlls | 存放了所有API的实现(kernel32、gdiplus等) |
fonts | 重新实现windows字体 |
document | 自述文件的翻译 |
include | 头文件 |
libs | libwine的源代码 |
loader | Wine启动、加载相关的代码,以及安装在初始wineprefix中的一些文件 |
nls | 多国语言资源文件、字符转换 |
po | 翻译 |
programs | 外部程序的代码,如注册表管理工具regedit |
server | wineserver实现 |
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
# 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是一个辅助脚本,用于下载和安装在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 {目录}
1)高可用存储技术概述
2)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在硬分区和文件系统之间增加了一个逻辑层,为文件系统屏蔽底层磁盘分区布局,并提供一个抽象的盘卷,在盘卷上建立文件系统
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服务端 ###### # 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参数用于配置和优化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 优先将数据保存到内存,再写入硬盘,效率提高但有丢失数据的风险
# 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
1)高可用网络技术
高可用(High Availability,HA)网络技术:是指通过一系列方法和技术,降低网络故障的影响,提高网络系统的可靠性和稳定性的技术。确保网络在遇到故障或异常情况时,仍能继续向外提供业务服务能力。
一些网络技术
NFS上主要高可用网络技术:
高可用网络技术的优点:提高网络的可用性;提高网络性能;提高容错能力;降低成本;提高安全性
高可用网络技术应用场景:数据中心、云计算、高性能计算、工业控制
2)Bonding技术
bonding也称多网卡绑定,就是将多个物理网卡绑定成一个逻辑网卡,使用同一个IP工作
# 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/*
模式名称 | 说明 |
---|---|
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:
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:
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
4)VRRP技术
VRRP(Vitrual Router Redundancy Protocol)虚拟路由冗余:是一种网络协议,用于在多个路由器之间共享一个虚拟ip地址,实现网络的高可用。当主要路由器故障时,备份路由器可以自动接管虚拟IP地址,确保网络的连通性;虚拟IP可以与设备上某台设备的IP地址一致,也可以不一致。它使用ARP协议进行交互,只在同一子网内生效。
名称 | 说明 |
---|---|
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
1)云计算概述
云计算是一种灵活方便的按需计算模式,可以通过网络访问和使用计算资源的共享池(如网络、服务器、存储、应用程序服务),以最少的管理付出,达到各种计算资源迅速的配置和推出
云的提供者角度:虚拟化资源、高自动化、简化和标准化、动态调整、开发的成本增长
云的用户角度:简单实用、单位付费、资产变费用、标准付费、灵活交付
2)云计算的实现:虚拟化技术
3)云计算开源管理工具-OpenStack
OpenStack是一个云操作系统,主要是部署laaS,通过大数据中心可以控制大型的计算、存储、网络等资源池,实现公有云和私有云的部署和管理,所有管理通过前端界面即可完成(也可通过 Web API)
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的简称,它是一个可移植的、可扩展的开源平台,用于管理容器化的工作负载和服务,可使用声明式配置和自动化。
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 | 提供容器间的网络 |
###### 环境准备(两台机器) ###### # 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命令
# 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)
桌面服务、计算管理、存储管理、网络管理、镜像管理、日志管理、资源报表、用户管理、运维中心、系统管理
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)安装依赖
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 脚本下载复制到/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
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进行替换,重新编译)
Windows音视频框架
DirectShow框架介绍
筛选器和筛选图形
DirectShow的构建基块是一个名为筛选器的组件。它用于对多媒体流执行某些操作。 例如,DirectShow筛选器可以:读取文件、从视频捕获设备获取视频、解码各种流格式,例如 MPEG-1 视频、将数据传递到图形或声卡。
筛选器接收输入并生成输出。 例如,如果筛选器解码 MPEG-1 视频,则输入为 MPEG 编码流,输出是一系列未压缩的视频帧。
在DirectShow中,应用程序通过将筛选器链连接在一起来执行任何任务,以便一个筛选器的输出成为另一个筛选器的输入。 一组连接的筛选器称为 筛选器图:
从广义上讲,有三个任务DirectShow应用程序必须执行:应用程序创建筛选器Graph管理器的实例;应用程序使用筛选器Graph管理器生成筛选器图。 图形中的确切筛选器集将取决于应用程序;应用程序使用筛选器Graph管理器来控制筛选器图并通过筛选器流式传输数据。 在此过程中,应用程序还将响应来自筛选器Graph管理器的事件。处理完成后,应用程序将释放筛选器Graph管理器和所有筛选器
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是python中基于numpy、matplotlib的第三方数据分析库,可以与Scipy、scikit-learn、Matplotlib等库进行整合
1)数据结构:Series、DataFrame
2)读写csv、excel
3)数据访问、数据处理、数据统计
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库
3)基础
图像基础:二值图、灰度图、数字图像;Numpy;读/写/显示图;颜色通道、通道拆分;图像运算;读写视频、视频解码格式;绘图:直线、矩形、圆、椭圆;图像变形:缩放、翻转;图像处理:阈值、cv2.threshold()
全局阈值处理(二值化阈值处理、反二值化阈值处理、截断阈值处理、低阈值零处理、0tsu算法阈值处理、三角算法阈值处理)、cv2.adaptiveThreshold
自适应阈值处理、cv2.blur
滤波、cv2.GaussianBlur
高斯滤波;图像直方图:用于统计图像内各个灰度级出现的次数,横坐标表示灰度级、纵坐标表示灰度级的数量(计算直方图cv2.calcHist
、直方图对比cv2.compareHist
、直方图反投影cv2.calcBackProject
)
跨平台的可以模拟鼠标进行自动操作的python库
系统日志是记录OS运行状态和发生事件的重要手段之一,可用于故障排查、安全监控、性能优化、合规要求等,管理系统日志对于系统的稳定性、安全性、性能和合规性都有重要意义
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自己定义的日志类型
名称(日志类型) | 说明 |
---|---|
auth | pam产生的日志 |
authpriv | ssh等登录日志的验证消息 |
cron | 计划任务日志 |
kern | 内核日志 |
lpr | 打印日志 |
邮件日志 | |
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
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的依赖
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 }
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 | 二进制型 | 记录失败的、错误的登录尝试和验证事件 |
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
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上
逻辑CPU | CPU0 | CPU1 | CPU2 | CPU3 |
---|---|---|---|---|
位掩码 | 1 | 10 | 100 | 1000 |
# 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趋势与内存回收
调整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
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 | 表示用户或用户组的名称,*表示所有用户和用户组 |
type | soft:达到软限制发出警告;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 -p 或 source /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 | 可以将网络中传送的数据包完全截下来进行分析,它支持对网络层、协议、主机、端口进行过滤 |
高可用集群简称HA集群,是一组大规模并行处理器的集合,集群中各节点之间可以互相通信,目的是提高系统的带宽和可用性,常用的有:高可用集群、负载均衡集群、共享存储、磁盘镜像或这几类交叉融合
方德高可用集群特点
双机热备部署实例(使用方德高可用集群软件)
环境准备:
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
1)负载均衡产品介绍
负载均衡是支持应用程序资源池中平均分配网络流量的一种方法。负载均衡器是位于用户与服务器组之间的设备,充当不可见的协调者,确保均等使用所有资源服务器。其作用有:提高系统的可用性和可靠性;提高系统的性能和吞吐量;提高系统的可扩展性和灵活性
2)负载均衡技术类型:硬件负载均衡;软件负载均衡;混合负载均衡
3)Nginx发行版介绍
名称 | 介绍 | 官网 | 发行单位 |
---|---|---|---|
开源Nginx | Web服务器、反代服务器、负载均衡器 | https://nginx.org/en/download.html | 开源社区 |
Nginx plus | 商业解决方案 | https://www.nginx.com | F5 |
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的代理模式)
用途:隐藏服务信息、负载均衡、提高访问速度(代理服务器设缓存)、为服务端提供安全保护、服务端与客户端解耦,增加扩容灵活度和并发量
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安装)
主要功能:服务器状态管理、节点状态管理、负载管理、监听管理
方式 | 说明 | 特点 |
---|---|---|
手工部署 | 环境准备-安装中间件-安装后端-安装前端-验证 | 部署自由度最高;步骤多、易出错;二次开发难 |
Packstack部署 | 基于rpm安装的自动部署:环境准备-安装packstack-编辑应答文件-部署 | 自由度较高;难度低;二次开发较难;升级组件难度未降低 |
Kolla一期 | 基于ansible和虚拟化部署:环境准备-安装docker、Kolla-编辑变量文件-部署 | 自由度较高;难度低;二次开发容易;依赖容器化更安全;升级组件较简单 |
Kolla二期 | 基于ansible和虚拟化部署:环境准备-安装k8s、Kolla-编辑变量文件-部署 | 自由度较高;难度低;二次开发容易;依赖容器化更安全;升级组件容易;可以获得k8s相关特性 |
Packstack部署方案
Kolla部署方案
Ansible介绍
方德Openstack-控制器:集成部署方案
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。