随着 SAN 技术的发展,越来越多数据中心采用 SAN 存储来替代本地硬盘,数据和应用直接存放在 SAN 存储的硬盘,由存储端对数据统一管理。数据备份和数据迁移是存储系统的核心技术。随着企业业务不断发展,企业数据量成几何增长,数据迁移成为企业级信息系统在面临存储空间不足、数据安全问题的重要解决方案。同构存储系统的数据迁移技术包括:基于磁盘阵列远程数据复制技术的数据迁移、基于主机操作系统逻辑卷镜像技术的数据迁移、基于数据库备份和恢复技术的数据迁移、以及基于第三方工具的数据迁移。异构存储系统的数据迁移技术,涉及存储本身的特性是否支持迁移,不支持数据迁移的异构存储系统,可以通过虚拟化存储产品,将异构存储产品虚拟化成一个存储池,用户直接访问存储池,在存储池中创建卷,部署企业级应用,同时借助虚拟化存储产品自身的迁移技术实现数据迁移,目前 IBM 的虚拟化存储产品 SAN Volume Controller 支持多达 120 种第三方磁盘阵列。其实,如果只是想在测试或者开发环境下简单快速地实现数据的快照备份和迁移,你可以不用大费周折,dd 命令,它将会给你一个惊喜!
在本文中,我们将分析 dd 命令的用法,以实现使用不同多路方式的 SANboot OS 的快照备份和数据迁移为例,演示 dd 命令如何实现数据的快照备份和数据迁移。
dd 是 Linux/Unix 下的一个非常有用的命令,作用是将指定大小的输入文件(或设备文件)按 block 为单位拷贝到指定的输出文件(或设备文件)中,并在拷贝的同时进行指定的转换。
当不指定转换 conv 选项的时候,使用指定的输入和输出块大小来复制文件(默认是从标准输入到标准输出)。dd 每次从输入文件或设备文件读取指定大小的一个块(默认是 512 字节),如果使用 bs=bytes 选项,将把全部读到的数据写到独立的输出块,这个输出块的长度和读到的数据完全一样,除非指定使用 sync 选项转换。
其他情况下,输入的时候每次读一个块,然后处理,并将输出结果收集起来,最后写到指定大小的数据块中去,最终的输出块可能会比指定的大小短一些。
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
在复制结束之前,同步输出数据和元数据。改选项将会做物理写入操作。
数据备份与恢复
整盘数据备份与恢复
备份 :
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 字节块来有效的实现向软盘的传输;
ddif=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,验证快照备份成功;
该过程如下:
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)
添加一个卷组
假设您的存储器管理员已经将 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 |
备份盘上面的操作系统的启动配置文件是指向 XIV 盘的,既然我们要把操作系统迁移到 DS8000,那么需要修改启动配置文件指向来自 DS8000 的备份盘 mpath1。和启动相关的有三个配置文件:
首先在根目录下创建新的挂载点 /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。
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。
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 的盘。
在 XIV SANBoot 安装操作系统时候,本地盘已经被禁掉,并且 Boot Bios 都是开启的,所以只需要更改启动设备到 DS8000 的盘。
我将使用 Emulex HBA BIOS 设置作为示例。如果您使用其他供应商的 HBA,请参考相应文档获得正确的设置。
首先,您在服务器发布 Emulex 自检时需要按下 Ctrl-E 选择 Host Adapter 页面,如图 2 所示。
先选择其中一个 HBA 端口,按回车键进入配置页面,Boot BIOS 已经是 Enabled 状态,说明 Boot from SAN 已经开启,向下继续选择 Configure Boot Devices, 如图 3
按回车键进入启动设备界面如图 4,看到当前的启动设备是 WWPN 为 5001738000D40171 的存储设备的 LUN 01, 继续按回车键 ,
可以看出 WWPN 为 5001738000D40171 的 LUN 01 是 XIV LUN,是之前 SANBoot OS 安装盘,现在将启动设备更改为 DS8000 的 LUN,在图 5 的界面中,选中编号为 02 的 LUN,按照提示一步步操作至图 8。
选择经由 WWPN 启动设备,返回上一级菜单,现在图 8 看到首选启动设备变成 DS8000LUN。
同样操作重复在 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,验证快照备份成功;
在创建操作系统的备份盘之前,先检查当前系统的状态。从 RDAC 命令“mppUtil – S“的输出看到主机发现一个两条路径的 DS4800 的 LUN,系统为这个 LUN 分配了一个设备名 /dev/sda,”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。
使用 RDAC 的命令 mppButRescan 去扫描新的 LUN,可以看到新的 LUN 来自存储 DS4700 存储设备(ARCFT900A7382),主机为它分配一个设备文件名 /dev/sdb。
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 |
修改备份盘中操作系统的启动配置文件
备份盘上面的操作系统的启动配置文件是指向 DS4800 设备盘的,既然我们要把操作系统迁移到 DS4700,需要更改启动配置文件指向来自 DS4700 的备份盘 /dev/sdb。和启动相关的有三个配置文件:
首先创建新的挂载点,将 /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。
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。
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 命令备份成功。
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 有非常广泛的应用。
学习
讨论