0%

Linux-Filepath

阅读更多

1 /etc目录

  1. /etc/passwd:系统用户配置文件,每一行共7个部分
    1. username
    2. password
    3. UID
    4. GID
    5. UID Info
    6. Home Directory,决定了HOME环境变量的内容
    7. Shell
  2. /etc/redhat-release:redhat发行版信息
  3. /etc/issue:ubuntu发行版信息
  4. /etc/motd:登录成功后显示的欢迎界面
  5. /etc/update-motd.d:ubuntu下,与登录成功后显示的欢迎界面相关的一些脚本
  6. /etc/localtime:时区配置文件的软连接,实际生效的时区配置
  7. /etc/ssl/certs:根证书存放位置
  8. /etc/security/limits.confulimit -a对应的配置文件
    • echo "* soft core unlimited" >> /etc/security/limits.conf
    • echo "* hard core unlimited" >> /etc/security/limits.conf
  9. rc-local:用于在开机时执行一些初始化脚本,它默认是关闭的,可以通过以下命令开启
    • chmod +x /etc/rc.d/rc.local
    • chmod +x /etc/rc.local
    • systemctl enable rc-local.service
    • systemctl start rc-local.service
    • 将需要开机执行的脚本的绝对路径,追加到/etc/rc.local文件尾,/etc/rc.d/rc.local文件不需要手动修改,生效后会自动将/etc/rc.local的内容同步到/etc/rc.d/rc.local中去

2 /sys目录

首先,先通过tree -L 1 /sys看下/sys的目录结构,结果如下

1
2
3
4
5
6
7
8
9
10
11
12
/sys
├── block
├── bus
├── class
├── dev
├── devices
├── firmware
├── fs
├── hypervisor
├── kernel
├── module
└── power
子目录 作用
/sys/block 该目录下的所有子目录代表着系统中当前被发现的所有块设备。按照功能来说放置在/sys/class下会更合适,但由于历史遗留因素而一直存在于/sys/block,但从linux2.6.22内核开始这部分就已经标记为过去时,只有打开了CONFIG_SYSFS_DEPRECATED配置编译才会有这个目录存在,并且其中的内容在从linux2.6.26版本开始已经正式移到了/sys/class/block,旧的接口/sys/block为了向后兼容而保留存在,但其中的内容已经变为了指向它们在/sys/devices/中真实设备的符号链接文件
/sys/bus 该目录下的每个子目录都是kernel支持并且已经注册了的总线类型。这是内核设备按照总线类型分层放置的目录结构,/sys/devices中的所有设备都是连接于某种总线之下的,bus子目录下的每种具体总线之下可以找到每个具体设备的符号链接,一般来说每个子目录(总线类型)下包含两个子目录,一个是devices,另一个是drivers;其中devices下是这个总线类型下的所有设备,这些设备都是符号链接,它们分别指向真正的设备/sys/devices/name/;而drivers下是所有注册在这个总线上的驱动,每个driver子目录下是一些可以观察和修改的driver参数。(它也是构成linux统一设备模型的一部分)
/sys/class 该目录下包含所有注册在kernel里面的设备类型,这是按照设备功能分类的设备模型,每个设备类型表达具有一种功能的设备。每个设备类型子目录下都是相应设备类型的各种具体设备的符号链接,这些链接指向/sys/devices/name下的具体设备。设备类型和设备并没有一一对应的关系,一个物理设备可能具备多种设备类型;一个设备类型只表达具有一种功能的设备,比如:系统所有输入设备都会出现在/sys/class/input之下,而不论它们是以何种总线连接到系统的。(/sys/class也是构成linux统一设备模型的一部分)
/sys/dev 该目录下维护一个按照字符设备和块设备的主次号码major:minor链接到真实设备/sys/devices的符号链接文件
/sys/devices 该目录下是全局设备结构体系,包含所有被发现的注册在各种总线上的各种物理设备。一般来说,所有的物理设备都按其在总线上的拓扑结构来显示,但有两个例外,即platform devicessystem devicesplatform devices一般是挂在芯片内部的高速或者低速总线上的各种控制器和外设,它们能被CPU直接寻址;system devices不是外设,而是芯片内部的核心结构,比如CPU,timer等,它们一般没有相关的驱动,但是会有一些体系结构相关的代码来配置它们。(sys/devices是内核对系统中所有设备的分层次表达模型,也是/sys文件系统管理设备的最重要的目录结构)
/sys/firmware 该目录下包含对固件对象firmware object和属性进行操作和观察的接口,即这里是系统加载固件机制的对用户空间的接口。(关于固件有专用于固件加载的一套API)
/sys/fs 按照设计,该目录使用来描述系统中所有的文件系统,包括文件系统本身和按照文件系统分类存放的已挂载点
/sys/hypervisor 该目录是与虚拟化Xen相关的装置。(Xen是一个开放源代码的虚拟机监视器)
/sys/kernel 这个目录下存放的是内核中所有可调整的参数
/sys/module 该目录下有系统中所有的模块信息,不论这些模块是以内联inlined方式编译到内核映像文件中还是编译为外模块.ko文件,都可能出现在/sys/module中。即module目录下包含了所有的被载入kernel的模块。
/sys/power 该目录是系统中的电源选项,对正在使用的power子系统的描述。这个目录下有几个属性文件可以用于控制整个机器的电源状态,如可以向其中写入控制命令让机器关机/重启等等

可以看到/sys下的目录结构是经过精心设计的:在/sys/devices下是所有设备的真实对象,包括如视频卡和以太网卡等真实的设备,也包括ACPI等不那么显而易见的真实设备、还有ttybonding等纯粹虚拟的设备;在其它目录如classbus等中则在分类的目录中含有大量对/sys/devices中真实对象引用的符号链接文件

  1. /sys/class
    • /sys/class/net:网卡(包含物理网卡+虚拟网卡的符号链接文件)
    • /sys/class/dmi/id:主板相关信息
      • /sys/class/dmi/id/product_uuid:主板uuid
  2. /sys/devices
    • /sys/devices/virtual/net:虚拟网卡
    • /sys/devices/system/cpu/cpu0/cache/Cache相关的信息,getconf -a | grep -i cache也可以查看相关信息

2.1 参考

3 /proc目录

可以通过man proc查看说明文档

  1. /proc/buddyinfo:内存碎片信息

    • 示例如下,对于DMA,有90个大小为2^(0*PAGE_SIZE)的内存块;6个大小为2^(1*PAGE_SIZE)的内存块;2个大小为2^(2*PAGE_SIZE)的内存块
    1
    2
    3
    Node 0, zone      DMA     90      6      2      1      1      ...
    Node 0, zone Normal 1650 310 5 0 0 ...
    Node 0, zone HighMem 2 0 0 1 1 ...
    • 整理内存碎片相关的配置有:/proc/sys/vm/compact_memory/proc/sys/vm/drop_caches
  2. /proc/cmdline:系统启动时输入给内核的命令行参数

  3. /proc/version:内核版本

  4. /proc/cpuinfo:cpu硬件信息

    • physical id:一个物理CPU一个id
    • cpu cores:一个物理CPU对应几个物理核
    • siblings:一个物理CPU对应几个逻辑核
  5. /proc/meminfo:内存信息

    • MemTotal:物理内存的大小
    • MemFree:未使用的内存
    • MemAvailable:系统可使用内存的估算值。注意MemTotal - MemFree并不代表可用内存,因为有部分内存会被用于cache/buffer/slab,这部分内存在资源紧张的情况下是可以回收的
    • Buffers:用于buffer的内存
    • Cached:用于cache的内存
    • Slab:slab内存
      • SReclaimable:slab中可回收的部分,与MemAvailable相关
      • SUnreclaim:slab中不可回收的部分
    • Hugepage{xxx}:与Hugepage相关的配置
  6. /proc/zoneinfo

    • Linux 2.6开始支持NUMA, Non-Uniform Memory Access内存管理模式。在多个CPU的系统中,内存按CPU划分为不同的Node,每个CPU挂一个Node,其访问本地Node比访问其他CPU上的Node速度要快很多
    • numactl -H可以查看NUMA硬件信息
    • Node下面划分为一个或多个Zone,为啥要有Zone,两个原因:
      1. DMA设备能够访问的内存范围有限(ISA设备只能访问16MB
      2. x86-32bit系统地址空间有限(32位最多只能4GB),为了使用更大内存,需要使用HIGHMEM机制
    • cat /proc/zoneinfo | grep -E "zone|free |managed"
  7. /proc/slabinfo:slab内存的详细分配信息

  8. /proc/cgroups:当前内核支持的cgroup子系统

  9. /proc/filesystems:当前内核支持的文件系统列表

  10. /proc/kallsyms:内核符号表

  11. /proc/kmsg:内核消息,对应dmesg命令

  12. /proc/modules:已经加载的模块列表,对应lsmod命令

  13. /proc/mounts:已经挂载的文件系统,对应mount命令

  14. /proc/stat:全面统计状态表

  15. /proc/softirqs:软中断统计信息

  16. /proc/interrupts:硬件中断统计信息,第一列是中断号

    • 硬件中断可能存在CPU亲和性,比如某个网卡的中断全部由某个CPU处理
  17. /proc/irq/<irq>:某个特定硬件中断的信息

    • /proc/irq/<irq>/smp_affinity:CPU亲和性掩码
    • /proc/irq/<irq>/smp_affinity_list:CPU亲和性列表
  18. /proc/loadavg:cpu负载,分别表示1分钟、5分钟、15分钟的平均cpu负载

    • cpu load的含义:正在执行或者等待执行的进程数量。在内核代码中(3.10.x),计算cpu load的方法是spu_calc_load
    • cpu_load = α * cpu_load + (1 - α) * active_task_sizecpu_load与原值以及当前活跃进程数量两者均相关,在1分钟、5分钟、15分钟三种情况下α的取值不同
  19. /proc/self:我们可以通过/proc/${pid}目录来获取指定进程的信息。当pid可能发生变化时,我们还可以通过/proc/self来访问当前进程的信息,不同的进程访问该目录下的文件得到的结果是不同的

  20. /proc/sys/net:网络相关配置

  21. /proc/sys/kernel:内核相关的配置

    • /proc/sys/kernel/core_patterncore dump的存储格式,通常其内容是core
    • /proc/sys/kernel/yama/ptrace_scope
      • 0 - classic ptrace permissions:任何进程可以PTRACE_ATTACH到任意其他相同uid的进程
      • 1 - restricted ptrace
      • 2 - admin-only attach
      • 3 - no attach
  22. /proc/sys/fs:文件系统相关配置

    • /proc/sys/fs/file-nr:系统文件描述符的使用情况
      • 第一列:已分配文件句柄的数目(包括socket)
      • 第二列:已分配未使用文件句柄的数目
      • 第三列:文件句柄的最大数目(也可以通过cat /proc/sys/fs/file-max查看)
    • /proc/sys/fs/file-max:文件句柄的最大数目
  23. /proc/net:网络相关的统计信息

    • /proc/net/route:路由表
    • /proc/net/arp:mac地址表
    • /proc/net/sockstat:socket汇总信息
    • /proc/net/tcp:tcp连接信息
      • 1 -> TCP_ESTABLISHED
      • 2 -> TCP_SYN_SENT
      • 3 -> TCP_SYN_RECV
      • 4 -> TCP_FIN_WAIT1
      • 5 -> TCP_FIN_WAIT2
      • 6 -> TCP_TIME_WAIT
      • 7 -> TCP_CLOSE
      • 8 -> TCP_CLOSE_WAIT
      • 9 -> TCP_LAST_ACL
      • 10 -> TCP_LISTEN
      • 11 -> TCP_CLOSING
  24. /proc/<pid>:进程相关的信息

    • /proc/<pid>/status:查看进程相关的一些概要信息

      • VmPeak:峰值虚拟内存
      • VmSize:目前占用的虚拟内存
      • VmHWM:峰值物理内存
      • VmRSS:目前占用的物理内存
      • Threads:线程数量
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      #include <fstream>
      #include <iostream>
      #include <vector>

      void print_rss() {
      std::ifstream ifs("/proc/self/status");
      std::string line;
      std::cout << "Part of /proc/self/status: " << std::endl;
      while (std::getline(ifs, line)) {
      if (line.find("Vm") != std::string::npos) {
      std::cout << line << std::endl;
      }
      }
      std::cout << std::endl;
      }

      int main() {
      std::vector<int> v;
      print_rss();
      v.reserve(1000000000);
      print_rss();
      v.resize(1000000000);
      print_rss();
      }
    • /proc/<pid>/maps:展示了一个进程的内存消耗

    • /proc/<pid>/smaps:展示了一个进程的内存消耗,内容比/proc/<pid>/maps更为详细

    • /proc/<pid>/fd/:进程打开的所有文件,包括socket

      • socket类型,例如/proc/6497/fd/1018 -> socket:[42446535]
        • 如何判断socket建立时间,看/proc/6497/fd/1018的创建时间即可
        • 中括号中数字的含义?表示inode号,可以通过ss -nap -e | grep 42446535查看对应的socket的详细信息
    • /proc/<pid>/limits:各种资源的限制

3.1 参考

4 /var目录

  1. /var/crash:内核crash日志
  2. /var/log:日志
    • /var/log/audit:审计日志

4.1 参考

5 其他

  1. /dev/disk/by-path:以磁盘路径为名称的软链接文件
  2. /dev/disk/by-partuuid:以分区uuid为名称的软链接文件
  3. /dev/disk/by-uuid:以uuid为名称的软链接文件
  4. /dev/disk/by-partlabel:以分区标签为名称的软链接文件
  5. /dev/disk/by-id:以id为名称的软链接文件
  6. /usr/share/zoneinfo:时区配置文件
    • /etc/localtime:时区配置文件的软连接,实际生效的时区配置