如何在vultr帐号间转移快照

in cn •  last year

无解!至少按照官方给出的方法,无解。尽管vultr有宛如AWS一半般强大的快照功能(比如可以导入raw格式的快照,但没法导出),但我导出的raw格式反正就是不能用,无论放哪台服务器上都没法完整载入,每次只能载入1GB,这样恢复的instance当然不能用。这迫使我想别的办法。。。

好在vultr可以加载任意iso,既然可以加载Linux系统的livecd,而且livecd肯定带网络功能,那么我们可以用dd命令来搞:

先用源帐号开一个instance,操作系统选择需要转移的快照,开启后在iso library里面选择能用的iso,我之前是跟着这个教程搞的,所以选用了FreeBSD,你们也可以用别的,反正centos的盘不带livecd,ubuntu也不带。而且教程选用FreeBSD还是有点道理的,比如它的livecd启动之后会停留在选择安装还是使用livecd的选项,手残党福音。

然后想办法搞定网络问题,比如FreeBSD可以这样搞:

ifconfig vtnet0 [IP地址] netmask [子网掩码]
route add default [网关]

或者一句dhclient vtnet0也能搞定。

接下来就可以上dd大法了,用这么条命令:

dd if=/dev/vtbd0 bs=1m | ssh -e none myuser@myhost 'cat > nein.img'

很明显你需要另外一台VPS来存储镜像,最好和那台VPS在一个地区里面,直接在vultr里开一台就好了,但需要注意的是要比跑dd的机子高一级,不然空间不够。

搞定后会在中间服务器的/root目录下(或者/home/username,如果你没有用root用户的话)生成一个nein.img文件,大小等于那台VPS的磁盘大小,这就是所谓的raw格式的快照了。

按理来说我直接把这个文件扔upload snapshot里就搞定了,然而我发现它的存储快照的服务器居然在NY/NJ,我一新加坡的机子慢的1b,只好开一个洛杉矶的机子中转。但中转后仍然没解决没法完整载入的问题,所以我在想那个dd命令反过来写是不是就搞定了?

那么现在这么搞,在目标帐号里开一个和要转移的快照一样规格的instance(反正和官方快照恢复的方法一样,可大不可小),然后载入FreeBSD的iso,配置好网络,然后这么来:

ssh -e none myuser@myhost 'cat nein.img' | dd bs=1m of=/dev/vtbd0

刚好反过来,前者是将/dev/vtbd0(也就是vultr VPS的虚拟磁盘)的东西输出到stdout,然后通过管道接到ssh连接的另外一台服务器上,然后在那里作为stdin重定向写入到nein.img里。神奇的是这并非当dd读完盘之后再将这个几十GB的东西扔另外一台服务器上再写入,而是如同流水线一般同时进行的。而反过来的步骤就是用ssh连接另外一台服务器,在那里通过cat将nein.img的内容输出到stdout(然后就成了这台机子的stdout),通过管道直接接到dd的输入然后写入到/dev/vtbd0。反正感觉*nix世界简直屌爆了,如果这件事要winserver或者有网络的winpe做会如何,搞不好需要的额外体积就多出了不知多少GB了。Ghost之流好像可以备份到网络位置,但还是感觉比较恶心,比如还原的时候就不清楚能不能从网络位置还原了。总之现在我只需要坐看这坨东西什么时候搞完,反正我之前已经把镜像扔到vultr的洛杉矶节点了,而vultr的洛杉矶节点和新加坡节点之间的速度有些抽风(但也比别的方式好多了)。

然后完事之后重启,用vultr的方式建立快照,就这样完成了快照“转移”的过程。vultr官方还是让整件事情变得太蛋疼了。

之后又搞了一遍,这次全程只用新加坡的instances,iftop显示传输速度能上500Mbps,dd显示备份时37MB/s,恢复时57MB/s,反正源帐号的那两台instances都在一小时内搞完了,至于目标帐号的那台instance啥时候能搞完取决于vultr建立快照的速度(其实那个也在一小时内搞完了,而且再次恢复快照时只需10分钟,简直屌的1b)。还有我始终不明白vultr存储快照的服务器是只有NY/NY有,还是每个地区都有一个。

这个思路也可以用来搞其他用KVM技术的VPS商,哪怕他们没有快照,比如DigitalOcean,理论上来说只要他们的磁盘空间够就能搞。如果他们允许跑iso的话就好办了,不然的话我不清楚直接覆盖目标机器的linux系统会发生什么神奇的事情,是重启后直接变winserver还是根本启动不起来?还是会被DigitalOcean封号?鬼知道。

当然这种玩法还可以扩展地玩,比如找个便宜点的存储,毕竟新加坡这鬼地方没啥便宜的存储,也没有存储VPS用,但如果某里云的面向对象存储可以用HTTP方法来提取的话,而且如果它有新加坡节点的话,就可以试下用它来搞,再说了现在某里云有两个月的免费期,可以试着把快照放那儿。然后需要装个wget或者curl,输出到stdin,后面再接dd就搞定了。搞不好会比vultr自带的快照恢复要快(UPDATE:算了吧,存放费用按照25GB算只有0.5美元一个月,但我大致算了下流量费用,一个25GB的快照恢复一次就需要2美元,还是伤不起)。

UPDATE:其实我觉得应该还有更快的玩法,那就是不要中间服务器了,直接用dd命令在源服务器和目标服务器间对拷,理论上来说是可行的,命令如下:

dd if=/dev/vtbd0 bs=1m | ssh -e none myuser@myhost 'cat | dd bs=1m of=/dev/vtbd0'

但在这么搞之前,两台运行FreeBSD livecd的服务器都需要配置好,目标服务器除了需要配置好网络外还需要多出来一步:启用SSH server。

由于FreeBSD livecd的/etc位于只读文件系统,所以我们需要参照这个教程的做法,将其挂载到另外一个目录:

mkdir /tmp/etc
mount_unionfs /tmp/etc /etc
vi /etc/ssh/sshd_config # allow root login,就是将PermitRootLogin设成true,我就不吐槽FreeBSD的vi有多难用了
passwd root # Set a root password
service sshd onestart

然后就可以搞了。大功告成,在目标帐号的instance远程界面里出现了winserver2016的登录画面。

dd显示速度有35MB/s,对拷25GB的镜像需要765s,只需要一小时的六分之一,不错。

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

Congratulations @ddospezialist! You received a personal award!

Happy Birthday! - You are on the Steem blockchain for 1 year!

Click here to view your Board

Support SteemitBoard's project! Vote for its witness and get one more award!