遷移或復(fù)制數(shù)據(jù)是很常見的任務(wù)。無論是通過網(wǎng)絡(luò)將數(shù)據(jù)復(fù)制到新的文件系統(tǒng)中,還是在同一卷組中復(fù)制邏輯卷或?qū)⑺鼜?fù)制到另一個(gè)卷組,抑或只是創(chuàng)建文件系統(tǒng)的備份。轉(zhuǎn)移或復(fù)制數(shù)據(jù)的原因可能是為了提高性能,或者因?yàn)楫?dāng)前環(huán)境中沒有足夠的空間容納不斷增長的數(shù)據(jù)?梢允褂貌煌墓ぞ撸ū热 migratepv、cplv、tar、cpio、cp 或 rsync)執(zhí)行上面提到的數(shù)據(jù)轉(zhuǎn)移任務(wù)。對于 jfs,可以使用 splitcopy(或?qū)?jfs2 使用 snapshot)獲得文件系統(tǒng)的拷貝。對于哪種方法最適合某項(xiàng)數(shù)據(jù)轉(zhuǎn)移任務(wù),并沒有絕對的規(guī)定。在本文中,我會演示在文件系統(tǒng)和邏輯卷級上轉(zhuǎn)移或復(fù)制數(shù)據(jù)的不同方法,主要關(guān)注以下 AIX 實(shí)用程序:cplv、tar 和 cp。
在對應(yīng)用程序文件系統(tǒng)應(yīng)用更新時(shí),要先執(zhí)行備份,很可能是將數(shù)據(jù)備份到磁帶。但是如果空間允許,也可以復(fù)制應(yīng)用程序所在的文件系統(tǒng)。這樣做的優(yōu)點(diǎn)是可以快速進(jìn)行恢復(fù)。另外,通過交換掛載點(diǎn),可以快速地對比更新后的文件與原來的文件。假設(shè)文件系統(tǒng) /opt/pluto 包含要升級的應(yīng)用程序:
首先,需要創(chuàng)建備份(復(fù)制的)文件系統(tǒng)。這會使用到 crfs 命令,要確保文件系統(tǒng)的類型相同,而且系統(tǒng)的大小不小于原文件系統(tǒng)。當(dāng)前 /pluto 文件系統(tǒng)的大小是 1G,是 jfs2 類型的。新的文件系統(tǒng)名為 /opt/pluto_bak?梢允褂靡韵旅顒(chuàng)建這個(gè)文件系統(tǒng):
一定要檢查復(fù)制是否正確地完成了,方法是在原來的和復(fù)制的文件系統(tǒng)上列出文件數(shù)量并運(yùn)行 du。對于 /opt/pluto:
在前面的輸出中,tar 從當(dāng)前目錄創(chuàng)建存檔,包括修改時(shí)間/權(quán)限;tar 把存檔發(fā)送到標(biāo)準(zhǔn)輸出。然后,輸出管道連接到一個(gè)子 shell,再進(jìn)入 /opt/pluto_bak,最后把數(shù)據(jù)從標(biāo)準(zhǔn)輸出提取到 /opt/pluto_bak 文件系統(tǒng)中。
還可以使用 tar 通過網(wǎng)絡(luò)復(fù)制數(shù)據(jù),盡管使用 scp 也可以。對于文件系統(tǒng)復(fù)制,我一般喜歡使用 tar。要想通過網(wǎng)絡(luò)使用 tar,則應(yīng)該使用 ssh 作為傳輸方法。也可以使用 rsh,但是我不建議這么做,因?yàn)樗邪踩毕荨?/div>
如果希望將數(shù)據(jù)從本地主機(jī)上的 /opt/pluto 復(fù)制到遠(yuǎn)程主機(jī) nordkapp 上的文件系統(tǒng) /opt/pluto,則可以使用以下命令:
# cd /opt/pluto# tar -cpf - . | ssh nordkapp (cd /opt/pluto; tar -xpf -) |
通過這個(gè)示例可以看出,對于本地復(fù)制/恢復(fù)與遠(yuǎn)程復(fù)制/恢復(fù),tar 命令并沒有很大的差異。前面的示例假設(shè)已經(jīng)交換了 ssh 密鑰,所以可以執(zhí)行無密碼連接/登錄。
在卷組中復(fù)制邏輯卷
在處理小的文件系統(tǒng)時(shí),使用 cplv 比使用 cp 或 tar 慢得多。要考慮的另一要點(diǎn)是,cplv 需要復(fù)制整個(gè)邏輯卷,而 tar 和 cp 只需復(fù)制文件。經(jīng)驗(yàn)規(guī)則是:如果文件系統(tǒng)大于 10 GB,則使用 cplv。
在下面的示例中,我們要將 /opt/pluto 所在的邏輯卷(名為 fslv00)復(fù)制到文件系統(tǒng)邏輯卷 fslv01。cplv 命令會覆蓋 fslv01 的當(dāng)前內(nèi)容,這正是我們想要的效果。注意,在這個(gè)示例中,已經(jīng)創(chuàng)建了文件系統(tǒng) /opt/pluto_bak;該文件系統(tǒng)中目前沒有任何數(shù)據(jù)。可以通過 df 命令的輸出看出這一點(diǎn):
# 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 |
首先要做的是卸載這兩個(gè)文件系統(tǒng)。與 tar 和 cp 不同,不能在文件系統(tǒng)處于聯(lián)機(jī)狀態(tài)下時(shí)執(zhí)行 cplv 命令:
# umount /opt/pluto# umount /opt/pluto_bak |
如果文件系統(tǒng)報(bào)告它因?yàn)槊o法卸載,則應(yīng)確保關(guān)閉應(yīng)用程序。然后,使用 fuser 判斷哪些進(jìn)程導(dǎo)致文件系統(tǒng)無法卸載:
例如:
如果決定終止此文件系統(tǒng)上的所有進(jìn)程,那么可以使用以下命令:
接下來要使用 cplv 命令。在這個(gè)示例中,我們將復(fù)制邏輯卷 fslv00,這會覆蓋現(xiàn)有的目標(biāo)邏輯卷 fslv01。命令的基本格式是:
cplv -e < dest lv> -f <source lv> |
其中:
-e | 將邏輯卷的內(nèi)容復(fù)制到現(xiàn)有的邏輯卷 |
dest lv | 指定目標(biāo)邏輯卷(在這個(gè)示例中是 fslv01) |
source lv | 指定源邏輯卷(在這個(gè)示例中是 fslv00) |
因?yàn)橐采w另一個(gè)邏輯卷,所以應(yīng)該確保目標(biāo)邏輯卷的邏輯卷類型被設(shè)置為 copy 而不是 jfs2(在邏輯卷屬性中)。如果不這樣設(shè)置,命令會失敗,并會發(fā)出警告消息,指出需要修改這個(gè)屬性。對目標(biāo)邏輯卷執(zhí)行以下 lslv 命令以檢查 TYPE:
# lslv fslv01 |grep TYPETYPE: jfs2 WRITE VERIFY: off |
在前面的輸出中看到,目標(biāo)邏輯卷的類型設(shè)置為 jfs2。現(xiàn)在需要將它設(shè)置為 copy 并運(yùn)行 lslv 命令,以確認(rèn)該設(shè)置:
# chlv -t copy fslv01# lslv fslv01 |grep TYPETYPE: copy WRITE VERIFY: off |
在將類型設(shè)置為 copy 之后,就可以復(fù)制邏輯卷了:
# cplv -e fslv01 -f fslv00cplv: Logical volume fslv00 successfully copied to fslv01 . |
從這個(gè)輸出中看到,復(fù)制成功了。完成 cplv 命令之后,邏輯卷類型將恢復(fù)為 jfs2。我們來核實(shí)一下:
# lslv fslv01 |grep TYPETYPE: jfs2 WRITE VERIFY: off |
一切正常,F(xiàn)在,我們要來掛載文件系統(tǒng):
# 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 |
現(xiàn)在已經(jīng)使用 cplv 命令將文件系統(tǒng) /opt/pluto 復(fù)制到了 /opt/pluto_bak 中。與前面一樣,一定要在復(fù)制的文件系統(tǒng)上對比這兩個(gè)文件的大小和文件數(shù)量。
如果在應(yīng)用程序升級期間出現(xiàn)錯(cuò)誤,應(yīng)用程序變得不可用,那么您別無選擇,只能執(zhí)行恢復(fù)操作。但是,我們已經(jīng)復(fù)制了文件系統(tǒng),只需將損壞的應(yīng)用程序文件系統(tǒng)交換為好的應(yīng)用程序即可。交換文件系統(tǒng)比從磁帶恢復(fù)快,而且還可以保留升級失敗的文件系統(tǒng)供進(jìn)一步診斷。
在以下示例中,假設(shè)我們想從 /opt/pluto_bak 交換(即改變掛載點(diǎn))到 /opt/pluto。首先,必須把 /opt/pluto 的掛載點(diǎn)更改為 /opt/pluto_err。這樣,在將 /opt/pluto_bak 改為 /opt/pluto 時(shí)就不會出現(xiàn)名稱沖突。使用 chfs 命令改變文件系統(tǒng)的掛載點(diǎn)。一定要先卸載文件系統(tǒng);靖袷绞牵
chfs -m <new mount point> <original mount point> |
將 /opt/pluto 的掛載點(diǎn)更改為 /opt/pluto_err,然后將 /opt/pluto_bak 的掛載點(diǎn)更改為 /opt/pluto:
# chfs -m /opt/pluto_err /opt/pluto |
既然已經(jīng)將 /opt/pluto 的掛載點(diǎn)更改為 /opt/pluto_err,現(xiàn)在即可將 /opt/pluto_bak 更改為 /opt/pluto:
# chfs -m /opt/pluto /opt/pluto_bak |
接下來,我們要掛載文件系統(tǒng):
# mount /opt/pluto_err# mount /opt/pluto |
應(yīng)用程序現(xiàn)在可以使用了。發(fā)生故障的應(yīng)用程序目前保存在 /opt/pluto_err 中,這個(gè)文件系統(tǒng)也已掛載,因?yàn)閮蓚(gè)應(yīng)用程序文件系統(tǒng)目前都已掛載,所以需要進(jìn)行進(jìn)一步檢查,比如進(jìn)行對比。
將邏輯卷復(fù)制到另一個(gè)卷組
可以使用 tar、cp 或 cplv 將文件系統(tǒng)數(shù)據(jù)復(fù)制到另一個(gè)卷組。在本文中,我將使用 cplv。操作過程與前面相似。唯一的區(qū)別是,目標(biāo)文件系統(tǒng)并不在同一卷組中,而是在另一個(gè)卷組中創(chuàng)建它。在將數(shù)據(jù)復(fù)制到另一個(gè)卷組時(shí),必須修改 /etc/filesystems 中的邏輯卷設(shè)備(可能還有日志設(shè)備)屬性,讓 AIX 在請求掛載文件系統(tǒng)時(shí)知道在哪里尋找它。
我們來看看如何將邏輯卷復(fù)制到另一個(gè)卷組。步驟如下:
- 卸載 /opt/pluto 文件系統(tǒng)。
- 復(fù)制保存在 /opt/pluto 的邏輯卷 fslv00。使用復(fù)制命令將它解析為新的邏輯卷 pluto_lv。
- 如果目標(biāo)卷組是新的卷組,則創(chuàng)建一個(gè)新的 jfs2log 并將其格式化。否則,使用卷組中現(xiàn)有的 jfs2log。
- 編輯 /etc/filesystems,讓 /opt/pluto 的設(shè)備和日志設(shè)備都指向此卷組中的正確設(shè)備。
- 掛載剛復(fù)制的邏輯卷 pluto_lv 上的 /opt/pluto 文件系統(tǒng)。
- 檢查剛掛載的文件系統(tǒng)。
- 卸載文件系統(tǒng),然后執(zhí)行 fsck 命令并重新掛載它。
對于 /opt/pluto 文件系統(tǒng),假設(shè)希望把邏輯卷 fslv00 從 rootvg 復(fù)制到另一個(gè)卷組 apps_vg。另外,應(yīng)該將這個(gè)邏輯卷改名為 pluto_lv。
對于這個(gè)示例,cplv 命令的基本格式如下:
cplv -v <dest vg> -y <new lv name> source _lv |
其中:
-v <dest vg> | 是目標(biāo)卷組(在這個(gè)示例中是 apps_vg) |
-y <new lv name> | 是目標(biāo)邏輯卷名稱(在這個(gè)示例中是 pluto_lv) |
第一個(gè)任務(wù)是卸載希望復(fù)制的文件系統(tǒng),然后才能訪問邏輯卷。
使用 lsvg 命令確認(rèn)文件系統(tǒng)已關(guān)閉:
# lsvg -l rootvg…fslv00 jfs2 64 64 1 closed/syncd /opt/pluto |
現(xiàn)在執(zhí)行復(fù)制操作:
# cplv -v apps_vg -y pluto_lv fslv00cplv: Logical volume fslv00 successfully copied to pluto_lv . |
完成復(fù)制操作之后,現(xiàn)在即可用 lsvg 命令檢查一下:
# lsvg -l apps_vgapps_vg:LV NAME TYPE LPs PPs PVs LV STATE MOUNT POINTpluto_lv jfs2 128 128 1 closed/syncd N/A |
從前面的輸出可以看出,邏輯卷 fslv00 已經(jīng)復(fù)制到卷組 apps_vg 并改名為 pluto_lv。但還要注意的是,其中沒有 JFS (journaled file system) jfs2log 條目。如果將邏輯卷復(fù)制到空的卷組,就會出現(xiàn)這種情況。
使用 mklv 命令創(chuàng)建 jfs2log。mklv 命令的基本格式是:
mklv -t <type> -y <new lv_name> vg_name <number of LPs> |
其中:
-t <type> | 指定邏輯卷類型。在這里是 jfs2log |
-y <new lv name> | 指定目標(biāo)邏輯卷名稱。在本示例中是 jfs2log_lv |
vg_name | 表示 jfs2log 所在的卷組。在本示例中是 apps_vg |
Number of LPs | 邏輯分區(qū)的數(shù)量;在這里只需要一個(gè)分區(qū) |
因此,使用以下命令創(chuàng)建 jfs2log,它位于卷組 apps_vg 中,名為 jfs2log_lv:
# mklv -t jfs2log -y jfslog_lv apps_vg 1jfslog_lv |
確認(rèn)已經(jīng)創(chuàng)建了這個(gè)邏輯卷:
# lsvg -l apps_vgapps_vg:LV NAME TYPE LPs PPs PVs LV STATE MOUNT POINTpluto_lv jfs2 128 128 1 closed/syncd N/Ajfslog_lv jfs2log 1 1 1 closed/syncd N/A |
下一個(gè)任務(wù)是初始化和格式化邏輯卷 jfs2log_lv,以便可以將它用作 jfs2log。這會使用到 logform 命令。在提示要銷毀的內(nèi)容時(shí),選擇 Yes。實(shí)際上不會銷毀任何數(shù)據(jù),而是對剛創(chuàng)建的邏輯卷進(jìn)行格式化。
# logform /dev/jfslog_lvlogform: destroy /dev/rjfslog_lv (y)?y# |
現(xiàn)在差不多可以掛載 /opt/pluto 了;但是,必須先讓 AIX 知道與它相關(guān)聯(lián)的新設(shè)備和 jfs2log。看一下 /etc/filesystems 文件中 /opt/pluto 的文件系統(tǒng)條目:
# grep -w -p "/opt/pluto" /etc/filesystems/opt/pluto: dev = /dev/fslv00 vfs = jfs2 log = /dev/hd8 mount = true options = rw account = false |
可以看出需要修改以下屬性:
這些屬性反映這個(gè)邏輯卷駐留在 rootvg 中時(shí)的日志和設(shè)備。因?yàn)檫@個(gè)邏輯卷現(xiàn)在位于卷組 apps_vg 中,所以需要修改 log 和 dev 值。為了反映日志和邏輯卷現(xiàn)在所在的位置,將:
改為
將:
改為
現(xiàn)在編輯 /etc/filesystems,按前面的示例修改這些屬性。完成之后,確認(rèn)屬性修改已經(jīng)完成。
# 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 |
現(xiàn)在,只需掛載目前位于 apps_vg 卷組中的 /opt/pluto 即可。邏輯卷的復(fù)制已經(jīng)完成了。
# mount /opt/pluto# lsvg -l apps_vgapps_vg:LV NAME TYPE LPs PPs PVs LV STATE MOUNT POINTpluto_lv jfs2 128 128 1 open/syncd /opt/plutojfslog_lv jfs2log 1 1 1 open/syncd N/A |
原來的邏輯卷仍然在 rootvg 中,沒有相關(guān)聯(lián)的掛載點(diǎn)。檢查 /opt/pluto 以后,便可刪除它。在檢查過程中,最好對剛復(fù)制的文件系統(tǒng)運(yùn)行 fsck(但是一定要先卸載它)。
# umount /opt/pluto# fsck -y /dev/pluto_lvThe current volume is: /dev/pluto_lvPrimary superblock is valid.J2_LOGREDO:log redo processing for /dev/pluto_lvPrimary 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 mapFile system is clean# mount /opt/pluto |
接下來,如果所有檢查都沒有發(fā)現(xiàn)問題,則從 rootvg 刪除原來的邏輯卷。一定要在重新引導(dǎo)(或執(zhí)行 exportvg)之前刪除原來的邏輯卷,因?yàn)?ODM 仍然包含原來的邏輯卷和文件系統(tǒng)屬性:
# lsvg -l rootvg…..fslv00 jfs2 64 64 1 closed/syncd N/A# rmlv fslv00Warning, all data contained on logical volume fslv00 will be destroyed.rmlv: Do you wish to continue? y(es) n(o)? yrmlv: Logical volume fslv00 is removed. |
結(jié)束語
在文件系統(tǒng)之間轉(zhuǎn)移或復(fù)制數(shù)據(jù)是系統(tǒng)管理員經(jīng)常執(zhí)行的一項(xiàng)任務(wù),無論是在同一卷組中復(fù)制還是通過網(wǎng)絡(luò)復(fù)制。在本文中,我演示了執(zhí)行這些任務(wù)的不同方法?梢杂迷S多方法復(fù)制數(shù)據(jù),我只通過示例重點(diǎn)介紹了其中的幾種。
關(guān)于作者
![]()
![]()
David Tansley 是一位自由作家。他有 15 年 UNIX 系統(tǒng)管理經(jīng)驗(yàn),最近 8 年使用 AIX。他喜歡打羽毛球和觀賞一級方程式賽車,但是最喜歡與妻子一起開著 GSA 摩托車旅行。
http://www.ibm.com/developerworks/cn/aix/library/au-cp_mv/index.html