分类: LINUX
2011-01-24 19:42:50
关于linux下面文件系统的深究和tar工具的使用讨论,
分区和文件系统
磁盘驱动器被划分成分区,分区被格式化成文件系统(filesystem),从而使用户能够去保存数据。
Linux下面的默认文件系统是:ext3(第三级扩展linux文件系统,third extended linux filesystem)。
其他常见的文件系统:
Ext2和msdos (典型用于软盘)
Iso9660 (典型拥有光盘)
GFS和GFS2 (典型用于SAN)主要用来做集群级的文件系统
Inodes(节点)
Inode(index node 索引节点)
Inodes table 包含了ext2和ext3文件系统的所有属性,
一个文件其实是由两部分组成:节点表和数据区。
节点表里面主要存放文件的类型,权限,UID,GID,Link count,大小和时间戳,数据存放在磁盘的什么位置。
数据区里面就是存放真正的数据。
一个inodes的大小大概为128B,一个文件至少要占有1个inodes。通过tune2fs -l /dev/sda7 可以查看这个分区的inode size,inode count,block 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工具的讨论就到这里了。