FreeBSD(PC-UNIX)一般のTips

UNIX 管理者からすればごく当たり前のコマンドでも、DOSしか知らない初心者 にはなかなか理解できないことがよくあります。このページは、言わば当たり前 の内容を、まとめるページにしたいと思います。

・ マシンの終了・再起動

UNIXでは、一般ユーザにはマシンの終了・再起動を行う権限がありません。 終了・再起動を行うことができるユーザは、root と operator グループに 属するユーザだけです。終了して電源を切る必要があるユーザは、operator グループに登録しておく必要があります。

shutdown -r now      (直ちにリブート)
shutdown -h +10      (10分後に終了)

rootの場合 以下のコマンドを使用することが可能です。

reboot               (直ちにリブート)
halt                 (直ちに終了)

shutdown コマンドでは 'now' のかわりに '18:00'を指定すれば指定時刻に 終了させることができますし、'+5' とすれば5分後に終了させることが可能です。

・ MS-DOS フロッピーディスク・CD-ROMの使用

ドライブの概念が存在しない UNIXでは、フロッピーディスクのようなリムーバブル メディアを扱うにも、ディスク上のどこかのディレクトリにフロッピーディスクを 割り当ててやらなければなりません。 この割り当て作業を マウントといいます。


mount -t msdos /dev/fd0 /mnt     (DOS形式のフロッピー)
mount /cdrom                     (CD-ROM。形式は自動判別します)

上記コマンドにて /mnt ディレクトリをアクセスすれば、それぞれの メディアにアクセスできます。 ただしマウントは root 権限が必要です。 使用し終えたら 必ず umount してください。これを行わずにフロッピー ディスクを取り出すと多くの場合壊れてしまいます。(遅延書き込みのため)

マウント先は /mnt でなくても、中身が空のディレクトリであれば /floppy 等 のディレクトリ名を指定しても構いません。もちろん、あらかじめ /floppy ディレクトリを作成しておく必要があります。

・ ファイルの圧縮・展開とアプリケーションのインストール

UNIXでは アプリケーションのソースコードは、一つのファイルにまとめられて 圧縮されていることがほとんどです。 一つのファイルにまとめることを アーカイブ といい、tar コマンドを用います。このアーカイブ ファイルを更に圧縮しているのが GNU の gzip というコマンドです。
圧縮されたファイルには、xxxxx.tar.gz という名前が付けられていること が多く、tarで処理された後圧縮されていることを表しています。

これらのファイルを展開するためには、まず gunzip で伸張した後、tar コマンドを使用すればいいのですが、FreeBSDに付属する GNU tar は パラメータの指定で、圧縮・伸張を行ってくれます。

sample.tar.gz というファイルを展開するには、

tar xzvf sample.tar.gz

とします。カレントディレクトリ以下 必要なディレクトリを作成しながら 展開してゆきます。
指定するディレクトリ以下のファイルをまとめてアーカイブを作成する場合は

tar czvf アーカイブファイル名  指定ディレクトリ名

となります。オプションは順不同で

 x      アーカイブを展開します
 c      新しいアーカイブを作成します
 t      アーカイブのリストを表示します (x,c,tはどれかを選択)
 z      gzipによる 圧縮・伸張を行います
 v      動作状況を詳細に表示します
 f      対象ファイル名を指定します

続いて、展開したソースファイルのインストールについてですが、 UNIX の多くのアプリケーションのソースファイルは、各種プラットホーム上で 同じように動作させるために、まず それぞれの端末の設定状態によって コンパイルオプションを設定する作業を行います。
多くは自動化されていて、 configure というスクリプトで実行します。 コンパイルオプションは この configure で指定することがほとんどです。

設定、コンパイル、インストールの一連の作業は展開したディレクトリで、

./configure [あればオプション]
make
make install

とするのが一般的です。

・ ブート時に 起動するカーネル[kernel]を変更する

カーネルの再構築に失敗した場合や、一時的にデフォルトのカーネルで 起動したい場合は、ブート直後以下のメッセージが表示されたら

 Hit [Enter] to boot immediately, or any other key for command prompt
 Booting [kernel] : 10 second ...

メッセージにしたがって [Enter]以外のキーを押します([SP]キー等)。
続いて読み込んだ現在のカーネルを unload し、指定するカーネルで起動します。

unload
load /kernel.GENERIC
boot
##  (一行で 'boot /kernel.GENERIC' と記述することできます)

・ シングルユーザモードでの立ち上げ

不幸にして root パスワードを忘れた場合や、他のホストから切り離した状態 でマシンのメンテナンスをする場合などに、シングルユーザモードで立ち上げる ことができます。もちろん、直接端末が操作できる 環境でなければできませんが。

ブート時、Booting [kernel] : ** second と表示されたら [Enter] 以外のキーを押下し、以下のコマンドを打ち込みます。

boot -s
mount -u /       (ルートファイルシステムをマウント)
mount -a         (全てのファイルシステムをマウント)
passwd root      (必要なコマンドの入力)

・ マシンの基本設定

ネットワークで使用する上での、基本的なマシン(ホスト)の設定についてですが 多くは、以下の設定ファイルに記述されています。

ホスト名、IPアドレス、サブネットマスクは、デフォルトゲートウェイは /etc/rc.conf内で設定されています。

[/etc/rc.conf]
ifconfig_fxp0="inet 192.168.123.45  netmask 255.255.255.0"
defaultrouter="192.168.123.1"
hostname="myhost.xxxx.yyy.zzz"

ドメイン名とDNSサーバの設定は /etc/resolv.confです。 DNSサーバは複数記述することも可能です。

[/etc/resolv.conf]
domain  xxxxx.yyy.zzz
nameserver 192.168.123.10
nameserver 192.168.100.1

・ システムの起動時に実行されるスクリプト

システムの起動時には、/etc/ディレクトリ以下の rc*.conf ファイルに記述 されているものが順に起動されてゆきます。マシンの全体設定に関するものは rc.conf に、その他ユーザが設定するものは rc.local、各アプリケーション等 の起動用スクリプトは /usr/local/etc/rc.d 以下に配置します。 /etc/rc.conf, /etc/rc.local...


cd /usr/local/etc/rc.d
chmod +x *
## (ファイル属性を数字で指定する場合 chmod 755 *)

スクリプトの中身はテキストファイルです。 # 以降はコメントとして無視されますが、 最初の1行目の #!/bin/sh の部分だけは、使用するシェルを指定します。
逆に、最初の1行を見れば、そのスクリプトがどのシェルで記述されているかが わかります。ほとんどのシェルスクリプトは B-shell(/bin/sh)で記述されています。


sh の場合           #!/bin/sh
csh の場合          #!/bin/csh
perl の場合         #!/usr/bin/perl

・ シェル(csh/tcsh)のコマンドライン補完機能

シェルでファイル・ディレクトリを指定するときに、いちいち名前全てを 入力しなくても、区別がつくところまで入力した後に、補完用のキーを押すと 入力をシェルが補ってくれます。cshはファイル・ディレクトリ名のみですが、 tcshではコマンド名も補完の対象になります。 補完に用いるキーは cshでは[ESC]、tcshでは[TAB]です。

tcshでは 常に補完機能を利用できますが、cshでは シェル変数 filec を定義しておかないと補完機能は利用できません。


・ 設定しておきたい シェル(csh/tcsh)の環境変数

シェルを使用する際に、コマンド検索のパスやコマンドヒストリなどを 指定することが可能です。自分のホームディレクトリの設定ファイルを 編集することで簡単に変更できます。csh/tcshでは、.cshrcに 設定内容を記述します。

alias h         history 25
alias j         jobs -l
alias la        ls -a
alias lf        ls -FA
alias ll        ls -lA

# A righteous umask
umask 22

set path = (/sbin /bin /usr/sbin /usr/bin /usr/local/sbin /usr/local/bin $HOME/bin)

setenv  EDITOR  ee
setenv  PAGER   less
setenv  LESSCHARSET     utf-8   # iso8859
setenv  BLOCKSIZE       K

alias コマンドで、よく使用するコマンドを別名で登録することが できます。この場合、パラメータまで設定することが可能ですから、パラメータ に応じた名称を alias で与えておくことで、機能に応じた別名を使用することが できます。
環境変数 EDITOR を設定しておくと、コマンド内部から呼ばれる デフォルトのエディタを変更することができます。TOMOsan は ee に変更して います。 この変更で、vipw、crontab、edquota などのコマンドを使用する際にも エディタとして ee が使用されます。
PAGER を設定すると、一画面に収まらない場合の表示に指定したページャが 使用されます。逆に戻って表示したり、エディタを起動したり、more よりも less の方が使いやすいと思いますし、キャラクタセットの設定で日本語を表示させる ことも可能です。


・ プロセスの表示と 強制終了・再起動

FreeBSDでは、デーモンもアプリケーションも一つのプロセスとして起動 処理されています。これらの一覧を得るには、

ps          (自分の起動したプロセスのみ表示)
px -ax      (起動している全プロセスの表示)
top         (現在稼動しているプロセスを上位から表示)

'ps -ax' コマンドで表示されるプロセスの一例です

  PID  TT  STAT      TIME COMMAND
    0  ??  DLs    0:01.48  (swapper)
    1  ??  Is     0:00.04 /sbin/init --
    2  ??  DL     0:04.31  (pagedaemon)
    3  ??  DL     0:00.00  (vmdaemon)
    4  ??  DL    10:37.38  (syncer)
   36  ??  Is     0:00.00 adjkerntz -i
  121  ??  Ss     0:13.99 syslogd
  164  ??  Ss     0:00.02 inetd -wW
  167  ??  Is     0:25.88 cron
   ....

プロセスを強制終了させるには、ps で表示される PIDを引数にして

kill -KILL[/TERM] 164   (inted を強制終了させる)

また、設定ファイルを読み込ませるため再起動させるには

kill -HUP 164           (inetd を再起動させる)

一般ユーザは自分が起動したプロセスしか終了させることは出来ません。 root だけが全てのプロセスを操作できます。


・ crontab による自動実行

システム全体の自動実行用の設定ファイルは、/etc/crontab にあります。 FreeBSD システム自体の自動実行も このファイルに記載されています。

以下に設定ファイルの一部を示します。

# /etc/crontab - root's crontab for FreeBSD
#
# $FreeBSD: src/etc/crontab,v 1.21.2.3 2000/12/08 10:56:07 obrien Exp $
#
SHELL=/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
HOME=/var/log
#
#minute hour    mday    month   wday    who     command
#
*/5     *       *       *       *       root    /usr/libexec/atrun
#
# rotate log files every hour, if necessary
0       *       *       *       *       root    newsyslog
#
# do daily/weekly/monthly maintenance
1       3       *       *       *       root    periodic daily
15      4       *       *       6       root    periodic weekly
30      5       1       *       *       root    periodic monthly

最初の5項目で「いつ実行するのか」を決定します。次の項目は そのときの実行ユーザ権限で、最後の項目が実行すべきファイルです。


/etc/crontab は、システム全体にかかわる設定であり、当然ながら root 以外のユーザは操作できません。

一方、各ユーザレベルで cron コマンドを実行することも可能です。 該当ユーザのコマンドラインから

crontab [-u ユーザ] -e

とします。 環境変数 EDITOR に設定されたエディタを使用して ユーザ毎の crontab ファイルの編集を行うことができます。 実行ユーザは 決まっていますので システム全体の crontab ファイル の項目から、実行ユーザが除かれた形式 となっています。
オプション -u ユーザ を使用すれば ユーザ名を指定する ことができますが、他ユーザの設定を変更できる権限を持っていなければ なりません。

具体例を示します。

#min   hour  mday  month wday  command
0      2     *     *     *     backup.sh

この場合、毎日午前2時に カレントディレクトリの backup.sh を実行する設定となります。


現在の設定を確認するには

crontab [-u ユーザ] -l

現在の設定を削除するには

crontab [-u ユーザ] -r

各ユーザの設定ファイルは /var/cron/tabs/ユーザ名となります。 ファイルの所有者は各ユーザではなく root となっています。また、一般ユーザは このディレクトリを参照することもできないようです。


・ ログファイルの整理

各種サーバを動作させていると、ログファイルがすぐに巨大になってきます。 これを回避するために、システムログを適宜圧縮して、古くなったものから順に 処理してゆくという作業(ログローテーション)を行わせることが出来ます。

/etc/newsyslog.conf というファイルに設定を記述します。以下、 /etc/newsyslog.conf の内容です。

# logfilename        [owner.group]  mode count size when [ZB] [/pid_file] [sig_num]
/var/cron/log                        600   3    100  *     Z
/var/log/amd.log                     664   7    100  *     Z
/var/log/kerberos.log                664   7    100  *     Z
/var/log/lpd-errs                    664   7    100  *     Z
/var/log/maillog                     664   7    *    24    Z
/var/log/sendmail.st                 664   10   *    168   B
/var/log/messages                    664   5    100  *     Z
/var/log/slip.log                    600   3    100  *     Z
/var/log/ppp.log                     600   3    100  *     Z
#
/var/log/sample.log   saito.users    644   8    200  *     Z

logfilename には、処理を行いたいログファイルを指定します。/var/log 以外のファイルを指定しても構いません。[owner.group] は、ログファイル を操作する場合の所有者を指定します。何も指定しなければ root が指定されたと みなされますが、続く mode で指定されるパーミッションとの関係で、 所有者以外書き込み禁止で、サービスの実行権が root以外の場合、[owner.group] を指定しておかないと、ログの書き込みに失敗します。

count で、ログとして残しておくファイルの世代を指定します。処理された ログファイルは、logname.1.gz のように、後ろに世代番号を付加された上 圧縮された場合 .gz が付いた名称になります。count 数を増やせば、多くのログ ファイルを残しておくことが可能になります。

size は、ログファイルが指定するサイズ以上になったときに、ログの ローテーションを行わせることが出来ます。単位は k(キロ)byteです。'*' を指定 した場合は、サイズによるローテーションは行わないことを示します。

when は、指定する時間毎にローテーションを行うように指示することが できます。'24'であれば一日に1回処理を行います。'*' を指定すると、時間による 指定は無効となります

ZB は、'Z'でファイルの圧縮を指定します。ログファイルはテキスト形式 のものが多く、この場合ログローテーションが行われるたびに、その旨を示す メッセージがログファイルに付加されますが、'B'を指定するとバイナリファイルと みなされ、このメッセージが付加されなくなります。


・ エディタについて

UNIXでのエディタといえば vi ですが、これは初心者には どうしても使いづらいと思います。TOMOsanもやはりその一人です。
普段は ee を使用しているのですが、vipw コマンド等でいきなり vi の 画面になった時はどうしていいのか分からなくて焦ってしまいます。
まずデフォルトのエディタの変更ですが、ログインした状態からであれば、 直接コマンドラインから、以下のコマンドを入力します。

setenv EDITOR ee      (csh/tcshの場合)
EDITOR = ee           (sh/bashの場合)

vi が起動してしまってどうしようもないとき、落ち着いて [ESC]を押します。 続いて :q! と押せば無事終了します。
':'キーを押すとコマンドを受け付けるため、最終行に':'が表示されます。 ここで'h'[Enter]を押すと簡単なヘルプがでます。


最低限覚えておきたい vi のコマンドは 以下のとおりです


*) コマンドモードへの切替
[ESC] コマンドモードへ切り替えます。これだけは必須です!
*) 入力モードへの切替
a カーソルの右に挿入 A カーソル行の最後に挿入
i カーソルの左に挿入 I カーソル行の先頭に挿入
o カーソルの下の行に挿入 O カーソルの上の行に挿入
*) 削除
x カーソル位置の文字1文字を削除 X カーソルの左1文字を削除(BackSpace)
dd カーソル行を切り取り d$ カーソル位置から右側を削除
d^ カーソル位置から左側を削除    
*) カット アンド ペースト
yy カーソル行をバッファへコピー dd カーソル行をバッファへ移動(削除)
p カーソルの次の行に貼り付け P カーソルの前の行に貼り付け
*) 終了 と ファイル操作
:w テキストの保存 :wq テキストを保存して終了
:q vi の終了 (確認あり) :q! 編集を破棄して強制終了
ZZ 終了 変更があると保存する    
*) その他
u アンドゥ(元に戻す) h ヘルプを表示
:viusage 基本操作コマンドの表示 :exusage 拡張操作コマンドの表示

・ 文字列の引用符について

UNIX上で文字列を引用する引用符には、
[']シングルクォート、["]ダブルクォート、[`]バッククォートの3種類が ありますが、それぞれ役割が違います。

以下環境変数 $EDITOR = vi で、sample.txt の内容が demonstration の場合、


( ' )
シングルクォート
引用符に囲まれた文字列はそのまま評価されます。もっとも基本的な引用符です。
[実行] echo 'This is \"sample\". Editor is $EDITOR.'
[結果] This is \"sample\". Editor is $EDITOR.
( " )
ダブルクォート
引用符に囲まれた文字のうち、環境変数や通常の変数の値が展開されます。
'\'に続く引用符などのエスケープキャラクタも展開されます。
[実行] echo "This is \"sample\". \nEditor is $EDITOR."
[結果] This is "sample". Editor is vi.
( ` )
バッククォート
引用符内をコマンドとして実行し、その結果を文字列として持ちます。
[実行] kill -HUP `cat /var/run/inetd.pid`
[結果] ... inted のpidを間接的に指定して再起動させる
[実行] echo `cat sample.txt`
[結果] demonstration.

TOMOsan Top Page に戻る
パソコン・プログラミングに戻る


Copyright(c) 2001, 2002 Tomohiko Saito. All rights reserved.
last update :