Linux: 计算机基础和 Linux 安装

内容概述

行业介绍和计算机基础

计算机基础

互联网的典型业务架构

典型业务架构

中大规模互联网业务系统成为了支撑各类互联网服务稳健运行的基石,其精妙且复杂的架构由硬件体系与软件体系有机结合而成。

硬件体系

数据中心作为中大规模互联网业务系统的物理中枢,容纳着一系列至关重要的硬件设备

服务器堪称数据中心的"智慧大脑",承担着数据处理与业务逻辑运算的重任。

  • 依据不同的功能需求,可细分为应用服务器、数据库服务器、文件服务器等。
  • 以电商平台为例,应用服务器负责处理用户的商品浏览、下单等操作请求:数据库服务器则专门存储和管理商品信息、用户订单等海量数据,通过高效的算法和索引机制,确保数据的快速检索与存储。

网络设备包括交换机、路由器、防火墙等,它们构建起了数据传输的"高速公路"

  • 交换机用于在局域网内实现设备间的数据快速交换:路由器则负责不同网络之间的数据转发,根据网络拓扑和路由办议,智能地选择最佳路径传输数据;防火墙如同忠诚的卫士,阻挡外部非法网络访问,保护内部网络的安全,防止数据泄露和恶意攻击。

存储设备是数据的"保险柜",常见的有硬盘阵列(RAID)、网络附属存储(NAS)和存储区域网络(SAN)等。

  • 硬盘阵列通过数据冗余技术提高数据的可靠性,即使部分硬盘出现故障,数据也能得以保全;
  • NAS提供了便捷的文件级存储服务,便于多用户共享访问;
  • SAN则适用于对存储性能和数据共享要求极高的企业级应用场景,能够实现高速的数据传输和集中管理。

软件体系

软件体系是赋予中大规模互联网业务系统灵魂与活力的关键所在,由业务系统、中台系统和支撑系统协同运作:

业务系统作为直接面向用户的窗口,是整个业务系统的核心价值体现。

  • 不同类型的互联网企业有着各具特色的业务系统,如社交平台的业务系统聚焦于用户关系管理、内容分享与互动;
  • 在线教育平台的业务系统则侧重于课程展示、学习进度跟踪、在线考试等功能。
  • 这些业务系统通过简洁易用的界面和流畅的交互体验,满足用户的多样化需求,提升用户的满意度和忠诚度。

中台系统可以看作是业务系统的"动力引擎",它整合了企业内通用的业务能力和数据资源,打破了不同业务系统之间的信息孤岛。

  • 在业务层面,中台系统的核心价值在于将企业的通用业务能力进行沉淀和共享。比如用户中台可以为多个业务系统提供统一的用户管理功能,包括用户注册、登录、权限管理等。SFRE要认识到中台系统这种能力共享的特性,理解其对提高业务开发效率、降低成本的重要意义,在运维过程中注重保障中台系统的稳定性和通用性。
  • 在数据整合层面,数据中台能够整合企业内各个业务系统的数据,形成统一的数据资产,为数据分析、决策支持等提供基础。SRE需要关注数据中台的数据采集、存储、处理和分发等环节,确保数据的准确性、完整性和及时性,同时要配合数据安全团队保障数据的安全性和合规性。
  • 在技术领域层面,中台系统为业务系统的创新和快速迭代提供了有力支持。中台系统利用微服务、Devops等技术,将服务拆解并以微服务方式重新组织,为前台提供技术支撑。
    • 一方面提供如日志服务、安全服务等通用的基础服务;
    • 另一方面针对每个业务模块提供业务服务,并能根据业务变化或增量进行更新或横向扩展。SRE要理解中台系统如何赋能业务,积极参与中台系统的优化和升级,使其更好地满足业务发展的需求。

支撑系统是保障整个业务系统稳定运行的幕后英雄,涵盖了系统监控、日志管理、安全防护、配置管理等多个方面。

  • 系统监控实时监测服务器的性能指标、网络流量等,及时发现潜在的问题并预警;
  • 日志管理记录系统运行过程中的各类操作和事件,为故障排查和业务分析提供重要依据;安全防护通过加密技术、身份认证、入侵检测等手段,保护业务系统和用户数据的安全;
  • 配置管理则负责对系统的各种参数和资原进行统一管理,确保系统在不同环境下都能稳定运行。
典型架构组件样式

典型组件

核心组件

  1. 服务器:
    • 包括应用服务器、Web服务器、数据库服务器等,用于部署和运行各种应用程序和服务,处理业务逻辑、存储和管理数据。
  2. 数据库
    • 关系型数据库:如MySQL、Oracle等,用于存储结构化数据,支持事务处理和复杂的SQL查询,适用于存储用户信息、订单数据等。
    • 非关系型数据库:如Redis、MongoDB等,用于处理非结构化或或半结构化数据,具有高并发读写能力和灵活的数据模型,常用于缓存、实时数据处理等场景。
  3. 分布式文件系统:
    • 如Ceph、FastDFS等,用于存储海量的非结构化数据,如图片、视频、文件等,提供高可靠性和可扩展性的文件存储服务。
  4. 辅助组件
    • 缓存系统:
      • 如Memcached、Redis,用于临时存储经常访问的数据,减轻数据库压力,提高系统响应速度。
    • 消息队列:
      • 如 Kafka、RabbitMQ等,用于实现应用程序之间的异步通信科消息传递,解耦系统组件,提高系统的可扩展性和稳定性,常用于异步任务处理、流量削峰等场景。
    • 负载均衡器:
      • 如Nginx、F5等,将用户请求均匀分配到多个服务器上,实现集群的负载均衡,提高系统的处理能力和可用性。
    • 搜索引擎:
      • 如Elasticsearch对大量文本数据进行索引和搜索,提供高效的全文检索功能,常用于实现网站的搜索功能。
    • 网关:
      • 作为系统的入口,负责对请求进行路由、过滤、鉴权等操作,你保护后端服务,提供统一的接口管理和安全防护

典型架构

微服务架构

  • 架构特点: 将大型业务系统拆分成多个小型、独立的微服务,每个微服务都都有自己独立的数据库、业务逻辑和接口,可独立开发、部署和扩展。各个微服务之间通过轻量级通信机制(如RIESTfulAPI、消息队列)进行通信和协作。
  • 应用场景: 适用于业务复杂、功能多样且变化频繁的互联网业务系统,能够提高开发效率、降低维护成本,便于团队分工协作,每个微服务可以根据自身的业务需求选择合适的技术栈。

分布式架构

  • 架构特点: 将系统的不同功能模块分布在多个节点上,通过网络进行通信和协作,以实现高并发处理、海量数据存储和计算等功能。通常包括分布式存储、分布式计算、分布式缓存等多个组件,各个组件协同工作,共同完成业务任务。
  • 应用场景: 常用于处理大规模数据和高并发请求的场景,如大型电商平台、社交媒体平台等,能够充分利用集群的计算和存储资源,提高系统的性能和可扩展性。

SOA架构(面向服务的架构)

  • 架构特点: 将业务功能封装为服务,通过服务之间的接口进行交互和协作:服务具有松竭合、可复用的特点,能够独立部署和升级。通过服务总线(ESB)实现服务的注册、发现、路由和消息传递等功能,对服务进行统一管理
  • 应用场景: 适用于企业级应用集成和业务流程整合,能够将不同部门或系统统的业务功能进行整合和共享,提高企业的业务协同效率和信息化水平。
AI大模型

AI大模型是什么

AI大模型可以理解为超厉害的智能大脑。

它是用大量数据,通过复杂算法训练出来的超级程序。能处理各种复杂任务,像理解咱们说话、写文章、画画等,就像一个啥都懂、啥都能做的"万能助手"

从技术层面来说,它一种超级智能的软件系统或者算法集合,是人工智能领域中具有大规模参数、能够处理和生成复杂数据的模型。

常见的AI大模型工具有哪些 OpenAl系列

  • GPT系列: 如GPT-3|4等,以强大的语言生成能力著称,能完成文本生成、翻译、问答等多种自然语言处理任务。
  • DALL-E系列: 如DALL·E2,是生成图像的模型,可根据文本选创造新颖的图像内容
  • CLIP: 能够同时理解图像和描述性文本,在图像分类、对象检测等多种视觉任务上可进行泛化学习。

Google系列

  • ERT: 双向训练结构使其在文本分类、命名实体识别、情感分析等多种自然语言处理任务中表现出色。
  • T5: 将各种语言处理任务统一转换为文本到文本的格式,可处理翻译、摘要、分类等多种任务。
  • Gemini2.0: 具有强大的多模态能力,能看懂屏幕内容,可与用户语音实时聊天,在多种场景中能提供帮助和建议。

国产系列

  • 盘古大模型: 包括NLP大模型、CV大模型、科学计算大模型等,可用于内容生成、图像分类检测、气象预报等多个领域。
  • 文心一言: 是百度开发的知识增强大语言模型,能够生成文本、图片、语音等多种形式的内容,可应用于内容创作、智能客服、智能办公等多个领域。
  • 豆包: 是字节跳动开发的AI大模型,具有强大的语言理解群和生成能力,能为用户提供准确、全面、有用的信息和帮助力,可处理各种自然语言处理任务。
  • 通义千问: 阿里云自主研发的大语言模型,能够在用户自然语言输入的基础上,通过自然语言理解和语义分析,在不同领域、任务内为用户提供服务和帮助。
  • Deepseek: 即幻方量化推出的DeepSeek大模型,通过"开原周"以及公开发布V3/R1大模型的推理系统技术介绍,在AI技术圈和开发者中获得关注,其开源代码对整个AI行业有一定的推动作用。
  • 腾讯元宝: 是由深圳市腾讯计算机系统有限公司开发,腾讯科技(深圳)有限公司运营,基于腾讯混元大模型开发的AI产品,主要功能为AI搜索、AI 总结、AI写作等。

SRE人员能为AI大模型做些什么

资源需求高

  • AI大模型训练和推理需要大量的计算资源,如GPU集群等,对硬件性能要求极高。同时,训练过程中内存占用大,数据存储也需要庞大的空间,并且由于其运算的复杂性,能耗也非常可观,运维时需要重点关注资源的合理分配和高效利用。

部署运维复杂

  • AI大模型的部署涉及到多个环节,包括模型的安装、配置,与各种框架和系统的适配等。而且,其更新迭代快,新模型版本的部署可能会带来兼容性问题。在运维方面,要监控模型型的运行状态、性能指标,处理可能出现的故障,还需进行数据管理和模型优化等工作,整个过程复杂且具有挑战性。

数据依赖性强

  • AI大模型的性能和效果高度依赖高质量的数据。数据的收集、清洗、标注等预处理工作至关重要,任何数据质量间题都可能影响模型的输出。运维过程中需要确保数据的完整性、准确性和安全性,还要建立有效的数据更新机制,以保证模型能及时学习到新的知识和模式。

AI大模型实施注意事项

Al大模型在实施时,在技术、数据、IDC等方面有诸多注意事项。

技术方面

  • 计算资源管理: AI大模型训练和推理需要大量的计算资源,如GPU、TFPU等。要合理规划资源,提高资源利用率,降低成本。
  • 模型优化与压缩: 大规模实施时,模型的大小和复杂度可能会带来部署和推理效率的问题。
  • 部署与运维架构: 设计合理的部署架构,确保模型能够高效地部署到生产环境中,并易于维护和管理。采用容器化、微服务等技术,实现模型的快速部署和弹性扩展。建立完善的监控和日志系统,实时监测模型的运行状态,及时发现和解决问题

数据方面

  • 数据质量与管理: 数据是AI大模型的基础,确保数据的质量至关重要。要保证数据的准确性、完整性和一致性。建立数据管理平台,对数据进行有效的存储、管理和更新,方便模型训练和调用。
  • 数据安全与隐私保护: 在大规模实施中,涉及大量的用户数据和敏感信息,必须加强数据安全防护,遵守相关法律法规。
  • 数据多样性与平衡性: 为了使模型具有更好的泛化能力,需要保证数据的多样性和平衡性生。避免数据偏差导致模型在某些场景下表现不佳。

人才管理方面

  • 专业人才培养与团队建设: AI大模型的实施需要具备专业知识和技能的人才,包括算法工程师、数据科学家、运维工程师等。要加强人才培养和引进,建立跨学科的团队,促进不同专业人员之间的协作和沟通。
  • 组织协调与沟通: 大规模实施AI大模型涉及多个部门和环节,需要建立有效的组织协调机制,明确各部门的职责和分工,加强沟通和协作,确保项目的顺利推进。

AI大模型在实施时对IDC(互联网数据中心)有诸多要求

  • 电力与散热: 需提供充足且稳定电力,满足高功耗设备运行,像大规模AI训练集群常需兆瓦级电力。同时配备高效制冷系统,将机房温度控于18°C-27°C、湿度 40%-60%,并合理规划气流,确保设备散热良好。
  • 网络性能: 提供高带宽连接,如10Gbps及以上,实现数据快速传输,支撑模型训练与推理。保证低延迟,尤其在实时应用场景下,延迟需达毫秒级。且采用冗余网络架构,保障网络高可靠运行。
  • 空间与安全: 具备充足机房空间,容纳大量服务器、存储及网络设备,并预留扩展展空间。设备布局要合理,便于维护管理。此外通过门禁、监控等措施保障物理安全,运用数据备份、网络防护等手段确保数据安全。

计算机系统

计算机的组成

计算机(Computer):俗称电脑,是一种能接收和存储信息,并按照存储在其内部的程序对海量数据进行自动、高速地处理,然后把处理结果输出的现代化智能电子设备

计算机有很多形式,比如:生活中常见的家用电脑,笔记本,智能手机,平板电脑等,还有生产环境中提供重要业务支撑的各种服务器(Server),都算是计算机。

其中一个完整的计算机系统由硬件(Hardware)系统和软件(Software)系统两大部分组成

img_20250726_113014.png

南桥北桥

  • 南桥芯片
  • 一般位于主板上离CPU插槽较远的下方,PCI插槽的附近。过这种布局是考虑到它所连接的I/0总线较多,离处理器远一点有利于布线。
  • 主要负责I/0总线之间的通信,如PCI总线、USB、LAN、ATTA、SATA、音频控制器、键盘控制器、实时时钟控制器、高级电源管理等。这些技术一般相对来说比较稳定。
  • 与处理器不直接相连,而是通过一定方式与北桥芯片相连。其数据处理量相对较小,一般不需要散热片。

北桥芯片

  • 位于CPU插座附近,是主板上离CPU最近的芯片。
  • 主要负责与CPU的联系,并控制内存、AGP数据在北桥内部传输。它提供对CPU的类型和主频、系统的前端总线频率、内存的类型和最大容量、AGP插槽、ECC纠错等支持。整合型芯片组的北桥芯片还集成了显示核心。
  • 作为主板芯片组中起主导作用的最重要的组成部分,北桥芯片发热量大,一般需要散热片盖住,有的还另外加风扇散热。

计算机发展

计算机发展历史

  1. 第一代计算机(1946-1957) 电子管时代
  2. 第二代计算机(1958-1964) 晶体管时代
  3. 第三代计算机(1965-1970) 集成电路时代
  4. 第四代计算机(1971以后) 大规模集成电路时代

电子计算机的诞生

世界上第一台数字式电子计算机是由美国宾夕法尼亚大学的物理学家约翰.莫克利(John Mauchly)和工作师普雷斯伯.埃克特(J-Presper Eckert)领导,于1943年开始研制并于1946年完成,取名为ENIAC(Electronic Numerical Integrator And Calculator)的计算机。它的出现标志着电子计算机时代的到来 。

小知识-计算机的诞生在第二次世界大战中,美国政府寻求计算机以开发潜在的战略价值。这促进了计算机的研究与发展,1944年howard h.Aikien(1900-1973)研制出全电子计算机,为美国海军绘制弹道图。这台简称Mark的计算机有半个足球场大,内含500英里的电线,使用电磁信号来迁移机械部件。

  1. 第一台电子计算机(ENIAC)

    体重28吨,占地面积170m^2,18800只电子管,1500个继电器,功率160kw,5000次加法/秒。

  2. 第一代: 电子管计算机(1946-1957)

    采用电子管为主要元件,主要用于科学计算。操作指令为特定任务而编制,一种机器只能执行一项任务。没有软件配置,采用机器语言或汇编语言。

  3. 第二代:晶体管计算机(1958-1964)

    采用晶体管为主要元件,除科学计算机外,用于数据处理和工业控制。软件配置开始出现,高级程序设计语言问世。(程序员、分析员和计算机系统专家)和整个软件产业由此诞生。

  4. 第三代:集成电路计算机(1964-1970)

    采用半导体中小规模集成电路为核心元件,应用进入到很多科学技术领域,软件配置完善,具有了操作系统。

    操作系统是人操作硬件的中间层,我们可以 通过操作系统来控制硬件的工件。

    虽然晶体管比起电子管是一个明显的进步,但晶体管还是产生大量的热量,这会损害计算机内部的敏感部分

  5. 第四代:大规模集成电路计算机(1970-现在)

    以大规模或超大规模集成电路为主要部件。计算机沿两个方向发展:

    • 利用逻辑芯片,组装出大型、超大型、巨型计算机,速度和存储容量有了大幅度提高。
    • 产生微处理器,微计算机飞速发展,渗入到生活的各个领域。出现集成电路后,唯一的发展方向是扩大规模。大规模集成电路LSI,可以在一个芯片上容纳几百个元件。
  6. 光子、里子计算机

    对于电子,一个电子可以表述2个数字。但对于量子,它是一种模糊态。它的特性是不确定的。

    假如从这到天安门去有无数条路可以走,其实只要不走它就是模糊的混沌的在你面前展开的,但是一但你选择了,这个状态就确定了。所以当你不观测时它就像一个波,当你观测时它就是一个电子。

    量子计算机如果根据这种态来实现记录的话,很有可能任何一个时态在你观察之前它是模糊的能存储N种可能性,所以这样就使得同样的位,比方有10位如果做量子计算的话它能存储数据只能存储10位的量子,可能比我们全球所有的计算机加起来提供的运算能力和存储能力都要强。现在的各种加密机制防护机制在量子计算机面前都不堪一击。

参考文档: https://en.wikipedia.org/wiki/Computer#History_of_computing_hardware

世界上第一台计算机

img_20250726_113522.png

1946年,世界上第一台计算机ENIAC(electronic numerical integrator and calculator电子数字积分计算机)在美国宾州大学诞生,是美国奥伯丁武器试验 场为了满足计算弹道需要而研制成的。使用了17468只电子管,占地170平方米, 重达30吨,耗电174千瓦,耗资40多万美元。每秒可进行5000次加法或减法运算

计算机理论

从计算机的几个阶段的发展,虽然样式发生了改变,但是它的体系没有发生革命性的变化,依然延用最初的体系样式–冯诺依曼体系。

冯·诺依曼体系
image-20210215092720081.png

1946年美籍匈牙利数学家冯·诺依曼于提出存储程序原理,把程序本身当作数据来对待,程序和该程序处理的数据用同样的方式储存。

冯·诺依曼体系结构冯·诺依曼理论的要点是:

  • 数字计算机的数制采用二进制,bit 位, byte 字节 1 byte =8 bit
  • 计算机应该按照程序顺序执行
  • 计算机硬件由运算器、控制器、存储器、输入设备和输出设备五大部分组成
1、一个字节 = 8位(8个二进制位) 1Byte = 8bit;
2、一个十六进制 = 4个二进制位
3、一个字节 = 2个十六进制

艾伦·麦席森·图灵

艾伦·麦席森·图灵(英语:Alan Mathison Turing,1912年6月23日~1954年6月7 日),英国计算机科学家、数学家、逻辑学家、密码分析学家、理论生物学家 ,“计算机科学之父”、“人工智能之父” ,英国皇家学会院士 。

计算机的5大部件

  • CPU-运算器: 提供算术运算、逻辑运算等各种运算
  • CPU-控制器: 控制总线的使用权限、控制询址。CPU内部同时提供加速辅助固件:寄存器、缓存
  • 存储器:指的内存,也被称为RAM(Random Access Memory随机访问)
  • Input输入设备:下指令,提供数据等;
  • Output输出设备:输出数据加工的结果

说明:

整个计算其实是围绕着运算器、控制器、存储器3大组件就能够展开并完成所有操作,Input输入设备、Output输出设备仅仅按人类的需要加工的设备。

各组件的功能

  • 控制器(Control):计算机的中枢神经,控制部件之间的协调,也包括寻址操作
    • 保障不同数率传输的数据可以得到缓冲、甄别IO设备传送数据的正错、实现数据与数据之间的交换、接收和识别命令
  • 运算器(Datapath):包含算数逻辑单元(ALU)、累加器、状态寄存器、通用寄存器组等,通常只做运算
    • 算数逻辑单元(ALU):进行二位元的算术运算,如加减乘(不包括整数除)、移位等
    • 累加器(accumulator):储存计算产生的中间结果。保证ALU不用将计算结果写入内存
    • 状态寄存器:存放两类信息– 体现当前指令执行结果的状态信息、控制信息
    • 通用寄存器组:可用于传送和暂存数据,也可以参与算术逻辑运算,保存运算结果

通用寄存器组包括以下几类:数据寄存器、变址寄存器、指针寄存器、段寄存器、指令指针寄存器

  • 存储器(memory):具有存储数据和读写数据的功能,每一个存储单元为cell,8位二进制为一个存储单元,也就是一个字节
    • 最小存储单元 1024/1024/1024/4 Bytes 1024/1024/4 KB 1024/4 MB 4 GB-–—32位CPU最多只能使用4GB内存
  • 输入设备(Input):作用是将程序、原始数据、文字、字符、控制命令或现场采集的数据输入到计算机
    • 常见的输入设备有:键盘、鼠标、磁带机、磁盘机、光盘机等
  • 输出设备(Output):作用是把计算机的中间结果或最后结果、机内的各种数据及文字等信息输出来
    • 常见的输出设备有:CRT、打印机、绘图仪等

冯·诺依曼

image-20210215092740676.png
设备发展

早期计算机系统的输入设备:穿孔纸带

image-20210215092751792.png
image-20210215094234442.png
摩尔定律

由英特尔(Intel)创始人之一戈登·摩尔于1965年提出,当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增加一倍,性能也将提升一倍

image-20210215092825194.png

限制

  • 在人工智能时代,摩尔定律也面临一些挑战。随着晶体管尺寸逼近原子尺度,传统的摩尔定律面临技术瓶颈,导致性能增长放缓。研究人员已经开始寻找替代方案,如通过多核并行处理、异构计算和量子计算等技术来提高计算性能。此外,单纯依赖硬件性能提升可能不足以支撑人工智能的持续发展,算法优化、软件框架改进和计算资源分配策略的创新也将同同样重要。
  • 尽管如此,摩尔定律的效应可能通过新材料、新架构或量子计算等替代技术的发展而延续下去。例如,英伟达(Nvidia)首席执行官黄仁勋提出的"黄氏定律"认为,GPU将推动AI性能实现逐年翻倍。这显示了即使在面临挑战的情祝下,人们仍在寻找新的方法来延续摩尔定律的效应。
不同进制
  • 二进制逢二进一,所有的数组是0、1组成
  • 八进制逢八进一,所有的数组是0到7组成
  • 十六进制逢十六进一,所有的数组是0到9和A到F组成 字母不区分大小写

二进制口诀

  • 2^0=1=1b
  • 2^1=2=10b
  • 2^3=8=1000b
  • 2^4=16=10000b
  • 2^5=32=100000b
  • 2^6=64=1000000b
  • 2^7=128=10000000b
  • 2^8=256=100000000b
  • 2^9=512=1000000000b
  • 2^10=1024=10000000000b
  • 2^11=2048=100000000000b
  • 2^12=4096=1000000000000b

二进制 1010 转10进制:1000 + 10 <==> 2的3次方+2的1次方 = 8+2 = 10

二进制 10101000 转 10进制:10000000 + 100000 + 1000 <==> 2的7次方 + 2的5次方 + 2的3次方 = 128 + 32 + 8 = 168

十六进制转化为二进制

十六进制的数和二进制数可以按位对应( 十六进制一位对应二进制四位 ),因此常应用在计算机语言中。

0101 0111 1010 1011 0101 0111 1101 0111 000
 5    7    A    B    5    7    D     7   0

十六进制转二进制

 A    B    4    2    D
1010 1011 0100 0010 1101

8421法则: 将各个位数的二进制用十进制中的【数字 】来表示多位的二进制数 通过【数字 】相加就可以得到二进制数的数据

8 1000
4 100
2 10
1 1
1000
  100
    10
      1
————
1 1 1 1
常见单位
  • 10的36次方 X
  • 10的33次方 C
  • 10的30次方 D
  • 10的27次方 N
  • 10的24次方 B
  • 10的21次方 Y
  • 10的18次方 E
  • 10的15次方 P
  • 10的12次方 T 二进制 2^40
  • 10的 9次方 G 二进制 2^30
  • 10的 6次方 M 二进制 2^20
  • 10的 3次方 K 二进制 2^10=1024
  • 10的 2次方 百
  • 10的 1次方 十
  • 10的-1次方 分 d
  • 10的-2次方 厘 c
  • 10的-3次方 m
  • 10的-6次方 μ
  • 10的-9次方 n
  • 10的-12次方 p
  • 10的-15次方 f
  • 10的-18次方 a

数据存储容量单位

最小的数据单位是bit(位),一个bit代表一个0或1。
byte(字节) 一个英文字母就占用一个字节,也就是8位;一个汉字占用两个字节。

每8个bit组成一个 一般位简写为小写字母“b”,字节简写为大写字母“B”。
每1024个字节称为1KB。

字节 1B  = 8bit
千字节 1 KB = 1024 Bytes
兆字节 1 MB = 1024 KB
吉字节 1 GB = 1024 MB
太字节 1 TB = 1024 GB
拍字节 1 PB = 1024 TB
1 EB = 1024 PB
1 ZB = 1024 EB
1 YB = 1024 ZB
1 BB = 1024 YB
1 NB = 1024 BB
1 DB = 1024 NB

范例:确定当前系统是32位或64位

[root@centos8 ~]#getconf LONG_BIT
64
[root@rhel5 ~]# getconf LONG_BIT
32

arch
计算机如何从存储上取得数据呢?
img_20240302_165136.png
  1. 程序的组成

简单来讲,其实在冯.诺依曼体系当中他们也定义另外一个概念,叫做 程序是由指令(操作命令)+数据(被加工的内容)组成

指令就是计算机要运行的操作命令,比如做加法、做减法;当然从内存中取得某个数据也叫指令,但是数据本身则是被加工的内容。

别外程序还被分为另外一种描述方式:

程序也是由算法+数据结构组成

什么中算法呢?算法类似从A到B点的距离多种方式,我们要计算出来哪种方式是代价是最低的,数据结构是用于表明这种指令或算法本身要完成数据加工要以何种结构组成。所以说不同的算法通常对应于不同的数据结构,它们2者有很密切的关系的,有些数据结构用A算法效率较好,有些则用B算法效率较好。

  1. 指令怎么跑? 对于计算机来讲,CPU就是来跑程序的,CPU又由运算器和控制器组成,如图(计算机内部简单工作法则图)左边是运算器右边是控制器下面是存储器里面有数据,比如我们告诉CPU做加法运算,那么CPU上面一定有一个指令在这个CPU芯片设计时其内生在硬件逻辑上要支持加法运算,所以这个就叫做CPU自己支持的指令。 假设CPU能做加减乘除这四类运算的话,那么所有的指令结合起来对于一个CPU而言就叫做指令集,即CPU能支持的所有的指令集合。指令集大休分为2类,1类叫普通指令,比如加减乘,对其它没有影响的。;1类叫做特权指令,比如清空内存对其它没有影响的。

对于图(计算机内部简单工作法则图)运算器和控制器都有各自不同的指令集,运算器通常用来做运算,控制器通常来控制这几个部件之间的协调也包括询址操作。

  1. 我们来简单来描述下存储器和运算器、控制器是怎么结合的

比如作加法运算,问题是几加几?指令是CPU自己支持的,要加工的数据在什么地方存放?这就需要存储器来存储数据了。

存储器的最小存储单元是什么? 而我们的存储器就是我们能看到的内存设备,其实在其内部是划分成了各各存储单元的,每个单元叫做一个细胞好了叫做一个CELL,大小是固定的,当然历史上各种说不清道不明原因,这每个CELL的大小是8位(bits),我们知道计算机的存储是按位来存储的,即0和1方式,8 位指的就是8位二进制,最多只能存8个二进制数字,比如0和1当中任何一种变化形式,每8位组织成一个CELL,一个存储单元,这每个CELL所提供的存储单元我们叫做一个字节(Bytes),所以有时候我们把它分为大B和小b的概念,小b通常指的就是bits(位),大B指的是Bytes(字节,8位2进制)。这每一个存储单元都是8位二进制,对于内存而言它的最小存储单元就是字节,也就意味着你哪怕只存一位数据也要占一个字节,另外7位只是空的对我们来讲没有用。我们一定要明白最小存储单元是什么。

存储器的编址形式

我们的数据在存储器上,在这么多存储格子里,当我们访问数据时,要计算第8个格子(即第8个CELL)和第3个CELL之间的两个数值之间的和,问题是我们怎么知道第8个格子和第3个格子在什么地方?我们可以理解为人其实就是数据,就是组织在这样能够存储人的地方这个房子我们就叫做存储格子,那么每一个格子为了能够方便找到,所以我们给它们做了编址。内存也是一样的道理,内存当中的每一个CELL都是有地址的,但是对于计算机而言,它们叫做电子数字计算机,所以它们更容易理解的是数字而不是字符串,不像我们现实生活中我们叫北京市某某胡同某某项某某街某某号,存储器这通通按照数字进行编址。而且,数字编址时我们必需在一个平面下能够编址完成才行。什么叫做一个平面下?比如对于北京市而言,北京市1号,北京市2号,北京市3号,我们知道北京市1号在什么地方吗,我们就无从得知了。为了能够让我们知道,我们可以按照一种特定的逻辑进行编辑编码,从南向北自东向西12345678,这样的话就有北京市第100号,像这种就叫做一个平面单元。一个平面单元上能编辑多少能?假如说一共只有3000号,北京有3001户那怎么办呢,在我们的户口薄上就溢出了。像这种就叫做平面编址。 平面编址我们知道编码不方查找不方便,于是我们可以把它划分成N层的立体编址方式,比如北京市海滨区、朝阳区,从一个大空间缩小成多个小空间,但是内存不能。内存的编址方式是一个平面的结构下进行编址的。它的编址方式必须能容纳所有的内存空间才行。而历史上说不清道不明的原因,我们CPU有所谓字长的概念,比如8位CPU、16位CPU、32位CPU、64位CPU。

32位CPU的存储能力

32位CPU指的是它的数据存取能力一次是32位二进制,你可以想像成在CPU之前有并排的32根线,每一根线对于计算机来讲它就是通电和不通电、有电压和无电压,有电压电路打通时表示为1,电路不能时表示为0,因此它有32根线每一根线有2种状态0或1。假如有一共有32根线,能表示多少种不同的变化?那就是2的32次方。所以CPU最多只能引用2的32次方个不同的位置,即对于CPU来讲只能理解2的32次方个不同的CELL。做10进制换算2的10次方等于1024,那么2的32次方相当于1024/1024/1024/4,本来默认存储器的最小存储单元是一个CELL即1Bytes,把公式向上进制,1KB=1024个Btyes,所以结果就成了1024/1024/4KB,再进制,1MB=1024KB,结果成了1024/4MB,最后再进制,1G=1024MB,结果为4GB。这里K在计算机中是以1024换算进制的,而现实生活中K代表1000,所以会出现买U盘时,计算机厂商以1000为进制单位,但是我们计算机的识别是以1024为单位换算的,32G的U盘到了电脑上格式化之后只有29点多G。所以,32位CPU最多只能使用4GB内存。 32位CPU数据存取能力:一次32位二进制,最大支持4G内存

2^10=1024
    1024*1024*1024*4 Bytes
        1024*1024*4 KB
        1024*4 MB
        4 GB

对于32位计算机来讲,其内存的每个内存单元都是使用了32位的二进制来进行标识的。比如第一个可能是前面31个0最一个0表示第一个单元,第2个是前面31个0最一个2表示第2个单元,所以它是在同一个平面下进行编址的,因此所有的内存包括手机的内存都基于这种方式进行定义的,可能称乎的术语不一样。比如有人问手机内存多大的?32G。通常这是指的是外存ROM,我们通常指的是运行内存RAM。

因此计算机是怎么运行的呢?什么叫指令加数据?

对于图(计算机内部简单工作法则图),它为了能够运行指令加数据,我们知道程序是由程序员编写的。写好的程序通常是放在我们的外部设备上的(如硬盘),因此这个程序要想运行这个就要装载到内存中,因为CPU只能跟内存打交道不可能跟硬盘直接打交道的,所以所有的数据要先装入内存中,硬盘其实是一种IO设备,不用想得过于复杂(如程序从哪来的)。所以一个程序要想运行,首先这个程序是稳健的,从磁盘装载到内存中,而程序是由指令加数据组成,这是意味着指令和数据都在内存中。比如第一个格子到第3个格子放的是指令,456789号格子放的是数据,于是CPU首先要加载每个指令,在这个指令中它会告诉CPU我们要运行的数据在什么地址,所以这个时候CPU会找到对应的内存单元当中把数据取出来。假如我们算的是第4个和第8个格子单元中的数字做加法运算,=第一步=我们先=取出指令=,=第2步=这个指令联系到的有数据,于是=把数据从内存中取出=来直接在运算器上做加法运算,内存是编址的存储单元。在指令被放入到运算器=之前=实际上=还有一个步骤=,指令还有第2个指令第3个指令,没准数据还要进行进一步的加工。所以为了能够让CPU知道运行完之后第一条指令之后,运行第2条指令在什么地方,CPU内部就有了=寄存器=(register),最常用的就是指令指针寄存器(IP),指令指针寄存器指的是比如加载完指令后,一个程序的多条指令彼此是有关系的,这种关系通常对于一个过程式编程言来讲,它内部的控制逻辑无非只有3种,第1种叫顺序执行(第一条运行完后运行第2条),第2种循环执行(一段代码驴拉磨似的循环运转),第3种叫选择执行(代码可能有10条分成2类,有选择性选取代码执行),因此为了能够让CPU知道运行完之后第一条指令之后,运行第2条指令在什么地方,CPU内部就有了寄存器保存了下一次要执行的指令在哪一个存储单元中。还有我们在做加法运算时还要取来被加数,接着再取加数,被加数取出来以后才能再取加数的,2者要依次进行,暂存下来放在数值寄存器中。=还有=内存跟CPU比起来效率非常的慢,迄今为止内存的工作频率1866、1600、1333的,比起CPU的工作主频3GHz慢得多得多,也就意味着CPU说一句话要等可能空转2圈内存才可能接受到指令。为了避免CPU和内存之间不会耽误太长时间,CPU内部就引用了各种各样的缓存,其实CPU的缓存越大CPU的命中率就越高,命令率越高就意味着CPU的性能越好。同样一个主频的CPU,CPU的缓存越大就越贵贵的离谱,因为CPU缓存内部的工作机制跟你的内存工作机制不太一样,造价要比内存高得多得多,另外一方面CPU芯片面积有限的它要尽可能越做越小,通常而言CPU内部的缓存会非常小,而且比如从512K增涨到1MB那CPU价格可能要翻1倍的。所以你千万不要小瞧缓存,对于互联网时代有句话叫”catch is the king”缓存为王,这是加速当中的一个非常的计算方式,而且在=计算机领域中有一个特性或思维逻辑,就是任何两个层次之间在速度上也巴在逻辑上也巴只要不衔接就加中间层=。比如CPU快内存慢加中间层(缓存层),语言编程也是一样的道理,人说的机械听不懂那就加中间层(用编译器来实现)。这样在计算的时候虽然会影响一部分性能,但这种影响实际上带来的提升效果比降低的效果高很多,比如跟老外交流,对方说英语我们说汉语,为了与人交流我们可能要花很长时间学会英语可能要1、2年的功夫,但是找一个翻译可能只需要几分钟的功夫。这就是计算机中的简单工作法则。第3步,运算器把运算的结果

IO设备

我们知道硬件本身没有任何指令没有任何程序,所以我们的程序员写的软件非常关键,但是我们又应该知道计算机自己被制造出来它内部并没有带什么程序,所以我们需要程序员写好程序把指令和数据输入给计算机,让计算机能够运行并且运行后的结果反馈给我们,所以这就需要输入输出设备,我们通常把它叫做IO设备。常见的输入设备,比如磁盘,它既能输入也能输出,站在计算机的角度,我们可能从磁盘中读出来数据,我们还可能把数据加工以后存入磁盘。比如键盘,可以输入高端的可能输出(如震动)。比如鼠标,输入设备。常见的输出设备,比如显示器,比较廉价,因为早些时候的输出设备是穿孔纸带,任何一次输出都要要一条上打孔,有孔的地方表示1,没孔的地方表示0,然后一些记录员再把它翻译成二进制再转换成10进制,然后再根据码表换成字符,像早期的电传电报就是这样发报的。像摩斯密码,按下去马上抬开表示0,按下去持续一段时间表示1,但如果按下去好长时间才抬开怎么表示一个1啊?

双方必须按照同样时序进行操作,要么是同步,要么是异步,异步话要自己事先定义好,比如我每1毫秒的时长表示一个1,因此我按下去不松开1秒钟表示1000个1,按照这样的方式来工作的。所以时间在数据传输上的至关重要的,这就是为什么,计算机内部CPU都有频率。这每一个频率就是指的是在一个时钟周期内这个时间结束了它的一件事干完了。所以这就是为什么主频越高CPU的性能越好,因为所谓3GHz指的就是它在1秒钟内能做3GHz次的操作(即30多亿次的运算)。

现在的输出设备显示器,可以亿万次的输出,不像打印机一样浪费纸张,所以说它是非常廉价的设备。

指令集: 假设把CPU加法乘法等指令结合起来就叫做指令集;

指令集可分为2类: 普通指令:比如加减乘 特权指令:比如清空内存

image-20210215102032249.png

存储器(memory):具有存储数据和读写数据的功能,每一个存储单元为cell,按照数字进行编址,8位二进制为一个存储单元,也就是一个字节

#  32位CPU最多只能使用4GB内存 ,32根电路线,每根只有0、1的变化,共有2的32次方变化,2^32=2^10 * 2^10 * 2^10 *2^2=1024*1024*1024*4 Bytes  =1024*1024*4 KB =1024*4 MB =4 GB——32位CPU最多只能使用4GB内存

计算机分类

按规模划分
  1. 超级计算机:Super Computer,又称巨型计算机,应用于国防尖端技术和现代科学计算中。巨型机的运算速度可达每秒百万亿次以上,"天河一号"为我国首台千万亿次超级计算机
  2. 大型计算机:具有较高的运算速度,每秒可以执行几千万条指令,而且有较大的存储空间。往往用于科学计算、数据处理或作为网络服务器使用,如:IBM z13 mainframe
  3. 小型计算机:指采用精简指令集处理器,性能和价格介于PC服务器和大型主机之间的一种高性能64位计算机。在中国,小型机习惯上用来指UNIX服务器
  4. 微型计算机:指采用 X86 CPU架构的PC服务器,中央处理器(CPU)采用微处理器芯片,体积小巧轻便,广泛用于商业、服务业、工厂的自动控制、办公自动化以及大众化的信息处理,互联网公司发起去IOE运动,代替小型机
按功能和角色划分

按角色

  • 服务器:即Server。
    • 计算机的一种,通常是网络中为客户端计算机提供各种服务的高性能的计算机,服务器在网络操作系统的控制下,将与其相连的硬盘、磁带、打印机及昂贵的专用通讯设备提供给网络上的客户站点共享,也能为网络用户提供集中计算、信息发布及数据管理等服务
  • 客户机:即Client。
    • 向服务器提出请求,需要服务器为之提供相应的服务和支持的计算机

服务器按应用功能可分为:

Web服务器、数据库服务器、文件服务器、中间件应用服务器、日志服务器、监控服务器、程序版本控制服务器、虚拟机服务器、邮件服务器、打印服务器、域控制服务器、多媒体服务器、通讯服务器、ERP服务器等

服务器种类

PC服务器常见的三种外型:

  • 塔式服务器
  • 刀片式服务器
  • 机架式服务器
塔式服务器

image-20210215092849147.png image-20210215095610288.png

早期的服务器形式,目前较少使用

外形类似于桌面电脑的塔式机箱,可以独立放置在办公室或机房中,无需专门的机架。它通常具有较大的机箱和独立的支架,便于内部硬件的扩展和维护。

适用于中小型企业、办公室等环境,以及需要文件共享、打印服务、网络应用服务、数据备份和恢复、软件开发和测试等任务的场景。

刀片式Blade服务器
image-20210215092901492.png

在标准高度的机架式机箱内可插装多个卡式的服务器单元,实现高可用和高密度

更高的密度,集中管理,高性能,灵活扩展,按需配置

可以使用系统软件将这些母板集合成一个服务器集群。在集群模式下,所有的母板可以连接起来提供高速的网络环境,并同时共享资源,为相同的用户群服务

机架式服务器

专为机架架构设计的服务器,机箱宽度为19英寸,高度有1-7U几个标准,适合放置在标准的19英寸机架中。机架式服务器通常采用垂直设计,便于多台服务器垂直堆叠,节省空间。

广泛应用于数据中心,是构建云计算平台、进行大数据处理和分析、托管web服务器、应用服务器和数据库服务器等的核心组件。

image-20210215092918485.png
image-20210215092930758.png

特点:

  • 高密度: 垂直设计允许将多台服务器堆叠在一个机架中,提高数据中心中服务器的密度。
  • 灵活性: 标准化的尺寸和设计使得机架式服务器可以在不同的数据中心和机架中灵活部署和管理。
  • 管理简便: 垂直堆叠设计和热插拔功能使得对服务器的管理和维护更加便捷。
  • 高可用性: 冗余设计和支持热插拔功能保证了服务器的高可用性
服务器的样式
Table 1: 服务器的规格大小
规格 尺寸 深度 价位
1U 1.75英寸,约4.445厘米 300~600毫米 数千~上万
2U 2个1U,约8.89厘米 635~762毫米 1万~数万
4U 4个1U,约17.78厘米 一般为400毫米 2万~数十万
8U 8个1U,约35.56厘米 260~300毫米,无标准深度 数十万~数百万

注意:在服务器领域,"U"是Unit的缩写,代表服务器机箱的高度度单位。服务器的深度在不同厂商里面,规则也不一样,应用场景不同,深度也不一样,一般来说,不会超过800mm。目前的一些8U的GPU服务器。

浪潮NF5280M6

  • 含挂耳: W(宽)478.8mm;H(高)87mm;D(深)811.7mm
  • 不含挂耳: W(宽)435mm;H(高)87mm;D(深)780mm

超聚变2288HV6

  • 尺寸(高x宽x深)86.1mm×447mm×790mm

H3C R4900 G5

  • 87.5mm(高)*445.4mm(宽)*748mm(深)(不含安全面板)
  • 87.5mm(高)*445.4mm(宽)*776mm(深)(含安全面板)

服务器的挂耳指的是服务器机箱上的金属托架,也被称为挂耳。它们通常位于服务器机箱的两侧,用于固定服务器在机架上。挂耳的设计使得服务器可以轻松地安装在机架上,同时也方便维护和管理。

  • 按照统一标准设计,配合机柜统一使用,便于统计管理,高密度,节省空间,机箱尺寸比较小巧,在机柜中可以同时放置多台服务器
  • 机架式服务器的宽度为19英寸(48.26cm),厚度通常有1U,2U,3U,4U,5U,7U几种标准的服务器
  • 机柜的尺寸也是采用通用的工业标准,如:宽度600mm,深度1000mm,高2000mm(42U)

服务器配置示例(参考价格47588元)

image-20210215093019134.png
数据中心机房

数据中心可以分为IDC(Internet Data Center,互联网数据中心)、EDC(Enterprise Data Center,企业数据中心)、NSC(National Supercomputing Center,国家超级计算中心).

  • IDC: 是电信业务经营者利用已有的互联网通信线路、带宽资源,建立标准化的电信专业级机房环境,通过互联网向客户提供服务器托管、租用以及相关增值等方面的全方位服务。
  • EDC: 是指由企业或机构构建并所有,服务于企业或机构自身业务的数据中心,是一个企业数据运算、存储和交换的核心计算环境,它为企业、客户及合作伙伴提供数据处理、数据访问等信息,应用支持服务。
  • NSC: 是指由国家兴建、部署有千万亿次高效能计算机的超级计算中心。与IDC、EDC不同,国家超级计算中心由国家兴建和运营,对外提供的是运算能力。

根据规模容量不同,数据中心可以分为超大型数据中心、大型数据居中心和中小型数据中心。

  • 超大型数据中心: 规模大于10000个标准机架的数据中心,用于为全球范围内的大型企业和互联网服务提供商提供高容量和高性能的数据存储和处理服务,为企业和科研机构提供数据挖掘、机器学习和人工智能等领域的支持。
  • 大型数据中心: 规模介于3000~10000个标准机架的数据中心,用于为大型企业或或者互联网公司提供数据存储和处理服务。
  • 中小型数据中心: 规模小于3000个标准机架的数据中心,用于为中小型企业业提供数据存储和处理服务。

数据中心的基础设施主要包括:

  • 硬件组件: 服务器、存储设备、网络设备
  • 软件系统: 操作系统、虚拟化技术、数据中心管理软件
  • 物理基础设施: 电力供应、冷却交换系统、安全系统【门禁、监控头、防【火墙、入侵检测等】

数据中心相关硬件

image-20210215095726880.png

上图为数据中心,有许多硬件设备,大体上可以分为三类:服务器,网络设备和存储设备,图中这一排

排的就是机柜,我们平时所谓的服务器、网络交换机和存储等设备都放在这里面。

物理拓扑

image-20210215095822398.png

物理设备怎么放

在机柜中有许多的设备,用上面所示的方式进行连接,包括服务器、光纤交换机、磁盘阵列和磁带库等。其中上层的设备是服务器,中层的设备是光纤交换机,下层的设备是存储设备,包含磁盘阵列和磁 带库。

实际数据中心要复杂的多,除了包含上述设备外,还包括核心路由器、核心交换机、防火墙和负载均衡器等等设备。这还不包括上述机柜、无烟灭火器、空调和UPS等辅助设备

逻辑拓扑

image-20210215095911578.png

数据怎么走

上面复杂的结构可简化为上面的逻辑图,可以看到服务器通过主机总线适配器,即:HBA(Host Bus Adapter)卡和光纤交换机相连,而存储设备也通过HBA卡和光纤交换机相连;服务器之间通过以太网交换机互联。

服务器硬件组成

服务器硬件—CPU
image-20210215093033916.png

介绍

CPU,即中央处理器(Central Processing Unit),它本身是一块超大规模的集成电电路,是计算机的运算核心和控制核心部件。

CPU的主要功能是解释计算机指令以及处理计算机软件中的数据。它通过从存储器或高速缓冲存储器中取出指令,放入指令寄存器,并对指令进行详码和执行以及处理数据,从人而完成计算机的各种操作。

目前市面上常见的CPU类型主要有以下几种:

  • Intel CPU: 包括Celeron、Pentium、Corei3、Corei5、Core i7、Corei9等系列产品。IntelCPU在性能方面表现优秀,特别是在单线程性能上相对较强。
  • AMD CPU: 与Intel并列的两大CPU厂商之一,其产品包括Ryzen、Athlon、FX等系列。AMDCPU在多线程性能方面表现突出,适合用于多任务处理、媒体编码等需要高性能的场景。
  • ARM CPU: 主要应用在移动设备、物联网设备、嵌入式设备等领域。ARMCPU采用RISC(Reduced Instruction Set Computing)架构,具有功耗低、成本低等优点。
  • PowerPC CPU: 主要应用在工控、计算机集群等领域,具有可扩展性强、稳定性高、功耗低等优点。
  • SPARC CPU: 主要应用于UNIX服务器、高性能计算等领域,以其强大的性能和稳定性著称

为什么会出现如此多的CPU类型:因为不同的生产厂商决定的

cpu发展

CPU的发展经历了从单一、低效能向高性能、多核心、高并发和低功耗的演变过程。从20世纪50年代至60年代初的第一代计算机采用电子管作为基本元件,到1971年英特尔推出世界上首款微处理器4004,标志着现代意义上的CPU诞生。此后,随着技术的不断进步,CPU经历了8位、16位、32位和64位等多个时代的发展,并出现了多核并行、超线程技术、低功耗优化等先进技术,不断推动信息技术进步和社会发展。

cpu常见术语

CPU主频:主频是CPU的时钟频率(CPU Clock Speed),是CPU运算时的工作的频率(1秒内发生的同步脉冲数)的简称。单位是Hz。一般说来,主频越高,CPU的速度越快,由于内部结构不同,并非所有的时钟频率相同的CPU的性能都一样

外频:系统总线的工作频率,CPU与外部(主板芯片组)交换数据、指令的工作时钟频率

倍频:倍频则是指CPU外频与主频相差的倍数

三者关系是:主频=外频x倍频

高速缓存(cache):高速交换的存储器。CPU缓存分为一级,二级,三级缓存,即L1,L2,L3

lscpu

L1d cache:             32K  数据缓存
L1i cache:             32K  指令缓存
L2 cache:              4096K
L3 cache:              28160K

内存总线速度(Memory-BusSpeed):一般等同于CPU的外频,指CPU与二级(L2)高速缓存和内存之间的通信速度

地址总线宽度:决定了CPU可以访问的物理地址空间

时钟周期

  • CPU在处理各种数据和指令时,不是随意进行的,而是按照一个非常稳定的节奏,这个节奏就是时钟周期CPU时钟周期,又称为T周期或节拍脉冲,是CPU执行一个基基本操作所需的最短时间单位。它是CPU内部时钟信号的一个脉冲时间,即从一个时钟信号的上升沿(或下降沿)到下一个时钟信号的上升沿(或下降沿)所经历的时间。
  • CPU内部的操作速度很快,但是访问内存的速度却要慢很多多。每一条指令都需要从内存里面加载而来,所以我们一般把从内存里面读取一条指令的最短时间,称为CPU周期。
  • 一个CPU周期,通常会由几个时钟周期累积起来。一个CPU周期的时间,就是这几个Clock cycle的总和。
  • 生活场景
    • 比如,时钟周期是1纳秒,那就意味着每过1纳秒,CPU就会完成一个最基本的操作步骤,像是从内存里取一点数据,或者做一个很简单的加法运算等。就像舞者按照固定的节拍做一个抬手、转身等基本动作一样,CPU按照时钟周期来做这些最基础的数据处理动作。

高速缓存(cache)

  • 高速交换的存储器。CPU缓存分为一级,二级,三级缓存,即L1,L2,L3
  • 缓存的意义: 有了缓存,CPU获取数据和指令的速度就快多了。
    • CPU在处理数据和指令的时候,需要从内存中获取这些东西。但是内存相对来说比较远,而且读取速度没有那么快,就好像你要从一个比较远的大仓库里拿东西。而CPU缓存就是在CPU附近专门设置的一个小仓库,它里面存放的是CPU近期可能会频繁用到的数据和指令。当 CPU需要这些数据和指令时,先到这个小仓库(缓存)里找,如果找到了,就可以直接使用,不用再跑到远处的大仓库(内存)去拿,这样能大大节省时间。

CPU 架构

  • CISC:Complex Instruction Set Computer,复杂指令集
    • 主流架构:X86
  • RISC:Reduced Instruction Set Computer,精减指令集
    • 主流架构:ARM、RISC-V、MIPS、PA-RISC、PowerArchitecture(包括PowerPC)、DECAlpha和SPARC

精减指令集和复杂指令集:

早期计算机一直沿用CISC指令集方式。它的设计目的是要用最少的机器语言指令来完成所需的计算任务。在CISC处理器中,程序的各条指令是按顺序串行执行的,每条指令中的各个操作也是按顺序串行执行的。顺序执行的优点是控制简单,但计算机各部分的利用率不高,执行速度慢。 CISC的指令系统庞大,功能复杂,指令格式、寻址方式多;执行速度慢; 难以优化编译,编译程序复杂;无法并行;无法兼容。大约20%的指令占据了80%的处理器时间。其余80%指令使用频度只占20%的处理机运行时间。由此CISC生产厂商长期致力于复杂指令系统的设计,实际上是在设计一种难得在实践中用得上的指令系统的处理器,同时.复杂的指令系统必然带来结构的复杂性.这不但增加了设计的时间与成本还容易造成设计失误。目前个人计算机x86体系CPU 厂商一直在走CISC的发展道路,包括Intel、AMD、VIA(威盛)等。之所以称为X86,是因为最早Intel的CPU型号是8086,后来出现了80286,80386,80486,80586等,所以之后的Intel和其兼容的厂商的生产CPU都称为X86 CPU。而后CPU从最初的8位,16位,32位,发展到目前主流的64位。为了区别非64位的CPU,一般将64位的CPU称为X86-64。由于最早在1999由AMD设计公开64 位技术,称为 x86-64,后来改名为 AMD64,不同厂商称呼有所不同,所以AMD 64,x86-64,x64都指的是64位的基于X86的CPU。

因为CISC存在上面的问题,于是有了RISC,它是图灵奖得主John L.Hennessy和David A.Patterson对行业的重大贡献,由加州大学伯克利分校于1980年发布, 其基本思想是尽量简化计算机指令功能,只保留那些功能简单、能在一个节拍内执行完成的指令 ,使其实现更容易,指令并行执行程度更好,此称为精简指令集RISC(Reduced Instruction Set Computing)。精减指令集其风格是强调计算机结构的简单性和高效性,其特点是所有指令的格式都是一致的,所有指令的指令周期也是相同的,支持并行,并且采用流水线技术。当需要完成复杂任务时,就由多个指令组合来实现。常用的精简指令集微处理器包括:ARM、RISC-V、MIPS、PA-RISC、PowerArchitecture(包括PowerPC)、DECAlpha和SPARC等。说到这里不得不提一下ARM,全世界超过95%的智能手机和平板电脑都采用ARM架构,当前最先进的华为的海思麒麟990 CPU,高通的骁龙865 CPU,苹果的A13 CPU也都属于ARM架构。ARM可以说是目前世界上使用最广泛的CPU架构了。

当前CPU的两大架构是CISC(复杂指令集)和RISC(精简指令集),x86是CISC的代表架构,占领了95%以上的桌面计算机和服务器市场。Arm作为RISC的一种,在智能手机、可穿戴设备等移动处理器市场占领主要地位,针对物联网、5G、AI新兴领域的应用, RISC-V和MIPS两大精简指令集架构再次登上历史舞台

RISC-V:1980年加州大学伯克利分校(Berkeley)的David Patterson(大卫·帕特森)教授主导了BerkeleyRISC项目并设计了其第一代的处理器RISC I,2010年,Krste Asanovic(克斯特·阿萨诺维奇)教授带领的团队大约花了四年时间,设计和开发了一套完整的新的指令集,这个新的指令集叫做RISC-V,这是Berkeley从RISC I开始设计的第五代指令集架构,V还代表了变化(variation)和向量(vectors),RISC-V架构使用BSD开源协议给予使用者很大自由,允许使用者修改和重新发布开源代码,也允许基于开源代码开发商业软件发布和销售。

MIPS是一种RISC处理器,它最早是在80年代初期由斯坦福(Stanford)大学John L. Hennessy(约翰·亨利斯)教授领导的研究小组研制出来的,MIPS是出现最早的商业RISC架构芯片之一,2018年3月21日美国计算机协会(ACM)宣布将2017年度的图灵奖颁给了芯片界的两位大师:曾任斯坦福大学校长的John L.Hennessy和曾任加州大学伯克利分校教授的David A. Patterson。MIPS计算机系统公司创建于1984年,最初的目的是将斯坦福大学MIPS CPU小组的研究成功商业化,商用MIPS CPU增强了内存管理硬件,并于1985年末作为R2000面世,其后又相继推出了R3000、R4000、R10000等多款处理器。

CPU类型

  • X86:CISC
intel生产的CPU32位的叫x86系列,这个叫x86兼容pcCPU,AMD或者intel他们所生产的CPU即便内在的设计逻辑不同,但外部接口虽然也可能不同,不过都属于PC兼容机当中的x86兼容CPU

32位:32条路,每条1/0两个选择 ,有2^32种方法选址,最多只能使用大约4G内存
  • ARM:Acorn RISC Machine 高通,华为麒麟

    我们现在手机的CPU架构是arm系列的,也是最常见的CPU。arm公司只提供架构图,不生产cpu。各厂商买回去自己生产或者二次开发,相比intel的CPU功耗低很多

  • RISC-V 阿里玄铁910
  • MIPS 龙芯
  • Power:IBM

    IBM也有自己的CPU叫power,性能强大,全球第一款主频超过4Ghz的CPU,功耗体积大,精简指令集,价格贵。而intel的指令集是属于复杂指令集的。跑的系统是AIX

  • Powerpc:apple,ibm,moto

    简称ppc,简装版power,用于早期的Apple的CPU架构

  • Ultrasparc :Sun
  • Alpha:HP

    惠普自己的CPU,小机上跑的是HP-UX系统

  • 安腾:compaq

服务器CPU公司

  • Intel: Xeon 至强,Itanium 安腾
  • AMD: Althlon MP
  • IBM: Power

按照CPU体系架构来区分,服务器主要分为两类

  • x86服务器:采用CISC(复杂指令集)架构服务器,即通常所讲的PC服务器,它是基于PC机体系结构,使用Intel或其它兼容x86指令集的处理器芯片的服务器。目前主要为intel的Xeon E3,E5,E7系列,价格相对便宜、兼容性好、稳定性较差、安全性不算太高
  • 非x86服务器:采用RISC(精简指令集)或EPIC(并行指令代码)处理器,主要采用UNIX和其它专用操作系统的服务器,CPU主要有IBM的Power PC、MIPS的MIPS、SUN的Sparc、Compaq的Alpha、HP的PA-RISC、Intel研发的EPIC安腾处理器等。这种服务器价格昂贵,体系封闭,但是稳定性好,性能强,主要用在金融、电信等大型企业的核心系统

微处理器

1971年11月15日,Intel公司的工程师特德·霍夫发明了世界上第一个微处理器—4004,这款4位微处理器虽然只有45条指令,而且每秒只能执行5万条指令。性能很低,但它的集成度却要高很多,一块4004的重量还不到一盅司

Intel从8086开始,就进入了我们常说的x86时代。而80386的诞生则标志着Intel正是进入了32位微处理器的时代。从80386到Pentium 4这个年代的CPU,就是传说中的IA-32时代

x86-64( 又称x64,即英文词64-bit extended,64位拓展的简写)是x86架构的64位拓展,向后兼容于16位及32位的x86架构。x64于1999年由AMD设计,AMD首次公开64位集以扩展给x86,称为“AMD64”。其后也为英特尔所采用,现时英特尔称之为“Intel 64”,在之前曾使用过“ClackamasTechnology” (CT)、"IA-32e"及“EM64T”

Intel公司的CPU发展历程

image-20210215093059075.png
服务器硬件—主板
image-20210215093110059.png

主板mainboard,安装在机箱内,是计算机最基本的也是最重要的部件之一

主板一般为矩形电路板,上面安装了组成计算机的主要电路系统,一般有BIOS芯片、I/O控制芯片、键盘和面板控制开关接口、指示灯插接件、扩充插槽、主板及插卡的直流电源供电接插件等元件

服务器硬件—内存
image-20210215093136781.png

内存是介于CPU 和外部存储之间,是CPU对外部存储中程序与数据进行高速运算时存放程序指令、数据和中间结果的临时场所,它的物理实质就是一组具备数据输入输出和数据存储功能的高速集成电路

内存是CPU能直接寻址的存储空间,由半导体器件制成。内存的特点是存取速度快

计算机中所有程序的运行都是在内存中进行的,因此内存的性能对计算机的影响非常大

外存:硬盘,U盘,软盘,光盘

内存和外存的区别:

  • 内存断电后数据丢失
  • 外存断电后数据可以保存

服务器内存常用技术

1、 在线备用内存技术

  • 当主内存或者是扩展内存中的内存出现多位错误时或者出现物理内存故障时,服务器仍继续运行
  • 由备用内存接替出现故障内存的工作
  • 备用的内存区域必须比其它区域的内存容量要大或相同

2 、内存镜像

  • 镜像为系统在出现多位错或内存物理故障时提供数据保护功能,以保证系统仍能正常的运行
  • 数据同时写入两个镜像的内存区域
  • 从一个区域进行数据的读取

容量 :即该内存的存储容量,单位一般为GB

~]# lsmem 
RANGE                                  SIZE  STATE REMOVABLE BLOCK
0x0000000000000000-0x00000000efffffff  3.8G online        no  0-29
0x0000000100000000-0x000000010fffffff  256M online        no 32-33

Memory block size:       128M
Total online memory:       4G
Total offline memory:      0B

内存带宽:

内存带宽是指内存与北桥芯片之间的数据传输率,B byte 字节 b bit位

单通道内存控制器一般都是64-bit的,8个二进制位相当于1个字节,换算成字节是64/8=8,再乘以内存的运行频率,如果是双通道内存就要再乘以2

计算公式: 内存带宽=内存总线频率×数据总线位数/8

范例:

单通道DDR(Double Data Rate双倍速率)内存带宽计算
DDR4-4000:4000MHz*64bit/8=32000MB/S 
DDR4-3600:3600MHz*64bit/8=28800MB/S

双通道:错开插
DDR4-4000:4000MHz*64bit*2/8=64000MB/S
服务器硬件—硬盘
image-20210215093155397.png

常见的磁盘接口种类:

  • IDE:Integrated Drive Electronics,电子集成[驱动器,早期家用电脑常用接口
  • SCSI:Small Computer System Interface,小型计算机系统接口,早期的服务器常用接口
  • SATA:Serial ATA (Advanced Technology Attachment 高技术配置),家用电脑常用的接口
  • SAS:Serial Attached SCSI,是目前服务器上主流的接口
  • 光纤通道:Fiber Channe,高性能服务器上采用的接口
  • M.2 :固态硬盘接口,性能更强。nvme协议的读速更快

结构分类:

  • 机械硬盘HDD(Hard Disk Drive)
  • 固态硬盘SSD(Solid State Drives )

机械硬盘

image-20210215093213411.png
  • 存储介质(Media)-–—盘片

    盘片的基板是金属或玻璃材质制成,为达到高密度高稳定的质量,基板要求表面光滑平整,不可有任何暇疵

  • 读写磁头(Read Write Head)-–—磁头

    磁头是硬盘读取数据的关键部件,它的主要作用就是将存储在硬盘盘片上的磁信息转化为电信号向外传输

  • 马达( Spindle Motor & Voice Coil Motor )

    马达上装有一至多片盘片,以7200,10000,15000 RPM等定速旋转,为保持其平衡不可抖动,所以其质量要求严谨,不产生高温躁音

机械硬盘基本参数:

  • 容量:容量是硬盘最主要的参数。单位有MB、GB、TB,常见容量:500GB,1T,2T,3T,4T,6T
  • 转速:转速是指硬盘盘片每分钟转动的圈数,单位为rpm。常见:7200rpm,10000rpm,15000rpm
  • 传输速率:传输速率(Data Transfer Rate)。硬盘的数据传输率是指硬盘读写数据的速度,单位为兆字节每秒(MB/s),常见:6Gb/s,12Gb/s
  • 缓存:硬盘缓存的目的是为了解决系统前后级读写速度不匹配的问题,以提高硬盘的读写速度
  • 磁盘尺寸:3.5”/2.5”/1.8”
  • 是否支持热插拔

SSD硬盘:

image-20210215093226937.png

SSD,即固态硬盘,泛指使用NAND Flash组成的固态硬盘。其特别之处在于没有机械结构,以区块写入和抹除的方式作读写的功能,因此在读写的效率上,非常依赖读写技术上的设计SSD读写存取速度快,性能稳定,防震性高,发热低,耐低温,电耗低,无噪音。因为没有机械部分,所以长时间使用也出现故障几率也较小。缺点:价格高,容量小,相对普通机械硬盘性价比低

固态中支持NVMe通道协议的速度理快

服务器硬件—网卡
image-20210215093240860.png

服务器都在主板上集成了网卡,传输速率为1Gbps,即千兆网卡

特殊应用需要高端网卡,如光纤网卡,Infiniband网卡等,传输速率能达到10Gbps、20Gbps,即万兆网卡

服务器硬件—相关其它硬件

服务器硬件—远程管理卡

IPMI是智能型平台管理接口(Intelligent Platform Management Interface)的缩写,是管理基于 Intel结构的企业系统中所使用的外围设备采用的一种工业标准,该标准由英特尔、惠普、NEC、美国戴尔电脑和SuperMicro等公司制定。用户可以利用IPMI监视服务器的物理健康特征,如温度、电压、风扇工作状态、电源状态等。而且更为重要的是IPMI是一个开放的免费标准,用户无需为使用该标准而支付额外的费用。

IPMI 定义管理员如何监测系统硬件和传感器、控制系统组件和检索重要系统事件的日志以进行远程管理和恢复。

自1998 年,IPMI论坛创建了IPMI标准依赖,其已经得到了170 多家供应商的支持,这使得其逐渐成为了一个完整地包括服务器和其他系统(如存储设备、网络和通信设备)的硬件管理规范.

远程管理卡就是基于IPMI实现的服务器特有的远程管理部件,在家用电脑及笔记本电脑上是不存在的。

远程管理卡是安装在服务器上的硬件设备,提供一个以太网接口,使它可以连接到局域网内,提供远程访问。这种远程管理基于BMC(基板管理控制器),由集成在管理卡上的系统微处理器负责监测和管理操作系统之外的服务器环境和状态。它既不会占用服务器系统资源,也不会影响服务器系统的运行。

早期(2010年以前),服务器托管在IDC机房,一旦出现问题,还得跑机房或者请机房的人管理。有了远程管理卡之后,运维人员管理服务器的效率就大大的提高了。

远程管理卡有服务器自带的和独立的两类。服务器自带的远程管理卡,可以关机、开机,但是看不到开关服务器的过程。所以,建议给服务器配备独立的远程管理卡,可能会多花100多块钱的样子,但是,当服务器出现问题,就不需要打车或者出差,也不用给机房人员打电话了,可以利用远程管理卡快速查看服务器故障并恢复服务。

各个服务器厂商都提供了符合IPMI标准的远程管理接口,比如Dell的iDRAC,惠普的ILO等

Snipaste_2023-05-18_14-03-27.png

上图是浪潮的服务器IPMI卡,不过不像DELL,浪潮的服务器是出厂默认带的IPMI接口

Snipaste_2023-05-18_14-05-59.png

上图为Dell的 iDRAC((integrated Dell Remote Access Controller))卡即是远程管理卡, 相当于是附加在服务器上的一台独立运行的小型pc,通过与服务器主板上的管理芯片BMC进行通信,监控与管理服务器的硬件状态信息。它拥有自己的系统和IP地址,与服务器上的OS无关,是服务器管理员进行远程访问和管理的便利工具

服务器硬件—阵列卡

image-20210215093258565.png

Raid卡用来实现RAID的建立和重建,检测和修复多位错误,错误磁盘自动检测等功能。RAID芯片使CPU的资源得以释放,阵列卡把若干硬盘驱动器按照一定要求组成一个整体、由阵列控制器管理的系统阵列卡可以用来提高磁盘子系统的性能及可靠性

支持的多种RAID级别,RAID0,1,5,6等

阵列卡提供缓存及电池保护

服务器硬件—电源

image-20210215093311725.png

支持服务器的电力负载,支持冗余,防止电源故障 ,故障预警和防止,故障之前的预防性维护,保证服务器持续运行,电源子系统包括:冗余电源和风扇

服务器硬件—显卡

服务器都在主板上集成了显卡,但是显存容量不高,一般为16M或32M.

GPU:Graphic ProcessingUnit,即“图形处理器”

服务器硬件—热插拔技术

热插拔技术,称为热交换技术(Hot Swap),允许在不关机的状态下更换故障热插拔设备,常见的热插拔设备:硬盘,电源,PCI设备,风扇等。热插拔硬盘技术与RAID技术配合起来,可以使服务器在不关机的状态下恢复故障硬盘上的数据,同时并不影响网络用户对数据的使用

服务器硬件—机柜

image-20210215093326561.png

机架式服务器-服务器放置在机柜中

通常使用的机柜是42U(约2米高)机柜(1U=44.45mm)

外观尺寸一般为:宽600/深1000/高2000(mm)

在一个机架上,累计设备U数一般不超过26U,全1U设备部署数量一般不超过16台,全2U设备一般不超过12台,全4U设备一般4到7台

机架式服务器-机架及其配件

image-20210215093354112.png
各种硬件处理速度和性能优化

https://www.sohu.com/a/360663667_467784

服务器的性能短板:如果CPU有每秒处理1000个服务请求的能力,各种总线的负载能力能达到500个,但网卡只能接受200个请求,而硬盘只能负担150个的话,那这台服务器得处理能力只能是150个请求/秒,有85%的处理器计算能力浪费了,在计算机系统当中,硬盘的读写速率已经成为影响系统性能进一步提高的瓶颈

image-20210215093407269.png

电脑的各个设备部件之间的延时从高到底的排列,依次是机械硬盘、固态硬盘、内存、CPU

image-20210215093421773.png

上图可以看到,CPU最快,一个时钟周期是0.3纳秒,内存访问需要120纳秒,固态硬盘访问需要50-150微秒,传统硬盘访问需要1-10毫秒,网络访问最慢,都是几十毫秒。

上图最有趣的地方在于它把计算机世界的时间和人类世界的时间做了对比,常常把CPU比喻成跑得很快,但是记不住事情的“阿甘”,他的一个时钟周期如果按1秒算: 内存访问就是6分钟

一次 CPU 上下文切换(系统调用)需要大约需要1小时

在 1Gbps 的网络上传输 2K 的数据需要10多个小时

从 SSD 读取 1MB 的顺序数据,大约需要 1ms,换算成人类时间是 1个月

从磁盘读取 1MB 连续数据需要 20ms,换算成人类时间是 20个月

如果说打开一个网页可以秒开的话,那也相当于100年

对于CPU来说,这个世界真是太慢了!

存储器的层次结构

image-20210215093435030.png

上图以层次化的方式,增加了价格信息,它展示了一个真理:世界上没有免费的午餐。存储器越往上速度越快,但是价格越来越贵,越往下速度越慢,但是价格越来越便宜。正是由于计算机各个部件的速度不同,容量不同,价格不同,导致了计算机系统/编程中的各种问题以及相应的解决方案

并发和多线程

CPU的速度超级快,不能老是让它闲着,要充分地压榨它!这里有两个强劲的理由:

  1. 人类需要多个程序“同时”运行,我们要把CPU的时间进行分片,让各个程序在CPU上轮转,造成一种多个程序同时在运行的假象,即 并发
  2. 当CPU遇到IO操作(硬盘,网络)时,不能坐在那里干等“几个月”甚至“几年”,在等待的时候,一定要切换,去执行别的程序。

说起来简单,但是程序的切换需要保存程序执行的现场,以便以后恢复执行,于是需要一个数据结构来表示,这就是进程了。如果一个进程只有一个“执行流”,如果进程去等待硬盘的操作,那这个程序就会被阻塞,无法响应用户的输入了,所以必须得有多个“执行流”,即 多线程

缓存

需要持久化的数据一定要保存到硬盘中,但是硬盘超级慢,支持不了大量的并发访问,那怎么办呢?

可以把最常访问的热点数据放到CPU的缓存中嘛, 其实CPU也是这么做的,但是CPU的L1, L2, L3级缓存实在是太小, 根本满足不了需求。于是只好退而求其次,把热点数据放到速度稍慢的内存中,于是 应用程序的缓存 就出现了。缓存虽然是解决了问题,但是也带来了更多的问题,例如:缓存数据和数据库数据怎么保持一致性?

缓存如果崩溃了该怎么处理?数据在一台机器的内存放不下了,要分布到多个机器上,怎么搞分布式啊,用什么算法?…..

缓存
--->disk--->缓存(内存条)--->cpu自己的缓存-->cpu

缓冲
--->缓冲区(内存条)批量写--->disk

异步

对于Tomcat这样的应用服务器,对于每个请求都要用一个线程来处理,如果现在有一万个请求进来,Tomcat会建立1万个线程来处理吗? 不会的,因为线程多了开销会很大 ,线程切换起来也很慢,所以它只好用个线程池来复用线程。现在假设线程池中有一千个可用线程(已经非常多了),它们都被派去访问硬盘,数据库,或者发起网络调用,这是非常慢的操作,导致这一千个线程都在等待结果的返回(阻塞了),那剩下的九千个请求就没法处理了,对吧?所以后来人们就发明了新的处理办法,仅使用几个线程(例如和CPU核心数量一样),让他们疯狂运行,遇到I/O操作,程序就注册一个钩子函数放在那里,然后线程就去处理别的请求,等到I/O操作完成了,系统会给这个线程发送一个事件, 线程就回过头来调用之前的钩子函数(也叫回调函数)来处理。

这就是 异步非阻塞 的处理方式。nginx,Node.js等采用的都是类似的思想。

单线程

Redis使用单线程的方式来处理请求的,为什么用单线程就可以呢?它为什么不像Tomcat那样使用多线程和线程池呢?因为它面对的仅仅是内存,内存的速度在计算机的体系中仅次于CPU,比那些网络操作不知道要快到哪里去了所以这个唯一的线程就可以快速地执行内存的读写操作,完成从许多网络过来的缓存请求了。单线程还有个巨大的优势,没有竞争,不需要加锁!

操作系统和 Linux

操作系统功能

OS: Operating System 操作系统,通用目的的软件程序

image-20210215102746920.png

主要功能:

  • 硬件驱动
  • 进程管理
  • 内存管理
  • 网络管理
  • 安全管理
  • 文件管理

OS分类:

  • 服务器OS:CentOS,Ubuntu,Windows Server,AIX
  • 桌面OS:Windows 10,Mac OS,Fedora
  • 移动设备OS:Andriod,IOS,AliOS,HarmonyOS

操作系统相关概念

接口 :interface,来源于电气工程学科,指的是插座与插头的连接口,起到将电与电器连接起为的功能。后来延伸到软件工程里指软件包向外提供的功能模块的函数接口。所以接口是用来连接两个东西、信号转换和屏蔽细节

操作系统通过接口的方式,建立了用户与计算机硬件的沟通方式。用户通过调用操作系统的接口来使用计算机的各种计算服务。

为操作系统一般会提供两个重要的接口,来满足用户的一些一般性的使用需求:

  • 命令行(CLI):实际是一个叫shell的终端程序提供的功能,该程序底层的实质还是调用一些操作系统提供的函数
  • 窗口界面(GUI):窗口界面通过编写的窗口程序接收来自操作系统消息队列的一些鼠标、键盘动作,进而做出一些响应

ABI

Application Binary Interface,应用程序二进制接口,ABI描述了应用程序与OS之间的底层接口,允许编译好的目标代码在使用兼容ABI的系统中无需改动就能运行

运行程序格式:

  • Windows: PE(portable executable)格式, .dll(dynamic link library),.lib
  • Linux: ELF(Executable and Linking Format)格式, .so(shared object), .a

API

Application Programming Interface,应用程序开发接口,API定义了源代码和库之间的接口,因此同样的源代码可以在支持这个API的任何系统中编译

Snipaste_2023-05-18_14-39-54.png

POSIX: Portable Operating System Interface 可移植的操作系统接口

  • IEEE在操作系统上定义的一系列API标准
  • POSIX兼容的程序可在其它POSIX操作系统编译执行

用户态和内核态

image-20210215102813776.png

计算机硬件资源都是操作系统内核进行管理的,目前操作系统都是基于多任务、 多用户的。如果每个用户进程都可以随便访问操作系统内核的模块,改变状态, 那整个操作系统的稳定性、安全性都大大降低

为了将内核程序与用户程序隔离开,在硬件层面上提供了一次机制,将程序执行 的状态分为了不同的级别,从0到3,数字越小,访问级别越高。0代表内核态, 在该特权级别下,所有内存上的数据都是可见的,可访问的。3代表用户态,在 这个特权级下,程序只能访问一部分的内存区域,只能执行一些限定的指令

系统调用 system call 和函数库 Library function

image-20210215122817472.png
Snipaste_2023-05-18_14-40-33.png

对于非一般性使用需求,操作系统提供了一系列的函数调用给软件开发者,由软 件开发者来实现一些用户需要的功能。这些函数调用由于是操作系统内核提供的, 为了有别于一般的函数调用,被称为系统调用。比如使用C语言进行软件开发时, 经常用的printf函数,它的内部实际就是通过write这个系统调用,让操作系统 内核把字符打印在屏幕上的

系统调用:就是调用操作系统所提供的API来实现某些功能的行为,硬件资源都 是由操作系统统一管理,当程序需要调用硬件某些功能的时候,只能通过调用操 作系统提供的API来实现,这就是系统调用(System Call)

库函数:将提供一些特定功能的代码进行封装,只暴露出一些函数,比如JSON库 (专门用来处理JSON格式的数据),网络库(专门处理网络相关业务),提供第三方 调用,那这些函数,就称为库函数,库函数在Ring3层工作,在某些情况下,调 用库函数最终也会发展为系统调用。

用户和内核空间

image-20210215122840787.png

用户空间:User space

  • 用户程序的运行空间。为了安全,它们是隔离的,即使用户的程序崩溃,内核也不受影响
  • 只能执行简单的运算,不能直接调用系统资源,必须通过系统接口( system call),才能向内核发出指令

内核空间:Kernel space

  • 是 Linux 内核的运行空间
  • 可以执行任意命令,调用系统的一切资源

范例:

st r= "w.com"      // 用户空间
x = x + 10         // 用户空间
file.wirte(str)    // 切换到内核空间
y = x + 200        // 切换到1用户空间

说明:第一行和第二行都是简单的赋值运算,在 User space执行。第三行需要写入文件,就要切换到Kernel space,因为用户不能直接写文件,必须通过内核安排。第四行又是赋值运算,就切换回Userspace

编程语言

  • 低级语言:计算机能理解的语言,二进制
    • 机器语言:0和1
    • 汇编语言:和机器语言一一对应,与硬件相关的特有代码、驱动程序开发
  • 中级语言:C 语言,系统级应用、驱动程序
  • 高级语言:java, python, go, rust, php, Objective-C, C#,易语言(中文),应用级程序开发,人类语言实现

操作系统在硬件上的实现

image-20210215124418095.png

对于操作系统来讲它要把底层的复杂性隐藏起来,隐藏完以后还要把这部分功能用更为简洁的方式向上提供,对于操作系统来讲我们把这个简洁的接口称为系统调用systemcall。有系统调用程序员再写程序就不用面对硬件来写了而是面对系统调用写。所以这个程序文件里面写的大量的程序代码编程程序都是通过调用系统接口而不是硬件的裸接口实现的。

计算机操作系统是一款通用软件程序它必须以通用为目的,因此通用目的就不能设定为更为接近用户,所以依然很底层很原始。

为了使得程序员工作更为便洁易用,就有人把底层操作系统上的各种各样接口再一次封装为离程序员更近的界面,这个层次叫做库。库是把底层简洁的功能组合成更为复杂的功能。这时就不能把它们称为系统调用而是库接口调用。这个库叫libraries。库的接口叫 libcall。

你拿到系统调用接口作程序还用库接口作程序,很显示利用库接口作程序要快得多。但也有人用系统调用来写程序。我们不希望程序员从头造轮子。

程序员在写编程时调用这个可编程的接口叫做API。

站在程序的运行视角来看,库是二进制文件,内核是二进制文件,程序是二进制文件,它们都是直接运行的。也就意味着这个程序能不能运行看它所依赖的调用的库、二进制文件二者是否兼容。

开发好的程序在运行时面对的接口ABI。

为了让在WINDOWS上开发的程序在linux也能运行,互联网定义了一个规范叫POSIX(Portable Operating System Interface)可移植操作系统接口标准,IX是加上去的,为了像unix和linux。 任何一个遵循POSIX规范的API,那么程序员所写的开发代码在linux上可以用在windows上也可以用,但这个用只是意味着编程接口兼容并不意味着二进制接口兼容 。一旦这个程序写好了两者是编程接口兼容的,我们知道任何程序都要转码成二进制文件才能用的,这需要一个编译器编译。假如在windows上, 通过编译器转换成适用于windows上ABI的运行格式,所以转换后的二进制程序到linux跑不起来了,反之linux上的二进制程序在windows一样跑不起来。

  1. Syscall系统调用接口(硬件上内核层接口)
  2. libcall库调用(将通用功能在系统接口再封装成模块方便统一功能调用)
  3. 操作系统:隐藏底层硬件复杂性,差异性Sysacall—>再封装—>libcall

POSIX: Portable Operating System Interface 可移植操作系统接口标准

API: Application Program Interface 程序员面对的编程接口 ABI:

Application Binary Interface 程序应用者面对运行程序的接口

编程接口兼容不等于二进制接口兼容

GNU/Linux:通常以源码(文本格式)方式提供,任何人可以看到;

特性:自由、灵活

源码:编译成为 二进制格式

image-20210215124437306.png

各种操作系统

操作系统演变

  • 单用户系统:一次只能支持一个用户程序的运行。向用户提供联机交互式的工作环境,如:DOS
  • 批处理系统:用户将一批作业提交给操作系统后就不再交互,由操作系统控制自动运行,提高系统运行效率
  • 多道程序系统:程序控制 CPU 处理顺序
  • 分时系统:提高系统利用率,操作系统控制 CPU
  • 处理顺序,多个人共用一台计算机
  • 个人计算机:每人用户对应一个系统,廉价,方便,易用
  • 分布式计算:每个用户对应多个系统,云计算,大数据处理

服务器三大操作系统

  • Windows:
  • Linux:GNU/Linux
  • Unix:1969年 Ken Thompson
    • System: Bell Lab
      • AIX (IBM)
      • Solaris (SUN)
      • HP-UX (HP)
    • BSD: (BSRG)Berkeley System Distribution
      • NetBSD
      • OpenBSD
      • FreeBSD

服务器操作系统市场

image-20210215123057535.png

硬件设备不能完成所谓的硬件操作,而真正能完成某一个具体任务靠的是软件程序。这就需要程序员了,但是要想程序在硬件上运行起来首先它得能够根据硬件自己的程序逻辑来写程序。比如A公司生产的CPU芯片和B公司生产的CPU芯片彼此之间肯定是不需要共享的,也就意味着intel的CPU和AMD的CPU或者其它任何的CPU内部的执行指令都不一样。因此程序员写程序就是查看这个CPU说明书,而你写的程序只能在这一类CPU上运行。 可以想像下全球生产计算机芯片的厂商非常多,你所写的程序换个电脑就运行不了了,不具有通用性。这是我们所面临的第一个问题。第2个问题,即便它具有通用性,我们全球的所有CPU厂商一家公司使用同一个规范研发,但我们仍然有一个问题就是任何一个程序员写程序为了能让程序能在硬件上运行起来还需要写一个针对硬件的驱动程序,低层需要花费大量时间程序让硬件工作起来,这是完全没有必要的。这段让硬件运行起来的代码就通用了,对于许多程序员都需要,这就是一个通用软件,它什么活也不干,也不是浏览器,它就是要让底层硬件工作起来的基本的驱动程序。而这个让硬件运行起来的叫做通用程序,程序员写的解决某个具体任务需要的叫做专用程序。而通用程序后来就演化为了操作系统。这就来让我们说操作系统了。

最早计算机出现的时候是没有所谓操作系统的,后来人们发现输入输出设备在计算机上人是最薄弱的一环,每一次为了让计算机运行程序,我们写的程序转换为机器可以理解的格式,而那时的计算机输入设备叫穿孔纸带,输出设备依然是穿孔纸带,再后来就到了磁带磁芯磁鼓作为输入设备,输出设备变为发光二级管(亮为1不亮为0)。不管怎么讲计算机运行的速度很快,但是人在这一环上作为输入时很慢读取输出时也很慢,所以等磁带出现以后人们就可以这样想办法了,把要运行的程序给做成多个按顺序放在磁带上让电脑读取磁带来加速要运行的程序。像这种我们把它叫做批处理系统batch,出现第一个程序叫做job1并用 $$$$ 符隔开

批处理系统: job1$$$$job2$$$$jiob3$$$$......

但是批处理系统有一个特性,计算机在运行时根我们大脑一样在某一时刻只能干一件事情,为什么呢。因为内存只有一个来存储指令和数据,CPU也只有一个,所以某一时刻计算机只能运行一个程序,这个程序运行完了它把空间腾出来来运行下一个程序。那个时候所有程序不能同时运行,那个时候就叫做单任务的操作系统。

后来虽然批处理在一定程度上解决了人输入输出太慢,但是在某一时刻发现计算机仍然有大量时间CPU时间是浪费的。为什么呢?因为虽然磁带的形式比人快了,但比起CPU的计算能力依然是非常慢的。同样的道理CPU永远比内存快,所以在大量的时间CPU仍然是闲置的。因此我们希望能够满负荷地压榨CPU的能力。

我们能否让计算机在同一时刻运行多个任务呢(multi tasks)?

CPU和内存只有一个怎么跑多任务呢?一跑多个任务是不是彼此之间就乱掉了啊?你占了我的空间你覆盖了我的数据。为了不乱掉,找一个监管人员。假如在计算机上有一个程序是做监控的,监控程序它有特权,它工作在内存中的某一个特定位置空余的才能被其它程序使用,而这个监控程序把剩余空间划分成一个个格子,这只是假设,任何程序它被装载入到内存时监控程序把它划分好了第1片是第1个程序的第2片是第2个程序的,大家各不相干,于是计算机的数据存储问题解决了,不过存储空间像内存的存储它是向空间上划分的这个容易实现,但是CPU呢?CPU只有一个怎么让多个任务跑起来呢?根我们一样大脑只有1个,虽然领导交给我们5件事完成,而且这5件事你都记下来了,但在某一时刻你只能盘算一件,为了让5件事齐头并进,我们可以想5秒钟第1件事,不管想完想不完把解决问题放在这先记下来,然后再想第2件事5秒钟,…. 回过头来再想第1件事,从刚才中断的位置继续往后进行。像这种就是按时间切割的,把一个CPU所能够提供的计算能力从时间上切割,第1个时间片给第1个程序,第2个时间片给第2个程序。

为了能让程序跑起来了,我们必须有一个监控程序(Monitor程序),这个监控程序需要有一个公众之心的没有私心的更不能包藏祸心这么一个组织把这个监控程序写出来。那时有一些项目就催生了,比如像早些时候的ATMT的贝尔实验室(Bell)、麻省理工学院的人工智能实验室(MIT)、通用电器(GE)他们联合起来开发这么一个监控程序,起名Multics。后来2、3年后人们发现这个Multics程序到底的目标是什么呢?最初的设计目标已经完成了,但后续的目标人们发现在设计的过程中越走越任务做不到完美,于是这个系统的目标被越设置越大,到最后甚至于他们迷失了到底要写什么,面对这种现状后来GE通用电器就退出了,再后来贝尔实验室也退出了,不管怎么讲Multics确实研发成功了。

而Multics项目就试图建立一个具备众多功能的信息功能应用工具而设定,但是大家都迷失以后贝尔实验室为Multics项目的参与招的那些优秀的工作师就被招回了贝尔实验室,他们就无事可干了,对于牛人他们就自己鼓捣东西了,比如说早期的ken Thompson研发人员在Multics上研发了一个游戏程序Space Travel,贝尔实验室退出以后Ken是没有在Multics计算机上跑这个程序的,为了能够继续研究自己这个小的游戏程序,就决定自己写一个系统能支撑这个游戏的运行,但是当时比较流行的计算机已经到了小型计算机时代,那会数字设备公司(DEC)比较有名,这家公司生产了当时非常著名的小型机PDP-11还有VAX,大概能卖到几十万美元。

在贝尔实验室里某个角落有一个没有在用的PDP-7,那时还是用汇编语言编码的,KEN就写了一个小系统来跑他的游戏。他为了让自己的游戏得到关注于是在贝尔实验室兜售自己的游戏,而贝尔实验室的人更多的关注了他的系统,但比当年他们参与的Multics功能单一,他们很戏谑的把这个系统起名为Unics。

本来Unics和Multics是相对立的词根,后来不知道什么原因被命名为Unix,这是20世纪60年代末期的产物。

到了1971年时,贝尔实验室需要为内部的专利部门提供一个文字处理的程序nroff,这个程序的运行需要一个底层的系统,但早期PDP-12上跑的系统对nroff并不理想,ken这几个就把项目承包下来了,并在unics上写这个程序,并在写nroff程序中,unics不断的被改进,那时还不知道unics会被拿来做什么,也就没有作商业化。

1972年前后,unix的装机量在贝尔实验室已经达到10台了,在贝尔实验室广为流行。最初Unix是使用汇编语言写成的,而它的各种应用程序是使用解释型的编程语言B语言编写,B语言的特点在于非常的小巧,但功能还不够强大。后来贝尔实验室的另一个年轻人Dennis Ritch,他就把B语言增加了一些像数据结构或叫数据类型等,进而把B语言升级到B+语言,后来人们发现B+不好听就改名叫C语言。

1973-1974年,Ken和Dennis Ritch俩人决定联合起来用C重写整个unix,因为早期用汇编写的unics与底层设备结合程序太紧密。C语言其实是和底层的CPU是没有关系的,有关系的就是这个编译器编译成特定主机的汇编就行了。这在当时是非常冒险的做法,因为当时计算机运行性能很差。我们说过语言越高级,浪费的计算量越多,计算机运行起来越慢。

1974年,在《美国计算机通信》杂志上, 双方合伙发表一篇论文,第一次把unix公之于众。受到了很多大学的关注,他们都期望拿来学习和使用。不过当时的贝尔实验室属于AT&T美国电话电报公司。当时美国正大反垄断,AT&T被裁定不能销售电报电话以外的任何产品,如果你有别要还得给。大学拿到代码后把自己的研究成果回馈给贝尔实验室。unix起的系统名很独特就叫System V。这时离个人PC机还有一段时间 。

1979年,System V7在大学中流行。

1978年,全球第1家包装商业发型版unix公司诞生了,叫西雅图数字公司SCO,开始出售商用版的编译器。

1980年,也在美国西雅图,一家更不干起眼的公司成立了,叫微软Microsoft ,当时只有2款产品,第1个是basic语言的编译器,第2个卖unix的变种起名叫XENIX。

对Unix做出卓越贡献的是美国加州大学的伯克利分校Berkeley,而Ken在1976年年休时在这任教,因此使得伯克利分校走在世界前列。在学校里有个研究生叫Bill Joy在unix上更是花了很长时间,并且他们联合成立了BSRG组织(伯克利操作系统研究小组),在1977年发布了BSD(Berkrlry System Distribution)伯克利系统分发版。1980年前后已经成为这个大学的校园网络的核心。

1980年前后,美国国防部高级研究计划局DARPA,需要请人在Unix环境下机器上实现TCP/IP协议栈。其实本来DARPA打算在DEC公司的VAX的系统上的VMS上来实现的。DEC公司除了有PDP还有VAX机器,其上的操作系统叫做VMS(VAX监控系统),也是一个多任务系统。DARPA担心VMS是一个商业系统不可能把原码给我研究,那时Unix还是开放。DARPA就把这个项目合同给了伯克利的BSRG组织。1983年,TCP/IP正式诞生在BSD系列的UNIX系统。

但在这个过程还有另外一件事要了解,大概在1981年

1981年,Microsoft公司的大概有3个合伙人,其中有一个合伙人在美国西雅图产品公司SCP,这个产品公司有一个程序员大概花了6个周自己研发了一个小系统叫QDOS(Quick and Dirty Operating System),因为那时个人计算机已经出现了但是没有操作系统,Unix系统还是比较大的跑不上去,unix对计算机性能要求还是比较高的,那时Unxi系统主要跑在摩托罗拉的CPU上,而第1代PC兼容机是intel生产的CPU,在摩托罗拉的程序员看来intel的CPU丑陋廉价性能非常的差,unix在上面就跑不动。比尔盖茨发现这个事了,然后通过他母亲在IBM公司的董事席位了解到IBM正准备大批量发行售卖PC兼容机,于是比尔盖茨敏感的捕捉到了商机,他5万美元为合同从美国西雅图产品公司一下子买断了QDOS的版权,然后在这个系统的基础上改进,又通过自己的谈判拿下了IBM的PC兼容机的合同,他当时的做法是非常精巧的,他找到了当时的CEO并告诉他自己有一个系统可以随着硬件搭售,而且搭售非常便宜我的系统版权不卖给你但是每卖一个计算机可以直接装上这个系统只需给我费用就OK,PC兼容机卖到了几百万台,而比尔羡从中赚到了几千万美元。同比尔羡还说服了IBM的CEO,我的这个系统不仅能卖给你还可以卖给其它公司,当时的DEC和康柏都卖这种PC兼容机,因此上亿美金到手了,因此比尔羡跟技术不沾边,完全是个商业天才。随后的几年DOS光芒反而胜过了CP/M了,性能价格比CP/M更好 ,DOS是QDOS的仿照版,DOS 2.0 只卖几美元,让比尔成为全球富豪。更有意思的是直到1990年为止,微软公司的开发环境都是Unix。

Windows(支持图形化)

windows nt(new technology)

在这个期间有一家公司也成立了

1982年SUN公司,成立者是Bill Joy ,联合了3个人利用斯坦福设计的硬件和伯克利大学所设计的软件BSD出售BSD系统的小型机workstation工作站。同时伯克利大学的BSRG组织也开始单独出售BSD系统。

1983年,DEC公司取消PDP-10、PDP-11之后的衍生版本,并且随后VAX机系统的工作站上没有VMS系统都有unix系统。

随后几年比尔和SUN公司虽然都赚到了很多钱,各公司都还相安无事。而且贝尔实验室对unix的发行者和BSD阵营的对微软公司还是不屑一顾,他们还是觉得X86的主机太丑陋。再后来AT&T公司被美国最高法院裁定违反了反垄断法被分拆了,贝尔实验室独立了。贝尔实验室就不受限于卖电报电话。贝尔实验室每个动作就是把BSD告上法庭 侵犯了unix版权并要求对方付费,其实当时BSD所保留的UNIX代码已经不足30%,所以两者打了一场很长的10年的官司。在此期间美国车库有一家公司又诞生了,

Apple公司,当时CEO转到另一家公司XEROX施乐公司的PARK实验室(star产品:图像化界面),PARK实验还无偿贡献了以太网和鼠标给人类。当时以很低的价格卖给乔布斯作拷贝, 不知道怎么回事Bill Gates听说了,比尔找到了乔布斯学习下,于是拷贝一份代码只是上层代码没有底层代码,为了看上去不你乔布斯的系统又不侵犯版权,所以在DOS上研究,以极底价格卖给了乔布斯的合作伙伴,后又开发出最早的windows。windows的底层是DOS,DOS对于视窗系统兼容性不是很好,对于比尔来讲遇到最大的问题就是出去演示了就蓝屏了。碰巧的是DEC的VMS被打入了冷宫,因为unix抢了它的饭碗,比尔找到了他们加入微软,他们在windows基础上研究出了windows nt (new technology),再后来在windows nt的基础上出现了windows 2000, windows 2003, windows xp。不过当时windows的图形界面相比于APPLE的丑陋的很。

1985年,当unix商业化后,AT&T公司又被分拆,当年拿到unix备份的一份交4万美元,当时在计算机大学讲授都用unix,其中就包括麻省理工大学MIT,在这个大学中有个极左的人叫Richard Stallman很激进,觉得软件不应该被商业公司独占,并发起生产主义运动GUN: GUN is Not Unix,GUN不是unix这是递归缩进,软件不商业化软件都是自由的,任何人都可以获取使用。于是GUN发展起来了。他们有自己的章程GPL:General Public License通用公共协议。遵循了GPL软件就free:freedom自由的,当时X-Window软件也遵循了GPL,还有gcc: gnu c complier,vi: visual interface都遵循了GPL。但这些软件还是要运行在unix系统上,于是这些开发者就希望有一个监控程序来运行这些软件。

没想到 FSF:Free Software Foundation

在欧洲有一个大学里一个教授Andrew在unix商业化后,自己写了一个类似unix的系统Minix,早起4000+行代码,很unix上的功能都有,有很多学生及黑客希望为minix增加代码增加通用性,但教授不允许任何代码加入到Minix。

我们知道System V Unix <—> BSD发生了很长时间的官司。微软成长起来。

1990年BSD执行反击了,BSD把UNIX的代码清除殆尽从此与unix再无瓜葛。BSD的组织觉得推广unix的任务已经完成,于是这个项目也终止了。但 Jolitz 尝试将BSD移植到x86项目,最终夭折。后来92年又重启项目386-BSD

1991年8月,Linus Torvalds宣布成立Linux项目;准守GPL协定。linus还出了本自传《只是为了好玩》,自传都会有些粉饰,看看也就玩了。在90年时http协议诞生了,互联网呈现了大爆炸式的发展。第1年就有上100位黑客获得linux代码后纷纷注入自己的代码。为了避免BSD的官司一些BSD的开发者也转向了linux,BSD也正式的没落了。基于Larry Wall(perl作者),利用diff编写补丁和patch打补丁工具运用,协同开发推动了linux流行

小结:

多任务:multi tasks   --->Bell,MIT,GE三个组织=Multics
CPU:slice机制,切换任务运算
Memory:分段机制;虚拟地址空间
多任务:multi tasks
避免CPU浪费
cpu时序复用
监控分配
Bell,MIT,GE =Multics(多功能信息应用工具)

贝尔实验室的ken Thompson --->在PDP-7上开发
DEC:小型机PDP-11,VAX(VMS)流行,贵  --->Ken在PDP-7汇编语言上开发游戏(Space Travel)
--->1969:Unics对立  = Unix  --->Unix:1971 nroff,用于文字处理
--->1972 Bell实验室有十台使用unix
--->B语言-Dennis Ritch-C语言(B语言升级版) ,两人用c语言改写了unix
从汇编到c可移植性增强,但是在当时的计算机性能差方面问题冒险
--->联合发表在《美国计算机通信》:1974年,第一次公之于众
--->1979年:System V7 比较流行
--->1978年, AT&TSCO包装发行unix
--->1980: Microsoft ,XENIX
--->Berkrlry :Ken 任教伯克利大学
Bill Joy.组织BSRG。1977年发布BSD(Berkrlry System Distribution)
--->1980年,DARPA,在BSD系列的unix上研究tcp/ip
--->在版权官司十年unix逐渐落末


1981.Microsoft,Bill Gates
SCP :QDOS(Quick and Dirty Operating System)
DOS 2.0,性能价格比CP/M更好
Windows(支持图形化)
windows nt(new technology)
1990.一直在unix上编写DOS
SUN公司:Bill Joy   workstation工作站
Apple:XEROX施乐公司: PARK实验室(star产品:图像化界面)
---->Bill Gates"盗窃"后开发出最早的windows
1985:Richard Stallman
GUN: GUN is Not Unix
GLP:General Public License
FSF:Free Software Foundation    free:freedom自由的
软件方面:X-Window: GPL
gcc: gnu c complier
vi: visual interface
... ...                
Andrew: Minix,早起4000+行代码        
System V Unix  <---> BSD官司
--->1990:BSD  --->Jolitz 将BSD移植到x86项目,最终夭折
重启项目386-BSD
1991年8月:Linux Torvalds宣布成立Linux;准守GPL协定
--->基于Larry Wall(perl作者), diff编写补丁和patch打补丁工具运用,协同开发推动了linux流行

Unix3个主要分支:
SUN: Solaris
IBM: AIX
HP: HP-UX
lunix诞生历史:
why:sununix太贵
541170-1bb1fbfe72c74321.png

UNIX历史

image-20210215123112550.png

兼容分时系统 Multics

image-20210215123131459.png

为了进一步强化大型主机的功能,让主机的资源可以提供更多的使用者来利用,所以在1964年,由贝尔实验室(Bell)、麻省理工学院(MIT)及奇异公司(GE美国通用电气公司)共同发起了Multics(多路信息计算系统)的计划,Multics计划的目的是让大型主机可以同时支持300个以上的终端机连线使用。不过,到了1969年前后,由于计划进度缓慢,资金也短缺,所以该计划虽然继续在研究,但最终贝尔实验室还是选择了退出

Unix诞生

1966年从加州大学伯克利分校毕业的Ken Thompson加入了贝尔实验室。参与了Multics系统的研发。他基于Multics开发了“star travel”游戏。不幸的是,1969年由于贝尔实验室退出Multics项目,这同时意味着Ken将没有机器可以再玩这个游戏了。面对此情此景,Ken作为一个创造者的本性立即体现了出来,于是他决定自己写一个操作系统来满足他玩游戏的需要,Ken找到了一台废弃已久的老式PDP-7,并在这台机器上重写了他的游戏。在这个过程中,Ken有了一个主意,要开发一个全新的操作系统。利用PDP-7上的汇编语言,Ken只花了一个月就编写完了操作系统的内核,在这个一个月中,他一周一个内核,一个文件系统,一个编辑器和一个编译程序的完成

image-20210215123146601.png
1969 Unix 雏形 UNICS
 Ken Thompson 汇编语言 B语言
1973 正式命名为 Unix
 Dennis Ritchie C语言
1977 BSD
 Berkeley Software Distribution 伯克利大学
1979 System V架构 版权声明
 HP-UNIX IBM AIX “不对学生提供源码” 收回版权
1984年 Minix操作系统
 Andrew S. Tanenbaum 荷兰阿姆斯特丹自由大学计算机科学系
1970 ~1980 年代初,商业初创公司大规模采用 Unix(BSD 和 System V)
 Unix 分裂,包括 DYNIX、HP-UX、SunOS/Solaris、AIX 和 Xenix。
1990 年代
  BSD 和 Linux 发行版是通过全球程序员网络合作开发的。
2000 年
  苹果发布了 Darwin,这也是一个 Unix 系统,它成为 Mac OS X 操作系统的核心,后来更名为 macOS。

参考文档:

GNU

image-20210215123205233.png

GNU:GNU is Not Unix

1984年由Richard Stallman发起并创建

目标是编写大量兼容于Unix系统的自由软件

官方网站:http://www.gnu.org

GPL:GNU General Public License

自由软件基金会:Free Software Foundation

允许用户任意复制、传递、修改及再发布

基于自由软件修改再次发布的软件,仍需遵守GPL

LGPL:Lesser General Public License,LGPL相对于GPL较为宽松,允许不公开全部源代码

GNU操作系统:

Hurd:Hird(Hurd of Interfaces Representing Depth) of Unix-Replacing Daemons

官网:http://www.gnu.org/software/hurd/hurd.html

richard Stallman 为了无止境寻找完美内核,而忘记了HURD的原本目的:能用的操作系统

Linux

image-20210215123223992.png

1991年的10月5日Linus Benedict Torvalds在comp.os.minix新闻组上发布消息,正式向外宣布他自行编写的完全自由免费的内核诞生(Freeminix-like kernel sources for 386-AT) –FREAX,含义是怪诞的、怪物、异想天开类Unix的内核,在GPL下发布

官网:https://www.kernel.org/

最早版本: https://mirrors.edge.kernel.org/pub/linux/kernel/Historic/

Linux操作系统

  • 完整的类UNIX操作系统
  • Linux内核+ GNU工具=Linux/GNU

    如:CentOS,Ubuntu,Android

Linux的内核版本组成

  • 主版本号
  • 次版本号
  • 末版本号
  • 打包版本号
  • 厂商版本 Linux团队
image-20210215123338320.png

Linux 发行版

https://mirrors.kernel.org/

  • slackware:SUSE Linux Enterprise Server (SLES) , OpenSuse桌面
  • debian: ubuntu,deepin(深度),mint
  • redhat: RHEL: RedHat Enterprise Linux, 每18个月发行一个新版本
    • CentOS: Community Enterprise Operating System 兼容RHEL的格式
    • 中标麒麟:中标软件
    • Fedora:每6个月发行一个新版本
  • Alpine: 一个面向安全的轻型 Linux 发行版。它不同于通常 Linux 发行版,Alpine 采用了 musllibc 和 busybox 以减小系统的体积和运行时资源消耗,但功能上比 busybox 又完善的多,只有5M左右大小
  • ArchLinux:轻量简洁,遵循K.I.S.S.原则( keep it simple and stupid),Manjaro
  • Gentoo:极致性能,不提供传统意义的安装程序,下载源代码在本机上编译安装软件
  • LFS:Linux From scratch 自制Linux,只是一个说明书 https://www.linuxfromscratch.org/
  • Android:kernel+busybox(工具集)+java虚拟机

Linux 分支参考网站:https://github.com/FabioLolix/LinuxTimeline/releases File:Linux_Distribution_Timeline.svg

Linux发行版排名: https://distrowatch.com/dwres.php?resource=popularity

Linux 发行版体验: https://distrotest.net/

wiki: https://gunkies.org/wiki/Linux

RedHat 红帽公司

image-20210215123353574.png

Marc Ewing早在卡内基梅隆大学读书的时候就戴着他祖父的红色曲球帽. Marc在Marc Ewing大学常把自己的软件命名为Red Hat — Red hat 1, Red Hat 2 用来区别他人的软件. 所以当他开始自己的Linux项 目, 自然就会命名为Red Hat Linux。Ewing非常乐于帮助同学解决计算机问题 “你的朋友可能会说, 去跟我的朋友Marc交流. 谁是Marc? 他是红帽男孩. ” 所以, 至少在他们最亲密的朋友当中, 红帽子成为了技术专家的同义词

1993年,Bob Young 建立ACC公司,营销Linux和UNIX的支持软件和书籍杂志

1995年,Bob Young 收购了Marc Ewing的业务,合并后的ACC公司成为新的Red Hat软件公司,发布了Red Hat Linux 2.0

2018年10月29日,IBM宣布将以约340亿美元收购开源软件和技术主要供应商红帽公司

Torvalds 一年有1000w美金

红帽发行版本

Red Hat Linux 1.0 (Mother's Day) 1994年11月03日
Red Hat Linux 2.0 1995年09月20日
Red Hat Linux 3.0 (Picasso) 1996年05月01日
Red Hat Linux 4.0 (Colgate) 1996年10月08日
Red Hat Linux 5.0 (Hurricane) 1997年12月01日
Red Hat Linux 6.0 (Hedwig) 1999年04月26日
Red Hat Linux 6.2 (Zoot) Red Hat Linux 6.2E 2000年04月03日
Red Hat Linux 7.0 (Guinness) 2000年03月27日
Red Hat Linux 7.2 (Enigma) Red Hat Enterprise Linux 2 2001年10月22日
Red Hat Linux 8.0 (Psyche) 2002年09月30日
Red Hat Linux 9.0 (Shrike) 2003年03月31日
Red Hat Enterprise Linux 3.0(Taroon) Fedora 1 (Yarrow) 2003年10月22日
Red Hat Enterprise Linux 4.0 2005年02月15日
Red Hat Enterprise Linux 5.0(Tikanga) 2007年03月14日
Red Hat Enterprise Linux 6.0(Santiago) 2010年11月10日
Red Hat Enterprise Linux 7.0(Maipo) 2014年06月10日
Red Hat Enterprise Linux 8.0 2019年05月07日

关于红帽认证

红帽认证是目前世界范围内高度认可的Linux行业认证。红帽认证体系有三个等级,分别是RHCSA(红帽认证系统管理员), RHCE(红帽认证工程师), RHCA(红帽认证系统架构师)

CentOS 和Rockey Linux
  • RHEL:企业版,商用要买许可
  • RHL:个人版,频繁更新,非常不稳定
RHEL(Red Enterprise Linux) 红帽企业版Linux
Red Hat 公司自身的产品中本身包含个人版(Red Hat Linux)和企业版(RHEL)
基于GPLg开源协议,不论是Red Hat Linux还是Red HatEnterprise Linux,用户都可以直接从网络上获取,但是从2003年开始,Red Hat Linux被新项目(Fedora Core)所取代,并且频繁更新,所以几乎无法在企业环境中使用。
同样基于GPL开源协议,RHEL在发布时必做发布源代码,所以无论是二进制的发行版,还是源码,用户都可以直接免费获取,但是不能在商业场景中使用,商用必须购买许可(licence),另外Red Hat公司也提供技术支持,咨询,解决方案等。

CentOS(Community enterprise operating system)社区企业操作系统
就是将RHEL发行的源代码从新编译一次,形成一个可使用的二进制版本,RHEL是遵守GPL开源协议的,所以重新编译是合法的。但是得去掉商标、版权信息等。CentOS可以得到RHEL的所有功能,甚至更好的软件,但CentOS并不向用户提供商业支持,当然也负任何商业责任。漏洞修复和软件包升级等,相对于RHEL的有偿服务来说,也有一定的延时。

2004年,Gregory Kurtzer和CentOS的其他创始成员基于开源的RHEL创建了CentOS,将EnterpriseLinux引入了社区。

2014年,红帽宣布正式赞助CentOS。CentOS的几个核心团队入职Red Hat专门负责其开发。并在Red Hat在理事会中占了三席,但是其社区属性得到保留,交易结果是一部分包括将CentOS商标和IP转移到Red Hat以安全保存。

CentOS 8于2019年9月交付,紧随RHEL 8之后,CentOS Stream的发布和发布是对下一个次要更新中即将发布内容预览版本。可以说是RHEL的beta频道。

2019,巨头IBM花重资收购了Red Hat。并承诺Red Hat忠于其开源根基不会改变,声称" Red Hat对开源的使命和坚定承诺将保持不变。"

2020年12月8日IBM宣布将惯例支持到2029年CentOS 8,提前在2年内就终结,唯一的升级途径是Centos Stream—AKA,RHEL的Beta发布,并建议不再生产环境中使用。预示着CentOS可能会正式死亡。CentOS已死,但是CentOS精神将会永存。

以前, centos在rhel下游发版,保证软件的稳定
----rhel-------------------
----------------centos----

现在,centos在上游发版,无法保证稳定. 之后创始人重新开一个下游版本rocky
----centos----------------
---------------rhel--------
--------------------rocky-

随后以CentOS创始人之一Gregory Kurtzer为首,8小时内250人啸聚网络,计划以创建Rocky Linux(Rocky为已经逝世的另外一个CentOS创始人)取代CentOS。Rocky Linux与RHEL兼容

目前已经创建了Github Rocky Linux项目组织(github.com/rocky-linux/rocky)和官网(rockylinux.org)。

Debian和Ubuntu

Debian https://www.debian.org/intro/why_debian

Debian 是许多其他发行版的基础。Debian 稳定版本的生命周期为五年:首先是三年的完整支持,然后是两年的长期支持(LTS)

Ubuntu(乌班图) 基于Debian GNU/Linux,内核比较新

开源 Open Source 协议

1998 年的 2 月 5 日,一场小型聚会在美国加州的 VA 研究中心举行,与会的人包括了 一众信息技术领域的知名学者和工程师。正是在这场会上,大家同意了 Christine Peterson 女士提出的用“开放源代码”(Open Source)一词来替代容易在英语人士中引起歧义的“自由软件”(Free Software)一词,表达的是同样的软件和意思,但更方便理解更容易获取更多支持。从那一天开始,“开源”正式诞生。

image-20210215123406959.png

开源 Open Source

  • 软件和源代码提供给所有人,自由分发软件和源代码,free 自由,不是免费的意思
  • 能够修改和创建衍生作品

开源软件特性:

  1. 自由学习、自由修改源代码
  2. 可以出于任何目的获得源代码
  3. 可以自由分发源代码
  4. 自由创建衍生版

软件分类

  • 商业:收费,源码也不公开
  • 共享:免费使用,但源码不公开
  • 自由:源代码公开

开源协议

世界上的开源许可证,大概有上百种

image-20210215123435441.png
  • GPLv2, GPLv3, LGPL(lesser) :通用公共许可 copyleft
  • Apache: apache
  • BSD: bsd
  • Mozilla
  • MIT

常用开源协议:

  1. GPL: General Public

    官方软件许可证列表: https://www.gnu.org/licenses/license-list.html

    License通用公共许可证,版权属于GPL,任何程序只要遵循GPL协定,就必须开源

    FSF:自由软件基金会 版权标记:copyright, 开源软件版权标记copyleft

    GPL V2. GPL V3.更新版

    不利于开源的蓬勃发展

    GPL的出发点是代码的开源/免费使用和引用/修改/衍生代码的开源/免费使用,但不允许修改后和衍生的代码做为闭源的商业软件发布和销售。

    GPL协议的主要内容是只要在一个软件中使用("使用"指类库引用,修改后的代码或者衍生代码)GPL

    协议的产品,则该软件产品必须也采用GPL协议,既必须也是开源和免费。这就是所谓的”传染性”。GPL协议的产品作为一个单独的产品使用没有任何问题,还可以享受免费的优势。

    由于GPL严格要求使用了GPL类库的软件产品必须使用GPL协议,对于使用GPL协议的开源代码,商业软件或者对代码有保密要求的部门就不适合集成/采用作为类库和二次开发的基础。

  2. LGPL:Lesser GPL 宽松的通用公共许可证,基于库接口调用,无需开源
    • 库接口调用时,可以不用开源。只能以库接口调用才不开源限制了GPL发展。
    • 基于代码或者衍生,就要开源
  3. BSD协定:Berkeley Software Distribution license

    BSD开源协议是一个给于使用者很大自由的协议。基本上使用者可以”为所欲为”,可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布。

    1. 如果二次发布的产品中包含源代码,则在源代码中必须带有原来的代码中的BSD协定;
    2. 如果二次发布产品是二进制格式的库或程序,则需要在发布的文档或版权声明中说明包含原来的代码中的BSD协定
    3. 不可以用开源代码的作者或组织,以及原来的产品的名字做市场推广;
  4. Apache协定: Apache License ASF:Apache Software Foundtion Apache

    Licence是著名的非盈利开源组织Apache采用的协议。该协议和BSD类似,同样鼓励代码共享和尊重原作者的著作权,同样允许代码修改,再发布(作为开源或商业软件)。需要满足的条件也和BSD类似;

    1. 需要给代码的用户apach license说明,说明软件中包含这个
    2. 如果了源代码,需要在源代码中说明
    3. 在衍生代码中,需要带有原来代码的协议/商标
    4. 发布中有Notice文件,注明带有Apache Licence版权的代码
  5. MIT(MIT)The MIT License

    MIT是和BSD一样宽范的许可协议,作者只想保留版权,而无任何其他了限制.也就是说,你必须在你的发行版里包含原许可协议的声明,无论你是以二进制发布的还是以源代码发布的.

开源软件的作者采用双线授权:

研发一个程序有2个分支,第1个分支支持开源协定,第2个商业化

  • Community社区版:遵循开源协定
  • Enterprise商业授权版:社区版基础上二次开发出更强大的功能、以及提供服务

后来很多开源软件作者都基于这种方式获得收入。

著作版权

关于项目的开源许可协议 。

常见有六种,GPL、BSD、MIT、Mozilla、Apache和LGPL。这些协议适用于我们软件与项目代码,对于我们文档和作品,我们通常使用创作共用许可证来保护。

http://creativecommons.org/license/%20去进行选择

https://creativecommons.org/share-your-work/cclicenses/

image-20210215123503094.png
1. 署名(by license)
2. 署名-非商业用途(by-nc license)
3. 署名-禁止演绎(by-nd license)
4. 署名-非商业用途-禁止演绎(by-nc-nd license)
5. 署名-非商业用途-相同方式共享(by-nc-sa license)
6. 署名-相同方式共享(by-sa license)

阮一峰:谈谈创作共用许可证(Creative Commons licenses) http://www.ruanyifeng.com/blog/2008/04/creative_commons_licenses.html

版权声明:本文采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可
版权声明:CC BY-NC 4.0
1. 你可以自由:
共享 —— 在任何媒介以任何形式复制、发行本作品
演绎 —— 修改、转换或以本作品为基础进行创作
只要你遵守许可协议条款,许可人就无法收回你的这些权利。

2. 惟须遵守下列条件:
署名 —— 您必须给出适当的署名,提供指向本许可协议的链接,同时标明是否对原始作品作了修改。您可以用任何合理的方式来署名,但是不得以任何方式暗示许可人为您或您的使用背书。
非商业性使用 —— 您不得将本作品用于商业目的。
没有附加限制 —— 您不得适用法律术语或者 技术措施 从而限制其他人做许可协议允许的事情。

3. 声明:
您不必因为公共领域的作品要素而遵守许可协议,或者您的使用被可适用的 例外或限制所允许。
不提供担保。许可协议可能不会给与您意图使用的所必须的所有许可。例如,其他权利比如形象权、隐私权或人格权可能限制您如何使用作品。

Linux安装

Unix哲学思想

  • 一切都是一个文件(包括硬件)
  • 小型,单一用途的程序
  • 链接程序,共同完成复杂的任务
  • 避免令人困惑的用户界面
  • 配置数据存储在文本中

安装linux系统

linux安装前准备

虚拟机:用软件(如:vmware,virtualbox等)模拟硬件,方便实验的灵活配置

虚拟化软件,建议使用 Vmware Workstation

image-20210215130023460.png

虚拟硬件配置

  • CPU:2核或更多
  • 内存:1G以上,推荐2G
  • 硬盘:一块硬盘,200G
  • 网卡:NAT模式
  • 光盘:挂载对应版本的ISO文件

打开虚拟化功能

在很多家用台式机和笔记本电脑上,虚拟化功能默认是关闭的,再要打开后才能使用Vmware等虚拟化软件,否则会报错。需要在电脑的BIOS里,打开虚拟化功能

在电脑的BIOS里,打开虚拟化功能

范例:Intel CPU 虚拟化功能

Snipaste_2023-05-18_16-00-36.png

范例:AMD CPU 虚拟化功能

Snipaste_2023-05-18_16-05-25.png

vmware

vmware 设置虚拟机环境

1.统一存放位置

image-20210215130434473.png

2.设置vmware 网络

编辑—虚拟网络编辑器

子网IP: 10.0.0.0
子网掩码:255.255.255.0

NAT设置:
  网关IP:10.0.0.2
image-20210215130510554.png

存放数据的目录结构

└── linux
    ├── CentOS8
    │   ├── CentOS8.3-1  #第一个虚拟机
    │   └── CentOS8.3-2  #第二个虚拟机
    └── Ubuntu18.04.5
    │   ├── Ubuntu18.04.5-1
创建新虚拟机-Centos8
  • 文件–新建虚拟机
image-20210215130739023.png
image-20210215130801764.png
  • 选择虚拟硬件兼容性
image-20210215130839463.png
  • 安装来源,选稍后安装操作系统
image-20210215130906446.png
  • 选择客户机操作系统,根据操作要安装的操作系统进行选择
image-20210215130926256.png
  • 虚拟机名称,随意取
image-20210215130941375.png
Snipaste_2023-05-18_17-03-42.png
  • 选择虚拟出的CPU数量, 2核
image-20210215130954130.png
  • 选择内存大小,2GB
image-20210215131021014.png
  • 网络类型,NAT
image-20210215131033954.png
  • 一直下一步到,选择创建新虚拟磁盘
image-20210215131105207.png
  • 指定磁盘容量,200GB
image-20210215131115669.png

存储为单个文件. 如果选多个文件后期磁盘扩容麻烦,需要手动合并多文件

image-20210215131145876.png
  1. 完成
image-20210215131207294.png
选择linux系统安装媒介

安装系统有多种方式:ISO镜像、PXE

1.找到ISO镜像

image-20210215131714916.png
image-20210215131728500.png
image-20210215131740038.png
image-20210215131809958.png

2.加电开机

image-20210215131844017.png

安装centos

安装CentOS8/Rocky
  • Install Rocky Linux 8.0
image-20210215131933032.png

centos7后网卡名称不再是eth0,这里统一改成eth0

点击 Tab,打开 kernel 启动选项后,增加 net.ifnames=0 biosdevname=0 ,如下图所示

image-20210215133151306.png
  • 选择语言, English
image-20210215132002448.png
  • 设置磁盘空间分配策略
image-20210215132025336.png
  • 自定义分区

总200G

/     100g xfs
/boot 1g   ext4
/data 50g  xfs
swap  2g
image-20210215132050777.png
image-20210215132102935.png
image-20210215132123939.png
image-20210215132148914.png
image-20210215132244252.png
  • 安装指定包组(这里选最小化安装)
image-20210215132337275.png
  • 配置网络和主机名,开启
image-20210215132427873.png
  • 设置时区和时间
image-20210215132457985.png
image-20210215132513112.png
image-20210215132533188.png
  • 设置root用户的密码和普通用户
image-20210215132554874.png
  • 重启
image-20210215132647957.png
  • 第一次启动
image-20210215132715505.png
  • 许可协议,进入并同意许可
image-20210215132753040.png
image-20210215132805388.png
image-20210215132817390.png
  • 用户登录界面
系统配置
网络配置
# centos7
#请配置静态 IP  地址。注意将 UUID 和 和 MAC  地址 已经其它配置删除掉,便于进行虚拟机克隆,请参考下面的配置。
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=static
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=172.16.100.11
NETMASK=255.255.0.0
GATEWAY=172.16.0.2
DNS1=114.114.114.114

重启网络服务
systemctl restart network

# centos8
#修改网卡名
sed -ri '/GRUB_CMDLINE_LINUX=/s#(.*)"$#\1 ifnames=0"#' /etc/default/grub
grub2-mkconfig -o /boot/grub2/grub.cfg ; reboot

#1. 设置 IP  地址
cat >/etc/sysconfig/network-scripts/ifcfg-eth0 <<\EOF
TYPE=Ethernet
BOOTPROTO=static
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=10.100.21.131
PREFIX=24
GATEWAY=10.100.21.1
#DNS1=223.6.6.6
#DNS2=180.76.76.76
EOF

nmcli c reload eth0
nmcli c up eth0

#dns文件要手动创建
cat >/etc/resolv.conf<<EOF
nameserver 114.114.114.114
EOF

关闭防火墙与SElinux

#systemctl disable --now firewalld
#systemctl stop  firewalld
#或者
systemctl disable --now firewalld.service
systemctl disable --now NetworkManager

setenforce 0
#sed -ri '/^[^#]*SELINUX=/s#=.+$#=disabled#' /etc/selinux/config
sed -i '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config

关闭 dnsmasq (可选)

linux 系统开启了 dnsmasq 后(如 GUI 环境),将系统DNS Server 设置为 127.0.0.1,这会导致 docker容器无法解析域名,需要关闭它

systemctl disable --now dnsmasq
设置主机名
hostnamectl set-hostname node01
hostname node01

设置主机名解析

# cat /etc/hosts
node01 172.16.100.11
切换yum源和安装常用命令
#系统源,EPEL源
# centos7
curl -s -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
curl -s -o  /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum makecache #生成缓存

# centos8
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm
sed -i 's|^#baseurl=https://download.fedoraproject.org/pub|baseurl=https://mirrors.aliyun.com|' /etc/yum.repos.d/epel*
sed -i 's|^metalink|#metalink|' /etc/yum.repos.d/epel*
yum makecache #生成缓存

#常用软件
yum install -y wget jq psmisc vim net-tools  lrzsz tree screen  tmux lsof tcpdump nc mtr nmap telnet git
yum install -y bash-completion

常用软件

#centos
yum install net-tools iproute iputils less telnet -y && yum install less which file -y && yum clean all && cd /opt && curl -O https://alibaba.github.io/arthas/arthas-boot.jar

#ubuntu
apt update && apt install -y  net-tools iproute2 iputils-ping less telnet file curl && cd /opt && curl -O https://alibaba.github.io/arthas/arthas-boot.jar

#apline linux
apk update && apk add busybox-extras file curl && cd /opt && curl -O https://alibaba.github.io/arthas/arthas-boot.jar


#busybox-extras包
#sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositorie
cat <<\EOF>> /etc/apk/repositories 
http://mirrors.tuna.tsinghua.edu.cn/alpine/v3.9/main
http://mirrors.tuna.tsinghua.edu.cn/alpine/v3.9/community
EOF
apk update
apk add busybox-extras


#ifconfig 
net-tools
#alpine 自带

#ip ss
iproute  #centos
iproute2 #ubuntu 
#apline 自带ip netstat

#ping
iputils #centos
iputils-ping #ubuntu
#apline 自带

#less
less
#apline 自带

#telnet
telnet
busybox-extras #apline

#file
file

#curl
curl

#arthas-boot.jar
cd /opt &&  curl -O https://alibaba.github.io/arthas/arthas-boot.jar
ssh优化
sed -ri 's/(GSSAPIAuthentication )yes/\1no/'  /etc/ssh/sshd_config
sed -ri 's/^#(UseDNS )yes/\1no/' /etc/ssh/sshd_config
#sed -i 's/^#(Port) 22/\1 2200/'  /etc/ssh/sshd_config
#sed -i 's/^#(PermitRootLogin )yes/\1no/'  /etc/ssh/sshd_config #不让root登录
#echo -e 'ClientAliveInterval 10\nClientAliveCountMax 86400' >> /etc/ssh/sshd_config
systemctl restart sshd
命令提示符
cat >/etc/profile.d/ipenv.sh<<\EOF
POOL_NAME=`hostname`
PS1_POOL=`echo ${POOL_NAME} | tr 'A-Z' 'a-z'`
PS1_INT=`/sbin/ip a | egrep -v 'inet6|127.0.0.1|\/32' | awk -F'[ /]+' '/inet/{print $NF" = "$3}' | head -n1`
export PS1='[\e[1;32m\u\e[m\e[1;33m@\e[m'"\e[1;35m$PS1_POOL\e[m"' \e[4m\w\e[m] \e[1;36m$PS1_INT\e[m\n\$ '

HISTFILESIZE=4000
HISTSIZE=4000
USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'`
if [ -z $USER_IP ]
then
  USER_IP=`hostname`
fi
HISTTIMEFORMAT="%F %T $USER_IP:`whoami` "
export HISTTIMEFORMAT
#export HISTTIMEFORMAT="%Y-%m-%d:%H-%M-%S:`whoami`:  "
alias vi=vim
export EDITOR=vim
EOF

source /etc/profile
时间同步
# chrony时间同步
yum install -y chrony
#配置
cat>/etc/chrony.conf<<EOF
server ntp1.aliyun.com iburst minpoll 4 maxpoll 10
server cn.pool.ntp.org iburst minpoll 4 maxpoll 10
server s1b.time.edu.cn iburst minpoll 4 maxpoll 10
stratumweight 0
driftfile /var/lib/chrony/chrony.drift
rtcsync
makestep 1.0 3
bindcmdaddress 127.0.0.1
keyfile /etc/chrony/chrony.keys
logdir /var/log/chrony
logchange 1
EOF

#systemctl start chronyd.service
#systemctl enable chronyd.service
#systemctl enable --now chronyd.service
timedatectl set-timezone Asia/Shanghai # 修改时区
chronyc -a makestep # 强制同步下系统时钟
timedatectl set-ntp yes #启用NTP时间同步

# ntp的时间同步(不用了)
rpm -ivh http://mirrors.wlnmp.com/centos/wlnmp-release-centos.noarch.rpm
yum install ntp -y
# 更改时区
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 设置定时任务同步时间
echo 'Asia/Shanghai' >/etc/timezone

ntpdate time2.aliyun.com
ntpdate time.windows.com
hwclock -w

# 加入到crontab
crontab -e
*/5 * * * * /usr/sbin/ntpdate time.windows.com &>/dev/null
优化设置 journal

优化设置 journal 日志相关,避免日志重复搜集,浪费系统资源。修改systemctl启动的最小文件打开数量。

# 下面两句apt系列系统没有,执行不影响
#禁止rsyslog获取journald日志 (
#sed -ri 's/^\$ModLoad imjournal/#&/' /etc/rsyslog.conf
#sed -ri 's/^\$IMJournalStateFile/#&/' /etc/rsyslog.conf
#修改systemctl启动的最小文件打开数量
sed -ri 's/^#(DefaultLimitCORE)=/\1=100000/' /etc/systemd/system.conf
sed -ri 's/^#(DefaultLimitNOFILE)=/\1=100000/' /etc/systemd/system.conf
limit优化

文件最大打开数,按照规范,在子配置文件写

#ulimit -SHn 65535 #临时生效

cat >>/etc/security/limits.conf <<\EOF
root   -   nproc       1000000
root   -   nofile      1000000
*   -   core        unlimited
*   -   nproc       1000000
*   -   nofile      1000000
*   -   memlock     32000
*   -   msgqueue    8192000
EOF

#只对非 root 用户起作用。而 root 用户的限制,必须显式添加
内核优化
cat >>/etc/sysctl.conf<< \EOF
#add
vm.max_map_count = 655360
net.core.somaxconn = 26214
fs.file-max = 1024000

kernel.msgmnb = 65536
kernel.msgmax = 65536
net.ipv4.conf.all.arp_filter = 1
net.ipv4.ip_local_port_range = 10000 65535
net.core.netdev_max_backlog = 16384
net.core.rmem_max = 2097152
net.core.wmem_max = 2097152
vm.overcommit_memory = 1
vm.swappiness = 0
vm.dirty_expire_centisecs = 500
vm.dirty_writeback_centisecs = 100
vm.dirty_background_ratio = 0
vm.dirty_ratio=0
vm.dirty_background_bytes = 1610612736
vm.dirty_bytes = 4294967296

# see details in https://help.aliyun.com/knowledge_detail/39428.html
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_announce=2
net.ipv4.conf.all.arp_announce=2

# see details in https://help.aliyun.com/knowledge_detail/41334.html
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_max_tw_buckets = 50000
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_synack_retries = 2
kernel.sysrq = 1

#
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
EOF
sysctl -p
别名

ubuntu/debian

cat <<\EOF> ~/.bash_profile
export LS_OPTIONS='--color=auto'
eval "$(dircolors)"
alias ls='ls $LS_OPTIONS'
alias ll='ls $LS_OPTIONS -l'
EOF
cat <<\EOF> /etc/profile.d/alias.sh
alias ll='ls -alF'
alias ls='ls --color=auto'
alias l.='ls -d .* --color=auto' #仅显示隐藏文件
alias la='ls -A'
alias l='ls -CF'
EOF
其他

开启桌面(不推荐)

~]# startx

使用中文字符集(不推荐)

# 查看当前系统语言
locale

#export LANG='en_US.UTF-8'

# 永久修改
echo 'LANG=en_US.UTF-8' > /etc/locale.conf
source   /etc/locale.conf
# 也可以使用命令修改locale.conf配置文件:
#localectl set-locale LANG=en_US.UTF-8
localectl set-locale LANG=zh_CN.utf8

# 验证
date

docker

cat >/etc/sysctl.d/docker.conf<<\EOF
#docker大量生成的iptables规则可以要打开内生的桥接功能,要确保Iptables不对bridge的数据进行处理
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-arptables=1

vm.swappiness=0
vm.overcommit_memory=1

vm.panic_on_oom=0
EOF

#sysctl -p /etc/sysctl.d/docker.conf
#sysctl --system

K8S相关

k8s相关-安装基础软件包

init_pkg=(conntrack-tools     # ipvs 模式需要
psmisc        # 安装psmisc 才能使用命令killall,它在keepalive的监测脚本中使用到
nfs-utils     # 挂载nfs 共享文件需要 (创建基于 nfs的PV 需要)
jq                  # 轻量JSON处理程序,安装docker查询镜像需要
socat               # 用于port forwarding
bash-completion     # bash命令补全工具,需要重新登录服务器生效
ipset
perl           # 内核依赖
ipvsadm
conntrack
libseccomp
net-tools
crontabs
sysstat
unzip
bind-utils
tcpdump
telnet
lsof
htop
wget
psmisc
)
unset yum_pkg;for i in ${init_pkg[@]}; do yum_pkg="$yum_pkg $i" ;done && yum install -y $yum_pkg

k8s相关-加载ipvs内核模块

:> /etc/modules-load.d/k8s-ipvs.conf
module=(
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
br_netfilter
  )
for kernel_module in ${module[@]};do
    /sbin/modinfo -F filename $kernel_module |& grep -qv ERROR && echo $kernel_module >> /etc/modules-load.d/k8s-ipvs.conf || :
done

systemctl daemon-reload
systemctl enable --now systemd-modules-load.service

k8s限制

cat >/etc/security/limits.d/kubernetes.conf<<EOF
*   -   nproc       1000000
*   soft   nofile   1000000
*   hard   nofile   131072
*   -   memlock     unlimited
root soft nproc unlimited
EOF

k8s相关-内核参数

所有机器需要设定统参数,目前对ipv6支持不怎么好,所以里面也关闭ipv6了。

cat <<EOF > /etc/sysctl.d/k8s-sysctl.conf
#---add k8s---
net.ipv4.ip_forward = 1
net.netfilter.nf_conntrack_max = 2310720
fs.inotify.max_user_watches=89100
fs.may_detach_mounts = 1
fs.file-max = 52706963
fs.nr_open = 52706963

# 解决 k8s service 同节点通信问题
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-arptables = 1

#禁止使用 swap 空间,只有当系统 OOM 时才允许使用它
vm.swappiness=0
vm.panic_on_oom=0  # 开启 OOM
vm.overcommit_memory=1 # 不检查物理内存是否够用

# kube-proxy使用ipvs的话为了防止timeout需要设置下tcp参数
# https://github.com/moby/moby/issues/31208 
# ipvsadm -l --timout
# 修复ipvs模式下长连接timeout问题 小于900即可
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl =15

net.ipv4.conf.all.arp_announce = 2
net.ipv4.tcp_max_tw_buckets = 50000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_orphans = 327680
net.ipv4.tcp_orphan_retries = 3
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.ip_conntrack_max = 65536
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_timestamps = 0
net.core.somaxconn = 16384
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
net.ipv4.neigh.default.gc_stale_time = 120
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
EOF

sysctl --system

启用 bridge-nf-call-iptables 这个内核参数 (置为 1),表示 bridge设备在二层转发时也去调用 iptables 配置的三层规则 (包含conntrack),所以开启这个参数就能够解决上述 Service同节点通信问题,这也是为什么在 Kubernetes 环境中,大多都要求开启 bridge-nf-call-iptables 的原因。参考https://imroc.cc/post/202105/why-enable-bridge-nf-call-iptables/

k8s相关-fstab文件关闭swap Kubernetes

v1.8+要求关闭系统Swap,若不关闭则需要修改kubelet设定参数( –fail-swap-on设置为 false 来忽略 swapon),在所有机器使用以下指令关闭swap并注释掉/etc/fstab中swap的行:

swapoff -a && sysctl -w vm.swappiness=0
sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab

安装Ubuntu

ISO镜像下载地址:http://mirrors.aliyun.com/ubuntu-releases

不带图形界面的server版

vmware高级选择UEFI,这样就能使用ubuntu自带的安装器而不使用wmware的简易安装

image-20210215140113720.png
  • 选第一个
image-20210215140126820.png
  • 选择安装语言,这里选英语
image-20210215140146421.png
  • 选择键盘布局,默认英语
image-20210215140201656.png
  • 配置至少一块网卡,可以用DHCP自动分配,也可以手动设置。这里是我的手动配置
image-20210215140215219.png
  • 代理服务器,这里保留为空
image-20210215140227524.png
  • 配置Ubuntu存档镜像,这里使用阿里源
image-20210215140242302.png
  • 磁盘分区,可以默认“回车”。这里自定义分区
image-20210215140352743.png
image-20210215140406631.png
image-20210215140421653.png
image-20210215140432842.png
image-20210215140453206.png
image-20210215140504588.png
  • 配置您的名称,服务器名称,用户名及其密码
image-20210215140516177.png
  • 选择安装openssh,方便远程访问
image-20210215140537635.png
  • 选择适用于您的Ubuntu系统的可用特性软件包列。这里不选了
image-20210215140549510.png
  • 成功安装Ubuntu LTS服务器后,请重新引导它以完成安装。
image-20210215140559717.png
  • 出现这个提示,提前将安装盘连接取消
image-20210215140621702.png
image-20210215140640740.png
  • 恭喜你!Ubuntu LTS服务器可以使用了
image-20210215140655928.png

安装Debian

官方网站下载ISO镜像:https://www.debian.org/

  • 进入到系统安装界面,选择图形安装Graphical install 或文本安装Install
  • Select a language: 选择系统使用语言English
  • Select your location: 选择地区:Hong Kong
  • Configure the keyboard: 选择键盘模式:American English
  • 系统加载和扫描中
  • Configure the network
    • Hostname: 为计算机命名:可自定义
    • Domain name: 为计算机设置域名:可不填写
  • Set up users and passwords
    • Root password: 为计算机超级管理员root设置密码
    • New user: 为计算机设置一个普通用户,设定用户全名 jasper
    • Username for your account and password: 为计算机设置普通用户的账户 jasper
  • 等待设定磁盘
  • Partition disks
    • Manual 手动配置
      • 选择磁盘
      • Create new empty partition table on this device: 创建新的分区表(抹掉所有数据) Yes
      • Select FREE SPACE: 选择磁盘下面的可用空间
      • Create a new partition: 创建一个新分区 ENTER
      • New partition size: 分区容量输入 max (分配全部可用空间)
      • Type for the new partition: 分区类型选择主分区 Primary
      • Partition settings: Done
      • Finish partitioning and write changes to disk: 完成分区操作并保存修改到磁盘 Enter
      • 出现没有设置分区用作 SWAP 空间的警告,询问是否回到分区菜单?选择 No
      • Write the changes to disks?: 写磁盘 Yes
  • Install the base system: 开始安装系统
  • Configure the package manager: 是否扫描安装介质,选择:No
    • Use a network mirror: 是否使用网络镜像源,选择:No ,后面会单独说明配置镜像源
  • Configure popularity-contest: 是否参与使用系统调查(每周系统自动提交一个脚本给系统开发者),选择:No
  • Software selection: 选择桌面环境和服务,需要把SSH Server选择上
    • 无桌面最小化: SSH server, standard system utilities
    • Installing: 安装软件中…耐心等待
  • Install the GRUB boot loader: 主硬盘安装GRUB引导加载程序,选择:Yes
    • Device for boot loader installation: 为GRUB加载引导程序选择安装的磁盘 /dev/sda
  • Finish the installtion完成系统安装
    • <Continue> to reboot: 完成系统安装,提示重启系统
  • 重启后,直接选择Debian回车

网络配置参考:https://wiki.debian.org/NetworkConfiguration

#查网卡名称,如ens33
ip a

#编辑网络配置文件
sudo vim /etc/network/interfaces

##1使用DHCP方式自动获取,在文件底部添加
auto ens33
allow-hotplug ens33
iface ens33 inet dhcp

##2手动设置IP上网,在文件底部添加
auto ens33
iface ens33 inet static
    address 192.168.0.7
    netmask 255.255.255.0
    gateway 192.168.0.254

#重启网络服务
sudo systemctl restart networking.service
sudo ifup ens33 # 激活网络接口

#修改DNS
sudo vim /etc/resolv.conf
nameserver 8.8.8.8         #添加新的dns条目

#测试网络
ping baidu.com

国内源

软件安装

#安装ssh
apt install -y openssh-server
systemctl start sshd

#vim
apt install -y vim

Kali Linux

Kali基于Debian衍生版。

安装说明:

#安装ssh
sudo apt install -y openssh-server
sudo systemctl enable --now ssh

#vim
sudo apt install -y vim

容器安装:https://www.kali.org/docs/containers/

Apline Linux

https://alpinelinux.org/

Alpine Linux 是基于 musl libc 和 busybox 的面向安全的轻量级 Linux 发行版。

下载IOS镜像直接启动,root 无密码

网络配置

https://wiki.alpinelinux.org/wiki/Configure_Networking

#临时ip
ifconfig eth0 10.0.0.136 netmask 255.255.0.0
#ifconfig eth0 0 #清除ip地址
#ifconfig eth0 up
route add default gw 10.0.0.2

#静态ip #和Debian的配置相似,在 /etc/network/interfaces 中设置IP地址:
cat <<\EOF> /etc/network/interfaces
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
    address 192.168.6.111/24
    gateway 192.168.6.11
    hostname alpine
EOF

cat <<\EOF> /etc/resolv.conf
nameserver 8.8.8.8
EOF

#重启网络服务使配置生效:
/etc/init.d/networking restart

包使用

#搜索服务
apk search 包名
#安装服务
apk add 包名
#启动服务 sysV
service 服务名 start

#列出已安装包,及文件列表
apk info
apk info -L openssh-server
#列出已安装文件依赖哪个包
apk info -W /sbin/ifconfig 

范例-安装sshd服务

apk search sshd
apk add openssh-server
ls /etc/init
service sshd start

#允许root登录
sed -ri.bak 's/^#(PermitRootLogin )prohibit-password/\1yes/' /etc/ssh/sshd_config
service sshd restart

国产操作系统-统信UOS V20

SSH 客户端

SSH 客户端远程接入Linux 系统

win10

cmd自带ssh

MobaXterm

https://mobaxterm.mobatek.net/

ssh key 连接

https://ubccr.freshdesk.com/support/solutions/articles/13000034093-using-ssh-keys-with-mobaxterm-windows-

上传下载

#安装rz/sz工具:
yum -y install lrzsz

#从linux下载文件
sz  filename
使用:ctrl + 鼠标右键
选择:Receive file using Z-modem

#上传文件到linux
rz
使用:ctrl + 鼠标右键
选择:Send file using Z-modem
选择上传文件

xshell

crt

其它操作系统安装

archlinux

Archlinux的安装与配置

官方文档: https://wiki.archlinux.org/title/Installation_guide

安装到btrfs文件系统上

桌面用Hyprland,显卡是N卡

附加Windows的双系统引导

Archlinux的安装

  1. 先去官网下载最新的ISO镜像文件,刻录到U盘,从U盘启动Arch的安装镜像,网上有很多教程, 我就不演示了

    BIOS 设置 EFI 引导

  2. 连接互联网

    ip link 检查网卡状态

    如果有网线:输入命令 =dhcpcd & 自动获取 ip

    如果没网线就连wifi

    iwctl
    station <网卡名> connect <WIFI名>
    输入密码
    quit
    

    ping baidu.com 测试网络连接

  3. 联网 :: passwd 输入 root 密码

    我用ssh连接物理机的arch安装镜像,不在虚拟机安装

  4. 检验是否是UEFI64位模式 :: cat /sys/firmware/efi/fw_platform_size
  5. 设置时区 :: timedatectl list-timezone | grep -i shanghai

    timedatectl set-timezone Asia/Shanghai

  6. 磁盘分区,注意别把数据格式化了 :: 如果Windows有一个EFI分区,可以和Arch共用

    blkid 检查磁盘类型

    为Archlinux准备一个512MB的EFI分区,1G的交换分区,其余空间创建为linux filesystem分区

    cfdisk /dev/你的硬盘

    fdisk /dev/sda
    m # 查看帮助
    g # 新建 GPT 分区
    
    # 512M 给 efi
    n
    回车,回车,在 Last sector: +512M
    Hex code ...: ef00
    
    
    # 1G 给 swap 交换分区
    n
    回车,回车,在 Last sector: +1g
    Hex code ...: 8200
    
    # 剩余给 /
    n
    回车,回车,回车,回车
    
    w # 写入
    
    # 查看
    lsblk
    
  7. 格式化分区

    #如果你为arch准备了单独的EFI分区
    mkfs.fat -F 32 /dev/efi_partition
    #格式化交换分区
    mkswap /dev/swap_partition
    #格式化btrfs文件系统
    mkfs.btrfs /dev/root_partition -f
    mount /dev/root_partition /mnt
    btrfs subvolume create /mnt/@
    btrfs subvolume create /mnt/@home
    umount /dev/root_partition
    
  8. 挂载分区

    mount /dev/root_partition /mnt -o subvol=@
    mount /dev/root_partition /mnt/home -o subvol=@home --mkdir
    mount /dev/efi_system_partition /mnt/boot/efi --mkdir
    swapon /dev/swap_partition
    
  9. 设置镜像源并安装系统

    方法1-手动修改源

    vim /etc/pacman.d/mirrorlist

    #在开头加上镜像源 https://archlinux.org/mirrorlist/all/
    Server = https://mirrors.ustc.edu.cn/archlinux/$repo/os/$arch
    Server = https://mirrors.tuna.tsinghua.edu.cn/archlinux/$repo/os/$arch
    
    #更新
    pacman -Syy
    

    方法2-利用内置 reflector 程序改源

    #reflector 反射器搜索对应国家,最近 6 小时刷新,按速率排序,并保存到源文件中
    reflector --country China --age 6 --sort rate --save /etc/pacman.d/mirrorlist
    
    pacman -Sy
    

    安装系统

    #安装Arch
    pacstrap -K /mnt base linux linux-firmware neovim
    #pacstrap -K /mnt base linux linux-firmware base-devel git fish grub efibootmgr os-prober openssl networkmanager dhcpcd btrfs-prog neovim
    
    #等待安装完。
    #下列包未安装,需要进入系统后 pacman -S 包名
    #neovim 编辑工具
    #adm-ucode 如果有是 adm 处理器安装这个
    #intel-ucode 如果有是英特尔处理器安装这个 
    #fish 终端
    #grub efibootmgr 更改引导用
    #networkmanager hdcpcd  网络配置
    
  10. arch的基础配置
    • 挂载配置

      genfstab -U /mnt >> /mnt/etc/fstab
      arch-chroot /mnt
      
    • 时间设置

      ln -sf /usr/share/zoneinfo/Region/City /etc/localtime
      hwclock --systohc
      
    • 语言设置

      nvim /etc/locale.gen #取消en_US.UTF-8 UTF-8和zh_CN.UTF-8前的注释
      locale-gen
      nvim /etc/locale.conf  #第一行写入LANG=en_US.UTF-8
      
    • 网络配置

      nvim /etc/hostname
      第一行写入你的hostname,任意添(别太任意%……#@$@*&……)
      
      nvim /etc/hosts
      127.0.0.1 localhost
      ::1       localhost
      127.0.0.1 主机名.xx.com 主机名
      
      #必要的软件
      pacman -S btrfs-progs grub efibootmgr os-prober networkmanager network-manager-applet dhcpcd dialog wpa_supplicant mtools dosfstools reflector base-devel linux-headers bluez bluez-utils cups hplip alsa-utils pipewire pipewire-alsa pipewire-pulse pipewire-jack bash-completion openssh rsync acpi acpi_call tlp sof-firmware acpid git fish 
      #fish 终端
      #grub efibootmgr os-prober 更改引导用
      #networkmanager hdcpcd  网络配置,network-manager-applet 对桌面小程序
      #dialog 网络实用程序
      #wpa_supplicant 对应连接 wifi 程序
      #mtools dosfstools 对应 windows 系统程序
      #reflector 反射器
      #base-devel 开发包
      #linux-headers 桌面头
      #bluez bluez-utils 蓝牙适配
      #cups 打印机
      #hplip 惠普打印机和扫描仪驱动程序
      #alsa-utils 声音包
      #pipewire pipewire-alsa pipewire-pulse pipewire-jack 音频相关
      #bash-completion bash 的补全
      #openssh 远程 ssh
      #rsync 文件同步
      #acpi acpi_call tlp acpid 电源管理
      #sof-firemware 解决戴尔笔记本没声音问题
      #
      
      #pacman -S networkmanager dhcpcd
      systemctl enable dhcpcd
      systemctl enable NetworkManager
      
      
      systemctl enable bluetooth # 开机启动蓝牙适配器
      systemctl enable cups #开机启动打印机
      systemctl enable sshd
      systemctl enable tlp
      systemctl enable reflector.timer #开机启动反射器计时器
      systemctl enable fstrim.timer #为 SSD 启用 fs 流计时器,定期调整 ssd omi 系统
      systemctl enable acpid
      
    • Initramfs配置

      #pacman -S grub-btrfs
      nvim /etc/mkinitcpio.conf #在HOOKS中加入btrfs
      #pacman -S btrfs-progs #安装时忘记装btrfs了,这条命令会自动运行mkinitcpio -P
      如果在pacstrap中就安装了btrfs-progs,那么改完/etc/mkinitcpio.conf后需要手动运行mkinitcpio -P
      mkinitcpio -P
      
    • Pacman配置

      #检查/etc/pacman.d/mirrorlist
      nvim /etc/pacman.conf #取消Color和ParallelDownloads前的注释, 会有彩色安装界面
      #再加上一行 ILoveCandy  吃豆人彩蛋
      pacman -Syy
      
    • 用户配置

      #设置root的密码
      passwd
      
      #添加一个用户
      useradd -mG wheel <用户名>
      passwd <用户名> #设置用户密码
      
      #为wheel组中的用户添加sudo权限
      pacman -S sudo fish
      nvim /etc/sudoers
      将108行的注释去掉
      会提醒这是个只读文件,不用管,直接:w!强制写入
      
      #设置用户shell
      su <用户名>
      whereis fish #查看shell位置
      chsh -s /usr/bin/fish
      Ctrl+D 退出用户登陆
      su <用户名>
      再次进入到用户,可以看到shell已经变了
      
    • 引导配置

      #sudo pacman -S grub efibootmgr os-prober
      sudo grub-install --recheck /dev/你的硬盘
      #或者 sudo grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=GRUB
      
      sudo nvim /etc/default/grub
       
      GRUB_CMDLINE_LINUX_DEFAULT="loglevel=3 quiet video=1920x1080" # 屏幕分辨率大些
      GRUB_DISABLE_OS_PROBER=false
      将最后一行的注释去掉,启用os-prober检测双系统
      如果之前为Arch创建了单独的EFI,那么现在将windows的EFI分区挂载到任意目录 例如(/mnt)
      运行sudo os-prober看看能不能检测到windows
      
      sudo grub-mkconfig -o /boot/grub/grub.cfg
      
    • 配置完引导后重启电脑并拔掉U盘

      #Ctrl+D 2次,退出登陆普通用户、root用户,回到非 chroot 模式
      jasper@archiso /> 
      [root@archiso /]# 
      exit
      arch-chroot /mnt  59.69s user 61.89s system 1% cpu 1:49:10.68 total
      root@archiso ~ #
      
      umount -R /mnt 取消挂载
      reboot 重启
      

重启后图形界面

基础包
  1. 登陆到你的用户
  2. 显卡

    虚拟机不涉及显卡驱动安装

    #查看显卡
    lspci -k | grep -A 2 -E "(VGA|3D)"
    

    安装Nvidia驱动

    #安装驱动
    我的台式机装的nvidia-dkms没问题,笔记本有问题,改成装nvidia而不是nvidia-dkms
    sudo pacman -S nvidia-dkms nvidia-utils nvidia-settings
    sudo pacman -S nvidia nvidia-utils nvidia-settings
    
    sudo nvim /etc/default/grub
    在GRUB_CMDLINE_LINUX中添加nvidia_drm.modeset=1
    sudo grub-mkconfig -o /boot/grub/grub.cfg
    sudo nvim /etc/mkinitcpio.conf
    在MODULES中加入nvidia nvidia_modeset nvidia_uvm nvidia_drm
    将kms从HOOKS中去掉
    sudo mkinitcpio -P
    reboot 重启
    nvidia-smi 验证是否安装成功
    
    在/etc/pacman.d/hooks/nvidia.hook中写入
    
    [Trigger]
    Operation=Install
    Operation=Upgrade
    Operation=Remove
    Type=Package
    Target=nvidia
    Target=linux
    # Change the linux part above if a different kernel is used
    
    [Action]
    Description=Update NVIDIA module in initcpio
    Depends=mkinitcpio
    When=PostTransaction
    NeedsTargets
    Exec=/bin/sh -c 'while read -r trg; do case $trg in linux*) exit 0; esac; done; /usr/bin/mkinitcpio -P'
    
    

    只安装 Intel 显卡驱动

    sudo pacman -S xf86-video-intel
    

    安装 AMD 显卡驱动

    sudo pacman -S  xf86-video-amdgpu mesa lib32-mesa vulkan-radeon lib32-vulkan-radeon libva-mesa-driver lib32-libva-mesa-driver mesa-vdpau mesa-vdpau amdgpu-pro-libgl lib32-amdgpu-pro-libgl
    
  3. 其它

    软件包

    ## 图形界面
    # adm
    xf86-video-amdgpu
    
    # nvidia 驱动
    nvidia nvidia-utils
    
    /etc/mkinitcpio.conf 在MODULES处修改
    如 MODULES=(admgpu) 或  MODULES=(nvidia) 
    
    
  4. 连接互联网

    如果有网线跳过这一步

    nmcli device wifi connect <网络名> <密码>

    或 nmtui

  5. 常用包
    archlinux AUR 仓库第三方包管理工具

    可以安装很多第三方软件

    方案1-paru

    https://github.com/morganamilo/paru

    sudo pacman -S --needed base-devel
    git clone https://aur.archlinux.org/paru.git
    cd paru
    makepkg -si
    

方案2-yay

git clone https://aur.archlinux.org/yay-bin
cd yay-bin/
makepkg -si
快照备份

yay -S timeshift-bin timeshift-autosnap

sudo timeshift --list-devices

sudo timeshift --snapshot-device /dev/数据盘 #指定快照盘,保存信息到 json 文件中

sudo timeshift --create --comments "First Backup" --tags D

sudo grub-mkconfig -o /boot/grub/grub.cfg

# 恢复快照
sudo timeshift --list
sudo timeshift --restore
中文
sudo pacman -S noto-fonts-cjk noto-fonts
(no term)

浏览器

sudo pacman -S firefox
sudo pacman -S google-chrome
桌面方案-GNOME
sudo pacman -S  gdm gnome gnome-extra gnome-tweaks 
sudo systemctl enable gdm
平铺窗口方案-bspwm+sxhkd
#安装 bspwm sxhkd 和其它软件
sudo pacman -S xorg bspwm sxhkd dmenu terminator lightdm lightdm-gtk-greeter lightdm-gtk-greeter-settings nitrogen lxappearance picom nautilus arandr 
#sxhkd 热键绑定 与 bspwm 平铺窗口一起使用
#arandr 多显示器很有用,如 xrandr -s 1920x1080

#激活登录窗口
sudo systemctl enable lightdm

#配置
mkdir -p .config/{bspwm,sxhkd}
install -Dm755 /usr/share/doc/bspwm/examples/bspwmrc .config/bspwm/
install -Dm644 /usr/share/doc/bspwm/examples/sxhkdrc .config/sxhkd/

vim .config/sxhkd/sxhkdrc
urxvt 改为 terminator

vim .config/bspwm/bspwmrc 

sxhkd 下一行加入
nitrogen --restore #启动壁纸
picom   #启动窗口动态效果

sudo reboot

#bspwm 简单操作
窗口键+回车:多窗口
窗口键+w:删除窗口
窗口键+空格:搜索,如firefox

#安装壁纸和主题
sudo pacman -S archlinux-wallpaper
sudo pacman -S materia-gtk-theme papirus-icon-theme

#桌面壁纸设置
终端右键属性:
    Global: 去掉 window borders
    Profiles: 
      General: Cursor Shape 改为 Underline,取消 Show titlebar
      Background: 选择 Transparent background 透明度 85%
      Scrolling:  关闭终端滚动条

窗口键+空格: lxappearance  改变图标外观
  Widget: Materia-dark 
  Icon Theme: Papirus


窗口键+空格: nitrogen  属性,在directories 添加 /usr/share/backgrounds/archlinux ,选择一张壁纸,Zoomed Fill
安装Hyprland桌面
sudo pacman -S hyprland kitty waybar
sudo pacman -S sddm
sudo pacman -S ttf-jetbrains-mono-nerd adobe-source-han-sans-cn-fonts adobe-source-code-pro-fonts
sudo systemctl enable sddm
sudo reboot 重启

等待重启,然后就能看到一个登陆界面,输入用户密码进入Hyprland
Nvidia还要设置一下
https://wiki.hyprland.org/Nvidia/
CTRL+ALT+F3进如tty3并登陆用户
nvim ~/.config/hypr/hyprland.conf
添加NVIDIA环境变量
env = LIBVA_DRIVER_NAME,nvidia
env = XDG_SESSION_TYPE,wayland
env = GBM_BACKEND,nvidia-drm
env = __GLX_VENDOR_LIBRARY_NAME,nvidia
env = WLR_NO_HARDWARE_CURSORS,1
reboot 重启
等待重启,然后就能看到一个登陆界面,输入用户密码进入Hyprland
Win+Q 开启终端
Win+C 关闭窗口
Win+R 呼出菜单
Win+数字 切换桌面
Win+Shift+数字 将当前窗口移动到对应工作区
Win+鼠标左键 拖动窗口
Win+鼠标右键 调整窗口大小
Win+V 让窗口浮动出来
(安装OBS中。。。。)
安装输入法
    sudo pacman -S fcitx5 fcitx5-chinese-addons fcitx5-configtool
配置输入法
    fcitx5-configtool
安装paru
    git clone https://aur.archlinux.org/paru.git
    cd paru
    makepkg -si
安装rofi
    sudo pacman -S rofi
安装chrome和vscodfe
    paru -S google-chrome
    sudo pacman -S code
配置
    安装grim,截图软件
        sudo pacman -S grim
    安装QQ音乐
        paru -S qqmusic-bin

平铺窗口管理器-bspwm

安装

sudo pacman -S bspwm sxhkd
# sxhkd 按键绑定程序


mkdir -p .config/{bspwm,sxhkd}
install -Dm755 /usr/share/doc/bspwm/examples/bspwmrc .config/bspwm/
install -Dm644 /usr/share/doc/bspwm/examples/sxhkdrc .config/sxhkd/

vim .config/sxhkd/sxhkdrc
urxvt 改为 terminator

vim .config/bspwm/bspwmrc 

pgrep 下一行加入
nitrogen --resore
picom 


sudo reboot


窗口键+回车:多窗口
窗口键+w:删除窗口
窗口键+空格:搜索,如firefox

bspwm 启动快捷键依赖 sxhkd 热键配置

# make sxhkd reload its configuration files: 重载配置 
super + Escape
    pkill -USR1 -x sxhkd

# quit/restart bspwm  q 退出 bspwm, r 重启 bspwm
super + alt + {q,r}
    bspc {quit,wm -r}

bspwm 配置

实际上是 bash 脚本

jasper@jasper-arch ~/.c/bspwm> cat bspwmrc 
#! /bin/sh

pgrep -x sxhkd > /dev/null || sxhkd &

bspc monitor -d I II III IV V VI VII VIII IX X # 启动 10 个终端

bspc config border_width         2 #边框宽度
bspc config window_gap          12

bspc config split_ratio          0.52
bspc config borderless_monocle   true
bspc config gapless_monocle      true

bspc rule -a Gimp desktop='^8' state=floating follow=on
bspc rule -a Chromium desktop='^2'
bspc rule -a mplayer2 state=floating
bspc rule -a Kupfer.py focus=on
bspc rule -a Screenkey manage=off

焦点窗口颜色:

jasper@jasper-arch ~/.c/bspwm> cat bspwmrc 
#! /bin/sh

pgrep -x sxhkd > /dev/null || sxhkd &

bspc monitor -d I II III IV V VI VII VIII IX X # 启动 10 个终端

bspc config border_width         2 #边框宽度
bspc config window_gap          12 #窗口间间距

#颜色 #红绿蓝
#normal_border_color  未聚焦窗口边框的颜色
#focused_border_color 聚焦监视器的聚焦窗口边框的颜色。
#bspc config normal_border_color \#FFFF00   #黄色为红色最大+绿色最大
#bspc config focused_border_color \#00FF00  #绿色

bspc config split_ratio          0.52
bspc config borderless_monocle   true
bspc config gapless_monocle      true

bspc rule -a Gimp desktop='^8' state=floating follow=on 
bspc rule -a Chromium desktop='^2' #打开 chromium 时在第2个显示终端
bspc rule -a mplayer2 state=floating
bspc rule -a Kupfer.py focus=on
bspc rule -a Screenkey manage=off

sxhkd 格式

# key chord
Super + <key>

# key chord chain
Super + <key> ; <key>
super + e ; {p,t}
        { \
        pkill -x melonpanel && melonpanel, \
        tempusmenu, \
        }

此模式意味着您首先按住Super,然后按e,然后松开Super并按分号右侧定义的任意键;来调用相应的命令。为此, super + e ; t将执行tempusmenu.

sxhkd 示例配置解析

jasper@jasper-arch ~/.c/sxhkd> cat sxhkdrc
#
# wm independent hotkeys :sxhkd 自己的配置
#

# terminal emulator : mod4 + 回车,打开 一个默认终端,默认是 urxvt,可以换成其它 
super + Return
    terminator

# program launcher : mod4+空格,打开菜单。这里 @ 表示 mod4+空格松开后才执行打开对应功能。man sxhkd 有解释
super + @space
    dmenu_run #默认在窗口上面显示,dmenu_run -b 在窗口下面显示 

# make sxhkd reload its configuration files: 重载配置 
super + Escape
    pkill -USR1 -x sxhkd

#
# bspwm hotkeys :bspwm 配置
#

# quit/restart bspwm  q 退出 bspwm, r 重启 bspwm
super + alt + {q,r}
    bspc {quit,wm -r}

# close and kill :mod4+w 关闭窗口,mod4+shift+w 杀死 bspwm 进程
super + {_,shift + }w
    bspc node -{c,k}

# alternate between the tiled and monocle layout : tiled 平铺模式 和 单窗口模式切换
super + m
    bspc desktop -l next

#边框颜色,man bspwm,在 ~/.config/bspwm/bspwmrc 中设置 
#颜色 #红绿蓝
#normal_border_color  未聚焦窗口边框的颜色
#focused_border_color 聚焦监视器的聚焦窗口边框的颜色。
#bspc config normal_border_color \#FFFF00   #黄色为红色最大+绿色最大
#bspc config focused_border_color \#00FF00  #绿色

# send the newest marked node to the newest preselected node : 标记的窗口送到最新预选的节点,后面细讲
super + y
    bspc node newest.marked.local -n newest.!automatic.local

# swap the current node and the biggest window :与最大的显示屏窗口交换
super + g
    bspc node -s biggest.window

#
# state/flags 状态
#

# set the window state : tiled平铺,pseudo_tiled伪平铺(像个浮动窗口) floating悬浮(前置到最前面固定)  fullscreen 全屏
super + {t,shift + t,s,f}
    bspc node -t {tiled,pseudo_tiled,floating,fullscreen}

# set the node flags :marked 标记(和预选一起讲解),locked 是否锁定,锁定则不可被关闭,sticky 粘住,永远跟在眼前(不常用),
# private 私有,不被打扰,即不在本侧窗口分屏等。
super + ctrl + {m,x,y,z}
    bspc node -g {marked,locked,sticky,private}

#
# focus/swap
#

# focus the node in the given direction : 对应vim中的k上 j下 h左 l右切换焦点 ,shift 和相应方向上的窗口交换位置
super + {_,shift + }{h,j,k,l}
    bspc node -{f,s} {west,south,north,east}

# focus the node for the given path jump :使用 bspwm 的二叉树转移焦点,https://github.com/baskerville/bspwm#manual-mode
#parent 选中当前选中窗口的父窗口,brother 选中当前选中窗口的兄弟容器,comma 逗号 第一个窗口,period 句号 第1个窗口的同级窗口
super + {p,b,comma,period}
    bspc node -f @{parent,brother,first,second}

# focus the next/previous window in the current desktop : 焦点轮换到下一个窗口、上一个窗口
super + {_,shift + }c
    bspc node -f {next,prev}.local.!hidden.window

# focus the next/previous desktop in the current monitor :barcket 中括号[]左右表示切换到前或下一个显示屏
super + bracket{left,right}
    bspc desktop -f {prev,next}.local

# focus the last node/desktop :grave 是 ` 号表示返回上次编辑的窗口,tab键切上次编辑的显示屏
super + {grave,Tab}
    bspc {node,desktop} -f last

# focus the older or newer node in the focus history :按时间正向反向回溯窗口
super + {o,i}
    bspc wm -h off; \
    bspc node {older,newer} -f; \
    bspc wm -h on

# focus or send to the given desktop :切换显示屏,shift 把当前窗口送到哪个显示屏
super + {_,shift + }{1-9,0}
    bspc {desktop -f,node -d} '^{1-9,10}'

#
# preselect 预选
#

# preselect the direction :预选窗口
super + ctrl + {h,j,k,l}
    bspc node -p {west,south,north,east}

# preselect the ratio :预选时加上比例,1 为 0.1 个窗口
super + ctrl + {1-9}
    bspc node -o 0.{1-9}

# cancel the preselection for the focused node :取消当前窗口预选
super + ctrl + space
    bspc node -p cancel

# cancel the preselection for the focused desktop :取消当前平铺面预选
super + ctrl + shift + space
    bspc query -N -d | xargs -I id -n 1 bspc node id -p cancel

#预选好了位置,可以进行一些操作:
#如 super+回车 就会在位置处打开终端,super+空格 打开应用
#如 标记的窗口(可以是浮动窗口)送到最新预选的节点,super + ctrl + m 标记窗口,再找个窗口  super + ctrl + h,super + ctrl + 6, 预选窗口,super + y 送预选窗口

#
# move/resize  改变大小
#

# expand a window by moving one of its side outward : 扩大窗口
super + alt + {h,j,k,l}
    bspc node -z {left -20 0,bottom 0 20,top 0 -20,right 20 0}

# contract a window by moving one of its side inward :缩小窗口
super + alt + shift + {h,j,k,l}
    bspc node -z {right -20 0,top 0 20,bottom 0 -20,left 20 0}

# move a floating window :通过按住鼠标右键放大缩小窗口,通过按住鼠标左键移动窗口
super + {Left,Down,Up,Right}
    bspc node -v {-20 0,0 20,0 -20,20 0}

配置自定义的 sxhkd 热键需要阅读 bspwm 文档 man bspwm

bar

polybar

https://wiki.archlinux.org/title/Polybar

#安装 polybar 和字体图标
yay -S polybar pacman-contrib ttf-font-awesome siji-git pulseaudio alsa-utils

#配置
mkdir ~/.config/polybar
curl https://gitlab.com/eflinux/polybar/-/raw/master/.config?ref_type=heads -o ~/.config/polybar/config

vim ~/.config/polybar/config
modules-right = filesystem pulseaudio xkeyboard memory cpu eth  date powermenu
[module/bspwm]
label-separator = | #取消注释 

#结合 bspwm
vim $HOME/.config/polybar/launch.sh
#!/bin/bash

# Terminate already running bar instances
killall -q polybar
# If all your bars have ipc enabled, you can also use
# polybar-msg cmd quit

# Launch Polybar, using default config location ~/.config/polybar/config.ini
polybar example 2>&1 | tee -a /tmp/polybar.log & disown #mybar改为example

echo "Polybar launched..."

chmod +x ~/.config/polybar/launch.sh

vim ~/.config/bspwm/bspwmrc
$HOME/.config/polybar/launch.sh #加在bspc启动前
面板-lemonbar

版本差异

> paru  lemonbar

 1 aur/lemonbar 1.4-1 官方发行版本
    A featherweight, lemon-scented, bar based on xcb.
 2 aur/lemonbar-git 官方 git 版本
    A featherweight, lemon-scented, bar based on xcb.
 3 aur/lemonbar-xft-git 支持图标字体的版本
    A lightweight xcb based bar with ported xft support.
 4 aur/lemonbar-sm-git 支持 xft 同时支持选择多屏幕的功能
    Fork of lemonbar, with xft support and the ability to select monitor.
 5 aur/lemonbar-clicks-git 支持更多的点击事件,官方最多支持 10 点击事件 
    A lightweight xcb based bar with ported xft support, support to specify outputs, support for unlimited 
    clickable areas and support for longer input.
 6 aur/weather-bar 
    Weather plug-in for polybar, lemonbar, and others. With geolocation, Weather Underground, and NOAA support
 7 aur/lemons 0.6.3-1 脚本
    Output script for lemonbar
 8 aur/thonkbar-git r46.29a2364-1 [+1 ~0.09]
    minimalist block based lemonbar wrapper
 9 aur/barpyrus-git r117.a50f18b-3 [+0 ~0.00]
    A python wrapper for lemonbar/conky
10 aur/lemonbar-ucs4-git 支持 ucs4 编码
    A lightweight xcb based bar with ported xft and ucs4 support.

安装 paru -S lemonbar-xft-git

配置文件位置随意指定:如 ~/.config/lemonbar

启动 lemonbar

运行原理:

lemonbar 接收标准输入输出再展示出来。

命令行参数:https://github.com/LemonBoy/bar

-p 保持在屏幕上,不让输入完就退出。 echo 1111111111|lemonbar -p

-f 修改字体。 fc-list 查看字体,如 echo 1111111111|lemonbar -p -f 'Adobe Courier'-19 使用 Adobe Courier 字体,字体大小为 19 号

-B 修改背景色 hex format (#aarrggbb, #rrggbb, #rgb).

-F 修改前景交通

-b bar 位置在底部

-g widthxheight+x+y: bar 的宽度高度,xy 轴坐标

-d 防止被覆盖,告诉窗口管理器这是个 bar而不是应用程序

-n 设置 bar 窗口名称

-u 加下划线

-U 设置下划线颜色

# 黄色背景,蓝字,100宽最左侧的 bar
echo 1111111111|lemonbar -p -f 'Adobe Courier'-19 -B '#ffff00' -F '#00ff00' -g 100x20+0+0

格式化输出: 在 %%{} 填入操作动作

# aaa字串位置黄色背景,bb字串绿色背景,蓝字,aaa 中间 a 为绿字,100宽最左侧的 bar
echo "%{B#ffff00}a%{F#00ff00}a%{F}a%{B}%{B#00ff00}bb%{B}"|lemonbar -p -f 'Adobe Courier'-19  -F '#00ff00' -g 100x20+0+0

其中点击事件 Abutton:command: 比较重要,A 左键,A2 中键,A3 右键,A4 向上滚,A5 向下滚

其它小工具

锁屏
  • betterlockscreen
  • feh

范例:betterlockscreen

yay -S betterlockscreen
N
yay -S xdpyinfo xrandr bc feh

#从浏览器下载一张壁纸 china 4k wallpapers
betterlockscreen -u Downloads/a.jpg  #缓存
betterlockscreen -l dimblur #执行锁屏,锁屏后需要输入密码解锁
终端显示

https://wiki.archlinux.org/title/Powerline

sudo pacman -S neofetch powerline
vim ~/.bashrc #追加内容

neofetch
powerline-daemon -q
POWERLINE_BASH_CONTINUATION=1
POWERLINE_BASH_SELECT=1
. /usr/share/powerline/bindings/bash/powerline.sh
多媒体播放器
sudo pacman -S mpv
paru -S youtube-dl

Guix

自由的GNU/Linux发行版: https://www.gnu.org/distros/free-distros.html

Guix System 是一个基于 GNU Guix(发音是“geeks”)的先进 GNU/Linux 发行版,这是 GNU 系统的一个纯功能性包管理器。

官方地址: https://guix.gnu.org/

虚拟机安装Guix

iso镜像下载:https://guix.gnu.org/zh-CN/download/

  • Locale language: English
  • Locale location: Hong Kong
  • GNU Guix install: Graphical install using a terminal based interface
  • Timezone: Asia–Hong Kong
  • Layout: English (US)
  • Variant: English (US)
  • Hostname: 主机名,随意。 jasper
  • Substitute server discovery: Disable
  • System administrator password: 填入密码
  • User creation: 添加普通用户
  • Desktop environment: 桌面环境可选,这里用GNOME
  • Network service: 加上 OpenSSH
  • Printing and document service: 不选
  • Partitioning method: 磁盘整个 Guided - using the entrie disk
    • Partition table: gpt
    • Partition scheme: 整个分区Everthing is one partition
  • Configuration file: 刚设置生产的配置文件,不修改的话直接 OK
    • 可配置国内源
  • 等待20分钟左右,重启 reboot

默认程序在

  • /run/current-system/profile/bin
  • /run/current-system/profile/sbin
  • ~/.guix-profile/bin

软件包配置文件

  • channels 用于获取软件包定义和更新的源
  • subsitute 获取预编译二进制包

配置国内软件包源:

channels:

vi ~/.config/guix/channels.scm

(list (channel
       (inherit (car %default-channels))
       (url "https://mirror.sjtu.edu.cn/git/guix.git")))

Substitute 镜像

#方法1环境变量
export GUIX_BUILD_OPTIONS="--substitute-urls=https://mirror.sjtu.edu.cn/guix"

guix 使用

#更新源
guix pull

#安装软件
guix install curl

#列出包变化
guix package -l

MacOS

UTM for MacOS

https://mac.getutm.app/

UTM 是一款功能强大的 QEMU 虚拟机管理程序和模拟器,它允许你在任何配置Apple Silicon 的Mac上的虚拟机(VM)内运行具有OpenGL硬件加速的Linux 。UTM 的 macOS 版支持 Apple Silicon 和 Intel 双架构,和 iOS/iPadOS 版一样完全免费

安装 UTM

https://mac.getutm.app/ 选择Download

双击安装。

UTM 网络

虚拟机在停止状态下才能编辑网络。

网络模式分4种:

  • 模拟VLAN
  • 共享网络(默认Nat)
  • Host Only
  • 桥接(高级)
Share Network (Nat) has access internet to WAN
Ubuntu1 192.168.64.4
Ubuntu2 192.168.64.5

---

Host Only (No connection to WAN)
Can connect via ssh on LAN
Ubuntu1 10.37.129.2
Ubuntu2 10.37.129.3

---

Bridged (Advanced) access to WAN
Ubuntu1 10.10.2.91
Ubuntu2 10.10.2.92
镜像

vmware 格式文件转 utm 能使用的格式

qemu-img convert -p -O qcow2 Renmux-disk1.vmdk Renmux.qcow2

在 Mac(M1, M2, M3, M4) 上使用 UTM 安装Kali Linux

https://www.kali.org/docs/virtualization/

utm安装kali参考:https://www.kali.org/docs/virtualization/install-utm-guest-vm/

视频:https://www.youtube.com/watch?v=9zdjQ9w_v_4

https://www.kali.org/ 选择download

我们这里下载的是 Kali Linux 2023.2 版架构Apple Silicon(ARM64)名为Installer的裸机镜像。

为Kali创建虚拟机

  • 打开UTM
  • 创建一个虚拟机,推荐选择与主机架构一致的虚拟化主机。
  • 操作系统选择Linux
  • 在 Linux 选项都不勾选,我们将使用 QEMU 虚拟机管理程序,而不是不稳定的苹果虚拟机管理程序。
    • 启动ISO镜像中选择下载好的镜像
  • 分配4G内存、CPU 4核心,同时开启OpenGL硬件加速
  • 磁盘空间至少30G
  • 共享目录,这里选择了桌面
  • 概述中给虚拟主机命名,保存
  • 点击右上角设置,在"设备"下添加一个串行端口。如果不这样做,安装程序将无法运行。
    • 字体大小可以设置为20
  • 启动虚拟机
    • 启动时有2个窗口,选择"terminal 1"窗口
    • Ctrl + Option 将光标控制权返回给主机操作系统

kali安装

  • 安装界面,选择Install,当前不适用于UTM的图形安装
    • 使用键盘的方向键、TAB操作
  • 语言:English
  • 位置:other ,中国在other中
    • 大陆或地区:Asia 亚州
    • 国家或地区:China
    • 本地字符: en_US.UTF-8
  • 键盘:American English
  • 主机名:kali 默认。可修改
  • 域名:空
  • 账号密码:自定义
  • 硬盘分区:默认一整块,一路回车,选择YES确认分区信息
  • 软件选择:默认 TAB 回车,等待安装完毕。
    • 默认为 xface 终端
  • 软件安装完毕后,关闭虚拟机
  • 转到主界面将虚拟机CD/DVD的ISO镜像清除
  • 右上角设置,从设备中将串行端口删除,保存
  • 启动虚拟机,等待10秒即可看到登录屏幕
    • 打开终端窗口查看版本,cat /etc/os-release

自动dhcp 地址

sudo vim /etc/network/interfaces
auto eth0
#iface eth0 inet static #配置使用静态地址
#address 10.0.2.2  #配置固定ip
#netmask 255.255.255.0
#gateway xxxx

#dns
sudo vim /etc/resolv.conf
nameserver 8.8.8.8

systemctl restart networking

软件更新:

sudo apt update
sudo apt upgrade
sudo apt install neofetch htop

# 安装 SPICE 工具,以便可以共享剪贴板并调整显示大小
sudo apt install spice-vdagent spice-webdavd

#安装ssh
apt install -y openssh-server
systemctl enable --now ssh

#vim
apt install -y vim

切换工作区:

Ctrl+Alt+方向键

Ctrl+Alt+123456指定工作区

在 Mac(M1, M2, M3, M4) 上使用 UTM 安装window11

UTM 缺点没有快照功能,需要自己输入 qemu 命令

UTM(download):https://mac.getutm.app/

MY ISO FILE OF WINDOWS 11: https://www.mediafire.com/file/0m96d95bw65gou7/22621.1.220506-1250.NI_RELEASE_CLIENTMULTI_A64FRE_EN-US.ISO

Windows 11 UTM GUIDE:https://docs.getutm.app/guides/windows/

视频参考:

安装UTM

略,参考Kali中讲解

新建windows11虚拟机

  • 打开UTM
  • 创建一个虚拟机,推荐选择与主机架构一致的虚拟化主机。
  • 操作系统选择Windows
  • 在 Windows 选项都勾选
    • 导入VHDX映像
      • 启动ISO镜像中选择下载好的镜像
  • 分配4G内存、CPU 4核心
  • 共享目录,这里选择了桌面
  • 概述中给虚拟主机命名,保存
  • 启动虚拟机
    • Ctrl + Option 将光标控制权返回给主机操作系统

安装windows11

  • Cuntry or region: United States
  • keyboard: US
  • connect you to a network:
    • Press "Fn+Shift+F10"
      • cmd:
        • oobe\bypassnro <ENTER>
    • I don't have internet
  • review the License
  • your name: xxx
  • setting for your device: Next…
  • 桌面图标
    • 桌面右键 Personalize –> Themes –> Desktop icon settings
    • 勾选Computer 应用 Apply
  • Open CD Drive(D:)
    • install Spice tool. reboot

浏览器 Edge

  • Start without your data
  • Confirm and start browsing
  • 浏览器上输入 google.com 正常打开

激活:管理员打开cmd窗口

KMS client activation

C:\Windows\System32>slmgr /ipk W269N-WFGWX-YVC9B-4J6C9-T83GX

C:\Windows\System32>slmgr /skms kms9.MSGuides.com

C:\Windows\System32>slmgr /ato

在 Mac(M1, M2, M3, M4) 上使用 UTM 安装window7-x86

  • 下载UTM
  • 下载utm win7配置
    • utm 首页点击 GALLERY 选择 windows-7 x86
    • 点击 Download 下载,得到 Windows 7.utm
  • 下载 SPICE tools ISO
  • 下载windows7

安装UTM

双击安装

新建windows7虚拟机

  • 双击使用 Windows 7.utm 模板
  • 修改内存为8g
  • 修改磁盘大小 60G
  • 取消

安装windows7

  • 下一步
  • 安装 SPICE tools
    • 点击 utm 界面右上角的 Drive image options 更改 iso 为 spice tools 的 iso
    • 在弹出窗口中打开 CD 驱动器文件夹,选择 spice tools 安装程序双击安装
    • 安装过程一直下一步就行,弹窗中选择 始终安装这个软件
    • 点击 utm 界面右上角的 Drive image options 弹出光盘
  • 重启虚拟机
  • 如果无法联网
    • 打开右下角图标 打开网络和共享中心 选择 更改适配器设置
    • 右击 本地连接 选择属性,把 ipv4 的 dns 改成 8.8.8.8 保存

VMware Fusion for MacOS

在Mac(M1, M2, M3, M4) 上使用 VMware Fusion 安装window11

视频参考:

Downloads:

Download Windows 11 ARM ISO

  • 下载 Parallels
    • 官方页面选择 Download free trial 进入下载页面,下载
    • 安装:双击安装,按提示来,同意并开通对应权限
    • 安装好后,点从 Microsoft 获取 Windows 11,点继续,就会下载arm 平台iso镜像,后面会用到
      • 镜像位置:~/Downloads/22621.1702.230505-1222.ni_release_svc_refresh_CLIENTCONSUMER_RET_A64FRE_zh-cn.iso
    • 下载时自动安装 win11 系统同时进行,我们只需要iso镜像,所以快速退出安装即可
      • 左上角菜单退出安装win11
        • 注意:只需要iso镜像,快速退出。自动安装win11后需要登录账号才能退出win11
    • 删除软件,同时删除 ~/Parallels 目录

Install Windows 11 for ARM using VMware Fusion

  • 下载好软件,输入密钥,过程略
  • 打开VMware
  • 将iso镜像拖到界面,点继续
  • 引导固件默认UEFI,点继续
  • 加密,自动加密,点继续
  • 自定义配置,可以改位置,这里默认。点完成。菜单栏关机
  • 点上方菜单栏"虚拟机"的设置选项
    • 处理器和内存:4核心
  • 菜单栏虚拟机选项启动虚拟机,回车进入安装画面

安装windows11-初始化

  • 选择语言,下一步
  • 点开始安装
  • 密钥,选择我没有产品密钥
  • 选择要安装的操作系统,这里默认家族版,下一步
  • 同意协议,下一步
  • 自定义仅安装windows
  • 磁盘位置默认,下一步
  • 等待复制文件、安装更新,自动重启虚拟机

安装windows11-配置

  • Cuntry or region: United States
  • keyboard: US
  • connect you to a network:
    • Press "Fn+Shift+F10"
      • cmd:
        • oobe\bypassnro <ENTER>
    • I don't have internet
  • review the License
  • your name: xxx
  • setting for your device: Next…
  • 桌面图标
    • 桌面右键 Personalize –> Themes –> Desktop icon settings
    • 勾选Computer 应用 Apply
  • VMware tools

    • 虚拟机缺少网络驱动,需要安装 VMware tools
    • 搜索栏中搜索 powershell ,用管理员身份运行,并执行如下命令
    Set-ExecutionPolicy RemoteSigned
    # 更改执行策略,A 全部
    
    • 菜单栏虚拟机选项中选择安装 VMware tools
      • 打开对应DVD驱动器, setup 处右键以 powershell 运行

共享文件夹

参考:https://zhuanlan.zhihu.com/p/452412091

  • 共享文件夹
    • 首先打开设置 > 网络和 Internet > 高级网络设置 > 高级共享设置
    • 将对应的“网络发现”和“文件和打印机共享”两个开关打开。
    • wind10 右键要共享的文件夹属性,如桌面
      • 点击“高级共享”按钮,权限按钮所有人允许
      • 确定
    • cmd 输入命令 ipconfig 查看ip
    • macOS 访达(Finder)下,执行菜单命令:前往 > 连接服务器
      • 输入smb://,接着输入刚才记下的 IP 地
      • 填写 window 账号密码
  • 使用远程桌面
    • 使用第三方向日葵、TeamViewer、ToDesk的忽略
    • Windows 中打开“设置”,在“系统”下找到“远程桌面”,将远程桌面的开关打开
    • 下载最新的 Microsoft Remote Desktop
    • 双击打开安装器安装后,运行 Microsoft Remote Desktop。