page_adsence

ラベル linux の投稿を表示しています。 すべての投稿を表示
ラベル linux の投稿を表示しています。 すべての投稿を表示

2015年1月30日金曜日

Windwosマシンからsambaへのアクセスでハマった

vagrant + ansibleを使ってVMのセットアップをして、いざ共有ディレクトリにアクセスしたら、アクセス拒否。
原因がいまいちよくわからなかった。
結論から先に言うと、全ての原因はSELinuxだったということ。
playbookにSELinuxをオフにする記述を追加して、設定ファイルを確認。

$ view /etc/selinux/config
SELINUX=disabled

と書かれていたので、安心しきっていたのですが、実際には設定ファイルだけ書き換わっていて再起動されていなかったため、
SELinuxが普通に動いている状態でした。

$ getenforce



$ sestatus

で確認した所、ガンガン動いていた。
以下、ハマった事象に関しての詳細。

起こっていた現象

\\サーバのIP

にはアクセス出来る。

\\サーバのIP\public

にもアクセス出来る。

\\サーバのIP\vagrant

にはアクセス出来ない。

sambaの設定色々いじったり、VM側のディレクトリのパーミッション弄ってみたりと色々試しましたが全てダメ。
何がダメなのかわからなかったのですが、こんな記事を教えてもらって試してみた。
VM上で、下記のコマンドを実行したら見れる様になりました。

$ setsebool -P samba_enable_home_dirs on

これで問題なくなったと思っていたら、今度はフォルダとシェルスクリプトだけsamba上で見えていて、ファイルが一切見えないという状態に。
VM上で同じディレクトリを参照すると、特に問題なくファイルもあり、中身も閲覧出来る。
何が原因なんだと思って調べていた所、このサイトが引っかかった。
原因はSELinuxだと書かれていて、SELinuxはオフにしてあるはずなのになぁと思いつつ、確認してみた。

$ getenforce
Enforcing

普通に動いてました・・・。
なので

$ setenforce 0

で一時的に無効化してから、もう一度samba経由で対象のディレクトリにアクセス。
普通に見れました。

2014年12月26日金曜日

ログアウト後もコマンドを実行し続ける。または今動いているコマンドを後からログアウトしても実行し続けるようにする。

ログアウトした後も継続してコマンドを実行し続けるためには、nohupコマンドを使う必要がある。
通常はログアウトしたタイミングでkillされてしまうのだが、そのシグナルを無視するようになります。
また、標準出力や標準エラーはファイルに出力されるようになります。

■使ってみる
$ nohup ./test.sh &

test.shをバックグラウンドで実行する。
「test.sh」の標準出力、標準エラー出力に送られたデータはプログラムを実行したディレクトリに「nohup.out」というファイル名で保存される。
もしプログラムを実行したディレクトリに書き込み権限が無ければ「$HOME/nohup.out」に保存される。

■標準出力先を指定する
$ nohup ./test.sh > stdout.log &

「test.sh」の標準出力が「stdout.log」になる。標準エラー出力は「nohup.out」で保存先は先ほどと同様にプログラムを実行したディレクトリか、$HOME配下に作られる。

■標準エラー出力先を指定する
$ nohup ./test.sh > stdout.log 2 > stderr.log &

「test.sh」の標準出力が「stdout.log」になる。標準エラー出力は「stderr.log」です。


nohupコマンドで実行する前に普通にコマンドを打ってしまった場合、 または思った以上に時間が掛かってしまってもう帰らないと行けなくなってしまった時の対応方法。


1.処理中にCtrl + zで一旦閉じる

2.バックグラウンドにする
$ bg

3.SIGHUBが送られないようにする
$ disown %1 ← %の後の数値はjob番号。jobsで調べた時に出てくる番号を入れる。

ここまででログアウトしても問題なくなる。
しかし標準出力や標準エラーが取れない。
それを取るためにする方法が以下の方法

4.プロセス番号を調べる
$ ps aux
user   5791  3.6  0.1 194640 32136 ?        S    15:36   0:21 ./test.sh
上記の場合だとプロセス番号は5791。

5.標準出力や標準エラーを保存するためのファイルを用意する。
$ touch stdout
$ touch stderr
※カレントディレクトリに作成

6.gdbで繋ぐ
$ gdb -p 5791

(gdb) p dup2(open("stdout",1),1) ← カレントディレクトリにあるstdoutというファイルに標準出力を入れる

(gdb) p dup2(open("stderr",1),2) ← カレントディレクトリにあるstdoutというファイルに標準エラーを入れる

(gdb) detach

(gdb) quit

以上で完了。
後は実際にファイルに書き込まれているかを確認する。
$ tail -f stdout
$ tail -f stderr

2014年11月6日木曜日

Vagrantでmountに失敗した時の対処方法

Vagrant経由でVirtualBoxを起動しようとしたら、下記のようなエラーが。

$ vagrant up

Failed to mount folders in Linux guest. This is usually because
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:
mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` vagrant /vagrant
The error output from the last command was:
/sbin/mount.vboxsf: mounting failed with the error: No such device

セットアップとかいろいろやっていたので、
どの作業がこういった現象に結びついたかは不明。。。
調べたらとりあえずvboxをリビルドする必要があるらしい。

まずはCygwin上で

$ vagrant ssh

vagrant sshでログインした後に

[vagrant@localhost ~]$ sudo /etc/init.d/vboxadd setup
Removing existing VirtualBox non-DKMS kernel modules       [  OK  ]
Building the VirtualBox Guest Additions kernel modules
Building the main Guest Additions module                   [  OK  ]
Building the shared folder support module                  [  OK  ]
Building the OpenGL support module                         [  OK  ]
Doing non-kernel setup of the Guest Additions              [  OK  ]
Starting the VirtualBox Guest Additions                    [  OK  ]

vagrantを再起動

$ vagrant halt
==> default: Attempting graceful shutdown of VM...

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: bridged
==> default: Forwarding ports...
    default: 22 => 2222 (adapter 1)
==> default: Running 'pre-boot' VM customizations...
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Connection timeout. Retrying...
    default: Warning: Connection timeout. Retrying...
    default: Warning: Remote connection disconnect. Retrying...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
==> default: Configuring and enabling network interfaces...
==> default: Mounting shared folders...
    default: /vagrant => C:/cygwin64/home/username/virtualBox_CentOS

解決!
先ほどのエラーはでなくなりました。

2014年10月29日水曜日

MongoDBをCentOS6.4にインストールから起動、PHPで利用するまで

1.リポジトリの追加(64bitの場合)
$ sudo vi /etc/yum.repos.d/mongodb.repo

[mongodb]
name=MongoDB Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
gpgcheck=0
enabled=1

32bit版の場合はURLの「x86_64」を「i686」に書き換えれば出来る。
2.yumコマンドでインストール
$ sudo yum install mongodb-org


3.起動
$ sudo /etc/init.d/mongod start
Starting mongod:                                           [FAILED]


4.起動失敗した原因を調べる
sudo view /var/log/mongodb/mongod.log

2014-10-29T11:58:37.248+0900 [initandlisten] ERROR: Insufficient free space for journal files
2014-10-29T11:58:37.248+0900 [initandlisten] Please make at least 3379MB available in /var/lib/mongo/journal or use --smallfiles

どうやら原因はディスクの空きが足りないことらしい。
調べてみると、MongoDBのデフォルト設定ではジャーナルファイルというものを作るようになっており、 そのファイルを作成するにあたって3.5GB近い空き容量が必要になるみたいです。
なので、自分のサーバの空き容量を確認してみます。

5.自分のサーバの空き容量を調べる。
$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1             7.9G  5.2G  2.4G  69% /
tmpfs                 499M     0  499M   0% /dev/shm

確かに容量が足りていなかった。
容量追加しないといけないのかとも思ったが、ジャーナルファイルなるものは開発環境では特に必要ないんじゃないかということで、このファイルを作成しないように設定を変えました。

6.ジャーナルファイルを生成しないように設定を変える
$ vi /etc/mongod.conf

# Disables write-ahead journaling
# nojournal=true
       ↓
# Disables write-ahead journaling
nojournal=true

7.再度起動させてみる
$ sudo /etc/init.d/mongod stop
Stopping mongod:                                           [  OK  ]

無事起動しました。

続いてPHPで使用出来るようにします。
まずインストールに必要なものをあらかじめインストールしておきます。
$ sudo yum -y install gcc php-pear php-devel

続いてpecl経由でmongoのExtentionをインストール
途中で質問があるが、そのままEnterでOK。
$ sudo pecl install mongo
WARNING: channel "pecl.php.net" has updated its protocols, use "pecl channel-update pecl.php.net" to update
downloading mongo-1.5.6.tgz ...
Starting to download mongo-1.5.6.tgz (193,219 bytes)
.........................................done: 193,219 bytes
116 source files, building
running: phpize
Configuring for:
PHP Api Version:         20100412
Zend Module Api No:      20100525
Zend Extension Api No:   220100525
Build with Cyrus SASL (MongoDB Enterprise Authentication) support? [no] :Enter
building in /var/tmp/pear-build-roottRXj7r/mongo-1.5.6

mongo用にiniファイルを新規作成
$ sudo vi /etc/php.d/mongo.ini
extension=mongo.so ← これを書く

apacheを再起動させます。
$ sudo /etc/init.d/httpd restart

mongoが使用出来る状態になっているか確認します。
下記のように「mongo」と出てきたら成功です。
$ php -m | grep -i mongo
mongo


おまけ
ジャーナルファイルに関して調べてみました。
ここでは簡単にしか記載しませんが、ざっくりとまとめると、

・Mongoは書き込み処理の結果を気にしないので、高速に書き込める。
・Mongoは、まずメモリ上に スタックされ、60秒に1回の間隔でディスクに書き込む。
・ディスクに書き込まれていないデータは、サーバダウンによって消えるため、最大60秒間のデータを失う可能性がある。
・ver1.7までの対応策として用意されている機能は2つあるが、いずれもパフォーマンスを著しく低下させるものである。
・ver1.8にジャーナリング機能が実装され、100ミリ秒に1回ジャーナルファイルに書き込むことで、データ損失のリスクが低減された。しかしパフォーマンスはある程度低下する(30%程度)

ジャーナルファイルに関しては以下の記事に詳しく書いてある。
http://doryokujin.hatenablog.jp/entry/20110614/1308010072

2013年9月13日金曜日

ファイルを削除したにも関わらずディスク容量が増えない場合

DBメンテナンス作業時にデータファイルのコピー作業をしていたら、コピー先のサーバのディスク容量が一杯になってしまい、書き込みが出来ない状況に陥ってしまいました。
そこで、今までコピーしたファイルをディレクトリごと全て削除してディスク容量を確保しようとしたが、dfコマンドで確認するとディスク使用量が40GB程なのに対し、duコマンドで各ディレクトリの使用量の合計を計算すると1GB程度しかなかった。

原因を調べてみると、どうやらゾンビファイルとやらがある状態のため、dfコマンドでは空き容量が増えていなかったらしい。
ゾンビファイルの確認するために現在開いているファイルのプロセスを特定する必要があるので、lsofコマンドを使って調べてみる。
※ちなみにゾンビファイルとは見た目上は消えているが、プロセスが掴んでいるのでkernel上はまだ残っている状態のことだそうです。

このコマンドを使用すると、使用しているプロセスと、掴んでいるファイル名、ファイル容量がわかるのだが、確認してみると、どうやら落としたはずのMySQLプロセスが落ちていなかった。
どうやら誤って別のプロセスであるApacheプロセスを落としてしまっていた。
改めてMySQLプロセスを落とすと、ディスク容量が一気に40GB増えた。
これで一安心。

2011年12月13日火曜日

wgetで別名をつけて保存する方法

やり方は以下の通り。

wget -O 保存するファイル名 URL


クエリストリングをつける場合は、URLをダブルクォーテーションでくくる必要がある。

2011年12月8日木曜日

シンボリックリンクを維持したままコピーする方法とrsync時にシンボリックリンクを維持する方法

今日たまたまシンボリックリンクをコピーしたら普通のディレクトリになっちゃったって話を聞いたので、
調べてみた。
オプションいるだろうなとは思っていたけど、案の定でした。

$ cp -dr srcdir destdir

rsync時に注意しないといけない点として、シンボリックリンクをrsyncするディレクトリに指定すると
ただのフォルダとしてコピーされてしまうので、注意が必要。
回避方法としては、シンボリックリンクが張ってある階層の一階層上のディレクトリを指定してやればOK。
もし必要のないファイルやフォルダがある場合は、excludeで指定してやればよい。

2011年5月24日火曜日

jslinuxってすげー

なんだか最近ネットにちょくちょく上がってくるjslinux。
なんだろうと思って調べてみた。

なにかというとブラウザ上でLinuxをエミュレートしてるもの。

まじでか!と思ったんですけど、普通に動いてました。
Linuxの全てが使えるわけではなく、一部の機能だけのようです。
また、速度的にも実用的なレベルとは言い難いですね。
以下のURLでデモが動いています。

http://bellard.org/jslinux/

すごいの一言。
そもそもブラウザ上でLinuxを動かそうという発想がすごい。
とりあえず何ができるのかとか全く調べてないので、取り急ぎ紹介だけ。

http://journal.mycom.co.jp/news/2011/05/19/012/index.html

2011年5月6日金曜日

bash系のファイルに変更を加えた場合の反映方法

bashファイルに変更を加えた場合、すぐにその設定内容を反映させるためのコマンド。

$ source ~/.bashrc
$ source ~/.bash_profile

2011年4月6日水曜日

scpの通信ログをログファイルに残す方法

cronに登録してあるシェルスクリプト内でscpで通信していて、
その通信ログをログファイルに残そうと思って、リダイレクトしてみたんですが、
ログファイル自体は問題無く生成されたんですが、中身が一向に書き出されない。
で、原因を調べてみたら同じ問題にぶち当たってる人が知恵袋で聞いてました。


scpコマンドでのファイル転送結果を、ログ出力する方法を教えてください。


コマンドとしてはこんな感じらしい。
以下の場合は別サーバからファイルを受信する時のログをa.logにリダイレクトさせるってもの。
知恵袋の回答ではlocalhostをノンパスログインできる状態にしてからやるって書いてあったけど、
とりあえずパスワードありでもログが出せるかどうかの検証だけはできたので、試してみた。

ssh -t -q -A localhost scp user@server:送信元ファイル名 送信先ディレクトリ 1>>a.log


ちなみに指定されているsshのオプションを解説すると、
tオプションは仮想端末を割り当てるためのオプション。
qオプションは警告メッセージ・診断メッセージを抑制するためのオプション。
Aオプションは認証エージェントの転送を許可するためのオプション。

一応上記の方法でログは書きこまれるようになりました。
しかし、scpのログを残すだけでこんなに作業しないといけないとは…。
面倒くさいなぁ~。

sshコマンドのオプションについて

sshコマンドのオプションについて調べてみた。
実はデフォルトのマニュアルに載ってないオプションが結構たくさんあってビビる。
意味がよくわかってない部分もありますが、とりあえず記載しておく。

オプション名 説明
-1 SSHのバージョン1を使用します。
-2 SSHのバージョン2を使用します。
-4 IPv4を指定します。
-6 IPv6を指定します。
-A 認証エージェントの転送を許可します。
-a 認証エージェントの転送を禁止します。
-b IPアドレス 複数のIPアドレスをもつ場合、バインドするIPアドレスを指定します。
-C データを圧縮します。
-c 暗号方式 暗号方式を指定します。
  • 3des(トリプルdes方式)
  • blowfish(ブロック暗号方式)
  • des(des方式)
-D [IPアドレス:]ポート番号 転送に使用するポート番号を指定します。
-e エスケープ文字 エスケープ文字を指定します。
-F ファイル名 設定ファイルを指定します。
-f バックグラウンドで実行します。
-g ホストが転送されたローカルなポートに接続することを許可します。
-I デバイス名 スマートカードのデバイスを指定します。
-i ファイル名 RSA認証 / DSA認証の際に秘密鍵を読むファイルを指定します。
-k GSSAPI証明書をホストに転送することを禁止します。
-L[クライアントIPアドレス:]ポート番号:ホストIPアドレス:ポート番号 クライアント→ホストのポート転送の際のアドレス・ポートを指定します。
-l ログイン名 ログイン名を指定します。
-M 接続を共有する為のmasterモードに設定します。
-m メッセージ認証コード MAC(メッセージ認証コード)を指定します。
  • hmac-md5
  • hmac-sha1
  • umac-64@openssh.com
  • hmac-ripemd160
  • hmac-sha1-96
  • hmac-md5-96
-N リモートコマンドを無効にします。
-n 標準入力からの読み込みを禁止します。
-O コマンド 制御コマンドを実行します。
chesk
マスタープロセスが走っているかのチェックを行います。
exit
マスタープロセスに終了を指示します。
-o オプション 設定ファイルと同じ形式でオプションを指定します。
-p ポート番号 ホストに接続するポートを指定します。
-q 警告メッセージ・診断メッセージを抑制します。
-R [クライアントIPアドレス:]ポート番号:ホスト:ポート番号 ホスト→クライアントのポート転送を行います。
-S ソケットのパス 制御を共有する際に制御用ソケットのパスを設定します。
-s ホスト側でサブシステムの実行を行います。
-T 仮想端末の割り当てを禁止します。
-t 仮想端末を割り当てる。
-V バージョンを表示します。
-v 進行中のデバッグメッセージの表示を行います。
-w クライアント側のトンネルデバイス,[:ホストのトンネルデバイス] トンネリングするクライアントのデバイスとホストのデバイスを設定します。
-X X11 の転送を許可します。
-x X11 の転送を禁止します。
-Y 信頼されたX11転送を許可します。

vimで文字コードを修正する

よく使うけど、結構忘れるのでメモ。

vimでファイルを開いたりするとファイルが文字化けしている場合がある。
こういった場合には、ファイルの文字コードを指定して開きなおす必要がある。
まず開いたファイルの文字コードを変更して読み込む方法は以下の通り。
:e ++enc=文字コード
例)
:e ++enc=utf-8


ファイルの文字コードを指定して保存する方法は以下の通り。
:set fileencoding=utf-8

2011年3月15日火曜日

文字コードを変換する

ファイルの文字コードを調べたりするのに使う。

文字コードがわからないファイルを以下の方法で開くときちんと見れる
nkf ファイル名

オプション一覧
-j(省略可能) : JISコード(ISO-2022-JP)を出力
-e           : EUCコードを出力
-s           : Shift-JISコードを出力
-w           : UTF-8コードを出力(BOM無し)
-Lu          : unix改行形式(LF)に変換
-Lw          : windows改行形式(CRLF)に変換
-Lm          : macintosh改行形式(CR)に変換
-g(--guess)  : 自動判別の結果を表示
--overwrite  : 引数のファイルに直接上書き
--version    : バージョン情報を表示(インストール済チェック)

文字コードを確認する方法
$ nkf -g example.txt

文字コードをEUC-JPに変換する
$ nkf -e --overwrite example.txt

文字コードをUTF-8に変換する
$ nkf -e --overwrite example.txt

VMWareの仮想ディスクの拡張方法

VMWareで最初にパーティション切ってた容量がいっぱいになっってきたので、拡張してみた。
Windwosの方の空き容量が100GB以上あったので、とりあえず8GBから20GBに拡張してみた。
手順は以下の通り。


1.まず現状を確認する。
使用率が76%になっていてあまり空き容量に余裕がないことが確認できる。
確認したらVMWareを落とす。

# df -h
Filesystem          サイズ  使用  残り 使用% マウント位置
/dev/mapper/VolGroup00-LogVol00
                      7.2G  5.1G  1.7G  76% /
/dev/hda1              99M   12M   82M  13% /boot
tmpfs                 506M     0  506M   0% /dev/shm

2.VMWare-Serverに付属している「vmware-vdiskmanager.exe」を探す。
VMWareのインストールディレクトリ内にある。
通常であれば
「C:\Program Files\VMWare\VMware Server」の中にあります。

3.vmdkファイルの場所を探す。
基本的には「C:\Virtual Machines\[OS名]\[OS名].vmdk」になります。
似たような名前で「[OS名]-flat.vmdk」というファイル名があり、仮想HDD容量分のファイルがありますが、
使用するのはこちらではなく、「[OS名].vmdk」というファイルになります。

3.コマンドプロンプトを立ち上げて、「vmware-vdiskmanager.exe」があるディレクトリへ移動します。
cd C:\Program Files\VMWare\VMware Server

4.vmdkファイルを拡張します
vmware-vdiskmanager.exe -x 20GB C:\Virtual Machines\[OS名]\[OS名].vmdk

5.拡張が終わると以下のようなメッセージが出ます。
なにかWARNINGが出てますが、問題ありません。
Grow: 100% done.

The old geometry C/H/S of the disk is: 7281/16/63
The new geometry C/H/S of the disk is: 10402/16/63
Disk expansion completed successfully.

WARNING: If the virtual disk is partitioned, you must use a third-party
         utility in the virtual machine to expand the size of the
         partitions. For more information, see:
         http://www.vmware.com/support/kb/enduser/std_adp.php?p_faqid=1647

6.VMWareを立ち上げて状態を確認
容量が増えていることを確認する
# fdisk -l
Disk /dev/hda: 21.4 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes

デバイス Boot      Start         End      Blocks   Id  System
/dev/hda1   *           1          13      104391   83  Linux
/dev/hda2              14        1044     8281507+  8e  Linux LVM

7.パーティションを作成する
# fdisk /dev/hda
このディスクのシリンダ数は 2610 に設定されています。
間違いではないのですが、1024 を超えているため、以下の場合
に問題を生じうる事を確認しましょう:
1) ブート時に実行するソフトウェア (例. バージョンが古い LILO)
2) 別の OS のブートやパーティション作成ソフト
   (例. DOS FDISK, OS/2 FDISK)
コマンド (m でヘルプ): n
コマンドアクション
   e   拡張
   p   基本領域 (1-4)
p
領域番号 (1-4): 3
最初 シリンダ (1045-2610, default 1045):Enter
Using default value 1045
終点 シリンダ または +サイズ または +サイズM または +サイズK (1045-2610, default 2610):Enter
Using default value 2610

コマンド (m でヘルプ): t
領域番号 (1-4): 3
16進数コード (L コマンドでコードリスト表示): 8e
領域のシステムタイプを 3 から 8e (Linux LVM) に変更しました

コマンド (m でヘルプ): wq
領域テーブルは交換されました!

ioctl() を呼び出して領域テーブルを再読込みします。

警告: 領域テーブルの再読込みがエラー 16 で失敗しました: デバイスもしくはリソースがビジー状態です。
カーネルはまだ古いテーブルを使っています。
新しいテーブルは次回リブート時に使えるようになるでしょう。
ディスクを同期させます。

8.状態を再び確認
/dev/hda3が追加され、そこに空き容量が割り当てられていることを確認する
# fdisk -l
Disk /dev/hda: 21.4 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes

デバイス Boot      Start         End      Blocks   Id  System
/dev/hda1   *           1          13      104391   83  Linux
/dev/hda2              14        1044     8281507+  8e  Linux LVM
/dev/hda3            1045        2610    12578895   8e  Linux LVM

9.リブートもしくはpartprobeを実行する。今回はpartprobeで即時反映させる。
# partprobe

10.物理ボリュームを作成する
# pvcreate /dev/hda3
Physical volume "/dev/hda3" successfully created

11.既存のボリュームグループ(VG) に新しいパーティションを追加する
# vgextend VolGroup00 /dev/hda3
  /dev/hdc: open failed: メディアが見つかりません
  Volume group "VolGroup00" successfully extended

12.既存の論理ボリューム(LV) を追加したパーティションの分、拡張する。既存のLV は lvdisplay で確認。たぶん 「LogVol00」
# lvdisplay -C
  /dev/hdc: open failed: メディアが見つかりません
  LV       VG         Attr   LSize   Origin Snap%  Move Log Copy%  Convert
  LogVol00 VolGroup00 -wi-ao   7.38G
  LogVol01 VolGroup00 -wi-ao 512.00M

13.vgdisplay で拡張できるサイズを確認する
# vgdisplay
  /dev/hdc: open failed: メディアが見つかりません
  --- Volume group ---
  VG Name               VolGroup00
  System ID
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  4
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               19.84 GB
  PE Size               32.00 MB
  Total PE              635
  Alloc PE / Size       252 / 7.88 GB
  Free  PE / Size       383 / 11.97 GB
  VG UUID               pvKmW5-rMWe-K7gi-IMhr-xaBy-GPDZ-xs14kc

14.[PE Size] * [Free PE] の値が拡張できるサイズとなるので、32MB * 383 = 12256MB を拡張する。
# lvextend -L +12256MB /dev/VolGroup00/LogVol00
  /dev/hdc: open failed: メディアが見つかりません
  Extending logical volume LogVol00 to 19.34 GB
  Logical volume LogVol00 successfully resized

15.ファイルシステムを拡張する。
# resize2fs /dev/VolGroup00/LogVol00
resize2fs 1.39 (29-May-2006)
Filesystem at /dev/VolGroup00/LogVol00 is mounted on /; on-line resizing required
Performing an on-line resize of /dev/VolGroup00/LogVol00 to 5070848 (4k) blocks.
The filesystem on /dev/VolGroup00/LogVol00 is now 5070848 blocks long.

16.容量が増えていることを確認する
# df -h
Filesystem          サイズ  使用  残り 使用% マウント位置
/dev/mapper/VolGroup00-LogVol00
                       19G  5.1G   13G  29% /
/dev/hda1              99M   12M   82M  13% /boot
tmpfs                 506M     0  506M   0% /dev/shm

2011年3月7日月曜日

mysqlの世代バックアップとリストアに関して

mysqlの世代バックアップは以下の通り。
cronの実行時間に関しては適宜変更する。
以下の記述で4日間分のバックアップが残る

* * * * * mysqldump -u ユーザー名 -p パスワード データベース名 --default-character-set=文字コード | gzip > db/dump_`date +"\%Y\%m\%d_\%H"`.sql.gz
* * * * * find db/ -type f -name "dump_*.tar.gz" -mtime +3 -daystart | xargs rm

バックアップからデータベースにリストアする方法は以下の通り。
zcat ダンプファイル名.gz | mysql -u ユーザー名 -p パスワード データベース名

こんな感じでリストアできるみたい。
zcatコマンドとかつかったこと無かったけど、こんな風に使うのか。

2011年2月2日水曜日

rsyncの書き方

rsyncはネットワーク経由のコピーも可能なファイル・ディレクトリ同期ツールで、コマンドひとつでディレクトリツリーを一気に転送できるほか、差分のみの転送やコピー対象の条件指定といった多彩な機能を搭載している。 rsyncという名前に反してローカル間のコピーも可能で、makeファイル内でデータディレクトリを丸ごとコピーするといった用途にも便利に使えます。

基本的な書き方は以下の通り
rsync [オプション] コピー元 [コピー元...] コピー先


参考サイト
http://webos-goodies.jp/archives/51213844.html
http://d.hatena.ne.jp/kobapan/20091016/1255677010
http://d.hatena.ne.jp/pyopyopyo/20040925/p3

2011年1月27日木曜日

crontabの書き方

いつもお世話になっているcron による定期実行。「cron なんて簡単だよ」っと思ってる方は結構多いのではないだろうか。いや、実際に cron はわかりやすいプログラムだし、そんなに難しいものではない。だが、意外と覚えることが多く(メモっておけば覚える必要なんてこれっぽっちもないんだが)、自分の思うような動作をしてくれなかったりすることもあるので、ちょっとだけ cron について真剣に勉強してみることにした。まず、基本中の基本として、cron の設定ファイルは、/etc/crontab に記述されている。さらには、/etc/cron.daily/、/etc/cron.weekly/、/etc/cron.monthly/ 以下に格納された設定ファイルを1日1回、週に1回、月に1回と実行してくれるのはすでに周知のことだろう。

まず、/etc/crontab を見てみる。筆者のLANDISKでは、デフォルトでは以下のように記述されている。まず、/etc/cron.daily と、/etc/cron.weekly と /etc/cron.monthly 以下のスクリプトを実行するということは、crontab を見慣れた方ならば一目瞭然だが、test だの、run-parts だの、/usr/sbin/anacron だのは実際になにをやっているのだろうか? まず、test -x という部分を見てみる。これは、「ファイルが存在すれば実行する」ということを意味している。test -x /usr/bin/anacron で、/usr/sbin/anacronが存在するかどうかをチェックし、存在しなければを表すのが「|| 」の記号になる。run-parts はコマンドを表し、ディレクトリ内にあるスクリプトを実行するコマンドのことである。つまり、/etc/cron.daily/ 以下にあるスクリプトが実行できるようになる。結論としてこの1行は「/usr/sbin/anacronがあるかどうかチェックし、なければ、run- parts コマンドを実行しろ」ということを表している。実際に、筆者の環境では、anacron はインストールされていないので run-parts コマンドが実行されることになる。--report というオプションは、verbose みたいなものだが、スクリプトの名前のみが出力されると man には書いてあった。

landisk:~# cat /etc/crontab

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user command
17 * * * * root run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || run-parts --report /etc/cron.daily
47 6 * * 7 root test -x /usr/sbin/anacron || run-parts --report /etc/cron.weekly
52 6 1 * * root test -x /usr/sbin/anacron || run-parts --report /etc/cron.monthly

次に、左から数えて5番目のフィールドまで説明する。* (アスタリスク)があったり、数字があったりする箇所だ。率直に左からいうと、「分(minutes)・時(hour)・日(day)・月(month)・週(week)」という順番になっている。* を指定した場合は、全ての有効な値が設定されたことになります。

 分(minutes) 0-59 の間で指定する
 時(hour) 0-23 の間で指定する
 日(day) 1-31 の間で指定する
 月(month) 1-12 もしくは、名前
 週(week) 0-7 もしくは、名前。0 と 7 は日曜日。


例1) 毎朝6時25分に hoge.sh を実行する

25 6 * * * /usr/local/bin/hoge.sh

例2) 3時間ごとにhoge.shを実行する。

0 */3 * * * /usr/local/bin/hoge.sh

例3) 12月24日0時0分、クリスマスイブに hoge.sh を実行。なにが起きるんだろう。

0 0 24 12 * /usr/local/bin/hoge.sh

例4) 8時から17時の間、2時間ごとに、hoge.sh を実行する

0 8-17/2 * * * /usr/local/bin/hoge.sh

例5)毎月2日、12日、22日の12時にhoge.sh を実行する

00 12 2,12,22 * * /usr/local/bin/hoge.sh


■環境変数・シェル変数の定義

/etc/crontab の先頭には、以下のような環境変数やシェル変数を記述しておきます。cron はデフォルトでは、/etc/crontab の所有者(つまり、root )にメールを送信し、その実行結果を報告します。特定の宛先にメールを送信する場合は、MAILTO でアドレスを指定します。「MAILTO=""」のように空白を指定した場合は、誰にもメールを送信しなくなります。その他、環境変数 PATH を記述しておくことで、コマンドを絶対パスで記述する必要がなくなります。

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root




     crontab コマンド
 
/etc/crontab は直接編集するのではなく、crontab -e コマンドによって編集するのがBEST(当然?)とされています。筆者のようななんちゃってリナクサーは、直接 vi で編集してしまうのですが、作法としては良い事ではなさそうな感じです。まぁ、でも編集してはいけないということではなく、大まかな指定では、/etc /cron.{hourly,daily,weekly] で指定し、より細かく制御したい場合は、/etc/crontab もしくは、crontab -e を使ったほうが管理の面でも楽なことは確かです。あるいは、/etc/cron.d/ 以下にスクリプトを置くという手もありますね。/etc/crontab と crontab -e では、crontab が保存される場所が異なるので、編集するならどちらか片方に統一しておいた方が良いと思います(どちらか片方のファイルを見ればいいだけなので)。 crontab -e コマンドを使うと、root のみならず、一般ユーザも定期的な実行を行うことができます。その場合、/var/spool/cron/user に個別に設定が保存され、root の場合は、/var/spool/cron/root に保存されるようになる。cron の場合、設定ファイルを保存した時点で、cron が自動的に変更を検知するため、cron デーモンの再起動は必要ありません。/etc/hosts.allow などのように、保存した時点で設定が反映されます。

crontab のオプションを以下に記述します。書式に関しては、/etc/crontab と同様である。ユーザフィールド(/etc/crontab では root となっている箇所)は自分のcrontab なので省略することができる(/etc/crontab でも省略できるが)。

 -e crontabを編集する。
 -l 登録されているcrontabを表示する。
 -r 登録されているcrontab を削除する
 -u ユーザ名 設定するcrontabのユーザ名を指定する




     メール送信設定
 
cron は、 /etc/crontab に記述された処理を 指定したユーザ宛にその実行結果を送信します。これはとてもありがたい機能ですが、時として非常にうざったい機能にもなります。Logwatch のように 稼動しているサービス一覧のログを取得し、一通のメールにまとめて送信してくれるならまだしも、ひとつひとつのシェルスクリプトに対して個別にメールを送られたのではたまったものじゃありません。なので、メールを送信してもいいジョブと、送信する必要のないジョブを明確にきりわけておく必要があるでしょう。

①----
標準出力、標準エラー出力とも捨てる設定です。つまり、メールは送信しないし、ファイルにも出力しない、スクリプトを実行した記録はどこにも残らないという意味なります。

②----
標準出力を捨て、標準エラー出力をメールで送信する設定です。エラーになった処理だけを知らせてくれるので場合によっては①よりも効率が良いといえます。

③----
メール送信はしないが、/var/log/origin.log に標準出力と標準エラー出力を残すという意味になる。メールで通知を受け取るほど重要度が高くないが、一応ログには残しておきたい場合には、この方法は有効でしょう。

25 6 * * * root test -x /usr/sbin/anacron || run-parts --report /etc/cron.daily
47 6 * * 7 root test -x /usr/sbin/anacron || run-parts --report /etc/cron.weekly
52 6 1 * * root test -x /usr/sbin/anacron || run-parts --report /etc/cron.monthly

05 5 * * * root /usr/local/bin/hoge.sh > /dev/null 2>&1 ----------------①
05 5 * * * root /usr/local/bin/hoge.sh 1> /dev/null 2> /dev/null ---------①
05 5 * * * root /usr/local/bin/hoge.sh 1> /dev/null ----------------------②
05 5 * * * root (/usr/local/bin/tames.sh > /var/log/origin.lo 2>&1) > /dev/null --③

2011年1月13日木曜日

Linuxのよく使うと思われるシステム関連のコマンド

よく使いそうなコマンドをまとめておく。

システム管理系コマンド


date日付や時刻を表示,設定する
fingerユーザー情報・最新カーネルのバージョンを表示する
freeメモリーの使用状況を表示する
groupaddグループを作成する
groupdelグループを削除する
groupmodグループ情報を変更する
idユーザーIDやグループIDを表示する
last最近ログインしたユーザーの情報を表示する
lastlogユーザーが最後にログインした日付を表示する
passwdユーザーのパスワードを変更する
sg別のグループIDでコマンドを実行する
suユーザーを切り替える
sudo指定したユーザーでコマンドを実行する
unameシステム情報の表示
useraddユーザーを追加する
userdelユーザーを削除する
usermodユーザーのアカウント情報を変更する
vmstatメモリーやCPUの負荷率や使用状況を表示する
wログインしているユーザー名と処理内容を表示する
who現在ログインしているユーザーを表示する

ジョブ・プロセス管理系コマンド

at指定時刻にジョブを実行する
atq実行待ちジョブを表示する
atrm実行待ちジョブを削除する
batch自動的にジョブを実行する
crontabプログラムを定期的に実行するcrondの設定ファイルを編集する
killプロセスおよびジョブを強制終了する
nice優先順位を決めてコマンドを実行する
nohupログアウトした後もコマンドを実行し続ける
pidofプロセスのpidを調べる
ps実行中のプロセスを表示する
pstreeプロセスの親子関係をツリー表示する
sleep指定された時間,停止する
stopバックグラウンドのジョブを停止する
time指定したコマンドの実行時間を表示する
top現在のシステム状況を表示する

2011年1月12日水曜日

複数ファイル名を一括で変更する

renameコマンドを使うと一括でファイル名を変更することができる。
意外と便利。

2011年1月11日火曜日

grepコマンドで特定のディレクトリを除外して検索する方法

svn管理しているディレクトリ内をgrepする場合は以下のようにするとsvn管理下のファイルがヒットしないようになる。
grep -r --exclude=*.svn* 検索テキスト 対象ディレクトリ

ちなみに「--exclude=*.svn*」の「*.svn*」は正規表現のパターンなので、結構フレキシブルに使える。
grep -r --exclude=正規表現のパターン 検索テキスト 対象ディレクトリ