注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

瘋人院

lunatic asylum

 
 
 

日志

 
 

tar命令备份还原linux操作系统  

2009-09-16 16:35:39|  分类: 操作系統 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

tar命令备份还原linux操作系统

刘汉长

好多linux用户都希望能够把自己配置好的系统做个备份,因为重装,配置一个自己顺手的系统往往需要耗费大量的时间和精力。在系统出现非常严重的问题,或者想把此系统直接“拿”到其他同样配置的电脑上去时,如果有一个属于自己的系统备份,只需将其还原,这样可以大大提高我们的效率。前一阵子成功实现了利用tar命令的备份和还原,将自己本上的ubuntu7.04克隆到了朋友的一台同样配置的T40上。因此在此浅谈一下linux操作系统的备份还原,和操作过程中所遇到的问题以及其原因和解决方法。为了进一步验证,我又通过此方法在 fedora core7ubuntu7.04redhat9上测试,结果都顺利通过了还原备份。相信在其他版本的 linux os 上也能够发挥作用。以下是在 fc7 ubuntu7.04环境上的测试举例。

 

自己用的是老本小黑IBM T40,首先列出分区列表:

root@jackie-laptop:/home/jackie# fdisk  -l

Disk /dev/sda: 40.0 GB, 40007761920 bytes

240 heads, 63 sectors/track, 5168 cylinders

Units = cylinders of 15120 * 512 = 7741440 bytes

   Device Boot      Start         End      Blocks   Id  System

/dev/sda1   *           1         711     5375128+   7  HPFS/NTFS

/dev/sda2             712        2101    10508400    c  W95 FAT32 (LBA)

/dev/sda3            2102        2796     5254200    c  W95 FAT32 (LBA)

/dev/sda4            2797        5167    17924760    f  W95 Ext'd (LBA)

/dev/sda5            2797        3630     6305008+  83  Linux

/dev/sda6            3631        4603     7355848+  83  Linux

/dev/sda7            4604        4742     1050808+  82  Linux swap / Solaris

/dev/sda8            4743        5167     3212968+   b  W95 FAT32 (LBA)

注意:1。由于在ubuntu7.04fc7下,自己的IDE硬盘被操作系统认成了设备sd*

      2sda1,sda2,sda3这三个主分区分别为windowsCDE盘。sda4为扩展分区,在扩展分区内包含四个分区,sda5ubuntu7.04的根分区,sda6fc7的根分区,两者的/boot都在各自的根分区之内,sda7为公用的交换分区。sda8linuxwindows的公用分区。

 

一、备份

备份大体分为在其他linux操作系统(包括live cdrescue模式)上备份和在本linux操作系统上备份两种不同的方式。以下来进行一一介绍。

 

1.在其它linux发行版本(自己的fc7)下备份ubuntu

首先在fedora core7下挂载ubuntu分区到/media/ubuntu目录下

#mount -o iocharset=utf8,rw /dev/sda5 /media/ubuntu

然后备份ubuntu的全部内容,备份保存成/home/jackie/ubuntu.tar.gz

# tar -cvzpf /home/jackie/ubuntu.tar.gz /media/ubuntu

 

2.ubuntu7.04下直接打包备份

#tar   -cvzpf   /home/jackie/ubuntu.tar.gz   --exclude=/proc   --exclude=/lost+found

--exclude=/mnt --exclude=/sys --exclude=/media --exclude=/home/jackie/ubuntu.tar.gz /

参数解释:

c - 新建一个备份文档

v - 详细模式, tar程序将在屏幕上实时输出所有信息

p - 保存许可,并应用到所有文件

z - 调用gzip压缩,以减小备份文件体积(如果想追求更高的压缩,改用 j参数,调用bz2,此时打包压缩成.tar.bz2格式)

f - 要打包备份生成的文件名,/home/jackie/ubuntu.tar.gz 是本例子中备份文件名。

--exclude=   - 剔除目录

最後一个参数是我们想要打包备份的目录。

 

注意问题:

1.使用root身份执行命令。

2.要有足够的空间存放生成的备份文件,否则还没tar完就会报错空间不足。 

3.我自己在用tar备份结束的最后,出现了这个现象,“tar:由于先前错误的耽搁而存在错误”,还好这对我们是没有影响的,可以忽略它。也并不是所有的备份过程都会出现此情况。

4.ubuntu操作系统下打包ubuntu本身时不要忘记踢出自己本身,否则的话,可能就一直备份下去了。

 

二、还原

当然系统A的备份要在系统B上进行还原啦。本例是在fc7下还原ubuntu7.04的备份。 先挂载备份文件将被释放到的分区(之前最好格式化一下,以确保没有其他数据),本例是原来ubuntu所在的分区,当然完全可以是笔记本上的其他分区。

#mount /dev/sda5 /media/ubuntu

之后将备份解压到已挂载的分区。

#tar -xvpzf /home/jackie/ubuntu.tar.gz -C /media/ubuntu

参数解释:

x - 告诉tar程序解压缩备份文件

-C - 参数是指定tar程序解压缩到的目录

注意问题:

   1.如果采用自身备份,剔除/proc,/lost+found,/sys,/mnt,/media目录的方式打包,还原

后需要手动建立这些目录。

这些目录的相关权限:

dr-xr-xr-x 127 root root     0 2008-12-12 20:04 proc

drwxr-xr-x   2 root root  4096 2007-04-12 17:11 mnt

drwxr-xr-x  10 root root  4096 2008-12-12 12:04 media

drwxr-xr-x   2 root root 16384 2008-06-18 02:36 lost+found

drwxr-xr-x  11 root root     0 2008-12-12 20:04 sys

    2.解压后确认被还原的ubuntu文件系统/目录处于sda5分区根下,而不是被其他文件夹当作子文件夹。否则在进入ubuntu7.04时,由于其/目录不在sda5的根上,会出现找不到根目录文件的现象。

     3.当自己在fc7下还原ubuntu7.04之后,列出了ubuntu/dev的设备文件,在fc7下竟然发现ubuntu/dev下的设备文件是不完整的,像sda1hda1等等这样的设备文件都不存在,原来这部分文件在被打包时根本没有打包上,备份的包中根本没有这些文件。赶紧找一下原因,仔细一想,原来内核使用的udev或者devfs会在开机时自动建立/dev下的设备特殊文件。的确是这样的,当我们重新开机进入ubuntu之后,会发现这些文件已经建立好了。

 

三、后续工作

    一、特别注意:

1.如果操作系统的/boot分区为单独分区,备份时只备份了/目录(当然此时备份的tar包中不包含/boot分区的内容)。将备份恢复到原来的分区后可以正常使用。如将备份恢复到其他分区,需要相应的调整grub

2.如果备份的/分区包含/boot,需要重装grub才能进入还原后的系统。

     为何要重装grub呢?让我们一起了解一下grub的工作过程,来解开这个疑问。

GRUB引导分为stage1stage2两个部分。如果安装GRUBMBR当中,则stage1直接写入了 MBR,这样机器一启动就将控制权交给了 GRUB的代码。如果GRUB安装在BR当中,则需要有另外一个OS loader读入BR当中的stage1后才能把控制权交给GRUB。接下来的步骤是stage1找到stage2并将控制权交给stage2。这里有两种方式,一种是直接方式,stage1根据记载的stage2所在硬盘的位置直接将stage2找到;另一种是间接方式,这需要stage1_5也就是通常说的stage1.5,如果使用stage1.5,则该文件实际是嵌入到BR/MBR之后的若干扇区内的,通过stage1.5对文件系统的分析,通过路径方式找到stage2

如果我们备份的linux操作系统包含/boot目录,当备份被还原到硬盘的时候,原来位于引导扇区的数据就会发生改变。因此会加载grub失败。通常开机出现错误,只留下一个有关grub的提示。此时重装grub就是一个解决的办法。

 

下面我们一起来简单看以下重装grub的方法。

如开机出现:错误提示为 grub error 22,或者 grub loading stage1.5 grub loading

please wait...等等~~ Error ...可通过以下方法重装grub来解决。

 

1、进入liveCD打开终端,或者用redhat9等安装盘进入终端,切换为超级用户。再或者制作dos启动盘,并且放入grub4dos程序,利用其重装grub。(grub4dos在网上可以下载到。如何建立启动盘和进入目录再此就不提了)。

2、输入grub

3、输入roothdxy

其中x表示第x1块硬盘;y表示第y个分区(扩展分区不算)。这一条命令是指定你的/boot分区位置,如果/boot没有单独分区,那么就是你的/分区。按下tab键会出现当前分区表中磁盘格式和位置信息。如果有多个linux版本同时存在的话,要注意你所要重装的grub所在的分区。

4、输入setuphdx 如果想将grub写入第一快硬盘的mbr的话使用“(hd0)”如果想将grub写入linux根分区的话,则在逗号后加个数字,如(hd04)。

6、出现成功修复的提示后,quit退出,重启。

   

二、特别注意:

      grub grub 项或/boot/grub/memu.lst文件,系统挂载密切相关的/etc/fstab文件最好也相应的改一下。

因为以上三者中有用LABELUUID以及sd*这些字样来表示磁盘分区的语句,有时候将备份还原到分区,但此分区并不是以前我们备份的那个分区,分区大小、位置已改变等等原因,以前的分区参数可能与现在的分区参数不同。为此,相应的修改是必须的。

   下面让我们一起通过了解menu.lstfstab中的labeluuid,来解决还原后可能遇到的有关系统分区改变而引起的问题。

UUID,全称Universally Unique Identifier

   它是一个128位,16字节的值,并确保在时间和空间上唯一。它把硬件地址、时间以及随机数结合在一下起来确保其唯一性的。

Ubuntu现在默认使用UUID值表示硬盘分区,例如在笔者的ubuntu7.04中,/etc/fstab下我们很容易看到ubuntu所在分区sda5UUID值:

# /dev/sda5

UUID=790879f3-abbd-4048-836a-eb61237a6ea6 / ext3 defaults,errors=remount-ro 0 1

不仅在fstab中,在GRUB启动项中也会发现有UUID的身影:

kernel /boot/vmlinuz-2.6.20-14-generic root=UUID=790879f3-abbd-4048-836a-

eb61237a6ea6 ro quiet splash locale=zh_CN

   与以前使用sd*相比,使用UUID的好处是只要分区大小没有调整,它的UUID值就是固定的,也就是说不管其他分区怎样,也不影响这一分区的挂载。但如果分区改变了,例如有时侯需要调整分区大小,这样它的UUID值也就发生了变化,此时需要在 menu.lst中和/etc/fstab中将该分区的UUID值修改为当前值或者直接改为sd*这种形式,否则系统无法启动,分区无法挂载。

   对于还原来说,不同的分区拥有不同的UUID和标识,如果将sda5的备份还原到sda8上也必须调整,这个毋庸置疑。

查询分区UUID值可以使用下面的命令:ls -al /dev/disk/by-uuid

结果是如下的形式:

lrwxrwxrwx   1   root   root     10   2008-12-11   06:32   790879f3-abbd-4048-836a-eb61237a6ea6 -> ../../sda5

label  磁盘分区卷标

   在有些版本的linux中,通常使用LABEl表示分区。但有的时候也造成了一定的麻烦。

通常在fstab里面我们会发现linux系统在安装过程中选择挂载的分区用的都是 LABEL=xxxx的方式,而我们自己手动添加的则是采用/dev/sd*的方式,比如笔者的fedora core7fstab如下:

LABEL=/                 /                       ext3    defaults        1 1

LABEL=HOME              /home                   vfat    defaults        0 0

LABEL=SWAP-sda7 swap    swap    defaults     0 0

grub :       kernel   /boot/vmlinuz-2.6.21-1.3194.fc7   ro

root=LABEL=/ rhgb quiet

   label方式来挂载的话,如果磁盘分区发生变动使得原来的/dev/sda8(我的/home)变成了/

dev/sda9,那么使用 label方式来挂载的话对系统不会有任何影响。但是这样做的缺点也很明显:label很容易通过一些软件来修改,这样的话反而会造成不稳定因素,不如用/dev/sd*的方式来得好。

 

   可以通过编辑磁盘分区卷标 LABEL的方式来解决系统用LABEL挂载产生的问题,跟据不同的磁盘分区类型,分别有3个程序可供选用。

Mtools 适用于 FAT32 格式分区;

ntfsprogs 适用于 NTFS 格式分区;

e2label适用于 ext2 ext3 型格式分区。

在此我只拿ext3格式为例,mkfs.ext3是隶属于e2fsprogs软件包的,而e2fsprogs包中还有一个程序e2label,专门用于修改文件系统的label

使用起来很简单,执行命令:e2label device newlabel

但更改分区卷标后我们必须卸下此设备,会在重启电脑后发现相应分区卷标已经改变。

 

    、还原后的注意小结

还原后,由于分区原因而出现系统问题的解决

    如果采用LABEL或者UUID来表示分区,或改变还原的位置(如 sda5的备份还原到sda8上)。还原linux后可能会出现以下问题。

couldn't find matching filesystem: LABLE=/home   [failed]

unable to access resume device LABEL=swap-sda7

或者fsck.ext3:unable to resolve LABLE=/

再或mkrootdev:/ not found    mount:error 2 mounting none

 

总之是一些因为 LABELUUID,分区改动而引起的/,/boot,/home   mounting 不上,

fsck.ext3:unable to resolve的问题。

       方法是更改 menu.lst 这个文件,将 LABEL 改为真正的根分区硬件设备。如把  kernel /boot/vmlinuz ro root=LABEL=/或者root=UUID=****  改为  root=/dev/sd*

接下来再更改fstab文件,将挂载点改为真正的硬件设备。如把/etc/fstab里的LABLE=/或者

UUID****修改为/dev/sd*(值根据我们自己的实际情况)

 

最后总结

   首先进行备份,此过程只需遵循以上注意即可。

   有必要进行还原操作时,还原备份到分区。

如果开机出现grub引导问题,就按照以上方法重装grubmenu.lstfstab也需要确认一下是否与所在的分区对应,如有出入,进行调整。

    好了,这里我只大体介绍了一种简单的linux操作系统的备份还原方法,希望以上介绍能对读者

们有所启发和帮助。谢谢!

  评论这张
 
阅读(525)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017