Linux 学习

比较重要的知识点

能简单使用 cat,grep,cut 等命令进行一些操作;
文件系统相关的原理,inode 和 block 等概念,数据恢复;
硬链接与软链接;
进程管理相关,僵尸进程与孤儿进程,SIGCHLD 。

Linux 目录结构

根目录是 / 。 底下有好几个目录文件夹。

bin : 存放系统的可执行文件

boot: 存放用于系统引导时使用的各种文件。

dev : 存放设备文件。

etc : 存放系统配置文件。

home : 存放所有用户的文件,是用户文件的根目录。

lib : 存放跟文件系统中的程序所需要的 共享库 及 内核模块。

mnt : 系统管理员安装临时文件的目录。

opt : 自己安装的一些应用程序包。一般放 部署的 API。

usr : 存放系统应用程序。 usr/local : 本地管理员的软件安装目录

文件的属性:

[root@hecs-x-medium-2-linux-20200703093020 ~]# ll
-rw-r--r-- 1 root root 26024 Apr 25  2019 mysql80-community-release-el7-3.noarch.rpm

就按顺序来看看显示出来的东西代表什么意思:

  1. 第一个字符代表文件的类型

    • d : 这是一个目录
    • - : 这是一个文件
    • l : 这是一个链接文件,是一个软链接
  2. 后面 3 * 3 个字符,代表各用户对文件的权限, 3 个为一组划分看。

    • r : 读权限, 也可以用数字 4 表示, 2 的 2 次幂。
    • w : 写权限, 也可以用数字 2 表示, 2 的 1 次幂。
    • x : 可执行, 也可以用数字 1 表示, 2 的 0 次幂。

    前面 3 个字符,表示 文件拥有者 的权限。

    中间 3 个字符,表示 所属用户组 的权限。

    后面 3 个字符,表示 其他用户 的权限。

  3. 再之后 1 个数字, 代表 链接数。

  4. 再之后 2 串字符,代表名称。

    第一个是 文件的拥有者 的用户名称。

    第二个是 文件所属的 用户群组的名称。

  5. 再之后 是表示文件的大小。

  6. 再之后 表示 文件最后被修改的时间。

    文件的时间有 3 中类型:

    • modification time (mtime) : 文件的内容更新就会更新。
    • status time (ctime) : 文件的状态更新(权限、属性),就会更新。
    • acces time (atime) : 读取文件时就会更新。
  7. 再之后 就是文件名了。

修改文件的权限

使用 chown 命令, (change owner)。

# chmod [ugoa] [+-=] [rwx] dirname/filename
- u:拥有者
- g:所属群组
- o:其他人
- a:所有人
- +:添加权限
- -:移除权限
- =:设定权限



# 示例:将 .bashrc 文件的权限修改为 -rwxr-xr--。 
# chmod 754 .bashrc


# 示例:为 .bashrc 文件的所有用户添加写权限。
# chmod a+w .bashrc

# 示例: 所属用户、用户组、其他用户的设置。
# chmod u+x,g+w,o+w test.log //r 读,w 写 x 执行

默认权限

文件的默认权限:

没有可执行。 所以就是 666 , 也就是 rw-rw-rw-。

目录的默认权限:

目录要能进入,所以必须有可执行权限。 所以就是 777, 也就是 rwxrwxrwx。

一个目录的权限,也就是对其文件列表的权限。

拥有文件的 写权限(w) , 并不能对文件名进行修改操作。

因为文件名不是存储在文件的内容里的,而是存储在这个文件所属的目录里的。

可以通过 umask 设置或查看默认权限。

文件系统的简单介绍

Linux中,一切皆文件。

网络接口卡、磁盘驱动器、打印机、输入输出设备、普通文件、目录 都可以看成是一个文件。

把硬件系统看成是一个文件,就可以用读写文件的方式实现对硬件的访问。

  • inode

    存储文件的元信息(metadata),比如文件拥有者、容量、权限、修改时间等等。

    每个文件都仅有 1 个 inode,每个 inode 有 1 个编号。 使用 stat 命令可以查看文件的 inode 信息。

    每个 inode 的大小固定在 128 bytes 。 (新的 ext4 与 xfs 可以设定到 236bytes)。

    操作系统使用 inode 编号来区分不同的文件,而不是用文件名来区分。

  • block

    磁盘的最小单位是 扇区(Secotr)。

    读取的最小单位是 块(block),也就是一次读取 多个扇区。

    文件的内容数据,都是存储在 block 中的。

    在 ext2 文件系统中, block大小有 1k、2k、4k 三种。 常用的是 4k 的大小。

    一个 block 只能被一个文件所用,没有使用到的空间就是浪费了。

主要的还是上面 2 种组成,另外还会有些其他的数据,比如:

  • superblock

    记录文件系统的整体信息。

    比如 inode 和 block 的总量、使用量、剩余量, 以及文件系统的格式与相关的信息等等。

  • block bitmap

    记录 block 是否被使用的位图。

磁盘碎片的概念:

一个文件的 block 过于分散, 导致磁盘头移动距离过大,从而降低了磁盘的读写性能。

文件的类型:

  • 普通文件

    就是指 txt、html、md等等这样应用层面的文件类型。

  • 目录文件

    打开目录,实际上是打开目录文件。

    目录文件 也是一个文件,包括 1 个 inode 和 至少 1 个 block。

    block 包括了 目录下的文件名,和 指向这些文件的指针。

  • 链接文件

    • 硬链接(hard link):

      硬链接的文件, 拥有相同的 inode 。 和源文件彼此间不影响。

      只有当 所有相同的 inode 都删除了, 这个文件才算是 删除了。

    • 软连接、符号链接(symbolic lick):

      类似 Windows 系统上的 快捷方式, 源文件删除,软链接也不能用,找不到源文件了。

  • 设备文件

    设备文件一般存放于 /dev 目录下。

    • 字符设备文件

      可按 字节/字符 来读取数据。

      不支持随机存取。

      比如: 键盘、 串口

      理解: 键盘上敲单词时,是按照单词顺序来读取的,随机访问没有意义。

    • 块设备文件

      以块的方式,来读取数据。 在 Windows 系统下, 这也称为 簇。

      支持随机存取,可以访问设备上任何一块位置。

      不支持字符方式寻址。

      比如: 硬盘、软盘、光碟

  • 管道文件

    用于进程间的通信。

    可以用 mkfifo 命令创建一个管道文件。

  • Socket套接字文件

    用于 网络进程间 的通信, 也就是可以使 2 台不同的机器通信。

    也可以用于 本机的 Socket 网络程序。

常用的文件或目录的命令

ls、cd、mkdir、rmdir、touch、cp、mv、rm

获取文件的内容命令

  • cat : 获取文件内容

  • tac : cat 的方向操作,从最后一行开始打印。

  • more : 分页显示文件内容。

  • less :和 more 差不多,有往前翻页的功能。

  • head 、 tail

    # head [-n number] filename
    -n :后面接数字,代表显示几行的意思
    
    # tailhead 的反向操作,只是取得是后几行。
    
  • od : 以字符或十六进制数,显示二进制文件。​

/usr/share/doc 存放着软件的一整套说明文件。

who : 看看有没有其他用户在线

环境变量: PATH

声明的都是一些可执行文件的路径, 路径与路径之间,用 冒号: 分割

BASH:

可以通过 shell 来调用内核的服务。 而 bash 是 shell 的一种。

数据流重定向:

重定向指的是使用文件代替标准输入、标准输出和标准错误输出。

1 代码 运算符
标准输入 (stdin) 0 < 或 <<
标准输出 (stdout) 1 > 或 >>
标准错误输出 (stderr) 2 2> 或 2>>

其中,有一个箭头的表示以覆盖的方式重定向,而有两个箭头的表示以追加的方式重定向。

压缩与打包

  • Linux 底下有很多压缩文件名,常见的如下:
扩展名 压缩程序
*.Z compress
*.zip zip
*.gz gzip
*.bz2 bzip2
*.xz xz
*.tar tar 程序打包的数据,没有经过压缩
*.tar.gz tar 程序打包的文件,经过 gzip 的压缩
*.tar.bz2 tar 程序打包的文件,经过 bzip2 的压缩
*.tar.xz tar 程序打包的文件,经过 xz 的压缩
  • 打包

压缩指令只能对一个文件进行压缩,而打包能够将多个文件打包成一个大文件。

tar 不仅可以用于打包,也可以使用 gzip、bzip2、xz 将打包文件进行压缩。

$ tar [-z|-j|-J] [cv] [-f 新建的 tar 文件] filename...  ==打包压缩
$ tar [-z|-j|-J] [tv] [-f 已有的 tar 文件]              ==查看
$ tar [-z|-j|-J] [xv] [-f 已有的 tar 文件] [-C 目录]    ==解压缩
-z :使用 zip;
-j :使用 bzip2;
-J :使用 xz;
-c :新建打包文件;
-t :查看打包文件里面有哪些文件;
-x :解打包或解压缩的功能;
-v :在压缩/解压缩的过程中,显示正在处理的文件名;
-f : filename:要处理的文件;
-C 目录 : 在特定目录解压缩。Copy to clipboardErrorCopied
使用方式 命令
打包压缩 tar -jcv -f filename.tar.bz2 要被压缩的文件或目录名称
查 看 tar -jtv -f filename.tar.bz2
解压缩 tar -jxv -f filename.tar.bz2 -C 要解压缩的目录

进程管理

  • 常用命令

    ps : 查看自己的进程

    ps aux : 查看系统所有进程

    pstree : 查看进程树

    top : 显示 实时的进程信息

    netstat : 查看占用 端口 的进程。

  • 孤儿进程

    一个父进程退出了,他的子进程还在运行,这些子进程就变成了孤儿进程。

    孤儿进程会被 init进程(进程号为 1 的进程)收养, 所以孤儿进程不会对系统造成危害。

  • 僵尸进程

    一个子进程的 进程描述符 在子进程退出时不释放。 也就是父进程 没有调用 wait() 、 waitpid() 方法。

    那么子进程的 进程描述符 仍然保存在系统中,这种进程就叫 僵尸进程。

    如果有大量的僵尸进程(zombie), 则进程号会越来越少,导致系统不能产生新的进程。

    干掉僵尸进程,就是把他父进程 kill 掉, 使其变成 孤儿进程。

VIM

  • i 进入编辑模式。

  • :wq 写入磁盘并离开。

    :wq! 强制写入磁盘,并离开。 至于能不能写进入,与用户对该文件的权限有关。

    :q 离开

    :q! 强制离开,不保存。