いますぐ実践! Linuxシステム管理

いますぐ実践! Linux システム管理 / Vol.262 / 読者数:2633名

こんばんは、うすだです。

歯科医を生業とする義父曰く、病気による3大激痛は、胆石、腸閉塞と、 歯の痛み(神経がやられる系)だそうです。

1週間くらい前から、右の奥歯がおかしいことに、気づいてはいました。
ですが、忙しいとかまだ大丈夫とか、いろいろ理由を作って、 歯医者へは行かずに済ませていました。

痛みは徐々に増加し、ロキソニンだけではどうしようもなくなったのが、 土曜日のことです。観念して、その日の晩、義父に治してもらいました。

治療直後は、麻酔のおかげで痛みを感じることがなく、 その素晴らしさに歓喜しました。ですが、麻酔が切れてから、 恐怖の激痛が蘇りました…。
悪夢の再来です。

どうやら、神経をとっても、周囲の炎症がすぐ治まるわけではないため、 痛みが残ることがあるそうです。今、ボルタレンの限界投入と、 抗生物質により、激痛からはやや遠ざかることができました。

人間、激痛が続くと、何も考えられなくなるのですね。
そして、そんなときはもう寝るしかない、ということもわかりました。

激痛と戦ったこの2.5日間、失った時間は大きいのですが、 得られた経験もそれなりに大きかったと思います。思いたいです。

モノはお金で買えますが、経験は買えません。その想いを胸に、 これからも生きていきたいと思います。

ものすごく風呂敷を広げているようですが、 本当にそう思えるくらい激痛だったのですということで、 今回もはりきってまいりましょう。

今回のお題 - ユーザ権限でサービスを動かす (レベル:初級〜)

今さら言うのもなんですが、Linux はあちこちに存在し、 気軽に試せるOSとなりました。

昔は、学校まで行って、ワークステーションにログインし、 ユーザ権限でできる範囲内のことをいろいろ試す、ということをしていました。

ですが、今どきは、手元のPCに Linux や BSD をインストールして、 root権限でいろんなことができます。いい世の中になりました。

ただ、企業や学校のスーパーなマシンは、みなさんで清く正しく使うものですので、 root権限は限られた管理者にしか与えられていません。
また、root権限があっても、軽々しく使えるものではありません。

ですが、そのような環境でも、動作確認したい、あるいは動作確認しないといけない、 というケースが、少なからず存在します。

たとえば、特殊な設定にしたサービスがちゃんと動くか試したい、 だけどその OS は手元になく、会社のマシンには一般ユーザの権限しかない、 というようなケースです。
あるいは、本番環境を使って擬似的に試して欲しい、でも root ではやるなよ、 というお願いをされるケースもありそうです。

そんなときは、一般ユーザの権限でサービスを動かせばいいじゃない、ということで、 今回は、いろいろなサービスをユーザ権限で動かしてみたいと思います。

Apache をユーザ権限で動かす

サービスといえば Web、Web といえば Apache、 といっても過言ではないのではないでしょうか。というわけで、 Apache をユーザ権限で動かしてみましょう。

ちなみに、これは、Ubuntu 14.04 LTS で試しています。

まず、設定ファイルやログの置き場所を、ここでは「~/etc/apache2」と仮定して、 話を進めます。
(ちなみに、「usu」ユーザで作業しています。以降も同様です。)

  $ [ -d ~/etc/apache2 ] || mkdir -p ~/etc/apache2

根源の設定ファイルが「/etc/apache2/apache2.conf」ですので、 これをコピーします。

  $ cp /etc/apache2/apache2.conf ~/etc/apache2/

基本的に、変更すべき設定以外の設定は、そのままにします。
さしあたって、ディレクトリの位置、ユーザ、ポート番号は変更する必要があります。 変更したディレクティブを以下に羅列します。

  ServerRoot "/home/usu/etc/apache2"
  # Mutex file:${APACHE_LOCK_DIR} default
  PidFile httpd.pid
  User usu
  Group usu
  ErrorLog error.log
  Listen 8180

Mutex や ErrorLog など、 一般ユーザの管理下にないディレクトリを指定している箇所は、 ファイル名だけにするなどして対処します。
(Apache の環境変数は /etc/apache2/envvars で定義されています。)

オリジナルには「Include ports.conf」があり、 ports.conf では 80番や 443番を Listen しています。ここでは、 8180番だけにしています。
(他とかち合わない、1024以上のお好きなポート番号をご指定ください。)

それから、上記では、ServerRoot を「~/etc/apache2/」にしています。
そのため、 ServerRoot に対する Directory ディレクティブの設定も以下のように変更します。 (変更するのはパスだけです。)

  <Directory /home/usu/etc/apache2/>
      Options Indexes FollowSymLinks
      AllowOverride None
      Require all granted
  </Directory>l

あと、オリジナルでは以下のファイルを Include しています。

  • /etc/apache2/conf-enabled/*.conf
  • /etc/apache2/mods-enabled/*.load
  • /etc/apache2/mods-enabled/*.conf
  • /etc/apache2/sites-enabled/*.conf

面倒くさいですが、1つずつ確認し、必要なものだけを Include するか、 あるいは、以下のようにまとめて確認し、 必要な設定を apache2.conf にそのまま直接書きます。 $ cat /etc/apache2/*-enabled/*.conf | grep -v '^#' | \ grep -v '^$'

たとえば、モジュールのロードは、以下の出力結果をコピペし、 必要な行だけを apache2.conf に取り入れればよいと思います。

  $ for file in /etc/apache2/mods-enabled/*.load; do
  > echo "IncludeOptional $file"
  > done
  IncludeOptional /etc/apache2/mods-enabled/access_compat.load
  IncludeOptional /etc/apache2/mods-enabled/alias.load
  IncludeOptional /etc/apache2/mods-enabled/auth_basic.load
  ...後略...

あとは、以下のように起動するだけです。

  $ apache2 -d ~/etc/apache2 -f apache2.conf

http://localhost:8180/ にアクセスできれば、成功です。
何かおかしかったら、出力されるエラーメッセージを確認してください。
同内容は、~/etc/apache2/error.log にも出力されています。

ちなみに、Apache を終了するには、以下のように実行します。

  $ kill `cat ~/etc/apache2/httpd.pid`

xinetd をユーザ権限で動かす

お次は、xinetd です。
ちなみに、こちらは、CentOS 7.0 で試しました。

n オレオレ設定ファイルは、「~/etc/xinetd.conf」と「~/etc/xinetd.d/」に置きます。

  $ [ -d ~/etc ] || mkdir ~/etc

まずは、安直に設定をまるっとコピーします。

  $ sudo tar cf - -C /etc xinetd.conf xinetd.d | tar xf - -C ~/etc

xinetd.conf の最後の includedir を変更します。

  includedir /home/usu/etc/xinetd.d

xinetd.d 以下がすべて disable になっていると仮定し、 1つ enable なサービスを作ってみたいと思います。
(もしなってなかったら、全部 disable = yes にしてしまいましょう。)

テキストエディタで下記内容を作成し、 xinetd.d/echonet-stream というファイル名で保存します。

service echonet
{
    disable     = no
    id          = echonet-stream
    wait        = no
    socket_type = stream
    user        = usu
    group       = usu
    server      = /home/usu/etc/echonet-server
}

「echonet」は HEMS で使われるプロトコルですが、ここでは名前だけをお借りして、 一方的に返事を返すだけのサービスを構築します。
(困る場合は、/etc/services の他のサービスを拝借してくださいませ。)

ちなみに、echonet-server は、echo でなにかしゃべるだけのひとです。
テキストエディタで下記内容を作成し、上記パスに保存したら、 いつものように実行権をつけて(chmod +x echonet-server)おいてください。

#!/bin/sh
echo Hello world!

あとは、起動するだけです。

  $ xinetd -f ~/etc/xinetd.conf

そして、telnet コマンドで echonet につなぎます。
(コマンドがなければ、telnet パッケージをインストールしましょう。)

  $ telnet localhost echonet
  Trying ::1...
  Connected to localhost.
  Escape character is '^]'.
  Hello world!
  Connection closed by foreign host.

お決まりのセリフですが、ちゃんとコミュニケーションできました。
うまく動いてくれない場合は、 「-d」オプションをつけて xinetd を起動してみてください。 やけにおしゃべりになります。

ちなみに、xinetd を終了するには、以下のように実行します。

  $ kill `ps -C xinetd -o pid=`

PostgreSQL をユーザ権限で動かす

最後に、PostgreSQL をやってみましょう。
こちらは、ふたたび、Ubuntu 14.04 LTS で試しています。

データベースなどは、「~/etc/postgresql」以下に置こうと思います。

  $ [ -d ~/etc/postgresql ] || mkdir -p ~/etc/postgresql

まずは、データベースをどーんと作成します。

  $ /usr/lib/postgresql/9.3/bin/initdb -D ~/etc/postgresql/data

設定ファイル「etc/postgresql/data/postgresql.conf」を変更します。
変更点を以下に羅列します。
Ubuntu では、ポート番号と、 ソケット(とロックファイル)のパスを変更するだけで済みました。

  port = 15432  # デフォルトは 5432
  unix_socket_directories = '/home/usu/etc/postgresql'

変更したら、postmaster を起動します。

  $ /usr/lib/postgresql/9.3/bin/postmaster -D ~/etc/postgresql/data

起動しっぱなしになるはずですので、別の端末で、 個人のデータベースを作りましょう。(usu ユーザで作成したので、 ユーザはすでにあります。)

  $ createdb -p 15432 -h localhost usu

作れた時点で問題ないとは思いますが、念のためpsqlコマンドでつないでみます。

  $ psql -h localhost -p 15432
  usu=# 

はい、問題なさそうです。

ちなみに、postmaster さんは、デーモンとして動かないようですので、 自力で nohup などする必要があるようです。

  $ nohup /usr/lib/postgresql/9.3/bin/postmaster -D \
  ~/etc/postgresql/data > ~/etc/postgresql/postgresql.log 2>&1 &

おわりに

以上、Apache、xinetd および PostgreSQL を、一般ユーザの権限で起動してみました。

他にもネタは(探せば)ありますが、歯がアレですので、 このくらいで勘弁していただけますと幸いです。

ユーザ権限で実行するにあたって、問題になるのは、 概ね以下ではないかと思います。大抵はその旨ログに出力されるので、 メッセージをくまなく眺めていれば、動かない原因が見えてくると思いますよ。

  • ポート番号(0〜1023番を使うには root 権限が必要)
  • ファイルやディレクトリのパーミッション
  • システムに何か登録したり、設定変更を行うなど

宿題の答え

前回の宿題は、

  新たに作った mount namespace で mount したら、namespace 開放時に
  umount されるのでしょうか。

でした。

mount する際には、スーパーブロックを割り当て、ディレクトリエントリを返します。 では、逆のことをしていれば、問題ないと言えそうです。

前回は、「fs/fs_struct.c」の exit_fs() で、他に誰も参照していないなら free_fs_struct() で開放される、という説明まで行いました。

その free_fs_struct() は、以下のようになっています。

  void free_fs_struct(struct fs_struct *fs)
  {
      path_put(&fs->root);
      path_put(&fs->pwd);
      kmem_cache_free(fs_cachep, fs);
  }

kmem_cache_free() はメモリの開放なので、説明は省略します。
path_put() は「fs/namei.c」にあり、以下のようになっています。

  void path_put(const struct path *path)
  {
      dput(path->dentry);
      mntput(path->mnt);
  }

dput() は「fs/dcache.c」にあり、 ディレクトリエントリの参照数を1つ減らします。
mntput() は「fs/namespace.c」にあり、やはり参照数を1つ減らし、 他に参照する人がいなければ開放処理を行います。
以降の道のりが超長いので説明をすっ飛ばしますが、mntput_no_expire() や deactivate_super() などを経て、put_super() で、 やはり参照数を1つ減らし、他に参照している人がいなければ、 スーパーブロックを開放します。

というわけで、後半はぐだぐだになってしまいましたが、 自動的にumountしてくれている、と言えそうです。(は、歯切れが悪い…)

カーネルのソースコードをきちんと見たいという貴兄は、 たとえば以下をたどってみてください。

kernel/git/stable/linux-stable.git - Linux kernel stable tree
https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/tree/

今回の宿題

今回の宿題は、

  ユーザ権限では実行できないサービスを探してみましょう。

です。

いつものように、見切り発車で宿題を出しております。
ぐだぐだにならぬよう、それなりに探し当てたいと思います。
(さすがに、ひとつもないということはないと思います。思いたいです。)

あとがき

これを書き始めたのが土曜日で、激痛の合間にネタを思いつき(というか思い出し)、 なんとか書いて、現在に至ります。

なんとか…と言いつつ、本来は日曜日発行ですので、 さりげなく1日遅れとなっております。すみません。ご了承ください。

おそらく私より若いみなさまは、 病気になる機会がさほどないのではないかと思います。
ですが、歳をとる毎に、程度の差こそあれ、その確率は高まります。

健康なときには気づきませんが、どこか不調になったときにこそ、 健康であることの大切さ、ありがたさに気付くのではないでしょうか。

いま、この健康に感謝して、日々を過ごしていただければと思います。
わたしも、歯痛が激痛でなくなってきた今こそ、感謝したいと思います。

 

そして、3連休でやるべきだったこと(過去形)を目の前に並べて、 途方にくれたいと思います。…うーん、どうしよう…。

 

今回も、ここまで読んでいただき、誠にありがとうございました。
次回は、8月3日(日) 未明にお会いしましょう!

 

「いますぐ実践! Linux システム管理」の解除は、以下からできます。
http://www.usupi.org/sysad/ (まぐまぐ ID:149633)

バックナンバーは、こちらにほぼ全部そろっています。
http://www.usupi.org/sysad/backno.html

「栗日記」- スマッシュヒット率は低いですが、それでも描きます。
http://www.usupi.org/kuri/ (まぐまぐ ID:126454)
http://usupi.seesaa.net/ (栗日記ブログ)
http://usupi.org/k/ (モバイル栗日記)
http://twitter.com/kuriking/ (栗つぶやき)
http://facebook.com/kuriking3 (栗顔本)


[バックナンバーのトップへ] [Linux システム管理のトップへ]

トップ

バックナンバー
    [日付順] [目的別]

プロフィール

▼ リンク

独学Linux
Linuxデスクトップ環境に関する情報が満載です。 メルマガもありますよ。
Server World
CentOS 6をサーバとしたときの設定例が、これでもかというくらいたくさん載っています。 CentOS以外のディストリビューション(Fedora, Ubuntu)も充実しています。
LINUXで自宅サーバーを構築・導入(Fedora9)
Fedora9のインストールの仕方から管理方法まで、詳しく載っています。 SearchManには情報がもりだくさんです。
マロンくん.NET
〜サーバ管理者への道〜
Linuxをサーバとして使用するための、いろいろな設定方法が載っています。 マロンくんもかわいいです。 なんといっても、マロンくんという名前がいいですね!!
日経Linux
今や数少なくなってしまったLinuxの雑誌。ニュースやガイドもあります。
Linux Square − @IT
@ITが提供する、Linux の情報が満載。 載っていない設定方法はないんじゃないでしょうか。
gihyo.jp…技術評論社
Linuxに限らず様々な技術情報が満載のサイト。 SoftwareDesign誌も、 ソフトウェア技術者は必見です。
SourceForge.JP Magazine
Linux に限らず、オープンソース関連の記事が網羅されています。
ITmediaエンタープライズ:Linux Tips 一覧
Tips というより FAQ 集でしょうか。わからないことがあれば覗きましょう。
IBM developerWorks : Linux
開発者向けですが、勉強になりますよ。
Yahoo!ニュース - Linux
Yahoo!のLinuxに関するニュース一覧です。
栗日記
システム管理とかと全然関係ありませんが、毎日栗の絵を描いています。
システム管理につかれちゃったとき、癒されたいときに、ご覧ください。:-)
WEB RANKING - PC関連
ランキングに参加してみました。押してやってください。

▼ 作ってみました

Add to Google

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本