IPv4はルーティングの関係でpingもできないが、IPv6のlink localの通信テストは可能。
2013年9月9日月曜日
socatでTUN/TAPの中継する
> socat TUN:10.0.0.1/24,tun-type=tap,tun-name=tap1,iff-no-pi,iff-up,iff-promisc TUN:10.0.0.2/24,tun-type=tap,tun-name=tap2,iff-no-pi,iff-up,iff-promisc
疑似シリアル間を中継する
/dev/ptmxで作成した2つの疑似シリアル間を中継する。
スレーブをオープンするまでループバックしてしまうのが問題。
C言語
#define _XOPEN_SOURCE #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/select.h> #include <sys/time.h> #include <sys/types.h> #include <unistd.h> static void dump(char *desc, void *data,int len) { unsigned char *d = (unsigned char*)data; int i; printf("%s ",desc); for(i=0;i<len;i++) { printf("%02x",d[i]); } fputs("\n",stdout); } int main() { unsigned char buf[64*1024]; int fd1; int fd2; int m; int r; fd_set rdfs; fd1 = open("/dev/ptmx", O_RDWR | O_NOCTTY); if(fd1<0) { perror("open"); return 1; } grantpt(fd1); unlockpt(fd1); printf("%s\n", ptsname(fd1)); fd2 = open("/dev/ptmx", O_RDWR | O_NOCTTY); if(fd2<0) { perror("open"); return 1; } grantpt(fd2); unlockpt(fd2); printf("%s\n", ptsname(fd2)); while(1) { m = (fd1 > fd2) ? fd1 : fd2; FD_ZERO(&rdfs); FD_SET(fd1, &rdfs); FD_SET(fd2, &rdfs); r = select(m+1, &rdfs, NULL, NULL, NULL); if(r<0) { perror("select"); return 1; } if(r) { if(FD_ISSET(fd1, &rdfs)) { r = read(fd1, buf, sizeof(buf)); if(r<0) { perror("read"); return 1; } write(fd2, buf, r); dump(ptsname(fd1), buf, r); } if(FD_ISSET(fd2, &rdfs)) { r = read(fd2, buf, sizeof(buf)); if(r<0) { perror("read"); return 1; } write(fd1, buf, r); dump(ptsname(fd2), buf, r); } } } return 0; }python
import os import asyncore import binascii class SerialEmu(asyncore.file_dispatcher): def __init__(self): self.master, self.slave = os.openpty() self.slave_name = os.ttyname(self.slave) asyncore.file_dispatcher.__init__(self, self.master) def handle_read(self): d = os.read(self.master,2048) os.write(self.opposite.master,d) print 'RX %s %s' % (self.slave_name, binascii.b2a_hex(d)) def writable(self): return False s1 = SerialEmu() s2 = SerialEmu() print s1.slave_name print s2.slave_name s1.opposite = s2 s2.opposite = s1 asyncore.loop()
TCPとserialを中継する
例
> socat -T10 TCP-LISTEN:5555,fork,reuseaddr /dev/ttyS0,raw,b115200,echo=0
・TCPポート5555とシリアルを中継
・無通信10秒でTCP切断
・ボーレート115200
・ローカルエコーなし
> socat -T10 TCP-LISTEN:5555,fork,reuseaddr /dev/ttyS0,raw,b115200,echo=0
・TCPポート5555とシリアルを中継
・無通信10秒でTCP切断
・ボーレート115200
・ローカルエコーなし
2013年7月13日土曜日
pythonでTUN/TAPの中継する
TAPを2つ作ってその間を中継する。
以前はselectを使ってたけどasyncoreが便利。
29,30行目のoppositeに強引に送信関数を設定しているが、どうも美しくない。
どうすべきかなぁ
以前はselectを使ってたけどasyncoreが便利。
29,30行目のoppositeに強引に送信関数を設定しているが、どうも美しくない。
どうすべきかなぁ
import fcntl import struct import asyncore TUNSETIFF = 0x400454ca IFF_TUN = 0x0001 IFF_TAP = 0x0002 IFF_NO_PI = 0x1000 class TunTap(asyncore.file_dispatcher): def __init__(self, ifname, flags): self.ifname = ifname self.fd = open('/dev/net/tun', 'r+b') ifr = struct.pack('16sH', ifname, flags) res = fcntl.ioctl(self.fd, TUNSETIFF, ifr) self.ifname = struct.unpack("16sH", res)[0].strip('\x00') asyncore.file_dispatcher.__init__(self, self.fd) def handle_read(self): self.opposite.send(self.recv(2048)) def writable(self): return False t1 = TunTap( 'tap1', IFF_TAP | IFF_NO_PI ) t2 = TunTap( 'tap2', IFF_TAP | IFF_NO_PI ) t1.opposite = t2 t2.opposite = t1 asyncore.loop()
2013年5月18日土曜日
u-bootからkernelにパラメータの渡し方
いろんなやり方があるようだが、今使っているam335x用のarmの場合。
かつ、u-bootのコンパイル時に以下を定義した場合。
#define CONFIG_CMDLINE_TAG
#define CONFIG_SETUP_MEMORY_TAGS
#define CONFIG_INITRD_TAG
参考
http://www.simtec.co.uk/products/SWLINUX/files/booting_article.html
パラメータの種類ごとにTAGがある。一覧
u-bootのbootmコマンドでinitramfsを指定した場合、ATAG_INITRD2タグ(値0x54420005)を使ってイメージのアドレスとサイズをkernelに渡す。
カーネルコマンドラインのbootargsも同様に、ATAG_CM_LINEタグ(値0x54410009)を使う。
これらの情報は物理メモリの開始アドレス+0x100に置かれるのが一般的のよう。
board/ti/am335x/board.cのboard_init()内で
gd->bd->bi_boot_params = PHYS_DRAM_1 + 0x100;
とあるのがそれ。
ただし、R2レジスタに入れるのが筋のようだ。
arch/arm/lib/bootm.cのboot_jump_linux()内で
r2 = gd->bd->bi_boot_params;
とある。
ATAGを使う以外にFDT(Flat Device Tree)を使うパターンもあるみたいだが
※Device Tree Blob (dtb)?
こちらの方がパラメータの種類も豊富みたいだがフォーマットがいまいちわからない
参照
https://export.writer.zoho.com/public/rreginelli/Working-with-Device-Trees1/fullpage
参照
https://export.writer.zoho.com/public/rreginelli/Working-with-Device-Trees1/fullpage
u-bootからLinux+initramfsの起動
前回書いたようにinitramfsイメージを作成し、さらにu-boot用イメージにすると便利だと気づいたメモ。
initramfsイメージの作成
> gen_initramfs_list.sh -u squash -g squash rootfsdir > list
> gen_init_cpio list | gzip > rootfs.cpio.gz
u-bootイメージの作成
> mkimage -A arm -O linux -T ramdisk -C none -a 0x82000000 -n "Linux userland" -d rootfs.cpio.gz rootfs.cpio.gz.ub
ここで作成したrootfs.cpio.gz.ubをSPIフラッシュに書き込んどいて、u-bootで読み出す例。
#SPIフラッシュの準備
> sf probe 0
#SPIフラッシュのoffset=0x400000,length=0x400000のkernelイメージをメモリ0x88000000番地に
> sf read 0x88000000 0x400000 0x400000
#SPIフラッシュのoffset=0x800000,length=0x400000のrootfs.cpio.gz.ubをメモリ0x89000000番地に
> sf read 0x89000000 0x800000 0x400000
#上で読み込んだu-bootイメージをそれぞれ展開してkernelを起動する
> bootm 0x88000000 0x89000000
bootmコマンドに2つ目の引数があるとは知らなかった。
initramfsについては、mkimageで作成時「-a 0x82000000」と指定しているので、bootmは0x89000000のイメージを0x82000000に展開する。
以前のやりかたではbootargsに「initrd=0x83000000,0x3c112233」のように指定しなければならなかったが、bootmを使えばパラメータは自動的にkernelに渡してくれる。
initramfsイメージの作成
> gen_initramfs_list.sh -u squash -g squash rootfsdir > list
> gen_init_cpio list | gzip > rootfs.cpio.gz
u-bootイメージの作成
> mkimage -A arm -O linux -T ramdisk -C none -a 0x82000000 -n "Linux userland" -d rootfs.cpio.gz rootfs.cpio.gz.ub
ここで作成したrootfs.cpio.gz.ubをSPIフラッシュに書き込んどいて、u-bootで読み出す例。
#SPIフラッシュの準備
> sf probe 0
#SPIフラッシュのoffset=0x400000,length=0x400000のkernelイメージをメモリ0x88000000番地に
> sf read 0x88000000 0x400000 0x400000
#SPIフラッシュのoffset=0x800000,length=0x400000のrootfs.cpio.gz.ubをメモリ0x89000000番地に
> sf read 0x89000000 0x800000 0x400000
#上で読み込んだu-bootイメージをそれぞれ展開してkernelを起動する
> bootm 0x88000000 0x89000000
bootmコマンドに2つ目の引数があるとは知らなかった。
initramfsについては、mkimageで作成時「-a 0x82000000」と指定しているので、bootmは0x89000000のイメージを0x82000000に展開する。
以前のやりかたではbootargsに「initrd=0x83000000,0x3c112233」のように指定しなければならなかったが、bootmを使えばパラメータは自動的にkernelに渡してくれる。
2013年5月16日木曜日
initramfsイメージ内のUIDを変える
initramfsイメージを作成する例えとして、こことかでは次のようなコマンド例が紹介されている。
> (cd rootfsdir; find . | cpio -o -H newc | gzip) > rootfs.cpio.gz
しかし、これではファイルの所有者情報(UID,GID)がそのまま残ってしまう。
所有者をroot(UID=0,GID=0)に変更したいが、cpioコマンドでそれを行う方法がわからない。
もちろん作業環境でroot権限があればchownしてからcpio+gzipすることもできるが、
root権限のない環境ではそうもいかない。
mkfs.jffs2にある--squashオプションみたいなのがあればと探してみた。
kernelソースにinitramfsを含めることができる=そのためのツールがあるのね。
使うのはkernelソース内にあるscripts/gen_initramfs_list.shとusr/gen_init_cpio.c
事前準備でusr/gen_init_cpio.cをコンパイルしておく。
> gcc gen_init_cpio.c -o gen_init_cpio
イメージ作成
> gen_initramfs_list.sh -u squash -g squash rootfsdir > list
> gen_init_cpio list | gzip > rootfs.cpio.gz
gen_initramfs_list.shの-u,-gオプションを指定してやるとlistファイルの中のUID,GIDを0で吐き出してくれる。
あとはgen_init_cpioにlistを渡して固めればok
> (cd rootfsdir; find . | cpio -o -H newc | gzip) > rootfs.cpio.gz
しかし、これではファイルの所有者情報(UID,GID)がそのまま残ってしまう。
所有者をroot(UID=0,GID=0)に変更したいが、cpioコマンドでそれを行う方法がわからない。
もちろん作業環境でroot権限があればchownしてからcpio+gzipすることもできるが、
root権限のない環境ではそうもいかない。
mkfs.jffs2にある--squashオプションみたいなのがあればと探してみた。
kernelソースにinitramfsを含めることができる=そのためのツールがあるのね。
使うのはkernelソース内にあるscripts/gen_initramfs_list.shとusr/gen_init_cpio.c
事前準備でusr/gen_init_cpio.cをコンパイルしておく。
> gcc gen_init_cpio.c -o gen_init_cpio
イメージ作成
> gen_initramfs_list.sh -u squash -g squash rootfsdir > list
> gen_init_cpio list | gzip > rootfs.cpio.gz
gen_initramfs_list.shの-u,-gオプションを指定してやるとlistファイルの中のUID,GIDを0で吐き出してくれる。
あとはgen_init_cpioにlistを渡して固めればok
2013年5月10日金曜日
linuxでGPIOの状態変化を知りたい
LinuxでGPIOの状態が変わったことを割り込み的にreadしたい場合の話・・・
最初に触ったのがarmadillo-420で、ここにもあるようにpoll()を使った場合はPOLLIN、select()を使った場合はreadfdsでファイルディスクリプタを指定する。
ところが、am3352の載った別ボードを触った時、上記のソースでは動かない。
なんでだなんでだと調べてるとここに書いてあった。
pollの時はPOLLPRIとPOLLERR、select()の場合はexceptfdsで指定するんだと。
一般的にどうかわからないけど、linuxのドキュメントはam3352のパターンと同じなので、armadilloが異端なのかな?
最初に触ったのがarmadillo-420で、ここにもあるようにpoll()を使った場合はPOLLIN、select()を使った場合はreadfdsでファイルディスクリプタを指定する。
ところが、am3352の載った別ボードを触った時、上記のソースでは動かない。
なんでだなんでだと調べてるとここに書いてあった。
pollの時はPOLLPRIとPOLLERR、select()の場合はexceptfdsで指定するんだと。
一般的にどうかわからないけど、linuxのドキュメントはam3352のパターンと同じなので、armadilloが異端なのかな?
2013年4月4日木曜日
initramfs
TI製チップAM3352 ARM Cortex-A8プロセッサ上でLinuxを走らせようとしている時のメモ。
initramfsについてはこちらを参照
http://archive.linux.or.jp/JF/JFdocs/kernel-docs-2.6/filesystems/ramfs-rootfs-initramfs.txt.html
http://www.gcd.org/blog/2007/09/129/
現状kernelからブートデバイスが認識できない状態で、それでも取りあえず起動だけでも行うための手順。
u-bootからkernelとinitramfsのイメージをブートデバイスからメモリにコピーしkernel起動。
#u-bootはブートデバイスにアクセスできてる
> sf probe 0
> sf read 0x82000000 0x400000 0x400000 <- ここでkernelイメージの読み出し
> sf read 0x83000000 0x800000 0x400000 <- ここでinitramfsの読み出し
> setenv bootargs initrd=0x83000000,0x3c112233 <- kernelに渡す引数 initramfsのメモリ番地とサイズを指定する
> bootm 0x82000000 <- kernelの起動
ここでハマったのが、bootargsでinitramfsのイメージサイズ(↑の場合は0x3c112233)を正しく指定しないとinitramfsではなくinitrdで起動しようとすること。
kernelの起動ログに
「Initramfs unpacking failing: junk in compressed archive」とでてくる。
使用したのはcpio+gzipイメージなのだが、サイズを大きく指定すると(当初は0x400000としていた)上のようなログを吐く。
initramfsのイメージサイズは作るたびに変わるし、それをいちいちu-boot-envで設定しておくのはちょっと面倒なので結局initramfsではなくcramfsを使うことにした。
※initramfsイメージをmkimageでu-boot用イメージにしてbootmでサイズ指定なしでできる
cramfs自体が自身のサイズを持ってるので、サイズの指定は適当でよくなる。
この場合は「root=」の指定が必要になる。
> setenv bootargs root=/dev/ram0 ro initrd=0x83000000,4M rootfstype=cramfs
initramfsについてはこちらを参照
http://archive.linux.or.jp/JF/JFdocs/kernel-docs-2.6/filesystems/ramfs-rootfs-initramfs.txt.html
http://www.gcd.org/blog/2007/09/129/
現状kernelからブートデバイスが認識できない状態で、それでも取りあえず起動だけでも行うための手順。
u-bootからkernelとinitramfsのイメージをブートデバイスからメモリにコピーしkernel起動。
#u-bootはブートデバイスにアクセスできてる
> sf probe 0
> sf read 0x82000000 0x400000 0x400000 <- ここでkernelイメージの読み出し
> sf read 0x83000000 0x800000 0x400000 <- ここでinitramfsの読み出し
> setenv bootargs initrd=0x83000000,0x3c112233 <- kernelに渡す引数 initramfsのメモリ番地とサイズを指定する
> bootm 0x82000000 <- kernelの起動
ここでハマったのが、bootargsでinitramfsのイメージサイズ(↑の場合は0x3c112233)を正しく指定しないとinitramfsではなくinitrdで起動しようとすること。
kernelの起動ログに
「Initramfs unpacking failing: junk in compressed archive」とでてくる。
使用したのはcpio+gzipイメージなのだが、サイズを大きく指定すると(当初は0x400000としていた)上のようなログを吐く。
initramfsのイメージサイズは作るたびに変わるし、それをいちいちu-boot-envで設定しておくのはちょっと面倒なので結局initramfsではなくcramfsを使うことにした。
※initramfsイメージをmkimageでu-boot用イメージにしてbootmでサイズ指定なしでできる
cramfs自体が自身のサイズを持ってるので、サイズの指定は適当でよくなる。
この場合は「root=」の指定が必要になる。
> setenv bootargs root=/dev/ram0 ro initrd=0x83000000,4M rootfstype=cramfs
2013年3月13日水曜日
Catalyst 2970でパケットキャプチャ用の設定
> en
# conf t
ポート1で送受信されるパケットを、ポート2につないだPCでキャプチャする場合。
# monitor session 1 source interface FastEthernet0/1
# monitor session 1 destination interface FastEthernet0/2
VLANの場合
# monitor session 2 source vlan 10
# monitor session 2 destination interface Gi0/2
# conf t
ポート1で送受信されるパケットを、ポート2につないだPCでキャプチャする場合。
# monitor session 1 source interface FastEthernet0/1
# monitor session 1 destination interface FastEthernet0/2
VLANの場合
# monitor session 2 source vlan 10
# monitor session 2 destination interface Gi0/2
IPv6 disable
ubuntu 12.04でIPv6をdisableにする。
新しくファイルを作る
/etc/sysctl.d/60-ipv6-disable.conf
ファイル編集
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
新しくファイルを作る
/etc/sysctl.d/60-ipv6-disable.conf
ファイル編集
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
user mode linuxのネットワーク設定
apt-getでuml-utilitiesをインストールすると、/etc/init.d/uml-utilitiesができる。これはlinux起動時にuml_switchというアプリを動かす。
このアプリはuser mode linux上のゲストOSにネットワーク(Layer2HUB、Layer2switchとも言う)を提供する。
たとえば、ゲストOS起動時のパラメータで
linux eth0=daemon
のように「daemon」と指定するとuml_switchに繋いでくれる。
ただし、ubuntu 12.04のデフォルトでは閉じたネットワークなので外には出られない。
/etc/init.d/uml-utilitiesを
UML_SWITCH_OPTIONS="-tap tap0"
のように変えると外に出るためのtapデバイスを用意してくれる。
tunctl -u uml-net -t tap0
このようにtap0をuml-netユーザで使用すると予約しておけば、uml_switchをrootで動かさなくてもtapデバイスを作成できる。
#通常、tapデバイスはrootでないと作れない
これでtap0ができるのでホストOSでブリッジなどを作成して繋いでやる。
brctl addbr br0
brctl stp br0 off
brctl addif br0 eth0
brctl addif br0 tap0
ifconfig eth0 up
ifconfig br0 up
ifconfig tap0 up
ゲストOS用のネットワークが1つしかないのは不便なのでいくつか作成する。
ネットワークの識別はunix domian socketで行う。
/etc/init.d/uml-utilitiesの
UML_SWITCH_CTL="$UML_DIR/uml_switch.ctl"がそのファイル名。
このファイル名やpidファイル名を各ネットワークで分ける。
ゲストOS起動時は
linux eth-=daemon,,unix,/var/run/uml-utilities/uml_switch.ctl
とネットワークを指定する。
----------------------------------------
追記
/etc/network/interfaces例
auto lo
iface lo inet loopback
auto br0
iface br0 inet dhcp
bridge_ports eth0 tap0
bridge_stp off
bridge_wait 0
bridge_fd 0
up echo 0 > /sys/devices/virtual/$IFACE/bridge/multicast_snooping
pre-up ifconfig eth0 up
pre-up tunctl -u uml-net -t tap0
このアプリはuser mode linux上のゲストOSにネットワーク(Layer2HUB、Layer2switchとも言う)を提供する。
たとえば、ゲストOS起動時のパラメータで
linux eth0=daemon
のように「daemon」と指定するとuml_switchに繋いでくれる。
ただし、ubuntu 12.04のデフォルトでは閉じたネットワークなので外には出られない。
/etc/init.d/uml-utilitiesを
UML_SWITCH_OPTIONS="-tap tap0"
のように変えると外に出るためのtapデバイスを用意してくれる。
tunctl -u uml-net -t tap0
このようにtap0をuml-netユーザで使用すると予約しておけば、uml_switchをrootで動かさなくてもtapデバイスを作成できる。
#通常、tapデバイスはrootでないと作れない
これでtap0ができるのでホストOSでブリッジなどを作成して繋いでやる。
brctl addbr br0
brctl stp br0 off
brctl addif br0 eth0
brctl addif br0 tap0
ifconfig eth0 up
ifconfig br0 up
ifconfig tap0 up
ゲストOS用のネットワークが1つしかないのは不便なのでいくつか作成する。
ネットワークの識別はunix domian socketで行う。
/etc/init.d/uml-utilitiesの
UML_SWITCH_CTL="$UML_DIR/uml_switch.ctl"がそのファイル名。
このファイル名やpidファイル名を各ネットワークで分ける。
ゲストOS起動時は
linux eth-=daemon,,unix,/var/run/uml-utilities/uml_switch.ctl
とネットワークを指定する。
----------------------------------------
追記
/etc/network/interfaces例
auto lo
iface lo inet loopback
auto br0
iface br0 inet dhcp
bridge_ports eth0 tap0
bridge_stp off
bridge_wait 0
bridge_fd 0
up echo 0 > /sys/devices/virtual/$IFACE/bridge/multicast_snooping
pre-up ifconfig eth0 up
pre-up tunctl -u uml-net -t tap0
libvirtのネットワーク設定
virshコマンドでVM用のネットワークを設定する。
virsh net-define test.xml
test.xmlはこんな感じ
#ホストにbr0のブリッジがある場合の設定
#br0はホストの/etc/network/interfacesとかで作成済み
virsh net-define test.xml
test.xmlはこんな感じ
#ホストにbr0のブリッジがある場合の設定
#br0はホストの/etc/network/interfacesとかで作成済み
<network> <name>host-bridge-br0-eth0</name> <forward mode="bridge"/> <bridge name="br0"/> </network>
virtioとPACKET
kvmで動かしたVM上のアプリで、socket(AF_PACKET)でキャプチャすると、TCP/IPのチェックサムが化けてるという現象に会った。
kvmのvirtio-netにそういう癖があるみたい。
libvirtを使ってゲストOSを扱ってるので設定(XML)を変更して回避する。
kvmのvirtio-netにそういう癖があるみたい。
libvirtを使ってゲストOSを扱ってるので設定(XML)を変更して回避する。
<domain type='kvm'>
<name>guest</name>
<memory>524288</memory>
<currentMemory>524288</currentMemory>
<vcpu>1</vcpu>
<os>
<type arch='x86_64' machine='pc-1.0'>hvm</type>
<boot dev='hd'/>
</os>
<features>
<acpi/>
</features>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>restart</on_crash>
<devices>
<disk type='file' device='disk'>
<source file='guest.img'/>
<target dev='hda' bus='virtio'/>
</disk>
<disk type='file' device='cdrom'>
<source file='/vm/iso/ubuntu-12.04-server-amd64.iso'/>
<target dev='hdc' bus='ide'/>
<readonly/>
</disk>
<interface type='bridge'>
<mac address='52:54:00:99:00:00'/>
<source bridge='br99'/>
<!-- <model type='virtio'/> ここをコメントにする -->
</interface>
<input type='mouse' bus='ps2'/>
<graphics type='vnc' port='5900' autoport='no' listen='0.0.0.0' keymap='ja'>
<listen type='address' address='0.0.0.0'/>
</graphics>
</devices>
</domain>
2013年3月12日火曜日
pythonでイメージファイル操作
Python Imaging Library (PIL)
http://www.pythonware.com/products/pil/
準備
sudo apt-get install python-imaging
http://www.pythonware.com/products/pil/
準備
sudo apt-get install python-imaging
#!/usr/bin/env python # -*- coding: utf-8 -*- import Image #Image.new('RGBA', (width, height), (R, G, B, A)) img = Image.new('RGBA', (800, 800), (255,255,255,255)) # img.getpixel( (x,y) ) r = 255 g = 0 b = 0 for x in range(100,200): for y in range(200,300): img.putpixel( (x,y), (r,g,b) ) img.save("image.png")
ubuntuネットワーク設定
/etc/network/interfacesまわりのメモ。
基本
最近のkernelにはmulticast snoopingの機能が入ってるのだが、私のよく書くテストプログラムに悪い影響があるので(普通はそんなことにはならないもんだが)、snooping機能をOFFにしたい場合はこんな感じで書いとく。
ubuntu desctopでマネージャーがいらない場合
基本
man interfaces man bridge-utils-interfaces
最近のkernelにはmulticast snoopingの機能が入ってるのだが、私のよく書くテストプログラムに悪い影響があるので(普通はそんなことにはならないもんだが)、snooping機能をOFFにしたい場合はこんな感じで書いとく。
iface br0 inet dhcp bridge_ports eth0 bridge_stp off bridge_waitport 0 bridge_fd 0 up echo 0 > /sys/devices/virtual/net/$IFACE/bridge/multicast_snooping
ubuntu desctopでマネージャーがいらない場合
service network-manager stop apt-get purge network-manager
python http or https サーバ(flask編)
flask
http://flask.pocoo.org/
準備
sudo apt-get install python-flask
簡単にhttpsサーバを用意できるのでうれしいですね。
でもバグがあるのかpython 2.7.3では動かず適当に修正しました。
/usr/lib/python2.7/SocketServer.py
の470行目
request.shutdown(socket.SHUT_WR)
とあるのを
if isinstance(request,socket._socketobject):
request.shutdown(socket.SHUT_WR)
else:
request.shutdown()
こうしました。
SSLセッションの時はshutdown()は引数無しでないといけないみたい。
きちんとソースを追ってないけど、今のところはこれで回避。
http://flask.pocoo.org/
準備
sudo apt-get install python-flask
簡単にhttpsサーバを用意できるのでうれしいですね。
でもバグがあるのかpython 2.7.3では動かず適当に修正しました。
/usr/lib/python2.7/SocketServer.py
の470行目
request.shutdown(socket.SHUT_WR)
とあるのを
if isinstance(request,socket._socketobject):
request.shutdown(socket.SHUT_WR)
else:
request.shutdown()
こうしました。
SSLセッションの時はshutdown()は引数無しでないといけないみたい。
きちんとソースを追ってないけど、今のところはこれで回避。
#!/usr/bin/env python # -*- coding: utf-8 -*- import flask app = flask.Flask( __name__ ) @app.route ( '/', methods=['GET', 'POST'] ) def index(): #ヘッダの取得 #flask.request.headers['Content-Type'] #クエリの取得 #flask.request.values.get('abc',None) if flask.request.method=='GET': return '<html><body>hello</body></html>' if flask.request.method=='POST': f = request.files['the_file'] f.save('/tmp/' + f.filename) return flask.redirect(flask.url_for('index')) flask.abort(404) return 'abortしてるのでここは走らない' @app.route ( '/abc' ) def abc(): #templatesディレクトリのabc.htmlを使う return flask.render_template('abc.html') @app.route ( '/text' ) def text(): res = 'hello' return flask.Response(res, mimetype='text/plain') #HTTPサーバの場合はこちら app.run(host='0.0.0.0',port=80,debug=True) #HTTPSサーバの場合はこちら #app.run(host='0.0.0.0',port=443,debug=True,ssl_context='adhoc')
python httpサーバ(wsgi編)
#!/usr/bin/env python # -*- coding: utf-8 -*- from wsgiref.simple_server import make_server, WSGIRequestHandler import urlparse html_index = '<html><body>hello</body></html>' def appl(environ,start_response): path = environ['PATH_INFO'] method = environ['REQUEST_METHOD'] if method=='GET': query = dict(urlparse.parse_qsl(environ.get('QUERY_STRING',''))) if method=='POST': ro = environ['wsgi.input'] length = int(environ.get('CONTENT_LENGTH', 0)) query = dict(urlparse.parse_qsl(ro.read(length))) if path=='/' and method=='GET': response_headers = [('Content-Type', 'text/html'), ('Content-Length', str(len(html_index)))] start_response('200 OK', response_headers) return [html_index] if path=='/' and method=='POST': start_responce('303 See Other', [('Location', '/')]) return [] start_response('404 Not Found', []) return [] # DNS逆名前解決しない class myHandler(WSGIRequestHandler): def address_string(self): return self.client_address[0] httpd = make_server('0.0.0.0', 80, appl, handler_class=myHandler) httpd.serve_forever()
user mode linux(ubuntu 12.04)
以前はkvmを使ってたんですが、kvmに対応していないintel CPUに仮想環境を作らないといけなくなったので、user mode linuxを試してみた。
試してみると、これが案外すばらしい。何がいいかってメモリ使用量が30MBも割り当てれば動くというこの小ささ。
kvmにはVM間で同じメモリデータを共有する仕組みがあってそれもなかなか優秀だけど、もともとの消費サイズが小さいのも素晴らしいよね。
この辺を参考にするが、hardyベースだと古いから新しいのでと思ってpreciseで試してみるとうまく動かなくて、debianのsqueezeを使った。
sudo apt-get install user-mode-linux uml-utilities bridge-utils debootstrap
#1GB
dd if=/dev/zero of=rootfs bs=32k count=32k
mkfs.ext4 rootfs
sudo mount -o loop rootfs.img /mnt
sudo -i
#squeezeベースのルートファイルシステムを作る
debootstrap squeeze /mnt http://ftp.jp.debian.org/debian
#VMのfstab設定
echo "/dev/ubd0 / ext4 defaults 0 1" > /mnt/etc/fstab
echo "proc /proc proc defaults 0 0" >> /mnt/etc/fstab
#VMのディスクデバイス
mknod --mode=660 /mnt/dev/ubd0 b 98 0
chown root:disk /mnt/dev/ubd0
echo "127.0.0.1 localhost" > /mnt/etc/hosts
#ネットワーク設定
echo "auto lo" > /mnt/etc/network/interfaces
echo "iface lo inet loopback" >> /mnt/etc/network/interfaces
echo "auto eth0" >> /mnt/etc/network/interfaces
echo "iface eth0 inet dhcp" >> /mnt/etc/network/interfaces
#rootのパスワードを設定しておく
chroot /mnt
passwd
exit
#VM起動時にコンソールがいっぱい表示されるので、ttyのところの2~6を無効にして
#コンソールは1つだけにする
vi /mnt/etc/inittab
#sudoから抜ける
exit
設定は以上。
VMの起動はこんな感じ。
linux ubd0=rootfs eth0=daemon umid=uml1 mem=32m
ネットワーク設定についてはまた今度。
2013年2月25日月曜日
登録:
投稿 (Atom)