这两天面临一个特定需求,遇到些问题,记录下。
需求:
我有一台安装了 ESXi 的服务器,其上运行了若干虚拟机,其中一台是 Ubuntu,我需要通过 USB 挂载一块新的硬盘到该虚拟机中,并分区格式化到 exFat 格式,最后将 Ubuntu 某特定文件夹的内容,完全同步到该硬盘中。
要解决的问题:
1,在 ESXi 下如何连接 USB 设备到虚拟机;
2,在 Linux 下对新硬盘的分区、格式化、挂载;
3,文件夹的同步过程及简单数据校验。
过程与小坑:
1,在ESXi下连接USB设备到虚拟机。
正常情况下,据官方文档讲只需将USB设备连接到服务器上,在ESXi的管理界面中,找到要使用这个USB设备的虚拟机,不必关机的情况下,直接编辑。
先检查虚拟机是否添加了USB控制器,若无请添加。然后添加其它设备,选中如下图所示的“USB设备”,从中选择具体的设备名称即可。
图:ESXi向虚拟机添加USB设备示例
这里踩到第一个小坑,如上图所示,在我的虚拟机中,USB设备居然显示灰色无法添加,翻看官方文档,在这一篇中提到:
原因
出现此问题的原因是默认情况下不可引导的USB设备为虚拟机预留。该设备并不显示在主机的文件系统中,尽管lsusb可以看到设备。
解决方案
停止 usbarbitrator 服务:
/etc/init.d/usbarbitrator stop
断开 USB 设备的物理连接然后再重新进行连接。
默认情况下,设备位置是:/vmfs/devices/disks/mpx.vmhbaXX:C0:T0:L0。
重新连接设备后,重新启动 usbarbitrator 服务:
/etc/init.d/usbarbitrator start
重新启动 hostd 和任何运行中的虚拟机,以还原对虚拟机中直通设备的访问权限。
注意:这需要通过SSH连接到ESXi主机进行操作,而不是ESXi上运行的Ubuntu虚拟机。默认情况下ESXi主机的SSH服务是关闭的,可以在管理界面菜单开启,不复赘述。在完成了上述操作后,就可以成功将USB设备添加到Ubuntu虚拟机了。
2,在Linux下对新硬盘的分区、格式化、挂载;
SSH登录到虚拟机,用 fdisk -l 命令查看一下当前连接的设备,找到其中的硬盘,例如:/dev/sdc
输入 gdisk /dev/sdc 进行分区操作:
先按 o 创建一个空的GPT分区表。
再按 n 创建一个新的分区,参数自定,exFat格式的代码是0700
再按 p 显示当前分区信息,检查一下。
再按 w 写入,使上述操作生效。
输入 mkfs.exfat /dev/sdc1 格式化该分区。
我将整个硬盘只分了一个区,结果如图:
图:linux硬盘分区示例
接下来挂载该磁盘:
创建一个挂载点。
mkdir /mnt/usb
挂载磁盘
mount -t exfat /dev/sdc1 /mnt/usb
一切正常的话,已经可以通过 /mnt/usb 访问该磁盘了。
如果要拔掉USB设备的话,安全起见,需要先停止读写任务,并卸载磁盘:
umount /dev/sdc1
最后再拔线。
3,文件夹同步及数据校验。
一般情况下,只需要简单的 cp -r 命令复制文件夹即可。但如果文件夹内的数据过于庞大,需要长时间复制万一中断也方便恢复,或者有可能定期增量更新的话,还是应该用 rsync 命令来同步。
rsync -r --size-only /source /destination
这会将 /source 目录中所有的子目录和文件,都同步到 /destination 目录中。在多次运行该命令时,若遇到相同大小的文件会跳过,而不同大小的文件会复制。
我这次需要同步的文件夹相当庞大,数据大约有3TB左右,为了避免一直保持SSH连接,所以需要让任务在后台运行,这就需要用到 nohup 命令
nohup rsync -r --size-only /source /destination &> /dev/null & echo $! > pid.txt
这会使 rsync 任务在后台运行,同时在当前目录下生成一个 pid.txt 文件记录这个任务的pid,方便后续 kill job
在漫长的同步过程中,如果想看 rsync 是否还在进行中,可以用 iotop 命令
iotop -o
这会显示当前有 I/O 操作的所有任务及其读写速率,如图:
图:Linux Ubuntu系统 iotop 命令示例
这里显示 rsync 还在以 106M/s 的速度读写磁盘。
任务正常结束后,rsync 会确保文件夹内容的一致性,但如果中途中断或有其它异常情况,想要确认一下的话,可以使用 du 命令
du -s --apparent-size /source
这会以字节为单位,显示 /source 目录下所有文件大小之和。
同样的方法查看一下 /destination 目录的大小,对比即可。
注意:这里的 --apparent-size 参数特别说明下,如果不加这个参数的话,统计的就是文件占用磁盘的字节数,当两个磁盘有着不同的簇大小时,这会导致即使文件完全相同而显示的数字却不同。整体而言,用 du 命令对比目录字节数,是一种简单高效而不甚严谨的方法。
全文完。
引用:
- ESXi文档:将 USB 设备从 ESXi 主机添加到虚拟机
- ESXi文档:无法将数据从 ESXi 主机复制到连接到该主机的 USB 设备