LPIC Level 2 を取りました
先日 LPI 201試験 に無事合格したことにより、LPIC Level 2 となりました。LPIC は相当に人気があるようで、生徒さんもたくさんいらっしゃいます。転職とかにも有利なんでしょうかね。
依頼があるようならば Level 3 も取ろうかと思いますが、真面目に勉強しないと受からない気もします。
| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
先日 LPI 201試験 に無事合格したことにより、LPIC Level 2 となりました。LPIC は相当に人気があるようで、生徒さんもたくさんいらっしゃいます。転職とかにも有利なんでしょうかね。
依頼があるようならば Level 3 も取ろうかと思いますが、真面目に勉強しないと受からない気もします。
データを更新するには update を使います。下記の例では update でテーブル lpi を指定し、set で price の値を800に更新しています。where を使わないと、すべての price が800になってしまうので注意。select で結果を確認しました。
sqlite> update lpi set price=800 where name = 'apple';
sqlite> select name,price from lpi where name = 'apple';
apple|800
apple|800
join はちょっと分かりづらいです。このコマンドを使うと異なるテーブルのデータを連結させることが出来ますが、分かりやすくするために2つのテーブル、first と second を追加します。両方のテーブルに共通する column id を作っています。
sqlite> create table first(id int, name varchar(10));
sqlite> insert into first values(1,'apple');
sqlite> insert into first values(2,'bnana');
sqlite> insert into first values(3,'lemon');
sqlite> create table second(id int, price int);
sqlite> insert into second values(1,150);
sqlite> insert into second values(1,130);
sqlite> insert into second values(2,90);
sqlite> insert into second values(2,95);
sqlite> insert into second values(3,230);
sqlite> select * from first;
1|apple
2|bnana
3|lemon
sqlite> select * from second;
1|150
1|130
2|90
2|95
3|230
ここで join を使ってみます。select でテーブル first を指定し left を指定しています。この left により左側(最初に指定した first)が優先されて表示されます。join に続き2つ目のテーブル second を指定しています。最後に on に続いてデータを共通化させる id を指定しています。
sqlite> select * from first left join second on first.id = second.id;
1|apple|1|150
1|apple|1|130
2|bnana|2|90
2|bnana|2|95
3|lemon|3|230
見づらいので少し修正してみました。
sqlite> select name,price from first
...> left join second
...> on first.id = second.id;
apple|150
apple|130
bnana|90
bnana|95
lemon|230
最後に削除です。データを行単位で削除するには delete コマンドを使います。where で指定をしないと、すべての行が削除されてしまうので注意が必要。
sqlite> delete from lpi where number = 1;
テーブルを削除するには drop コマンドを使います。下記の例ではテーブル lpi を削除しました。SQLite であれば .schema コマンドで結果を確認することが可能です。
sqlite> drop table lpi;
このあたりがさらさら出来れば、LPI 102 の試験は問題ないでしょう…。
前回で SQLite を起動しましたが、まだ何のデータもありませんので作っていきます。
| name | price | number |
|---|---|---|
| apple | 200 | 3 |
| orange | 300 | 5 |
| banana | 200 | 2 |
| apple | 200 | 4 |
| orange | 300 | 2 |
| lemon | 250 | 3 |
| banana | 200 | 4 |
こんな感じのデータにしてみましょう。ちなみに表全体を table、各列を column、各行を record と言います。テーブルを作成するには create コマンドを使いますが、102の試験ではテーブルの作成は出ないようです。ここでは table を lpi とし name にはテキスト、price と number は数字を利用するという形で指定しています。
sqlite> create table lpi(name varchar(10), price smallint, number smallint);
ちなみに最後に";"(セミコロン)が付いていますが、これはコマンドの終了を表しています。言い換えると、このセミコロンがないとコマンドは終了せず続きのコマンドを待ちつづけます。
sqlite> create table lpi(name varchar(10), price smallint, number smallint)
...> ;
プロンプトが ...> となっているのが、引き続きコマンドを待っている状態を表しています。単純に最後にセミコロンを入れ忘れたときは、上記の様にセミコロンのみを入力すれば大丈夫。
次にこのテーブルに実際のデータを追加します。insert というコマンドを使いますが、これ以降はテストの対象コマンドです。
sqlite> insert into lpi values('apple',200,3);
insert コマンドの後、into に続きテーブル名(ここでは lpi)を指定します。その後 values に続き () の中にそれぞれのデータを "," で区切って代入します。apple の様な文字列は ' ' で括る必要があります。
sqlite> insert into lpi values('orange',300,5);
sqlite> insert into lpi values('lemon',250,1);
sqlite> insert into lpi values('banana',200,2);
sqlite> insert into lpi values('apple',200,4);
sqlite> insert into lpi values('orange',300,2);
sqlite> insert into lpi values('lemon',250,3);
sqlite> insert into lpi values('banana',200,4);
このようにしていけばデータが必要な分だけ入力できます。では次に入力したデータを確認してみましょう、select というコマンドを使いますが非常に重要です。
sqlite> select * from lpi;
apple|200|3
orange|300|5
lemon|250|1
banana|200|2
apple|200|4
orange|300|2
lemon|250|3
banana|200|4
上記コマンドでデータの一覧が表示されました。select コマンドの後の "*" は表示する column の指定で、"*" とするとすべて(name, price, number)を意味します。from の後に table を指定します。下記の様に表示する column を指定することもできます。
sqlite> select name,number from lpi;
データを表示する際に並べ替えるには order by を利用します。
sqlite> select * from lpi order by name;
apple|200|3
apple|200|4
banana|200|2
banana|200|4
lemon|250|1
lemon|250|3
orange|300|5
orange|300|2
by の後を name としたことで apple, bnana, lemon, orange の順に並んだことが分かります。もちろん price や number を指定することも出来ます。
同じ column の値をまとめるには group by を使います。Linux コマンドでの uniq のようなものです。下記の例では column の name のみを指定することにより重複しない形で name だけを表示しています。order by を続けて指定することも可能です。
sqlite> select name from lpi group by name;
apple
banana
lemon
orange
where を使うとデータの抽出が可能です。下記の例では name が apple のデータを指定しています。文字列を指定するときは 'apple' の様に括らないとエラーになるので注意。
sqlite> select * from lpi where name = 'apple';
apple|200|3
apple|200|4
下記の例では number が3より大きいものを指定していますが、併せて name と number のみを表示の対象とし、order by で並べ替えています。長くなるので3行に分けて実行しました。
sqlite> select name,number from lpi
...> where number > 3
...> order by name;
apple|4
banana|4
orange|5
LPIC レベル1 の内容がこの4月より新しくなりました。詳細はここです。
目立つ点としては、102試験で SQL データ管理が追加されたこと。SQL はデータベースを操作するための言語で、データベースプログラムとしては MySQL や PostgreSQL がよく使われています。
さて出題範囲の詳細を見ると、SQL に関してはこのようになっています。
105.3 SQLデータ管理
重要度: 2
説明
データベースを照会し、基本的なSQLコマンドを使用してデータを操作する。これには、2つのテーブルやサブセレクトの結合を伴うクエリーの実行も含まれる。
主要な知識範囲
基本的なSQLコマンドの使用
基本的なデータ操作を実行する
重要なファイル、用語、ユーティリティ
insert
update
select
delete
from
where
group by
order by
join
普段データベースを触っている人や、Oracle Master を持っている人には簡単な内容でしょうが、SQL なんて知らないとか触ったことのない人にとってはちょっと敷居が高いですね。ということで試験対策としての勉強方法を考えてみました。もちろん Linux を使います。
MySQL や PostgreSQL をわざわざ用意しなくても LPIC の勉強用途であれば SQLite が便利でしょう。ちなみに Windows 版もあります。
自分の Linux にインストールされているかは下記の様にして確認します(Red Hat 系の場合)。
$ rpm -q sqlite
sqlite-3.3.6-2
入っていない場合は、yum や apt-get コマンドを使い、インストールしましょう。
インストールが終わったら起動します。sqlite3 コマンドに続き利用(作成)するファイル名を指定します、今回は lpi.db としました。
$ sqlite3 lpi.db
SQLite version 3.3.6
Enter ".help" for instructions
sqlite>
sqlite> という専用のプロンプトに変わりました。.htlp (頭に"."あり)でヘルプ、.quit (頭に"."あり)で終了します。
1週間ほど前に LPIC レベル1 の受験(101と102両方)をして、無事合格しました。今までこの資格の必要性を感じませんでしたが、今度から LPIC 対策のクラスを受け持つことなり、取ったのです。
レベル1だから簡単かと思いましたが、結構難しいです。10年近く Linux を使っていますが、全然知らないこともあったり…。日頃 Linux を使っている人でもテスト対策をしないと落ちると聞いていましたが、分かる気もします。とりあえず対策問題集をこなせば、合格は難しくないでしょう。
ちなみに問題の原文は English というボタンを押すと見ることが出来ますので、翻訳が気になる人にも大丈夫。
予想通り、私は X Window System と印刷関連で点をかなり落としました。普段使わないものは全然分かりません。いずれ授業を頼まれたら、レベル2も受けてみます。
You could also use lsof command to show which process using the specific port. The command accepts multiple port numbers with i option.
# lsof -i :445
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
smbd 2757 root 18u IPv4 5867 TCP *:microsoft-ds (LISTEN)
# lsof -i :445,901
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
xinetd 2655 root 5u IPv4 5630 TCP *:swat (LISTEN)
smbd 2757 root 18u IPv4 5867 TCP *:microsoft-ds (LISTEN)
You could show which process is using the specific port with fuser command. This is an example for the port 22/tcp.
# fuser -vn tcp 22
here: 22
USER PID ACCESS COMMAND
22/tcp root 2642 f.... sshd
If you just make a file /etc/nologin, user would not log in to the Linux.
# cat /etc/nologin
--- backup in progress ---
When you delete the file, user could log in to the Linux again.
All users are listed in a file /etc/passwd.
$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
With a command awk, you could get the first field easily.
$ awk -F':' '{ print $1 }' /etc/passwd | sort
adm
apache
bin
It is not recommended that you lease from your PC without logout If you would like to logout automatically, use TMOUT.
This is an example of it. After 300 secondes, bash finish automatically.
$ cat ~/.bashrc
export TMOUT=300
If you write it in a file /etc/profile, all users will be affected.
You could give a message when users login. Make the message in a file /etc/motd (message of the day.)
# cat /etc/motd
This server will reboot within one hour.
User login.
Last login: Sat Mar 8 08:53:21 2008 from windows
This server will reboot within one hour.
$
If you mistype a password when you login, use Ctrl-u. It clears all keys those you typed, then type again.
If you would like to make an user who could not log into the system like just mail account user, use nologin instead of bash. nologin is a special command that politely refuse a login.
# grep nologin /etc/shells
/sbin/nologin
Use -s option to define the shell.
# useradd -s /sbin/nologin tomato
# su - tomato
This account is currently not available.
If you would like to change the shell of existing user, use usermod command.
# usermod -s /sbin/nologin lettuce
# su - lettuce
This account is currently not available.
This is traditional way of making user. At first, you need group (vegetable). Then you make a user (cabbage) with initial group vegetable. This time user cabbage has umask 022.
# groupadd vegetable
# useradd -g vegetable cabbage
# id cabbage
uid=509(cabbage) gid=505(vegetable) groups=505(vegetable)
# su - cabbage
$ umask
0022
$ touch hello
$ ls -l hello
-rw-r--r-- 1 cabbage vegetable 0 Feb 25 09:01 hello
You could make a user (lettuce) without initial group. This time user automatically belongs to an initial group that has users name. The user has umask 002.
# useradd lettuce
# id lettuce
uid=510(lettuce) gid=510(lettuce) groups=510(lettuce)
# su - lettuce
$ umask
0002
$ touch hello
$ ls -l hello
-rw-rw-r-- 1 lettuce lettuce 0 Feb 25 09:03 hello
If you made users, john and paul. You could make passwords automatically with the following commands. If there is no uuencode command, install it with 'yum install sharutils.'
# for user in john: paul:
> do
> echo -n $user
> head -c 6 /dev/random | uuencode -m - | sed -n '2p'
> done > /tmp/password
# cat /tmp/password
john:2S+dJ64l
paul:FwWcC2F0
chpasswd command assign passwords from the file.
# chpasswd < /tmp/password
Root user only could mount cd media.
$ mount /media/cdrom
mount: only root can mount /dev/hdc on /media/cdrom
If you add "user" option in a file /etc/fstab, user could mount it.
# vi /etc/fstab
/dev/hdb /media/cdrom auto pamconsole,exec,noauto,managed,user 0 0
$ mount /media/cdrom
$ ls /media/cdrom
isolinux squashfs.img sysroot
You could use ISO image file without CD-R media. Use mount command with loop option.
# mount -o loop -t iso9660 ./Fedora-8-Live-i686.iso /media/cdrom
# ls /media/cdrom
GPL isolinux LiveOS README
When you finish, just unmount it.
# umount /media/cdrom
シェルスクリプトを実行するとカレントシェルではなく、新たに生成される別のシェルによって実行されます。ではこれをどのように確認できるでしょうか。
まず、現在使っているシェルのPIDを表示するには"$$"を使います。
$ ps
PID TTY TIME CMD
24586 pts/0 00:00:00 bash
$ echo $$
24586
シェルスクリプトで確認するために下記のプログラムを作りました。1行目で標準シェル(sh)を指定しています。実行すると sh が実行していることが分かります。
$ cat show_me_shell.sh
#!/bin/sh
ps ax | grep `echo $$`
$ ./show_me_shell.sh
24647 pts/0 S+ 0:00 /bin/sh ./show_me_shell.sh
1行目の指定を csh に変更すると確かに、csh で実行されることが分かります。
$ cat show_me_shell.sh
#!/bin/csh
ps ax | grep `echo $$`
$ ./show_me_shell.sh
24655 pts/0 R+ 0:00 /bin/csh ./show_me_shell.sh
1行目でシェルを指定しないと sh で実行されます。下記実行例では bash が利用されていますが、これは少なくとも Red Hat 系のディストリビューションでは sh は bash へのシンボリックリンクになっているからです。
$ cat show_me_shell.sh
ps ax | grep `echo $$`
$ ./show_me_shell.sh
24672 pts/0 R+ 0:00 -bash
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Dec 22 11:31 /bin/sh -> bash
If you do not want a bell(beep) sound when using tab key. Write "set bell-style none" to a file /etc/inputrc.
# vi /etc/inputrc
# do not bell on tab-completion
set bell-style none
If you are root user, you could send message to all users who logged in with wall command.
root user
# wall "We will have a meeting tomorrow noon."
Broadcast message from root (pts/0) (Wed Feb 6 19:06:05 2008):
We will have a meeting tomorrow noon.
user
$
Broadcast message from root (pts/0) (Wed Feb 6 19:06:05 2008):
We will have a meeting tomorrow noon.
Is enter key too far? So, use ctrl-m instead. It works same as enter key. Also, ctrl-h works same as Backspace key.
There are many html files in the system. You could read them with text base web browser. There are elinks and lynx. The elinks has more functions.
You could move forward with ctrl-f, back with ctrl-b.
$ elinks /usr/share/doc/centos-release-4/RELEASE-NOTES-en.html
$ lynx /usr/share/doc/centos-release-4/RELEASE-NOTES-en.html
Many Linux distributions has file name with release in /etc.
$ ls /etc/*-release
/etc/redhat-release
If you open the file, it tells you a version of the distribution.
$ cat /etc/redhat-release
CentOS release 4.6 (Final)
uname command shows your system information.
$ uname -a
Linux myserver.example.com 2.6.9-61.EL #1 Wed May 2 13:50:59 EDT 2007 i686 i686 i386 GNU/Linux
if you use -m option, it only shows your CPU architecture.
$ uname -m
i686
最近は SMP (Symmetric Multi Processing、要するにCPUが複数ある)のマシンも購入しやすくなりました。ところで2つの CPU がある時、それぞれどの程度の負荷がかかっているかはどうやってみましょうか。普通は top でしょ、と思ってみるとこんな感じ。
top - 13:08:45 up 12 min, 3 users, load average: 2.36, 0.92, 0.39
Tasks: 226 total, 6 running, 219 sleeping, 0 stopped, 1 zombie
Cpu(s): 37.9% us, 46.8% sy, 0.0% ni, 15.3% id, 0.0% wa, 0.0% hi, 0.0% si
Mem: 2073396k total, 629456k used, 1443940k free, 22856k buffers
あれれ、Cpu(s) ってまとめて表示されちゃいますね。そんな時はそのまま 1 を押します。すると、
top - 13:07:59 up 11 min, 3 users, load average: 1.93, 0.62, 0.27
Tasks: 201 total, 4 running, 196 sleeping, 0 stopped, 1 zombie
Cpu0 : 25.6% us, 64.5% sy, 0.0% ni, 9.9% id, 0.0% wa, 0.0% hi, 0.0% si
Cpu1 : 54.2% us, 29.4% sy, 0.0% ni, 16.4% id, 0.0% wa, 0.0% hi, 0.0% si
Mem: 2073396k total, 590696k used, 1482700k free, 22336k buffers
という風に個別に表示されるようになります。ちなみにそのまま W とすると設定が ~/.toprc に保存されます。それと初期値では3秒ごとの更新ですが、毎秒にしたい場合は s1 です。
vi や vim でのオプション設定は ~/.exrc (~/.vimrc) に書きます。
$ cat ~/.exrc
set number
set tabstop=4
実は前から、この内容を一時的に無効にするためのコメント記号は何かという疑問がありました。# のような気がしますが、実際に入れるとエラーになります。// でもないし…。
そして調べたら、なんと " でした。ものすごい意外な記号なのですね。ということで一時的にオプションを解除したいときには下記のようにすればOKです。
$ cat ~/.exrc
"set number
set tabstop=4
さて UNIX/Linux では標準エディタとしての地位を占める vi ですが、取っ付き難く簡単に使えるようにはなりません。学校や会社で使っているけど、個人的にゆっくり練習したい方のための練習方法です。
利用するのは Vim で vi から派生したプログラムであり、基本的な使い方は vi と同じでさらに多機能です。UNIX だけでなく Windows でも利用可能です。まずここからインストーラをダウンロードします。
ダウンロードするファイルは gvim71.exe です。インストールは特に複雑なことは要求されないので問題ないでしょう。
さてインストール完了後、スタート -> プログラム -> Vim 7.1 -> Vim でプログラムを起動します。すると上記のようなウィンドウが開きます。ということで vi の練習はこれでOK。
さて利用するにはいくつかポイントがあります。まず UNIX で vi を使うときにはこんな感じでファイルを指定します。
$ vi apple.txt
ですが、Vim をスタートメニューから起動した場合は
$ vi
と同じ形式となります。つまり、そのまま :wq で保存しようとしても"ファイル名がありません"とエラーになるのです。よって新規ファイルを保存するときは :w apple.txt のように指定する必要があります。
次のポイントとして、このファイルはどこに保存されたのか。Vim が利用しているカレントディレクトリを確認するには :pwd を利用します。
次に既存のファイルを開くには :e を利用し :e apple.txt という形で指定します。
私が通常クラスで紹介する時に説明する、最低覚えるべき10のコマンドはこれ。手はホームポジションに固定し、カーソルキーやテンキーを使わないことが重要です。
k カーソルを上に
j カーソルを下に
l カーソルを右に
h カーソルを左に
i カーソルの前からインサートモードにする
a カーソルの後からインサートモードにする
esc コマンドモードに戻る
x 文字を削除
:wq 保存終了
:q! 強制終了
慣れてしまうとマウスを使ってカーソルを移動するより遥かに高速に、快適に作業が出来るようになります。
P.S.
ビープ音がうるさいときは :set visualbell で消すことができます。
サーバの状態を知りたい時、通常はログインして(直接なり、リモートなり)コマンドを打ちますが、コマンドを1つ打つだけのためにログインするのも面倒くさいです。こんな時に便利なのが指定のコマンドを実行して、ブラウザで表示できるCGI。さてどうすればいいのでしょうか。
最近のLinuxであれば /var/www/cgi-bin/ に今から作る cgiスクリプトファイルをおきます。
まず単純にdfコマンドの結果を表示するプログラムを作ってみましょう。
# vi sample_df.cgi
# chmod +x sample_df.cgi
# cat sample_df.cgi
#!/bin/sh
df -h
シェル上で実行すると、問題ありません。
# ./sample_df.cgi
Filesystem Size Used Avail Use% Mounted on
/dev/hda8 291M 138M 139M 50% /
/dev/hda1 97M 14M 78M 16% /boot
none 506M 0 506M 0% /dev/shm
/dev/hda2 4.9G 188M 4.4G 5% /home
/dev/hda6 485M 11M 449M 3% /tmp
/dev/hda3 3.9G 1.3G 2.4G 35% /usr
/dev/hda5 2.9G 1.7G 1.2G 60% /var
ではブラウザから実行してみます(例 http://server/cgi-bin/sample_df.cgi)。するとエラーになります。
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.
ブラウザでデータを表示させるにはブラウザに対し、データの内容はこの形式ですよと教えてあげる必要があります。これを指定しないと上記のようにうまく表示できません。今回はただのテキストですので Content-type: text/plain を指定します。CGIを下記のように修正します。
# cat sample_df.cgi
#!/bin/sh
echo "Content-type: text/plain" ←追加
echo ←追加(改行を加えるために必要)
df -h
そしてブラウザで実行すると、正しく表示されました。ということでとりあえず Content-type が必要だということが分かればブラウザで表示することは簡単です。ただこの方法は単純なテキストですので、色の指定など細かい表示設定は出来ません。
重要な点としてこのようなCGIを作り、インターネットに接続されたサーバに置くには注意が必要です。単純なファイル名(df.cgiなど)では推測されやすいため、情報の盗み読みなどに使われる可能性がありますので、自分にしか分からない複雑なファイル名にした方がいいでしょう。当然ながらパスワードが要求されるディレクトリなどに置くほうがより安全です。
飛行機での映画といえば、以前は壁にプロジェクタで映したものをみんなで見ていました。映画が終わるとトイレがどっと混んだりしましたね。
90年代に液晶テレビが普及すると、各シートにモニタが割り当てられるようになりました(エコノミーに最初に導入したのは確かヴァージン アトランティック航空)。映画が選べて便利でしたが、開始時刻は選べないので、タイミングを計って見る必要がありました。その頃はまだモニタも小さく、あまり映画は見なかった記憶があります。
最新の飛行機(ボーイング777とか)になるとフルデジタル化されたようで、映画の開始や停止も出来るようになり、大変便利になりました。ということで最近は飛行機に乗る前に何の映画を放映するか調べてから出かけたりします。
そんなある日のこと、シートベルト着用サインが消えてからシートテレビを見ようとするとどこかで見たような文字が…。何だかエラーっぽい。
そのエラーは黒バックに白文字、Linuxみたいだな~と思ったものの、このようなAVシステムはWindowsで作っているに違いないと思い込んでいました。そして隣の席にも同じメッセージが。
ボタンをあちこち押しているとメッセージが流れ出し、こんなものが登場。
eth0: autonegotiation did not complete in
おおっ!これは間違いなく、Linux。こんなところで会えるなんて(違うか)。エラーを読むと少なくともカーネルパニックではないので、周辺機器あたりのトラブルっぽい。
CAさんを呼んで見せると、ではリセットしますので15分ほどお待ちくださいとのこと。CAさんはrootでログインし、ログを見ながらさらさらトラブルを解決したのでした。何てことは当然なく、リセット(リブート?)スイッチを押したのでしょう。
トラブルがあったのは我々のところだけでなく、あちこちで頻発している模様。聞いていると、この飛行機は初フライトとのこと…。ANAの飛行機はだいたい綺麗だけど、今日はやたらピカピカしているように感じたのは間違いではなかったらしい。
初フライトに乗ることが出来たのはラッキーだけど(飛行機番号聞けば良かった)、トラブルはね~。結局AVシステムは完全復旧しなかったものの、映画はチャンネルを変えることで見られたのでまぁいいか。
ということでLinuxは幅広く使われているのですね、というお話でした。
dfコマンドを実行して定期的にパーティションの利用状況を確認するのは、管理者としてお約束です。コマンドを実行するとすべてのパーティションが表示されますが、特定のものだけを表示するには下記のようにすると便利でしょう。/varと/homeを指定した例です。
# df -h | grep '\(Filesystem\|/var\|/home\)'
Filesystem Size Used Avail Use% Mounted on
/dev/hda2 4.9G 188M 4.4G 5% /home
/dev/hda5 2.9G 1.7G 1.2G 59% /var
さて/var内部を個別に調べるにはduコマンドを利用します。
# du -sk /var/* | sort -n
4 /var/mail
8 /var/local
~略~
42724 /var/lib
765912 /var/spool
1079816 /var/cache
例えば/var/spoolの中で1MB(1,024K)以上のファイルを見つけるにはfindコマンドを利用します。
# find /var/spool/ -size +1024k
/var/spool/squid/00/AC/0000AC60
/var/spool/squid/00/8E/00008E92
~略~
-execオプションを加えてlsコマンドを利用するとファイルの詳細併せて表示できます。
# find /var/spool/ -size +1024k -exec ls -lh {} \;
-rw-r--r-- 1 squid squid 1.2M Jun 8 20:38 /var/spool/squid/00/AC/0000AC60
-rw-r--r-- 1 squid squid 1.9M Jun 4 07:18 /var/spool/squid/00/8E/00008E92
~略~
awkコマンドを併用することで、より見やすくすることも出来ます。
# find /var/spool/ -size +1024k -exec ls -lh {} \; | awk '{ print $9,$5 }' | sort
/var/spool/squid/00/15/0000151E 3.1M
/var/spool/squid/00/34/00003464 1.2M
~略~
下記は/tmpディレクトリにある2MB以上のJPEGファイルをまとめて削除する例です。実行時には重要なファイルをうっかり消さないように注意が必要です。
# find /tmp -size +2048k -name *.jpg -exec rm -i {} \;
rm: remove regular file `/tmp/apple.jpg'?
さて以下のようなファイルがあったとします。これらにすべて拡張子 .txt を付けるには下記のようにします。for で繰り返し echo と sed の組み合わせで新しいファイル名を作っているのがポイント。` はシングルクォートではなくバッククォート(shift - @)なので注意。
$ ls
apple banana lemon
$ for file in *
> do
> mv -i $file `echo $file | sed 's/$/.txt/'`
> done
$ ls
apple.txt banana.txt lemon.txt
ちなみに上記コマンドをヒストリで確認すると、下記のように表示されることが分かります。
$ for file in *; do mv -i $file `echo $file | sed 's/$/.txt/'`; done
拡張子 .htm を.html を変更するにはこうします。
$ ls
apple.htm banana.htm lemon.htm
$ for file in *; do mv -i $file `echo $file | sed 's/.htm/.html/'`; done
$ ls
apple.html banana.html lemon.html
拡張子 .htm を削除するにはこうします。
$ ls
apple.htm banana.htm lemon.htm
$ for file in *; do mv -i $file `echo $file | sed 's/.htm//'`; done
$ ls
apple banana lemon
先頭に文字を加えたいときはこうします。
$ ls
apple banana lemon
$ for file in *; do mv -i $file `echo $file | sed 's/^/20070610-/'`; done
$ ls
20070610-apple 20070610-banana 20070610-lemon
2007を2008に変更するにはこうします。
$ ls
20070610-apple 20070610-banana 20070610-lemon
$ for file in *; do mv -i $file `echo $file | sed 's/2007/2008/'`; done
$ ls
20080610-apple 20080610-banana 20080610-lemon
Linuxのセミナーを始めたばかりの頃、プログラマーの人が生徒でやってきました。Webサーバの設定にあたり、ここからここまでまとめてコメントを付けてください、外してくださいと言ったら、彼は一瞬でそれを実行したのです。きっとどうにかすれば出来るだろうとは思っていたものの、具体的な方法はまだ知らなかった私はものすごく驚いたのでした…。
このように行をまたいでまとめて処理することを矩形処理、などと言います。では実際にやってみましょう。
このようなテキストがあります。まずすべての行を有効にするために行頭の # を取る例です。
#<VirtualHost *:80>
# ServerAdmin webmaster@dummy-host.example.com
# DocumentRoot /www/docs/dummy-host.example.com
# ServerName dummy-host.example.com
# ErrorLog logs/dummy-host.example.com-error_log
# CustomLog logs/dummy-host.example.com-access_log common
#</VirtualHost>
まずカーソルを記の様に開始行におきます。
ここで Ctrl-v とします。そのまま j で下方向に進むと下記のようにブロックで選択されます。
この状態で d を押すと # がまとめて削除できます。

次に # を付けてみます。先ほどと同じように Ctrl-v で下記のように選択します。次に I ( i でなく大文字)を押し、そのまま # を入力します。
そして Esc を押すと # がまとめて入力されます。
ちなみに矩形処理をするにはRed Hat系の場合 vim-enhanced パッケージが必要みたいです。
$ rpm -q vim-enhanced
vim-enhanced-6.3.046-0.40E.7
CUIしか使えない環境の時でもelinksやlynxというコマンドを使うとWebページを表示できます、当然ながら画像は表示されず文字だけですが…。例えばこんな風に利用します。
$ elinks http://www.gnu.org/
そしてネットワークの環境によってはプロキシサーバを指定しないとインターネットが利用できない場合がありますが、そんな時には環境変数HTTP_PROXYを利用します。下記はプロキシサーバがpenguin.example.comで、ポート番号が8000の例です。自分の環境用に置き換えて使ってください。
$ export HTTP_PROXY=penguin.example.com:8000
当然ながら毎回設定するのは面倒なので~/.bashrcとかに書いておくと便利です。
この設定するとyumコマンドもプロキシを経由して実行されるようになります。
LinuxやUNIXで特定のユーザが所属するグループ一覧を表示するにはgroupsというコマンドを使います。下記ではユーザjohnとrootでそれぞれ実行した例です。
$ groups john
john : beatles
$ groups root
root : root bin daemon sys adm disk wheel
では逆に特定のグループに所属するユーザ一覧を表示するには何というコマンドを使うのでしょうか?答えはありません。(のはず、知ってる方いたら教えてください)
では特定のグループに所属するユーザ一覧を表示することはできないのかというと、そんなことはもちろんありません。例えばawkコマンドで簡単に表示できます。
まず調べたいグループのgid(group id)を調べます。グループはファイル/etc/groupで管理されており、下記はbeatlesで検索し、gidが503であると表示された例です。そしてこの時点で、ユーザtaroとjiroがセカンダリグループとして所属していることが分かります。
$ grep beatles /etc/group
beatles:x:503:taro,jiro
次にユーザが登録されているファイル/etc/passwdからgidが503であるものを抜き出した例です。ここではawkコマンドを利用し、":"で区切られたデータの4列目(gid)が503であるものを検索し1列目(ユーザ名)のみの表示しています。これでプライマリグループに所属しているgeorge、john、paul、ringoが表示されました。
$ awk -F':' '$4==503{print $1}' /tmp/passwd | sort
george
john
paul
ringo
ということで、この2段階の処理で特定グループに所属するユーザをすべて表示することができます。
ちなみに最初のコマンドでtaro,jiroと続けて表示されるのが納得いかない場合は、このようにすれば改行して表示できます。
$ grep beatles /etc/group | awk -F':' '{print $4}' | awk -F',' '{gsub(",","\n") ; print $0}' | sort
jiro
taro
最近のハードディスクは昔と比べると簡単には壊れませんが、かといって永遠に使えるというわけでもありません。
現在のハードディスクにはSelf-Monitoring, Analysis and Reporting Technology (SMART)という技術が利用されており、これを使うことでハードディスクの状態を知ることが出来ます。Red Hat系Linuxではsmartctlというコマンドを利用します。
とりあえず-Hオプションにデバイス名を指定してみましょう。
# smartctl -H /dev/hda
smartctl version 5.33 [i686-redhat-linux-gnu] Copyright (C) 2002-4 Bruce Allen
Home page is http://smartmontools.sourceforge.net/
=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED
こんな風にPASSEDと表示されれば問題ありません。気になる方は下記のようなコマンドをcronに登録して、定期的に実行すると気が休まることでしょう。
/usr/sbin/smartctl -H /dev/hda | mail -s "smart hda" test@example.com
他にsmartdというプログラムがあります。これを起動しておくと初期値では30分ごとにハードディスクを確認し、エラーがあると/etc/smartd.confに書いてあるメールアドレスに知らせてくれます。利用するには下記のようにしてください。
# service smartd start ← smartdを起動
# chkconfig smartd on ← smartdを起動時に起動する
近年のLinuxではテキストエディタviに代わり、多機能化されたvim(vi improved)が標準装備されていることが多いです。named.confなどを編集するときに色が付いたり、ウィンドウの分割が出来たりします。
viではなくvimが起動される仕組みはaliasにあり、そしてvimは/usr/binにインストールされています。
# alias
alias vi='vim'
# which vim
/usr/bin/vim
ここでのポイントは/usrは別のパーティションにインストールされることが多いということ。通常サーバでの利用であれば、分けます。ということは/usrがマウントされていない状態でviを起動しようとすると、当然エラーになります…。
シングルユーザモードなどで/usrが利用できないときは/bin/viとフルパスでviを起動するか、\viと打ってaliasを利用せずにviを起動するという方法を覚えておくべきでしょう。
HPのProLiantとBladeSystemでDebianをサポートすることになったらしい。
HP Adds Global Debian Linux Support, Introduces Open Source Middleware Channel Offerings
LinuxWorld: HP Announces Support for Debian Linux
Debianといえば無料で利用できるが、玄人向けというイメージが強い。CUIに慣れていれば良さも分かるが、初心者に進められるものではない。例えばインストーラがGUIではないとか…(現在GUIのインストーラも開発中)。
Red Hatが無料のRed Hat Linuxを止めるということになった頃は代替利用にDebianもよく雑誌などで取り上げられていたようだが、Fedora ProjectやらCent OSやらもあって最近は地味な存在かも…。
そう、私もこんなセミナーを一時やっていました。
オープンソースだけのプログラムだけでいいのならば、Debianは安定していてとってもお薦めです。
LinuxやUNIXでは設定ファイルの末尾にrcが付くものが多いです。例えばbashなら.bashrc、viなら.exrcとか。
私は長いこと、このrcはresourceの略だろうと勝手に思っていました。ただよく考えてみれば、設定ファイルにresourceというのはおかしい気がするし、そうだったとしたらrscと略す方が分かりやすいですよね。
ということで調べてみたらrcはrun controlの略でした…。なるほど、これなら納得です。
追記
コメントに
>> rcは、"Run Command"の略です。
とあり、調べたらこのページが見つかりました。
rc が名前につくファイルについて教えてください [1993.4]
ということで、Run-Controlではないようです…。
LinuxでCDを焼くにはcdrecordというコマンドを利用します。インストールされているかを調べるには下記のようにします(Red Hat系の場合)。
# rpm -q cdrecord
cdrecord-2.01.1-5
CDを焼く際には拡張子が.isoのイメージファイルが必要です。下記ではFedora Core 5のディスク1を/tmpにダウンロードして利用する例です。
-vオプションで実行状況を詳細表示し、-ejectオプションは終了後トレイを開きます。dev=でCD-Rドライブを指定しています、一般的なPCであればこのままで使えます。
# cdrecord -v -eject dev=/dev/hdc /tmp/FC-5-i386-disc1.iso
CD-Rドライブが反応しないのであれば下記コマンドで調べてみてください。太字の部分がCでない場合は表示されたキャラクタ(aからd)に合わせて再実行してみてください。
# dmesg | grep CD
hdc: ATAPI 32X CD-ROM CD-R/RW drive, 4096kB Cache
今ではCCNAのクラスなどでIPアドレスの計算方法を教えていたりする私ですが、昔はサーバの設定時にネットワークアドレスを指定しろと出た場合にはかなり焦ったものです…。
ネットワークアドレスやブロードキャストアドレスは当然ながら計算すれば求めることが出来ますが、専用のipcalcというコマンドがあります。
ブロードキャストアドレスを表示するには-bオプションを利用します。ネットマスク値とプリフィクス値のどちらも利用できます。
$ ipcalc -b 10.20.30.40 255.255.255.0
BROADCAST=10.20.30.255
$ ipcalc -b 10.20.30.40 255.255.255.240
BROADCAST=10.20.30.47
$ ipcalc -b 10.20.30.40/26
BROADCAST=10.20.30.63
ネットワークアドレスは-nオプションを利用します。
$ ipcalc -n 10.20.30.40 255.255.255.0
NETWORK=10.20.30.0
$ ipcalc -n 10.20.30.40 255.255.255.240
NETWORK=10.20.30.32
$ ipcalc -n 10.20.30.40/28
NETWORK=10.20.30.32
-bと-nオプションを併用することも出来ます。
$ ipcalc -nb 10.20.30.40/28
BROADCAST=10.20.30.47
NETWORK=10.20.30.32
$ ipcalc -nb 10.20.30.40 255.255.240.0
BROADCAST=10.20.31.255
NETWORK=10.20.16.0
CCNA対策などでIPアドレスの問題があったりしますが、答えが間違っていることがたまにあったりします。そんな時はipcalcで確認してみましょう。
前回のものより少し難しく(実用的?)にしてみました。前回の問題と比べてホスト名やドメイン名などはかなり統一感を出しましたので理解しやすいと思います…。
やってみれば分かりますが、手順通りにやったほうが結局早いでしょう。
設定
SOA値は下記を利用する。
下記アドレスを正引き、逆引きとも登録。
下記アドレスは正引きのみ登録。
Linux上で下記シェルスクリプトを作成する。
Winnyなどによるファイル流出が止まず、頭の痛い人が多いでしょうが私物PCの持込みを制限する方法はもちろんいろいろあります。スイッチで登録したMACアドレスだけを利用可能とするとか、これはちょっといいスイッチを買えば普通出来ます。無線LANももちろん登録したMACアドレスだけの制限も可能です。
MACアドレスは各PC(正確にはNIC)に割り当てられた番号のようなもので、世界中で重複しないものが利用されているはずです。ということで社内PCのMACアドレスを調べて登録し、それ以外使えないようにすればとりあえず問題解決。
しかしこの方法は当然ながら結構面倒です。そこで便利なのがarpwatchというプログラム。これを使うと勝手に監視してくれます。Red Hat系であればこんな感じでインストールできるはず。
# yum install arpwatch
# chkconfig arpwatch on
# service arpwatch start
上記手順で起動後はネットワークを監視し、新しいMACアドレスが見つかるたびにrootユーザ宛て(変更可)に下記のようなメールを送ります。最初は当然ながら接続されているすべてのネットワーク機器が通達されるわけです。
Subject: new station
hostname: <unknown>
ip address: 192.168.0.33
ethernet address: 0:e3:c8:ea:27:ec
ethernet vendor: ABC COMPUTER INC.
timestamp: Tuesday, Mar 7, 2006 12:04:21 +0900
それとログにも保存されます。
# tail /var/log/messages
May 17 13:02:33 myserver arpwatch: new station 192.168.0.12 0c:a2:18:1d:4e:df
ちなみに発見されたMACアドレスは/var/arpwatch/arp.datに保存されます。これ以降は新しいPCなどが接続されるとすぐ分かりますので、管理者が目で見張る必要は少なくともなくなります。
それとMACアドレスの前6桁は製造メーカごとに割り当てられていて、下記のページで調べられます。000A27はApple Computer, Inc.とか、すぐに分かるわけです。
IEEE OUI and Company_id Assignments
今まで避けてきたLinuxでの無線LANの利用ですが、そうも言っていられないのでテストすることになりました。で、無線LANカードを使うため古いThinkPadをKNOPPIXで起動して利用します。
まずは現在利用中のWLI-CB-G54を試してみます。これが使えれば言うことなしですが、挿しても反応がないような…。
# cardctl status
Socket 0:
3.3V CardBus card
function 0: [ready]
# cardctl ident
Socket 0:
no product info available
む~、ダメみたい。次に以前使っていた11MbpsのGW-NS11Cを試してみます。これはいけるだろうとの甘い期待も空しく。
# cardctl ident
Socket 0:
no product info available
ダメじゃん。
となるとドライバを探すか、そのまま動くカードを探すしかない。しかしCDから起動しているKNOPPIXでドライバを入れるのはあまりに大変そうなので、動くカードを探すことにする。その方が読んでくれる人にも役立ちそうですしね…?
検索してみるとWLI-PCM-L11は動作するらしい。しかし販売終了って書いてあるぞ。
秋葉原へ行って探すしかないかと思ったものの、検索したら在庫ありの店を発見。送料込みで4,000円ほどでした。ありがたい。
数日して無事届き、4,000円払って使えなかったらどうしようと思いつつ挿してみたら…。
# cardctl status
Socket 0:
5V 16-bit PC Card
function 0: [ready]
# cardctl ident
Socket 0:
product info: "MELCO", "WLI-PCM-L11", "Version 01.01", ""
manfid: 0x0156, 0x0002
function: 6 (network)
# cardctl info
PRODID_1="MELCO"
PRODID_2="WLI-PCM-L11"
PRODID_3="Version 01.01"
PRODID_4=""
MANFID=0156,0002
FUNCID=6
ををっ、素晴らしい。でもCardBusではないのね、見れば分かるか。
早速設定します、ESSIDとWEP鍵を指定すれば通常は使えます。下記はIDにmyessid、WEPにabcdeを指定した例。注意点ですがWEP鍵は16進数を使ったほうが無難みたい。
# iwconfig eth0 essid "myessid" key "s:abcde"
これで使えるはずですが、上手くいかない時はカードを一度外してまた挿すといいみたいです。外すときは
# cardctl eject
とします。そして確認すると、
# iwconfig eth0
eth0 IEEE 802.11b ESSID:"myessid" Nickname:"banana"
Mode:Managed Frequency:2.462 GHz Access Point: 00:03:0B:A2:29:A3
Bit Rate:11 Mb/s Sensitivity:1/3
Retry limit:4 RTS thr:off Fragment thr:off
Encryption key:6162-6364-65 Security mode:open
Power Management:off
Link Quality=37/92 Signal level=-58 dBm Noise level=-95 dBm
Rx invalid nwid:0 Rx invalid crypt:3330 Rx invalid frag:1508
Tx excessive retries:1 Invalid misc:0 Missed beacon:0
となり、無事通信可能となりました。やっぱり無線は便利だね。
PCで作業をすると通常undoという機能を利用できます、Windowsだと編集の中に"元に戻す"という名前で入っていたりします。そしてこの機能をviで使うにはコマンドモードでuを押します。
まぁここまでは知っていることでしたが、本日調べたところコマンドモードで
:undo
と実行することでも同じことができると知りました。大発見です。
そして本日生徒さんに、viでredoはどうするのですか?と聞かれました。つまりundoで取り消したことを再実行するということです。
私も実はどうすればviでredoが出来るか、気になっていたのですが今まで調べていませんでした。いや、絶対出来るはずという確信はあったのですが。自分で使うだけならいつでもいいのですが、生徒さんに聞かれて答えないわけにもいかず調べたらちゃんと載っていました。redoするには
Ctrl-r
または
:redo
とします。なんと素晴らしい…。
注意点が実はありますがredoはvim(Vi IMproved)の機能であり、通常のviでは使えないようです。つまりlinuxな人々は使えるでしょうが、Solarisな人は駄目かもしれません。
ちなみにundoを私は長い間ウンドーと発音するものと思っていましたが、正しくはアンドゥーです…。ちなみにredoはリドゥーですね。
当然ですがLinuxでもPCカードは利用できます。ちなみに最近利用されているのはほとんどがCardBusという形式のものです。制御するにはcardctlコマンドを利用します。
statusと指定するとこうなりました、CardBus形式のカードが利用されているのが分かります。
# cardctl status
Socket 0:
3.3V CardBus card
function 0: [ready]
configを指定するとIRQ情報などが表示されます。
# cardctl config
Socket 0:
Vcc 3.3V Vpp1 3.3V Vpp2 3.3V
interface type is "cardbus"
irq 10 [exclusive] [level]
function 0:
今度はidentを指定します。そしてこれはカードが認識されていない例。このままでは使えないので手動でドライバを入れないといけません。
# cardctl ident
Socket 0:
no product info available
そしてこれは利用可能な例、Fast Ethernetインターフェイスとして利用できます。ということでPCカードが利用可能かどうかはcardctl identを実行すれば分かります。
# cardctl ident
Socket 0:
product info: "CardBus", "Fast Ethernet"
manfid: 0x0000, 0x024c
function: 6 (network)
infoもあります。
# cardctl info
PRODID_1="CardBus"
PRODID_2="Fast Ethernet"
PRODID_3=""
PRODID_4=""
MANFID=0000,024c
FUNCID=6
利用中にカードをそのまま抜くのは止めましょう、カードは壊れないでしょうがソフトウェアに問題発生する可能性があります。ejectで接続を解除してから抜くのが望ましいです。
# cardctl eject
sambaの設定をブラウザで行えるswatというプログラムがあります。sambaをインストールしただけでは入らないようなので個別にインストールします。
まずはyumでインストール。
# yum install samba-swat
chkconfigはxinetd経由で起動しますので、chkconfigでonとします。
# chkconfig swat on
xinetdでのswatの設定を行います。これをしないとリモートからアクセスできません。
# vi /etc/xinetd.d/swat
service swat
{
disable = no
port = 901
socket_type = stream
wait = no
only_from = 192.168.0.0/24 ←ここをローカルアドレスにする
user = root
server = /usr/sbin/swat
log_on_failure += USERID
}
設定を反映させるためxinetdをリロードします。
# service xinetd reload
ブラウザでhttp://ip address:901/にアクセスします。これは901番ポートを指定してアクセスするという意味です。ログインプロンプトはユーザrootとパスワードを入力。こんな画面が出ればOKです。
Namazu 2.0.15 が公開されているのを発見し、インストールしてみる。
$ tar xvfz /tmp/namazu-2.0.15.tar.gz
$ cd namazu-2.0.15/
今回もNamazuのmakeの前にFile-MMagicをインストール。このソースはNamazuに含まれています。
$ cd File-MMagic
$ perl Makefile.PL
$ make
# make install
その後、実際のNamazuのmakeです。
$ ./configure
$ make
# make install
出来たcgiをコピーします。
# cp /usr/local/src/namazu-2.0.15/src/.libs/namazu.cgi /var/www/cgi-bin/
面倒なことになったらどうしようと思いましたが、何の問題もなくそのまま利用できました。
インストールされているRPMファイルを確認するときに、パッケージ名がわかっているときはこんな感じで確認します。
$ rpm -q httpd
httpd-2.0.52-22.ent.centos4
そしてパッケージ名が曖昧なときは-qaオプションで一覧を出力して、grepで検索したりします。
$ grep httpd /var/log/rpmpkgs
httpd-2.0.52-22.ent.centos4.i386.rpm
httpd-suexec-2.0.52-22.ent.centos4.i386.rpm
もちろんこれでいいのですが、より高速に同じことが可能です。それは/var/log/rpmpkgsを使う方法。実はRHEやFedoraはcronにより毎日下記のスクリプトが実行されています。これによりRPMファイルの一覧が作成されているのです。
$ cat /etc/cron.daily/rpm
#!/bin/sh
rpm -qa --qf '%{name}-%{version}-%{release}.%{arch}.rpm\n' 2>&1 \
| sort > /var/log/rpmpkgs
よって一覧の中から検索するのであればこの方法がより効果的です。
$ grep httpd /var/log/rpmpkgs
httpd-2.0.52-22.ent.centos4.i386.rpm
httpd-suexec-2.0.52-22.ent.centos4.i386.rpm
Linuxなどでファイルをダウンロードする必要があるときはwgetコマンドを使うと便利です。使い方はこんな感じ。
$ wget http://download.ac.jp/pub/apache/httpd/httpd-2.0.55.tar.gz
wgetに続きファイルへのパスを指定します。このパスはブラウザのリンクを右クリックして"ショートカットのコピー"でコピーできます。
複数のファイルをダウンロードする時はスペースを空けてそのまま指定することも可。またファイルに書いて利用することもできます。こんな感じ。
$ vi download.list
http://download.ac.jp/pub/apache/httpd/httpd-2.0.55.tar.gz
http://download.ac.jp/dist/httpd/httpd-2.0.55.tar.gz.md5
$ wget -i download.list
通常リモートからの接続にはパスワード認証を利用していますが、実はあまり望ましい方法とは言えません。なぜならパスワードが分かってしまえば、誰でもログインできてしまうから…。
ということで公開鍵を使ったログインにするとより安全です。方法はまずペアとなる公開鍵と秘密鍵を作ります。次に公開鍵をサーバに登録、これにより一致する秘密鍵でのみログインできるようになります。
まずは鍵の作成ですが、詳細はPuTTYgenの利用をご覧下さい。指定するパスフレーズはパスワードと違いスペースも利用できるのがポイントです。
できたら公開鍵を登録します。まずは専用のディレクトリを作成しますが、以降利用するユーザで設定を行います。
$ mkdir ~/.ssh
次にそのディレクトリ内に作った公開鍵を貼り付けます。このファイルのパーミッションは644か600でないとうまく動きません。
$ vi ~/.ssh/authorized_keys
では鍵を使ってログインしてみましょう。詳細は鍵を使ったログインをご覧下さい。
するとログイン画面が変わります。
今まで
Using username "nakamura".
nakamura@192.168.0.18's password:
鍵を使った場合
Using username "nakamura".
Authenticating with public key "rsa-key-20060109"
Passphrase for key "rsa-key-20060109":
そして設定したパスフレーズでログインできればOKです。ログはこのようになります。
# tail /var/log/messages
Jan 9 07:53:25 manet sshd[15709]: Accepted password for nakamura from ::ffff:192.168.0.212 port 1061 ssh2 ←通常のログイン
Jan 9 08:00:56 manet sshd[15813]: Accepted publickey for nakamura from ::ffff:192.168.0.212 port 1073 ssh2 ←鍵を使ったログイン
問題なく動くようになったら通常のパスワードログインをできないようにしましょう。ただしこの設定を行うと秘密鍵がないとまったくログインできなくなるので慣れてから行ったほうががいいかもしれません。
# vi /etc/ssh/sshd_config
PasswordAuthentication no ←yesをnoにする
設定変更後sshdを再起動します。
# service sshd reload
CentOSの初期設定のままではセキュリティ上緩すぎるので設定を変更します。
まず初期設定ではどのユーザからもrootユーザに変更できます。便利ですが大変危険なので、既存のwheelグループに所属するユーザだけがrootに変更できるように設定を行います。
まず指定のユーザをwheelグループに所属させます。
# usermod -G wheel nakamura
# id nakamura
uid=500(nakamura) gid=500(tempest) groups=500(tempest),10(wheel)
次にPAMの設定を変更します、これによりwheelグループに所属するユーザだけが変更可能になります。
# vi /etc/pam.d/su
# Uncomment the following line to require a user to be in the "wheel" group.
auth required /lib/security/$ISA/pam_wheel.so use_uid ←この行を有効にする
この設定変更は再起動などせずそのまま有効になります。
次にsshdの設定を変更します。初期設定ではrootでそのままログイン可能であり、大変危険なのでこれを禁止します。
# vi /etc/ssh/sshd_config
PermitRootLogin no ←この行を有効にし、yesをnoにする
この設定はsshdの再起動後有効になります。
# service sshd restart
これで少し安全になりました。
今回はCentOSで外部のログを収集できるようにします。これにより一括してログの管理ができます。無線LANルータの様にログの保存容量の少ないものも外部に保存するようにすると便利でしょう。
他のマシンからのログを収集するには設定を1箇所変更します。
# vi /etc/sysconfig/syslog
SYSLOGD_OPTIONS="-m 0 -r" -r を加える
設定を反映させるためsyslogをリロードします。
# service syslog reload
Linuxサーバであれば下記のように@を使って保存先のサーバを指定できます。
# vi /etc/syslog.conf
authpriv.* /var/log/secure
authpriv.* @cent_os_server ←こんな風に
今回は無線LANルータのログを設定しました。するとちゃんとルータのログも届いていますね。
# tail /var/log/messages
Dec 30 11:45:46 router udhcpc: Sending renew...
Dec 30 11:45:46 router udhcpc: got ACK
Dec 30 11:45:46 router udhcpc: Lease of 2.11.18.14 obtained, lease time 3600
Dec 30 11:50:01 cent_os_server crond(pam_unix)[27982]: session opened for user root by (uid=0)
今回はsquidを入れてプロキシサーバとします。インストールは簡単です。
# yum -y install squid
ローカルIP(192.168.0.0/24)の利用を可能にし、ポートは8080とエラーメッセージは日本語という最低限の設定例です。
# vi /etc/squid/squid.conf
acl CONNECT method CONNECT
acl tempest_local src 192.168.0.0/255.255.255.0 ← 追加
http_access allow tempest_local ← 追加
http_access deny all ← この下に書くと無効になる
http_port 8080 ← 追加
error_directory /usr/share/squid/errors/Japanese ← 追加
起動します。
# service squid start
ブラウザにプロキシの設定を行い利用して、squidのログに表示されれば問題ないでしょう。
# tail /var/log/squid/access.log
次にログを見やすくするためにWebalizerで解析します。Apache用の設定ファイルをコピーして使います。
# cp /etc/webalizer.conf /etc/webalizer_squid.conf
設定はとりあえずこの3ヶ所を指定すればいいはず。
# vi /etc/webalizer_squid.conf
LogFile /var/log/squid/access.log
LogType squid
OutputDir /var/www/usage/squid
専用のディレクトリを作ります。
# mkdir /var/www/usage/squid
# chown webalizer /var/www/usage/squid
# chcon system_u:object_r:httpd_sys_content_t /var/www/usage/squid
そして設定ファイルを指定してWebalizerを実行します。
# webalizer -c /etc/webalizer_squid.conf
さてブラウザでhttp://サーバ/usage/squid/を開いてみると、あれれApacheの結果そのままなんですけど…。設定ファイルを確認しても間違ってない。
なぜ?
ここでwebalizer_squid.confを見てみると2ヶ所気になるところが。
HistoryName /var/lib/webalizer/webalizer.hist
IncrementalName /var/lib/webalizer/webalizer.current
ここに過去のデータが残っているみたいなので、下記のように書き換えました。
HistoryName /var/lib/webalizer/webalizer_squid.hist
IncrementalName /var/lib/webalizer/webalizer_squid.current
そして再度Webalizerを実行すると、おおっ!無事できました。あとは/etc/cron.dailyにあるシェルスクリプトをコピーして利用すればいいでしょう。
# cp /etc/cron.daily/00webalizer /etc/cron.daily/00webalizer_squid
# vi /etc/cron.daily/00webalizer_squid
if [ -s /var/log/squid/access.log ] ; then
/usr/bin/webalizer -c /etc/webalizer_squid.conf
fi
まぁとりあえずApacheはさっくり動くだろうから書くことないと思いつつ、とりあえずDocumentRootだけをユーザのホームディレクトリのhtdocsに変更しておく。
とりあえずindex.htmlを作って開こうとすると、エラー(Forbidden)。
# tail /var/log/httpd/error_log
[Tue Dec 13 15:45:50 2005] [error] [client 192.168.0.194] (13)Permission denied: access to /index.html denied
あれ、ミスするところではないはずだが。ディレクトリのパーミッションかと思い見てみるも問題なし。ここでふと思い出す、そうそれはSELinux。
# ls -ldZ /var/www/html /home/john/htdocs
drwxr-xr-x john beatles user_u:object_r:user_home_t /home/john/htdocs
drwxr-xr-x root root system_u:object_r:httpd_sys_content_t /var/www/html
上2つのディレクトリは確かにセキュリティコンテキストが異なっていますね。これによりSELinuxではねられたのです。
chconコマンドで修正します。
# chcon root:object_r:httpd_sys_content_t htdocs
# chcon root:object_r:httpd_sys_content_t htdocs/index.html
これで無事htmlファイルが開くようになりました。しかし初めてやる人には大変な作業だよね~。ちなみにcgi-binディレクトリはまた別の指定です。
# ls -ldZ /var/www/cgi-bin
drwxr-xr-x root root system_u:object_r:httpd_sys_script_exec_t /var/www/cgi-bin
社内サーバを作る大きな目的は、HTMLファイルのデータベース作成にあります。うちはこれをNamazuで行っています。今はそれを使いやすくしたKABAYAKIというものもありますが、今回は止めておきました。
Namazuインストールの前に日本語解析のためのプログラムをインストールします。
# rpm -ivh chasen-2.2.9-1.i386.rpm nkf-2.01-2.i386.rpm ipadic-2.5.1-1.noarch.rpm
その後、Namazuをインストール。こちらはソースからです。
$ tar xvfz /tmp/namazu-2.0.14.tar.gz
$ cd namazu-2.0.14/
Namazuのmakeの前にFile-MMagicをインストールします。このソースはNamazuに含まれています。
$ cd File-MMagic
$ perl Makefile.PL
$ make
# make install
その後、実際のNamazuのmakeです。
$ ./configure
$ make
# make install
出来たcgiをコピーします。
# cp /usr/local/src/namazu-2.0.14/src/.libs/namazu.cgi /var/www/cgi-bin/
設定ファイルをコピーして、編集。
# cd /usr/local/etc/namazu/
# cp namazurc-sample namazurc
ここでインデックスを作ったときのURLを指定します。
# vi namazurc
Replace /var/www/html/ http://192.168.0.180/
実際にindexを作ります、/usr/local/var/namazu/indexに出来ます。
/usr/local/bin/mknmz /var/www/html/ > /var/www/html/mknmz.txt
無事終了したらnamazu.cgiで検索出来ます、便利だね。後はcrontabに登録して1日1回とか自動実行するといいでしょう。
その後、何度かやっていたら、こんなエラーが、
ASSERTION ERROR!: NMZ.r (52) and NMZ.t (54) are not consistent!
悩むも、/usr/loca/var/namazu/indexの中身を消すと直りました。
CentOSのインストール開始。当然ながら枯れまくったこのマシンではさっくりとインストーラが起動する。そして聞いていた通り、Red Hatのロゴがない以外はまったく同じようにインストールが進む。
パッケージで多少の取捨選択して1.2Gほど。しばらくして無事インストール完了。直後のディスクはこんな感じ。
# du -sh /*/ | sort -k 2
5.3M /bin/
2.8M /boot/
152K /dev/
19M /etc/
8.0K /home/
8.0K /initrd/
49M /lib/
16K /lost+found/
24K /media/
8.0K /misc/
8.0K /mnt/
8.0K /opt/
257M /proc/
128K /root/
15M /sbin/
0 /selinux/
8.0K /srv/
0 /sys/
24K /tmp/
1.3G /usr/
34M /var/
yumでのアップデートのために署名をインポートする。
# rpm --import /usr/share/doc/centos-release-4/RPM-GPG-KEY
アップデート開始、ものすごい数かと思ったら36個ほど。Kernelが2.6.9-22.0.1.ELとなっている。
# yum -y update
最近LinuxではクローンOSというものが人気です。これは中身はRed Hat Enterpriseと同じだけど、無料で使えちゃいますよということが売りです。まぁいろいろとライセンスの絡みでこのようなことが可能になっているようです。
そのクローンOSの中で最も人気があるようなのがCentOS。現在はバージョン4.2です。
Red Hat Enterpriseを勉強するには今のところFedoraを薦めるのが一般的ですが、今後はこちらに乗り換えようかと考慮中です。
それで現在社内用のサーバがあるのですが、これが2000年から使っているものでさすがにどうよって感じ。とあるスクリプト実行時にいつもメモリー不足になったりして。ちなみにOSはNetBSD。
でわが社の次期社内サーバをこのCentOSで作ってみることにしました。その過程をかけば参考になる人もいるかな?ちなみに使うマシンはこれ。
CPU: K6/2 300MHz
Memory: 256MB
HD: IBM-DJNA-351520(15G)
CD: PLEXTOR CD-R PX-W8432T
NIC: Ethernet Pro 100(82559)
1998年に買って、HDとNICを交換したりでこれもかなり年代物ですがLinuxのCUIなら充分でしょう…。
ではまずインストールに必要なCDを作成します。CentOSのミラーサーバからISOイメージをダウンロード。
適当なサイトに入ったら 4.2/isos/i386 という感じで移動します。でこの4ファイルをダウンロード。終了後はMD5値を確認するとより望ましいです。
CentOS-4.2-i386-bin1of4.iso
CentOS-4.2-i386-bin2of4.iso
CentOS-4.2-i386-bin3of4.iso
CentOS-4.2-i386-bin4of4.iso
ダウンロードしたISOイメージをCDに焼きます。WindowsででもMacででも可能です。ちなみにLinuxとかで焼くときはこんな感じ。
# cdrecord -v -eject dev=/dev/hdc ./CentOS-4.2-i386-bin1of4.iso
次回はとりあえず、インストールしてみます。
生徒さんより質問があり気がつきました、chmodコマンドの利用方法です。
今まではa+xとaを略した+xは同じだと思っていましたが、実は違うのでした…。省略した場合はumask値が反映されるのです。manを読んで気づきました。
$ ls -l apple
-r--r--r-- 1 john beatles 17027 2005-11-09 23:14 apple
$ chmod a+w apple
$ ls -l apple
-rw-rw-rw- 1 john beatles 17027 2005-11-09 23:14 apple
$ ls -l apple
-r--r--r-- 1 john beatles 17027 2005-11-09 23:14 apple
$ chmod +w apple
$ ls -l apple
-rw-rw-r-- 1 john beatles 17027 2005-11-09 23:14 apple
$ umask
0002
今まで嘘を教えてました、すみません…。

2年振りで3冊目となる新著が11月10日に発売となります。
Fedora Core 500の技
中村文則 · 橘あゆみ 著 / A5判 / 480ページ
ISBN4-7741-2575-X5 / 2005年11月10日発売
橘あゆみさんという方との共著になっていて、私の担当分は500のうち400です。編集の方からこの話を聞いたとき、400なら毎日20書けば20日で終わるなと思ったのですが、とんでもない。最高に書けた日でも19個止まりだったのです…。200を過ぎたあたりが一番辛かったかも。
内容ですが他の類似本を見てあまり載っていなそうなものと、すぐに役立ちそうなものを選んで書いたつもりです。自分用の備忘録を丁寧に書いたっていう感じでもありますが。
いつもの事ながら、最後はゲラとの戦い。写真は一番最後に届いたものですが、見る度に間違いが見つかるんですよ…。しかし、これを作ってる編集やDTPの方って大変ですね。単に文章を書いてる方が気楽かも。しかも今回は480ページと、想像していたより分厚い。
3冊目にして売れ線(Linuxということで)狙い。中村、入魂の一冊。みなさんよろしく~。
ftpコマンド内でbellコマンドを設定すると、ファイルの転送終了時にビープ音で知らせてくれます。ただし利用しているターミナルがbellを受信したときに音を出す設定になっている必要があります。大きなファイルをダウンロードするときなど便利でしょう。
ftp> bell
Bell mode on. オンに
ftp> bell
Bell mode off. もう一度実行するとオフ
長いこと疑問だったのですが、放ってきました。それはviやlessで文字を検索した後に出る検索文字列反転を解除する方法。今までは別の文字を検索ということで解除していたのですが、質問があり調べたらあっさり見つかった。それは、
Esc - u
反転がハイライト(highlight)と思い浮かべば、もっと早く分かったのに…。まぁ、調べてみるものですね。
追記
これ以外にviであれば
:set nohlsearch
でも反転を消すことができます。
Fedora Core 4を採用したLinuxセミナーのテキストPDF版を公開しました。
いつもながら主要プログラムはソースからのインストールという志の高い(!?)方式ですので、ディストリビューションが違っても参考になると思います。
Linuxなどのログイン時にパスワードを打ち間違えてBackspaceキーを
使って打ち直したりしますが、そもそも*もでないCUI利用時には混乱
しますよね。
そんな時にはCtrlキーを押しながら、uキーを押します。するとクリアされます
ので、再入力しましょう。これはCiscoルータなどでも使えます。
最近のOSはセキュリティの都合上、ログインが必要になってます。ただし、ログインしたままの状態で席を離れては意味がないですね。ということで一定時間作業をしていない状態が続くと強制的にログアウトさせるには下記のようにします。
ここでは300秒(5分)を指定しています(bashを利用)。最初は5秒などを指定して、実際にログアウトが実行されることを確認するといいでしょう。
$ export TMOUT=300
全ユーザにこの設定を強制利用させる場合には/etc/profileに上記の行を加えてください。かなり安全になります。
RPMでパッケージをインストールしますが、-qfオプションを利用すると指定のファイルがどのパッケージによりインストールされたかわかります。
# rpm -qf /etc/services
setup-2.5.44-1
/etc/servicesはsetupというパッケージに含まれているのですね…。
# rpm -qf /etc/nsswitch.conf
glibc-2.3.5-10
nsswitch.confってglibcに含まれてるの?以外だ。
Fedora Core 4では初期設定でSELinuxが有効になっていますが、問題があるときは下記の方法で警告や無効に変更できます。
まず現在の状態を調べるにはgetenforceコマンドを利用します。結果が有効(enforcing)、警告(permissive)、無効(disabled)のいずれかで表示されます。
# getenforce
Enforcing
設定を変更するには/etc/selinux/configファイルを編集します。SELINUX=をenforcing、permissive、disabledのいずれかに修正して再起動してください。
# vi /etc/selinux/config
SELINUX=permissive ←ここを修正
Fedora Core 4 が出ました。以前は新しいものが出るとあちこちの記事を見て回ったりしてたのですが、Release Noteを読めばいいだけなのですよね。なぜ長いこと気がつかなかったのか自分でも不思議です。
Fedora Core 4 Release Notes
機械翻訳
気になったのはSELinuxでしょうか。FC3よりデフォルトで有効になりましたが、targeted policyで有効になっていたのは9つのデーモンたけでかなり甘いという感じでした(手動で増やすことはもちろん可)。しかしFC4では90以上のデーモンが含まれており、かなり強力です。ただしそのおかげで今までのやり方がうまくいかん!ということが多発すること間違いなし(自分を含む)。
それとFC4ではXen 2 (virtualization to run multiple versions of an OS)というものが加わったことが売りのようですが、まだ触ったことがないので良く分かりません…。今後研究したいと思ってます。
Linuxの勉強には便利なFedora Coreですが、今はFirewallとかSELinuxがあって初心者には大変ですよね。初めての人はこれらを無効にしてインストールしたほうがいいです。慣れてきてからいろいろな機能を加えていかないと、パニックすること間違いなし。
isoイメージのダウンロードはここ。
LinuxWorld Expo/Tokyo 2005に行ってきました。目に付いたのはNOVELLに買収されて、国内でも力が入ってきたSUSE LINUXとMySQLですね。
国内でのオープンソース系DBはPostgreSQLが主流でしたが最近はサイボウズに採用されたり、XOOPSでも利用されていたりとMySQLがやたら目に付きます。
SUSEは統合管理ツールのYaSTが使いやすそうだけど、今後使う機会があるかな。それよりマスコットであるカメレオンのGeekoのぬいぐるみが抽選で外れてショック。欲しかった。
Fedora Core 3でのパスワードは6文字以上で指定します。もしセキュリティを考慮して最低文字数を増やすのであれば/etc/pam.d/system-authファイルの下記行を修正します。
password requisite /lib/security/$ISA/pam_cracklib.so retry=3
この行に下記オプションを加えます。minlenの指定だけではないのがポイント。
dcredit=0 ucredit=0 ocredit=0 lcredit=0 minlen=8
この設定では何でもいいから8文字という意味になります。そしてdcredit(数字)、ucredit(大文字)、ocredit(記号)、lcredit(小文字)を必ず含ませたい場合は-nで指定します。数字を必ず1つは入れるようにするにはこうなります。
dcredit=-1 ucredit=0 ocredit=0 lcredit=0 minlen=8
ここに詳細が書いてあります。
Cracklib pluggable password strength-checker
Red Hat Linuxの頃はviで/etc/named.confとかを開くと色分け表示されて便利だったけど、Fedora Coreでは色つかないのね。
気になっていたのですが、なくても利用できないわけではないのでほっておきました。しかし、この度確認しました。setオプションの指定かと思っていたのだけどそうではない。なんとvim-enhancedという別のパッケージが必要なのです。
ということで、こんな感じでインストールします。
# yum install vim-enhanced
インストール後、vimコマンドで/etc/named.confを開くと懐かしい色分けされた画面となります…。ちなみに~/.bashrcにaliasを書いておくと便利でしょう。
alias vi="vim"
私はWindowsでもCapsとCtrlキーを入れ替えて使ってます。その方がUNIX系を使う分には何かと便利なので。ちなみにChgCtrlCapsみたいな便利なものがあります。
ディストリビューションによって入れ替えたキーマップを用意してあったりしますが、少なくともFedora Core 3には入っていないようなので自分で作らないといけません。
# cp /lib/kbd/keymaps/i386/qwerty/jp106.map.gz /tmp/jp106CapsCtrl.map.gz
# gunzip /tmp/jp106CapsCtrl.map.gz
viで直接キーコード29と58を入れ替えて保存。拡張viだと解凍せず直接編集できます。
# vi jp106CapsCtrl.map.gz
書き替えた後
keycode 29 = Caps_Lock
keycode 58 = Control
# gzip /tmp/jp106CapsCtrl.map
# mv /tmp/jp106CapsCtrl.map.gz /lib/kbd/keymaps/i386/qwerty/
loadkeysコマンドでキーボードマップを変更。
# loadkeys jp106CapsCtrl
あ~便利。
ドイツのミュンヘン市がWindowsとMicrosoft Officeの利用を止め、Linuxに乗り換えるという話はかなりの話題になっていましたが、ディストリビューションにはDebianが決まったとのこと。
ドイツのミュンヘン市,1万4000台のLinux移行プロジェクトでDebian GNU/Linux採用を公表
Debianは非常に優れていて慣れた人には使いやすいのですが、インストーラがまだCUIだったりして初心者には難しいのが玉に傷。うちのセミナーのテキストのPDF版がありますので、興味のある人は見てください。
最近は国内のお役所でもかなりLinuxが浸透していて(サーバの話ですが)、私のLinuxクラスにもあちこちからいらっしゃいます。今後はクライアント版の利用も進むかな?
最近のコメント