2017年1月15日 (日)

AliExpressで Raspberry Pi用の3.5inch LCDを買いました

AliExpressで RaspberryPi用の3.5inch LCDが$11.45ということで職場のかたと共同で購入してみました。
12/23に購入し1/6に受け取ったので、ちょうど2週間くらいです。

Img_20170115_151033

あらかじめLCD用ドライバが含まれたOSイメージを使う方法と
純正OSに、自分でドライバを追加する方法の、2種類があるようです

参考サイト
3.5inch RPi LCD (A)
Drive the LCD(Raspbian/Ubuntu mate)

今回は純正OS(Raspbian 2017-01-11版)に自分でドライバを追加する方法を試してみました。
Raspbianは既にインストールされているものとします。

ドライバをダウンロード
$ wget http://www.spotpear.com/download/diver24-5/LCD-show-161112.tar.gz

ファイルを展開
$ tar xzvf LCD-show-161112.tar.gz

この時点でLCDを装着しておきます。(この後いきなりリブートするので)

$ cd LCD-SHOW
$ sudo ./LCD35-show

再起動すると、使えるようになります。
タッチパネルも動きます。
Img_20170115_143351

キーボードが無いと不便なので、マッチボックスキーボードを入れておきます。
$ sudo apt-get update
$ sudo apt-get install matchbox-keyboard

アクセサリ -> keyboard で起動できます。

Img_20170115_142816

画面を回転させることも出来ます。(リブートが必要)
90度回転させるには、90を指定します。0、90、180、270が指定できるようです。

$ cd LCD-show/
$ sudo ./LCD35-show 90

Img_20170115_144505

以上

アプリによってはウィンドウが画面外へはみ出してしまいOKボタン等が押せないこともある(詰み...)、あまり実用的では無いですが、ちょっと面白かったです。

おまけ
LXDEのフォントを小さくするための設定が入っている場所;

$ vi ~/.config/pcmanfm/LXDE-pi/desktop-items-0.conf
----
desktop_font=Roboto Light 12
----

$ vi ~/.config/lxsession/LXDE-pi
----
sGtk/FontName=Roboto Light 12
----

$ vi ~/.config/lxpanel/LXDE-pi/panels/panel
----
fontsize=12
----

$ vi ~/.config/gtk-3.0/gtk.css
----
font: Roboto Light 12;
----

(1/17)追記
xrdpをインストールしましたが、リモートデスクトップ接続できないことが判明。
原因不明(調べてない)

2016年12月13日 (火)

秋月の温湿度・気圧センサモジュールAE-BME280で、温度・湿度・気圧を取得する(2/2)

Cactiで表示させてみることにしました。

(1)カスタマイズグラフの作り方
まずスクリプトを作る
cd /usr/local/share/cacti/scripts

sudo vi bme280_temp.pl
----
#!/usr/local/bin/perl
$val = `/usr/bin/python /home/pi/bme280_sample.py |grep temp |awk '{print $3}'`;
print $val;
----
:wq
実行権付与
sudo chmod +x bme280_temp.pl

(2)Data Input Method画面
----
name: bme280_temp
Input Type: Script/command
Input String: perl /usr/local/share/cacti/scripts/bme280_temp.pl
----

ただ、これではうまく行かない。
ログに延々エラーが出ていた。
tail /var/log/cacti/poller-error.log
----
Traceback (most recent call last):
File "/home/pi/bme280_sample.py", line 9, in
bus = SMBus(bus_number)
File "/usr/local/lib/python2.7/dist-packages/smbus2/smbus2.py", line 132, in __init__
self.open(bus)
File "/usr/local/lib/python2.7/dist-packages/smbus2/smbus2.py", line 142, in open
self.fd = os.open("/dev/i2c-{}".format(bus), os.O_RDWR)
OSError: [Errno 13] Permission denied: '/dev/i2c-1'
----

www-dataでは/dev/i2c-1を読む権限がないらしい

(3)無理矢理パスワードを付けて
sudo passwd www-data

(4)soduersに追加
sudo vi /etc/sudoers
----
www-data ALL=(ALL) NOPASSWD: ALL
----
:wq

うまく(?)出来たようだ
sudo -u www-data sh /usr/local/share/cacti/scripts/bme280_temp.sh
22.54

まあでも、www-dataにsudo権限を付けるのは、セキュリティ的にはどうですかね。

以上

秋月の温湿度・気圧センサモジュールAE-BME280で、温度・湿度・気圧を取得する(1/2)

お手伝いしている会社の勉強会のために、秋月の温湿度・気圧センサモジュールAE-BME280で、温度・湿度・大気圧を得る手順をまとめました。

最近、smbus2が必要になったようです。

Img01013

(1)モジュール接続
割愛

(2)I2C有効化
[Preferences]-[Raspberry Pi Configuration]
[Interfaces」->「I2C」「Enable」

再起動
[YES]

(3)i2cパッケージのインストール
sudo apt-get install i2c-tools
sudo apt-get python-smbus

検出
sudo i2cdetect -y 1

中身を取り出す
sudo i2cdump -y 1 0x76

(4)スイッチサイエンス社のライブラリをダウンロード
wget https://github.com/SWITCHSCIENCE/BME280/archive/master.zip

unzip master.zip

cp -p ./BME280-master/Python27/bme280_sample.py .
python ./bme280_sample.py
----
Traceback (most recent call last):
File "/home/pi/bme280_sample.py", line 3, in
from smbus2 import SMBus
ImportError: No module named smbus2
----
エラーになる。

cd /BME280-master/Python27
cat requirements.txt
----
smbus2>=0.1.3
----
smbus2が必要なようだ。

(5)smbus2のインストール
wget https://github.com/kplindegaard/smbus2/archive/master.zip
unzip master.zip.1
----
Archive: master.zip.1
a115a850ed7c8ecc7438fff0d5c40e230eaf6579
creating: smbus2-master/
inflating: smbus2-master/.travis.yml
inflating: smbus2-master/LICENSE
inflating: smbus2-master/README.md
inflating: smbus2-master/README.rst
inflating: smbus2-master/setup.py
creating: smbus2-master/smbus2/
inflating: smbus2-master/smbus2/__init__.py
inflating: smbus2-master/smbus2/smbus2.py
creating: smbus2-master/tests/
inflating: smbus2-master/tests/test_datatypes.py
inflating: smbus2-master/tests/test_smbus2.py
----

cd smbus2-master
sudo pip install smbus2
----
Downloading/unpacking smbus2
Downloading smbus2-0.1.4.tar.gz
Running setup.py (path:/tmp/pip-build-Eqrjt6/smbus2/setup.py) egg_info for package smbus2

Installing collected packages: smbus2
Running setup.py install for smbus2

Successfully installed smbus2
Cleaning up...
----

(6)動作確認
python ./bme280_sample.py
----
temp : 24.13 ℃
pressure : 1011.14 hPa
hum : 67.66 %
----

以上

2016年12月 6日 (火)

ipset作成メモ(日本のIPv4アドレス一覧)

ipsetで日本のIPv4アドレス一覧を作成したときのメモ

最新のCIDR一覧を取得
wget http://nami.jp/ipv4bycc/cidr.txt.gz
gunzip -f cidr.txt.gz
grep -e "^JP" cidr.txt |awk '{print $2}' >IP_JAPAN
rm cidr.txt

IP_JAPANという名前で一覧を作成
sudo ipset create -exist IP_JAPAN hash:net
while read NET; do sudo ipset add IP_JAPAN $NET; done

※けっこう時間が掛かる

保存
sudo ipset save |sudo tee /etc/ipset.conf

再起動時にipsetをリストアさせる方法

iptablesで日本国外からのアクセスを禁止する設定をしているのですが
ファイアウォールルールが長くなっていろいろ面倒なので、ipsetを使ってみることにしました。
ipsetの内容は再起動時にクリアされてしまうため、うまい方法がないか、考えてみました。

ipsetはインストール&設定済み、の前提で。

■概要
(1)/etc/ipset.confファイルに ipset save する
(2)netfilter-persistent起動時に、ipset restore する。

■詳細
(1)/etc/ipset.confファイルに ipset save
# sudo ipset save |sudo tee /etc/ipset.conf

(2)netfilter-persistent起動時に、ipset restoreする。
# sudo vi /lib/systemd/system/netfilter-persistent.service
----
[Unit]
Description=netfilter persistent configuration
DefaultDependencies=no
Before=network.target
Requires=systemd-modules-load.service local-fs.target
After=systemd-modules-load.service local-fs.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStartPre=/usr/bin/sudo /sbin/ipset restore -exist -f /etc/ipset.conf <---これを追加
ExecStart=/usr/sbin/netfilter-persistent start
ExecStop=/usr/sbin/netfilter-persistent stop

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

# sudo systemctl daemon-reload
# sudo systemctl restart netfilter-persistent

以上

2016年11月17日 (木)

Android 6 MarshmallowでL2TP/IPsec VPNが動作しない(openswan編)

HUAWEI P9 Liteを購入しました。
そうしたら、自宅のVPNに接続できなくなってしまいました。
わりと有名な問題のようです。

Android 6 MarshmallowでL2TP/IPsec VPNが動作しない問題を解決する(xl2tpd+openswan)

このかたはopenswanからlibreswanに乗り換えたようですが、パッケージの再セットアップが面倒なのでopenswanで出来ないか調べました。結果は、出来ました。
connセクションにsha2_truncbug=yes を追記すれば良いようです。
libreswanは sha2-truncbug だったので、ハイフンとアンダースコアの違いだけですね。

$ sudo vi /etc/ipsec.conf
----
coon L2TP
<中略>
ike=aes256-sha2_256
phase2alg=aes256-sha2_256
sha2_truncbug=yes
----
$ sudo service ipsec restart
これでOK。Windows7はsha1で、Androidはsha2で繋がります。

ログにこんなメッセージが出ます。
$ tail -f /var/log/auth.log
----
Nov 16 17:45:07 raspberrypi3 pluto[26345]: | authalg converted for sha2 truncation at 96bits instead of IETF's mandated 128bits
Nov 16 17:45:07 raspberrypi3 pluto[26345]: | authalg converted for sha2 truncation at 96bits instead of IETF's mandated 128bits
----

参考にした元記事はこちら。
Cisco 2811 & OpenSWAN SHA256 truncate bug
https://bugzilla.redhat.com/show_bug.cgi?id=1077641

2016年1月12日 (火)

RaspberryPi (4.1.15-v7+) でELECOM WDC-150SU2Mを使う

sudo rpi-update をやったらカーネルが4.1.13-v7+ →4.1.15-v7+ に上がってしまい、ELECOM WDC-150SU2Mが使えなくなってしまった。

参考ページ
https://www.raspberrypi.org/forums/viewtopic.php?p=462982
を見て、カーネルにあったファイルをダウンロードする。

mkdir drivers
cd drivers
wget https://dl.dropboxusercontent.com/u/80256631/8188eu-v7-20151215.tar.gz
tar zxf ./8188eu-v7-20151215.tar.gz
sudo ./install.sh

再起動すれば WDC-150SU2Mが使えるようになる。

2015年12月27日 (日)

squid 3.5.12-20151128-r13959 失敗編

Raspberry Pi2でsquid 3.5.12-20151128-r13959 をビルドし、動かしたときに出た不具合です。

・rockを初期化しようとするとエラー …対応済み
・キャッシュディレクトリ作成がエラー …対応済み
・2GB以上のrockが作れない …対応済み
・cache.logにワーニングが記録される …放置
・たくさんログローテーションしてしまう …対応済み
・マルチインスタンス時、cachemgrの表示がおかしい …放置

rockを初期化しようとするとエラー


現象


キャッシュディレクトリ作成(squid -z)でエラー
$ sudo squid -z
----
2015/12/07 01:12:07| assertion failed: ../../src/ipc/AtomicWord.h:88: "Enabled()"
----

起動もエラー
----
$ sudo service squid start
[warn] Starting Squid HTTP Proxy: squid[....] Creating Squid HTTP Proxy cache structure ... (warning).
2015/12/07 01:14:17| assertion failed: ../../src/ipc/AtomicWord.h:88: "Enabled()"
Aborted
Aborted
failed!
----

原因と対策


C++11でコンパイルしていない。
configureのオプションにCXXFLAGS='-std=c++11'を追加する。

キャッシュディレクトリ作成がエラー


現象


$ sudo -u proxy squid -z
----
WARNING: Cannot write log file: /var/log/squid/cache.log
/var/log/squid/cache.log: Permission denied
messages will be sent to 'stderr'.
WARNING: Cannot write log file: /var/log/squid/cache.log
/var/log/squid/cache.log: Permission denied
messages will be sent to 'stderr'.
2015/12/08 20:35:05 kid2| Set Current Directory to /var/cache/squid
2015/12/08 20:35:05 kid2| Creating missing swap directories
2015/12/08 20:35:05 kid2| Creating Rock db: /var/lib/squid/rock
2015/12/08 20:35:05 kid2| ERROR: Failed to initialize Rock Store db in /var/lib/squid/rock; create error: (13) Permission denied
FATAL: Rock Store db creation error
Squid Cache (Version 3.5.12-20151128-r13959): Terminated abnormally.
CPU Usage: 0.040 seconds = 0.020 user + 0.020 sys
Maximum Resident Size: 39408 KB
Page faults with physical i/o: 0
WARNING: Cannot write log file: /var/log/squid/cache.log
/var/log/squid/cache.log: Permission denied
messages will be sent to 'stderr'.
2015/12/08 20:35:05 kid3| Set Current Directory to /var/cache/squid
2015/12/08 20:35:05 kid3| Creating missing swap directories
WARNING: Cannot write log file: /var/log/squid/cache.log
/var/log/squid/cache.log: Permission denied
messages will be sent to 'stderr'.
2015/12/08 20:35:05 kid1| Set Current Directory to /var/cache/squid
2015/12/08 20:35:05 kid1| Creating missing swap directories
WARNING: Cannot write log file: /var/log/squid/cache.log
/var/log/squid/cache.log: Permission denied
messages will be sent to 'stderr'.
2015/12/08 20:35:08 kid2| Set Current Directory to /var/cache/squid
2015/12/08 20:35:08 kid2| Creating missing swap directories
2015/12/08 20:35:08 kid2| Creating Rock db: /var/lib/squid/rock
2015/12/08 20:35:08 kid2| ERROR: Failed to initialize Rock Store db in /var/lib/squid/rock; create error: (13) Permission denied
FATAL: Rock Store db creation error
Squid Cache (Version 3.5.12-20151128-r13959): Terminated abnormally.
CPU Usage: 0.040 seconds = 0.030 user + 0.010 sys
Maximum Resident Size: 39568 KB
Page faults with physical i/o: 0

WARNING: Cannot write log file: /var/log/squid/cache.log
/var/log/squid/cache.log: Permission denied
messages will be sent to 'stderr'.
2015/12/08 20:35:14 kid2| Set Current Directory to /var/cache/squid
2015/12/08 20:35:14 kid2| Creating missing swap directories
2015/12/08 20:35:14 kid2| Creating Rock db: /var/lib/squid/rock
2015/12/08 20:35:14 kid2| ERROR: Failed to initialize Rock Store db in /var/lib/squid/rock; create error: (13) Permission denied
FATAL: Rock Store db creation error
Squid Cache (Version 3.5.12-20151128-r13959): Terminated abnormally.
CPU Usage: 0.040 seconds = 0.030 user + 0.010 sys
Maximum Resident Size: 39568 KB
Page faults with physical i/o: 0
----

原因と対応


/var/run/squidのオーナーがrootになっているのが問題らしい

$ ll /var/run
----
drwxr-xr-x 2 root root 40 12月 7 00:38 squid
----

オーナーをproxyに変更する
$ sudo chown proxy.proxy /var/run/squid

2GB以上のrockが作れない


現象


キャッシュディレクトリ作成時にエラー
$ sudo -u proxy squid -z
----
ERROR: Failed to initialize Rock Store db in /var/cache/squid/rock; truncate error: (22) Invalid argument
----

原因と対応


ビルド時に2GB以上のファイルサポートを有効にしていない。
configureオプションに以下を追加する。
----
--with-large-files
----

cache.logにワーニングが記録される


現象


$ sudo view /var/log/squid/cache.log
----
WARNING: disk-cache maximum object size is too large for mem-cache: 4096.00 KB > 512.00 KB
----

原因と対応


不明。特に問題に問題ないのでそのまま使う。

たくさんログローテーションしてしまう


現象


一度に何世代もローテーションしてしまい、ログがめちゃめちゃになる。
$ ll /var/log/squid
----
-rw-r----- 1 proxy proxy 0 12月 13 06:25 access.log
-rw-r----- 1 proxy proxy 0 12月 13 06:25 access.log.0
-rw-r----- 1 proxy proxy 4360875 12月 14 01:09 access.log.1
-rw-r----- 1 proxy proxy 29476 12月 10 22:55 access.log.2
-rw-r----- 1 proxy proxy 76167 12月 7 20:28 access.log.3
-rw-r----- 1 proxy proxy 4465767 12月 13 06:24 access.log.4
-rw-r----- 1 proxy proxy 536326 12月 7 06:23 access.log.5
---

原因と対応


squid3.5ではsquid -k rotate 時にプロセスの数だけローテーションするため。
cache.log、access.log、cache_swap_logにはプロセス番号を付けるなど別ファイルに分けておく。
必要の無いログは出さないのも有効か。

$ sudo vi /etc/squid/squid.conf
----
cache_swap_log /var/log/squid/cache_swap_${process_number}.log
access_log none
cache_log /var/log/squid/cache_${process_number}.log
----

マルチインスタンス時、cachemgrの表示がおかしい


現象


cache_memで指定したサイズが表示されない。
$ sudo squidclient cachemgr mgr:info
----
Storage Mem size: 2128 KB
Storage Mem capacity: 51.9% used, 48.1% free
----

原因と対応


原因不明。コーディネータの情報だけが表示されているのではないか。
※その後、マルチインスタンスは使用しないことにしましたので、詳細不明です。

ということで、今回でsquid3.5ネタは一旦終了します。

2015年12月26日 (土)

squid 3.5.12-20151128-r13959 解説編Ⅱ(ビルド)

squid 3.5.12-20151128-r13959 ビルド時に明示的に指定したconfigureのオプションとその理由を書いておきます。
オプションの方針としては以下になります。

・Raspbian 2015-05-05のsquid3のビルドオプション流用
・プラス squid3.5特有の修正(C++11/14対応)

参考にしたURL:
http://wiki.squid-cache.org/SquidFaq/CompilingSquid

省略したオプションについてはコメントしてません。

configureのオプション(再掲)

./configure --prefix=/usr \
--localstatedir=/var \
--libexecdir=${prefix}/lib/squid \
--datadir=${prefix}/share/squid \
--sysconfdir=/etc/squid \
--with-default-user=proxy \
--with-logdir=/var/log/squid \
--with-pidfile=/var/run/squid.pid \
--with-large-files \
--with-build-environment=POSIX_V6_ILP32_OFFBIG \
--enable-inline \
--enable-async-io=8 \
--enable-storeio=rock,ufs,aufs,diskd \
--enable-removal-policies=lru,heap \
--enable-delay-pools \
--enable-cache-digests \
--enable-underscores \
--enable-esi \
--enable-zph-qos \
--enable-wccpv2 \
--enable-linux-netfilter \
--enable-follow-x-forwarded-for \
CC=gcc-4.8 \
CXX=g++-4.8 \
CFLAGS='-O2 -fPIE -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -Wall' \
LDFLAGS='-fPIE -pie -Wl,-z,relro -Wl,-z,now' \
CPPFLAGS='-D_FORTIFY_SOURCE=2' \
CXXFLAGS='-std=c++11 -O2 -fPIE -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security'

まずはRaspbianの付属squid3から引き継いだ設定から。

--prefix=/usr \
--localstatedir=/var \
--libexecdir=${prefix}/lib/squid \
--datadir=${prefix}/share/squid \
--sysconfdir=/etc/squid \
--with-default-user=proxy \
--with-logdir=/var/log/squid \
--with-pidfile=/var/run/squid.pid

Debian/Ubuntuで使う場合はこれをデフォルトにすべきらしい。ということでそのまま指定。
元ネタは、http://wiki.squid-cache.org/SquidFaq/CompilingSquid#Debian.2C_Ubuntu

--enable-storeio=rock,ufs,aufs,diskd

ディスクキャッシュを行う場合に指定する。全部入り。もちろん必要なものだけでいい。

--with-large-files

2Gバイト以上のファイルを使えるようにする。ディスクキャッシュでrockを使う場合は有効にするといいと思う。というか、たぶんそれ以外で2GB超えのファイルは使わないよね?

--enable-inline

インライン展開を有効にする。プロダクションビルドの場合は有効にすると若干性能がアップするかも?デバッグ時には代わりに--disable-inlineを。

--enable-async-io=8

非同期IOのスレッド数。Raspbian付属のsquid3が8を指定してたのでそのまま。

--enable-removal-policies=lru,heap

キャッシュの削除ポリシー。たぶんLRUしか使わないけど、これもRaspbian付属のsquid3が指定してたのでそのまま。

--enable-delay-pools

ディレイプールを使う。たぶん使わないけど、以下略。

--enable-cache-digests

キャッシュダイジェストを使う。PEERを組む場合に必要。

--enable-underscores

ホスト名に_(アンダースコア)を使えるようにする。本来RFC2396ではホスト名に_(アンダースコア)は使えない。

--enable-esi

リバースプロキシーでエッジアクセラレーションが効く。

--enable-zph-qos

Zero Penalty Hit QoS を使う。

--enable-wccpv2

Ciscoルータのプロキシ機能と多段構成する場合に必要。

--enable-linux-netfilter

透過プロキシを使う場合に必要。

--enable-follow-x-forwarded-for

X-Forwarded-For ヘッダを有効にする。

CFLAGS='-O2 -fPIE -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -Wall' \
LDFLAGS='-fPIE -pie -Wl,-z,relro -Wl,-z,now' \
CPPFLAGS='-D_FORTIFY_SOURCE=2' \
CXXFLAGS='-std=c++11 -O2 -fPIE -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security'

ここは(多少遅くなっても)セキュアなバイナリを生成するためのオプションになる。
http://d.hatena.ne.jp/yupo5656/20060625/p4を参考にしました。
大事なことなので1項目ずつメモっておく。

-fstack-protector
スタック破壊時にトレースしやすくなる

--ssp-buffer-size=4
4バイトを超えてスタック破壊したときに検出する

Wall
ワーニングはすべて表示する

Werro=format-security
format-securityはエラーとして表示する

-fPIE
-pie

Position Independent Executable。
プログラムをロードする際に毎回異なるアドレスにロードする。

-Wl,-z,relro
-Wl,-z,now

どちらもGOT overwrite attackを回避するための設定。
実行領域をReadonlyにする。

CPPFLAGS=-D_FORTIFY_SOURCE=2
不正実行防止のセキュリティ対策。
printfの書式に%nが指定されたときにエラーにする


ここからsquid 3.5特有の設定になります。

CC=gcc-4.8
CXX=g++-4.8

コンパイラにgcc4.8とg++4.8を使う。これは環境に合わせればいいと思うが
後述のとおりC++11/14がほぼ必須なので4.8以降を入れておいた方がいいのでは。

CXXFLAGS=-std=c++11

C++11を有効にする。
指定しないと、rockを初期化がassertion failedで失敗してしまう。
こんな感じ↓

$ sudo squid -z
----
2015/12/07 01:12:07| assertion failed: ../../src/ipc/AtomicWord.h:88: "Enabled()"
----
※当初ここで躓いてしまい、ものすごく時間が掛かってしまいました。

configure 小ねた

・ディレクトリへ移動して./configure --help でオプションの一覧とヘルプが表示できる。
squid -v でsquidのビルドオプションが表示できる。
----
Squid Cache: Version 3.5.12-20151128-r13959
Service Name: squid
configure options: '--prefix=/usr' '--localstatedir=/var' '--libexecdir=/lib/squid' '--datadir=/share/squid' '--sysconfdir=/etc/squid' '--with-default-user=proxy' '--with-logdir=/var/log/squid' '--with-pidfile=/var/run/squid.pid' '--enable-storeio=rock,aufs' '--with-large-files' '--with-build-environment=POSIX_V6_ILP32_OFFBIG' '--enable-inline' '--enable-async-io=8' '--enable-storeio=rock,ufs,aufs,diskd' '--enable-removal-policies=lru,heap' '--enable-delay-pools' '--enable-cache-digests' '--enable-underscores' '--enable-esi' '--enable-zph-qos' '--enable-wccpv2' '--enable-linux-netfilter' '--enable-follow-x-forwarded-for' 'CC=gcc-4.8' 'CXX=g++-4.8' 'CFLAGS=-O2 -fPIE -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -Wall' 'LDFLAGS=-fPIE -pie -Wl,-z,relro -Wl,-z,now' 'CPPFLAGS=-D_FORTIFY_SOURCE=2' 'CXXFLAGS=-std=c++11 -O2 -fPIE -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security' --enable-ltdl-convenience
----

squid 3.5.12-20151128-r13959 解説編Ⅰ(起動・設定)

squid2系から乗り換えたのでいろいろ変わっていて戸惑いました。戸惑ったところを解説。

(1) cossが無くなりrockになった

不安定なので・・・ということらしい。キャッシュファイルに互換性は無いので、キャッシュディレクトリごと再作成する必要がある。

(2) 起動するプロセス数が違う。マルチインスタンスやSMPを意識しなくても複数起動する

psコマンドで確認するとずいぶんたくさん起動する。

$ ps -ef|grep squid
root 29463 1 0 12月23 ? 00:00:00 /usr/sbin/squid -YC -f /etc/squid/squid.conf
proxy 29465 29463 0 12月23 ? 00:01:10 (squid-coord-3) -YC -f /etc/squid/squid.conf
proxy 29466 29463 0 12月23 ? 00:01:24 (squid-disk-2) -YC -f /etc/squid/squid.conf
proxy 29467 29463 0 12月23 ? 00:19:38 (squid-1) -YC -f /etc/squid/squid.conf

squid-1が今までのsquidに相当する。メモリとcache_dirのaufs担当。
squid-disk-2は、cache_dirのrock担当。
squid-coord-3は、コーディネーターと呼ばれるプロセス。

数字部分は、squid.confで ${process_number}に紐付く。
ログやキャッシュマネージャの出力ではkidXと表現される。

(3) プロセスが増えた分、ログも分けるのが吉

access.log,cache_logが1つでも動くことは動きます。しかしログローテーションするときプロセスの数だけローテーションするので、よくわからないことになります。例えば、今回のようにプロセスが4つあると、いきなりaccess.log.0,access.log.1,access.log.2,access.log.3の4つが出来てしまう。しかも同時にローテートしているので0バイト。事情がわからずバグかと思った。
なので、squid.confのログ名定義はプロセス番号を入れると良いと思う。

squid.conf
----
access_log /var/log/squid/access_${process_number}.log
cache_log /var/log/squid/cache_${process_number}.log
cache_swap_log /var/log/squid/cache_swap_${process_number}.log
----

(4) rockのチューニングは必要

http://wiki.squid-cache.org/Features/RockStoreに書いてあるけど、rockはチューニングしないとパフォーマンスが出ないらしい。

ディスクIOが間に合わないと取りこぼす。cache.logにこんなメッセージが出る。
----
2015/12/15 22:24:26 kid1| WARNING: abandoning 22 /mnt/jetflash2/squid/rock I/Os after at least 7.00s timeout
---
なので、そうならないように制限する。

max-swap-rateの目安
1秒当たりのスワップ数の平均IO回数の上限。
一般的には200、速いディスクなら300、それほど速くないディスクなら100が目安。

swap-timeoutの目安
スワップするときのIO待ちのms(ミリ秒)。あまり小さくするとタイムアウトしてディスクに書き込めないし、読み出せない。つまりキャッシュミスになる。逆に大きくしすぎるとHIT時の待ち時間が長くなる。
よくわからなければ、300くらいから始めてみる。

TranscendのJETFLASH750というUSBメモリを使っているが、以下設定だと1%程度のエラーが出る。
cache_dir rock /mnt/jetflash2/squid 8000 max-size=65536 max-swap-rate=320 swap-timeout=350

僕の環境ではmax-sizeを調整することも結構有効だった。512KBくらいまで上げるとエラーが1桁アップする。

結果はsquidclientコマンドで確認できる。
$ squidclient cachemgr mgr:store_io
----
Store IO Interface Stats
create.calls 17830
create.select_fail 75
create.create_fail 114
create.success 17641
----

(5) 起動時、disk-cacheとmem-cacheのよくわからないワーニングが出る

$ sudo grep -i warn cache_1*
----
2015/12/23 01:21:03 kid1| WARNING: disk-cache maximum object size is too large for mem-cache: 131072.00 KB > 32.00 KB
----
これは調べてみたけど、よくわからない。そのまま使っている。

とりあえずこんな感じかな。
次回は、解説編Ⅱ(ビルド)の予定。

最近のトラックバック

2017年4月
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            
フォト
無料ブログはココログ