Chinaunix首页 | 论坛 | 博客
  • 博客访问: 160252
  • 博文数量: 126
  • 博客积分: 1073
  • 博客等级: 上尉
  • 技术积分: 1175
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-12 00:32
文章分类

全部博文(126)

文章存档

2018年(56)

2013年(1)

2012年(8)

2011年(61)

分类: LINUX

2011-01-24 19:42:50

关于linux下面文件系统的深究和tar工具的使用讨论,

 

分区和文件系统

磁盘驱动器被划分成分区,分区被格式化成文件系统(filesystem),从而使用户能够去保存数据。

Linux下面的默认文件系统是:ext3(第三级扩展linux文件系统,third extended linux filesystem)

其他常见的文件系统:

Ext2msdos (典型用于软盘)

Iso9660         (典型拥有光盘)

GFSGFS2 (典型用于SAN)主要用来做集群级的文件系统

 

Inodes(节点)

Inode(index node 索引节点)

Inodes table 包含了ext2ext3文件系统的所有属性,

一个文件其实是由两部分组成:节点表和数据区。

节点表里面主要存放文件的类型,权限,UIDGIDLink count,大小和时间戳,数据存放在磁盘的什么位置。

数据区里面就是存放真正的数据。

一个inodes的大小大概为128B,一个文件至少要占有1inodes。通过tune2fs  -l /dev/sda7 可以查看这个分区的inode sizeinode countblock count

我们知道,计算机在识别一个用户是通过UID来识别的,识别一个进程是通过进程号来识别的,那么,同样,计算机识别一个文件是通过一个inode number来识别文件的。而文件名只是给人的识别的。

如何查看文件的节点号呢?

#ls  -li

[root@localhost ~]#

[root@localhost ~]# ls -li

total 56

533587 -rw------- 1 root root  1050   Mar  6 02:15 anaconda-ks.cfg

919063 drwxr-xr-x 2 root root 4096   Mar  6 02:43 Desktop

524290 -rw-r--r-- 1 root root  29302  Mar  6 02:15 install.log

524291 -rw-r--r-- 1 root root  3738   Mar  6 02:15 install.log.syslog

[root@localhost ~]#

前面的一串数字就是文件的节点号,

其实我们的节点号是在分区创建的时候就已经分配好了的。

 

下面我们来学习复制,剪切,删除对文件inode的影响。

1.      复制对文件inode的影响,

现在先来查看一下,

[root@localhost ~]#

[root@localhost ~]# cd /boot/

[root@localhost boot]#

[root@localhost boot]# ls -li file

6030 -rw-r--r-- 1 root root 0 Mar  6 13:26 file

[root@localhost boot]#

可以看到,这个文件的节点号是6030,现在我们将它复制到另外一个分区,

[root@localhost ~]#

[root@localhost ~]# cd /boot/

[root@localhost boot]#

[root@localhost boot]# cp file /var/

[root@localhost boot]#

[root@localhost boot]# cd /var/

[root@localhost var]#

[root@localhost var]# ls -li file

2115361 -rw-r--r-- 1 root root 0 Mar  6 13:27 file

[root@localhost var]#

将这个文件复制到/var分区下面后,这个文件的inode number就改变了。

当一个文件从一个分区复制到另外一个分区的时候,系统就分配了另外一个inode给这个文件。

刚才我们是将一个文件从一个分区复制到另外一个分区,现在我们在同一个分区里面复制文件,文件的节点号会不会发生改变。

[root@localhost ~]#

[root@localhost ~]# cd /boot/

[root@localhost boot]#

[root@localhost boot]# ls -li file

6030 -rw-r--r-- 1 root root 0 Mar  6 13:26 file

[root@localhost boot]#

[root@localhost boot]# cp file /boot/grub/

[root@localhost boot]#

[root@localhost boot]# cd grub/

[root@localhost grub]# ls -li file

22091 -rw-r--r-- 1 root root 0 Mar  6 13:29 file

[root@localhost grub]#

可以看到,刚才这个文件的节点号是6030,现在就变成了22091了。

在同一个分区里面复制文件,这个文件的节点号也是会发生改变的。因为在这个分区有两份相同的文件,只是文件的内容相同,但是文件的inode属性却是不一样的。

 

2.剪切对文件inode的影响

现在先来查看一下,

[root@localhost ~]#

[root@localhost ~]# cd /boot/

[root@localhost boot]#

[root@localhost boot]# ls -li file

6030 -rw-r--r-- 1 root root 0 Mar  6 13:26 file

[root@localhost boot]#

可以看到,这个文件的节点号是6030,现在我们将这个文件在同个分区里剪切一份。

[root@localhost ~]#

[root@localhost ~]# cd /boot/

[root@localhost boot]#

[root@localhost boot]# ls -li file

6030 -rw-r--r-- 1 root root 0 Mar  6 13:26 file

[root@localhost boot]#

[root@localhost boot]# mv file /boot/test/

[root@localhost boot]#

[root@localhost boot]# cd test/

[root@localhost test]#

[root@localhost test]# ls -li file

6030 -rw-r--r-- 1 root root 0 Mar  6 13:26 file

[root@localhost test]#

可以看到,这个文件节点号是没有改变的。

当在同一个分区里面移到文件,文件的节点号没有发生改变。

刚才我们是在同一个分区里面移到文件,现在我们将文件在不同的分区当中移到,文件的节点号会不会发生改变呢。

[root@localhost ~]#

[root@localhost ~]# cd /boot/test/

[root@localhost test]#

[root@localhost test]# ls -li file

6030 -rw-r--r-- 1 root root 0 Mar  6 13:26 file

[root@localhost test]#

[root@localhost test]# mv /boot/test/file /var/ftp/pub/

[root@localhost test]#

[root@localhost test]# cd /var/ftp/pub/

[root@localhost pub]# ls -li file

325584 -rw-r--r-- 1 root root 0 Mar  6 13:26 file

[root@localhost pub]#

可以看到,这个文件的节点号是肯定会变的。

 

3.      删除对文件inode的影响

[root@localhost ~]#

[root@localhost ~]# cd /boot/

[root@localhost boot]#

[root@localhost boot]# ls -li file

6030 -rw-r--r-- 1 root root 0 Mar  6 13:44 file

[root@localhost boot]#

[root@localhost boot]# rm -rf file

[root@localhost boot]#

现在我们把file这个文件给删除了,其实我们只是将file这个文件的节点表给删除了,其实我们的数据都还在。这也就是为什么当我们删除一个文件,这个文件还可以被找回来的原因。当然如果我们在到这个分区里面写入数据,那么原来的数据就会被覆盖。

[root@localhost boot]#

[root@localhost boot]# touch file1

[root@localhost boot]#

[root@localhost boot]# ls -li file1

6030 -rw-r--r-- 1 root root 0 Mar  6 13:49 file1

[root@localhost boot]#

现在我们又新建了一个文件file1,这个文件的节点号也是6030,它就已经覆盖了以前的数据的节点号。那么以前的数据就找不回来了。

总结:

复制:在同一个分区,节点号改变。

            在不同的分区,节点号改变。

剪切:在同一个分区,节点号不变。

            在不同的分区,节点号改变。

删除:只是删除了文件的节点表,数据没有被真正删除,只有当往这个分区在写入数据的时候,才会覆盖原来的数据。

 

关于硬链接和软链接

1.      硬链接(hard links)

硬链接文件完全等同于原文件,原文件名和连接文件名都指向相同的物理地址。不可以跨文件系统,也不可以建立目录的硬链接。

如何创建硬链接呢

#ln  文件名  链接名

[root@localhost ~]#

[root@localhost ~]# cd /boot/

[root@localhost boot]#

[root@localhost boot]# ls -li inittab

6033 -rw-r--r-- 1 root root 1666 Mar  6 14:06 inittab

[root@localhost boot]# pwd

/boot

[root@localhost boot]# ln inittab /boot/grub/inittab.bak

[root@localhost boot]#

[root@localhost boot]# cd /boot/grub/

[root@localhost grub]#

[root@localhost grub]# ls -li inittab.bak

6033 -rw-r--r-- 2 root root 1666 Mar  6 14:06 inittab.bak

[root@localhost grub]#

可以看到,我们给inittab这个文件创建了一个硬链接initab.bak这个文件。这两个文件的节点号都是一样的。

现在我们来修改原文件,

在修改之前我们来看看这个两个文件是不是一样的,使用diff工具。

[root@localhost ~]#

[root@localhost ~]# diff /boot/inittab /boot/grub/inittab.bak

[root@localhost ~]#

OK,这两个文件的内容是一样的。

现在我们来修改原文件,

[root@localhost ~]#

[root@localhost ~]# cd /boot/

[root@localhost boot]#

[root@localhost boot]# vim inittab

[root@localhost boot]#

我已经对原文件做了修改了。

现在在来看看链接文件是否也跟着改变了

[root@localhost ~]#

[root@localhost ~]# diff /boot/inittab /boot/grub/inittab.bak

[root@localhost ~]#

OK,这两个文件还是一样的,也就是说我们改变了原文件的内容,链接文件也是会跟着发生改变的。

当然,如果在链接文件里面添加内容,那么原文件也会跟着发生改变的。

现在如果我们将原文件个删除了,那么链接还会存在吗?

[root@localhost ~]#

[root@localhost ~]# cd /boot/

[root@localhost boot]#

[root@localhost boot]# rm -rf inittab

[root@localhost boot]#

[root@localhost boot]# cd /boot/grub/

[root@localhost grub]#

[root@localhost grub]# ls | grep inittab.bak

inittab.bak

[root@localhost grub]#

OK,可以看到,当我们删除原文件的时候,链接文件也还是存在的。

因为原文件和链接文件都有节点表,这两个节点表都是指向真正的数据区的,当我们删除原文件的时候,只是删除了原文件的节点表,而没有删除真正的数据,而我们的链接文件也是指向真正的数据区的,所以链接文件存在也是正常的。

接下来,在做一个试验。

[root@localhost ~]#

[root@localhost ~]# cd /boot/

[root@localhost boot]#

[root@localhost boot]# ls -li fstab

6034 -rw-r--r-- 1 root root 684 Mar  6 15:43 fstab

[root@localhost boot]#

/boot分区下面有个fstab文件,现在我们为这个文件做一个硬链接。

[root@localhost ~]#

[root@localhost ~]# ln /boot/fstab /tmp/

ln: creating hard link `/tmp/fstab' to `/boot/fstab': Invalid cross-device link

[root@localhost ~]#

但是,现在系统报错了,他提示我们硬连接是不可以跨分区的。

 

2.      软链接(soft links)

软链接文件相当于为原文件建立了一个快捷方式,可以跨文件系统,也可以为目录建立。软链接和硬链接不同,软链接有自己的inode,类似windows下的快捷方式。

如何创建软链接呢?

#ln  -s  文件名  链接名

[root@localhost ~]#

[root@localhost ~]# cd /boot/

[root@localhost boot]#

[root@localhost boot]# ls -li fstab

6034 -rw-r--r-- 1 root root 684 Mar  6 15:43 fstab

[root@localhost boot]#

[root@localhost boot]# ln -s /boot/fstab /boot/grub/fstab.bak

[root@localhost boot]#

[root@localhost boot]# cd /boot/grub

[root@localhost grub]#

[root@localhost grub]# ls -li fstab.bak

22106 lrwxrwxrwx 1 root root 11 Mar  6 15:56 fstab.bak -> /boot/fstab

[root@localhost grub]#

现在我为/boot下面的fstab文件做了一个硬链接/boot/grub/fstab.bak文件。

当我们修改原文件里面的数据,我们链接文件也会发生改变。修改链接文件的数据,原文件也会发生改变。这点和硬链接是一样的。

现在我们删除原文件,链接文件还可以打开吗?

[root@localhost ~]#

[root@localhost ~]# rm -rf /boot/fstab

[root@localhost ~]#

[root@localhost ~]# cd /boot/grub

[root@localhost grub]#

[root@localhost grub]# ls -li fstab.bak

22106 lrwxrwxrwx 1 root root 11 Mar  6 15:56 fstab.bak -> /boot/fstab

[root@localhost grub]#

很显然,当我们删除原文件以后,我们的链接文件就坏掉了。

因为软连接的节点号并没有指向真正的数据,而是指向原文件,当原文件的节点表被删除了,我们的软连接也打不开了。

刚才我们的硬链接并不能够跨分区做,但是我们的软连接没有限制。

[root@localhost ~]#

[root@localhost ~]# cd /boot/

[root@localhost boot]#

[root@localhost boot]# ln -s /boot/fstab /tmp/fstab.bak

[root@localhost boot]# cd /tmp/

[root@localhost tmp]# ls -li fstab.bak

131180 lrwxrwxrwx 1 root root 11 Mar  6 16:12 fstab.bak -> /boot/fstab

[root@localhost tmp]#

我们的软链接是可以跨分区的。

总结:

硬链接不可以跨分区,不可以对目录做。但是硬链接的原文件和链接文件的节点表都指向真正的数据区。删除原文件,链接文件也可以打开。

软链接可以跨分区,也可以对目录做。但是软链接的链接文件的节点表是指向原文件的,当原文件删除后,链接文件就坏掉了。

 

关于linux系统中文件类型

Ls  -l的符合         文件类型

-                                                        常规文件

d                            目录

l                             符号链接

b                            块设备文件

c                            字符特殊文件

p                            别命名的管道

s                             套接字

 

关于linux下面检查空闲空间

#df  -h

[root@localhost ~]#

[root@localhost ~]# df -h

Filesystem            Size      Used      Avail      Use%      Mounted on

/dev/sda3             3.9G      2.3G     1.5G       61%          /

/dev/sda6             494M    11M      458M     3%           /home

/dev/sda2             15G      11G        2.7G      81%         /var

/dev/sda1             99M     21M       74M       22%         /boot

tmpfs                   217M     0           217M     0%           /dev/shm

none                    217M   104K      217M     1%           /var/lib/xenstored

/dev/hdc              2.8G     2.8G       0            100%        /media/RHEL_5.4 i386 DVD

[root@localhost ~]#

查看磁盘的空间用量。

#du  -h

[root@localhost ~]#

[root@localhost ~]# du -h /tmp/

4.0K    /tmp/.ICE-unix

4.0K    /tmp/.font-unix

8.0K    /tmp/orbit-root

4.0K    /tmp/.X11-unix

8.0K    /tmp/gconfd-root/lock

12K     /tmp/gconfd-root

60K     /tmp/

[root@localhost ~]#

这条命令会显示/tmp目录下面每个文件的大小。

可以加上s参数,就会汇总的意思,只显示/tmp目录的大小。

[root@localhost ~]#

[root@localhost ~]# du -sh /tmp/

60K     /tmp/

[root@localhost ~]#

 

关于linux下面挂载各种设备方法

挂载(mounting):意味着使外来的文件系统看起来如同是主目录树的一部分。

访问前,介质必须被挂载

摘除时,介质必须被卸载

1.      挂载光盘和DVD

# Mount   /dev/chrom  /media

Eject命令用来卸载并弹出磁盘

2.      挂载USB设备

#mount   /dev/sdb1   /mnt

linux如何卸载呢?

我们使用Umount命令来卸载挂载设备,

# Umount  /mnt(挂载点)

 

如何使用TAR工具来进行压缩打包

1.      linux下面如何打包

#tar  -cvf     /tmp/etc.tar   /etc

-c     创建打包

-v     查看过程

-f     指定打包文件或设备

[root@localhost ~]#

[root@localhost ~]# tar -cvf /tmp/etc.tar /etc/

[root@localhost ~]#

[root@localhost ~]#

[root@localhost ~]# cd /tmp/

[root@localhost tmp]#

[root@localhost tmp]# ll etc.tar

-rw-r--r-- 1 root root 1095680 Mar  6 17:44 etc.tar

[root@localhost tmp]#

这个就是我们打包出来的文件etc.tar

打包只是将这些文件打包在一起,并不压缩,也就是不会减小大小。

 

2.      linux中进行压缩文件

#gzip   etc.tar

[root@localhost tmp]#

[root@localhost tmp]# gzip etc.tar

[root@localhost tmp]# ll -h etc.tar.gz

-rw-r--r-- 1 root root 170K Mar  6 17:44 etc.tar.gz

[root@localhost tmp]#

我们就将刚才打包出来的文件给压缩了,这个文件就变成了tar.gz了,而且这个文件的大小也明显减小了。

刚才我们是使用gzip的工具来压缩的,现在我们使用bzip2工具来压缩文件,而且这个工具比gzip的工具压缩率更高。

#bzip2  etc.tar

[root@localhost ~]#

[root@localhost ~]# cd /tmp/

[root@localhost tmp]#

[root@localhost tmp]# ll etc.tar

-rw-r--r-- 1 root root 1105920 Mar  6 17:58 etc.tar

[root@localhost tmp]#

[root@localhost tmp]# bzip2 etc.tar

[root@localhost tmp]# ll etc.tar.bz2

-rw-r--r-- 1 root root 141234 Mar  6 17:58 etc.tar.bz2

[root@localhost tmp]#

我们将etc.tar这个打包文件给用bzip2来压缩的,而且这个后缀名是tar.bz2

 

3.      linux下面打包加压缩

# tar  -zcvf  /tmp/etc.tar.gz  /etc/

-z         gzip的工具来压缩

-cvf     打包

[root@localhost ~]#

[root@localhost ~]# cd /tmp/

[root@localhost tmp]#

[root@localhost tmp]# ll

total 10860

-rw-r--r-- 1 root root 11101927 Mar  6 18:05 etc.tar.gz

[root@localhost tmp]#

刚才使用gzip的工具来压缩的,还可以用bzip2来压缩。

# tar  -jcvf  /tmp/etc.tar.gz  /etc/

-j         bzip2的方式来压缩

[root@localhost tmp]#

[root@localhost tmp]# tar -jcvf /tmp/etc.tar.bz2 /etc/

[root@localhost tmp]#

[root@localhost tmp]#

[root@localhost tmp]# ll

total 11000

-rw-r--r-- 1 root root   139264 Mar  6 18:09   etc.tar.bz2

-rw-r--r-- 1 root root 11101927 Mar  6 18:05 etc.tar.gz

[root@localhost tmp]#

OK,打包和压缩就这么多了,下面来解压缩

 

4.      linux下面进行解压缩

#tar  -zxvf  etc.tar.gz

[root@localhost tmp]#

[root@localhost tmp]# tar -zxvf etc.tar.gz

[root@localhost tmp]#

[root@localhost tmp]#

[root@localhost tmp]# ll -h

total 11M

drwxr-xr-x 96 root root  12K Mar  6 18:14 etc

-rw-r--r--  1 root root 136K Mar  6 18:09 etc.tar.bz2

-rw-r--r--  1 root root  11M Mar  6 18:05 etc.tar.gz

[root@localhost tmp]#

可以看到,etc.tar.gz就被解压出来了,

 

linux下面的文件系统和TAR工具的讨论就到这里了。

阅读(528) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~