SSブログ

CentOS 6.8へのアップデート後のshutdownでblkdeactivateがエラーを発生する件のその後 [CentOS]

1. 発生事象


shutdown 時に /sbin/blkdeactivate のエラーが発生する。
http://dan-project.blog.so-net.ne.jp/2016-07-05


2. 対処方法


下記のパッケージへの更新を行う。

device-mapper-1.02.117-7.el6_8.1.i686
device-mapper-event-1.02.117-7.el6_8.1.i686
device-mapper-event-libs-1.02.117-7.el6_8.1.i686
device-mapper-libs-1.02.117-7.el6_8.1.i686
lvm2-2.02.143-7.el6_8.1.i686
lvm2-libs-2.02.143-7.el6_8.1.i686



cronとanacronの連携 [Linux]

Linux のジョブスケジューリングは、cron と anacron の連携により行われている。
これまで、断片的に調べたことはあったが、連携という観点で調べたことはなかった。
以下は、連携という観点で調査した結果を備忘録としてまとめたものである。

1. 機能の特徴


(1) cron


・管理用の常駐プロセス(crond) が存在する。
・ジョブを実行する日時を正確に指定できる(最小単位は分)。
・同じジョブを 1 日に複数回実行することができる。
・ユーザー毎に設定ファイルを作成できる。

(制限事項)
・(OS 停止中等により)実行できなかったジョブは再実行されない。
・同じ設定ファイルを複数のノードで使用した場合、問題が発生することがある。
 (複数ノードで同時にジョブが実行され、共有リソースが高負荷となる、等。)


(2) anacron


・管理用の常駐プロセスはなく、必要な時に anacron コマンドを実行する。
・ジョブの実施間隔(日数)、実行する時間帯を指定する。
・(OS 停止中等により)実行できなかったジョブの再実行を試みる。
・同じ設定ファイルを複数のノードで使用しても、問題は発生しない。
 (実行時刻の決定に乱数を使用するため、共有リソースへの負荷の集中がない。)

(制限事項)
・ジョブを実行する日時を厳密に指定することはできない。
・設定ファイルの同じエントリは、1 日 1 回しか実行できない。
・root しか設定ファイルを作成できない。


2. 設定ファイル


(1) cron


・/etc/crontab
・/etc/cron.d/*
・/var/spool/cron/* ... ユーザー毎の設定ファイル


(2) anacron


・/etc/anacrontab
・/etc/cron.{daily,weekly,monthly}/*


3. cron と anacron の連携

3-1. CentOS 6、CentOS 7 の場合


(1) anacron の起動


下記の順序で、cron から anacron が起動される。

(a) /etc/cron.d/0hourly

毎時 01 分に /etc/cron.hourly/* を実行する。


(b) /etc/cron.hourly/0anacron

'/usr/sbin/anacron -s' を実行する。


ただし、同日に anacron が実行済の場合には、実行しない。
(/var/spool/anacron/cron.daily に直近の実行日を保存している。)


(2) /etc/cron.{daily,weekly,monthly}/* の実行


(a) /etc/anacron


/usr/sbin/anacron により、設定されているジョブが実行される。

(例)
# These replace cron's entries
1          5  cron.daily    run-parts --report /etc/cron.daily
7         10  cron.weekly   run-parts --report /etc/cron.weekly
@monthly  15  cron.monthly  run-parts --report /etc/cron.monthly

3-2. Debian 7、Debian 8 の場合


anacron がインストールされている場合には、下記のようになる。
インストールされていない場合には、cron のみでの対応となる。
(/etc/cron.{daily,weekly,monthly}/* は、/etc/crontab から実行される。)

(1) anacron の起動


下記の順序で、cron から anacron が起動される。

(a) /etc/cron.d/0anacron

07:30 に '/etc/init.d/anacron start' を実行する。


(b) /etc/init.d/anacron

'/usr/sbin/anacron -s' を実行する。


ただし、同日に anacron が実行済の場合には、実行しないと思われる。
(/var/spool/anacron/cron.daily に直近の実行日を保存している。)

(補足)
上記以外に、/etc/init.d/anacron は、ランレベル2〜5 で自動起動される。


(2) /etc/cron.{daily,weekly,monthly}/* の実行


(a) /etc/anacron


/usr/sbin/anacron により、設定されているジョブが実行される。

(例)
# These replace cron's entries
1          5  cron.daily    run-parts --report /etc/cron.daily
7         10  cron.weekly   run-parts --report /etc/cron.weekly
@monthly  15  cron.monthly  run-parts --report /etc/cron.monthly

4. 備考


(1) anacron でのジョブの実行時刻の決定方法 (CentOS 6、CentOS 7 の場合)


/etc/anacrontab の設定値を参照し、下記の手順により決定される。

(a) ジョブの実行が許可された時間帯かどうかの判断


START_HOURS_RANGE に指定された時間帯の場合のみ、処理を継続する。

(例)
START_HOURS_RANGE=3-22


(補足)
未指定の場合には、すべての時間帯で実行可能となると思われる。
(Debian 7/8 では未指定であるが、実行できているため。)


(b) 遅延時間(分単位)の算出


(b-1) エントリ共通の遅延時間の算出


指定されている最大値以下で遅延時間をランダムに算出する。
(最大値: RANDOM_DELAY に指定されている値)
未指定の場合には、0 とする。

(例)
RANDOM_DELAY=45


(b-2) エントリ毎の遅延時間の算出


指定されている遅延時間を取得する。
(各エントリの第 2 項目で指定されている。)


(b-3) エントリ共通/エントリ毎の遅延時間の和を求める。


(c) ジョブの実行時刻の算出


現在時刻に遅延時間を加算した時刻をジョブの実行時刻とする。



Web Pageへのアクセス時のPHPのエラーログへの対応 [CentOS]

久しぶりに CentOS 6 の Apache 上に構築した Web サイトの Web Page (PHP で作成) にアクセスしたところ、エラーログが出力されるようになってしまった。以前には発生していなかったため、原因の調査と対応を行った。
詳細は、以下の通りである。

[ソフトウェアのバージョン]
・httpd-2.2.15-54.el6.centos.i686
・php-pdo-5.3.3-48.el6_8.i686

1. エラーログの内容


下記の 2 種類に大別される。

(1) 未定義の配列要素の参照に関するもの

PHP Notice: Undefined index: xxx in yyy.php on line zzz, referer: http:...


・xxx: 連想配列のキー
・yyy: ソースファイルのパス(拡張子を除く)
・zzz: 当該箇所の行番号

(補足)
下記のような箇所で発生する。

$width = $_GET['width'];
$client = $_SERVER['HTTP_CLIENT_IP'];


(2) タイムゾーンの設定に関するもの

PHP Warning: xxx(): It is not safe to rely on the system's timezone
settings. You are *required* to use the date.timezone setting or the
date_default_timezone_set() function. ...

2. 対応


いずれも深刻なエラーではなく、notice または warning レベルの事象である。
よって、ソースの変更ではなく、これらの事象に関するログ出力を抑制することにする。

(1) エラーログ (1) への対応


/etc/php.ini の error_reporting の設定値を変更する。

(旧) error_reporting = E_ALL & ~E_DEPRECATED    ... (注1)
(新) error_reporting = E_ALL & ~E_NOTICE    ... (注2)


(注1) 運用時の推奨値(インストール直後の /etc/php.ini での設定値)
(注2) デフォルト値(未設定時に採用される値)

(補足)
ソースを変更する場合には、当該部分を下記のように変更する。

$width = isset($_GET['width']) ? $_GET['width'] : '';
$client = isset($_SERVER['HTTP_CLIENT_IP']) ? $_SERVER['HTTP_CLIENT_IP'] : '';


(2) エラーログ (2) への対応


/etc/php.ini の date.timezone を設定する。

(旧) 未設定(インストール直後の /etc/php.ini での設定状況)
(新) date.timezone = Asia/Tokyo

3. 備考


PHP のバージョンアップに時に、デフォルト値の変更、または設定ファイルの更新漏れが発生したものと思われる。



TomcatのUnit設定ファイルの更新 [CentOS]

Tomcat の Unit 設定ファイルの更新を行った。
詳細は、以下の通りである。

1. 現在の Unit 設定ファイル


http://dan-project.blog.so-net.ne.jp/2016-08-16


2. 更新内容


・PID ファイルのパスの変更 (/var/run/tomcat/tomcat.pid への変更)
・Unit の説明の変更、コメントの追加


3. 実施手順


Tomcat を停止した状態で、以下の手順を実施する。

(1) systemd-tmpfiles の設定


下記の内容で /etc/tmpfiles.d/tomcat.conf を作成する。

d /var/run/tomcat 0755 tomcat tomcat -


(補足)
ブート時に当該ディレクトリが作成される。


(2) /var/run/tomcat の作成


リブート、または下記の手順を実施し、当該ディレクトリを作成する。

# cd /var/run
# mkdir tomcat
# chown tomcat.tomcat tomcat
# chmod 755 tomcat


(3) Unit 設定ファイルの更新

# diff tomcat.service tomcat.service.old 
1,5d0
< # Systemd unit file for Apache Tomcat (on CentOS 7)
< #
< # /var/run/tomcat is created by systemd-tmpfiles
< # (cf. /etc/tmpfiles.d/tomcat.conf)
< 
7c2
< Description=Apache Tomcat Web Application Container
---
> Description=Apache Tomcat
15c10
< Environment=CATALINA_PID=/var/run/tomcat/tomcat.pid
---
> Environment=CATALINA_PID=/usr/local/tomcat/temp/tomcat.pid


TomcatのUnit設定ファイルの作成 [CentOS]

CentOS 7.2 上への Tomcat 8.0 の導入を行った(Tomcat は apache.org からダウンロード)。
その際、自動起動の設定で、Unit 設定ファイルの作成に少々手間取った。
以下は、備忘録としてまとめたものである。

[ソフトウェアのバージョン]
・systemd-219-19.el7_2.12.x86_64

1. Unit 設定ファイル (/etc/systemd/system/tomcat.service)
[Unit]
Description=Apache Tomcat
After=network.target

[Service]
Type=forking
Environment=JAVA_HOME=/usr/local/java
Environment="JAVA_OPTS=-Duser.language=en -Duser.region=US \
-Dfile.encoding=ISO-8859-1"    … (注1)
Environment=CATALINA_HOME=/usr/local/tomcat
Environment=CATALINA_PID=/usr/local/tomcat/temp/tomcat.pid
User=tomcat
Group=tomcat
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh

[Install]
WantedBy=multi-user.target


(注1) 実際には前の行と合わせて一行に設定


2. Unit 設定ファイルでの指定項目の説明


(1) 環境変数の定義 (Environment)


・Environment=name=value で、name に value を設定できる。
・EnvironmentFile に環境変数を定義したファイルのパスを指定することもできる。
・今回の方法では、環境変数の値に定義済の環境変数を含めることはできない。

(補足)
上記の Unit 設定ファイルでは、下記の環境変数を定義している。
・JAVA_HOME, JAVA_OPTS, CATALINA_HOME, CATALINA_PID


(2) 実行ユーザー/グループの指定 (User/Group)


User/Group に当該ユーザー/グループを指定する。


(3) 起動/停止コマンドの指定 (ExecStart/ExecStop)


環境変数を使用してパスを指定すると、絶対パスでないと認識され、エラーとなる。

(補足)
当該 Unit の再起動時には、下記の順にコマンドが実行される。
・停止コマンド
・起動コマンド


(4) 起動完了の判定方法の指定 (Type)


forking: 子プロセスを fork するコマンドである。
(デフォルト値: simple)


(5) 起動順序、依存関係の指定


(a) 起動順序の指定


After=xxx: 指定した Unit の起動後に起動する。


(b) 依存関係の指定


WantedBy=xxx: 指定した Unit が当該 Unit に依存する。
(指定した Unit の起動時に当該 Unit を起動する。)

(補足)
指定した Unit の [Unit] 欄での Wants 指定と同じ効果がある。


(6) PID ファイル


/var/run への書き込み権限がないため /usr/local/tomcat/temp に作成する。


3. 備考


該当するオンライン・マニュアルの所在は、下記の通りである。

・Unit 欄の設定項目: man systemd.unit
・Service 欄の設定項目: man systemd.service
・Install 欄の設定項目: man systemd.unit



CentOS 6.8の不具合への対応(3) [CentOS]

下記の CentOS 6.8 の不具合について、残件の対応を行った。

[不具合]
http://dan-project.blog.so-net.ne.jp/2016-05-27-1

[対応済]
http://dan-project.blog.so-net.ne.jp/2016-06-25
http://dan-project.blog.so-net.ne.jp/2016-07-02
http://dan-project.blog.so-net.ne.jp/2016-07-17-1

1. kernel-2.6.32-71.29.1.el6 で Kernel panic を発生する件


[ソフトウェアのバージョン]
kernel-2.6.32-71.29.1.el6.i686
libgudev1-147-2.73.el6.i686
libudev-147-2.73.el6.i686
udev-147-2.73.el6.i686


1-1. 発生事象


ブート時に Kernel panic を発生することがある。

・発生頻度は低い(感覚的には、20〜30 回に 1 回以下)。
・ivtv モジュールのために、kernel 2.6.32-71.29.1.el6.i686 を使用している。
・同じカーネルでも、CentOS 6.7 では発生しない。
・kernel 2.6.32-431.20.3.el6.i686 (ivtv を使用しない) では発生しない。


1-2. 対処方法


下記のパッケージを CentOS 6.7 のパッケージにバージョンダウンする。

(1) 該当する CentOS 6.8 のパッケージ

libgudev1-147-2.73.el6.i686
libudev-147-2.73.el6.i686
udev-147-2.73.el6.i686


(2) 使用した CentOS 6.7 のパッケージ

libgudev1-147-2.63.el6_7.1.i686
libudev-147-2.63.el6_7.1.i686
udev-147-2.63.el6_7.1.i686


(補足)
起動/再起動をそれなりの回数実施したが、当該事象は発生していない。



CentOS 6.x上のFirefoxが異常終了する件のその後 [CentOS]

[ソフトウェアのバージョン]
・Firefox 42.0 〜 Firefox ESR 45.2.0
 (mozilla.org からダウンロードしたものを使用。)

CentOS 6.x 上において、Firefox の異常終了が度々発生していた。
http://dan-project.blog.so-net.ne.jp/2016-04-25

また、どうにか動作が安定するようになったため、備忘録としてまとめてみた。
詳細は、以下の通りである。

1. 発生事象


CentOS 6.x 上において、Firefox が度々異常終了する。

(1) Firefox 上の Flash プレーヤーが度々クラッシュする。

(2) Firefox 上の HTML5 プレーヤーが度々クラッシュする。


特に、YouTube の動画再生でよく発生する。


(3) 上記以外でも、Firefox が度々異常終了する。

(補足)
Debian 7/8、CentOS 7 では発生しない。


2. 対象方法


下記のいずれかの手順を実施する。

(1) Firefox ESR 45.3.0 に更新する。


Firefox ESR 45.3.0 で改善されたようである。
(Firefox ESR 45.2.0 に比べ、明らかに動作が安定している。)


(2) Firefox ESR 38.8.0 を使用する。


少々バージョンは古いが、動作が安定している。
また、YouTube で Flash プレーヤーを使用するように設定することも可能である。

(補足)
・Firefox ESR 45.3.0 のリリース前は、このバージョンを主に使用していた。
・Firefox ESR 38.7.1 でも動作は安定していた。


(3) CentOS の RPM パッケージ (Firefox 45.0.2) を使用する。


短期間の使用であったが、動作は安定していた。

(補足)
マルチブートする Linux 間で Firefox を共有ため、最終的には採用しなかった。


3. 備考


(1) Firefox ESR のバージョン


Firefox ESR 45.3.0: Firefox 48.0 と同時にリリースされた Firefox ESR 版である。
Firefox ESR 38.8.0: Firefox 46.0 と同時にリリースされた Firefox ESR 版である。



ハードウェアクロックの確認方法 [Linux]

ハードウェアクロック(RTC) の値を確認する必要があり、その方法についてまとめてみた。

・ハードウェアクロック: BIOS 設定画面で表示される時刻
・システムクロック: date コマンドで表示される時刻
・通常は、ブート時にハードウェアクロックをシステムクロックにコピーする。
・通常は、シャットダウン時にシステムクロックをハードウェアクロックにコピーする。
・システムクロックのズレについては、NTP 等を使用して補正する。

詳細は、以下の通りである。

1. ハードウェアクロックの表示


(1) systemd が導入されているシステム

# timedatectl [status]
...
        RTC time: xxx
...
 RTC in local TZ: yyy
...


・xxx: 時刻 (タイムゾーンを含まない)
・yyy: タイムゾーン (yes: local TZ, no: UTC)


(2) すべてのシステム

# hwclock --debug
...
Hardware clock is on yyy
...
Time read from Hardware Clock: xxx
...


・xxx: 時刻 (タイムゾーンを含まない)
・yyy: タイムゾーン (local time, UTC)


2. ハードウェアクロックのタイムゾーンのみの確認


(1) systemd が導入されているシステム

# timedatectl [status] | grep TZ


(2) すべてのシステム


(a) hwclock コマンドを使用する場合

# hwclock --debug | grep "is on"


(b) /etc/adjtime を参照する場合

# tail -n 1 /etc/adjtime


・LOCAL: local TZ
・UTC: UTC



この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。