Linux目录结构
由于利用Linux来开发产品或distributions的社群/公司很多,每个人都有自己的想法来配置档案放置的目录势必会造成管理上的混乱,因此便有了Filesystem Hierarchy Standard(FHS)标准。
什么是FHS标准?
FHS标准主要目的是希望让使用者可以了解到已安装软体通常放置于那个目录下,所以他们希望独立的软体开发商、作业系统制作者、以及想要维护系统的使用者,都能够遵循FHS的标准,FHS的重点在于规范每个特定的目录下应该要放置什么样子的资料而已。
linux的文件系统是采用级层式的树状目录结构,在此结构中的最上层是根目录“/”,然后在此目录下再创建其他的目录。FHS针对目录树仅定义出三层目录底下应该放置什么资料,分别是:
- / (root, 根目录):与开机系统有关;
- /usr (unix software resource):与软体安装/执行有关;
- /var (variable):与系统运作过程有关。
目录树结构如下:
根目录(/)
根目录是整个系统最重要的一个目录,因为不但所有目录都是从根目录衍生而来,同时根目录也与开机/还原/系统修复等动作有关。FHS标准建议:根目录(/)所在分割槽应该越小越好,且应用程式所安装的软体最好不要与根目录放在同一个分割槽内,保持根目录越小越好。如此不但效能较佳,根目录所在的档案系统也较不容易发生问题。
FHS要求必须要存在的目录 | 目录内容 |
---|---|
/bin | 系统放置执行档的目录,/bin放置的时在单人维护模式下还能被操作的指令。连接档链接到/usr/bin |
/sbin | 系统放置执行档的目录,用来设定系统环境的,这些指令只有root才能操作,包括开机、修复、系统还原的指令,本机自行安装的软件所产生的系统执行档则放置到/usr/local/sbin/中。连接档链接到/usr/sbin |
/boot | 主要放置的时开机会使用到的档案,包括Linux核心档案及开机选单与开机所需设定档等,Linux kernel常用档名为:vmlinuz,如果是有grub2开机管理程序还会存在/boot/grub2/目录 |
/dev | 装置档,linux中任何装置与周边设备都以档案的型态存在,必要重要的有/dev/null,/dev/zero,/dev/tty,/dev/loop*,dev/sd*等 |
/etc | 设定档,系统主要的设定档放置目录,包括账号密码档、服务起始档等,一般用户可以查阅,只有root才能修改,重要的有/etc/modprobe.d/,etc/passwd(用户资讯),/etc/group(群组),/etc/shadow(密码),/etc/fstab,/etc/issue。另外FHS规范了几个重要的目录最好存在:/etc/opt(必要):放置第三方软件/opt的相关设定档,/etc/X11(建议):与X Window有关的设定档,/etc/sgml(建议):与SGML格式有关的设定档, /etc/xml(建议):与XML格式有关的设定档 |
/lib | 系统函数库,/lib放置的则是在开机时会用到的函式库,以及在/bin或/sbin底下的指令会呼叫的函式库,FHS要求必须存在的目录:/lib/modules/:这个目录主要放置可抽换式的核心相关模组(驱动程式) |
/media | 放置的是可移除的装置,包括软碟、光碟、DVD等暂时挂载的装置,常见的档名有:/media/floppy,/midia/cdrom等 |
/mnt | 暂时挂载某些额外的装置,在早时候与/media用途相同 |
/opt | 第三方协力软件放置目录(非原本的distribution提供的软件) |
/run | 早期的FHS规定开机后所产生的各项资讯放置在/var/run目录下,新版的FHS则规定到/run,var/run是连接档,不占用硬盘空间在记忆体中 |
/srv | 可视为service缩写,是一些网络服务启动后所需要取用的资料目录,如www,FTP等 |
/tmp | 一般使用者或正在执行的程序暂时放置档案的目录,类似于windows下tmep |
/usr | 第二层FHS设定,用户的很多应用程序和文件都放在这个目录下,类似与windows下的program files目录 |
/var | 第二层FHS设定,主要放置变动性的资料 |
FHS建议可以存在的目录 | 目录内容 |
---|---|
/home | 系统预设的使用者家目录(home directory),类似于windows下”C:\Users”,~:代表当前使用者的家目录 |
/lib<qual> | 用来存放与/lib 不同的格式的二进位函式库,例如支援64位元的/lib64 函式库等 |
/root | 系统管理员(root)的家目录 |
CentOS 7.x已经将/sbin,/bin,/lib,/lib<qual>移动到了/usr下,根目录下提供这些目录的连接档1
以上是FHS针对根目录所定义的标准,下面是Linux下的目录
应放置的档案内容 | 目录内容 |
---|---|
/lost+found | 只有使用标准的ext2/ext3/ext4档案系统格式才会产生的一个目录,目的在于当档案系统发生错误时将一些遗失片段放置在这个目录下 |
/proc | 虚拟档案系统,放置的资料在记忆体中不占硬盘空间,包括系统核心、行程资讯、周边设备状态及网络状态等 |
/sys | 与/proc相似,也是一个虚拟档案系统,主要记录核心与系统硬件的相关资讯 |
/usr目录
usr是Unix Software Resource的缩写,也就是Unix作业系统软件资源所放置的目录。FHS建议所有软体开发者,应该将他们的资料合理的分别放置到这个目录下的次目录,而不要自行建立该软件自己独立的目录。
因为所有系统预设的软件(distribution发布者提供的软体)都会放置到/usr底下,因此这个目录有点类似Windows 系统的『C:\Windows\ (当中的一部份) + C:\Program files \』这两个目录的综合体,系统刚安装完毕时,这个目录会占用最多的硬碟容量。
FHS要求必须要存在的目录 | 目录内容 |
---|---|
/usr/bin | 所有一般用户能够使用的指令,CentOS 7使用连接档将/bin链接至此 |
/usr/lib | CentOS 7使用连接档将/lib链接至此 |
/usr/local | 系统管理员在本机自行安装自己下载的软件(非distribution预设提供),与/opt类似,自己选择 |
/usr/sbin | 非系统正常运作所需要的系统指令,CentOS 7使用连接档将/sbin链接至此 |
/usr/share | 主要放置唯读架构的资料档案,当然也包括共享文件 |
FHS建议可以存在的目录 | 目录内容 |
---|---|
/usr/games | 与游戏相关的资料放置处 |
/usr/include | c/c++等程式语言的档头(header)与包含档(include)放置处 |
/usr/libxec | 某些不被一般使用者惯用的执行档或脚本(script)等等,都会放置在此目录中 |
/usr/lib<qual> | 与/lib<qual>/功能相同,CentOS 7使用连接档将/lib<qual>链接至此 |
/usr/src | 一般原始码建议放置到这里,src有source的意思 |
/var目录
如果/usr是安装时会占用较大磁盘容量的目录,那么/var就是在系统运作后才会渐渐占用磁盘容量的目录。因为/var目录主要针对常态性变动的档案,包括快取(cache)、登录档(log file)以及某些软体运作所产生的档案, 包括程序档案(lock file, run file),或者例如MySQL资料库的档案等等。
FHS要求必须存在的目录 | 目录内容 |
---|---|
/var/cache | 应用程序运行产生的缓存档 |
/var/lib | 应用程序运行需要使用到的资料档案目录,一般各个软件都有自己的目录,如/var/lib/mysql |
/var/lock | 某个装置或档案资源一次只能被一个应用程序所使用,此时会对该装置或档案上锁,CentOS使用连接档链接到/run/lock |
/var/log | 登录档放置的目录,重要的有/var/log/messages,/var/log/wtmp(记录登入者的资讯)等 |
/var/mail | 放置个人电子邮件信箱的目录,与/var/spool/mail/目录互为连接档 |
/var/run | 程序或服务启动后产生的资讯存放目录,包括PID等,CentOS 7使用连接档链接到/run |
/var/spool | 这个目录通常放置一些伫列资料,所谓的『伫列』就是排队等待其他程式使用的资料啦! 这些资料被使用后通常都会被删除。举例来说,系统收到新信会放置到/var/spool/mail/中,但使用者收下该信件后该封信原则上就会被删除。信件如果暂时寄不出去会被放到/var/spool/mqueue/中,等到被送出后就被删除。如果是工作排程资料(crontab),就会被放置到/var/spool/cron/目录中! |
档案权限
档案拥有者与群组
由于Linux是一个多人多工的作业系统,Linux针对档案创建者、一个团队提出了档案拥有者和群组的概念,同时一个使用者可能参与多个群组,因此用户可以有多个群组,linux系统上用户相关的资讯都记录在/etc/passwd档案中,个人密码记录在/etc/shadow档案中,Linux所有的群组名称记录在etc/group档案中。
Linux中的“天神”,root用户不受权限的限制,可以做任何想做的事。
档案属性
使用指令ls -al列出当前目录下所有档案,显示如下:
上述七列分别表示档案类型权限、连接数、档案拥有者、档案所属群组、档案容量、档案最后修改时间、档名。
档案类型权限
第一个字元表示档案的类型:
- d:表示目录
- -:表示档案
- l:表示连接档
- b:表示装置档里面的可供存储的周边设备(可随机存取装置)
- c:表示装置档里面的序列埠设备,了让鼠标、键盘(一次性读取装置)
后面的9个字元表示档案的权限,三个为一组分别表示档案拥有者权限、档案群组权限、其他*限。rwx分别表示可读、可写、可执行,没有相应的权限用”-“表示。
除了上述的表示方式,权限还可以以数字来表示,依然以三个字元为一组,分数对照表如下:
- r:4
- w:2
- x:1
如:rwxr-x-w- 则可以表示为752
连接数
档案容量
默认使用bytes显示,如果想使用M或G等显示,如下:
ls -al --block-size=M
更多用法可以使用man ls查看
档案最后修改时间
显示日期(月/日)及时间,如果最后修改时间过久仅显示日期(月/日)及年份,如果想显示完整的时间格式,如下:
ls -al --full-time
档名
如果档名以 . 开始开始,则表示该档案为隐藏档,ls指令使用-a参数才会显示隐藏档。
更改档案属性与权限
更改档案拥有者、群组和权限的指令如下:
- chgrp(change group) :改变档案所属群组
- chown(change owner) :改变档案拥有者
- chmod(change modify) :改变档案的权限, SUID, SGID, SBIT等等的特性
以上指令只能拥有root权限执行,使用-R参数可进行递回(recursive)的持续变更,亦即连同次目录下的所有档案都会变更。
chgrp
更改档案所属群组需要注意的是:更改的群组必须存在与/etc/group档案中,否则会显示错误。
chown
更改档案拥有者所需要注意的是:更改的拥有者必须存在与/etc/passwd档案中,否则会显示错误。
chown也可以同时更改档案拥有者和群组。
chmod
使用数字类型改变档案权限
前面我们提到过档案权限可以使用数字来表示。
使用符号类型改变档案权限
前面提到过权限分为三组,分别是(1)user(2)group(3)others三种身份,因此可以使用u,g,o来代表上述三种身份,a则表示all亦即全部的身份。
可以使用+(添加)、-(除去)、=(设定)来更改权限,如下:
档案权限与目录权限
档案权限
权限对档案来说:
- r (read):可读取此一档案的实际内容,如读取文字档的文字内容等;
- w (write):可以编辑、新增或者是修改该档案的内容(但不含删除该档案);
- x (execute):该档案具有可以被系统执行的权限。
rwx权限都是针对档案的内容,并不具备删除档案本身的权限,在Windows下一个档案是否可执行是藉由副档名来判断的,如:.exe,.bat等,但在Linux下一个档案是否可执行取决于x权限。
目录权限
权限对目录来说:
- r (read contents in directory):表示具有读取目录结构清单的权限,拥有这个权限就可以使用ls指令查看该目录的内容列表
- w (modify contents of directory):
- 建立新的档案与目录
- 删除已经存在的档案与目录
- 将已存在的档案或目录进行更名
- 搬移该目录内的档案、目录位置
- x (access directory):目录的x代表的是使用者能否进入该目录成为工作目录,如/root一般用户不可以进入
档案与目录的预设权限与特殊权限
预设权限
从以上内容我们已经学会了如何去修改一个档案或目录的权限,但当我们新建一个目录或档案时,它的预设权限是什么呢?umask就是指定当前使用者在建立档案或目录时的权限预设值。
预设权限针对目录和档案时是不一样的,对于一般档案通常都是用于记录资料的,不需要x权限,因此档案和目录的预设值分别是:
- 档案:建立新档案预设没有x权限,最大预设分数为666,即-rw-rw-rw-
- 目录:建立新目录最大预设分数为777,即drwxrwxrwx
umask -S
以符号类型的方式来显示权限,umask
的分数指的是预设值需要减掉的权限,上述0002的分别表示特殊权限、u需要减去的权限分数(见后续)、g需要减去的权限分数、o需要减去的权限分数,因此建立档案和目录的权限如下:
更改umask的值使用umask 分数
即可。
特殊权限:SUID,SGID,SBIT
SUID(Set UID)
执行ls -l /bin/passwd
可以发现它的权限是-rwsr-xr-x
,s权限又是什么呢?当s这个标志出现在档案拥有者的x权限上时,此时就被称为Set UID,简称为SUID的特殊权限。SUID具有以下限制于功能:
- SUID 权限仅对二进位程式(binary program)有效
- 执行者对于该程式需要具有x 的可执行权限
- 本权限仅在执行该程式的过程中有效(run-time)
- 执行者将具有该程式拥有者(owner) 的权限
举例:使用ls -l /etc/shadow
指令可以发现shadow的权限是----------
,shadow是记录所有账号的密码的档案,档案的权限表示只用root可以写入,那么普通用户又是怎么更改自己的密码的呢?
普通用户可以执行/bin/passwd
指令,由于passwd具有SUID的特殊权限,普通用户执行该指令将短暂拥有该指令拥有者(root)的权限,因此普通用户也可以更改自己的密码。
SGID(Set GID)
当s 标志在档案拥有者的x 上为SUID,那s 在群组的x 上时则称为Set GID,即SGID,与SUID不同的是,SGID可以针对档案或目录来设定,对于档案:
- SGID 对二进位程式有用
- 程式执行者对于该程式来说,需具备x 的权限
- 执行者在执行的过程中将会获得该程式群组的支援
对于目录:
- 使用者若对于此目录具有r 与x 的权限时,该使用者能够进入此目录
- 使用者在此目录下的有效群组(effective group)将会变成该目录的群组
- 用途:若使用者在此目录下具有w 的权限(可以新建档案),则使用者所建立的新档案,该新档案的群组与此目录的群组相同
SBIT(Sticky Bit)
在others的x权限上标志t,即为SBIT,SBIT目前只针对目录有效,对于档案已经没有效果了,作用:
- 当使用者对于此目录具有w, x 权限,亦即具有写入的权限时
- 当使用者在该目录下建立档案或目录时,仅有自己与root 才有权力删除该档案
典型的实例便是/tmp
目录,任何人都可以在/tmp 内新增、修改档案,但仅有该档案/目录建立者与root 能够删除自己的目录或档案。
SUID,SGID,SBIT的设定
与rwx相同,同样可以使用chmod指令来更改该权限,且可以用分数表示:
- SUID:4
- SGID:2
- SBIT:1
至于为什么会出现S、T,是因为没有x权限时会显示大写,表示空的。