未分類」カテゴリーアーカイブ

proxy dhcpを使ってネットワークブートする方法.

概要

ネットワークブートは一般にdhcpの機能として提供されます.dhcpのサーバの動作は以下の手順を踏みます.
1. 対象のマシンを起動させるときに,ネットワークブートを選択します.
2. ネットワークブートを選択すると,dhcpサーバをブロードキャストアドレスに問い合わせて探します.
3. dhcpサーバは対象のマシンにipアドレスを割り当てると同時に,ネットワークブートする際に必要なイメージの場所を通知します(このとき使用されるのはtftpサーバのアドレスです.).
4. 対象のマシンは通知されたipアドレスを用いてネットワークに接続し,ブートイメージを指定されたtftpサーバから落として起動します.
5. これ以降は,使用するブートイメージによって動作が変わります.

さて,上述したとおり,ネットワークブートではdhcpサーバの設定を変更することが必須となるわけですが,ネットワーク管理者でない限り,dhcpサーバの設定をいじれることは稀です.ではもうどうしようもないのかというとそんなことはなくて,proxy dhcpという方法があります.これは,proxy dhcpサーバという,ネットワークブートの機能だけをもたせたサーバをたてることで,ネットワークブートを行います.このサーバはipアドレスなどの割当は本物のdhcpサーバにお願いし,ブートに関する処理だけをproxy dhcp側で分離して行うものです.

今回の例では,以下のようなディレクトリ構成を想定しています.
– /srv/tftpディレクトリをtftpでの公開ディレクトリとする
– /srv/tftp/pxelinux.0という名前でpxelinuxのブートローダのイメージを配置しておく.
– /srv/tftp/debianディレクトリにカーネルといろいろを格納しておく.
– /srv/tftp/pxelinux.cfgディレクトリにpxelinuxの設定を置く.

やり方

proxy dhcpとして使える有名なソフトはdnsmasqというものです.これは標準レポジトリでインストールすることができます.dnsmasq自体は,汎用のdhcpサーバとして使える上に,tftpサーバの役割も持っています.ここでは,dnsmasqのproxy dhcpとtftpサーバの機能のみを利用することにします.そのために以下の設定を/etc/dnsmasq.confに加えます.

port=0はproxy dhcpとして使用することを意味しています.次のenable-tftpはtftpサーバを有効にする設定です.tftp-rootはtftpサーバのルートディレクトリを示します.ここでは/srv/tftp以下をtftpサーバで公開することになります.dhcp-rangeはproxy dhcpの適用範囲となるホストをネットワークアドレスで指定します.最後の,pxe-serviceですが,最初のx86PCは絶対に必要なおまじないだと考えましょう.次の”pxelinux”は単にラベルなので好きに指定して良いです.最後のpxelinuxはブートイメージを表します.この名前の最後には自動的に’.0’が末尾に追加されることになるので,実際に指定されるファイルの絶対アドレスは/srv/tftp/pxelinux.0となります.ここではネットワークブートにpxelinuxを使用するので,ブートするイメージはpxelinux.0です(このファイルはネット上から適当にダウンロードした後に,事前に/srv/tftpディレクトリを作ってコピーしておきます).

さて,この設定を行ったらdnsmasqを再起動します.次に必要なのはpxelinuxの設定です.この設定ファイルは/srv/tftp/pxelinux.cfgディレクトリにまとめます(存在しなければ作ってください).このディレクトリの位置は(おそらく)pxelinux.0と同じ階層である必要があるのかなと思います.このディレクトリ内のファイル名にはMACアドレスかipアドレス,そしてdefaultが使えます.例えばネットワークブートするマシンのMACアドレスがac-1f-6b-0a-XX-XXの場合には,pxelinux.cfgの中に,”01-ac-1f-6b-0a-XX-XX”というファイルを作ると,pxelinux.0はこのファイルを読み出すように働きます.もし,pxelinux.cfgの中に該当するMACアドレスのファイルがなければ,次にipアドレスで合致するファイルを探し,それもなければ”default”という名前のファイルを読み出します.

設定ファイルには例えば以下のようなことを書きます.

まずdefault debianですが,これは”debian”という名前のファイル,もしくはlabelを最初に読み出すことを指示します.例えばブート時にメニューを表示したいときには,menu.c32をpxelinux.0と同じディレクトリに持ってきておいて,default menu.c32とすれば,メニューを表示させることができます(現在は,menu.c32を使用する際に,libutil.c32もコピーしておく必要があります).ここでは,defaultの次の行にある,LABEL debian以下の設定を標準で呼び出すことを表しています.次の,kernel debian/vmlinuzはカーネルとしてdebian/vmlinuzを読み出せという指示です.このアドレスは,tftpのルートから見たディレクトリを指します.ですから,今回の場合は,/srv/tftp/debian/vmlinuzのことです.次のappendの行は様々な設定を行うためのものです.ここの部分の各オプションは次の意味を持ちます.

  • root : ブートしたあとのルートとなるデバイスを指定します.ディスクレスサーバの場合は/dev/nfsです.
  • initrd : initramfsのイメージを指定します.
  • net.ifnames : ネットワークカードの名前を認識した順でeth0, eth1, .., ethnという形で/dev/以下に割り当てます.ネットワークカードのデバイス名がわかっている場合はこのオプションは必要ありません.
  • nfsroot : nfsでルートシステムをマウントする際に指定します.ここではipアドレス172.20.24.21の/srv/nfsrootというディレクトリがマウントされます.
  • ip : ipアドレスの割り当て方を指定します.dhcpで割り当てる場合はip=dhcpとします.静的な場合は,ip=<ipアドレス>:<ネットワークブートの接続先サーバのipアドレス>:<デフォルトゲートウェイ>:<サブネットマスク>:<ホスト名>:<使用するネットワークデバイス>という形で指定します.後ろの方を省略する場合は,指定したいところまで記述してそれ以降を単に書かなければ良いです.例えばip=172.20.24.10:172.20.24.21だけでもOKです.
  • init : おそらく一番最初に起動するプロセスのことではないでしょうか.昔はinitというプロセスが一番最初に呼び出されて動いてましたが,今はsystemdを使うのが一般的です.
  • rw : ディスクへの読み書きを許可します.異常が出る可能性も充分あるので,roにしたほうが良いかもしれません.
  • quiet : 忘れました.

こんな感じの設定を各設定ファイルに書きます.もしすべてのマシンで同じ設定でブートするのであれば,pxelinux.cfgにはdefaultファイルのみを作ればいいです.さて,上記の設定を見れば分かる通り,カーネルとinitramfsのイメージだけは必ず用意する必要があります.iniramfsのイメージの作り方は,まずinitramfs.confを作ります.例を示します.

特に特筆すべき事はありませんが,一つだけ.DEVICEオプションには使用するネットワークデバイスを指定できます.さて,この設定ファイルを作ったら,

を実行します.ここで,-dオプションはinitramfs.confの場所を指定します.また-oオプションは出力ファイル名のことです.これを実行すると大量にエラーが出ますが,あまり気にする必要はありません.最後に,vmlinuzを実行中のリナックスからとってきます.ホストのカーネルイメージは/boot以下にあります.例えば,/boot/vmlinuz-4.9.0-amd64みたいな感じです.これをvmlinuzにして/srv/tftp/debian/以下にコピーします.

さてここまでをまとめるとディレクトリ構造は以下の通りとなります.

最後に,必要なものがあります.それはldlinux.c32というファイルです.これは/usr/lib/syslinux/modules/bios/ldlinux.c32というところにあります.これをpxelinux.0があるディレクトリにコピーします(sudo apt install syslinuxを事前にしておくこと).

以上により必要な処理は終わりです.ネットワークブートをして動作を確認します.

内容についてどう思いますか?
  • いいね (3)
  • だめ (0)

昔より感動がなくなった

これを見てくれる後輩がいるらしく、更新されてないと言われてしまったので何か書こうかなと。

一昨日くらいに、大阪で串かつとたこ焼きを食べた。この2つは、大阪の定番中の定番グルメだろう。今から5年くらい前にも一度食べたことがあって、そのときには非常に感動した覚えがある。それを久しぶりに食べて見たら、思ったより普通で拍子抜けだった。あの頃はまだ高校2年生(高専だったけど)だけれど、それでも味覚が今とそれほど違うとは思えない。それとも5年間の間に、俺の味覚が大きく変化してしまったのだろうか。

とにかく、昔ほどの感動がなくなってしまい、なんだかすごく損した気分になった。年をとるに連れて急速に感性が衰えてきてるのかもしれない。何事楽しく感じれるかどうかは、その人の受け取り方によるというのを、強く実感した。でも今更初心に戻って感動を味わうことは難しいし、楽しく感じるものが減っていくのは避けられないのだろう。つらすぎる

普段から、面白いこと探しをしてるわけだけど、年をとるに連れて難易度がどんどん上がっているのかなと思う。俺以外の人たちは、この面白いと思える範囲の縮小はどのくらいの速度なんだろうか。

内容についてどう思いますか?
  • いいね (1)
  • だめ (0)

やりたいこと

やりたいと思っていることがいくつかある.箇条書きにすると

  • FPGAのCPU実装をもっと頑張る(具体的にはUnix系OSを動かす)
  • Rustをやる(できれば研究とかバイトのコードも徐々に移行したい)
  • 日本語力を上げる
  • もっといろんなことを勉強する(暗号,音声,機械学習,etc)

のような感じ.別に最後のやつは普段のタスクの中に自然と組み込まれている感じなのであまり意識する必要はないだろうけど,上から2つは個人的に時間を作ってやらないとできるとは思えない.3つ目は文章が下手くそなのでうまくなりたいなということ(願望).

FPGAのやつはできればCPUの実装のコード(verilog)をきれいにしたというのもある.研修Aという研究室の自由課題でやったものだから,締切に合わせて結構その場しのぎでやってしまった感があって,それをどうにかしないと次に進む上で障害になりそう.かと言ってあれってそんな簡単に直せるとは思えない… 抜本的に書き直す羽目になりそう.そもそもverilogってアセンブリに近いものがあって全然きれいに書けてる自信がわかないんだけどどうすりゃいいんだろう.高位合成とかと違って結構低レイヤだから記述量が多くなりがちなのが影響して,とてもじゃないけど見やすくならない.あれも結局経験値で決まってくるやつなんだろうな.

Rustについて言えば,とにかく実践で使っていくしかないだろうなって思ってる.入門書とか初心者向けの記事とかをただ追って読んでるだけだと全然頭に入ってこないたちなので,実際に使って鍛えていくしかない.自分もそんなに詳しいわけじゃないんであれだけど,c言語とかc++みたいなシステム周りとか結構低いレイヤのプログラミング言語って,D言語とか他にもあるんだろうけど結局のところc言語 or C++がデファクトスタンダードって感じがあるように思う(マイコンとかの開発環境でC++/C以外の言語を使う場面ってなくはないけど少ない気がする).LLだとか関数型言語とかだと選択肢がありすぎるくらいにはあるのに,低レイヤ向けの,アセンブリより抽象度が一つ上なメジャーな高級言語ってのが,もう何十年も前に発明されたCとかC++のまま変わってないってのは,あまりに時代遅れな感じがする.と言いながらもう10年近くCだとかC++を書いてきた人間がこんなことを言うのは説得力にかけるのかもしれないけど,流石に限界というかこのあたりにもイノベーションがあってもいいよねってのは薄々思っていたところ.確かにC++は最近になってC++14とかC++17とか新しくなってきてるけど,もともと難解だったC++に更に付け足しつけたしで色々くっつけたもんだから複雑怪奇になって来てて,「C++を理解してます」ってのがジョークになるという笑うにも笑えない状態になってる.

だから流石にそろそろ新しくそういうシステム周りもかける言語を習得したいなと思ってたわけだけど,ちょうどMozillaがRustを開発してるという話を知って,これは良さそうと感じた.最近はライブラリも結構充実してきてて特に問題もなさそう.他に最近話題のコンパイルするような静的型付け言語としてはGoとかもあるけど,あれはポインタを叩くような処理をするというよりは,コンパイルできるLLみたいなイメージが有る.Google的には速度が出るLLが作りたかったってことなんかなという印象(素人目線).個人的にはやっぱりLLとシステム記述向けの言語って住み分けができてると思ってて,前者が簡単にかける代わりに詳細な記述をしたり速度を出したりすることが難しいもので,後者がその反対という感じ.よくGoとRustを対比させる記事を見るけど,それはこの2つがちょうどLLとシステム記述向け言語の間くらいに位置する言語だからということなんだろうな.ただGoはどちらかと言えばLL寄りで,Rustがシステム記述向けよりなんだろうと思うし,だからこの2つは用途が衝突するところもあるけど,全くかぶらないところもあるんだと思ってる.

確かにLLって半端じゃないくらいに遅いから早くしたいと思う人が多いのは当然だよね.pythonくらいしか経験がないけど,それでもC++なら一瞬で終わる処理が半端じゃないくらいに時間かかったりするのを見て,何とも言えない感じなることはある.プログラミング界隈で有名な話?に80:20則ってのがあって,プログラム全体の20%が実行時間の80%を占めてるって経験則なんだけれど,LLの哲学的には,重い20%のコードをCとかにまかせて,速度がでなくても大丈夫な80%ところをLLでどうにかするって話だったんだと思う.確かにそれは合理的に見えるし,全部を無駄に書くのが大変な言語で修行のごとく記述していくのは意味がないってのは大いに賛同するところなんだけど,現実はやっぱりなかなか厳しいものがあって,そう簡単じゃない.実際に使ってみると,LLがおそくてその80%が馬鹿みたいに大きくなったりして,僕の書き方が悪いってのはあるんだろうけど,なんだかなーって結果になることも往々にしてある.そんなこんなあって,みんな早いLLを求めてたんだろうから,Goみたいな言語が出て来たんだろうなという予想.本当のところどういうことなのかはGoを勉強しないとわからないけど,今のところGoが重要そうなWeb界隈の方には全く関わりがないので,実用的な観点でやることはなさそう.

とまあ前置きが長くなったけどRustを勉強したいなと思ってる.関数型言語の流れを受けて色々と拡張があるみたいだし,加えてC++とかと比べて安全だと言われればやらない理由も特にない.速度も結構早いみたいだしね.

ということで今年度も頑張っていきたいと思います.

内容についてどう思いますか?
  • いいね (2)
  • だめ (1)

Chaos;Childのアニメ

Chaos;Childは気に入っているゲームの一つだ.発売されたときにはSteins;gateを超えたなどという,これまた自信満々の宣伝がされていた覚えがある.当時はそんなわけないと思ったが,やってみると確かに方向性は違えど,それくらい面白い.最後に驚愕の展開が待っていたり,Happy Endで終わるわけではないので,賛否両論あるのかもしれないが,私はあの展開を評価するし,あれがあったからこそ,あそこまでのできになったのだろう.

さて,そのChaos;Childのアニメが今放映されている.大抵こういったノベルゲームやエロゲのアニメ化は, Steins;gateやClannadなどの稀有な例を除けば,失敗する傾向があるため,せっかく原作のできが良かったChaos;Childもひどいことになるのではないかと思っていたが,これが予想以上に的中してしまった.もともとシナリオ全体の文章量がSteins;gateの1.5倍ほどあると,シナリオライターへの取材記事に乗っていたこともあって,2クールでぴったりだったSteins;gateよりもアニメ化が難しいとはわかっていた.またキャラクターの一つ一つの行動や作中で発生する事件であるニュージェネの再来が巧妙に伏線回収されることで初めて話として成り立つため,端折ることが難しく,それもアニメ化への壁の一つになるだろうと思っていた.ところが,あろうことか今季のChaos;childのアニメは1クールですべての内容を放送するつもりのようだ.Steins;gateが2クールでちょうどだったことを考えれば,そんなことができるはずもなく,結局のところ,原作を知らないアニメ視聴者が明らかにおいていかれるような展開を平気で行い,挙句作中ヒロインの一人の大きな秘密を簡単に本人に喋らせるという大胆な改悪をしてしまっている.

私としては,せっかく現場スタッフが頑張って作り上げた作品に文句を言いたくはないが,あまりにひどい内容に開いた口が塞がらない.下手に本編中の重要な要素をネタバレしてしまうくらいなら,本編に触れずにおんなじキャラを利用した,全く別のアニメとして放送されたほうがマシだった.作中のネタバレのせいで,アニメ視聴後にゲームをやるとインパクトが弱まってしまうし,アニメのせいでせっかくの原作が埋もれてしまう可能性まである.

もしまだChaos;childのアニメを見ていない人がいるなら,ここではっきり忠告する.決してアニメを見てはいけない.もしChaos;childに興味を持っているなら,原作をやるべきだ.この作品は買ってやるだけの価値が絶対にある.

内容についてどう思いますか?
  • いいね (0)
  • だめ (0)

サーバーを立てる利点

久しぶりに投稿.

以前からVPSを借りてサーバを立てている.サーバを立てるのに必要な資金は月に1000円程度(スペックにもよるが)と,ドメインの更新費用ぐらいだ.月々1000円は年で12000円ほどになるわけで安いわけではない.しかし,サーバを借りることは,その費用以上のいくつかの利点があると思っている.その理由を幾つか上げていこうと思う.

1.Sharelatexをplatexで使える

Sharelatexとは,オンライン上で使えるTeXのエディタである.TeXなんてローカルに必要なものを諸々入れれば,誰でも利用できるわけで,Sharelatexのようなサービスを利用する必要性を感じない人も多いだろう.しかし,Sharelatexの利点は,どこからでもインターネットさえつなげればアクセスでき,またCtrl+Enterで簡単にコンパイルできて,かつその結果を画面分割の形で簡単に見ることができることにある.さらにコンパイル結果のドキュメント上のある位置に対応するTeXのソースコードに簡単にアクセスできるなど,様々な便利機能が利用でき,一度これを使ってしまったら,なかなかコマンドラインでの環境には戻れないだろう.だが,このSharelatexに関して言えば,別にサーバを建てなくても,フリーで使えるサービスが公開されており,自前で環境を作る理由はない.

しかし,この便利なSharelatexだが,フリーで公開されているものはplatexが標準で対応していないという大きな欠点がある.このせいで日本語環境で一般的なjarticleが使えないなど,TeXで日本語の文章を作る上で不便なところがある.しかし,SharelatexはGithubにてオープンソースで公開されており,自力でplatexに対応させて自前のサーバで公開することが可能である.これだけでもサーバを借りる一つの理由になり得るだろう.

2.ownCloud

クラウドストレージサービスと言えば,Google Drive,DropBox,iCloudなどいろいろなものがある.こういったサービスがまだ一般的でなかった頃はUSBメモリなどを持ち歩き,そこに必要なデータを入れたりしていたものだが,今やこういったサービスを利用することで,どこでも自分のデータにアクセスすることができるようになった.しかしこういったサービスは,無料有料にかかわらずある一定の容量制限がかかっていることが普通である.また預けているデータにたいして検閲が入ることはよく知られていない事実であり,そうでなくてもそれらのデータを使って何をしているかわかったものではない(と言いつつ私はあまりそういった個人情報を個人が特定できない範囲で利用される分には特に異論はない.例えば機械学習などにそれらのデータを利用しているかもしれないが,それによって誰か特定が被害を被るとは思えない).しかし自前でこういったクラウドストレージを運営すれば,そういった煩わしさから開放され,もっと大きな領域を好きに利用できるようになるだろう.そのようなストレージサービスを開始するためのオープンなソフトとしてownCloudがある.これを利用することで簡単にGoogle Driveのようなサービスを開始できる.多少クライアント側のソフトに難があるような気がするが,それさえ問題にならないなら使わない手はない.

3.WordPress

これは動機として弱いかもしれないが,WordPressを利用すれば,自前のサーバで簡単にブログやサイトを始めることができる.このWordPressの何がすごいかといえば,UIが充実していることだろう.HTMLやCSSに関する知識が殆ど無い人でもそれなりの見た目のWebページを作ることができる.よくない点があるとすれば,livedoorやhatenaなどのブログと違い自力でメンテナンスを行わなければならず,セキュリティを意識しなければならないことだろうが,広告などが入らないなど様々な利点がある.

4.サーバ管理することで知識が手に入る

これもサーバを建てることの一つの利点だろう.普段コンピュータ関連に無縁だったり,たとえそういった知識が乏しい人でも,サーバを月々いくらかの金を出して借りることになれば,無理にでも中身を理解しようとするだろう.多少自分にムチを打つくらいしなければ,なかなかこういった知識をつけようとしないのではないかと思う.その一つのきっかけとなれば,サーバを借りることにも大きな意義が見いだせるのではないかと思う.

ぱっと思いつくだけでも,4つもの利点をあげることが出来た.他にもいろんな使いみちがあるだろうし,月々1000円程度でも様々な恩恵を享受することができる.興味があればぜひサーバをレンタルすることをおすすめする.

内容についてどう思いますか?
  • いいね (2)
  • だめ (0)