2008年7月20日星期日

文件系统

文件系统指文件存在的物理空间,Linux系统中每个分区都是一个文件系统,都有自己的目录层次结构。Linux会将这些分属不同分区的、单独的文件系统按一定的方式形成一个系统的,总的目录层次结构。一个操作系统的运行离不开对文件的操作,因此必然要拥有并维护自己的文件系统。

  Linux文件系统使用索引节点来记录文件信息,作用像Windows的文件分配表。

  索引节点是一个结构,它包含了一个文件的长度、创建及修改时间、许可权、所属关系、磁盘中的位置等信息。一个文件系统维护了一个索引节点的阵列,每个文件或目录都与索引节点阵列中的惟一一个元素对应。系统给每个索引节点分配了一个号码,也就是该节点在阵列中的索引号,称为索引节点号。

  Linux文件系统将文件索引节点号和文件名同时保存在目录中。所以,目录只是将文件的名称和它的索引节点号结合在一起的一张表,目录中每一对文件名称和索引节点号称为一个连接。

  对于一个文件来说,有惟一的索引节点号与之对应,而对于一个索引节点号,却可以有多个文件名与之对应。因此,在磁盘上的同一个文件可以通过不同的路径去访问它。

  可以用ln命令对一个已经存在的文件再创建一个新的连接,而不复制文件的内容。

  连接有软连接和硬连接之分,软连接又叫符号连接。它们各自的特点如下。

  硬连接:

  (1)原文件名和链接文件名都指向相同的物理位址。

  (2)目录不能有硬连接;硬连接不能跨越文件系统(不能跨越不同的分区)。

  (3)文件在磁盘中只有一个复制,以节省硬盘空间。

  (4)由于删除文件要在同一个索引节点属于惟一的连接时才能成功,因此可以防止不必要的误删除。

  符号连接:

  (1)用ln -s命令创建文件的符号连接;

  (2)符号连接是Linux特殊文件的一种,作为一个文件,它的资料是它所连接的文件的路径名。类似于Windows下的快捷方式。

  (3)可以删除原有的文件而保存链接文件,没有防止误删除功能。

  装载文件系统

  由上一节知道,Linux系统中每个分区都是一个文件系统,都有自己的目录层次结构。Linux会将这些分属不同分区的、单独的文件系统按一定的方式形成一个系统的总的目录层次结构。这里所说的“按一定方式”就是指的装载。

  将一个文件系统的顶层目录挂到另一个文件系统的子目录上,使它们成为一个整体,称为装载。把该子目录称为挂接点。

  注意:挂接点必须是一个目录。

  一个分区装载在一个已存在的目录上,这个目录可以不为空,但装载后这个目录下以前的内容将不可用。

  对于其他操作系统创建的文件系统的装载也是这样。但是需要理解的是,光盘、软盘、其他操作系统使用的文件系统的格式与Linux使用的文件系统格式是不一样的。光盘是ISO9660;软盘是FAT16或ext2;Windows NT是FAT16, NTFS, Windows 98是FAT16, FAT32;Windows 2000和Windows XP是FAT16, FAT32, NTFS。装载前要了解Linux是否支持所要装载的文件系统格式。

  装载时使用mount命令。格式:mount [-参数] [设备名称] [挂接点]

  其中常用的参数有:

  -t<文件系统类型> 指定设备的文件系统类型,常见的有:

  minix Linux 最早使用的文件系统;

  ext2 Linux 目前常用的文件系统;

  msdos MS-DOS的FAT,就是FAT16;

  vfat Windows 98常用的FAT32;

  nfs 网络文件系统;

  iso9660 CD-ROM光盘标准文件系统;

  ntfs Windows NT/2000的文件系统;

  hpfs OS/2文件系统;

  auto 自动检测文件系统。

  -o<选项> 指定装载文件系统时的选项,有些也可用在/etc/fstab中。常用的有:

  codepage=XXX 内码表;

  iocharset=XXX 字符集;

  ro 以只读方式装载;

  rw 以读写方式装载;

  nouser 使一般用户无法装载;

  user 可以让一般用户装载设备。

  提醒一下,mount命令没有创建挂接点的功能,因此您应该确保执行mount命令时,挂接点已经存在。(即你要把文件系统装载到哪,首先要先建立这个目录。)

  例:Windows 98装在hda1分区,同时电脑上还有软盘和光盘需要装载。

  # mk /mnt/winc

  # mk /mnt/floppy

  # mk /mnt/cdrom

  # mount -t vfat /dev/hda1 /mnt/winc

  # mount -t msdos /dev/fd0 /mnt/floppy

  # mount -t iso9660 /dev/cdrom /mnt/cdrom

  现在就可以进入/mnt/winc等目录读写这些文件系统了。

  要保证最后两行的命令不出错,就要确保软驱和光驱里有盘。

  如果你的Windows 98目录里有中文文件名,使用上面的命令装载后,显示的是一堆乱码。这就要用到 -o 参数里的codepage iocharset选项。codepage指定文件系统的内码表,简体中文代码是936;iocharset指定字符集,简体中文一般用cp936或gb2312。

  当装载的文件系统Linux不支持时,mount一定会报错,如Windows 2000的NTFS文件系统。可以重新编译Linux内核以获得对该文件系统的支持。

自动装载

  每次开机访问Windows分区都要运行mount命令,这显然太烦琐。为什么访问其他的Linux分区不用使用mount命令呢?

  其实,每次开机时,Linux自动将需要装载的Linux分区装载上了。那么我们是不是可以设置让Linux在启动的时候也装载我们希望装载的分区,如Windows分区,以实现文件系统的自动装载呢?

  这是完全可以的。在/etc目录下有个fstab文件,它里面列出了Linux开机时自动装载的文件系统的列表。比如 /etc/fstab文件如下:

  /dev/hda2 / ext3 defaults 1 1

  /dev/hda1 /boot ext3 defaults 1 2

  none /dev/pts devpts gid=5,mode=620 0 0

  none /proc proc defaults 0 0

  none /dev/shm tmpfs defaults 0 0

  /dev/hda3 swap swap defaults 0 0

  /dev/cdrom /mnt/cdrom iso9660 noauto,codepage=936,iocharset=gb2312 0 0

  /dev/fd0 /mnt/floppy auto noauto,owner,kudzu 0 0

  /dev/hdb1 /mnt/winc vfat defaults,codepage=936,iocharset=cp936 0 0

  /dev/hda5 /mnt/wind vfat defaults,codepage=936,iocharset=cp936 0 0

  在/etc/fstab文件里,第1列是装载的文件系统的设备名,第2列是挂接点,第3列是装载的文件系统类型,第4列是装载的选项,选项间用逗号分隔。

  最后两行是我手工添加的Windows下的C, D盘,加了codepage=936和ocharset=cp936参数以支持中文文件名。参数defaults实际上包含了一组默认参数:

  rw 以可读写模式装载;

  suid 开启用户 ID和用户组ID设置位;

  dev 可解读文件系统上的字符或块设备;

  exec 可执行二进位文件;

  auto 自动装载;

  nouser 使一般用户无法装载;

  async 以非同步方式执行文件系统的输入输出操作。

  大家可以看到,在这个列表里,光驱和软驱是不自动装载的,参数设置为noauto。(如果你非要设成自动装载,您要确保每次开机时你的光驱和软驱里都要有光盘或软盘。)

没有评论: