「こんなきれいな星も、やっぱりここまで来てから、見れたのだと思うから。だから・・もっと遠くへ・・」

最近的一些无聊折腾过程

这两天折腾了一下学校的Athena……

首先是发现了一个很有用的软件sshfs,功能是实现基于ssh的网络磁盘。用法大概是

sshfs [username]@[server]:[path] [mountpoint] -o transform_symlinks -o follow_symlinks -o StrictHostKeyChecking=no

这样子。然后mountpoint处就挂载了服务器那边的目录,由于相当于建立了一个虚拟的挂载点,对软件是完全透明的,可以像使用本机数据一样直接使用它们。
命令里两个软链接的选项可以处理链到其他目录的软链接的问题,最后那个选项是为了避免有时候ssh弹出来的unknown host提示把sshfs搞迷糊的事情。
如果支持public key可以用-o Identity=XXX来使用public key避免挂载时输密码。
不支持public key的话可以配合-o PreferredAuthentications=password -o password_stdin选项,然后就可以直接echo 密码 | sshfs XXX这样,也不用输密码了,但密码明文保存不太安全…… (学校Athena不支持公钥认证,如果公钥认证连接必须在连接后renew输密码才行……)
unmount的话直接fusermount -u [挂载点]就可以,也可以sudo umount [挂载点]。

这样只需要在笔记本上挂一个sshfs,学校Athena服务器里的数据就可以像访问本地磁盘里的数据一样直接访问了。然后在学校Athena服务器那边也用sshfs建一个挂载点,把笔记本的硬盘挂载上去,这样两台设备的数据就无缝共享了。有一个小问题是由于笔记本电脑的IP是会变动的,我的解决方法是利用dropbox自动同步:写一个开机启动的脚本,每隔一分钟把当前IP写入本地dropbox文件夹里,然后dropbox就会自动把这个文件同步到网上,由于dropbox的share link是永久不变的,在Athena端的连接脚本wget这个链接就能自动获取笔记本当前的IP了。

如果出现断网之类的情况打开sshfs挂载点的窗口会卡死,这时候只要kill掉ssh然后重新连就可以了。(sshfs进程是kill不掉的,但只要kill掉ssh进程sshfs就会自动退出) 也可以sudo umount -f [挂载点]强制卸载挂载点。

搭好sshfs后从本地访问Athena已经非常方便了,于是想进一步折腾一点什么。由于远程链接到athena只能连接到athena dialup server,机房里那些机器sshd都是禁用的,于是只能打athena dialup的主意了。看了一下发现athena dialup server有七个服务器,每个服务器有6个CPU,每个CPU主频都有我自己笔记本电脑的三倍(虽然我的笔记本CPU是800MHz的)…… 于是想能不能利用这个搞个分布式计算之类的东西玩玩呢2333……

于是花了一个晚上写了一个程序实现了这个玩意,过程还是挺有意思的。由于在ssh时候没法预先确定会连接到7台服务器中的哪一台(后来发现是有办法的,但发现这点时候已经太晚了233),于是总的思路就是server用ssh在服务器端spawn出一堆client,每个client启动后读取/etc/hostname,然后识别是不是这个host下已经有其他client在跑了,如果有就退出,否则就开始执行。client和server之间的通信一开始想用管道文件,后来发现不行…… 想想也正常,管道文件只是内核模拟出来的一个文件,现在server和client根本不在一台机器上(虽然通过sshfs共享着磁盘),当然没法用管道文件了…… 于是只好用低效的普通文件每隔几秒钟检查一次的方法来通讯了,用文件锁来避免并发问题。有一个比较猎奇的地方是怎么读完内容后清空内容,由于期间锁不能断开(否则就有并发问题了),直接fclose掉再删肯定不行,后来找到一个函数ftruncate可以完成这个事情。还有一个问题是怎么让ssh关闭后client继续执行。似乎nohup或者disown之类都没用,应该是athena dialup服务器特意做了检查,只要一个用户登出了就把他的所有进程都杀掉…… 后来发现一个bug,用公钥认证连接然后renew的话似乎这个机制就失效了23333

虽然好像这个东西做出来好像暂时也没想到有啥用233,大概只有打GCJ时候有用了23333,30个CPU一起跑数据>_< 或者跑测试数据时候大概能快一点……