Browse Tag: linux

sudo するときに sbin にパスを設定する方法

CentOS 5.x で、次のように sudo コマンドを実行すると、次のようなエラーがでますよね。


$ sudo service httpd restart
sudo: service: command not found

これは、当然ながら /sbin にパスが通っていないからです。
PATH を見てみると、次のような感じになっています。ちなみに sudo する前の通常ユーザ naoya のシェルは bash で .bashrc などはデフォルトのまま何も変更していません。


$ sudo sh -c 'echo $PATH'
/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/naoya/bin

この PATH に、/sbin や /usr/sbin を追加するには、/etc/sudoers に次の内容を追加します。


$ sudo /usr/sbin/visudo
--- sudoers-org 2011-05-09 00:19:09.000000000 +0900
+++ sudoers 2011-09-27 22:50:50.000000000 +0900
@@ -48,6 +48,7 @@
Cmnd_Alias DRIVERS = /sbin/modprobe

# Defaults specification
+Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin

#
# Disable "ssh hostname sudo ", because it will show the password in clear.
@@ -61,6 +62,7 @@
LANG LC_ADDRESS LC_CTYPE LC_COLLATE LC_IDENTIFICATION \
LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC \
LC_PAPER LC_TELEPHONE LC_TIME LC_ALL LANGUAGE LINGUAS \
+ PATH \
_XKB_CHARSET XAUTHORITY"

## Next comes the main part: which users can run what software on

この設定を追加したあと、再度確認すると /sbin と /usr/sbin が追加されることが分かると思います。

$ sudo sh -c 'echo $PATH'
/sbin:/bin:/usr/sbin:/usr/bin

@komagata さんの話によると、Debian ではデフォルトで sbin 系がパスに追加されている様子なので、CentOS だといささか不便だったようです。

これで、また一つ sudo を利用できますね!

Special Thanks to @komagata!

CentOS 5 / Scientific Linux 5 のセキュリティアップデートの早さを比較してみました

Linux のディストリビューションを比較するとき、セキュリティアップデートの早さも一つの選択肢にになると思っています。
そこで、RHEL 5 がベースとなっている二つのディストリビューション CentOS 5 / Scientific Linux 5 のセキュリティアップデート間隔の早さを調査してみました。

まずは、RHEL 5 のセキュリティアップデート情報は、Red Hat Enterprise Linux (v.5 server) Security Advisories に公開されています。
9/25 の執筆時点で、最新のセキュリティアップデートの 5 件は、次のようになっています。

そして、比較対象の CentOS 5 / Scientific Linux 5 のセキュリティアップデートが、 RHEL5 からのセキュリティアップデートと比較して、どのくらいあとにリリースされたのか調べてみます。
まずは、CentOS 5。CentOS 5 のセキュリティアップデート情報は、centos-announce から調べてみました。なお、ここでは CentOS 5.7 のリリースは含まれていません。
CentOS 5 では、FASTTRACK というアップデートで、いっきにまとめてセキュリティアップデートが行われているようでした。
また、ご存じのとおり CentOS 5.7 がリリースされるまでの間、Continuous Release (CR) repository (AdditionalResources/Repositories/CR – CentOS Wiki) が用意されて、そのリポジトリでセキュリティアップデートが提供される体制になっていました。これについては、CentOS の次のリリースの間際のために用意されたリポジトリのようです。
例えば、httpd のアップデートタイミングは、次のようになっています。
次に、Scientific Linux 5 のセキュリティアップデート情報をチェックしてみます。Scientific Linux 5 のセキュリティアップデート情報は、Archives of SCIENTIFIC-LINUX-ERRATA@LISTSERV.FNAL.GOV のメーリングリストから確認することができます。
同じく 9/25 の執筆時点で、最新のセキュリティアップデートの 5 件は、次のようになっています。
CentOS 5 / Scientific Linux 5 のセキュリティアップデートを比較すると、圧倒的に Scientific Linux の方がセキュリティアップデートが提供されるのが早いということになりますね。

yum でパッケージをダウングレードする方法

すこし前まで yum でパッケージをダウングレードしたい場合、yum allogdowngrade というプラグインをインストールする必要がありました。

しかし、今日現在の yum では、downgrade サブコマンドが定義されています。

CentOS 5.6 x86_64 yum 3.2.22 では、次のようにするだけでパッケージをダウングレードすることができます。


# yum downgrade < パッケージ名>

パッケージ名には、必ずバージョン番号を含めるようにします。例えば、カーネルをダウングレードしたい場合は、次のようにします。

# yum downgrade kernel-2.6.18-238.9.1

yum を使えると、とても簡単にパッケージをダウングレードできるので、パッケージをアップデートしたあとまれに問題が起こることもあるので、とても便利ですね。

perf for CentOS

perf というツールを、僕も初めて知ったけれど、みんな大好き CentOS 5 系にはないみたい。。。

Fedora だと Fedora 13 あたりから perf パッケージがある様子。
さらに調べてみると、perf というツールの公式ページドキュメントはここにある。
perf というツールは、どうも linux-kernel に付属しているツールの様子。

CentOS 6 からインストールできる。
使い方は、このページを参考にすると、次のように使えるみたい。


$ perf record -a -g sleep 10 # 10秒おきにシステム情報を記録する
$ perf report --sort comm,dso # レポートを表示する

そうすると、次のような画面になる様子。
perf

なるほど、これは便利そう。

dstat が更新されていた

しばらく前にブログに書いた dstat(記事1記事2)ですが、ふとチェックしてみるとバージョン 0.7.2 がでていました。さっそくアップデートしてみたのですが、0.7 系にバージョンアップしたので、若干オプションが変わっています。

プロセスごとの IO をみたい場合には、次のようにします。

$ dstat –top-io-adv –top-bio-adv
Terminal width too small, trimming output.
——-most-expensive-i/o-process——->
process              pid  read write cpu>
init [3]             1     246k  18k0.0%>

実際に試してみると、カラフルなので、とても見やすいです。

CentOS の場合は、EPEL にあるバージョンは古いので、ここから RPM をダウンロードすればさくっとインストールすることができます。

自分で RPM を作りたいという人は、SRPM をダウンロードしてから、MD5 のチェックサムエラーがでるので –no-md5 オプションを付けて SPEC ファイルなどをインストールしてから RPM をビルドしましょう。

dstat、とても便利ですね。

iptstate

iptstate というコマンドがあることを始めて知りました。

iptstate は、netfilter の接続をトラックキングしているテーブルの情報を top のように表示してくれるコマンドです。

CentOS の場合は、すでに iptstate バージョン 1.4.1 が提供されていて、普通にインストールすると iptstate パッケージがインストールされています。

さっそく、試してみます。iptstate は、netfilter つまり iptables の接続トラックキングテーブルの情報を表示してくれるので、iptables が動作している必要があります。

$ sudo /usr/sbin/iptstate

IPTables – State Top
Version: 1.4          Sort: SrcIP           s to change sorting
Source                  Destination             Proto   State        TTL
127.0.0.1:33005         127.0.0.1:8020          tcp     ESTABLISHED  119:59:58
127.0.0.1:52326         127.0.0.1:8021          tcp     ESTABLISHED  119:59:56
192.168.161.1:60730     192.168.161.125:22      tcp     ESTABLISHED  119:59:12
192.168.161.1:54619     192.168.161.125:22      tcp     ESTABLISHED  119:59:55
192.168.161.1:17500     192.168.161.255:17500   udp                    0:00:09

な感じで、接続元の IP アドレス、経路情報、プロトコル、状態、TTL、を表示してくれます。

もちろん、top のように並び替えもできます。iptstate では、次の並び替えのキーが定義されています。

d   カラムのサイズを動的に変更して、古いデフォルトのサイズを使用する

f   loopback でフィルタリングする

l   IPアドレスの中で DNS を探している順にする

m   ホスト名を切り取った形でフィルタリングする

n   DNS に関連した表示にする

q   終了する

r   逆順に並び替える

space   表示をすぐに更新する

昔から存在するコマンドですが、どこから接続があるので、どのポートに接続しているのか、などがすぐに分かるので、とても便利なコマンドです。

yum で特定のバージョンをインストール

yum で最新版ではなくて、特定のバージョンをインストールするにはパッケージ名の最後にバージョン情報をつけるだけだということを初めて知った。

例えば、現在の kernel と同じ kernel-devel のバージョンをインストールするには、次のようにする。

$ sudo yum install kernel-devel-`uname -r`

tty0 のパワーセーブを無効にする方法

最近やっと IPMI を導入したこともあって、昔より 1U サーバの VGA コネクタにディスプレイをつなぐことは少なくなってきましたが、それでも何かあったときは直接ディスプレイをつないでサーバの状態を見ることがあります。

CentOS 5.x x86_64 では、デフォルトで tty0 にパワーセーブの状態が設定いるらしく、kernel panic になったときパワーセーブになっていると何を見ることができません。

/usr/bin/setterm -foreground green -background black -blank 0 -powersave off -powerdown 0 -store < /dev/tty0 > /dev/tty0 2>&1

これを応用するには、それぞれの tty に違う色をつけることで今表示している tty がすぐに分かるようになりますね。とはいっても IPMI SOL(Serial Over LAN) を使えばその恩恵に預かれる機会はほとんどないのですが。

ちなみに FreeBSD で同じようにスクリーンの色を変更するには vidcontrol を使います。/etc/rc.conf に次のように追記しておくと簡単にスクリーンの色を変更することができます。

allscreens_flags=”-c blink lightgreen”

この設定をしておくと、カーソルを点滅にして lightgreen な文字色に変更するという意味になります。setterm コマンドは、指定できる色に8色しかなくてすこし寂しい想いがしました(vidcontrol は 16 色指定できます)。

Ctrl+Alt+Del で再起動を防止する方法

サーバを運用しているときは、Ctrl+Alt+Del でサーバの再起動を防止したいもの。ついに、先日誤って Ctrl+Alt+Del でサーバを再起動してしまいました。。。これでいかんと思って、Ctrl+Alt+Del で再起動を防止する方法を調べてみました。

CentOS 5.3 x86_64 では、/etc/inittab に次のような変更するだけです。

— inittab     2009-04-09 22:29:32.000000000 +0900
+++ /etc/inittab        2009-04-02 11:09:54.000000000 +0900
@@ -29,7 +29,8 @@
l6:6:wait:/etc/rc.d/rc 6

# Trap CTRL-ALT-DELETE
-ca::ctrlaltdel:/sbin/shutdown -t3 -r now
+#ca::ctrlaltdel:/sbin/shutdown -t3 -r now
+ca::ctrlaltdel:/usr/bin/logger ‘CTRL-ALT-DELETE trap is disabled’

# When our UPS tells us power has failed, assume we have a few minutes
# of power left.  Schedule a shutdown for 2 minutes from now.

こうすることでよって Ctrl+Alt+Del を押してしまったときは、シスログに出力するだけの動作になります。変更を適応するには、再起動するか、再起動できないときは次のコマンドを実行します。

$ sudo telinit q

サーバを運用しているときは、基本的にリモートで作業することがほとんどですが、念のためやっておいたほうがいいでしょう。

こういう基本的なところができていないのはなさなけないということで、システム管理者として失格だと自覚させるためのエントリです。