坚持用 清晰易懂的图解 + 代码语言,让每个知识点变得简单!
🚀呆头个人主页详情
🌱 呆头个人Gitee代码仓库
📌 呆头详细专栏系列
座右铭: “不患无位,患所以立。”
在这里插入图片描述


Linux的生态与软件安装

  • 前言
  • 目录
  • 一、软件包管理器
    • 1.什么是软件包
    • 2.Linux软件生态
      • 1)开源精神的本质驱动力
      • 2)商业公司的隐藏收益模型
      • 3)云服务器免费资源的商业逻辑
      • 4)个人开发者的收益途径
  • 三、服务器如何找到对应的软件包?
    • 1. Linux下提供了对应的配置文件
    • 2. 镜像源
    • 3. 镜像源更新
      • 1)国内常用镜像源网址
      • 国内常用软件源镜像站汇总及配置示例
    • 📌 国内主流镜像站推荐
    • ⚙️ 配置示例
      • 1. Ubuntu/Debian (apt)
      • 2. CentOS/RHEL (yum/dnf)
      • 3. Python (pip)
      • 4. Node.js (npm)
      • 5. Docker
    • 📢 注意事项
  • 四、软件包依赖问题
      • 📌 软件包依赖问题类型与解决方案对比表
      • 🛠️ 依赖问题解决工具对比
      • 💡 使用建议
      • 📚 扩展阅读
  • 五、软件安装与管理指南
    • 1. 安全软件安装实践
        • 1) 以root身份安装,普通用户运行的最佳实践
        • 2)加固版yum三板斧
    • 2. 趣味软件安全安装指南
      • 1) 会跑的小火车(sl)
      • 2) 会说话的小牛(cowsay)
    • 3. 推荐的其他趣味软件
    • 4. 安全使用提醒

前言

🚀 欢迎来到《Linux系统实战》!
这里是命令行到内核的跃迁基地,也是你从"rm -rf恐惧症"到"权限管理大师"的修炼场。

🔍 专栏特色

  • 图解+实战:用最直观的方式拆解Linux核心机制
  • 从应用到底层:覆盖Shell脚本、系统调优、内核模块开发
  • 真实场景:每篇附服务器运维/开发中的实际问题解决方案

💡 学习建议
1️⃣ 先动手尝试(搞崩了也没关系)
2️⃣ 对照文章分析原理
3️⃣ 用文末【实战任务】巩固技能

📌 Linux经典名言
“Linux不是背出来的,是在一次次Permission denied中练出来的!”

(正文开始👇)


目录

一、软件包管理器

1.什么是软件包

软件包软件包管理器, 就好比 “App”“应用商店” 这样的关系.
在这里插入图片描述

  • 在Linux下安装软件, ⼀个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序.
  • 但是这样太麻烦了, 于是有些⼈把⼀些常⽤的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在⼀个服务器上, 通过包管理器可以很⽅便的获取到这个编译好的软件包, 直接进行安装。
  1. 程序源码安装

自己写对应的源代码,等等,安装到Linux服务器下。

  1. rpm包安装

RPM(Red Hat Package Manager)安装方式一般适用于安装单个软件包,而不会自动解决依赖问题。如果软件包依赖其他库或软件,手动下载并安装所有依赖包是必要的。相比之下,包管理器(如 yum 和 apt)则能自动解决依赖问题,并下载、安装所需的依赖项,这使得管理软件更为便捷。

  1. 包管理器安装——yum/apt

通过包管理器安装,例如 yum(CentOS/Red Hat)或 apt(Ubuntu/Debian)。这些工具自动处理依赖关系,例如 yum install package 或 apt install package。


2.Linux软件生态

问:什么是好的操作系统?

生态系统好

在这里插入图片描述

使用的客户群体越多,反而能证明他的生态系统越好!


那什么是生态系统?
操作系统的生态是指围绕某个操作系统所形成的软件工具开发者用户社区。不同的 Linux 操作系统如CentOS、Ubuntu 以及编辑工具 Kile 都有各自独特的生态系统,吸引了不同的用户群体。

  • CentOS
  1. 生态:CentOS 是一个面向企业的开源 Linux 操作系统,与 Red Hat Enterprise Linux (RHEL) 兼容。
  2. CentOS 提供稳定、可靠的环境,更新周期较长。
  3. 选择人群:企业用户、服务器管理员以及需要高稳定性和长期支持的用户,适合生产环境中的服务器部署和企业级应用。
  • Ubuntu
  1. 生态:Ubuntu 基于 Debian,拥有庞大的社区支持和丰富的软件库。它更新频繁,用户界面友好,是桌面端的热门 Linux 发行版。
  2. 选择人群:个人用户、开发者以及 Linux 初学者。因其使用便捷和社区支持广泛,适合日常办公、开发和学习 Linux。
  • Kile
  1. 生态:Kile 是基于 KDE 桌面环境的 LaTeX 编辑器,专为 Linux 系统设计,提供了丰富的 LaTeX 文档编辑和排版功能。
  2. 选择人群:科研人员、学生和学术工作者。Kile 为需要高质量文档排版的用户提供了强大的编辑工具,在 Ubuntu 等 Linux 发行版中使用广泛。

为什么会有⼈免费特定社区提供软件,还发布?还提供云服务器让你下载?

在开源社区和免费软件生态中,企业和个人愿意免费提供软件、搭建社区甚至提供云服务器资源,背后有着复杂的动机和商业模式。以下是深度解析,适合用于你的技术博客:


1)开源精神的本质驱动力

  1. 技术理想主义

    • 许多开发者信奉"信息共享"理念(如GNU运动),认为软件应像科学知识一样自由传播
    • 典型案例:Linux内核开发者中70%贡献者来自志愿者(Linux基金会数据)
  2. 协作开发的飞轮效应

    • 开源项目通过社区贡献实现快速迭代
    • 例如:VS Code通过开源插件生态成为最流行IDE(2023年Stack Overflow调查)

2)商业公司的隐藏收益模型

  1. 开源核心+商业增值(Open-Core)

    • 提供免费基础版,通过企业版功能/支持服务盈利
    • 典型案例:
      • Red Hat(RHEL免费版→付费支持)
      • MongoDB(社区版→Atlas云服务)
  2. 生态锁定战略

    • 通过免费工具培养用户习惯,后续转化商业产品
    • 例如:
      • GitLab CE→EE版本
      • Docker社区版→企业版
  3. 开发者关系投资

    • 培养潜在人才和客户(2022年GitHub调查显示:82%企业更倾向采用员工参与过的开源技术)

3)云服务器免费资源的商业逻辑

  1. 获客成本优化

    • 提供免费云资源(如AWS Free Tier)的获客成本比广告低60%(Bain & Company研究)
  2. 数据资产沉淀

    • 用户行为数据可优化产品(如镜像下载量决定优先维护哪些版本)
  3. 混合云导流

    • 通过免费社区版吸引用户,最终引导至付费云服务
    • 典型案例:
      • Canonical的Ubuntu→AWS Marketplace镜像
      • Elasticsearch开源→Elastic Cloud

4)个人开发者的收益途径

  1. 声誉资本积累

    • 优质开源项目可带来高薪工作机会(Linux基金会报告:开源贡献者薪资平均高23%)
  2. 捐赠与赞助

    • 通过GitHub Sponsors等平台获利(如Vue.js年赞助收入超$100万)
  3. 间接变现

    • 开源项目带动咨询/培训业务(如Redis作者创建咨询公司)

三、服务器如何找到对应的软件包?

1. Linux下提供了对应的配置文件

Linux 系统会在特定的配置文件中指定软件包源的位置,例如 /etc/apt/sources.list(在 Ubuntu/Debian 中)或 /etc/yum.repos.d/(在 CentOS/Red Hat 中)。这些文件包含了软件仓库的 URL 地址,系统根据这些地址下载和更新软件包。
在这里插入图片描述

2. 镜像源

在国内,由于访问国外服务器的限制,直接从国外下载软件可能会有困难。因此,国内的一些公司和开发者建立了镜像源,将国外的软件仓库同步到国内服务器上。这些镜像源大大加速了国内用户下载和更新软件包的速度。例如,清华大学、中科大等机构提供了 Ubuntu 和 CentOS 的镜像源,方便国内用户的快速访问。
在这里插入图片描述

3. 镜像源更新

镜像源是对官方软件仓库的副本,定期同步官方仓库以保证最新的软件版本和安全更新。国内镜像源通过自动更新脚本定期检查并同步官方仓库的内容,从而提供快速、稳定的下载服务。

1)国内常用镜像源网址

国内常用软件源镜像站汇总及配置示例

在国内访问官方软件源(如 aptyumpipnpm 等)可能会遇到速度慢或连接不稳定的问题。使用国内镜像源可以显著提升下载速度。以下是主流镜像站的地址及配置方法。


📌 国内主流镜像站推荐

镜像站名称网址支持源类型
阿里云https://mirrors.aliyun.comyum apt pip npm docker maven
腾讯云https://mirrors.cloud.tencent.comyum apt pip npm
华为云https://mirrors.huaweicloud.comyum apt pip npm docker
清华大学https://mirrors.tuna.tsinghua.edu.cnyum apt pip npm docker maven
中科大https://mirrors.ustc.edu.cnyum apt pip npm docker

⚙️ 配置示例

1. Ubuntu/Debian (apt)

# 备份原配置
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak# 替换为阿里云源(Ubuntu 20.04 示例)
sudo sed -i 's|http://.*archive.ubuntu.com|https://mirrors.aliyun.com|g' /etc/apt/sources.list
sudo sed -i 's|http://.*security.ubuntu.com|https://mirrors.aliyun.com|g' /etc/apt/sources.list# 更新索引
sudo apt update

2. CentOS/RHEL (yum/dnf)

# 备份原配置
sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak# 使用阿里云源(CentOS 7 示例)
sudo curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo# 清理缓存并更新
sudo yum clean all
sudo yum makecache

3. Python (pip)

# 临时使用清华源
pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple# 永久修改(推荐)
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/

4. Node.js (npm)

# 临时使用淘宝源
npm install --registry=https://registry.npmmirror.com# 永久修改
npm config set registry https://registry.npmmirror.com

5. Docker

# 修改 /etc/docker/daemon.json
{"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn","https://hub-mirror.c.163.com"]
}# 重启Docker生效
sudo systemctl restart docker

📢 注意事项

  1. 选择最近的镜像(地理位置越近,速度越快)
  2. 定期更新(部分镜像站可能同步延迟)
  3. 企业环境建议自建 NexusHarbor 私有源

四、软件包依赖问题

在这里插入图片描述

软件包依赖问题是指在安装或更新一个软件包时,系统发现该包需要其他未安装的包才能正常运行。这个问题在 Linux 系统中很常见,因为许多软件包之间存在依赖关系。

以下是整理的软件包依赖问题类型及解决工具的对比表格:


📌 软件包依赖问题类型与解决方案对比表

依赖类型定义典型报错示例解决方案相关工具
直接依赖软件A必须依赖软件B才能运行(如视频播放器需要解码器)Error: PackageA requires PackageB but it is not installed自动安装缺失依赖apt install
yum/dnf install
递归依赖依赖链延伸(A→B→C→D)PackageA needs PackageB (>=1.0), but PackageC conflicts with PackageB=2.0递归检查并安装整个依赖链apt-get -f install
dnf deplist
版本冲突软件A需要B的v1,但软件C需要B的v2Cannot install PackageB-1.0 (conflicts with PackageB-2.0 required by PackageC)指定版本安装或使用虚拟环境隔离pip install package==version
conda
循环依赖A依赖B,B依赖C,C又依赖ADependency loop detected: A→B→C→A手动强制安装或联系维护者修复dpkg --force-all
rpm --nodeps
隐式依赖运行时需要的动态库(如.so文件)未声明在包元数据中error while loading shared libraries: libxyz.so.1: cannot open shared object file查找并安装提供该库的包apt-file search
yum provides

🛠️ 依赖问题解决工具对比

工具/技术适用场景关键命令示例优点局限性
APT (Debian/Ubuntu)自动解决Debian系依赖sudo apt --fix-broken install自动处理大部分依赖问题对复杂版本冲突处理有限
YUM/DNF (RHEL/CentOS)解决RPM包依赖sudo yum deplist <package>
sudo dnf install --skip-broken
支持模块化依赖管理企业版需订阅
PIP (Python)Python包依赖管理pip install --ignore-installed <package>灵活指定版本全局环境易冲突
Docker隔离依赖环境docker run -it ubuntu:22.04 bash彻底避免宿主机依赖污染资源占用较高
Conda科学计算多版本环境conda create -n myenv python=3.8
conda install package=1.2.3
强大的版本隔离能力包数量较官方源少

💡 使用建议

  1. 优先使用包管理器(APT/YUM)自动解决
  2. 复杂冲突尝试:
    • 虚拟环境(Python)
    • 容器化(Docker)
  3. 极端情况
    • 手动编译安装(./configure && make install
    • 联系软件维护者

📚 扩展阅读

  • Debian依赖管理手册
  • RPM依赖解析原理
  • Python虚拟环境最佳实践

五、软件安装与管理指南

1. 安全软件安装实践

1) 以root身份安装,普通用户运行的最佳实践
# 1. 使用root身份安装软件
sudo -i  # 切换到root
yum install -y <package_name># 2. 设置正确的权限
chown -R root:other_group /usr/bin/<program>  # 二进制文件归root所有
chmod 755 /usr/bin/<program>                 # 其他用户可执行但不可修改# 3. 配置sudo规则让other用户无需密码运行
echo "%other_group ALL=(root) NOPASSWD: /usr/bin/<program>" >> /etc/sudoers
2)加固版yum三板斧
操作安全增强命令说明
查看sudo yum --security list updates只显示安全更新
安装sudo yum install --setopt=tsflags=noscripts <package>禁止安装时执行脚本
更新sudo yum update --security仅安装安全更新
删除sudo yum remove --remove-leaves <package>清理无用依赖

2. 趣味软件安全安装指南

1) 会跑的小火车(sl)

# 安装
sudo yum install -y epel-release
sudo yum install -y sl# 安全配置
sudo chmod 755 /usr/bin/sl      # 确保所有用户可执行
sudo chown root:root /usr/bin/sl # 二进制归root所有# 普通用户运行
su - other_user
sl

在这里插入图片描述

2) 会说话的小牛(cowsay)

# 安装
sudo yum install -y cowsay# 创建安全包装脚本
echo '#!/bin/bash
sudo -u nobody /usr/games/cowsay "$@"' | sudo tee /usr/local/bin/safe_cowsay
sudo chmod 755 /usr/local/bin/safe_cowsay# 普通用户使用
safe_cowsay "Hello World"

在这里插入图片描述

3. 推荐的其他趣味软件

软件安全安装方式功能
figletsudo yum install -y figletASCII艺术字生成
lolcatsudo gem install lolcat彩虹色输出
fortunesudo yum install -y fortune-mod随机名言
cmatrixsudo yum install -y cmatrix矩阵数字雨

4. 安全使用提醒

  1. 定期检查setuid/setgid程序:

    sudo find / -perm /4000 -o -perm /2000 -ls
    
  2. 为趣味程序创建专用用户:

    sudo useradd -r -s /sbin/nologin funuser
    sudo chown -R funuser:funuser /usr/games
    
  3. 考虑使用容器运行:

    podman run --rm fedora cowsay "容器内安全运行"
    

通过以上方法,您可以在保持系统安全性的同时,享受Linux的趣味软件带来的乐趣!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/90636.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/90636.shtml
英文地址,请注明出处:http://en.pswp.cn/web/90636.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3.4 安全-分布式-数据库-挖掘

一、数据库的安全数据库里面的安全措施&#xff1a;用户标识和鉴定&#xff1a;用户的账户口令等存取控制&#xff1a;对用户操作进行控权&#xff0c;有对应权限码才能操作。密码存储和传输&#xff1a;加密存储。视图的保护&#xff1a;视图需要授权审计&#xff1a;专门的文…

多线程 Reactor 模式

目录 多线程 Reactor 模式的核心动机 多线程演进方向 多线程 Reactor 模型结构 多线程 EchoServer 实现核心部分 Handler 的多线程化 多线程 Reactor 的三个核心点 本篇文章内容的前置知识为 单线程 Reactor 模式&#xff0c;如果不了解&#xff0c;可点击链接学习 单线程…

[NLP]多电源域设计的仿真验证方法

多电源域设计的仿真验证方法 1. 更复杂的 Testbench 例子(多电源域、复杂低功耗场景) 假设有两个电源域 PD1 和 PD2,分别对应控制信号 pwr_sw_ctrl1、iso_ctrl1、ret_ctrl1 和 pwr_sw_ctrl2、iso_ctrl2、ret_ctrl2,且两域之间有通信。 RTL 端口声明(简化版) module top…

Apache Ignite 中 WHERE 子句中的子查询(Subqueries in WHERE Clause)的执行方式

这段内容是关于 Apache Ignite 中 WHERE 子句中的子查询&#xff08;Subqueries in WHERE Clause&#xff09;的执行方式 的说明。理解这段内容对于编写高效的 SQL 查询、避免性能瓶颈非常重要。下面我将为你 逐句解释并深入理解这段内容。&#x1f9fe; 原文翻译 解释 原文&a…

MySQL(153)如何使用全文索引?

MySQL的全文索引&#xff08;Full-Text Index&#xff09;是一种特殊的索引类型&#xff0c;专门用于加速文本数据的搜索。与普通的B树索引不同&#xff0c;全文索引适用于大文本字段&#xff08;如TEXT、VARCHAR等&#xff09;的全文搜索。它通过构建一个倒排索引&#xff0c;…

微分方程入门之入门之入门,纯笔记

当描述 相对变化量 比 绝对量 更容易时&#xff0c;微分方程就经常用到了。 比如&#xff0c;描述为什么种群数量增加or减少【相对】&#xff0c;比描述为什么它在某个时间点是某个特定值【绝对】更容易。 物理学中&#xff0c;运动经常用力来描述&#xff0c;力–>代表变化…

【C++】简单学——vector类(模拟实现)

模拟实现的准备工作 看源码&#xff0c;了解这个类的大概组成 1.先看成员变量 成员变量的组成是三个迭代器 问&#xff1a;这个iterator内嵌类型究竟是什么&#xff1f;即这个迭代器是什么 迭代器实际就是T* 问&#xff1a;这三个迭代器代表什么意思&#xff1f; 连蒙带猜…

【WRF】根据自动安装脚本安装 WRF / WRF-CHEM等

目录 GitHub 上 WRF 自动安装脚本 ⚙️ 脚本的作用 🖥️ 支持的系统 📦 可安装的 WRF 版本及其选项 ✅ 如何使用(以 WRF 4.6.1 为例) ✅ 依赖库的安装位置 完整安装脚本分析 参考 GitHub 上 WRF 自动安装脚本 GitHub 上的 WRF-Install-Script 项目的 Releases(发布版本…

M²IV:面向大型视觉-语言模型中高效且细粒度的多模态上下文学习

MIV&#xff1a; Towards Efficient and Fine-grained Multimodal In Context Learning in Large Vision-Language Models COLM 2025 why 新兴的研究方向&#xff1a;上下文学习&#xff08;ICL&#xff09;的效果“向量化”&#xff0c;其核心思想是用transformer内部的向量来…

龙迅#LT8711UXD适用于Type-C/DP1.4 /EDP转 HDMI2.0 功能,分辨率高达4K60HZ,可支持HDCP!

1. 描述LT8711UXD 是一款高性能双通道 Type-C/DP1.4 转 HDMI2.0 转换器&#xff0c;旨在将 USB Type-C 源或 DP1.4 源连接到 HDMI2.0 接收器。该LT8711UXD集成了一个符合 DP1.4 标准的接收器和一个符合 HDMI2.0 标准的发射器。此外&#xff0c;还嵌入了两个用于CC通信的CC控制器…

《计算机组成原理与汇编语言程序设计》实验报告一 基本数字逻辑及汉字显示

目 录 一、实验学时 二、实验目的 三、实验要求 四、实验内容 五、实验步骤 1、打开Logisim软件&#xff0c;列出异或逻辑电路真值表&#xff0c;并使用与、或、非基本原件实现异或逻辑电路。 2、打开Logisim软件&#xff0c;列出同或逻辑电路真值表&#xff0c;并使用…

聚焦牛牛道:绿色积分模式如何实现快速发展?

​绿色消费积分政策再次进入大众视野&#xff0c;这种能为企业减轻库存负担、让咨金周转更灵活的促销方式&#xff0c;很快就成了焦点。牛牛道作为积极践行这一政策的平台&#xff0c;凭借其独树一帜的商业模式和运营思路&#xff0c;在短时间内就取得了显著发展。一、牛牛道平…

高频 RFID 赋能工业教学设备教学应用

高频 RFID 赋能工业教学设备教学应用应用背景传统工业教学设备侧重机械原理、电气控制等基础功能演示&#xff0c;缺乏对 RFID 等工业识别技术的具象教学载体。学生在理论学习中难以直观理解 RFID 技术的工业适配逻辑&#xff0c;实训中缺乏设备识别系统的部署、调试经验&#…

Transformer:颠覆NLP的自注意力革命

Transformer:颠覆NLP的自注意力革命 Transformer是自然语言处理领域中极具影响力的深度学习模型架构,以下是对其的详细介绍: 提出背景与应用:2017年,Vaswani等人在《Attention Is All You Need》论文中首次提出Transformer架构,它主要用于处理序列到序列的任务,如机器翻…

基于 KeepAlived + HAProxy 搭建 RabbitMQ 高可用负载均衡集群

基于 KeepAlived HAProxy 搭建 RabbitMQ 高可用负载均衡集群 基于 KeepAlived HAProxy 搭建 RabbitMQ 高可用负载均衡集群实战指南 一、前言 在企业级应用中&#xff0c;消息队列的高可用性是系统稳定性的重要保障。RabbitMQ 作为主流的消息中间件&#xff0c;虽然自身支持…

京东获得JD商品详情 API 返回值说明||京东API接入文档

京东商品详情API返回值核心字段说明一、商品基础信息商品ID&#xff08;skuId/productId&#xff09;唯一标识符&#xff0c;用于定位具体商品或SKU&#xff08;如不同颜色、尺寸的变体&#xff09;。示例&#xff1a;"skuId": "123456789"商品标题&#x…

其他世界的自来水

西欧&#xff0c;北美&#xff0c;亚洲日韩等地区&#xff0c;他们的自来水可以直接饮用以英国为例&#xff1a;自来水的质量可能等同或者有可能超过纯净水&#xff0c;不需要消毒和过滤直接可以饮用。直接从水龙接的水和瓶装纯净水没有什么差别&#xff0c;甚至比瓶装纯净水更…

IO密集型、CPU密集型、负载、负载均衡

0、引入 从宏观上来讲&#xff0c;计算机可以抽象为【输入 > 计算 > 输出】这三部分 输入输出自然就是io&#xff0c;而计算部分自然归cpu管 不同的任务&#xff0c;对io和cpu的依赖程度不同&#xff0c;由此有了cpu密集型任务和io密集型任务 1、IO密集型 更依赖输入…

从甲方的角度看MOM项目成败的原因

关键词&#xff1a;MOM、数字化转型、成败数字化转型中流行这么一句话&#xff1a;SAP项目加班到晚上8点&#xff0c;MOM项目最少到晚上10点。由此可见&#xff0c;MOM项目实施的难度、复杂度。但&#xff0c;为什么MOM难度大&#xff1f;先引入1个故事&#xff1a;1个价值300万…

MySQL操作进阶

系列文章目录 MySQL的基础操作-CSDN博客 目录 系列文章目录 前言 一、数据库的约束 1. 约束类型&#xff1a;not null 2. 约束类型&#xff1a;unique 3. 约束类型&#xff1a;default 4. 约束类型&#xff1a;primary key 5. 约束条件&#xff1a;foreign key 二、表…