Linux
一、常用操作以及概念
快捷键
Tab:命令和文件名补全;
Ctrl+C:中断正在运行的程序;
Ctrl+D:结束键盘输入(End Of File,EOF)
求助
1. --help 指令的基本用法与选项介绍
2. man 是 manual 的缩写,将指令的具体信息显示出来。
3. info 与 man 类似,但是 info 将文档分成一个个页面,每个页面可以跳转。
4. doc /usr/share/doc 存放着软件的一整套说明文件。
关机
1. who 在关机前需要先使用 who 命令查看有没有其它用户在线。
2. sync 为了加快对磁盘文件的读写速度,位于内存中的文件数据不会立即同步到磁盘,因此关机之前需要先进行 sync 同步操作。
3. shutdown shutdown [-krhc] 时间 [信息]
PATH
可以在环境变量 PATH 中声明可执行文件的路径,路径之间用 : 分隔
sudo
sudo 允许一般用户使用 root 可执行的命令,不过只有在 /etc/sudoers 配置文件中添加的用户才能使用该指令。
包管理工具
RPM 和 DPKG 为最常见的两类软件包管理工具
发行版
Linux 发行版是 Linux 内核及各种应用软件的集成版本
VIM 三个模式
一般指令模式(Command mode):VIM 的默认模式,可以用于移动游标查看内容;
编辑模式(Insert mode):按下 "i" 等按键之后进入,可以对文本进行编辑;
指令列模式(Bottom-line mode):按下 ":" 按键之后进入,用于保存退出等操作。
在指令列模式下,有以下命令用于离开或者保存文件。
命令 作用
:w 写入磁盘
:w! 当文件为只读时,强制写入磁盘。到底能不能写入,与用户对该文件的权限有关
:q 离开
:q! 强制离开不保存
:wq 写入磁盘后离开
:wq! 强制写入磁盘后离开
GNU
GNU 计划,译为革奴计划,它的目标是创建一套完全自由的操作系统,称为 GNU,其内容软件完全以 GPL 方式发布。其中 GPL 全称为 GNU 通用公共许可协议(GNU General Public License),包含了以下内容:
- 以任何目的运行此程序的自由
- 再复制的自由
- 改进此程序,并公开发布改进的自由
二、磁盘
磁盘接口
1. IDE
2. SATA
3. SCSI
4. SAS
磁盘的文件名
Linux 中每个硬件都被当做一个文件,包括磁盘。磁盘以磁盘接口类型进行命名,常见磁盘的文件名如下:
- IDE 磁盘:/dev/hd[a-d]
- SATA/SCSI/SAS 磁盘:/dev/sd[a-p]
其中文件名后面的序号的确定与系统检测到磁盘的顺序有关,而与磁盘所插入的插槽位置无关。
三、分区
分区表
磁盘分区表主要有两种格式,一种是限制较多的 MBR 分区表,一种是较新且限制较少的 GPT 分区表。
1. MBR
2. GPT
MBR 不支持 2.2 TB 以上的硬盘,GPT 则最多支持到 233 TB = 8 ZB。
开机检测程序
1. BIOS BIOS(Basic Input/Output System,基本输入输出系统),它是一个固件(嵌入在硬件中的软件),BIOS 程序存放在断电后内容不会丢失的只读内存中。
2. UEFI BIOS 不可以读取 GPT 分区表,而 UEFI 可以
四、文件系统
分区与文件系统
对分区进行格式化是为了在分区上建立文件系统。一个分区通常只能格式化为一个文件系统,但是磁盘阵列等技术可以将一个分区格式化为多个文件系统。
组成
- inode:一个文件占用一个 inode,记录文件的属性,同时记录此文件的内容所在的 block 编号;
- block:记录文件的内容,文件太大时,会占用多个 block。
- superblock:记录文件系统的整体信息,包括 inode 和 block 的总量、使用量、剩余量,以及文件系统的格式与相关信息等;
- block bitmap:记录 block 是否被使用的位图。
文件读取
- 对于 Ext2 文件系统,当要读取一个文件的内容时,先在 inode 中查找文件内容所在的所有 block,然后把所有 block 的内容读出来。
- 而对于 FAT 文件系统,它没有 inode,每个 block 中存储着下一个 block 的编号。
磁盘碎片
指一个文件内容所在的 block 过于分散,导致磁盘磁头移动距离过大,从而降低磁盘读写性能。
block
在 Ext2 文件系统中所支持的 block 大小有 1K,2K 及 4K 三种,不同的大小限制了单个文件和文件系统的最大大小。
inode 具体包含以下信息:
权限 (read/write/excute);
拥有者与群组 (owner/group);
容量;
建立或状态改变的时间 (ctime);
最近读取时间 (atime);
最近修改时间 (mtime);
定义文件特性的旗标 (flag),如 SetUID...;
该文件真正内容的指向 (pointer)。
目录
建立一个目录时,会分配一个 inode 与至少一个 block。block 记录的内容是目录下所有文件的 inode 编号以及文件名。
日志
如果突然断电,那么文件系统会发生错误,例如断电前只修改了 block bitmap,而还没有将数据真正写入 block 中。
ext3/ext4 文件系统引入了日志功能,可以利用日志来修复文件系统。
挂载
挂载利用目录作为文件系统的进入点,也就是说,进入目录之后就可以读取文件系统的数据。
目录配置
为了使不同 Linux 发行版本的目录结构保持一致性,Filesystem Hierarchy Standard (FHS) 规定了 Linux 的目录结构。最基础的三个目录如下:
/ (root, 根目录)
/usr (unix software resource):所有系统默认软件都会安装到这个目录;
/var (variable):存放系统或程序运行过程中的数据文件。
五、文件
文件属性
用户分为三种:文件拥有者、群组以及其它人,对不同的用户有不同的文件权限。
使用 ls 查看一个文件时,会显示一个文件的信息,例如 drwxr-xr-x 3 root root 17 May 6 00:14 .config,对这个信息的解释如下:
drwxr-xr-x:文件类型以及权限,第 1 位为文件类型字段,后 9 位为文件权限字段
3:链接数
root:文件拥有者
root:所属群组
17:文件大小
May 6 00:14:文件最后被修改的时间
.config:文件名
常见的文件类型及其含义有:
d:目录
-:文件
l:链接文件
9 位的文件权限字段中,每 3 个为一组,共 3 组,每一组分别代表对文件拥有者、所属群组以及其它人的文件权限。一组权限中的 3 位分别为 r、w、x 权限,表示可读、可写、可执行。
文件时间有以下三种:
modification time (mtime):文件的内容更新就会更新;
status time (ctime):文件的状态(权限、属性)更新就会更新;
access time (atime):读取文件时就会更新。
文件与目录的基本操作
- ls 列出文件或者目录的信息,目录的信息就是其中包含的文件。 ls [-aAdfFhilnrRSt] file|dir
- cd 更换当前目录 cd [相对路径或绝对路径]
- mkdir 创建目录 mkdir [-mp] 目录名称
- rmdir 删除目录,目录必须为空 rmdir [-p] 目录名称
- touch 更新文件时间或者建立新文件 touch [-acdmt] filename
- cp 复制文件 如果源文件有两个以上,则目的文件一定要是目录才行 cp [-adfilprsu] source destination
- rm 删除文件 rm [-fir] 文件或目录
- mv 移动文件 mv [-fiu] source destination
修改权限
可以将一组权限用数字来表示,此时一组权限的 3 个位当做二进制数字的位,从左到右每个位的权值为 4、2、1,即每个权限对应的数字权值为 r : 4、w : 2、x : 1。
chmod [-R] xyz dirname/filename
默认权限
文件默认权限:文件默认没有可执行权限,因此为 666,也就是 -rw-rw-rw- 。
目录默认权限:目录必须要能够进入,也就是必须拥有可执行权限,因此为 777 ,也就是 drwxrwxrwx。
目录的权限
文件名不是存储在一个文件的内容中,而是存储在一个文件所在的目录中。因此,拥有文件的 w 权限并不能对文件名进行修改。
链接
ln [-sf] source_filename dist_filename
获取文件内容
- cat 取得文件内容 cat [-AbEnTv] filename
- tac 是 cat 的反向操作,从最后一行开始打印
- more 和 cat 不同的是它可以一页一页查看文件内容,比较适合大文件的查看
- less 和 more 类似,但是多了一个向前翻页的功能
- head 取得文件前几行
- tail 是 head 的反向操作,只是取得是后几行。
- od 以字符或者十六进制的形式显示二进制文件。
指令与文件搜索
- which 指令搜索 which [-a] command
- whereis 文件搜索。速度比较快,因为它只搜索几个特定的目录 whereis [-bmsu] dirname/filename
- locate 文件搜索。可以用关键字或者正则表达式进行搜索 locate [-ir] keyword
- find 文件搜索。可以使用文件的属性和权限进行搜索 find [basedir] [option]
六、压缩与打包
压缩指令
1. gzip gzip 是 Linux 使用最广的压缩指令,可以解开 compress、zip 与 gzip 所压缩的文件。
2. bzip2 提供比 gzip 更高的压缩比。
3. xz 提供比 bzip2 更佳的压缩比。
打包
压缩指令只能对一个文件进行压缩,而打包能够将多个文件打包成一个大文件。tar 不仅可以用于打包,也可以使用 gzip、bzip2、xz 将打包文件进行压缩。
七、Bash
可以通过 Shell 请求内核提供服务,Bash 正是 Shell 的一种。
特性
命令历史:记录使用过的命令
命令与文件补全:快捷键:tab
命名别名:例如 ll 是 ls -al 的别名
shell scripts
通配符:例如 ls -l /usr/bin/X* 列出 /usr/bin 下面所有以 X 开头的文件
变量操作
对一个变量赋值直接使用 =。
对变量取用需要在变量前加上 $ ,也可以用 ${} 的形式;
输出变量使用 echo 命令。
可以使用 export 命令将自定义变量转成环境变量,环境变量可以在子程序中使用,所谓子程序就是由当前 Bash 而产生的子 Bash。
Bash 的变量可以声明为数组和整数数字。注意数字类型没有浮点数。如果不进行声明,默认是字符串类型。变量的声明使用 declare 命令:
$ declare [-aixr] variable
指令搜索顺序
以绝对或相对路径来执行指令,例如 /bin/ls 或者 ./ls ;
由别名找到该指令来执行;
由 Bash 内置的指令来执行;
按 $PATH 变量指定的搜索路径的顺序找到第一个指令来执行。
数据流重定向
重定向指的是使用文件代替标准输入、标准输出和标准错误输出。
其中,有一个箭头的表示以覆盖的方式重定向,而有两个箭头的表示以追加的方式重定向。
可以将不需要的标准输出以及标准错误输出重定向到 /dev/null,相当于扔进垃圾箱。
如果需要将标准输出以及标准错误输出同时重定向到一个文件,需要将某个输出转换为另一个输出,例如 2>&1 表示将标准错误输出转换为标准输出。
$ find /home -name .bashrc > list 2>&1
八、管道指令
管道是将一个命令的标准输出作为另一个命令的标准输入,在数据需要经过多个步骤的处理之后才能得到我们想要的内容时就可以使用管道。
在命令之间使用 | 分隔各个管道命令。
$ ls -al /etc | less
提取指令
cut 对数据进行切分,取出想要的部分。切分过程一行一行地进行。
排序指令
sort 用于排序 sort [-fbMnrtuk] [file or stdin]
uniq 可以将重复的数据只取一个 uniq [-ic]
双向输出重定向
输出重定向会将输出内容重定向到文件中,而 tee 不仅能够完成这个功能,还能保留屏幕上的输出。也就是说,使用 tee 指令,一个输出会同时传送到文件和屏幕上。
tee [-a] file
字符转换指令
tr 用来删除一行中的字符,或者对字符进行替换 tr [-ds] SET1 ...
col 将 tab 字符转为空格字符 col [-xb]
expand 将 tab 转换一定数量的空格,默认是 8 个 expand [-t] file
join 将有相同数据的那一行合并在一起 join [-ti12] file1 file2
paste 直接将两行粘贴在一起 paste [-d] file1 file2
分区指令
split 将一个文件划分成多个文件 split [-bl] file PREFIX
九、正则表达式
grep
g/re/p(globally search a regular expression and print),使用正则表示式进行全局查找并打印。
grep [-acinv] [--color=auto] 搜寻字符串 filename
printf
用于格式化输出。它不属于管道命令,在给 printf 传数据时需要使用 $( ) 形式。
awk
是由 Alfred Aho,Peter Weinberger 和 Brian Kernighan 创造,awk 这个名字就是这三个创始人名字的首字母。
awk 每次处理一行,处理的最小单位是字段,每个字段的命名方式为:$n,n 为字段号,从 1 开始,$0 表示一整行。
十、进程管理
查看进程
- ps 查看某个时间点的进程信息
- pstree 查看进程树
- top 实时显示进程信息
- netstat 查看占用端口的进程
SIGCHLD
当一个子进程改变了它的状态时(停止运行,继续运行或者退出),有两件事会发生在父进程中:
得到 SIGCHLD 信号;
waitpid() 或者 wait() 调用会返回。
其中子进程发送的 SIGCHLD 信号包含了子进程的信息,比如进程 ID、进程状态、进程使用 CPU 的时间等。
在子进程退出时,它的进程描述符不会立即释放,这是为了让父进程得到子进程信息,父进程通过 wait() 和 waitpid() 来获得一个已经退出的子进程的信息。
孤儿进程
一个父进程退出,而它的一个或多个子进程还在运行,那么这些子进程将成为孤儿进程。
孤儿进程将被 init 进程(进程号为 1)所收养,并由 init 进程对它们完成状态收集工作。
由于孤儿进程会被 init 进程收养,所以孤儿进程不会对系统造成危害。
僵尸进程
一个子进程的进程描述符在子进程退出时不会释放,只有当父进程通过 wait() 或 waitpid() 获取了子进程信息后才会释放。如果子进程退出,而父进程并没有调用 wait() 或 waitpid(),那么子进程的进程描述符仍然保存在系统中,这种进程称之为僵尸进程。
僵尸进程通过 ps 命令显示出来的状态为 Z(zombie)。
系统所能使用的进程号是有限的,如果产生大量僵尸进程,将因为没有可用的进程号而导致系统不能产生新的进程。
要消灭系统中大量的僵尸进程,只需要将其父进程杀死,此时僵尸进程就会变成孤儿进程,从而被 init 进程所收养,这样 init 进程就会释放所有的僵尸进程所占有的资源,从而结束僵尸进程。