カテゴリー: Linux

LPIC レベル2関連-カーネルコンパイルについて

LPIC レベル2関連-カーネルコンパイルについて

■カーネルの再構築を考慮するケース
・必要なデバイスドライバがカーネルに含まれていない
・使用しているハードウェアに最適化したカーネルを利用したい
・カーネルの最新の機能を利用したい
■カーネルコンパイル(再構築)の流れ

ハードウェアの確認
必要な機能の確認
カーネルの確認
コンパイルに必要なツールの準備
カーネルソースの入手
カーネルソースコードの展開
パッチの適用
既存カーネルの設定を反映させる
/usr/src/linuxへのシンボリックリンクを張る
カーネルを設定する
コンパイルを実行する
カーネルに動的に組み込むモジュール(ローダブル・モジュール)を/lib/modules/[カーネルバージョン]以下に格納する
カーネルに導入する
ブートローダに登録する
システムを再起動して起動を確認する

■メモ
・カーネルコンパイルの難所はカーネル・パラメータの指定内容とコンパイル時の依存関係
・静的に組み込む、組み込まない、動的に組み込むモジュールがある
・設定に迷ったらモジュールにする
・入手したカーネルは慣習として/usr/srcディレクトリに展開する
・カーネル・パラメータの設定は「menuconfig」を推奨?
・カーネルを再構築する場合はカーネルモジュールもカーネルにあわせてコンパイルしなおす必要がある
・kernel.orgで配布されているディストリビュータの手が入っていないカーネルのことをvanilla kernelという

■参考URL

Linuxカーネル・コンパイル入門 前編

Linuxカーネル・コンパイル入門 後編

Linuxカーネルの設定パラメータ

CentOSに最新カーネルを導入する(カーネル再構築)

[LPIC]カーネルの再構築(実際に実施したメモ)

The Linux Kernel Archives(カーネル開発グループが配布しているオリジナルのカーネル・ソース)

■自分でコンパイルしたログ

◇フォルダ移動
# cd /usr/src/
◇カーネルソースの取得
# wget http://www.kernel.org/pub/linux/kernel/v2.6/longterm/v2.6.32/linux-2.6.32.60.tar.bz2
◇ソース展開
# tar xjvf linux-2.6.32.60.tar.bz2
◇フォルダに入る
# cd linux-2.6.32.60
◇現在のカーネルの設定をコピー
# cp /boot/config-2.6.18-308.el5 .config
◇現在のカーネルの設定を新しい設定に反映させる
# make oldconfig | tee oldconfig.log
◇カーネルコンフィギュレーション
これやら無いと起動時にkernel panic出てびっくりした。
# make menuconfig
General setup --->
[*] enable deprecated sysfs features to support old userspace too
◇設定が反映されているか確認(yになってることを確認)
# cat .config | grep CONFIG_SYSFS_DEPRECATED
CONFIG_SYSFS_DEPRECATED=y
CONFIG_SYSFS_DEPRECATED_V2=y
◇makeする(カーネルとカーネルモジュールのコンパイル)
# make | tee make.log
◇カーネルモジュールのインストール
# make modules_install | tee modules_install.log
◇カーネルのインストール
# make install | tee install.log
◇起動の順番を変える(default値の変更)
# vim /boot/grub/menu.lst
◇再起動
# reboot
◇確認
# uname -r
2.6.32.60

※LPICレベル2の順番だと出来なかったので以下のサイトを参考に実際にコンパイルを行った。
centosのkernel再構築 2.6.18→2.6.37(stable)

JsTestDriverで「Oh Snap! No server defined!」って出た。

JsTestDriverで「Oh Snap! No server defined!」って出た。

テスト駆動Javascriptを読んでて「JsTestDriver」を導入しようと思って設定してたら
java.lang.RuntimeException: Oh Snap! No server defined!
っていうエラーが出た話。

そもそもの「JsTestDriver」の導入方法はアシアルさんが丁寧に書いてくれているのでそれを真似る。
windows版では問題なく動いたんだけどCentOS5の環境でやろうとしたらエラー出たという。。

アシアルさん:JsTestDriverで簡単テスト

■実際にエラーになったコマンド

$ java -jar $JSTESTDRIVER_HOME/JsTestDriver-1.3.5.jar --tests all
setting runnermode QUIET
java.lang.RuntimeException: Oh Snap! No server defined!
        at com.google.jstestdriver.config.DefaultConfiguration.getServer(DefaultConfiguration.java:61)
        at com.google.jstestdriver.config.Initializer.initialize(Initializer.java:99)
        at com.google.jstestdriver.embedded.JsTestDriverImpl.createRunnerInjector(JsTestDriverImpl.java:368)
        at com.google.jstestdriver.embedded.JsTestDriverImpl.runConfigurationWithFlags(JsTestDriverImpl.java:342)
        at com.google.jstestdriver.embedded.JsTestDriverImpl.runConfiguration(JsTestDriverImpl.java:233)
        at com.google.jstestdriver.Main.main(Main.java:70)
Unexpected Runner Condition: Oh Snap! No server defined!
 Use --runnerMode DEBUG for more information.

■今回のフォルダ構成

jarファイル

/home/myname/bin/
`– JsTestDriver-1.3.5.jar

ソースとテストファイル

/home/myname/public_html/Javascript/
|– JsTestDriver.conf
|– src
| `– sample.js
`– test
`– sample.js

どうも原因はconfファイルを見つけられなかったことらしい。
なので明示的に対対象の設定ファイルの場所を「–config」オプションで指定するようにする。
※絶対パスで指定してるけど別に相対でも可。

$ java -jar $JSTESTDRIVER_HOME/JsTestDriver-1.3.5.jar --config /home/myname/public_html/Javascript/JsTestDriver.conf --tests all
setting runnermode QUIET
..
Total 2 tests (Passed: 2; Fails: 0; Errors: 0) (1.00 ms)
  Microsoft Internet Explorer 9.0 Windows: Run 2 tests (Passed: 2; Fails: 0; Errors 0) (1.00 ms)

動いたー!

■参考URL

JsTestDriverで簡単テスト

java.lang.RuntimeException: Oh Snap! No server defined!

JsTestDriver導入

OpenVZのCentOS6(guest)でyum-fastestmirrorのエラーが出た。

OpenVZのCentOS6(guest)でyum-fastestmirrorのエラーが出た。

実験機のOpenVZのゲストにjavaを入れようとしたらyumでエラーが出た。

# yum search java
Loaded plugins: fastestmirror
Determining fastest mirrors
Traceback (most recent call last):
  File "/usr/bin/yum", line 29, in <module>
    yummain.user_main(sys.argv[1:], exit_code=True)
  File "/usr/share/yum-cli/yummain.py", line 285, in user_main
    errcode = main(args)
  File "/usr/share/yum-cli/yummain.py", line 136, in main
    result, resultmsgs = base.doCommands()
  File "/usr/share/yum-cli/cli.py", line 438, in doCommands
    return self.yum_cli_commands[self.basecmd].doCommand(self, self.basecmd, self.extcmds)
  File "/usr/share/yum-cli/yumcommands.py", line 686, in doCommand
    return base.search(extcmds)
  File "/usr/share/yum-cli/cli.py", line 1030, in search
    for (po, keys, matched_value) in matching:
  File "/usr/lib/python2.6/site-packages/yum/__init__.py", line 2540, in searchGenerator
    for sack in self.pkgSack.sacks.values():
  File "/usr/lib/python2.6/site-packages/yum/__init__.py", line 897, in <lambda>
    pkgSack = property(fget=lambda self: self._getSacks(),
  File "/usr/lib/python2.6/site-packages/yum/__init__.py", line 682, in _getSacks
    self.repos.populateSack(which=repos)
  File "/usr/lib/python2.6/site-packages/yum/repos.py", line 265, in populateSack
    self.doSetup()
  File "/usr/lib/python2.6/site-packages/yum/repos.py", line 92, in doSetup
    self.ayum.plugins.run('postreposetup')
  File "/usr/lib/python2.6/site-packages/yum/plugins.py", line 184, in run
    func(conduitcls(self, self.base, conf, **kwargs))
  File "/usr/lib/yum-plugins/fastestmirror.py", line 202, in postreposetup_hook
    all_urls = FastestMirror(all_urls).get_mirrorlist()
  File "/usr/lib/yum-plugins/fastestmirror.py", line 369, in get_mirrorlist
    self._poll_mirrors()
  File "/usr/lib/yum-plugins/fastestmirror.py", line 413, in _poll_mirrors
    pollThread.start()
  File "/usr/lib/python2.6/threading.py", line 474, in start
    _start_new_thread(self.__bootstrap, ())
thread.error: can't start new thread

とりあえず「yum clean all」するも駄目。

# yum clean all
Loaded plugins: fastestmirror
Cleaning repos: base extras updates vz-base vz-updates
Cleaning up Everything
Cleaning up list of fastest mirrors

fastestmirrorが悪いのかな?と思い以下を実行

# rpm -ev --nodeps fastestmirror
error: package yum-fastestmirror is not installed

そんなのは無いといわれる。

色々調べてみたところ同じような現象に遭遇していた人がいたので
そこのブログの内容を参考に対応してみる。

要するに、VPSだとyumでメモリ不足の問題が発生する事が多いから、
fastestmirror pluginは使わないでね、という事みたいですね。

ということなので同じように「–disablepplugin」してみる。

# yum --disableplugin=fastestmirror search java

できた!

こっちもおんなじ用に毎回「–disablepplugin」するの面倒なので
削除を試みる。

# rpm -qa | grep yum
yum-3.2.29-30.el6.centos.noarch
yum-metadata-parser-1.1.2-16.el6.i686
yum-plugin-fastestmirror-1.1.30-14.el6.noarch
# rpm -ev --nodeps yum-plugin-fastestmirror-1.1.30-14.el6.noarch
# yum search java

出来た

■参考URL

yumでyum-fastestmirrorのエラーAdd Star

[DTI ServersMan@VPS]yum updateで早速エラーですよ。

PHPプログラム中でapacheユーザでchownする方法

PHPプログラム中でapacheユーザでchownする方法

PHPでブラウザからプログラムを動かして、
作成したファイルやフォルダの権限を変更したい場合のやり方。

通常はapacehユーザでファイルやフォルダが作成
されてしまうのでプログラム中でchownを実行したいの
だけれど、chownはrootで動かさないとなのでこのまま
単純にchownを実行しても権限やグループを変えることが
できない。

そこで、sudoでapacheユーザに特定のコマンドだけを許すように設定
を変更する。

# visudo

apache ALL=(ALL) NOPASSWD: /bin/mkdir, /bin/chown

上記の場合はapacheユーザにパスワード無しで「mkdir」と「chown」の実行を許可している。
他のコマンドも許可したければ、続けて記述していけばOK。

これで大丈夫かなと思って実行してみたらchownで変更できていない。
エラーログを見ると以下のメッセーが・・・。

「sudo: sorry, you must have a tty to run sudo」

SSHクライアントとかコンソールではエラーが出ないのに。。。
調べてみると「Defaults requiretty」をコメントアウトすればいいことが判明。

# visudo

Defaults requiretty
↓
#Defaults requiretty

するとエラーが出なくなり、無事にchownが実行できた。

■参考URL

Apacheユーザーでsudo

TTY経由でないsudoの実行

アドレスの統一(index.html有り版)

アドレスの統一(index.html有り)

前回のエントリではindex.html無しにする場合だったので
index.html有りにする場合も書いておく。

.htaccessの記述

RewriteEngine on

#TOPページの処理
RewriteRule ^$ http://example.com/index.html [R=301,L]

#下層ページの処理
#ただし/xxxxxxxx/のURLは除外
RewriteCond %{THE_REQUEST} !^.*/xxxxxxxx/
RewriteCond %{THE_REQUEST} ^.*/
RewriteRule ^(.*)/$ http://example.com/$1/index.html [R=301,L]

※除外的なものも入れてる。

OpenVZのゲスト側で他のNAS(TeraStasion)のフォルダをマウントする

OpenVZのゲスト側で他のNAS(TeraStasion)のフォルダをマウントする設定を
していたけど、すっかり忘れていたのでメモ。

ホストはCentOS6.2

■大体の構成

ホストサーバにOpenVZをいれて複数のゲストサーバ
を立てて社内の開発環境を構築していて、ゲスト側
で社内の他のNASにアクセスできるように設定を行っている。
主にホストの「/etc/fstab」と「/etc/rc.d/rc.local」で
実現している。

「/etc/rc.d/rc.local」とは起動プロセスの最後に実行されるシェルスクリプトのこと。

今回はこれが思い出せなかった・・・。

■そもそもなんでそんなことになったのか。

OpenVZを使ってゲスト側で直接NAS(TeraStasion)を
マウントしようとしてもcifsのエラーが出てmount
出来なかった。

■回避方法

ホスト側で起動時にマウントを行うようにし、
マウントしてOpenVZが起動し終わったあとに
/etc/rc.d/rc.local
で各ゲストにbindするように設定してみた。

■ホスト側の/etc/fstabサンプル

#
# /etc/fstab
# Created by anaconda on Thu Mar 15 05:40:21 2012
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/VolGroup-lv_root / ext4 defaults 1 1
UUID=2f2b3876-c89f-49b9-896b-4436a2cf4199 /boot ext4 defaults 1 2
/dev/mapper/VolGroup-lv_home /home ext4 defaults 1 2
/dev/mapper/VolGroup-lv_swap swap swap defaults 0 0
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0

# mount1
192.168.1.xx:/mnt/array1/folder1 /mnt/mout_folder1 nfs rsize=8192,wsize=8192,nolock,hard,intr 0 0
# mount2
192.168.1.xx:/mnt/array1/folder2 /mnt/mout_folder2 nfs rsize=8192,wsize=8192,hard,intr 0 0

「mnt/array1」とかなっているマウントしたい対象のNASは
今回のケースではBuffaloのTeraStation。
TeraStationはNFSの機能が付いていたのでNFSフォルダーと
NFSクライアント設定を事前に作成しておいた。

■ホスト側の/etc/rc.d/rc.localサンプル

#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.

touch /var/lock/subsys/local
#bind
mount --bind /mnt/mout_folder1 /home/vz/root/180/var/www/html/clients
以下続く・・・。

上記はホストでマウントしたフォルダをホスト上にあるOpenVZのゲストのフォルダにbindしている。
これで結果的にゲスト側でもマウントしているような状態でファイルが操作できる。
mount –bindはマウントしたファイルシステムの一部を別のディレクトリにマウントし直すと
いうシンボリック的な役割をしてくれる。

 

こうやって書いてみると面倒な仕組みになってるなー。
他にやり方ないのかな?

 

特定のファイル(URL)を除いたindex.htmlの有り、無しの統一

特定のファイル(URL)を除いたindex.htmlの有り、無しの統一

mod_rewriteは何度調べても全然覚えられません。。

SEO関連で調整するよう言われたので調査。
index.htmlの有り、無しの統一というありがちな話。
こんな感じ。
hogehoge/index.htmlをhogehoge/にする。

ただ今回は特定のファイル(URL)の場合を除くという指令。

サンプルフォルダ構成

— base
|– a
| `– index.html
|– b
| `– index.html
|– c
| |– cc
| | `– index.html
| `– index.html
`– index.html

.htaccessの記述

RewriteEngine on
RewriteCond %{THE_REQUEST} !^.*/b/index.html
RewriteCond %{THE_REQUEST} ^.*/index.html
RewriteRule ^(.*)index.html$ http://example.com/base/$1 [R=301,L]

この場合
http://example.com/base/b/index.html
だけindex.htmlが書き換えられない。

RewriteCondは連続して書くとANDになるから。
ORでつなげたい場合は[OR]をつける
RewriteCondの条件で大文字小文字を区別しない場合は[NC]をつける

■RewireRuleの書式
RewriteRule Pattern Substitution [flags]
くわしくはこちら

■flagsの種類

  • redirect|R [=code] (強制 redirect)
  • forbidden|F (URL を強制的に forbidden(禁止)にする)
  • gone|G (URL を強制的に gone(消去済み)にする)
  • proxy|P (強制 proxy)
  • last|L (last(最後の)ルール)
  • next|N (next(次の)一周)
  • chain|C (次のルールにchained (チェイン))
  • type|T=MIME-type (MIME type の強制指定)
  • nosubreq|NS (内部の sub-request が no (ない) 時のみ 使われる)
  • nocase|NC (no case)
  • qsappend|QSA (query string append)
  • noescape|NE (no URI escaping of output)
  • passthrough|PT (pass through to next handler)
  • skip|S=数字 (skip next rule(s))
  • env|E=VAR:VAL (set environment variable)

参考サイト

楽:技林ブログ>mod_rewrite サンプル集

技林TOP > 自宅サーバ構築メモ > mod_rewrite

index.html「あり・なし」のURL正規化 – 301リダイレクト応用編

A Users Guide to URL Rewriting with the Apache Webserver

mod_rewrite モジュール URL 書き換えエンジン

LPI Level1 の記録

先日取得したLPI Level1の記録。

出題範囲が2年前に買ったLPIC レベル1の本の範囲と変わるということで
勿体無いのと、なんか資格欲しいかもと思ったので受験。
LPI Level1 Exam 101 670点
LPI Level1 Exam 102 630点

試験範囲が変わる直前にLPI Level1 取得。

勉強は小豆本のRelease3.0対応本と

Ping-tで勉強。全部金にするまでやって、コマ問までやった。
とりあえず上記のことをすれば普通に合格できると思う。

ただ、満点取るのは難しいとおもう。
実際に見たことも無い問題が少し出題されて焦った。。

勉強してみてLevel1はLinuxに慣れるという意味では結構
いいんじゃないかなと思った。
でも実際のサーバの設定系はLevel2からなので実務に関係する
のはLevel2以降なんだなと。

今からLevel1の取得を目指す人は出題範囲が変わったので

↑こっちを買わないといけないので注意。

次はLevel2を目指します。年内に取れたらいいな。
とりあえずRelease3.5対応の小豆本が発売されるの待ってます。

LPI Level3の取得までが目標。

CentOS6.2をホストにしてopenVZ入れてコンテナのバックアップとバックアップからのコンテナの作成メモ

タイトルの通り・・・
CentOS6.2をホストにしてopenVZ入れてコンテナのバックアップとバックアップからのコンテナの作成メモ

環境CentOS6.2

■openVZのインストール自体は以下のサイトを参考に

Installing And Using OpenVZ On CentOS 6.0

■vzdumpのインストール

◇ダウンロードしてインストールしてみる。

#wget http://download.openvz.org/contrib/utils/vzdump/vzdump-1.2-4.noarch.rpm
#rpm -i vzdump-1.2-4.noarch.rpm

◇足りないって言われる

エラー: 依存性の欠如:
		cstream は vzdump-1.2-4.noarch に必要とされています
		perl(LockFile::Simple) は vzdump-1.2-4.noarch に必要とされています

◇足りないものを入れる為にrpmforgeリポジトリの追加

#rpm -ivh http://apt.sw.be/redhat/el6/en/i386/rpmforge/RPMS/rpmforge-release-0.5.2-2.el6.rf.i686.rpm
#rpm --import http://dag.wieers.com/rpm/packages/RPM-GPG-KEY.dag.txt

◇設定ファイルでenabledを全部0にしておく

#vi /etc/yum.repos.d/rpmforge.repo
#cat /etc/yum.repos.d/rpmforge.repo |grep enabled

◇vzdumpで必要とされたものをinstall

#yum --enablerepo=rpmforge install cstream
#yum --enablerepo=rpmforge install perl-LockFile-Simple

◇再度インストール

#rpm -i vzdump-1.2-4.noarch.rpm

■コンテナのバックアップのとり方

◇サスペンドにして圧縮してバクアップをとる方式で

#vzdump -suspend -compress ID
#cd /vz/dump/
#ls -al

バックアップ取れてるか確認

[root@cent6_2dev dump]# ll
合計 265564
-rw-r--r-- 1 root root      3046  3月  8 11:08 2012 vzdump-openvz-220-2012_03_08-11_05_41.log
-rw-r--r-- 1 root root 271930677  3月  8 11:08 2012 vzdump-openvz-220-2012_03_08-11_05_41.tgz

■バックアップを利用してコンテナを作成する場合

◇元々コンテナID220でIPも220なものをコンテナID221、IP221で複製する場合

#vzrestore /vz/dump/vzdump-openvz-220-2012_03_08-11_05_41.tgz 221
#vzctl set 221 --hostname dev2.artis.com --save
#vzctl set 221 --ipadd 192.168.1.221 --save
#vim /etc/vz/conf/221.conf //IPが追加になっちゃうので前のIPを消す
#vzctl start 221 

その後はサーバに接続してIPに関連する箇所を修正する