All ASCII Linux Issue / Linux Magazine 2000年2月号
これで解決! Linux 100の疑問―その3
システムの起動・ルートユーザー・シェル
2001年9月6日
システムの起動その1
 |

本記事も収録 Linux magazine 2000年 2月号 1,390円 |
Q:LinuxのインストールCD-ROMから起動できない
A:古いマシンやCD-ROMドライブだと、CD-ROMからのブートはサポートされていません。マザーボードによっては、BIOSをアップデートすればCD-ROMブートが可能になるかもしれません。SCSI接続のCD-ROMドライブの場合、SCSIアダプタもCD-ROMブートに対応していなければなりません。
また、マザーボードのBIOS設定で、CD-ROMの起動順位をハードディスクより先にしておかないと、ハードディスクにあるOSが起動してしまいますので注意しましょう。
CD-ROMブートができなくても、悲観することはありません。インストールフロッピーを作り、これで起動すればよいのです。インストールCD-ROMの中に、インストールフロッピーのイメージファイルと、このイメージをフロッピーディスクに書き込むDOSプログラム(rawrite.exe)が入っているはずです。これらを使い、DOSかWindowsでインストールフロッピーを作成しましょう。
Q:LILOプロンプトがLIで止まって起動しない
A:LILO(LInux LOader)が、表示途中で止まるのにはいくつかの原因が考えられますが、Linuxを何度かインストールするうちに、不要になったLILOがMBR(マスターブートレコード)に残り、悪さをすることがあります。この場合はDOSやWindows 95/98で“FDISK /MBR”を実行して古いLILOを消します。
LILOは、Linuxを起動するときに、BIOSを使ってカーネルを読み出しますが、いにしえからの伝統を引きずったBIOSは、ハードディスクの1024シリンダ以降にアクセスできないのです。このため、カーネルが1024シリンダ以降の部分に配置されていると、Linuxを起動できません。近頃の大容量ハードディスクでは、この問題が起きることがあります。
ただし、シリンダが1024以上あるハードディスクでも必ず起動できなくなるわけではありません。カーネルが1023シリンダまでに収まっていれば起動しますが、カーネルの再構築をして、新しいカーネルが1024シリンダ以降に配置されるとLILOからの起動ができなくなります。
この問題を解決するには、カーネルを1023シリンダ以内に置くか、LILOを使わずにブートするしかありません。Red Hat Linuxなどでは、カーネルを/bootディレクトリに置くので、ハードディスクの前のほう(1023シリンダ以内)に10〜15Mバイト程度のパーティションを作り、これを/bootにマウントすれば問題を回避できます。
このほかにも、LILOではなく、BIOSの制限を受けないブートセレクタを使う、あるいはフロッピーディスクからカーネルを読み出して起動するという回避方法もあります。
このような時のために、起動フロッピーは、できるだけ作るようにしましょう。
Q:ときどき起動にもの凄く時間がかかるのはなぜ?
A:Linuxでは、fsckというファイルシステムのチェックプログラムが使われています。これは、Windowsのスキャンディスクのようなものです。このfsckは、一定の回数ディスクをマウントすると起動時に自動実行されます。たとえば、Red Hat Linux 6.1では、ファイルシステムを20回マウントするごとにfsckを自動実行します。また、前回の終了時に正しくシャットダウンされていない場合も実行されるようになっています。チェックするパーティションが小さければすぐに済みますが、パーティションが大きくなるとそれなりに時間がかかるようになります。
また、メール配送プログラムのSendmailは、起動する際にDNS(Domain Name System)サーバに接続しようとします。このときにDNSサーバが見つからないとSendmailがタイムアウトするまで数分間待たされることになります。Sendmailを使わないなら、自動的に起動しないようにしましょう。
(Linux magazine編集部)
システムの起動その2
Q:rootのパスワードを忘れてしまったのですが、再インストールするしかないですか?
A:このようなときは、メンテナンス用の“シングルユーザーモード”というモードで起動してパスワードを再設定することができます。
シングルユーザーモードで起動するには、LILOの“boot:”プロンプトで“linux 1”と入力します。この“linux”は起動するOSを選ぶためのラベルで、環境によっては違うかもしれません。その場合は、“boot:”プロンプトに対してTabキーを押すと、登録されているラベルが一覧表示されるので、その中からLinuxを起動するものを選びます。
シングルユーザーモードで起動するとシェルのコマンド画面になりますので、passwdコマンドでパスワードを再設定します。
さて、rootのパスワードがわからないと、シャットダウンもできないことが多いでしょう。この場合、まずsyncコマンドを実行して、ディスクキャッシュに残っているデータをディスクに書き込みます。次にCtrl+Alt+Deleteキーを押して終了します。
Q:ランレベルってなに?
A:Linuxには、ランレベルという複数の動作モードがあり、0〜6のランレベルによって、機能の範囲を変えられるようにしています。たとえば、Red Hat LinuxやTurboLinuxでは、表2のようになっています。
通常のテキストコンソール起動時は、ランレベル3で動作し、X Window System起動時はランレベル5で動作しているというわけです。Linuxは、マルチユーザーOSなので、同時に複数のユーザーで利用できますが、管理者がディスククラッシュを復旧する際などは、ほかのユーザーやデーモンがファイルを読み書きすると非常にマズいことになります。このようなときには、ほかのユーザーやデーモンを排除するためにシングルユーザーモードで作業をします。管理者はマシンの前に座り、一人寂しく作業をするのです。
起動時のデフォルトランレベルは、/etc/inittabで設定されています。このファイル中に、id:3:initdefaultと書かれていればデフォルトのランレベルは3になります。これを書き換えるか、起動時にLILOの“boot:”プロンプトで“linux 5”のようにすれば、ランレベルを指定することができます。
一方、起動してからランレベルを切り替えるのがtelinitコマンドです。たとえば、“telinit 6”を実行すると、すぐにランレベル6となり、Linuxが再起動します。
表2 ランレベルによるLinuxの機能
| 0 |
停止 |
| 1 |
シングルユーザーモード |
| 2 |
マルチユーザーモード(ネットワーク機能なし) |
| 3 |
フルマルチユーザーモード(テキスト) |
| 4 |
未使用 |
| 5 |
マルチユーザーモード(X Window System) |
| 6 |
再起動 |
Q:起動フロッピーを作りたい
A:ハードディスクからLinuxを起動できなくなったときなどに活躍するのが起動フロッピーです。
ディストリビューションによっては、起動フロッピーを作るためのシェルスクリプトが用意されているものもありますが、ここでは標準的なコマンドを使い、シンプルな起動フロッピーを作る方法を紹介します。
作成手順は、たったの3ステップだけです。まず、フロッピーディスクをフォーマットします。
次に、カーネルのイメージを書き込みます。
# dd if=/boot/vmlinuz of=/dev/fd0
|
最後に/(ルート)ファイルシステムのパーティションを指定して終了です。
# rdev /dev/fd0 /dev/hda1
|
このフロッピーで起動すると、カーネルをフロッピーディスクから読み出し、/dev/hda1のパーティションを/(ルート)ファイルシステムとしてマウントします。
しかし、カーネルに渡すオプションが入力できないので、ランレベルの指定などはできません。そこで、今度は、オプションを指定できる、もう少し便利な起動フロッピーを作ってみます。このフロッピーには、LILOとカーネルイメージを入れ、フロッピー内のカーネルとハードディスクのカーネルを選べるようにします。
下準備として、フロッピーディスクに書き込むLILOのために、設定ファイル/etc/lilo.flopを作ります(リスト5)。/etc/lilo.confをコピーして雛形にすると簡単です。
次に、起動フロッピーを作成します。最初にフォーマットし、ext2ファイルシステムを作成します。
# fdformat /dev/fd0H1440
# mke2fs
/dev/fd0
|
作成したディスクをマウントし、ハードディスクからチェインローダとカーネルをコピーします。
# mount -t ext2 /dev/fd0 /mnt/floppy
# cp -p /boot/chain.b /mnt/floppy
# cp -p /boot/vmlinuz-2.2.13 /mnt/floppy
|
最後に、フロッピーディスクにLILOをインストールし、アンマウントすればできあがりです。
# lilo -C /etc/lilo.flop
# umount /mnt/floppy
|
この起動フロッピーでブートすると、LILOの“boot:”プロンプトが表示されるので、ここで“linux”と入力すればハードディスクのカーネルが、“rescue”と入力すればフロッピーディスクのカーネルが起動します。さらに、“rescue 1”などと入力すればランレベルの指定も可能です。
ただし、ブートメディアのドライバをモジュールにしている場合は、これらの方法で起動ディスクを作ることはできません。ブートに必要なドライバをカーネルに組み込んでしまえば、簡単に起動フロッピーを作成できます。
boot=/dev/fd0
#LILOはフロッピーに置く
map=/mnt/floppy/lilo-map
prompt
timeout=50
default=linux
image=/boot/vmlinuz-2.2.13
#ハードディスクのカーネル
label=linux
read-only
root=/dev/hda1
image=/mnt/floppy/vmlinuz-2.2.13
#フロッピーディスクのカーネル
label=rescue
read-only
root=/dev/hda1
| リスト5 /etc/lilo.flopの例 |
Q:デーモン(daemon)とはなんですか?
A:ゲームのように、ユーザーと対話しながら表舞台で活躍するアプリケーションとは違い、人目につかないところでひっそりと仕事をする、「縁の下の力持ちプログラム」の総称です。“ps ax”コマンドを実行するとわかるように、Linuxでは数多くのプログラムがデーモンとして動作しています。たとえば、仮想記憶を実現するkswapd、ログを集めてファイルに記録するklogdやsyslogd、各種のネットワークサーバプログラムなどはデーモンとして動作しています。
デーモンは、ユーザーと直接対話する制御端末を持ちません。ですから、一般のユーザーは、デーモンが動いているかどうかを気にかけないでしょう。
起動されたデーモンは、すぐに活動するわけではなく、特定のリクエストを待ち、リクエストを受信するとそれに対する処理を行います。そして処理が済むと、次のリクエストが来るまでまた休むのです。たとえば、Webサーバのhttpdは、ユーザーから接続されるまで休んでいて、接続されると活動を始めます。また、決められた時刻や一定時間ごとにプログラムを起動するcrondも代表的なデーモンです。
Linux、UNIXの世界において、デーモンは、悪魔や悪霊ではなく、ギリシャ神話の「神と人の間に位置する超自然的存在」に由来するものとされています。
Q:デーモンの起動、停止の方法を教えてください。
A:システムの起動時に、自動的に起動するデーモンを設定したい場合はツールを利用するのが便利です。TurboLinuxではturboserviceコマンド、Red Hat Linuxならntsysvコマンドが利用できます。また、X Window Systemで動作するLinuxconfやksysvコマンドが使えれば、グラフィカルなユーザーインターフェイスで設定できます。
では、今すぐデーモンを起動したいときはどうすればよいのでしょう。Red Hat Linuxなどでは、/etc/rc.d/init.dディレクトリ以下にデーモンの起動スクリプトが用意されていますので、起動したいデーモン名のファイルに、引数としてstartをつけて実行します。たとえば、httpd(Webサーバ)を起動したいなら、
# /etc/rc.d/init.d/httpd start
|
とするとhttpdが起動されます。引数にはstopとrestartも使え、それぞれ停止と再起動を行います。
一方、Slackwareなどでは/etc/rc.d/ディレクトリにrc.httpdのようなファイルが用意されているので、これを実行すれば、そのデーモンが起動します。
また、止めたい場合はps axを実行して、止めたいデーモンプロセスのPID(プロセスID)を調べ、killコマンドを使います。例として、PIDが567のデーモンを止めてみましょう。
Red Hat Linuxなどでは、/var/runディレクトリに、主要なデーモンのPIDを記録したファイルがあるので、これを利用して次のようにすることもできます。
# kill -TERM `cat /var/run/httpd.pid`
|
再起動する場合は、killコマンドのオプションをーTERMの代わりにーHUPにします。デーモンの設定ファイルを変更したら、このようにしてデーモンを再起動し、変更内容を動作に反映させます。
(Linux magazine編集部)
ルートユーザー
Q:rootで使い続けるのはよくないといわれますが、どうしてでしょうか?
A:大きく分けて理由は3つあります。まず、rootユーザーは、システムに関するあらゆる権限を持っています。そのため、システムクラッシュ、ファイルの破壊などが行えてしまいます。そして、LinuxのようなOSは、それが簡単にできてしまいます。たとえば、“rm -rf *”を実行すると、カレントディレクトリ以下にあるファイルとディレクトリを問答無用ですべて削除してしまいます。
次に、セキュリティ確保の問題があります。rootユーザーとしてログインしているときに離席する場合は、マシンにイタズラをされないよう、なんらかの防護策をとらないといけません。防護策が必要なのは一般ユーザーであっても同じですが、前述の権限などの理由により、イタズラされた場合にシステムが受けるダメージはケタ違いに大きくなります。
最後に、Linuxの便利なリモートツールが利用できません。最近のディストリビューションの多くは、セキュリティ上の理由からrootユーザーがtelnetやFTPを利用してアクセスできないようにしてあります。これでは、Linuxの持つメリットが半減します。
これらの問題を防ぐために、一般ユーザーを作っておき、ふだんはそのユーザーで作業するようにしておきます。そして、rootユーザーの権限が必要な作業が発生したときだけ、suコマンドを利用して、一時的にrootユーザーとなり、作業が終わったらexitして、すぐに一般ユーザーに戻ることをお勧めします。
Q:では、一般ユーザーはどのようにして作るのですか?
A:新しいユーザーを作る方法はいくつかあります。LASER5 Linux 6.0やVine Linux 1.1などのユーザーなら、Linuxconfを使って作成できます。また、TurboLinux 4.xのユーザーならturbousercfgコマンドで作成することができます。また、useraddコマンドを利用してコマンドラインから作成することもできます。
Q:suコマンドを実行してrootになったのに、管理者コマンドが使えない。
A:オプションをつけずにsuコマンドを実行すると、直接rootユーザーとしてログインしたときとは違い、そのユーザーの環境を引き継いだままroot権限を持ちます。これにより、PATHの設定も元のユーザーと同じになるので、管理者コマンドが置かれた/sbinや/usr/sbinなどにはパスが通っていません。
管理者コマンドを利用する場合は、絶対パス指定でコマンドを実行するか、suコマンドにー(ハイフン)オプションをつけてrootユーザーになります。このオプションをつけると、直接rootユーザーとしてログインしたときと同じ環境に初期化されますので、/sbinや/usr/sbinなどにもパスが通るようになります。
Q:rootでtelnetやFTPログインができない
A:これは、セキュリティを確保するための措置です。
telnetやFTPでは、ユーザー認証の際にパスワードをそのままのテキスト(平文)のままで回線に流します。これはとても危険です。
一般ユーザーとしてtelnetログインし、その後suコマンドでrootになることは可能です。しかし、インターネットに接続したマシンでは、telnetを使うべきではありません。
それでは不便ですから、telnetの代わりにSSH(Secure Shell)を使いましょう。SSHは、ホスト間の通信とユーザー認証を公開鍵暗号によって暗号化します。これにより、リモートログインや、ホスト間でのファイルコピーを安全に行えます。ただし、商用利用する場合は有償のライセンスを受ける必要があります。詳しくは、SSHのWebページ(http://www.cs. hut.fi/ssh/)を参照してください。また、SSHをフリーで実装するOpenSSHプロジェクト(http://www.openssh. com/)もあります(画面7)。
 |

画面7 OpenSSHプロジェクトのWebページ |
(Linux magazine編集部)
シェルその1
シェルとはなんですか?
A:広義には「ユーザーとシステムの橋渡しをするインターフェイス」ということになります(図2)。ただし、Linuxでは「コマンドラインに渡された文字列を解釈して、その命令をシステムに渡すもの」(コマンドラインインタープリタ)の意味で使われることがほとんどです。元々コマンドラインでの利用が主流だったUNIXでは、コマンドラインインタープリタとしてのシェルは数多く作られており、Bourneシェル(sh)、Cシェル(csh)、Kornシェル(ksh)、tcsh、bash、zshなどの種類があります。
 |
図2 シェルの概念 |
Q:それぞれのシェルはどんな特徴がありますか?
A:これらのシェルは、sh系とcsh系に大別することができます。sh系の大元になるのがBourneシェルです。Bourneシェル(sh)は、AT&Tベル研究所のSteven Bourne氏によって作られたもので、古くからUNIXでは標準的にバンドルされてきたシェルです。Bシェルと呼ばれることもあります。このBourneシェルはUNIXでは標準的な存在ながら、非常にプリミティブな機能しか持っていません。
それとは別にcsh系の大元となるのがCシェルです。Cシェルは、UCB(カリフォルニア大学バークレー校)で、viやBSDの開発で知られるBill Joyによって作られました。ジョブ制御やエイリアスなどBourneシェルにない機能を持っています。また、C言語に似た文法でスクリプトを記述できるという特徴を持っています。
これらの2つシェルを中心に、拡張版としていくつかのシェルができました。sh系の後継として、Kornシェルやbashが開発されました。Kornシェル(ksh)はベル研究所のDavid Korn氏によって開発されました。Kornシェルは、BourneシェルとCシェルの優れた機能を取り込んだシェルで、商用製品です(以前のバージョンを基にパブリックドメインとして提供されているものはある)。
一方のcsh系には、tcshがあります。tcshは、Cシェルの機能に加えて、コマンド行編集が改善されています。
Linuxで標準的に利用されているbashは、Bourne Again Shellの略称で、GNUプロジェクトによる成果物です。Bourneシェルとの互換性だけでなく、CシェルやKornシェルの機能も取り込んでいます。基本機能だけでもあらゆるシェルの特徴を持っていますが、カスタマイズ力も高くなっています。
Q:自分が使っているシェルを知りたいときは?
A:コマンドラインから、
と入力します。Linuxではほとんどの場合、bashを使用しているでしょう。
Q:シェルを変更するには?
A:コマンドラインから、chshコマンドを実行することでシェルを変更できます。さらに、LinuxconfやturbousercfgなどのGUIツールからも変更可能です。
Q:ホームディレクトリにある.bash_profile、.bashrc、.bash_logoutは、それぞれどのような働きをするのでしょうか?
A:簡単にいうと、.bash_profileはシステムにログインする際に読み込まれる環境定義ファイルです。.bash_loginや.profileなども.bash_profileと同様の働きをして、ホームディレクトリに.bash_profileがなければ、.bash_loginを探し、.bash_loginがなければ、.profileをという順番で探していきます。特別な理由がない限り、.bash_profileを利用すればいいでしょう。
.bashrcはサブシェルが起動されるたびごとに読み込まれる環境定義ファイルです。ただし、多くのディストリビューションでは、ログインシェルとサブシェルを区別なくコマンドを実行できるよう、.bashrcを.bash_profileの中で読み込むような設定になっています。
なお、起動時には、これらのファイルの前に、/etc/profileがあれば、このファイルが一番先に読み込まれます。
.bash_logoutは、ログアウト時に読み込まれて実行されるファイルで、テンポラリファイルの削除やログの書き込みコマンドなどを書いておけばいいでしょう。
(Linux magazine編集部)
シェルその2
Q:lsしても.bash_profile、.bashrc、.bash_logoutが表示されません。
A:標準ではlsコマンドは、先頭に「.」(ドット)のついたファイル(ドットファイル)は表示しません。表示させたいときは、
として、-a(all)オプションつきで実行します。
Q:.bash_profileを変更したのに、変わっていません。
A:.bash_profileはログイン時に一度しか読み込まれません。変更した設定を有効にしたいなら、
か、
として、再度読み込ませることで、変更が有効になります。
Q:bashで変数を設定するときexportを実行するものとしないものがありますが、違いがわかりません。
A:次のように、
変数名=値
として設定する変数は、「シェル変数」と呼ばれる変数の定義法です。これは、複雑なシェルスクリプトを作るときに値の保存に使います。また、組み込み変数と呼ばれるbashが参照する値を設定しておいて、シェルをカスタマイズしたり、シェルの状態を取得したりします。
一方、
export 変数名=値
のように設定する変数は、「環境変数」と呼ばれる変数の定義法です。環境変数は、コマンドの動作環境を構築するためのもので、環境変数だけがサブプロセスにも伝わります。逆にいえば、このことはサブプロセスにも伝えたい変数は環境変数として定義すべきであることを意味します。具体的には、環境変数EDITORなどがそれに当たります。
Q:コマンドラインからの入力はよく間違えます。
A:bashの補完機能を利用することをお勧めします。コマンドライン上で、コマンド名やファイル名などを途中まで入力したあと、TABキーを押せばbashが検索パス上から該当する文字列を補ってくれます。また、lsをksと打ち間違えるようなら、
とすれば、それ以降はksと打ち間違えても、正しいコマンド(ls)が実行されます。ただし、これはあまりお勧めできる方法ではありません。
Q:コマンドを入力するとき文字列は'と"のどちらで囲めばいいのでしょうか?
A:単なる文字列をコマンドに渡すだけなら、どちらでも構いません。しかし、変数などをコマンドに渡すときに'(シングルクォート)と"(ダブルクォート)では、その挙動は異なります。たとえば、
としておいて
とダブルクォートでくくると、
と表示されますが、
とシングルクォートでくくると、
となり、変数は展開されません。
(Linux magazine編集部)
|