您的位置:首页 > 运维架构 > Linux

Linux学习(11)--文件系统的简单操作

2017-03-08 17:14 330 查看

磁盘与目录的容量:df,du

df:列出文件系统的整体磁盘使用量

du:评估文件系统的磁盘使用量(常用于评估目录所占容量)

[root@VM_174_157_centos ~]# df [-ahikHTm] 目录或文件名
选项与参数:
-a:列出所有的文件系统,包括系统特有的/proc等文件系统
-k:以KBytes的容量显示各文件系统
-m:以MBytes的容量显示各文件系统
-h:以人们熟知的GB,MB,KB来等格式自行列出
-H:以1M=1000K 取代 1M=1024K的进位方式
-T:连同该分区的文件系统名称(例如Ext3)也列出
-i:不用硬盘容量,而以inode的数量来显示


当我们使用-a的时候,发现/proc这个挂载点为0,这个现象是正常的。前面我们多次提到,这个挂载的东西都是在内存里面,所以没有占任何的硬盘空间。至于那个/dev/shm/目录,是利用内存虚拟出来的磁盘空间。(默认大小是物理内存的一半,可以用df -h查看)由于是通过内存,因此访问速度是非常快的,不过,也由于是内存仿真出来。这个文件系统的大小在每部主机上的大小都不一样,而且建立的东西在下次开机之后就不见了。

[root@VM_174_157_centos ~]# du [-ahskm] 文件或目录
选项与参数:
-a:列出所有的文件与目录容量,默认仅统计目录下面的文件量而已
-h:以人们熟知的方式显示
-s:列出总量而已,而不列出每个个别的目录占用容量
-k:以KBytes列出容量显示
-m:以MBytes列出容量显示

范例1:列出目前录下的文件容量
root@ubuntu:/home/temp# du
8   .
#这个8其实就是8K的意思


由于 du 默认会将所有文件的大小均列出,因此假设你在/etc下使用du,所有的文件大小,包括/etc下面的子目录的容量也会被计算一次,让人觉得分析结果不对劲。所以,如果想要列出某目录下的全部数据,或许加上-S(此处大),减少子目录的计算。

连接文件:ln

在Linux下面连接文件有两种,一种是类似 Windows 的快捷方式功能的文件,可见让你快速连接到目标文件(或目录);另一种则是通过文件系统的 inode 连接来产生新文件名,而不是产生新文件,这种称为硬链接(hard link)。这两个完全是不一样的东西,现在就分别来介绍:

hard link(硬连接或实际连接)

在前面我们可以得知,每个文件都会占用一个 inode,文件内容由 inode 的记录来指向。想要读取该文件,必须要经过目录记录的文件名来指向到正确的 inode 号码才能读取。也就是说,其实文件名只与目录有关,但是文件内容则与 inode 有关。但是,有没有可能有多个文件名对应到同一个 inode 号码呢?这就是hard link的由来,所以简单得说:hard link 只是与某个目录下新建一条文件名连接到某 inode 号码的关联记录而已。

举个例子,假设有个/root/crontab 是 /etc/crontab 的实际连接,那么这两个文件文件名连接到同一个 inode,自然两个文件信息都会一模一样,具体情况如图所示:

[root@VM_174_157_centos ~]# ln /tmp/test.c
[root@VM_174_157_centos ~]# ll -i /tmp/test.c /root/test.c
491542 -rw-r--r-- 2 root root 244 Mar  7 22:44 /root/test.c
491542 -rw-r--r-- 2 root root 244 Mar  7 22:44 /tmp/test.c


我们可以发现,两个文件都连接到491542这个inode号码,文件权限和属性也都是一样的,原本的第二个字段的1,也变成2了(记不清的可以看前面介绍文件的地方)。这个字段的意义是“有多少个文件名连接到这个 inode 号码的意思”。具体示意图如下面所示:



我们可以通过1 或2 的目录inode指定的block找到两个不同的文件名,而不管使用那个文件名均可找到 real 那个 inode 去读取到最终的数据。这样最大的好处就是“安全”。如果你将任何一个“文件名”删除,其实inode与block都还是存在的。此时你可以通过另一个“文件名”来读取到正确的文件数据。当然,不论你用哪个“文件名”来编辑,最终的结果都会写入到相同的 inode 与 block 当中,因此均能进行数据的修改。

Tips:一般来说,使用hard link设置连接文件时,磁盘空间与 inode 的数目都不会改变。它仅仅是在某个目录下的 block 多写入一个关联连接数而已。但是其实还是有可能会改变系统的block的,那就是当你新增的这笔数据刚好将目录的block填满,就可能会新增一个block来记录文件名关联性,而导致磁盘空间的变化。不过,一般hard link所用掉的关联数据量很小,所以通常不会改变inode与磁盘空间大小。

由图我们可以知道,har link其实只能在单一文件系统中,而不能跨系统的,所以它还是有限制的:

不能跨文件系统

不能连接到目录

实际上,当我们用hard link连接目录时(加入将/etc 用硬连接建立一个 /etc_cd的目录),不仅仅是只针对目录本身,连同里面的所有文件、目录都需要建立hard link。而且,如果未来需要在/etc_cd下建立新文件,又要对 /etc 建立一次硬连接,大大增加了复杂度,所以目前还不支持。

symbolic link(软连接或符号连接)

相对于硬连接,软连接就好理解多了。基本上,symbolic link就是建立一个独立的文件,而这个文件会让数据的读取指向他连接的那个文件的文件名。由于只是利用文件来作为指向的动作,所以,当来源档被删除了之后,symbolic link的文件就会“打开不了”,因为找不到源文件的“文件名”了而已。

让我们先创建一个软连接文件连接到 /etc/crontab:

[root@VM_174_157_centos ~]# ln -s /etc/crontab crontab2
[root@VM_174_157_centos ~]# ll -i /etc/crontab /root/crontab2
459241 -rw-r--r--. 1 root root 451 Jun 10  2014 /etc/crontab
131086 lrwxrwxrwx  1 root root  12 Mar  8 13:43 /root/crontab2 -> /etc/crontab


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



但是这里还是应该特别留意下,这个symbolic link 与 Windows 的快捷方式可以画上等号,由 symbolic link 所创建的文件为一个独立的新的文件,所以会占用掉 inode 与 block

hard link比较安全,即使某一个目录下的关联数据被删除掉,只要有任何一个目录下还存在这关联数据,该文件就不会被删除。仅仅是关联数据被拿掉而已

但是hard link无法做“目录”的连接,所以在用途上面还是比较瘦限制的,反而symbolic link在这方面使用比较广

[root@VM_174_157_centos ~]# ln [-sf] 源文件 目标文件
选项与参数:
-s:如果不加任何参数就新型连接,那就是hard link,加上 -s 就是 symbolic link
-f:如果目标文件存在时,就主动将目标文件删除后再创建

#范例1:查看软连接对inode的影响
[root@VM_174_157_centos ~]# cd /tmp
[root@VM_174_157_centos tmp]# du -sb; df -i
41349   .              <==先注意这里的容量是多少
Filesystem      Inodes IUsed   IFree IUse% Mounted on
/dev/vda1      1310720 41470 1269250    4% /
#du的-b参数意思是用bytes计算

[root@VM_174_157_centos tmp]# ls -il test*
491540 ---x--x--x 1 root root    0 Feb 27 17:01 test
491533 lrwxrwxrwx 1 root root    6 Mar  8 14:50 test-so -> test.c    <==有自己独立的inode
491542 -rw-r--r-- 2 root root  244 Mar  7 22:44 test.c

[root@VM_174_157_centos tmp]# ln -s test.c test-so
[root@VM_174_157_centos tmp]# du -sb; df -i
41355   .              <==容量增加了
Filesystem      Inodes IUsed   IFree IUse% Mounted on
/dev/vda1      1310720 41471 1269249    4% /              <==可用inode少了一个

#如果软连接指向的文件被删除了,会以不一样的颜色表示出来


另外,如果你建立了这样的连接:

ln -s /bin /root/bin


那么如果你进入/root/bin目录下,该目录其实是/bin这个目录,因为你做了连接文件。所以,如果进入/root/bin 并删除了所有的文件,那么 /bin 里面的文件也都不见了。

关于目录的连接数量

我们知道,当我们用hard link连接的时候,第二个字段会增加 1。那么当我们建立一个空的目录的时候,默认连接数是多少呢?让我们来看一下,一个空的目录会包含什么内容?比如,我们创建一个新目录名称为 /tmp/testing 时,基本上会有三个东西,那就是:

/tmp/testing

/tmp/testing/.

/tmp/testing/..

而其中的/tmp/testing和/tmp/testing/.其实是一样的,而/tmp/testing/..代表了 上级目录。所以说,当我们新建一个目录时,新的目录连接数是 2,而上层目录的连接数应该会增加 1。

[root@VM_174_157_centos ~]# ls -ld /tmp
drwxrwxrwt. 8 root root 4096 Mar  8 14:57 /tmp

[root@VM_174_157_centos ~]# mkdir /tmp/testing1
[root@VM_174_157_centos ~]# ls -ld /tmp
drwxrwxrwt. 9 root root 4096 Mar  8 16:04 /tmp

[root@VM_174_157_centos ~]# ls -ld /tmp/testing1/
drwxr-xr-x 2 root root 4096 Mar  8 16:04 /tmp/testing1/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: