unix文件系统:系统管理之漫谈UNIX的文件系统



  =atitle>文件名称含义

  UNIX 计算机上文件采用层次结构进行组织这个层次结构最高层是 /般称其为“斜线”或者“根目录”

  如果您将工作目录更改为 /并运行 ls那么您将看见几个具有神秘名称子目录(如 etc、bin、var、home 和 tmp)尽管 UNIX 现在支持长文件名但是这些顶层目录名字中大多数可以追溯到大约 30 年前即 UNIX 刚刚出现时候类似地根据同样长期存在约定包含在 / 中每个目录都用于某个特殊:

/bin 仅仅是包含应用和实用工具许多目录中然而/bin 通常包含那些对于系统操作而言基本实用工具因此Shell 文件操作命令如 cpchmod、压缩和解压缩以及诊断命令都位于 /bin 中 /sbin 同样包含那些对于系统操作和维护而言至关重要实用工具然而只有超级用户才能够执行 /sbin 中因此这个目录称为“superuser-bin”或者 /sbin

/dev 包含您系统中所安装所有硬件包括终端和 USB 设备(以及从物理上连接到这台计算机其他外围设备)、伪终端(用于和 X 终端窗口进行交互)以及硬盘驱动器等等 /etc(常常发音为“etsee”)专门用于系统配置/etc 目录包含用于系统守护进程、启动脚本、系统参数和更多其他方面配置文件 /home 包含用户 home 目录例如如果您登录名是 joe那么目录 /home/joe 就是您个人文件库 /lib 用于基本系统库文件在现代 UNIX 中通常共享系统库这意味着并不是每个 2进制文件都链接和包括这些库(那样至少将会浪费空间)但是当需要该库时候按需要加载它并且同时可以由许多应用进行共享因此和 UNIX 同安装核心应用和实用工具运行都需要使用 /lib 中并且您至少需要拥有少量相应库文件以便从源代码创建新可执行文件其中所有文件都是至关重要损坏或者删除(无论是有意还是无意)某个文件就可能使系统变得无法使用 /mnt 是“mount”缩写是装入硬盘驱动器分区和其他设备标准位置如果您希望查看当前装入并且可访问所有设备只需要运行 mount 命令 /tmp 或者“temporary”是系统范围暂存存储区 Web 可能会将会话数据文件保存在这里并且其他实用工具将使用 /tmp 中空间对中间结果进行缓存Cache通常认为 /tmp 中文件在使用后即被丢弃实际上系统管理员可能会在每天晚上删除其中比某个过期时间更早所有文件 /usr 用于存储大量文件最终用户应用(从编辑器、游戏和接口到系统特性)都位于其中它是 man 页面和其他更多内容存储库有些文件很有价值但并不是系统操作所必须那么您很可能会在 /usr 中找到它 /var 是“variable”简写它是用于存储那些大小通常随时间而增大文件存储库可以在 /var 中找到邮箱、日志文件、打印机队列和数据库通常可以将 Web 站点保存在 /var 中 Web 站点可能会在段时间后异常地累积大量数据   以上是些最常见目录名尽管某些 UNIX 版本的间存在细微差异(例如在基于 FreeBSD® Mac OS X 上将包含用户 home 目录目录命名为 /Users而不是 /home)

  =atitle>保持传统

  事实上名称 etc、bin、lib 和 man 在 UNIX 文化中是如此根深蒂固以至于在计算机中其他地方使用相同名称来标注类似用途目录已经成为种传统例如如果您查看位专家 home 目录您很可能会在其中发现 bin 和 lib 目录分别存储个人应用以及脚本和个人库

UNIX 命名约定:获取更多有关 UNIX 命名约定信息请参见附录 A:选择个标准任何标准部分   同样地/usr/local 中通常包括 etc、bin、lib、和 man在历史上曾将 /usr/local 用于存储来自于您站点或者仅和您站点有密切关系应用和数据/usr/local/bin 目录用于存储本地添加、新以及标准系统实用工具本地修改版本例如系统管理员可能在 /usr/local/bin/perl 中提供了 Perl 最新和最好版本同时保持 /usr/bin/perl 不变以便进行引用并且其他核心实用工具可能仍然依赖于它/usr/local/lib 目录作为 /usr/local/bin 补充

  /usr/local 目录甚至可能是个完全独立分区(甚至是通过网络文件系统从 Network Attached Storage [NAS] 设备装入分区)这使得可以更容易地对系统进行数据恢复和恢复使用如果系统中发生了某种情况管理员可以覆盖操作系统文件而无需担心会破坏本地数据

  甚至安装包也是用了类似目录结构例如 MySQL:如果使用了选项 --prefix=/usr/local/mysql, 进行配置那么它将在 /usr/local 中创建它自己根目录名为 /usr/local/mysql并创建子目录 /usr/local/mysql/bin、/usr/local/mysql/lib 等等:

$ ls -1 /usr/local/mysql
bin/
configure*
data/
docs/
/
lib/
man/
...







  或者如果您希望将 MySQL 内容安装到 /usr/local/bin、/usr/local/lib 和其他地方可以使用 --prefix=/usr/local

  =atitle>其他有趣内容

  本文只是简要地介绍所以让我们再安排些其他有趣内容

  =smalltitle>/etc

  /etc 目录是寻找配置文件地方这些配置文件通常以后缀 .conf 作为结束个较大包可能拥有它自己子目录以便收集用于这个包所有配置文件Apache 是个很好例子;特别是Apache V2.2 已经重新组织了它配置文件使其更具模块化并具有更少独立性

  另个新颖内容是 /etc/init.d其中包含当您系统启动时运行许多启动脚本如果您希望干净地重新启动个守护进程例如在更改它配置的后可以在 /etc/init.d 中查找同名脚本例如要重新启动 Postfix 邮件传送代理(MTA)您可以运行:

  $ =boldcode>/etc/init.d/postfix restart



  /etc/init.d 还包含切换到单用户模式脚本以便重新启动并关闭计算机并禁止登录

  =smalltitle>/var/spool

  如前所述/var 保存了那些大小可能随时间增大和缩小文件和 / 可以将 /var 划分为若干个子目录每个子目录都有其自身方案:

/var/spool/mail 是寻找您和其他用户传入邮件地方邮箱是个简单平面(连续、非索引)文件(除非您系统管理员正在使用 maildir 格式)传入邮件追加到文件尾部您所丢弃邮件将从该文件中删除;并且当您读取条新消息时将会更改并重写已有消息状态字段您可以读写您自己邮箱但是可以通过权限防止您访问其他用户邮箱(建议您不要直接编辑您邮箱) /var/log 保存了套系统日志文件或者记录系统活动文件这些日志记录了所有活动从邮件通信到失败登录尝试通常每个守护进程都拥有自己日志文件这使得当个服务失败时很容易搜寻所发生问题可以显示系统活动所以对日志文件访问通常会受到限制只有超级用户才可以访问







  如果您系统提供了集中传真服务那么 /var/spool 还将对这些请求进行排队

  =smalltitle>/usr/man

  用于您 UNIX 系统核心 man 页面位于 /usr/man 中还可以在 /usr/local/man 和包 man 目录(如 /usr/local/mysql5/man)中找到 man 页面扩展集合

   man 页面可能像可执行文件那样存放于许多区别地方所以 man 支持和 PATH 工作方式相同环境变量 MANPATH要在多个位置搜索个特定页面可以将 MANPATH 定义为系列 man 页面目录:

MANPATH="/usr/man"
MANPATH="/usr/local/man:$MANPATH"
MANPATH="/usr/local/mysql/man:$MANPATH
MANPATH="$HOME/man:$MANPATH"
export MANPATH








  在该举例中首先 搜索 $HOME/man(它在最左边或者最前面)随后是 /usr/local/mysql/man依此类推顺便说可以将上面前 4个命令简化为下面语句:

MANPATH="/usr/man:/usr/local/man:\
/usr/local/mysql/man:$HOME/man"








  然而将附加目录隔离开来将允许您快速地对条目进行重新排序并轻松地添加新目录而且如果存在许多路径编辑后面 MANPATH(通过扩展 PATH)变量将变得使人乏味

  =smalltitle>包含文件

  包含文件(或者头文件)定义了在操作系统中或特定库中使用常量、宏以及其他结构不需要重新定义个特定结构您只需要将头文件“包含”在您代码(代码重用种简单形式)中并按照头文件中规范标准编写代码(man 中第 2 部分和第 3 部分就专门用于这样规范标准;例如可以尝试 man 2 signal)

  和 bin 和 lib 类似个常见目录名如果个包提供了开发工具包并且您已经将这个包安装到了它自己根目录那么可以在 子目录中找到相应头文件

  或者如果您已经将包安装到了公共 /usr/local/{bin、lib、} 目录中那么可以在 /usr/local/ 中根据这个包进行命名子目录中找到包头文件这是将所有内容保存到个公共地方例外情况为什么呢?头文件命名不是唯所以将所有内容安装到个地方将会导致冲突个包有可能覆盖另个包头文件

  如果您从源代码构建应用(您将在后面部分中对其进行深入研究)并且头文件位于个非标准位置那么您可能需要在编译器命令中添加 -I 选项作为个举例如果您 ImageMagick 头文件位于 /opt//magick 中添加 -I/opt//magick 作为编译器开关

=atitle>  非常深入地了解它

  即将结束今天 UNIX 旅行现在您可以更容易地穿越 UNIX 小路和背街了如果您迷路了只需要说“家家”(不要被 猎户星座 所欺骗)或者输入 cd 即可请记住您还可以使用 findlocate 来查找大多数文件包括可执行文件、库和包含文件







  =atitle>附录 A:选择个标准任何标准

  您 UNIX 操作系统附带软件Software位于文件系统中适当位置(可能存储在 /bin 或者 /lib 中)而本地添加软件Software则可能位于许多区别位置某些系统管理员将本地软件Software放在 /usr/local 中而其他系统管理员则使用 /opt 或者“optional”运行系统并不需要该软件Software而且某些管理员会转储 /usr/local/bin 或 /opt/bin 中所有可执行文件、/usr/local/lib 或 /opt/lib 中所有等等

  另种思路方法(这是我更喜欢范例)是为每个本地添加包创建个根目录特别是在这个包很大情况下例如我将 MySQL V5 安装到 /usr/local/mysql5.0将 Apache V2.2 安装到 /usr/local/apache2.2每个包安装都会在包根目录中创建它自己 bin、lib 和 man 目录

  这种思路方法有个缺点每个最终用户必须向他或她 PATH 环境变量中添加许多 bin 目录并且当这需求并不是特别复杂时通过在系统范围 Shell 启动文件中扩展缺省 PATH 设置就可以解决这个问题例如Bash 系统范围启动脚本 /etc/profile可能包含:

PATH="/bin:/usr/bin:/usr/local/bin"

PATH="$PATH:/usr/local/mysql5.0/bin"
PATH="$PATH:/usr/local/perl6/bin"
PATH="$PATH:/usr/local/Zend/bin"

export PATH








  然而个包存储在它自己“容器”中这是很有好处:

哪个包提供了特定应用这是显而易见遵循这分类系统您可以使用 which 命令找到包名字: $ =boldcode>which mysql/usr/local/mysql5.0/bin/mysql




您可以同时保留同个包区别版本 例如如果您希望提供 Perl V5.6 和 Perl V5.8可以将前者安装到 /usr/local/perl5.6将后者安装到 /usr/local/perl5.8每个用户都可以通过改变 PATH 变量来选择个 Perl 版本

您可以同时保留区别版本但是可以通过使用符号链接使得缺省情况下对应于某个特定版本只需创建个到您希望提供版本符号链接即可 例如假定您提供了前面介绍两个 Perl 版本如果您希望将 Perl V5.8 作为缺省值可以创建个到 /usr/local/perl5.8 符号链接并将它命名为 perl:

$ =boldcode>ls -1 /usr/local/perl*perl5.6perl5.8$ =boldcode>sudo ln -s /usr/local/perl5.8 \ /usr/local/perl$ =boldcode>ls -1 -F /usr/local/perl*perl5.6/perl5.8/perl@






最终用户现在可以添加 /usr/local/perl/bin 到他或她 PATH 变量以运行 perl 命令如果您最后需要或者希望切换到个更新或者更旧 Perl 版本那么您只需删除该符号链接并重新创建个指向区别目录符号链接即可

对于这样维护任务符号链接是非常重要您可以维护变量、变更路径并为方便访问构建集合例如您可以在传统 /usr/local/bin 目录中填入链接到其他包中命令符号链接ln -s /usr/local/perl/bin/perl /usr/local/bin/perl(是您可以创建指向另个符号链接符号链接)



Tags:  ntfs文件系统 linux文件系统 文件系统 unix文件系统

延伸阅读

最新评论

发表评论