(1)什么是文件
在Linux系统上,文件被看作是字节序列。这种概念使得所有的系统资源有了统一的标识,这些资源包括普通文件或目录、磁盘设备、控制台(键盘、显示器)、打印机等。对这些资源的访问和处理都是通过字节序列的方式实现的。Linux系统下的文件类型包括:
l 普通文件(-)
l 目录(d)
l 符号链接(l)
l 字符设备文件(c)
l 块设备文件(b)
l 套接字(s)
l 命名管道(p)
(2)普通文件
普通文件就是字节序列,Linux 并没有对其内容规定任何的结构。普通文件可以是程序源代码(C、 C 、Python、Perl 等)、可执行文件(文件编辑器、数据库系统、出版工具、绘图工具等)、图片、声音、图像等。Linux 不会区别对待这些文件,只有处理这些文件的应用程序才会根据文件的内容为它们赋予相应的含义。
在DOS或Winodws环境中,所有的文件名后缀就能表示该文件的类型,如* .exe表示可执行文件,*.bat 表示批处理文件。在Linux 环境下,只要是可执行的文件并具有可执行属性则就能执行,不管其文件名后缀是什么。但是对一些数据文件一般也遵循一些文件名后缀规则,下表中列出了一些常用的文件后缀。
举 例 | 说明 |
*.txt | 文本文件 |
*.conf | 配置文件 |
*htm/*xm/*yml/*sql | HTMLXMLYAMLSQL文件 |
*.cl*.cpp | C/C 语言源程序文件 |
*.so/*.ko/*.lib | 模块文件、库文件 |
*sh/*.php/*.py/*.pV*.rb | Shell/PHP/Python/Per/Ruby脚本文件 |
*.rpm | RPM包文件 |
*.tar | tar存档文件 |
*.gz/*.bz2/*xz | 由gzip/bzip2/xz生成的压缩文件 |
*.tar.gz/*.tgz/*.tar.bz2 /*.tbz/*.tar.xz/*.bcz | 压缩后的tar包文件 |
*.lock | 用于表示某个程序或某种服务正在运行的锁文件 |
*~ | 备份文件 |
(3)目录和硬链接
目录文件是由一组目录项组成,目录项可以是对其他文件的指向也可以是其下的子目录指向。
实际上,一个文件的名称是存储在其父目录中的,而并非同文件内容本身存储在一起。
将两个文件名(存储在其父目录的目录项中)指向硬盘上一个存储空间,对两个文件中的任何一个的内容进行修改都会影响到另一个文件, 这种链接关系称为硬链接。硬链接文件实际上就是在某目录中创建目录项,从而使不止一个目录可以引用到同一个文件。它可以由ln命令建立。首先查看一下目录中的文件情况。
使用ln命令建立文件textfile1的硬链接文件textfile4。
该命令产生一个新的文件textfile4,和已经存在的文件textfile1建立起硬链接关系:
可以看出,textfile4和textfilel的大小相同,内容相同。再看详细信息的第2列,原来textfile1的链接数是1,说明这一块硬盘存储空间有textfile1 一个文件指向它,而建立起textfile1和textfile4的硬链接关系之后,这块硬盘空间就有textfilel 和textfile4两个文件同时指向它,所以textfile1和textfile4的链接数就都变为了2。因为两个文件指向一块硬盘空间,所以如果现在修改textfile4的内容为This is file2.,再查看textfile1的内容,就会有:
如果删除其中的一个文件(不管是哪一个), 就是删除了该文件和硬盘空间的指向关系,该硬盘空间不会释放,另外一个文件的内容也不会发生改变,但是目录详细信息中的链接数会减少,见如下信息。
硬链接并不是一种特殊类型的文件,只是在同一个文件系统中允许多个目录项指向同一个文件的一种机制。
(4)符号链接
符号链接又称软链接,是指将一个文件指向另外一个文件的文件名。这种符号链接的关系由ln -s命令行建立。首先查看一下目录中的文件信息。
使用ln命令和-s选项建立文件textfilel的符号链接文件textfile5。
该命令产生一个新的文件textfile5,和已经存在的文件textfile1建立起符号链接关系。
可以看出textfile5这个文件很小,因为它只是记录了要指向的文件名而已,请注意从文件textfile5指向文件textfile1的指针。
为什么cat命令显示的textfile5的内容与textfile1相同呢?因为cat命令在寻找textfile5的内容时,发现textfile5是一个符号链接文件,根据textfile5记录的文件名找到了textfile1文件,然后将textfile1的内容显示出来。
明白了textfile1和textfile5的符号链接关系,就可以理解为什么textfile1的链接数仍然为1,这是因为textfile1指向的硬盘空间仍然只有textfile1一个文件在指向。
如果现在删除了textfile5,对textfile1并不产生任何影响;而如果删除了textfile1,那么textfile5就因无法找到文件名称为textfile1的文件而成为死链接。
(5)设备文件
设备是指计算机中的外围硬件装置,即除了CPU和内存以外的所有设备。通常,设备中含有数据寄存器或数据缓存器、设备控制器,用于完成设备同CPU或内存的数据交换。
在Linux下,为了屏蔽用户对设备访问的复杂性,采用了设备文件,即可以通过像访问普通文件一样的方式对设备进行读写访问。
设备文件用来访问硬件设备,包括硬盘、光驱、打印机等。每个硬件设备至少与一个设备文件相关联。设备文件分为字符设备(如键盘)和块设备(如磁盘)。Linux 下设备名以文件系统中的设备文件的形式存在。所有的设备文件存放在/dev目录下。
下面对常用设备列表说明,如下表所示。
设备文件 | 说 明 |
/dev/sd* | SCSI/SAS、PATA/SATA、USB硬盘设备,如sdal表示第1块硬盘的第1个分区;sdb2表示第2块硬盘的第2个分区 |
/dev/sr0 | 光驱设备 |
/dev/console | 系统控制台 |
/dev/tty* | 本地终端设备 |
/dev/pts/* | 伪终端设备 |
/dev/ppp* | ppp设备。PPP(Point-to-Point)协议设备,用于传统的拨号上网 |
/dev/lp* | 表示并口设备,如IpO表示第1个并口设备;lpl表示第2个并口设备 |
/dev/null | 空设备。可将其视为“黑洞",所有写入它的内容都会丢失,通常用于屏蔽命令行输出 |
/dev/zero | 零设备。可以产生连续不断的进制的零流,通常用于创建指定长度的空文件 |
在/dev目录下有许多链接文件,使用这些链接能够方便地使用系统中的设备。例如,可以通过/dev/cdrom而不是/dev/sr0来访问光驱。
(6)套接字和命名管道
套接字和命名管道是Linux环境下实现进程间通信(IPC)的机制。
命名管道(FIFO)文件允许运行在同一台计算机上的两个进程之间进行通信。套接字(socket)允许运行在不同计算机上的进程之间相互通信。
套接字和命名管道通常是在进程运行时创建或删除的,一般无需系统管理员干预。
(7)熟悉Linux的目录结构
Linux的目录结构遵从文件系统层次结构标准(File system Hierarchy Standard, FHS)。下表中解释了由FHS所规定的存放特定类型的文件位置。
目录名 | 内容说明 |
bin | 存放二进制的可执行程序 |
boot | 存放用于系统引导时使用的各种文件 |
dev | 用于存放设备文件,用户可以通过这些文件访问外部设备 |
etc | 存放系统的配置文件 |
home | 存放所有用户文件的根目录,有一个用户在该目录下就有一个与该用户名相对应的子目录,当用户登录时就进入其用户名对应的子目录 |
lib/lib64 | 存放根文件系统中的程序运行所需要的共享库及内核模块 |
lost found | 存放一些系统检查结果,发现不合法的文件或数据都存放在这里,通常此目录是空的,除非硬盘遭受了不明的损坏 |
mnt | 临时文件系统的挂载点目录 |
media | 即插即用型存储设备的挂我点自动在这个目录下创建,如CD/DVD等 |
opt | 第三方软件的存放目录 |
proc | 是一个虚拟文件系统,存放当前内存的映射,主要用于在不重启机器的情况下管理内核 |
root | 超级用户目录 |
sbin | 类似bin目录,也存放二进制可执行文件,但是只有root才能访问 |
srv | 系统对外提供服务的目录,如Web虚拟主机等 |
tmp | 用于放置各种临时文件 |
usr | 用于存放系统应用程序 |
var | 用于存放需要随时改变的文件,如系统日志、脱机工作目录等 |