写了一个备份和恢复 ubuntu 的 script,请各位指正。

sh/bash/dash/ksh/zsh等Shell脚本
billbear
帖子: 3681
注册时间: 2008-05-03 23:42

写了一个备份和恢复 ubuntu 的 script,请各位指正。

#1

帖子 billbear » 2009-02-19 1:44

修改得差不多了。


---------------------------
2009.5.25 新版本在这里: viewtopic.php?f=21&t=206287
这个老版本还留着吧,也能用,存个底。老版本能做而新版本不能做的事情是强行安装到分区表有问题的硬盘上... 有时候需要这么做 :em06
附件
ubackup.en.zip
英文版
(4.31 KiB) 已下载 289 次
ubackup.zh.zip
中文版
(4.71 KiB) 已下载 470 次
上次由 billbear 在 2009-05-26 20:29,总共编辑 5 次。
billbear
帖子: 3681
注册时间: 2008-05-03 23:42

Re: 写了一个备份和恢复 ubuntu 的 script,请各位指正。

#2

帖子 billbear » 2009-02-19 2:30

根据 ptptptptptpt 提供的思路写的。
思路来源: viewtopic.php?f=63&t=168786
开端和一些讨论: viewtopic.php?f=103&t=172336

需要安装 lupin-casper 和 squashfs-tools。
解开 ubackup.zip

sudo sh /路径/ubackup -b
备份当前系统为 squashfs 。可以选择备份存放位置。可以存放到移动硬盘。默认最多支持如下复杂度的分区规划:
/ /boot /home /tmp /usr /var /srv /opt /usr/local
更复杂的分区规划可以自行修改函数 rebuildtree() 和 destroytree()
不会备份移动介质。不会备份你手动挂载的设备。不会备份 windows 分区。不会备份 /proc /sys /lost+found。不会备份 /dev 下部分不是文件的文件。不会备份你的 swapfile。
该 squashfs 可以直接单独启动,可以在另一台机器上恢复。在生成的 menu.lst 里有如何直接启动 squashfs 的说明。

从 squashfs 启动后,首先自己用 gparted 或 parted 准备目标分区们,格式化分区们,在 /target 按你的规划挂载除 swap 外的分区们 - 如
sudo mkdir /target
sudo mount /dev/sda5 /target
sudo mkdir /target/home
sudo mount /dev/sda6 /target/home
...
分区可以随意规划,不必关心原系统是如何规划。可以把 windows 分区也挂载到某个位置,fstab 里会生成 windows 分区的自动挂载
接着,
sudo sh /ubackup -r
(在备份的时候已经自动把这个脚本放到 squashfs 的根,不论当时你是从何处运行此脚本)
回答几个问题,基本只要回车就好
然后脚本恢复你的备份,自动生成 fstab, 安装 grub, 如果没有 swap 分区, 可以选择为你做一个 swap file。
在虚拟机 8.10 上测试的。
上次由 billbear 在 2009-05-25 22:02,总共编辑 3 次。
头像
ptptptptptpt
帖子: 3711
注册时间: 2006-09-19 18:16

Re: 写了一个备份和恢复 ubuntu 的 script,请各位指正。

#3

帖子 ptptptptptpt » 2009-02-19 10:31

顶下先。待我装个精简 ubuntu 再来测试,否则太费时间了 :em04
billbear
帖子: 3681
注册时间: 2008-05-03 23:42

Re: 写了一个备份和恢复 ubuntu 的 script,请各位指正。

#6

帖子 billbear » 2009-02-24 0:42

新版本上传。
头像
solcomo
帖子: 2838
注册时间: 2007-04-25 13:12

Re: 写了一个备份和恢复 ubuntu 的 script,请各位指正。

#7

帖子 solcomo » 2009-02-24 0:58

支持比尔熊 :em11
♜♞♝♛♚♝♞♜
♟♟♟♟♟♟♟♟
♙♙♙♙♙♙♙♙
♖♘♗♕♔♗♘♖

☠☯⚔⚓☣☦☃☕
☹☻☪☭☬⚖⚛⚜
ℜℳℬ™ ℋℯℓ℘ ℳℭ
sƂɐʍ рǀɹoʍ əɥʇ oS
头像
ptptptptptpt
帖子: 3711
注册时间: 2006-09-19 18:16

Re: 写了一个备份和恢复 ubuntu 的 script,请各位指正。

#8

帖子 ptptptptptpt » 2009-02-24 23:27

简单试了下中文版,备份 8.10,工作正常。可以从备份的映像启动。

脚本写的很专业 :em11
billbear
帖子: 3681
注册时间: 2008-05-03 23:42

Re: 写了一个备份和恢复 ubuntu 的 script,请各位指正。

#9

帖子 billbear » 2009-02-25 22:24

补充说明:

ext4 的挂载选项还没有写进去,因为我没有试过 9.04。

备份的时候如果不选择备份存放的位置,会在根目录下生成一个随机数目录(实际上就是 uuid )来存放。
如果选择存放的位置(比如想直接存放到移动硬盘),必须先建立一个空目录,然后在脚本询问的时候回答自建目录的绝对路径,回答时可以直接从 nautilus 拖放。自建的空目录名字可以使用中文和空格,但是我不确定你使用对 shell 有特殊含义的怪字符会怎么样。
备份文件本身是可启动的(只读的,不能保存变更),存放在移动硬盘再配合 grub4dos 即可成为一个移动的 ubuntu 系统,可以拿它做维护工具,或者到处给别的机器安装你配好的 ubuntu。

恢复的时候先自行规划分区。如果需要格式化目标分区,建议使用 parted 或 gparted。如果单纯使用 mkfs 来格式化为另一种FS(比如从 fat 到 ext3),在 fdisk 的时候看不到分区的变化(还显示 fat,不过好像也能用)。我看了一下 gparted 的工作过程,也是先设分区 id,再 mkfs 的。
然后在一个地方组织你的目标分区们。最好使用 /target,这样运行脚本的时候就只要回车了。
恢复的时候会询问 grub stage1 的安装位置,如果想安装到第一块硬盘的 mbr,需要输入 sda,不回答则默认安装到目标 ubuntu 的 / 或 /boot 分区,不改写 mbr。以后你可以用 grub4dos 或任何你可以想到的办法来引导。
之后会询问 squashfs 备份文件的位置,通常不需要回答。

可以用这个工具来备份和恢复自己的机器,也可以把配好的 ubuntu 保存下来,迁移到另一台机器。比如可以把在虚拟机里试用满意的 ubuntu 迁移到真机,或者把 wubi 安装的系统迁移到真 linux 分区上。

能读懂英文的就用英文版吧。如果在纯终端下使用这个脚本,中文可能会无法显示。
头像
ptptptptptpt
帖子: 3711
注册时间: 2006-09-19 18:16

Re: 写了一个备份和恢复 ubuntu 的 script,请各位指正。

#10

帖子 ptptptptptpt » 2009-03-02 9:39

getmountoptions() 中
"/ reiserfs" ) echo relatime;;

"/boot reiserfs" ) echo notail,relatime;;
这里似乎有点问题:假如 /boot 没有单独分区,对 "/ reiserfs" 是不是应该 echo notail,relatime ?
头像
ptptptptptpt
帖子: 3711
注册时间: 2006-09-19 18:16

Re: 写了一个备份和恢复 ubuntu 的 script,请各位指正。

#11

帖子 ptptptptptpt » 2009-03-02 12:07

billbear 写了:恢复的时候先自行规划分区。如果需要格式化目标分区,建议使用 parted 或 gparted。如果单纯使用 mkfs 来格式化为另一种FS(比如从 fat 到 ext3),在 fdisk 的时候看不到分区的变化(还显示 fat,不过好像也能用)。
今天改克隆脚本出了 bug ,却无意中发现,用 mkfs 格式化为另一种FS后,再 fdisk -l ,可以显示出变化。

用的是 8.04
billbear
帖子: 3681
注册时间: 2008-05-03 23:42

Re: 写了一个备份和恢复 ubuntu 的 script,请各位指正。

#12

帖子 billbear » 2009-03-02 20:43

ptptptptptpt 写了:getmountoptions() 中
"/ reiserfs" ) echo relatime;;

"/boot reiserfs" ) echo notail,relatime;;
这里似乎有点问题:假如 /boot 没有单独分区,对 "/ reiserfs" 是不是应该 echo notail,relatime ?
厄,说实话,我是在虚拟机里按 / /boot /home /tmp /usr /var /srv /opt /usr/local 这几个分区分别全部用 ext2 ext3 reiserfs jfs xfs 装了 5 遍 8.10 取得 5 个 fstab,我以为这就算全面了。我不知道当 /boot 没有单分的时候还会影响到 / 的挂载选项。要是这么挨个测试的话我会晕过去... 挂载选项真是个讨厌的东西,我一直也没全弄清楚,好像 07 年的 ubuntu fstab 挂载选项和 08 年的还不一样 ... 看来不能自己瞎试验,应该读安装程序的源代码,看看它是怎么处理的。哪里有安装程序的源代码?
ptptptptptpt 写了:
billbear 写了:恢复的时候先自行规划分区。如果需要格式化目标分区,建议使用 parted 或 gparted。如果单纯使用 mkfs 来格式化为另一种FS(比如从 fat 到 ext3),在 fdisk 的时候看不到分区的变化(还显示 fat,不过好像也能用)。
今天改克隆脚本出了 bug ,却无意中发现,用 mkfs 格式化为另一种FS后,再 fdisk -l ,可以显示出变化。

用的是 8.04
8.10 如何? 难道这又是 8.10 的毛病? :em20

把其他问题也写一下,免得忘了。算个 TODO list,将来一并修改:
1.在虚拟机 wubi 8.10 测试的时候,第二次追加文件到已有的 squashfs 会失败,不知是什么原因。使得备份 wubi 系统生成的 squashfs 根下面没有恢复脚本。不过备份文件本身似乎没有问题,恢复到分区可以实现 wubi 系统向正规分区系统的转化,之后升级内核也没有发现异常。

2.恢复过程的提醒声音应该在恢复基本完成,询问是否需要交换文件之前发出 :) 恢复完成提示用户自行卸载目标分区。

3. pt,那个 eth0 到底在哪里?
头像
ptptptptptpt
帖子: 3711
注册时间: 2006-09-19 18:16

Re: 写了一个备份和恢复 ubuntu 的 script,请各位指正。

#13

帖子 ptptptptptpt » 2009-03-02 22:30

billbear 写了:厄,说实话,我是在虚拟机里按 / /boot /home /tmp /usr /var /srv /opt /usr/local 这几个分区分别全部用 ext2 ext3 reiserfs jfs xfs 装了 5 遍 8.10 取得 5 个 fstab,我以为这就算全面了。我不知道当 /boot 没有单分的时候还会影响到 / 的挂载选项。要是这么挨个测试的话我会晕过去... 挂载选项真是个讨厌的东西,我一直也没全弄清楚,好像 07 年的 ubuntu fstab 挂载选项和 08 年的还不一样 ... 看来不能自己瞎试验,应该读安装程序的源代码,看看它是怎么处理的。哪里有安装程序的源代码?
god ,原来是这样搞的啊。。。我还以为你看了安装程序的源码。ubiquity 的源码可以用 apt-source 来获取。

的确,我印象中不同版本的 ubuntu 挂载选项确实有变化。而且,以后还可能变。所以我在 ubuntu-cloner 只设了两种 fs(ext3 和 reiserfs )供选择
回复