Linux 基本知识-1

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 基本的 Linux 常识

Linux 基本知识-1

Linux 内核

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

  • 硬件设备管理

    任何 Linux 系统需要与之通信的设备都必须在内核代码中加入其 驱动程序,允许内核同设备之间交换数据

    • Linux 系统将硬件设备视为一种特殊文件,称为 设备文件

      • 字符设备文件

        大多数类型的调制解调器和终端是作为字符设备文件创建的

      • 块设备文件

        大多数类型的调制解调器和终端是作为字符设备文件创建的

      • 网络设备文件

        网络设备文件对应于采用数据包发送和接收数据的设备,这包括网卡和一个特殊的环回设备,后者允许Linux系统使用常见的网络编程协议同自身通信

    • Linux会为系统的每个设备都创建一种称为 节点 的特殊文件,与设备的所有通信都是通过设备节点完成的

      • 每个节点都有一个唯一的数值对,以供 Linux 内核标识
      • 数值对包括一个 主设备号 和一个 次设备号,类似的设备会被划分到相同的主设备号下,次设备号用于标识主设备组下的某个特定设备

    Linux 采用了一种标准格式来为硬盘分配设备名称

    • SATA 驱动器和 SCSI 驱动器:设备命名格式为 /dev/sdx,其中字母 x 具体是什么要根据驱动器的检测顺序决定(第一个检测到的驱动器是a,第二个是b,以此类推)
    • SSD NVMe 驱动器:设备命名格式为 /dev/nvmeNn#,其中数字 N 具体是什么要根据驱动器的检测顺序决定(从 0 起始),# 是分配给该驱动器的名称空间编号(从1起始)
    • IDE 驱动器:设备命名格式为 /dev/hdx,其中字母 x 具体是什么要根据驱动器的检测顺序决定(第一个检测到的驱动器是a,第二个是b,以此类推)
  • 系统内存管理

    • 内核通过硬盘上称为 交换空间 swap space 的存储区域来实现虚拟内存
    • 内存被划分为若干块,这些块称作 页面 page
  • 文件系统管理

    不同于其他一些操作系统,Linux 内核支持通过不同类型的文件系统读写硬盘数据

    • ext: 最早 Linux文件系统,后续拓展 ext2, ext3, ext4
    • btrfs: 支持日志功能和大文件
    • exfat: 拓展 windows 文件系统,主要用于 SD 卡和 U 盘
    • hpfs: OS/2 高性能文件系统
    • jfs: IBM 日志文件系统
    • iso9660: ISO 9660 文件系统
    • minix: MINIX 文件系统
    • msdos: Microsoft FAT16
    • ncp: Netware 文件系统
    • nfs: 网络文件系统
    • ntfs: Microsoft NT 文件系统
    • proc: 访问系统信息
    • smb: 用于网络访问的 Samba SMB 文件系统
    • sysv: 早期 Unix 文件系统
    • ufs: BSD 文件系统
    • umsdos: 建立在 umsdos 上的类 Unix 文件系统
    • vfat: Windows 95 文件系统 FAT32
    • XFS: 高性能 64 位日志文件系统

    部分历史内容:

    • Linux 操作系统最初引入的文件系统叫作 扩展文件系统 ext

      使用虚拟目录处理物理存储设备并在其中以固定大小的磁盘块形式保存数据,通过一个唯一的 i 节点号 来引用 i 节点表 中的 i 节点,这个值是创建文件时由文件系统分配的,文件系统是通过 i 节点号 而非文件名和路径来标识文件的

      • ext 文件系统限制颇多,比如文件大小不得超过 2 GB,所以在 ext 文件系统就升级到了第二代扩展文件系统,称作 ext2

        • 在i节点表中加入了文件的创建时间、修改时间以及最后一次访问时
        • 允许的最大文件大小增至 2 TB,后期又增加到 32 T
        • 保存文件时按组分配磁盘

        ext2文件系统也有限制:比如系统在存储文件和更新i节点表之间发生了什么事情,则两者内容可能无法同步潜在的结果是丢失文件在磁盘上的数据位置,ext2 文件系统由于容易在系统崩溃或断电时损坏而臭名昭著

    • 日志文件系统

      • 它放弃了之前先将数据直接写入存储设备再更新 i节点表,而是先将文件变更写入临时文件,称作 日志
      • 在数据被成功写到 存储设备i节点表 之后,再删除对应的日志条目

        Linux 中有 3 种广泛使用的日志方法

        • 数据模式
        • 有序模式
        • 回写模式

      相关文件系统

      • ext3 文件系统是 ext2 的后续版本

        • ext3 采用有序模式的日志方法,不过也可以通过命令行选项改用其他模式
        • ext3 文件系统无法恢复误删的文件,也没有提供数据压缩功能
      • ext4 采用有序模式的日志方法可以通过命令改模式,另外还支持加密、压缩以及单目录下不限数量的子目录
      • JFS 目前依然在用的最旧的日志文件系统,JFS 文件系统采用的是有序模式的日志方法,只在日志中保存 i节点 数据,直到文件数据被写进存储设备后才将其删除
      • ReiserFS 文件系统,Hans Reiser 为 Linux 设计并编写了首个日志文件系统 ReiserFS,Linux 现在已经不再支持最新的 Reiser4
      • XFS 文件系统采用回写模式的日志方法,在提供了高性能的同时也引入了一定的风险,因为实际数据并未存进日志文件
    • 卷管理文件系统

      就文件系统而言,日志技术的替代选择是一种称作 写时复制 copy-on-write,COW 的技术

      • COW 通过 快照 snapshot 兼顾了安全性和性能
      • 在修改数据时,使用的是 克隆可写快照
      • 真正的 COW 系统仅在数据修改完成之后才会改动旧数据
      • 如果从不覆盖旧数据,那么这种操作准确来说称作 写时重定向 redirect-on-write,ROW

      从一个或多个磁盘(或磁盘分区)创建的存储池提供了生成 虚拟磁盘(称作卷)的能力,通过存储池可以根据需要增加卷,在提供灵活性的同时大大减少停机时间

      • ZFS 文件系统最初由 Sun Microsystems 于 2005 年发布,用于 OpenSolaris 操作系统

        • 从 2008 年起开始向 Linux 移植,最终在 2012 年投入使用
        • ZFS 是一个稳定的文件系统,与 Resier4, Btrfs, ext4 势均力敌,它拥有 数据完整性验证自动修复功能
        • 没有采用 GNU 通用公共许可证 GNU General Public License,GPL,因此无法被纳入 Linux 内核
      • Btrfs 文件系统,由 Oracle 公司于 2007 年开始研发

        • Btrfs 在 Reiser4 的诸多特性基础上改进了可靠性
        • 它的稳定性、易用性能够动态调整已挂载文件系统的大小
      • Stratis 文件系统,Stratis 并不符合文件系统的标准定义

        • Red Hat 弃用 Btrfs 后创建
        • Stratis 维护的存储池由一个或多个 XFS 文件系统组成,同时还提供与传统的 卷管理文件系统 相似的 COW 功能
        • Stratis 首次现身于 Fedora 29
    • Linux 逻辑卷管理器 logical volume manager,LVM

      • 可以通过将另一块硬盘上的分区加入已有的文件系统来动态地添加存储空间
      • LVM允许将多个分区组合在一起,作为单个分区(逻辑卷)进行格式化、在 Linux 虚拟目录结构上挂载、存储数据

      LVM 由 3 个主要部分组成

      • 物理卷 physical volume,PV

        物理卷就是指硬盘分区或从逻辑上与磁盘分区具有同样功能的设备,是 LVM 的基本存储逻辑块

      • 卷组 volume group,VG

        LVM 卷组类似于非 LVM 系统中的物理硬盘,其由物理卷组成

      • 逻辑卷 logical volume,LV

        LVM 的逻辑卷类似于非 LVM 系统中的硬盘分区,在逻辑卷之上可以建立文件系统

      • 物理块 physical extent,PE

        每一个物理卷被划分为称为物理块的基本单元,具有唯一编号的 PE 是可以被 LVM 寻址的最小单元

      规则

      • 硬盘或者硬盘集被分配成一个或者多个物理卷,一个物理卷只能分配到一块硬盘,不能跨硬盘分配
      • 物理卷被整合成逻辑卷组,有个例外就是 /boot/ 分区
      • 逻辑卷组下面是逻辑卷,逻辑卷被指定了挂载点
      • 一旦创建好 LV,就可以将其视作普通分区
      • 不同之处在于你可以根据需要,扩大或收缩这个分区
      • 如果想在系统重启时自动挂载新的 LV,在 /etc/fstab 文件中添加一条记录

    Linux 内核采用 虚拟文件系统 virtual file system,VFS 作为和各种文件系统交互的接口,这为 Linux 内核与其他类型文件系统之间的通信提供了一个标准接口,当文件系统被挂载和使用时 VFS 会在内存中缓存相关信息

    注意:在 Linux 的路径中不使用 驱动器盘符

    • Linux 会将文件存储在名为 虚拟目录 virtual directory 的单个目录结构中
    • Linux虚拟目录结构只包含一个称为 根目录 / 的基础目录
    • 你会注意到 Linux 使用 正斜线 / 而不是 反斜线 \ 来分隔文件路径中的目录,反斜线在Linux中用作 转义字符,如果误用在文件路径中会造成各种各样的问题
    • 路径本身并没有提供任何有关文件究竟存放在哪个物理磁盘中的信息

    我们称在 Linux 系统中安装的第一块硬盘为 根驱动器,根驱动器包含了虚拟目录的核心,其他目录都是从那里开始构建的

    • Linux 会使用根驱动器上一些特别的目录作为 挂载点 mount point
    • 挂载点是虚拟目录中分配给 额外存储设备 的目录

    在Linux文件系统中,采用通用的目录名表示一些常见的功能,常见的Linux目录名均基于 文件系统层级标准 filesystem hierarchy standard,FHS

    • / : 根目录
    • /bin: 二进制文件命令
    • /boot: 引导文件目录
    • /dev: 设备目录
    • /etc: 配置文件目录
    • /home: 主目录
    • /lib: 库目录,存放系统和应用程序的库文件
    • /libname: 库目录,存放替代格式的存放系统和应用程序的库文件
    • /media: 媒介目录,挂载可移动设备
    • /mnt: 挂载目录,临时文件系统
    • /opt: 可选目录,存放第三方软件包
    • /proc: 进程目录,存放内核、系统、进程的相关信息
    • /root: 超级用户主目录
    • /run: 运行命令,存放系统运行时数据
    • /sbin: 系统二进制文件目录
    • /srv: 服务目录,存放本地服务的相关文件
    • /sys: 系统目录,存放设备,驱动及部分内核特性信息
    • /tmp: 临时目录
    • /usr: 用户目录,该目录是一个次目录层级结构,包含可共享的只读文件
    • /var: 可变目录,存放经常变化的文件,比如日志文件
    • 挂载目录 mnt, media, misc

      • mnt: 早期 Linux 中只有这一个挂载目录, 现在系统建议这个目录用来挂载额外的设备【U 盘、移动硬盘、其他操作系统的分区】
      • media: 系统建议用来挂载媒体设备【软盘、光盘】
      • misc: 系统建议用来挂载 NFS 服务的共享目录

    Linux 两种路径表示:

    • 绝对路径:绝对路径定义了在虚拟目录结构中,该目录从 根目录 开始的确切位置,相当于目录的全名

      • pwd 命令可以显示出 shell 会话的当前目录,该目录被称为 当前工作目录
    • 相对路径:以目录名(当前工作目录下的某个目录)或是一个特殊字符开始

      • . 表示当前目录
      • .. 表示当前目录的父目录
  • 软件程序管理

    Linux 操作系统称运行中的程序为 进程,内核控制着 Linux 系统如何管理运行在系统中的所有进程,内核创建了第一个进程(称为 init 进程)来启动系统中所有其他进程

    在Linux中,有多种init进程实现,目前最流行的是以下两种:

    • SysVinit: Linux 最初使用的,尽管如今很多 Linux 发行版已经不再使用,但在一些比较旧的Linux发行版中依旧在使用

      SysVinit 初始化方法使用 运行级 runlevel 的概念来决定启动哪个进程

      runlevel 描述
      0 关闭系统
      1 单用户模式
      2 多用户模式,无联网服务
      3 多用户模式,无联网服务
      4 自定义
      5 GUI 多用户模式
      6 重启系统
      • /etc/inittab 文件定义了系统的默认运行级
      • 特定运行级下启动的进程是在 /etc/rc.d 目录下的各个子目录中定义
      • runlevel 命令随时查看当前运行级
    • systemd: 诞生于 2010 年,现在已经成为 Linux 发行版中最流行的初始化和进程管理系统,得以流行起来的原因在于能够根据不同的事件启动进程

      • systemd 方法通过将事件与 单元文件 unit file 链接来决定运行哪些进程
      • 将单元文件划归为 目标 target 定义了 Linux 系统的特定运行状态
      • 在系统启动时,default.target 单元定义了要启动的所有单元文件
      • 使用 systemctl get-default 命令查看当前默认目标

文件常识

  • 在 Linux 中 隐藏文件 通常是文件名以 点号 . 开始的文件,Linux 经常使用隐藏文件来保存配置信息,查看 ls -a
  • 关于 链接文件 可以使用单个物理副本加多个虚拟副本(链接)的方法代替创建多个物理副本,链接是目录中指向文件真实位置的占位符

    • 符号链接(也称为软链接)是一个实实在在的文件,该文件指向存放在虚拟目录结构中某个地方的另一个文件

      要为一个文件创建符号链接,原始文件必须事先存在,证明链接文件是一个独立文件的方法是查看 inode 编号,文件或目录的 inode 编号是内核分配给文件系统中的每一个对象的 唯一标识,要查看文件或目录的 inode 编号可以使用 ls 命令的 -i 选项

      ln -s src dest
    • 硬链接创建的是一个独立的虚拟文件,其中包含了 原始文件的信息以及位置

      要想创建硬链接,原始文件也必须事先存在,只不过这次使用ln命令时不需要再加入额外的选项,以硬链接相连的文件共享同一个 inode 编号

    只能对处于同一存储设备的文件创建硬链接,要想在位于不同存储设备的文件之间创建链接,只能使用符号链接

进程通信:Linux 沿用了 Unix 的进程间通信方法

  • 在 Linux 中,进程之间通过 信号 来通信

    • 进程的信号是预定义好的一个消息,进程能识别该消息并决定忽略还是做出反应
    • 进程如何处理信号是由开发人员通过编程来决定的
    • 大多数编写完善的应用程序能接收和处理标准 Unix 进程信号
    • Linux 中有两个命令可以向运行中的进程发出进程信号: kill 和 pkill
    信号 名称 描述
    1 HUP 挂起
    2 INT 中断
    3 QUIT 结束
    9 KILL 无条件终止
    11 SEGV 段错误
    15 TERM 尽可能终止
    18 CONT 在 STOP, TSTP 后恢复
    19 STOP 无条件停止运行,但不终止
    20 TSTP 暂停或停止,但继续在后台运行
  • tar: 最开始是用于将文件写入磁带设备以作归档,但它也可以将输出写入文件

Linux 文件权限

  • Linux安全系统的核心是 用户,用户对系统中各种对象的访问权限取决于他们登录系统时所用的账户
  • 用户权限是通过创建用户时分配的 用户ID user ID,UID 来跟踪的,每个用户都有一个唯一的UID
  • /etc/passwd 文件:匹配登录名与对应的 UID 值

    • root 用户是 Linux 系统的管理员,为其固定分配的 UID 是 0
    • Linux系统会为各种各样的功能创建不同的用户账户,我们称其为 系统账户,它们是系统中运行的各种服务进程访问资源使用的特殊账户
    • Linux为系统账户预留了 500 以下的 UID 并非所有的Linux发行版都是这样,比如 Ubuntu 就是从 1000 开始的
  • 绝大多数 Linux 系统将用户密码保存在单独的文件,称为 shadow 文件位于 /etc/shadow

    • /etc/shadow 文件对 Linux 系统密码管理提供了更多的控制,只有 root 用户才能访问
  • 组权限允许多个用户对系统对象(比如文件、目录或设备等)共享一组权限

    • 每个组都有唯一的 GID
    • /etc/group 文件包含系统中每个组的信息
    • 对于系统账户组,为其分配的 GID 值低于 500,而普通用户组的 GID 则从 500 开始分配
    • 组密码允许非组内成员使用密码临时性地成为该组成员
  • 只有 root 用户能修改文件的属主,任何用户都可以修改文件的属组,但前提是该用户必须是原属组和新属组的成员
  • shared 组的任意成员都可以写入该文件了,这是在 Linux 系统中共享文件的一种方法
  • Linux 系统中 共享文件 的方法是创建组
  • Linux为每个文件和目录存储了 3 个额外的信息位

    • SUID (set user ID): 当用户执行该文件时,程序会以文件属主的权限运行
    • SGID (set group ID):

      • 对文件而言,程序会以文件属组的权限运行
      • 对目录而言,该目录中创建的新文件会以目录的属组作为默认属组
      • 对文件共享非常重要,可以通过 chmod 命令设置 SGID,将其添加到标准3位八进制值之前(组成 4 位八进制值),或者在符号模式下用符号 s
    • 粘滞位 (sticky bit): 应用于目录时,只有文件属主可以删除或重命名该目录中的文件
  • 访问控制列表 access control list,ACL

    • ACL 允许指定包含多个用户或组的列表以及为其分配的权限
    • ACL 权限使用相同的读取、写入和执行权限位,但现在可以分配给多个用户和组
    • 可以使用 setfacl 命令和 getfacl 命令在 Linux 中实现 ACL 特性
    • Linux 也允许对目录设置默认 ACL,在该目录中创建的文件会自动继承

软件包管理系统

  • 软件包 存储在称为 仓库 repository 的服务器上,可以利用本地 Linux 系统中的软件包管理器通过Internet访问,在其中搜索新的软件包,或是更新系统中已安装的软件包
  • 软件包通常存在依赖关系
  • 软件包管理器及其相关命令在不同的Linux发行版中天差地别,Linux 中广泛使用的两种主要的软件包管理系统基础工具是 dpkgrpm

    • 基于 Debian 的发行版使用的是 dpkg 命令
    • 基于 Red Hat 的发行版使用的是 rpm 命令
    • 这两个命令是它们各自软件包管理系统的核心,并不代表整个软件包管理系统
  • 云计算带来了应用程序打包方式的一种新范式:应用程序容器

    • 应用程序容器创建了一个环境,其中包含了应用程序运行所需的全部文件,包括运行时库文件
    • 但已经出现了一些相互竞争的应用程序容器标准,比较流行的标准:snap, flatpak

      • snap 容器:Ubuntu Linux 发行版的创建者 Canonical 开发了一种称为 snap 的应用程序容器格式

        • snap 打包系统会将应用程序所需的所有文件集中到单个 snap 分发文件中
        • snapd 应用程序运行在后台,你可以使用 snap 命令行工具查询 snap 数据库,显示已安装、安装、升级、删除的 snap 包
      • flatpak 应用程序容器格式是作为一个独立的开源项目创建的,与任何特定的 Linux 发行版都没有直接联系
  • 用户需要在系统中自行编译

    • 源代码形式的软件包通常以 tarball 的形式发布

文本编辑器

  • vim 编辑器:vi 编辑器是Unix系统中最早的编辑器之一,vim 是其移植到开源世界时的改进版
  • nano 编辑器:nano 文本编辑器是 Unix 系统的 Pico 编辑器的克隆
  • Emacs 编辑器:Emacs 是 20 世纪 70 年代为 DEC 计算机开发的一款极其流行的编辑器,macs 编辑器一开始也被作为控制台编辑器,但如今已经迁移到了图形化世界
  • KWrite 编辑器:KWrite 是 KDE Plasma 环境的基本编辑器,提供了简单的字处理型文本编辑功能,还支持代码语法高亮显示和编辑
  • Kate 编辑器:Kate 编辑器是 KDE 项目的旗舰编辑器,其核心文本编辑器和 KWrite 一样(所以大部分功能也相同),但也融合了包括多文档界面在内的很多其他特性
  • GNOME 编辑器:gedit 文本编辑器是一款基础的文本编辑器
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
Linux 开发工具 C++
【Linux】基本知识和权限(上)
【Linux】基本知识和权限(上)
|
6月前
|
缓存 关系型数据库 MySQL
linux 基本知识与命令
linux 基本知识与命令
|
6月前
|
Linux 调度 C语言
|
Linux Shell 数据安全/隐私保护
【Linux】基本知识和权限(下)
【Linux】基本知识和权限(下)
|
Linux Shell
Linux操作系统笔记——Shell 命令解释器的基本知识
Linux操作系统笔记——Shell 命令解释器的基本知识
Linux操作系统笔记——Shell 命令解释器的基本知识
|
13天前
|
运维 安全 Linux
Linux中传输文件文件夹的10个scp命令
【10月更文挑战第18天】本文详细介绍了10种利用scp命令在Linux系统中进行文件传输的方法,涵盖基础文件传输、使用密钥认证、复制整个目录、从远程主机复制文件、同时传输多个文件和目录、保持文件权限、跨多台远程主机传输、指定端口及显示传输进度等场景,旨在帮助用户在不同情况下高效安全地完成文件传输任务。
104 5
|
13天前
|
Linux
Linux系统之expr命令的基本使用
【10月更文挑战第18天】Linux系统之expr命令的基本使用
49 4