20TB文件服务器迁移记录
公司现有的一台Windows文件服务器,容量已高达20TB,因使用年限长且已插满硬盘无法扩容,于是公司决定购买新的服务器替换。目前面临着一个问题:服务器上面共享了众多文件夹,并对不同的用户及组设置了详细的访问控制权限。如何使得这些共享文件夹由旧服务器平稳迁移到新服务器上,而共享权限及NTFS权限保持不变?
对于这个需求,经过研究和测试,可使用以下3种免费方案:
1. 通过Xcopy命令进行文件的迁移;
2. 通过FSMT工具进行文件的迁移;
3. 通过Robocopy命令进行文件的迁移。
第一种方案: Xcopy
Xcopy的出现主要是为了解决Windows默认图形化拷贝与copy命令的不足,xcopy可以实现更加灵活的拷贝控制,例如控制只拷贝某些类型的文件,只拷贝某日期后修改过的文件,只拷贝文件目录结构,只可拷贝文件夹及子文件夹内容。
xcopy source destination /E /C /H /Y /K /O /X ,其中 source 是要复制的文件的源路径,destination 是这些文件的目标路径。其他主要参数解释如下:
/E 复制目录和子目录,包括空的。 与 /S /E 相同。可以用来修改 /T。
/C 即使有错误,也继续复制。
/H 也复制隐藏和系统文件。
/Y 禁止提示以确认改写一个现存目标文件。
/K 复制属性。一般的 Xcopy 会重设只读属性。
/O 复制文件所有权和 ACL 信息。
/X 复制文件审核设置(隐含 /O)。
更详尽的参数可参阅帮助信息
示例:
Xcopy "\\Fileserver\IT" "d:\IT" /E /C /H /Y /K /O /X
对于第一种方案,/O/X/E/H/K 开关的 Xcopy 命令复制文件并保留已明确应用于这些文件的现有权限,但是当文件太多,网络COPY容易出现某个文件无法COPY或是网络中断等一些不可预料的问题,而一旦出现这种问题,这种拷贝方式无法实现“断点续传”,那整个迁移过程将会失败。
测试中还发现通过Xcopy复制的话,父文件目录时间戳记会丢失。如果对于目录时间戳记迁移、以及复制性能没有过多要求,仅用于迁移NTFS权限,那么Xcopy这种方案还是不错的选择。
第二种方案:FSMT
第二种方案则是File Server Migration Toolki,是微软推出的扩展工具,使用 FSMT 来实现迁移文件夹及其权限。
经过测试,发现文件时间戳已经被迁移过来,但文件目录时间戳没有被迁移。
从实际测试结果来看,发现迁移过来之后SID不一致,会合并一些权限,与源文件夹权限有些微变化。
在测试中发现此种方式的速度较慢,在微软官方文档可以看到相关说明:Windows Server迁移工具的文件迁移部分是面向小型数据集(小于 100 GB 的数据),它会通过 HTTPS 逐个复制文件。
好处是FSMT可以提供GUI操作画面,对于技术性要求不高。
第三种方案: Robocopy
RoboCopy可以认为是Xcopy的 “替代升级版”,比Xcopy有更好的功能选项。
比如在重试逻辑上面,Robocopy可以做到在一定时间内,默认30秒,出现网络中断,不会导致复制中断,复制会在这个时间内继续次数尝试,直到成功复制。
示例:
robocopy "\\Fileserver\d$\IT" "e:\IT" /e /efsraw /copyall /dcopy:t /r:3 /w:3 /log:d:\IT.txt
几个有关的参数解释如下:
/E 复制子目录,包括空的子目录;
/COPY:复制标记 要复制的文件内容(默认为/COPY:DAT)
[ 复制标记:D=数据,A=属性,T=时间戳,S=安全=NTFS ACL,O=所有者信息,U=审核信息 ] /copyall 复制所有文件信息(= /COPY:DATSOU)
/R:n 失败后重试次数;(默认1000,000次)
/W:n 失败后等待时间;(默认30秒)
/V 生成详细输出,并显示跳过的文件;
/LOG:PATH LOG日志覆盖输出至指定路径下的LOG日志内;
/LOG+:PATH LOG日志追加输出至指定路径下的LOG日志内;
/EFSRAW :: 在 EFS RAW 模式下复制所有加密的文件。
/DCOPY:T 复制目录时间戳
robocopy还有非常多的参数,更详尽的参数可参阅帮助信息robocopy /?
从实际效果来看,robocopy可以完美地迁移文件内容、文件及目录的安全属性和时间戳,并能够输出完整过程及详细log,满足本次迁移需求,是首选方案。
使用技巧
robocopy可输出日志,方便找到失败的文件记录。
重复执行robocopy命令时,如果文件或目录被删除了,会显示有*多余文件或*多余目录
*多余文件 XXXXXXXXXXXXXXXXXX
*多余目录 XXXXXXXXXXXXXXXXXX
备份文件会比原目录保留那些被删除的文件(可用来备份)。
本次目的是迁移,改用镜像参数/mir更合适,可将多余文件删除,结合参数/efsraw /copyall /dcopy:t可拷贝加密、NTFS权限和时间戳过去。
robocopyy "\\fileserver\d$\信息部" "d:\信息部" /mir /efsraw /copyall /dcopy:t /r:2 /w:2 /log:"d:\robolog\fileserver_20210101_信息部.txt"
异常处理
因历史文件特别多,会出现个别用户修改文件所有者权限的现象,导致有少数文件连超级管理员都无权限读取,需重新夺取所有者权限,怎么在这上百万个文件查到这些文件?
可用Power GREP工具快速分析日志,找出带“错误”标识的行,这些行就是拷贝失败的文件。
正则写法如下:
^((?!\~\$).)* 错误 ((?!\~\$).)*$ 查出带关键字“ 错误 ”的行,注意前后有空格,并排除文件名也含有“错误”的文件,比如某excel文件名本身就叫错误样本。
找出这些行再重新赋权即可。
另外日志也会出现某些行带有~$标记,因在线编辑的文件关闭后不再存在临时文件,等到robocopy要拷贝时会记录为错误。类似的可用以下方法找出剔除,以便核对正确的错误文件总数。
^((?!0x00000002).)* 错误.*$
新文件 165 ~$新产品开发.xlsx
2021/01/01 13:54:02 错误 2 (0x00000002) 正在复制文件 \\fileserver\2020年\~$新产品开发.xlsx
Tips:
重复执行robocopy过后,存在的文件会跳过,不会重复复制,从而可提前将大量文件拷贝过去。到真正切换的时候先禁用原服务器共享文件夹允许写入,再执行最后一次robocopy即可。这次只是拷贝少量新增或修改过的文件,从而可快速切换,未出现数据丢失。