Chinaunix首页 | 论坛 | 博客
  • 博客访问: 198814
  • 博文数量: 124
  • 博客积分: 7051
  • 博客等级: 少将
  • 技术积分: 1425
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-20 13:21
文章分类

全部博文(124)

文章存档

2008年(124)

我的朋友

分类: LINUX

2008-04-29 14:47:14

   
安装和升级系统时,需要对硬盘做很多工作。必须在硬盘上做文件系统,使文件能存在其上,并为系统不同的部分保留空间。

  本章说明所有这些初始化工作。通常,一旦你建立了系统,就不必再做这些工作(除了使用软盘)。如果你要增加一个新硬盘或更好地调整你的硬盘的使用,那么可能回到这一章。

管理磁盘的基本任务有:

  格式化磁盘。这为磁盘进入使用做一些工作,比如检查坏扇区。(现在多数硬盘无须格式化。)

  给硬盘分区,如果想用于互相不干扰的几件事。分区的一个原因是要在一个硬盘上存不同的操作系统。另一个原因是将用户文件和系统文件分开,以简化备份并在系统崩溃时有助于保护系统文件。

  在每个磁盘或分区上建立合适类型的文件系统,然后文件就可以在其上产生和存取。在你建立文件系统前,磁盘对Linux没有意义。

  将不同的文件系统安装起来形成一个单独的树结构,按需要可以自动或手工完成。 (手工安装的文件系统通常还要手工unmount)

  5章包括虚拟内存和磁盘cache的信息,使用磁盘应该知道这些。

  本章说明对硬盘、软盘、CDROM和磁带机应该知道什么。

2种设备

  UNIX及Linux,识别2类设备:随机存取的块设备(如磁盘)和字符设备(如磁带和串行线),有些是串行的,有些是随机存取的。文件系统支持的每 种看来是个设备文件。当读写设备文件时,数据与设备联系。这样没有必要为存取设备编制特别的程序(程序不直接获取中断或读取串口),例如,发送文件到打印 机,只需:

  $ cat filename >; /dev/lp1
  $

  文件内容就被打印了(当然,文件必须是打印机能理解的格式)。当然,因为不应该让多人同时cat文件到同一打印机,一般用特定的程序发送文件去打印 (通常是lpr )。这个程序能确保同时只有一个文件被打印,并自动在完成后发送下一个。多数设备有类似需要。实际上,根本很少需要关心设备文件。

  因为设备被视为文件系统中的文件(在/dev 目录中),很容易看到存在哪些设备文件,使用ls 或其他的适当的命令即可。在ls -l 的输出中,第一列包含文件类型和权限。例如,查看我系统上的一个串行设备:

  $ ls -l /dev/cua0
  crw-rw-rw- 1 root uucp 5, 64 Nov 30 1993 /dev/cua0
  $

  第一列第一个字符,即crw-rw-rw-中的c告诉用户文件的种类,这是一个字符设备。一般文件的第一个字符是"-",目录是"d",块设备是"b";更多的信息见ls man页。

  注意即使设备没有安装,一般所有设备文件都存在。因此有/dev/sda 文件并不意味着你真的有个SCSI硬盘。有所有的设备文件使安装程序更简单,也易于增加新硬件(无须再为产生新设备的设备文件找出正确的参数)。
硬盘

  本节介绍有关硬盘的术语。如果你已经知道这些项目和内容,可以跳过本节。

  硬盘包括一到数片盘片platters, 其一个或两个面surfaces涂有磁性材料用于记录数据。每面有一个读写头read-write head用于读写数据。盘片有一个共同的轴,典型的旋转速度是每分钟3600转,高性能的硬盘转速可能更高。磁头可沿着盘片的半径移动,磁头移动加上盘片 旋转可以使词头存取磁盘表面的任何一个位置。

  处理器(CPU)和实际磁盘通过磁盘控制器disk controller通讯。这使计算机其他部分不必知道如何使用驱动器,因为不同磁盘的控制器可以做成对计算机其他部分相同的接口。这样,计算机只要说" 嗨,磁盘,给我我要的东西",而不是用一串长而复杂的电信号来移动磁头到正确的位置,并等正确的位置到了磁头下后再做那些不愉快的工作。 (实际上,到控制器的接口仍然很复杂,但比没有好多了。) 控制器还可以做一些其他的事,比如缓冲,或自动坏扇区替换等。用电信号控制操作机械部件,

  以上只是理解硬件所需的。还有其他好多工作,比如马达旋转磁盘、移动磁头,但这都与理解硬盘工作原理无关。

  磁盘表面通常被分为同心圆环,叫磁道tracks,磁道又被分为扇区sectors。用这样分来将磁盘定位,用于为文件定位磁盘空间。要在硬盘上找到 给定的位置,可能?quot;3面5道7扇区"。通常所有磁道有相同的扇区数,但也有硬盘在外圈磁道放较多的扇区(所有扇区用同样大小的物理空间,这样在 较长的外圈磁道可以容纳更多的数据)。一般一个扇区容纳512字节数据。磁盘不能处理比一个扇区更小的数据量。

  每个面以相同的方式分为磁道和扇区。这意味着当一个磁头在某个磁道时,其他磁头也在相应的位置,所有相同位置的磁道组成柱面cylinder。磁头从 一个磁道(柱面)移动到另一个需要花时间,所以将经常要在一起存取的数据(如一个文件)放在一个柱面里。这改善了性能。当然不可能完全作到,文件被放在几 个相分离的位置叫碎片fragmented。

  磁盘的面(或头,实际是一样的)、柱面、扇区数各不相同,硬盘这些数目叫硬盘参数geometry。硬盘参数通常存在一个特定的、由电池供电的存储区中,叫CMOS RAM,操作系统在引导启动或驱动器初始化时可以从那里得到硬盘参数。

  不幸的是,BIOS 有一个设计限制,就是不能在CMOS RAM中定义大于1024的磁道数,这对大硬盘来说就太小了。为了克服这个问题,硬盘控制器在磁盘参数上做了一个欺骗,用地址转换translates the addresses使计算机接受。例如,一个硬盘可能有8个磁头,2048个磁道,每磁道35个扇区。其控制器可以对计算机谎称它有16个磁头,1024 个磁道,每磁道35个扇区,这样就没有超过磁道数的限制,地址转换将磁头数减半,磁道数加倍后传给硬盘。实际的算法可能更复杂,因为数量可能不象我们在这 里假设的这么好(但这不影响我们理解原理)。这个转换在操作系统来看产生了错觉,并可能影响操作系统对把所有数据存在相同柱面的企图受到影响。

  转换只是IDE硬盘的问题。SCSI硬盘使用连续的扇区号(即控制器将连续的扇区好转换成磁头、柱面、扇区的三参数组),对CPU与控制器的通信使用完全不同的方法,因此不会有这个问题。注意,计算机可能根本不知道一个SCSI硬盘的实际参数。

  由于Linux经常不知道一个硬盘的真正参数,其文件系统也不试图将文件存在一个柱面里。而是争取给一个文件分配连续编号的山区,这样能得到类似的性能。对于控制器上有cashe或控制器能自动预取的硬盘,情况将更复杂。

  每个硬盘表现为一个单独的设备文件。通常只能有2-4个IDE硬盘。这就是 /dev/hda , /dev/hdb , /dev/hdc , 和 /dev/hdd 。 SCSI是 /dev/sda , /dev/sdb , 等等。其他硬盘类型有类似的命名约定,更多的信息见[Anv]。注意硬盘的设备文件给出整个硬盘的存取,而不是分区(下面讨论的),因此如果不小心可能搞 乱分区或数据。硬盘的设备文件只在存取主引导扇(也将在下面讨论)时使用。

软盘

  软盘的一面或两面涂有和硬盘类似的磁性介质。软盘自己没有读写头,读写头在驱动器上。软盘相当于硬盘的一张盘片,但可移动,一个驱动器可以存取不同的软盘,而硬盘则是一个独立的单元。

  如同硬盘,一张软盘也分为磁道和扇区(软盘2面上的相同的磁道组成柱面),但数量要比硬盘少得多。

  软驱通常可以使用几中不同的盘片,例如,一个3.5’软驱可以使用720KB和1.44MB的软盘。因为软驱操作有些不同,而操作系统必须知道软盘的 容量,所以软驱有许多设备文件,每个都与软驱和软盘种类有关。因此,/dev/fd0H1440 是第一个软驱(fd0),必须是3.5’软驱,使用3.5’高密度软盘(H),容量是1440KB(1440),即普通的3.5’HD软盘。软盘设备的命 名约定见[Anv]。

  软驱的名字是复杂的,因此Linux有一个特定的软驱设备类型,能自动检测软驱中软盘的种类。它使用不同的软盘类型试图读取新插入的软盘的第一个扇区,直到找到正确的一个。这自然要求软盘是已经格式化过的。自动设备叫/dev/fd0 、/dev/fd1 等。

  存取软盘的自动设备的参数可用程序setfdprm 设定。这可使你使用不是通常容量的软盘,例如有非标准扇区数的软盘,或自动检测由于某种原因失败或适当的设备文件丢失。

  Linux除了所有标准的,还能处理许多非标准的软盘格式。这有时需要特殊的格式化程序。我们现在先跳过这些软盘格式,同时你可以查看/etc/fdprm 文件。它定义了setfdprm 识别的设定。

  操作系统必须知道软驱何时换了软盘,例如,以免使用上一张软盘的cache数据。不幸的是,当用于此的信号线断了或不好时,当在MSDOS中使用时,这并不总有效。如果你曾遇到过软驱的这种怪异的问题,可能是这个原因。解决这个问题的唯一方法是修理软驱。

CD-ROM

  CD-ROM驱动器使用一个光学可读的塑料涂布的盘片。信息记录在盘片表面 的从中心的边沿的螺旋型小坑上。驱动器发出一束激光来读盘。当激光射到小坑上,激光以一种方式反射;当它射到光滑表面上,它以另一种方式反射。这很容易地 编码成bit,组成信息。其他很容易,不过是机械。

  CD-ROM驱动器比硬盘慢。典型的硬盘的平均寻道(seek)时间小于15毫秒,而快速的CD-ROM驱动器要花零点几秒。实际数据传输率则相当 快,在数百KB/s。速度慢使CDROM驱动器不能代替硬盘使用 (有些Linux distributions提供"live" CD-ROM文件系统,使之不必拷贝文件到硬盘,使安装简单并节约了许多硬盘空间),虽然是可能的。要安装新软件,CD-ROM很好,因为在安装时速度并 非最重要的。

  有多种方法在CDROM上安排数据。最流行的是国际标准化组织定义的ISO9660。这个标准定义了一个最小的文件系统,甚至比MSDOS更粗糙。这样,由于它是这么小,所有操作系统都可以将它映射到自己的系统。

  不同UNIX不能使用ISO9660文件系统,因此开发了对这个标准的一个增强,叫Rock Ridge增强。 Rock Ridge允许长文件名、符号连接和许多其他优点,使CD-ROM更象UNIX文件系统。同时,Rock Ridge文件系统仍然是一个有效的ISO9660文件系统,使非UNIX一样可以使用。 Linux同时支持ISO9660和Rock Ridge增强,增强被自动识别和使用。

  文件系统只是一部分,许多CD-ROM包含的数据需要特定的程序存取,而多数程序不能运行在Linux下 (当然,可能运行在Linux的MSDOS仿真器dosemu下)。

  CD-ROM驱动器通过相关的设备文件存取。有多种方法将CDROM连接到计算机:SCSI、声卡或EIDE。要完成这的硬件hacking工作超出了本书的范围,但连接方法决定了设备文件。指导见[Anv]

磁带

  磁带驱动器使用磁带,类似 音乐用的盒带。磁带是串行的,即如果要得到给定部分的数据,必须经过所有部分。磁盘可以随机存取,即可以直接跳到磁盘上的某个部分。串行存取的磁带当然慢了。

  另外一方面,磁带相当便宜,因为无须快速。也容易做得很长,因此可以容纳大量的数据。这使磁带很适于如归档、备份等无须高速的、但需要低成本和大容量的事情。

格式化

  格式化在磁介质上写用于标记磁道和扇区的标志的过程。磁盘格式化前,其磁表面是完成的一块。格式化后,混沌变为秩序,建立的磁道,划分了扇区。实际细节并非准确地这样,但重要的是:磁盘不经过格式化是不能使用的。

  这里术语有些模糊:MS-DOS中,格式化(format)这个词还包括了产生文件系统的过程(下面将讨论的)。这两个过程经常一起使用,尤其是软 盘。当必须区分时,真正的格式化被称为低级格式化low-level formatting,而建立文件系统被成为高级格式化high-level formatting。在UNIX圈中,这两者叫格式画format和建立文件系统make a filesystem,本书中也这样称。

  IDE硬盘和一些SCSI硬盘实际上厂商已经做了格式化,并无须重复;因为多数人无须关心它。实际上,格式化硬盘可能反而不好,比如因为硬盘可能需要用特定的方法格式化使坏扇区被自动替换。

  磁盘经常需要特定的程序来格式化,因为驱动器的格式化逻辑的接口每个驱动器都不一样。格式化程序经常在控制器BIOS上,或用MSDOS程序提供,这都不太容易在Linux中使用。

  格式化中可能会发现磁盘的坏点,叫坏块bad blocks or bad sectors。这有时由驱动器自己处理。但有时,如果坏块太多,需要一些工作来避免使用磁盘的这部分。 The logic to do this is built into the filesystem; 下面将说明如何增加这些信息到文件系统。另外,产生一个只覆盖这些坏的部分的小分区也是一个办法。如果坏区较大,这可能是个好办法,因为文件系统有时难以 处理大量的坏区。

  软盘格式化使用fdformat 。软盘设备使用给定的参数,例如下面的命令在第一个软驱中格式化一张高密度3.5’软盘:

  $ fdformat /dev/fd0H1440
  Double-sided, 80 tracks, 18 sec/track. Total capacity 1440 kB.
  Formatting ... done
  Verifying ... done
  $

  注意,如果想使用自动检测设备(如/dev/fd0 ), 必须用先setfdprm 设定参数。要得到与上面一样的结果,可以这样:

  $ setfdprm /dev/fd0 1440/1440
  $ fdformat /dev/fd0
  Double-sided, 80 tracks, 18 sec/track. Total capacity 1440 kB.
  Formatting ... done
  Verifying ... done
  $

  选择与软盘类型相符的正确的设备文件通常更方便。注意,比软盘设计格式化更多的信息容量是没有意义的。

  fdformat 也将验证软盘,例如检查坏块。它在坏块试验几次(你通常能听到,驱动器的噪声很明显)。 If the floppy is only marginally bad (due to dirt on the read/write head, some errors are false signals), fdformat 可能没事,而真正的错误可能退出有效过程。核心把发现的每个I/O错误打印log信息,送到控制台,或者,如果使用了syslog ,也送到/usr/adm/messages 文件。fdformat 自己不说明哪里出错(也不必考虑,软盘很便宜,坏了就扔)。

  $ fdformat /dev/fd0H1440
  Double-sided, 80 tracks, 18 sec/track. Total capacity 1440 kB.
  Formatting ... done
  Verifying ... read: Unknown error
  $

  badblocks 命令可用于查找任何磁盘或分区的坏块(包括软盘)。它不格式化磁盘,因此可以用于检查存在的文件系统。下面的例子检查出一张3.5’软盘上的2个坏块:

  $ badblocks /dev/fd0H1440 1440
  718
  719
  $

  badblocks 输出发现的坏块的块号。多数文件系统可以避免这样的坏块。他们维护一个已知的坏块列表,在文件系统建立时初始化,并可以在以后修改。初始的坏块查找可由 mkfs 命令完成(它初始化文件系统),以后可以用badblocks 来检查,新的块可以用fsck 加入。后面我们将说明mkfs 和fsck 。

  许多新型的硬盘自动发现坏块,并企图用一个特定的、保护的好块来代替它。这对操作系统是不可见的。这种特征应该在硬盘手册的文档中,如果你好奇的话。但即使这样的硬盘也可能失败,如果坏块数量太大的话,虽然如果这样,那硬盘就基本上不能用了。

分区

  一个硬盘可分为几个分区。每个分区好象是单独的硬盘。这样,你如果只有一个硬盘,却想安装2个操作系统,你可以把这个硬盘分为2个分区。每个操作系统 任意使用自己的分区而不干扰另一个。这种方法,2个操作系统可以在同一硬盘上和平共处。如果没有分区,你只能为每个操作系统购买一个硬盘。

  软盘不分区。这没有技术原因,只因为太小,没有必要。CDROM一般也不分区,因为作为一个大盘更易于使用,而且很少有多操作系统的需要。

MBR(主引导记录), 启动扇区和分区表

  一个硬盘如何分区的信息存在它的第一个扇区(即第一面第一道第一扇区)。这个第一扇区是硬盘的主引导记录(MBR);这是计算机启动时BIOS读入和 启动的扇区。主引导记录包括一段小程序,读入分区表,检查哪个分区是活动分区(即启动分区),并读入活动分区的第一个扇区:该分区的启动扇区(MBR也是 启动扇区,只不过因为其特殊地位,所以使用特殊的名字)。这个启动扇区包括另一个小程序,读入这个分区(假设是可启动的)上操作系统的第一个部分,然后启 动它。

  这个分区方案不是内置于硬件和BIOS的,只是许多操作系统遵循的约定。并非所有的操作系统都遵循这个约定,也有例外。有些操作系统支持分区,但他们 占领硬盘上的一个分区,然后使用他们自己的内部分区方法管理这个分区。较新的操作系统可以和其他操作系统和平共处(包括Linux),而无需特殊的措施, 但不支持分区的操作系统无法在同一硬盘上与其他操作系统共存。

  为安全预防,最好先在纸上写下分区表,这样在错误发生时不会丢失你的文件。(可以使用fdisk 修复坏的分区表)。 )相关信息可用fdisk -l 命令给出:

  $ fdisk -l /dev/hda

  Disk /dev/hda: 15 heads, 57 sectors, 790 cylinders
  Units = cylinders of 855 * 512 bytes

  Device Boot Begin Start End Blocks Id System
  /dev/hda1 1 1 24 10231+ 82 Linux swap
  /dev/hda2 25 25 48 10260 83 Linux native
  /dev/hda3 49 49 408 153900 83 Linux native
  /dev/hda4 409 409 790 163305 5 Extended
  /dev/hda5 409 409 744 143611+ 83 Linux native
  /dev/hda6 745 745 790 19636+ 83 Linux native
  $

扩展和逻辑分区

  PC硬盘的最初的分区方案只允许4个分区。实际使用中这太少了,比如有人想装多于4个操作系统 (Linux, MS-DOS, OS/2, Minix, FreeBSD, NetBSD, Windows/NT等),或有时一个操作系统有多个分区更好,例如由于速度的原因,Linux的对换区最好单独使用自己的分区,而不是在主 Linux分区中(下文详述)。

  为克服这个设计问题,发明了扩展分区。这个方法允许将基本分区分为若干子分区,因而被子分区的基本分区称为扩展分区,而子分区称为逻辑分区,他们的表现类似基本分区 ,但产生方法不同。他们之间没有速度差别。

  硬盘的分区结构可能类似。这个硬盘被分为3个基本分区,第二个被分为2个逻辑分区。部分硬盘根本没有分区。硬盘是一个整体,每个基本分区有一个启动扇区。

分区种类

  分区表(MBR和扩展分区里都有)中,对每个分区,有一个字节指出分区种类。这试图确定使用该分区的操作系统,或用于何操作系统。其目的是避免2个操 作系统使用同一分区。可实际上,操作系统并不真的注意分区种类字节;例如,Linux根本不管它是什么。较坏的情况是,有些操作系统错误地使用它:例如有 些版本的DR-DOS忽略了它的最高位(MSB),而其他一些系统则不是。

  没有一个标准化组织定义分区种类字节每个值的意义,但一些共同接受的值包括在表 4.1中。相同的列表可以通过Linux的fdisk 命令得到。

给硬盘分区

  有许多产生和删除分区的程序。许多操作系统自带,最好使用其自带的,除非要做一些它不能作到的。许多这种程序叫fdisk , 包括Linux, 或其变种。 Linux fdisk 的使用细节可见其Man手册。 cfdisk 命令类似fdisk , 但有更好的用户界面(全屏的)。

  使用IDE硬盘时,启动分区(带可启动核心映象文件的分区)必须全在前1024个柱面内。这是因为硬盘通过BIOS启动(在系统进入保护模式前),而 BIOS不能处理多于1024柱面。有时也可能使用部分在前1024柱面的启动分区,这要求所有用BIOS读入的文件都在前1024柱面内。由于这难与安 排,因此这是个很差的主意;你不可能知道什么时候核心升级或磁盘碎片整理会导致系统无法启动。因此,应该确认你的启动分区完全在前1024柱面内。

  事实上,一些新版的BIOS和IDE硬盘可以处理多于1024柱面。如果你有这样一个系统,你可以忘却这个问题;如果你不能确认,还是把启动分区放在前1024柱面内。

  每个分区拥有一块连续的扇区。因为Linux文件系统使用1 kB的块,即2个扇区,所以奇数个扇区会导致最后一个扇区不能使用,这不会有什么问题,但不好,有些版本的 fdisk 会对此给出警告。

  改变分区大小一般要求首先备分此分区想保留的所有东西(为防万一,最好备分整个硬盘),然后删除此分区,产生新分区,最后回存所有东西到新分区。如果是扩大分区,你可能需要调整相邻分区的大小(并备分、回存)。

  由于改变分区大小是如此痛苦,最好一次就确定。或拥有一个有效而易用的备分系统。如果你通过无须太多人工干预的介质安装(例如CDROM,而不是软盘),那么开始可以比较容易地玩玩各种设置。因为你无须备分什么数据,改几次分区大小不会太过痛苦。

  有个MSDOS的程序叫fips , 可以无须备分和回存地改变MSDOS分区的大小, 但对其他文件系统,备分回存还是必须的。

设备文件和分区

  每个分区和扩展分区有自己的设备文件。这些文件的命名规定是在整个盘的名字加分区号,并约定1-4是基本分区(不管真的有几个基本分区),5-8是逻 辑分区(不管它在哪个基本分区中)。例如,/dev/hda1 是第一个IDE硬盘的第一个基本分区,而/dev/sdb7 是第二个SCSI硬盘的第三个扩展分区。设备列表 [Anv]给出更详细的信息。

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