木魚ブログ

@sainoky

Linuxサーバでディスク使用率が100%

WordpressをのっけてるだけのAWSインスタンスでディスク使用率が100%になってるけどどこが原因かわからない、と相談を受けた。 dfで見てみると、

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            492M   12K  492M   1% /dev
tmpfs           100M  348K   99M   1% /run
/dev/xvda1      9.8G  9.3G     0 100% /
none            4.0K     0  4.0K   0% /sys/fs/cgroup
none            5.0M     0  5.0M   0% /run/lock
none            497M     0  497M   0% /run/shm
none            100M     0  100M   0% /run/user

たしかに100%になってる。どこがそんなに使ってるのかduで見てみると

$ sudo du -sh /* | sort -nr
...
16K     /lost+found
12K     /tmp
12K     /dev
9.6M    /bin
9.4M    /sbin
8.0K    /srv
5.8M    /etc
4.0K    /media
4.0K    /lib64
1.2G    /opt
0       /vmlinuz.old
0       /vmlinuz
...

最も多く使ってる/optでも1.2G、合計してもどう見ても10G使ってない。ふむ?とlsofしてみると

$ sudo lsof +L1
COMMAND     PID   USER   FD   TYPE DEVICE   SIZE/OFF NLINK   NODE NAME
.php-fpm.  2996   root    3u   REG  202,1          0     0    768 /tmp/.ZendSem.pdfqGY (deleted)
httpd.bin  6902 daemon    2w   REG  202,1 6619189248     0 420123 /opt/bitnami/apache2/logs/error_log (deleted)
.php-fpm.  8401 daemon    3u   REG  202,1          0     0    768 /tmp/.ZendSem.pdfqGY (deleted)
.php-fpm.  8402 daemon    3u   REG  202,1          0     0    768 /tmp/.ZendSem.pdfqGY (deleted)
httpd.bin  9046 daemon    2w   REG  202,1 6619189248     0 420123 /opt/bitnami/apache2/logs/error_log (deleted)
mysqld.bi 10949  mysql    6u   REG  202,1          0     0 419686 /opt/bitnami/mysql/tmp/ib7SYs7U (deleted)
mysqld.bi 10949  mysql    7u   REG  202,1          0     0 419693 /opt/bitnami/mysql/tmp/ibi20k04 (deleted)
mysqld.bi 10949  mysql    8u   REG  202,1          0     0 419694 /opt/bitnami/mysql/tmp/ib0FadTe (deleted)
mysqld.bi 10949  mysql    9u   REG  202,1          0     0 419968 /opt/bitnami/mysql/tmp/ibb9soFy (deleted)
mysqld.bi 10949  mysql   13u   REG  202,1          0     0 419969 /opt/bitnami/mysql/tmp/ibyLvBPI (deleted)
.php-fpm. 11246 daemon    3u   REG  202,1          0     0    768 /tmp/.ZendSem.pdfqGY (deleted)
httpd.bin 12328 daemon    2w   REG  202,1 6619189248     0 420123 /opt/bitnami/apache2/logs/error_log (deleted)
httpd.bin 28733   root    2w   REG  202,1 6619189248     0 420123 /opt/bitnami/apache2/logs/error_log (deleted)

削除済の巨大なerror_logにhttpdがアクセスしててこれが原因っぽい。Apache再起動してもOKとのことだったのでbitnamiのお作法に従い“ctlscript.sh”を使って再起動したところ

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            492M   12K  492M   1% /dev
tmpfs           100M  348K   99M   1% /run
/dev/xvda1      9.8G  3.1G  6.2G  34% /
none            4.0K     0  4.0K   0% /sys/fs/cgroup
none            5.0M     0  5.0M   0% /run/lock
none            497M     0  497M   0% /run/shm
none            100M     0  100M   0% /run/user

ディスク使用率34%になった。

herokuでアドオン使わずにcron (Python)

herokuにはcronがない。で、どうやってcron的な定期実行を実現するかというと王道はHeroku Schedulerというアドオンを使うらしい。ただ、アドオンを使うとなると基本的に無料とはいえクレジットカードを登録する必要があってそれが嫌だったのでアドオン使わない方法で実現した。

ソースbot.py

from apscheduler.schedulers.blocking import BlockingScheduler

sched = BlockingScheduler()

@sched.scheduled_job('interval', minutes=3)
def timed_job():
    print('This job runs every three minutes.')

sched.start()

APSchedulerが必要なのでインストールして

$ pip install apscheduler

requirements.txtに以下の行を追加する。

APScheduler==3.0.3

Procfileを書いて

bot: python bot.py

bot.py,requirements.txt,Procfileをcommitしてデプロイ。

$ git push heroku master

あとは

$ heroku ps:scale bot=1

でプロセス1個割り当てれば3分おきにジョブが走るのを確認できる。

2015-05-24T10:24:15.052174+00:00 heroku[bot.1]: Starting process with command `python bot.py`
2015-05-24T10:24:15.662122+00:00 heroku[bot.1]: State changed from starting to up
2015-05-24T10:27:16.551515+00:00 app[bot.1]: This job runs every three minutes.
2015-05-24T10:30:16.551654+00:00 app[bot.1]: This job runs every three minutes.
2015-05-24T10:33:16.554967+00:00 app[bot.1]: This job runs every three minutes.

平日毎日夕方5時、みたいな指定も可能。ただし実行時刻はUTC(協定世界時)になるので注意。

@sched.scheduled_job('cron', day_of_week='mon-fri', hour=17)
def scheduled_job():
    print('This job runs every weekday at 5pm.')

これでtwitter bot作ったりとかいろいろ遊べる。

VMware Tools 9.9.2 + kernel 3.19で共有フォルダがマウントできなくなった時の対応

VMware player 7.1.0 (on Windows) + lubuntu 15.04 (kernel 3.19)で共有フォルダ機能を使おうとしたけどなぜか全然マウントされない。いつものようにVMware Tools再インストールで解決*1しようとしたら共有フォルダ関連のところでコンパイルエラー。正確なエラーメッセージは忘れたけどこんな感じでfile構造体にf_dentryなんてメンバはないと言われる。

/tmp/modconfig-1Xsnv4/vmnet-only/driver.c:1194:20: error: ‘struct file’ has no member named ‘f_dentry’
    if (filp && filp->f_dentry) {
                    ^

さてどうするかなとググったところ、既にパッチがあったのでありがたく利用させていただく。このリポジトリにある13-vmhgfs-f_dentry-kernel-3.19-tools-9.9.2.patchがそれ。 github.com

手順はほぼREADMEのとおりだけど以下かんたんに日本語で。以下すべてゲストマシンでの作業になる。

当該パッチを含むリポジトリをクローン

$ git clone https://github.com/rasa/vmware-tools-patches.git

READMEの手順2は独自パッチを使いたい場合なので今回はスキップしてOK.

VMware Tools本体(VMwareTools-9.9.2-xxxxxxx.tar.gz)をリポジトリルートに置いたら*2スクリプトにより展開+パッチ適用

$ cd vmware-tools-patches
$ ls VMwareTools*
VMwareTools-9.9.2-2496487.tar.gz
$ ./untar-and-patch.sh

ビルド+インストール

$ ./compile.sh

無事ビルドが通り、共有フォルダがマウントされるようになりました。

*1:VMwareで共有フォルダが見えない時の対処 | Res-Log

*2:READMEによるとリポジトリルートにあるdownload-tools.shを使ってダウンロードできるとあるが今回ほしい9.9.2はダウンロードできなかった。既にVMware Playerメニュー -> Manage -> Reinstall VMware Tools...からイメージをマウント済みだったのでこれを利用した

Google I/O 2014で発表されたCardboardを組み立ててみた

これ。Cardboard

f:id:sainoky:20140629200913j:plain

完成まで

実際用意したもの

100均で3点購入、税込み324円。

公式サイト情報 今回
段ボール。ピザの箱ならエクストララージサイズ 家にあった普通の段ボール箱を利用。みかん箱より一回り小さめ、これで2セット作れる感じ
焦点距離45mm程度*1のレンズ2枚 100均で購入。後述
磁石2つ。直径19mm厚さ3mmで片方はドーナツ型の 用意できず。後述
面ファスナー20mmx30mm 2セット 100均で購入。いわゆるマジックテープ
輪ゴム 家にあった普通の輪ゴム。本来とは違う目的で使った。後述
NFCタグ 用意せず。あったらCardboardにスマートフォンをセットするだけでアプリが起動して便利っぽい

スマートフォンはNexus 5を使っています。

組み立て

f:id:sainoky:20140628150006j:plain

  1. 型紙Cardboard Design Filesをダウンロード、印刷して段ボール紙に貼る
  2. 切り抜いて、Cardboardページ冒頭のパラパラ漫画(?)のように折り曲げていけば完成

小学校の工作みたいで楽しい。

レンズは100均で買えた

材料の中で一番入手が難しそうなのが「焦点距離45mm程度のレンズ2枚」。カメラ用のちゃんとしたレンズならまだしも、安物のプラスチックレンズに焦点距離なんて書いてないのでとりあえず買ってみるしかない。

でも運良く100均(ダイソー)で入手しました。これ。

f:id:sainoky:20140629103550j:plain

焦点距離がちょうどいい上、レンズは指で強く押すだけで外れるので最適。ヨドバシで税込103円のルーペも買いましたが、こちらは焦点距離80mm程度で残念ながら使えず。

外側に輪ゴムかかってるけど本来は不要

輪ゴムは本来スマートフォンが滑り落ちるのを防ぐために本体内側で使うようですが、その必要性は感じませんでした。面ファスナーのホールド力で十分。

それよりも、本体をいつでも分解/再組み立てできるようにしておいたほうが後々便利そうなので、糊付けの代わりに使ってます。ちょっとかっこわるいけど。

磁石は無くてもなんとかなる

磁石は本体側面に設置して、物理キーとして使います。磁石をスライドすることで発生する磁場の変化を捉えてアプリ内で様々なトリガとして扱うようです(MagnetSensorで取得できる)。

デモアプリ内ではもっぱら「決定ボタン」の扱いで、画面ダブルタップでも同じ意味になるのですが、構造上画面は指では触りにくい。そこで細くたたんだアルミ箔をタッチスクリーン表面(左右視野境界上で邪魔にならない部分)から本体外側にひいてきてそこをタップするようにしました。問題なく使えています。(しかしこうして見ると切り口が雑なのがバレますね。)

f:id:sainoky:20140629204044j:plain

実際使ってみて

操作方法

最初のうち「戻る」をどうやってやるのか分からなかったんですがちゃんとチュートリアルで説明されてました。

操作 方法
メニュー選択 その方向に顔を動かす
進む 磁石スライドか画面ダブルタップ
戻る 右に90度傾ける

f:id:sainoky:20140629105444p:plain

自分で撮影したものが見られるのも楽しい

  • Tutorial
  • Tour Guide
  • Exhibit
  • Windy Day
  • Earth
  • YouTube
  • Photo Sphere
  • Street Vue

デモアプリには今のところ上記8つのメニューがあってどれも結構楽しいです。Photo Sphereでは自分がKitKat Androidのカメラアプリを使ってPhoto Sphereモードかパノラマモード撮影した風景に入り込むような感じで眺めることができます。最近旅行へ行くたびにこのモードで撮りためてる身としては嬉しい。

その他

  • せっかくAPIもあるし何か作ってみようかな、と思ってましたがとりあえず段ボール組み立てて与えられたコンテンツ見たらすっかり満足してしまいました
  • 段ボールたくさんジョキジョキするので結構ゴミが出ます

*1:公開当初は40mmだったような?現在(2014-06-29AM)は45mmと書いてあります

Repoを使わずGerritにuploadする

基本的な方法

refs/for/branchnameというおまじないref *1 にpushすればrepo uploadしたとき同様レビューにあげることができる。

例えばgit.example.comというGerritサーバにホストされているkernel/commonプロジェクトのexブランチにあげたい場合は

$ git push ssh://sainoky@git.example.com:29418/kernel/common HEAD:refs/for/ex

ショートカット(1)

特定のGerritサーバによくgit pushする場合は、~/.ssh/configに設定を書いておくと少し楽になる。

$ cat ~/.ssh/config
...
Host rv
  Hostname git.example.com
  Port 29418
  User sainoky
$ git push rv:kernel/common HEAD:refs/for/ex

ショートカット(2)

さらにreviewerも同時に指定したい場合はgit receive-packを利用して

$ git push --receive-pack='git receive-pack --reviewer=a@a.com' rv:kernel/common HEAD:refs/for/ex

同じプロジェクト/ブランチ/reviewerでgit pushする機会が多いならこれらも適宜ショートカットしたい。

$ cat .git/config
...
[remote "rv-ex"]
  url = rv:kernel/common
  receivepack = git receive-pack --reviewer=a@a.com
  push = HEAD:refs/for/ex
$ git push rv-ex

参考: Gerrit - git push

*1:このrefは実際には存在しない。Gerritは独自のSSH/Gitスタックをもっていて、これがGit clientに対してはあたかもrefs/for/branchnameが存在しているかのように振る舞う。 参考: Gerrit - Gritty Details

Androidでシリアルコンソール

シリアルポートからログ出し+ログインできるようにする方法3ステップ。 USB接続が使えない時に便利。

シリアルポートドライバを有効化

最近のQualcomm MSMチップセットだとこのあたり

CONFIG_SERIAL_MSM_HS=y
CONFIG_SERIAL_MSM_HSL=y
CONFIG_SERIAL_MSM_HSL_CONSOLE=y

ログイン待ち受け設定

Androidには/etc/inittabもなければgettyも無い。代わりとなるのがinit.rcのこの部分。通常は記述があるはずなので触らなくてOK.

service console /system/bin/sh
    class core
    console
    disabled
    user shell
    group log
on property:ro.debuggable=1
    start console

user shellgroup logを削除すればrootでのログインも可能。

シリアルttyデバイスを指定

カーネルのブートパラメータで指定する。例えば115200bps、8bit、パリティ無しでttyHSL0をコンソールとして使用する場合なら

console=ttyHSL0,115200n8

を追加。

device treeをVimでシンタックスハイライト

syntaxファイルを作成・公開されてる方がいるのでありがたく使わせていただく。 https://github.com/b4winckler/macvim/blob/master/runtime/syntax/dts.vim

  1. ~/.vim/syntax/dts.vimとして保存
  2. 拡張子でfiletype判定させるため~/.vimrcに下記2行追加
au BufNewFile,BufRead *.dts setf dts
au BufNewFile,BufRead *.dtsi setf dts

コメントや変数の部分がハイライトされて分かりやすくなった。

f:id:sainoky:20140527234308p:plain

スクリーンショットはraspberry pi kernelのarch/arm/boot/dts/bcm2835.dtsiからとりました。https://github.com/raspberrypi/linux/blob/rpi-3.12.y/arch/arm/boot/dts/bcm2835.dtsi#L50