他のマシンでお手伝い

おうちに転がってるネットブックな非力マシン ASUS Eee PC 901。

このマシンでもレイトレーシングの計算のお手伝いをさせてみようかと。

久しぶりに起動。

$ uname -a
Linux kondoh-901 3.13.0-66-generic #108-Ubuntu SMP Wed Oct 7 15:21:40 UTC 2015 i686 i686 i686 GNU/Linux

$ cat /etc/issue
Ubuntu 14.04.3 LTS \n \l

$ dmesg | grep 'CPU.*Intel'
[    0.082673] smpboot: CPU0: Intel(R) Atom(TM) CPU N270   @ 1.60GHz (fam: 06, model: 1c, stepping: 02)

$ ps ax | grep sshd | grep -v grep
$ 

とりあえず sshd をば

$ sudo apt-get update
$ sudo apt-get install openssh-server
$ ps ax | grep sshd | grep -v grep
 5932 ?        Ss     0:00 /usr/sbin/sshd -D
$ 

$ ifconfig -a
  :
wlan0     Link encap:イーサネット  ハードウェアアドレス 00:15:af:e7:01:99  
          inetアドレス:192.168.1.9  ブロードキャスト:192.168.1.255  マスク:255.255.255.0
  :

では、Macからlogin

$ ssh 192.168.1.9
The authenticity of host '192.168.1.9 (192.168.1.9)' can't be established.
ECDSA key fingerprint is SHA256:OH5rwJOAh88nkIFuP9r8jdvYOgIZ9ewRBGS5qioQjp4.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.9' (ECDSA) to the list of known hosts.
kondoh@192.168.1.9's password: 
[パスワード入力]

Welcome to Ubuntu 14.04.3 LTS (GNU/Linux 3.13.0-66-generic i686)

 * Documentation:  https://help.ubuntu.com/
  :
$ 

pythonは?

$ which python
/usr/bin/python

$ python
Python 2.7.6 (default, Jun 22 2015, 18:00:18) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> ^D
$ 

numpy はインストールした覚えがないのでとりあえず入れておきます。

$ sudo apt-get install python-numpy
$ python
 :
>>> import numpy
>>> 
>>> ^D
$ 
$ exit

Mac側に戻って今回のパッチ。

v31.patch

$ cat v31.patch | ( cd rt ; patch -p1 )

$ mkdir ttt
$ tar cf - rt | tar xf - -C ttt
$ mv ttt/rt rt_v31
$ rmdir ttt

$ cd rt_v31

$ make clean
$ make

今回は都合でディレクトリ名は rt/ じゃなくて rt_v31/ にしてます。

そして、ちょっとやばそうなツールを作ってみました。 まぁ自分のマシンで勝手に試すだけなので...

$ ./cmd_send.py host=192.168.1.9
cmd="tar cf - cmd.py | ssh -R55511:localhost:55511 -R55512:localhost:55512 \
-L55520:localhost:55510 -L55523:localhost:55513 -L55524:localhost:55514 \
-L55525:localhost:55515 -L55526:localhost:55516 -L55527:localhost:55517 \
-L55528:localhost:55518 -L55529:localhost:55519 192.168.1.9 "cd /tmp ; tar xf - ; ./cmd.py port=55510""
kondoh@192.168.1.9's password: 
[ パスワード入力 ]

sshでMacから192.168.1.9のネットブックに接続しますが、 -R と -L オプションでポートフォワーディングの設定をしてます。

Macのポート55511, 55512 をネットブックに見せつつ、 ネットブックのポート 55510, 55513, 55514 ... 55519 を、 Macの55520, 55523, 55524 ... 55529 として、 +10したポートで見えるようにしてます。

Macで起動するsshの標準入力に cmd.py をtarでアーカイブしたデータをながしつつ、

tar cf - cmd.py | ssh ...

ssh でログインした先のネットブック上では、 /tmp に移動して、そこに標準入力から cmd.py のアーカイブデータを展開。 展開したての cmd.py をオプション port=55510 を指定して実行します。

... cd /tmp/ ; tar xf - ; ./cmd.py port=55510

cmd_send.py コマンドは起動したままにして、sshの接続を保っておきます。 これでネットブックへのバックドアの仕込み完了。 ネットブックのポート55510でコマンドを受け付ける口をあけてます。 このポートはsshの経路を通して、Mac側のポート55520として見えてます。

Mac側から

$ echo hostname | nc localhost 55520
kondoh-901
$ 

$ echo pwd | nc localhost 55520
/tmp
$ 

つづいて、Macからソースコードを送りつけてビルドします。

$ make clean

$ ./src_send.py path=../rt_v31
d=.. n=rt_v31
rmt_cmd=echo "nc localhost -l 55519 | tar xf -" | nc localhost 55520
lcl_cmd=tar cf - -C .. rt_v31 | nc localhost 55529
wait
cmd=echo "cd rt_v31 ; make clean ; make" | nc localhost 55520
$ 

$ echo ls | nc localhost 55520
cmd.py
config-err-cLU0tn
rt_v31
$ 

$ make

やってる事は

ここで使うポートの決め事を少々

srvs.py に記録してる
  :
base_port = 55500
  :

55500 からの 100ポート分を予約です。

10の位の値は
1: 起動してるサーバが使用
2: ネットブック側で起動してるサーバをMac側から見えるポート

下1桁の割り振りは
0: コマンド実行用
1: 値サーバ val.py
2: 画像サーバ img.py
3: レイトレサーバ rt
4: 交点を求める用のサーバ cross (今回使わず)
  :
9: ファイルコピー時にデータを流す用

Mac側で実行してる、値サーバ 55511 と 画像サーバ 55512 は、 ネットブック側でも ssh のポートフォワーディングで、 同じ 55511, 55512 として見えてます。

srvs.py の infs = [ ... ] で設定している 'srv.rt-2' がネットブック側で実行するレイトレサーバの設定になります。

base_port = 55500

infs = [
	( 'srv.val', { 'port': base_port + 11, 'cmd': './val.py boot', 'pid': -1 } ),
	( 'srv.img', { 'port': base_port + 12, 'cmd': './img.py boot', 'pid': -1 } ),
	( 'srv.rt', { 'port': base_port + 13, 'cmd': './rt boot', 'pid': -1 } ),
	( 'srv.cross', { 'port': base_port + 14, 'cmd': './cross boot', 'pid': -1 } ),

	( 'srv.rt-2', { 'port': base_port + 23, 'cmd': 'echo "cd rt_v31 ; ./rt boot" | nc localhost {}'.format(base_port + 20), 'pid': -1 } ),
]

'srv.rt-2' を起動するためのコマンド文字列が、 "cd rt_v31 ; ./rt boot" という文字列を、ポート55520 にncで送り込むコマンドになってます。

これでネットブックの55513ポートを使うレイトレサーバrtがネットブックで起動しますが、 ssh の設定でMac側の55523ポートとして見えることになります。

仕込みが完了したところでお試し実行。

Mac側から

$ ./cg.py eyep=[0,0,0],200,10 sec=10 data_name=objs name=out_v31/objs_1_2_sc n=1 init_sec=5 div=2
  :
conn srv.val 55511 ... err
[Errno 61] Connection refused
boot ./val.py boot
conn srv.val 55511 ... ok
boot ./img.py boot
conn srv.val 55511 ... ok
conn srv.img 55512 ... ok
OpenCV: FFMPEG: tag 0x34363248/'H264' is not supported with codec id 28 and format 'mp4 / MP4 (MPEG-4 Part 14)'
OpenCV: FFMPEG: fallback to use tag 0x31637661/'avc1'
frm : 0/1(0.0%) : not start yet
wh : 0/76800(0.0%) : not start yet
boot ./rt boot
boot echo "cd rt_v31 ; ./rt boot" | nc localhost 55520
conn srv.rt 55513 ... conn srv.rt-2 55523 ... ok
ok
wh : 2/76800(0.0%) : total 10h 58m 28.06s : rest 10h 58m 27.03s : 2018/05/07 03:31:42
wh : 4925/76800(6.4%) : total 31.63s : rest 29.60s : 2018/05/06 16:33:45
wh : 9829/76800(12.8%) : total 23.66s : rest 20.63s : 2018/05/06 16:33:37
  :
wh : 74467/76800(97.0%) : total 41.29s : rest 1.25s : 2018/05/06 16:33:55
wh : 76800/76800(100.0%) : fin 40.50s

conn srv.val 55511 ... err

については、まず値サーバに接続を試してみて失敗すれば、起動を試みるようにしてるので想定通りです。

  以前の
  v30  wh : 76800/76800(100.0%) : fin 38.39s
  v29  wh : 76800/76800(100.0%) : fin 1m 44.72s
  v28  wh : 76800/76800(100.0%) : fin 1m 18.06s
  v27  wh : 76800/76800(100.0%) : fin 1m 8.39s
  v26  wh : 76800/76800(100.0%) : fin 1m 6.02s

なんと、ネットブックに手伝ってもらった方が足を引っ張られてる感じでしょうか。

rt.py の

			:
	def func(cli):
		while True:
			lock.acquire()
			run = cnt.up(show)
			(ix, iy) = cnt.cur()
			#print('{} {} {}'.format(cli.name, ix, iy))
			lock.release()
			if not run:
				break
			:

コメントアウトしてるprint()を有効にしてみると

$ ./cg.py eyep=[0,0,0],200,10 sec=10 data_name=objs name=out_v31/objs_1_2_sc n=1 init_sec=5 div=2 > log1

$ head log1
conn srv.val 55511 ... ok
conn srv.img 55512 ... ok
frm : 0/1(0.0%) : not start yet
wh : 0/76800(0.0%) : not start yet
srv.rt 0 0
srv.rt-2 1 0
conn srv.rt 55513 ... conn srv.rt-2 55523 ... ok
ok
srv.rt 2 0
srv.rt 3 0
$ 

$ grep '^srv.rt-2 ' log1 | head
srv.rt-2 1 0
srv.rt-2 11 1
srv.rt-2 173 1
srv.rt-2 58 2
srv.rt-2 243 2
srv.rt-2 112 3
srv.rt-2 319 3
srv.rt-2 173 4
srv.rt-2 47 5
srv.rt-2 249 5

$ grep '^srv.rt ' log1 | wc -l
   76332

$ grep '^srv.rt-2 ' log1 | wc -l
     470


320*240 = 76800
なので

470/76800*100 = 0.61

ネットブックは0.61パーセントしか力になってませんでしたか...

起動したままのサーバを落としておきます。

Mac側から

$ ps ax | grep boot | grep -v grep
33484   ??  Ss     0:08.91 /usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/Resources/Python.app/Contents/MacOS/Python ./val.py boot
33491   ??  Ss     0:29.44 /usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/Resources/Python.app/Contents/MacOS/Python ./img.py boot
33498   ??  SNs    0:16.92 ./rt boot
33499   ??  SNs    0:00.01 /bin/sh -c echo "cd rt_v31 ; ./rt boot" | nc localhost 55520

$ ./srvs.py kill_all
conn srv.val 55511 ... ok
kill srv.img pid=33491
kill srv.rt pid=33498
kill srv.rt-2 pid=33499
kill srv.val pid=33484

$ ps ax | grep boot | grep -v grep
$ 

$ echo "ps ax | grep boot | grep -v grep" | nc localhost 55520
12862 ?        S      0:00 /bin/sh -c cd rt_v31 ; ./rt boot
12863 ?        S      0:01 ./rt boot

$ ./kill_str.py 'rt boot'
ps ax | grep 'rt boot' | grep -v grep | sed 's/^ *//' | cut -d ' ' -f1 | xargs kill

$ ./kill_str.py 'rt boot' | nc localhost 55520

$ echo "ps ax | grep boot | grep -v grep" | nc localhost 55520
$