今日も元気にテクニカル

技術情報書きたいけど本ブログに書きたくないからこんな名前になりました。

パッケージ管理システムまとめ

LinuxではWindowsでいうWindowsUpdateみたいなパッケージ自動更新システムがあります。ただWindowsと違ってOSのコアモジュールからサードパーティ(?)製のアプリまで一緒くたに管理されてるのが特徴。なので、メールソフトも音楽再生ソフトも全部同じコマンドで管理できます。

ディストリによる管理コマンドの違い。

Redhat系ではyum、Debiun系ではaptというコマンドを使って管理します。ちなみにディストリによってはsynaptic(Ubuntu)、YaST2(OpenSUSE)などのGUIが用意され、それこそWindowsUpdate的な感覚でパッケージを管理できます。

yumの主なコマンド

パッケージアップデート
アップデート可能なパッケージを一覧表示する
yum check-update
アップデート可能な全てのパッケージをアップデートする
yum update
指定したパッケージをアップデートする
yum update [パッケージ名]

OSインストール後に、まずyum updateするのが常套手段。-yをつけると自動応答モードとなる。

パッケージ検索/情報表示
リポジトリに問い合わせを行い、パッケージの検索を行う
yum search [パッケージ名]
リポジトリに問い合わせを行い、利用可能なパッケージを一覧表示する
yum list
インストールされている/アップデート可能なパッケージを一覧表示する
yum list [installed/updates]
利用可能なパッケージの情報を表示(パッケージ指定可能)
yum info (パッケージ名)

yum list installedはローカルを検索するので早い。インストール/アップデート前に検索するとよい。
yum check-updateとyum list updatesは同じである。

パッケージインストール/アンインストール
指定したパッケージをインストール/アンインストール
yum [install/remove] [パッケージ名]
不要ファイル削除
ダウンロードしたパッケージと古いヘッダを削除する。
yum clean
古いヘッダ/パッケージのみ、削除する
yum clean [oldheaders/packages]

aptの主なコマンド

パッケージアップデート
ソフトウェアをダウンロードできるサイトのリストの更新
apt-get update
インストール済みのソフトウェアの更新
apt-get upgrade
パッケージ検索/情報表示
パッケージ情報を収集・更新する
apt-cache gencaches
パッケージを検索する
apt-cache search [検索キーワード]
パッケージの情報を開示する
apt-cache show [パッケージ名]

apt-cache showでは、指定したパッケージのインストール情報も表示される。

パッケージインストール/アンインストール
指定したパッケージをインストール/アンインストール
apt-get [install/remove] [パッケージ名]

apt-getなのに、removeが続くのが違和感。

不要ファイル削除

???

aptはこのほかにもいろんなコマンドがあるみたいなので、公式ページを参考にするといいかもしれない。

APT HOWTO (Obsolete Documentation)

crontabで設定したタスク実行時に、メールを送信しないようにする。

crontab -e で30分に1回タスクを動かしてるんだが、30分に1回メールが飛んできてウザい!cronの設定でメールを飛ばさないようにしたい!と思い、/etc/crontabファイルを編集。

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
#MAILTO=root
MAILTO=""
HOME=/

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

cronは1分に1回設定ファイルを見ているらしいから、これでメール来なくなるよね…と思いきや引き続き来る。念のため service crond restart したけれどそれでも来る。こりゃおかしいと思いいろいろ調べると/etc/anacrontabというファイルがあり、そっちの設定を変更しなければいけない様子。

http://cyberam.dip.jp/linux_foundation/taskschedule/anacron_main.html

上記サイトの説明では、結局cronからanacronが呼ばれるので、anacronの設定ファイルを編集しないといけないみたい。

# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=""

1       65      cron.daily              run-parts /etc/cron.daily
7       70      cron.weekly             run-parts /etc/cron.weekly
30      75      cron.monthly            run-parts /etc/cron.monthly

上記のようにMAILTOを編集したところ、めでたくメールが来なくなりました…と言いたい所だけどまだ来る!なんで!?

実はcrontab -e で設定するのでした。

どうやらcronには2つの動かし方があるらしく。

1./etc/crontabに記載されている以下のディレクトリにスクリプトを設置し、時次、日次、週次、月次タスクとして動かす。この場合は/etc/crontabのMAILTOオプションが有効になる。

  • /etc/cron.hourly
  • /etc/cron.daily
  • /etc/cron.weekly
  • /etc/cron.monthly

2.crontab -eで設定ファイルを呼び出し、自分の好きな時間にcronを実行するようにする。この場合、スクリプトの標準出力がcrontabを設定したユーザーにメール送信される。そしてcrontab -eの設定ファイルは**/var/spool/cron/user**にある。なんと分かりにくい…。

ということで、以下のように標準出力をブラックホールに投げてやればメールは来なくなる。

UNIXの部屋 コマンド検索:crontab (*BSD/Linux)

# 標準出力のみメールしない場合
* * * * * command 1> /dev/null

# 標準エラーもメールしない場合
* * * * * command >/dev/null 2>&1

vsftpdの基本設定

vsftpdでFTPサーバを動作させたのでメモ。

# vsftpd -v
vsftpd: version 2.0.5

基本設定は/etc/vsftpd/vsftpd.confで行う。以下主要な部分だけを抜粋。後日追加するかもしれん。

# cat vsftpd.conf
# Example config file /etc/vsftpd/vsftpd.conf
#
# Allow anonymous FTP? (Beware - allowed by default if you comment this out).
# 匿名ログインを許可しない
anonymous_enable=NO
#
# Uncomment this to allow local users to log in.
# ローカルユーザーのログインを許可する
local_enable=YES
#
# Uncomment this to enable any form of FTP write command.
# FTPの書き込みコマンドを許可する
write_enable=YES
#
# Default umask for local users is 077. You may wish to change this to 022,
# if your users expect that (022 is used by most other ftpd's)
# デフォルトのumaskを022とする
local_umask=022

# /etc/vsftpd/user_listを有効にする
userlist_enable=YES
# /etc/vsftpd/user_listをホワイトリストとして動作させる
userlist_deny=NO

# You may specify an explicit list of local users to chroot() to their home
# directory. If chroot_local_user is YES, then this list becomes a list of
# users to NOT chroot().
# 以下の3つの設定で、chroot_list_fileに書かれているユーザーはlocal_rootより上のディレクトリに移動できないようになる。
chroot_list_enable=YES
# (default follows)
chroot_list_file=/etc/vsftpd/user_list
#
local_root=/var/www

vsftpd: version 2.0.5には/etc/vsftpd/ftpusersというファイルがあり、ここに書かれているユーザーはftpログインできない。つまりuser_listに名前がある、かつftpusersに名前がないユーザーのみ、/var/www以下のディレクトリにftpログインできる。

なんでこんな仕様になっているかは分からないが、デフォルトではシステムアカウントがuser_listとftpusers両方に記載されており、自分のログイン用アカウントのみuser_listに記載されていた。つまり何も設定しなくても

service start vsftpd

と打てば自分のアカウントでftpログインできる。

もちろんこれは危険なので

ftpログイン専用のアカウントを作成する。

usreadd user01_www
passwd user01_www
usermod -s /sbin/nologin user01_www

useradd -s /sbin/nologinとすれば、システムへのログインを禁止できる。
んで、user_listから自分のログインアカウントを削除し、user01_wwwを追記すればOK。

rubyをソースからインストール→アンインストール

勉強のためにapt-getではなくソースからrubyをインストールしようと試みた。

Ruby Install Guide::UNIX全般

% wget ftp://ftp.ruby-lang.org/pub/ruby/ruby-1.8.6-p114.tar.gz
% tar -xvzf ruby-1.8.6-*.tar.gz
% cd ruby-1.8.6-*
% ./configure
% make
% su
# make install
# exit
% make clean

これでrubyが/usr/local/bin以下にインストールされた。続いてrubygemsのインストールも同じようにソースから。んで、取り合えずgem install rakeしようと思ったらエラーが…。

$ gem install rake
/usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require': no such file to load -- zlib (LoadError)
	from /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
	from /usr/local/lib/ruby/site_ruby/1.8/rubygems/package.rb:10
	from /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require'
	from /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
	from /usr/local/lib/ruby/site_ruby/1.8/rubygems/format.rb:9
	from /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require'
	from /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
	from /usr/local/lib/ruby/site_ruby/1.8/rubygems/installer.rb:11
	from /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require'
	from /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
	from /usr/local/lib/ruby/site_ruby/1.8/rubygems/dependency_installer.rb:3
	from /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require'
	from /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
	from /usr/local/lib/ruby/site_ruby/1.8/rubygems/commands/install_command.rb:4
	from /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require'
	from /usr/local/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
	from /usr/local/lib/ruby/site_ruby/1.8/rubygems/command_manager.rb:140:in `load_and_instantiate'
	from /usr/local/lib/ruby/site_ruby/1.8/rubygems/command_manager.rb:65:in `[]'
	from /usr/local/lib/ruby/site_ruby/1.8/rubygems/command_manager.rb:118:in `find_command'
	from /usr/local/lib/ruby/site_ruby/1.8/rubygems/command_manager.rb:104:in `process_args'
	from /usr/local/lib/ruby/site_ruby/1.8/rubygems/command_manager.rb:75:in `run'
	from /usr/local/lib/ruby/site_ruby/1.8/rubygems/gem_runner.rb:39:in `run'
	from /usr/local/bin/gem:24

zlibが入ってないからだなぁとかいろいろ試したんだがどうにも復旧せず、諦めてapt-getでrubyとrubygemをインストールすることにした。

その後、同じようにgem install rakeとすると同じエラーが…(汗 どうやら/usr/local/binの方を優先して読みにいっているようです。

$ which -a ruby
/usr/local/bin/ruby
/usr/bin/ruby
$ which -a gem
/usr/local/bin/gem
/usr/bin/gem
$ set | grep ^PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

ふむふむ。

  1. /usr/local/sbin
  2. /usr/local/bin
  3. /usr/sbin
  4. /usr/bin
  5. /sbin
  6. /bin
  7. /usr/games

の順番なのね。これを入れ替えるのはまずそうだし、フルパス打てばいいんだけど面倒なので/usr/local/bin以下のrubyをアンインストールすることにする。

調べてみた。

調査の結果、ソースからインストールしたアプリをアンインストールするのは面倒な作業だということが分かりました。

make unintallが使えない=ほとんどの場合は、Makefileの中身を見るorログを確認してインストールしたファイルを手動で消去する。あるいはこういうツールを使うのでもいいらしい。

make uninstallってほとんどないですよね。だからCheckInstall - devworks
CheckInstall Homepage

あ、けどこれCheckInstallで導入したやつしかアンインストールできないんだよね(汗 もう面倒なので/usr/local/bin以下のファイル全消去することにします。

$ ls -al
合計 2044
drwxr-xr-x  2 root root    4096 2008-11-27 01:45 .
drwxr-xr-x 10 root root    4096 2008-10-30 07:53 ..
-rwxr-xr-x  1 root root    3882 2008-11-27 01:36 erb
-rwxr-xr-x  1 root root     788 2008-11-27 01:45 gem
-rwxr-xr-x  1 root root     379 2008-11-27 01:36 irb
-rwxr-xr-x  1 root root    1543 2008-11-27 01:36 rdoc
-rwxr-xr-x  1 root root    1491 2008-11-27 01:36 ri
-rwxr-xr-x  1 root root 2055069 2008-11-27 01:36 ruby
-rwxr-xr-x  1 root root     153 2008-11-27 01:36 testrb
$ sudo rm -rf *
$ ls -al
合計 8
drwxr-xr-x  2 root root 4096 2008-11-29 18:57 .
drwxr-xr-x 10 root root 4096 2008-10-30 07:53 ..

きれいさっぱりw

/etc/fatabで他PCのドライブをマウントするとき、IDとpasswordを外部ファイル化する。

/etc/fstabで起動時に別PCのドライブを自動的にマウントさせにいくことが可能です。

$ ls -al /etc/  | grep fstab
-rw-r--r--   1 root root       597 2008-11-26 23:29 fstab

//192.168.1.101/D	/home/user01/D	cifs	username=user01,password=PASS01,codepage=cp932,iocharset=utf8,defaults	0	0

とはいえ/etc/fstabはユーザーにも読み取り権限がありパスワードが丸見えなので、クレデンシャルオプションを使用して別ファイルにパスワードを記録します。

//192.168.1.101/D	/home/user01/D	cifs	credentials=/etc/smbpasswd,codepage=cp932,iocharset=utf8,defaults	0	0

$ cat /etc/smbpasswd

username=user01
password=PASS01

んで外部ファイルのアクセス権限を操作し、rootしか読めないようにする。

$ sudo chown root:root /etc/smbpasswd
$ sudo chmod 0600 /etc/smbpasswd
$ ls -l /etc/smbpasswd
-rw------- 1 root root 35 2008-11-29 21:55 /etc/smbpasswd

Linuxにおけるssh

Linuxは特別な設定をしなくても、最初からssh使えて便利ですよ、というお話。

sshの設定ファイル

・sshサーバ
/etc/ssh/sshd_config

・sshクライアント
/etc/ssh/ssh_config

例えばsshd/configを設定することで、パスワード認証じゃなく鍵認証じゃなきゃだめ!とかに設定できます。

SSHの接続方法

ssh ユーザー名@接続先サーバ

ネットワーク設定

ネットワーク設定は以下のファイル。

★Debian
/etc/network/interfaces

auto lo
iface lo inet loopback


★Redhat
/etc/sysconfig/network-scripts/ifcfg-eth0

# Intel Corporation 82557/8/9 [Ethernet Pro 100]
DEVICE=eth0
BOOTPROTO=dhcp
HWADDR=00:10:A4:A6:E5:4C
ONBOOT=yes
TYPE=Ethernet

上記はどちらもDHCP設定のもの。固定IPの場合は、その旨を設定ファイルに記載する。
Ubuntuはなぜかループバックアドレスインターフェイスの設定しか記載されていないが、記載されていないデバイスはデフォルトでDHCPにでもなってくれるんだろう。