基本组织原则
在UNIX系统设计的时候,有一个文件布局的基本原则,按照各文件在系统中的所在的作用,可以划分为公有/私有和只读/可写这两类四个属性。Linux也是基于UNIX的所以也遵循这个原则。
一般来说:
- 不一定必须由本地系统提供的文件都可以看作公有的
- 必须由本地系统提供的文件则可以看作是私有的
- 能够被保存在只读存储设备上的文件都可以被认为是只读的
- 反之那些必须要保存在可读写设备上的文件就是可写的
现在看来有些不必要,但是在以前大量的本地存储是非常昂贵的,而让远端的一个设备来存储大家公用的一些程序是那时候的一个解决方案。(在linux系统中任何设备都能够以文件的形式挂在到根目录下,这使得非本地存储设备通过某种网络协议挂在到本地根目录下)。但是只是公有的肯定无法解决所有问题,毕竟本机的设备与其他设备还是有些不同的,他们还由许多专属的文件也不能提供给他人,则就需要私人文件了。
所以在FHS(linux基金会定义的linux文件系统层级标准)中规定了 /usr目录为公有的, /var目录为私有的。
根文件系统
根目录在linux下表示为/,所有其他目录都挂载在根目录下。尽管他们可能不再同一个硬盘上,甚至/sys和/proc这些在内存中的数据。
根目录下必须的目录有以下几个:
名称 | 功能 |
---|---|
bin | 重要的可执行文件,shell命令 |
boot | 引导器配置文件、内核等 |
dev | 设备文件 |
etc | 系统专用配置文件 |
lib | 重要的共享库和内核模块 |
media | 可移动设备挂接点 |
opt | 附加应用软件包 |
run | 与当前运行进程有关的数据 |
sbin | 重要的系统可执行文件 |
srv | 本系统提供的用于服务器的数据 |
tmp | 临时文件 |
usr | 文件系统的第二层,公有文件的放置地 |
var | 可变数据 |
可选的目录:
名称 | 功能 |
---|---|
home | 用户家目录 |
lib64 | 64位系统特有的 |
root | root用户家目录 |
/bin目录
其下包含了用户命令文件,提供给所有用户和脚本程序使用。在很多发行版本中这个是一个指向/usr/bin的符号链接。某种意义上也是对FHS的支持,也是对linux文件系统组织原则的遵守(命令文件肯定是公有的) 。使用pacman安装软件默认的可执行程序也在该目录下(实际上是/usr/bin目录,不过/bin是一个指向/usr/bin的符号链接)
其中必须的内容如下:
命令 | 说明 |
---|---|
cat | 连接多个文件并将内容输出至标准输出 |
chgrp | 改变文件所属组 |
chmod | 改变文件的访问权限 |
chown | 改变文件所属用户和组 |
cp | 复制文件 |
date | 打印或设置系统日期和时间 |
dd | 转换并复制文件 |
df | 查看文件系统磁盘空间使用情况 |
dmesg | 打印或控制内核的消息缓冲 |
echo | 显示一行文本 |
false | 不做任何事情,表示不成功 |
hostname | 显示或设置系统的主机名 |
kill | 向进程发送信号 |
ln | 创建文件链接 |
login | 开始系统上的一个会话 |
ls | 列出目录内容 |
mkdir | 创建目录 |
mknod | 创建块或字符设备的专用文件 |
more | 分页显示文本 |
mount | 挂载一个文件系统 |
mv | 移动或改名 |
ps | 查看系统进程状态 |
pwd | 打印当前工作目录名 |
rm | 删除文件或目录 |
rmdir | 删除空目录 |
sed | 一个流式文本编辑器 |
sh | Bourne shell |
stty | 改变或打印终端行设置 |
su | 改变用户标识 |
sync | 刷新文件系统缓存 |
true | 不做任何事情,表示成功 |
umount | 卸载文件系统 |
uname | 打印系统信息 |
可选命令:
命令 | 功能 |
---|---|
csh | 著名的C shell,可能是一个/bin/tcsh的符号链接 |
ed | ed文本编辑器 |
tar | 打包工具 |
cpio | 打包工具 |
gzip | 压缩工具 |
gunzip | 压缩工具,如果有一定是指向 gzip 的链接 |
zcat | 压缩工具,同上 |
netstat | 网络统计工具 |
ping | 网络测试工具 |
/boot目录
该目录包含了Linux启动过程所需要的所有内容。更专业的说法是,该目录下保存的数据用于内核开始执行用户级程序之前使用的东西。例如引导加载器、内核镜像等。操作系统的内核可以直接放到根目录下也可以放到/boot目录下。一个通常的做法是让/root目录占用一个单独的磁盘分区而与根分区分离。这样能更进一步减少根分区,保护启动分区(完全只读),来提高系统的安全性。
/dev目录
这是设备文件或专有文件的放置位置。
/etc目录
/etc包含了系统特有的配置文件,所谓配置文件就是用于控制程序运行的本地文件。它绝大多数情况下是只读私有的文件,而且可编辑。这里的只读与可编辑并不是矛盾的,可编辑是指人们可以直接看懂的文本文件,只读也是相对的对于普通用户是只读的,对于root并不是,而且在系统的运行中确实很少动这些文件。
需要放置到/etc目录下的目录:
名称 | 功能 |
---|---|
opt | /opt目录下各软件的配置文件 |
rc.d | init进程的配置文件 |
X11 | X window系统的配置文件,可选 |
sgml | SGML的配置文件,可选 |
xml | XML的配置文件,可选 |
需要放置在/etc目录下的文件:
名称 | 功能 |
---|---|
csh.login | C shell登陆的全局初始化文件 |
exports | NFS文件系统的访问控制列表 |
fstab | 文件系统的静态信息,系统初始化时需要挂载多个文件系统时需要 |
ftpusers | FTP守护进程的用户访问控制列表 |
gateways | routed的网关列表 |
gettydefs | getty程序的配置文件 |
group | 用户组列表文件 |
host.conf | 决定如何解析域名 |
hosts | 主机名静态信息 |
hosts.allow | 允许访问本机的IP地址列表 |
hosts.deny | 禁止访问本机的IP地址列表 |
hosts.equiv | 信任主机列表,作用于rlogin rsh rep |
hosts.lpd | 信任主机列表,作用于lpd |
inetd.conf | inetd守护进程的配置文件 |
inittab | init程序的配置文件 |
issue | 登陆提示符上面的消息和标识文件 |
ld.so.conf | 搜索共享库的目录列表文件 |
motd | 本机的标识信息 |
mtab | 文件系统的动态信息 |
mtools.conf | mtools程序配置文件 |
networks | 网络名称的静态信息 |
passwd | 用户密码文件 |
printcap | ldp打印机的性能数据库 |
profile | sh shell登陆的全局初始化文件 |
protocols | 网络协议定义文件 |
resolv.conf | DNS域名解析的配置文件 |
rpc | RPC协议定义文件 |
securetty | root登陆的TTY访问控制文件 |
services | 记录网络服务名和他们对应使用的端口号及协议 |
shells | 可使用的登陆shell路径名 |
syslog.conf | syslogd守护进程的配置文件 |
/home目录
该目录是用户专有目录,每个用户都会在/home目录下有其对应的子目录,而且这个子目录一般与他的用户名相同。没有任何程序会依赖于这个目录。
同一个程序,不同的用户有不同的配置方式,这些用户独有的配置文件就保存在它的home目录中,一般以.开头的隐藏文件。如果某个程序需要创建多个配置文件,它会在用户的home目录下创建一个隐藏文件夹来保存。
一个用户对其拥有的home目录有绝对的控制权,可以作任何事情,不仅仅是保存自己的文件,还能够安装软件,甚至在home目录下模拟整套linux文件的系统布局。
/lib目录
/lib目录里存放着必备的共享库和内核模块。在系统启动阶段和运行根文件系统上的各种命令时,都需要用到这些共享库,所以必须与根文件系统放在一起。如果时64位系统,这个目录的部分功能会转移到/lib64目录下。而内核模块只会使用/lib目录。
/media目录
该目录用于挂载软盘、U盘、光盘等可移动设备,不同的子目录用于挂载不同类型的设备,而具体的目录名就是具体的设备类型。曾经出现过很多其他其他名称的挂载点,例如/cdrom /mnt /mnt/cdrom等,但是现在统一规定到了/media中。虽然你还可以继续挂载到/mnt中,但是这与规范不符,/mnt现在只是临时挂载点。
/mnt目录
该目录是让系统管理员临时挂载某个文件系统的,此目录的内容属于局部问题,不应该影响任何程序的运行。千万不要安装什么程序,毕竟一个临时目录在系统不需要它的时候会被其他东西占用。
/opt目录
这个是系统附加软件包的安装目录。每个软件包会在/opt下拥有一个自己的目录,那里面存放着它所有的可执行程序和静态数据。这个专有目录名应该与去程序名一样。这样用户就可以很好的管理他们了。
例如我们安装了google-chrome,就是安装在这里/opt/google/chrome目录下,而/usr/bin中的google-chrome是链接到该目录下的符号链接。
我们来说明下linux的软件安装目录:
/usr:系统级的安装目录,可以理解为C;//Windows/ 我们通过pacman通常默认就是安装在这个目录
/usr/local:用户级别的程序目录,可以理解为Program File/ 用户自己编译的软件默认安装在这个目录下
/opt 用户级的程序目录,可以理解为D:/Software 通常放置一些第三方大型软件或游戏
root目录
root帐号的家目录。
/sbin目录
必备的系统软件存放处。用于系统维护的软件和某些只限root用户使用的命令存储该目录下。主要是存储系统启动、恢复、还原以及修复过程中必备的系统工具,也是对/bin的补充。
必须出现在/sbin目录的命令:
名称 | 功能 |
---|---|
shutdown | 关机命令 |
fastboot | 快速重新启动系统 |
fasthalt | 快速停止系统运行 |
fdisk | 磁盘分区维护工具 |
halt | 停止系统运行 |
ifconfig | 网口配置工具 |
init | 系统初始化进程,内核调用的第一个用户进程 |
mkfs | 创建文件系统 |
mkswap | 格式化交换分区 |
reboot | 重新启动 |
route | IP路由表维护工具 |
swapon | 开启页交换 |
/srv目录
服务进程所需数据。某些服务进程启动后,他们需要读取的数据会放在/srv目录中,提供/srv目录一方面为了方便用户找到特地服务的数据文件,另一方面也是位某些服务放置他们的执行脚本、只读或可写数据提供一个合适的地方。
目前并没有规范/srv子目录的命名方法。有一种方式是按照协议构造如ftp rsync www cvs等。
/tmp目录
/tmp目录必须能够被任何程序、任何用户访问,它存放临时文件。任何程序都不用对/tmp目录下任何文件或目录负责,尽管如此,还是建议在系统重新启动后清除/tmp目录下的内容。
/usr目录
/usr目录是整个文件系统的第二个主要区段。它即是共有的也是只读的。这意味着/usr可以共享在多种主机之间,但不能写入。任何主机专有的或随时间变化的信息只能存放在其他地方,即使大型软件包,也不得占用/usr下的一个独立子目录。
/usr下的必备子目录:
名称 | 功能 |
---|---|
bin | 大部分用户命令 |
include | C程序头文件目录 |
lib | 程序库 |
local | 用户自行安装的程序存放目录 |
sbin | 非重要的系统程序 |
share | 体系结构独立数据 |
tmp | 一个到/var/tmp的符号链接,为了保持与老系统的兼容 |
可选目录:
名称 | 功能 |
---|---|
games | 游戏目录 |
src | 源代码 |
/usr/bin目录
系统中绝大多数的命令放在此处。在manjaro中,包括根目录的/bin也是它的符号链接。系统默认的可执行文件安装目录就在此处,任何第三方程序包括安装在/opt和/usr/local/bin中的可执行文件都可以在此处放置一个符号链接指向其可执行文件。
/usr/include目录
系统内所有通用的C语言头文件都放在此处。
/usr/lib目录
其中保存了库和目标文件,他们都是二进制文件。不被用户和shell直接执行,应用程序可以在这里创建独立的子目录。在centos中/lib是指向这里的符号链接
/usr/local目录
/usr/local是整个文件系统的第三个主要区段。是供系统管理员安装局域性软件使用的。它保证了当系统更新时不会把他们覆盖掉。
其中包括的目录:
名称 | 作用 |
---|---|
bin | 局域性可执行文件 |
etc | 局域性软件的配置文件目录 |
include | 局域性C头文件 |
lib | 局域性程序库 |
man | 局域性在线指南 |
sbin | 局域性系统管理命令 |
share | 局域性体系结构无关数据 |
src | 局域性源代码文件 |
默认情况下不会在有其他的子目录了,/usr/local/etc也可能符号链接到/etc/local,这更适合用于将所有配置文件放置在/etc下的这一个原则。
可以看出,该目录下有完整的结构,所以可以看出在linux系统中,/是第一个主要区段是整个文件系统的根其下也定义了bin etc lib sbin等,/usr是第二个主要区段是全局性的也定义了bin etc lib sbin等。而/usr/local是第三个主要区段定义了局域性数据其下也有bin etc lib sbin等。
/usr/sbin目录
系统管理软件的可执行程序。虽然根据层级 /sbin是必须的系统管理命令,/usr/sbin是非必要但重要的系统管理命令,/usr/local/sbin是局域性的系统管理命令。但是实际上 /sbin是一个符号链接到/usr/sbin。同理还有/bin和/lib等。
/usr/share目录
这里存放着所有体系结构无关的数据文件,它的内容可以共享给运行在任何体系结构下的操作系统。例如某个站点可能由i386 arm等体系结构平台构成,但是他们可能共同维护唯一一个挂载到某处的/usr/share目录。需要注意的是,虽然/usr/share可以共享于不同体系结构之间,但是其必须运行相同的操作系统。其下最重要的目录是man目录。
/usr/share/man目录介绍:
这个目录是专门联机帮助而准备的。它包含了/和/usr下大部分程序的帮助信息。
其路径位: 语言(en fr it zh_CN等)/man1~8/.gz压缩文件
man1 公共可用的命令或软件的指南
man2 所有系统调用的说明
man3 库函数的说明信息
man4 特种文件的说明 如/dev目录下的设备文件和提供网络协议支持的内核接口等
man5 大部分数据文件的格式说明
man6 游戏演示程序等一些不太重要的程序说明文档
man7 其他类型的在线帮助信息
man8 系统维护程序文档保存在这里
/var目录
该目录包含着系统中绝大多数的随时变化着的数据,比如系统日志等。/var下的某些内容是无法共享的,比如/var/logs /var/lock /var/run等。某些是可以共享的比如/var/mail /var/cache/man /var/spool/news等
/var的创建就是为了从/usr中剥离可写数据,以便可以以只读方式挂载/usr目录。
/var目录下必须具备的内容:
名称 | 功能 |
---|---|
cache | 应用程序的缓存数据 |
lib | 可变状态信息 |
local | /usr/local的可变数据 |
lock | 锁文件 |
log | 日志文件于目录 |
opt | /opt的可变数据 |
run | 与当前运行进程有关的数据 |
spool | spool应用程序 |
tmp | 系统重新启动期间起到保护作用的临时文件 |
/var目录下可选内容:
名称 | 功能 |
---|---|
account | 记录进程的运行情况 |
games | 游戏的可变数据 |
用户的邮件 | |
yp | 网路信息服务NIS数据库文件 |