設定ファイルを初期状態へ戻す方法
一番無難なのは
設定変更する前にファイルをバックアップしておくこと
しかし、バックアップしたファイルが削除されたり
バックアップがない可能性もあるため
復旧方法を学習しておく
今回の環境は、CentOSで
Apacheの設定ファイルである
httpd.conf
を間違えて削除した場合の対処
これをパッケージ中の設定ファイルをインストールして復旧
まず、httpd.confがどのパッケージに含まれるか調べる
もし、パッケージ名がわかれば
そのパッケージからhttpd.confを取り出せばいい
とはいっても、書いているだけではスキルがあがらないので
VMware Player で
CentOS 6.4 64bit 環境を構築し
これを使って実験する
仮想マシンはDHCPでIP取得する設定にしているのなら
ubuntu から
sudo nmap -n -sP 192.168.10.0/24
というように、LAN内部のIPを調べ
ssh でリモートログインする
ログインできたら
yum -y install httpd
で
Apache をインストールし
実験開始
不安があるのなら、一度仮想マシンのバックアップをとったほうがよいかもしれない
まず、設定ファイルを削除する
rm -f /etc/httpd/conf/httpd.conf
これで
/etc/rc.d/init.d/httpd start
としても起動できなくなる
この場合、httpd.conf と関連が深そうなファイルを探すことになる
ls /etc/httpd/conf
で調べると
magic がでるので
これを調べる
CentOS は rpm パッケージなので
rpm -qf /etc/httpd/conf/magic
でパッケージ名を表示してみると
httpd-2.2.15-28.el6.centos.x86_64
となり、httpd パッケージに含まれることが判明
次に、-ql オプションを使って
httpd パッケージの構成ファイル一覧を表示
rpm -ql httpd | grep conf
で絞って探すと
/etc/httpd/conf
/etc/httpd/conf.d
/etc/httpd/conf.d/README
/etc/httpd/conf.d/welcome.conf
/etc/httpd/conf/httpd.conf
/etc/httpd/conf/magic
/etc/sysconfig/htcacheclean
/etc/sysconfig/httpd
/usr/lib64/httpd/modules/mod_log_config.so
となり、httpd.conf が含まれるのが確認できる
次に、httpd パッケージをダウンロードする
これは
yumdownloader を使う
これは、rpm パッケージをダウンロードするツール
yumdownloader httpd
とすれば
httpd-2.2.15-28.el6.centos.x86_64.rpm
がダウンロードできる
ただし、パッケージを普通にインストールしようとしても
すでに導入済みだとインストールできないので
–force オプションをつけ
強制的に再インストールする
rpm -Uvh –force httpd-2.2.15-28.el6.centos.x86_64.rpm
でインストール
ls /etc/httpd/conf/
でディレクトリを確認すると
httpd.conf があるのが確認できる
これで
/etc/rc.d/init.d/httpd start
とすると
apache が起動できるのが確認できる
月別: 2013年7月
設定ファイルを初期状態へ戻す方法
設定ファイルを初期状態へ戻す方法
一番無難なのは
設定変更する前にファイルをバックアップしておくこと
しかし、バックアップしたファイルが削除されたり
バックアップがない可能性もあるため
復旧方法を学習しておく
今回の環境は、CentOSで
Apacheの設定ファイルである
httpd.conf
を間違えて削除した場合の対処
これをパッケージ中の設定ファイルをインストールして復旧
まず、httpd.confがどのパッケージに含まれるか調べる
もし、パッケージ名がわかれば
そのパッケージからhttpd.confを取り出せばいい
—
から送られてきた高速メモ帳
投票結果のグラフ表示
投票結果のグラフ表示
#11 投票結果を表示しよう (1)
http://dotinstall.com/lessons/poll_php_v2/9711
を参考に、投票された結果をグラフ表示していくため
データを抽出する
index.php の
</form>
の下に
<p><a href=”result.php”>結果をみる</a></p>
を追記して
新たに
result.php を作成する
そして、戻るボタンを設置したいので
<p><a href=”index.php”>戻る</a></p>
を追記
投票結果の表示のためDBからデータを引っ張ってくる必要があるので
$dbh = connectDb();
この connectDb() は、functions.php で定義した
ユーザ関数
$sql =”select answer, count(id) as count from ansers group by answer”;
としてSQLを $sql に格納
Google Chart Toolsで引っ張ってくるデータはJSON形式
次に、配列を作成
$rows = array();
これは foreach() で使用する
foreach($dbh->query($sql) as $row){
array_push($rows, array());
}
という処理になる
次に、
#12 投票結果を表示しよう (2)
http://dotinstall.com/lessons/poll_php_v2/9712
を参考に
Google Chart Toolsを使い、投票結果をグラフ表示
Google Chart ToolsはJSON形式なので
array($row[‘answer’], (int)$row[(count’]))
というような書き方になる
ちなみに、count のほうは int でないとまずいので
(int) として int 型にしている
そして、
json_encode()で
$rows をJSON形式の文字列に変更する
$data = json_encode($rows);
json_encode() については
http://php.plus-server.net/function.json-encode.html
を参考にする
値が格納されているか確認したいのなら
var_dump($data);
とすれば
確認できる
確認できたら、
var_dump() はコメントアウトしておく
ここまで確認できたら、グラフを描いていく
まず、
<div id=”chart_div”>グラフを詠み込み中 </div>
として
表示領域を div で指定
そして、 script タグで Google Chart Tools のライブラリを読み込む
<script src=”https://www.google.com/jsapi”></script>
ライブラリを読み込んだら
script タグへ
グラフを描く処理を追記
google.load(‘visualization’, ‘1.0’, {‘packages’:[‘corechart’]});
はほぼ決まり文句
google.setOnLoadCallback(drawChart);
function drawChart() {
}
で、この drawChart() {} の中に詳細設定をしていく
ここからは
#13 投票結果を表示しよう (3)
http://dotinstall.com/lessons/poll_php_v2/9713
を参考に、グラフ表示と動作確認をしていく
なお、グラフ作成に使用している
Google Chart Tools に関しては
http://dotinstall.com/lessons/basic_chart_tools
で学習することができる
この編集するファイルは results.php になる
処理は
function drawChart() {} の中に描いていく
var data= new google.visualization.DataTable();
次に、data.addCulumn()
でデータのカラムを設定する
data.addColumn(‘string’,’answer’);
data.addColumn(‘number’,’票数’);
data.addRows(<?php echo $data; ?>);
そして、グラフのオプションを指定する
var options ={
‘title’:’投票結果’,
‘width’:400,
‘height’:300
}
そして、実際にグラフを作成
var chart = new google.visualization.PieChart(document.getElementById(‘chart_div’));
この chart_div はHTMLソースで指定した div の id
char.draw(data,options);
これで実行してみると、円グラフが表示されるようになる
投票結果のグラフ表示
#11 投票結果を表示しよう (1)
http://dotinstall.com/lessons/poll_php_v2/9711
を参考に、投票された結果をグラフ表示していくため
データを抽出する
index.php の
</form>
の下に
<p><a href=”result.php”>結果をみる</a></p>
を追記して
新たに
result.php を作成する
そして、戻るボタンを設置したいので
<p><a href=”index.php”>戻る</a></p>
を追記
投票結果の表示のためDBからデータを引っ張ってくる必要があるので
$dbh = connectDb();
この connectDb() は、functions.php で定義した
ユーザ関数
$sql =”select answer, count(id) as count from ansers group by answer”;
としてSQLを $sql に格納
Google Chart Toolsで引っ張ってくるデータはJSON形式
次に、配列を作成
$rows = array();
これは foreach() で使用する
foreach($dbh->query($sql) as $row){
array_push($rows, array());
}
という処理になる
次に、
#12 投票結果を表示しよう (2)
http://dotinstall.com/lessons/poll_php_v2/9712
を参考に
Google Chart Toolsを使い、投票結果をグラフ表示
Google Chart ToolsはJSON形式なので
array($row[‘answer’], (int)$row[(count’]))
というような書き方になる
ちなみに、count のほうは int でないとまずいので
(int) として int 型にしている
そして、
json_encode()で
$rows をJSON形式の文字列に変更する
$data = json_encode($rows);
json_encode() については
http://php.plus-server.net/function.json-encode.html
を参考にする
値が格納されているか確認したいのなら
var_dump($data);
とすれば
確認できる
確認できたら、
var_dump() はコメントアウトしておく
ここまで確認できたら、グラフを描いていく
まず、
<div id=”chart_div”>グラフを詠み込み中 </div>
として
表示領域を div で指定
そして、 script タグで Google Chart Tools のライブラリを読み込む
<script src=”https://www.google.com/jsapi”></script>
ライブラリを読み込んだら
script タグへ
グラフを描く処理を追記
google.load(‘visualization’, ‘1.0’, {‘packages’:[‘corechart’]});
はほぼ決まり文句
google.setOnLoadCallback(drawChart);
function drawChart() {
}
で、この drawChart() {} の中に詳細設定をしていく
DB格納時のエラー処理
DB格納時のエラー処理
#10 投票結果を格納しよう (2)
http://dotinstall.com/lessons/poll_php_v2/9710
を参考に
データを格納する際にエラーが発生した場合の処理を実装
もし、同じユーザエージェント、つまりブラウザが同じで
同じIP、そして、同じ日付なら
回答を弾くようにする
これは if で判定する
if($stmt->execute($params)){
で判定して
うまくいったら
$msg=”投票ありがとうございました”;
として
else つまり、この弾く条件にあてはまるのなら
$err =”投票は1日1回です”;
とする
このメッセージを表示するには
<?php if(!empty($msg)):?>
<p style=”color:green”><?php echo h($msg); ?></p>
<?php endif; ?>
を
<?php if (!empty($err)) : ?>
<p style=”color:red”><?php echo h($err); ?></p>
<?php endif; ?>
の上に追記する
実行して実際に投票して動作確認したら
mysql -u root -p
でログインして
use dotinstall_poll_php;
select * from answers;
で内容が格納されているのを確認できる
作成するDBさえあっているのなら
どうしてもうまくいかないときには
サンプルソースをコピペして
実際に動く事を確認するほうが効率的だし
git とか diff コマンドでソースとの違いを見つけたほうが
わかりやすい
killコマンドの使い方
killコマンドの使い方
プログラムの不具合で終了できないプロセスは
killコマンドで終了させる
killコマンドは、実行中のプロセスに対して様々なシグナルを送信する
シグナルはLinuxカーネルに実装されている
プロセス間で連絡を取り合うための仕組みのこと
killコマンドを使うには
送るシグナル
プロセスID(PID)
がわからないと使えない
CPUやメモリを占有しているPIDは
topコマンドで
c
m
で調べることができる
これに対して
SIGTERMという
プロセス終了シグナルを送信すればいい
プログラムの実装にもよるけど
プロセスは
SIGTERMを受け取ると
プログラム内に実装されている終了処理を行う
これなら
オープンしているファイルを閉じたり
ログの出力してから終了というように
安全にプロセス終了できる
ただし、プロセスにシグナルをおくるには
そのプロセスのユーザー権限が必要
この権限は、topコマンドで
USERの項目に載っている
これがrootならroot権限が必要
もし、1980のプロセスを終わらせるなら
kill -SIGTERM 1980
とする
しかし、プロセス暴走だと
これでも終わらない
そんなときには
強制終了シグナル SIGKILL を使う
これは、強制終了なのでファイル破損リスクなどもあるから
ある意味最終手段
もし、1980のプロセスを強制終了するなら
kill -SIGKILL 1980
まず、SIGTERMで試して
どうしようもないなら SIGKILL を使う
ほかにも
killコマンドで使えるシグナルはたくさんあるので
kill -L
とか
man 7 signal
でマニュアル見るといい
よく使うのは
SIGUP
SIGUPは、
設定ファイルを編集後
変更が反映されるように、デーモン再起動するときなどに使うシグナル
あと、同じ名前のプロセスが、複数あるときには
killallコマンドを使えば
同じ名前のプロセスを一度で終了できる
プログラムの詳細の確認
プログラムの詳細の確認
topコマンドでどれご占有しているか調べたら
それを
locate コマンドで調べる
プログラムの場所がわかったら
dpkg
rpm
を使い、プログラムの詳細情報を取得
たとえば
topコマンドの結果
backupdプロセスが原因だったとして
locate backupd
で調べて
/usr/bin/backupd
にあるとわかったら
rpm -qf /usr/bin/backupd
でパッケージ名を表示し
rpm -qi backupd-tool
で
backupd-toolの詳細を表示し
バックアップツールのデーモンであることを確認
rpm -ql backupd-tool
で、backupd-toolパッケージのファイル一覧を表示し
initスクリプトが存在することを確認
という流れになる
initスクリプトは
システム起動時に自動で呼び出され
初期化、ソフトの起動をするスクリプト
ここまでで、原因の推測かできるので
ログを見て検証
まず、いつからシステムが重くなったか知るため
sarコマンドで過去のシステムの状態を確認
sar の実行結果の中から
%user という、ユーザープロセスのCPU利用率が急増しているところと
%idleという、CPUアイドル時間の割合が減少しているところを探す
この時間帯が判明したら
システムログの
/var/log/syslog
や
/var/log/messages
を確認する
これを確認すると
CROND というデーモンが処理をしているのが確認てきる
一番右側に、実行している処理で
/etc/cron.hourly
/etc/cron.daily
となっているので
ls /etc/cron.daily
で確認する
これにより、この時間帯にバックアップツールが動作しているのが
原因だったと検証できる
これらから、プロセス状況の把握をまとめてみると
free -m
てメモリ使用率の確認
topコマンドで
c
m
で、占有率の高いプロセスを把握
locateコマンドなどでファイルシステムのどこにあるか把握
パッケージコマンドのrpm dpkgで詳細情報の取得
sar コマンドで
CPU利用率
sar -m て
メモリ使用率
から
状態異常の起きている時間を把握
/var/log/syslog
/var/log/messages
から、その時間帯に行われているシステムのログをみて
推測と結果の検証をする
LinuxのCPU、メモリの状況把握
LinuxのCPU、メモリの状況把握
PCが遅くなる原因は主に
CPUの使用率が高い
メモリーの大量消費
の2つがある
LinuxOSは、メモリー不足になると
メモリー上のデータを
HDDのswap領域に待避してメモリーに空きを作る
これがスワップアウト
逆に
HDDへ待避したデータをメモリーへ戻すのが
スワップイン
メモリーに比べてHDDはアクセスが遅いため
スワップイン、スワップアウトか発生すると
遅くなる
端末こらfreeコマンドを使えば
メモリの現状をみることができる
ただ、今のマシンはメモリが大きいから
-mオプションをつけて MB単位で表示したほうが見やすい
このときに
Mem:の行がメモリの情報
Swap ごスワップの情報
となる
これて、もし used のところに大量のメモリを使っていると
表示されるなら
プロセスごとのメモリ占有率を調べる
これには、topコマンドを使うことで
プロセスごとのCPU、メモリの使用率を表示することで
調べることができる
topコマンドは、5秒間隔でプロセス状況を表示する
topコマンド実行中に
c を押せば、CPU使用率が高い順に並べられる
m を押せば、メモリ使用率が高い順に並べられる
こうすれば、
CPUやメモリを占有しているプロセスを見つけることができる
LinuxのCIFSでファイル共有
LinuxのCIFSでファイル共有
ファイルサーバーは
CIFS
Common Internet File System
で通信することがほとんど
これは、Windowsのファイル形式の
SMB
Server Message Block
と互換性があるから
WindowsからCIFS形式のファイル共有へ接続するには
パスに
\\ファイル形式共有のIPアドレス\
と入力する
Linuxの標準的ファイル共有は
NFS
Network File System
このため、Linuxの機能では
Windowsのファイル共有にアクセスできない
LinuxからCIFS形式のファイル共有を利用するには
samba-clientパッケージをインストールする
CentOSなら
yum install samba-client
でインストール
これで、LinuxからWindowsのファイル共有へアクセスするには
mount.cifs //IPアドレス/共有ディレクトリ /mnt -o user=ユーザー名
とする
例えば
mount.cifs //192.168.10.100/cifstest /mnt -o user=test
というように
する
mount.cifs
は、CIFS形式のファイル共有へアクセスするためのコマンド
-tオプションに
指定するファイルシステムの形式を変更することで
様々な形式の記憶領域を
Linuxから使えるようになる
/mnt
は、ファイル共有の領域を接続するディレクトリの指定
コマンドを実行すると
/mnt の下へ共有ディレクトリの中身が表示される
-o
は、接続時のオプションを指定
今回は、userを指定して
接続に利用するユーザー名を指定している
指定しないと
環境変数のUSERの値を使うことになる
他には
rw
ro
などがあり
rwは、接続先を読み書き可能にして
roなら、読みとり専用になる
これで、ファイル共有がLinuxからでもできるけど
OSを再起動したら、またコマンドで接続
というのは面倒なので
OS起動時に自動接続されるように
/etc/fstab
を編集する
ただし、設定を失敗するとOSが起動しなくなるため
最初は仮想マシンで練習したほうが無難
書き方は
//IPアドレス/共有ディレクトリ名 /mnt cifs username=ユーザー名 0 0
あと、LinuxからNFS領域を利用するなら
mount -t nfs NFSサーバーのIP:/NFSで公開しているディレクトリ /mnt
となる
例えば
mount -t nfs 192.168.10.100:/nfs /mnt
なら
/mntに
192.168.10.100の
/nfsディレクトリが
自ホストの/mntへ接続される
接続の解除は、umountコマンドで行う
umount /mnt
ただし、ファイル共有ディレクトリを利用中のユーザーがいると
接続の解除ができない
もし、他に使っているユーザーがいるなら
device is busy
と表示される
この場合
fuserコマンドを使うことで、利用中のユーザーを確認できる
fuser -m ファイル共有ディレクトリ名
このfuserコマンドを使うことで
どういう操作をしているかも把握できる
—
から送られてきた高速メモ帳
pingの許可設定
pingの許可設定
pingの許可設定は
CentOSなら
-A INPUT -p icmp -j ACCEPT
で許可されている
-A
で、このルールを適用するチェインを指定
-p
は、プロトコルを指定するオプション
-p icmp
なら
ICMPプロトコルを許可
-pで指定可能なパラメーターは
tcp
udp
icmp
all
のどれか
TCPかUDPの場合なら
–dport を指定する
これは、該当するプロトコルで使うポート番号の指定
-jで
作成したルールに一致したパケットをどう扱うか設定をする
ACCEPTなら許可
REJECTなら拒否
DROPならパケットを無視
これらの指定を組み合わせて、
パケットフィルターのルールを作成する
例えば、SSHの22番ポートのルール
-A INPUT -m state –state NEW -m tcp -p tcp –dport 22 -j ACCEPT
この場合
-m state
が接続状態を指定するオプション
–state で指定できるのは
NEW
ESTABLISHED
RELATED
INVALID
NEWは、
新規に着信したパケットに対するルールを指定
ESTABLISHEDは、
接続確率のために必要な応答と
過去に接続が確立しているセッションに対するルールを指定
RELATEDは、
接続が確立されているパケットにより
生成された新たなパケットに対するルールを指定
初期状態では
-A INPUT -m state –state ESTABLISHEd,RELATED -j ACCEPT
により
別のルールで接続成功した通信を継続できるようになっている
—
から送られてきた高速メモ帳