centosでdirnameを実行すると、そんなコマンド無いよ!と怒られたのでメモ
※他のメンバーがOSインストールしたんだけど、baseだけしか入れてないのかな?
# dirname
dirname: missing operand
詳しくは `dirname –help’ を実行して下さい.
[code]
yum -y install coreutils.x86_64
[/code]
centosでdirnameを実行すると、そんなコマンド無いよ!と怒られたのでメモ
※他のメンバーがOSインストールしたんだけど、baseだけしか入れてないのかな?
# dirname
dirname: missing operand
詳しくは `dirname –help’ を実行して下さい.
[code]
yum -y install coreutils.x86_64
[/code]
先週、SQLServer on Linuxのpublic Public Previewが開始されたので、さっそく触ってみた。
[環境]
VirtualBOX上の CentOS7
CPU :2コア
メモリ: 4096MB ※3250MB以下は、インストール時にエラーが出ます。
インストールは、公開されているリポジトリを追加してyumコマンド叩くだけ!
非常に簡単!
[code]
# リポジトリ追加
curl https://packages.microsoft.com/config/rhel/7/mssql-server.repo > /etc/yum.repos.d/mssql-server.repo
curl https://packages.microsoft.com/config/rhel/7/prod.repo > /etc/yum.repos.d/msprod.repo
# インストール
yum -y install mssql-server mssql-tools
# 途中、ライセンス確認のチェックが入るので、大文字でYESと入力
Do you accept the license terms? (Enter YES or NO) YES
[/code]
インストールPATHは/opt配下。
[code]
ls -1 /opt/
microsoft → odbcドライバ
mssql → SQLServer
mssql-tools → bcpとsqlcmd
[/code]
続いて、初期セットアップを行う。
[code]
/opt/mssql/bin/sqlservr-setup
(中略)
Setting system administrator (SA) account password…
Do you wish to start the SQL Server service now? [y/n]: y
Do you wish to enable SQL Server to start on boot? [y/n]: y
Created symlink from /etc/systemd/system/multi-user.target.wants/mssql-server.service to /usr/lib/systemd/system/mssql-server.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/mssql-server-telemetry.service to /usr/lib/systemd/system/mssql-server-telemetry.service.
Setup completed successfully.
[/code]
セットアップスクリプトが動いたっぽい。
プロセスも動いている!
mssql 2257 1 2 18:37 ? 00:00:00 /opt/mssql/bin/sqlservr
mssql 2263 1 0 18:37 ? 00:00:00 /opt/mssql/bin/sqlservr-telemetry /var/opt/mssql/.system
mssql 2270 2257 43 18:37 ? 00:00:04 /opt/mssql/bin/sqlservr
ポートも空いている!
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:1433 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:1434 0.0.0.0:* LISTEN
tcp6 0 0 :::22 :::* LISTEN
最後にSSMSで接続してみます。
当然、Windows認証は使えませんが、セットアップ時に決めたSAのパスワードで接続する事が出来ました。
Versionは、
Microsoft SQL Server vNext (CTP1) – 14.0.1.246 (X64) Nov 1 2016 23:24:39 Copyright (c) Microsoft Corporation on Linux (CentOS Linux 7 (Core))
と出ているので、インストール自体は成功したようです。
基本的には上のリンク通りだがメモしておく。
Apache(RPM) + wordpressの構成
[code]
# 実行ファイルを置く場所 ※今回は/usr/bin
cd /usr/bin
# リポジトリ取得
git clone https://github.com/certbot/certbot
# インストール&設定 ※ 事前に80/tcpを落としておく
cd certbot
/usr/bin/certbot-auto certonly -a standalone -m メールアドレス -d www.jhhk-family.net –agree-tos –no-bootstrap
# ssl.conf修正
# 事前にssl.confを設定してたとして、Let’s Encryptに上書きされるので、もう一度修正。
vim /etc/httpd/conf.d/ssl.conf
<VirtualHost _default_:443>
DocumentRoot "/var/www/wordpress"
ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log
LogLevel warn
<Directory "/var/www/wordpress/">
Options FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</vertualhost>
# 最後にDocumentRoot直下の.htaccessに、rewriteの設定を追加し、HTTP接続をHTTPSにリダイレクトする
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off # 追加
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L] # 追加
RewriteBase /
RewriteRule ^index\.php$ – [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
[/code]
Let’s Encryptの有効期限が3ヶ月なので、crontagで毎月更新している人が多い。
00 16 * * 2 root /usr/bin/certbot-auto renew –post-hook “service httod restart”
CloudwatchをGrafana+Graphiteで見るようにしたら幸せになった件を見たらカッコよかったので試してみた
AWS上にt1.nanoインスタンス(Amazon Linux)を作成し、ここにgrafanaを入れてみる。
Redhat系とはいえ、初めてAmazon Linuxも触ったのでOSの設定も少し入っています。
まずはawscliをインストールする。
pythonのバージョンを確認したら、2.7.10だったので、pipは最初から入っていたが、
/usr/local/bin/pip にPATHが通って居なかったので、まずはPATHを通します。
修正が終わったらsource /root/.bash_profileを忘れずに。
次は、awscliのインストール。
で、やっとgrafanaのインストール。
grafanaはRPMで配っていたので、さくっと。
grafanaを起動する前に、awsのAPIに繋ぐ為の認証情報を設定する。
awscliの認証ファイルは、~/.aws/に保存されるがgrafanaの場合は/usr/share/grafana/.awsに同じファイルを複製してあげればいい。
ここまでやって、grafanaを起動。
初期ポートは3000
アカウント:admin
パスワード:admin
ログイン後、左上のアイコンをクリックし、DataSourceを選択。
CloudWatchを選択し、接続情報を設定する。
グラフの表示、並べ替えなどはもう少し勉強してから書きます。
apacheのmod_sslを後から追加しようとしたら、こんなエラーに遭遇
[code]
# /usr/local/apache2/bin/apxs -i -a -c -I/usr/local/openssl/include/openssl mod_ssl.c
/usr/local/apache-2.2.31/build/libtool –silent –mode=compile gcc -prefer-pic -DLINUX -D_REENTRANT -D_GNU_SOURCE -g -O2 -pthread -I/usr/local/apache-2.2.31/include -I/usr/local/apache-2.2.31/include -I/usr/local/apache-2.2.31/include -I/usr/local/openssl/include/openssl -c -o mod_ssl.lo mod_ssl.c && touch mod_ssl.slo
ssl_private.h:60 から include されたファイル中,
mod_ssl.c:27 から:
ssl_toolkit_compat.h:267:2: error: #error "Unrecognized SSL Toolkit!"
In file included from ssl_private.h:86,
from mod_ssl.c:27:
~中略~
ssl_private.h:644: error: declaration for parameter ‘ssl_init_Child’ but no such parameter
mod_ssl.c:572: error: expected ‘{‘ at end of input
apxs:Error: Command failed with rc=65536
[/code]
調べたら、そもそもopensslのソースインストールが失敗してた。
改めて、opensslのインストールをしたけど、こっちもエラーでインストールできない。
[code]
make[2]: Entering directory `/usr/local/src/openssl-1.0.2g’
[ -z "" ] || gcc -fPIC -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -Wa,–noexecstack -m64 -DL_ENDIAN -O3 -Wall -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -Iinclude \
-DFINGERPRINT_PREMAIN_DSO_LOAD -o fips_premain_dso \
fips_premain.c fipscanister.o \
libcrypto.a -ldl -lz
make[3]: Entering directory `/usr/local/src/openssl-1.0.2g’
make[4]: Entering directory `/usr/local/src/openssl-1.0.2g’
/usr/bin/ld: libcrypto.a(rsaz_exp.o): relocation R_X86_64_32 against `.rodata’ can not be used when making a shared object; recompile with -fPIC
libcrypto.a(rsaz_exp.o): could not read symbols: Bad value
collect2: ld returned 1 exit status
make[4]: *** [link_a.gnu] Error 1
make[4]: Leaving directory `/usr/local/src/openssl-1.0.2g’
make[3]: *** [do_linux-shared] Error 2
make[3]: Leaving directory `/usr/local/src/openssl-1.0.2g’
make[2]: *** [libcrypto.so.1.0.0] Error 2
make[2]: Leaving directory `/usr/local/src/openssl-1.0.2g’
make[1]: *** [shared] エラー 2
make[1]: ディレクトリ `/usr/local/src/openssl-1.0.2g/crypto’ から出ます
make: *** [build_crypto] エラー 1
[/code]
このエラーを解決するには、configオプションに、-fPICを付けてあげる
[code]
./config -fPIC –prefix=/usr/local/openssl-1.0.2g shared zlib
make
make install
[/code]
で、もう一度「/usr/local/apache2/bin/apxs -i -a -c -I/usr/local/openssl/include/openssl mod_ssl.c」を実行したけど、まだ同じエラーが出る。
ldconfigは実行済みなのに・・・
再度ググって、こちらのページを見つけた。元RX-7乗りの適当な日々
同じことやったら通った!
[code]
/usr/local/apache2/bin/apxs -c -i -a -D HAVE_OPENSSL=1 *.c -lcrypto -lssl
[/code]
mysqld.sockの場所をRPM標準の/var/lib/mysql/mysqld.sockから/tmp/mysqld.sockに変更したらmysqlが起動しなくなった件
/var/log/mysqld.logを見ると、
[code]
2016-04-27 19:04:34 19904 [ERROR] Can’t start server : Bind on unix socket: Permission denied
2016-04-27 19:04:34 19904 [ERROR] Do you already have another mysqld server running on socket: /tmp/mysql.sock ?
2016-04-27 19:04:34 19904 [ERROR] Aborting
[/code]が記録されていた。
Permission denied?
/tmpディレクトリのパーミッションも777なのに?
su -c “touch /tmp/mysql” mysql
でファイル作れるよ?
調べた結果、/var/log/audit/audit.logに以下のログを発見。
原因はselinuxだった。
[code]
type=AVC msg=audit(1461749417.909:7600470): avc: denied { module_request } for pid=22742 comm="mysqld" kmod="net-pf-10" scontext=unconfined_u:system_r:mysqld_t:s0 tcontext=system_u:system_r:kernel_t:s0 tclass=system
type=SYSCALL msg=audit(1461749417.909:7600470): arch=c000003e syscall=41 success=no exit=-97 a0=a a1=1 a2=0 a3=7fff608ad190 items=0 ppid=22480 pid=22742 auid=528 uid=27 gid=27 euid=27 suid=27 fsuid=27 egid=27 sgid=27 fsgid=27 tty=pts15 ses=695500 comm="mysqld" exe="/usr/sbin/mysqld" subj=unconfined_u:system_r:mysqld_t:s0 key=(null)
type=AVC msg=audit(1461749417.911:7600471): avc: denied { create } for pid=22742 comm="mysqld" name="mysql.sock" scontext=unconfined_u:system_r:mysqld_t:s0 tcontext=unconfined_u:object_r:tmp_t:s0 tclass=sock_file
type=SYSCALL msg=audit(1461749417.911:7600471): arch=c000003e syscall=49 success=no exit=-13 a0=c a1=7fff608ad1e0 a2=6e a3=0 items=0 ppid=22480 pid=22742 auid=528 uid=27 gid=27 euid=27 suid=27 fsuid=27 egid=27 sgid=27 fsgid=27 tty=pts15 ses=695500 comm="mysqld" exe="/usr/sbin/mysqld" subj=unconfined_u:system_r:mysqld_t:s0 key=(null)
type=AVC msg=audit(1461749433.190:7600472): avc: denied { module_request } for pid=24545 comm="mysqld" kmod="net-pf-10" scontext=unconfined_u:system_r:mysqld_t:s0 tcontext=system_u:system_r:kernel_t:s0 tclass=system
[/code]
setenforce 0を実行後、mysqldの起動が出来るようになった。
/etc/sysconfig/selinuxをみると、SELINUX=disabled
になっているので、誰かが手動で有効にしていたんだろう。
前回覚えたSQL Serverの条件分岐を使って、nagios/icinga用のSlowQuery監視スクリプトを書いてみた。
前提として、こちらを参考に、SlowQuery取得の設定が必要。
NRPE経由で監視する場合は、MAX_PACKETBUFFER_LENGTH等の値の変更をしたら幸せになれます。
[bash]
#!/bin/bash
CMDNAME=`basename $0`
while getopts h:u:p:c:w: OPT
do
case $OPT in
"h" ) FLG_H="TRUE" ; VALUE_H="$OPTARG" ;;
"u" ) FLG_U="TRUE" ; VALUE_U="$OPTARG" ;;
"p" ) FLG_P="TRUE" ; VALUE_P="$OPTARG" ;;
"w" ) FLG_W="TRUE" ; VALUE_W="$OPTARG" ;;
"c" ) FLG_C="TRUE" ; VALUE_C="$OPTARG" ;;
* ) echo "Usage: $CMDNAME [-h HOST_NAME] [-u User] [-p PASS] [-c warnning] [-c critical]" 1>&2
exit 1 ;;
esac
done
_HOST=$VALUE_H
_USER=$VALUE_U
_PASS=$VALUE_P
_WARN=$VALUE_W
_CRIT=$VALUE_C
# 何分前の以降に出たSLOW LOGを対象とする
_TIMESTAMP=’00:05′
#echo "$_HOST, $_USER, $_PASS, $_WARN, $_CRIT"
export ODBCINI=/etc/odbc.ini
export ODBCSYSINI=/etc
export FREETDSCONF=/etc/freetds/freetds.conf
# ここからT-SQL処理
TDSVER=8.0 /usr/local/freetds/bin/tsql -H $_HOST -p 1433 -U $_USER -P $_PASS << _EOF > /tmp/${_HOST}_slowlog.tmp
DECLARE @VERSION_FULL nvarchar(max);
DECLARE @VERSION int;
SET @VERSION_FULL = (SELECT convert (nvarchar(max),SERVERPROPERTY(‘productversion’)));
SET @VERSION = substring(@VERSION_FULL, 1, 2)
DECLARE @DATE VARCHAR(16);
SET @DATE = (select CONVERT(VARCHAR,GETDATE()-‘$_TIMESTAMP’,120));
IF @VERSION = 10
BEGIN
SELECT REPLACE((
SELECT
DATEADD(hour,9 , CAST(event_data as XML).value(‘(/event/@timestamp)[1]’, ‘datetime’)) AS timestamp,
DB_NAME(CAST(event_data as XML).value(‘(/event/action[@name="database_id"]/value)[1]’, ‘sysname’)) AS database_name,
CAST(event_data as XML).value(‘(/event/action[@name="sql_text"]/value)[1]’, ‘nvarchar(max)’) AS sql_text,
CAST(event_data as XML).value(‘(/event/data[@name="duration"]/value)[1]’, ‘bigint’) AS duration,
CAST(event_data as XML).value(‘(/event/data[@name="cpu"]/value)[1]’, ‘bigint’) AS cpu_time
FOR XML PATH (”)), ‘ ‘, ‘ ‘) AS RESULT
from sys.fn_xe_file_target_read_file(
‘C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Log\Highload_Query*.xel’,
‘C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Log\Highload_Query*.xem’ ,
NULL,
NULL)
where DATEADD(hour,9 , CAST(event_data as XML).value(‘(/event/@timestamp)[1]’, ‘datetime’)) >= @DATE
END
ELSE
BEGIN
IF @VERSION = 11
BEGIN
SELECT
DATEADD(hour,9 , CAST(event_data as XML).value(‘(/event/@timestamp)[1]’, ‘datetime’)) AS timestamp,
DB_NAME(CAST(event_data as XML).value(‘(/event/action[@name="database_id"]/value)[1]’, ‘sysname’)) AS database_name,
CAST(event_data as XML).value(‘(/event/data[@name="batch_text"]/value)[1]’, ‘nvarchar(max)’) AS batch_textt,
CAST(event_data as XML).value(‘(/event/data[@name="duration"]/value)[1]’, ‘bigint’) AS duration,
CAST(event_data as XML).value(‘(/event/data[@name="cpu_time"]/value)[1]’, ‘bigint’) AS cpu_time
from sys.fn_xe_file_target_read_file(
‘C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Log\Highload_Query*.xel’,
NULL,
NULL,
NULL)
where DATEADD(hour,9 , CAST(event_data as XML).value(‘(/event/@timestamp)[1]’, ‘datetime’)) >= @DATE;
END;
GO
quit
_EOF
IFS_BACKUP=$IFS
IFS=$’\n’
_TIME=(`cat /tmp/${_HOST}_slowlog.tmp | sed -n -e ‘s/.*\(.*\)<\/timestamp>.*/"\1"/p’`)
_DBNAME=(`cat /tmp/${_HOST}_slowlog.tmp | sed -n -e ‘s/.*\(.*\)<\/database_name>.*/"\1"/p’`)
_CPUTIME=(`cat /tmp/${_HOST}_slowlog.tmp |sed -n -e ‘s/.*\(.*\)<\/cpu_time>.*/"\1"/p’`)
_DURATION=(`cat /tmp/${_HOST}_slowlog.tmp | sed -n -e ‘s/.*\(.*\)<\/duration>.*/"\1"/p’`)
_QUERY=(`cat /tmp/${_HOST}_slowlog.tmp | tr ‘\n’ ‘ ‘| sed -e ‘s/<\/cpu_time>/<\/cpu_time>\n/g’| sed -n -e ‘s/.*\(.*\)<\/sql_text>.*/"\1"\n/p’`)
func_message (){
for (( i=0; $i<`echo ${#_TIME[@]}`; i++ ));
do
echo "———-"
echo "TIME: ${_TIME[$i]}"
echo "DBNAME: ${_DBNAME[$i]}"
echo "CPU_TIME: ${_CPUTIME[$i]} ms"
echo "DURATION: ${_DURATION[$i]} us"
echo "${_QUERY[$i]}"
done
IFS=$IFS_BACKUP
}
# check
if [ $_CRIT -le `echo ${#_TIME[@]}` ]
then
echo "CRIT: SlowQuery is `echo ${#_TIME[@]}` | SlowQuerys=`echo ${#_TIME[@]}`;$_WARN;$_CRIT"
func_message
exit 2
elif [ $_WARN -le `echo ${#_TIME[@]}` ]
then
echo "WARN: SlowQuery is `echo ${#_TIME[@]}` | SlowQuerys=`echo ${#_TIME[@]}`;$_WARN;$_CRIT"
func_message
exit 1
elif [ $_WARN -gt `echo ${#_TIME[@]}` ]
then
echo "OK: SlowQuery is `echo ${#_TIME[@]}` | SlowQuerys=`echo ${#_TIME[@]}`;$_WARN;$_CRIT"
exit 0
else
echo "status unknown"
exit 3
fi
[/bash]
使い方
./check_sqlserver_slowquery -h ホスト名orIPアドレス -u ユーザー名 -p パスワード -w ワーニング閾値 -c クリティカル閾値
閾値以下の場合は
OK: SlowQuery is 0 | SlowQuerys=0;3;4
とか表示される。
閾値以上の場合は
CRIT: SlowQuery is 6 | SlowQuerys=6;3;4
———-
TIME: “2016-01-08T10:42:00.427”
DBNAME: “hoge”
CPU_TIME: “3932” ms
DURATION: “4011259” us
“~~遅いクエリ~~”
———-
TIME: “2016-01-08T10:42:07.283”
DBNAME: “hoge”
CPU_TIME: “4431” ms
DURATION: “4481414” us
“~~遅いクエリ~~”
等が表示されます。
29日の18:00ぐらいから、CentOS7のVPSサーバーに繋がらなくなった。
再起動しても、5分ぐらい経つとSSHでの接続もタイムアウトになる。
プロセスを見てみると、/tmp/javeってのがCPUリソース食いまくってるのみたい。
[root@jhhk-family bin]# ps -auxf
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
(中略)
root 513 67.8 0.0 107076 1064 ? Ssl 18:46 2:52 /tmp/jave
netstatはこんな感じ
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name Timer
tcp 0 55 182.163.72.51:59867 23.228.105.6:25000 ESTABLISHED 17759/jave on (0.20/0/0)
pkillしても、すぐに上がってくるからKernel関係のプロセス?と思ったけど、ググッてもそんな情報無いし、とりあえず止めてもサービスには影響は無かったのでcrondで毎分pkill投げてる。
botとかで踏まれてる可能性もあるから、iptablesは固くした。
時間見てちゃんと調べよう。
14:27追記
以下の事をやられていたので、追加で対策。
1)/root/.ssh/の公開鍵のtimestampが変わっている
作業用でrootログインを許可して鍵認証していたけど、authorized_keyの
timestampが昨日になっていた。
SSHのログインを禁止して、authorized_keyを削除
2)/tmp/色々のパーミッション変更
不正な実行ファイルは/tmp/javeだけど、/tmp下に関連しそうなファイルがあった。
———- 1 root root 73 12月 30 13:36 conf.n
———- 1 root root 5 12月 30 13:36 gates.lod
———- 1 root root 1223123 12月 30 14:32 jave
———- 1 root root 5 12月 30 13:36 moni.lod
javeと同様、単純に消しちゃうと再作成された為、全てのパーミッションを取り除く。
※ 上記の不正なファイル関連は、ファイルの存在のみ見ているみたいだったので、
パーミッション変更後にpkill /tmp/javeとすると、2度とjaveは起動しなくなった。
でも、root取られていたので他にも悪さしている箇所があるかも。
ログも信用出来なくなったので、年明けに再構築しないと、、、
今日知ったこと。
awkはよく使うけど、後ろからn番目を指定する方法があることを知ったのでメモ。
cat access.log
[10/Jun/2015:23:01:04 +0900] "POST /hoge?a=12345 HTTP/1.1" 200 2597 2832 "-" "Mozilla/5.0 (Linux; U; Android 2.3.7; ja-jp; SonyEricssonSO-03D Build/6.0.A.5.14)" "yyy.yyy.yyy.yyy" "0.000"
[10/Jun/2015:23:02:04 +0900] "GET /hoge.jpg HTTP/1.1" 200 2597 2832 "-" "Mozilla/5.0 (iPhone; CPU iPhone OS 8_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12F70 Safari/600.1.4)" "xxx.xxx.xxx.xxx" "0.000"
ここから、IPアドレスの部分”yyy.yyy.yyy.yyy”を抜きたい場合とか、
awk '{print $(NF - 2)}' access.log
とすれば良い。
ただ、CentOS6系では使えて、CentOS7系では
コマンドライン:1: (FILENAME=a.txt FNR=1) 致命的: フィールド -2 へのアクセスの試みです
とエラーが出る。
後で調べておこう。
覚え書き。
cron等でユーザー認証があるFTPに接続を行う場合に、ユーザー認証の応答を自動化する方法。
~/.netrcを作成し、以下の内容を記載する。
[bash]
<script class="brush:bash;" type="syntaxhighlighter" title="~/.netrc"><![CDATA[
machine FTPホスト
login ユーザー名
password パスワード
[/bash]