本篇博客参考中科方德国产操作系统的培训课程,对其主要内容进行总结,以便加深理解和记忆
最近有幸参加了中科方德公司在我们学校举办的为期15天的、免费的、国产操作系统的系列课程。培训从Linux基础讲起,到Shell编程、Linux下的GUI开发、调试方法和通信机制、通过Wine的windows应用兼容、Linux服务器相关的存储和网络知识,最后到云计算的内容,中间也贯穿着许多国产操作系统和中科方德国产OS的介绍。初步、系统地搭建起了以Linux为基础的知识体系,让我收获了很多。
另外,需要对此次中科方德来给我们进行培训的老师、助理、HR等表达感谢,即使坚持到最后参加的同学不多,但他们仍然认真负责地给我们授课、解答、回访…
值得一提的是,这次培训让我比较喜欢的地方是授课老师都是来自一线的技术人员而非专门的培训老师,此次培训并非是一个老师一讲到底,而是由来自全国不同地区、不同部门的老师分别授课,各自讲授自己部门核心业务的部分。
由于笔者的时间和能力有限,此次博客仅记录了部分感兴趣的内容,且总结内容较为基础。最后想给中科方德打一个小广告。
Linux内核官网
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创建一个名为.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
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
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
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(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中的设备信息
# /dev/md#
# :任意块设备,硬盘或分区均可
# 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 | 提供容器间的网络 |
安装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命令
# 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)
桌面服务、计算管理、存储管理、网络管理、镜像管理、日志管理、资源报表、用户管理、运维中心、系统管理