第03章:探索系统

既然现在我们知道如何在文件系统中来回移动,是时候导览一下 Linux 系统了。在开始之前,我们要学几个命令,在导览时会很受用:

  • ls 列出目录内容(List directory contents)

  • file 确定文件类型(Determine file type)

  • less 查看文件内容(View file contents)

更有趣的 ls

ls 命令大概是最常用的命令了。 通过它,我们能查看目录的内容、确定各种重要文件和目录的属性。如我们之前所见,我们能简单的输入 ls 查看当前工作目录中的文件和子目录清单:

[me@linuxbox ~]$ ls
Desktop Documents Music Pictures Public Templates Videos

除了当前工作目录,我们可以指定目录来列出清单,如:

me@linuxbox ~]$ ls /usr
bin games kerberos libexec sbin src
etc include lib local share tmp

甚至可以指定多个目录。下例中,我们将列出用户家目录(用 ~ 表示)和 usr 目录。

[me@linuxbox ~]$ ls ~ /usr
/home/me:
Desktop Documents Music Pictures Public Templates Videos

/usr:
bin games kerberos libexec sbin src
etc include lib local share tmp

我们也能改变输出格式来展示更多细节:

[me@linuxbox ~]$ ls -l
total 56
drwxrwxr-x 2 me me 4096 2007-10-26 17:20 Desktop
drwxrwxr-x 2 me me 4096 2007-10-26 17:20 Documents
drwxrwxr-x 2 me me 4096 2007-10-26 17:20 Music
drwxrwxr-x 2 me me 4096 2007-10-26 17:20 Pictures
drwxrwxr-x 2 me me 4096 2007-10-26 17:20 Public
drwxrwxr-x 2 me me 4096 2007-10-26 17:20 Templates
drwxrwxr-x 2 me me 4096 2007-10-26 17:20 Videos

通过在命令中加入 -l,我们能改变输出为长格式。

选项和参数

从上述命令中,我们得到一个关于命令如何工作的重点。命令通常会通过有一个或若干个选项(options)——甚者——带上一个或更多参数(arguments)来修整它们的行为。所以,大多数命令长得看起来像这样:

command -options arguments

大多数命令的选项由一个字母跟随一个短横线(dash)例如 -l 组成,不过还有很多命令,包括那些来自 GNU 项目的命令,支持由两个短横线和一个单词组成的长选项(long options)。还有,很多命令允许把多个短选项串在一起。在下面的例子中,ls 命令后跟随着两个选项,l 选项将导致长格式输出,t 选项负责按文件修改时间排序。

[me@linuxbox ~]$ ls -lt

我们将加个长选项 --reverse 来降序排列输出结果。

[me@linuxbox ~]$ ls -lt --reverse

注意:命令选项,一如文件名,在 Linux 中是大小写敏感的。

ls 命令有许多可能的选项。最常用的如下表 3-1。

短格式

长格式

描述

-a

--all

列出所有文件,即便是以 . 开头的隐藏文件。

-A

--almost-all

-a 选项,但不包含 ... 目录。

-d

--directory

通常情况下,如果指定了一个目录,ls 会列出指定目录的内容,而非当前目录中的内容。使用该选项和 -l 选项连接,用以查看该目录,而非其内容。

-F

--classify

该选项在每个项目后加个后缀。例如,在目录后加个 /

-h

--human-readable

在长格式中,按人类可读的格式替代字节数。

-l

以长格式显示结果。

-r

--reverse

以倒序显示结果。默认情况下按字母顺序排列结果。

-S

按文件大小排序。

-t

按文件修改时间排序。

长格式详述

如前述,-l 选项会使 ls 命令以长格式显示结果。这一格式包含大量有用的信息。下面是一个来自 Ubuntu 系统的示例。

-rw-r--r-- 1 root root 3576296 2017-04-03 11:05 Experience ubuntu.ogg
-rw-r--r-- 1 root root 1186219 2017-04-03 11:05 kubuntu-leaflet.png
-rw-r--r-- 1 root root   47584 2017-04-03 11:05 logo-Edubuntu.png
-rw-r--r-- 1 root root   44355 2017-04-03 11:05 logo-Kubuntu.png
-rw-r--r-- 1 root root   34391 2017-04-03 11:05 logo-Ubuntu.png
-rw-r--r-- 1 root root   32059 2017-04-03 11:05 oo-cd-cover.odf
-rw-r--r-- 1 root root  159744 2017-04-03 11:05 oo-derivatives.doc
-rw-r--r-- 1 root root   27837 2017-04-03 11:05 oo-maxwell.odt
-rw-r--r-- 1 root root   98816 2017-04-03 11:05 oo-trig.xls
-rw-r--r-- 1 root root  453764 2017-04-03 11:05 oo-welcome.odt
-rw-r--r-- 1 root root  358374 2017-04-03 11:05 ubuntu Sax.ogg

表 3-2 为我们展示了对上述结果的各个字段的含义。

表 3-2 ls 长格式字段

字段

意义

-rw-r--r--

对文件的访问权限。第一个字符指示文件的类型。在不同的类型中,- (dash)表示一个常规文件。d 表示一个目录。接下来的三个字符表示文件属主对该文件的访问权限。再后面三个表示文件所属用户组成员对该文件的访问权限。最后三个字符表示其他用户对该文件的访问权限。在第九章「权限」将详细讨论该处的细节。

1

文件硬链接的数目。详见本章的「符号链接和硬链接」。

root

文件属主。

root

文件所属用户组。

32059

文件字节数。

2007-04-03 11:05

文件最后修改日期和时间。

oo-cd-cover.odf

文件名。

用 file 确定文件类型

在浏览系统时,了解文件内容会很有用。我们用 file 命令确定一个文件的类型。如前所述,Linux 中的文件名不需要反映文件的类型。一个如 picture.jpg 的文件名通常被希望包含 JPEG 格式的压缩图像,但在 Linux 中不是必须如此。我们可以用如下方式调用 file 命令:

file filename

当被调用后,file 命令将打印出该文件的简短描述。例如:

[me@linuxbox ~]$ file picture.jpg
picture.jpg: JPEG image data, JFIF standard 1.01

还有很多文件类型。事实上,类 UNIX 系统有一个普遍的理念,即「一切皆文件」(everything is a file)。当我们继续我们的课程时,我们将看到这句陈述是怎样的真实。

虽然我们系统中的许多文件都很熟悉,例如 MP3 和 JPEG,但还是有很多类型不太明显,有些则很陌生。

使用 less 查看文件内容

less 命令是用来查看文本文件的程序。在 Linux 系统中包含有很多人类可读的文本。less 程序提供了一个检查文件的捷径。

何为「文本」?

有许多方法来展示计算机中的信息。所有方法都涉及定义信息与将用于表示信息的一些数字之间的关系。计算机,仅能理解数字和那些被转换成数字表示的数据。

有些表示系统非常复杂(比如压缩过的视频文件),有些则相当简单。其中最早也最简单的是 ASCII text。ASCII 全称美国标准信息交换码(American Standard Code for Information Interchange)。它是一个简单的编码方案,首先被用在电子打字机上,用以映射键盘字符到数字符号。

文本是简单地一对一地字符映射到数字。它非常紧凑。五十个字符的文本就翻译为五十个字节的数据。这对于理解文本仅包含简单的字符映射到数字,是很重要的。这与 Microsoft Word 或 LibreOffice Writer 之类文字处理软件所生成的文件不同。那些文件对比简单的 ASCII 文本,包含了许多用来描述文档结构和格式的非文本元素(non-text elements)。普通 ASCII 文本仅包含字符本身以及一些基本的控制符号,如制表符(tabs)、回车符(carriage returns)、换行符(line feeds)。

整个 Linux 系统,有许多文件以文本格式存储,也有许多 Linux 工具可以处理这些文本。即便是 Windows 系统也能识别这种重要的格式,NOTEPAD.EXE 程序就是一个纯文本编辑器。

我们为何要检查文本文件?因为很多系统设置文件(configuration files)是以这种格式存储的,通过读取这些文件,我们能看到系统如何工作。另外,一些系统使用的程序,即脚本(scripts)也是以这种格式存储的。后面章节中,我们将学习如何编写文本文件以修改系统设置、写出我们自己的脚本,现在,先让我们看看这些文件的内容吧。

less 命令通常这样使用:

less filename

启动之后,less 程序允许我们向前或向后浏览文本。例如,检查一下定义所有系统用户帐户的文件,键入以下命令:

[me@linuxbox ~]$ less /etc/passwd

less 程序启动后,我们能看到文件的内容。如果文件内容多于一页的,我们能上下滚动文件。要退出 less,按 q 键即可。

下表是 less 程序最常用的键盘命令。

表 3-3:less 命令

命令

行为

Page Upb

向后翻一页

Page Downspace

向前翻一页

上箭头

向上一行

下箭头

向下一行

G

移动到文件末尾

1Gg

移动到文件开头

/字符

向前查找「字符」

n

继续前次的查找

h

显示帮助文件

q

退出 less

少即是多(Less Is More)

less 程序是更早期 Unix 程序 more 的改进替代品。less 这个名字是对于「少即是多(less is more)」这句当代建筑和设计的格言的一个把戏。

less 属于「翻页(pagers)」程序类别,允许以一页一页的形式方便地查看长文本文档。不同于 more 只允许向前翻页,less 程序允许向前或向后翻页,并且还有一些其它新功能。

导览

Linux 系统的文件系统布局与其他类 Unix 系统的文件系统布局非常相似。该设计实际上在已出版的标准「Linux 文件系统等级标准(Linux Filesystem Hierarchy Standard)」中被指定。并非所有的 Linux 发行版都完全符合该标准,但是大多数都非常接近。

下面,我们准备漫步文件系统,来看一下我们的 Linux 系统究竟有多棒。同时也将给我们一个练习浏览技能的机会。我们将发现很多人类可读的有趣的文件。当我们开始导览时,尝试以下命令:

  1. cd 到指定目录

  2. ls -l 列出目录内容

  3. 如果发现有趣的文件,用 file 检查该文件类型

  4. 如果看起来可能是文本文件,用 less 查看

  5. 如果意外地尝试查看一个非文本文件,把终端窗口搞得一团糟,我们用 reset 命令恢复。

记住复制粘贴技巧!如果你在用鼠标,你可以双击文件名复制,然后用中键粘贴到命令行中。

来回查看时,不用担心。常规用户是最大限度地被禁止胡搞的,那是系统管理员的事情。如果一个命令报错,就换其它命令。花一些时间到处看看,系统是用来浏览的。记住,在 Linux 中,没有秘密!

目录

注释

/

根目录,一切文件的起始。

/bin

包含供系统启动和运行的二进制文件(程序)。

/boot

包含 Linux 内核,初始化内存磁盘映像(提供启动时所需的驱动),及启动加载器。 有趣的文件: - /boot/grub/grub.confmenu.lst 用以配置启动加载器 - /boot/vmlinuz (或类似文件),即 Linux 内核。

/dev

这是一个保存设备节点(device nodes)的特殊目录。「一切皆文件」这一概念同样适用于设备。这里是由内核维护的它所能理解的设备清单。

/etc

该目录包含了所有系统级别的配置文件。同时也包含了系统启动时开启各种系统服务的 Shell 脚本。该目录内所有文件都是可读的文本文件。 有意思的文件:/etc 中所有文件都很有意思。其中这几个特别有趣: - /etc/crontab 定义自动执行任务的文件。 - /etc/fstab 关于存储设备及其加载点的表。 - /etc/passwd 用户帐户清单。

/home

按常规配置,每个用户都被分配到一个 /home 中的目录。普通用户仅能在自己的家目录中操作文件。这一限制能保护系统免受用户的误操作。

/lib

包含核心系统程序所用的共享库文件(shared library files)。有点类似于 Windows 系统中的共享链接库文件(DLLs)。

/lost+found

Linux 文件系统中,每个被格式化的分区或设备,如 ext4,都会有这个目录。用来保存文件系统中断事件中产生的部分恢复文件。如果没有什么糟糕的事发生,这个目录都会留空。

/media

现代 Linux 系统的该目录包含了可移动存储媒体(如 USB 设备、光盘等)的加载点。当这些设备插入时,会自动被加载。

/mnt

老旧的 Linux 系统,该目录包含手动加载的可移动设备的加载点。

/opt

该目录用来安装「可选的」软件。主要用来安装商用软件产品。

/proc

这个目录是特别的。它并非存储在硬盘中的真实的文件系统。而是由内核维护的虚拟文件系统。它所包含的是窥视到内核自身的文件。这些文件是可读的,并带给我们一个关于内核如何审视计算机的图像。

/root

root 用户的家目录。

/sbin

包含「系统」二进制文件。通常是由超级用户保存的用以执行关键系统任务的程序。

/tmp

存储各类程序所产生的临时文件。一些配置将导致该目录在系统重启时被清空。

/usr

该目录是 Linux 系统中最大的一棵目录树。包含常规用户所用到的所有程序及其支持文件。

/usr/bin

该目录包含 Linux 发行版所安装的可执行程序,正常情况下,包含上千个程序。

/usr/lib

包含供 /usr/bin 中的程序所用的共享库文件。

/usr/local

用以保存没有包含在发行版,但是被系统层面广泛使用的程序。从源码编译的程序通常被安装在/usr/local/bin 中。在更现代的 Linux 系统中,这个目录存在,但被留空,仅供系统管理员放一些文件。

/usr/sbin

包含更多的系统管理程序。

/usr/share

包含 /usr/bin 目录中的程序所用到的全部共享数据,包含诸如默认配置文件、图标、屏幕背景、声音文件等等。

/usr/share/doc

大多数安装在系统中的包,都会包含各种文档。在该目录中,我们可以看到按包组织的文档文件。

/var

除了 /tmp/home,我们目前位置看到的目录都是相对静止的。/var 目录树保存那些经常变动的数据,诸如多变的数据库、池文件、用户邮件等等。

/var/log

该目录保存日志文件(log files),记录多变的系统行为。对于监视某个时间段,这些文件很重要。其中最有用的是 /var/log/messages/var/log/syslog。注意,出于某些系统安全原因,仅超级用户能查看日志文件。

当我们用 ls 查看目录的时候(如 /lib 目录),会看到类似这样的条目:

lrwxrwxrwx 1 root root 11 2007-08-11 07:34 libc.so.6 -> libc-2.6.so

注意第一个字母是 l,并且这条好像有两个文件名。这种特殊的文件叫作符号链接(symbolic link)或者软链接(soft link)、符号链接(symlink)。在大多数类 Unix 系统中,都存在一个文件有多个文件名的情况。虽然目前为止还看不到,但是这是一个很有用的功能。

想象一下这样的场景:一个程序需要用到一个共享资源中的一个 "foo" 文件,但是这个 "foo" 文件经常改版。所以,将版本号放在文件名中,对于管理员来说会很好,能看到安装的是什么版本的 "foo" 文件。这样就会出现一个问题。如果我们变更了这个共享资源的名称,我们要向下追踪所有依赖于这个文件的程序,变更其所依赖的资源名称,每次改版升级都要修改所有依赖它的程序。看起来是不是一点儿都不好玩了?

这就要靠符号链接来拯救了。假设我们安装了 2.6 版的 "foo",其文件名为 "foo-2.6",然后创建了一个叫 "foo" 的符号链接,指向 "foo-2.6"。这意味着当一个程序需要打开文件 "foo" 文件,实际上打开的是 "foo-2.6" 文件。现在大家都开心了。依赖于 "foo" 文件的程序能找到它,我们也能看到实际上安装的版本号。当升级到 "foo-2.7" 时,我们安装到系统,删去 "foo" 符号链接,并创建一个新的符号链接指向新版本。这样不仅能解决版本升级带来的问题,而且能在系统中保存这个文件的两个版本。想象一下 "foo-2.7" 有个 bug(该死的开发人员!),我们需要回退到老版本,于是我们只要删掉指向新版本的符号链接,重建一个指向旧版本的符号链接即可。

本节开头列出的文件名显示一个符号链接 libc.so.6,指向一个名为 libc-2.6.so 的共享库文件。意味着程序找 libc.so.6 文件,实际上会得到 libc-2.6.so 文件。在下章我们将学习如何创建符号链接。

当我们学习链接课题的时候,我们需要注意到还有第二种链接,硬链接(hard link)。硬链接同样允许文件有多个名称,但是是用另外的方法来实现的。关于两种链接的区别,我们将在下章详细讨论。

总结

本章中我们学习了很多关于系统的知识。我们看到了多种不同的文件和目录以及他们的内容。我们从中可以看到系统是多么开放。在 Linux 系统中有这么多重要的文件,都是用人类可读的文本文件。非如很多私有系统,Linux 让一切都可以得到检查和学习。

扩展阅读

Last updated

Was this helpful?