Linux

Linux

  • 摘要
  • 写在前面
  • 1.Linux介绍
  • 2.Linux基本概念与命令
  • 3.Shell编程
  • 4.桌面操作系统框架
  • 5.GTK图形编程
  • 6.QT图形编程
  • 7.DBUS
  • 8.GDB
  • 9.Wine开发
  • 10.高可用存储技术
  • 11.高可用网络技术
  • 12.云计算

摘要

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

写在前面

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

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

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

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

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

1.Linux介绍

Linux内核官网

1)Linux与Windows

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

2)Linux内核

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

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

3)Linux发行版

4)Linux的常见应用领域

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

5)Linux系统安装

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

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

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

    • 文件安装/复制

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

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

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

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

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

  • 分区和分区表:

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

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

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

2.Linux基本概念与命令

1)Linux文件系统层次结构

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

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

2)用户帐户与文件权限

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

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

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

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

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

3)文件系统管理工具

①常用的文件系统类型

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

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

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

③文件挂载相关文件

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

④mount指令

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

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

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

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

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

4.系统启动框架

init进程

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

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

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

②Sysvinit

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

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

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

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

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

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

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

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

③3种init系统比较

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

Systemd

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

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

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

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

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

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

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

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

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

6)定时任务

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

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

①crontab文件格式

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

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

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

②定时任务执行

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

③注意事项

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

3.Shell编程

1)vim

2)shell编程

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

4.桌面操作系统框架

1)桌面操作系统概述

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

2)桌面操作系统的启动

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

3)主流桌面环境

gnome:Ubuntu/Centos

cinnamon:Mint

mate:麒麟

deepin:统信

4)桌面环境组件

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

5)桌面环境基础

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

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

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

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

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

  • GTK(应用一致性)

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

6)桌面环境核心库

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

7)标准与规范

常用国标

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

常用规范和约定

freedesktop.org GNOME Development Debian – 说明文档

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

5.GTK图形编程

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

1)概述

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

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

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

2)环境搭建

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


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

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

3)hello-word程序

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

4)容器布局

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

5)控件

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

6)信号与回调函数

7)glade

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

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

6.QT图形编程

1)概述

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

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

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

2)QT安装

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

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

3)QT Creator:QT的IDE

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

4)QT工具集介绍

5)QT模块

6)信号与槽

7)QT控件、布局与事件

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

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

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

8)QT样式表:QSS

9)QT对话框

7.DBUS

1)DBus概述

  • 概述

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

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

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

  • 特点

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

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

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

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

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

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

2)DBus工具数据

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

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

3)DBus编程

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

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

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

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

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

[Install]
WantedBy=multi-user.target

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

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

8.GDB

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

1)基本命令

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

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

2)调试core文件

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

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

3)调试正在运行的程序

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

4)调试多进程程序

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

5)调试多线程程序

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

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

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

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

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

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

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

解决方法:写系统日志

  • 系统日志

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

常见的系统日志有:

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

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

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

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

  • rsyslog

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

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

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

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

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

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

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

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

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

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

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

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

9.Wine开发

1)方德鸳鸯火锅平台

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

2)Wine介绍

Wine官网

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

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

Wine特点:

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

3)Wine框架

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

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

  • Wine架构
  • Wine server

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

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

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

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

系统启动过程:

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

  • 源码下载

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

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

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

a.构建debian11子系统

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

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

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

# 1.安装debootstrap
sudo apt install debootstrap

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

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

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

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

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

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

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

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

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

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

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

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

5)Wine应用调试与修复

  • Winetricks

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

下载地址

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

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

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

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

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

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

10.高可用存储技术

1)高可用存储技术概述

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

2)RAID存储技术

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

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

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

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

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

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

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

3)LVM存储技术

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

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

LVM的优点:

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

LVM主要元素构成:

LVM操作:

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

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

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

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

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

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

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

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

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

4)iSCSI存储技术

  • 简介

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

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

缺点:受到网速制约

  • 拓扑结构
  • 部署iSCSI

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

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

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

5)NFS存储技术

  • 概述

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

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

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

  • NFS参数

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

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

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

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

11.高可用网络技术

1)高可用网络技术

  • 概述

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

  • 一些网络技术

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

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

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

2)Bonding技术

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

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

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

  • bonding配置

图形化方式配置bonding:

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

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

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

4.激活bond

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

5.bonding测试验证

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

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

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

使用配置文件创建bond

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

使用命令创建bond

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

3)Team技术

  • 概述

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

  • Team运行模式
  • Team配置

图形方式配置Team:

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

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

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

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

5.激活team

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

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

使用命令创建Team:

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

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

Team测试验证:

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

4)VRRP技术

  • 简介

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

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

选举机制:

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

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

12.云计算

1)云计算概述

  • 简介

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

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

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

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

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

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

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

  • 简介

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

  • OpenStack架构
  • 云平台模块

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

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

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

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

架构

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

5)Docker技术

6)k8s

  • 简介

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

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

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

节点介绍:

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

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

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

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

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

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

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

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

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/30380.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

超越密码:网络安全认证的未来

你的物理现实的数字对应物正在惊人地增长。虽然肯定会有积极的结果&#xff0c;但随着互联网的发展&#xff0c;与之相关的风险也在迅速增加。在讨论网络安全风险管理时&#xff0c;首先想到的是密码。但当出现诈骗、网络钓鱼等威胁时&#xff0c;这还不够。 那么&#xff0c;…

大数据分析与机器学习:技术深度与实例解析【上进小菜猪大数据系列】

上进小菜猪&#xff0c;沈工大软件工程专业&#xff0c;爱好敲代码&#xff0c;持续输出干货。 大数据分析与机器学习已成为当今商业决策和科学研究中的关键组成部分。本文将深入探讨大数据技术的背景和原则&#xff0c;并结合实例介绍一些常见的大数据分析和机器学习技术。 …

Redux的基础操作和思想

什么是Redux? Redux是JavaScript应用的状态容器&#xff0c;提供可预测的状态管理! Redux除了和React一起用外&#xff0c;还支持其它框架;它体小精悍(只有2kB&#xff0c; 包括依赖)&#xff0c;却有很强大的插件扩展生态! Redux提供的模式和工具使您更容易理解应用程序中的…

与用户同行!2023卡萨帝开启高端生活方式新时代

6月20日&#xff0c;2023思享荟暨卡萨帝品牌升级发布会在重庆国际博览中心举行。在经历了高端产品引领、高端品牌引领、高端场景引领后&#xff0c;卡萨帝启动全新品牌升级&#xff0c;持续与用户同行&#xff0c;开启高端生活方式引领的新时代。 现场&#xff0c;海尔智家副总…

量化交易:止盈策略与回测

我们买基金或股票的时候通常用最简单的策略进行决策&#xff1a;低买高卖&#xff0c;跌的多了就加仓拉低持有成本&#xff0c;达到收益率就卖出。 那么如何用代码表示这个策略呢&#xff1f;首先定义交易信号则是&#xff1a;0.5%时买入&#xff0c;目标止盈线是1.5%&#xf…

ELFK日志分析系统并使用Filter对日志数据进行处理

目录 一、 FilebeatELK 部署Filebeat 节点上操作 二、Filtergrok 正则捕获插件内置正则表达式调用自定义表达式调用 mutate 数据修改插件multiline 多行合并插件date 时间处理插件 一、 FilebeatELK 部署 Node1节点&#xff08;2C/4G&#xff09;&#xff1a;node1/192.168.15…

Django rest framework基本知识

使用pycharm生成Django项目后&#xff0c;会生成工程目录和app目录 工程目录下5个文件&#xff0c;settings.py是全局配置相关的 urls.py是路有相关的 app相关的目录 models.py 数据库ORM对应的模型类 serializers.py 序列化与反序列化处理 views.py 根据request进行…

手工测试没有前途,自动化测试会取代手工测试?

在测试行业&#xff0c;一个一直被讨论的问题就是&#xff1a;手工测试没有前途&#xff0c;自动化测试会取代手工测试&#xff1f; 首先说结论&#xff1a;自动化测试不会取代手工测试&#xff0c;这完全是两个维度的事情。为什么不会呢&#xff1f;我们需要从本源上说起。 什…

DINO-DETR匈牙利匹配与加噪过程学习记录

今天再来回顾一下DINO中匈牙利匹配与损失函数部分&#xff0c;该部分大致与DETR相似&#xff0c;却又略有不同。 为了查看数据方便&#xff0c;博主将num_query改为20&#xff0c;max_select值也为20。 匈牙利匹配过程 首先是数据送入匈牙利匹配中进行标签匹配过程了。 获取…

【Android自动化测试】Ui Automator技术(以对QQ软件自动发说说为例)

文章目录 一、引言二、了解&#xff08;Android官方文档&#xff09;1、UiDevice 类2、UI Automator API3、UI Automator 查看器 三、使用1、依赖2、代码 一、引言 描述&#xff1a;UI Automator 是一个界面测试框架&#xff0c;适用于整个系统上以及多个已安装应用间的跨应用…

react---react router 5 基本使用

目录 1.路由介绍 2.路由使用 3.路由组件和一般组件 4.Switch 单一匹配 5.解决二级路由样式丢失的问题 6.路由精准匹配和模糊匹配 7.Redirect路由重定向 1.路由介绍 路由是根据不同的 URL 地址展示不同的内容或页面&#xff0c;在 SPA 应用中&#xff0c;大部分页面结果…

理解Web3公链共识算法的原理与机制

Web3时代带来了去中心化、透明和安全的数字经济发展&#xff0c;而公链的共识算法是实现这一目标的关键。共识算法确保了公链网络中的节点对交易和状态的一致性达成共识&#xff0c;同时防止了恶意行为和双重支付等问题。本文将深入探讨Web3公链共识算法的核心原理与机制。 1.共…

【Uniapp】小程序携带Token请求接口+无感知登录方案2.0

本次改进原文《【Uniapp】小程序携带Token请求接口无感知登录方案》&#xff0c;在实际使用过程中我发现以下bug&#xff1a; 若token恰好在用户访问接口时到期&#xff0c;就会直接查询为空&#xff0c;不反映token过期问题&#xff08;例如&#xff1a;弹窗显示订单查询记录…

【数据库数据恢复】SQL Server数据表结构损坏的数据恢复案例

数据库故障&分析&#xff1a; SQL server数据库数据无法读取。 经过初检&#xff0c;发现SQL server数据库文件无法被读取的原因是因为底层File Record被截断为0&#xff0c;无法找到文件开头&#xff0c;数据表结构损坏。镜像文件的前面几十M空间和中间一部分空间被覆盖掉…

饶派杯XCTF车联网安全挑战赛Reverse GotYourKey

文章目录 一.程序逻辑分析二.线程2的operate方法解析三.找出真flag 一.程序逻辑分析 onCreate方法中判断SDK版本是否>27 然后创建两个线程 第一个线程是接受输入的字符串并发送出去 第二个线程用于接受数据 线程1,就是将字符串转为字节数组发送出去 线程2,作为服务端接受…

springboot动态加载json文件

resources下面的配置文件&#xff0c;application文件修改启动会实时加载新的内容 其他的文件属于静态文件&#xff0c;打包后会把文件打入jar里面&#xff0c;修改静态文件启动不会加载新的内容 Resource areacode nre FileSystemResource("config" File.separa…

STM32——07-STM32定时器Timer

定时器介绍 软件定时 缺点&#xff1a;不精确、占用 CPU 资源 void Delay500ms () //11.0592MHz { unsigned char i , j , k ; _nop_ (); i 4 ; j 129 ; k 119 ; do { do { while ( -- k ); } while ( -- j ); } while ( -- i ); } 定时器工…

Springboot--关于自定义stater的yml无法提示

1.前言 在以前在搭建架构的时候就碰到了类似的情况&#xff0c;在使用EnableConfigurationProperties注解的时候&#xff0c;不管怎样&#xff0c;在项目中引入了该starter的情况下依然不发自动的提示properties里面的属性。 Data ConfigurationProperties(prefix "pro…

vite vs babel+webpack | 创建一个简单的vite项目打包运行

有babel、webpack这些优秀的框架&#xff0c;为什么使用vite? 因为vite编译快&#xff0c;启动快&#xff0c;使用简单&#xff0c;还自带一个热更新重启的服务器&#xff0c;vite能够自动的帮我打包所用到的依赖&#xff0c;有些依赖只有用到才会导入&#xff0c;不用到不会…

开放式耳机和封闭式耳机的区别?开放式耳机到底有哪些优缺点?

开放式耳机从字面意思可以理解为&#xff1a;开放耳朵&#xff0c;不需要入耳就可以听见声音的耳机&#xff0c;所以它和封闭式耳机的最大区别就是不入耳。这种耳机最大的优点就是不压迫不封闭耳道&#xff0c;而且在听耳机音的同时能够及时注意到周围环境的声音&#xff0c;从…