3.2. 文件系统中的定位

3.2.1. 路径

当您希望系统执行命令时,几乎从不需要给出该命令的完整路径。例如,我们知道 ls 命令在/bin目录中(使用 which -a ls 检查),但我们不必输入命令 /bin/ls 计算机就能列出当前目录的内容。

环境变量PATH负责处理这个问题。此变量列出了系统中可以找到可执行文件的目录,从而为用户节省了大量的输入和记忆命令位置的时间。因此,路径自然包含许多名称中带有bin的目录,如下面的用户演示的那样。echo 命令用于显示变量的内容 ("$")PATH:

rogier:> echo $PATH
/opt/local/bin:/usr/X11R6/bin:/usr/bin:/usr/sbin/:/bin

在本例中,目录/opt/local/bin, /usr/X11R6/bin, /usr/bin, /usr/sbin/bin随后被搜索以查找所需的程序。一旦找到匹配项,搜索就会停止,即使并非路径中的每个目录都已搜索过。这可能会导致奇怪的情况。在下面的第一个示例中,用户知道有一个名为 sendsms 的程序可以发送 SMS 消息,并且同一系统上的另一个用户可以使用它,但她不能。区别在于PATH变量

[jenny@blob jenny]$ sendsms
bash: sendsms: command not found
[jenny@blob jenny]$ echo $PATH
/bin:/usr/bin:/usr/bin/X11:/usr/X11R6/bin:/home/jenny/bin
[jenny@blob jenny]$ su - tony
Password:
tony:~>which sendsms
sendsms is /usr/local/bin/sendsms

tony:~>echo $PATH
/home/tony/bin.Linux:/home/tony/bin:/usr/local/bin:/usr/local/sbin:\
/usr/X11R6/bin:/usr/bin:/usr/sbin:/bin:/sbin

的配置。请注意 su (切换用户) 工具的使用,它允许您在另一个用户的环境中运行 shell,前提是您知道该用户的密码。

反斜杠表示行的延续,在下一行,没有 Enter 将一行与另一行分隔开。

在下一个示例中,用户想要调用 wc (字数统计) 命令来检查文件中的行数,但没有任何反应,他不得不使用 Ctrl+C 组合来中断他的操作

jumper:~> wc -l test

(Ctrl-C)
jumper:~> which wc
wc is hashed (/home/jumper/bin/wc)

jumper:~> echo $PATH
/home/jumper/bin:/usr/local/bin:/usr/local/sbin:/usr/X11R6/bin:\
/usr/bin:/usr/sbin:/bin:/sbin

使用 which 命令向我们展示了该用户在他的主目录中有一个bin目录,其中包含一个也称为 wc 的程序。由于在调用 wc 时搜索路径时首先找到他主目录中的程序,因此执行的是这个 "自制" 程序,它的输入可能无法理解,因此我们必须停止它。为了解决这个问题,有几种方法(在 UNIX/Linux 中总是有几种方法可以解决问题):一种答案可能是重命名用户的 wc 程序,或者用户可以给出他想要的精确命令的完整路径,这可以通过使用-a选项到 which 命令找到。

如果用户更频繁地使用其他目录中的程序,他可以更改他的路径以最后查找他自己的目录

jumper:~> export PATH=/usr/local/bin:/usr/local/sbin:/usr/X11R6/bin:\
/usr/bin:/usr/sbin:/bin:/sbin:/home/jumper/bin

Note更改不是永久性的!
 

请注意,在 shell 中使用 export 命令时,更改是临时的,仅对本次会话有效(直到您注销)。即使当前会话仍在运行,打开新会话也不会导致新会话中出现新路径。我们将在 第 7.2 节 中看到如何使这些对环境的更改永久生效,将这些行添加到 shell 配置文件中。

3.2.2. 绝对路径和相对路径

路径是您在树结构中到达给定文件所需遵循的方式,可以描述为从树干(/ 或根目录)开始。在这种情况下,路径以斜杠开头,称为绝对路径,因为不可能出错:系统上只有一个文件可以符合。

在另一种情况下,路径不以斜杠开头,并且可能在~/bin/wc(在用户的主目录中)和bin/wc/usr之间产生混淆,来自前面的示例。不以斜杠开头的路径始终是相对路径。

在相对路径中,我们还使用 . 和 .. 指示当前目录和父目录。一些实际示例

3.2.3. 最重要的文件和目录

3.2.3.1. 内核

内核是系统的核心。它管理底层硬件和外围设备之间的通信。内核还确保进程和守护程序(服务器进程)在精确的时间启动和停止。内核还有许多其他重要的任务,以至于有一个专门的内核开发邮件列表专门讨论这个问题,其中共享了大量的信息。详细讨论内核会使我们跑题太远。现在,只需知道内核是系统上最重要的文件就足够了。

3.2.3.2. Shell

3.2.3.2.1. 什么是 shell?

当我在寻找关于 shell 概念的适当解释时,它给我的麻烦比我预期的要多。各种各样的定义都可用,从简单的比较,例如 “shell 是汽车的方向盘”,到 Bash 手册中的模糊定义,它说 “bash 是一个与 sh 兼容的命令语言解释器,” 或更晦涩的表达,“shell 管理系统及其用户之间的交互”。shell 远不止这些。

shell 最好的比喻是与计算机交谈的方式,一种语言。大多数用户都知道另一种语言,即桌面的点击语言。但在那种语言中,计算机主导着对话,而用户则处于被动角色,从呈现的任务中选择任务。程序员很难在 GUI 格式中包含命令的所有选项和可能的用途。因此,GUI 几乎总是比构成后端的命令或多个命令功能更弱。

另一方面,shell 是一种与系统通信的高级方式,因为它允许双向对话和采取主动。通信中的双方是平等的,因此可以测试新的想法。shell 允许用户以非常灵活的方式处理系统。shell 的另一个优点是它允许任务自动化。

3.2.3.2.2. Shell 类型

就像人们知道不同的语言和方言一样,计算机知道不同的 shell 类型

  • shBourne Shell:最初的 shell 仍然用于 UNIX 系统和 UNIX 相关环境中。这是基本的 shell,一个功能很少的小程序。当处于 POSIX 兼容模式时,bash 将模拟此 shell。

  • bashBourne Again SHell:标准的 GNU shell,直观且灵活。可能最适合初学者,同时也是高级和专业用户的强大工具。在 Linux 上,bash 是普通用户的标准 shell。此 shell 是 Bourne shell 的所谓的超集,一组附加组件和插件。这意味着 Bourne Again SHellBourne shell 兼容:在 sh 中工作的命令,在 bash 中也能工作。但是,反之则不然。本书中的所有示例和练习都使用 bash

  • cshC Shell:此 shell 的语法类似于 C 编程语言。有时程序员会要求使用。

  • tcshTurbo C Shell:常见 C Shell 的超集,增强了用户友好性和速度。

  • kshKorn shell:有时受到具有 UNIX 背景的人的赞赏。Bourne shell 的超集;使用标准配置对初学者来说是噩梦。

文件/etc/shells给出了 Linux 系统上已知 shell 的概述

mia:~> cat /etc/shells
/bin/bash
/bin/sh
/bin/tcsh
/bin/csh

Note伪 Bourne shell
 

请注意/bin/sh通常是指向 Bash 的链接,当以这种方式调用时,它将在 Bourne shell 兼容模式下执行。

您的默认 shell 在/etc/passwd文件中设置,例如用户 mia 的这行

mia:L2NOfqdlPrHwE:504:504:Mia Maya:/home/mia:/bin/bash

要从一个 shell 切换到另一个 shell,只需在活动终端中输入新 shell 的名称。系统使用PATH设置找到名称出现的目录,并且由于 shell 是一个可执行文件(程序),因此当前 shell 会激活它并执行它。通常会显示一个新的提示符,因为每个 shell 都有其典型的外观

mia:~> tcsh
[mia@post21 ~]$

3.2.3.2.3. 我正在使用哪个 shell?

如果您不知道您正在使用哪个 shell,请检查您帐户的行/etc/passwd或键入命令

echo$SHELL

3.2.3.3. 您的主目录

您的主目录是您连接到系统时的默认目标目录。在大多数情况下,它是/home的子目录,但这可能会有所不同。您的主目录可能位于远程文件服务器的硬盘上;在这种情况下,您的主目录可能位于/nethome/your_user_name中。在另一种情况下,系统管理员可能选择了不太容易理解的布局,您的主目录可能位于/disk6/HU/07/jgillard.

上。无论您的主目录的路径是什么,您都不必太担心它。您的主目录的正确路径存储在HOME环境变量中,以防某些程序需要它。使用 echo 命令,您可以显示此变量的内容

orlando:~> echo $HOME
/nethome/orlando

您可以在您的主目录中做任何您想做的事情。您可以在任意数量的目录中放入任意数量的文件,尽管数据和文件的总数量自然会受到硬件和分区大小的限制,有时还会受到系统管理员应用的配额系统的限制。当硬盘空间仍然昂贵时,限制磁盘使用量是一种常见的做法。如今,限制几乎只应用于大型环境。您可以使用 quota 命令查看是否设置了限制

pierre@lamaison:/> quota -v
Diskquotas for user pierre (uid 501): none

如果已设置配额,您将获得受限分区的列表及其具体限制。超过限制可能会在宽限期内被容忍,限制较少或根本没有限制。可以使用 info quotaman quota 命令找到详细信息。

Note没有配额?
 

如果您的系统找不到 quota,则表示未应用文件系统使用量限制。

您的主目录用波浪号 (~) 表示,是/path_to_home/user_name的简写。此相同的路径存储在HOME变量中,因此您无需执行任何操作即可激活它。一个简单的应用:使用一个优雅的命令从/var/music/albums/arno/2001切换到images在您的主目录中

rom:/var/music/albums/arno/2001> cd ~/images

rom:~/images> pwd
/home/rom/images

在本章的后面,我们将讨论用于管理文件和目录的命令,以便保持您的主目录整洁。

3.2.4. 最重要的配置文件

正如我们之前提到的,大多数配置文件都存储在/etc目录中。可以使用 cat 命令查看内容,该命令将文本文件发送到标准输出(通常是您的显示器)。语法很简单

catfile1 file2 ... fileN

在本节中,我们尝试概述最常见的配置文件。这当然不是一个完整的列表。添加额外的软件包也可能会在/etc中添加额外的配置文件。在阅读配置文件时,您会发现它们通常注释良好且不言自明。某些文件也有包含额外文档的 man 页面,例如 man group

表 3-3. 最常见的配置文件

文件信息/服务
aliases 用于 Sendmail 和 Postfix 邮件服务器的邮件别名文件。在每个系统上运行邮件服务器长期以来在 UNIX 世界中很常见,几乎每个 Linux 发行版仍然都带有 Sendmail 软件包。在此文件中,本地用户名与电子邮件地址中出现的真实姓名或其他本地地址匹配。
apache Apache Web 服务器的配置文件。
bashrc Bourne Again SHell 的系统范围配置文件。为所有用户定义函数和别名。其他 shell 可能有自己的系统范围配置文件,例如cshrc.
crontabcron.*目录需要定期执行的任务的配置 - 备份、系统数据库更新、系统清理、日志轮换等。
default 某些命令的默认选项,例如 useradd
filesystems 已知文件系统:ext3、vfat、iso9660 等。
fstab 列出分区及其挂载点
ftp* ftp 服务器的配置:谁可以连接,系统的哪些部分可以访问等。
group 用户组的配置文件。使用 shadow 实用程序 groupaddgroupmodgroupdel 编辑此文件。仅当您真正知道自己在做什么时才手动编辑。
hosts 可以使用网络联系的计算机列表,但不需要域名服务。这与系统的网络配置无关,系统的网络配置在/etc/sysconfig.
inittab 用于引导的信息:模式、文本控制台的数量等。
issue 关于发行版的信息(发行版本和/或内核信息)。
ld.so.conf 库文件的位置。
lilo.conf, silo.conf, aboot.conf等等。LInux LOader 的引导信息,现在逐渐被 GRUB 取代的引导系统。
logrotate.* 日志轮换,一种防止收集大量日志文件的系统。
mail 包含邮件服务器行为指令的目录。
modules.conf 启用特殊功能(驱动程序)的模块的配置。
motd 每日消息:显示给每个连接到系统的人(以文本模式),系统管理员可以使用它来宣布系统服务/维护等。
mtab 当前挂载的文件系统。建议永远不要编辑此文件。
nsswitch.conf 当进程需要解析主机名时,联系名称解析器的顺序。
pam.d 身份验证模块的配置。
passwd 列出本地用户。使用 shadow 实用程序 useraddusermoduserdel 编辑此文件。仅当您真正知道自己在做什么时才手动编辑。
printcap 过时但仍经常使用的打印机配置文件。除非您真正知道自己在做什么,否则不要手动编辑此文件。
profile shell 环境的系统范围配置:变量、新文件的默认属性、资源限制等。
rc* 定义每个运行级别的活动服务的目录。
resolv.conf 联系 DNS 服务器(仅域名服务器)的顺序。
sendmail.cf Sendmail 服务器的主要配置文件。
services 此计算机接受的连接(开放端口)。
sndconfigsound 声卡和声音事件的配置。
ssh 包含安全 shell 客户端和服务器配置文件的目录。
sysconfig 包含系统配置文件的目录:鼠标、键盘、网络、桌面、系统时钟、电源管理等(RedHat 特有)
X11 图形服务器 X 的设置。RedHat 使用 XFree,这反映在主配置文件 XFree86Config 的名称中。还包含系统上可用的窗口管理器的通用方向,例如 gdmfvwmtwm 等。
xinetd.*inetd.conf 从系统(扩展)Internet 服务守护程序运行的 Internet 服务的配置文件(不运行独立守护程序的服务器)。

在本指南中,我们将了解有关这些文件的更多信息并详细研究其中的一些文件。

3.2.5. 最常见的设备

设备,通常是 PC 的每个外围附件(CPU 本身除外),在系统中都表示为/dev目录中的条目。这种 UNIX 设备处理方式的优点之一是用户和系统都不必过多担心设备的规范。

Linux 或 UNIX 新手通常会被他们必须学习的大量新名称和概念所淹没。这就是为什么本简介中包含常见设备列表的原因。

表 3-4. 常见设备

名称设备
cdromCD 驱动器
console当前使用的控制台的特殊条目。
cua*串行端口
dsp*用于采样和录制的设备
fd*大多数类型的软盘驱动器的条目,默认是/dev/fd0,用于 1.44 MB 软盘的软盘驱动器。
hd[a-t][1-16]标准支持 IDE 驱动器,每个驱动器最多可有多个分区。
ir*红外设备
isdn*ISDN 连接的管理
js*操纵杆
lp*打印机
mem内存
midi*midi 播放器
mixer*music混音器的理想化模型(组合或添加信号)
modem调制解调器
mouse(还有 msmouse、logimouse、psmouse、input/mice、psaux)各种鼠标
null无底垃圾桶
par*并行端口支持的条目
pty*伪终端
radio*适用于无线电爱好者(HAM)。
ram*启动设备
sd*SCSI 磁盘及其分区
sequencer用于使用声卡合成器功能(MIDI 设备控制器)的音频应用程序
tty*模拟 vt100 终端的虚拟控制台。
usb*USB 卡和扫描仪
video*用于支持视频的图形卡。

3.2.6. 最常见的变量文件

/var目录中,我们找到了一组用于存储特定非恒定数据的目录(与 ls 程序或系统配置文件相反,后者更改相对不频繁或从不更改)。所有频繁更改的文件,例如日志文件、邮箱、锁定文件、后台打印程序等,都保存在/var.

的子目录中。作为安全措施,这些文件通常与主系统文件分开保存,因此我们可以密切关注它们,并在必要时设置更严格的权限。这些文件中的许多文件也需要比平时更多的权限,例如/var/tmp,它需要对每个人都可写。这里可能会有很多用户活动,甚至可能是连接到您系统的匿名 Internet 用户生成的活动。这就是/var目录(包括其所有子目录)通常位于单独分区上的原因之一。这样,例如,就不会有邮件炸弹填满文件系统其余部分的风险,其中包含更重要的数据,例如您的程序和配置文件。

Note/var/tmp 和 /tmp
 

中的文件/tmp可能会在没有通知的情况下被删除,这可能是由于定期系统任务或系统重启。在某些(自定义)系统上,/var/tmp也可能表现出不可预测的行为。尽管如此,由于默认情况下并非如此,我们建议使用/var/tmp目录来保存临时文件。如有疑问,请咨询您的系统管理员。如果您管理自己的系统,如果您没有有意识地更改/var/tmp上的设置(以 root 用户身份,普通用户无法执行此操作),您可以合理地确定这是一个安全的地方。

无论您做什么,都尽量坚持授予普通用户的权限 - 不要直接将文件保存在文件系统的根目录 (/) 下,不要将它们放在/usr或某些子目录或其他保留位置。这在很大程度上限制了您对安全文件系统的访问。

UNIX 系统上的主要安全系统之一(自然也在每台 Linux 机器上实现)是日志记录工具,它记录所有用户操作、进程、系统事件等。所谓的 syslogdaemon 的配置文件确定哪些日志信息将被保留以及保留多长时间。所有日志的默认位置是/var/log,其中包含访问日志、服务器日志、系统消息等的不同文件。

/var中,我们通常会找到服务器数据,这些数据保存在此处以将其与关键数据(例如服务器程序本身及其配置文件)分开。Linux 系统上的一个典型示例是/var/www,其中包含 Web 服务器提供的实际 HTML 页面、脚本和图像。FTP 服务器的 FTP 树(远程客户端可以下载的数据)最好也保存在/var的子目录之一中。由于此数据是公开可访问的,并且经常可以由匿名用户更改,因此将其保存在此处(远离具有敏感数据的分区或目录)更安全。

在大多数工作站安装中,/var/spool至少包含一个at和一个cron目录,其中包含计划任务。在办公环境中,此目录通常还包含lpd,其中包含打印队列和进一步的打印机配置文件,以及打印机日志文件。

在服务器系统中,我们通常会发现/var/spool/mail,其中包含本地用户的传入邮件,每个用户在一个文件中排序,即用户的 “收件箱”。一个相关的目录是mqueue,未发送邮件消息的后台打印区域。系统的这些部分在用户众多的邮件服务器上可能非常繁忙。新闻服务器也使用/var/spool区域,因为它们必须处理大量的消息。

环境变量/var/lib/rpm目录是 RPM-based (Red Hat Package Manager) 发行版特有的;它是存储 RPM 软件包信息的位置。其他软件包管理器通常也会将其数据存储在/var.