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三者的关系:
系统调用
根据进程访问资源的特点,我们可以把进程在系统上的运行分为两个级别:
用户态(user mode):用户态运行的进程可以直接读取用户程序的数据。
系统态(kernel mode):系统态运行的进程或程序几乎可以访问计算机的任何资源,不受限制。
在我们运行的用户程序中,凡是与系统态级别的资源有关的操作(如文件管理、进程控制、内存管理等),都必须通过系统调用的方式向操作系统提出服务请求,由操作系统代为完成。
这些系统调用按功能大致可分为如下几类:
功能 | 描述 |
---|---|
设备管理 | 完成设备的请求或释放,以及设备启动等功能 |
文件管理 | 完成文件的读、写、创建及删除等功能 |
进程控制 | 完成进程的创建、撤销、阻塞及唤醒等功能 |
进程通信 | 完成进程之间的消息传递或信号传递等功能 |
内存管理 | 完成内存的分配、回收以及获取作业用内存区大小及地址分配等功能 |
Linux文件系统
inode介绍
文件在硬盘中有可能被分成多个块(block)来存储,因此是我们需要一个空间来存储文件的元信息(metadata),inode就是用来记录某个文件被分成几块、每块所在的地址、文件拥有者、创建时间、权限、大小等信息。
inode = i(index)+ node
每个inode都有一个号码,Linux/Unix操作系统不使用文件名来区分文件,而是使用inode号码区分不同文件。
可以使用stat filename
命令查看文件的inode
信息
Linux文件类型
Linux支持很多文件类型,其中非常重要的文件类型有:
类型 | 描述 |
---|---|
普通文件(-) | 包含纯文本文件、二进制文件和数据文件 |
目录文件(d) | 类似windows中的文件夹 |
链接文件(l) | 类似windows中的快捷方式 |
字符设备(c) | 用来访问字符设备比如键盘 |
设备文件(b) | 用来访问块设备比如硬盘、软盘 |
管道文件(p) | 一种特殊类型的文件,用于进程之间的通信(进程间的通信有两种:匿名管道和有名管道) |
如下方红框中drwxr-xr-x
中的d即表示该文件为目录文件。
Linux目录树结构
所有可操作的计算机资源都存在于目录树这个结构中,对于计算资源的访问,可以看作是对这棵目录树的访问。Linux的目录结构如下:
常见目录说明:
目录 | 说明 |
---|---|
/ | 超级用户(root)的主目录(特权阶级)。 |
/bin | 存放二进制可执行文件(ls, cat, mkdir等),常用命令一般都在这里。 |
/boot | 存放用于系统引导时使用的各种文件 |
/dev | 用于存放设备文件。 |
/etc | 存放系统管理和配置文件。 |
/home | 存放所有用户文件的根目录,可以用~ 表示,是用户目录的基点,比如用户user的主目录就是/home/user ,也可以用~user 表示。 |
/lib | 存放着和系统运行相关的库文件 |
/media | 媒体文件,即可删除的设备,包括软盘、光盘、DVD等 |
/mnt | 系统管理员安装临时文件系统的安装点(挂载点),系统提供这个目录是让用户临时挂载其他的文件系统。 |
/opt | 第三方辅助软件存放的目录。一般情况下,我们可以把tomcat等都安装到这里。 |
/sbin | 存放二进制可执行文件,只有root才能访问。这里存放的是系统管理员使用的系统级别的管理命令和程序,如ifconfig 等。 |
/usr | UNIX 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-在特定的目录中查找文件
bashwhereis [-bmsu] 文件或目录名 # 选项与参数: # -b: 只查找二进制文件 # -m: 只查找帮助文件 # -s: 只查找源文件 # -u: 查找不在默认路径中的文件 > whereis ifconfig ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz
locate-在数据库中搜索指定的文件
此数据库
/var/lib/locatedb
是Linux系统自动创建的,数据库中含有本地文件的所有信息,数据库由updatedb程序来自动更新bashlocate [-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-查找任何类型的文件
bashfind [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): 允许用户执行文件或进入目录
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 命令
chmod [参数] [[角色][赋值权限][权限],…] 文件名
参数:
参数 | 描述 |
-R | 递归处理,将指定目录下的所有文件及子目录一并处理 |
-c | 显示更改的部分的信息 |
-f | 忽略错误信息 |
-v | 显示详细的处理信息 |
角色:
u: user, 文件所有者
g: group, 文件所属组
o: others, 其他人
a: all, 所有人
赋值权限:
+ : 添加权限
- : 删除权限
= : 赋予唯一权限
示例:
# 手动对角色增减权限
chmod -R u+x,g-wx,o=r test.txt
# 使用八进制权限法,对 <所有者、群组、其他人>赋值权限
chmod -R 764 test.txt #设置权限值为 rwxrw-r--
变更文件的所属组
chgrp 命令
chgrp [-R] 所属组 文件名
# -R: 递归处理,将指定目录下的所有文件及子目录一并处理
示例:
chgrp -R test_group ./test # 将test的所属组变更为test_group组
变更文件所有者与所属组
chown 命令
chown [参数] [所有者:所属组] 文件名
参数:
参数 | 描述 |
-R | 递归处理,将指定目录下的所有文件及子目录一并处理 |
-c | 显示更改的部分的信息 |
-f | 忽略错误信息 |
-v | 显示详细的处理信息 |
示例:
chown -R test_user:test_group ./test # test_user用户、test_group组
文件隐藏属性
文件的隐藏属性对系统安全非常的重要
查看文件隐藏属性-lsattr
lsattr [-adR] 文件或目录
# -a: 显示隐藏文件
# -d: 如果查看的是目录,仅列出目录本身的属性而非目录内的文件名
# -R: 递归显示
配置文件隐藏属性-chattr
chattr [+-=] [ASacdistu] 文件或目录
# 选项与参数:
# +: 添加属性
# -: 删除属性
# =: 设置属性
# A: 固定文件的存取时间,当发生新的存取操作时,存取时间atime不会被更新
# S: 当进行任何的文件修改,该修改会立即同步写入磁盘中
# a: 只允许在文件中增加数据,不允许删除和修改数据,只允许root设置
# c: 自动压缩文件,在读取时会自动解压缩,存储时先压缩在存储
# d: 不会被dump备份程序备份
# i: 不允许对文件进行删除、改名、链接、写入等操作,只允许root设置
# s: 保密性删除,文件被删除后,文件内容被擦除,不可恢复
示例:
chattr +i test.txt # 设置test.txt文件为只读文件,不可被删除、改名、链接、写入
chattr -i test.txt # 取消test.txt文件的只读属性
打包与压缩
名词解释
打包: 也成为归档,是将多个文件或目录合并成一个文件的过程。打包后的文件没有经过压缩,它占用的空间是其中所有文件或目录的总和。
压缩: 是将一个或多个文件或目录经过压缩算法处理后,生成一个压缩文件。不能直接压缩目录,需要先打包目录,才能压缩打包后的目录。
打包与解打包
打包
使用tar
命令打包的包通常称为tar包
。(以.tar
结尾)
tar [选项] 源文件或目录
选项 | 描述 |
-c | 将多个文件或目录进行打包 |
-v | 显示打包文件过程 |
-f 包名 | 指定包的文件名。包的扩展名是用来给管理员识别格式的,所以一定要正确指定扩展名 |
-A | 追加 tar 文件到归档文件 |
一般习惯用法是使用选项"-cvf
"
tar -cvf test.tar test.txt # 将test.txt文件打包成test.tar
也可以打包多个文件和目录, 以空格分隔
tar -cvf test.tar test.txt test2.txt test_dir
# 将test.txt、test2.txt、test_dir一并打包成test.tar
解打包 解开的包只能是.tar
包
tar [选项] 需要解包的包名 #.tar为后缀
选项 | 描述 |
-x | 解包 |
-v | 显示解包过程 |
-f 包名 | 指定需要解包的包文件名 |
-t | 只查看tar包中有哪些文件或目录,不对tar包做解打包操作 |
-C 目录 | 指定解包的目录, 默认当前目录 |
一般习惯用法是使用选项"-xvf
"
tar -xvf a.tar #解包到当前目录
tar -xvf a.tar -C /tmp #指定解包后,输出到/tmp目录
另一种用法是使用选项"-tvf"
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
- 使用gzip压缩
- 解压并解包
- 解压.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
- 解压.tar.gz文件
< 完结 >