Category Archives: OS

おせっかいなCoreos

Coreosを使っていたとはいえ、Dockerしか触っていなかったので、Coreosの事はsystemdになったということ以外は知らなかった。 どうやら自動的にアップデートなんかをしているらしく、リブートした時には新しい方で立ち上がってくるらしい。そのことで(たぶん)えらいことになってしまった。   ことの発端だが、最近はFlentdとZabbixばっかり触っていたのでDockerをひさしぶりに触ろうとしたら、なんかおかしいなぁと・・・。 どうやらdockerが起動していないようだ。 リブートしたので、ローカルアドレスを割り当てる(固定する方法を知らないw)  $ ip addr add 192.168.0.4/24 dev ens4 Dockerを起動しようとしてもできない。 $ sudo docker -d 2014/08/13 15:12:15 docker daemon: 1.1.2 d84a070; execdriver: native; graphdriver: [fa7a14d6] +job initserver() [fa7a14d6.initserver()] Creating server [fa7a14d6] +job serveapi(unix:///var/run/docker.sock) 2014/08/13 15:12:15 Listening for HTTP on unix (/var/run/docker.sock) [fa7a14d6] +job init_networkdriver() [fa7a14d6.init_networkdriver()] creating new bridge for docker0 [fa7a14d6.init_networkdriver()] getting iface addr [fa7a14d6] -job init_networkdriver() = OK (0) open /var/lib/docker/init/dockerinit-1.1.2: no space left on device [fa7a14d6] -job initserver() = ERR (1) 2014/08/13 15:12:16 open /var/lib/docker/init/dockerinit-1.1.2: no space left on device おそらくは冒頭で書いたCoreosのアップデートのおかげで、Dockerが1.1.2になっているようなんだが、そもそも1.1.2なんてデータはないのだ。 $ sudo ls -l /var/lib/docker/init total 17608 -rwx—— 1 root root 9003724 Jul 15 23:19 dockerinit-1.0.1 -rwx—— 1 root root 9023144 Jul 24 22:13 […]

もしも、起動できるプロセスがめちゃ少ないLinuxがあったら

WindowsUpdateと言えば再起動、再起動といえばWindowsUpdateという命題が両方とも真になってしまいそうなくらい再起動しやがりますのお。 大量のRSSを読んでる時に再起動しますよ~と来るとちょっとやだね。   今日はもしもシリーズですが、前ふりは全く関係ないです。 その昔ドリフ大爆笑という番組があって、その中であったコントのシリーズです。 動かせるものが少ないと単純にどんな挙動になるのかな~と思って好奇心で実験してみることにしました。とは言うものの、実験としてはかなり大ざっぱだし、煮詰める部分はまだまだあるけど、とりあえずざっくりやってみたってもんです。 まずはプロセスの数を絞るのにゃ。 参考サイト 響雲   Linux スレッド数設定 今回はリブートしたらもとに戻るように “sysctl -n kernel.threads-max” この値だけを100くらいに設定しました。 軽く調べてみると、プロセスの数は起動直後は84くらい。 しばらくすると95くらいまで上がりました。 [root@32bittest]$ ps aux | wc      94    1060    7363 [root@32bittest]$ 最初はまずはシェルを起動してみます。連打、連打。 [root@32bittest]$ zsh [root@32bittest]$ zsh /etc/profile.d/colorls.sh:21: fork failed: リソースが一時的に利用できません [root@32bittest]$ zsh /etc/profile.d/colorls.sh:21: fork failed: リソースが一時的に利用できません /etc/profile.d/vim.sh:3: fork failed: リソースが一時的に利用できません compaudit:91: fork failed: リソースが一時的に利用できません compinit:514: fork failed: リソースが一時的に利用できません [root@32bittest]/home/takeken# zsh zsh: fork failed: リソースが一時的に利用できません こんな感じです。エラーが出ているはずなのにログには何も残らない。 次はApacheをリロードしてみる。 [root@32bittest]$ service httpd restart /etc/rc.d/init.d/functions: fork: retry: Resource temporarily unavailable /etc/rc.d/init.d/functions: fork: retry: Resource temporarily unavailable /etc/rc.d/init.d/functions: fork: retry: Resource temporarily unavailable /etc/rc.d/init.d/functions: fork: retry: Resource temporarily unavailable /etc/rc.d/init.d/functions: fork: Resource temporarily unavailable httpd を停止中: /etc/rc.d/init.d/functions: fork: retry: リソースが一時的に利用できません /etc/rc.d/init.d/functions: fork: retry: リソースが一時的に利用できません /etc/rc.d/init.d/functions: fork: retry: リソースが一時的に利用できません /etc/rc.d/init.d/functions: […]

OS作成その4 崩壊

30日でできる予定のOS自作入門ですが、やっと4日目が終わった・・、正確には読み終わった、だけど、理解度は3日目だ。 自慢じゃないが、30日で終わらない自信がたっぷりある。 そんな訳ですが、まずは アセンブラの関数で遊んでみる 著者の川合さんが作ったアドレスを指定する関数を使ってちょっと遊んでみる。 遊んでみるというよりも、ちょっと動作確認みたいな感じです。 ソース 実行結果 0x80496e8 10 20 30 思った動作をしてくれました。   では続いていきましょうか。 p[i] と *(p + i)の話って出てくるの3回目だっけ?? いつもぼけーっとしながら本を読みながらも、p[i] i[p] *(p + i) の話は毎回の教本に出てきていると思うんだ。 だが、今回のOS自作入門についてはちょっと違っていた。 じゃなくて、違っていたんじゃなくて、やっとたけけんが考えられる知識が備わったのかもしれない。 では配列と言えば領域違反なので、違反するプログラムを実行して*(p + i)に書き直してみる 元ソース 書き直したソース ループの範囲が違うのは途中のポインタで止まるからだす。 実行結果 うん、うまく動作しているんだけど、この結果を見てたけけんの頭が崩壊した。 分かったようで、分かってなかったんだなぁとバグった頭で頑張って考えた。 サブタイトルにもしたんだけど、この話が出てくるのは3回目だと思うんだ。 なので前回でてきたポインタ完全制覇を取り出して、ササっと読み返したぞ。 宣言の[]と式中の[]は違う、ついでに宣言の*と式中の*も違う これってCを宣言を分かりにくくしているYO という事だった。なるほど! っていうか違うということにすら気づいてなかった。 CのAも分かってなかったんだなぁ。。 どういう事かというと日本語は難しいという事だ。   ここでちょっとテストしてみる。 うむ、満足した。 それと、今まで何の気もなしに見ていたエラーメッセージで 「error: 添字をつけられた値が配列でもポインタでもありません」 ってのがあるんだが、これはつまりどっちでも一緒という事だったんだろう。   では、この辺でOS自作入門に戻ろうとしよう。 おそらく著者は式中の[]について述べているのだな。 ちょっと引用すると p[i]はPという配列のi番目という説明はごまかし うん、なるほど。こんどは分かったよ。 じゃあ、アセンブラの配列はどうなるなるの?と単細胞なたけけんは思っちゃうのだが、配列といえば、同じ型のデータがメモリに並んで入るものだったはずなので、ようするにつまりはそういう事なのだね。 今までの勉強内容がいろいろ交差してきてなかなか楽しいもんだ。 運命の交差点だ。 それから2ページほど読み進めたら、さっきの配列がどうのこうのという部分の答えが こっちにも書いてあった。 疑問に思ったらそこで立ち止まって考えてしまうのは自分の悪い癖でござるでござる。 書かれていたのがどういうものだったかと言うと char num[3]; というのを例として、CでいうとChar型の宣言で文字列を入れるもん。 となるけれど、アセンブラだとBYTE用の番地だよと。 という事のようだ。なるる。 続いて、numは定数。アセンブラでいうラベル。 ラベルの値は、もちのろんで番地を意味している。 JMPとかCALLでジャンプしている先頭のアドレスだ。 ってことはポインタでもある。 混乱していた頭もだいぶ落ち着いてきた。 うしろの3はRESB 3 となる。 訳すると、3byteの初期化されないデータ領域で、最後のBはByteを意味している。 やっぱりC言語やってよかったよ!ロベルト! 驚きなのは著者の川合さんは関数を全部アセンブラで作ってしまうので 何もincludeしないのだよね。 何もincludeしないCのプログラムは新鮮だ。 たけけんの脳味噌ではこの本だけでアセンブラを勉強するのはちょっと厳しいので、アセンブラの勉強にもう1個だけ本でもウェブでもどっちかで別のもので勉強をしようと思います。 ちょっと読んだだけだけど、VRAMは相当難しそうだなぁ。 でも多分ナウい言語だったらその辺の関数がきっと用意されているはずだ。 ・・と予想してみる。 当たったらなんかほしいものでも買うか。  

OS作成その3 機械語

アドレスを指定するという事はどういうことか いつの事だったか忘れましたが、シェルコードを実行してみようって事をやりました。 どうやったかを思い返すと、領域違反でリターンアドレスのポインタになっている変数を利用して実行したわけですが、教本の3日目にある、「ブートセクタからOS本体を実行してみる」っていうのを見てみると  JMP 0xc200 みたいな感じです。 JMP命令はアセンブラによく出てくるんだが、ブートセクタからOSを実行する時もリターンアドレスのポインタに関数を入れるのも同じ事だなと。 C言語で直接アドレスを指定して書き込む命令がないようで、「そういう事」のようだ。   これはおまけですが、C言語にHLTの命令もないそうで、著者の川合秀実さんがやたらとこだわってらっしゃって、わざわざHLTするようなプログラムにしてます。実際にタスクマネージャでリソースを見てみたら明確に違いが出てました。 HLTなし HLTあり こんな風に、551のある時ない時くらいに明確でした。 上の図のHLTなしの場合は永遠にCPUを使ってます。下の図のようにHLT命令があった場合は、CPUはほげーっとしている状態らしく、タスクマネージャで見ても使ってないですね。 ふむふむ。   BIOSは16BIT用の機械語で書かれている これは見た瞬間に、こないだ自作したPCではBIOSでマウスがぐりぐり動いてたし先進的な感じだったんでバンナソカナ!!と思ったのだが、最近のものは(最近といってもIntel6シリーズ SandyBridgeから)UEFIというものが採用されているようです。 安心した。 そういえば、UEFIって書いてあったような。 と思ったので過去の画像を掘り出す。 おおお、やっぱり書いてあった。 今日のたけけんは冴えてるな、目の付け所がインテルだったようだ。 あれ、シャープだったかな。 もちろんAMDもあるよ。   C言語から機械語に翻訳することは思っているより大変なようだ。 これはもう説明するのは大変で、いろいろステップを踏む必要があるようだ。 とにかく今のコンパイラがすごかったらしい。 学校で何のコンパイラを使っていたかなんてすっかり忘れたけど、もうちょっとメンドクサカッタような記憶もあったりなかったり。 うちのPCにCygwinを入れたときもなんかメンドクサカッタ記憶しかない。 デュアルブートにしてしばらく使っていくうちにだんだんメンドクサクなり、結局ウィンドウズだけに戻したり。 とにかく昔は何をするのもメンドクサカッタ気がする。 あ~、息を吸うのもめんどくせ~までは思わないが。   以上のように、3日目の内容でもかなり盛りだくさんなのであった。 参考文献 30日でできるOS自作入門  川合秀実著

OS作成その2 ソースと逆アセンブルと比較してみる

こないだからO30日でできる自作入門という本を始めてます。 文章も面白いし、書いている内容も結構濃いし、なかなか面白い。 2日目は1日目にバイナリエディタで書いていたソースをアセンブリ言語にして進めていく感じになってます。 試しに1日目のほぼバイナリのソースを逆アセンブルしていたので、今回のアセンブリのコードと比較してみました。 前回に登場した逆アセンブルしたもの ソースコード 本体の一部のみです。 逆アセンブルした方は32ビットレジスタを使っているし、見た目はちょっと違うけど、やってることは同じように見える。ふんふん。   この書籍はテーマじたいがOSなんで、だいぶコンピュータの基礎から書いてあるのだけど、レジスタを意識してプログラムを書けば速いプログラムがかけるっていう理屈はとっても納得できたけど、どうやって意識するのかが問題だね。 たぶん本書を読んでいけば答えは載ってるかもしれないけど、分かるのかな? ちょっと考えてみよう。 ・・・うーむ。 まあ、このぐらいにしとこうか。   ブートセクタの最後が0x55 0xaaなのは決まり事のようだ。 書籍ではWindows系を作っているので、今使っているLinuxのブートセクタを覗いてみよう。 おお、ちゃんと0x55 0xaaになっとるね。 あとは出だしがLinuxは0xeb 0x48 0x90 、本書は 0xeb 0x4e 0x90 になってる。 ちょっと調べた感じだと最初の0xebは “0xEB cb JMP rel8” という事らしい。 0x00 0x01 0x02 についてはJMP命令が入るようだ。 0x03番目からはブートセクタの名前を8バイトで入れるとなるのはFAT12に限らずだいたいどれも同じなようでした。 なんとなく納得できたので次に進もうと思います。   ところで最近と言うか半年ほどになるけど、ブログの進め方が1冊の本を中心に進めていたんだけど、テーマがプログラムの勉強だったからそれが合っていただけなので、ぼちぼち自由に進めようと思います。 よいコンテンツを作っていればまたどこかに取り上げられたりして、うはうはITリテラシーの向上につながるというものです。 とは言うもののしばらくはカーネルの事とかになりそうだ(笑) ブログをやりだした当初はブログなんてサーバーの勉強のおまけだったのだが、今では逆転してコンテンツが中心になってくると、サーバーに変化を起こす事に対してかなり慎重になってしまう。 本来は今のような状況が目的だったんだけど、実際にこんな状態になるとブログだけ別のものに移そうかとか、いろいろと考えてしまうんで面白いもんだね。 参考文献 30日でできるOS自作入門  川合秀美著 参考サイト 0から作るソフトウェア開発  ブートローダその4 FAT12 adsaria mood   LinuxにおけるにおけるMBRのまとめとバックアップ方法 Sunday Programmer   PCが起動する仕組み    

OS作成その1 HelloWorld

さて、カーネルいじりをやりだして、シェルコードを作ってみるという事までやって、いったいどこに向かっているんだという経路で進めてきて、ぼちぼち本筋だったはずのTCP/IPプログラミングに戻ろうと思ったんだが・・・ 安西先生・・・!!もうちょっとだけアセンブラがしたいです・・・ と、リトルたけけんに尋ねて、・・決めました。   結局、安西先生なのかリトルたけけんのどっちが答えたのかは分からないけど、アセンブラをやる事にしました。 んで、どうせなら面白いほうがいいし、カーネルいじりもまたやりたいと思ってるから、OS自作入門を買いました。C言語とアセンブラでやってるらしいからちょうど良かったのだ。 と思ってたんだけど、実際やってみるとアセンブリはnaskという筆者オリジナルのアセンブリ言語の様子。nasmだと思ってたぜい。まあいいか。 QEMUで実行してくれるバッチファイルが付属してあるのでとても簡単に起動できる。 最初に実行するOSで表示されるメッセージもやはりいつものやつだった。ここからどんどん大きくしていくらしい。 VMwareでももちろん可能。 ただ気になるのが、書籍ではnaskとやらでソースを書いてあるのだけど、レジスタの類はなんも出てこず、dbで1バイト書き込み、RESBでバイトを空けてあるという記述だけのソースなので訳がわからん。 たけけんのブログと同じくHow Toではないので、致し方ないのだけど、わけわからんで終わるのも勿体ないので、少しだけ調べてみる。 まずは書籍のソースをLinuxでasmファイルで作成してみて、objdumpしてみたらバイナリデータから普段よく見る形式に近い形にできた。 これならまだ見れるが、よく見てみるとメッセージを表示するだけと思ってたんだけど、そうでもないらしい。 まだまだ先は長いけど、のんびり続けていこう。 OS自作入門と合わせて、気分転換のときにSed&Awkを軽く進めていこう。 参考文献 30日でできるOS自作入門  川合秀美著  

Windows8にIPSecのVPNで繋ぐ~

つい先日ブログにも書いたようにリモートデスクトップを使うのだが、外から繋ぐことなんてないと思うのだけど、せっかくスマホがテザリングを使えるようになったんだから使ってみたいってのが人間だもの。 Windows8ではPPTPっていうプロトコルだと簡単に設定できるんだけど、セキュリティの面の不安があるらしいので、IPSecで設定しようと思います。 設定じたいは以下の参考サイト 超私的まとめも クライアント版WindowsをL2TP/IPSecサーバーにしてiPhoneから接続する こちらを参考にすればできます。ってのもあれなんで、ちょっと補足がいるなあと思ったとこを書いておきます。 手順1の証明書の設定と、手順2の着信設定については問題ないかな。 手順3のIPSecのとこは セキュリティが強化されたWindowsファイアウォールってのがあるんだけど、これはどこだ??って。 分かってしまえば道は近かった。 コントロールパネルで管理ツールで検索して、管理ツールを開きます。 中にセキュリティで強化されたファイアウォールってのがあります。なんじゃそりゃ!って思うけど、迷ったんだから仕方ない。 プロトコルの種類はL2TPでOKでした。 続いて手順4のルーターのポートを開けるってとこですが、これはなかなか説明は難しいんだが、分かってれば簡単。 フレッツの場合だけど、CTUでやることは静的NATの設定と、ファイアウォールを使っている場合は、ファイアウォールでもポートとローカルIPを指定してそこをAllowしてやる必要があります。 静的NATの設定っていうのは、このポートに(ソケットかなあ?)来たら、ほにゃらら番のIPアドレスにいけっていう設定なので、今回はIPSecの設定をしているWindowsに割り当てているローカルIPを指定しよう。 参考サイトにも書いてますとおり、1701は開けなくてOKでした。 ちなみにCTUならログを見れば、設定が間違っていたらちゃんと500番で不正ログとして残るので、ログの確認をしたら問題はないかなあと思います。ログがなかったら、クライアント側がおかしいんだと思います。 スマホからIPSecで繋いだらこんな感じ。インターネットはWindowsからVPN経由で繋ぎにいってるのは確認できた。 と、ここまでは良かったんだけど、肝心のWindows XPから繋がらないさあ。 テザリングなので、IPアドレスは同じだし、事前鍵の長さが問題なのかと一回鍵が違う状態で試したらエラーの内容が違ってたので、一番可能性が高かった事前鍵ではないらしい。 ファイアウォールにログはないし。 あとはテザリングだからって可能性もあるけど・・・ うーーーん。 とりあえず今日はここまでー。