• [技术干货] EXT系列文件系统-转载
    1. 引入Q: fopen、fwrite 一系列函数都是研究操作系统已经打开的文件,那我们没有打开的文件,在磁盘上的文件,操作系统是如何管理的呢?A: 文件 = 内容 + 属性。 这是针对单个文件的描述。宏观上我们理解文件,可以分为两类:被打开的文件:在 内存 中存储。未打开的文件:在 磁盘 中存储。Q: 没有被打开的文件远多于被打开的文件,那操作系统是如何快速找到我们要的文件呢?A: 文件保存在磁盘中,通过**目录结构(树状结构)**组织,通过路径定位文件。 这正是 文件系统(File System) 的任务。2. 理解硬件2.1 磁盘的基本特点机械磁盘是计算机中唯一的机械设备属于外设速度慢容量大、价格便宜2.2 认识磁盘外观与内部结构:拆开之后Q:磁盘怎么存储数据?A:磁盘上有很多的存储小颗粒,可将此比喻为小磁铁。如此,磁盘便有了两态的性质,进而对数据进行存储。2.3 磁盘的物理结构 磁盘的基本存储单位是扇区(512byte),所以我们读写磁盘的基本单位是扇区,目的是提高效率。磁头在传动臂的带动下共进退。 磁盘写入时,是向柱面进行批量写入的。柱面:由很多相同半径的同心圆其实就是磁道构成。2.4 磁盘的基本概念扇区是从磁盘读出和写⼊信息的最⼩单位,通常⼤⼩为 512 字节。磁头(head)数:每个盘⽚⼀般有上下两⾯,分别对应1个磁头,共2个磁头磁道(track)数:磁道是从盘⽚外圈往内圈编号0磁道,1磁道…,靠近主轴的同⼼圆⽤于停靠磁头,不存储数据柱⾯(cylinder)数:磁道构成柱⾯,数量上等同于磁道个数扇区(sector)数:每个磁道都被切分成很多扇形区域,每道的扇区数量相同圆盘(platter)数:就是盘⽚的数量磁盘容量=磁头数 × 磁道(柱⾯)数 × 每道扇区数 × 每扇区字节数细节:传动臂上的磁头是共进退的2.5 磁盘数据寻址方式(CHS模型)Q:512字节的数据写入到某个扇区时,磁盘应该如何运动?A:先定位到某一个柱面(cylind),再确定磁头(head),再定位到对应的扇区(sector)。这样的方案叫做CHS方案,通过这三个参数就能定位到特定扇区。所以对特定文件的存储就是将数据存储到一个或多个扇区。先确定柱面(磁道),再定位磁头(确定是哪一面上的数据),最后定位扇区。 所以对文件的存储,本质上就是将数据(内容+属性)存储到磁盘的扇区上。2.6 磁盘的逻辑结构2.6.1 从磁道的角度逻辑抽象磁盘逻辑上可以看作一个线性结构。想象把磁带(或磁道)“拉直”,就得到一维数组结构。磁带卷起来就是同心圆,拉直了就是线性结构。磁盘同样是同心圆,我们将其想象拉直了,所以也是线性结构。线性结构中最小的基本单位就是扇区,所以定位一个扇区用数组下标即可。这种地址叫做**LBA(Logical Block Address)**地址。操作系统没有必要记录每一个扇区的地址,只用知道磁盘的总容量。总容量/512(一个扇区的大小)就可以访问任意一个扇区。2.6.2 从柱面的角度逻辑抽象沿着磁道展开就是一维数组。沿整个磁盘所有的盘面的同一个磁道展开(沿柱面展开),就是一个二维数组。再进一步,将每一个柱面都展开,就形成了三维数组。所以,每⼀个扇区都有⼀个下标,我们叫做 LBA(Logical Block Address) 地址,其实就是线性地址。Q:所以怎么由CHS地址计算得到这个LBA地址呢?A:LBA地址与CHS地址的相互转换由磁盘来做。2.7 LBA与CHS转换CHS转成LBA:• 磁头数 * 每磁道扇区数 = 单个柱⾯的扇区总数• LBA = 柱⾯号C * 单个柱⾯的扇区总数 + 磁头号H * 每磁道扇区数 + 扇区号S - 1• 即:LBA = 柱⾯号C * (磁头数*每磁道扇区数) + 磁头号H*每磁道扇区数 + 扇区号S - 1• 扇区号通常是从1开始的,⽽在LBA中,地址是从0开始的• 柱⾯和磁道都是从0开始编号的• 总柱⾯,磁道个数,扇区总数等信息,在磁盘内部会⾃动维护,上层开机的时候,会获取到这些参数。LBA转成CHS:• 柱⾯号C = LBA // (磁头数每磁道扇区数)【就是单个柱⾯的扇区总数】• 磁头号H = (LBA % (磁头数每磁道扇区数)) // 每磁道扇区数• 扇区号S = (LBA % 每磁道扇区数) + 1• “//”: 表⽰除取整所以:从此往后,在磁盘使⽤者看来,根本就不关⼼CHS地址,⽽是直接使⽤LBA地址,磁盘内部⾃⼰转换。所以:从现在开始,磁盘就是⼀个元素为扇区 的⼀维数组,数组的下标就是每⼀个扇区的LBA地址。OS使⽤ 磁盘,就可以⽤⼀个数字访问磁盘扇区了。3. 文件系统(File System)3.1 文件系统的介绍磁盘属于典型的 块设备(Block Device)。操作系统读取磁盘时,不是一个扇区一个扇区读,而是批量读取多个扇区,形成一个 块(Block)。块大小一般为 4KB,也就是连续的八个扇区。目的是提高读取效率。块是文件存取的最⼩单位。3.2 分区与分组Linux的管理方式:把块分区,把区分组。这是分治的思想!!分而治之。比方说:一个磁盘有500GB,操作系统管理磁盘的时候会将磁盘分为多个区。例子中分出一个150GB的区,再将区分为组,这里划分15GB的组。所以操作系统对磁盘的管理就变成了对15GB分组的管理。3.3 块组内部结构块组中包含:super blockGDT(Group Descriptor Table)block bitmapinode bitmapinode tabledata blocks文件 = 内容 + 属性 在Linux下内容和属性是分开存储的。做分组之后存储的基本单位还是4kb。内容存放在data blocks中,基本单位是4kb的数据块。属性存放在 inode table中(以行为单位,为一个文件的属性),属性实际上就是一个struct inode的结构体对象,属性的类型大小都是一样的,128字节,不一样的是属性内容。文件系统的载体是分区。(从这句话我能感觉到有多种文件系统,就像操作系统一样有很多种)emmm原来这样,记得我之前遇到一个问题,我的u盘不能拷贝4GB以上的文件,然后上网查资料,让我格式化u盘,重新选文件系统。3.3.1 data blocks(数据块)存储文件内容,单位为 4KB3.3.2 inode(索引节点)存储文件属性,inode 被定义为一个包含文件元数据的结构体大小固定 128 字节文件名不会作为属性保存在inode中。原因:文件名长短不一样,文件名是变化的。inode table中也是4kb的数据块,一个数据块就能保存32个struct inode(也就是32个文件的属性) 因为他的大小是128字节。Q:一个inode table保存32个文件的属性,文件系统是如何区分文件的?A:区分文件的关键是在inode中存在 inode编号用于区分不同的文件。查找文件时带上-i选项就能查找到文件的inode编号。3.3.3 block bitmapQ:我要向文件中写数据,我咋知道datablock中哪个块被用了,哪个没有被使用?A:依靠block bitmap 块位图。用于记录datablock中哪些数据块已经被占用,哪些没有被占用。通过比特位0/1来表示data block中是否被占用。3.3.4 inode bitmap原理同block bitmapQ:为什么下载文件时特别费时间,而删除很快?A:删除的时候需要对位图做清空就行。3.3.5 GDT(Group Descriptor Table)块组描述符表,描述块组属性信息,整个分区分成多个块组就对应有多少个块组描述符。每个块组描述符存储⼀个块组 的描述信息,如在这个块组中从哪⾥开始是inode Table,从哪⾥开始是DataBlocks,空闲的inode和数据块还有多少个等等。块组描述符在每个块组的开头都有⼀份拷⻉。3.3.6 super block存放⽂件系统本⾝的结构信息,描述整个分区的文件系统信息(注意和GDT做区分)。记录的信息主要有:bolck 和 inode的总量未使⽤的block和inode的数量⼀个block和inode的⼤⼩最近⼀次挂载的时间最近⼀次写⼊数据的时间最近⼀次检验磁盘的时间等其他⽂件系统的相关信息Super Block的信息被破坏,可以说整个⽂件系统结构就被破坏了。不是所有的分组都有super block,而是某些分组中存在,本质上是一种备份,一个super block出问题,可以通过其他分组的super block来进行恢复。这也是为什么super block明明描述的是整个分区的文件系统信息却存放在分组中的原因。3.4 格式化格式化的本质就是写入文件系统的管理信息(GDT,super block,block bitmap, inode bitmap)。3.5 inode编号和块号inode是跨组的但是inode不能跨分区,所以,在同一个分区内部,inode编号和块号都是唯一的。如此多的信息(分组分区信息)都由操作系统管理。在开机时,操作系统只需将管理信息加载到内存中,管理的方式为:先描述,再组织。3.6 拿inode编号找文件我们现在就可以拿着inode编号来找文件。操作系统通过inode编号查找bitmap进而找到文件的属性也就是inode table。Q:等等等等!inode编号是不可以跨分区的,如果先确定了分区,确实通过inode编号可以找到文件,毕竟inode是跨组的。但前提条件是确定分区呀!如何确定分区???A:等下回答你,爱思考的小宝宝。Q:操作系统拿着inode编号找到文件属性我能理解,但有是怎么找到文件的数据块呢?A:在struct inode中,包含int datablocks【N】成员变量,保存的是该文件数据块的编号,所以我们通过inode找到属性信息后,再根据数组的映射关系就能找到文件的内容信息。Q:Linux下如何看待目录呢?A:和看待普通文件一样,目录也有自己的inode和数据内容。虽然我们平时用文件名找文件,但是不要忘了,在我们找文件的时候已经存在一个默认的路径(pwd)。目录的data block中会存放文件名和inode的映射关系。所以,文件名不会作为文件的属性保存在文件的inode中,而是保存在当前文件所属的目录的数据内容中。这也是为什么在同一目录下不能出现同名文件的原因。而在磁盘文件的系统中只认inode,当我们要读取一个文件时,我们要先打开文件的所属路径,读取对应目录里面的数据内容,进而得到文件名和inode的映射关系,系统再根据文件名映射到对应的inode,通过inode进行文件的查找。Q: 所以就是说我们要打开一个文件就要找到该文件的对应目录,那我们怎么找到这个目录的inode的??A:通过找找上级目录,再找上级目录,不断地找上级目录,最终找到根目录,再反向的找到目标文件。所以我们对任何文件的访问都要携带路径。所以我们找任何文件,都必须从根目录开始,进行路径解析,直接找到对应文件。Q:我们访问任何文件都要从目录下进行路径解析吗?这不是一直再进行磁盘的io吗?这样的效率也太低了。A:是的,操作系统在进行路径解析的时候,会把我们历史访问的所有的目录(路径)形成一颗多叉树,进行保存,在内存中形成目录树。这种操作叫路径缓存。Linux中,在内核中维护树状路径结构的内核结构体叫做: struct dentry3.7 struct dentry每个⽂件其实都要有对应的dentry结构,包括普通⽂件。这样所有被打开的⽂件,就可以在内存中形成整个树形结构整个树形节点也同时会⾪属于LRU(Least Recently Used,最近最少使⽤)结构中,进⾏节点淘汰整个树形节点也同时会⾪属于Hash,⽅便快速查找更重要的是,这个树形结构,整体构成了Linux的路径缓存结构,打开访问任何⽂件,都在先在这棵树下根据路径进⾏查找,找到就返回属性inode和内容,没找到就从磁盘加载路径,添加dentry结构,缓存新路径3.8 分区的确定:挂载(Mount)Q:快回答我,怎么确定分区!A:当我们对磁盘进行分区,格式化后,我们依然不能直接使用这个分区。我们一定要将该分区与一个目录进行关联,通过这个目录来访问分区。这个操作叫做挂载。所以我们可以根据访问⽬标⽂件的**“路径前缀”**准确判断在哪⼀个分区。4. 总结文件系统 是操作系统管理磁盘文件的核心组件磁盘结构 从物理(CHS)到逻辑(LBA)经历了抽象演变inode + data block 构成 Linux 文件的核心存储模型路径解析 + dentry 缓存 大幅提升文件查找性能挂载机制 则实现了多分区的统一访问————————————————版权声明:本文为CSDN博主「Zach_yuan」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/Zach_yuan/article/details/154289206
  • [技术交流] 华为 HNS 25G网卡 iSER问题
    [root@localhost ~]# cat /etc/openEuler-release openEuler release 24.03 (LTS-SP2)[root@localhost ~]# [root@localhost ~]# lscpu 架构:                    aarch64  CPU 运行模式:          64-bit  字节序:                Little EndianCPU:                      96  在线 CPU 列表:         0-95厂商 ID:                 HiSilicon  BIOS 厂商 ID:          HiSilicon  型号名称:              Kunpeng-920    BIOS 型号名称:       Kunpeng 920-4826 To be filled by O.E.M. CPU @ 2.6GHz    BIOS CPU family:      280    型号:                0    每个核的线程数:      1    每个座的核数:        48    座:                  2    步进:                0x1    BogoMIPS:            200.00    标记:                fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma dcpop asimddp asimdfhm ssbsCaches (sum of all):        L1d:                    6 MiB (96 instances)  L1i:                    6 MiB (96 instances)  L2:                     48 MiB (96 instances)  L3:                     192 MiB (4 instances)NUMA:                       NUMA 节点:             4  NUMA 节点0 CPU:        0-23  NUMA 节点1 CPU:        24-47  NUMA 节点2 CPU:        48-71  NUMA 节点3 CPU:        72-95Vulnerabilities:            Gather data sampling:   Not affected  Itlb multihit:          Not affected  L1tf:                   Not affected  Mds:                    Not affected  Meltdown:               Not affected  Mmio stale data:        Not affected  Reg file data sampling: Not affected  Retbleed:               Not affected  Spec rstack overflow:   Not affected  Spec store bypass:      Mitigation; Speculative Store Bypass disabled via prctl  Spectre v1:             Mitigation; __user pointer sanitization  Spectre v2:             Not affected  Srbds:                  Not affected  Tsx async abort:        Not affected[root@localhost ~]#   Tsx async abort:        Not affected[root@localhost ~]# lspci | grep HNS7d:00.0 Ethernet controller: Huawei Technologies Co., Ltd. HNS GE/10GE/25GE RDMA Network Controller (rev 21)7d:00.1 Ethernet controller: Huawei Technologies Co., Ltd. HNS GE/10GE/25GE RDMA Network Controller (rev 21)bd:00.0 Ethernet controller: Huawei Technologies Co., Ltd. HNS GE/10GE/25GE RDMA Network Controller (rev 21)bd:00.1 Ethernet controller: Huawei Technologies Co., Ltd. HNS GE/10GE/25GE RDMA Network Controller (rev 21)[root@localhost ~]#  [root@localhost ~]# rdma linklink mlx5_0/1 state DOWN physical_state DISABLED netdev enp129s0f0np0 link mlx5_1/1 state DOWN physical_state DISABLED netdev enp129s0f1np1 link hns_0/1 state ACTIVE physical_state LINK_UP netdev enp189s0f0 link hns_1/1 state DOWN physical_state DISABLED netdev enp189s0f1 link hns_2/1 state ACTIVE physical_state LINK_UP netdev enp125s0f0 link hns_3/1 state DOWN physical_state DISABLED netdev enp125s0f1 [root@localhost ~]# [二 9月 16 22:20:25 2025] iscsi: registered transport (iser)[二 9月 16 22:21:31 2025] iser: iser_create_device_ib_res: IB device does not support memory registrations[二 9月 16 22:21:31 2025] iser: iser_addr_handler: device lookup/creation failed[二 9月 16 22:21:32 2025] iser: iser_create_device_ib_res: IB device does not support memory registrations[二 9月 16 22:21:32 2025] iser: iser_addr_handler: device lookup/creation failed[二 9月 16 22:21:33 2025] iser: iser_create_device_ib_res: IB device does not support memory registrations[二 9月 16 22:21:33 2025] iser: iser_addr_handler: device lookup/creation failed[二 9月 16 22:21:34 2025] iser: iser_create_device_ib_res: IB device does not support memory registrations[二 9月 16 22:21:34 2025] iser: iser_addr_handler: device lookup/creation failed[二 9月 16 22:21:35 2025] iser: iser_create_device_ib_res: IB device does not support memory registrations[二 9月 16 22:21:35 2025] iser: iser_addr_handler: device lookup/creation failed[二 9月 16 22:21:36 2025] iser: iser_create_device_ib_res: IB device does not support memory registrations[二 9月 16 22:21:36 2025] iser: iser_addr_handler: device lookup/creation failed华为的  HNS  ISER报内存注册错误 怎么处理  
  • [案例共创] 开发者空间 AI Agent 开发 - 基于 Versatile AI原生应用引擎的《系统编程》智能助教
    案例介绍本案例基于 Versatile AI原生应用引擎的搭建《系统编程》智能助教。1 概述1.1 案例介绍Versatile AI原生应用引擎提供了丰富的AI Agent的支撑功能。本案例基于DeepSeek模型、知识库,搭建了一个简单的Agent,用于承担深圳大学《系统编程》课程助教的角色。其中:DeepSeek模型:利用出色的上下文推理能力和深度思考功能,解答学生的问题。知识库:存储了《系统编程》课程的讲义、示例代码和参考资料,用于增强输出内容的专业性、与课堂知识和案例的相关性,并缓解模型幻觉问题。1.2 适用对象高校师生社区开发者1.3 案例时间本案例总时长预计60分钟。1.4 案例流程用户提出问题;Agent向知识库请求相关的知识;Agent获取相关知识后,启动DeepSeek的深度思考;Agent向用户正式输出回答。1.5 资源总览本案例预计花费0元。资源名称规格单价(元)时长(分钟)开发者空间 AI AgentDeepSeek-R1060 2 知识库配置2.1 进入Versatile AI原生应用引擎界面,点击知识库配置《系统编程》课程所需要的资料。  2.2 点击创建知识库。  2.3 点击创建知识库,并按照如下方法创建配置知识库基础配置  数据接入  数据加工  创建索引配置注意:此处有vectorRAG和GraphRAG两种类型,分别使用向量数据库和知识图谱存储知识。笔者选择了向量数据库的方式。将文本转换成向量,不可避免要用到embedding模型(向量化模型),而平台已经为我们准备好了。   至此,知识库已经做好。   3 Agent开发3.1 返回Versatile AI原生应用引擎界面,点击右上角创建Agent。  3.2 返回Versatile AI原生应用引擎界面,点击右上角创建Agent,并按照下图,设置名称、描述、模型选择、角色设定、知识库、记忆、开场白、推荐问题等选项。然后保存并发布。  3.3 选择发布渠道和设置在发布密钥选择发布渠道:渠道有二:1)以API的形式调用;2)以Web URL的形式访问。本案例选择后者,并以此URL向学生用户开放。设置发布秘钥:请参考文档获取。最后,点击右上角发布。  发布需要等待一小会:  获得如下情况,即可说明成功发布!  4 实际效果智能助教曹老板,在用户提问后,首先查阅资料,然后深度思考,最后给出解答。   我是华为开发者布道师学生曹弈轩,正在参加【案例共创】第5期 开发者空间 AI Agent 开发  cid:link_0
  • [问题求助] 【麒麟V10】麒麟V10X86架构安装ambari-2.7.5后,利用ambari构建大数据平台报错RuntimeError: Failed to execute command '/usr/bin/yum -y install hadoo
    麒麟V10X86架构安装ambari-2.7.5后,利用ambari构建大数据平台,报错:2025-05-20 16:49:12,547 - The 'hadoop-hdfs-client' component did not advertise a version. This may indicate a problem with the component packaging.Traceback (most recent call last): File "/var/lib/ambari-agent/cache/stacks/HDP/3.0/services/HDFS/package/scripts/hdfs_client.py", line 78, in <module> HdfsClient().execute() File "/usr/lib/ambari-agent/lib/resource_management/libraries/script/script.py", line 352, in execute method(env) File "/var/lib/ambari-agent/cache/stacks/HDP/3.0/services/HDFS/package/scripts/hdfs_client.py", line 37, in install self.install_packages(env) File "/usr/lib/ambari-agent/lib/resource_management/libraries/script/script.py", line 853, in install_packages retry_count=agent_stack_retry_count) File "/usr/lib/ambari-agent/lib/resource_management/core/base.py", line 166, in __init__ self.env.run() File "/usr/lib/ambari-agent/lib/resource_management/core/environment.py", line 160, in run self.run_action(resource, action) File "/usr/lib/ambari-agent/lib/resource_management/core/environment.py", line 124, in run_action provider_action() File "/usr/lib/ambari-agent/lib/resource_management/core/providers/packaging.py", line 30, in action_install self._pkg_manager.install_package(package_name, self.__create_context()) File "/usr/lib/ambari-agent/lib/ambari_commons/repo_manager/yum_manager.py", line 219, in install_package shell.repository_manager_executor(cmd, self.properties, context) File "/usr/lib/ambari-agent/lib/ambari_commons/shell.py", line 753, in repository_manager_executor raise RuntimeError(message)RuntimeError: Failed to execute command '/usr/bin/yum -y install hadoop_3_1_5_0_152', exited with code '1', message: 'Error: Problem: cannot install the best candidate for the job - nothing provides redhat-lsb needed by hadoop_3_1_5_0_152-3.1.1.3.1.5.0-152.x86_64服务器和ambari版本信息如下截图:求助大佬帮助解决,感谢。
  • [问题求助] 【紧急问题求助】麒麟V10安装ambari-server-2.7.5执行ambari-server setup报错Unexpected error Ambari repo file path not set for current OS.
    麒麟V10安装ambari-server-2.7.5执行ambari-server setup报错,查看 cat /var/log/ambari-server/ambari-server-command.log 信息如下:INFO 2025-05-19 18:06:20,382 ambari-server.py:911 - loglevel=logging.INFOINFO 2025-05-19 18:06:20,385 serverSetup.py:1151 - Setup ambari-server.ERROR 2025-05-19 18:06:21,770 ambari-server.py:1015 - 'Fatal exception: Failed to create user. Exiting., exit code 1'Traceback (most recent call last):  File "/usr/sbin/ambari-server.py", line 998, in main    action_obj.execute()  File "/usr/sbin/ambari-server.py", line 78, in execute    self.fn(*self.args, **self.kwargs)  File "/usr/lib/ambari-server/lib/ambari_server/serverSetup.py", line 1178, in setup    raise FatalException(retcode, err)FatalException: 'Fatal exception: Failed to create user. Exiting., exit code 1'具体操作报错截图如下:求助各位大佬如何解决,感谢。
  • [区域初赛赛题问题] 关于环境说明里的系统要求Ubuntu
    要求里说是基于x86的ubuntu 18.04,是要自己去装一个还是?不太懂,意思是在Windows系统上运行的代码不可以吗?
  • [区域初赛赛题问题] 在判题器显示了运行正确1,可是提交的时候报错了,想问问大佬们为什么啊
    [INFO] The interactor is starting to run.[INFO] Period 1 (1s~110s) has been completed, used 2.7180s, current score: 2.4725.ok {"error_code":"interaction_successful","score":"2.4725","message":"Interaction successful, score: 2.4725 (30.9062%), used: 2.7210s."}这个是判题器的信息,可是提交官网general_error显示报错,该怎么办呀
  • [技术干货] 【Linux】:初识网络-转载
    1. 计算机网络发展背景计算机网络的发展可以追溯到20世纪60年代。当时,美国国防部的高级研究计划署(ARPA)启动了一个名为ARPANET的研究项目,旨在将分布在全美的计算机连接起来,实现资源共享和信息交流。ARPANET于1969年建成,成为了世界上第一个计算机网络🔥  在随后的几十年里,计算机网络经历了从军用到民用、从局域网到广域网的快速发展。20世纪70年代,随着计算机和网络技术的不断进步,计算机网络开始向商业化和民用化方向发展。1974年,ARPANET采用了TCP/IP协议,这成为了今天互联网的基础。到了80年代,局域网(LAN)和广域网(WAN)开始普及,TCP/IP协议也成为互联网的标准协议,标志着互联网的正式建立独立模式:计算机之间相互独立 网络互联:多台计算机连接在一起, 完成数据共享 局域网LAN:计算机数量更多了, 通过交换机和路由器连接在一起 广域网WAN:将远隔千里的计算机都连在一起 所谓 “局域网” 和 “广域网” 只是一个相对的概念. 比如, 我们有 “天朝特色” 的广域网, 也可以看做一个比较大的局域网.重要性:计算机网络在现代社会中发挥着举足轻重的作用。它打破了数据的孤立状态,使得不同计算机之间能够高效地交换信息和共享资源。无论是工作、学习还是生活,计算机网络都已经成为人们不可或缺的一部分。它让人们能够随时随地访问互联网,获取各种信息和服务,极大地提高了工作效率和生活质量2. 网络协议🔥 网络协议,简称为协议,是网络通信(即网络数据传输)经过的所有网络设备都必须共同遵从的一组约定、规则。这些规则详细规定了如何建立连接、如何互相识别、如何发送和接收数据等🐇 协议初识"协议"本质就是一种约定计算机之间的传输媒介是光信号和电信号。 通过 “频率” 和 “强弱” 来表示 0 和 1 这样的信息. 要想传递各种不同的信息, 就需要约定好双方的数据格式思考:只要通信的两台主机约定好协议就可以了么?即使双方已经制定了通信协议,但如果一方使用频率来表示 01,而另一方使用信号强弱来表示 01,这就如同一方说中文,另一方说葡萄牙语。虽然大家遵循相同的 01 通信规则,但由于“表示方式”不同,即使订立了基本协议,也无法进行正常的通信。多样化的计算环境计算机生产厂商众多;计算机操作系统多种多样;计算机网络硬件设备种类繁多。在如此多样的环境下,如何确保来自不同厂商的计算机能够顺利通信?统一标准的需求因此,一个完善的协议需要更加详细和具体的规定,并且所有参与者都必须遵守这些规定。一些思考:技术被挖掘出了价值,广泛使用,第一生产力的特征才会表现出来,被看到。所以占领市场,制定标准的重要性就可以理解了。例如现在的鸿蒙系统(物联网),人工智能,大模型......现在都是在找应用场景来落地,进行普及和构建生态。软件分层的场景:高内聚,低耦合结构体和类,数据层面:继承和多态就是在实现软件分层数据类型上:文件和硬件不同 struct 设计线程池回调的方式模块之间:虚拟内存和页表等也是一种分层🐇 协议分层⭕ 为什么要分层?问题是层状的网络很庞大好维护例如两个人打电话真实情况:我们人其实在和电话沟通在逻辑上:我们认为,人和人,电话和电话在沟通举个例子: 本层之间有协议,层和层之间通过话筒(接口)连接 在这个例子中, 我们的"协议"只有两层: 语言层、通信设备层。但是实际的网络通信协议,设计的会更加复杂, 需要分更多的层但是通过上面的简单例子,我们是能理解,分层可以实现解耦合分层具有好维护的特征,可以实现只换同层内容⭕ 那么网络协议是如何分层的呢?🥝 OSI 七层协议OSI(Open System Interconnection,开放系统互连) 七层网络模型称为开放式系统互联参考模型,是一个逻辑上的定义和规范;把网络从逻辑上分为了7层. 每一层都有相关、相对应的物理设备,比如路由器,交换机;OSI 七层模型是一种框架性的设计方法,其最主要的功能使就是帮助不同类型的主机实现数据传输;它的最大优点是将服务、接口和协议这三个概念明确地区分开来,概念清楚,理论也比较完整. 通过七个层次化的结构模型使不同的系统不同的网络之间实现可靠的通讯;但是, 它既复杂又不实用; 所以我们按照TCP/IP四层模型来讲解. 🔥 其实在网络角度,OSI 定的协议 7 层模型其实非常完善,但是在实际操作的过程中,会话层、表示层是不可能接入到操作系统中的,所以在工程实践中,最终落地的是 5 层协议。🥝 TCP/IP五层(四层)模型TCP(传输层)/ IP(网络层) 是一组协议的代名词,它还包括许多协议,共同组成了TCP/IP协议簇TCP/IP 通讯协议采用了五层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求物理层我们考虑的比较少,因此很多时候也可以称为 TCP/IP 四层模型一般而言对于一台主机:它的操作系统内核实现了从传输层到物理层的内容:对于一台路由器:它实现了从网络层到物理层;对于一台交换机:它实现了从数据链路层到物理层对于集线器:它只实现了物理层;但是并不绝对.很多交换机也实现了网络层的转发;很多路由器也实现了部分传输层的内容(比如端口转发); UDP协议为用户数据报协议,在传输层工作TCP协议为传输控制协议,在传输层工作IP协议为网际协议,在网络层工作ARP协议为地址解析协议,在网络层工作ICMP协议为Internet控制报文协议,它是TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息,所以是通过IP协议来进行传输结构理解:物理层: 负责光/电信号的传递方式. 比如现在以太网通用的网线(双绞线)、早期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤, 现在的wifi无线网使用电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等. 集线器(Hub)工作在物理层 💢 调制解调器(猫)也工作在物理层。(把模拟信号->数字信号,数字信号->模拟信号),家里安装的wifi,先是光纤接入猫,然后猫拉一个先连接路由器,路由器帮我们构建一个局域网然后我们就可以连接wifi了,我们发送的消息先传给路由器,路由器在经过物理设备猫,帮我们做数模转换把数据打到网络里然后数据才能发出去。(路由器真正识别才是真正的01这种二进制对东西)。数据链路层:负责建立设备之间的数据帧的传送和识别. 例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作。 有以太网、令牌环网, 无线LAN等标准。交换机(Switch)工作在数据链路层。确保了主机和直接连接的主机之间可以通信网络层: 负责地址管理和路由选择. 例如在IP协议中, 通过IP地址来标识一台主机, 并通过路由表的方式规划出两台主机之间的数据传输的线路(路由)。路由器(Router,是涵盖关系,也有集线器,交换机......的功能)工作在网路层.传输层: 负责两台主机之间的数据传输。 如传输控制协议 (TCP),能够确保数据可靠的从源主机发送到目标主机.应用层:负责应用程序间沟通,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。 我们的网络编程主要就是针对应用层。数据拿过来了,以什么样的形式显示在不同的系统中,网络的系统调用接口大同小异3. 再识协议上面的内容,我们只是懂了一些基本概念,还是达不到我们的目标,下面我们再次重新理解协议和协议分层🍉 为什么要有 TCP/IP 协议?首先,即便是单机,你的计算机内部,其实都是存在协议的,比如:其他设备和内存通信,会有内存协议。其他设备和磁盘通信,会有磁盘相关的协议,比如:SATA,IDE,SCSI等。只不过我们感知不到罢了。而且这些协议都在本地主机各自的硬件中,通信的成本、问题比较少。其次,网络通信最大的特点就是主机之间变远了。任何通信特征的变化,一定会带来新的问题,有问题就得解决问题,所以需要新的协议咯。所以,为什么要有 TCP/IP 协议?本质就是通信主机距离变远了🍉 什么是 TCP/IP 协议?TCP/IP 协议的本质是一种解决方案TCP/IP 协议能分层,前提是因为问题们本身能分层 TCP/IP 协议与操作系统的关系(宏观上,怎么实现的),如下图  所以究竟什么是协议?截止到目前,我们还没接触过任何协议,但是如何朴素的理解协议,我们已经可以试试了OS 源代码一般都是用 C/C++语言写的。下面,仔细看看下面的图 💡 问题:主机 B 能识别 data,并且准确提取 a=10,b=20,c=30 吗?🔖 回答:答案是肯定的!因为双方都有同样的结构体类型 struct protocol。也就是说,用同样的代码实现协议,用同样的自定义数据类型,天然就具有”共识“,能够识别对方发来的数据,这不就是约定吗?关于协议的朴素理解:所谓协议,就是通信双方都认识的结构化的数据类型🔖 因为协议栈是分层的,所以,每层都有双方都有协议,同层之间,互相可以认识对方的协议。🍉 理解网络协议栈结合 用户贯穿硬件 的结构进行理解: 层状是一样的,层和层之间进行匹配网络通信的本质:就是贯穿协议栈的过程 网络协议栈的层状结构中,每一层都有协议(约定的解读)信息传递要保证可靠性:要有序。所以每个协议层都要有自己的序号 -- 即 协议报头报头:在协议中,报头(Header)通常指的是数据包或帧的开头部分,其中包含了关于该数据包或帧的元信息。这些信息对于协议的正确路由和处理数据包/帧至关重要,确保成功地将它从发送方传递到接收方报头的重要性:报头在协议中扮演着至关重要的角色。它是数据包或帧的“身份证”,包含了必要的元信息和控制信息,以确保数据包能够正确、高效地传输到目标地址。同时,报头也是协议实现和调试的重要工具,通过分析报头信息,可以了解数据包在网络中的传输情况,诊断和解决网络故障网卡为什么要把数据交给内存?因为 冯诺依曼结构 规定的,到内存中才能被 OS 处理4. 网络传输基本流程🦌 局域网传输流程局域网: 这里主要以以太网为例🛹 认识以太网通信• 首先回答,两台主机在同一个局域网,是否能够直接通信?是的• 原理类似上课局域网内,两个直接连接的主机之间可以直接通信。例如投屏需要手机和电视连接同一个 wifi主流的局域网通讯协议:以太网太阳光八分钟到地球,宇宙中是否存在让光传递的介质--以太,就像空气一样的?后来物理界证实不存在,就是真空的。计算机科学家Q到,我们光电传输就有--以太网~🛹 认识 Mac 地址• 每台主机在局域网上,要有唯一的标识来保证主机的唯一性:mac 地址MAC 地址用来识别数据链路层中相连的节点;长度为 48 位, 及 6 个字节. 一般用 16 进制数字加上冒号的形式来表示 (如: 08:00:27:03:fb:19)在网卡出厂时就确定了,不能修改. mac 地址通常是唯一的(虚拟机中的 mac 地址不是真实的 mac 地址,可能会冲突;也有些网卡支持用户配置 mac 地址)以太网中,任何时刻,只允许一台机器向网络中发送数据如果有多台同时发送,会发生数据干扰,我们称之为数据碰撞所有发送数据的主机要进行碰撞检测和碰撞避免所以发送主机都要执行碰撞避免的算法,保证任何时刻都只有一台主机在发送消息所以局域网最好不会太大,和引入交换机没有交换机的情况下,一个以太网就是一个碰撞域交换机:划分碰撞域碰撞域:指在网络中,数据信号传输过程中可能发生冲突的区域。在同一个碰撞域内的所有设备共享同一物理介质,在一个碰撞域内,所有设备都监听同一个物理信道,并且任何时刻只能有一台设备发送数据。局域网通信的过程中,主机对收到的报文确认是否是发给自己的,是通过目标 mac 地址判定💢 这里可以试着从系统角度来理解局域网通信原理,初步明白了局域网通信原理,再来看同一个网段内的两台主机进行发送消息的过程🛹 同一个网段内的两台主机消息的发送初步明白了局域网通信原理,再来看同一个网段内的两台主机进行发送消息的过程 而其中每层都有协议,所以当我进行进行上述传输流程的时候,要进行封装和解包 用户 A 从上到下进行封装,由硬件发出用户 B 从下到上进行解包,由硬件接收 用户 A B 都需要贯穿协议层,为啥要进行这么多交互,因为数据需要通过硬件来收发下面我们明确一下概念 报头部分,就是对应协议层的结构体字段,我们一般叫做报头除了报头,剩下的叫做有效载荷故,报文=报头+有效载荷报文被别人抓走了怎么办?为了确保网络安全,可以在应用层进行加密(令牌环),对方就看不到如何看待局域网?只允许一个发送,可以看作每台主机背后就是一个进程,网络的传输是共享资源,传输要互斥进行🛹 数据包封装和分用不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报(datagram),在链路层叫做帧(frame)数据段是在传输层(Transport Layer)处理的数据单元,通常用于描述TCP或UDP等传输协议封装的信息。在图中,“你好”这个字符串是应用层数据,在传输层会被封装成一个数据段,并添加上相应的头部信息,如序列号、确认号、源端口/目的端口等。数据报是在网络层(Network Layer)处理的数据单元,通常用于描述IP协议封装的信息。在图中,数据段经过网络层后会变成一个数据报,它包含了原始数据段以及其他必要的头部信息,例如源IP地址、目的IP地址、TTL(Time To Live)、协议类型等。​​​​​​​数据帧是在链路层(Link Layer)处理的数据单元,通常用于描述以太网驱动程序封装的信息。在图中,数据报经过链路层后会变成一个数据帧,它包含了原始数据报以及其他必要的头部信息,例如MAC地址(源MAC地址、目的MAC地址)、FCS(Frame Check Sequence)等。​​​​​​​总结来说,数据段是传输层的概念,数据报是网络层的概念,而数据帧则是链路层的概念。这些不同层次的数据单元在计算机网络中起着不同的作用,它们通过层层封装和解封装来实现数据的有效传输。应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation).首部信息中包含了一些类似于首部有多长,载荷(payload)有多长,上层协议是什么等信息.数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,根据首部中的 "上层协议字段" 将数据交给对应的上层协议处理.OSI的数据链路层通常同时使用报头和报尾进行封装通信的过程:本质就是不断的封装和解包的过程所以在逻辑上,就感觉是在同层传递,例如: ⭕ 扩展:几乎任何层的协议,都要提供一种能力,将报头和有效载荷分离的能力几乎任何层的协议,都要在报头中提供,决定将自己的有效载荷交付给上层的哪一个协议的能力--分用封装的时候,一定要考虑后面的解包过程:如何将报文中的报头和有效载荷进行分离 —> 约定任何协议都要解决如何将自己的有效载荷交付给上一层的协议 —> 共性每层协议都要解决这两个问题🍒 封装 🍒 分用 因此后面我们学习任何协议,都要先宏观上建立这样的认识:问题1:协议,是如何做到解包的?🔥 协议解包(解封装)是指接收方从接收到的数据中逐层剥离头部信息,提取出有效载荷,并将其传递给上层协议的过程。解包的关键在于每层协议能够识别自己的头部信息,并根据这些信息决定如何处理数据。以下是协议解包的详细过程协议栈的每一层都会根据协议规范,解析并剥离自己的头部信息,然后将剩余的数据传递给上层协议。以下是逐层解封装的详细步骤:(1) 物理层接收方从物理介质(如网线、光纤)接收到原始的比特流。物理层将这些比特流组装成链路层的帧。(2) 链路层(如以太网)链路层解析帧的头部信息(如目标MAC地址、源MAC地址、帧类型等)。检查帧的完整性(通过校验和或CRC校验)。如果帧类型指示上层协议是IP协议,链路层会剥离帧头部和尾部,将IP数据包传递给网络层。(3) 网络层(如IP协议)网络层解析IP头部信息(如源IP地址、目标IP地址、协议类型等)。检查IP数据包的完整性(通过校验和)。如果协议类型指示上层协议是TCP或UDP,网络层会剥离IP头部,将TCP/UDP段传递给传输层。(4) 传输层(如TCP/UDP)传输层解析TCP/UDP头部信息(如源端口、目标端口、序列号、校验和等)。检查数据的完整性和顺序(TCP协议会进行校验和验证、数据重组等)。根据目标端口号,传输层会剥离TCP/UDP头部,将应用层数据传递给相应的应用层协议。(5) 应用层(如HTTP、FTP)应用层协议解析数据内容(如HTTP请求或响应)。根据协议规范处理数据,完成最终的业务逻辑。问题2:协议是如何做到将自己的有效载荷,交付给上层协议的?发送方封装:上层协议数据作为有效载荷传递给当前协议。当前协议添加头部信息,形成完整的报文。数据传输:封装后的报文通过网络传输到接收方。接收方解封装:接收方解析当前协议的头部信息,验证数据完整性。提取有效载荷,准备传递给上层协议。传递有效载荷:将有效载荷交给上层协议处理。关键点封装与解封装:每层协议添加或移除自己的头部信息。协议标识:头部信息中包含协议标识,确保数据传递给正确的上层协议。错误检测:通过校验和等机制确保数据传输的可靠性。🦌 跨网络传输流程🛴 令牌环🔥 令牌环网络中,所有的计算机或工作站被连接成一个逻辑或物理的环形拓扑结构,网络中数据的传输是通过一个特殊的控制信号,即“令牌”来管理的 令牌环网和以太网都属于数字链路层,但是底层协议是不一样的因为网络是层状结构的,所以替换底层协议,不影响传输🛴 认识 IP 地址我怎么知道是要跨网络交给主机的呢?IP 地址可以保证主机在全网的唯一性,例如:我们云服务器的连接 IP 就是唯一的两个小故事:从辽宁到云南,沿路旅游的路线如何设计从哪来,到哪去--一直是不变的--IP 地址--指导我们进行路径规划上一站从哪里来,下一站到哪里去--会一直变化,变化的依据是“我要去哪里”--Mac 地址相当于 IP 是大目标,Mac 是小目标指令:ip -a 可以查看当前的ip地址IP 地址是什么?IP地址是在IP协议中, 用来标识网络中不同主机的地址对于IPv4来说, IP地址是一个4字节, 32位的整数我们通常也使用 “点分十进制” 的字符串表示IP地址, 例如 192.168.0.1 ; 用点分割的每一个数字表示一字节, 范围是 0 - 255跨网段的主机的数据传输. 数据从一台计算机到另一台计算机传输过程中要经过一个或多个路由器.IP 地址的意义为什么要去目标主机,先要走路由器?目的 IP 的意义IP地址的意义是:路径选择 —> 从哪里来,到哪里去,IP地址是永远不变的IP 地址为什么要交给路由器?路由器会重新解包,和封装 数据链层协议,实现了不同区域网之间的通信,解决了底层协议的差异化同一子网,没有路由器的话,就会底层协议需要一样IP 及上层是一样的,IP 协议屏蔽了底层网络的差异,靠的就是工作在 IP 层的路由器IP 实现了全球主机的软件虚拟层,一切皆是 IP 报文!也体现了网络层状结构的优越性然后结合封装与解包,体现路由器解包和重新封装的特点 🛴 对比 IP 地址和 Mac 地址的区别IP 地址在整个路由过程中,一直不变(目前,我们只能这样说明,后面在修正)Mac 地址一直在变目的 IP 是一种长远目标,Mac 是下一阶段目标,目的 IP 是路径选择的重要依据,mac 地址是局域网转发的重要依据IP地址是一个数字,用于唯一标识网络中的一台主机。应用于网络层,基于网络拓扑描述起点和终点,Mac地址是物理网卡硬件地址,用于标识相邻设备,应用于链路层IP地址的分配是基于网络拓朴,MAC地址的分配是基于制造商IP地址应用于OSI第三层,即网络层,而MAC地址应用在OSI第二层,即数据链路层(数据链路层协议可以通过MAC地址使数据从一个节点传递到相同链路的另一个节点上)由于IP地址是一个逻辑地址,所以可以给MAC地址对应分配不同的IP地址,使网络通信更加灵活提炼 IP 网络的意义和网络通信的宏观流程 路由器,可以根据 IP 地址判断目的地在哪个局域网内,IP 地址的设计非常的巧妙,它在网络层,会根据目的地,进行路径选择时选择了下一个跳转的路由器。IP 网络层存在的意义:提供网络虚拟层,让世界的所有网络都是 IP 网络,屏蔽最底层网络的差异ifconfig   --查看当前云服务器的MAC地址,IP地址IP数据报的收发方进行跨网投递时,发送方需利用ARP协议获取:发送方本网段路由器对应端口的MAC地址当需要跨网络进行传递的时候,也就是意味着需要找到该数据包的下一跳的MAC地址,所以认为从发送方出来,首先先到到达本网段的路由器,所以获取本网段的路由器的MAC地址🛴 补充 -- IP协议IP协议有两个版本, IPv4 和 IPv6IPv4地址解释IPv4地址是一个4字节(即32位)的整数,它可以被看作是一个无符号整数(unsigned int)。这意味着它可以表示从0到 (2^{32} - 1) 之间的任何整数值,即从0到4,294,967,295(约42亿)。四字节和32位的关系4字节:在计算机中,一个字节(Byte)等于8位(bits),所以4字节就是 (4 \times 8 = 32) 位。32位:指的是IPv4地址的总长度,由32个二进制位组成。点分十进制表示法点分十进制是一种常用的表示IPv4地址的方法,它将32位的二进制数分成四个8位的部分,每部分转换成十进制数,并用点(.)分隔开。例如,IPv4地址 192.168.0.1 就是点分十进制格式。每个数字的取值范围在点分十进制表示法中,每个数字代表一个字节(8位),因此它们的取值范围是从0到255。这是因为8位二进制数的最大值为 (2^8 - 1 = 255)。最小值:0,对应于8位全0,即 00000000。最大值:255,对应于8位全1,即 11111111。示例如下以 192.168.0.1 为例:第一部分 192 对应于二进制 11000000第二部分 168 对应于二进制 10101000第三部分 0 对应于二进制 00000000第四部分 1 对应于二进制 00000001合并起来就是 11000000 10101000 00000000 00000001,去掉空格后就是32位的二进制数 11000000101010000000000000000001。🔥 总的来说,IPv4地址是一个32位的无符号整数,通常以点分十进制的形式表示,每个部分都是一个8位的二进制数,取值范围是0到255。这种表示方法使得IPv4地址更加易于阅读和记忆。IPv6,IP地址是一个16个字符,128位比特位的整数。防止 IPv4 不够用要想普及一项技术,需要孵化出一个更大的运用场景,例如物联网使用 IPv6 的话...现在国家规定,公司要兼容 IPv6————————————————                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。                        原文链接:https://blog.csdn.net/island1314/article/details/144703475
  • [技术干货] 求助,aarch64 上的麒麟系统 + Ascend310P 如何使用 VTK?
    很显然无法直接 pip install,自己找源码编译,需要依赖 OpenGL 而 Ascend 计算卡又不支持。如果安装 mesa 又报错各种依赖装不上。论坛上有朋友成功搞定过的嘛?
  • [问题求助] 不支持FT2000CPU吗?安装报错[gauss-51615]欧拉、麒麟、等系统一样的报错
    安装报错[gauss-51615]欧拉、麒麟、等系统一样的报错。CPU型号FT2000
  • [问题求助] IBM system x3610支持ESX7.0系统安装吗?IBM system x3610支持ESX7.0系统安装吗?
    rtIBM system x3610支持ESX7.0系统安装吗?IBM system x3610支持ESX7.0系统安装吗?
  • [技术干货] 【华为开发者布道师】鸿蒙操作系统的图形子系统原理解析——东北大学 张昊阳
    参考书籍资料:《鸿蒙操作系统设计原理与架构》 (李毅,任革林)布道活动地点:东北大学(浑南校区)
  • [问题求助] openEuler 22.03版本的奇怪端口问题
    描述:使用openEuler 22.03操作系统发现一个奇怪问题,一个监听端口已经不存在,telnet 本地回环地址出现卡住现象。
  • [技术干货] sysMaster用户指南
    概述 sysMaster 是一套超轻量、高可靠的服务管理程序集合,是对 1 号进程的全新实现,旨在改进传统的 init 守护进程。它使用 Rust 编写,具有故障监测、秒级自愈和快速启动等能力,从而提升操作系统可靠性和业务可用度。 sysMaster 支持进程、容器和虚拟机的统一管理,其适用于服务器、云计算和嵌入式等多个场景。 sysMaster 实现思路是将传统 1 号进程的功能解耦分层,结合使用场景,拆分出 1+1+N 的架构。 如下面 sysMaster 系统架构图所示,主要包含三个方面: • sysmaster-init:新的 1 号进程提供系统初始化、僵尸进程回收、监控保活等功能,可单独应用于嵌入式场景。 • sysmaster-core:承担原有服务管理的核心功能,引入可靠性框架,使其具备崩溃快速自愈、热升级等能力,保障业务全天在线。 • sysmaster-exts:使原本耦合的各组件功能独立,提供系统关键功能的组件集合(如设备管理 devMaster,总线通信 busMaster 等),各组件可单独使用,可根据不同场景灵活选用。  ​图1 sysMaster整体架构图 sysMaster sysMaster 目前主要由 sysmaster 和 devmaster 两部分功能组成,其中 sysmaster 负责服务的管理,devmaster 负责设备的管理,下面将对这两部分功能进行说明。 
  • [技术干货] sysmaster使用说明
     本章主要通过一些实例来带领用户初步使用 sysmaster,例如:  如何创建 service服务单元配置文件。 如何管理单元服务,例如启动、停止、查看服务。 更多可以查阅官方手册。  创建单元配置文件 用户可以在 /usr/lib/sysmaster/system/目录下创建单元配置文件。  单元配置文件的类型 当前 sysmaster支持 target、socket、service类型的单元配置文件。  target:封装了一个由 sysmaster管理的启动目标,用于将多个单元集中到一个同步点。sysmaster提供不同阶段的 target单元,例如 multi-user.target代表系统已完成启动,用户可以依赖此目标,启动自己的服务。 socket:封装了一个用于进程间通信的套接字 socket, 以支持基于套接字的启动。例如用户可以配置 service单元依赖此 socket,当此 socket有数据写入时,sysmaster会拉起对应的 service单元。 service:封装了一个被 sysmaster监视与控制的进程。 单元配置文件的构成 单元配置文件通常由3块组成:  Unit:单元的公共配置说明,如服务名称、描述、依赖关系等。 Install:描述如何安装和启动服务。 Service、Socket:各个单元类型的配置。 创建service单元配置 sshd服务被用来远程登录到服务器,并在远程终端上执行命令和操作。 使用如下配置项来创建一个 sshd.service服务单元配置。  [Unit] Description=“OpenSSH server daemon” Documentation=“man:sshd(8) man:sshd_config(5)” After=“sshd-keygen.target” Wants=“sshd-keygen.target”  [Service] Type=“notify” EnvironmentFile=“-/etc/sysconfig/sshd” ExecStart=“/usr/sbin/sshd -D $OPTIONS” ExecReload=“/bin/kill -HUP $MAINPID” KillMode=“process” Restart=“on-failure” RestartSec=42  [Install] WantedBy=“multi-user.target” 以下是对单元配置文件中选项配置的说明,更多可以查阅官方手册。  Description:说明该 unit的主要功能。 Documentation:说明该 unit的文档链接。 After:配置同时启动的单元的先后顺序,sshd.service服务将在 sshd-keygen.target之后启动。 Wants:配置一个单元对另一个单元的依赖,启动 sshd.service服务,将会自动启动 sshd-keygen.target。 Type:配置 sysmaster 如何启动此服务,notify表明需要主进程启动完成后发送通知消息。 EnvironmentFile:设置环境变量的文件读取路径。 ExecStart:配置服务启动时执行的命令,启动 sshd.service服务会执行 sshd命令。 ExecReload:配置重新加载 sshd.service的配置时执行的命令。 KillMode:配置当需要停止服务进程时,杀死服务进程的方法,process表示只杀死主进程。 Restart:配置服务不同情况下退出或终止,是否重新启动服务,on-failure表示当服务非正常退出时重新启动服务。 RestartSec:配置当服务退出时,重新拉起服务的间隔时间。 WantedBy:配置依赖当前 sshd.service服务的单元。 管理单元服务 sctl是 sysmaster的命令行工具,用于检查和控制 sysmaster服务端行为和各个服务的状态,它可以启动、停止、重启、检查系统服务。  启动服务 使用以下命令可以启动 sshd服务和运行 ExecStart所配置的命令。  sctl start sshd.service 停止服务 使用以下命令可以停止 sshd服务,杀死 ExecStart所运行的进程。  sctl stop sshd.service 重启服务 使用以下命令可以重启 sshd服务,该命令会先停止后启动服务。  sctl restart sshd.service 查看服务状态 使用以下命令可以查看服务 sshd运行状态,用户可以查看服务的状态来获取服务是否正常运行。