Daily ASCII Linux

All ASCII Linux Issue / Linux Magazine 2000年5月号

覚えておきたい必須コマンド30―その3・管理コマンド

管理者たるもの、システム管理はコマンドを駆使してきめ細かく行ないたい。


2001年6月12日

はじめに

Linux magazine logo


Linux magazine 5月号表紙
本記事も収録 Linux magazine 2000年 5月号 1,390円
ここでは、システム管理に関連するコマンドについて説明をする。そのため、一般ユーザーでは実行できないコマンドもいくつかあるが、スーパーユーザーが何をしているのかをかいま見ることができるだろう。また、Linuxシステムを理解する一端となると思う。


(中野 賢)


スーパーユーザー

Linuxでは、管理者ユーザーのことをスーパーユーザーと呼んでいる。アカウント名がrootであることからルートとも呼ぶ。

スーパーユーザーは、ファイルに設定されている読み取りや書き込みといった許可に関係なく、ファイル操作をすることができる。たとえば、一般ユーザーの所有するファイルのパーミッションが600であっても、スーパーユーザーは何の制限もなくファイルを読み、修正することができる。削除してしまうことも可能だ。そのため、スーパーユーザー権限でコマンドを実行するときは、特に注意深く行わなければならない。もし、カレントディレクトリが/であるのに気づかず、うっかりとrmコマンドをfrオプション付きで実行してしまうと、無条件にすべてのファイルが削除され、悲惨な状況に陥ってしまう。

スーパーユーザー権限で作業をするのに、再度ログインをする必要はない。コマンドラインから、


USER$ su

と実行し、rootのパスワードを入力するだけだ。これだけでスーパーユーザーになる。逆に、一般ユーザーレベルに戻るには、


root# exit

とする。なお、環境変数などもrootとしてログインした場合と同じにする場合は、“su -”を実行する。

suコマンドを使うとスーパーユーザーになるだけでなく、任意のユーザーにもなることができる。たとえば、PostgreSQLではデータベース管理者用に特別なアカウントpostgresを設けている。そのユーザーになるにも、


USER$ su postgres

として、パスワードを入れる。パスワードが正しければ、PostgreSQLのデータベース管理者となることができる。

そこで、パスワードを知らないはずのユーザーが、rootや他のユーザーになっていないかを時おり、確認しなければならない。

誰がsuコマンドを実行して、どのアカウントになろうとしたのかは、/var/log/messagesファイルに記録されている。このファイルは、通常のテキスト形式なため、lessで表示したり、grepで必要な部分だけを抽出することができる。suコマンドの部分だけなら、


root# grep '(su)' /var/log/messages

とすればよい。クオーテーション(')で囲っているのは、かっこがシェルの特殊文字であるためだ。なお、messagesファイルは他にも多くの記録が残されているため、rootユーザー以外は読めないようにしておこう。

(中野 賢)


パスワード

銀行のキャッシュカードやクレジットカードの暗証番号は極めて重要な役割を持っている。パスワードを知っていれば、本人になりすましてたいていのことができてしまうからだ。現代社会ではそれなりに認識されていると思う。Linuxのパスワードも同じだ。

パスワードを忘れないようにと手帳に残しておいてはいけない。ましてや、それをディスプレイに貼っておいたり、机の引出しにいれておくことは論外だ。また、パスワードを入力するときは、周りに人がいないことを確認したり、背中で手もとを隠して、他人に見られないように気を配ろう。逆に、他人がパスワードを入力するときには、認証が終るまで、うしろを向いたりして画面や手もとを見ないようにするのが礼儀だ。

銀行口座の入出金を記帳したり、クレジット明細書を見て、おかしな取り引きがないかを確認するように、自分のログインした 日付をときどき確認しよう。


USER$ last | grep ken-na

lastコマンドは、/var/log/wtmpファイルに保存されているログイン記録を表示している。ただし、ファイルサイズが大きくなりがちなため、1カ月程度でファイルをリセットして運営することも多い。このとき、前月分を/var/log/wtmp.1、前々月分を/var/log/wtmp.2ファイルとして残すようになっていれば、fオプションで、前月分の記録を参照することができる。


USER$ last -f /var/log/wtmp.1 | grep ken-na

もしも不審な時間にログインしているようであれば、すぐにパスワードを変更し、管理者に連絡をする。

パスワードの変更はpasswdコマンドで行う。コマンドを実行すると、現在のパスワードを求められる。変更しようとしているユーザーが本人かどうかを確認するわけだ。入力したパスワードが正しければ、新しく設定するパスワードの入力が求められる。そして、新パスワードの内容を確認するために再び入力を求められる。この2度のパスワードが一致して初めて、パスワードが更新される(画面6)。



USER$ passwd
New UNIX password:      新しく設定するパスワードを入力する
Retype UNIX password:   再度、新しく設定するパスワードを入力する
Sorry, passwords do not match   2つのパスワードが一致しない場合
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully  成功
画面6 passwdコマンドの実行例

新パスワードに変更を終えたら、一度ログアウトして、新パスワードでログインできるかを確認したほうがよいだろう。

パスワードを設定するときに、たまたま2度同じタイプミスをしたりすると、ログインできないかもしれない。あるいは他人によって変更されていたり、忘れてしまってログインできない場合もある。このときはスーパーユーザーに頼むしかない。

一般ユーザーは自分のログイン名のパスワードしか変更することができないが、スーパーユーザーは誰のパスワードでも変更することができる。スーパーユーザーが他人のパスワードを設定するときは、引数に変更するユーザーのログイン名を指定する。


root# passwd ken-na

スーパーユーザーが実行したときは、現在設定されているパスワードの入力を求められない。そこで、新パスワードを適当に設定して、それをユーザーに伝える。もちろん、受け取ったユーザーはすぐにパスワードを変更する。

それでは、スーパーユーザーがrootのパスワードを忘れてしまった場合はどのようにするか。シングルモードで起動をし、passwdコマンドで設定をするだけだ。

シングルモードで起動するには、LILOで複数のカーネルを切り替えて起動するようにしてあるのならば、起動ラベル名の引数として、1またはsを指定する。


linux 1

LILOを使っておらず、オプションを指定するチャンスのない場合は、レスキューディスクやブートディスクで起動するしかない。そして、passwdファイルのあるファイルシステムをマウントし、パスワードを変更する。

(中野 賢)


ユーザーとグループ

ディストリビューションによっては、システムをインストールするときに、一般ユーザーも追加することができる。しかし、この段階では管理者自身のアカウントを作成するだけにとどめておき、その他のユーザーは、少なくとも、システムが正しくインストールされ、必要なサービスも稼働していることを確認してから作成するほうがよいだろう。システムのインストールもうまくいくかわからないし、インストーラがどのように設定するのかもわからないからだ。

ユーザーを作る前に、まずはグループの確認をしておこう。Linuxではファイルのパーミッションを所有者、グループ、その他に対して設定する。1人のユーザーは複数のグループに属せるが、1つのファイルには1つのグループしか設定できない。そのため、あまりに細かくグループを分けても、全員が同じグループに属するのでも、複数ユーザーでのファイルの共有が面倒になってしまう。基本的な方針としては、共同作業を行うグループ単位とすることが多い。たとえば、開発者チームはkaihatsuグループ、広報グループはkouhouグループに分けるイメージだ。

グループを追加するには、groupaddコマンドにグループ名を指定して実行する。グループ名は既存のグループ名と重複してはいけない。/etc/groupファイルに記述されている名前と異なる名前を考えよう。実行後、/etc/groupファイルを開いてみれば、指定されたグループが追加されていることがわかる。


root# /usr/sbin/
groupadd kaihatsu

ユーザーを追加するには、useraddコマンドを用いる。引数には、属するグループとユーザーのログイン名を指定する。実行後、指定したユーザーの設定が/etc/passwdファイルに追加され、/homeディレクトリに、そのユーザーのホームディレクトリが作成される。


root# /usr/sbin/useradd -g kaihatsu ken-na

そして、passwdコマンドでパスワードを設定する。これでユーザーの作成が終了だ。

ちなみに、ユーザー情報は図3のように/etc/passwdファイルに格納されている。もちろん、パスワードは暗号化されて記述されている。だが、ファイル自体は誰でも読める。現在のマシン性能からすると簡単にパスワードを知られてしまう。そこで、パスワードを保護するために、多くのシステムではシャドウパスワードを用いている。シャドウパスワードでは、暗号化されたパスワードは/etc/shadowに保存され、rootだけが読むことができる。

/etc/passwdファイルの内容
図3 /etc/passwdファイルの内容

ユーザーを削除するには、userdelコマンドを用いる。


root# /usr/sbin/userdel ken-na

ただし、そのユーザーのホームディレクトリは残されたままになっている。もし、ホームディレクトリも削除するのなら、rオプションを指定する。


root# /usr/sbin/userdel -r ken-na

最初にオプションを付けないで実行してしまったときは、rオプションを付けて再度、実行しようとしても、すでにユーザー情報が削除されているのでエラーになる。このときは、


root# rm -fr /home/ken-na

として、ホームディレクトリを削除すればよい。

ただし、userdelコマンドは、ユーザーがホームディレクトリ以外に作成したファイルを削除しない。このようなファイルは、ls -lで表示したとき、ユーザー名でなく、そのユーザーに割り当てられていた番号が表示される。このようなファイルは、同グループに属するユーザーか、rootを所有者にしておこう。

変更作業は簡単である。もちろん、ユーザーを削除する前に行ってもかまわない。


root# find / -uid 101 -exec chown fuga {} \;

組織の形態が変更になったりして、既存ユーザーのグループを変更したいときは、usermodコマンドを用いる。


root# /usr/sbin/usermod -g kouhou ken-na

usermodコマンドも、ユーザーの作成したファイルのグループは変更されないので、必要に応じて、findコマンドを用いて変更する。

(中野 賢)


ファイルシステム

LinuxではハードディスクもCD-ROMもフロッピーディスクもネットワーク上のファイルシステムも、/から始まるディレクトリツリーのどこかにマウントして使う。どのようにマウントされているのかを知るにはmountコマンドを実行する。


USER$ mount
/dev/hda5 on / type ext2 (rw)
none on /proc type proc (rw)
/dev/hda7 on /home type ext2 (rw)
/dev/hda6 on /usr type ext2 (rw)
none on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/scd0 on /home/ftp/pub/cdrom type iso9660 (ro)
/dev/hda1 on /mnt/dos type vfat (rw)

この例では、hda5が/にマウントされ、hda7が/home、hda6が/usr、scd0がcdromディレクトリにマウントされていることがわかる(図4)。

ディレクトリツリー図
図4 複数のファイルシステムにまたがったディレクトリツリー

各ファイルシステムのマウント方法は、すべて同じである。mountコマンドを用い、tオプションでファイルシステムのフォーマットタイプを指定し、マウントするデバイス名と位置を指定する(画面7)。


root# mount -t ext2 /dev/hda7 /home     ハードディスクの場合
root# mount -t iso9660 /dev/scd0 /mnt/cdrom     CD-ROMの場合
root# mount -t vfat /dev/fd0 /mnt/floppy         フロッピーディスクの場合
root# mount -t nfs 192.168.10.1:/export/share /usr/local/share  NFSの場合
画面7 mountコマンドの実行例

tオプションに指定できるフォーマットタイプには、表4のようなものがある。ただし、全部のファイルシステムが標準で使えるとは限らない。カーネルに組み込まれていなければ使えないので注意が必要だ。

表4 フォーマットタイプの種類
名前 意味
ext2 Linux ext2
iso9660 ISO9660
nfs Networkファイルシステム
vfat Microsoft Windows
msdos MS-DOS
hfs Macintosh HFS

マウントしてあるファイルシステムを取り外すにはumountコマンドを用いる。引数へ指定するのは、ファイルシステム名でもマウントポイントでも、どちらでもかまわない。


root# /bin/umount /dev/scd0

umountコマンドを実行したとき、誰かのカレントディレクトリがそのデバイス上にあったり、ファイルをアクセスしている場合、次のようなメッセージが表示され、アンマウントできない。


umount: /dev/scd0: device is busy

このときは、fuserコマンドで誰が使っているのかを確認する。


root# /sbin/fuser -vm /dev/scd0                         USER  PID ACCESS COMMAND
/dev/scd0ken-na 10089 ..c.. bash

そして、そのユーザーと協議して、別のディレクトリに移動してもらったり、処理を中断してもらわねばならない。あるいはユーザーの処理が終るのを待ってから取り外すようにする。

(中野 賢)


ディスクスペース

本格的にLinuxを利用し始めると、追加インストールしたプログラムや、ユーザーの作成したファイルによって、ディスクの空き容量に余裕がなくなってくる。使い切ってしまうと、ユーザーの作業ができなくなるだけでなく、ログファイルなどの書き込みもできなくなってしまうので、システムにとっても具合が悪い。

ディスクの空き容量を調べるには、dfコマンドを用いる(画面8)。すると、接続されているファイルシステムごとに容量が報告される。数値がわかりにくければ、hオプションを付けてみよう。わかりやすいサイズで表示してくれる。


USER$ df
ファイルシステム        1k-ブロック     使用済  使用可  使用率% マウント場所
/dev/hda5               147766          56248   83889   40%     /
/dev/hda7               1304468         596244  641960  48%     /home
/dev/hda6               1517920         926340  514472  64%     /usr
/dev/scd0               598872          598872  0       100%    /home/ftp/pub/cdrom
/dev/hda1               3204644         2520180 684464  79%     /mnt/dos
USER$ df -h
ファイルシステム        サイズ  使用済  使用可  使用率  マウント場所
/dev/hda5               144M    55M     82M     40%     /
/dev/hda7               1.2G    582M    627M    48%     /home
/dev/hda6               1.4G    905M    502M    64%     /usr
/dev/scd0               585M    585M    0       100%    /home/ftp/pub/cdrom
/dev/hda1               3.1G    2.4G    668M    79%     /mnt/dos
画面8 dfコマンドでディスクの利用内容を表示する

ファイルやディレクトリをコピーするとき、どのくらいの容量が必要なのかを調べたいことがある。このような用途にはduコマンドを使う。

duコマンドをオプションを付けないで実行すると、全てのサブディレクトリごとに使用サイズが表示され、最後に合計が出力される。


USER$ du /etc
5       /etc/profile.d
15      /etc/X11/WindowMaker
33      /etc/X11/wmconfig
4       /etc/X11/twm
          :
          :
2310    /etc

この例では、/etcディレクトリ全体で2310ブロック使われている。1ブロックは1Kバイトなので、全体で約2.3Mバイトとなる。

引数に指定をしたディレクトリの合計だけが必要な場合は、sオプションを指定する。さらにhオプションも指定をすると、わかりやすい単位で表示してくれる。


USER$ du -s /bin
4828    /bin
USER$ du -sh /etc
2.3M    /etc

サブディレクトリごとに合計を出力したい場合は、次のようにディレクトリの指定をスラッシュで終らせる。


USER$ du -sh /etc/*/
158k    /etc/X11
204k    /etc/charsets
41k     /etc/codepages
2.0k    /etc/cron.d
8.0k    /etc/cron.daily
     :
     :

(中野 賢)


プロセス

Linuxはマルチプロセス・システムである。プロセスとはプログラムの実行単位のことだ。誰かがプログラムを実行すると、それはひとつのプロセスとして動作をする。同時に同じプログラムを実行しても、システムはそれぞれを別個のプロセス単位として扱う。

現在実行中のプロセスを調べるには、psコマンドを用いる。何もオプションを 指定せず実行すると、psコマンドを実行した端末で実行中のプロセスだけが表示される。


USER$ ps
  PID TTY          TIME CMD
10085 ttyp0    00:00:00 bash
10092 ttyp0    00:00:04 vi
10276 ttyp0    00:00:00 ps

xオプションを指定すると、バックグラウンドで実行中のプロセスや、別の端末で実行しているプロセスも含め、自分が起動しているプロセスがすべて表示される。さらに、aオプションを付けると、すべてのプロセスが表示される(画面9)。


USER$ ps x
PID TTY      STAT   TIME COMMAND
10051 tty1     S      0:00 -bash
10062 tty1     S      0:00 sh /usr/X11R6/bin/startx
10069 tty1     S      0:00 xinit /home/ken-na/.xinitrc -- :0 -auth /home/ken-na/
10074 tty1     S      0:02 /usr/bin/enlightenment
10075 tty1     S      0:05 kinput2 -canna -cs localhost
10085 ttyp0    S      0:00 bash
10089 ttyp1    S      0:00 bash
10092 ttyp0    T      0:04 vi genko.txt
10153 ttyp2    S      0:00 bash
10274 ttyp1    T      0:00 fuga > hoge
10277 ttyp0    R      0:00 ps x
USER$ ps ax
  PID TTY      STAT   TIME COMMAND
    1 ?        S      0:02 init
    2 ?        SW     0:00 [kflushd]
    3 ?        SW     0:00 [kupdate]
    4 ?        SW     0:00 [kpiod]
    5 ?        SW     0:00 [kswapd]
  286 ?        S      0:00 portmap
  341 ?        S      0:00 syslogd -m 0
  352 ?        S      0:00 klogd
  368 ?        S      0:00 /usr/sbin/atd
  384 ?        S      0:00 crond
                  :
                  :
画面9 psコマンドの実行例

稼働中のプロセスがハングアップしてしまった場合は、killコマンドでプロセスを終了させることができる。


USER$ kill -9 10274

最初の引数はプロセスを終了させるためのシグナルを意味している。2番目の引数は終了させたいプロセス番号だ。psコマンドのPIDの欄に表示されている。

一般ユーザーも自分の実行したプロセスに対してならば有効だ。スーパーユーザー以外は、他のユーザーのプロセスを終了させることはできない。

なお、lpdやhttpdのようなデーモンを停止したい場合は、Red Hat系のディストリビューションならば、


root# /etc/rc.d/init.d/lpd stop

のようにして停止する。

(中野 賢)


システムの終了

最後に、Linuxシステムを停止するときの手順を簡単にまとめておこう。

・ログインしているユーザーを確認する


root# who または
root# w または
root# last | grep still

・稼働中のプロセスを確認する


root# ps aux

・バッファの内容をファイルシステムに反映する


root# sync

・シャットダウンする


root# /sbin/shutdown -h now

・haltと表示されたら、電源を切る。

なお、「パスワード」の項の最後で、シングルユーザー・モードで起動するのに、

linux 1

とするように説明をした。この1はLinuxシステムのランレベルだ。ランレベルは通常、表5のように設定されている。

表5 標準的なランレベル
ランレベル 動作
0 停止
1,s シングルユーザー
2 マルチユーザー(NFSサポートなし)
3 マルチユーザー
4 未使用
5 X11
6 リブート

実はshutdownコマンドも、ランレベルを0にすることでシステムの停止処理を行っているのだ。スーパーユーザーはtelinitコマンドでランレベルを変更できる。そこで、shutdownコマンドを用いなくても、


root# sync ; /sbin/telinit 0

として、ランレベル0に移行すればシステムは停止する。同様に、telinitコマンドに1を指定すれば、シングルユーザーモードに移行する。そして、3を指定して実行(またはCtrl-D)すれば、再びマルチユーザーモードに移行する。

(中野 賢)




[通常ページに戻る]
ASCII24 http://ascii24.com/
Copyright (C)1999-2006 ASCII Corporation. All rights reserved.