导图社区 Linux
Linux 是一种自由和开放源码的类UNIX操作系统。本图将从0到1带你探究Linux的基础知识,包括部署虚拟环境安装linux系统、新手必须掌握的Linux命令、管道符、重定向与环境变量、Vim编辑器与Shell命令脚本等多个方面,相信你们能很快学会。
编辑于2021-05-11 10:53:05Linux-1
https://github.com/CyC2018/CS-Notes/blob/master/notes/Linux.md 参考资料 鸟哥. 鸟 哥 的 Linux 私 房 菜 基 础 篇 第 三 版[J]. 2009.Linux 平台上的软件包管理Linux 之守护进程、僵死进程与孤儿进程What is the difference between a symbolic link and a hard link?Linux process statesGUID Partition Table详解 wait 和 waitpid 函数IDE、SATA、SCSI、SAS、FC、SSD 硬盘类型介绍Akai IB-301S SCSI Interface for S2800,S3000Parallel ATAADATA XPG SX900 256GB SATA 3 SSD Review – Expanded Capacity and SandForce Driven SpeedDecoding UCS Invicta – Part 1硬盘Difference between SAS and SATABIOSFile system design case studiesProgramming Project #4FILE SYSTEM DESIGN
常用命令以及概念
求助
--help/-h
指令的基本用法与选项介绍
man
当执行 man date 时,有 DATE(1) 出现,其中的数字代表指令的类型,常用的数字及其类型如下: 代号 类型1 用户在 shell 环境中可以操作的指令或者可执行文件5 配置文件8 系统管理员可以使用的管理指令
man 是 manual 的缩写,将指令的具体信息显示出来; 如 man date
info
info 与 man 类似,但是 info 将文档分成一个个页面,每个页面可以跳转
doc
/usr/share/doc 存放着软件的一整套说明文件
关机
who
在关机前需要先使用 who 命令查看有没有其它用户在线
sync
为了加快对磁盘文件的读写速度,位于内存中的文件数据不会立即同步到磁盘,因此关机之前需要先进行 sync 同步操作
shutdown
## shutdown [-krhc] 时间 [信息]-k : 不会关机,只是发送警告信息,通知所有在线的用户-r : 将系统的服务停掉后就重新启动-h : 将系统的服务停掉后就立即关机-c : 取消已经在进行的 shutdown
PATH
可以在环境变量 PATH 中声明可执行文件的路径,路径之间用 : 分隔
sudo
sudo 允许一般用户使用 root 可执行的命令,不过只有在 /etc/sudoers 配置文件中添加的用户才能使用该指令
包管理工具
rpm
Red Hat Fedora / CentOS
RPM 全称为 Redhat Package Manager,最早由 Red Hat 公司制定实施,随后被 GNU 开源操作系统接受并成为许多 Linux 系统的既定软件标准。YUM 基于RPM,具有依赖管理和软件升级功能
dpkg
Ubuntu Debian
与 RPM 竞争的是基于 Debian 操作系统的 DEB 软件包管理工具 DPKG,全称为 Debian Package,功能方面与 RPM 相似
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),包含了以下内容: 以任何目的运行此程序的自由;再复制的自由;改进此程序,并公开发布改进的自由。
开源协议
GPL、BSD、MIT、Mozilla、Apache和LGPL
磁盘
磁盘接口
IDE
IDE(ATA)全称 Advanced Technology Attachment,接口速度最大为133MB/s,因为并口线的抗干扰性太差,且排线占用空间较大,不利电脑内部散热,已逐渐被 SATA 所取代
SATA
SATA 全称 Serial ATA,也就是使用串口的 ATA 接口,抗干扰性强,且对数据线的长度要求比 ATA 低很多,支持热插拔等功能。SATA-II 的接口速度为 300MB/s,而 SATA-III 标准可达到 600MB/s 的传输速度。SATA 的数据线也比 ATA 的细得多,有利于机箱内的空气流通,整理线材也比较方便
SCSI
SCSI 全称是 Small Computer System Interface(小型机系统接口),SCSI 硬盘广为工作站以及个人电脑以及服务器所使用,因此会使用较为先进的技术,如碟片转速 15000rpm 的高转速,且传输时 CPU 占用率较低,但是单价也比相同容量的 ATA 及 SATA 硬盘更加昂贵
SAS
SAS(Serial Attached SCSI)是新一代的 SCSI 技术,和 SATA 硬盘相同,都是采取序列式技术以获得更高的传输速度,可达到 6Gb/s。此外也通过缩小连接线改善系统内部空间等
磁盘的文件名
Linux 中每个硬件都被当做一个文件,包括磁盘。磁盘以磁盘接口类型进行命名,常见磁盘的文件名如下: IDE 磁盘:/dev/hd[a-d] SATA/SCSI/SAS 磁盘:/dev/sd[a-p]其中文件名后面的序号的确定与系统检测到磁盘的顺序有关,而与磁盘所插入的插槽位置无关
分区
分区表
MBR
MBR 中,第一个扇区最重要,里面有主要开机记录(Master boot record, MBR)及分区表(partition table),其中主要开机记录占 446 bytes,分区表占 64 bytes。 分区表只有 64 bytes,最多只能存储 4 个分区,这 4 个分区为主分区(Primary)和扩展分区(Extended)。其中扩展分区只有一个,它使用其它扇区来记录额外的分区表,因此通过扩展分区可以分出更多分区,这些分区称为逻辑分区。 Linux 也把分区当成文件,分区文件的命名方式为:磁盘文件名 + 编号,例如 /dev/sda1。注意,逻辑分区的编号从 5 开始。
GPT
开机检测程序
BIOS
UEFI
文件系统
分区与文件系统
对分区进行格式化是为了在分区上建立文件系统。一个分区通常只能格式化为一个文件系统,但是磁盘阵列等技术可以将一个分区格式化为多个文件系统
组成
inode
一个文件占用一个 inode,记录文件的属性,同时记录此文件的内容所在的 block 编号
block
记录文件的内容,文件太大时,会占用多个 block
superblock
记录文件系统的整体信息,包括 inode 和 block 的总量、使用量、剩余量,以及文件系统的格式与相关信息等
block bitmap
记录 block 是否被使用的位图
文件读取
Ext2
对于 Ext2 文件系统,当要读取一个文件的内容时,先在 inode 中查找文件内容所在的所有 block,然后把所有 block 的内容读出来
FAT
而对于 FAT 文件系统,它没有 inode,每个 block 中存储着下一个 block 的编号
磁盘碎片
指一个文件内容所在的 block 过于分散,导致磁盘磁头移动距离过大,从而降低磁盘读写性能
block
在 Ext2 文件系统中所支持的 block 大小有 1K,2K 及 4K 三种,不同的大小限制了单个文件和文件系统的最大大小。 大小 1KB 2KB 4KB最大单一文件 16GB 256GB 2TB最大文件系统 2TB 8TB 16TB 一个 block 只能被一个文件所使用,未使用的部分直接浪费了。因此如果需要存储大量的小文件,那么最好选用比较小的 block。
一个 block 只能被一个文件所使用,未使用的部分直接浪费了。因此如果需要存储大量的小文件,那么最好选用比较小的 block
inode
inode 具体包含以下信息: 权限 (read/write/excute);拥有者与群组 (owner/group);容量;建立或状态改变的时间 (ctime);最近读取时间 (atime);最近修改时间 (mtime);定义文件特性的旗标 (flag),如 SetUID...;该文件真正内容的指向 (pointer)。inode 具有以下特点: 每个 inode 大小均固定为 128 bytes (新的 ext4 与 xfs 可设定到 256 bytes);每个文件都仅会占用一个 inode。inode 中记录了文件内容所在的 block 编号,但是每个 block 非常小,一个大文件随便都需要几十万的 block。而一个 inode 大小有限,无法直接引用这么多 block 编号。因此引入了间接、双间接、三间接引用。间接引用让 inode 记录的引用 block 块记录引用信息。
每个 inode 大小均固定为 128 bytes (新的 ext4 与 xfs 可设定到 256 bytes);每个文件都仅会占用一个 inode
目录
可以看到文件的 inode 本身不记录文件名,文件名记录在目录中,因此新增文件、删除文件、更改文件名这些操作与目录的写权限有关
建立一个目录时,会分配一个 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-a :列出全部的文件-d :仅列出目录本身-l :以长数据串行列出,包含文件的属性与权限等等数据
列出文件或者目录的信息,目录的信息就是其中包含的文件
cd
cd [相对路径或绝对路径]
更换目录
mkdir
## mkdir [-mp] 目录名称-m :配置目录权限-p :递归创建目录
创建目录
rmkdir
rmdir [-p] 目录名称-p :递归删除目录
删除目录,目录必须为空
touch
## touch [-acdmt] filename-a : 更新 atime-c : 更新 ctime,若该文件不存在则不建立新文件-m : 更新 mtime-d : 后面可以接更新日期而不使用当前日期,也可以使用 --date="日期或时间"-t : 后面可以接更新时间而不使用当前时间,格式为[YYYYMMDDhhmm]
更新文件时间或者建立新文件
cp
cp [-adfilprsu] source destination-a :相当于 -dr --preserve=all-d :若来源文件为链接文件,则复制链接文件属性而非文件本身-i :若目标文件已经存在时,在覆盖前会先询问-p :连同文件的属性一起复制过去-r :递归复制-u :destination 比 source 旧才更新 destination,或 destination 不存在的情况下才复制--preserve=all :除了 -p 的权限相关参数外,还加入 SELinux 的属性, links, xattr 等也复制了
复制文件
rm
## rm [-fir] 文件或目录-r :递归删除-f :强制删除,谨慎使用
删除文件
mv
## mv [-fiu] source destination## mv [options] source1 source2 source3 .... directory-f : force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖
移动文件
修改权限
可以将一组权限用数字来表示,此时一组权限的 3 个位当做二进制数字的位,从左到右每个位的权值为 4、2、1,即每个权限对应的数字权值为 r : 4、w : 2、x : 1。 ## chmod [ugoa] [+-=] [rwx] dirname/filename- u:拥有者- g:所属群组- o:其他人- a:所有人- +:添加权限- -:移除权限- =:设定权限
chmod a+w .bashrc
为 .bashrc 文件的所有用户添加写权限
chmod 754 .bashrc
将 .bashrc 文件的权限修改为 -rwxr-xr--
默认权限
文件默认权限
文件默认没有可执行权限,因此为 666,也就是 -rw-rw-rw-
目录默认权限
目录必须要能够进入,也就是必须拥有可执行权限,因此为 777 ,也就是 drwxrwxrwx
umask
umask 设置或者查看默认权限,通常以掩码的形式来表示,例如 002 表示其它用户的权限去除了一个 2 的权限,也就是写权限,因此建立新文件时默认的权限为 -rw-rw-r--
设置或者查看默认权限
目录权限
目录的 r 权限表示可以读取文件列表;w 权限表示可以修改文件列表,具体来说,就是添加删除文件,对文件名进行修改;x 权限可以让该目录成为工作目录,x 权限是 r 和 w 权限的基础
链接
## ln [-sf] source_filename dist_filename-s :默认是实体链接,加 -s 为符号链接-f :如果目标文件存在时,先删除目标文件
实体链接
在目录下创建一个条目,记录着文件名与 inode 编号,这个 inode 就是源文件的 inode。 删除任意一个条目,文件还是存在,只要引用数量不为 0。 有以下限制:不能跨越文件系统、不能对目录进行链接。 ## ln /etc/crontab .## ll -i /etc/crontab crontab34474855 -rw-r--r--. 2 root root 451 Jun 10 2014 crontab34474855 -rw-r--r--. 2 root root 451 Jun 10 2014 /etc/crontab
符号链接
符号链接文件保存着源文件所在的绝对路径,在读取时会定位到源文件上,可以理解为 Windows 的快捷方式。 当源文件被删除了,链接文件就打不开了。 因为记录的是路径,所以可以为目录建立符号链接。 ## ll -i /etc/crontab /root/crontab234474855 -rw-r--r--. 2 root root 451 Jun 10 2014 /etc/crontab53745909 lrwxrwxrwx. 1 root root 12 Jun 23 22:31 /root/crontab2 -> /etc/crontab
获取文件内容
cat
## cat [-AbEnTv] filename-n :打印出行号,连同空白行也会有行号,-b 不会
读取文件内容
tac
是 cat 的反向操作,从最后一行开始打印
more
一页一页查看文件内容,比较适合大文件的查看
less
和 more 类似,但是多了一个向前翻页的功能
head
## head [-n number] filename-n :后面接数字,代表显示几行的意思
读取文件前几行
tail
是 head 的反向操作,只是取得是后几行; -f 实时更新
od
以字符或者十六进制的形式显示二进制文件
指令与文件搜索
which
whereis
locate
find
文件搜索。可以使用文件的属性和权限进行搜索。 ## find [basedir] [option]example: find . -name "shadow*"
与时间有关的选项
-mtime n :列出在 n 天前的那一天修改过内容的文件-mtime +n :列出在 n 天之前 (不含 n 天本身) 修改过内容的文件-mtime -n :列出在 n 天之内 (含 n 天本身) 修改过内容的文件-newer file : 列出比 file 更新的文件
与文件拥有者和所属群组有关的选项
-uid n-gid n-user name-group name-nouser :搜索拥有者不存在 /etc/passwd 的文件-nogroup:搜索所属群组不存在于 /etc/group 的文件
与文件权限和名称有关的选项
-name filename-size [+-]SIZE:搜寻比 SIZE 还要大 (+) 或小 (-) 的文件。这个 SIZE 的规格有:c: 代表 byte,k: 代表 1024bytes。所以,要找比 50KB 还要大的文件,就是 -size +50k-type TYPE-perm mode :搜索权限等于 mode 的文件-perm -mode :搜索权限包含 mode 的文件-perm /mode :搜索权限包含任一 mode 的文件
总计目录下文件个数
ls -l ./temp| grep "^-" | wc -l
ls -lR ./temp | grep "^-" | wc -l
包括子文件夹
总计目录下文件夹个数
ls -l |grep "^d" | wc -l
压缩与打包
压缩指令
tar -zxvf test.tar.gz
tar -zcvf test.tar.gz test/
gzip
p, li { white-space: pre-wrap; } gzip [-cdtv#] filename -c :将压缩的数据输出到屏幕上 -d :解压缩 -t :检验压缩文件是否出错 -v :显示压缩比等信息 -# : # 为数字的意思,代表压缩等级,数字越大压缩比越高,默认为 6
bzip2
bzip2 [-cdkzv#] filename-k :保留源文件
子主题
Bash
数据流重定向
标准输入 (stdin) 0 < 或 <<
标准输出 (stdout) 1 > 或 >>
标准错误输出 (stderr) 2 2> 或 2>>
管道指令
ls -al /etc | less
提取指令
cut
$ cut-d :分隔符-f :经过 -d 分隔后,使用 -f n 取出第 n 个区间-c :以字符为单位取出区间
last | cut -d ' ' -f 1
排序指令
sort
$ sort [-fbMnrtuk] [file or stdin]-f :忽略大小写-b :忽略最前面的空格-M :以月份的名字来排序,例如 JAN,DEC-n :使用数字-r :反向排序-u :相当于 unique,重复的内容只出现一次-t :分隔符,默认为 tab-k :指定排序的区间
cat /etc/passwd | sort -t ':' -k 3
uniq
$ uniq [-ic]-i :忽略大小写-c :进行计数
last | cut -d ' ' -f 1 | sort | uniq -c
双向输出重定向
tee
输出重定向会将输出内容重定向到文件中,而 tee 不仅能够完成这个功能,还能保留屏幕上的输出。也就是说,使用 tee 指令,一个输出会同时传送到文件和屏幕上。 $ tee [-a] file
echo "1212121" | tee -a test.log
字符转换指令
tr
tr 用来删除一行中的字符,或者对字符进行替换。 $ tr [-ds] SET1 ...-d : 删除行中 SET1 这个字符串
用来删除一行中的字符,或者对字符进行替换
last | tr '[a-z]' '[A-Z]'
col
col 将 tab 字符转为空格字符。 $ col [-xb]-x : 将 tab 键转换成对等的空格键
将 tab 字符转为空格字符
expand
expand 将 tab 转换一定数量的空格,默认是 8 个。 $ expand [-t] file-t :tab 转为空格的数量
将 tab 转换一定数量的空格,默认是 8 个
expand -4 test.log
join
join 将有相同数据的那一行合并在一起。 $ join [-ti12] file1 file2-t :分隔符,默认为空格-i :忽略大小写的差异-1 :第一个文件所用的比较字段-2 :第二个文件所用的比较字段
将有相同数据的那一行合并在一起
join -ti12 test1.log test2.log
paste
paste 直接将两行粘贴在一起。 $ paste [-d] file1 file2-d :分隔符,默认为 tab
直接将两行粘贴在一起
split
split 将一个文件划分成多个文件。 $ split [-bl] file PREFIX-b :以大小来进行分区,可加单位,例如 b, k, m 等-l :以行数来进行分区。- PREFIX :分区文件的前导名称
将一个文件划分成多个文件
正则表达式
grep
g/re/p(globally search a regular expression and print),使用正则表示式进行全局查找并打印。 $ grep [-acinv] [--color=auto] 搜寻字符串 filename-c : 统计匹配到行的个数-i : 忽略大小写-n : 输出行号-v : 反向选择,也就是显示出没有 搜寻字符串 内容的那一行--color=auto :找到的关键字加颜色显示示例:把含有 the 字符串的行提取出来(注意默认会有 --color=auto 选项,因此以下内容在 Linux 中有颜色显示 the 字符串) $ grep -n 'the' regular_express.txt8:I can't finish the test.12:the symbol '*' is represented as start.15:You are the best is mean you are the no. 1.16:The world Happy is the same with "glad".18:google is the best tools for search keyword示例:正则表达式 a{m,n} 用来匹配字符 a m~n 次,这里需要将 { 和 } 进行转义,因为它们在 shell 是有特殊意义的。 $ grep -n 'a\{2,5\}' regular_express.txt
grep -n 'a\{2,5\}' regular_express.txt
printf
用于格式化输出。它不属于管道命令,在给 printf 传数据时需要使用 $( ) 形式。 $ printf '%10s %5i %5i %5i %8.2f \n' $(cat printf.txt) DmTsai 80 60 92 77.33 VBird 75 55 80 70.00 Ken 60 90 70 73.33
awk
是由 Alfred Aho,Peter Weinberger 和 Brian Kernighan 创造,awk 这个名字就是这三个创始人名字的首字母。 awk 每次处理一行,处理的最小单位是字段,每个字段的命名方式为:$n,n 为字段号,从 1 开始,$0 表示一整行。 示例:取出最近五个登录用户的用户名和 IP。首先用 last -n 5 取出用最近五个登录用户的所有信息,可以看到用户名和 IP 分别在第 1 列和第 3 列,我们用 $1 和 $3 就能取出这两个字段,然后用 print 进行打印。 $ last -n 5dmtsai pts/0 192.168.1.100 Tue Jul 14 17:32 still logged indmtsai pts/0 192.168.1.100 Thu Jul 9 23:36 - 02:58 (03:22)dmtsai pts/0 192.168.1.100 Thu Jul 9 17:23 - 23:36 (06:12)dmtsai pts/0 192.168.1.100 Thu Jul 9 08:02 - 08:17 (00:14)dmtsai tty1 Fri May 29 11:55 - 12:11 (00:15)$ last -n 5 | awk '{print $1 "\t" $3}'dmtsai 192.168.1.100dmtsai 192.168.1.100dmtsai 192.168.1.100dmtsai 192.168.1.100dmtsai Fri可以根据字段的某些条件进行匹配,例如匹配字段小于某个值的那一行数据。 $ awk '条件类型 1 {动作 1} 条件类型 2 {动作 2} ...' filename示例:/etc/passwd 文件第三个字段为 UID,对 UID 小于 10 的数据进行处理。 $ cat /etc/passwd | awk 'BEGIN {FS=":"} $3 < 10 {print $1 "\t " $3}'root 0bin 1daemon 2awk 变量: 变量名称 代表意义NF 每一行拥有的字段总数NR 目前所处理的是第几行数据FS 目前的分隔字符,默认是空格键示例:显示正在处理的行号以及每一行有多少字段 $ last -n 5 | awk '{print $1 "\t lines: " NR "\t columns: " NF}'dmtsai lines: 1 columns: 10dmtsai lines: 2 columns: 10dmtsai lines: 3 columns: 10dmtsai lines: 4 columns: 10dmtsai lines: 5 columns: 9
last -n 5 | awk '{print $1 "\t" $3}'
进程管理
查看进程
netstat
查看占用端口的进程 示例:查看特定端口的进程 ## netstat -anp | grep port
ps
查看某个时间点的进程信息。 示例:查看自己的进程 ## ps -l示例:查看系统所有进程 ## ps aux示例:查看特定的进程 ## ps aux | grep threadx
ps -aux
pstree
查看进程树。 示例:查看所有进程树 ## pstree -A
pstree -A
top
实时显示进程信息。 示例:两秒钟刷新一次 ## top -d 2
top -d 2
netstat -anp | grep port
进程状态
p, li { white-space: pre-wrap; } 状态 说明 R running or runnable (on run queue)正在执行或者可执行,此时进程位于执行队列中。 D uninterruptible sleep (usually I/O)不可中断阻塞,通常为 IO 阻塞。 S interruptible sleep (waiting for an event to complete) 可中断阻塞,此时进程正在等待某个事件完成。 Z zombie (terminated but not reaped by its parent)僵死,进程已经终止但是尚未被其父进程获取信息。 T stopped (either by a job control signal or because it is being traced) 结束,进程既可以被作业控制信号结束,也可能是正在被追踪。