(017) Linux之存储介质

十年运维系列之基础篇 - Linux

作者:曾林 

联系:1494445739@qq.com

网站:www.jplatformx.com

版权:文章未经同意请勿转载


一、引言

      前面的章节我们主要讨论了文件级别的数据处理,本章我们将会讨论设备级别的数据处理。对于诸如硬盘之类的物理存储器、网络存储器以及像RAID(独立冗余磁盘阵列)和LVM(逻辑卷管理)之类的虚拟存储器,Linux都具有惊人的处理能力。

      然而,本小节并不是以介绍系统管理为主,所以这里并不打算深入探讨这个主题,只是简单介绍其基本概念以及用于管理存储设备的一些重要命令。

 

二、挂载、卸载存储设备

      Linux图形界面操作最近所取得的进展已使得图形界面操作用户能非常容易地管理存储设备。多数情况下,设备只要连接上系统就能运行。但是,过去,这必须依靠手动操作。由于像服务器这类的非图形界面操作系统通常都有一些极致的存储需求和复杂的配置需求,所以在这类系统中管理存储设备很大程度上还是依靠手动操作。

      管理存储设备首先要做的就是将该设备添加到文件系统树中,从而允许操作系统可以操作该设备,这个过程称之为挂载。类Unix操作系统,与Linux类似,都只有一个文件系统树,设备则需要连接到不同点上。这就是与其他操作系统诸如MS-DOS、Windows等不同,它们对于每个设备都有独立的树(如C:\、D:\等)。

      /etc/fstab文件内容中列出了系统启动时挂载的设备(通常是硬盘分区)。下图展示的是某个centos系统上/etc/fstab文件的内容。

      此文件中列出的文件系统多数是虚拟的,不适用于当前的讨论。第一项内容,才是我们所要关注的重点内容。

      这一行内容其实指的是硬盘分区,文件中每一行含6个字段,如下表所示:

字段 内容 描述
1  设备  通常,该字段表示的是与物理设备相关的设备文件的真实名称,比如/dev/hda1就代表第一个IDE通道上的主设备的第一个分区。但是如今的计算机都有很多可热插拔的设备(像USB驱动器),所以许多较新的Linux发行版用文本标签来关联设备。当设备与系统关联后,该标签(格式化后就会加到存储介质中)就会被操作系统识别。通过这样的方式,不管实际的物理设备被分配到哪个设备文件,它仍然能被正确识别。
挂载节点   设备附加到文件系统树上的目录
文件系统类型  Linux可以挂载很多文件系统类型,最常见的原始文件系统类型是ext3,但也支持许多其他系统如fat16、fat32、ntfs、cd-rom(iso9660)等。 
选项  文件系统挂载时可以使用许多选项参数,比如,可以设置文件系统以只读的方式挂载或是阻止任何程序修改它们(对于可移动设备是一个很有用的维护安全性的方法) 
频率  此数值被dump命令用来决定是否对该文件系统进行备份以及多久备份一次 
优先级  此数值被fsck命令用来决定在启动时需要被扫描的文件系统的顺序 

 

三、查看已经挂载的文件系统列表

      mount命令用于文件系统挂载。不带任何参数输入该命令将会调用目前已经挂载的文件系统列表。

      列表的格式是:device on mount_point type filesystem_type(options)。

      例如上面的第一行表示/dev/hda1设备挂载在根目录下面,可读写(后面的参数选项是rw),属于ext3类型。

      针对许多现代Linux发行版一样,此系统在CD-ROM插入后会自动进行挂载。但是在不能自动挂载的情况下,此时就需要手工进行挂载了。接下来,我们为光盘创建一个新的挂载节点。挂载节点仅仅是文件系统上的某个目录,并没有什么特别之处,甚至都不需要是个空目录,尽管如果在非空目录上挂载设备,该目录下原有内容将不可见直到此设备被卸载。作为演示,这里我们来创建一个新目录:

      shell> mkdir /mnt/cdrom

      然后,将光盘设备挂载在此目录下面,使用如下的命令,注意-t选项来指定文件系统类型。

shell> mount -t iso9660 /dev/cdrom /mnt/cdrom

这样就可以将光盘设备挂载在目录/mnt/cdrom下了,之后,便可以通过新建的挂载节点访问CD光盘的内容:

shell> cd /mnt/cdrom; ls

请注意,如果此时将光盘设备卸载就会出现如下的如下的错误:

umount: /mnt/cdrom: device is busy

      为什么出现此问题呢?因为设备正在被某人或是某程序使用时是不能被卸载的。本例中的工作目录正好是CD光盘的挂载节点,所以导致了“设备繁忙”的错误警告。只要我们将工作目录改到挂载节点以外的地方就可以轻松解决。

      shell> cd; umount /mnt/cdrom

      如此这样就可以卸载光盘设备了。

      注意:不要在umount之前就直接取下设备。因为umount非常重要。free命令会输出关于存储器使用情况的一些数据。buffer(缓存)就包括在其中。计算机系统是以运行得尽可能快为原则设计的,阻碍计算机运行速度的一大因素就是低速设备。打印机则是一个典型的低速设备,从计算机的角度来看,即便是最快的打印机也已经是极其慢了。如果计算机必须停下来等待打印机完成一页的打印,那么计算机肯定会运行地相当慢。计算机出现的早期,也就是还没有能够进行多任务处理的时期,这的确是个问题。每次打印电子表格或文本文档时计算机就必须停止工作。计算机以打印机能够接受的最快速度向打印机传送数据,但是由于打印的速度很慢所以数据传送也很慢。打印缓冲区的问世,解决了数据传输慢的问题。打印缓冲区是存在于计算机与打印机之间的RAM存储器设备,有了打印缓冲区,计算机就可以将准备发送给打印机的数据先发送给缓冲区,这个过程可以进行的很快因为RAM的存储速度很快,从而计算机能尽快返回去处理其他进程而不是停下来等待。与此同时,打印缓冲区再慢慢地以打印机能接受的速度从缓冲区存储中向打印机传送数据。

      为了提升计算机的运行速度,缓冲区思想在计算机中得到了广泛应用。从向较慢设备偶然性的读/写数据不再会妨碍系统的运行速度,操作系统会将那些已经从存储设备读取或是准备向存储设备写入的数据一直储存在内存中,直到这些数据确实需要与较慢设备发生交互。以Linux系统为例,它似乎总是试图填满其内存,但这并不意味着Linux会用尽所有的存储器,只能说Linux正充分利用其可利用的一切内存进行尽可能多的缓存操作。

      由于缓冲区的存在,向物理设备的写入操作被推迟到了未来某个时间,所以能快速向存储设备写入数据。与此同时,准备写入设备的数据不断向缓冲区堆积,而操作系统则不时地将这些数据写入物理设备。

      卸载设备(umount)能确保缓存中的所有剩余数据全部写入设备,从而设备能被安全移除。如果设备事先没有卸载就将其移除,那么缓存中就可能仍有剩余数据。有些情况下,这些未传输完的数据可能包含重要的目录更新信息,而这些信息会导致文件系统损坏,这时情况就糟透了。

 

四、确定设备名称

      在Linux系统中,设备文件的存放路径在/dev下面。我们使用命令ls具体查看一下dev目录下的设备文件信息。具体下图所示:

      ls命令输出的表单内容揭示了设备命名的一些固定模式,下表列出了一部分:

模式 设备
/dev/fd* 软盘驱动器
/dev/hd* 较旧系统上的IDE硬盘
/dev/lp* 打印机设备
/dev/sd* SCSI硬盘。在最近的Linux系统上,内核把所有的类硬盘设备(包括PATA/SATA硬盘、闪存、USB海量存储设备比如便携式音乐播放器或数码相机等)都当做SCSI硬盘。剩下的命名规则与上面所讲的/dev/hd*的命名规则类似
 /dev/sr* 光驱(CD/DV播放器和刻录机)

      另外,我们经常看到像/dev/cdrom、/dev/dvd、/dev/floopy这样的符号链接,它们都是指向实际设备文件的,使用符号链接只是为了使用上的方便。

      如果使用的linux系统不能自动挂载可移动设备,那么可以通过下面介绍的方法来命名插入系统的可移动设备。首先,对/var/log/messages文件进行实时查看。具体的做法是当文件信息不再滚动的时候,插入可移动设备。例如此时在USB口插入闪存,稍等一下就可以看到,内核检测并捕捉到了此设备,然后可能就会输入如下的信息:

Jul 23 10:07:59 linuxbox kernel: sdb: sdb1

Jul 23 10:07:59 linuxbox kernel: sd 3:0:0:0: [sdb] Attached SCSI removable disk

Jul 23 10:07:59 linuxbox kernel: sd 3:0:0:0: Attached scsi generic sg3 type 0

      信息显示完成,按下ctrl+c回到命令提示界面。查看输出信息,可以看到很多地方提到了[sdb],这正好与SCSI类型的硬盘设备名相匹配。了解了这些信息,就会自然会额外注意上面的信息。上面的信息告诉我们该设备名已经被识别为/dev/sdb,/dev/sdb1指的是此设备的第一个分区。

      注意:tail -f /var/log/messages命令行是用来进行实时系统监测的好办法。

 

五、创建新的文件系统

      这里所说的创建新的文件系统本质上就是格式化磁盘。下面将讲述一个格式化闪存驱动器的例子。由于在使用过程中闪存中的所有内容都将被擦除,所以最好准备一个不含任何重要文件的驱动器。一般创建新的文件系统通常含有两步。第一:将设备分区;第二:创建新的空文件系统。

  1. 用fdisk命令对存储设备进行分区

      fdisk命令实现用户与磁盘设备(比如硬驱和闪存)进行较低层次的直接交互。该工具可以用来编辑、删除以及创建设备分区。这里需要注意的是,使用fdisk命令指定设备时,设备名要是整个设备,而不是分区号。也就是说要分区的是比如/dev/hda,而不是/dev/hda1。命令如下:

shell> fdisk /dev/hda

执行结果如下图:

      首先查看现有磁盘分区布局,可以通过输入字母p打印显示设备的分区表:

     

      上图中有一个域非常重要,那就是Id域。这个域是分区的系统系统Id,可以通过上图中的l选项来列出已知的分区类型。比如是“b”(表示Win95 FAT32)等。

      从上图中可以看到system Id如果为“b”的话,就代表分区为win95 fat32格式的。而如果System Id为83的话,那就代表Linux本地分区。如果想修改分区的类型,只需要选择“t”选项。如下图所示:

      从上图可知,已经将分区的系统类型修改为W95 FAT32了,此时System Id就是“b”,而不是Linux的83了。

      如果不打算对设备做任何改动,此时只需要输入“q”选择不保存退出fdisk设备分区程序即可。

 

2. 用mkfs命令创建新的文件系统

      分区编辑已经完成了,我们便可以在存储设备上创建新的文件系统。mkfs(make filesystem的缩写)命令可以用来创建各种类型的文件系统,例如我们要在设备上创建ext3文件系统,那就在想要格式化分区的设备名前面使用-t参数选项指明创建的文件类型是ext3类型。命令如下:

      shell> mkfs -t ext3 /dev/xvdb1

执行结果如下图:

 

六、测试、修复文件系统

      前面在讨论/etc/fstab文件的时候,我们会看到每一行的末尾有许多神秘的数字。系统每次启动时,挂载文件系统前都会惯性地检查文件系统的完整性,此检查过程是由fsck(filesystem check的缩写)程序完成的,fstab文件每个条目最末尾的数字正是对应设备的检查优先级,如果最末尾数字为0则表示设备不需要执行惯例性检查。

      除了检查文件系统的完整性外,fsck还能修复损坏的文件系统,修复程度取决于损坏程度。对于类UNIX文件系统,已修复的文件会存放在文件系统根目录下的lost+found目录中。

      下面的命令用来检查某设备存储。(存储事先应该首先被卸载)

      shell> fsck /dev/xvdb1

      执行结果如下图:

      一般情况下,除非出现像磁盘驱动器不能工作这样的硬件问题,不让文件系统损坏是非常少见的。多数程序,如果在启动期间检测到文件系统损坏,系统会自动停止加载并且引导你运行fsck程序。

 

七、直接从/向设备转移数据

      虽然,我们通常认为电脑上的数据都是以文件的形式存储的,但也有可能会认为数据以“原始”形式存储。以磁盘驱动器为例,它包含了许多被操作系统当作目录或文件的数据“块”。如果可以简单地把磁盘驱动器当作一个大数据块集,那么我们就可以执行一些有用任务,诸如克隆设备等。

      dd程序可以完成这样的任务,该命令将数据块从一个地方复制到另一个地方。由于历史原因,该命令使用句法比较独特,其格式如下:

      shellL> dd if=input_file of=output_file [bs=block_size [count=blocks]]

      假定现在有两个容量一样的U盘,并且我们希望将第一个U盘里面的内容准确完全地复制到第二个U盘里面。如果这两个盘都已经连接到电脑上,并且它们的设备名为/dev/sdb和设备/dev/sdc,那么我们就可以用下面的命令将第一个盘上的所有内容复制到第二个盘上。命令如下:

      shell> dd if=/dev/sdb of=/dev/sdc

      或者,如果只有第一个盘连接在电脑上,那么我们可以将其内容先复制到一个普通的文件里以备后续储存或复制。

      shell> dd if=/dev/sdb of=flash_driver.img

      警告:dd命令功能很强大。尽管该命令是由data definition两个单词缩写而来,但有时亦被称为“destroy disk”(摧毁磁盘),因为使用者经常会把if或是of后面指定的设备名输错。

      

八、创建CD-ROM映像

      向CD-ROM(CD-R或是CD-RW)写入数据包括两个步骤:首先,创建一个ISO映像文件,也就是CD-ROM文件系统映像;其次,将此映像文件写入到CD-ROM介质中。

  1. 创建一个CD-ROM文件镜像副本

      如果我们想给现有的CD-ROM创建一个ISO映像,可以使用dd命令将CD-ROM中所有数据块复制到本地某个文件。假定我们有一张Ubuntu的CD光盘,并打算创建一个ISO文件以便后续制作更多副本。CD光盘被插入且其设备名被确定后(假设是/dev/cdrom),我们便可以制作ISO文件。

      shell> dd if=/dev/cdrom of=Ubunto.iso

      2.  从文件集合中创建映像文件 

      上面是从CD-ROM通过dd命令来直接生成映像iso文件。但是通常情况下,我们都是从一堆文件组合中来生成一个iso映像文件的。具体做法就是通过mkisofs命令。此程序通常用于创建包含一个目录内容的ISO映像文件。首先我们创建一个目录,该目录包含了所有我们希望加进映像文件里的文件,然后运行mkisofs程序创建映像文件。例如,假使事先我们已经创建了一个叫做~/cd-rom-files的文件目录,并且该目录中包含了所有准备装入CD-ROM中的文件,那么接下来,我们就可以用mkisofs命令创建一个ISO映像文件。示例如下:

      shell> mkisofs -o cd-rom.iso ~/cd-rom-files

 

九、向CD-ROM写入映像文件

      映像文件创建好后,下一步便是将其刻录进光学介质中。下面我们所讨论的大部分命令都适用于CD-ROM和DVD介质。

  1. 直接挂在ISO镜像文件

      当ISO映像文件仍在磁盘上时,我们可以把它当做已存在于光学介质中,并且有一个窍门可以实现该镜像文件的挂载。那就是通过-o loop选项来挂载(与-t iso9660文件系统类型参数一起使用),如此便可以把映像文件当做设备一样挂载到文件系统树上了。命令如下图所示:

      shell> mkdir /mnt/iso

shell> mount -t iso9660 -o loop /mnt/iso

命令执行结果如下图:

      在上面的例子中,我们创建了一个叫做/mnt/iso挂载点并将jpx.iso映像文件挂载在该节点上。当映像文件挂载成功后,就可以把它当做真实的CD-ROM或DVD。记住,当不再需要该映像文件的时候要将其卸载。

      2. 写入镜像文件

      当用mkisofs命令创建iso文件之后,可以使用命令cdrecord命令来将镜像文件写入到刻录盘。命令如下:

      shell> cdrecord dev=dev_name(例如/dev/cdrom) ISO文件(例如music.iso)

 

posted @ 2015-03-04 11:33  jplatformx  阅读(700)  评论(0编辑  收藏  举报