linux相关(1)
查找命令
find 在硬盘上查找,速度慢,但结果全。
locate 在linux系统维护的数据库中查找,数据库有更新周期,所以最近新建的文件没有被数据库搜录到的话就查找不到。一般推荐先用locate
which 查找可执行文件,通过PATH系统变量指定的位置查找
whereis 查找程序名,除了二进制文件,还查找说明文件,源代码
linux 文件
文件存储在硬盘上,最小的存储单位为扇区,一般为512B,读写时一般读写连续的若干扇区(一般为8个扇区,共4KB),这若干个扇区为一个块 block。
linux 中文件存储之inode节点
linux 中每个文件对应一个inode节点,inode节点存储文件的元数据,比如 文件的字节数、文件的所有者uid、文件的所有组 gid、文件的rwx权限,文件的时间戳,硬链接数,文件数据block的位置。
inode也消耗硬盘空间,硬盘格式化时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;一个是inode区,存放inode包含的信息。
每个inode节点的大小一般为128字节或256字节。inode节点的总数,在格式化的时候就给定,一般是每1KB或2KB就设置一个inode。
查看每个硬盘分区的inode总数和已经使用的数量,可以使用命令 df -i。 由于每个文件必须有一个inode,因此可能发生inode已经用光,但是硬盘还未存满的情况,此时也无法创建新文件了。
inode节点编号
每个inode有一个inode编号,系统通过inode编号来识别文件。表面上,用户通过文件名打开文件,实际上分为这三步:
(1) 系统找到这个文件名对应的inode号(在目录文件中通过文件名和inode号的对应关系库找到)
(2) 通过inode号码,获取inode信息
(3) 通过inode信息,找到文件所在的block,读取数据
目录文件
目录也是一种文件,目录文件中存放的是文件路径和文件inode的对应关系;
硬链接和软链接
一个文件的硬链接在目录中表现为一个文件,但是这个文件对应的inode号和原文件相同,即该硬链接实际不占用空间,文件inode节点中的链接数表示硬链接的数目,当添加一个硬链接时候,链接数加1,删除硬链接或者原文件的时候链接数减1,当链接数为0的时候,系统将文件的inode节点删除。因此,常用添加硬链接来避免误删除。
一个文件的软链接是一个新的文件,它的inode号和原文件不同,软链接文件中的内容为原文件的路径。读取软链接时,系统自动将访问者导向原文件。增加软链接,文件的inode中的链接数不变,当删除原文件时候,软链接会失效。
ls和du
ls 查看文件大小,即文件内容的字节数目。
比如当前文件夹下有三个文本文件 a.h, b.h, c.h 和一个空目录d。当执行 ls -al,显示:
[skc@server tmp]$ ls -lih
total 12K
2328340912 -rw-rw-r-- 2 skc skc 46 Oct 20 01:38 a.h
2154514158 -rw-rw-r-- 1 skc skc 500 Oct 20 01:38 b.h
2328340912 -rw-rw-r-- 2 skc skc 46 Oct 20 01:38 c.h
2328340913 drwxrwxr-x 2 skc skc 6 Oct 20 01:36 d
其中a.h 和 c.h 的inode相同,c.h 为一个硬链接。可见 a.h 和 c.h的文件大小是46字节,而 b.h文件大小为 500字节, 目录d(目录也是一个文件)的大小为6字节(空目录d)
向d中添加一个文件之后, d的大小扩展为20字节,说明一个文件-inode的对应占用14字节!(因系统而异)
[skc@server tmp]$ ls -lih
total 12K
2328340912 -rw-rw-r-- 2 skc skc 46 Oct 20 01:38 a.h
2154514158 -rw-rw-r-- 1 skc skc 500 Oct 20 01:38 b.h
2328340912 -rw-rw-r-- 2 skc skc 46 Oct 20 01:38 c.h
2328340913 drwxrwxr-x 2 skc skc 20 Oct 20 01:43 d
注意,ls结果中的total指的是当前文件夹下所有文件占用的磁盘空间,而不是文件大小的总和
du -sh 查询当前文件夹下的文件所占的磁盘空间大小。
skc@server tmp]$ du -sh *
4.0K a.h
4.0K b.h
12.0K d
如上所示,a.h 和 b.h 都占据4K大小的磁盘块,因为文件在磁盘中是按照块来读写的。基本的单位为一个磁盘块的大小,所以文件所占据磁盘空间总是4K大小的整数倍。而 c.h 为 a.h的硬链接,所以和a.h共享同一个磁盘块,因此不显示。目录d的占据磁盘空间大小为d下所有文件的磁盘空间大小的总和。