2015/08/21

CentOS7.1 PHP インストールとhttpdやFirewallの設定

# yum install php php-mbstring php-pdo php-pgsql
5.4.16なので、そのままyumでインストールする。
一気にyum install php* をやったら依存関係で怒られた。

インストール後の設定
# nano /etc/php.ini

short_open_tag = off を on へ
;extension=msql.so の;を外して有効にする。
下に
extension=pgsql.so
extension=mbstring.so
を追加



httpd.confにもphpの内容を追加する。
の項目内に
AddType application/x-httpd-php .php
を追記。

httpdを再起動
# systemctl start httpd.service

続いて
# firewall-cmd --add-service=postgresql --permanent
# firewall-cmd --reload

クライアントからアクセスして、PHPが予定通り動けばOK。

CentOS7.1 postgresql インストールから設定

パッケージは9.2.13がbaseでrpmに含まれている。
最新版は9.4.4の様なので、まぁ9.2でいいかということで、
# yum install postgresql*

インストール後そのまま起動しようとしても、起動できなかった。

systemctl start の中にpostgresql.serviceが無く、コマンド叩いても
Job for postgresql.service failed. See 'systemctl status postgresql.service' and 'journalctl -xn' for details.
詳細を確認されたい。と出ます。

# systemctl status postgresql.service
postgresql.service - PostgreSQL database server
Loaded: loaded (/usr/lib/systemd/system/postgresql.service; disabled)
Active: failed (Result: exit-code) since 金 2015-08-21 13:55:21 JST; 2min 57s ago
Process: 4824 ExecStartPre=/usr/bin/postgresql-check-db-dir ${PGDATA} (code=exited, status=1/FAILURE)

${PGDATA} がおかしいということなので、
指定先を調べてみる。
# nano /usr/lib/systemd/system/postgresql.service

# Location of database directory
Environment=PGDATA=/var/lib/pgsql/data ということで、/var/libpgsql/ に/data を作る。

# mkdir -p /var/lib/pgsql/data
# chown postgres:postgres /var/lib/pgsql/data/
postgresさんになってDBをフォーマットする。
# su - postgres
initdbコマンドでデータ格納場所を初期化する。
-bash-4.2$ initdb -D /var/lib/pgsql/data/
データベースシステム内のファイルの所有者は"postgres"ユーザでした。
このユーザがサーバプロセスを所有しなければなりません。

データベースクラスタはロケール"ja_JP.UTF-8"で初期化されます。
したがってデフォルトのデータベース符号化方式はUTF8に設定されました。
initdb: ロケール"ja_JP.UTF-8"用の適切なテキスト検索設定が見つかりません
デフォルトのテキスト検索設定はsimpleに設定されました。

ディレクトリ/var/lib/pgsql/dataの権限を設定しています ... ok
サブディレクトリを作成しています ... ok
デフォルトのmax_connectionsを選択しています ... 100
デフォルトの shared_buffers を選択しています ... 32MB
設定ファイルを作成しています ... ok
/var/lib/pgsql/data/base/1にtemplate1データベースを作成しています ... ok
pg_authidを初期化しています ... ok
依存関係を初期化しています ... ok
システムビューを作成しています ... ok
システムオブジェクトの定義をロードしています ... ok
照合順序を作成しています ... ok
変換を作成しています ... ok
ディレクトリを作成しています ... ok
組み込みオブジェクトに権限を設定しています ... ok
情報スキーマを作成しています ... ok
PL/pgSQL サーバサイド言語をロードしています ... ok
template1データベースをバキュームしています ... ok
template1からtemplate0へコピーしています ... ok
template1からpostgresへコピーしています ... ok

警告: ローカル接続向けに"trust"認証が有効です。
pg_hba.confを編集する、もしくは、次回initdbを実行する時に-Aオプショ
ン、または、--auth-localおよび--auth-hostを使用することで変更するこ
とができます。

成功しました。以下を使用してデータベースサーバを起動することができます。

    postmaster -D /var/lib/pgsql/data
または
    pg_ctl -D /var/lib/pgsql/data -l logfile start

-bash-4.2$ exit

systemctl start の中にpostgresql.serviceが増えているので、
# systemctl start postgresql.service で起動
# systemctl status postgresql.service
postgresql.service - PostgreSQL database server
   Loaded: loaded (/usr/lib/systemd/system/postgresql.service; disabled)
   Active: active (running) since 金 2015-08-21 14:22:24 JST; 2s ago
  Process: 5510 ExecStart=/usr/bin/pg_ctl start -D ${PGDATA} -s -o -p ${PGPORT} -w -t 300 (code=exited, status=0/SUCCESS)
  Process: 5503 ExecStartPre=/usr/bin/postgresql-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
 Main PID: 5513 (postgres)
   CGroup: /system.slice/postgresql.service
           tq5513 /usr/bin/postgres -D /var/lib/pgsql/data -p 5432
           tq5514 postgres: logger process
           tq5516 postgres: checkpointer process
           tq5517 postgres: writer process
           tq5518 postgres: wal writer process
           tq5519 postgres: autovacuum launcher process
           mq5520 postgres: stats collector process

大丈夫っぽい。

ユーザabcを作成。
#su - postgres
-bash-4.2$ createuser -P -s -E abc
新しいロールのためのパスワード:
もう一度入力してください:

ユーザが増えているか確認。
-bash-4.2$ psql
psql (9.2.13)
"help" でヘルプを表示します.

postgres=# select * from pg_shadow
2名になっているのでOK
\qでexit


pg_hba.confでネットワーク内からのアクセスを許容する。
# nano /var/lib/pgsql/data/pg_hba.conf
末尾の
# IPv4 local connections:
host    all         all         192.168.0.0/16          md5

こんな感じで、拠点間の接続にも対応できるように設定しておく。

CentOS7.1 httpdの設定 chkconfigはレガシー iptablesもレガシー

# yum list | grep httpd*
httpd.x86_64 2.4.6-31.el7.centos base

現在2.4が最新のようなので、このままyumでインストールしてしまう。

インストール後、自動起動の設定をしようと、
# chkconfig --add httpdを行うと、systemd serviceに移行したからそっち使え
と応答されるので、ちょっと調べた。

#systemctl list-unit-files
これで一覧が生じされるので、確認はここで行えばよさそう。

chkconfigでもパスしてくれるので、一緒だけど、正しくは
#systemctl is-enabled サービス名.service

httpdの場合は、# systemctl enable httpd.service
このように表記する模様。

更に、iptablesもレガシーな扱いになっているようだ・・・。
firewalld に移行したそうなので、そっちで設定してみる。
#systemctl list-unit-files に
firewalld.service enabled となっているので、
新規インストールは不要。 


firewall-cmdがコマンドらしいのでリストを出してみる。
#firewall-cmd --list-all
 public (default, active)
  interfaces: enp2s0
  sources:
  services: dhcpv6-client ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

ゾーンの定義があるようだが、外部からのアクセスを許容したいので、
ゾーン設定は特に行わない。 --permanent を付けると再起動後も有効と
なるが、即時有効ではない模様。 --reloadしておく。

# firewall-cmd --add-service=http --permanent
success
# firewall-cmd --reload
success

ポートは開けたので、今度はhttpdの設定を行う。(PHPインストール後には再度弄る)
#nano /etc/httpd/conf/httpd.conf
DirectoryIndex index.html index.php index.htm index.shtml

保存して上書き
httpdを走らせる。
# systemctl start httpd
# systemctl enable httpd

外部クライアントからブラウジングできればOK。

2015/08/20

CentOS7.1 インストール作業~ネットワーク接続まで

インストールの前作業

http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1503-01.iso

http://ftp.riken.jp/Linux/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1503-01.iso 

この辺からISOイメージをダウンロードして、DVDを作成する。

今回購入したPRIMEGY TX1310M1 は ハードウェアRAIDを実装しており、
インストール時にRAIDのパッケージを追加する必要があった。

CenOS7 install にカーソルを併せてTABを押し、
inst.dd を追加してからインストールを行う。

対話式のモードになるので、fujitsuのホームページから

URL: http://support.ts.fujitsu.com/Download/Index.asp

「Product selection(manually search)」より「Fujitsu Server PRIMERGY」→「PRIMERGY TXxxx」
→「PRIMERGY TX1310 M1」 →「Red Hat Enterprise Linux」→「Red Hat Enterprise Linux 7(x86_64)」→「SATA RAID」→「RHDUP driver package megasr 16.01.2014.0318-1 for RHEL 7 GA」を用意しておく。
加えて、RAIDコントローラは有効にしないと起動時に制御が掛かるらしく、
OSインストール中の最後の再起動で躓いたので
BIOSでSATA Configurationの設定があるので、そこをIDE MODEにした。
必要を感じたらRAIDを組む事にする。



インストール後の設定

先ずは他のクライアントからターミナルで操作したいので、
ネットワークの設定をする。

$ ip address show 
でNICの情報を取る。
このサーバはNICを2つ持っている(19800で購入の割にすごいな)
 
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp2s0:  mtu 1500 qdisc mq state UP qlen 1000
    link/ether 90:1b:0e:XX:XX:ee brd ff:ff:ff:ff:ff:ff
    valid_lft forever preferred_lft forever
3: enp0s25:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 90:1b:0e:XX:XX:dc brd ff:ff:ff:ff:ff:ff

$ nmcli device show enp2s0 で詳細を取る
GENERAL.デバイス:                       enp2s0
GENERAL.タイプ:                         ethernet
GENERAL.ハードウェアアドレス:           90:1B:0E:60:54:EE
GENERAL.MTU:                            1500
GENERAL.状態:                           1000 (接続済み)
GENERAL.接続:                           enp2s0
GENERAL.CON パス:                       /org/freedesktop/NetworkManager/ActiveConnection/3
WIRED-PROPERTIES.キャリア:              オン
IP4.アドレス[1]:                         ip = 127.0.0.1/8, gw = 0.0.0.0
IP6.アドレス[1]:                         ip = ::1/128, gw = ::                     

こんな感じ 

$ nmcli con show enp2s0 を見る。
 
↓サーバ起動時に自動で接続させる 
connection.autoconnect:                 no 
↓DHCPを固定にしたいので、ここはマニュアルにして、IPアドレスを指定。 
ipv4.method:                            auto
これについては、 昔のようなバグはもう無い様なのでGUIで弄ったほうが楽。
 
 
# nmcli con mod enp2s0 connection.autoconnect "yes"
# nmcli con mod enp2s0 ipv4.addresses "192.168.0.XXX/24"
# nmcli con mod enp2s0 ipv4.method "manual" 

# nmcli device disconnect enp2s0
# nmcli device connect enp2s0
 

他のクライアントからTeraTerm等で接続してみる。

2015/08/12

rsyncのエラー 12番

rsync: writefd_unbuffered failed to write 4092 bytes to socket [sender]

今更ながら、rsyncのエラーが起こったので、再度見直し、いろいろと調べてみた所
サイズの大きい圧縮ファイルの所で躓く様なので、そのあたりを調べてみた。

原因の推測
恐らく、ファイルサイズの異なる同じ名前のファイルを参照し、転送を開始する際に、
コマンドの指定が無い時は、差分の転送を行うが、
zip等の場合、内部構成まで見て差分処理を行おうとするようで、
エラーを返してくる模様。

解決方法
・ --whole-file をつけて、差分の送信をやめる。
・ zipやtarで保存する際は、別のファイルとなるように常にdateを付与する処理をする。
・ zip等のファイルは同期しないようにする。
そこで、一番楽そうな --whole-file をコマンドに追加することにした。

スクリプトシェル
#!/bin/sh
# バックアップ先ディレクトリ指定
BackupDIR=/home/*****/dailyBackup

mkdir -p $BackupDIR
# バックアップログ定義
BackupLog=/home/*****/log/rsync_backup.log rm -f $BackupLog
touch $BackupLog
chmod 600 $BackupLog
#エラーチェック
error_exit () {
exit 1
}
#バックアップ実行
echo "`date` backup start" >> $BackupLog
LastBackup=`ls -t $BackupDIR | grep backup | head -1`
NewBackup=`date +%Y%m%d`backup

mkdir $BackupDIR/$NewBackup
rsync -rlptv --whole-file --link-dest=../$LastBackup /home/比較元のディレクトリ/ $BackupDIR/$NewBackup >> $BackupLog 2>&1

code=$?
if [ $code -ne 0 ]; then
cat $BackupLog | mail -s "BACKUP NG CODE IS $code" root
rm -rf $BackupDIR/$NewBackup
error_exit
fi
echo "`date` backup end" >> $BackupLog



2015/07/09

CentOSからPHPを使って MicrosoftSqlServerに接続

CentOSからPHPを使ってMicrosoftSqlSeverに直接アクセスは出来ないらしく、

FreeTDSを使って橋渡しをするらしい。

イメージとしては、
PHP ⇔ FreeTDS ⇔ MsSqlServer
こんな感じの流れのようです。

とりあえず、FreeTDSでSqlServerにつかがるかを実験してみる。

先に unixODBCをインストールしている理由は、
FreeTDSはSybaseやSQL Serverと通信をするためのプロトコルであって(インターフェイス)、
DBへのアクセスをする場合にはODBCドライバを経由して行わなければならない。
らしい。
http://www.amy.hi-ho.ne.jp/jbaba/unix/tdsodbc.htm
↑ここに技術解説があった。みなさんここを見ているらしいです。

# yum install unixODBC-devel

ODBCドライバをインストール。

# yum install freetds-devel
FreeTDSをインストール。

freetdsにSqlServerの設定をする。
# nano /etc/freetds.conf

末尾に

[sqlserver]
host = DBサーバアドレス
port = 1433
tds version = 8.0
charset = sjis
client charset = utf-8
language = japanese

を加える。


charset は デフォルトはCP932だが、今回のベンダの設定では
SeqServerに定義したエンコードはsjisだったようだ。
エンコード関係でやはり30分ほど嵌った。


# tsql -S sqlserver -U ユーザ名 -P パスワード名
locale is "ja_JP.UTF-8"
locale charset is "UTF-8"
1>
となれば接続成功。

1>select * from テーブル名
2>go

このように使う。

ここまでが事前準備。



接続実験


$server=’DBサーバアドレス’;
$username='ユーザ名';
$password='パスワード';
$con=mssql_connect($server,$username,$password);

if($con !=FALSE)
{
        echo "Connection to SqlServer successful
";
}
else
{
        die("Connection to SqlServer failed");
}

mssql_close($con);
?>



次は、二つのDBを跨いだときの取り扱いを残す予定。

2015/06/09

WindowsServer2012で外部サーバとssh同期とSQLサーバのコマンド処理(CSV書出し)


目的
WEBサイト内の一部のコンテンツを非同期処理を行いたいが、
今回、ベンダが用意したOSがWindowsServer2012であったので、
sshや、コマンド処理等、
WindowsServer2012単体で解決出来ない点を
忘れないようにオボエガキしておく。

仕掛け
SQLServer2014の動いているWindowsServer2012マシンで「タスク処理」させる
 ⇒batファイルをつくる
SQLServerをコマンドラインで動かし、必要なカラムを抽出させるクエリをcsvで吐出し
 ⇒bcpコマンドを使う
吐き出したcsvをutf-8に変換する。
 ⇒色々試したが、結果nkfを使うことにした。
レンタルサーバの所定フォルダとwindowsServer2012の所定フォルダの同期をとる
 ⇒ssh接続の方法を単独で持たないようなので、winSCPを利用する。
同期をとったcsvをjQueryを使って整形し、表示させる。


csv書出し用バッチ処理

@echo off
bcp "select ~" queryout "C:\出力先フォルダ\list.csv" -c -t, -S
<192.168.0.xxx> -U <ユーザ名> -P <パスワード>
exit

解説:-c 文字データ型を使用して操作を実行 -t, のカンマ区切りを付与
   -S サーバ名 
   -U ユーザ名
   -P パスワード
※当初、utf-8で出力できないかいろいろ試したが、SQLServerは動作保障外というだけあって、

-C 65001 を付けると書き出さなかった・・・。



エンコード用バッチ処理
 
@echo off
cd C:\作業フォルダ
type top.csv list.csv > before.csv
nkf32.exe -w80 before.csv > listUTF8.csv

解説:bcpコマンドは表題行を書き出してくれないので、
   予め、表題行のcsvを作っておき、typeコマンドでくっつけている。
   今回は、top.csvにlist.csvをくっつけて、
   nkf32.exe -w80 でutf-8に変換している。



レンタルサーバへの同期用バッチ処理


@echo off
cd "C:\Program Files (x86)\WinSCP"
WinSCP.exe /console /script="sync"

exit

解説:WinSCP.exe /console /script="スクリプト処理ファイル"
   この一行で、コマンドで動かせる。
   ITmediaさんに解説ページがあった。
   (コマンドリファレンスへのリンクもあり非常に助かった。)


スクリプト処理ファイルの中身


option batch on
open ユーザ名@サーバ名
cd /var/www/html/サーバ側の所定のフォルダ
lcd C:\ローカル側の所定のフォルダ
synchronize remote
exit

解説:synchronize remote リモート側(サーバ側)を同期させる と書くようだ。
   サーバ側のデータを同期させたいのであれば、synchronize local となる。
   両方ならばそのままの、both。
   事前に接続をさせておき、その際、ini等にパスワードは覚えさせておく必要あり。

非同期処理のhtml


<html>
<header>
<script src=\"jquery-1.11.3.min.js\"></script>
<script src=\"jquery.csv2table-0.02-b-2.8.js\" type=\"text/javascript\" charset=\"utf-8\"></script>
</header>
<body>
<div id=\"view\"></div>
<script>
$(function(){
  $(\'#view\').csv2table(\'./listUTF8.csv\');
});
</script>
<script>location.reload()</script>
</body>
</html>
最小の構成はこんな感じ

解説:jquery-1.11.3.min.js
   jquery.csv2table-0.02-b-2.8.js はそれぞれ先駆者のものを利用させて頂いた。
   jquery.csv2table-0.02-b-2.8.js はutf-8でないと文字化けする。

   mimeをかぶせてshift-jisという方法もあるが、
   一発で上手くいかなかったことととブラウザに左右されそうだったので、nkfでの処理を選択した。


WinSCP補足

ツール→環境設定→保存→レジストリからINIファイルに変更
ツール→設定のエクスポート

↓おまじない
◆WinSCPの起動をini起動にする
"C:\Program Files (x86)\WinSCP\WinSCP.exe" /ini=C:\syncXML\WinSCP.ini
winwcp.ini 設定
◆同期のコマンドの変数を2に変える
SynchronizeParams=2にする
◆winSCP.iniは出来れば、WinSCPの直下でない方がいいらしい。



同じような内容を開発ベンダに見積取ったら、
えらい金額が上がってきたので、作ってしまえというのが動機。

2015/04/15

VMWare Player WIN8.1上でWindows98を動かす

Windows8.1 64bit版を利用しているのだが、
どうしても、16bitのソフトを動かす必要ができた。
手持ちのXPは全て独自のインストール用のものだったので、
已むを得ずWindows98をインストールした際のオボエガキ。

VMWare Playerをダウンロード

https://my.vmware.com/jp/web/vmware/free#desktop_end_user_computing/vmware_player/7_0

手持ちのwindows98のISOを作成する。

imgburnを使った。

windows98の起動ディスクなんてもうないので、

http://www.allbootdisks.com/download/98.html
こちらからダウンロードした。

VMWare Playerの仮想マシンの設定で、
フロッピーを追加しimgファイルを自動起動するようにし、
MEMを512MBにして、起動。


仮想マシンを起動
→FDを読みこまれるので、1を選択してDOSを立ち上げる
→fdisk ENTER
→Yのまま ENTER
→1 ENTER
→Yのまま ENTER
→Escを押す
→restart ENTER で再起動
※再起動するので、formatをかける

→1 ENTER
→format C: ENTER
→Y ENTER
→フォーマットが終わったら Exit選択
→ボリュームラベルの入力(空欄のまま) ENTER
→D: ENTER
→setup ENTER
→Windows98インストールスタート

あらかたファイルのコピーが終わると再起動を要求してくるので、
その際に、フロッピーは自動起動しないようにする。
(もう一度DOS起動画面になってしまうため)

このまま使ってもよいが、ファイルのやり取りを画面上でできるようにするため、
VMwareToolsをインストールしておく。

管理の中にVMware Toolsのインストールがあるので、ダイアログに従えばOK。
問題なく使えた。

最後に

あ~、こんな感じで領域作ったな~、しょっちゅうFDISKやFORMATしたな~
と大変懐かしい気分になった。

2015/01/12

NEC PC-BL100RA (CentOS6)をWOL利用する

手順

1  起動時 F2でBIOS起動し、(珍しい日本語のセットアップユーティリティだった)
   詳細⇒リモート電源制御 を [使用する]に変更。

2  CentOSを立ち上げて、有線でネットワークの環境を構築する。
   (NICへの電源供給の関係で、無線は無理っぽかった)

3  WOL対応のソフトをyumでインストール

   # yum -y install ethtool

   # nano /etc/sysconfig/network-scripts/ifcfg-System_eth0

   末尾に
   ETHTOOL_OPTS="wol g"
   を追記する。

起動は各クライアントからマックアドレスに向けてマジックパケットを投げればOK


2014/12/02

pdfファイルに一括してパスワードを設定するため、PDFTkをインストール

複数のpdfファイルに一括してパスワードを設定する事が
かなりの頻度で必要になったので、
手持ちのacrobatで何とかしようと思ったが、
9のstandardしかなく、バッチ処理に対応していなかった。


しょうがないので、フリーのツールを探すと
pdftkがメジャーなようで記事がたくさんあるので、とりあえずインストールしてみる。


# wget https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/pdftk-2.02-1.i386.rpm
www.pdflabs.com の証明書(発行者: /C=US/O=DigiCert Inc/CN=DigiCert Secure Server CA)の検証に失敗しました:
  発行者の権限を検証できませんでした。
www.pdflabs.com に安全の確認をしないで接続するには、`--no-check-certificate' を使ってください。
SSL による接続が確立できません。


なるほど、
# wget --no-check-certificate https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/pdftk-2.02-1.i386.rpm


保存完了したので、
# yum install --nogpgcheck pdftk-2*
署名無いので、--nogpgcheck で署名なしのオプションつけないと蹴られる。


インストール後の使い方

変換前ファイル mae.pdf
変換後ファイル(任意名称) ato.pdf
スタンプ      stamp.pdf
印刷のみ許可のオプション owner_pw ***** allow printing

pdftk mae.pdf stamp stamp.pdf output ato.pdf owner_pw ***** allow printing

当初、指定のフォルダにファイルを置き、cronで5分間隔で実行すればいいだろうと
考えていたのだが、
利用者から、cronでの自動化だと操作した感が無く、忘れそうだとの事だったので、
今回は、スクリプトシェルにして、phpで動作させた。

++++++ソース converter.sh++++++

#!/bin/sh
# PDFコンバート&パスワード保護 スクリプトシェル
#
#作業  ディレクトリ /home/storage1/AAA/ConvertPdf
#変換後 ディレクトリ /home/storage1/AAA/ConvertedPdf
#スタンプ /home/storage1/AAA//ConvertPdf/sourse/stamp.pdf


cd /home/storage1/AAA/ConvertPdf
for file in *.pdf; do pdftk $file stamp ./sourse/stamp.pdf output /home/storage1/AAA/ConvertedPdf/`date '+%Y-%m-%d-%H%M%S'_`$file owner_pw **** allow printing; done
rm *.pdf


+++++++++++++++++++++++++++

作業内容
ConvertPdfにあるpdfにstamp.pdfをして印刷のみ許可の状態にしたファイルを
先頭に日付を付けてConvertedPdfにコピーし、
ConvertPdfにあるpdfファイルを削除する。

phpに関して
 phpを動かす同じディレクトリにスクリプトシェルを置かないといけない模様。
 (chdirを使ったが、指定のディレクトリに上手く移動してくれないので、 あきらめた。)

shell_execをhtmlspecialcharsで括らないと、中身をうまく認識できないらしく、
スクリプトシェルが動かなかった。
unixのコマンドだとexecだけでも動くようだが、変数などを使っているので、駄目っぽい。


    $command = './converter.sh.sh';
    htmlspecialchars( shell_exec( $command ) ) ;
?>


あとは、form等でボタンをそれなりに作っておく。


動作試験をして、意図するように動いたので、
あとは、stamp等を調整して完了とする。




2014/06/14

データバックアップ⇒データ移行⇒HDD交換⇒LVM領域拡張

ファイルサーバの空き容量が5GBを割ってしまったので、やむなく交換。
もともと格安のNECサーバに付いていた180GBのSATAⅡをそのまま使っていたが、
500GBに交換することにした。
dumpとrestoreが良いようだが、イマイチ操作が良くわからないので、

ddコマンドと、LVMの拡張で何とかした。

まずは、ddコマンドを実行するため、KNOPPIX
(LIVEでターミナルでddコマンドが動くなら何でもいい)のDVDを作成し、
BIOS弄って、DVD優先起動にする。

$ sudo -s でroot化
コピー元を sda コピー先を sdbとする場合、
# dd if=/dev/sda of=/dev/sdb bs=1024
今回は、HDDにエラーが出た状態ではないので、
ブロックサイズはデフォルトの512Kごと送るよりは、倍の方が早いだろうということで、
オプションを追加。
ifとofを逆にしちゃうと、大変な事態に。もう二度とデータは帰ってこない・・・。
この作業、あんまりしたくない・・・。

結果、およそ2時間ほどでコピー完了
途中経過を確認する方法は別のターミナルを起動して
$ killall -USR1 dd
これで、その時点の作業量からおよその時間が割り出せる。

完了したら、シャットダウンして、その後HDDをつなぎかえて起動。

起動すると、外側は500GBなっているが、内側は180GBのままなので、
これを正しく直してあげる必要がある。

$ su -
# df -H
Filesystem             Size   Used  Avail Use% マウント位置
/dev/mapper/VolGroup00-LogVol00
                       168G   164G     4G  97% /
/dev/sda1              104M    64M    35M  65% /boot





現状、こんな感じ



ボリュームグループの構成を見て、割り当てられる領域を確認。
# /usr/sbin/vgdisplay -v
作業中に保存し忘れた・・・。
これは、最終形だが、
Total PEが上限値なので、その付近まで、領域を拡張すれば良い。

    Finding all volume groups
    Finding volume group "VolGroup00"
  --- Volume group ---
  VG Name               VolGroup00
  System ID           
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  6
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               168 GB
  PE Size               32.00 MB
  Total PE              14901
  Alloc PE / Size       14563 / 455.09 GB
  Free  PE / Size       338 / 10.56 GB
  VG UUID               Ys3H7T-UY61-MnKG-Ue0I-bMGI-mRHd-1oYDvm



# lvextend -l 14500 /dev/VolGroup00/LogVol00 

最初は、14500でなく、14901でコマンドを叩いたのだが、
他に使われている領域が有るらしく、エラーが出たので、
わりと近めのきれいな数値でコマンド実行した。

その結果が、上の状態。




# resize2fs /dev/VolGroup00/LogVol00
resize2fsでサイズを変更。










途中迷走し、fdiskで一端sda2を消して、Wで保存する前に、
再度、目一杯の領域でsda2を作り直してWして、
再起動したが、効果が有ったのか不明。

ほんとは、 resize2fsの前に、
#fsck -f /dev/VolGroup00/LogVol00 でディスクチェックすべきかも。
 
 
# df -H
Filesystem             Size   Used  Avail Use% マウント位置
/dev/mapper/VolGroup00-LogVol00
                       472G   164G   308G  34% /
/dev/sda1              104M    64M    35M  65% /boot

この形になれば、成功。



2014/05/05

バックアップ機のメンテナンス

過去に作っていたバックアップマシンをしばらく使っていなかったが、
メインマシンがお亡くなりになった際に、阿鼻叫喚となるので、
バックアップを現行に近づけておく。

ユーザを作る
# useradd ユーザ名

パスワード設定
# passwd ユーザ名

メイン機の環境を丸ごと圧縮取ってくる。
$ tar zcvf ユーザ名.tar.gz 

SCPで先程作ったサブマシンのユーザ配下に置き、展開

$ tar xvf ユーザ名.tar.gz

動作確認

postgreSQLが動いているか確認
$ psql データベース名
psql (8.4.7)

動いている。


Tomcatが動くか
tomcatは動くが、logにインクルードが上手くいかないと書かれている。

/home/ユーザ名/ver3/web-inf/web.xml
この中にcatalinaの定義されているものがあった・・・。

これで嵌った・・・。

iptableでポート解放して
iptable をrestartして設定反映。

tomcat起動で動いた。



2014/02/20

port解放


# nano /etc/sysconfig/iptables

# Firewall configuration written by system-config-securitylevel
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 53 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 53 -j ACCEPT


-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 14000 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 14000 -j ACCEPT


開けたいポートを記載する。 14000とか

ipテーブルを読み直す

# /etc/init.d/iptables restart

これで、ポート解放

複数のユーザでtomcatを動かす場合など必要だった。


2014/02/19

useraddのパスが通らない

リモートでuseraddをしたが、bash: useradd: command not found
となる。

su -
でrootにならないとpathが通らないことに気付かなかった・・・。
忘れないように残す。

OSのbit確認

$ uname -m
32bitの場合 i686
64bitの場合 x86_64
 
64bitのマシンから環境一式をコピーしたが、
移転先のOSが32bitだった・・・。 
JDKが64bitで tomcatが動いていたので、
32bitのJDKを入れないと、tomcatが動かない・・・。
startup.shでcannot execute binary fileのエラーが出ていた。
最初原因が分からなかったが、
OSが32bitだったような気がして調べたので、
コマンド載せておく。 

圧縮・解凍

圧縮
$ tar zcvf ファイル名.tar.gz 

解凍
$ tar xvf ファイル名.tar.gz

2014/02/01

Linux rsyncで差分バックアップの実装

基本的な使い方
 $ rsync -av /コピー元 /コピー先
フルパスで行けた。

差分バックアップについては、
rsync -av --delete --link-dest=../<<比較元>> <<バックアップ元>> /<<バックアップ先>>
で行ける。(比較元のパスはバックアップ先から相対パスで指定すること

cronで毎日稼働させるようであれば、次のように修正して稼働させればよい。
既に先人が偉大な資料を残してくれているので、参考に作成した。


--link-dest コマンド:インクリメンタルバックアップ
ハードリンクを作ってくれるので、ディスク圧迫を防げるので、コマンド採用している。

Webエンジニア・インフラエンジニアゐくをの日常 様のほぼそのままです。

詳しくは、この方のWEBサイトを確認してください。


□□□□□□シェルスクリプトの内容ここから□□□□□□□

#!/bin/bash

# バックアップ先を指定
back_up_dir=/<<バックアップ先のディレクトリのパス>>/dailyBack
mkdir -p $back_up_dir

# バックアップログ名
backup_log=/<<ログを残すディレクトリ>>/log/rsync_backup.log
rm -f $backup_log
touch $backup_log
chmod 600 $backup_log

# エラー処理 あった方がよさそうなので、そのまま使わせて頂いた。
error_exit () {
exit 1
}

# バックアップ実行
echo "毎日のバックアップ開始" >> $backup_log
#このあたりは素敵な感じ。当初別の方法で書いたが、ゐくをさんの方法の方が分かりやすいので、パクった。
latest=`ls -t $back_up_dir | grep backup | head -1`
newly=`date +%Y%m%d`backup

mkdir $back_up_dir/$newly
rsync -av --delete --link-dest=../$latest /<<バックアップ元のディレクトリ>> $newly/$latest >>

#ここから下もそのまま利用させて頂いた。

$backup_log 2>&1
code=$?
if [ $code -ne 0 ]; then
    cat $backup_log | mail -s "BACKUP NG CODE IS $code" root
    rm -rf $back_up_dir/$newly
    error_exit
fi
echo "毎日のバックアップ完了" >> $backup_log


□□□□□□□□ここまで□□□□□□□□□

Linux ディレクトリ・ファイル容量の確認コマンド du

dfはHDD等の利用率や容量の確認コマンド

duはカレントディレクトリの容量を調べることができる。

du --オプション ファイル名やディレクトリ 


オプション
-s 引数で指定したファイルやディレクトリの総計を表示する
-h 適当なサイズで表示 K G等
-d シンボリック・リンク・ファイルは元ファイルの容量を集計する


良く使うのはこのあたり

最初に調べたいディレクトリに移ってからコマンドを打っても良い。

du -sh

大概はこれでOK。  

2014/01/21

PostgreSQL 配列関数 複数行帰ってくるクエリを一行で表示させる表現 ARRAY関数

複数のテーブルを跨いだクエリで、selectの結果が複数行で返ってくる場合、
pg_fetch_array等で、一覧表として表現したい事がある。

通常、LEFT JOIN等を行っても、複数行がそのまま表示されてしまう。
ただ内容を見る場合は、これでも良いのだが、
pg_num_rows 等で件数を合わせて管理したい場合、カウントがおかしくなってしまう。

いろいろと探したところ、配列関数でクエリを投げれるようなので、実装した際のオボエガキ。

条件

テーブル
tab1
tab2

tab1 のカラム
seqnumber
name
add



tab2 のカラム
tab2seqnumber
number こいつもユニークでこれを軸に番号を発番している。
memo



クエリ生成

select seqnumber,
( select array_to_string(ARRAY(select number||memo from tab2
where tab1.seqnumber=tab2.tab2seqnumber ), ',') ) AS
combine,name,add from tab1 where seqnumber=7777;


このような表現でOK

大枠のクエリの抽出条件の中に、
select array_to_string(ARRAY・・・, ',' )を入れ子にしているのがポイント。

たとえば、
select seqnumber,number||memo,name,add from  tab1 left join tab2 on tab1.seqnumber=tab2.tab2seqnumber where seqnumber=7777;

この場合、3行の検索結果が返ってくるとすると、
seqnumber,101memo1,102memo2,103memo3,name,add
のように
number||memo が若い順にカンマ区切りで文字列として表示される。

何気にすごく使える。

本家の解説ページ
http://www.postgresql.jp/document/8.0/html/functions-array.html

2013/12/11

ExcelでpostgreSqlに接続しsqlを利用

手順のオボエガキ

PostgreSQLのODBCドライバをインストール
 OS(32bit) Excel(32bit)
 32bitのPostgreSQLのODBCドライバをダウンロードしインストール

 OS(64bit) Excel(64bit)
 64bitのPostgreSQLのODBCドライバをダウンロードしインストール

 OS(64bit) Excel(32bit)
 32bitのPostgreSQLのODBCドライバをダウンロードしインストール
 管理者権限でコマンドプロンプトを起動
 C:\Windows\SysWOW64\odbcad32.exe を叩き起動。
 32bitのODBCドライバを追加する。 

Excelでの設定
 データTAB→その他のデータソース→データ接続ウイザード
 →ODBC DSN→PostgreSQLのデータソースを選択

 適宜SQLを編集し、指定のセルにクエリ結果を表示させる。

以上

ODBC DSNで接続環境を作らないと不安定な接続となったので、
この方法を取る事。