Linux基础学习(2)文档结构

李博明老师讲的Linux课程笔记。

系统为debian系统,主要内容包括:linux文档结构(也就是各个文件是干嘛的)


1. 文档结构略图

.———————————————————————————————————————————————————————-根目录(档案最上层)
├── bin———————————————————————————————————————————给所有使用者使用之必要执行档
├── boot——————————————————————————————————-开机核心及boot loader(grub/)存放目录
│ └── grub————————————————————————————————————————boot loader(grub/)存放目录
├── cdrom
├── dev
├── etc
│ └── X11
├── home
├── lib
│ └── modules
├── lib64
├── lost+found
├── media
├── mnt
├── opt
├── proc
├── sbin
├── sys
├── tmp
├── usr
│ ├── bin
│ ├── games
│ ├── include
│ ├── lib
│ ├── local
│ │ ├── bin
│ │ ├── etc
│ │ ├── games
│ │ ├── include
│ │ ├── lib
│ │ ├── man -> share/man
│ │ ├── sbin
│ │ ├── share
│ │ └── src
│ ├── sbin
│ ├── share
│ └── src
└── var
├── cache
├── backups
├── log
├── locked
└── spool

2. /bin、/usr/bin、/usr/local/bin

这三个目录均存放可执行档,其差别在于:

  • /bin:放最基本、最必要执行的可执行档以供单人模式使用者使用。即可认为相当重要、最基础、没有这个没法进行Linux操作。比如:lsmkdircat…等指令
  • /usr/bin:大部分的可执行档,这些执行档并不是必须的。比如:zipvimshell
  • /usr/local/bin使用者自行安装的可执行档。比如:iverilog

小贴士:为何要分/bin/usr/bin两个文件呢?久远以前,用磁带进行存储,磁带容量的限制。如今,二者已经趋于合并,如centos

3. /sbin、/usr/sbin、/usr/local/sbin

类似于/bin/usr/bin/usr/local/bin

  • /sbin:放最基本、最必要执行的系统管理可执行档以供系统管理员使用。比如:ifconfigfdisk
  • /usr/sbin:给应用程序使用的系统管理工具。比如:sshd
  • /usr/local/sbin:用户自行安装的系统管理工具。目前没有接触到,比如略。

4. /boot

存放Linux的核心,粗略介绍几个文件。

  • config-xxxx文档

    核心编译设定档,该设定档方便我们依照其设定自行编译Linux核心。

  • initrd.img-xxxx文档

    核心的initrd镜像档,其中,initrd是INItial RamDisk的简写。这是开机时所载入的一个小档案系统,负责载入系统驱动程序,最终引导核心完成开机流程。

    通俗点理解,比如我们需要使用光盘启动。此时,驱动程序是在光盘上面的,而我们如果无法识别这是什么种类的光盘、驱动光盘,就没有办法使用光盘载入驱动程序。该镜像文档边存储了一些最常见的驱动程序,用于协助载入驱动程序。当系统驱动程序载入完成之后,就可以将控制权移交给核心,完成开机流程。

  • System.map-xxxx文档

    档案中存放了核心所需要的符号表(Symbol Table)。这个和与核心开发有关,此处略。

  • vmlinuz-xxxx文档:真正编译完的Linux核心。

/boot/grub

比较重要的/boot/grub/grub.cfg文档,它是开机设定档,使用者可以参考里面的设定了解自己的电脑是如何开机的。

5. /dev

/dev文档存放了Linux的装置档案

何为装置档?我们可以认为在Linux系统中,每一种装置都化身为一个文档,对于相应文档的操作就是对于相应装置的操作。

5.1 装置类别

在终端窗口输入 ls -la,可以获取如以下例子的列表。

d rwxr-xr-x 2 root root 4096 9月 3 2021 my_dir
类别 属性 连结的节点数 所有人 群组 大小 最后的修改时间 文件名

其中,第一个就是类别。以下进行解释。

类别 说明
- 正常文档
d(irectory) 目录(俗称文件夹)
l(ink) 链接档(可理解为win中的快捷方式)
c(haracter)/u 字元档,一种装置档案(只会出现在/dev)。字元档就是一次传输字元,没有缓冲,以串行方式进行通信。比如鼠标、键盘、虚拟终端机(shell)
b(lock) 区块档,一种装置档案(只会出现在/dev)。区块档是指系统在传输资料时,以块为单位进行传输。区块档有缓存,因此在传输数据的过程中,先传输到缓存在传输到真正的设备。比如硬盘、光碟、U盘
s(ocket) 网络通信连结的端点。略
p(ipe) 称为导管或者FIFO的装置。略

其中最常见的两种装置档——字元档和区块档。

字元档例子:

1
2
3
4
5
6
7
8
9
10
11
12
$ cd /dev
$ ls -l
...
crw------- 1 root tty 13,63 9月 3 15:34 tty #终端机
...

$ cd /dev/input
$ ls -l
...
crw-rw---- 1 root input 13,63 9月 3 15:34 event0 #事件(如键盘等)
crw-rw---- 1 root input 13,32 9月 3 15:34 mouse0 #鼠标
...

区块档例子:

1
2
3
4
5
6
7
$ cd /dev/
$ ls -l
...
crw-rw---- 1 root cdrom 21, 0 9月 3 15:34 sr0 #光碟
crw-rw---- 1 root disk 8, 0 9月 3 15:34 sda #硬盘
crw-rw---- 1 root disk 8, 1 9月 3 15:34 sdb
...

小贴士

①在终端中执行lsblkdf -kh,可以查看硬盘的挂载和使用情况

②在终端中执行file <filename>stat <filename>,可以查看文件信息

5.2 Major Number 和Mimor Number

装置档和不同的文件(-、d、l)不同,原本表示大小的地方,不在表示大小,而是Major Number 和Mimor Number。

1
crw-rw----	1 root cdrom 21, 0 93 1534 sr0	

如上文所示的”21,0“。那何为Major Number 和Mimor Number?

此处仅仅引入这两个概念,不做深入探究。因为这并非普通用户需要知道的,而是给写驱动的用户看的。

5.3 虚拟终端机和实体终端机

5.3.1 实体终端机

Linux或者说Unix系统,是一个多人多工的操作系统。也就是一台电脑,可以多人登录并且同时使用。

在远古时期,一台服务器上面会连接多个终端机(可以理解为一台主机+多个屏幕)。

一台装好系统的Linux电脑,本身就自带可供6个人使用的终端机。使用alt+F1~alt+F6可以在6个终端机之间切换。

实体终端机占用的位置是 /dev

如下所示,即”shi“账号,通过两个实体终端机连入主机。

所谓是实体终端机,就是看得到、摸得到鼠标键盘的机器。比如:显示器+鼠标键盘、手机

1
2
3
4
5
6
$ cd /dev
$ ls -l
...
crw------- 1 shi tty 13,63 9月 3 15:34 tty1 #终端机
crw------- 1 shi tty 13,63 9月 3 15:34 tty2 #终端机
...

5.3.2 虚拟终端机

简单而言,虚拟终端机就是在你鼠标右键,”打开终端“所打开的终端。

image-20210903185451635

虚拟终端机所占的位置在/dev/pts(pts:pseudo terminal slave),

如下所示:此处打开了两个虚拟终端机。

1
2
3
4
5
6
$ cd /dev/pts
$ ls -l
crw--w---- 1 shi tty 136,0 9月 3 15:34 0 #终端机
crw--w---- 1 shi tty 136,2 9月 3 15:34 1 #终端机
c--------- 1 root root 5,2 9月 3 15:34 ptmx
...

在某个虚拟终端机,输入tty,如下所示,表示这个虚拟终端化身为/dev/pts/2

1
2
3
$ tty
/dev/pts/2
...

5.4 /dev下的串行线

ttys和tty的很像,在/dev中显示为

1
crw-rw----	1 root dialout   4,86 93 1534 ttys23		#串行线

ttyS专门用于网络连接,如今常用于外界电路板/开发板

5.5 /dev下的USB设备

USB设备存在于/dev/input下面

5.6 /dev下其他有趣的设备

  1. /dev/null

    ”黑洞“,可以接收任何信息,但是并不会产生任何输出。永远不会满。

    应用的地方嘛~比如在”开机时,会产生许多的log信息,这些信息不需要呈现给用户,就可以把这些信息扔到’黑洞‘中“。

    /etc/init.d/exim4程序片段

    1
    2
    if pidofproc -p "$QRPIDFILE" "$DAEMON" >/dev/null; then
    log_action_end_msg 0 "running"

    再如:把ls - l /dev的所有输出内容扔到黑洞中。

    1
    $ ls -l /dev > /dev/null
  2. /dev/zero

    专门产生”空字节“,常和dd指令一起使用

    如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ cd ~
    $ dd if=/dev/zero of=test.img bs=1M count=1
    #创建以一个名为test.img的文件,其他大小为1MB,其内容全部用0填充,只执1次
    #使用hexdump查看文件(以16进制查看文件)
    $ hexdump test.img
    000000 0000 0000 0000 0000 0000
    *
    010000
    #文件全部用0x00填充

6. /etc

/etc存放整个系统的设定,包括网络设定、开机设定、服务器设定等等。

注意:如果作Linux系统的备份的时候,需要注意备份/etc

/etc/init.d

1
drwxr-xr-x 2 root root 4096 <time> init.d

存放所有系统启动的服务,包括初始化网络、键盘对应等等

7. /etc/X11

与x window有关。该目录就是用于设定x window相关的,其中包括 XServer的设定和视窗管理员(Window Manager)的设定

7.1 /etc/skel

该目录是一个型版目录,当我们新增一个使用者时,系统会将此型版目录的内容一字不漏的复制过去每一个使用者的家目录。这样一来,我们基于可以不必为每一个新增使用者设置一些环境设定档。

7.2 /etc/rc*.d

包括了rc0.d~rc6.drcS.d。这些文档存放的内容是来告诉Linux在那个runlevel时要执行哪些工作。所谓的runlevel,是指系统在开机时进入哪个层级,这个可以维基百科一下。

需记住的是:

​ rc0.d ——runlevel0:关机

​ rc1.d ——runlevel1:单一使用者模式。常用于系统管理员进行维修,不希望其他使用者进入。

​ 其他略

​ rc6.d ——runlevel6:重新开机

8. /home 和 /root

分别表示使用者家目录和管理员家目录。

9. /lib、/usr/lib、/usr/local/lib

用于存放动态连接函数库

Linux中,即为.so或者.a文件。在win系统中,即为.dll文件

所谓的动态连接函数库,是指但我们程序运行的时候才需要连接的函数库。

用win系统的理解,可以如此理解:

游戏运行的时候需要DirectX(DirectX 是 Windows 中的一组组件,允许软件(主要且尤其是游戏)直接与视频和音频硬件结合使用。),一般游戏打包的时候是不将这个组件放到游戏包里面的。如果将所有的组件放到游戏包中,会使得游戏包十分的臃肿。于是常常将一些通用的组件/库让用户自己安装。游戏运行需要的时候,动态链接用户的组件/库即可。如此,即使1000个游戏,也只需要1个库即可,而不需要将库都放到1000个游戏中。(共享的概念)

/lib:系统程序才会用到的动态连接函数库以及核心组件。

/usr/lib:动态连接函数库存放目录。

/usr/local/lib:使用者自行安装的动态连接函数库存放目录。

10. /mnt、/media

均使用来挂在存储媒体的目录,存储媒体可能是SD卡、U盘等。

没有挂载的时候,目录是空的。

11. /opt、/usr/local

均是用来存放自行安装的软件

其差别在于:

  • /opt用来保存外加的应用程序软件套件
  • /usr/local是给系统管理员安装软件的位置

按照李博明老师的作法,大型商用软件(如EDA)等工具统一安装在/opt目录下;而自行安装的小型工具(Firefox浏览器)则统一安装在/usr/local目录下。

12. /proc、/sys

两个档案有相似之处,同样都十分重要。

12.1 /proc

存放核心及进程所需要的虚拟档案文件,意思是/proc反应了当前系统的状态。

如:

  1. cpuinfo:查看CPU型号、CPU核心等信息
  2. diskstats:目前磁盘状态
  3. devices:目前设备装置的状态
  4. dma:目前DMA的状态
  5. interrupts:目前系统中断的状态
  6. meninfo:目前存储器的状态
  7. modules:目前系统载入模组的状态
  8. uptime:目前系统启动时间、空闲时间状态
  9. version:目前系统核心状态

由于/proc中的文档大多为纯文字档,使用cat即可进行浏览。

12.2 /sys

/sys是在Linux核心第2.6版之后出现的目录,主要作为即插即用的设定

也可以查看一些系统的状态。

具体遇到之后再详查。

13. /tmp

存放程序执行时的一些暂存档

每个使用者均有读写的权限。

但是不要将重要的数据存放在此处,因为此目录的内容在重启之后就不见了

等同于window下的 C:\Temp目录

14. /usr

最杂、最集大成的目录。

约等于window系统下,”C:\Window”和”C:\Program Files”两个目录的混合体。

下面对一些重要的目录进行介绍。

14.1 /usr/bin

存放使用者需要的一些可执行档,这些可执行档不是系统必要的执行档

14.2 /usr/games

玩游戏

14.3 /usr/include

C语言所必须包含的档头目录,即.h文件。

14.4 /usr/lib

存放懂动态连接函数库的目录

14.5 /usr/local

存放管理员自行安装的软件,一般存放比较小的软件或者工具(个人觉得1G以下丢可以存放在这个)

14.6 /usr/local/bin

使用者自行安装的可执行档

14.7 /usr/local/include

使用者自行安装的C语言的档头文件,即.h文件

14.8 /usr/local/lib

使用者自行安装的动态连接函数库

14.9 /usr/local/sbin

使用者自行安装的关于系统管理的可执行档

14.10 /usr/local/share

使用者自行安装的共享档案的目录,没有安装即为空目录

14.11 /usr/sbin

给应用程序使用的系统管理相关的可执行档

14.12 /usr/share

与系统架构无关的资料档案目录。如,中文字体文件

14.13 /usr/src

linux原始码编译目录(主要是Linux核心),主要用来存放Linux原始码。

如果修习有关Linux嵌入式开发相关的内容,则会用到

15. /var

是黑客入侵系统后第一个需要处理的目录,有时候,一些重要的系统进程也要用到该目录。

15.1 /var/log

主要记录系统的日志档(log)目录,包含了使用者自某一个IP登录系统、是否成功登录系统以及失败等信息。这些信息可以有助于我们跟踪黑客是否正在入侵我们的系统。故而黑客入侵的第一件事情就是删除该目录,从而隐藏自己的行踪。而对于管理员而言,管理员需要确保该目录资料的存在,从而追踪系统的登录状态。以下介绍几个重要的日志档。

15.1.1 /var/log/auth.log

此档案十分重要,它告诉我们有什么人连进我们的系统、有谁取到了root的权限、有人试图连接我们的系统但是失败等记录。如果遇到黑客入侵,我们需要第一检查这个文件。

需要注意的是该文件的权限如下:

1
-rw-r-----	1 syslog adm   9690 9月 3 15:34 auth.log		

因此需要取得adm群组或者管理员root的权限才能观看此档案。

15.1.2 /var/log/dmseg

相关指令dmseg,遇到再说。

15.1.3 /var/log/lastlog

当我们执行last指令时,可以看见系统登入的使用者以及何时登入、从哪里登录的信息。

15.1.4 /var/log/Xorg.0.log

系统启动X Window之后留下来的日志信息。

15.2 /var/cache

存于暂存资料。其中有一个重要的子目录/var/cache/apt用来存储我们下载的.deb档。当我们使用指令apt-get install 套件名下载下来的.deb文档就存储在这个目录下。

使用指令apt-get clean可以对下载完已经安装的套件的.deb文件进行清理(类似于删除安装包)。

使用指令df -h或者du -sh *可以查看空间使用量

15.3 /var/mail

存放每个使用者的电子邮件,一旦使用者收信之后,其邮件内容就会从此目录中删除。

15.4 /var/lock

有些程序执行的过程中,要求只能只有一个该程序执行,不得有分身程序同时执行的规定。

最常见的例子是aptitude,该程序一次只能有一个在执行中的进程,否则系统的软件安装/移除就会乱掉。因此在aptitude程序执行的时候,会在/var/lock中新建一个aptitude档案,告诉系统当前aptitude正在执行,此时如果还有人要再执行aptitude的话,系统就会发生错误。

15.5 /var/spool

这是一个暂存的空间,这边存储的时候程序还没执行完的资料。

比如,在打印机进行打印的时候,未打印的文件就会暂存在该目录下,一一排队等待打印。

当然这个目录并不是一个程序专享的。其他程序的一些未执行的资料文件也会存放在该目录下。

16 关于Linux文件备份问题

当我需要重装Linux系统的时候,我需要备份哪些文件?

文件备份原则是:

不能拷贝到的资料一定要备份

/bin:不需要

/dev:不需要

/etc:需要。系统设定档。对于稳定的服务器而言,需要进行的实时的更新修补漏洞,而对于更新系统之后的相关设定(希望还原原本系统的功能 ),需要依照原本的系统设定进行设定。这些设定是个人的,网络上找不到的。

/home:需要。个人文档,包括个人作业、论文等重要的资料,一定要备份。而且需要多备份!!!

/opt:需要。虽然对于很多软件,网络上均可以下载得到,但是很多软件安装十分的麻烦,于是最好还是备份。

/root:根据情况进行备份。一般而言,我们将资料存在自己的家目录(/home)中,而不存储在/root下。

/sbin:不需要。

/var:需要备份。/var中存储了十分重要的日志信息(log),当系统由于黑客入侵或者其他外界因素遭到破坏,此时主机处于不安全状态,此时需要日志信息进行辅助修补主机的漏洞,确保新装的或者更新维护之后的主机是安全可靠的。

重点三个文件

  1. 你的资料
  2. 你的设定档
  3. 你的log档