2015年7月1日

NginxからRedisのsocketにアクセスする方法

※注意 親フォルダのアクセス権にも留意して下さい。

各設定値は、サンプルです。
また、手順の一部を省略している場合があります。

サンプルは、デフォルト値に近い設定になっていると思いますが、
手元の環境は、かなりカスタマイズしてありますので、
ファイル名等が標準と異なる場合があります。
適宜読み替えて下さい。

このサンプルでは、
nginx master: root:root
nginx worker: nginx:nginx
redis-server: root:redis
ソケットファイル: /tmp/redis/redis.sock
で動作させる事を想定しています。

redis-serverは、デフォルトでは、root:rootで動作しますので、
(特にuidも変更する場合など) 設定内容に応じて、
関連するディレクトリのアクセス権も変更する必要があります。

---

1.redisの設定ファイル(conf)の変更


1.1.ソケットを生成する場所の設定
※/tmp以外の場所に作ることをお勧めします。
unixsocket /tmp/redis/redis.sock

/tmpの直下に置くとアクセス権を制限しにくいので、
ソケットを生成する場所は、redisディレクトリの中とします。

※/tmpの中にディレクトリを作った場合は、
再起動後に消されていないか確認しましょう。
(大抵は消える設定になっていると思いますので・・)

※/tmp以外の場所に作る場合は、ソケットの消え残りに
注意しましょう。redisが異常終了した場合は、
ソケットファイルが残される場合があります。


1.2.ソケットのアクセス権の設定
unixsocketperm 060

デフォルトでは、700などになっていると思います。
nginxとredisが、redisグループのアクセス権で通信するので、
これで十分なはずです。


2.redis用のグループの作成、nginxグループにアクセス権の設定

※他で使わないグループを設定して下さい。
 また、ここで設定するグループは、(以降の設定内容に応じて)
 dumpファイル(*.rdb、*.aof)や、 logファイルなどの所有権にも
 影響しますので、注意して下さい。

2.1.redisグループを追加
groupadd redis

2.2.アクセス権の追加
/etc/group を編集します。
nginxグループに、redisグループへのアクセス権を与えます。
redis: (略) :nginx

設定を確認します。
groups nginx
表示例:
nginx : nginx redis

※注意: 表示が、"nginx : nginx" となっていた場合は、誤って、
redisグループに、nginxグループへのアクセス権を与えていないか、
/etc/groupを見直しましょう。


3.ディレクトリ、ファイルのアクセス権などの設定


3.1.redis-serverを、redisグループで動作させるための設定
chgrp redis redis-server
chmod g+sx redis-server

設定結果の例:
dr-x------ root root redis/bin
-r-x--s--- root redis redis/bin/redis-server

※安全を考慮して、親ディレクトリのアクセス権も絞ってあります。

-r-s--s--- redis redis redis/bin/redis-server
とした場合も、親ディレクトリは、500 root:rootのままで動作可能です。
(呼び出し側の起動スクリプトは、root:rootで動作していると思いますので。)
ただし、この場合は、redisユーザで動作することになるので、
関連するディレクトリやファイル(設定ファイル、AOF、rdb、ログ)などの
アクセス権に注意して下さい。
(設定を忘れると、13: Permission denied などの原因になります。)


3.2.ソケット用フォルダのアクセス権の変更

chgrp redis /tmp/redis
chmod g+rx /tmp/redis

設定結果の例:
drwxr-x--- root redis /tmp/redis


4.設定結果の確認

・redis、nginxを起動してみます。
・ログを確認します。
・実行中にソケット、pidファイルが生成されることを確認します。
・終了後にソケット、pidファイルが消去されることを確認します。
・dumpファイル(*.rdb、*.aof)が、設定に応じて生成されることを確認します。
※各ファイルのユーザ、グループ、アクセス権も確認した方がよいと思います。
(必要に応じて、親ディレクトリのアクセス権も制限した方がよいと思いますので。)

ソケットファイルのアクセス権の例:
root redis s---rw---- redis.sock=

2015年6月12日

IPv6で、fe80にping

IPv6で、fe80::/10のアドレス(リンクローカル・ユニキャスト・アドレス)にpingする場合。

Linuxの場合:
-I (interface)を付けて実行します。
ping6 -I eth0 fe80:(略)
-I オプションを指定しない場合は、"connect: Invalid argument"などが発生します。

----
注:ローカルからのPINGに応答するためには、PINGのRequest/Replyの他に、近隣探索(Neighbor Discovery)も有効にしておく必要があります。

PINGを受ける側で(最低限)必要なのは
IN: 128 (PING 要求)
OUT: 129 (PING 応答)

IN: 135 (近隣要請 (Neighbor solicitation))
OUT: 136 (近隣広告 (Neighbor advertisement))
です。
(135/136は、MACアドレスの要求/送信などに利用されます。)

参考:IPv6 Neighbor Discovery

----
グローバルアドレスへのpingの場合は、-I オプションを付けなくても大丈夫です。
例:(注:IPv6専用のアドレスです)
ping6 ipv6.google.com
※グローバルアドレスと通信する場合は、
(インターネットに直結している場合は) ifconfigで、eth0などに
inet6 (略) <global>のアドレスが表示されている必要があります。

Windowsの場合は、「ローカルエリア接続の状態」で、
「IPv6 接続」が「インターネット」と表示されている必要があります。

----
Windowsの場合:(Windows7の場合)

ping -6 fe80:(略)
を実行します。

----
hostsを使う場合は、インターフェイスID (10や11などの数字)も必要です。
hostsの例:
fe80:(略)%10 hostname
(アドレス)%(インターフェイスID) (ホスト名)

ping -6 hostname
※hostsで%(インターフェイスID)を付けていない場合は、
ping 要求ではホスト hostname が見つかりませんでした。ホスト名を確認してもう一度実行してください。
などが表示されます。

----
インターフェイスIDの探し方。

使用するインターフェイスを確認します。
netsh interface ipv6 show interface
名前欄が「ローカル エリア接続」などになっているインターフェイスの、Idx欄が、インターフェイスIDです。

代替コマンド
route -6 print
インターフェィス一覧や、ルートテーブルから、インターフェイスIDを探します。


----
補足:
ICMPv4とv6では、Type番号が異なります。

Type番号(一部)

v4の場合:
3: 宛先到達不能
8: エコー要求
0: エコー応答

v6の場合:
0-127:エラー
128-255:メッセージ

1: 宛先到達不能
128: エコー要求
129: エコー応答

参考:
ICMPv6 パケット タイプとコード

2015年6月4日

IPv6で、route add

addとdelが、非対称な動作をしていて悩ましいので、メモ。
/etc/sysconfig/ なんてフォルダはありません、というディストリビューション用に。


GW_ADDRは、ゲートウェイのアドレスです。
適宜読み替えて下さい。

事前の準備-> IPv6で、NICにアドレスを設定する方法

デフォルトゲートウェイを設定する場合(route add)


動く:
route -A inet6 add default gw GW_ADDR metric 1 dev eth0

確認用のコマンド:
route -6

表示例:
Destination Next Hop (略) If
::/0 GW_ADDR (略) eth0
::/0 :: (略) lo

※ IPv6の場合は、自動的に作成されるアドレスもあるので、
表示はもっと長いです。

※ 表示に時間がかかる場合は、route コマンドに -n を付けて実行してみましょう。
時間がかかる場合は、おそらく、名前解決に時間がかかっているので。
(DNSの設定次第だと思いますが、強引に、Ctrl+Cで止めて、再度routeコマンドを実行すると表示される場合もあります。)


---
動かない:
route -A inet6 add default gw GW_ADDR metric 1
SIOCADDRT: Invalid argument が表示されます。
デバイス名を指定しないと、動かないようです。

確認用のコマンド:
route -6

表示例:
Destination Next Hop (略) If
::/0 :: (略) lo


デフォルトゲートウェイを削除する場合(route del)


(デバイス毎に実行しなくても)大丈夫: ※dev eth0などの指定も可能です
route -A inet6 del default

確認用のコマンド:
route -6

表示例 (route delの実行前):
Destination Next Hop (略) If
::/0 GW_ADDR (略) eth0
::/0 :: (略) lo

表示例 (route delの実行後):
Destination Next Hop (略) If
::/0 :: (略) lo

---
注意:
(消そうとしている)ルートが存在しない場合に、route delをすると、
SIOCDELRT: No such process が表示されます。

IPv6で、NICにアドレスを設定する方法

設定ファイルを探してみても、IPv6関連のファイルが無いっ!という時のために。
※設定が無ければ作ればいいと思うの!というディストリビューション用。
※カーネルをIPv6のサポートありでビルドしてある事が前提です。

---
デフォルトルートの設定 -> IPv6で、route add

---
NICにIPv6のアドレスを固定で割り当てるには・・・
(ifconfigで一時的に割り当てるのでなく、起動後も設定を残したい場合。)
  1. 設定ファイルを作ります。(内容は、NIC用のアドレス/プレフィックス長とゲートウェイのアドレス)
  2. 設定を読み込むスクリプトを作ります。(今回は、rc.inet1を改造)

設定ファイルを作ります


rc.inet1.confには、IP4の設定しか入っていないと思います。
(rc.inet1の先頭で読み込まれます。)

IPV6用の設定ファイルを、作りましょう。
(rc.inet1.confの中に書いてもよいですが、分けておいたほうが無難です。)
今回は、ファイル名を"rc.inet1_v6.conf"にしてみました。

IPv6用に分かりやすい名前の変数を作りましょう。
必要なのは、NICに割り当てるアドレス/プレフィックス長と、ゲートウェイのアドレスです。

---
例: rc.inet1_v6.conf
※ ファイル名、変数名は独自に決めたものです。
※ rc.inet1.confを流用して作っています。

# eth0
IPADDR_V6[0]="アドレス/プレフィックス長"

# eth1
IPADDR_V6[1]=""

# eth2
IPADDR_V6[2]=""

# Gateway
GATEWAY_V6="ゲートウェイのアドレス"


設定を読み込むスクリプトを作ります

今回は、rc.inet1を改造します。

---
例: rc.inet1
※ かなり省略しています。

# 設定を取り込みます。
. /etc/rc.d/rc.inet1.conf
. /etc/rc.d/rc.inet1_v6.conf

# (略)

# ("IPADDR"で検索して、改造したい部分を見つけます)
# IPv4
if [ ! "${IPADDR[$i]}" = "" ]; then
  (略)
fi
# IPv6 (IPv4用のコードをコピーして改造します)
if [ ! "${IPADDR_V6[$i]}" = "" ]; then
  /sbin/ifconfig ${1} add ${IPADDR_V6[$i]}
  # ゲートウェイはデバイス毎に設定しないとrouteコマンドが動かないので、
  # gateway_up()からコピーして改造します。
  if [ ! "$GATEWAY_V6" = "" ]; then
    /sbin/route -A inet6 add default gw ${GATEWAY_V6} metric 1 dev ${1}
  fi
fi

# ("GATEWAY"で検索して、改造したい部分を見つけます)
# gateway_down() からコピーして改造します。
gateway_down_v6() {
  if /sbin/route -6 -n | grep "^::/0" 1> /dev/null ; then
    # 各デバイスに設定したデフォルトゲートウェイを消します。(個別に消さなくても大丈夫)
    /sbin/route -A inet6 del default
  fi  
}

試します。

最初に、ネットワークの停止を試します。(書き間違いなどでエラーが発生しないか確認したいので、起動より停止の方が安全。)
※ネットワーク経由で作業している時は、接続が切れます。要注意。
./rc.inet1 down

設定値を確認します。
例:
ifconfig
ifconfig -a
route
route -6
※不要なアドレスが設定されていないか確認します。
※NICがダウンしたか確認します。
※不要なルートが設定されていないか確認します。


ネットワークを開始してみます。
./rc.inet1 up

設定値を確認します。
(略)
※IPv6アドレスが正しく設定されたか確認します。
※想定どおりにNICがUPしたか確認します。
※デフォルトルートが正しく設定されたか確認します。


もう一度、ネットワークを停止してみます。
./rc.inet1 down

設定値を確認します。
(略)
※不要なルートが残っていないか確認します。

あとは、お好みで。


---
注意:
ケーブルが接続されていない場合などは、不要なルートができたり、消せなくなったりする場合があります。
(アドレスが見つからない などのエラーメッセージがでる場合も。)

アドレスが重複した場合は、
SIOCSIFADDR: File exists
などが表示されます。

note - what is "BIOS INT 13h AX=4C00h" ? mentioned in ISOLINUX wiki

This is a translation of my page ノート 「BIOS INT 13h AX=4C00h」について - SYSLINUX、ElToritoBoot 関連の話題

---
From SYSLINUX wiki - Can I boot other operating systems with ISOLINUX?
Starting in version 1.65, ISOLINUX supports booting disk images of other operating systems. However, this feature depends on BIOS functionality which is apparently broken in a very large number of BIOSes.
...
please complain to your vendor and indicate that "BIOS INT 13h AX=4C00h fails". Note that you can use MEMDISK as a recommended alternative;

What "BIOS INT 13h AX=4C00h" mean?

The answer is "ElToritoBoot".
El torito boot is used for bootable DVD, etc.

---
syslinux/syslinux.git - path: root/memdisk/memdisk.inc

Int13Funcs
...
%if ELTORITO ; EDD El Torito Functions
; ELTORITO _must_ also have EDD
dw ElToritoEmulate ; 4Ah - Initiate Disk Emulation
dw ElToritoTerminate ; 4Bh - Terminate Disk Emulation
dw ElToritoBoot ; 4Ch - Initiate Disk Emu. and Reboot
dw ElToritoCatalog ; 4Dh - Return Boot Catalog
%endif ; ELTORITO

ノート 「BIOS INT 13h AX=4C00h」について - SYSLINUX、ElToritoBoot 関連の話題

(EN) -> note - what is "BIOS INT 13h AX=4C00h" ? mentioned in ISOLINUX wiki

ISOLINUXのwikiで、
if you find that it doesn't work, please complain to your vendor and indicate that "BIOS INT 13h AX=4C00h fails"
訳:うまく動かなかったら、(BIOSの)ベンダに、"BIOS INT 13h AX=4C00h"が動作していないと伝えてね!
と書いてありますが、これは何かというと・・・

syslinux/syslinux.git - path: root/memdisk/memdisk.inc
Int13Funcs
...
%if ELTORITO ; EDD El Torito Functions
; ELTORITO _must_ also have EDD
dw ElToritoEmulate ; 4Ah - Initiate Disk Emulation
dw ElToritoTerminate ; 4Bh - Terminate Disk Emulation
dw ElToritoBoot ; 4Ch - Initiate Disk Emu. and Reboot
dw ElToritoCatalog ; 4Dh - Return Boot Catalog
%endif ; ELTORITO
※AHレジスタの値だけ書いてあります。(AX=4C00hなので、AH=4Ch)

ElToritoBootの事でした。
これは、起動用DVDなどで使われています。

QEMU (Bochs BIOS 2.4) で、Linuxのセットアップ用DVDが起動できなかったのも、
このあたりの問題かな・・と。

補足:
Note: In Syslinux 4.05, the .img support has been removed from ISOLINUX.
とあるので、4.xxのツリーを参照しました。

参考:
HOW TO MAKE A BOOTABLE SLACKWARE DVD ISO IMAGE

man mkisofs
-b eltorito_boot_image
-c boot_catalog

2015年6月3日

Kernel Panic not syncing (intel_pmu_init or intel_rapl) under QEMU - Reason and HowTo

This is a translation of my page "QEMU環境で、Kernel Panic not syncing が発生する場合の対処法 (確定) "
(summarized)

[What happens]

Kernel Panic - not syncing: Attempted to kill init!
is displayed in boot time.

intel_pmu_init
or
intel_rapl
also displayed in trace.


QEMU Standard PC (i440FX + PIIX, 1996), BIOS Bochs 01/01/2011
in dmesg.


Environment:
QEMU guest. Bochs BIOS <= 2.4.x
Processor: >= Sandy Bridge

[Why it happens]
Bochs BIOS 2.4.x is "before" Sandy Bridge BIOS.
February 22, 2011: Bochs 2.4.6
(from Bochs News)


Sandy Bridge is released April 2011 (Xeon E3-1200 family), March 2012 (E5-2600 faimly).
(from Wiki "Xeon")

So, some features after Sandy Brige are not implemented.

[How to resolve]
Do NOT use features after SandyBridge.
Disable them in config and compile kernel.

Disable Intel P-state
CONFIG_X86_INTEL_PSTATE=n

Disable Intel RAPL
CONFIG_INTEL_RAPL=n