系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

UNIX、Linux和GNU简介

Unix 现代操作系统的鼻祖

诞生于1969年的贝尔实验室,由肯·汤普森和丹尼斯·里奇共同创造。
在这里插入图片描述

  • 核心贡献

    • 设计哲学:提出“小即是美”、“一个程序只做一件事并做好”的原则,以及通过管道组合小程序的理念。
    • C语言:丹尼斯·里奇发明了C语言,并用它重写了UNIX内核,使其具备前所未有的可移植性
    • 基础结构:确立了文件系统、进程、权限模型等现代操作系统的基础范式。
    • 分时操作系统: 允许多个用户同时使用计算机资源的操作系统
      它通过合理分配处理器时间,确保每个用户在给定时间内可以访问并使用计算机资源,从而实现多任务处理的能力
  • 商业化与碎片化

    • 80年代,AT&T将UNIX商业化,导致版本分裂成两大主流:伯克利分校的 BSD 和 AT&T的 System V
    • 随之而来的是高昂的授权费,且源代码闭源,严重阻碍了学术和教学研究。

GNU:自由软件的理想国

UNIX 走向封闭后,理查德·斯托曼于1983年发起 GNU计划,目标是创建一个完全自由的、与UNIX兼容的操作系统。

  • 关键贡献

    • 自由软件理念:强调用户有运行、研究、修改和再分发软件的自由。
    • GPL许可证:发明了 GNU通用公共许可证,通过“著佐权”机制,确保自由可以被继承和传递。
    • 核心工具:几乎重写了UNIX的整套基础工具,如GCC编译器、Emacs编辑器、Bash命令行等。
  • 未竟的核心:GNU计划的核心——Hurd 内核,设计过于理想化,迟迟无法稳定可用。到90年代初,GNU拥有了一套完整的操作系统用户态环境,唯独缺一个内核。

Linux:最后那块关键拼图

1991年,芬兰大学生林纳斯·托瓦兹为了在自己的386电脑上学习和使用,编写了一个简单的操作系统内核,取名 Linux。
在这里插入图片描述

  • 历史时刻

    • 林纳斯将Linux内核以 GPL协议 发布。
    • 这完美地补全了GNU计划:Linux内核 + GNU工具集 = 一个完整、自由、稳定的操作系统
  • Linux不是操作系统:严格意义上,“Linux”只是一个内核。我们常说的“Linux系统”,更准确的称呼是 GNU/Linux系统

UNIX、Linux 和 GNU 的核心区别

特性 UNIX GNU Linux
本质 一套专有的操作系统家族 一个自由软件运动和一套工具集 一个开源的操作系统内核
诞生时间 1969年 1983年 1991年
主要发起者 贝尔实验室(AT&T) 理查德·斯托曼 林纳斯·托瓦兹
源代码 历史上开源,后转为闭源/专有 完全开源(GPL协议) 完全开源(GPL协议)
典型产品 macOS(基于BSD UNIX)、Solaris、AIX Ubuntu、Debian、Red Hat 使用的用户态工具 安卓、服务器、嵌入式设备的内核部分
与两者的关系 源头和启发 Linux 系统的用户态环境提供者 需要 GNU 工具才能组成完整系统

一个常见的认知误区
很多人以为 Linux 是 LAMP 服务器、安卓或树莓派上的那个完整系统。实际上,那个系统的内核叫 Linux,而运行在你电脑上让你能输入命令、打开文件、编译程序的那一整套工具(如 ls、cp、gcc、bash 等),绝大部分来自 GNU 项目

这也是为什么自由软件基金会坚持称完整系统为 GNU/Linux

什么是GNU/Linux系统

首先,Linux可划分为以下四部分:

  •  Linux内核
  •  GNU工具
  •  图形化桌面环境
  •  应用软件
    每一部分在Linux系统中各司其职。但就单个部分而言,其作用并不大。展示了各部分是如何协作起来构成整个Linux系统的。
    在这里插入图片描述
深入探究 Linux 内核
林纳斯·托瓦兹在大学时开发了第一版Linux内核,起初他只是想仿造一款Unix系统而已,完成开发工作后,将Linux内核发布到了互联网社区,并征求改进意见。很快,Linus就收到了来自世界各地的学生和专业程序员的各种建议。
如果谁都可以修改内核程序代码,那么随之而来的将是彻底的混乱。Linus担当起了所有改进建议的把关员。能否将建议代码并入内核完全取决于Linus。时至今日,这种概念依然在Linux内核代码开发过程中沿用,不同的是,现在是由一组开发人员来做这件事,而不再是Linus一个人。

内核主要负责以下四种功能:
 系统内存管理
 软件程序管理
 硬件设备管理
 文件系统管理

GNU/Linux 系统的具体发行版的区别

一个完整的 GNU/Linux 系统 = Linux 内核 + GNU 工具集 + 包管理器 + 桌面环境/应用软件 + 特定的系统配置。我们将完整的Linux系统包称为发行版。

不同的发行版,就是把这些组件以不同的方式组合起来,并加入各自的“哲学”和“目标”。这就好比都是汽车,但家用轿车、越野车、赛车等,在底盘、引擎调校、内饰上完全不同。

发行版的核心区别维度:包管理方式、发布周期、目标用户、商业支持。

按家族分类:

  • Debian 家族(以稳定性著称)

    • 包管理工具:dpkg / apt(使用 .deb 软件包)。
    • 代表发行版:Debian、Ubuntu、Linux Mint等
      • Debian:被称为“通用操作系统”。极其重视稳定和自由软件规范。有三个分支:稳定版(软件较旧但几乎不出错)、测试版、不稳定版。适合服务器或对稳定性有绝对要求的用户。
      • Ubuntu:基于 Debian 不稳定版,但做了大量易用化改进。拥有庞大的社区和商业支持(Canonical公司)。默认使用 GNOME 桌面,软件更新较快,对硬件驱动支持友好,是目前新手最推荐的发行版之一。
      • Linux Mint:基于 Ubuntu,但更贴近传统桌面习惯(如提供类 Windows 的开始菜单),默认使用 Cinnamon 桌面
    • 适用场景:个人桌面(Ubuntu/Mint)、服务器(Debian/Ubuntu Server)
  • Red Hat 家族(以企业级服务器闻名)

    • 代表发行版:Red Hat Enterprise Linux (RHEL)、CentOS、Fedora等
    • 包管理工具:rpm / dnf(早期是 yum),使用 .rpm 软件包。
      • RHEL:企业级商业发行版,提供长期稳定、认证和支持。需要付费订阅。
    • 适用场景:企业数据中心(RHEL/Rocky)
  • Arch 家族(Arch Linux、Manjaro)

  • SUSE 家族

  • 其他特色发行版

环境搭建

VMware虚拟机

一个“虚拟PC”软件,作用:使一台电脑可以同时运行多个系统。
“多启动”系统:在一个时刻只能运行一个系统,在系统切换时需要重新启动机器
官网:https://www.vmware.com/
下载

Ubuntu

以桌面应用为主的GNU/Linux操作系统
官网:https://ubuntu.com/
下载

环境配置-VMware Tools

是VMware虚拟机中自带的一种增强工具。是增强虚拟显卡和硬盘性能、以及同步虚拟机与主机时钟的驱动程序

安装它后,才能实现:文件共享、自由拖拽(复制粘贴)、鼠标自由移动(不用再按ctrl+alt)、虚拟机实现全屏化
配置链接

环境配置-VIM

从 vi 发展出来的文本编辑器;有代码补全、编译及错误跳转等功能。

vim的设计理念是命令的组合,能够灵活组合使用的话,能够比那些没有模式的编辑器更加高效的进行文本编辑。

环境配置-网络配置

在这里插入图片描述
桥接网络配置链接

软件包管理

流行的软件包管理机制

  • Debian Linux首先提出*“软件包”的管理机制*—Deb软件包

    • 将应用程序的二进制文件、配置文件、man/info帮助页面等文件合并打包在一个文件中,用户使用软件包管理器直接操作软件包,完成获取、安装、卸载、查询等操作。
  • Redhat Linux基于这个理念推出了自己的软件包管理机制Rpm软件包

  • 随着Linux操作系统规模不断扩大,系统中软件包间复杂的依赖关系,导致Linux用户麻烦不断

  • Debian Linux开发出了APT软件包管理器

    • 检查和修复软件包依赖关系
    • 利用Internet网络帮助用户主动获取软件包
      APT工具再次促进了Deb软件包更为广泛地使用,成为Debian Linux的一个无法替代的亮点。

软件包的类型

Ubuntu有两种类型的软件包:

  • 二进制软件包(deb):包含可执行文件、库文件、配置文件、man/info页面、版权声明和其它文档。
  • 源码包(deb-src):包含软件源代码、版本修改说明、构建指令及编译工具等。

由tar工具归档为.tar.gz文件,然后再打包成.dsc文件

file命令:如果不确定一个软件包类型时,可以使用file命令查看文件类型。

软件包的命名命名规则:
在这里插入图片描述

在线软件包管理

Ubuntu采用集中式的软件仓库机制,将各式各样的软件包分门别类地存放在软件仓库中,进行有效地组织和管理。然后,将软件仓库置于许许多多的镜像服务器中,并保持基本一致。因此,对于用户,这些镜像服务器就是他们的软件源 在这里插入图片描述

配置文件/etc/apt/sources.list 列出最合适访问的镜像站点地址

更换软件源方式

  • 修改/etc/apt/sources.list
  • 图形界面更换软件源

更新软件源:

  • 更换后要更新,或者下载前更新软件源

  • 确保网络连接正常

    sudo apt-get update
    

APT相关命令:
在这里插入图片描述

  • apt-get 主要用于自动化处理软件包的安装、升级和删除
  • apt 结合了 apt-get 和apt-cache命令的功能,提供了更直观的输出和交互方式,
  • apt-get -f install 会修复因依赖缺失导致的安装问题,自动下载并安装缺失的依赖包‌
  • man apt 手册
  • apt install → 解析依赖 → 下载所有 .deb → 依次调用 dpkg -i 安装

离线软件包管理

dpkg软件包管理工具
底层的软件包管理工具。主要用于安装、移除和管理已下载的 .deb 软件包。只能处理已经下载到本地的包文件,不能自动解决依赖关系——这是它与 apt 最大的区别。

apt 会先解析依赖并下载所需包,再调用 dpkg 安装。

dpkg相关命令:只能处理已经下载到本地的包文件
在这里插入图片描述
安装时要指定安装包完整包名,删除时指定软件名就行

Linux文件系统

文件的管理是由文件系统来完成的。Linux 支持多种文件系统.本节我们就来讲解 Linux 下的文件系统、文件系统类型、文件系统结构。

文件系统简介

例:数据以二进制存放在硬盘上,人类想要看懂,就需要一个翻译器,这个工作就是由文件系统来完成的。

文件系统的目的就是实现数据的查询和存储等管理工作。由于场合、环境不同,Linux有很多种文件系统,不同的文件系统支持不同的体系。例:数据存储在各种物理设备:硬盘、U盘、SD卡等,存储设备不同,其物理结构不同,就需要不同的文件系统去管理。

例如Windows下格式化硬盘,创建分区的时候,会让你选择一个文件系统 ——这叫磁盘分割。Linux下也支持磁盘分割,常用的工具是fdisk,使用 fdisk 创建好分区以后也是要先在创建好的分区上面创建文件系统,也就是格式化。

区别在于Windows下的分区用的是盘符概念:C、D、E 盘,挂载过程是其内部实现的,用户看不到。而Linux下创建一个分区并且格式化好以后我们要将其“挂载”到一个目录下才能访问这个分区,我们使用 mount 命令来挂载磁盘。

文件系统类型

Windows 下有FAT、NTFS exFAT 这样的文件系统。
Linux 下的文件系统主要有 ext2、ext3、ext4 等文件系统。此外还支持UNIX 下的 XFS、JFS、UFS 等,也支持 WindowsFAT 文件系统和网络文件系统 NFS

这里主要讲讲ext3、ext4:

  • ext3:是一个日志文件系统,完全兼容ext2,支持大文件。特点如下:

    • 高可靠性:即使系统非正常关机、发生死机等情况,恢复 ext3 文件系统也只需要数十秒。
    • 数据完整性:ext3 提高了文件系统的完整性,避免意外死机或者关机对文件系统的伤害。
    • 文件系统速度:ext3 的日志功能对磁盘驱动器读写都进行了优化,文件系统速度相对与 ext2来说没有降低。
    • 数据转换:从 ext2 转换到 ext3 非常容易,只需要两条指令就可以完成转换。用户不需要花时间去备份、恢复、格式化分区等,用 ext3 文件系统提供的工具 tune2fs 即可轻松的将 ext2 文件系统转换为 ext3 日志文件系统。ext3 文件系统不需要经过任何修改,可以直接挂载成 ext2 文件系统。
  • ext4 :ext4 相比与 ext3 提供了更佳的性能和可靠性,并且功能更丰富,ext4 向下兼容 ext3 和 ext2,因此可以将 ext2 和 ext3 挂载为 ext4。

如何查询当前磁盘挂载的啥文件系统?

df -T -h

在这里插入图片描述
/dev/sda1就是我们的磁盘分区,文件系统类型是 ext4,它的挂载点是“/”,

Linux的文件系统结构

Linux 只有一个根目录,用"/"来表示,没有 C 盘根目录、D 盘根目录之类的。其实如果你的 Windows 只有一个 C 盘的话那么整个系统也就只有一个根目录。
在这里插入图片描述
在这里插入图片描述

我们打开Windows的C盘时直接进入C盘根目录,Linux下打开文件软件,如图:
在这里插入图片描述
在这里插入图片描述
进去之后们默认不是处于根目录中的,因为Ubuntu 是支持多用户的,Ubuntu 为每个用户创建了一个家目录,当前登录的是哪个用户,默认进入该用户的根目录。"/"是系统根目录,”Home“是用户根目家目录(可以想象成用户自己的根目录),它创建在系统根目录之下。用户可以对自己的用户根目录下的文件进行随意的读写操作。

文件类型

  • - 普通文件,一些应用程序创建的,比如文档、图片、音乐等等。
  • d 目录文件。
  • c 字符设备文件,Linux 驱动里面的字符设备驱动,比如串口设备,音频设备等。
  • b 块设备文件,存储设备驱动,比如硬盘,U 盘等。
  • l 符号连接文件,相当于 Windwos 下的快捷方式。
  • s 套接字文件。
  • p 管道文件,主要指 FIFO 文件。

文件属性

ls -l stat函数查看文件属性

struct stat 
{ 
 dev_t st_dev; /* 文件所在设备的 ID */ 
 ino_t st_ino; /* 文件对应 inode 节点编号 */ 
 mode_t st_mode; /* 文件对应的模式 */ 
 nlink_t st_nlink; /* 文件的链接数 */ 
 uid_t st_uid; /* 文件所有者的用户 ID */ 
 gid_t st_gid; /* 文件所有者的组 ID */ 
 dev_t st_rdev; /* 设备号(指针对设备文件) */ 
 off_t st_size; /* 文件大小(以字节为单位) */ 
 blksize_t st_blksize; /* 文件内容存储的块大小 */ 
 blkcnt_t st_blocks; /* 文件内容所占块数 */ 
 struct timespec st_atim; /* 文件最后被访问的时间 */ 
 struct timespec st_mtim; /* 文件内容最后被修改的时间 */ 
 struct timespec st_ctim; /* 文件状态最后被改变的时间 */ 
}; 
  • 文件属性——文件模式
    记录了文件的类型和文件的权限。

    文件的访问权限:r、w、x
    文件的所属权限:user、group、other,S为特殊权限
    在这里插入图片描述

    • 文件的访问权限——数字表示法:

      在这里插入图片描述
      在这里插入图片描述

    • 文件的访问权限——字母表示法:

      字母 意义
      r
      w
      x 执行
      a 所有用户
      u 所属用户
      g 所属组
      o 其他用户
      = 赋予指定权限
      + 添加权限
      - 去除某权限
      chmod ug + rw file/dir 所属用户和所属组添加读和写权限
  • 文件属性—— 文件所属者、组

    每个文件都有一个与之关联的用户和用户组,所有者表示文件属于哪个用户,所有组表示用户属于哪个用户组。
    一般创建该文件的用户就是该文件默认的所有者;该用户所在的组就是该文件默认的所属组。
    系统是通过UIDGID(与名相关的编号)来识别用户和用户组
    改变文件所有者和所属组的系统调用和命令:chown

    sudo chown root:root  test.txt
    int shown(const char *pathname,uid_t owner,gid_t group);
    

绝对路径和相对路径

绝对路径:从根目录开始描述的完整路径
相对路径:相当于当前位置的路径。会根据当前的位置而变化。

Shell终端

zuozhongkai@zuozhongkai-virtual-machine: ~$
@前:用户名
@后:主机名
~:主目录
/:系统根目录
$:表示当前用户是普通用户
#:root用户

Shell概述

  • shell是一个用 C 语言编写的应用程序,提供了一个命令行界面,用户通过这个界面访问操作系统内核的服务。它是用户使用 Linux 的桥梁。
  • 随着各式Linux系统的图形化程度的不断提高,用户在桌面环境下,通过点击、拖拽等操作就可以完成大部分的工作。 然而,许多Ubuntu Linux功能使用shell命令来实现,要比使用图形界面交互,完成的更快、更直接。机房服务器没有图像界面,也是需要shell命令来操作.
  • shell可直译为“贝壳”。“贝壳”是动物作为外在保护的一种工具。 可以这样认为,Linux中的shell就是Linux内核的一个外层保护工具,并负责完成用户与内核之间的交互

在这里插入图片描述

  • Shell是一个命令行解释器,它为用户提供一个向Linux内核发送请求以便运行程序的界面系统级程序。它负责接收用户输入的命令,然后翻译判断命令,解析出来的信息传递给系统内核,由操作系统内核来完成相应的工作,最后将结果反馈给用户。用户可以用Shell来启动、挂起、停止、编程等操作。
  • Shell还是一个功能强大的编程语言、编写方便、调试方便、灵活性强。
  • Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令。
    (翻译一条,执行一条)

总结

  1. 么是Shell?
    用户与Linux内核交互的「命令行界面」
    本质是一个命令解释器(如Bash、Zsh)
    是指一种应用程序
    是一种编程语言,解释型的脚本语言

  2. 有什么作用?

     Linux内核的一个外层保护工具,并负责完成用户与内核之间的交互
     提供一个向Linux内核发送请求的界面
     它负责接收用户输入的命令,然后解析命令,解析出来的信息传递给系统内核,由操作系统内核来完成相应的工作,最后将结果反馈给用户。
     可利用它来编写控制程序
    

Shell分类

在linux中有很多类型的shell,不同的shell具备不同的功能,shell类型还决定了脚本中函数的语法

/bin/bash(Bourne-Again Shell) 最常用

查看当前系统的Shell

  • cat /etc/shells #当前系统有哪些shell
  • echo $SHELL #查看当前用的是哪个shell

shell输入输出

重定向
  • 输出命令
    echo 显示一行文本,将字符串输出到标准输出。

    • -n 不输出尾随换行符
    • -e 启用反斜杠转义字符的解释
    • -E 禁用反斜杠转义符的解释(默认)
  • 什么是重定向

    重定向是改变shell命令或程序默认的标准输入/输出目标,重新定向到新的目标

  • 默认的输入输出位置

    • 标准输入:(stdin,文件描述符为0):默认从键盘输入
    • 标准输出:(stdout,文件描述符为1):默认输出到屏幕。
    • 标准出错:(stderr,文件描述符为2):默认输出到屏幕。

    在 Linux/Unix Shell 中,输入输出重定向用于改变命令默认的输入来源或输出去向。下面列出常用符号及其含义,分为输出重定向输入重定向组合用法三部分。

  • 输出重定向(改变命令的输出目标)

符号 含义 示例
> 标准输出(文件描述符 1)重定向到文件,覆盖原有内容 echo hello > file.txt
>> 标准输出重定向到文件,追加到文件末尾 echo world >> file.txt
2> 标准错误(文件描述符 2)重定向到文件,覆盖 ls not_exist 2> err.log
2>> 标准错误重定向到文件,追加 ./script 2>> err.log
&>>& 标准输出和标准错误都重定向到同一个文件(覆盖) command &> all.log
&>> 标准输出和标准错误都重定向到同一个文件(追加) command &>> all.log
2>&1 将标准错误合并到标准输出(常与 > 配合) command > out.log 2>&1
1>&2 将标准输出合并到标准错误 echo msg 1>&2

注意2>&1 的位置很重要,通常放在 > 后面。&> 是 bash 等 shell 的简化写法,更常用。

  • 输入重定向(改变命令的输入来源)
符号 含义 示例
< 从文件读取内容作为命令的标准输入 wc -l < file.txt
<< Here Document:将后续多行文本作为输入,直到遇到指定的分隔符 cat << EOF 后输入多行,以 EOF 结束
<<< Here String:将后面的字符串作为输入 grep foo <<< "hello foo bar"
通配符

通配符是用来代替字符的一种特殊语句
在这里插入图片描述

管道

管道可以把一系列命令连接起来,意味着第一个命令的输出将作为第二个命令的输入,通过管道传递给第二个命令,第二个命令的输出又将作为第三个命令的输入,以此类推。
通过使用“ | ”符连成了一个管道。

命令置换
表示获取该命令的执行结果,通过命令置换符"``"实现

多行命令执行
多行命令同时执行用逗号隔开
命令1 && 命令2 命令1执行正确,命令2才执行
命令1 || 命令2 命令1执行不正确,命令2才执行

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐