一、程序编译方式
1> 动态编译
2> 静态编译
二、文件系统层次化标准
FHS : Filesystem Hierarchy Standard
/bin : 所有用户可使用的基本命令程序文件 /sbin: 管理员使用的工具程序 /boot: 引导加载器必须用到的各静态文件,如kernel , initramfs(initrd) , grub等 /dev : 存储特殊文件或设备文件 设备的2种类型:字符设备(线性设备)、块设备(随机设备) 字符设备:键盘、显示器 块设备:硬盘 /etc : 系统程序的配置文件,是静态文件 /home: 普通用户主目录的集中位置 一般每个普通用户的主目录默认为此目录下与用户名同名的子目录,/home/USERNAME /root : 管理员的主目录,可选目录 /lib : 为系统启动或根文件系统上的应用程序(/bin , /sbin等)提供共享库,以及为内核提供内核模块 libc.so.* : 动态链接的C库 ld* : 运行时链接器/加载器 modules : 用于存储内核模块的目录 /lib64 : 存放64位系统特有的共享库 /media : 便携式设备挂载点,cdrom , floppy等 /mnt : 其他文件系统的临时挂载点 /opt : 附加应用程序的安装位置,可选目录 /srv : 当前主机为服务提供的数据 /tmp : 为那些会产生临时文件的程序存放临时文件的目录,可供所有用户执行写入操作,有特殊权限 /usr : usr Hierarchy , 全局共享的只读数据路径 /usr/bin /usr/sbin /usr/lib /usr/lib64 /usr/include : C程序头文件 /usr/local /usr/share : 命令手册页和自带文档等架构特有的文件的存储位置 /usr/X11R6 : X-Window 程序的安装位置 /usr/src : 程序源码文件的存储位置 /usr/local : Local hierarchy , 系统管理员安装本地应用程序或第三方程序的目录 /var : /var Hierarchy /var/cache : Application cache data /var/lib : Varia/var/ble state information /var/local : Variable data for /usr/local /var/lock : Lock files /var/log : Log files and directories /var/opt : Variable data for /opt /var/run : Data relevant to running processes /var/spool : Application spool data /var/tmp : Temporary files preserved between system reboots /proc : Kernel and process information virtual filesystem , 基于内存的虚拟文件系统;存储内核及进程相关信息,此信息多为内核参数,存储在/proc/sys中 /sys : Kernel and system information virtual filesystem , /sysfs : /sysfs虚拟文件系统提供了一种比 proc 更为理想的访问内核数据的途径,其主要作用在于为管理Linux设备提供一种统一模型的接口;
参考IBM的这篇文章:https://www.ibm.com/developerworks/cn/linux/l-cn-sysfs/index.html ,概述/sys 的主要子目录及各个子目录包含的内容:
/sys/devices 这是内核对系统中所有设备的分层次表达模型,也是 /sys 文件系统管理设备的最重要的目录结构,下文会对它的内部结构作进一步分析;
/sys/dev 这个目录下维护一个按字符设备和块设备的主次号码(major:minor)链接到真实的设备(/sys/devices下)的符号链接文件,它是在内核 2.6.26 首次引入;
/sys/bus 这是内核设备按总线类型分层放置的目录结构,devices 中的所有设备都是连接于某种总线之下,在这里的每一种具体总线之下可以找到每一个具体设备的符号链接,它也是构成Linux 统一设备模型的一部分;
/sys/class 这是按照设备功能分类的设备模型,如系统所有输入设备都会出现在 /sys/class/input 之下,而不论它们是以何种总线连接到系统。它也是构成 Linux 统一设备模型的一部分;
/sys/block 这里是系统中当前所有的块设备所在,按照功能来说放置在 /sys/class 之下会更合适,但只是由于历史遗留因素而一直存在于 /sys/block, 但从 2.6.22开始就已标记为过时,只有在打开了 CONFIG_SYSFS_DEPRECATED 配置下编译才会有这个目录的存在,并且在 2.6.26 内核中已正式移到 /sys/class/block, 旧的接口 /sys/ block 为了向后兼容保留存在,但其中的内容已经变为指向它们在 /sys/devices/ 中真实设备的符号链接文件;
/sys/firmware 这里是系统加载固件机制的对用户空间的接口,关于固件有专用于固件加载的一套API,在附录 LDD3 一书中有关于内核支持固件加载机制的更详细的介绍;
/sys/fs 这里按照设计是用于描述系统中所有文件系统,包括文件系统本身和按文件系统分类存放的已挂载点,但目前只有 fuse,gfs2 等少数文件系统支持 sysfs接口,一些传统的虚拟文件系统(VFS)层次控制参数仍然在 sysctl (/proc/sys/fs) 接口中中;
/sys/kernel 这里是内核所有可调整参数的位置,目前只有 uevent_helper, kexec_loaded, mm, 和新式的 slab 分配器等几项较新的设计在使用它,其它内核可调整参数仍然位于 sysctl(/proc/sys/kernel) 接口中 ;
/sys/module 这里有系统中所有模块的信息,不论这些模块是以内联(inlined)方式编译到内核映像文件(vmlinuz)中还是编译为外部模块(ko文 件),都可能会出现在 /sys/module 中: 编译为外部模块(ko文件)在加载后会出现对应的 /sys/module/<module_name>/, 并且在这个目录下会出现一些属性文件和属性目录来表示此外部模块的一些信息,如版本号、 加载状态、所提供的驱动程序等; 编译为内联方式的模块则只在当它有非0属性的模块参数时会出现对应的 /sys/module/<module_name>, 这些模块的可用参数会出现在 /sys/modules/<modname>/parameters/<param_name> 中,如 /sys/module/printk/parameters/time 这个可读写参数控制着内联模块 printk 在打印内核消息时是否加上时间前缀; 所有内联模块的参数也可以由 "<module_name>.<param_name>=<value>" 的形式写在内核启动参数上,如启动内核时加上参数 "printk.time=1" 与 向 "/sys/module/printk/parameters/time" 写入1的效果相同; 没有非0属性参数的内联模块不会出现于此。
/sys/power 这里是系统中电源选项,这个目录下有几个属性文件可以用于控制整个机器的电源状态,如可以向其中写入控制命令让机器关机、重启等。
/sys/slab (对应 2.6.23 内核,在 2.6.24 以后移至 /sys/kernel/slab)从2.6.23 开始可以选择 SLAB 内存分配器的实现,并且新的 SLUB(Unqueued Slab Allocator)被设置为缺省值;如果编译了此选项,在 /sys 下就会出现 /sys/slab ,里面有每一个 kmem_cache 结构体的可调整参数。对应于旧的 SLAB 内存分配器下的/proc/slabinfo 动态调整接口,新式的 /sys/kernel/slab/<slab_name> 接口中的各项信息和可调整项显得更为清晰。
三、Linux文件系统结构
linux文件系统是一种层级结构;有索引;倒置的树状结构; 目录:路径映射 文件:存储空间存储的一段流式数据,对数据可以做到按名存取 / : 根目录 /dev/pts/2 : 最左侧/ :表示根目录; 其他的/ :表示路径分隔符; Linux的路径分隔符:/ Windows路径分隔符:\ 文件路径: 绝对路径:从根开始表示出的路径; 相对路径:从当前位置开始表示出的路径; 文件名使用规则: 严格区分字符大小写; 目录也是文件,在同一目录下,两个文件不能同名; 文件支持使用除 / 以外的任意字符; 文件名最长不能超过255字符; 用户有家目录,或者叫用户主目录: 用户的起始目录,普通用户管理文件的位置; 工作目录: /etc/sysconfig/network-scripts/ifcfg-enos89 basename : 最右侧的文件或目录名 dirname : basename左侧的路径 命令: ~]# basename /PATH/TO/SOMEFILE SOMEFILE ~]# dirname /PATH/TO/SOMEFILE /PATH/TO