> CentOS > CentOS入门 >

CentOS系统结构 文件属性 权限解析

一、Linux 硬盘分区和系统结构:
 
 

 
 
根目录
1. /bin
是binary的缩写,包含了引导启动所需的命令,和普通用户可能用的命令(可能在引导启动后)。这些命令都是二进制文件的可执行程序,多是系统中重要的系统文件。
 
2. /sbin 
类似 /bin ,也用于存储二进制文件。因为其中的大部分文件多是系统管理员使用的基本的系统程序,所以虽然普通用户必要且允许时可以使用,但一般不给普通用户使用。
 
3. /etc
存放系统管理配置文件,其中包括了用户信息文件 /etc/passwd ,系统初始化文件 /etc/rc 等。linux正是依靠这些文件才得以正常地运行。

/etc/rc 或 /etc/rc.d 或 /etc/rc?.d:启动、或改变运行级时运行的脚本或脚本的目录。

/etc/passwd:用户数据库,其中的域给出了用户名、真实姓名、用户起始目录、加密口令和用户的其他信息。

/etc/fdprm:软盘参数表,用以说明不同的软盘格式。可用setfdprm进行设置。更多的信息见setfdprm的帮助页。

/etc/fstab:指定启动时需要自动安装的文件系统列表。也包括用swapon-a启用的swap区的信息。

/etc/group:类似/etc/passwd,但说明的不是用户信息而是组的信息。包括组的各种数据。

/etc/inittab:init的配置文件。

/etc/issue:包括用户在登录提示符前的输出信息。通常包括系统的一段短说明或欢迎信息。具体内容由系统管理员确定。

/etc/magic:“file”的配置文件。包含不同文件格式的说明,“file”基于它猜测文件类型。

/etc/motd:motd是messageoftheday的缩写,用户成功登录后自动输出。内容由系统管理员确定。常用于通告信息,如计划关机时间的警告等。

/etc/mtab:当前安装的文件系统列表。由脚本(scritp)初始化,并由mount命令自动更新。当需要一个当前安装的文件系统的列表时使用(例如df命令)。

/etc/shadow:在安装了影子(shadow)口令软件的系统上的影子口令文件。影子口令文件将/etc/passwd文件中的加密口令移动到/etc/shadow中,而后者只对超级用户(root)可读。这使破译口令更困难,以此增加系统的安全性。

/etc/login.defs:login命令的配置文件。

/etc/printcap:类似/etc/termcap,但针对打印机。语法不同。

/etc/profile、/etc/csh.login、/etc/csh.cshrc :登录或启动时bourne或cshells执行的文件。这允许系统管理员为所有用户建立全局缺省环境。

/etc/securetty:确认安全终端,即哪个终端允许超级用户(root)登录。一般只列出虚拟控制台,这样就不可能(至少很困难)通过调制解调器(modem)或网络闯入系统并得到超级用户特权。

/etc/shells:列出可以使用的shell。chsh命令允许用户在本文件指定范围内改变登录的shell。提供一台机器ftp服务的服务进程ftpd检查用户shell是否列在/etc/shells文件中,如果不是,将不允许该用户登录。

/etc/termcap:终端性能数据库。说明不同的终端用什么“转义序列”控制。写程序时不直接输出转义序列(这样只能工作于特定品牌的终端),而是从/etc/termcap中查找要做的工作的正确序列。这样,多数的程序可以在多数终端上运行。

4. /root
超级用户的目录。

5. /lib
根文件系统上的程序所需的共享库,存放了根文件系统程序运行所需的共享文件。这些文件包含了可被许多程序共享的代码,以避免每个程序都包含有相同的子程序的副本,故可以使得可执行文件变得更小,节省空间。又叫标准程序设计库,又叫动态链接共享库,作用类似 windows 里的 .dll 文件。

6. /lib/modules
包含系统核心可加载各种模块,尤其是那些在恢复损坏的系统时重新引导系统所需的模块(例如网络和文件系统驱动)。

7. /dev
存放了设备文件,即设备驱动程序,用户通过这些文件访问外部设备。比如,用户可以通过访问 /dev/mouse 来访问鼠标的输入,就像访问其他文件一样。

/dev/console:系统控制台,也就是直接和系统连接的监视器。

/dev/hd:ide硬盘驱动程序接口。如:/dev/hda指的是第一个硬盘,had1则是指/dev/hda的第一个分区。如系统中有其他的硬盘,则依次为/dev/hdb、/dev/hdc、......;如有多个分区则依次为hda1、hda2......

/dev/sd:scsi磁盘驱动程序接口。如有系统有scsi硬盘,就不会访问/dev/hda,而会访问/dev/sda。

/dev/fd:软驱设备驱动程序。如:/dev/fd0指系统的第一个软盘,也就是通常所说的a:盘,/dev/fd1指第二个软盘,......而/dev/fd1h1440则表示访问驱动器1中的4.5高密盘。

/dev/st:scsi磁带驱动器驱动程序。

/dev/pty:提供远程登陆伪终端支持。在进行telnet登录时就要用到/dev/pty设备。

/dev/ttys:计算机串行接口,对于dos来说就是“com1”口。

/dev/cua:计算机串行接口,与调制解调器一起使用的设备。

/dev/null:“黑洞”,所有写入该设备的信息都将消失。例如:当想要将屏幕上的输出信息隐藏起来时,只要将输出信息输入到/dev/null中即可。

/dev/ttynn        直接连接的终端

/dev/ttyxnn       多路的终端(x典型的是a、b等)

/dev/ptsnnn       X Windows系统和网络伪设备

/dev/fd0          软盘设备的通用名字

/dev/ftape        连接到磁带设备

/dev/cdrom        通常连接到CD-ROM设备

/dev/lp0          打印机并行口

/dev/tty:提供虚拟控制台支持。如:/dev/tty1指的是系统的第一个虚拟控制台,/dev/tty2则是系统的第二个虚拟控制台。tty0是tty1或者ttyn的一个别名或者链接,为什么这么说呢?当我们使用tty0的时候,我们得到他的子设备号是0,于是在宏TTY_TABLE中,我们会得到tty_table[fg_console]这个终端设备。fg_console是当前的终端设备在tty_table数组中的下标。通过这个宏,找到了tty0对应的ttyn,然后读键盘,写显示器这些操作都是对ttyn进行的。

8. /tmp
公用的临时文件存储点,存放程序在运行时产生的信息和数据。但在引导启动后,运行的程序最好使用 /var/tmp 来代替 /tmp ,因为前者可能拥有一个更大的磁盘空间。

9. /boot
这里存放的是启动Linux使用的一些核心文件,引导加载器(bootstrap loader)如 lilo 会使用这些文件,当计算机启动时这些文件首先被加载。这个目录也会包含Linux核,但是Linux核也可以放在别处,只要配置LILO并且LILO知道Linux核在哪儿。
存放引导加载器(bootstraploader)使用的文件,如 lilo ,核心映像也经常放在这里,而不是放在根目录中。但是如果有许多核心映像,这个目录就可能变得很大,这时使用单独的文件系会更好一些。还有一点要注意的是,要确保核心映像必须在 ide 硬盘的前 1024 柱面内。

10. /mnt
这个目录是空的,系统提供这个目录时让用户临时挂载别的文件系统。系统管理员临时安装 (mount)文件系统的安装点。程序并不自动支持安装到 /mnt。/mnt下面可以分为许多子目录,例如 /mnt/dosa 可能是使用 msdos 文件系统的软驱,而 /mnt/exta 可能是使用 ext2 文件系统的软驱, /mnt/cdrom 可能是光驱等等。

11. /proc
这个目录是一个虚拟的目录,是系统内存的映射。可直接访问这个目录来获取系统信息。也就是说,这个目录的内容不在硬盘里而是在内存里。

/proc/x:关于进程x的信息目录,这里x是这一进程的标识号。每个进程在/proc下有一个名为自己进程号的目录。

/proc/cpuinfo:存放处理器(cpu)的信息,如cpu的类型、制造商、型号和性能等。

/proc/devices:当前运行的核心配置的设备驱动的列表。

/proc/dma:显示当前使用的dma通道。

/proc/filesystems:核心配置的文件系统信息。

/proc/interrupts:显示被占用的中断信息和占用者的信息,以及被占用的数量。

/proc/ioports:当前使用的i/o端口。

/proc/kcore:系统物理内存映像。与物理内存大小完全一样,然而实际上没有占用这么多内存;它仅仅是在程序访问它时才被创建。(注意:除非你把它拷贝到什么地方,否则/proc下没有任何东西占用任何磁盘空间。)

/proc/kmsg:核心输出的消息。也会被送到syslog。

/proc/ksyms:核心符号表。

/proc/loadavg:系统“平均负载”;3个没有意义的指示器指出系统当前的工作量。

/proc/meminfo:各种存储器使用信息,包括物理内存和交换分区(swap)。

/proc/modules:存放当前加载了哪些核心模块信息。

/proc/net:网络协议状态信息。

/proc/self:存放到查看/proc的程序的进程目录的符号连接。当两个进程查看/proc时,这将会是不同的连接。这主要便于程序得到它自己的进程目录。

/proc/stat:系统的不同状态,例如,系统启动后页面发生错误的次数。

/proc/uptime:系统启动的时间长度。

/proc/version:核心版本。

12. /usr
最庞大的目录,要用到的应用程序和文件几乎都在这个目录。

/user/x11r6:存放x window的目录。包含xwindow系统的所有可执行程序、配置文件和支持文件。为简化x的开发和安装,x的文件没有集成到系统中。xwindow系统是一个功能强大的图形环境,提供了大量的图形工具程序。用户如果对microsoftwindows或machintosh比较熟悉的话,就不会对xwindow系统感到束手无策了。

/usr/x386:类似/usr/x11r6,但是是专门给x11release5的。

/user/bin:众多的应用程序。集中了几乎所有用户命令,是系统的软件库。另有些命令在/bin或/usr/local/bin中。

/user/sbin:超级用户的一些管理程序。包括了根文件系统不必要的系统管理命令,例如多数服务程序。

/user/doc:linux文档

/user/include:linux下开发和编译应用程序所需要的头文件。包含了c语言的头文件,这些文件多以.h结尾,用来描述c语言程序中用到的数据结构、子过程和常量。为了保持一致性,这实际上应该放在/usr/lib下,但习惯上一直沿用了这个名字。

/usr/lib 常用的动态链接库和软件包的配置文件。包含了程序或子系统的不变的数据文件,包括一些site-wide配置文件。名字lib来源于库(library);编程的原始库也存在/usr/lib里。当编译程序时,程序便会和其中的库进行连接。也有许多程序把配置文件存入其中。

/usr/man 帮助文档

/usr/src:linux的开放源代码,比如linux内核的源代码就放在/usr/src/linux里

/usr/local :本地安装的软件和其他文件放在这里。这与/usr很相似。用户可能会在这发现一些比较大的软件包,如tex、emacs等。

/usr/local/bin 本地增加的命令

/usr/local/lib 本地增加的库

13. /var
某些大文件的溢出区,比方说各种服务的日志文件。

/var/catman:包括了格式化过的帮助(man)页。帮助页的源文件一般存在/usr/man/man中;有些man页可能有预格式化的版本,存在/usr/man/cat中。而其他的man页在第一次看时都需要格式化,格式化完的版本存在/var/man中,这样其他人再看相同的页时就无须等待格式化了。(/var/catman经常被清除,就像清除临时目录一样。)

/var/lib:存放系统正常运行时要改变的文件。

/var/local:存放/usr/local中安装的程序的可变数据(即系统管理员安装的程序)。注意,如果必要,即使本地安装的程序也会使用其他/var目录,例如/var/lock。

/var/lock:锁定文件。许多程序遵循在/var/lock中产生一个锁定文件的约定,以用来支持他们正在使用某个特定的设备或文件。其他程序注意到这个锁定文件时,就不会再使用这个设备或文件。

/var/log:各种程序的日志(log)文件,尤其是login(/var/log/wtmplog纪录所有到系统的登录和注销)和syslog(/var/log/messages纪录存储所有核心和系统程序信息)。/var/log里的文件经常不确定地增长,应该定期清除。

/var/run:保存在下一次系统引导前有效的关于系统的信息文件。例如,/var/run/utmp包含当前登录的用户的信息。

/var/spool:放置“假脱机(spool)”程序的目录,如mail、news、打印队列和其他队列工作的目录。每个不同的spool在/var/spool下有自己的子目录,例如,用户的邮箱就存放在/var/spool/mail中。

/var/tmp:比/tmp允许更大的或需要存在较长时间的临时文件。注意系统管理员可能不允许/var/tmp有很旧的文件。
14. /home
其他文件系统的安装点。

15. /Lost+found
这个目录平时是空的,当系统不正常关机时,这里就成了一些无家可归的文件的避难所


二、Linux 系统下会以不同颜色来标明不同类型的文件属性,一般来说主要有以下几种: 
 
蓝色:    代表目录
浅蓝色:代表链接文件
绿色:    代表可执行文件
红色:    代表压缩文件
灰色:    代表其他文件
黄色:    代表设备文件(包括block、char、fifo)
红色闪烁:代表链接文件有问题

 
 
 
第一栏:类型与权限(permission):
当在linux下用命令 ll  或者 ls -la 的时候会看到这些字眼,这些字眼表示为不同用户组的权限:
 
 

 
这里总共会有10个“-”,第一个表示文件类型:
d     文件夹,例如上表档名为 .gconf  那一行;
-      文件,例如上表档名为 install.log 那一行;
l      连结档(link file);
b     装置文件,里面的可供储存的接口设备(可随机存取装置);
c     装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)

后面9个按照三个一组分,就是前面三个表示所有者权限,中间三个表示同组用户权限,最后一组表示其他用户权限(其他用户,不包括root这个super user)。

r:      read      就是读权限          --十进制数字4表示    二进制数是100
w:    write     就是写权限          --十进制数字2表示    二进制数是010

x:     excute   就是执行权限     --十进制数字1表示    二进制数是001

读、写、运行三项权限可以用数字表示,就是r=4,w=2,x=1。所以,-rw-r--r-- 用数字表示成 644。
如:-rwxrwx---   ,即770权限 ,表示此文件(文件夹)的 拥有着和同组用户 有读写及执行权限,其他用户组没任何权限
 

•特殊权限SUID, SGID, SBIT



Set UID:
        当 s 这个标志出现在文件拥有者的 x 权限上时,如上 /usr/bin/passwd 这个文件的权限状态,此时就被称为 Set UID,简称为 SUID 的特殊权限。基本上SUID有这样的限制与功能:

•SUID 权限仅对二进位程序(binary program)有效(不能够用在 shell script 上面)
•运行者对於该程序需要具有 x 的可运行权限
•本权限仅在运行该程序的过程中有效 (run-time)
•运行者将具有该程序拥有者 (owner) 的权限

 

以passwd文件为例:

        vbird 对於 /usr/bin/passwd 这个程序来说是具有 x 权限的,表示 vbird 能运行 passwd;
passwd 的拥有者是 root 这个帐号;vbird 运行 passwd 的过程中,会『暂时』获得 root 的权限;
/etc/shadow 就可以被 vbird 所运行的 passwd 所修改。
        但如果 vbird 使用 cat 去读取 /etc/shadow 时,他能够读取吗?因为 cat 不具有 SUID 的权限,所以 vbird 运行 『cat /etc/shadow』 时,是不能读取 /etc/shadow 的。我们用一张示意图来说明如下:
                    图4.4.1、SUID程序运行的过程示意图
 

 
 
SGID:
与 SUID 不同的是,SGID 可以针对文件或目录来配置!

如果是对文件来说, SGID 有如下的功能:
•SGID 对二进位程序有用,程序运行者对於该程序来说,需具备 x 的权限
•运行者在运行的过程中将会获得该程序群组的权限
如果针对的是目录,SGID 有如下的功能: 
•使用者若对於此目录具有 r 与 x 的权限时,该使用者能够进入此目录;
•使用者在此目录下的有效群组(effective group)将会变成该目录的群组;
 
Sticky Bit:
这个 Sticky Bit, SBIT 目前只针对目录有效作用是:
•当使用者对於此目录具有 w, x 权限,亦即具有写入的权限时;
•当使用者在该目录下创建文件或目录时,仅有自己与 root 才有权力删除该文件
换句话说:当甲这个使用者於 A 目录是具有群组或其他人的身份,并且拥有该目录 w 的权限, 这表示『甲使用者对该目录内任何人创建的目录或文件均可进行 "删除/更名/搬移" 等动作。』 不过,如果将 A 目录加上了 SBIT 的权限项目时, 则甲只能够针对自己创建的文件或目录进行删除/更名/移动等动作,而无法删除他人的文件。



user, group 以及 others 都没有 x 这个可运行的标志( 因为 666 ),所以,这个 S, T 代表的就是『空的』

第二栏:多少档名连结到此节点(i-node)

记录有多少不同的档名连结到相同的一个i-node(每个文件都会将他的权限与属性记录到文件系统的i-node中,不过,我们使用的目录树却是使用文件名来记录, 因此每个档名就会连结到一个i-node)

第三栏:文件(或目录)的拥有者

第四栏:文件的所属群组

在Linux系统下一个账号会附属于一个或多个的群组中(假设某个文件所属的群组为projecta,且该文件的权限如图所示(-rwxrwx---), 则class1, class2, class3三人对于该文件都具有可读、可写、可执行的权限(看群组权限). 但如果是不属于projecta的其他账号,对于此文件就不具有任何权限了)

第五栏:文件的容量大小(默认单位为bytes)

第六栏:文件的建档日期或者是最近的修改日期

这一栏的内容分别为日期(月/日)及时间.如果这个文件被修改的时间距离现在太久了,那么时间部分会仅显示年份而已.如下所示:

第七栏:文件的全路径及其文件名

这个字段就是档名了. 比较特殊的是:如果档名之前多一个『 . 』,则代表这个文件为『隐藏档』,在上表中的.gconf那一行,该文件就是隐藏档. 你可以使用『ls』及『ls -a』显示隐藏文档

隐藏属性

除了基本r, w, x权限外,在Linux的Ext2/Ext3文件系统下,我们还可以配置其他的系统隐藏属性. 不过要先强调的是,底下的chattr命令只能在Ext2/Ext3的文件系统上面生效, 其他的文件系统可能就无法支持这个命令了.底下我们就来谈一谈如何配置与检查这些隐藏的属性吧!

chattr (配置文件隐藏属性)

 

这个命令是很重要的,尤其是在系统的数据安全上面!由於这些属性是隐藏的性质,所以需要以 lsattr 才能看到该属性呦!其中,个人认为最重要的当属 +i 与 +a 这个属性了.+i 可以让一个文件无法被更动,对於需要强烈的系统安全的人来说, 真是相当的重要的!里头还有相当多的属性是需要 root 才能配置的呢!

此外,如果是 log file 这种的登录档,就更需要 +a 这个可以添加,但是不能修改旧有的数据与删除的参数了!怎样?很棒吧! 未来提到登录档 (十九章) 的认知时,我们再来聊一聊如何配置他吧!

lsattr (显示文件隐藏属性)

 

 使用 chattr 配置后,可以利用 lsattr 来查阅隐藏的属性.不过, 这两个命令在使用上必须要特别小心,否则会造成很大的困扰.例如:某天你心情好,突然将 /etc/shadow 这个重要的密码记录文件给他配置成为具有 i 的属性,那么过了若干天之后, 你突然要新增使用者,却一直无法新增!别怀疑,赶快去将 i 的属性拿掉吧!


修改文件属性 [chgrp][chown][chmod][umask]

chgrp :改变文件所属群组
 

 

chown :改变文件拥有者


 


当你复制文件给你之外的其他人时,由于复制行为(cp)会复制执行者的属性与权限,那么别人会无法使用你复制给他的文件所以你要更改这个文件的拥有者与群组

 

chmod :改变文件或目录的访问权限, SUID, SGID, SBIT等等的特性。该命令有两种用法:


数字设定法语法格式为:chmod [mode] 文件名

关键是mode的取值,一开始许多初学者会被搞糊涂,其实很简单,我们将 rwx 看成二进制数,如果有则有1表示,没有则有0表示。那么 rwx r-x r- -则可以表示成为: 111 101 100 ,再将其每三位转换成为一个十进制数,就是754。


例如,我们想让 a.txt 这个文件的权限为:

             自己        同组用户       其他用户 
             读写        读写                读
 

那么,我们先根据上表得到权限串为:rw-rw-r--,那么转换成二进制数就是110 110 100,再每三位转换成为一个十进制数,就得到 6(自己) 6(同组用户) 4(其他用户)。

因此我们执行命令: chmod 664 a.txt

 

各权限的分数对照表如下:

SUID:4
SGID:2
SBIT:1
r:4
w:2
x:1

每种身份特殊权限(SUID/SGID/SBIT)和(owner/group/others)各自的三个权限(r/w/x)分数是需要累加的

例如当权限为: [- rwx rwx ---] 分数则是:
owner = rwx = 4+2+1 = 7
group = rwx = 4+2+1 = 7
others= --- = 0+0+0 = 0

例如当权限为: [- rwr-r-x] 分数则是:

特殊权限 = SUID&&SGID = 4+2 = 6
owner = rws = 4+2+1 = 7
group = r-s = 4+1 = 5
others= r-x = 1 = 5

所以等一下我们设定权限的变更时,该文件的权限数字就是770啦!变更权限的指令chmod的语法是这样的:

 

符号类型改变文件权限 :语法格式为:chmod [who] [opt] [mode] 文件/目录名

who 表示对象,是以下字母中的一个或组合: 
u: 表示文件所有者 
g: 表示同组用户 
o: 表示其它用户 
a: 表示所有用户


opt 则是代表操作,可以为: 
+: 添加某个权限 
-: 取消某个权限 

=: 赋予给定的权限,并取消原有的权限 

mode 则代表权限:



 
 

还有一个改变权限的方法呦。从之前的介绍中我们可以发现,基本上就九个权限分别是(1)user (2)group (3)others三种身份啦。那么我们就可以藉由u, g, o来代表三种身份的权限。此外, a 则代表 all 亦即全部的身份。那么读写的权限就可以写成r, w, x。SUID 为 u+s ,而 SGID 为 g+s ,SBIT 则是 o+t 。也就是可以使用底下的方式来看:
chmod u
g
o
a
+ (加入)
- (除去)
= (设定)
r
w
x
文件或目录

来实作一下吧!假如我们要『设定』一个文件的权限成为『-rwxr-xr-x』时,基本上就是:

user (u):具有可读、可写、可执行的权限;
group 与 others (g/o):具有可读与执行的权限。

所以就是:

 

例如:为 同组用户 增加对 文件a.txt 的 读写权限:

chmod g+rw a.txt


文件默认权限:umask

umask 就是指定 『目前使用者在创建文件或目录时候的权限默认值』

 

umask 的分数指的是『该默认值需要减掉的权限!』因为 r、w、x 分别是 4、2、1 分

在默认权限的属性上,目录与文件是不一样的。 x 权限对於目录是非常重要的! 但是一般文件的创建则不应该有运行的权限,默认的情况如下:

若使用者创建为『文件』则默认『没有可运行( x )权限』,亦即只有 rw 这两个项目,也就是最大为 666 分
若使用者创建为『目录』,则由於 x 与是否可以进入此目录有关,因此默认为所有权限均开放,亦即为 777 分

例题:
假设你的 umask 为 003 ,请问该 umask 情况下,创建的文件与目录权限为?
答:
umask 为 003 ,所以拿掉的权限为 --------wx,因此:
文件: (-rw-rw-rw-) - (--------wx) = -rw-rw-r--
目录: (drwxrwxrwx) - (--------wx) = drwxrwxr--


三、目录与文件之权限意义

[权限对文件的意义][权限对目录的意义]

权限对文件的意义:

  • r (read):可读取此一文件的实际内容,如读取文本文件的文字内容等;
  • w (write):可以编辑、新增或者是修改该文件的内容(但不含删除该文件);
  • x (execute):该文件具有可以被系统执行的权限.
    在Windows底下一个文件是否具有执行的能力是藉由『 扩展名 』来判断的, 例如:.exe, .bat, .com 等等
    在Linux底下,我们的文件是否能被执行,则是藉由是否具有『x』这个权限来决定的!跟档名是没有绝对的关系的

 

权限对目录的意义:

  • r (read contents in directory):
      表示具有读取目录结构列表的权限,所以当你具有读取(r)一个目录的权限时,表示你可以查询该目录下的文件名数据. 所以你就可以利用 ls 这个指令将该目录的内容列表显示出来!
  • w (modify contents of directory):
    1. 建立新的文件与目录;
    2. 删除已经存在的文件与目录(不论该文件的权限为何!)
    3. 将已存在的文件或目录进行更名;
    4. 搬移该目录内的文件、目录位置.
  • x (access directory): 
      用户具备进入该目录成为工作目录的权限

由此可以看出,如果一个人要想进入目录必须对目录具有 x 这个权限,但是只具备 x 这个进入目录的权限是没有什么意义的,因为你无法读取目录下的文件.所以你想要让以个人进入该目录并可以读取目录下的文件结构必须具备 x 与 r 这两个权限


四、Linux文件种类与扩展名

[文件类型][Linux文件扩展名][Linux文件长度限制]

我们在基础篇一直强调一个概念,那就是:任何装置在Linux底下都是文件

文件类型:

  • 正规文件(regular file):就是一般我们在进行存取的类型的文件,在由 ls -al 所显示出来的属性方面,第一个字符为 [ - ],例如 [-rwxrwxrwx ].另外,依照文件的内容,又大略可以分为:
    1. 纯文本档(ASCII):内容为我们人类可以直接读到的数据,例如数字、字母等等
    2. 二进制文件(binary):Linux当中的可执行文件(scripts, 文字型批处理文件不算)就是这种格式.
    3. 数据格式文件(data): 有些程序在运作的过程当中会读取某些特定格式的文件,那些特定格式的文件可以被称为数据文件 (data file).举例来说,我们的Linux在使用者登入时,都会将登录的数据记录在 /var/log/wtmp那个文件内,该文件是一个data file,他能够透过last这个指令读出来! 但是使用cat时,会读出乱码,因为他是属于一种特殊格式的文件.
  • 目录(directory)
  • 连结档(link)
    1. Hard Link (实体链接, 硬式连结或实际连结):

      首先,每个文件都会占用一个 inode ,文件内容由 inode 的记录来指向;想要读取该文件,必须要经过目录记录的文件名来指向到正确的 inode 号码才能读取.

      也就是说,其实文件名只与目录有关,但是文件内容则与 inode 有关.简单的说:hard link 只是在某个目录下新增一笔档名链接到某 inode 号码的关连记录而已. 实现多个文档名对应到同一个 inode 号码

      举个例子来说,假设我系统有个 /root/crontab 他是 /etc/crontab 的实体链接,也就是说这两个档名连结到同一个 inode , 自然这两个文件名的所有相关信息都会一模一样(除了文件名之外).实际的情况可以如下所示:

       

       

      可以发现两个档名都连结到 1912701 这个 inode 号码,因为这两个『档名』其实是一模一样的『文件』!而且你也会发现第二个字段由原本的 1 变成 2 了! 那个字段称为『连结』,这个字段的意义为:『有多少个档名链接到这个 inode 号码』的意思. 如果将读取到正确数据的方式画成示意图,就类似如下画面:

      说明:

      1. 可以透过 1 或 2 的目录之 inode 指定的 block 找到两个不同的档名,而不管使用哪个档名均可以指到 real 那个 inode 去读取到最终数据!
      2. 如果你将任何一个『档名』删除,其实 inode 与 block 都还是存在的! 此时你可以透过另一个『档名』来读取到正确的文件数据喔!
      3. 不论你使用哪个『档名』来编辑, 最终的结果都会写入到相同的 inode 与 block 中,因此均能进行数据的修改哩!

      要求:

      1. 不能跨 Filesystem
      2. 不能 link 目录.
    2. Symbolic Link (符号链接,亦即是快捷方式)

      相对于 hard link , Symbolic link 可就好理解多了,基本上, Symbolic link 就是在创建一个独立的文件,而这个文件会让数据的读取指向他 link 的那个文件的档名!由于只是利用文件来做为指向的动作, 所以,当来源档被删除之后,symbolic link 的文件会『开不了』, 会一直说『无法开启某文件!』.实际上就是找不到原始『档名』而已!

      举例来说,我们先创建一个符号链接文件链接到 /etc/crontab 去看看:

       

      由上表的结果我们可以知道两个文件指向不同的 inode 号码,当然就是两个独立的文件存在! 而且连结档的重要内容就是他会写上目标文件的『文件名』, 你可以发现为什么上表中连结档的大小为 12 bytes 呢? 因为箭头(-->)右边的档名『/etc/crontab』总共有 12 个英文,每个英文占用 1 个 byes ,所以文件大小就是 12bytes了!

      关于上述的说明,我们以如下图示来解释:

      由 1 号 inode 读取到连结档的内容仅有档名,根据档名链接到正确的目录去取得目标文件的 inode , 最终就能够读取到正确的数据了.你可以发现的是,如果目标文件(/etc/crontab)被删除了,那么整个环节就会无法继续进行下去, 所以就会发生无法透过连结档读取的问题了!

      这里还是得特别留意,这个 Symbolic Link 与 Windows 的快捷方式可以给他划上等号,由 Symbolic link 所创建的文件为一个独立的新的文件,所以会占用掉 inode 与 block 喔!

  • 设备与装置文件(device):与系统周边及储存等相关的一些文件, 通常都集中在/dev这个目录之下!通常又分为两种:
    1. 区块(block)设备档 :就是一些储存数据, 以提供系统随机存取的接口设备,举例来说,硬盘与软盘等就是啦! 你可以随机的在硬盘的不同区块读写,这种装置就是成组设备啰!你可以自行查一下/dev/sda看看, 会发现第一个属性为[ b ]喔!
    2. 字符(character)设备文件:亦即是一些串行端口的接口设备, 例如键盘、鼠标等等!这些设备的特色就是『一次性读取』的,不能够截断输出. 举例来说,你不可能让鼠标『跳到』另一个画面,而是『滑动』到另一个地方啊!第一个属性为 [ c ].
  • 数据接口文件(sockets):既然被称为数据接口文件, 想当然尔,这种类型的文件通常被用在网络上的数据承接了.我们可以启动一个程序来监听客户端的要求, 而客户端就可以透过这个socket来进行数据的沟通了.第一个属性为 [ s ], 最常在/var/run这个目录中看到这种文件类型了.
  • 数据输送文件(FIFO, pipe):FIFO也是一种特殊的文件类型,他主要的目的在解决多个程序同时存取一个文件所造成的错误问题. FIFO是first-in-first-out的缩写.第一个属性为[p] .

Linux文件扩展名

基本上,Linux系统上的文件名真的只是让你了解该文件可能的用途而已, 真正的执行与否仍然需要权限的规范才行!但是能不能执行成功,当然就得要看该文件的内容

虽然如此,不过我们仍然希望可以藉由扩展名来了解该文件是什么东西,所以, 通常我们还是会以适当的扩展名来表示该文件是什么种类的.底下有数种常用的扩展名:

  • *.sh : 脚本或批处理文件 (scripts),因为批处理文件为使用shell写成的,所以扩展名就编成 .sh ;
  • *Z, *.tar, *.tar.gz, *.zip, *.tgz: 经过打包的压缩文件.这是因为压缩软件分别为 gunzip, tar 等等的,由于不同的压缩软件,而取其相关的扩展名啰!
  • *.html, *.php:网页相关文件,分别代表 HTML 语法与 PHP 语法的网页文件啰! .html 的文件可使用网页浏览器来直接开启,至于 .php 的文件, 则可以透过 client 端的浏览器来 server 端浏览,以得到运算后的网页结果呢!

Linux文件长度限制

在Linux底下,使用预设的Ext2/Ext3文件系统时,针对文件的档名长度限制为

  • 单一文件或目录的最大容许文件名为 255 个字符;
  • 包含完整路径名称及目录 (/) 之完整档名为 4096 个字符.

Linux文件名的限制

由于Linux在文字接口下的一些指令操作关系,一般来说,你在设定Linux底下的文件名时, 最好可以避免一些特殊字符比较好!例如底下这些:

* ? > < ; & ! [ ] | \ ' " ` ( ) { }

因为这些符号在文字接口下,是有特殊意义的!另外,文件名的开头为小数点『.』时, 代表这个文件为『隐藏档』喔!同时,由于指令下达当中,常常会使用到 -option 之类的选项, 所以你最好也避免将文件档名的开头以 - 或 + 来命名啊!

(责任编辑:IT)