HTML がわかっていず面倒なので <pre> と FireFox extension の It's All Text! emacsclient & auto-fill-mode & set-fill-column 72 あたりで (C-x f) 0. インストールの前に 直に/etc/passwd を触らせるのではなく PAM 経由。一応インストール前の 状態を確認 # cd /etc # ls -l passwd group shadow gshadow -rw-r--r-- 1 root root 820 Apr 30 14:03 group -rw-r----- 1 root shadow 679 Apr 30 14:03 gshadow -rw-r--r-- 1 root root 1584 Apr 30 14:03 passwd -rw-r----- 1 root shadow 1348 Apr 30 14:03 shadow # grep freerad passwd group shadow gshadowN # ls -l /etc/pam.d/radiusd ls: cannot access /etc/pam.d/radiusd: No such file or directory 1. インストール そのまま # aptitude install freeradius 何も問われず。で、何されたか? を確認 # ls -l passwd group shadow gshadow -rw-r--r-- 1 root root 849 Apr 30 15:26 group -rw-r----- 1 root shadow 705 Apr 30 15:26 gshadow -rw-r--r-- 1 root root 1630 Apr 30 15:26 passwd -rw-r----- 1 root shadow 1377 Apr 30 15:26 shadow # grep freerad passwd group shadow gshadow passwd:freerad:x:114:120::/etc/freeradius:/bin/false group:shadow:x:42:freerad group:ssl-cert:x:111:freerad group:freerad:x:120: shadow:freerad:*:15094:0:99999:7::: gshadow:shadow:*::freerad gshadow:ssl-cert:!::freerad gshadow:freerad:!:: # ls -l /etc/pam.d/radiusd -rw-r--r-- 1 root root 227 Sep 28 2010 /etc/pam.d/radiusd グループ shadow に freerad が加えられた。イコール freerad ユーザアカ ウントで /etc/shadow を読むことができる。/etc/pam.d/radiusd の中身は、 うん。特に... 3. 設定ファイル変更 How do I use PAM with FreeRADIUS? や rlm_pam の説明眺めながらファイル 三つ更新。どこかで見付けたパスワード生成ワンライナー # cat /dev/urandom | tr -dc '0-9A-Za-z' | fold -b16 | head -n1 ZkPbwZ17bCDEx7Kx を多用しつつ。余裕があるなら? もちろん /dev/random の方が良いらしい
2011年4月30日土曜日
freeradius rlm_pap on debian squeeze
2011年4月26日火曜日
TIPS: KVM (qemu) for debian squeeze - その 1
小さいネタをいくつか。
- netboot
- qemu pxe をキーワードに Google 先生に尋ねたところ最初のページや日本語の
最初のページ眺めると ROM-o-matic.net でブートイメージ作って。とあったの
で早速。 1.0.1 の Image Generator で NIC type の選択に virtio-net なんて
あったものだから、おぉと選択。フロッピーはないでしょ。もしかしたら今後
使うカモとか思いつつ output format に USB Keychain disk image を選んで
あとはシリアルコンソールとか。さて kvm を起動しようと、マニュアルでブー
トデバイスの指 定を眺めると...-boot [order=drives][,once=drives][,menu=on|off]
へっ? とお試し。
Specify boot order drives as a string of drive letters.
Valid drive letters depend on the target achitecture. The x86 PC uses:
a, b (floppy 1 and 2), c (first hard disk),d(first CD-ROM),
n-p (Etherboot from network adapter 1-4),
hard disk boot is the default.
To apply a particular boot order only on the first startup, specify it via once.- tftpd のインストールと netboot イメージ
# aptitude install tftpd-hpa (TFTP root directory: /srv/tftp) # cd /srv/tftp # wget http://ftp.jp.debian.org/debian/dists/stable/main/installer-amd64/current/images/netboot/netboot.tar.gz # tar xzf netboot.tar.gz # ls -1 debian-installer netboot.tar.gz pxelinux.0 pxelinux.cfg version.info
- dhcpd.conf の編集
filename に /pxelinux.0。next-server に tftpd サーバのアドレス
subnet 172.27.201.0 netmask 255.255.255.0 { option routers 172.27.201.1; option broadcast-address 172.27.201.255; pool { # ignore unknown-clients; # deny dynamic bootp clients; failover peer "poolish"; option domain-name-servers 172.27.129.1, 172.27.1.1; option domain-name "siesta.or.jp"; filename "pxelinux.0"; next-server 172.27.129.1; range 172.27.201.65 172.27.201.190; } }こんな感じ。 - サーバ群再起動 & kvm 起動
# /etc/init.d/tftpd-hpa restart
# /etc/init.d/isc-dhcp-server restart
# cd ほにゃほにゃ
# kvm-img create netboot.img 8G
# kvm -net tap -net nic,model=virtio -boot n -curses netboot.img
- tftpd のインストールと netboot イメージ
- ルーティング
-
むやみやたらに kvm-qemu や lxc でゲスト作りまくっているとワケワカになって
えーいままよ。と大元のホスト筆頭に
ってやっちゃったりしない? うーん、それもどうかと思うけど、コレもどうかと。iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
でコレは OSPFv2 / IPv4 適当に動かしちゃう。- quagga のインストール
# aptitude install quagga
/etc/quagga/daemons の編集コメント除けば
zebra=yes bgpd=no ospfd=2 ospf6d=no ripd=no ripngd=no isisd=no
/etc/quagga/zebra.conf と/etc/quagga/ospfd.conf - zebra.conf
hostname zebra@<適当なホスト名> password zebra enable password zebra log file /var/log/quagga/zebra.log !service password-encryption ! ip forwarding ipv6 forwarding ! line vty
- ospfd.conf こんなんでも動いているらしい
- パーミッション
ちょっとウルサイらしく
debian.conf とdaemons の他は
quagga 所有で 0640# cd /etc/quagga # chown quagga.quagga zebra.conf ospfd.conf # chmod 0640 *.conf
- 再起動と確認
# /etc/init.d/quagga restart # # (しばらく待って...) # ip route ls 10.6.36.0/24 via 172.27.193.1 dev wlan0 proto zebra metric 20 172.27.202.0/24 dev br2 proto kernel scope link src 172.27.202.1 172.27.129.0/24 via 172.27.193.1 dev wlan0 proto zebra metric 20 172.27.68.0/24 via 172.27.193.1 dev wlan0 proto zebra metric 30 172.27.193.0/24 dev wlan0 proto kernel scope link src 172.27.193.17 172.27.201.0/24 dev br1 proto kernel scope link src 172.27.201.1 192.168.27.0/24 via 172.27.193.1 dev wlan0 proto zebra metric 20 172.27.1.0/24 via 172.27.193.1 dev wlan0 proto zebra metric 30 111.22.3.0/22 via 172.27.193.1 dev wlan0 proto zebra metric 20 default via 172.27.193.1 dev wlan0
この proto zebra が quagga 経由。あるいは (なっがいけど)# telnet localhost ospfd Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. Hello, this is Quagga (version 0.99.17). Copyright 1996-2005 Kunihiro Ishiguro, et al. User Access Verification Password: ospfd@myhost> show ip ospf route ============ OSPF network routing table ============ N 10.6.36.0/24 [20] area: 0.0.0.0 via 172.27.193.1, wlan0 N 172.27.129.0/24 [20] area: 0.0.0.0 via 172.27.193.1, wlan0 N 172.27.193.0/24 [10] area: 0.0.0.0 directly attached to wlan0 N 172.27.201.0/24 [10] area: 0.0.0.0 directly attached to br1 N 172.27.202.0/24 [10] area: 0.0.0.0 directly attached to br2 N 192.168.27.0/24 [20] area: 0.0.0.0 via 172.27.193.1, wlan0 N 111.22.3.0/22 [20] area: 0.0.0.0 via 172.27.193.1, wlan0 ============ OSPF router routing table ============= R 172.27.129.1 [10] area: 0.0.0.0, ASBR via 172.27.193.1, wlan0 ============ OSPF external routing table =========== N E1 172.27.1.0/24 [40] tag: 0 via 172.27.193.1, wlan0 N E1 172.27.68.0/24 [40] tag: 0 via 172.27.193.1, wlan0 ospfd@myhost> exit Connection closed by foreign host.とか
hostname ospfd@<適当なホスト名> password zebra enable password zebra log file /var/log/quagga/ospfd.log !service password-encryption ! router ospf ospf router-id <(自分の主たる) IP アドレス - 例えば 192.168.10.1 とか> redistribute kernel redistribute static redistribute connected network 0.0.0.0/0 area 0.0.0.0 ! line vty
- quagga のインストール
2011年4月23日土曜日
オレオレ証明書の証明書更新
完全なる備忘録。プロバイダから付与された IP アドレス間でトランスペアレントモード
IPSec するにあたって racoon を certificate_type x509 で動かしているんだけど、この
証明書の更新、および更新方法を都度忘れて調べ直すので、ここにメモ。CRL のハッシュ
がわからず「証明書を取り扱う」を多々参考にさせてもらいました。ありがとうございます
IPSec するにあたって racoon を certificate_type x509 で動かしているんだけど、この
証明書の更新、および更新方法を都度忘れて調べ直すので、ここにメモ。CRL のハッシュ
がわからず「証明書を取り扱う」を多々参考にさせてもらいました。ありがとうございます
- CSR の作成
- openssl req -new -keyout server_key.pem -out server_csr.pem -nodes
- オレオレ CA で sigh
- openssl ca -config /etc/ssl/openssl.cnf -in server_csr.pem -out server_cert.pem
- CRL の発行
- openssl ca -config /etc/ssl/openssl.cnf -gencrl -out crl.pem
- 証明書のハッシュ
- ln -s server_cert.pem `openssl x509 -in server_cert.pem -noout -hash`.0
- CRL のハッシュ
- ln -s crl.pem `openssl crl -in crl.pem -noout -hash`.r0
- テキスト出力
- openssl x509 -in csr.pem -text
- verify
- openssl verify -CAfile ca.pem csr.pem
- nodes 付け忘れ
- openssl rsa -in server_key.pem -out server_nodes_key.pem
port mirror on linux
だいぶ以前にここに書いたと思ったら、書いていなかった... のでメモ。
実際に使える例ではないけれど、例えば wlan0 を dummy 0 にミラーするのであれば
root になって長いコマンド。wlan0 からの出ていく方は
その 10 を親として 10番という順番で u32 すべてマッチのフィルタを追加。
結果は 10:1 に流すけど 10:1 という qdisc はないのでデフォルト何もせず。
アクションとして dummy0 にミラーを送出。確認は
実際に使える例ではないけれど、例えば wlan0 を dummy 0 にミラーするのであれば
root になって長いコマンド。wlan0 からの出ていく方は
disc prio を wlan0 の最初 (root) として 10 という ID 割り当て。# tc qdisc add dev wlan0 root handle 10: prio # tc filter add dev wlan0 parent 10: prio 10 \ > protocol all u32 match u32 0 0 flowid 10:1 \ > action mirred egress mirror dev dummy0
その 10 を親として 10番という順番で u32 すべてマッチのフィルタを追加。
結果は 10:1 に流すけど 10:1 という qdisc はないのでデフォルト何もせず。
アクションとして dummy0 にミラーを送出。確認は
wlan0 に入ってくる方は# tc qdisc ls dev wlan0 qdisc prio 10: root refcnt 5 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1 # tc filter ls dev wlan0 handle 10: filter parent 10: protocol all pref 10 u32 filter parent 10: protocol all pref 10 u32 fh 800: ht divisor 1 filter parent 10: protocol all pref 10 u32 fh 800::800 order 2048 key ht 800 bkt 0 flowid 10:1 match 00000000/00000000 at 0 action order 1: mirred (Egress Mirror to device dummy0) pipe index 1 ref 1 bind 1
こちら ingress は ID が ffff と決まっている他は、入ってくる方と同じ。確認は# tc qdisc add dev wlan0 ingress # tc filter add dev wlan0 parent ffff: prio 10 \ > protocol all u32 match u32 0 0 flowid ffff:1 \ > action mirred egress mirror dev dummy0
これで wlan0 を promisc モードにして dummy0 で tcpdump# tc qdisc ls dev wlan0 ingress qdisc prio 10: root refcnt 5 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1 qdisc ingress ffff: parent ffff:fff1 ---------------- # tc filter ls dev wlan0 handle ffff: filter protocol all pref 10 u32 filter protocol all pref 10 u32 fh 800: ht divisor 1 filter protocol all pref 10 u32 fh 800::800 order 2048 key ht 800 bkt 0 flowid ffff:1 match 00000000/00000000 at 0 action order 1: mirred (Egress Mirror to device dummy0) pipe index 2 ref 1 bind 1
とか。ドキュメントとして iproute-doc にも含まれていないのでソースを# ip link set wlan0 promisc on # tcpdump -nevxi dummy0
とかapt-get source iproute
とかで持ってきた $SRC/doc/actions/mirred-usage を参照。iproute 全般はで、以下その mirred-usage の抜粋意訳、中途訳git clone git://git.kernel.org/pub/scm/linux/kernel/git/shemminger/iproute2.git
普通のイーサネットスイッチでのミラーやリダイレクトの違いは u32 フィ
ルタ (classifier) でミラーするフローを選択できること。
mirred アクションの使い方:
mirred <DIRECTION> <ACTION> [index INDEX] <dev DEVICENAME>
DIRECTION := ingreee か egress
ACTION := mirror か redirect
INDEX は特定のポリシ ID
DEVICENAME はデバイス名
ACTION - mirror はコピーを指定されたデバイスに送る
ACTION - redirect はパケットを横取りして指定されたデバイスに送る
(なのでローカルプロセスには渡らない)
* 禁止事項
A. ループさせない
eth0 を eth1 にリダイレクト。更に eth1 を eth0 にリダイレクトなど
B. IFB デバイスから別の IFB デバイスにリダイレクトしない
ホストはクラッシュしないけどパケット全てが drop される
A は再帰によるデバイスキューのロック輻輳。
B は送信ロック (の輻輳?)
---- サンプル
1. eth0 に入ってくるパケットを eth1 にミラー
# tc qdisc add dev eth0 ingress
# tc filter add dev eth0 parent ffff: protocol ip prio 10 u32 \
> match u32 0 0 flowid 1:2 action mirred egress mirror dev eth1
mirror を redirect に変えるとコピーせずオリジナルパケットを eth1
に送出する
2. lo から eth0 に横取り
lo の ingress に届く全てのパケットを eth0 にリダイレクト
# tc qdisc add dev lo ingress
# tc filter add dev lo parent ffff: protocol ip prio 10 u32 \
> match u32 0 0 flowid 1:2 action mirred egress redirect dev eth0
この設定をしたホストで ping -c 127.0.0.1 としても失敗する。
eth0 の先に接続したホストで tcpdump してみると...
XXX
このフィルタ内 redirect を mirror に置き換えて
# tc filter add dev lo parent ffff: protocol ip u32 \
> match u32 0 0 flowid 1:2 action mirred egress mirror dev eth0
とすると tc 設定をしたホストと、この eth0 の先にある両方のホスト
で、パケットを見ることができる。つまりは ping が成功する
3. もうちょっとイカしたサンプル
lo の ingress にて 10個の内 1個のパケットがランダムに別ホストへ
--- eth0 へ --- 送る (ランダムは netrand generator を使う)
XXX: action drop --- 少し違う気がする...
# tc filter add dev lo parent ffff: protocol ip prio 10 u32 \
> match u32 0 0 flowid 1:2 \
> action drop random determ ok 10
> action mirred egress mirror dev eth0
4. 10.0.0.9 から来て eth0 に出ていくパケット
(ローカルの IP か forwarding するか)
が 100Kbps を超えると eth1 にリダイレクト
# tc qdisc add dev eth0 handle 1:0 root prio
# tc filter add dev eth0 parent 1:0 protocol ip prio 6 u32 \
> match ip src 10.0.0.9/32 flowid 1:16 \
> action police rate 100kbit burst 90 ok \
> action mirred egress mirror dev eth1
5. もっと面白いサンプルとしてフローを (デフォルト全て drop する)
dummy デバイスにミラーして tcpdump
192.168.200.200/32 からのパケットをポリシングして、この送出が
100Kbps を超えてほしくないとか
# tc qdisc add dev eth0 handle 1:0 root prio
# tc filter add dev eth0 pareht 1: protocol ip prio 10 u32 \
> match ip src 192.168.200.200/32 flowid 1:2 \
> action police rate 100kbit burst 90 drop
eth0 で tcpdump を実行すると 192.168.200.200/32 からのパケット送
出がドロップされようと、されまいと全て見ることができる (tcpdump
は egress される全てのパケットを見せるから)。ルールを少しだけ拡張
して make out したパケットを見るためには
# tc qdisc add dev eth0 handler 1:0 root prio
# tc filter add dev eth0 parent 1: protocol ip prio 10 u32 \
> match ip src 192.168.200.200/32 flowid 1:2 \
> action police rate 100kbit burst 90 drop \
> action mirred egress mirror dev dummy0
dummy0 で tcpdump を動かして、make out されたパケットだけを見る
# tcpdump -n -i dummy0 -x -e -t
mirror を redirect に置き換えると、これらパケットは XXX 一切 make
out できなくなる
2011年4月18日月曜日
obs600-tools.deb # utils の方が良かった?
obs600 で debian squeeze の続編。deb パッケージにない
バイナリはこんなイメージ

ソースはこんなイメージ

SSDLinux のソースから autotools 環境作成のスクリプトと言うかコマンド列挙は
こんなイメージ

zlib1g zlib1g-dev が必要なのでそれぞれ powerpc のdeb バイナリ
apt-cross というツールはなくなってしまい、pdebuild-cross は使い方わからず...
- flashcfg
- runled
- pshd
バイナリはこんなイメージ

ソースはこんなイメージ

SSDLinux のソースから autotools 環境作成のスクリプトと言うかコマンド列挙は
こんなイメージ

zlib1g zlib1g-dev が必要なのでそれぞれ powerpc のdeb バイナリ
- zlib1g_1.2.3.4.dfsg-3_powerpc.deb
- zlib1g-dev_1.2.3.4.dfsg-3_powerpc.deb
とするんだけど、バージョン上がった場合の確認が面倒。$ dpkg-cross --build --arch powerpc *.deb
apt-cross というツールはなくなってしまい、pdebuild-cross は使い方わからず...
2011年4月16日土曜日
softdog / CONFIG_WATCHDOG_NOWAYOUT - 勘違い
nowayout と Magic Close の関係を思いっきり勘違い。先日のエントリでは
何とでも読み取り可。nowayout 指定しても Magic Close はできると思い込
んでた。が、nowayout の方が強いと言うか、nowayout を指定してしまうと
Magic Close すらできない。
drivers/watchdog/softdog.c の中 MODULE_PARM で探すと
で Magic Close の場合は
/dev/watchdog
が開きっぱになっているので、続けて
/dev/watchdog に送ったけどリブート。で最初の通り nowayout 指定
すると Magic Close も何のその。書き込みなくば再起動という結果。
とってもシンプルだけど先の swd.sh は
せずの停止は
何とでも読み取り可。nowayout 指定しても Magic Close はできると思い込
んでた。が、nowayout の方が強いと言うか、nowayout を指定してしまうと
Magic Close すらできない。
- soft_margin: int
- Watchdog soft_margin in seconds.
(0 < soft_margin < 65536, default=60) - nowayout: int
- Watchdog cannot be stopped once started
(default= [config WATCHDOG_NOWAYOUT?]) - soft_noboot: int
- Softdog action, set to 1 to ignore reboots, 0 to reboot
#!/bin/sh
exec 3> /dev/watchdog
trap "echo 'send V'; echo -n V >&3; exit 0" INT
while :; do
echo >&3
sleep 4
doneSIG_INT で止められたら Magic Close。root になってまずは nowayout なしで Magic Close の場合は
Magic Close しない場合は (rmmod しないで引き続き)# modprobe softdog soft_margin=10 nowayout=0 soft_noboot=1 # ./swd.sh ^Csend V (しばらく待った後に Ctrl-c) # dmesg | tail ... [ 3010.493992] Software Watchdog Timer: 0.07 initialized. soft_noboot=1 soft_margin=10 sec (nowayout= 0)
# ./swd.sh
^Z (Ctrl-z)
[1]+ Stopped ./swd.sh
# (しばらく - soft_margin で指定した10 秒以上待つ)
# dmesg | tail
...
[ 3010.493992] Software Watchdog Timer: 0.07 initialized.
soft_noboot=1 soft_margin=10 sec (nowayout= 0)
[ 3241.819563] SoftDog: Triggered - Reboot ignored.リブートだけど soft_noboot 指定したのでメッセージだけ。次に nowayout 指定すると# fg ./swd.sh ^Csend V (Ctrl-c) # rmmod softdog
# modprobe softdog soft_margin=10 nowayout=1 soft_noboot=1
# ./swd.sh
^Csend V (Ctrl-c)
# (10 秒以上待って)
# dmesg | tail
...
[ 3757.016487] Software Watchdog Timer: 0.07 initialized.
soft_noboot=1 soft_margin=10 sec (nowayout= 1)
[ 3811.572991] SoftDog: Unexpected close, not stopping watchdog!
[ 3821.580111] SoftDog: Triggered - Reboot ignored.'V' を すると Magic Close も何のその。書き込みなくば再起動という結果。
とってもシンプルだけど先の swd.sh は
でソレナリには動くらしい。nowayout 指定せず Magic Close 使ってリブートnohup ./swd.sh > /var/log/watchdog.log 2>&1 &
せずの停止は
# killall -INT swd.sh # cat /var/log/swd.log nohup: ignoring input send V
2011年4月13日水曜日
PIL で bin2png - その 2
昔? telnet しか許されていないホストで base64 したバイナリをコピペしたこと
思い出した...鶏卵、ブートストラップ。ソレやるか? で昨日の
てないし、ムダな事ばっかじゃん。と思った方は是非メンテしてやってください。
コピペして bin2png.py とかで保存した後は、こちらも昨日のイメージを保存して
サイズ大きいファイルはシャレになりませんが、ブログに貼り付ける程度なら...
思い出した...鶏卵、ブートストラップ。ソレやるか? で昨日の
> 超てきとーいいかげんにパディングを貼り付けた結果、ながいブログエントリぃー。pack / unpack の使い方もわかっ
てないし、ムダな事ばっかじゃん。と思った方は是非メンテしてやってください。
コピペして bin2png.py とかで保存した後は、こちらも昨日のイメージを保存して
とかで。$ ./bin2png.py -d patch-2.6.38.2.gz.png -o patch-2.6.38.2.gz
サイズ大きいファイルはシャレになりませんが、ブログに貼り付ける程度なら...
#!/usr/bin/python
import sys, os, math, struct
import getopt, logging
import Image
log = logging.getLogger()
def sqrint(n):
r = math.ceil(math.sqrt(n) + 0.1)
return (int(r), int(math.pow(r, 2) - n))
def encode(srcfp, dstfp):
# calc sizes
fsize = os.fstat(srcfp.fileno()).st_size
log.debug("encode size: %d" % fsize)
qfsize = fsize / 4
sides, padlen = sqrint(qfsize)
tupad = struct.unpack('BBBB', struct.pack('!L', fsize))
# create data
data = [tupad]
for i in range(qfsize):
data.append(struct.unpack('BBBB', srcfp.read(4)))
nremain = fsize % 4
data.append(struct.unpack('BBBB', srcfp.read(nremain) + '\x00' * (4 - nremain)))
data.extend(((0, 0, 0, 0),) * (padlen / 4 - 1))
# write out
im = Image.new('RGBA', (sides, sides))
im.putdata(data)
im.save(dstfp, 'PNG')
def decode(srcfp, dstfp):
im = Image.open(srcfp)
imgcore = im.getdata() # needs checking mode?
fsize = struct.unpack("!L", struct.pack("BBBB", *imgcore[0]))[0]
log.debug("decode size: %d" % fsize)
data = list(imgcore)[1:]
b = bytearray()
[b.extend(d) for d in data]
dstfp.write(b[:fsize])
def usage():
print >> sys.stderr, '''%s - convert file to png image
-e | --encode specify encoding file
-d | --decode specify decoding file
-o | --outfile stdout if not specified
-h | --help show (this) usage message
-v | --verbose set logging level to DEBUG [default is INFO]
''' % sys.argv[0]
def main():
try:
opts, args = getopt.getopt(sys.argv[1:], 'e:d:o:hv',
['encode', 'decode', 'outfile',
'help', 'verbose'])
except getopt.GetoptError, err:
log.error(err)
usage()
sys.exit(2)
isencode = False
isdecode = False
srcfp = None
# 3.0: dstfp = sys.stdout.buffer?
dstfp = os.fdopen(sys.stdout.fileno(), 'wb')
for o, a in opts:
if o in ("-h", "--help"):
usage()
sys.exit(0)
elif o in ("-v", "--verbose"):
log.setLevel(logging.DEBUG)
elif o in ("-e", "--encode"):
isencode = True
srcfp = file(a, 'rb')
elif o in ("-d", "--decode"):
isdecode = True
srcfp = file(a, 'rb')
elif o in ("-o", "--outfile"):
dstfp = file(a, 'wb')
if not (isencode ^ isdecode):
log.error("invalid action")
usage()
sys.exit(1)
isencode and encode(srcfp, dstfp)
isdecode and decode(srcfp, dstfp)
if __name__ == "__main__":
logging.basicConfig(level=logging.INFO,
format='%(asctime)s %(levelname)s %(message)s')
main()
PIL で bin2png
ちょっと驚き... こちら blogger 然りでバイナリデータをブログに載せたい時って
どうすれば良いやら。長いテキストとかであれば a2ps | enscript で PostScript
にした後 ps2pdf とか。で PDF がアップロードできるか知らないし、やっぱイメー
ジデータでしょう。
と探すもステガノグラフィ (outguess steghide snowdrop) まで凝った話でもなく、
サイズも大きくなるし a2png だって? と試すもそのまま a2ps の png 版だったり。
sourceforge にあるも Java だったり...
むーん libpng とか使って自作? とか思い始めたところ # 長い前置き
Python Imaging Library (PIL) のハンドブック眺めてみたところ、ソレらしきメソ
ッドが。でお試し
探すのも面倒がってサイズもおかしいど、もちろん可逆で
いいかげんにパディングしたものを貼ってみるテスト
どうすれば良いやら。長いテキストとかであれば a2ps | enscript で PostScript
にした後 ps2pdf とか。で PDF がアップロードできるか知らないし、やっぱイメー
ジデータでしょう。
と探すもステガノグラフィ (outguess steghide snowdrop) まで凝った話でもなく、
サイズも大きくなるし a2png だって? と試すもそのまま a2ps の png 版だったり。
sourceforge にあるも Java だったり...
むーん libpng とか使って自作? とか思い始めたところ # 長い前置き
Python Imaging Library (PIL) のハンドブック眺めてみたところ、ソレらしきメソ
ッドが。でお試し
$ python
Python 2.6.6 (r266:84292, Dec 26 2010, 22:31:48)
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> fname = "patch-2.6.38.2.gz"
>>> import os
>>> os.stat(fname).st_size
52847
>>> f = open(fname)
>>> b = bytearray()
>>> b.extend(f.read())
>>> len(b)
52847
>>> import Image
>>> im = Image.new('L', (52847, 1))
>>> im.putdata(b)
>>> im.save("2.6.38.2.png")
>>> (Ctrl-D)
$ ls -l 2.6.38.2.png
-rw-r--r-- 1 chamaken chamaken 52921 2011-04-12 23:35 2.6.38.2.pngPNG フォーマットとか全く知らないので new() のモードわからないし、最大約数を探すのも面倒がってサイズもおかしいど、もちろん可逆で
$ python
Python 2.6.6 (r266:84292, Dec 26 2010, 22:31:48)
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import Image
>>> im = Image.open("2.6.38.2.png")
>>> f = open("write.back", 'wb')
>>> f.write(bytearray(im.getdata()))
>>> f.close()
>>> (Ctrl-d)
$ cmp patch-2.6.38.2.gz write.back
$ おどろいた。この 2.6.38.2.png を貼ると大変なことになりそうなので超てきとーいいかげんにパディングしたものを貼ってみるテスト
2011年4月7日木曜日
obs600 で 再度 debian squeeze - その 3 - で一段落
お待ちかね。OBS600 側
- CF 積んで
- ETHER-0 に UTP ケーブル接続して
- INIT ボタンをボールペンで押さえて
- パーティション分割 & ファイルシステム作成 8G を 6G / 2G に分割。冗長だけど全部
- マウント & ファイル取得準備
- 開発機側のファイルツリーをごっそり取得
- チルっと
- /uImage.initrd-cfboot の作成
$SSDSRC/usr/src/contrib/debootstrap/post-debootstrap $SSDSRC/usr/src/contrib/developers/kimura/lenny_based_firmware/uimage/create_uImage.sh - 普通の? 必須修正
- オリジナルツールのコピー 後でやっつけパッケージ作るけど、とり急ぎ
- CF ブートとしてリブート
# fdisk /dev/sda
Command (m for help): p
Disk /dev/sda: 8019 MB, 8019099648 bytes
247 heads, 62 sectors/track, 1022 cylinders
Units = cylinders of 15314 * 512 = 7840768 bytes
Device Boot Start End Blocks Id System
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-1022, default 1):
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-1022, default 1022): +6144M
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (786-1022, default 786):
Using default value 786
Last cylinder or +size or +sizeM or +sizeK (786-1022, default 1022):
Using default value 1022
Command (m for help): p
Disk /dev/sda: 8019 MB, 8019099648 bytes
247 heads, 62 sectors/track, 1022 cylinders
Units = cylinders of 15314 * 512 = 7840768 bytes
Device Boot Start End Blocks Id System
/dev/sda1 1 785 6010714 83 Linux
/dev/sda2 786 1022 1814709 83 Linux
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
sd 0:0:0:0: [sda] 15662304 512-byte hardware sectors: (8.01 GB/7.46 GiB)
sd 0:0:0:0: [sda] Write Protect is off
sd 0:0:0:0: [sda] Assuming drive cache: write through
sda: sda1 sda2
sd 0:0:0:0: [sda] 15662304 512-byte hardware sectors: (8.01 GB/7.46 GiB)
sd 0:0:0:0: [sda] Write Protect is off
sd 0:0:0:0: [sda] Assuming drive cache: write through
sda: sda1 sda2
Syncing disks.
# mke2fs -j -b 4096 -L / /dev/sda1
mke2fs 1.39 (29-May-2006)
Filesystem label=/
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
752192 inodes, 1502678 blocks
75133 blocks (5.00%) reserved for the super user
First data block=0
46 block groups
32768 blocks per group, 32768 fragments per group
16352 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 28 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
# mount /dev/sda1 /mnt
kjournald starting. Commit interval 5 seconds
EXT3 FS on sda1, internal journal
EXT3-fs: mounted filesystem with ordered data mode.
# ip link ls eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast
state UP qlen 1000
link/ether 00:1a:88:0c3:12:bb brd ff:ff:ff:ff:ff:ff
inet 192.168.253.254/24 brd 192.168.253.255 scope global eth0
# ping -c 4 192.168.253.1
PING 192.168.253.1 (192.168.253.1): 56 octets data
64 octets from 192.168.253.1: icmp_seq=0 ttl=64 time=2.2 ms
64 octets from 192.168.253.1: icmp_seq=1 ttl=64 time=0.3 ms
64 octets from 192.168.253.1: icmp_seq=2 ttl=64 time=0.3 ms
64 octets from 192.168.253.1: icmp_seq=3 ttl=64 time=0.3 ms
--- 192.168.253.1 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.3/0.7/2.2 ms
(長いコマンドライン) # ssh chamaken@192.168.253.1 \ > "cd ~/obs600/rootfs && tar -cp --numeric-owner -f - *" \ > | tar -xpv --numeric-owner -f - -C /mnt The authenticity of host '192.168.253.1 (192.168.253.1)' can't be established. RSA key fingerprint is d1:72:98:8b:42:11:e6:a6:7b:c8:6f:8b:95:ba:a3:a8. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.253.1' (RSA) to the list of known hosts. Password: ... var/cache/debconf/ var/spool/
# chroot /mnt I have no name!@ssd-linux:/# ls -1 bin boot debootstrap dev etc home lib lib64 lost+found mnt proc sbin selinux sys tmp usr var I have no name!@ssd-linux:/# cd /debootstrap I have no name!@ssd-linux:/debootstrap# ./debootstrap --second-stage I: Installing core packages... ... I: Base system installed successfully. I have no name!@ssd-linux:/debootstrap#
いろいろ叱られるし、長いけどI have no name!@ssd-linux:/debootstrap# cd I have no name!@ssd-linux:~# ls -1 linux-image-2.6.32_0.91_powerpc.deb obs600.dtb vmlinux.bin.gz
また長いコマンドライン。くどいけど参照I have no name!@ssd-linux:~# dpkg -i linux-image-2.6.32_0.91_powerpc.deb Selecting previously deselected package linux-image-2.6.32. (Reading database ... 9174 files and directories currently installed.) Unpacking linux-image-2.6.32 (from linux-image-2.6.32_0.91_powerpc.deb) ... Done. Setting up linux-image-2.6.32 (0.91) ... Hmm. There is a symbolic link /lib/modules/2.6.32/build However, I can not read it: No such file or directory Therefore, I am deleting /lib/modules/2.6.32/build Hmm. The package shipped with a symbolic link /lib/modules/2.6.32/source However, I can not read the target: No such file or directory Therefore, I am deleting /lib/modules/2.6.32/source Running depmod. Examining /etc/kernel/postinst.d. run-parts: executing /etc/kernel/postinst.d/initramfs-tools 2.6.32 /boot/vmlinux-2.6.32 update-initramfs: Generating /boot/initrd.img-2.6.32 df: Warning: cannot read table of mounted file systems: No such file or directory warning: can't open /etc/mtab: No such file or directory warning: can't open /etc/mtab: No such file or directory I have no name!@ssd-linux:~#
I have no name!@ssd-linux:~# mkimage -n "original.$(date +'%FT%T')" \ > -A ppc -O linux -T multi -C gzip \ > -d vmlinux.bin.gz:/boot/initrd.img-2.6.32:obs600.dtb \ > /uImage.initrd-cfboot Image Name: original.2011-04-01T12:34:56 Created: Tue Apr 1 12:34:56 2011 Image Type: PowerPC Linux Multi-File Image (gzip compressed) Data Size: 3847277 Bytes = 3757.11 kB = 3.67 MB Load Address: 00000000 Entry Point: 00000000 Contents: Image 0: 1925764 Bytes = 1880.63 kB = 1.84 MB Image 1: 1913443 Bytes = 1868.60 kB = 1.82 MB Image 2: 8053 Bytes = 7.86 kB = 0.01 MB I have no name!@ssd-linux:~#
そのほかI have no name!@ssd-linux:~# passwd Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully I have no name!@ssd-linux:~# cd /etc I have no name!@ssd-linux:/etc# cp inittab inittab.dpkg-dist I have no name!@ssd-linux:/etc# vi inittab ... I have no name!@ssd-linux:/etc# diff -uw inittab.dpkg-dist inittab --- inittab.dpkg-dist 2011-03-31 12:34:56.000000000 +0000 +++ inittab 2011-03-31 12:34:56.000000000 +0000 @@ -51,16 +51,16 @@ # Note that on most Debian systems tty7 is used by the X Window System, # so if you want to add more getty's go ahead but skip tty7 if you run X. # -1:2345:respawn:/sbin/getty 38400 tty1 -2:23:respawn:/sbin/getty 38400 tty2 -3:23:respawn:/sbin/getty 38400 tty3 -4:23:respawn:/sbin/getty 38400 tty4 -5:23:respawn:/sbin/getty 38400 tty5 -6:23:respawn:/sbin/getty 38400 tty6 +# 1:2345:respawn:/sbin/getty 38400 tty1 +# 2:23:respawn:/sbin/getty 38400 tty2 +# 3:23:respawn:/sbin/getty 38400 tty3 +# 4:23:respawn:/sbin/getty 38400 tty4 +# 5:23:respawn:/sbin/getty 38400 tty5 +# 6:23:respawn:/sbin/getty 38400 tty6 # Example how to put a getty on a serial line (for a terminal) # -#T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100 +T0:23:respawn:/sbin/getty -L ttyS0 115200 vt100 #T1:23:respawn:/sbin/getty -L ttyS1 9600 vt100 # Example how to put a getty on a modem line. I have no name!@ssd-linux:/etc#
必要に応じて作成、変更 - in debian's way で
I have no name!@ssd-linux:/etc# exit # cd /usr/sbin # cp flashcfg runled pshd /mnt/usr/sbin/
# flashcfg -h
usage: flashcfg Show this.
flashcfg -b Show current boot setting
flashcfg -c rootdev Change root file system [initrd|cf|sda-sdd[1-8]]
initrd - Boot from FlashROM, / on Ramdisk
sda-sdd[1-8] - Boot from FlashROM, / on CF
cf - Boot from CF, / on CF
flashcfg -f boot_image Load boot image to flash
flashcfg -s list_file Save files to Parameter area
flashcfg -S list_file Save files to User area
flashcfg -x Restore files from Parameter area
flashcfg -X Restore files from User area
flashcfg -d Delete saved files from Parameter area
flashcfg -D Delete saved files from User area
flashcfg -E env_file Save params to U-Boot Environment area
flashcfg -L env_file Load params from U-Boot Environment area
flashcfg -h Show this.
# flashcfg -c cf
# shutdown -r now
2011年4月6日水曜日
obs600 で 再度 debian squeeze - その 2
また引用。
OpenBlockS 600D - 開発環境の構築
クロス開発 (VMware等のx86環境上での開発)
- ベースとなる環境の用意 タイトル通り squeeze (amd64) で
- emdebian のリポジトリを追加します
- sources.list の準備
-
/etc/apt/sources.list.d に以下emdebian.list というファイルを追加# cat /etc/apt/sources.list.d/emdebian.list deb http://www.emdebian.org/debian/ squeeze main deb-src http://www.emdebian.org/debian/ squeeze main
- アップデート
$ sudo aptitude update
- キーリングを追加
-
$ sudo aptitude install emdebian-archive-keyring
- 必要なパッケージを追加します
- カーネルのソースコードを展開します ありがたいことに SSDLinux のパッチもあるので上記通り linux-source-2.6.32 で。
- 開発用ディレクトリの作成と SSD/Linux のソース取得、展開
- テンポラリディレクトリ作成
$ mkdir -p $HOME/obs600/tmp
- src.tgz の取得
$ wget -nd -N -P $HOME/obs600/tmp \ > http://ftp.plathome.co.jp/pub/ssdlinux/0.5-LATEST/source/src.tgz
- 各種展開
$ cd $HOME/obs600 $ tar xzf tmp/src.tgz -C tmp $ tar xjf /usr/src/linux-source-2.6.32.tar.bz2 -C .
- カーネルパッケージ作成
- カーネルパッチあて
- SSD/Linux のソース usr/src/mkdist/kernel/2.6.32/patches/ に各種パッチあり
$ cd linux-source-2.6.32 $ for i in ../tmp/usr/src/mkdist/kernel/2.6.32/patches/*.patch; do > patch -p1 $i > done ... patching file Makefile Reversed (or previously applied) patch detected! Assume -R? [n] Apply anyway? [n] (ここはエンター。デフォルトの n で OK) Skipping patch. 4 out of 4 hunks ignored -- saving rejects to file Makefile.rej patching file scripts/Makefile.modinst
- ごめんなさい -
scripts.patch
なので make 時に -D NOGZIP する+ifdef NOGZIP cmd_modules_install = mkdir -p $(2); cp $@ $(2) ; $(mod_strip_cmd) $(2)/$(notdir $@) +else + cmd_modules_install = mkdir -p $(2); cp $@ $(2) ; $(mod_strip_cmd) $(2)/$(notdir $@) ;gzip -9 $(2)/$(notdir $@) +endif- .config などのコピー
- ワーキングディレクトリは
$HOME/obs600/linux-source-2.6.32 のままで$ cp ../tmp/usr/src/mkdist/kernel/2.6.32/dot.config.powerpc-obs600 dot.config $ cp dot.config .config $ cp ../tmp/usr/src/mkdist/kernel/2.6.32/obs600.dts arch/powerpc/boot/dt $ cp ../tmp/usr/src/mkdist/kernel/2.6.32/obs600.dts arch/powerpc/boot/dts/
- menuconfig
menuconfig はお好みで gconfig とか。DRBD 使ってみるので$ make-kpkg -j4 --arch powerpc --config menuconfig configure
その他お好みで。個人的には cgroup と namespace veth など。diff 取ると- Device Drivers ---> Connector を M に
- Device Drivers ---> Block Devices ---> DRBD も M に
といったあたり。削除されてる$ diff -uw dot.config .config +CONFIG_CONNECTOR=m +CONFIG_BLK_DEV_DRBD=m
は http://download.filesystems.org/unionfs/unionfs-2.x/-CONFIG_UNION_FS=y
あたりからパッチ持ってきてあてる必要あり。でも CF ブートなので割愛。- kernel_image
$ MAKEFLAGS="NOGZIP=1" make-kpkg -j4 --rootcmd=fakeroot --arch=powerpc \ > --revision 0.91 --initrd kernel_image
- その他 uImage に必要なもの
- dtb
- 参照:
$SSDSRC/usr/src/contrib/debootstrap/post-debootstrap $SSDSRC/usr/src/contrib/developers/kimura/lenny_based_firmware/uimage/create_uImage.sh
$ make ARCH=powerpc obs600.dtb /home/chamaken/obs600/linux-source-2.6.32/scripts/dtc/dtc -O dtb -o arch/powerpc/boot/obs600.dtb -b 0 -p 1024 /home/chamaken/obs600/linux-source-2.6.32/arch/powerpc/boot/dts/obs600.dts DTC: dts->dtb on file "/home/chamaken/obs600/linux-source-2.6.32/arch/powerpc/boot/dts/obs600.dts" $ cp arch/powerpc/boot/obs600.dtb ../
- vmlinux.bin.gz
$ powerpc-linux-gnu-objcopy -O binary vmlinux ../vmlinux.bin $ cd .. $ gzip vmlinux.bin $ ls -1 linux-image-2.6.32_0.91_powerpc.deb linux-source-2.6.32 obs600.dtb tmp vmlinux.bin.gz
- (何と言えばよいのか) 開発機側で OBS600 バイナリのファイルツリー準備 include のパッケージは最低限。お好みで... drbb8-utils も
最後の二行は今後のモロモロのために$ sudo aptitude install \ > build-essential u-boot libc6-powerpc-cross \ > libc6-dev-powerpc-cross binutils-powerpc-linux-gnu gcc-4.4-powerpc-linux-gnu \ > g++-4.4-powerpc-linux-gnu \ > autoconf dpkg-cross linux-headers-2.6.32-5-common linux-source-2.6.32 \ > kernel-package libncurses5-dev
ここまでやっておくと次回 obs600 側になるので
最後の chmod 忘れずに$ su # debootstrap --foreign --arch=powerpc \ > --include "ssh less u-boot initramfs-tools" \ > squeeze rootfs http://ftp.jp.debian.org/debian I: Retrieving Release I: Retrieving Packages I: Validating Packages ... I: Extracting xz-utils... I: Extracting zlib1g... # ls -1 linux-image-2.6.32_0.91_powerpc.deb linux-source-2.6.32 obs600.dtb rootfs tmp vmlinux.bin.gz # cp linux-image-2.6.32_0.91_powerpc.deb obs600.dtb vmlinux.bin.gz rootfs/root/ # chmod 0755 rootfs/root
2011年4月5日火曜日
obs600 で 再度 debian squeeze - その 1
まずはおかしくなった時の準備。tftp サーバを適当な debian マシンにインストールしておく
Q. ファームウェアアップデートを実行したら起動しなくなりました。どうすれば復旧できますか。
A. TFTP サーバを利用したファームウェアのアップデートを行うことで復旧できます。
ファームウェアアップデートを実行したら起動しなくなりました。どうすれば復旧できますか。からの引用
Q. ファームウェアアップデートを実行したら起動しなくなりました。どうすれば復旧できますか。
A. TFTP サーバを利用したファームウェアのアップデートを行うことで復旧できます。
- パッケージのインストール
- ファームウェアをダウンロードしておき TFTP サーバ側で指定した場所におきます。 TFTP サーバのディレクトリに置く
- ETHER-0 と PC を添付のクロス・ケーブル (緑色) で接続します。 アドレス追加。ハブやスイッチ介しても同じ L2 ドメインであればクロスケーブルじゃなくてもOK
- 本体の ディップ・スイッチ 2 を ON にします。
- 電源を入れます。 待つことしばし
- ファームウェアのアップデートが完了しますと本体の緑色の LED が点滅します。
- 電源を抜き、ディップ・スイッチ 2 を OFF にします。
- 追記 - INIT ボタンを押しながら電源を入れる いや、CF 起動でおかしな状態にして数日放置。で tftp ブートでイメージ読み込んだ後、度々忘れるので...
$ sudo apt-get install tftpd-hpa (ディレクトリはデフォルトの /srv/tftp)
Starting HPA's tftpd: in.tftpdinvoke-rc.d: initscript tftpd-hpa,
action "start" failed.
dpkg: error processing tftpd-hpa (--configure):
subprocess installed post-installation script returned error exit status 71
configured to not write apport reports
Errors were encountered while processing:
tftpd-hpa
E: Sub-process /usr/bin/dpkg returned an error code (1)IPv6 無効にしていると上記エラー。なんて出力があるのでApr 5 21:06:29 devobs600 in.tftpd[16485]: cannot open IPv6 socket, disable IPv6: Address family not supported by protocol Apr 5 21:06:29 devobs600 in.tftpd[16485]: Cannot set nonblock flag on socket: Bad file descriptor
# diff -uw tftpd-hpa.dpkg-dist tftpd-hpa --- tftpd-hpa.dpkg-dist 2011-04-05 08:09:46.000000000 +0900 +++ tftpd-hpa 2011-04-05 08:09:56.000000000 +0900 @@ -3,4 +3,4 @@ TFTP_USERNAME="tftp" TFTP_DIRECTORY="/srv/tftp" TFTP_ADDRESS="0.0.0.0:69" -TFTP_OPTIONS="--secure" +TFTP_OPTIONS="--secure -4"
$ su # wget -nd -N -P /srv/tftp \ > http://ftp.plathome.co.jp/pub/OBS600/0.5-LATEST/powerpc-obs600/installation/uImage.initrd
# ip addr ls eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast
state UP qlen 1000
link/ether 00:ed:cb:a9:87:65 brd ff:ff:ff:ff:ff:ff
inet 10.1.2.3/16 brd 10.1.255.255 scope global eth0
# ip addr add 192.168.253.1/24 dev eth0
# ip addr ls eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast
state UP qlen 1000
link/ether 00:ed:cb:a9:87:65 brd ff:ff:ff:ff:ff:ff
inet 10.1.2.3/16 brd 10.1.255.255 scope global eth0
inet 192.168.253.1/24 scope global eth0
登録:
コメント (Atom)
ブログ アーカイブ
-
▼
2011
(21)
-
▼
4月
(11)
- freeradius rlm_pap on debian squeeze
- TIPS: KVM (qemu) for debian squeeze - その 1
- オレオレ証明書の証明書更新
- port mirror on linux
- obs600-tools.deb # utils の方が良かった?
- softdog / CONFIG_WATCHDOG_NOWAYOUT - 勘違い
- PIL で bin2png - その 2
- PIL で bin2png
- obs600 で 再度 debian squeeze - その 3 - で一段落
- obs600 で 再度 debian squeeze - その 2
- obs600 で 再度 debian squeeze - その 1
-
▼
4月
(11)
