linuxでwake on lan
そもそもwake on lan とは・・・
パソコンを遠隔で起動することができる技術。
起動したいパソコンのLANカードにマジックパケットというパケットを送ることで遠隔で起動できる。
wikiによると、AMDが開発したそうな。。
http://ja.wikipedia.org/wiki/Wake-on-LAN
以前行き当たりばったりで起動できたんだけど、最近やろうとしたらできなかったからやり方をメモ。
まず前提として、BIOS、ネットワークカード、OSが対応していること。
最近のPCならまず大丈夫だと思う。(4年ぐらい前のPCでも対応していた。人のPCそれぞれだと思うけど)
また、無線LANの場合はできないようだ。(無線LANカードとかの場合は無理で、無線ブリッジとPCの間が有線の場合は可能)
[リモートPC(遠隔で起動させたいPC)でやること]
[ローカルPC(マジックパケットを送る側のPC)でやること]
そもそもwake on lan とは・・・
パソコンを遠隔で起動することができる技術。
起動したいパソコンのLANカードにマジックパケットというパケットを送ることで遠隔で起動できる。
wikiによると、AMDが開発したそうな。。
http://ja.wikipedia.org/wiki/Wake-on-LAN
以前行き当たりばったりで起動できたんだけど、最近やろうとしたらできなかったからやり方をメモ。
まず前提として、BIOS、ネットワークカード、OSが対応していること。
最近のPCならまず大丈夫だと思う。(4年ぐらい前のPCでも対応していた。人のPCそれぞれだと思うけど)
また、無線LANの場合はできないようだ。(無線LANカードとかの場合は無理で、無線ブリッジとPCの間が有線の場合は可能)
[リモートPC(遠隔で起動させたいPC)でやること]
①BIOSの設定でwake on lanの機能を有効にする。
②OSを起動してLANカードのwake on lanの設定を有効にする。
このとき、windowsならデバイスマネージャーから設定できるが、
linuxの場合は、次のようにする。
管理者(root)権限で
#ethtool -s eth0 wol g
を実行する。
この場合だと再起動したら、wake on lanの設定が無効になるので、この設定が続くようにするならば、
ETHTOOL_OPTS="wol g"
という文字列を
redhat系なら、
/etc/sysconfig/network-scripts/ifcfg-eth#
に、(#は番号)
debian系なら、
/etc/network/interfaces
に追加する。
※ethtoolがインストールされてないなら、yumやaptなどでインストールする。
これで、遠隔起動される側のPCの設定は終わり。
②OSを起動してLANカードのwake on lanの設定を有効にする。
このとき、windowsならデバイスマネージャーから設定できるが、
linuxの場合は、次のようにする。
管理者(root)権限で
#ethtool -s eth0 wol g
を実行する。
この場合だと再起動したら、wake on lanの設定が無効になるので、この設定が続くようにするならば、
ETHTOOL_OPTS="wol g"
という文字列を
redhat系なら、
/etc/sysconfig/network-scripts/ifcfg-eth#
に、(#は番号)
debian系なら、
/etc/network/interfaces
に追加する。
※ethtoolがインストールされてないなら、yumやaptなどでインストールする。
これで、遠隔起動される側のPCの設定は終わり。
[ローカルPC(マジックパケットを送る側のPC)でやること]
マジックパケットを送るソフトをダウンロードする。
windowsならググれば沢山あるし、使い方もいくらでもある。
linuxならwakeonlan(http://gsd.di.uminho.pt/jpo/software/wakeonlan/)をダウンロードして展開してmake。
使い方は--helpとexample/ディレクトリに書かれてるのを見れば分かる。
windowsならググれば沢山あるし、使い方もいくらでもある。
linuxならwakeonlan(http://gsd.di.uminho.pt/jpo/software/wakeonlan/)をダウンロードして展開してmake。
使い方は--helpとexample/ディレクトリに書かれてるのを見れば分かる。
Javaのプログラムでリトルエンディアンのバイナリファイルを読むときバイトオーダーの変換が必要みたい。
ByteBufferクラスを使うことで変換できる。
例えばint(4バイト),float(4バイト),double(8バイト)の順でバイナリファイルにリトルエンディアンで書かれていた場合。
import java.io.*;
import java.nio.*;
・・・
try{
DataInputStream dis = new DataInputStream(new FileInputStream("infile"));
ByteBuffer bb = new ByteBuffer(100);
bb.putInt(dis.readInt());
bb.putFloat(dis.readFloat());
bb.putDouble(dis.readDouble());
bb.order(ByteOrder.LITTLE_ENDIAN); //バイトオーダーをリトルエンディアンに変換
int i = bb.getInt(0);
float x = bb.getFloat(4);
double y = bb.getDouble(8);
}catch(Exception e){
e.printStackTrace();
}
・・・このようにしてバイトオーダーを変換して読むことができる。
バッファのはじめの4バイトはintが格納されているので、floatの値を読むときにはfloatが格納されている
はじめのインデックスである4を指定している。(インデックスの番号は0はじまり)
doubleの値を読むときは、その前にintとfloatの計8バイトが格納されているので、8を指定している。
ByteBufferクラスについては、
http://www.edu.tuis.ac.jp/~mackin/javadocs/jdk1_5/docs/ja/api/java/nio/ByteBuffer.html
ByteBufferクラスを使うことで変換できる。
例えばint(4バイト),float(4バイト),double(8バイト)の順でバイナリファイルにリトルエンディアンで書かれていた場合。
import java.io.*;
import java.nio.*;
・・・
try{
DataInputStream dis = new DataInputStream(new FileInputStream("infile"));
ByteBuffer bb = new ByteBuffer(100);
bb.putInt(dis.readInt());
bb.putFloat(dis.readFloat());
bb.putDouble(dis.readDouble());
bb.order(ByteOrder.LITTLE_ENDIAN); //バイトオーダーをリトルエンディアンに変換
int i = bb.getInt(0);
float x = bb.getFloat(4);
double y = bb.getDouble(8);
}catch(Exception e){
e.printStackTrace();
}
・・・
バッファのはじめの4バイトはintが格納されているので、floatの値を読むときにはfloatが格納されている
はじめのインデックスである4を指定している。(インデックスの番号は0はじまり)
doubleの値を読むときは、その前にintとfloatの計8バイトが格納されているので、8を指定している。
ByteBufferクラスについては、
http://www.edu.tuis.ac.jp/~mackin/javadocs/jdk1_5/docs/ja/api/java/nio/ByteBuffer.html
紙パックのジュースの口を盛大に開けたまま机に置いてたら手が当たってこぼれた。
それも手が触れてバランスを崩して倒れたとかじゃなくて、倒すために手を動かしたってぐらい
クリーンヒットした。
パックの口から流れるジュースがナイアガラ(笑
机の隣に置いてあったパソコンの側面に向かって流れたんだけど、少し排気口からパソコン内部にジュースが入ってしまった。
直後にブルースクリーンが出て強制的に再起動。。
電源切るのも忘れて横のケースカバーを外してみると、PCIボードの上に水たまりができてた。
とりあえず再起動仕掛けてるパソコンを強制終了して電源コード抜いてから、ティッシュとかで
ジュースを吸ってみた。(適当)
それから電源を入れてみると、BIOSのエラー音が鳴ってき起動しない。
でも一度リセットスイッチを押すと起動できた。
Windowsが起動すると、テレビ録画のソフトのメッセージが出て、録画予約のリストが取り消されたと表示してある。
いろいろ見てるとどうやらキャプチャボードが認識されなくなってるみたいだった。
いったん電源を落として、キャプチャボードを抜いてみると水気は無かったが、ジュースの成分(?)みたいなものが
基盤やPICの接続部分に付いてた。
濡れティッシュで白いのが無くなるまで拭いて、電源を入れるとWindowsの起動画面がずっと出続けて
5分ぐらい待ってもログイン画面にならない。
2回ぐらい強制終了と起動を繰り返してみたけどやっぱりWindowsが起動しない。
念のためキャプチャボードを抜いてみると、起動した。
それから小一時間、新しいキャプチャボード買おうかとか、拭き方が足りなかったのかとか、悩んだけど別のPCIスロットに差してみたら問題なく起動して、しかも認識できた。
結局2時間ぐらいはあれこれやったけど収集がついてよかった。
それも手が触れてバランスを崩して倒れたとかじゃなくて、倒すために手を動かしたってぐらい
クリーンヒットした。
パックの口から流れるジュースがナイアガラ(笑
机の隣に置いてあったパソコンの側面に向かって流れたんだけど、少し排気口からパソコン内部にジュースが入ってしまった。
直後にブルースクリーンが出て強制的に再起動。。
電源切るのも忘れて横のケースカバーを外してみると、PCIボードの上に水たまりができてた。
とりあえず再起動仕掛けてるパソコンを強制終了して電源コード抜いてから、ティッシュとかで
ジュースを吸ってみた。(適当)
それから電源を入れてみると、BIOSのエラー音が鳴ってき起動しない。
でも一度リセットスイッチを押すと起動できた。
Windowsが起動すると、テレビ録画のソフトのメッセージが出て、録画予約のリストが取り消されたと表示してある。
いろいろ見てるとどうやらキャプチャボードが認識されなくなってるみたいだった。
いったん電源を落として、キャプチャボードを抜いてみると水気は無かったが、ジュースの成分(?)みたいなものが
基盤やPICの接続部分に付いてた。
濡れティッシュで白いのが無くなるまで拭いて、電源を入れるとWindowsの起動画面がずっと出続けて
5分ぐらい待ってもログイン画面にならない。
2回ぐらい強制終了と起動を繰り返してみたけどやっぱりWindowsが起動しない。
念のためキャプチャボードを抜いてみると、起動した。
それから小一時間、新しいキャプチャボード買おうかとか、拭き方が足りなかったのかとか、悩んだけど別のPCIスロットに差してみたら問題なく起動して、しかも認識できた。
結局2時間ぐらいはあれこれやったけど収集がついてよかった。
コンソールで動くタイピングソフトを探してたら、typist(http://adgjm.net/its/unix/typist.htm)ってのがあった。
なんと1992年に始めのバージョンが作られ、最新版は1997年のv2.0。
そういえば学校のパソコンにインストールされてたような・・
これをcygwinで使ってみようと思ってまずダウンロード。
解凍して、
cd typist2.0
./configure
make
したらここでエラー発生。
termcapライブラリが見つからないと表示されるので、
ftp://ftp.ring.gr.jp/pub/GNU/termcap/termcap-1.3.1.tar.gz
からtermcapのソースをダウンロードしてきて、
./configure
make
make install
再びtypist2.0/srcでmake。
warningは出るものの、コンパイル成功。
make isntallして、実行すると、
文字化け。
調べてみると、typistは文字コードがEUCとのこと。
sjisに直してあるcygwinの文字コードをeucに直そうと思ったけど、結局うまくいかなかった。
仕方なく、TeraTermからcygwinに接続し、文字コードをEUCに設定(メニュー->設定->端末)して。
typistを実行。
めでたく文字化けせずに起動できました。
なんと1992年に始めのバージョンが作られ、最新版は1997年のv2.0。
そういえば学校のパソコンにインストールされてたような・・
これをcygwinで使ってみようと思ってまずダウンロード。
解凍して、
cd typist2.0
./configure
make
したらここでエラー発生。
cc -O -s -DTERMIO -c -o main.o main.c
cc -O -s -DTERMIO -c -o typist.o typist.c
cc -O -s -DTERMIO -c -o lesson.o lesson.c
cc -O -s -DTERMIO -c -o lineio.o lineio.c
cc -O -s -DTERMIO -c -o fileinfo.o fileinfo.c
cc -O -s -DTERMIO -c -o sound.o sound.c
cc -O -s -DTERMIO -c -o screen.o screen.c
screen.c: In function 'get_term':
screen.c:281: warning: incompatible implicit declaration of built-in function 's
trcpy'
cc -O -s -DTERMIO -c -o kana.o kana.c
cc -O -s -o typist main.o typist.o lesson.o lineio.o fileinfo.o sound.o screen.
o kana.o -lncourses
/usr/lib/gcc/i686-pc-cygwin/4.3.4/../../../../i686-pc-cygwin/bin/ld: cannot find
-ltermcap
collect2: ld returned 1 exit status
make: *** [typist] Error 1
cc -O -s -DTERMIO -c -o typist.o typist.c
cc -O -s -DTERMIO -c -o lesson.o lesson.c
cc -O -s -DTERMIO -c -o lineio.o lineio.c
cc -O -s -DTERMIO -c -o fileinfo.o fileinfo.c
cc -O -s -DTERMIO -c -o sound.o sound.c
cc -O -s -DTERMIO -c -o screen.o screen.c
screen.c: In function 'get_term':
screen.c:281: warning: incompatible implicit declaration of built-in function 's
trcpy'
cc -O -s -DTERMIO -c -o kana.o kana.c
cc -O -s -o typist main.o typist.o lesson.o lineio.o fileinfo.o sound.o screen.
o kana.o -lncourses
/usr/lib/gcc/i686-pc-cygwin/4.3.4/../../../../i686-pc-cygwin/bin/ld: cannot find
-ltermcap
collect2: ld returned 1 exit status
make: *** [typist] Error 1
termcapライブラリが見つからないと表示されるので、
ftp://ftp.ring.gr.jp/pub/GNU/termcap/termcap-1.3.1.tar.gz
からtermcapのソースをダウンロードしてきて、
./configure
make
make install
再びtypist2.0/srcでmake。
warningは出るものの、コンパイル成功。
make isntallして、実行すると、
▒ʲ▒▒▒▒饳▒▒▒▒▒▒▒▒▒Ʋ▒▒▒▒▒:
ɸ▒ॳ▒▒▒▒ (t1 - t16)
ɸ▒▒▒ɥ▒▒▒ (u1 - u13)
▒▒▒▒▒ɥ▒▒▒ (v1 - v20)
▒▒▒▒▒ɥ▒▒▒ (m1 - m11)
▒▒▒ԡ▒▒ɥ▒▒å▒ (s1 - s4)
®▒▒▒▒▒▒▒▒ (q1 - q5)
▒▒ã▒▒▒▒▒▒ (r1 - r14)
▒▒▒▒▒▒▒ϥ▒▒▒▒▒ (n1 - n3)
▒▒▒▒▒▒▒ϥ▒▒▒▒▒ (k1 - k17)
▒▒▒ʼ▒▒▒▒▒▒▒▒▒ (j1 - j7)
▒▒▒▒▒▒▒▒▒▒▒▒▒å▒▒▒▒▒̾▒▒(▒▒ t1)▒▒▒▒▒Ϥ▒▒Ʋ▒▒▒▒▒
(▒▒λ=▒▒▒ԡ▒▒إ▒▒▒=?) ------>
ɸ▒ॳ▒▒▒▒ (t1 - t16)
ɸ▒▒▒ɥ▒▒▒ (u1 - u13)
▒▒▒▒▒ɥ▒▒▒ (v1 - v20)
▒▒▒▒▒ɥ▒▒▒ (m1 - m11)
▒▒▒ԡ▒▒ɥ▒▒å▒ (s1 - s4)
®▒▒▒▒▒▒▒▒ (q1 - q5)
▒▒ã▒▒▒▒▒▒ (r1 - r14)
▒▒▒▒▒▒▒ϥ▒▒▒▒▒ (n1 - n3)
▒▒▒▒▒▒▒ϥ▒▒▒▒▒ (k1 - k17)
▒▒▒ʼ▒▒▒▒▒▒▒▒▒ (j1 - j7)
▒▒▒▒▒▒▒▒▒▒▒▒▒å▒▒▒▒▒̾▒▒(▒▒ t1)▒▒▒▒▒Ϥ▒▒Ʋ▒▒▒▒▒
(▒▒λ=▒▒▒ԡ▒▒إ▒▒▒=?) ------>
文字化け。
調べてみると、typistは文字コードがEUCとのこと。
sjisに直してあるcygwinの文字コードをeucに直そうと思ったけど、結局うまくいかなかった。
仕方なく、TeraTermからcygwinに接続し、文字コードをEUCに設定(メニュー->設定->端末)して。
typistを実行。
以下からコースを選択して下さい:
標準コース (t1 - t16)
標準ドリル (u1 - u13)
集中ドリル (v1 - v20)
実戦ドリル (m1 - m11)
スピードアップ (s1 - s4)
速習コース (q1 - q5)
上達コース (r1 - r14)
数字入力コース (n1 - n3)
かな入力コース (k1 - k17)
かな実践コース (j1 - j7)
練習したいレッスンの名前(例 t1)を入力して下さい
(終了=改行、ヘルプ=?) ------>
標準コース (t1 - t16)
標準ドリル (u1 - u13)
集中ドリル (v1 - v20)
実戦ドリル (m1 - m11)
スピードアップ (s1 - s4)
速習コース (q1 - q5)
上達コース (r1 - r14)
数字入力コース (n1 - n3)
かな入力コース (k1 - k17)
かな実践コース (j1 - j7)
練習したいレッスンの名前(例 t1)を入力して下さい
(終了=改行、ヘルプ=?) ------>
めでたく文字化けせずに起動できました。
つい最近知った便利なコマンドscreen
一つのコンソールで複数の仮想端末を切り替え使用することができる。
たとえばsshでどこかのサーバーに繋ぎ作業をしているときに、ローカルマシンの方でやりたいことがある場合などには、
もう一つコンソールを起動する、あるいはCtrl+Shift+Tで新たにタブとして開き、作業するということが考えられるが、
screenならばもっと簡単に実現できる。
*screenを実行する前に設定ファイルを用意する。
screen には仮想端末を切り替えたり、今操作している仮想端末の情報を表示したりする場合に、まずエスケープキャラクタを入力するのだが、デフォルト設定ではCtrl-aになっている。
それでは普段行頭にカーソルを移動させることが不便になるので、設定ファイルに使用するエスケープキャラクタを記述しておく。
(デフォルトのままだと、カーソルを行頭に移動させる為にCtrl-a a と入力しなければならない。)
エスケープキャラクタをCtrl-t に変える場合は、~/.screenrc に
escape ^t^t
と記述しておく。
(^tの入力方法は、emacsならCtrl-v Ctrl-t )
screenとコマンドを打ち、実行すると新たにシェルが起動する。
ここでもう一つ仮想端末を開きたいなら、Ctrl-t c とする。
新たにシェルが起動し、操作がそちらのシェルに移る。さらにCtrl-t cを打てばその分仮想端末が増えていく。
いま開いている仮想端末のリストを見るには、Ctrl-t w とすれば、いくつ仮想端末を開いているのかと、それらの
番号、タイトルが表示される。
Ctrl-t A に続けてタイトル名を入力すると、いま操作している仮想端末のタイトルを変更することができる
また、Ctrl-t i でいま操作している仮想端末についての情報を表示することができます。
仮想端末を切り替える方法は、
次の仮想端末に切り替える。:
Ctrl-t n or Ctrl-t SPACE
前の仮想端末に切り替える。:
Ctrl-t p or Ctrl-t BackSPACE
となってます。
開いている仮想端末を閉じるには、Ctrl-t k です。(exitでも可)
*screenのいいところ。
screenで作った仮想端末で動いているプログラムを止めることなく、コンソール(screenを起動したおおもと)を終了することができます。
このときの行うことをdetach(デタッチ)といい、これを行うことで操作がコンソールに戻ります。
あとから、仮想画面の状態が画面表示を復元することができます。
これをatach(アタッチ)といいます。
この機能によって例えば職場や大学のマシンで作業をして、いったんdetachし、家で職場や大学のパソコンに
接続しatachすることにより、リモートの作業過程をそのまま引き継ぎ行うことができます。
また、設定ファイルでautodetachを有効にしておくことによって回線が不安定になり接続が切れてしまったときに、
自動的にdetachが実行され、再び接続できたときに、切断前の状態が保持されているようにすることもできます。
detach:
Ctrl-t d
atach:
screen -r
detach後にscreenコマンドを実行すると、複数のscreenプロセスを走らせることもできます。
そのとき、screen -ls とすることでそのプロセスリストを表示させることができます。
そこにプロセスIDが書いてあるので、screen -r PID とすることでプロセスID=PIDのscreenプロセスを
atachすることができます。
screen には仮想端末間のコピー・ペースト機能やバックスクロール機能、複数ユーザーの同時atachなど
他にも便利な機能があります。
*autodetachを有効にするには
autodetach on
を
~/screenrc
に追加する。
一つのコンソールで複数の仮想端末を切り替え使用することができる。
たとえばsshでどこかのサーバーに繋ぎ作業をしているときに、ローカルマシンの方でやりたいことがある場合などには、
もう一つコンソールを起動する、あるいはCtrl+Shift+Tで新たにタブとして開き、作業するということが考えられるが、
screenならばもっと簡単に実現できる。
*screenを実行する前に設定ファイルを用意する。
screen には仮想端末を切り替えたり、今操作している仮想端末の情報を表示したりする場合に、まずエスケープキャラクタを入力するのだが、デフォルト設定ではCtrl-aになっている。
それでは普段行頭にカーソルを移動させることが不便になるので、設定ファイルに使用するエスケープキャラクタを記述しておく。
(デフォルトのままだと、カーソルを行頭に移動させる為にCtrl-a a と入力しなければならない。)
エスケープキャラクタをCtrl-t に変える場合は、~/.screenrc に
escape ^t^t
と記述しておく。
(^tの入力方法は、emacsならCtrl-v Ctrl-t )
screenとコマンドを打ち、実行すると新たにシェルが起動する。
ここでもう一つ仮想端末を開きたいなら、Ctrl-t c とする。
新たにシェルが起動し、操作がそちらのシェルに移る。さらにCtrl-t cを打てばその分仮想端末が増えていく。
いま開いている仮想端末のリストを見るには、Ctrl-t w とすれば、いくつ仮想端末を開いているのかと、それらの
番号、タイトルが表示される。
Ctrl-t A に続けてタイトル名を入力すると、いま操作している仮想端末のタイトルを変更することができる
また、Ctrl-t i でいま操作している仮想端末についての情報を表示することができます。
仮想端末を切り替える方法は、
次の仮想端末に切り替える。:
Ctrl-t n or Ctrl-t SPACE
前の仮想端末に切り替える。:
Ctrl-t p or Ctrl-t BackSPACE
となってます。
開いている仮想端末を閉じるには、Ctrl-t k です。(exitでも可)
*screenのいいところ。
screenで作った仮想端末で動いているプログラムを止めることなく、コンソール(screenを起動したおおもと)を終了することができます。
このときの行うことをdetach(デタッチ)といい、これを行うことで操作がコンソールに戻ります。
あとから、仮想画面の状態が画面表示を復元することができます。
これをatach(アタッチ)といいます。
この機能によって例えば職場や大学のマシンで作業をして、いったんdetachし、家で職場や大学のパソコンに
接続しatachすることにより、リモートの作業過程をそのまま引き継ぎ行うことができます。
また、設定ファイルでautodetachを有効にしておくことによって回線が不安定になり接続が切れてしまったときに、
自動的にdetachが実行され、再び接続できたときに、切断前の状態が保持されているようにすることもできます。
detach:
Ctrl-t d
atach:
screen -r
detach後にscreenコマンドを実行すると、複数のscreenプロセスを走らせることもできます。
そのとき、screen -ls とすることでそのプロセスリストを表示させることができます。
そこにプロセスIDが書いてあるので、screen -r PID とすることでプロセスID=PIDのscreenプロセスを
atachすることができます。
screen には仮想端末間のコピー・ペースト機能やバックスクロール機能、複数ユーザーの同時atachなど
他にも便利な機能があります。
*autodetachを有効にするには
autodetach on
を
~/screenrc
に追加する。


