### 1、根目录
linux根目录下的子目录有:/root、/bin、/boot、/dev、/etc、/home、/var、/lib、/lib64、/usr、/media、/lost+found、/mnt、/opt、/proc、/sbin、/srv、/sys、/tmp、/run、/data
“一切皆是文件”是 Unix/Linux 的基本哲学之一。不仅普通的文件,目录、设备、 套接字、进程、线程等在 Unix/Linux 中都是以文件被对待;它们虽然类型不同,但是对其提供的却是同一套操作界面。一切皆文件的好处就是提供统一的读写接口,也就是VFS(Virtual File System)虚拟文化系统。从而不需要每次新添加文件系统的时候,实现另外一套接口。(进程和线程怎么被当作文件的??)
### 2、root和home目录
Linux的所有用户都有一个家目录,/是系统根目录,~是当前用户的家目录。
/root是超级用户root的家目录,而其他用户的家目录都在/home下。
家目录下的非隐藏文件都是自己创建的,但是会有一些自带的隐藏文件,如:
(超级用户root的目录下也有这些自己专属的隐藏文件)
1、.bash_profile
用户登录后,启动bash,并且读取该用户家目录下的.bash_profile文件,一般会在.bash_profile文件中显示调用.bashrc,登录linux启动bash时首先会去读取\~/.bash_profile文件,这样\~/.bashrc就会得到执行了。也可以在该文件中设置环境变量,bash会去读取。
```
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/.local/bin:$HOME/bin
export PATH
# 用户自定义一些环境变量,以及添加查询路径到PATH中
export JAVA_HOME=/home/yveshe/jdk1.8
export CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib
export PATH=$JAVA_HOME/bin:$PATH
```
2、.bashrc
该文件用途,定义命令别名、函数、变量。
文件的默认内容如下,调用/etc/bashrc文件,每次修改.bashrc后,使用source ~/.bashrc(或者 . ~/.bashrc)就可以立刻加载修改后的设置,使之生效。该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该文件被读取。
```
# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=
# User specific aliases and functions
```
下面为在该文件下定义变量和别名
```
# User specific aliases and functions
PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin"
LANG=zh_CN.GBK
export PATH LANG
alias rm='rm -i'
alias ls='/bin/ls -F --color=tty --show-control-chars'
```
3、.bash_history
保存用户使用过的命令,方便查找,需要借助history命令。命令数量受/etc/profile文件中的HISTFILESIZE和HISTSIZE限制。
常见的相关变量:
\$HISTFILE 设置历史命令的存储文件,bash启动的时候会读取~/.bash_history文件并载入到内存中,bash退出时也会把内存中的历史回写到.bash_history文件。通过该变量可以将命令存储文件设置为其他文件。
\$HISTSIZE 设置bash会话期间历史包含的命令数量
\$HISTFILESIZE 设置历史文件中实际能存储的命令数量
4、.bash_logout
用户登出时执行的命令。
如果在".bash_logout" 文件中添加下面这行"rm -f $HOME/.bash_history" ,当用户每次注销时,“.bash_history”文件都会被删除.
如果需要每个用户登出时都清除输入的命令历史记录,可以将命令添加在/etc/skel/.bash_logout文件中。
在 Bash Shell 启动时,它会按照以下顺序读取这些文件:
(1)、/etc/profile:这是系统级别的 Bash Shell 配置文件,它会在登录时被读取。它定义了系统的环境变量和系统范围的 Bash Shell 配置。
(2)、/etc/bashrc:这也是系统级别的 Bash Shell 配置文件,它会在每个 Bash Shell 进程启动时被读取。它定义了系统范围的 Bash Shell 配置,比如命令别名和函数。
(3)、~/.bash_profile:这是用户级别的 Bash Shell 配置文件,它会在登录时被读取。它定义了用户的环境变量和用户范围的 Bash Shell 配置。
(4)、~/.bashrc:这也是用户级别的 Bash Shell 配置文件,它会在每个 Bash Shell 进程启动时被读取。它定义了用户范围的 Bash Shell 配置,比如命令别名和函数。
一般来说,如果是需要在登陆时就设置的环境变量或命令别名,应该将其添加到 ~/.bash_profile 文件中。这样在每次登陆时都会执行 ~/.bash_profile 文件,保证环境变量和别名的设置都得到了正确的执行。
如果是需要在 shell 每次启动时就设置的环境变量或命令别名,应该将其添加到 ~/.bashrc 文件中。这样在 shell 启动时就会执行 ~/.bashrc 文件,保证环境变量和别名的设置得到了正确的执行。
### 3、usr
Unix Software Resource,即Unix操作系统软件资源的缩写。
/usr是系统核心所在,包含了所有的共享文件。它是 unix 系统中最重要的目录之一,涵盖了二进制文件,各种文档,各种头文件,还有各种库文件;还有诸多程序,例如 ftp,telnet 等等。
1、/usr/bin/
绝大部分的用户可使用命令都放在这里。
2、/usr/sbin
非系统正常运行所需要的系统命令。最常见的就是某些网络服务器软件的服务命令(daemon)
3、/usr/lib和/usr/lib64
lib是32位的库目录,lib64是64位的库目录
包含各应用软件的函数库、目标文件(object file),以及不被一般用户常用的执行文件或脚本(script)
4、/usr/local
系统管理员在本机自行安装自己下载的软件(非distribution默认提供者),建议安装到此目录,这样会比较便于管理,举例来说你的distribution提供的软件较旧,你想安装较新的软件但是又不想删除旧版,此时你可以将新版本软件安装于/usr/loca目录下,可与原先的就版本软件有区别,你可以自行到/local/usr去看看,该目录下也是具有bin、etc ,include,lib
5、/usr/share/
放置共享文件的地方,这个目录下放置的数据几乎是不分硬件架构均可读取的数据,因为几乎都是文本文件,再次目录下常见的还有这些子目录:
/usr/share/man:在线帮助文件
/usr/share/doc:软件杂项的文件说明
/usr/share/zoneinfo:与时区有关的时区文件
6、/usr/src/
一般源码建议放置到这里,src有source,的意思。至于内核源码则建议放置到/usr/src/linux目录下
7、/usr/include
C编程语言的头文件.为了一致性这实际上应该在/usr/lib 下,但传统上支持这个名字.
### 4、/lib、/lib64、/bin、/sbin
这四个目录分别是/usr/lib、/usr/lib64、/usr/bin、/usr/sbin的软连接
### 5、etc
linux系统中的/etc目录下,包含了配置文件,服务、开机运行的脚本等信息。
linux操作系统运行时,会读取/etc目录的各种配置文件,该目录下的文件很多,常见的有:
1、/etc/profile
配置所有用户的全局环境变量,对所有用户都有效。
(当一个用户登录到Bash shell时先去执行/etc/profile中的命令,然后再执行用户的个人配置文件\~/.bash_profile)
2、/etc/bashrc
系统级别的 Bash Shell 配置文件,适用于所有用户和所有 Bash Shell 进程。
当 Bash Shell 启动时,它会首先读取 /etc/bashrc 文件,然后再读取当前用户的 ~/.bashrc 文件。因此,如果你想修改 Bash Shell 的全局配置,应该修改 /etc/bashrc 文件,如果你只想修改当前用户的 Bash Shell 配置,应该修改 ~/.bashrc 文件。
3、/etc/passwd
为系统上所有合法用户存储帐户信息 (包括数据库),其中的域给出了用户名、真实姓名、家目录、加密的口令和用户的其他信息.
4、/etc/init.d
目录文件,该目录下存放一些脚本,一般是Linux以rpm包安装时设定的一些服务的起动脚本。系统在安装时装了很多rpm包,这里面就有很多对应的脚本。执行这些脚本可以用来启动,停止,重启这些服务。
5、/etc/fstab
文件功能:设置文件挂载信息的文件
文件格式如下:
设备名称 挂载点 分区的类型 挂载选型 dump选项 fsck选型
数据项说明:
设备名称:可以是实际的设备名称/dev/sda1,也可以是实际设备的标签 例如LABLE=/1。
挂载点:磁盘默认的入口地址,比如/、/usr、swap。就是将物理磁盘和逻辑目录结构建立也映射。
文件系统类型:Linux常见的文件系统类型由ext2,ext3,jfs,swap等。
挂载选型:
auto->自动挂载
default->
noauto->开机不自动挂载
nouser->只有超级用户可以挂载
ro->按只读挂载权限挂载
rw->按可读可写的挂载权限挂载
user->任何用户都可以挂载
dump选项:设置是否让备份程序dump备份文件系统,0为忽略,1为备份。
fsck选项:告诉fsck程序以什么顺序检查文件系统,为0表示不检查,/分区永远都是1
### 6、boot
linux系统在本地启动时,/boot目录非常重要,其中的文件和目录有:
(1)、系统Kernel的配置文件,config
(2)、启动管理程序GRUB的目录,里面存放的都是GRUB在启动时所需要的画面、配置及各阶段的文件
该目录下最重要的文件是grub.conf文件,是GRUB启动的配置文件,告诉GRUB到哪里去找kernel,initrd(物理地址位置)
(3)、initrd文件(initial ram disk),是系统启动时的模块供应的主要来源。名字也可能为initramfs
(4)、System.map文件时系统Kernel中的变量对应表
(5)、vmlinuz是在启动过程中最重要的一个文件,因为这个文件就是实际系统所使用的kernel
### 7、var
如果/usr是安装时会占用较大硬盘容量的目录,那么/var就是在系统运行后才会渐渐占用硬盘容量的目录。因为/var目录主要针对常态性变动文件,包括缓存(cache)、登录文件(logfile)以及某些软件运行所产生的文件,包括程序文件(lock file,run file),或者例如Mysql数据库的文件等
/var/log/:用户登录信息、系统日志,
/var/cache/:应用程序本身运行过程中产生的一些暂存文件。
/var/lib/:程序执行过程中需要使用的数据文件放置的目录。例如Mysql的数据库放置到/var/lib/mysql目录下
/var/lock/:某些设备或者是文件资源一次只能被一个应用程序所使用,使用时需要上锁。/run/lock的符号连接
/var/run/:正在登录的用户、正在运行的进程等,该目录是/run目录的符号连接
### 8、dev
dev是设备(device)的 英文缩写,在这个目录中包含所有Linux系统中使用的外部设备,这里并不放置外部设备的驱动程序。它实际上是一个访问外部设备的端口,我们可以像访问文件一样访问这些设备。常见的设备命名如下:
/dev/hd: IDE磁盘,几乎已经被淘汰,参考鸟叔私房菜
/dev/sd:SCSI、SATA、USB磁盘驱动器,U盘。具体命名是根据Linux内核检测到磁盘的顺序来命名的。正常的物理机器大概使用的都是/dev/sd【a-p】这种命名,在虚拟机环境中,为了加速,可能就会使用/dev/vd【a-p】这种设备文件名。如果是/dev/sda1则表示是第一个磁盘的第一个分区
/dev/fd:/dev/fd/0是指标准输入(STDIN),/dev/fd/1是指标准输出(STDOUT)/dev/fd/2是指错误输出(STDERR)
/dev/tty:terminals终端
/dev/stdin、/dev/stdout:标准输入输出,就是键盘和屏幕,对应的文件描述符,(fd0,fd1,fd2)=(stdin,stdout,stderr)
/dev/pts:是远程登陆(telnet,ssh等)后创建的控制台设备文件所在的目录。
/dev/cdrom: 这是系统中插入CD-ROM的临时位置。但是,临时媒体的标准位置在/media 目录中
/dev/loop:loop设备是一种伪设备,它使我们能像块设备一样访问一个文件。在使用之前,一个 loop 设备必须要和一个文件进行连接,这种结合方式给用户提供了一个替代块
特殊文件的接口。因此,如果这个文件包含有一个完整的文件系统,那么这个文件就可以像一个磁盘设备一样被 mount 起来。
/dev/random:特殊设备,可以用作随机数发生器或伪随机数发生器。具体参考:shell实现随机数的多种方法。
/dev/null:黑洞设备,它丢弃一切写入其中的数据。
/dev/zero:无限零资源,当你读它的时候,它会提供无限的空字符(NULL, ASCII NUL, 0x00)。其中的一个典型用法是用它提供的字符流来覆盖信息,另一个常见用法是产生一个特定大小的空白文件。不要轻易使用cat读取该文件,/zero有个特点是如果你读取的话,是一个死循环会输出无穷的x00,
/dev/full:特殊设备文件,总是在向其写入时返回设备无剩余空间,读取时则与/zero相似,返回无限空字符,该设备通常用来测试程序在遇到磁盘无剩余空间错误时的行为。
/dev/console:控制台,是一个虚拟的tty,它映射到真正的tty上,console是个只输出的设备,功能很简单,只能在内核中访问;
/dev/mem:内核所有物理地址空间的全映像
这里讲一下字符设备和块设备的区别:
字符设备:提供连续的数据流,可以顺序读取,通常不支持随机存取。此类设备支持按字节/字符来读写数据。键盘、终端等都是常见字符设备。
块设备:应用程序可以随机访问设备数据,程序可自行确定读取数据的位置。硬盘、软盘(磁盘)都是常见的块设备。
### 9、tmp
该目录存储临时文件,系统在重启时会自动清理该目录下的文件(不同Linux系统清理时间有差别,CentOS 是重启后清理十天前文件,Ubuntu 是每次重启后清理),所以不要将重要文件放到这个目录下。
### 10、mnt和media
/mnt:这个目录是让用户临时挂载别的文件系统。挂载的对象通常是存储设备、光盘、硬盘、镜像文件等。(关于挂载意义可以参考鸟叔私房菜)
/media:用来挂载光盘、u盘等文件系统的目录,一般系统自动挂载的光盘、u盘文件系统在该目录下。当您将CD 插入linux系统时,将会在/media目录中自动创建一个目录,就可以在此目录中访问CD 的内容
挂载点是目录,挂载源是存储设备等。
为什么要挂载呢?
很多设备的数据组织和linux的文件系统并不一样,无法直接读取。挂载就是将设备(设备一般都在/dev目录下)放在一个目录下,让系统知道如果管理这个设备文件,了解这个存储设备的可读写特性的过程。mount就是按照一定的格式去解析设备里的文件,转化为linux自己的文件系统,这样才能解析并读取数据。以/dev/sdb1为例,能否直接对其进行操作?/dev/sdb1是设备,是一个类似指针的东西,指向这个分区的原始数据块。mount前,系统并不知道这个数据块哪部分数据代表文件,如何对它们操作。
### 11、/lost+found
该目录用于存放系统异常时文件的碎片,以便于进行恢复。如果文件系统崩溃,则将在下次启动时执行文件系统检查。
### 12、/proc
虚拟文件系统,将内核与进程状态归档为文本文件。用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态。
/proc/n/:n是进程号,该目录下是当前进程本身相关信息的文件。下面简单的介绍下该目录下一些文件:
cmdline:记录启动当前进程的完整命令,但是僵尸进程目录的此文件中不包含任何信息
environ:当前进程的环境变量列表,彼此之间用空字符NULL隔开,变量用大写字母表示,其值用小写字母表示
exe:指向启动当前进程的可执行文件(完整路径)的符号链接,通过/proc/N/exe 可以启动当前进程的一个拷贝, 这个文件是二进制文件。
fd/:这是一个目录,包含当前进程打开的每一个文件的文件描述符(file descriptor),这些文件描述符是指向实际文件的一个符号链接
limits:当前进程所使用的每一个受限资源的软限制、硬限制和管理单元;此文件仅可由实际启动当前进程的UID用户读取;(2.6.24以后的内核版本支持此功能);
maps:当前进程关联到的每个可执行文件和库文件在内存中的映射区域及其访问权限所组成的列表
task/:目录文件,包含由当前进程所运行的每一个线程的相关信息,每个线程的相关信息文件均保存在一个由线程号(tid)命名的目录中,这类似于其内容类似于每个进程目录中的内容; 通过tree命令查看该目录文件
/proc/cmdline:在启动时传递至内核的相关参数信息,这些信息通常由lilo或grub等启动管理工具进行传递;
/proc/cpuinfo:存储处理器的相关信息的文件
/proc/crypto:系统上已安装的内核使用的密码算法及每个算法的详细信息列表;
/proc/devices:系统已经加载的所有块设备和字符设备的信息,包含主设备号和设备组(与主设备号对应的设备类型)名;
/proc/diskstats:每块磁盘设备的磁盘I/O统计信息列表;(内核2.5.69以后的版本支持此功能)
### 13、/srv
该目录主要用来存储本机或本服务器提供的服务或数据(用户主动生产的数据、对外提供服务),一般情况下该目录是空的。
所以,服务器被用作Web开发时,html文件更应该被放在/srv/www下,而不是/var/www下(因为/srv目录是新标准中才有的,出现较晚;而且Apache将/var/www设为了web默认目录,所以现在绝大多数人都把web文件放在/var/www,这是个历史遗留问题)。
### 14、/sys
/sys 目录跟 proc 一样虚拟文件系统。记录核心系统硬件信息。