3 系统目录结构

3.1 FHS 标准

  • 为了避免诸多使用者对 Linux 系统目录结构天马行空,Linux 基金会发布了 FHS 标准。多数 Linux 发行版系统都遵循这一标准
  • FHS(Filesystem Hierarchy Standard),文件系统层次化标准,该标准规定了 Linux 系统中所有一级目录以及部分二级目录(/usr 和 /var)的用途。发布此标准的主要目的就是为了让用户清楚地了解每个目录应该存放什么类型的文件

3.2 Linux 根目录

  • FHS 认为,Linux 系统的根目录(/)最为重要(没有之一),其原因有以下 2 点
    • 所有目录都是由根目录衍生出来的
    • 根目录与系统的开机、修复、还原密切相关
  • 在 Linux 或 Unix 操作系统中,所有的文件和目录都被组织成以一个根节点开始的倒置的树状结构
    • 文件系统的最顶层由根目录开始的,系统使用/表示根目录
    • 根目录之下的既可以是目录(一级目录),也可以是文件,而每一个目录中又可以包含子目录(二级目录)和文件。如此反复就可以构成一个庞大的文件系统
  • 两个特殊的目录
    • 用户所在的工作目录,也叫当前目录,可使用一个点../表示
    • 当前目录的上一级目录,也叫父目录,可使用两个点..../表示
  • 如果一个目录或文件名以一个点.开始,表示这个目录或文件是一个隐藏目录或文件(.bashrc)。即以默认方式查找时,不显示该目录或文件

3.2.1 系统启动相关

目录 描述
/boot 存放启动 Linux 时使用的一些核心文件,包括一些链接文件以及镜像文件
/etc 存放所有系统管理所需要的配置文件和子目录,更改目录下的文件可能导致系统不能启动。系统内所有默认安装(rpm 安装)的服务配置文件全部保存在此目录,如用户信息、服务启动脚本、常用服务的配置文件等
/lib 存放系统最基本的动态链接共享库,作用类似 Windows 的 DLL 文件。几乎所有的应用程序都需要用到这些共享库
/sys 虚拟文件系统。和 /proc/ 目录相似,该目录中的数据都保存在内存中,主要保存与内核相关的信息。这是linux2.6内核的一个很大的变化。该目录下安装了2.6内核中新出现的一个文件系统 sysfs。sysfs文件系统集成了下面3种文件系统的信息:针对进程信息的proc文件系统、针对设备的devfs文件系统以及针对伪终端的devpts文件系统。该文件系统是内核设备树的一个直观反映。当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中被创建

3.2.2 命令集合

目录 描述
/bin Binary 的缩写,存放最常使用的命令(如 ls 在 /bin/ls 目录),普通用户和 root 都可执行。在单用户模式下也可以执行
/sbin s(Super User),保存与系统环境设置相关的命令,只有 root 可以使用这些命令进行系统环境设置,但也有些命令可以允许普通用户查看
/usr/bin 系统用户使用的应用程序,普通用户和超级用户都可执行。这些命令和系统启动无关,在单用户模式下不能执行
/usr/sbin 超级用户使用的比较高级的管理程序和系统守护程序
  • /bin, /sbin, /usr/bin, /usr/sbin: 系统预设的执行文件的放置目录
    • /sbin, /usr/sbin 是给 root 使用的指令
    • /bin, /usr/bin 是给系统用户使用的指令(除root外的通用户)

3.2.2.1 /usr 目录

  • usr(注意不是 user),全称为 Unix Software Resource,此目录用于存储系统软件资源。FHS 建议所有开发者,应把软件产品的数据合理的放置在 /usr 目录下的各子目录中,而不是为他们的产品创建单独的目录
  • Linux 系统中,所有系统默认的软件都存储在 /usr 目录下,/usr 目录类似 Windows 系统中 C:\Windows\ + C:\Program files\ 两个目录的综合体
目录 描述
/usr/include C/C++ 等编程语言头文件的放置目录
/usr/lib 应用程序调用的函数库保存位置
/usr/local 手工安装的软件保存位置。一般建议源码包软件安装在这个位置
/usr/src 内核源代码默认的放置目录。手工下载的源码包和内核源码包都可以保存到这里
/usr/XllR6 图形界面系统保存位置

3.2.2.2 Linux 命令

3.2.2.2.1 命令提示符
  • 登录系统后,第一眼看到的内容是:

    [root@localhost ~]#
    
  • 这就是 Linux 系统的命令提示符

    • []:这是提示符的分隔符号,没有特殊含义
    • root:显示的是当前的登录用户
    • @:分隔符号,没有特殊含义
    • localhost:当前系统的简写主机名(完整主机名是 localhost.localdomain)
    • ~:代表用户当前所在的目录,此例中用户当前所在的目录是家目录
    • #:命令提示符,Linux 用这个符号标识登录的用户权限等级
    • 超级用户,提示符是 #
    • 普通用户,提示符是 $
  • 用户在自己的家目录中拥有完整权限,所以建议操作实验可以放在家目录中进行

    [root@localhost ~]# cd /usr/local
    # 切换用户所在目录,命令提示符中的 ~ 会变成用户当前所在目录的最后一个目录(不显示完整的所在目录 /usr/local,只显示最后一个目录 local)
    [root@localhost local]#
    
3.2.2.2.2 命令的基本格式
  • 基本格式 命令[选项][参数]
    • [] 代表可选项,也就是有些命令可以不写选项或参数,也能执行
  • 用 Linux 中最常见的 ls 命令来解释一下命令的格式

    • 如果按照命令的分类,那么 ls 命令应该属于目录操作命令

      # ls 命令之后不加选项和参数也能执行,但只能执行最基本的功能,即显示当前目录下的文件名
      [root@localhost ~]# ls
      anaconda-ks.cfg install.log install.log.syslog
      # 如果加"-l"选项,可以看到显示的内容明显增多了
      # "-l"是长格式(long list)的意思,也就是显示文件的详细信息
      [root@localhost ~]# Is -l
      总用量44
      -rw-------.1 root root 1207 1 月 14 18:18 anaconda-ks.cfg
      -rw-r--r--.1 root root 24772 1 月 14 18:17 install.log
      -rw-r--r--.1 root root 7690 1 月 14 18:17 install.log.syslog
      
  • 选项的作用:调整命令功能。如果没有选项,命令只能执行最基本的功能;而选项可以显示更加丰富的数据

    • 短格式选项(-l):是英文的简写,用一个减号调用,如 [root@localhost ~]# ls -l
    • 长格式选项(–all):是英文完整单词,一般用两个减号调用,如 [root@localhost ~]# ls --all
    • 一般情况下,短格式选项是长格式选项的缩写,也就是一个短格式选项会有对应的长格式选项
    • 当然也有例外,比如 ls 命令的短格式选项 -l 就没有对应的长格式选项
    • 具体的命令选项可以通过帮助命令来进行査询
  • 参数的作用

    • 参数是命令的操作对象,一般文件、目录、用户和进程等可以作为参数被命令操作
    • 命令一般都需要加入参数,用于指定命令操作的对象是谁。如果可以省略参数,则一般都有默认参数

      [root@localhost ~]# ls -l anaconda-ks.cfg
      -rw-------.1 root root 1207 1 月 14 18:18 anaconda-ks.cfg
      # ls 默认参数是当前所在位置,显示当前目录下的文件名
      [root@localhost ~]# ls
      anaconda-ks.cfg install.log install.log.syslog
      
3.2.2.2.3 命令分类
  • Linux 命令按照来源方式,可分为两种
    • Shell 内置命令:Shell 自带的命令,这些命令没有执行文件,也没有执行文件所在路径
    • 外部命令:外部命令是由程序员单独开发的,是命令,会有命令的执行文件
  • Linux 中的绝大多数命令是外部命令

3.2.3 外部文件和设备管理

目录 描述
/dev Device(设备)的缩写, 存放 Linux 的外部设备,在 Linux 中访问设备和访问文件的方式相同
/media Linux 系统会自动识别一些媒体设备(U 盘/光驱),识别后把识别的设备挂载到这个目录
/mnt 为了让用户临时挂载别的文件系统。可以将光驱挂载在/mnt/上,然后进入该目录查看光驱里的内容
/misc 挂载目录。系统建议用来挂载 NFS 服务的共享目录。虽然系统准备了三个默认挂载目录 /media/、/mnt/、/misc/,但是哪个目录挂载什么设备可由管理员自己决定

3.2.4 临时文件

目录 描述
/lost+found 一般情况下为空,当系统意外崩溃或意外关机时,产生的一些文件碎片会存放在这里。在系统启动的过程中,fsck 工具会检查这里,并修复已经损坏的文件系统。这个目录只在每个分区中出现,例如,/lost+found 就是根分区的备份恢复目录,/boot/lost+found 就是 /boot 分区的备份恢复目录
/run 一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。如果系统上有 /var/run 目录,应该让它指向 run
/tmp 用来存放一些临时文件

3.2.5 账户相关

目录 描述
/home 用户主目录(也称家目录)。创建用户时,每个用户要有一个默认登录和保存自己数据的位置,就是用户的主目录,所有普通用户的主目录是在 /home/ 下建立一个和用户名相同的目录
/root 系统管理员,也称作超级权限者的用户主目录

3.2.6 运行过程相关

目录 描述
/proc 虚拟文件系统。是一个虚拟目录,是系统内存的映射,可以通过直接访问这个目录来获取系统信息。这个目录的内容不在硬盘而在内存,主要保存系统的内核、进程、外部设备状态和网络状态等。如 /proc/cpuinfo 是保存 CPU 信息的,/proc/devices 是保存设备驱动的列表的,/proc/filesystems 是保存文件系统列表的,/proc/net 是保存网络协议信息的。也可直接修改里面的某些文件,比如可以通过下面的命令来屏蔽主机的ping命令,使别人无法ping你的机器echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
/var 存储动态数据,例如缓存、日志文件、软件运行过程中产生的文件等

3.2.6.1 /var 目录

  • /var:这是一个非常重要的目录,系统上跑了很多程序,那么每个程序都会有相应的日志产生,而这些日志就被记录到这个目录下,具体在 /var/log 目录下,另外 mail 的预设放置也是在这里
目录 描述
/var/lib 程序运行中需要调用或改变的数据保存位置。如 MySQL 数据库保存在 /var/lib/mysql/
/var/log 登陆文件放置的目录,其中包含比较重要的文件如 /var/log/messages, /var/log/wtmp 等
/var/nis和/var/yp NIS 服务机制使用的目录,nis 主要记录所有网络中每一个 client 的连接信息;yp 是 linux 的 NIS 服务的日志文件存放的目录
/var/run 一些服务和程序运行后,它们的 PID(进程 ID)保存位置
/var/spool 主要是一些临时存放,随时会被用户调用的数据,例如 /var/spool/mail/ 存放新收到的邮件,/var/spool/cron/ 存放系统定时任务
/var/tmp 一些应用程序在安装或执行时,需要在重启后使用的某些文件,此目录能将该类文件暂时存放起来,完成后再行删除
/var/www RPM 包安装的 Apache 的网页主目录

3.2.7 扩展所需

目录 描述
/opt 第三方安装的软件保存位置。是放置和安装其他软件的位置,手工安装的源码包软件都可以安装到这个目录。如安装一个ORACLE数据库就可以放到这个目录下。默认是空。/usr/local/ 目录也可以用来安装软件
/selinux Redhat/CentOS所特有的目录,Selinux是一个安全机制,类似于windows的防火墙,但是这套机制比较复杂,这个目录就是存放selinux相关的文件的
/srv 服务数据目录。一些系统服务启动之后,可以在这个目录中保存所需要的数据

3.3 注意

  • /proc/fn/sys/ 保存在内存,如果在这里写入数据,那么内存会越来越小,直至死机
  • /boot/ 不能保存额外数据,因为会单独分区作为启动分区,如果没有空闲空间,会导致系统不能正常启动

相关