おうちに転がってるネットブックな非力マシン 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側に戻って今回のパッチ。
$ 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 $