Linux下/bin、/sbin、/usr/bin、/usr/sbin、/usr/local/bin和/usr/local/sbin目录详解

实验环境:

CentOS 6.5

[root@localhost ~]# uname -a
Linux localhost.localdomain 2.6.32-431.el6.i686 #1 SMP Fri Nov 22 00:26:36 UTC 2013 i686 i686 i386 GNU/Linux
[root@localhost ~]# 

首先看下PATH变量在不同用户下的值:
root用户

[root@localhost ~]# whoami
root
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost ~]# 

普通用户

[test1280@localhost ~]$ whoami
test1280
[test1280@localhost ~]$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/test1280/bin

bin是binary的缩写,二进制。

上述六个目录的含义:

  • /bin:通常是普通用户和超级用户都会用到的必要的命令,例如ls,pwd等等。
[root@localhost ~]# which ls
alias ls='ls --color=auto'
    /bin/ls
[root@localhost ~]# which pwd
/bin/pwd
[root@localhost ~]# su - test1280
[test1280@localhost ~]$ which ls
alias ls='ls --color=auto'
    /bin/ls
[test1280@localhost ~]$ which pwd
/bin/pwd
[test1280@localhost ~]$
  • /sbin:通常是系统管理员使用的必要的来管理系统的命令,例如shutdown,ifconfig等等。
[root@localhost ~]# which shutdown 
/sbin/shutdown
[root@localhost ~]# which ifconfig
/sbin/ifconfig
[root@localhost ~]# su - test1280
[test1280@localhost ~]$ which shutdown 
/sbin/shutdown
[test1280@localhost ~]$ which ifconfig
/sbin/ifconfig
[test1280@localhost ~]$ 

注:sbin意义为system binary。

  • /usr/bin:通常是一些非必要的,但是普通用户和超级用户都可能使用到的命令,例如gcc,ldd等等。
[root@localhost ~]# which gcc
/usr/bin/gcc
[root@localhost ~]# which ldd
/usr/bin/ldd
[root@localhost ~]# su - test1280
[test1280@localhost ~]$ which gcc
/usr/bin/gcc
[test1280@localhost ~]$ which ldd
/usr/bin/ldd
[test1280@localhost ~]$ 

注:很多时候我们自己安装的软件,可能在此处建立一个软连接(符号链接),指向实际的可执行文件。

  • /usr/sbin:通常是一些非必要的,由系统管理员来使用的管理系统的命令,例如crond,httpd等等。
[root@localhost ~]# which crond
/usr/sbin/crond
[root@localhost ~]# which httpd
/usr/sbin/httpd
[root@localhost ~]# su - test1280
[test1280@localhost ~]$ which crond
/usr/sbin/crond
[test1280@localhost ~]$ which httpd
/usr/sbin/httpd
[test1280@localhost ~]$

注:这里面有很多类似httpd等这样的后台程序,主要是提供一些服务,有相当一部分是关于网络的(并不全是,例如crond),这个时候这个进程就是作为一个“服务器”,接受外部的请求。

  • /usr/local/bin:通常是用户后来安装的软件,可能被普通用户或超级用户使用。

  • /usr/local/sbin:通常是用户后来安装的软件,一般是用来管理系统的,被系统管理员使用。

补充

从用户权限角度来看,sbin下的命令都是用来管理系统的,所以一般是普通用户无法执行,只有系统管理员可以执行,而bin下的命令则是所有用户都可以执行的。

注:以上所说的并不是绝对的,例如ifconfig在/sbin下,但是普通用户一般具有可执行权限。

[test1280@localhost ~]$ ll /sbin/ifconfig 
-rwxr-xr-x. 1 root root 70024 May 10  2012 /sbin/ifconfig
[test1280@localhost ~]$ 

从可运行的时间角度看,/bin以及/sbin是和/在同一文件系统,在挂载其他文件系统之前就可以使用/bin以及/sbin下的命令。

/usr/bin,/usr/sbin,/usr/local/bin,/usr/local/sbin可能与根文件系统不在同一文件系统之中,可能是在其他文件系统中后挂载上去的。

使用Tarball(源代码)编译安装的软件通常都是在/usr/local/bin以及/usr/local/sbin中。

十分重要的二进制程序放置在/bin以及/sbin中;
不是十分重要的二进制程序放置在/usr/bin以及/usr/sbin中。
进行这样子的分隔是为了尽可能地缩小根分区。

在最开始不同用户下的PATH示例中我们看到,普通用户与超级用户有基本一样的PATH(包含的搜索目录列表差不多),但是他们在看到一个命令时搜索的路径顺序不相同。

在我实验的环境中,普通用户也是包含了*sbin这样的目录列表。

在有些版本中,普通用户的PATH不包含*sbin目录列表,所以当执行ifconfig时,通常会报command not found这样的错误,原因是ifconfig在/sbin中,但是PATH没有包含/sbin这个目录,导致报错。

这个时候如果我们用绝对路径来执行:

/sbin/ifconfig

如果ifconfig对一般用户具有可执行权限,那么就可以正常执行。

关键点在于,告诉你当前的shell,我去哪里找这个命令(可执行文件)。
当PATH包含的目录下没有时,我可以使用绝对路径来指定。

下面这四句话是引用自别的博客:

  • 如果是用户和管理员必备的二进制文件,就会放在/bin;
  • 如果是系统管理员必备,但是一般用户根本不会用到的二进制文件,就会放在/sbin;
  • 如果不是用户必备的二进制文件,多半会放在/usr/bin;
  • 如果不是系统管理员必备的工具,如网络管理命令,多半会放在/usr/sbin;

再补充一些其他目录说明

  • 主目录:/root、/home/username
  • 用户可执行文件:/bin、/usr/bin、/usr/local/bin
  • 系统可执行文件:/sbin、/usr/sbin、/usr/local/sbin
  • 其他挂载点:/media、/mnt
  • 配置:/etc
  • 临时文件:/tmp
  • 内核和Bootloader:/boot
  • 服务器数据:/var、/srv
  • 系统信息:/proc、/sys
  • 共享库:/lib、/usr/lib、/usr/local/lib

参考资料:

1.http://blog.sina.com.cn/s/blog_8184e03301012z2x.html
2.http://blog.csdn.net/kkdelta/article/details/7708250
3.http://blog.csdn.net/xh16319/article/details/12861523

你可能感兴趣的:(linux,运维,服务器)