迁移或移动数据是一项常见的任务。 无论是通过网络将数据复制到新的文件系统,还是将逻辑卷复制到相同的卷组或不同的卷组中,或者只是创建文件系统的备份。 移动或复制数据的原因可能是由于性能问题,或者是由于当前环境中没有足够的空间而导致的数据总体增长。 有多种工具可用于上述数据移动任务,例如migratepv,cplv,tar,cpio,cp或rsync。 对于jfs,可以使用splitcopy,对于jfs2,可以使用快照来获取文件系统的副本。 对于哪种方法最适合某个数据移动没有黄金法则。 在本文中,我将重点介绍以下AIX实用程序,分别介绍在文件系统和逻辑卷级别上移动或复制数据的不同方法:cplv,tar和cp。
使用tar和cp将数据复制到新文件系统
在将更新应用于应用程序文件系统时,将首先进行备份,很可能是对磁带进行备份。 但是,如果空间允许,也可以对应用程序所在的文件系统进行复制。 这样做的好处是可以快速恢复。 通过交换挂载点,这也是有利的,因为您可以快速将升级后的文件与原始文件进行比较。 假设一个名为/ opt / pluto的文件系统包含一个要升级的应用程序:
# df -g
…
/dev/fslv00 1.00 0.03 97% 22 1% /opt/pluto
让我们看一下使用cp,tar和cplv将应用程序文件复制到另一个文件系统的三种方式。
首先,需要创建备份(复制)文件系统。 这是使用crfs命令执行的,请确保它是相同的文件系统类型并且至少具有相同的大小。 当前的/ Pluto文件系统大小为1G,类型为jfs2。 新的文件系统称为/ opt / pluto_bak。 以下命令可实现此目的:
# crfs -v jfs2 -g rootvg -m /opt/pluto_bak -A yes -p rw -a agblksize=40
96 -a size=1G
File system created successfully.
524068 kilobytes total disk space.
New File System size is 1048576
在示例中,输入参数表示以下内容:
参数 | 定义 |
---|---|
-v jfs2 | 指定jfs2文件系统类型。 |
-g rootvg | 创建文件系统rootvg |
-m / opt / pluto_bak | 指定实际的安装点。 |
-是的 | 指定重新引导后自动挂载文件系统。 |
-p rw | 指定读写权限 |
-a agblksize = 4096 | 指定块大小(以字节为单位) |
-a大小= 1G | 指定要创建的文件系统的大小,在此示例中为1GB。 |
接下来,挂载文件系统/ opt / pluto_bak:
# mount /opt/pluto_bak
现在使用cp命令,确保我们复制权限/修改和任何符号链接,我们使用Rph标志。
以下cp命令将所有文件和符号链接(如果有)从/ opt / pluto复制到/ opt / pluto_bak:
# cd /opt/pluto
# pwd
/opt/pluto
# cp -Rph * /opt/pluto_bak
确保通过列出文件数并运行原始和复制文件系统的du来测试复制是否正确完成。 对于/ opt / pluto,我们有:
# pwd
/opt/pluto
# du -ms .
988.46 .
# ls |wc
17 17 146
对于/ opt / pluto_bak,我们有:
# cd ../pluto_bak
# ls |wc
17 17 146
# du -ms .
988.46 .
先前的所有输出都从原始匹配到复制的文件系统,因此一切正常(复制成功完成)。
现在,我们将再次执行相同的操作,但是这次使用tar实用程序。
处理许多较小的文件时,使用tar通常更快。 如果您的文件大于2GB,请确保使用GNU tar实用程序。
# cd /opt/pluto
# pwd
/opt/pluto
# tar cpf - . | (cd /opt/pluto_bak; tar xpf - )
在上一个输出中,tar使用当前目录中的修改时间/权限创建档案。 tar将其存档到标准输出。 然后将输出通过子外壳管道传输,然后将cd管道传输到/ opt / pluto_bak,然后将其从标准输出解压缩(提取)到/ opt / pluto_bak文件系统中。
和以前一样,请确保检查原始和复制的文件系统的总大小和匹配的文件数。
如果希望查看正在归档和提取的文件,请添加详细(v)选项:
# cd /opt/pluto
# tar cvpf - . | (cd /opt/pluto_bak; tar xvpf - )
a .
a ./lost+found
a ./myfile.dat 0 blocks.
a ./pop 1 blocks.
a ./test100M.bin 195313 blocks.
x .
x ./lost+found
x ./myfile.dat, 0 bytes, 0 media blocks.
x ./pop, 139 bytes, 1 media blocks.
x ./test100M.bin, 100000000 bytes, 195313 media blocks.
a ./myfile1 195313 blocks.
x ./myfile1, 100000000 bytes, 195313 media blocks.
a ./mprep 195313 blocks.
x ./mprep, 100000000 bytes, 195313 media blocks.
a ./chklp 195313 blocks.
x ./chklp, 100000000 bytes, 195313 media blocks.
a ./poplt 195313 blocks.
x ./poplt, 100000000 bytes, 195313 media blocks.
…..
…..
使用tar将数据复制到远程文件系统
您也可以使用tar在网络上复制数据,尽管scp可以完成这项工作。 我通常更喜欢将tar用于文件系统副本。 要通过网络进行tar传输,请使用ssh作为传输方法。 您可以使用rsh,但我建议不要使用rsh,因为它会打开安全漏洞。
假设我们希望将数据从本地主机上的/ opt / pluto复制到远程主机nordkapp文件系统/ opt / pluto中,我可以使用:
# cd /opt/pluto
# tar -cpf - . | ssh nordkapp (cd /opt/pluto; tar -xpf -)
从该示例可以看出,在本地复制/还原和远程复制/还原之间的tar命令没有太大区别。 先前的假设已经交换了ssh密钥以允许无密码的连接/登录。
在卷组中复制逻辑卷
处理较小的文件系统时,使用cplv比使用cp或tar慢得多。 要考虑的另一种选择是cplv复制整个lv,而tar和cp仅需要复制文件。 根据一般经验,如果文件系统大于10 GB,我将使用cplv。
在以下示例中,我们将把位于/ opt / pluto下的逻辑卷fslv00复制到复制的文件系统逻辑卷fslv01。 cplv命令将覆盖fslv01的当前内容,这是我们想要的。 注意在这个例子中,文件系统/ opt / pluto_bak已经被创建,如前所述; 该文件系统中目前没有数据。 这可以通过df命令的输出看到:
# df -g
…..
/dev/fslv00 1.00 0.03 97% 22 1% /opt/pluto
/dev/fslv01 1.00 1.00 1% 4 1% /opt/pluto_bak
首先要做的是卸载两个文件系统。 与tar和cp不同,cplv不能与在线文件系统一起执行:
# umount /opt/pluto
# umount /opt/pluto_bak
如果文件系统报告由于繁忙而无法卸载,请检查以确保该应用程序已关闭。 然后确定哪些进程使文件系统保持不变。 使用定影器:
# fuser -u <filesystem>
例如:
# fuser -u /opt/pluto
如果您决定要终止该文件系统上的所有进程,请使用:
# fuser -k <filesystem>
接下来,使用cplv命令。 在这种情况下,我们将复制逻辑卷fslv00,它将覆盖现有的目标逻辑卷(fslv01)。 该演示的基本格式为:
cplv -e < dest lv> -f <source lv>
哪里:
参数 | 定义 |
---|---|
-e | 将逻辑卷内容复制到现有逻辑卷 |
>目的地lv | 指定目标逻辑卷,在此示例中为fslv01 |
源lv | 指定源逻辑卷,在此示例中为fslv00 |
当我们覆盖另一个逻辑卷时,请确保目标逻辑卷的逻辑卷类型设置为复制而不是jfs2(在逻辑卷属性中)。 如果不是,该命令将失败,并警告您需要对其进行更改。 要检查TYPE,请对目标lv运行以下lslv命令:
# lslv fslv01 |grep TYPE
TYPE: jfs2 WRITE VERIFY: off
从前面的输出中,我们看到目标逻辑卷被设置为jfs2。 现在将其设置为复制并运行lslv命令以确保已设置:
# chlv -t copy fslv01
# lslv fslv01 |grep TYPE
TYPE: copy WRITE VERIFY: off
现在已设置为复制,我们可以复制逻辑卷:
# cplv -e fslv01 -f fslv00
cplv: Logical volume fslv00 successfully copied to fslv01 .
从该输出中,我们可以看到,一旦cplv命令完成了已重置回jfs2的逻辑卷类型,复制就成功了。 让我们验证一下:
# lslv fslv01 |grep TYPE
TYPE: jfs2 WRITE VERIFY: off
一切都很好。 现在,挂载文件系统:
# mount /opt/pluto
# mount /opt/pluto_bak
# df -g
….
/dev/fslv00 1.00 0.03 97% 22 1% /opt/pluto
/dev/fslv01 1.00 0.03 97% 22 1% /opt/pluto_bak
现在已使用cplv命令将文件系统/ opt / pluto复制到/ opt / pluto_bak。 确保像以前一样比较复制文件系统上的大小和文件数。
如果在应用程序升级期间事件出错,则该应用程序无法使用,您别无选择,只能还原。 但是,就像在此演示中一样,我们已经复制了文件系统,因此我们要做的就是将不良应用程序文件系统交换为良好的文件系统。 交换文件系统比从磁带还原更快,并且您还拥有失败的升级文件系统的副本以进行进一步诊断。
在以下示例中,假设我们希望将/ opt / pluto_bak交换(即更改安装点)到/ opt / pluto。 首先,我们必须将/ opt / pluto的安装点更改为/ opt / pluto_err。 这样做是为了在我们将/ opt / pluto_bak更改为/ opt / pluto时不会出现命名冲突。 更改文件系统的安装点是使用chfs命令完成的。 确保首先卸载文件系统。 基本格式为:
chfs -m <new mount point> <original mount point>
要确认,请将/ opt / pluto的安装点更改为/ opt / pluto_err,并将/ opt / pluto_bak的安装点更改为/ opt / pluto:
# chfs -m /opt/pluto_err /opt/pluto
现在我们将/ opt / pluto的安装点更改为/ opt / pluto_err,现在我们可以将/ opt / pluto_bak更改为/ opt / pluto:
# chfs -m /opt/pluto /opt/pluto_bak
接下来,挂载文件系统:
# mount /opt/pluto_err
# mount /opt/pluto
该应用程序现已可用。 现在,失败的应用程序驻留在/ opt / pluto_err上,该文件也已安装。 由于现在都已安装了应用程序文件系统,因此可以进行进一步研究,因此,现在可以进行比较。
将逻辑卷复制到其他卷组
可以使用tar,cp或cplv将文件系统数据复制到其他卷组。 在本节中,我将使用cplv。 cplv过程类似于先前的演示。 唯一的区别是,不是目标文件系统驻留在同一卷组中,而是将其创建在其他卷组中。 当复制到另一个卷组时,必须更改/ etc / filesystems中的逻辑卷设备(可能还有日志设备)属性,因此AIX知道在发出挂载请求时要在哪里寻找文件系统。
让我们看一下如何将逻辑卷复制到另一个卷组。 涉及的步骤是:
- 卸载/ opt / pluto文件系统。
- 复制/ opt / pluto驻留的逻辑卷(fslv00)。 使用copy命令,将其解析到新的逻辑卷pluto_lv。
- 如果这是一个新的卷组,请创建一个新的jfs2log并将其格式化。 否则,请使用该卷组上的现有jfs2log。
- 编辑/ etc / filesystems以将/ opt / pluto的dev指向并记录设备,使其现在位于该卷组上的正确设备上。
- 将/ opt / pluto文件系统挂载在新复制的逻辑卷pluto_lv上。
- 健全检查新安装的文件系统。
- 卸载文件系统和fsck并重新安装。
使用我们的/ opt / pluto文件系统,假设我们希望将逻辑卷fslv00从rootvg复制到另一个卷组apps_vg。 并且逻辑卷应重命名为pluto_lv。
此演示的cplv命令的基本格式为:
cplv -v <dest vg> -y <new lv name> source _lv
哪里:
参数 | 定义 |
---|---|
-v <目标vg> | 是目标卷组,在此示例中为apps-vg |
-y <新的lv名称> | 是目标逻辑卷名称,在此示例中为pluto_lv |
因此,第一个任务是卸载要复制的文件系统,以便我们可以访问逻辑卷。
# umount /opt/pluto
使用lsvg命令,我们看到文件系统已关闭:
# lsvg -l rootvg
…
fslv00 jfs2 64 64 1 closed/syncd /opt/pluto
现在复制:
# cplv -v apps_vg -y pluto_lv fslv00
cplv: Logical volume fslv00 successfully copied to pluto_lv .
现在已将其复制,请使用lsvg命令进行验证:
# lsvg -l apps_vg
apps_vg:
LV NAME TYPE LPs PPs PVs LV STATE MOUNT POINT
pluto_lv jfs2 128 128 1 closed/syncd N/A
从先前的输出中,我们看到逻辑卷fslv00已复制到卷组apps_vg,并且逻辑卷已重命名为pluto_lv。 但是,还要注意,没有JFS(日志文件系统)jfs2log条目。 如果将逻辑卷复制到空卷组,则会发生这种情况。
要创建jfs2log,请使用mklv命令。 此演示的mklv命令的基本格式为:
mklv -t <type> -y <new lv_name> vg_name <number of LPs>
哪里:
参数 | 定义 |
---|---|
-t <类型> | 指定逻辑卷类型。 在这种情况下,它是jfs2log。 |
-y <新的lv名称> | 指定目标逻辑卷名称。 在此示例中,它是jfs2log_lv。 |
vg_name: | 指示jfs2log所在的卷组名称。 在此示例中,它是apps_vg。 |
LP数量 | 逻辑分区的数量; 在这种情况下,需要一个分区。 |
因此,要创建卷组apps_vg的jfs2log(称为jfs2log_lv),请使用:
# mklv -t jfs2log -y jfslog_lv apps_vg 1
jfslog_lv
确认已创建:
# lsvg -l apps_vg
apps_vg:
LV NAME TYPE LPs PPs PVs LV STATE MOUNT POINT
pluto_lv jfs2 128 128 1 closed/syncd N/A
jfslog_lv jfs2log 1 1 1 closed/syncd N/A
下一个任务是初始化和格式化逻辑卷jfs2log_lv,以便将其用作jfs2日志。 这是使用logform命令实现的。 当提示您销毁内容时,请选择是。 您实际上并没有破坏任何东西,而是在格式化新创建的逻辑卷。
# logform /dev/jfslog_lv
logform: destroy /dev/rjfslog_lv (y)?y
#
现在,我们几乎可以挂载/ opt / pluto了; 但是,我们必须首先让AIX知道新设备和与其关联的jfs2log。 如果我们从/ etc / filesystems文件中查看/ opt / pluto的文件系统条目,则有:
# grep -w -p "/opt/pluto" /etc/filesystems
/opt/pluto:
dev = /dev/fslv00
vfs = jfs2
log = /dev/hd8
mount = true
options = rw
account = false
我们可以看到我们需要更改以下属性:
dev
log
当逻辑卷驻留在rootvg中时,这些属性反映日志和设备。 由于逻辑卷现在位于具有不同日志和开发值的卷组apps_vg中,因此需要更改它们。 要反映日志和逻辑卷现在所在的位置,请更改以下内容:
dev = /dev/fslv00
至
dev = /dev/pluto_lv
更改:
log = /dev/hd8
至
log = /dev/jfslog_lv
现在,像上一个示例一样,编辑/ etc / filesystems并更改那些属性,完成后,请验证是否已完成属性更改。
# grep -w -p "/opt/pluto" /etc/filesystems
/opt/pluto:
dev = /dev/pluto_lv
vfs = jfs2
log = /dev/jfslog_lv
mount = true
options = rw
account = false
现在剩下要做的就是挂载/ opt / pluto了,它现在位于apps_vg卷组中。 逻辑卷副本现已完成。
# mount /opt/pluto
# lsvg -l apps_vg
apps_vg:
LV NAME TYPE LPs PPs PVs LV STATE MOUNT POINT
pluto_lv jfs2 128 128 1 open/syncd /opt/pluto
jfslog_lv jfs2log 1 1 1 open/syncd N/A
我们仍然有原始逻辑卷驻留在rootvg中,没有与之关联的安装点。 一旦/ opt / pluto被检出,就可以将其删除。 作为检查过程的一部分,在新复制的文件系统上运行fsck是一个好习惯,也是一个好习惯(不过请务必先将其卸载)。
# umount /opt/pluto
# fsck -y /dev/pluto_lv
The current volume is: /dev/pluto_lv
Primary superblock is valid.
J2_LOGREDO:log redo processing for /dev/pluto_lv
Primary superblock is valid.
*** Phase 1 - Initial inode scan
*** Phase 2 - Process remaining directories
*** Phase 3 - Process remaining files
*** Phase 4 - Check and repair inode allocation map
*** Phase 5 - Check and repair block allocation map
File system is clean
# mount /opt/pluto
接下来,假设一切都已检查确定,请从rootvg中删除原始逻辑卷。 请确保在重新引导(或exportvg)之前删除原始逻辑卷,因为ODM仍将保留原始逻辑卷和fielsystem属性:
# lsvg -l rootvg
…..
fslv00 jfs2 64 64 1 closed/syncd N/A
# rmlv fslv00
Warning, all data contained on logical volume fslv00 will be destroyed.
rmlv: Do you wish to continue? y(es) n(o)? y
rmlv: Logical volume fslv00 is removed.
结论
在文件系统之间移动或复制数据是系统管理员的一项常见任务,无论是在同一卷组内还是跨网络。 在本文中,我演示了可以执行这些任务的不同方法。 复制数据的方法有很多,我仅列举了几个例子。
翻译自: https://www.ibm.com/developerworks/aix/library/au-cp_mv/index.html