系统是HP-UX11i,两个72GB硬盘做镜像(当然用Mirror Disk),现在我想知道,在一个硬盘故障后,如何用一个新硬盘替换?
方法一、在 进入sam工具,选择替换热插拔,将故障磁盘转移。
SAM Disks and File Systems-->SAM Devices-->
0/0/2/0.2.0 Actions-->Replace Hot Pluggable Disk
将备用磁盘插入计算机中,插好 后,按“YES”。系统开始同步.
方法二、系统关机后,更换其中一块磁盘,新磁盘重新镜像。这好象是HP的建议。
那位老大真正做过镜像恢复,请给小弟一点建议。最好能在系统不重新启动的情况下做。但好象如果两硬盘都能BOOT的话,必须重新启动服务器,因为没做过,我不是太清楚,谢绝理论上的方法。
谢谢大家
day_dream 回复于:2003-09-04 09:53:06 |
顶 |
albert 回复于:2003-09-04 10:00:30 |
(好久没做过啦,理论方法,仅作参考)
-> 在线更换故障硬盘 -> ioscan -fnC disk (Scan for new disk) -> insf -eCdisk (Install special file for new disk) -> pvcreate -B /dev/rdsk/cXtYdZ (Create one bootable LVM disk, here /dev/dsk/cXtYdZ is the device file of the new disk) -> vgextend vg00 /dev/dsk/cXtYdZ -> mkboot /dev/rdsk/cXtYdZ (Make the new disk a boot disk) -> lvextend -m 1 /dev/vg00/lvol1 /dev/dsk/cXtYdZ lvextend -m 1 /dev/vg00/lvol2 /dev/dsk/cXtYdZ lvextend -m 1 /dev/vg00/lvol3 /dev/dsk/cXtYdZ ........ ( Mirror the LVs on the rootdisk to the new disk) -> lvlnboot -b /dev/vg00/lvol1 lvlnboot -r /dev/vg00/lvol3 lvlnboot -s /dev/vg00/lvol2 lvlnboot -d /dev/vg00/lvol? (which lv is your dump lv?) lvlnboot -R /dev/vg00 (Update the BDRA of the new disk) -> lvlnboot -v (Check the update result) |
jijianjun 回复于:2003-09-04 10:24:28 |
非常感谢albert大哥的指点!小弟很菜的,我仔细看过大哥的操作步骤,感觉上是在一个磁盘安装系统后,没有做任何镜像操作,另加一个空盘,两盘做镜像。我就不知道这和以前有镜像现在镜像 Broken,需要重新恢复镜像一样吗?查找资料,有位仁兄的步骤跟您的差不多,但他的镜像恢复操作中有:
#vgcfgrestore –n /dev/vg00 –o /dev/rdsk/cXtYdZ /dev/rdsk/cXtYdZ的步骤。您能详细说明他们之间的差异吗? 我比较苯,惭愧! |
lu407 回复于:2003-09-04 10:38:15 |
Let me show!
1.replace the failed disk 2.pvcreate -f -B /dev/rdsk/cXtXdX 3.vgcfgrestore -n /dev/vg00 /dev/rdsk/cXtXdX 4.vgchange -a y /dev/vg00 5.vgsync /dev/vg00 |
jijianjun 回复于:2003-09-04 11:00:23 |
To: Lu407
Are you sure it isn't necessary to do as follow? "lvextend -m 1 /dev/vg00/lvol1 /dev/dsk/cXtYdZ lvextend -m 1 /dev/vg00/lvol2 /dev/dsk/cXtYdZ lvextend -m 1 /dev/vg00/lvol3 /dev/dsk/cXtYdZ ........ ( Mirror the LVs on the rootdisk to the new disk) " whether they are include in "vgcfgrestore -n /dev/vg00 /dev/rdsk/cXtXdX "? |
albert 回复于:2003-09-04 11:27:38 |
对,你说的没错,我仔细看了一下,觉得有区别。
你在线换盘的同时,注意此时你并没有vgreduce这块盘。也就是说虽然你的盘是坏的,但这块盘依然在VG中。 vgcfgrestore 的命令实际上是将保存在/etc/lvmconf/下vg00.conf(vg00的VG信息)恢复到磁盘上,正常情况下VG中的每一个PV上都会写有一份Copy, 当LVM配置有任何改变,如lvextend,lvreduce,系统会自动将VG信息更新,保存到/etc/lvmconf下,并更新每个PV上的Copy,所以我的步骤中的vgextend其实已经将新PV上的VG信息更新,所以不需再做vgcfgrestore。 但你此时由于不需做vgreduce,vgextend,所以新硬盘上的VG信息为空!所以vgcfgrestore是唯一有效也是非常简便的方法。vgcfgrestore之后,新换上的磁盘上的VG 信息与原来那块坏的磁盘相同,但LV上的数据还是要用lvextend或vgsync来同步。 lu407,我觉得VG都没有必要deactivate然后再activate,可以在VG Active的时候做,你认为呢? |
day_dream 回复于:2003-09-04 11:39:25 |
楼上说的方法我见过,可以执行,但需要在更换坏盘前vgreduce,随后一样,至于lu407所说,我认为步骤不全,至少vg00什么时候deactive的就没有提到,但如果按照lu407所说可以的话,时间应该短一些吧。 |
williamCU 回复于:2003-09-04 13:22:45 |
请注意一下,搂主的环境好象是MIRROR BOOT盘。
一般不建议在线更换mirror的boot 盘。 没试过albert老大的做法,但我觉得到vgextend vg00 /dev/dsk/cXtYdZ 那一步也许会报错,另外,少了一个mkboot -a "hpux -lq" /dev/dsk/cXtYdZ. lu407 的做法,应该在单用户模式下作,否则vgcfgrestore会失败,(我昨天试过),另外少了mkboot那2步(BDRA分区信息都没有,怎么启动)。 如果哪位有环境的作个试验,并贴出试验结果就最好了。 |
aaron2002 回复于:2003-09-04 13:27:44 |
lu407的方法是对的,vg00本来就没有deactive,再重新做一遍
vgchange -a y /dev/vg00只是为了让VG能重新认到新加的这块盘. 我想补充一点就是在做pvcreate之前加下面一步: mv /etc/lvmtab /etc/lvmtab.bak 做完之后再: mv /etc/lvmtab.bak /etc/lvmtab |
jijianjun 回复于:2003-09-04 13:47:53 |
谢谢各位的建议。
我详细说明一下环境: rp5470 hp-ux11i ,MIRROR BOOT,现在一个磁盘故障,想用备用盘替换,替换后仍MIRROR BOOT。咨询过一些人,答案不一。我现在想知道: 1、是否需要SHUTDOWN掉服务器?(最好能不DOWN机) 2、如何做?(我倒是有几个操作的方法,跟楼上几位的大同小异,因为服务器上跑的应用挺重要,所以不敢轻易尝试) 3、我请有条件的各位能否真正做个实验,并将实验结果和步骤共享出来,也许以后大家碰到类似问题,心中就有底了。如果实验,不妨先从lu407兄的方法做起,毕竟他的好象最简单。 拜托! |
albert 回复于:2003-09-04 13:51:51 |
大家如果有条件的话实践一下,我这苦于没环境做试验。
WillamCU,我记得hpux -lq 是缺省的吧,所以我没加,你能跟我解释一下 lq 选项具体代表什么含义,我不记得了。 |
williamCU 回复于:2003-09-04 14:17:05 |
-lq不是缺省。
-lq表示启动时忽略quorum的要求,而quorum就是要求一个vg包含的磁盘中available的磁盘必须超过50%,否则vg不能被激活。 如果vg00由2块mirror盘组成,坏了一块盘,vg00不被激活,系统就不能启动, boot mirror也就失去了意义 |
yanggenlu 回复于:2003-09-04 14:29:02 |
我来说几句:
如果想再线换的话,首先要vgreduce,然后才能做其他步聚。 如果是停机做的话,vgreduce就不需要了。 |
lok1234 回复于:2003-09-04 16:34:31 |
还没试过vg00 deactive是什么效果呢。 |
hpux 回复于:2003-09-04 17:33:11 |
很久没看到这么精彩的讨论了,虽然很忙,但是忍不住要说说我的意见:
1、恢复镜像盘配置信息最好用vgcfgrestore来做,因为镜像盘FAIL的时候,vgreduce做不出来(我试过lvreduce就已经死进程了); 2、/etc/lvmtab不用做任何备份,即使丢了也可以用vgscan -y“捡”回来(不知道aaron2002老大是和用意?); 3、如果是做boot盘,mkboot和lvlnboot -R这两步一定是要的; 4、2块盘做镜像一般做-lq启动形式,否则重启以后系统不会自动从第二块盘启动,如williamCU老大所说; 5、最好用lvlnboot -v确认Boot,Dump,Root,Swap的信息,如果没有设置好需要重新设置。 支持热插拔的硬盘更换绝对不需要重启即可完成,尽管放心去做!小心别把现有的盘数据做掉就行了! |
jijianjun 回复于:2003-09-04 18:27:19 |
谢谢各位老大!
我就把各位的意见和自己的看法写了一个操作步骤,就算抛砖引玉吧,请各位一定不要客气,多多指教: 1. left the FAULTY disk 2. insert the new disk 3. #ioscan -fnC disk 4. #insf -eCdisk #vgcfgrestore -n /dev/vg00 /dev/rdsk/c2t2d0 #vgchange -a y /dev/vg00 5. #mount /usr #mkboot /dev/rdsk/c2t2d0 #mkboot -a "hpux -lq (;0)/stand/vmunix" /dev/rdsk/c2t2d0 #lvlnboot -R #lvinboot -v 6. #vgsync /dev/vg00 中间有什么遗漏或多余的步骤,请不吝赐教! |
williamCU 回复于:2003-09-04 19:28:55 |
to jijianjun:
给你提意见了,不好意思 如果替换的硬盘插在原来位置,ioscan,insf应该不用作 你的步骤中似乎不包括重启到单用户模式,但又使用了mount /usr。 |
albert 回复于:2003-09-04 20:54:27 |
williamCU说的在理,一个看似简单的问题让我复习和学习了好多知识,温故而知新啊,谢谢大家。
谁能有条件试验一下,在线换的步骤,然后与大家分享一下过程。 |
jijianjun 回复于:2003-09-05 09:03:24 |
谢谢williamCU的建议,我自己思路可能不是太清晰。谢谢。
另外,albert 老大说的对,请有条件的老大试验一下,在线换的步骤,然后与大家分享一下过程。 让我们一起进步。 |
aaron2002 回复于:2003-09-05 09:26:51 |
[quote:30851bdacf="hpux"]很久没看到这么精彩的讨论了,虽然很忙,但是忍不住要说说我的意见:
1、恢复镜像盘配置信息最好用vgcfgrestore来做,因为镜像盘FAIL的时候,vgreduce做不出来(我试过lvreduce就已经死进程了); 2、/etc/lvmtab?.........[/quote:30851bdacf] 2.如果不将/etc/lvmtab改名的话,pvcreate这一步就做不了.^_^ 因为是做启动盘,mkboot,mkboot -a ,lvlnboot -Rv这几步确实一定要. |
hpux 回复于:2003-09-05 10:24:24 |
[quote:b6091e5720="aaron2002"]
2.如果不将/etc/lvmtab改名的话,pvcreate这一步就做不了.^_^ 因为是做启动盘,mkboot,mkboot -a ,lvlnboot -Rv这几步确实一定要.[/quote:b6091e5720] 我实际操作过(不过现在不能立即实验了),不用改lvmtab直接pvcreate可以! |
aaron2002 回复于:2003-09-05 10:59:45 |
因为lvmtab里面已经包括那个坏盘的设备文件名了,假设为:/dev/dsk/c0t0d0,如果不移开lvmtab这个文件而直接做pvcreate的话,系统肯定会提示这个设备已经存在/etc/lvmtab里面了, 你有时间可以做个实验证明一下. ^_^ |
suidy 回复于:2003-09-05 11:31:04 |
Let me show!
1.replace the failed disk 2.pvcreate -f -B /dev/rdsk/cXtXdX 3.vgcfgrestore -n /dev/vg00 /dev/rdsk/cXtXdX 4.vgchange -a y /dev/vg00 5.vgsync /dev/vg00 basically ok. but 2 is for root disk should know the conditions on site,if possibl,e not use saM. |
williamCU 回复于:2003-09-05 11:45:09 |
楼上的和前面那位lu407 的步骤一样哦。
做vgcfgrestore之前不需要做pvcreate的。 再说,更换镜像盘后,/etc/lvmtab仍然保存了以前坏的硬盘的信息,所以如果不rename /etc/lvmtab ,pvcreate应该会报错. |
albert 回复于:2003-09-05 12:42:11 |
我想如果/etc/lvmtab中有该PV的记录的话,系统则会认为该PV属于某个VG,此时如果pvcreate (即使加 -f 参数也不行),报错如下:
pvcreate: The physical volume "/dev/dsk/c2t2d0" is already recorded in the "/etc/lvmtab" file. 不过hpux老大说他做过试验,我们当然以事实为准,哪位试了以后如果确实如此,我们可以再讨论。 WillamCU, 我的理解是vgcfgrestore只会将VG Configruation(VGRA)恢复到新的磁盘上,但是PV的LVM信息(PVRA)信息应该必须由pvcreate初始化来完成,但我看有的文档上说在线换也没提到pvcreate这一步,所以我也很迷惑。 只能等以后有机会试验一下了。 |
cuixn 回复于:2003-09-05 12:58:08 |
楼上老大说得对!我上次换盘时,就是这样的!
我把lvmtab给改名字来了,然后vgscan,在做就行了 |
hpux 回复于:2003-09-05 13:19:20 |
Agree to albert!
是我忘记了,在线换盘根本用不着做pvcreate这步,cgcfgrestore就已经把所有信息恢复了。 |
aaron2002 回复于:2003-09-05 13:29:12 |
由于坏的是根盘,所以我认为一定要做pvcreate -B这一步,我做过实验,不做这一步肯定会出问题... |
hpux 回复于:2003-09-05 14:11:20 |
[quote:24da979669="aaron2002"]由于坏的是根盘,所以我认为一定要做pvcreate -B这一步,我做过实验,不做这一步肯定会出问题...[/quote:24da979669]
很奇怪哦! 我有一台L2000机器,2块热插拔硬盘做MIRRO,主盘坏了,在线换主盘!虽然不是我自己做,但是HP工程师(原来负责Alpha)还没有我熟悉,看他操作的时候就是没做pvcreate -B,他都是按HP Call-center发给他的文档来做。我觉得很奇怪, 后来是因为mkboot (-a)没做,从主盘启动不了。 做了以后,就可以启动了,从头到尾就没有用过pvcreate! 到现在系统重启好几次了,都是从主盘启动,没出现过什么问题! |
hpux 回复于:2003-09-05 14:23:03 |
特地找了一下HP的知识库,大家不妨参考一下:
(BTW,这里有谁上过LVM课程的,里面有很详细的解释) ---------------------------------------------------------------------- CHAPTER 4 : Replacing a boot disk WITH mirroring ---------------------------------------------------------------------- As with chapter 2, mirroring adds a new twist to the recovery of a boot disk, and makes the recovery much simpler than without mirroring. Example configuration: Volume group /dev/vg00 contains the three disks, with the logical volume configuration as shown: |---------| |---------| |---------| | lvol 1 | | lvol 1 | | lvol 4 | | | | mirror | | | |---------| |---------| |---------| | lvol 2 | | lvol 2 | | lvol 5 | | | | mirror | | | |---------| |---------| | | | lvol 3 | | lvol 3 | | | | | | mirror | | | |---------| |---------| |---------| hardware address 52.6.0 52.5.0 52.4.0 device file (/dev/dsk/) c0t6d0 c0t5d0 c0t4d0 This scenario involves a head crash of the disk at hardware address 52.6.0. [Step 4.1] Shutdown the system, have the customer engineer replace the faulty disk, and then boot the system in single-user mode from the alternate boot disk. If you only have two disks in the root volume group, then you will need to override quorum as you boot. Note that you don't have to boot in single-user mode if all of the disk data is mirrored elsewhere (but you may still have to override quorum). Note: If the disk being replaced is Hot-Pluggable (or Hot-Swappable) a reboot may not be necessary. Please inquire your customer engineer to determine if a reboot is required. If a reboot is not required replace the disk and go on to step 4.2. For our example: ISL> hpux -is (52.5.0;0)/stand/vmunix OR ISL> hpux -is -lq (52.5.0;0)/stand/vmunix (if you need to override quorum.) [Step 4.2] Restore the LVM configuration/headers onto the replaced disk from your backup of the LVM configuration, activate the volume group with the knowledge of the replaced disk, use mkboot to add boot information, and syncronize the BDRA with these commands: # vgcfgrestore -n /dev/vg00 /dev/rdsk/c0t6d0 # vgchange -a y /dev/vg00 # mount /usr # mkboot /dev/rdsk/c0t6d0 # mkboot -a "hpux (;0)/stand/vmunix" /dev/rdsk/c0t6d0 # lvlnboot -R Note: If /usr doesn't reside in /dev/vg00 the volume group that does contain /usr's logical volume will also have to be activated. At this point it is a good idea to verify that the BDRA information is accurate. This can be done with the lvlnboot comman using the -v option. Here is an example of the output: # lvlnboot -v Boot Definitions for Volume Group /dev/vg00: Physical Volumes belonging in Root Volume Group: /dev/dsk/c0t6d0 (52.6.0) -- Boot Disk /dev/dsk/c0t5d0 (52.5.0) -- Boot Disk /dev/dsk/c0t4d0 (52.4.0) Boot: lvol1 on: /dev/dsk/c0t6d0 /dev/dsk/c0t5d0 Root: lvol3 on: /dev/dsk/c0t6d0 /dev/dsk/c0t5d0 Swap: lvol2 on: /dev/dsk/c0t6d0 /dev/dsk/c0t5d0 Dump: lvol2 on: /dev/dsk/c0t6d0, 0 Note: You must have performed the command vgcfgbackup to save off the headers prior to the disk failure (refer to Appendix A.). [Step 4.3] Now, synchronize mirrored logical volumes: # vgsync /dev/vg00 [Step 4.4] If you have any logical volumes that resided on the faulty disk that were not mirrored, you will need to recreate them as per steps 1.4 and 1.5 from chapter 1. [Step 4.5] The final step in the recovery process is to reboot the system. When the system restarts, the recovery process will be complete. # cd / # shutdown -r At this stage, your system should be fully recovered. It is a good idea to verify the system can be booted from the newly replaced drive. By hpux:热插拔硬盘不用象文章所说启动到单用户LV M模式! |
williamCU 回复于:2003-09-05 15:12:38 |
我刚试了一把,我的是热茶把硬盘,呵呵!
步骤如下: 1.更换硬盘。 2#.vgcfgrestore -n /dev/vg00 /dev/rdsk/cXtYdZ(恢复VGDA和PVRA) 3.#vgchange -a y /dev/vg00(强制验证硬盘) 4# mkboot /dev/rdsk/c0t6d0 (创建BDRA) 5# mkboot -a "hpux -lq" /dev/rdsk/c0t6d0(在LIF区建启动字符串) 6# lvlnboot -Rv(恢复并显示BDRA信息) 7#vgsync /dev/vg00(同步卷组) 8#lvdisplay -v /dev/vg00/lvol*|grep -i "lv status" (验证同步完成) 9#setboot (验证硬盘启动顺序) 10#lifcp /dev/dsk/cXtYdZ:AUTO - 验证lif区信息是否正确 |
jijianjun 回复于:2003-09-05 15:59:28 |
呵呵,谢谢各位老大的热心帮助,我近期就按各位的方法去实际做一下,然后把实际操作过程和结果贴出来。 |
hpux 回复于:2003-09-05 17:53:41 |
HP-UX版日益壮大耶!祝贺~~~ |
雪倩儿 回复于:2003-09-08 14:38:58 |
哦.............. |
day_dream 回复于:2003-09-08 18:41:01 |
owenqu 回复于:2003-09-11 14:19:14 |
不知道jijianjun最后实际做的结果如何,期待中! |
fy_hpunix 回复于:2003-09-13 10:50:30 |
进hpux -lm
VG00 就是的 deactive |
inHP 回复于:2003-09-14 22:03:56 |
在HP文档上分几种情况,主机是否重启过?vgcfgbackup文件是否完好?vg00是否跨盘?组合起来就有不同的步骤。 |
jijianjun 回复于:2003-09-17 08:55:22 |
让各位久等了,我是9月14日进行实际操作,成功!下面是实际得作业过程。
1、停止数据库应用服务。 2、备份相关数据。 3、更换故障硬盘。(必须是热插拔的硬盘) 4、#ioscan -fnCdisk (识别新的硬盘) 5、#vgcfgrestore -n /dev/vg00 /dev/rdsk/c2t2d0 6、#mkboot /dev/rdsk/c2t2d0 #mkboot -a "hpux (;0)/stand/vmunix" /dev/rdsk/c2t2d0 7、#lvlnboot –b /dev/vg00/lvol1 //boot lvol1 #lvlnboot –r /dev/vg00/lvol3 //root lvol3 #lvlnboot –s /dev/vg00/lvol2 //swap lvol2 #lvlnboot –d /dev/vg00/lvol2 //dump lvol2 #lvlnboot –R #lvlnboot –v //view 8、#setboot (确认boot信息) 9、#sync (做同步) 10、#reboot (重新启动服务器,确认能正常启动) 11、启动数据库应用服务,测试正常。 经测试,得出以下结论: 1、在线更换硬盘,不需要做pvcreate. 2、如果离线更换硬盘,关机前要vgreduce这块盘,不然重新启动服务器后无法pvcreate。 3、如果关机前没有vgreduce这块盘,关机后重新启动服务器,做pvcreate时,此时必须更改/etc/lmvtab文件名,不然系统提示已经存在。 感谢各位得帮助! |
yanggenlu 回复于:2003-09-17 19:44:30 |
你的以下结论都不对,
1如果这个硬盘在其他地方用过的话,肯定要要pvcreate,不管是否在线更换。 2。如果离线更换硬盘,不一定要关机前要vgreduce这块盘,你可以加-f参数来pvcreate 3。如前2所述 |
yanggenlu 回复于:2003-09-17 19:46:15 |
补充一下,重启以后要进单用户来做。 |
williamCU 回复于:2003-09-18 10:03:17 |
to:jijianjun
无论在线还是离线,只要新的硬盘还插在原来位置,只要lvmconf下的vg信息还在,我觉得都不需要作pvcreate的. 你作过实验了,不知离线替换时,vgcfgrestore为何不能成功,能说来听听么? |
jijianjun 回复于:2003-09-18 13:21:20 |
过程如下,但不好意思,我不是在单用户模式下做的。
# vgcfgrestore -n /dev/vg00 -o /dev/rdsk/c2t2d0 /dev/rdsk/c2t2d0 vgcfgrestore: Couldn't query physical volume "/dev/dsk/c2t2d0": The specified path does not correspond to physical volume attached to this volume group Volume Group configuration has been restored to /dev/rdsk/c2t2d0 #cp /etc/lvmtab /etc/lvmtab030914 # rm /etc/lvmtab # pvcreate -f -B /dev/rdsk/c2t2d0 Creating "/etc/lvmtab". Physical volume "/dev/rdsk/c2t2d0" has been successfully created. # vgcfgrestore -n /dev/vg00 -o /dev/rdsk/c2t2d0 /dev/rdsk/c2t2d0 vgcfgrestore: Volume group "/dev/vg00" does not exist in the "/etc/lvmtab" file. Volume Group configuration has been restored to /dev/rdsk/c2t2d0 #cp /etc/lvmtab030914 /etc/lvmtab # vgcfgrestore -n /dev/vg00 -o /dev/rdsk/c2t2d0 /dev/rdsk/c2t2d0 vgcfgrestore: Couldn't query physical volume "/dev/dsk/c2t2d0": The specified path does not correspond to physical volume attached to this volume group Volume Group configuration has been restored to /dev/rdsk/c2t2d0 #vgextend /dev/vg00 /dev/dsk/c2t2d0 vgextend: Warning: couldn't query physical volume "/dev/dsk/c2t2d0": The specified path does not correspond to physical volume attached to this volume group |
albert 回复于:2003-09-18 13:48:38 |
To jijianjun:
If the device file of the disk is not changed(actullay in your case it will not be changed because the SCSI controller and target number of the new disk is the same as the old one), you don't need to do 'vgcfgrestore' with '-o' option. I think you can just use 'vgcfgrestore -n /dev/vg00 /dev/rdsk/c2t2d0' to restore the lvm configuration stored under /etc/lvmconf to the new disk. And it is not necessary to do 'pvcreate' at all, 'vgcfgrestore' will restore the PVRA to the new disk. I have tried to do so and I succeeded. You can try again if you such an opptunity. BTW, it is unuseful to use '-f' option with 'pvcreate' to forcefully initialize one disk when it is listed in the /etc/lvmtab. |
延伸阅读
文章来源于领测软件测试网 https://www.ltesting.net/