« 2009年9月 | トップページ | 2009年12月 »

vi を使おう(基本編)

 最近、なぜか忙しい日々が続いてます…。

 私の場合は、忙しいと、だらだらと中身のない文書を書いたり、ギャグがダダ滑りしたりするので(^^;;;、しばらく、更新の間隔を開けることにしま~す(^^;

 …で、今回は、UNIX 管理者の必須教養科目(^^;vi エディタの最小限の使い方を解説します。


■ vi にまつわるウワサについて

 vi は、ほぼ全ての UNIX に最初から入っている、UNIX 標準ともいえるエディタですが、vi にまつわる、いろいろなウワサを聞いて、vi を避けている人が多いようです(^^;;

 まず最初に、そんなウワサを片付けてしまいましょう。


○ ウワサ1:vi は難しい

 え~、vi の操作方法が、現在主流のエディタと大きく違う、という意味であれば、その通りです(^-^;ヾ(^^;;ぉぃ

 ただし、vi は、学習コストは高いけれど、それを補(おぎな)ってあまりあるくらい生産性が高い、と言われているので、大量の文書(プログラムを含む(^^))を書く人で、興味のある方は、一度、極(きわ)めてみるのもいいかもしれません(^^;

 ちなみに私の場合、FreeBSD では viですが、Windows では TeraPad を使ってます。
 で、大量に文書を書いてた頃は、vz を使ってました(^-^)

○ ウワサ2:vi は操作性が悪い

 vi では、カーソルの移動に h,j,k,l を使う…と聞いて、それだけで vi を使う気をなくしてる人もいますが、いまどきの vi は、カーソルキーが使えるのは当たり前で、[PgUp] や [PgDn] キーでページめくりができるものもあります。

 また一方で、マウスを使って文字を選択してから、編集メニューのコピーを選んで…などという操作法をまどろっこしいと思ってる人がいるのも確かで、いうなれば、単なる好みと慣れの問題だと思います。

 それから、vi 嫌いの人にとっては不評の(^^;、「文字を入力するたび、いちいち [I] キーを押さなくてはいけない」ですが、vi 使いにとっては、コマンドモードで利用できる編集機能の豊富さが vi の魅力だったりするわけで…
 …っと、まあ、この件については、話がかみ合わず、平行線のままかも(^^;;

○ ウワサ3:vi は低機能だ

 これは全くの迷信またはデマで(^-^;、vi は、そこらへんのエディタより、ずっと高機能です。
 例を挙げると、

 ・複数ファイルの同時編集が可能
 ・26個のバッファが使える
 ・マクロ機能あり
 ・コマンドの実行結果を取り込み可能

 などの機能が vi には備わっています

 また、古い vi で、編集中のファイルに対して行った変更が、画面にすぐに反映されないことを指して「vi は低機能だ」と思ってる人もいますが、これは、1200 baud とか、それ以下の速度で UNIX にリモートログインして vi を使っていた時代のことを考えると、合理的な仕様です(^-^;

 もちろん、最近の vi では、ネットワーク速度の心配はないので、画面の書き換えはリアルタイムに行われます。


■ vi の設定

 ここでは、FreeBSD 付属の vi を使うことを前提に、vi の設定をしておきましよう。

 vi の設定ファイル:~/.exrc
set autoindent
set ruler
set showmode
set verbose
 設定ファイルの名前が .virc でなく、.exrc なことに注意してください(特に UNIX を知ってる方(^^;)。

 なお、これは、本当の vi 初心者用の設定で、vi をある程度使えるようになったら、「set autoindent」と「set showmode」だけ残して、あとは削除してしまっていいでしょう。

.exrc の解説

01行目:set autoindent
 オートインデント(自動字下げ)機能を有効にします。
 オートインデントというのは、行の最初にある空白の数を合わせてくれるという、ちょっと気の利いた機能です(^^)

 例で示すと、ファイルの編集中に、次のような画面で [Enter] を押すとき、

        if ( $?tcsh ) then
                bindkey "^W" backward-delete-word 
 ・オートインデントありで [Enter] を押した場合

    if ( $?tcsh ) then
        bindkey "^W" backward-delete-word
          ← 前の行の頭にある空白が引き継がれた
 ・オートインデントなしで [Enter] を押した場合

    if ( $?tcsh ) then
        bindkey "^W" backward-delete-word
  ← 設定しない場合は、こうなる
 …オートインデントありの方が、なにげに役立ちそうですよね(^^)

02行目:set ruler
 カーソル位置を画面に表示します

03行目:set showmode
 vi のモードを画面に表示します

04行目:set verbose
 些細なエラーでも、いちいち画面に表示するようにします


 vi を使って、この .exrc を作ってもいいのですが、ここではヒアテキストというシェルの機能を使って、.exrc を作ってみましょう。
 《 ホームディレクトリに移動 》
$ cd[Enter]
 《 .exrc が存在しないことを確認 》
$ ll[Enter] ←「ls -lA」を実行してもOK
-rw-r--r--  1 violet  violet   758 Nov 18 20:00 .cshrc
-rw-------  1 violet  violet  3992 Nov 18 20:00 .history
-rw-r--r--  1 violet  violet   258 Nov 18 20:00 .login
-rw-r--r--  1 violet  violet   167 Nov 18 20:00 .login_conf
-rw-------  1 violet  violet   379 Nov 18 20:00 .mail_aliases
-rw-r--r--  1 violet  violet   339 Nov 18 20:00 .mailrc
-rw-r--r--  1 violet  violet   773 Nov 18 20:00 .profile
-rw-------  1 violet  violet   284 Nov 18 20:00 .rhosts
-rw-r--r--  1 violet  violet   980 Nov 18 20:00 .shrc
-rw-r--r--  1 violet  violet  1085 Nov 18 20:00 .tcshrc
 《 ヒアテキストを使って、.exrc を作る 》
$ cat << _EOT_ > .exrc[Enter] ← 終端文字に「_EOT_」を指定して、ヒアテキスト開始
? set autoindent[Enter]
? set ruler[Enter]
? set showmode[Enter]
? set verbose[Enter]
? _EOT_[Enter] ← 終端文字「_EOT_」と完全一致したので、読み込み終わり
 《 .exrc の中身を確認 》
$ cat .exrc[Enter]
set autoindent
set ruler
set showmode
set verbose
$  
 ヒアテキストというのは、途中に改行を含んだ文字列を、一度にプログラムに渡すための機能です。
 具体的には「<<」の直後に置かれた終端文字(上の例では「_EOT_」)に完全一致する行が現れるまで、行を次々と読み込み、最後に指定されたプログラム(「cat」)へ、まとめてリダイレクトで渡します。

 上の例では、cat の出力先をさらにファイル(.exrc)にリダイレクトすることで、.exrc ファイルを作っています。


■ vi の操作を勉強する前に…

vi を使う前に、最低限、知っておいて欲しいこと(その1)

 vi には、大きく分けて、

 (1) コマンドモード
  文字入力以外の、カーソル移動、編集機能、検索機能が使えるモード。
  起動直後の vi は、このモードになっています

 (2) 文字入力モード
  文字を入力するためのモード。
  コマンドモードに戻るには、[Esc] キーを押します

 (3) コロンモード
  ファイルの操作など、やや特殊な機能を実行するためのモード。
  画面の一番下に、入力した文字がそのまま表示されるのが特徴

 という、3つのモードがあります。 このうち、基本となるのは「コマンドモード」です。

┌──────────────────────┐
│      起動:vi ファイル名       │
└──────────────────────┘
            ↓
┌────┐ i,A,o┌────┐ :  ┌────┐
│文字入力│←──│コマンド│──→│ コロン │
│ モード │──→│ モード │←──│ モード │
└────┘[Esc] └────┘   └────┘
                     ↓q
┌──────────────────────┐
│          終了          │
└──────────────────────┘
vi エディタのモード間の関係

vi を使う前に、最低限、知っておいて欲しいこと(その2)

 コマンドモードでの操作は、vi に対し英数字を入力することによって行います。

 言い換えると、[A] というキーを押すことによって vi が何かをするのではなく、「a」(あるいは「A」)という文字を入力する(送る)ことによって、vi がそれに応じた動作を行います。
 …こういう仕組みなので、vi のコマンドは大文字、小文字の区別をするので、注意してください。

 最近のエディタに慣れた人にとっては、思いも付かないような操作方法だと思うので、一応、先に書いておきます(^^;

操作の起点となる画面について

 以下の説明では、特に断りのない限り、以下の画面に対して操作を行った結果を載せます。
 なお、カーソルのある行だけしか変わらない編集コマンドの場合には、カーソル行のみを載せています。

Sylvia wagt quick den Jux bei Pforzheim.
The quick brown fox jumps over the lazy dog.
Pa's wijze lynx bezag vroom het fikse aquaduct.

                 2,13                 *Command
操作の起点となる画面

 画面右下が vi のモード表示(この画面では、「Command」= コマンドモードになっています)、画面下の中央がカーソル位置の表示(現在、カーソルは2行目の13文字目=「brown」の「o」のところにあります)です。


■ vi の基本操作

 では、お待ちかね、FreeBSD 付属の vi を使って、vi の基本操作を説明します。
(ほかの vi を使った場合、画面表示などが多少違う場合もありますが、基本的な操作は同じです(^^;)。

 vi のコマンドは、操作を表す英単語に由来しているものが多いので、英単語と関連付けると覚えやすいかもしれません。

 とりあえず、これだけ知っていれば、vi を使った一通りのファイル編集は、不自由なくできるようになります(^^)

vi の起動

 ファイル名を引数にして、vi を起動します。
$ vi ファイル名[Enter]
 すでに存在するファイルを指定した場合は、そのファイルが読み込まれ、存在しないファイルを指定した場合には、新しいファイルが開かれます。

ファイルの保存と vi の終了

 コマンドモードで、キーボードから次のように文字を入力すると、それに応じた vi の機能が実行されます。

 :w[Enter] 
(write)
ファイルを上書き保存
 :q[Enter] 
(quite)
 vi の終了

 この2つの合わせワザとして、次の操作もよく使われます。

 :wq[Enter] ファイルを保存して vi を終了

 これを画面の例で示すと、

wq-1 キーボードから「:wq」を入力
Sylvia wagt quick den Jux bei Pforzheim.
The quick brown fox jumps over the lazy dog.
Pa's wijze lynx bezag vroom het fikse aquaduct.

:wq
 (画面の最下行に「:wq」が表示される)

wq-2 [Enter] を押す
a.txt: 3 lines, 134 characters.
$  
 (vi が終了し、コマンドプロンプトに戻る)

 また、保存と終了のバリエーションとして、これらも覚えておくとよいでしょう。

 :w![Enter] 読み込み専用ファイルへの強制書き込み
 :q![Enter] ファイルを保存せずに vi を終了

カーソル移動

 まずは、基本的なカーソル移動から。

  h  カーソルを左に移動
  j  カーソルを下に移動
  k  カーソルを上に移動
  l  カーソルを右に移動

 最近の vi では、カーソルキー[PgUp][PgDn] キーが使えることが多いので、このカーソル移動法を知らない vi 使いも存在します(^^;;;

 もっと大きくカーソルを移動させたいときは、

nG
  (Go)  
ファイルのn 行目に移動
(行ジャンプ)

 を使います。

 例えば、「1G」でファイルの最初の行に、「50G」でファイルの50行目にカーソルが移動します。
 また、数字を省略して単に「G」とすると、ファイルの最終行に移動します。

 そのほかにも、あとで出てくる検索機能を使って、カーソルを移動することもできます。

文字入力モード

 コマンドモードから文字入力モードに移行するためには、

i
 (insert
カーソル位置から文字を入力
A
(Append)
行末の文字の右に文字を入力

 を使います。コマンドモードに戻るには、[Esc] キーを押します。

 画面の例を示すと、

i-1 キーボードから「i」を入力
The quick brown fox jumps over the lazy dog.

                 2,13                 *Insert
 (画面右下のモード表示が「Insert」に変わる)

i-2 続けてキーボードから「123」を入力
The quick br123own fox jumps over the lazy dog.

                 2,16                 *Insert
 (キーボードから、文字が入力できる)

i-3 [Esc] でコマンドモードに戻る
The quick br123own fox jumps over the lazy dog.

                 2,16                 *Command
 (画面右下のモード表示が「Command」に戻る)

A-1 キーボードから「A」を入力
The quick brown fox jumps over the lazy dog. 

                 2,45                 *Append
 (画面右下のモード表示が「Append」に変わる)

A-2 続けてキーボードから「123」を入力
The quick brown fox jumps over the lazy dog.123 

                 2,48                 *Append
 (キーボードから、文字が入力できる)

A-3 [Esc] でコマンドモードに戻る
The quick brown fox jumps over the lazy dog.123

                 2,47                 *Command
 (カーソルが1文字分 左に戻り、画面右下のモード表示が
 「Command」に戻る)

 また、行の途中に文字を入力するのではなく、新しい行を作ってそこに文字を入力したい場合には、

o
 (open
現在カーソルのある行の後ろに、
新しい行を追加
O 現在カーソルのある行の前に、
新しい行を追加

 を使います。コマンドモードに戻るには、やはり [Esc] キーを押します。

o-1 キーボードから「o」を入力
Sylvia wagt quick den Jux bei Pforzheim.
The quick brown fox jumps over the lazy dog.
 
Pa's wijze lynx bezag vroom het fikse aquaduct.

                 3,1                  *Insert
 (カーソル行の下に、新しい行が挿入される)

O-1 キーボードから「O」を入力
Sylvia wagt quick den Jux bei Pforzheim.
 
The quick brown fox jumps over the lazy dog.
Pa's wijze lynx bezag vroom het fikse aquaduct.

                 2,1                  *Insert
 (カーソル行の上に、新しい行が挿入される)

文字編集

 文字入力以外の、文字編集コマンドです。

x
(?)
カーソル位置の文字を削除
(=[Del]
X カーソルの左の文字を削除
(=[BS]
r カーソル位置の文字を書き換え
(1文字上書き)
R
 (Replace
文字を上書き(上書きモード)

 それぞれ、例を示します。

x-1 キーボードから「x」を入力
The quick brwn fox jumps over the lazy dog.

                 2,13                 *Command
 (カーソルが乗っていた文字「o」が削除された)

X-1 キーボードから「X」を入力
The quick bown fox jumps over the lazy dog.

                 2,12                 *Command
 (カーソルの左にあった文字「r」が削除された)

r-1 キーボードから「r」を入力
The quick brown fox jumps over the lazy dog.

                 2,13                 *Replace
 (画面右下のモード表示が「Replace」に変わる)

r-2 続けてキーボードから「1」を入力
The quick br1wn fox jumps over the lazy dog.

                 2,13                 *Command
 (1文字入力すると、「Command」モードに戻る)

R-1 キーボードから「R」を入力
The quick brown fox jumps over the lazy dog.

                 2,13                 *Replace
 (画面右下のモード表示が「Replace」に変わる)

R-2 続けてキーボードから「123456」を入力
The quick br123456x jumps over the lazy dog.

                 2,19                 *Replace
 (キーボードから、文字が上書きで入力できる)

R-3 [Esc] でコマンドモードに戻る
The quick br123456x jumps over the lazy dog.

                 2,19                 *Command
 (画面右下のモード表示が「Command」に戻る)

行編集

 続いて、行単位の編集コマンドです。

  dd  
(delete)
カーソル行をバッファにコピーして削除
  yy  
(yank)
カーソル行をバッファにコピー
  p  
(paste)
バッファの内容を、現在カーソルのある行の
後ろに貼り付け
  P  
バッファの内容を、現在カーソルのある行の
前に貼り付け

 バッファとは、Windows でいう、クリップボードみたいなもの(ただし、vi 専用(^^;)です。

dd-1 キーボードから「dd」を入力
Sylvia wagt quick den Jux bei Pforzheim.
Pa's wijze lynx bezag vroom het fikse aquaduct.

                 2,1                  *Command
 メッセージなどは特に表示されませんが、削除された
 「The quick brown fox jumps over the lazy dog.
 は、バッファに保存されています。

yy-1 キーボードから「yy」を入力
Sylvia wagt quick den Jux bei Pforzheim.
The quick brown fox jumps over the lazy dog.
Pa's wijze lynx bezag vroom het fikse aquaduct.

                 2,13                 *Command
 メッセージなどは特に表示されませんが、
 「The quick brown fox jumps over the lazy dog.
 が、バッファに保存されます。


 次に、貼り付けの効果をみるため、「New job: fix Mr. Gluck's hazy TV, PDQ!」と言う行が、バッファに保存されているとします。

p-1 キーボードから「p」を入力
Sylvia wagt quick den Jux bei Pforzheim.
The quick brown fox jumps over the lazy dog.
New job: fix Mr. Gluck's hazy TV, PDQ!
Pa's wijze lynx bezag vroom het fikse aquaduct.

                 3,1                  *Command
 (カーソル行の下に、バッファの内容が挿入される)

P-1 キーボードから「P」を入力
Sylvia wagt quick den Jux bei Pforzheim.
New job: fix Mr. Gluck's hazy TV, PDQ!
The quick brown fox jumps over the lazy dog.
Pa's wijze lynx bezag vroom het fikse aquaduct.

                 2,1                  *Command
 (カーソル行の上に、バッファの内容が挿入される)

 また、上のものと少し系統が違いますが、知らないと迷う(^^;行の連結です。

J
 (Join
カーソルのある行と、次の行をつなげて
1行にする(行の連結)

J-1 キーボードから「J」を入力
Sylvia wagt quick den Jux bei Pforzheim.
The quick brown fox jumps over the lazy dog.  Pa's wijze lynx bezag vroom het fikse aquaduct.

                 2,45                 *Command
 (カーソル行と下の行がつながって1行になった)

アンドゥ、繰り返し

 vi にも、ちゃんと、やり直し繰り返しのコマンドがあります(^^)

u
 (undo
ファイルに対し、最後に行った編集操作を
取り消す(アンドゥ)
U 現在のカーソル行に対する編集操作を
取り消す(行の回復)
.
(?)
直前に行った操作を繰り返す
(繰り返し)

 アンドゥできる回数(編集を過去にさかのぼれる回数)は、vi の実装により異なりますが、行の回復は(別の場所に待避しておいた「もとの行」を書き戻すだけなので)複数の編集操作をいちどにキャンセルすることができます。

 また、繰り返しコマンドは、2回以上キーを押すコマンド(例えば、行削除の「dd」など)を繰り返し実行するときに便利です(^^)

検索

 …個人的に、vi で一番気に入っている機能だったりします。
 こんなに検索がやりやすい(手間がかからない)エディタは、なかなかないですね~(^-^)

 /str[Enter] ファイルの先頭から最後に向かって
strを検索(順方向検索)
 ?str[Enter] ファイルの最後から先頭に向かって
strを検索(逆方向検索)
n
(next)
一番最後に設定された検索文字を
使って、検索を再実行
N 検索を、方向を逆にして再実行

/-1 キーボードから「/qu」を入力
Sylvia wagt quick den Jux bei Pforzheim.
The quick brown fox jumps over the lazy dog.
Pa's wijze lynx bezag vroom het fikse aquaduct.

/qu
 (画面の最下行に「/qu」が表示される)

/-2 [Enter] を押す
Sylvia wagt quick den Jux bei Pforzheim.
The quick brown fox jumps over the lazy dog.
Pa's wijze lynx bezag vroom het fikse aquaduct.

	                 3,40                 *Command
 (検索が実行され、「qu」のある位置に、カーソルが移動する)

/-3 キーボードから「n」を入力
Sylvia wagt quick den Jux bei Pforzheim.
The quick brown fox jumps over the lazy dog.
Pa's wijze lynx bezag vroom het fikse aquaduct.

Search wrapped
 (次の「qu」がある位置に、カーソルが移動する。
 最下行の「Search wrapped」は、ファイルの先頭 ⇔ 最後を
 またいで検索が実行されました、という意味)

/-4 キーボードから「n」を入力
Sylvia wagt quick den Jux bei Pforzheim.
The quick brown fox jumps over the lazy dog.
Pa's wijze lynx bezag vroom het fikse aquaduct.

                 2,5                  *Command
 (次の「qu」がある位置に、カーソルが移動する)

/-5 キーボードから「N」を入力
Sylvia wagt quick den Jux bei Pforzheim.
The quick brown fox jumps over the lazy dog.
Pa's wijze lynx bezag vroom het fikse aquaduct.

                 1,13                 *Command
 (今度は、逆方向に検索が実行される)

この続きは…

 また次回に(^^)/

| | コメント (31) | トラックバック (0)

シングルユーザモードの忘備録

 やっと、試験が終わりました~。

 最後の試験が終わった日の晩、熱を出して寝込みましたが、一晩熟睡したら回復しました。
 でも、勉強して覚えたことも、このとき一緒に忘れてしまったかも…(^^;;;

 …ということで、リハビリも兼ねて、今回は軽めのお話です。

 あ、ちなみに、私の所では、諸般の事情によりシングルユーザモードを試すことができないので、今回の話は2割くらい間違ってる前提で読んで下さい(^-^;A  *~●))) \(-_-#)

 …さらに蛇足で、「忘備録」は、「備忘録」と書くのが正しいそうです(^-^)


■ シングルユーザモードとは

 シングルユーザモード (single user mode) とは、メンテナンス用として準備されている FreeBSD の動作状態の1つで、FreeBSD 自体が動作するのに必要な、最小限の機能だけで動いている状態をいいます。

 イメージ的には、Windows でいうセーフモードみたいな感じのもの、と思ってもらえばOKです。

 このシングルユーザモードでは、

ネットワークが使えない
 (コンソールからしかログインできない)
ホスト特有の設定は反映されず、デーモンも起動しない
 (/etc 以下のコマンド群、/etc/rc* が実行されないから)
ログインできるのは一人きり(root だけ)
 (これが「シングルユーザモード」の名前の由来です)

 という制限があります。

 ちなみに、FreeBSD の通常の動作モードは、マルチユーザモードと呼ばれます。
 一方、Linux では、「ランレベル」という名前の動作モードが、たくさん(^^;あります。


■ シングルユーザモードって、いつ使うの?

 一番有名なのは、自分が管理している FreeBSD マシンの、root のパスワードを忘れたとき、ですね(^^;;;
 FreeBSD をインストールした、そのままの状態なら、シングルユーザモードを使って、パスワードなしで root としてログインすることができます。

 それ以外の使い道としては、間違った設定が原因で、FreeBSD が正常に動かなくなってしまった場合に、シングルユーザモードでクリーンな FreeBSD を立ち上げて、設定ファイルを書き直す…といったこともできます。


■ シングルユーザモードへの入り方

 FreeBSD のシングルモードに入る方法としては、
・マルチユーザモードから移行する
・PC の起動時にシングルモードで立ち上げる
 の、大きく2つの方法がありますが、FreeBSD の動作が不審な場合などには、PC の起動時にシングルモードで立ち上げることが多いと思います。

マルチユーザモードから移行する方法では、sysctl の設定が残ったままになるので、それらが悪さをすることがあります。)


シングルユーザモードの操作(概略)

 シングルユーザモードを使う目的と状況(^^;によって、操作は変わりますが、以下にシングルユーザモードでの、代表的な操作手順を示します。

(1) シングルユーザモードに入る

 A. マルチユーザモードから移行する場合

 なんとなく、裏ワザっぽい雰囲気が漂ってますが(^^;、FreeBSD が普通にマルチユーザモードで動いているときに、shutdown コマンドをオプションなしで実行すると、動いていたプロセスが次々に停止して、最後にシングルユーザモードになります。
 《 shutdown を引数(-p)なしで実行 》
# shutdown now[Enter]
 これ以外に、「kill -TERM 1」を実行する方法もあります(やっていることは、上と同じ(^^;)。

 B. PC の起動時にシングルモードで立ち上げる場合

 FreeBSD をシングルユーザモードで起動したいときは、まず、FreeBSD の起動のカウントダウン画面で、「4. Boot FreeBSD in single user mode」を選びます。
(10秒以内に、キーボードの [4]キー を押せばOKです。)
┌───────────────────┬─
│                                      │
│        Welcome to FreeBSD!          │
│                                      │
│ 1. Boot FreeBSD [Default]            │
│ 2. Boot FreeBSD with ACPI disabled   │
│ 3. Boot FreeBSD in Safe Mode         │
│ 4. Boot FreeBSD in single user mode  ← これ
│ 5. Boot FreeBSD with verbose logging │
│ 6. Espace to loader prompt           │
│ 7. Reboot                            │
│                                      │
│                                      │
│ Select option, [Enter] for default   │
│ or [Space] to pause timer 10         │
└───────────────────┴─
     《 起動のカウントダウン画面 》
 次に、使いたいシェルを聞かれますが、単に [Enter] キーを押します。
 《 以下のメッセージが表示されたら、[Enter] を押す 》
Enter full pathname of shell or RETURN for /bin/sh:[Enter]
 これで、シングルユーザモードに入りました(^^)

(2) fsck を実行する

 FreeBSD の動きがおかしくなった等の理由で、HDD のアクセス中に、無理矢理にPCをリセットしてしまった場合などは、fsck を実行すると、HDD 上のデータの不整合を(できる範囲で)直してくれます。

 でも、きちんと shutdown あるいは reboot した場合には、ただ時間が掛かるだけ(^^;なので、fsck は実行不要です。
 《 fsck で HDD をチェック 》
# fsck -p[Enter]
(3) ファイルシステムをマウントする(その1)

 シングルユーザモードで起動した直後は、読み出し専用でルートパーティションマウントされただけの状態になっています。

 ルートパーティションに置かれたファイル、例えば /etc ディレクトリ内のファイルを修正したい場合には、このままだと困るので、ルートパーティションへの書き込みができるように変更します。
 《 ルートパーティションを読み書き両用へ変更 》
# mount -u /[Enter]
 …私は、今までず~っと、「mount -o rw /」を実行するのだと思ってましたが、FreeBSD の mount コマンドのマニュアルを見ると、「rw」というオプションは見あたらないですね…(^^;;

(4) ファイルシステムをマウントする(その2)

 ルートパーティションには、まともなエディタがないので、vi が使えるように、必要なパーティションを手動でマウントします。
ed というラインエディタならありますが、vi 使いを自任する私でも、ed を使うのはつらいです…)

 ただし、ルートファイルシステム上にあるコマンド(/bin/sbin 内のコマンド)で用が足りる場合には、この手順を省略して構いません(^-^)

 A. /etc/fstab が使える場合

 これが一番手間の掛からないケースです。
 mount コマンドの「-a」オプションを使えば、mount コマンドが /etc/fstab を参照して、自動でマウント処理を実行してくれます。
 《 必要なパーティションを自動でマウントする 》
# mount -a -t ufs[Enter]
 B. /etc/fstab の設定を間違った場合

 設定ファイル /etc/fstab を書き間違った場合には、前述の「mount -a」が使えないので、代わりにファイルシステムを1つづつ手動でマウントします。
 とりあえず、/usr/tmp/var の3つを追加でマウントしておけば、間違いありません。

/etc/fstab が参照できない場合には難易度が高いですが、最低でも /usr、できれば、それに加えて /tmp をマウントします。)
 《 /etc/fstab の内容を表示 》
# cat /etc/fstab[Enter]
# Device     Mountpoint  FStype  Options    Dump  Pass#
/dev/ad4s1b  none        swap    sw         0     0
/dev/ad4s1a  /           ufs     rw         1     1
/dev/ad4s1e  /tmp        ufs     rw         2     2
/dev/ad4s1f  /usr        ufs     rw         2     2
/dev/ad4s1d  /var        ufs     rw         2     2
/dev/cd0     /cdrom      cd9660  ro,noauto  0     0
 《 /usr を読み出し専用でマウント 》
# mount -r /dev/ad4s1f /usr[Enter]
 《 /tmp を読み書き両用でマウント 》
# mount -w /dev/ad4s1e /tmp[Enter]
 《 /var を読み書き両用でマウント 》
# mount -w /dev/ad4s1d[Enter]
 《 マウント状態を確認 》
# mount[Enter]
/dev/ad4s1a on / (ufs, local)
devfs on /dev (devfs, local)
/dev/ad4s1f on /usr (ufs, local, read-only)
/dev/ad4s1e on /tmp (ufs, local)
/dev/ad4s1d on /var (ufs, local)
 あ、/usr を読み出し専用にするか、読み書き両用にするかは、適当に判断してください(^^;;。

(5) 設定を修正する

root のパスワードを忘れた場合 には、
# passwd[Enter]
 で、root の仮のパスワードを設定します。

 シングルユーザモードで注意しなければいけないのは、キーボードの設定が「英語」になっているので、ここで設定するパスワードに使う文字は、アルファベットと数字だけ(記号は使わない!)にしておきます。

 なお、正式なパスワードは、マルチユーザモードで FreeBSD を立ち上げたあとで、改めて設定します。

設定ファイルを修正する場合 には、
# vi ファイル名[Enter]
 で、設定ファイルを修正します。

 なお、シングルユーザモードでは、日本語キーボードに書かれた「記号」と、実際に入力される「記号」が違うので、注意してください。
 例えば、「:」を入力したい場合のキー操作は、[Shift][;] になります。

(6) 再起動

 修正が終わったら、FreeBSD を再起動します。
# reboot[Enter]
 問題がなければ、通常のマルチユーザモードで FreeBSD が立ち上がります(^^)

| | コメント (51) | トラックバック (0)

« 2009年9月 | トップページ | 2009年12月 »