bridge+epairで仮想HUBをvitochaで作ってみる
先日書いた記事
bridge+epairで仮想HUBを作ってみる=>できた -
を@tss_ontapさんが作成したvitochaを用いて作成します。
-
-
-
-
-
-
- -
-
-
-
-
-
vitochaについての情報はこちら。
公式サイト
VITOCHA
説明スライド
VIMAGE仮想ネットワーク構築クラスライブラリ VITOCHA (通称バーチャル◯もちゃ)
-
-
-
-
-
-
- -
-
-
-
-
-
ネットワーク図は前回とほぼ同じです。
今回はswitchにIPaddrを割り当てていません。
スクリプト
#!/usr/local/bin/ruby require './vitocha/vitocha.rb' tomocha=Operator.new #create switch switchNAME = "switch" switch=Bridge.new(switchNAME) switch.on #hostjail connect switch epaira, epairb = tomocha.createpair epairaIP = "192.168.20.1" epairaMASK = "255.255.255.0" ifconfig(epaira + " inet " + epairaIP + " netmask " + epairaMASK) ifconfig(epaira + " up") switch.connect(epairb) switch.up(epairb) #create server01 serverNAME = "server01" epairaIP = "192.168.20.11" epairaMASK = "255.255.255.0" server = Server.new(serverNAME) epaira, epairb = tomocha.createpair server.connect(epaira) server.assignip(epaira,epairaIP,epairaMASK) tomocha.register(epaira,serverNAME,epairaIP,epairaMASK) server.up(epaira) switch.connect(epairb) switch.up(epairb) #create server02 serverNAME = "server02" epairaIP = "192.168.20.12" epairaMASK = "255.255.255.0" server = Server.new(serverNAME) epaira, epairb = tomocha.createpair server.connect(epaira) server.assignip(epaira,epairaIP,epairaMASK) tomocha.register(epaira,serverNAME,epairaIP,epairaMASK) server.up(epaira) switch.connect(epairb) switch.up(epairb)
スクリプトを動かす
# ./test.rb Hi, I'll do your job. shell(#<Th:0x00000801d901a8>): /usr/sbin/jls host.hostname shell(#<Th:0x00000801d901a8>): /sbin/ifconfig bridge create shell(#<Th:0x00000801d901a8>): /sbin/ifconfig bridge0 vnet switch shell(#<Th:0x00000801d901a8>): /usr/sbin/jexec switch ifconfig bridge0 name vbridge0 shell(#<Th:0x00000801d76f28>): /usr/sbin/jexec switch ifconfig vbridge0 up shell(#<Th:0x00000801d901a8>): /usr/sbin/jexec switch ifconfig vbridge0 up shell(#<Th:0x00000801d901a8>): /sbin/ifconfig epair create shell(#<Th:0x00000801d901a8>): /sbin/ifconfig epair0a link 02:c0:e4:00:0:0a shell(#<Th:0x00000801d901a8>): /sbin/ifconfig epair0b link 02:c0:e4:00:0:0b shell(#<Th:0x00000801d901a8>): /sbin/ifconfig epair0a inet 192.168.20.1 netmask 255.255.255.0 shell(#<Th:0x00000801d901a8>): /sbin/ifconfig epair0a up shell(#<Th:0x00000801d901a8>): /sbin/ifconfig epair0b vnet switch shell(#<Th:0x00000801d901a8>): /usr/sbin/jexec switch ifconfig vbridge0 addm epair0b shell(#<Th:0x00000801d901a8>): /usr/sbin/jexec switch ifconfig epair0b up shell(#<Th:0x00000801d901a8>): /usr/sbin/jls host.hostname shell(#<Th:0x00000801d901a8>): /sbin/ifconfig epair create shell(#<Th:0x00000801d901a8>): /sbin/ifconfig epair1a link 02:c0:e4:00:1:0a shell(#<Th:0x00000801d901a8>): /sbin/ifconfig epair1b link 02:c0:e4:00:1:0b shell(#<Th:0x00000801d901a8>): /sbin/ifconfig epair1a vnet server01 shell(#<Th:0x00000801d901a8>): /usr/sbin/jexec server01 ifconfig epair1a inet 192.168.20.11 netmask 255.255.255.0 shell(#<Th:0x00000801d901a8>): /usr/sbin/jexec server01 ifconfig epair1a up shell(#<Th:0x00000801d901a8>): /sbin/ifconfig epair1b vnet switch shell(#<Th:0x00000801d901a8>): /usr/sbin/jexec switch ifconfig vbridge0 addm epair1b shell(#<Th:0x00000801d901a8>): /usr/sbin/jexec switch ifconfig epair1b up shell(#<Th:0x00000801d901a8>): /usr/sbin/jls host.hostname shell(#<Th:0x00000801d901a8>): /sbin/ifconfig epair create shell(#<Th:0x00000801d901a8>): /sbin/ifconfig epair2a link 02:c0:e4:00:2:0a shell(#<Th:0x00000801d901a8>): /sbin/ifconfig epair2b link 02:c0:e4:00:2:0b shell(#<Th:0x00000801d901a8>): /sbin/ifconfig epair2a vnet server02 shell(#<Th:0x00000801d901a8>): /usr/sbin/jexec server02 ifconfig epair2a inet 192.168.20.12 netmask 255.255.255.0 shell(#<Th:0x00000801d901a8>): /usr/sbin/jexec server02 ifconfig epair2a up shell(#<Th:0x00000801d901a8>): /sbin/ifconfig epair2b vnet switch shell(#<Th:0x00000801d901a8>): /usr/sbin/jexec switch ifconfig vbridge0 addm epair2b shell(#<Th:0x00000801d901a8>): /usr/sbin/jexec switch ifconfig epair2b up
jail hostから192.168.20.11(server01)にpingを打ってみる。
# ping 192.168.20.11 PING 192.168.20.11 (192.168.20.11): 56 data bytes 64 bytes from 192.168.20.11: icmp_seq=0 ttl=64 time=0.293 ms 64 bytes from 192.168.20.11: icmp_seq=1 ttl=64 time=0.253 ms
jail hostから192.168.20.12(server02)にpingを打ってみる
# ping 192.168.20.12 PING 192.168.20.12 (192.168.20.12): 56 data bytes 64 bytes from 192.168.20.12: icmp_seq=0 ttl=64 time=0.328 ms 64 bytes from 192.168.20.12: icmp_seq=1 ttl=64 time=0.080 ms
server01から192.168.20.12(server02)にpingを打ってみる
# jexec server01 ping 192.168.20.12 PING 192.168.20.12 (192.168.20.12): 56 data bytes 64 bytes from 192.168.20.12: icmp_seq=0 ttl=64 time=0.124 ms 64 bytes from 192.168.20.12: icmp_seq=1 ttl=64 time=0.080 ms
全て疎通できてますね。
vitochaを使えばepairのMACaddrの重複を防ぐことができ、また別プログラムとの連携も可能になります。
以上。
bridge+epairで仮想HUBを作ってみる=>できた
もっといい方法が必ずあるはずなので、とりあえずメモとして。
以下の様なネットワークを作ってみます。
まずはスイッチ部分を作成し、Jail hostまでつなげるところから。
# ifconfig bridge create bridge0 # ifconfig bridge0 vnet switch # ifconfig epair create epair0a # ifconfig epair0a 192.168.20.1/24 up # ifconfig epair0b vnet switch # jexec switch ifconfig bridge0 192.168.20.254/24 up # jexec switch ifconfig epair0b up # jexec switch ifconfig bridge0 addm epair0b # ping 192.168.20.254 PING 192.168.20.254 (192.168.20.254): 56 data bytes 64 bytes from 192.168.20.254: icmp_seq=0 ttl=64 time=0.269 ms 64 bytes from 192.168.20.254: icmp_seq=1 ttl=64 time=0.120 ms
これでJail hostとSwitch部分のネットワークが作成できました。
次はserver01とswitchをつなげるところ。
# ifconfig epair create epair1a # ifconfig epair1a vnet server01 # ifconfig epair1b vnet switch # jexec server01 ifconfig epair1a 192.168.20.11/24 up # jexec switch ifconfig epair1b up # jexec switch ifconfig bridge0 addm epair1b # # jexec server01 ping 192.168.20.1 PING 192.168.20.1 (192.168.20.1): 56 data bytes 64 bytes from 192.168.20.1: icmp_seq=0 ttl=64 time=0.181 ms 64 bytes from 192.168.20.1: icmp_seq=1 ttl=64 time=0.135 ms
最後にserver01とswitchをつなげるところ。server01とやっていることはほぼ同じ。
# ifconfig epair create epair2a # ifconfig epair2a vnet server02 # ifconfig epair2b vnet switch # jexec server02 ifconfig epair2a 192.168.20.12/24 up # jexec switch ifconfig epair2b up # jexec switch ifconfig bridge0 addm epair2b # # jexec server02 ping 192.168.20.1 PING 192.168.20.1 (192.168.20.1): 56 data bytes 64 bytes from 192.168.20.1: icmp_seq=0 ttl=64 time=0.181 ms 64 bytes from 192.168.20.1: icmp_seq=1 ttl=64 time=0.126 ms
これで全てつなぎ終えました。
server01とserver02の疎通も確認してみます。
# jexec server01 ping 192.168.20.12 PING 192.168.20.12 (192.168.20.12): 56 data bytes ping: sendto: Host is down ping: sendto: Host is down
・・・疎通できない・・・・・・。
何か間違っている点、やっていない点があれば@Shutingrz宛に助言お願いします。
追記
server01から192.168.20.12(server02)にpingを飛ばした時のserver02のepair2aのtcpdumpです
server01のping
# jexec server01 ping 192.168.20.12 PING 192.168.20.12 (192.168.20.12): 56 data bytes ping: sendto: Host is down
server02のtcpdump
# jexec server02 tcpdump -i epair2a tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on epair2a, link-type EN10MB (Ethernet), capture size 65535 bytes 22:28:18.952300 ARP, Request who-has 192.168.20.12 tell 192.168.20.11, length 28 22:28:20.003368 ARP, Request who-has 192.168.20.12 tell 192.168.20.11, length 28 22:28:21.053505 ARP, Request who-has 192.168.20.12 tell 192.168.20.11, length 28
追記
できなかった理由が判明しました。
jailer設定 [DEMON-LORD]
ifconfig epair[n] create
epair[n]aとepair[n]bが作成される。epairを一つ作成してjailerからprisonerに割り当ててから次のepairを作成するとMACアドレスが重複する場合がある。この場合、それぞれのepairを同じbridgeに接続するとMACアドレスが重複して通信が行えなくなる。問題を回避する為、epairの作成は同時期に行う。
まさかと思いjexec switch ifconfig。
epair1b: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500 options=8<VLAN_MTU> ether 02:ff:50:00:06:0b inet6 fe80::ff:50ff:fe00:60b%epair1b prefixlen 64 scopeid 0x4 nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL> media: Ethernet 10Gbase-T (10Gbase-T <full-duplex>) status: active epair2b: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 options=8<VLAN_MTU> ether 02:ff:50:00:06:0b inet6 fe80::ff:50ff:fe00:60b%epair2b prefixlen 64 scopeid 0x5 nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL> media: Ethernet 10Gbase-T (10Gbase-T <full-duplex>) status: active
案の定macaddrが被ってました・・・。
@tss_ontap さんも昔この事言ってたのを今になって思い出しました。
修正として、まずifconfig epair createを3連続で行うようにしました。
結果。
# jexec server01 ping 192.168.20.12 PING 192.168.20.12 (192.168.20.12): 56 data bytes 64 bytes from 192.168.20.12: icmp_seq=0 ttl=64 time=0.219 ms 64 bytes from 192.168.20.12: icmp_seq=1 ttl=64 time=0.076 ms
バッチリです。
原因はわかったものの、今やってる卒論はリアルタイムにepairを作成、jailに割り当てる方式を採用しているので、この問題はどうやって解決すべきか・・・。
以上。
vnetが動かないqjailを無理やり動かしてみる
追記.2014/08/05
記事を修正しました。
qjail configでvnetが動きました。
qjail config -vを使う方法
# qjail config -v test01 At this time only ipfw firewall is vimage aware and can run on the host and in the vnet jail at the same time. Chose by entering ipfw or none and pressing the enter key. none There are two network configuration methods available for connecting this vnet/vimage jail to the public internet. The bridge/epair method and the netgraph method. Chose which network method you want this vimage jail to use by entering [ be ] for bridge/epair or [ ng ] for netgraph and pressing the enter key. be Successfully enabled vnet for test01
noneを入力すると、ipfwを使いません。
epairを使うならば、beを入力します。
しかし、この方法だとqjail startした時にepairが1つ自動生成され、プライベートIPアドレスが自動で割り当てられるので、
自分で全てepairを作りたいときには正直邪魔です。
そのようなときには以下の2つの方法を使ったほうがいいです。
ソースコードを書き換える方法
ソースコードを書き換えるのに抵抗がなければ圧倒的にこちらのほうが楽です。
qjail Version 3.6のソースコードです。
/usr/local/bin/qjailを書き換えます。
echo vnet;を行う行のifをコメントアウトし、常に行われるようにする
if [ ${vnet} ]; then
↓
# if [ ${vnet} ]; then
fi
↓
# fi
この状態でqjail createし、startすれば、vnetが有効化されている状態になります。
qjailはBSDライセンスなので、ソースコードを改変して頒布しても著作権明記をすれば問題無いはずです。
しかしソースコードを書き換えてしまうと常にvnetが有効になってしまうので注意。
/usr/local/etc/qjail.vnet/を使う方法
まず、いつものように、qjail createをします。すると/usr/local/etc/qjail.local/test01が生成されます。
# cat /usr/local/etc/qjail.local/test01 name="test01" ip4="0.0.0.0" ip6="" path="/usr/jails/test01" interface="em1" fstab="/usr/local/etc/qjail.fstab/test01" securelevel="" cpuset="" fib="" vnet="" vinterface="" rsockets="" ruleset="" sysvipc="" quotas="" nullfs="" zfs="" poststartssh="" deffile="/usr/local/etc/qjail.local/test01" image="" imagetype="" imageblockcount="" imagedevice=""
ここからvnetを書き換えます。
vnet=""
↓
vnet="yes"
次に、/etc/jail.confを見ます。
test01 { host.hostname = "test01"; path = "/usr/jails/test01"; mount.fstab = "/usr/local/etc/qjail.fstab/test01"; exec.start = "/bin/sh /etc/rc"; exec.stop = "/bin/sh /etc/rc.shutdown"; exec.consolelog = "/var/log/qjail.masterRouter.console.log"; mount.devfs; ip4.addr = "0.0.0.0"; interface = "em1"; devfs_ruleset = "4"; }
もし作成されていなければqjail start test01;qjail stop test01をすれば作成されると思います。
/usr/local/etc/qjail.vnet/test01を作成し、この内容をコピーします。そして、
ip4,addrの行を削除し、vnet;を追加します。↓
test01 { host.hostname = "test01"; path = "/usr/jails/test01"; mount.fstab = "/usr/local/etc/qjail.fstab/test01"; exec.start = "/bin/sh /etc/rc"; exec.stop = "/bin/sh /etc/rc.shutdown"; exec.consolelog = "/var/log/qjail.masterRouter.console.log"; mount.devfs; interface = "em1"; devfs_ruleset = "4"; vnet; }
そしてqjail startをすると、vnetが有効化されたjailが出来上がります。
qjailについてのTIPS
単発ネタが多いからまとめて投稿
随時更新します。
qjailでもVIMAGE vnetを使う方法
追記(07/10)
そのままではvnetを有効化できませんでした。
こちらの記事の内容で有効化できます。
vnetが動かないqjailを無理やり動かしてみる -
freebsd qjailでもvnetを有効化できます。
# qjail config -w em1 test01 Successfully enabled vnet.interface for test01
- wのあとにはインターネットに到達できる(もしくは予定)のインターフェイスを指定。
qjailでホストへのシンボリックリンクを貼る方法
ezjailではそのままflavours/defaultに、
ln -s /basejail/pkg /usr/jails/flavours/default/pkg
して、ezjail-admin createしても何のエラーもなく通してくれますが、
qjailのflavors/defaultに
ln -s /sharedfs/pkg /usr/jails/flavours/default/pkg
上記のようにシンボリックリンクを張ったあとqjail createすると、
# qjail create -f default -4 10.0.0.1 example Only in /usr/jails/flavors/example: pkg Error invalid directories in flavor default.
とエラーが出て作成ができません。
しかしシンボリックリンクを張らずに先にqjail createし、その後に
ln -s /sharedfs/pkg /usr/jails/example/pkg
と打てば普通にホスト側へのシンボリックリンクが貼れます。
qjailで一気に複数のjailを作成する方法
qjail create -f default -d [jailの数] -4 10.0.0.1 test
- dのあとに数値を入れればその数のjailを作ってくれます。
以下は例
# qjail create -f default -d 15 -4 10.0.0.1 test Warning: Existing jail test01 is already assigned IP address 10.0.0.1 Successfully created test-1 Successfully created test-2 Successfully created test-3 Successfully created test-4 Successfully created test-5 Successfully created test-6 Successfully created test-7 Successfully created test-8 Successfully created test-9 Successfully created test-10 Successfully created test-11 Successfully created test-12 Successfully created test-13 Successfully created test-14 Successfully created test-15
qjail delete -Aで全て削除できる
qjail start で全てのjailが動く
qjail stop で全てのjailが止まる
pingなどを有効化する
標準の状態では無効になっているのでpingが飛ばせません。
#jail -m name=test01 allow.raw_sockets=1
または、
#qjail config -k test01
netstatなどを有効化する
標準のdevfsでは/dev/memや/dev/kmemがないとnetstatなどルーティング系ができませんでした。
なのでdevfsに追加をします。
こちらの参考ページをどうぞ。
FreeBSD 9.1-STABLEでVIMAGEなJailを構築する | funi2.jp
jailのルールセットの変更は、
#jail -m name=test01 devfs_ruleset=5
上記でルールセットを5に変更できます。
しかしqjailでjailを作成したあとにjailコマンドで変更しても、実際は/devが変わっていないうえにjailを再起動すると4に戻ってしまいます。
その場合はやはりqjailのソースコードを書き換えるしかありません。
echo "devfs_ruleset = \"4\";"
↓
echo "devfs_ruleset = \"5\";"
qjail のオプションあれこれ
qjail update -pでportsのアップデート。
em-websocketで非同期処理(連続でサーバ側からクライアントにPushする)
EventMachine::WebSocket.start(host: "0.0.0.0", port: 3000) do |ws| 〜〜 sleep(1) msg = ”test1” ws.send(msg) sleep(1) msg = ”test2” ws.send(msg) sleep(1) msg = ”test3” ws.send(msg) 〜〜 end
というコードを書き、1秒毎にサーバ側がmsgをブラウザに送ることを期待したのですが、このコードでは、3秒後に3つのメッセージが同時に送信されます。
これを解決するためにEventMachine::deferを使います。
deferはその中で新しいスレッドを立て、非同期処理をしてくれる優れものです。
直したコードはこちら
EventMachine::WebSocket.start(host: "0.0.0.0", port: 3000) do |ws| 〜〜 EventMachine::defer do sleep(1) msg = ”test1” ws.send(msg) sleep(1) msg = ”test2” ws.send(msg) sleep(1) msg = ”test3” ws.send(msg) end 〜〜 end
参考文献
橋本商会
指定したpkg(pkgng)の全依存関係を表示する
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
バグのあるスクリプトは依存関係を調べるスクリプトで、修正箇所は
s,e = Open3.capture3("cd #{pkg};make build-depends-list")
↓
s,e = Open3.capture3("cd #{pkg};make run-depends-list")
if (line.include?(column) == true) then
↓
if (line.gsub("/usr/ports/","") == column) then
となります。
1つ目のバグで生じる問題は、build-depends-listはそのPortsをコンパイルするために必要なもので、これはpkgをダウンロードする場合は必要ありません。
そしてrun-depends-listは実行時に必要なもので、pkgでインストールする場合はこっちが必要なためです。
2つ目のバグで生じる問題は、例えば「python」というパッケージと「python2」というパッケージが必要な時、
先にpythonを処理してしまうと、次に「python2」を入れる時にincludeで重複リストを参照してしまうと「python」が引っかかってしまうためです。
記事のソースコードは修正済みです。
追記ここまで
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
pkg search [name]で見つけたパッケージに対し、pkg fetch [name]でパッケージを取得しても、依存関係になるパッケージは取得できないし、
インストールしていない状態ではpkg infoをして依存関係も調べることができません。
しかしpkgngとPorts Collectionは同じDBを使っているのでそこから依存関係を取得できます。
今回は例としてvimの依存関係を調べます。
欲しいpkgの正式名称を調べる
まずvimを検索してみます。
# pkg search vim ja-jvim-3.0.j2.1b_1 vim-7.4.334 vim-lite-7.4.334 vimpager-1.8.9 xpi-vimperator-3.5 #
上記のように5つパッケージが表示されます。
「vim-7.4.334」を選んだとして、以下のようにfetchしてaddしても、依存するパッケージが無いためエラーになります。(installすればいいじゃん、ってのは禁止。)
# pkg fetch vim-7.4.334 Updating repository catalogue The following packages will be fetched: vim-7.4.334 (100% of 6 MB) 6 MB to be downloaded Proceed with fetching packages [y/N]: y vim-7.4.334.txz 100% 5975KB 398.3KB/s 134.8KB/s 00:15 Checking integrity... done # pkg add /var/cache/pkg/All/vim-7.4.334.txz Installing vim-7.4.334...pkg: Missing dependency matching Origin: 'accessibility/atk' Version: '2.8.0' Failed to install the following 1 package(s): /var/cache/pkg/All/vim-7.4.334.txz
pkgのPortsのパスを調べる
これがスクリプト。nameに先ほど取得した「vim-7.4.334」を代入します。
require 'open3' ports = "/usr/ports" name = "vim-7.4.334" apkg = Array.new column = Array.new flag = false s,e = Open3.capture3("cd #{ports}/;make search name=#{name}") s = s.split("\n") s.each do |line| if(line.index("Port:") != nil) then column << line.gsub("Port: ","") flag = true next end if(flag == true) then if(line.index("Path:") != nil) then column << line.gsub("Path: ","") apkg << column column = [] flag = false end end if(line == "\n") then flag = false column = [] end end apkg.sort! apkg.each do |pkg| puts pkg[1] end
動かします。
# ./tree.rb /usr/ports/editors/vim #
上記のように、「/usr/ports/editors/vim」とパスが取得できました。
通常であれば、このように1行しかでないと思います。nameに「vim」など曖昧な文字列を入れると複数行出ます。
このスクリプトは、以下の結果からPathだけを抜き出すようにしています。
# make search name=vim-7.4.334 Port: vim-7.4.334 Path: /usr/ports/editors/vim Info: Improved version of the vi editor Maint: sunpoet@FreeBSD.org B-deps: atk-2.8.0 cairo-1.10.2_10,2 compositeproto-0.4.2 cups-client-1.7.3 damageproto-1.2.1 dejavu-2.34_3 encodings-1.0.4_1,1 expat-2.1.0_1 fixesproto-5.0 font-bh-ttf-1.0.3_1 font-misc-ethiopic-1.0.3_1 font-misc-meltho-1.0.3_1 font-util-1.3.0_1 fontconfig-2.11.0_3,1 freetype2-2.5.3_2 gdk-pixbuf2-2.28.2_1 gettext-0.18.3.1_1 glib-2.36.3_3 gnomehier-3.0 graphite2-1.2.4 gtk-update-icon-cache-2.24.22 gtk2-2.24.22_3 harfbuzz-0.9.28 hicolor-icon-theme-0.12 icu-53.1 indexinfo-0.2 inputproto-2.3 intltool-0.50.2 jasper-1.900.1_14 jbigkit-2.1_1 jpeg-8_5 kbproto-1.0.6 libICE-1.0.8_2,1 libSM-1.2.2_2,1 libX11-1.6.2_2,1 libXau-1.0.8_2 libXcomposite-0.4.4_2,1 libXcursor-1.1.14_2 libXdamage-1.1.4_2 libXdmcp-1.1.1_2 libXext-1.3.2_2,1 libXfixes-5.0.1_2 libXft-2.3.1_2 libXi-1.7.2_2,1 libXinerama-1.1.3_2,1 libXpm-3.5.11_2 libXrandr-1.4.2_2 libXrender-0.9.8_2 libXt-1.1.4_2,1 libexecinfo-1.1_3 libffi-3.0.13_1 libfontenc-1.1.2_2 libiconv-1.14_3 libpthread-stubs-0.3_5 libxcb-1.10_2 libxml2-2.9.1_1 libyaml-0.1.6 lua52-5.2.3_2 mkfontdir-1.0.7 mkfontscale-1.1.1_1 p5-XML-Parser-2.41_1 pango-1.34.1_5 pcre-8.34_1 perl5-5.16.3_11 pixman-0.32.4_2 pkgconf-0.9.6 png-1.5.18 python-2.7_1,2 python2-2_2 python27-2.7.6_4 randrproto-1.4.0 readline-6.3.6_1 renderproto-0.11.1 ruby-1.9.3.484_2,1 shared-mime-info-1.1_1 tcl86-8.6.1 tiff-4.0.3_4 xcb-util-0.3.9_3,1 xcb-util-renderutil-0.3.9 xextproto-7.3.0 xineramaproto-1.2.1 xorg-fonts-truetype-7.7_1 xproto-7.0.25 R-deps: atk-2.8.0 cairo-1.10.2_10,2 compositeproto-0.4.2 cscope-15.8a ctags-5.8 cups-client-1.7.3 damageproto-1.2.1 dejavu-2.34_3 encodings-1.0.4_1,1 expat-2.1.0_1 fixesproto-5.0 font-bh-ttf-1.0.3_1 font-misc-ethiopic-1.0.3_1 font-misc-meltho-1.0.3_1 font-util-1.3.0_1 fontconfig-2.11.0_3,1 freetype2-2.5.3_2 gdk-pixbuf2-2.28.2_1 gettext-0.18.3.1_1 glib-2.36.3_3 gnomehier-3.0 graphite2-1.2.4 gtk-update-icon-cache-2.24.22 gtk2-2.24.22_3 harfbuzz-0.9.28 hicolor-icon-theme-0.12 icu-53.1 indexinfo-0.2 inputproto-2.3 jasper-1.900.1_14 jbigkit-2.1_1 jpeg-8_5 kbproto-1.0.6 libICE-1.0.8_2,1 libSM-1.2.2_2,1 libX11-1.6.2_2,1 libXau-1.0.8_2 libXcomposite-0.4.4_2,1 libXcursor-1.1.14_2 libXdamage-1.1.4_2 libXdmcp-1.1.1_2 libXext-1.3.2_2,1 libXfixes-5.0.1_2 libXft-2.3.1_2 libXi-1.7.2_2,1 libXinerama-1.1.3_2,1 libXpm-3.5.11_2 libXrandr-1.4.2_2 libXrender-0.9.8_2 libXt-1.1.4_2,1 libexecinfo-1.1_3 libffi-3.0.13_1 libfontenc-1.1.2_2 libiconv-1.14_3 libpthread-stubs-0.3_5 libxcb-1.10_2 libxml2-2.9.1_1 libyaml-0.1.6 lua52-5.2.3_2 mkfontdir-1.0.7 mkfontscale-1.1.1_1 pango-1.34.1_5 pcre-8.34_1 perl5-5.16.3_11 pixman-0.32.4_2 png-1.5.18 python-2.7_1,2 python2-2_2 python27-2.7.6_4 randrproto-1.4.0 readline-6.3.6_1 renderproto-0.11.1 ruby-1.9.3.484_2,1 shared-mime-info-1.1_1 tcl86-8.6.1 tiff-4.0.3_4 xcb-util-0.3.9_3,1 xcb-util-renderutil-0.3.9 xextproto-7.3.0 xineramaproto-1.2.1 xorg-fonts-truetype-7.7_1 xproto-7.0.25 WWW: http://www.vim.org/ #
依存関係を調べる
依存関係を調べるためには以下のスクリプトを使います。pathに先ほど調べた「/usr/ports/editors/vim」を代入します。
#!/usr/local/bin/ruby require 'open3' ports = "/usr/ports" path = "/usr/ports/editors/vim" db = Array.new def recPkg(db,pkg) s,e = Open3.capture3("cd #{pkg};make run-depends-list") s.each_line do |line| flag = false #重複してたよフラグ line = line.chomp db.each do |column| if (line.gsub("/usr/ports/","") == column) then flag = true #重複してたよ break end end if(flag == false) then #重複していない場合はdbに依存情報を挿入 db << line.gsub("/usr/ports/","") recPkg(db,line.chomp) end end end recPkg(db,path) db.sort! puts db
動かします。
# ./recursive.rb accessibility/atk converters/libiconv devel/autoconf devel/bison devel/cmake devel/gettext devel/glib20 devel/gmake devel/gobject-introspection devel/icu devel/libcheck devel/libexecinfo devel/libffi devel/libpthread-stubs devel/libtool devel/m4 devel/p5-Locale-gettext devel/patch devel/pcre devel/pkgconf devel/readline devel/xorg-macros graphics/cairo graphics/gdk-pixbuf2 graphics/graphite2 graphics/gtk-update-icon-cache graphics/jasper graphics/jbigkit graphics/jpeg graphics/png graphics/tiff lang/lua52 lang/perl5.16 lang/python2 lang/python27 lang/ruby19 lang/tcl86 misc/help2man ports-mgmt/pkg print/cups-client print/freetype2 print/harfbuzz security/libgcrypt security/libgpg-error textproc/expat2 textproc/intltool textproc/libxml2 textproc/libxslt textproc/libyaml textproc/p5-XML-Parser x11-fonts/fontconfig x11-fonts/libXft x11-fonts/xf86bigfontproto x11-toolkits/gtk20 x11-toolkits/libXt x11-toolkits/pango x11/bigreqsproto x11/compositeproto x11/damageproto x11/fixesproto x11/inputproto x11/kbproto x11/libICE x11/libSM x11/libX11 x11/libXau x11/libXcomposite x11/libXcursor x11/libXdamage x11/libXdmcp x11/libXext x11/libXfixes x11/libXi x11/libXpm x11/libXrandr x11/libXrender x11/libxcb x11/pixman x11/randrproto x11/renderproto x11/xcb-proto x11/xcb-util x11/xcb-util-renderutil x11/xcmiscproto x11/xextproto x11/xproto x11/xtrans #
依存関係が全て出ます。
このスクリプトは、下記のようにvimのPortsの中で「make run-depends-list」で表示したPortsをまた再帰的に依存情報を調べています。
# cd /usr/ports/editors/vim ; make run-depends-list /usr/ports/accessibility/atk /usr/ports/devel/gettext /usr/ports/devel/glib20 /usr/ports/devel/patch /usr/ports/devel/pcre /usr/ports/devel/pkgconf /usr/ports/lang/lua52 /usr/ports/lang/perl5.16 /usr/ports/lang/python27 /usr/ports/lang/ruby19 /usr/ports/lang/tcl86 /usr/ports/ports-mgmt/pkg /usr/ports/textproc/intltool /usr/ports/x11-toolkits/gtk20 /usr/ports/x11-toolkits/libXt /usr/ports/x11-toolkits/pango /usr/ports/x11/libXpm #
上記に表示されたpkgも全てfetchすればvimが正常にインストールできます。
もっと簡単に依存関係が分かる方法を知っていたら教えて下さい(`;ω;´)
以上。
嫌がらせに片っ端から名前解決したらDNS名前衝突ブロックリストに載るの?
http://t.co/U2qKqlCkwg のドメインが既にとれないっていうのはどういうこと。まだ、ランドラッシュだよね。だれかが押さえたって事?それとも、インターリンク社が取れないように拒否しているとか、そういうのあるの?
— tomocha @転職活動中 (@tomocha0) 2014, 6月 30
俺俺TLDで遊ぶ場合は、rootにクエリを送るなよ。万が一その俺俺TLDが正式に登録された場合、俺俺ドメインがDNS名前衝突ブロックリストにのるぞ!気をつけろ!って事か。
— こんごー@頑張らないために頑張る (@kongou_ae) 2014, 7月 1
というわけでスクリプト。
辞書はOpenWallからいただきました。
Index of /pub/wordlists/languages/Japanese
#!/usr/bin/ruby require 'open3' wordlist = "lower_jp" domain = "nom" s,e = Open3.capture3("cat #{wordlist}") s.each_line do |str| lne,e = Open3.capture3("dig #{str.chomp}.#{domain}") puts lne sleep(1) end
これで日本語をローマ字にしたドメインがブロックリストに載るのかな?