没那么神秘:Linux下生存实录(7) |
发布时间: 2012/9/8 15:14:07 |
四、系统(QQ:小默862693539)管理 linux系统(QQ:小默862693539)管理是很大一个领域,有专门的一群从业者靠此养家糊口,我无法在此进行详细讲解,仅以几类常规操作抛砖引玉。 1、数据备份。随着对电脑的依赖,我们多多少少积累了些重要资料,可以说这些资料是形成我们"个人能力"的主要来源,一旦丢失,多年的工作经验、生活点滴均将化为烟云,这是我们一笔无形的财富。硬盘老化、操作系统(QQ:小默862693539)异常、电脑遗失等等都会导致资料丢失,为避免损失,应该养成定期备份数据的习惯。 就我个人经验来看,数据备份要注意以下几点: 1)存放备份的介质。必须要有一块独立外置硬盘(500G移动硬盘外套硬盘盒)用于存放备份数据,而不是在电脑内置硬盘上的一个分区备份到另一个分区,否则即便有备份,一旦内置硬盘出问题,原始数据和备份数据都将挂掉; 2)内置硬盘的分区。电脑内置硬盘在分区规划时,应单独创建一个文件系统(QQ:小默862693539),专门用于存放需要定期备份的数据(这里的几个说法容易混淆,概念澄清下,外置硬盘中用于存放备份而来的分区不妨称之为backup分区,内置硬盘中用于存放我们重要资料的需要被定期备份出去的分区称之为data分区); 3)其他项: A)全备,每次将所有数据资料全量备份而非仅备有差异部分(非增备); B)两个快照,任何时候应保留上上次和上次的两个备份快照,完成本次备份后再删除上上次备份快照,避免备份过程出问题导致历史备份丢失; C)直备,保持数据资料完整目录结构,直接备份到外置硬盘的backup分区,说白了就是直接复制,不进行任何再加工; D)月备,数据备份的周期要视你具体数据量和数据更新频率而定,个人而言,100g的数据量,备份耗时差不多25分钟,我一般每月备份一次(小提示,将工作、生活上需要定期做的事项按不同执行周期分类梳理到一张电子表格中,不时看看,你会发现,原来我是那么井井有条--引至《爱我何需理由》,作者:自恋小王子(这是笔名,真名吴凤辉,嘎嘎嘎嘎~):-)。 在备份软件方面,无须其他特殊软件,只要有tar、bzip2、gzip、zip、unzip几个常见命令即可。下面依次以直接打包备份、打包压缩备份、打包压缩带进度备份三种方式,由浅入深介绍具体备份操作。 1)直接打包备份。为了保持目录结构,通过采用打包命令tar进行备份。比如,希望将/data目录备份到名为backup_120g的外置硬盘上,备份文件命名为data_backup.tar,那么完整命令及参数如下:
其中,-p表示完全保持/data目录下所有文件的文件属性,-cf表示需要创建一个备份文件且命名为backup.tar。 数据备份的时间点往往是我们最为关心的信息,所以习惯上备份文件名应该加上时间戳。linux的date命令能根据不同参数生成指定日期信息,完整的命令及参数如下:
其中,包裹命令date的"`"符号是tab键正上方、1键左边那个键,而非单引号。以指示shell优先执行整个命令行中该符号对包裹的命令(即,date +%m-%d)。 如果外置硬盘空间有限,/data中又包含部分不那么重要的数据(如,临时目录tmp,与windows虚拟机同享文件的目录share_folder),那么备份时可以将这些目录排除掉,通过tar的--exclude参数即可实现:
其中,--exclude参数语法非常特殊(其他命令中的该参数也是如此),注意几点:A)命令中的所有参数必须为绝对路径而非相对路径,且不能用~等等缩写字符;B)所有路径最后不能以"/"结尾。 2)打包压缩备份。如果排除了部分不重要数据后外置硬盘空间仍然紧张,可以考虑对打包文件进行压缩。linux上常见的压缩命令包括gzip和bzip2,由于两者采用的不同压缩算法,导致前者压缩率较低但速度较快,后者压缩率较高但速度慢,但相关用法差不多,请按需择优选用(本例以gzip为例,若需bzip2则直接替换即可)。打包和压缩是两个独立操作,写两条命令多麻烦啊!不用,借助linux强大的管道和重定向机制,可以在一条命令中以非常自然的方式实现:
别被这些奇怪符号吓着,管道符("|")用于实现"打包一点压缩一点",重定向符(">")用于实现"压缩一点写一点到备份文件中",这样,串起来就是"不停打包、不停压缩、不停写文件"的流水作业,理解了吧!其中,上个命令中-cf后面跟的是备份文件名,本命令中改为"-",就在告诉shell说,"先别急着写文件,你(shell)把我(tar)刚生成的数据流传递给后面负责压缩的兄弟(gzip),它知道该写哪个文件,谢谢哈~"。说明两点,A)你是否注意到备份文件的扩展名为".tar.gz",不仅本例,涉及linux主题的网站提供的下载几乎都采用这种命名方式,这叫命名约定,通常来说,如果仅打包不压缩则扩展名为".tar",如果打包且采用gzip压缩则扩展名为".tar.gz",如果打包且采用bzip2压缩则扩展名为".tar.bz"或".tar.bz2";B)其实tar命令使用--gzip和--bzip2参数可以直接实现打包压缩,无须像上例,采用管道和重定向来实现,但,为精确显示整个备份进度率,必须采用这种变通方式,请接着看。 3)打包压缩带进度备份。要显示备份进度,必须得事前知道待备份数据(/data)的大小,可通过du命令实现:
其中,-s表示计算/data整个目录包括子目录下所有文件的大小总和,-k表示计算结果以k为单位(或者m、g、t等)显示,单位的精度越高,在计算百分比进度时就越精确。 待备份目录大小知道了,如何计算进度?上面介绍过,打包、压缩、写文件都在借助管道传递数据流,如果能查看到管道中已经传递的数据量大小,用此大小除以总大小不就能显示出当前备份进度了么?噹噹噹哒~,pv就可以,顾名思义pv就是pipe viewer,明白了吧,管道查看器,它是监测管道数据的超级武器,没事多用用、系统(QQ:小默862693539)更健康。
其中,xxx部分请用前面du命令输出结果(待备份目录/data总大小),并手工添加单位k。效果如下: (可视化备份进度) 好了,到此包括打包、压缩、排除不重要目录、打时间戳、显示进度等特性在内的linux常规备份操作就介绍完了,一条命令啰哩吧嗦说了一大堆,看来的确是老了(小吴,好好干,路还长)。内容是多了点,一次没看明白就多看几次,其实也不复杂,我们一起看看简化模型吧(啰嗦的平方就是在下,谢谢,:O)。
有备份就有恢复,相对备份操作而言,恢复就太简单了。仍用tar命令,参数不同而言:
其中,-x表示执行解压解包操作,采用哪种解压算法由tar自行侦测后决定,-v表示显示以及解压出的文件列表,-f表示该参数后面紧跟的就是待解压的文件名,-C表示该参数后面紧跟是解压后的文件存放路径。 这次真的说完了,没想到我对朴实的tar如此动情,不知不觉谈了这么多关于她的点滴。在介绍她的同时,我也再次品味到了unix(linux的大哥)哲学——分工明确、各司其职、齐心协作。(tar哭着说,你娶我是想更接近我哥)。 2、碎片整理。要理解碎片,必须先了解硬盘基本结构和硬盘读写机制两个概念。之后,再看看不同操作系统(QQ:小默862693539)写文件的策略,你自然会明白碎片在linux下是啥东东。 硬盘基本结构。硬盘内部是由多张磁片和一个机械臂组成,磁片上最小单位是扇区,一旦硬盘停止工作后(如,关机),机械臂将复位到第一个扇区处。对于扇区而言,不论写入数据有多小,一旦占用了某个扇区后,其他数据就不能再写入通过扇区,即便该扇区还有空余空间(这就是为什么我们说一个大文件要比拆分为多个小文件的合计要小一些的原因)。每次读或写操作之前,机械臂先移动寻找到要访问的扇区,这个过程称之为“寻址”,由于机械臂移动是个物理动作,如果读写操作老是在不同扇区间不停移来移去,势必会增长读写操作耗时。 硬盘读写机制。我们为每个扇区编个号,最开始的是0号扇区、接着是1号、然后2号、以此类推,任何操作系统(QQ:小默862693539)都会尝试尽量将文件写入靠前的扇区,若已被占用则尝试下个扇区,直到找到空闲扇区,这样,理想情况下,整个硬盘应该是先用完靠前的空间。 了解了基础概念后,我们假定有A、B、C三个文件,依次连续占据0~3号扇区、4~7号扇区、8~9号扇区,如下图所示: (碎片:初始状态) 这时,用户编辑了文件B,增加了大量内容,导致文件B体积增大了2个扇区的大小,windows写文件时采用的策略——“可以接受两地分居”,即,将增加部分内容写入最靠前空闲的10号和11号两个扇区,如下图所示: (windows写文件策略) 以后,一旦用户需要访问文件B,系统(QQ:小默862693539)先寻找到4号扇区,将4~7号扇区读入内存,再寻找到10号扇区,将10~11号扇区读入内存,最后将这6个扇区合并供用户使用。设想一下,刚装好系统(QQ:小默862693539)时硬盘上有5000个文件,其中1000个在后来系统(QQ:小默862693539)使用过程中被人为或程序调整过大小,那么这1000个文件个个都被截成几段,这就形成了“碎片”,文件越多、文件写入次数越多,产生的碎片就越多。 linux写文件采用的是与windows恰好相反的另一个策略——“分开就不是家庭”,即,将文件B后面紧挨着的文件C向后移动两个扇区,移动后文件C就从先前的8~9号扇区变成10~11号扇区,8~9号扇区空出来用于存放文件B增大的部分,如下图所示: (linux写文件策略) 显然,按linux的策略,无论硬盘中有多少文件、写入多少次,系统(QQ:小默862693539)永远不可能产生碎片。再回到前面的问题,linux碎片整理代表什么?代表没事找抽~~ 有童鞋问,每次我写完文件要保持时,系统(QQ:小默862693539)都要移动那个文件后面的所有文件,岂不是更慢?移动是肯定的,但linux也不会那么弱智,至少有三种辅助手段缓解这个问题:A)数据搬迁不一定在我们编辑完文件后立马执行(即便已经关闭了文件),系统(QQ:小默862693539)会结合CPU、内存、IO等资源使用情况,综合判断何时搬迁,以减少大规模移动数据对用户带来的不好感知;B)linux会记录下经常被更改的文件,在适当时候将这些文件后面紧跟的文件向后移动,以腾出空间让这些频繁更改的文件在下次体积增大时可以直接使用连续扇区;C)系统(QQ:小默862693539)采用dd命令在底层进行数据搬迁,效率不是cp等辈可触及的。linux通过这三种方式,既实现了消除碎片,又让用户对整个过程感知最小化。 其实,我们可以算本帐。windows是"今朝有酒今朝醉",即,这种方式在写文件的当下感觉是最直接,但后续每次访问这个文件都要不同移动机械臂;而linux是"今天的短暂拥堵是为了明天长久的通畅"(引至成都BRT建设宣传语),即,在写文件当下是要慢些,但后续每次访问就会一致性读入。两种方式,随着文件数目的增加,个人觉得后者更优! 本文出自:亿恩科技【www.enkj.com】 |