《精通Linux》 - 笔记1

2020五一假期计划把这本书刷完,然后留下笔记,书籍扔掉。

Ch01 概述

  • 层次:硬件系统 / Linux内核 / 用户进程
  • 用户空间 / 内核空间
  • 主内存:硬件系统中最重要的部分,内核的几乎所有操作都和主内存有关
  • 内核:(1)管理进程(2)管理内存(3)操纵硬件设备(4)系统调用
  • 一个进程让出CPU使用权给另一个进程称为上下文切换(context switch)。内核是在上下文切换时的时间段间隙中运行的(单核CPU)。
  • fork(),exec()

推荐书目

  • Operating System Concepts, 9th Edition (2012) 了解内核的详细工作原理
  • Modern Operating Systems, 4th Edition (2014) 了解内核的详细工作原理

Ch02 基础命令和目录结构

标准输入输出

  • cat,显示文件内容
    • 进程使用I/O流读写数据。进程从输入流中读取数据,向输出流写出数据。
    • 输入流可以是文件、设备、终端或其他进程的输出流。按 ∧ + D 终止当前的标准输入流(stdin)并终止命令。
    • 内核为每个进程提供一个标准输出流(stdout)供它们输出数据。很多命令如果你不为它们指定输入文件,它们就从标准输入获得数据。输出则不同,一部分命令将数据输出到标准输出,另一些可以将数据直接输出到文件。
  • ⌘ > file,将命令的执行结果输出到文件
  • ⌘ >> file,将命令的执行结果加到文件末尾
  • head /proc/cpuinfo | tr a-z A-Z,使用管道字符|,将一个命令的执行结果输出到另一个命令
  • 有时,即使重定向了标准输出,当发生错误时,终端屏幕还是会显示一些报错信息,这其实就是标准错误输出,是用来显示系统错误和调试信息的一种额外的输出流。
    $ ls /fffffff > f
    ls: cannot access '/fffffff': No such file or directory
    
  • 可以用 2> 重定向标准错误输出,这里 2 是由shell修改的流ID,1是标准输出,2是标准错误输出。比如:使用 > 向 f 发送标准输出,使用 >2 向 e 发送标准错误输出
    $ ls /fffffff > f 2> e
    
  • 可以用 2>&1 将标准输出和标准错误输出重定向到同一个地方:
    $ ls /fffffff > f 2>&1
    

基础命令

  • ls,显示指定目录的内容
  • cp,复制文件
  • mv,重命名文件、移动文件
  • touch,创建文件、更新已有文件的时间戳
  • rm,删除文件
  • echo,将它的参数显示到标准输出
  • cd,设置当前工作目录
  • mkdir,创建新目录
  • rmdir,删除空目录

shell可以使用通配符匹配文件名和目录名

  • * 代表任意字符
  • ? 代表任意一个字符
  • '*' 代表 * 本身

中间命令

  • grep,显示文件和输入流中和参数匹配的行
    • grep root /etc/passwd,显示文件/etc/passwd中包含文本root的所有行
    • grep root /etc/*,显示目录/etc/中所有包含文本root的文件
    • 参数 -v,反转匹配,显示所有不匹配的行
    • 参数 -i,不区分大小写
    • grep 支持正则表达式
  • less,查看多屏内容
  • pwd,输出当前的工作目录名
    • pwd -P,符号链接通常很难获知当前目录的信息,可以用这个命令
  • diff,查看两个文件之间的不同
    • diff -u,很多人喜欢用这个参数,因为这个输出格式能被许多自动化工具很好地识别
  • file,显示文件格式信息
  • find,寻找文件
  • locate,寻找文件,在系统创建的文件索引中查找文件,查找更快,但对新创建的文件可能无效。
  • headtail,显示文件的前10行内容/最后10行内容
    • 可以用 -n 参数指定显示的行数
  • sort,将文件内的所有行按照字母顺序排序
    • -r 参数,反向排序

更改密码和shell

  • passwd,更改密码
  • chsh,更改shell

环境变量shell变量

  • shell中可以保存一些临时变量,称作shell变量,它们是一些字符值。用=为shell变量赋值,比如:$ STUFF=blah,将”blah”赋值给变量STUFF,然后就可以使用$STUFF来获得该变量的值,比如:$ echo $STUFF)。
  • 环境变量与shell变量类似,但Unix系统中所有的进程都能访问环境变量,而shell变量只能被当前shell访问。环境变量可以通过 export 命令来设置:
    $ STUFF=blah
    $ export STUFF
    
  • 许多程序使用环境变量作为配置和选项信息。许多命令的帮助手册都有ENVIRONMENT一节,教你如何使用环境变量来设置该命令的参数和选项。
  • PATH 是一个特殊的环境变量,它定义了系统命令路径。命令路径是一个系统目录列表,shell在执行一个命令时,会去这些目录查找这个命令。你可以设置PATH变量,为shell查找命令加入更多的路径:
    $ echo $PATH
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
    # 将路径dir加入到PATH的最前面,这样shell会先查找dir路径
    $ PATH=dir:$PATH
    # 将路径dir加入到PATH的最后面,这样shell最后查找dir路径
    $ PATH=$PATH:dir
    

命令行编辑

  • ∧ + A,光标移动到行首
  • ∧ + E,光标移动到行尾
  • ∧ + W,删除前一个词
  • ∧ + U,删除光标至行首的内容
  • ∧ + K,删除光标至行尾的内容
  • ∧ + Y,粘贴已删除的文本(例如粘贴∧+U所删除的内容)
  • vi 或 Emacs 编辑器,二者选一个使用

查看帮助

  • man ls,查看ls命令帮助信息
  • man -k keyword,如果你只知道某个功能,但是不知道命令名,可以通过关键字查找,比如查找排序有关的命令:
    $ man -k sort
    apt-sortpkgs (1)     - Utility to sort package index files
    bunzip2 (1)          - a block-sorting file compressor, v1.0.6
    bzip2 (1)            - a block-sorting file compressor, v1.0.6
    comm (1)             - compare two sorted files line by line
    sort (1)             - sort lines of text files
    tsort (1)            - perform topological sort
    
  • 帮助手册按照命令类型被组织为很多个章节,章节编号出现在章节名后面的括号中,章节1(用户命令)、5(系统配置文件)、7(文件格式、规范和编码)和8(系统命令和服务器)是很好的补充参考。你可以按照序号来搜索章节,这样更精确:
    $ man 5 passwd
    
  • GNU 项目因为不喜欢帮助手册这种方式,引入了info。info文档内容更加丰富。有一些程序将它们的文档放到目录 /usr/share/doc 中。

查看进程

  • ps,每个进程都有一个数字ID,叫进程ID,可以用ps命令列出所有正在运行的进程
    • x 选项,显示当前用户运行的所有进程
    • ax 选项,显示系统当前运行的所有进程
    • u 选项,显示更为详细的进程信息
    • w 选项,显示命令的全名
  • kill pid,终止进程
  • kill -STOP pid,暂停进程,kill -CONT pid,继续执行进程
  • & 操作符将进程设置为后台运行,比如:你要压缩一个很大文件,同时又不想干等执行结果:$ gunzip file.gz &

文件模式和权限

  • -rw-r--r-x,[类型][用户权限][用户组权限][其他权限],r 文件可读,数字值4,w 文件可写,数字值 2,x 文件可执行,数字值 1;- 无权限,数字值 0。类型:--文件,d-目录,l-符号链接
  • chmod 修改文件权限:chmod user1+r filechmod 644 file
  • 目录也有权限,如果要列出目录内容,需要有读取权限,如果要访问目录中某个文件,需要有可执行权限。
  • umask,设置文件的预定义的默认权限。
  • 符号链接,是指向文件或目录的文件,相当于文件的别名。符号链接的类型是l。符号链接仅仅是指向另一个名字的名字,所以所指向的目录不存在也没关系,直接访问会报错称目录不存在。
  • ln -s target linkname,创建符号链接。target 是指向的目标路径,linkname 是符号链接名称。注意这两个参数不要搞反了。

归档和压缩

目录结构

  • /bin,大部分基础的unix命令
  • /dev,设备文件
  • /etc,存放重要的系统配置文件,许多都是硬件系统的配置文件
  • /home,用户个人目录
  • /lib,供可执行程序使用的各种代码库。一般只有共享库。
  • /proc,通过一个可浏览的目录与文件接口来存放系统相关信息,比如当前运行的进程和内核信息
  • /sys,类似/proc,里面是设备和系统的信息
  • /sbin,可执行的系统文件,这些可执行文件用来管理系统,一般只有root用户才能运行。
  • /tmp,临时文件,所有用户都有读写权限。
  • /usr,存放着许多linux系统文件
    • /bin
    • /lib
    • /sbin1
    • /include,C编译器需要使用的头文件
    • /info,GNU帮助手册
    • /local,管理员安装软件的地方
    • /man,用户手册
    • /share,存放Unix系统间的共享文件。
  • /var,程序存放运行时信息,如系统日志、用户信息、缓存等。
  • /boot,内核加载文件。
  • /opt,存放第三方软件
  • /media,加载可移除设备

以超级用户的身份运行命令

  • 普通用户使用 sudo 来以root用户身份执行命令,需要现在 /etc/sudoers 文件中设置权限,比如:设置用户 user1 不用输入密码即可以超级用户身份运行命令:
    User_Alias ADMINS = user1
    ADMINS ALL = NOPASSWD: ALL
    root ALL=(ALL) ALL
    

推荐书目

  • The Linux ⌘ Line (2012),了解UNIX更多细节
  • UNIX for the Impatient (1995),了解UNIX更多细节
  • Learning the UNIX Operating System, 5th edition (2001),了解UNIX更多细节
  • Mastering Regular Expression, 3rd edition (2006),学习正则表达式
  • Programming Perl, 4th edition (2012) 中 the regular expression 一章,学习正则表达式
  • Introduction to Automata Theory, Language, and Computation, 3rd edition (2006) 了解正则表达式的历史
  • Learning the vi and Vim Editors: Unix Text Processing, 7th edition (2008),学习 vi 编辑器
  • GNU Emacs Manual (2011),学习 Emacs 编辑器