公司有台服务器,搬家搬过来搬过去的,现在都搞不清楚是谁负责的机器。白白放置了一个多月,期间也发过公告,也没同事响应。单用户进入系统之后,发现里面都是很老的数据,但是又不确定是否有用,也不敢乱来。so, 把硬盘的数据全部拷贝出来,免得白白浪费资源。
方案1:
直接复制整个硬盘,非常底层的数据复制,包括 boot loader 和分区表在内的所有数据都能完整的复制。不过目标盘的容量不能比源盘的容量低,否则文件系统容易悲剧(强烈建议:最好两块硬盘是同一容量和同一型号,否则比较麻烦。)。而且这种方式需要拷贝整个硬盘,即使你什么文件也没写,速度也很慢。
dd 命令可以复制单块硬盘:
# dd if=/dev/sda of=/dev/sdb & ddpid=$!
可以在另一个终端向 dd进程发送 USR1 信号, 查看当前进度
# kill -USR1 $ddpid
也可以同时复制到多块硬盘
# dd if=/dev/sda | tee >(dd of=/dev/sdb) >(dd of=/dev/sdc) >(dd of=/dev/sdd) > /dev/null
另外还有 G4L, CloneZilla这样的工具也可以进行全盘复制。
方案2:
1、挂载硬盘,添加分区
第一步:添加硬盘/新建分区(fdisk)
第二步:格式化分区(mkfs.ext4)
第三步:加载分区(mount)
1、第一步:添加硬盘/新建分区(fdisk)
a、查看当前系统所有硬盘及分区情况:fdisk -l
b、在指定的硬盘(例:/dev/sda)上创建分区:fdisk /dev/sdb , 根据提示进行下一步操作,如:查看帮助(h),新建分区(n),删除分区(d),查看分区情况(p)
c、分区成功后,写分区表并退出(w)
注:fdisk 支持硬盘最大尺寸为 2TB,更详细说明请参看 Linux 在线手册(man fdisk)或百度一下。
2、第二步:格式化分区(mkfs.ext4)
对新建分区(例:/dev/sda1)进行格式化:mkfs.ext4 /dev/sdb1 。
3、第三步:加载分区
a、创建分区挂接目录,例:mkdir /disk-cache-1 和 mkdir /disk-cache-2
b、编辑 /etc/fstab 配置文件,将分区信息写进去。
c、加载新建分区:mount -a
2、复制文件系统根目录,注意要排除目标盘 mount 的目录和系统自己 mount 的目录(可以用 mount -l 查看,比如/proc,/sys 这些目录)
# su - root # cd / # tar -cvpzf /mnt/backup.tgz --exclude=/proc --exclude=/sys --exclude=/lost+found --exclude=/mnt --exclude=/media --exclude=/var/tmp / 或者 # tar c --exclude=/proc/* --exclude=$EXCLUDE_DIR / | (cd /mnt/sdb2; tar x)
c – 新建一个备份文档
v – 详细模式, tar程序将在屏幕上实时输出所有信息。
p – 保存许可,并应用到所有文件。
z – 采用‘gzip’压缩备份文件,以减小备份文件体积。
f – 说明备份文件存放的路径, /mnt/backup.tgz 是本例子中备份文件名。这个备份文件备份的位置是其它分区,也就是原来的WIN分区中。来看看我们想要包含的目录,我们不想备份所有的东西,因为有些目录是没有多大用处的。确认你不想包含的文件,否则您会得到一个很奇怪的结果。您也不必备份/mnt 目录下的东西,除非您有其他分区挂在它下面或者你坚持要备份。您还必须确保没有任何资源挂在 /media目录下(比如,任何CD或者移动存储介质),否则,剔除/media。
最后一个参数是我们想要保存的目录. 我们想要保存所有的东西,使用 / 作为根目录。
3、还原的方法:请注意,可能会覆盖您原有的数据,下面的操作必须小心。。
# tar -xvpzf /mnt/backup.tgz -C /
参数x是告诉tar程序解压缩备份文件。 -C 参数是指定tar程序解压缩到的目录。
如果要把系统也搬过去,那么情况稍微复杂一点。
用fdisk 对新硬盘进行分区,然后通过 mkfs.ext4 / mkswap 创建好文件系统和 swap分区,然后把分区 mount挂载到系统上。
修改 /etc/fstab,现在的linux系统基本都是通过 UUID 而不是 /dev/sdc1这样的方式来进行挂载的,所以要修改成新硬盘相应分区的UUID。
安装 boot loader
一开始我们以为直接用 dd 复制源硬盘 MBR 的前 446 字节(启动代码部分)过去就可以了,但启动发现连 grub 菜单都进不去。
其实 grub 启动包含了两个阶段的代码,第一阶段代码是在 MBR 里的,第二阶段在文件系统上,那么 grub 如何从第一阶段跳转到第二阶段呢?它是把第二阶段代码所在的磁盘扇区位置记录在 MBR 中 [1]。而这份代码在每块硬盘上的位置肯定是不一样的,于是 grub 没办法跳转到第二阶段继续执行。
所以我们得重新安装 boot loader:
# grub-install --root-directory=/mnt/sdb2
这里 --root-directory 是告诉 grub 说我们的根文件系统是在 sdb2 上而不是源硬盘上。
方案3:
可以试试 rsync 第一次全同步相当于复制 以后只同步修改过的文件。(我没有试过)