Skip to content

Linux操作系统

Linux第三方学习文档

Linux命令在线速查手册:[https://www.w3xue.com/manual/linux/]

另外,[https://www.shell.how]这个网站可以用来解释常见命令的含义,对于学习Linux和其他常用命令(如Git、NPM)非常有益。

认识操作系统

内核(Kernel)

摘自维基百科对于内核的解释:

内核(英语:Kernel,又称核心)在计算机科学中是一个用来管理软件发出的数据 I/O(输入与输出)请求的电脑程序,将这些要求转译为数据处理的指令并交由中央处理器(CPU)及电脑中其他电子组件进行处理,是现代操作系统中最基本的部分。它是为众多应用程序提供对计算机硬件的安全访问的一部分软件,这种访问是有限的,并由内核决定一个程序在什么时候对某部分硬件操作多长时间。 直接对硬件操作是非常复杂的。所以内核通常提供一种硬件抽象的方法,来完成这些操作。有了这个,通过进程间通信机制及系统调用,应用进程可间接控制所需的硬件资源(特别是处理器及 IO 设备) 。

​早期计算机系统的设计中,还没有操作系统的内核这个概念。随着计算机系统的发展,操作系统内核的概念才渐渐明晰起来了!

简单概括就是:

  • 操作系统内核(Kernel)是操作系统的核心部分,它负责系统的内存管理,硬件设备的管理,文件系统的管理以及应用程序的管理。

  • 操作系统的内核是连接软件和硬件的桥梁,它决定着操作系统的性能和稳定性。

中央处理器(CPU)

关于CPU简单概括三点:

  • CPU是一台计算机的运算核心+控制核心,可以称得上是计算机的大脑。

  • CPU主要包括两个部分:控制器+运算器。

  • CPU的根本任务就是执行指令,对于计算机来说最终都是一串由0和1组成的序列。

CPU vs Kernel

  • 操作系统内核(Kernel)属于操作系统层面,是软件,而CPU属于硬件。(即一个是软件层面的概念,一个是硬件层面的概念)

  • CPU主要提供运算、处理各种指令的能力。内核(Kernel)主要负责系统管理如内存管理、硬件设备的管理等,它屏蔽了对硬件的操作。

下图清晰的说明了应用程序、内核、CPU三者的关系:

计算机软硬件之间的关系.png

系统调用

根据进程访问资源的特点,我们可以把进程在系统上的运行分为两个级别:

  • 用户态(user mode):用户态运行的进程可以直接读取用户程序的数据。

  • 系统态(kernel mode):系统态运行的进程或程序几乎可以访问计算机的任何资源,不受限制。

在我们运行的用户程序中,凡是与系统态级别的资源有关的操作(如文件管理、进程控制、内存管理等),都必须通过系统调用的方式向操作系统提出服务请求,由操作系统代为完成。

这些系统调用按功能大致可分为如下几类:

功能描述
设备管理完成设备的请求或释放,以及设备启动等功能
文件管理完成文件的读、写、创建及删除等功能
进程控制完成进程的创建、撤销、阻塞及唤醒等功能
进程通信完成进程之间的消息传递或信号传递等功能
内存管理完成内存的分配、回收以及获取作业用内存区大小及地址分配等功能

系统调用关系图.png

Linux文件系统

inode介绍

文件在硬盘中有可能被分成多个块(block)来存储,因此是我们需要一个空间来存储文件的元信息(metadata),inode就是用来记录某个文件被分成几块、每块所在的地址、文件拥有者、创建时间、权限、大小等信息。

inode = i(index)+ node

每个inode都有一个号码,Linux/Unix操作系统不使用文件名来区分文件,而是使用inode号码区分不同文件。

可以使用stat filename命令查看文件的inode信息

文件inode命令.png

Linux文件类型

Linux支持很多文件类型,其中非常重要的文件类型有:

类型描述
普通文件(-)包含纯文本文件、二进制文件和数据文件
目录文件(d)类似windows中的文件夹
链接文件(l)类似windows中的快捷方式
字符设备(c)用来访问字符设备比如键盘
设备文件(b)用来访问块设备比如硬盘、软盘
管道文件(p)一种特殊类型的文件,用于进程之间的通信(进程间的通信有两种:匿名管道和有名管道)

如下方红框中drwxr-xr-x中的d即表示该文件为目录文件。

目录文件示例.png

Linux目录树结构

所有可操作的计算机资源都存在于目录树这个结构中,对于计算资源的访问,可以看作是对这棵目录树的访问。Linux的目录结构如下:

Linux目录树.png

常见目录说明:

目录说明
/超级用户(root)的主目录(特权阶级)。
/bin存放二进制可执行文件(ls, cat, mkdir等),常用命令一般都在这里。
/boot存放用于系统引导时使用的各种文件
/dev用于存放设备文件。
/etc存放系统管理和配置文件。
/home存放所有用户文件的根目录,可以用表示,是用户目录的基点,比如用户user的主目录就是/home/user,也可以用~user表示。
/lib存放着和系统运行相关的库文件
/media媒体文件,即可删除的设备,包括软盘、光盘、DVD等
/mnt系统管理员安装临时文件系统的安装点(挂载点),系统提供这个目录是让用户临时挂载其他的文件系统。
/opt第三方辅助软件存放的目录。一般情况下,我们可以把tomcat等都安装到这里。
/sbin存放二进制可执行文件,只有root才能访问。这里存放的是系统管理员使用的系统级别的管理命令和程序,如ifconfig等。
/usrUNIX SoftWare Resource,用于存放操作系统软件资源的目录,而非用户数据。所有的系统默认软件都在此目录。
/var用于存放运行时需要改变数据的文件,也是某些大文件的溢出区,包括缓存、日志文件以及某些软件运行所产生的程序文件或数据库文件等。
/proc虚拟文件系统目录,是系统内存的映射。可直接访问这个目录来获取系统信息。
/tmp用于存放各种临时文件,是公用的临时文件存储点
/lost+found这个目录平时是空的,系统非正常关机而留下"无家可归"的文件(Windows中叫xxx.chk)就在这里。

硬件设备的文件名

在Linux中,每个设备都被当做一个文件来对待;几乎所有的硬件设备文件都存放在/dev这个目录内。

设备设备在Linux中的文件名
SCSI、SATA、USB磁盘驱动器/dev/sd[a-p]
U盘/dev/sd[a-p](与SATA相同)
Virtio接口/dev/vd[a-p](用于虚拟机内)
软盘驱动器/dev/fd[0-7]
打印机/dev/lp[0-2](25针打印机)
/dev/usb/lp[0-2](USB接口打印机)
鼠标/dev/input/mouse[0-15](通用)
/dev/psaux(PS/2接口)
/dev/mouse(当前鼠标)
CD-ROM、DVD-ROM/dev/scd[0-1](通用)
/dev/sr[0-1](通用,CentOS较常见)
/dev/cdrom(当前CD-ROM)
磁带机/dev/ht0(IDE接口)
/dev/st0(SATA/SCSI接口)
/dev/tape(当前磁带)
IDE软盘驱动器/dev/hd[a-d](旧系统才有)

目录操作

目录切换命令

  • cd /usr: 切换到该目录下的usr目录

  • cd .. (or cd ../): 切换到上一层目录

  • cd /: 切换到系统根目录

  • cd ~: 切换到用户主目录(也就是/home目录)

  • cd -: 切换到上一个操作所在目录

目录的增删改查

  • pwd: 显示当前目录
    bash
    pwd [-p]
    # 选项与参数:
    # -P: 显示出确实的路径,而非使用链接(link)路径
  • mkdir: 新建目录
    bash
    mkdir [-mp] 目录名 
    # 选项与参数:
    # -m: 配置文件权限
    # -p: 递归创建目录
    
    # 示例
    mkdir -p /test1/test2/test3
    mkdir -m 711 test2
  • rmdir: 删除空目录
    bash
    rmdir [-p] 目录名
    # 选项与参数:
    # -p: 连同上层"空"目录一并删除
    
    # 示例
    mkdir -p /test1/test2/test3
    rmdir /test1/test2/test3 # 报错: Directory not empty
    rmdir -p /test1/test2/test3 # 成功
  • rm -r: 删除非空目录
    bash
    rm -r 目录名
  • ls/ll: 查看目录信息
    bash
    ls/ll [-aAdfFhilnrRSt] 目录名
    # 选项与参数:
    # -a: 显示所有文件,包括隐藏文件
    # -d: 显示目录本身的信息
    # -l: 以长格式显示文件信息
    # -R: 递归显示子目录
    # -S: 以文件大小排序
    # -t: 以修改时间排序

文件操作

文件的建立、移动与删除

  • touch : 建立空文件
    bash
    touch 文件名
  • cp : 复制
    bash
    cp [-adfilprsu] 源文件1 源文件2... 目标目录
    # 将源文件1、源文件2... 复制到目标目录下
    # 选项与参数:
    # -a: 相当于-pdr, 保留所有文件属性和递归复制目录
    # -d: 若源文件为文件,则复制链接文件属性而非文件本身
    # -f: 强制覆盖目标文件
    # -i: 若目标文件已存在,提示是否覆盖
    # -l: 复制链接文件
    # -p: 保留源文件的属性
    # -r: 递归复制
    # -s: 复制成链接文件, 即快捷方式文件
    # -u: 若目标文件比源文件旧,则覆盖
  • mv: 移动
    bash
    mv [-fiu] 源文件 目标目录
    # 将源文件移动到目标目录下
    # 选项与参数:
    # -f: 强制覆盖目标文件
    # -i: 若目标文件已存在,提示是否覆盖
    # -u: 若目标文件比源文件旧,则覆盖
  • rm: 删除
    bash
    rm [-fir] 文件名
    # 删除文件
    # 选项与参数:
    # -f: 强制删除
    # -i: 删除前提示
    # -r: 递归删除

查看文件内容

  • 通用操作:
    • 空格键: 向下翻页
    • Enter键: 向下滚动一行
    • b: 向上翻页
    • /字符串: 向下搜索字符串
    • ?字符串: 向上搜索字符串
    • q: 退出
  • cat : 查看文件内容
    bash
    cat [-AbEnTv] 文件名
    # 选项与参数:
    # -A: 显示所有字符
    # -E: 显示行尾的"$"
    # -n: 显示行号
    # -T: 制表符显示为"^I"
    # -v: 显示不可打印字符
  • more/less : 分页显示文件内容
    bash
    more/less 文件名
    # more: 一页一页显示
    # less: 可以向前翻页
  • head : 显示文件开头n行内容
    bash
    head [-n number] 文件名
    # 选项与参数:
    # -n: 显示文件的前number行
  • tail : 显示文件结尾n行内容
    bash
    tail [-n number] 文件名
    # 选项与参数:
    # -n: 显示文件的后number行

文件的查找

  • 可执行文件的查找

    • which是根据PATH这个环境变量所规范的路径去查找执行文件的文件名

      bash
      # 查找命令的路径
      which [-a] 命令
      # -a : 将所有由PATH目录中可以找到的命令全列出来
    • type是用来区分命令是内建命令还是外部命令

      bash
      # 查找命令的类型
      type [-tpaf] 命令
      # -t: 显示命令的类型。file: 外部命令, alias: 别名, builtin: 内建命令
      # -p: 如果给出的参数是外部命令,则显示命令的绝对路径
      # -a: 显示命令所有的信息,包括别名、内置命令、函数等
      # -f: 只返回shell函数的信息
  • 一般文件的查找

    • whereis-在特定的目录中查找文件

      bash
      whereis [-bmsu] 文件或目录名
      # 选项与参数:
      # -b: 只查找二进制文件
      # -m: 只查找帮助文件
      # -s: 只查找源文件
      # -u: 查找不在默认路径中的文件
      
      > whereis ifconfig
      ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz
    • locate-在数据库中搜索指定的文件

      此数据库/var/lib/locatedb是Linux系统自动创建的,数据库中含有本地文件的所有信息,数据库由updatedb程序来自动更新

      bash
      locate [-ir] keyword
      # 选项与参数:
      # -c: 只计算找到的文件数量
      # -l: 后接数字,表示输出几行
      # -i: 忽略大小写
      # -r: 后面的字符串为正则表达式
      
      > locate -l 5 passwd
      /etc/passwd
      /etc/passwd-
      /etc/pam.d/passwd
      /etc/security/opasswd
      /usr/bin/gpasswd
    • find-查找任何类型的文件

      bash
      find [path] [option] [action]
      # 选项与参数:
      # -name: 按照文件名查找,支持通配符
      # -type: 按照文件类型查找(b: 块设备文件, c: 字符设备文件, d: 目录等)
      # -user: 按照文件属主查找
      # -group: 按照文件所属组查找
      
      # 示例: 查找/etc目录下所有名为passwd的文件
      > find /etc -name passwd
      /etc/passwd
      /etc/passwd-
      /etc/pam.d/passwd

权限相关

用户与用户组

在linux中,用户(User)和用户组(Group)是管理系统权限和资源访问的重要概念。

  • 用户(User)
    用户是指系统中的一个身份标识,每个用户都有自己的用户名和密码。每个用户可以拥有自己的文件、进程和权限。

    • 创建用户
      bash
      # -m: 创建用户时创建对应的/home目录
      sudo useradd -m username
    • 删除用户
      bash
      sudo userdel username
    • 修改用户密码
      bash
      sudo passwd username
    • 修改用户属性
      bash
      sudo usermod [选项] username
      # 选项:
      # -l: 修改用户登录名
      # -g: 修改用户主组
      # -aG: 添加用户到附加组
    • 删除用户
      bash
      # -r: 删除用户的同时删除/home目录和邮件文件
      sudo userdel -r username
  • 用户组(Group)
    用户组是指一组用户的集合,常用于授权管理和文件访问控制。每个用户可以属于多个用户组,每个用户组可以拥有多个用户。

    • 创建用户组
      bash
      sudo groupadd groupname
    • 修改用户组
      bash
      # -n: 修改用户组名
      sudo groupmod -n newgroupname oldgroupname
    • 删除用户组
      bash
      sudo groupdel groupname
    • 查看用户所属组
      bash
      groups username
  • 其他常用命令

    • 查看所有用户
      bash
      cat /etc/passwd
    • 查看所有用户组
      bash
      cat /etc/group
    • 切换用户
      bash
      su - username
    • 查看当前用户
      bash
      whoami
    • 查看用户详细信息
      bash
      id username

权限介绍

为了管理文件的访问权限,Linux使用读、写和执行三种权限

  • 读权限 (r): 允许用户读取文件内容或查看目录中的文件列表
  • 写权限 (w): 允许用户写入或删除文件,或在目录中创建、删除或重命名文件
  • 执行权限 (x): 允许用户执行文件或进入目录

权限对应关系

bash
ls -l
# 输出示例
-rw-r--r-- 1 yc staff 1667 9 2 19:03 app.ts

每位含义: 文件权限示例

其中, 2~10位为权限位,分为三组,分别代表文件所有者,文件所属组, 其他人的权限: 权限位示例

rwx权限对文件的作用

对于文件来说,执行权限是最高权限

rwx权限描述
读权限(r)表示可读取此文件中的实际内容,例如,可以对文件执行cat、more、less、head、tail等文件查看命令
写权限(w)表示可以编辑、新增或修改文件中的内容,例如,可以对文件执行vim、echo等修改文件数据的命令。注意,写权限不赋予用户删除文件的权力,除非用户对文件的上级目录拥有写权限才可以
执行权限(x)表示该文件具有被系统执行的权限
但是,文件是否能正确执行,还要看文件中的代码是否正确

rwx权限对目录的作用

rwx权限描述
读权限(r)表示具有读取目录结构列表的权限,也就是说,可以看到目录中有哪些文件和子目录。一旦对目录拥有 r 权限,就可以在此目录下执行 ls 命令,查看目录中的内容
写权限(w)对于目录来说,w 权限是最高权限。对目录拥有 w 权限,表示可以对目录做以下操作:在此目录中建立新的文件或子目录;删除已存在的文件和目录(无论子文件或子目录的权限是怎样的);对已存在的文件或目录做更名操作;移动此目录下的文件和目录的位置。一旦对目录拥有 w 权限,就可以在目录下执行 touch、rm、cp、mv 等命令
执行权限(x)目录是不能直接运行的,对目录赋予 x 权限,代表用户可以进入目录,也就是说,可以使用 cd 命令。

变更文件权限

chmod 命令

bash
chmod [参数] [[角色][赋值权限][权限],…] 文件名

参数:

参数描述
-R递归处理,将指定目录下的所有文件及子目录一并处理
-c显示更改的部分的信息
-f忽略错误信息
-v显示详细的处理信息

角色:

bash
u: user, 文件所有者

g: group, 文件所属组

o: others, 其他人

a: all, 所有人

赋值权限:

bash
+ : 添加权限

- : 删除权限

= : 赋予唯一权限

示例:

bash
# 手动对角色增减权限
chmod -R u+x,g-wx,o=r test.txt

# 使用八进制权限法,对 <所有者、群组、其他人>赋值权限
chmod -R 764 test.txt #设置权限值为 rwxrw-r--

变更文件的所属组

chgrp 命令

bash
chgrp [-R] 所属组 文件名
# -R: 递归处理,将指定目录下的所有文件及子目录一并处理

示例:

bash
chgrp -R test_group ./test # 将test的所属组变更为test_group组

变更文件所有者与所属组

chown 命令

bash
chown [参数] [所有者:所属组] 文件名

参数:

参数描述
-R递归处理,将指定目录下的所有文件及子目录一并处理
-c显示更改的部分的信息
-f忽略错误信息
-v显示详细的处理信息

示例:

bash
chown -R test_user:test_group ./test # test_user用户、test_group组

文件隐藏属性

文件的隐藏属性对系统安全非常的重要

查看文件隐藏属性-lsattr

bash
lsattr [-adR] 文件或目录
# -a: 显示隐藏文件
# -d: 如果查看的是目录,仅列出目录本身的属性而非目录内的文件名
# -R: 递归显示

配置文件隐藏属性-chattr

bash
chattr [+-=] [ASacdistu] 文件或目录
# 选项与参数:
# +: 添加属性
# -: 删除属性
# =: 设置属性
# A: 固定文件的存取时间,当发生新的存取操作时,存取时间atime不会被更新
# S: 当进行任何的文件修改,该修改会立即同步写入磁盘中
# a: 只允许在文件中增加数据,不允许删除和修改数据,只允许root设置
# c: 自动压缩文件,在读取时会自动解压缩,存储时先压缩在存储
# d: 不会被dump备份程序备份
# i: 不允许对文件进行删除、改名、链接、写入等操作,只允许root设置
# s: 保密性删除,文件被删除后,文件内容被擦除,不可恢复

示例:

bash
chattr +i test.txt # 设置test.txt文件为只读文件,不可被删除、改名、链接、写入
chattr -i test.txt # 取消test.txt文件的只读属性

打包与压缩

名词解释

打包: 也成为归档,是将多个文件或目录合并成一个文件的过程。打包后的文件没有经过压缩,它占用的空间是其中所有文件或目录的总和

压缩: 是将一个或多个文件或目录经过压缩算法处理后,生成一个压缩文件。不能直接压缩目录,需要先打包目录,才能压缩打包后的目录

打包与解打包

打包

使用tar命令打包的包通常称为tar包。(以.tar结尾)

bash
tar [选项] 源文件或目录
选项描述
-c将多个文件或目录进行打包
-v显示打包文件过程
-f 包名指定包的文件名。包的扩展名是用来给管理员识别格式的,所以一定要正确指定扩展名
-A追加 tar 文件到归档文件

一般习惯用法是使用选项"-cvf"

bash
tar -cvf test.tar test.txt # 将test.txt文件打包成test.tar

也可以打包多个文件和目录, 以空格分隔

bash
tar -cvf test.tar test.txt test2.txt test_dir 
# 将test.txt、test2.txt、test_dir一并打包成test.tar

解打包 解开的包只能是.tar

bash
tar [选项] 需要解包的包名 #.tar为后缀
选项描述
-x解包
-v显示解包过程
-f 包名指定需要解包的包文件名
-t只查看tar包中有哪些文件或目录,不对tar包做解打包操作
-C 目录指定解包的目录, 默认当前目录

一般习惯用法是使用选项"-xvf"

bash
tar -xvf a.tar #解包到当前目录

tar -xvf a.tar -C /tmp #指定解包后,输出到/tmp目录

另一种用法是使用选项"-tvf"

bash
tar -tvf a.tar #会用长格式显示a.tar文件包中文件的详细信息

##比如:
#  -rw-r-r- root/root 0 2022-05-1 8:00 b.txt 
#  -rw-r-r- root/root 0 2022-05-2 8:00 c.cpp

压缩与解压缩

上面我们说了目录不能直接压缩,需要先打包在压缩,但是在tar命令中只需要再加入一个参数就可以打包后直接压缩/解压了

  • 打包并压缩
    • 使用gzip压缩
      bash
      # 将file1 file2打包并压缩成test.tar.gz
      tar -zcvf test.tar.gz file1 file2
    • 使用bzip2压缩
      bash
      # 将file1 file2打包并压缩成test.tar.bz2
      tar -jcvf test.tar.bz2 file1 file2
    • 使用xz压缩
      bash
      # 将file1 file2打包并压缩成test.tar.xz
      tar -Jcvf test.tar.xz file1 file2
  • 解压并解包
    • 解压.tar.gz文件
      bash
      tar -zxvf test.tar.gz -C /tmp
      # 将test.tar.gz解压到/tmp目录
    • 解压.tar.bz2文件
      bash
      # 将test.tar.bz2解压到/tmp目录
      tar -jxvf test.tar.bz2 -C /tmp
    • 解压.tar.xz文件
      bash
      # 将test.tar.xz解压到/tmp目录
      tar -Jxvf test.tar.xz -C /tmp

< 完结 >

Released under the MIT License.