使用 dd 命令实现 SAN 存储的快照数据迁移

IBMdW 发布于 2011/11/12 18:51
阅读 1K+
收藏 5

简介: 在实验室环境,如何对现有数据做一个快照备份,如何快速将数据迁移到新的存储系统? dd 命令可以实现数据的快照备份和数据迁移。在本文中,我们将分析 dd 命令的用法,以实现使用不同多路方式的 SANboot OS 的快照备份和数据迁移为例,演示 dd 命令如何实现数据的快照备份和数据迁移。

简介

随着 SAN 技术的发展,越来越多数据中心采用 SAN 存储来替代本地硬盘,数据和应用直接存放在 SAN 存储的硬盘,由存储端对数据统一管理。数据备份和数据迁移是存储系统的核心技术。随着企业业务不断发展,企业数据量成几何增长,数据迁移成为企业级信息系 统在面临存储空间不足、数据安全问题的重要解决方案。同构存储系统的数据迁移技术包括:基于磁盘阵列远程数据复制技术的数据迁移、基于主机操作系统逻辑卷 镜像技术的数据迁移、基于数据库备份和恢复技术的数据迁移、以及基于第三方工具的数据迁移。异构存储系统的数据迁移技术,涉及存储本身的特性是否支持迁 移,不支持数据迁移的异构存储系统,可以通过虚拟化存储产品,将异构存储产品虚拟化成一个存储池,用户直接访问存储池,在存储池中创建卷,部署企业级应 用,同时借助虚拟化存储产品自身的迁移技术实现数据迁移,目前 IBM 的虚拟化存储产品 SAN Volume Controller 支持多达 120 种第三方磁盘阵列。其实,如果只是想在测试或者开发环境下简单快速地实现数据的快照备份和迁移,你可以不用大费周折,dd 命令,它将会给你一个惊喜!

在本文中,我们将分析 dd 命令的用法,以实现使用不同多路方式的 SANboot OS 的快照备份和数据迁移为例,演示 dd 命令如何实现数据的快照备份和数据迁移。

dd 命令解析

dd 是 Linux/Unix 下的一个非常有用的命令,作用是将指定大小的输入文件(或设备文件)按 block 为单位拷贝到指定的输出文件(或设备文件)中,并在拷贝的同时进行指定的转换。

当不指定转换 conv 选项的时候,使用指定的输入和输出块大小来复制文件(默认是从标准输入到标准输出)。dd 每次从输入文件或设备文件读取指定大小的一个块(默认是 512 字节),如果使用 bs=bytes 选项,将把全部读到的数据写到独立的输出块,这个输出块的长度和读到的数据完全一样,除非指定使用 sync 选项转换。

其他情况下,输入的时候每次读一个块,然后处理,并将输出结果收集起来,最后写到指定大小的数据块中去,最终的输出块可能会比指定的大小短一些。

dd 命令 manual

dd 命令主要选项

if=FILE

指定输入文件的名称,缺省为标准输入。

of=FILE

指定输出文件的名称,缺省是标准输出。

bs=BYTES

指定输入输出块的大小,取代 ibs 和 obs 标志,由 bs 标志指定的块大小值必须始终是使用的媒介物理块大小的整数倍。

cbs=BYTES

指定由可变长度到固定长度和从固定长度到可变长度的转换块大小。

conv=CONVERSION[,CONVERSION]...

指定一个或多个转换选项。多个转换之间用逗号隔开。

count=BLOCKS

仅复制由 BLOCKS 变量指定的输入块的数量。

ibs=BYTES

指定输入块的大小;缺省为 512 字节。

obs=BYTES

指定输出块的大小;缺省为 512 字节。

seek=BLOCKS

在复制之前,从输出文件开头跳过 BLOCKS 值的块大小, 每块大小为 obs-byte 字节。

skip= BLOCKS

在开始复制之前跳过指定的 BLOCKS 值的输入块,每块大小为 ibs-byte 字节。

数字值选项 BLOCKS 和 BYTES 后面可以跟一个乘数:c =1, w =2, b =512, kB =1000, K =1024, MB =1000*1000, M =1024*1024, xM =M, GB =1000*1000*1000, G =1024*1024*1024 等等,同理可得 T, P, E, Z, Y。

常用 CONV 转换参数介绍

block

将变长记录转换到固定长度,长度由转换块大小(cbs)决定。对于换行用空格代替,必要时使用空格填充。

unblock

将固定长度的块转化为可变长度。长度由转换块大小(cbs)决定。该选项与 block 选项冲突。

lcase

将所有大写字符转换为小写字符。

nocreat

不创建输出文件;输出文件必须已经存在。

excl

如果输出文件已经存在则操作失败,该选项与 nocreat 选项冲突。

notrunc

不截取输出文件。

ucase

把所有小写字符转换为大写字符。

swab

交换每对输入字节。对于 GNU dd,如果读入的最后的字节数是奇数,则只是简单的复制到输出(因为没有能跟它交换的字节)。

noerror

发生错误时也不停止进程,继续进行。

sync

使用 zero 字节将每个输入块填充到 ibs 值指定的长度。如果指定 block 或者 unblock 选项,则以空格补齐。

fdatasync

在复制结束之前,同步输出数据。改选项将会做物理写入操作。

fsync

在复制结束之前,同步输出数据和元数据。改选项将会做物理写入操作。

dd 命令实例

数据备份与恢复

整盘数据备份与恢复

备份 :

1. 将本地的 /dev/sdx 整盘备份到 /dev/sdy;

 dd if=/dev/sdx of=/dev/sdy 

2. 将 /dev/sdx 全盘数据备份到指定路径的 image 文件;

 dd if=/dev/sdx of=/path/image 

3. 备份 /dev/sdx 全盘数据,并利用 gzip 工具进行压缩,保存到指定路径。

 dd if=/dev/sdx | gzip >/path/image.gz 

恢复 :

1. 将备份文件恢复到指定盘;

 dd if=/path/image of=/dev/sdx 

2. 将压缩的备份文件恢复到指定盘。

 gzip -dc /path/image.gz | dd of=/dev/sdx 

备份MBR

备份:

备份磁盘开始的 512Byte 大小的 MBR 信息到指定文件;

 dd if=/dev/sdx of=/path/file count=1 bs=512 

恢复:

将备份的 MBR 信息写到磁盘开始部分。

 dd if=/path/file of=/dev/sdx 

备份软盘

1. 将软驱数据备份到当前目录的 disk.img 文件;

 dd if=/dev/fd0 of=disk.img count=1 bs=1440k 

2. 要使用 36 个 512 字节块来有效的实现向软盘的传输;

 dd if=filename of=/dev/fd0 bs=36b conv=sync 

该命令将 Filename参数的值一次一个柱面地写入到软盘设备。当从磁盘读入或者当文档的大小不是软盘块大小的整数倍时,需要 conv=sync 参数。

3. 将块大小为 720 字节的输入文件复制到软盘当中,请输入:

 dd if=testfile of=/dev/fd0 bs=720b conv=sync 

如果输入文件大于输出设备的物理大小,则 dd 命令将会提示您使用另外一个设备。

拷贝内存资料到硬盘

将内存里的数据拷贝到 root 目录下的 mem.bin 文件。

 dd if=/dev/mem of=/root/mem.bin bs=1024 

从光盘拷贝iso镜像

拷贝光盘数据到 root 文件夹下,并保存为 cdrom.iso 文件。

 dd if=/dev/cdrom of=/root/cdrom.iso 

创建 Swap 分区文件

1. 创建一个足够大的文件(此处以 256M 为例),数据必须是连续的;

 dd if=/dev/zero of=/swapfile bs=1024 count=262144 

2. 使用 mkswap 制作 swap;

 mkswap /swapfile 

3. 启用这个 swap 文 件;

 swapon /swapfile 

4. 设置每次开机的时候自动加载 swap 文 件 , 修改 /etc/fstab 文件。

 /swapfile swap swap defaults 0 0 

销毁磁盘数据

利用随机的数据填充硬盘:

 dd if=/dev/urandom of=/dev/hda1 

该方法可以用来销毁数据。执行此操作以后,/dev/hda1 将无法挂载,创建和拷贝操作。

磁盘管理

确定系统最佳的block 大小

通过比较 dd 指令输出中所显示的命令执行时间,即可确定系统最佳的 block 大小。

 dd if=/dev/zero bs=1024 count=1000000 of=/root/testfile 
 dd if=/dev/zero bs=2048 count=500000 of=/root/ testfile 
 dd if=/dev/zero bs=4096 count=250000 of=/root/ testfile 
 dd if=/dev/zero bs=8192 count=125000 of=/root/ testfile 

测试硬盘读写速度

通过两个命令输出的执行时间,可以计算出测试硬盘的读 / 写速度。

 dd if=/dev/zero of=/root/testfile bs=1024 count=1000000 
 dd if=/root/testfile bs=64k | dd of=/dev/null 

在深入了解 dd 命令的功能之后,我们知道 dd 命令可以实现整盘数据备份,无论源数据盘和目标盘是来自同一个存储的不同卷还是分别来自不同存储的卷,只要是主机端能够识别到的存储设备盘,dd 都可以把一个设备盘的数据全盘拷贝到另一个设备盘。

本文正是利用 dd 命令这一特性实现 SAN 存储的数据备份与迁移,以跨不同存储系统备份 SANBoot OS 为例,来实现操作系统的迁移,方便跨存储的操作系统的兼容性测试用户。

我们以 Redhat Enterprise Linux 5 update 5 平台为例,逐步展开介绍。由于不同的存储支持不同的多路方式,我们选取 DS8000 和 XIV 实现使用 DMMP 的 SANBoot OS 的快照数据备份和迁移,然后选取 DS4800 和 DS4700 实现使用 RDAC 的 SANBoot OS 的快照数据备份和迁移。

使用 DMMP 的 SANBoot OS 的快照数据备份和迁移

我们假定 Redhat Linux 5 u5 操作系统已经 SANBoot 安装在 XIV 的设备盘,具体安装步骤可以参考 IBM 官网介绍的 在多路径存储设备上部署 Redhat5 系统。选取 DS8000 创建备份存储盘,将操作系统快照备份到 DS8000 备份盘,实现操作系统从 XIV 到 DS8000 的数据迁移。

首先介绍配置策略:

1. 在 DS8000 上创建一个大于或者等于当前 XIV Sanboot OS 的卷,将这个卷映射给主机,这个卷将作为操作系统的备份盘;

2. 使用 dd 命令实现 XIV Sanboot OS 到 DS8000 的快照备份;

3. 将操作系统从 XIV 迁移到 DS8000,验证快照备份成功;

  • 修改备份盘上操作系统的启动配置文件,让启动设备指向备份盘;
  • 重启主机进入 HBA Utility,选择从备份盘启动,当操作系统从备份盘成功启动,操作系统已迁移到 DS8000,同时验证 dd 命令快照备份成功。

DS8000 上创建备份卷

该过程如下:

1. 在服务器上为 DS8000 准备一个区域;

2. 添加一个卷组;

3. 创建一个主机连接;

4. 为操作系统制作一个备份卷。

以下是这些步骤的细节:

在服务器上为 DS8000 准备一个区域

每条路径都需要一个区域,以便服务器 HBA 端口能够到达 DS8000 I/O 端口。如图 1 所示,您需要在 SAN1 上安置 hba1 和 controller 1 (DS8000 端口 1),在 SAN2 上安置 hba2 和 controller2 (DS8000 端口 2)。如果使用软区域,则如下所示:

区域 1:

50:05:07:63:03:00:00:68 (DS8000 端口 1 的 WWPN);

10:00:00:00:c9:93:54:3a (服务器 HBA 端口 1 的 WWPN)

区域 2:

50:05:07:63:03:10:80:68(DS8000 端口 2 的 WWPN);

10:00:00:00:c9:93:54:3b(服务器 HBA 端口 2 的 WWPN)


图 1.RAID 设备的多路径配置
图 1.RAID 设备的多路径配置

添加一个卷组

假设您的存储器管理员已经将 DS8000 分区并创建了一个块池(extent pool)。您可以通过 DSCLI 在 DS8000 上执行以下命令为服务器添加一个卷组:

 dscli>mkvolgrp -hosttype AMDLinuxRHEL myvolgrp 

在这里您将设置一个名为 myvolgrp 的卷组,主机类型为 AMDLinuxRHEL,该类型定义附加基于 AMD 的 Redhat Linux OS。

创建一个主机连接

使用主机连接将服务器的 HBA WWPN 映射到 DS8000 上一个专用卷组,以便服务器可以在专用卷组中访问所有卷。命令如下:

 dscli>mkhostconnect -wwname 10000000C993543A \ 
 -hosttype AMDLinuxRHEL -volgrp v50 myhost_p1 
 dscli>mkhostconnect -wwname 10000000C993543B \ 
 -hosttype AMDLinuxRHEL -volgrp v50 myhost_p2 

在这里,使用主机 HBA 卡两个端口的 WWPN 为服务器创建了两个主机连接,它连接到 DS8000 的 I/O 端口并将 ID 为 v50 的卷组 myvolgrp 映射到该主机连接。这使该服务器端口可以访问卷组 myvolgrp 中的所有卷。

为操作系统制作一个备份卷

您需要制作一个卷来备份操作系统数据。这个卷要大于或者等于 XIV SANBoot OS 的卷,我们之前在 XIV 创建了一个 68GB 的卷用于 SANBoot OS 的安装。所以接下来要在 DS8000 块池 p0 创建一个大小为 70GB 的卷 sanboot_os,并将其分配到卷组 v50。该卷用于 XIV SANBoot OS 的备份。

 dscli>mkfbvol -extpool p0 -cap 70 -volgrp v50 -name sanboot_os 1659 

现在已经创建好了备份存储卷,可以开始备份了。

dd 命令实现 SANBoot OS 从 XIV 到 DS8000 的快照备份

首先,查看一下主机端识别到的设备盘。从“multipath – ll”命令的输出看到一个 XIV 的设备盘,有 2 条路径 sdb 和 sdc,经过 DMMP 多路之后的设备名为 mpath0,这个盘就是当前的操作系统盘。这时系统还没有识别到刚才映射的 DS8000 的备份盘,需要从 IBM 官网下载 DMMP配置文件支持 DS8000,并且放到主机相应的目录 /etc/multipath.conf,通过“multipath – r”命令重新扫描新添加的 DMMP 设备盘。

 bash# multipath -ll 
 mpath0 (20017380000d420ef) dm-1 IBM,2810XIV 
 [size=64G][features=1 queue_if_no_path][hwhandler=0][rw] 
 \_ round-robin 0 [prio=1][active] 
 \_ 1:0:1:1 sdb 8:16  [active][ready] 
 \_ round-robin 0 [prio=1][enabled] 
 \_ 0:0:0:1 sdc 8:32  [active][ready] 
 bash# multipath – r 

再次查看当前的设备盘,我们看到新增的 mpath1 即是刚刚从 DS8000 映射到主机的备份盘。

 bash# multipath -ll 
 mpath1 (36005076303ffc0680000000000001659) dm-0 IBM,2107900 
 [size=70G][features=1 queue_if_no_path][hwhandler=0][rw] 
 \_ round-robin 0 [prio=2][active] 
 \_ 1:0:0:0 sda 8:0   [active][ready] 
 \_ 0:0:1:0 sdd 8:48  [active][ready] 
 mpath0 (20017380000d420ef) dm-1 IBM,2810XIV 
 [size=64G][features=1 queue_if_no_path][hwhandler=0][rw] 
 \_ round-robin 0 [prio=1][active] 
 \_ 1:0:1:1 sdb 8:16  [active][ready] 
 \_ round-robin 0 [prio=1][enabled] 
 \_ 0:0:0:1 sdc 8:32  [active][ready] 

现在我们可以开始用 dd 命令将 XIV 设备盘的操作系统数据完全备份到 DS8000 设备盘。

 bash# dd if=/dev/sda of=/dev/sdb 
 134217728+0 records in 
 134217728+0 records out 
 68719476736 bytes (69 GB) copied, 3670.95 seconds, 18.7 MB/s 

dd 命令备份结束之后需要重启系统,才会看到 mpath1 被创建了三个分区 mpath1p1、mpathp2 和 mpathp3,这三个分区分别对应于操作系统的 boot,root 和 swap:

 bash# ls -l /dev/mapper 
 total 0 
 crw------- 1 root root  10, 63 May 17 01:49 control 
 brw-rw---- 1 root disk 253,  1 May 17 01:49 mpath0 
 brw-rw---- 1 root disk 253,  5 May 17 01:49 mpath0p1 
 brw-rw---- 1 root disk 253,  6 May 17 01:49 mpath0p2 
 brw-rw---- 1 root disk 253,  7 May 17 01:49 mpath0p3 
 brw-rw---- 1 root disk 253,  0 May 17 01:49 mpath1 
 brw-rw---- 1 root disk 253,  2 May 17 01:49 mpath1p1 
 brw-rw---- 1 root disk 253,  3 May 17 01:49 mpath1p2 
 brw-rw---- 1 root disk 253,  4 May 17 01:49 mpath1p3 

dd 命令实现 SANBoot OS 的快照数据迁移

备份盘上面的操作系统的启动配置文件是指向 XIV 盘的,既然我们要把操作系统迁移到 DS8000,那么需要修改启动配置文件指向来自 DS8000 的备份盘 mpath1。和启动相关的有三个配置文件:

  • /etc/fstab;
  • /boot/grub/grub.conf;
  • 内存镜像解压后的 init 文件。

首先在根目录下创建新的挂载点 /ds8k_boot /ds8k_root,将 DS8000 的设备盘 mpath1 的 boot 分区和 root 分区挂载。

 bash# mkdir /ds8k_boot /ds8k_root 
 bash# mount /dev/mapper/mpath1p1 /ds8k_boot 
 bash# mount /dev/mapper/mpath1p2 /ds8k_root 

编辑 grub.conf

让 root 指向 mpath1 的根分区 /dev/mapper/mpath1p2。


清单 1. 修改 grub.conf
				
 bash#cd /ds8k_boot /grub/ 
 bash# vi grub.conf 
 # grub.conf generated by anaconda 
 # 
 # Note that you do not have to rerun grub after making changes to this file 
 # NOTICE:  You have a /boot partition.  This means that 
 #          all kernel and initrd paths are relative to /boot/, eg. 
 #          root (hd0,0) 
 #          kernel /vmlinuz-version ro root=/dev/mapper/mpath0p2 
 #          initrd /initrd-version.img 
 #boot=/dev/mapper/mpath0 
 default=0 
 timeout=5 
 splashimage=(hd0,0)/grub/splash.xpm.gz 
 hiddenmenu 
 title Red Hat Enterprise Linux Server (2.6.18-194.el5) 
        root (hd0,0) 
        kernel /vmlinuz-2.6.18-194.el5 ro root=/dev/mapper/mpath1p2 rhgb quiet 
        initrd /initrd-2.6.18-194.el5.img 

编辑 fstab

重新指定 boot 分区和 root 分区分别为 /dev/mapper/mpath1p1, /dev/mapper/mpath1p2,swap 分区为 /dev/mapper/mpath1p3。


清单 2. 修改 fstab
				
 bash# cd /ds8k_root/etc/ 
 bash# vi fstab 
 /dev/mapper/mpath1p2    /               ext3    defaults        1 1 
 /dev/mapper/mpath1p1    /boot          ext3    defaults        1 2 
 tmpfs                   /dev/shm          tmpfs   defaults        0 0 
 devpts                  /dev/pts          devpts  gid=5,mode=620  0 0 
 sysfs                   /sys               sysfs   defaults        0 0 
 proc                    /proc               proc    defaults        0 0 
 /dev/mapper/mpath1p3    swap             swap    defaults        0 0 

编辑内存镜像的 init 文件

先用 cp 命令备份 /ds8k_boot 目录下的内存镜像,然后解压备份盘中操作系统的内存镜像,这里我们创建一个目录 /sanboot,拷贝内存镜像放在 /sanboot 目录下,同时在 /sanboot 目录下再创建一个子目录 /sanboot/tmp/ 用于存放解压后的内存镜像文件;

 bash# cp /ds8k_boot/initrd-2.6.18-194.el5.img \ 
 /ds8k_boot/initrd-2.6.18-194.el5.img.bak 
 bash# mkdir /sanboot 
 bash# cd /sanboot/ 
 bash# cp /ds8k_boot/initrd-2.6.18-194.el5.img ./initrd.gz 
 bash# gunzip initrd.gz 
 bash# mkdir tmp 
 bash# cd tmp 
 bash# cpio – id < ../initrd 

解压好之后,先用 cp 命令将 init 文件备份为 init.bak,然后修改 init 文件,让 resume 指向 /dev/mapper/mapth1p3,root device 指向 /dev/mapper/mpath1p2,保存退出 init 文件。

 bash# cd /sanboot/tmp 
 bash# cp init init.bak 
 bash# vi init 
……
 echo Scanning and configuring dmraid supported devices 
 resume /dev/mapper/mpath1p3 
 echo Creating root device. 
 mkrootdev -t ext3 -o defaults,ro /dev/mapper/mpath1p2 
 echo Mounting root filesystem. 
 mount /sysroot 
 echo Setting up other filesystems. 
 setuproot 
 echo Switching to new root and running init. 
 Switchroot 

用新的内存镜像文件覆盖当前的内存镜像,新的内存镜像先命名为 newinitrd,压缩之后,用 cp 命令覆盖当前的内存镜像:

 bash# cd /sanboot/tmp 
 bash# find . | cpio – create – format= ’ newc ’ > /sanboot/newinitrd 
 bash# cd /sanboot 
 bash# gzip newinitrd 
 bash# cp newinitrd.gz /ds8k_boot/initrd-2.6.18-194.el5.img 

到这里备份盘操作系统的启动配置文件都修改好了,接下来可以重启机器进入 HBA Utility,更改启动设备为 DS8000 的盘。

HBA Utility 配置

在 XIV SANBoot 安装操作系统时候,本地盘已经被禁掉,并且 Boot Bios 都是开启的,所以只需要更改启动设备到 DS8000 的盘。

我将使用 Emulex HBA BIOS 设置作为示例。如果您使用其他供应商的 HBA,请参考相应文档获得正确的设置。

首先,您在服务器发布 Emulex 自检时需要按下 Ctrl-E 选择 Host Adapter 页面,如图 2 所示。


图 2. 选择 Host Adapter 界面
图 2. 选择 Host Adapter 界面

先选择其中一个 HBA 端口,按回车键进入配置页面,Boot BIOS 已经是 Enabled 状态,说明 Boot from SAN 已经开启,向下继续选择 Configure Boot Devices, 如图 3


图 3. 配置设置
图 3. 配置设置

按回车键进入启动设备界面如图 4,看到当前的启动设备是 WWPN 为 5001738000D40171 的存储设备的 LUN 01, 继续按回车键 ,


图 4. 当前启动设备
图 4. 当前启动设备

可以看出 WWPN 为 5001738000D40171 的 LUN 01 是 XIV LUN,是之前 SANBoot OS 安装盘,现在将启动设备更改为 DS8000 的 LUN,在图 5 的界面中,选中编号为 02 的 LUN,按照提示一步步操作至图 8。


图 5. 可选择的启动设备
图 5. 可选择的启动设备

图 6. 设置选定启动设备 LUN ID
图 6. 设置选定启动设备 LUN ID

图 7. 设置启动设备经由 WWPN 启动
图 7. 设置启动设备经由 WWPN 启动

选择经由 WWPN 启动设备,返回上一级菜单,现在图 8 看到首选启动设备变成 DS8000LUN。


图 8. 新的启动设备
图 8. 新的启动设备

同样操作重复在 HBA 的另一个端口。然后退出 HBA Utility, 重启机器。

当系统起来的时候,用 df 命令看到 DS8000 设备盘 mpath1 的所有文件系统都被挂载,说明操作系统已经成功的从 XIV 迁移到 DS8000,并且验证了 dd 命令快照备份成功。

 bash# df -h 
 Filesystem            Size  Used Avail Use% Mounted on 
 /dev/mapper/mpath1p2   39G  3.0G   34G   9% / 
 /dev/mapper/mpath1p1   99M   22M   72M  24% /boot 

使用 RDAC 的 SANBoot OS 的快照数据备份和迁移

我们假定目前的 Redhat Linux 5 u5 操作系统已经 SANBoot 安装在 DS4800 的设备盘,选取 DS4700 为备份存储盘,将操作系统快照备份到 DS4700 备份盘,同时实现操作系统从 DS4800 到 DS4700 的数据迁移

首先介绍配置策略:

1. 在 DS47000 上面创建一个大于或者等于当前 DS4800 Sanboot OS 的卷,将这个卷映射给主机,这个卷将作为操作系统的备份盘;

2. 使用 dd 命令实现 DS4800 Sanboot OS 到 DS4700 的快照备份;

3. 将操作系统从 DS4800 迁移到 DS4700,验证快照备份成功;

    • 修改备份盘上操作系统的启动配置文件,让启动设备指向备份盘;
    • 重启主机进入 HBA Utility,选择从备份盘启动,当操作系统从备份盘成功启动,操作系统已迁移到 DS4700,同时验证 dd 命令的快照备份成功。

DS4700 上创建备份卷

在创建操作系统的备份盘之前,先检查当前系统的状态。从 RDAC 命令“mppUtil – S“的输出看到主机发现一个两条路径的 DS4800 的 LUN,系统为这个 LUN 分配了一个设备名 /dev/sda,”df – h”命令看到它是操作系统所在的盘。


清单 3. df – h 命令查看操作系统所在的盘
				
 bash# mppUtil -S 
 H6C0T0       Active                     Active           ARCDS48K96122 
             H0C0T0L000  Up             H1C0T1L000  Up 
 bash# fdisk -l 

 Disk /dev/sda: 85.8 GB, 85899345920 bytes 
 255 heads, 63 sectors/track, 10443 cylinders 
 Units = cylinders of 16065 * 512 = 8225280 bytes 

   Device Boot      Start         End      Blocks   Id  System 
 /dev/sda1   *           1          13      104391   83  Linux 
 /dev/sda2              14        6540    52428127+  83  Linux 
 /dev/sda3            6541        7584     8385930   82  Linux swap / Solaris 
 bash# df -h 
 Filesystem            Size  Used Avail Use% Mounted on 
 /dev/sda2              49G  2.5G   44G   6% / 
 /dev/sda1              99M   25M   69M  27% /boot 
 tmpfs                 7.9G     0  7.9G   0% /dev/shm 

创建操作系统的备份卷的步骤和 DS8000上创建备份卷相同,这里不再重复介绍。通过 Storage Manager GUI,我们可以看到一个 85GB 的 DS4700 的 LUN 已经映射给当前的主机,如图 9。


图 9. Storage Manager GUI 显示映射给主机的 LUN
图 9. Storage Manager GUI 显示映射给主机的 LUN

使用 RDAC 的命令 mppButRescan 去扫描新的 LUN,可以看到新的 LUN 来自存储 DS4700 存储设备(ARCFT900A7382),主机为它分配一个设备文件名 /dev/sdb。


清单 4. RDAC 的命令 mppButRescan 扫描新的 LUN
				
 bash# mppBusRescan 
 scan qla4xxx HBA host /sys/class/scsi_host/host5... 
        no new device found 
 scan qla4xxx HBA host /sys/class/scsi_host/host4... 
        no new device found 
 scan lpfc HBA host /sys/class/scsi_host/host3... 
        no new device found 
 scan lpfc HBA host /sys/class/scsi_host/host2... 
        no new device found 
 scan lpfc HBA host /sys/class/scsi_host/host1... 
        found 1:0:2:0 
 scan lpfc HBA host /sys/class/scsi_host/host0... 
        found 0:0:2:0 
 scan iSCSI software initiator host /sys/class/scsi_host/host5... 
        no new device found 
 scan iSCSI software initiator host /sys/class/scsi_host/host4... 
        no new device found 
 run /usr/sbin/mppUtil -s busscan... 
 scan mpp virtual host /sys/class/scsi_host/host6... 
 bash# mppUtil -S 
 H6C0T0       Active                     Active           ARCDS48K96122 
 H0C0T0L000  Up             H1C0T1L000  Up                             
 H6C0T1       Active                     Active           ARCFT900A7382 
 H0C0T2L000  Up             H1C0T2L000  Up                             

   Missing Arrays 
 There are no missing arrays 
 bash# fdisk -l 

 Disk /dev/sda: 85.8 GB, 85899345920 bytes 
 255 heads, 63 sectors/track, 10443 cylinders 
 Units = cylinders of 16065 * 512 = 8225280 bytes 

   Device Boot      Start         End      Blocks   Id  System 
 /dev/sda1   *           1          13      104391   83  Linux 
 /dev/sda2              14        6540    52428127+  83  Linux 
 /dev/sda3            6541        7584     8385930   82  Linux swap / Solaris 
 Disk /dev/sdb: 91.2 GB, 91268055040 bytes 
 255 heads, 63 sectors/track, 11096 cylinders 
 Units = cylinders of 16065 * 512 = 8225280 bytes 

 Disk /dev/sdb doesn't contain a valid partition table 

dd 命令实现 SANBoot OS 从 DS4800 到 DS4700 的快照备份

现在可以开始使用 dd 命令将 DS4800 设备盘的操作系统数据完全备份到 DS4700 设备盘。这里 /dev/sda 是 DS4800 的设备盘,/dev/sdb 是 DS4700 的设备盘。

 bash# dd if=/dev/sda of=/dev/sdb 
 167772160+0 records in 
 167772160+0 records out 
 85899345920 bytes (86 GB) copied, 4948.59 seconds, 17.4 MB/s 

dd 命令备份结束之后需要重启系统,才会看到 /dev/sdb 有三个分区,这三个分区分别对应于操作系统的 root,boot 和 swap:

 bash# ls -l /dev/sdb* 
 brw-r----- 1 root disk 8, 16 Jun  6 08:14 /dev/sdb 
 brw-r----- 1 root disk 8, 17 Jun  6 08:14 /dev/sdb1 
 brw-r----- 1 root disk 8, 18 Jun  6 08:14 /dev/sdb2 
 brw-r----- 1 root disk 8, 19 Jun  6 08:14 /dev/sdb3 

dd 命令实现 SANBoot OS 的快照数据迁移

修改备份盘中操作系统的启动配置文件

备份盘上面的操作系统的启动配置文件是指向 DS4800 设备盘的,既然我们要把操作系统迁移到 DS4700,需要更改启动配置文件指向来自 DS4700 的备份盘 /dev/sdb。和启动相关的有三个配置文件:

  • /etc/fstab;
  • /boot/grub/grub.conf;
  • 内存镜像解压后的 init 文件。

首先创建新的挂载点,将 /dev/sdb 的 boot 分区和 root 分区挂载。

 bash# mkdir /ds47k_boot /ds47k_root 
 bash# mount /dev/sdb2 /ds47k_root 
 bash# mount /dev/sdb1 /ds47k_boot 

编辑 grub.conf

让 root 指向 /dev/sdb 的根分区 /dev/sdb2。


清单 5. 编辑 grub.conf
				
 bash# cd /ds47k_boot/grub 
 bash# vi grub.conf 
 bash# more /ds47k_boot/grub/grub.conf 
 # grub.conf generated by anaconda 
 # 
 # Note that you do not have to rerun grub after making changes to this file 
 # NOTICE:  You have a /boot partition.  This means that 
 #          all kernel and initrd paths are relative to /boot/, eg. 
 #          root (hd0,0) 
 #          kernel /vmlinuz-version ro root=/dev/sda2 
 #          initrd /initrd-version.img 
 #boot=/dev/sda 
 default=0 
 timeout=5 
 splashimage=(hd0,0)/grub/splash.xpm.gz 
 hiddenmenu 
 title Red Hat Enterprise Linux Server (2.6.18-194.el5) with MPP support 
        root (hd0,0) 
        kernel /vmlinuz-2.6.18-194.el5 ro root=/dev/sdb2 rhgb quiet 
        initrd /mpp-2.6.18-194.el5.img 

编辑 fstab

指定 boot 分区和 root 分区分别为 /dev/sdb1, /dev/sdb2,swap 分区为 /dev/sdb3。


清单 6. 编辑 fstab
				
 bash# cd /ds47k_root/etc/ 
 bash# vi fstab 
 bash# more fstab 
 /dev/sdb2               /                       ext3    defaults        1 1 
 /dev/sdb1               /boot                   ext3    defaults        1 2 
 tmpfs                   /dev/shm                tmpfs   defaults        0 0 
 devpts                  /dev/pts                devpts  gid=5,mode=620  0 0 
 sysfs                   /sys                    sysfs   defaults        0 0 
 proc                    /proc                   proc    defaults        0 0 
 /dev/sdb3               swap                    swap    defaults        0 0 

修改备份盘的内存镜像的 init 文件

先用 cp 命令备份 /ds47k_boot 目录下的内存镜像,然后解压备份盘内存镜像,这里我们创建一个目录 /sanboot,拷贝一个当前的内存镜像放在 /sanboot 目录下,同时在 /sanboot 目录下再创建一个子目录 /sanboot/tmp/ 用于存放解压后的内存镜像文件 :

 bash# cd /ds47k_boot/ 
 bash# cp mpp-2.6.18-194.el5.img mpp-2.6.18-194.el5.img.bak 
 bash# mkdir /sanboot 
 bash# cd /sanboot 
 bash# cp /ds47k_boot/mpp-2.6.18-194.el5.img  ./initrd.gz 
 bash# gunzip initrd.gz 
 bash# ls 
 initrd 
 bash# mkdir tmp 
 bash# cd tmp 
 bash# cpio -id < ../initrd 
 16148 blocks 

解压好之后,先备份一下当前的 init 文件为 init.bak,然后修改 init 文件,将 resume 指向 /dev/sdb3,root device 指向 /dev/sdb2,保存退出 init 文件。

 bash # cd /sanboot/tmp/ 
 bash# ls 
 bin  dev  etc  init  lib  proc  sbin  sys  sysroot  var 
 bash# cp init init.bak 
 bash# vi init 
……
 resume /dev/sdb3 
 echo Creating root device. 
 mkrootdev -t ext3 -o defaults,ro sdb2 

用新的内存镜像文件覆盖之前的备份盘内存镜像,新的内存镜像先命名为 newinitrd,压缩之后,用 cp 命令覆盖当前的内存镜像:

到这里我们的启动配置文件都修改好了,接下来可以重启机器进入 HBA Utility,设置启动设备为 DS4700 的盘。

HBA Utility 配置

参照上一章 HBA Utility配置,更改 HBA port 的 Boot Device 为 DS4700 的 LUN。

当系统起来的时候,查看一下当前操作系统,/dev/sdb 的所有分区都被挂载起来,说明操作系统已经成功的从 DS4800 迁移到 DS4700 备份盘,并且验证了 dd 命令备份成功。


清单 7. 查看文件系统
				
 bash# df -h 
 Filesystem            Size  Used Avail Use% Mounted on 
 /dev/sdb2              49G  2.5G   44G   6% / 
 /dev/sdb1              99M   28M   66M  30% /boot 
 tmpfs                 7.9G     0  7.9G   0% /dev/shm 
 bash# mppUtil -S 
 H6C0T0       Active                     Active           ARCDS48K96122 
             H0C0T0L000  Up             H1C0T1L000  Up 
 H6C0T1       Active                     Active           ARCFT900A7382 
             H0C0T3L000  Up             H1C0T2L000  Up 

   Missing Arrays 
 There are no missing arrays 
 bash# fdisk -l 

 Disk /dev/sda: 85.8 GB, 85899345920 bytes 
 255 heads, 63 sectors/track, 10443 cylinders 
 Units = cylinders of 16065 * 512 = 8225280 bytes 

   Device Boot      Start         End      Blocks   Id  System 
 /dev/sda1   *           1          13      104391   83  Linux 
 /dev/sda2              14        6540    52428127+  83  Linux 
 /dev/sda3            6541        7584     8385930   82  Linux swap / Solaris 

 Disk /dev/sdb: 91.2 GB, 91268055040 bytes 
 255 heads, 63 sectors/track, 11096 cylinders 
 Units = cylinders of 16065 * 512 = 8225280 bytes 

   Device Boot      Start         End      Blocks   Id  System 
 /dev/sdb1   *           1          13      104391   83  Linux 
 /dev/sdb2              14        6540    52428127+  83  Linux 
 /dev/sdb3            6541        7584     8385930   82  Linux swap / Solaris 

到这里,我们以使用不同多路方式的 SANboot OS 的快照备份和数据迁移为例,演示了 dd 命令如何实现数据的快照备份和数据迁移。除此之外,我们从 dd 的实例看到,dd 有非常广泛的应用。


参考资料

学习

文章出处: IBM developerWorks

加载中
返回顶部
顶部