Mazn.net

やってみて 調べてみて 苦労しなけりゃ 箱は動かじ

linux

vimでシンタックスハイライトの関連づけ拡張子を追加する@CentOS 5.3

vimで.shの拡張子を開くと、シェルの構文がハイライトされるし、.c を開けばC言語の構文がハイライトされます。しかし拡張子がなかったり、拡張子間違っているとハイライトされません。

こういう時、例えばシェルモードでハイライトしたいときは

:set filetype=sh

とコマンドを打つことで色がつきます。しかし、毎回打つのは面倒ですよね。その場合、/usr/share/vim/vim70/filetype.vimに拡張子との関連づけを追加してあげることで、自動でハイライトさせることができます。

例えばC言語のファイル .c は以下のように定義されています。

au BufNewFile,BufRead *.c                      call s:FTlpc()

これを参考にし、例えば拡張子hogeをc言語として認識させるには以下のように追記してあげます。

au BufNewFile,BufRead *.c                      call s:FTlpc()
au BufNewFile,BufRead *.hoge                      call s:FTlpc()

VNCで日本語入力@CentOS5

CentOSでvncserverを起動した場合、デフォルトでは日本語が入力できません。

vncserver の設定ファイル~/.vnc/xstartupで、Gnomeなどのデスクトップ環境を起動する前に、以下を設定してあげることでCtrl-Spaceで入力できるようになります。

export GTK_IM_MODULE=scim
export QT_IM_MODULE=scim
export XMODIFIERS="@im=SCIM"

rpmが削除できない@CentOS 5.2

rpm -e でパッケージ削除中に誤ってCtrl-Cを押してしまい、中途半端に削除が中断してしまい、完全にパッケージを削除できなくなってしまいました。

# rpm -e postgresql-server
サービス postgresql に関する情報の読み込み中にエラーが発生しました: そのようなファイルやディレクトリはありません
エラー: %preun(postgresql-server-8.1.11-1.el5_1.1.i386) スクリプトの実行に失敗しました。終了ステータス 1

rpmのデータベースが壊れたわけではないようで、rpm --rebuildをしても直りません。仕方なく以下の方法で直しました。

完全に削除できていないので、再度同じrpmをインストールしてあげます。まずはインストールされていたパッケージを用意します。ここではOS付属のpostgresql-serverを例にあげます。

OS付属のパッケージはyumでインストールできますが、パッケージのダウンロードだけという機能はありませんので、Web上から直接ダウンロードするか、以下のようにしてダウンロードだけできるユーティリティをインストールしてダウンロードします。

# yum install yum-utils
~出力省略~
# yumdownloader postgresql-server

/var/cache/yum/base/packages にrpmファイルがダウンロードされるので、ここに移動します。

# cd /var/cache/yum/base/packages
# ls
postgresql-server-8.1.11-1.el5_1.1.i386.rpm

これを普通にインストールしようとしても、すでにインストールされているのでインストールできないので、--forceオプションをつけてインストールします。

# rpm -ivh --repackage postgresql-server-8.1.11-1.el5_1.1.i386.rpm
準備中...                ########################################### [100%]
        パッケージ postgresql-server-8.1.11-1.el5_1.1 は既にインストールされています。
# rpm -ivh --force postgresql-server-8.1.11-1.el5_1.1.i386.rpm
準備中...                ########################################### [100%]
   1:postgresql-server      ########################################### [100%]

インストール完了後、再度削除してあげると綺麗に削除されます。

# rpm -e postgresql-server

もう少し壊れにくいように作ってもらいたいですね。

Portable Ubuntu for Windows

Portable Ubuntu for Windowsなるものがあるらしいです。Windows上でLinuxカーネルを動かす技術-coLinuxを使用して、Linuxを動作させるので、別途パーティションを作ってインストールといった面倒なことをしなくてもよいLinuxです。

5年ぐらい前にcoLinuxを使ってみた時は、結構不安定でしたし、フリーのXサーバとしてcygwinのXを使っていたのですが、これもまた不安定。しかしPortable UbuntuにはXmingっていうXサーバが同梱されているようです。これもフリーですし、今でも結構活発に開発されているので、結構期待できそうです。

ということで、今度少し触ってみます。

TCP Wrapper の設定チェック@Linux

昔からあるアクセス制限の方法として、TCP Wrapperがあります。

/etc/hosts.deny や /etc/hosts.allow に許可するサーバ等を記述するだけなので設定は簡単ですが、たまに書き方を間違ったりしてしまいます。

そのような時のために、tcpdchkやtcpdchkというコマンドが用意されているようで、文法やプロセス名チェック、アクセス制限のシミュレーションなどができます。

% tcpdchk [オプション]
オプション     意味
-a:   allowが明示的に使われていない場合で、アクセスが許可されているルールを表示
-d:   hosts.allow と hosts.deny
-i:   inet_conf inetd.confファイルを指定する
-v:   詳細モード
% tcpdmatch [オプション] daemon[@server] [user@]client
オプション      意味
-d        hosts.allowとhosts.denyファイルがカレントディレクトリ上の存在する場合
-i inet_conf  inetd.confファイルを指定する。デフォルトは/etc/inetd.conf が指定される
daemon        デーモンプロセス名を指定する。telnetであれば、telnetd、in.telnetdなど
server        serverの部分には、ホスト名またはネットワークアドレスを指定する。省略した場合、“unknown”が仮定される
client        接続元のホスト名、ネットワークアドレス、または“unknown”、 “paranoid”といったワイルドカードパターンを指定する

(例)

% tcpdmatch -d telnetd 192.168.0.10
client:   address  192.168.0.10
server:   process  telnetd
matched:  hosts.allow line 1
access:   granted

参考 : http://www.atmarkit.co.jp/fsecurity/rensai/unix_sec03/unix_sec03.html

gvfsを使用して、Windowsの共有フォルダを使用する@Ubuntu 9.04

今までmaznはWindowsの共有フォルダにLinuxからアクセスする時は、mountコマンドを使って、cifsプロトコルでアクセスしていました。

# mount -t cifs -o username=mazn,iocharset=utf8  //fileserver/share /mnt/share

しかし、最近のGnomeは数年前にカーネルでサポートされたFUSE (Filesystem in user space) を使用してgvfsというプロトコルでマウントできるようです。

このFUSEというのは優れもので、今までカーネル内に実装しなくてはならなかった、ファイルシステムを、ユーザ空間で実装することができます。Gnomeはこれを使って、リモートの共有フォルダをローカルにマウントしてくれます。

場所→サーバへ接続 で、ファイルサーバのIPと共有名を入れてあげると、自動的にマウントしてくれますが、このマウント情報はdfコマンドではわからないようです。

$ df
ファイルシステム           1K-ブロック    使用   使用可 使用% マウント位置
/dev/sda1             15156556   4452612   9934032  31% /
tmpfs                   379400         0    379400   0% /lib/init/rw
varrun                  379400       336    379064   1% /var/run
varlock                 379400         0    379400   0% /var/lock
udev                    379400        76    379324   1% /dev
tmpfs                   379400        76    379324   1% /dev/shm
lrm                     379400      2392    377008   1% /lib/modules/2.6.28-11-generic/volatile

これを代わりにmountコマンドを使うと、以下のように情報が出てきました。

$ mount
/dev/sda1 on / type ext3 (rw,relatime,errors=remount-ro)
tmpfs on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
varrun on /var/run type tmpfs (rw,nosuid,mode=0755)
varlock on /var/lock type tmpfs (rw,noexec,nosuid,nodev,mode=1777)
udev on /dev type tmpfs (rw,mode=0755)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=620)
fusectl on /sys/fs/fuse/connections type fusectl (rw)
lrm on /lib/modules/2.6.28-11-generic/volatile type tmpfs (rw,mode=755)
securityfs on /sys/kernel/security type securityfs (rw)
binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,noexec,nosuid,nodev)
gvfs-fuse-daemon on /home/mazn/.gvfs type fuse.gvfs-fuse-daemon (rw,nosuid,nodev,user=mazn)

mountコマンドの方が、かなり多くの情報が出るみたいですね。見てわかるように、Gnomeはユーザのホームディレクトリの.gvfsという隠しディレクトリにマウントするようです。

ちなみにユーザ空間と言っても、lsやmkdirなど、普通のファイルと同じように使えるようです。

Ubuntuの起動画面が途中で見えなくなる@Ubuntu 9.04

Ubuntu 9.04を入れてみました。

起動時の画面が途中で真っ暗になったり、起動後に "Ctrl + Alt + F1"などで、CUIに切り替えた時に文字が大きく、画面にコンソールが入りきれなかったりしました。

Ubuntu側で表示する解像度を切り替えてるのが原因のようなので、/boot/grub/menu.lstのカーネルのオプションにvga=773を追加することで解決しました。

 kernel          /boot/vmlinuz-2.6.28-11-generic root=UUID=9ce4e省略 ro locale=ja_JP vga=773

ちなみに773は1024x768です。他にも以下のようなものが指定できるようです。

771 800×600/256色/8bitカラー
773 1024×768/256色/8bitカラー
775 1280×1024/256色/8bitカラー
788 800×600/6万5000色/16bitカラー
791 1024×768/6万5000色/16bitカラー
794 1280×1024/6万5000色/16bitカラー
789 800×600/1600万色/24bitカラー
792 1024×768/1600万色/24bitカラー
795 1280×1024/1600万色/24bitカラ

レスキューモードでLVMを認識させる@RHEL5

以下のコマンドでレスキューモードでLVMのボリュームグループを認識できます。

# lvm.static vgchange -a y -v ボリュームグループ名

ボリュームグループ名は以下のコマンドでわかります。

# lvm.static vgdisplay

あとは、/dev/・・・ にできるデバイスをマウントしてあげれば中身が見えます。

vncviewerで特定のポートに接続する@Linux

vncのサーバにvncviwerで接続する時に、

$ vncviewer サーバ名:ディスプレイ番号

といった風にディスプレイ番号を入力します。ディスプレイ番号はvncserverを起動した際に表示されるやつです。

$ vncserver 

New 'X' desktop is hostname:1 ← これ

Starting applications specified in /etc/X11/Xsession
Log file is /home/mazn/.vnc/hostname:1.log

これでvncserverは5900+ディスプレイ番号のTCPポートで待ちます。※すでにvncserverが立ち上がっている場合などは:2のようにインクリメントされていきます。

Debian etchの例
$ netstat --tcp -lpn | grep 5901
tcp6   0   0 :::5901       :::*      LISTEN     14372/Xrealvnc

SSHやiptablesなどを使ってvncサーバへの接続をポートフォワーディングした際、任意のポートに繋ぐ必要が出てきます。このような場合コロン二つ" :: "を使用して、任意のポートに接続できます。

例えば、ルータでポート4000がvncサーバにポートフォワーディングされている場合以下のようになります。

$ vncviewer ルータIP::4000

ちなみに、Linuxに搭載されているvncやリモートデスクトップのフロントエンドのクライアントkrdcでは、"::"を認識出来ないようです。

iptablesにてポートフォワーディングする方法はこちら

参考 :VNCのインストール

tarファイルを解凍せずに中身をみる@Linux

tarファイルの中身を見るのに、小さなファイルなら解凍して中身を展開すればよいですが、数GBもあるようなファイルだと、解凍も一苦労です。

そういう人のために、tarの中の任意のファイルだけを抽出したり、表示したりすることができます。

まず、含まれているファイルの一覧を表示するには"t"オプションを使います。tar.gz またはtgzのようにgzipで圧縮されているファイルの場合は"z"オプションもつけます。 ※ 最近のtarコマンドは、圧縮形式を自動判別してくれるため、"z" オプションは省略可能です。

# tar ztf hoge.tar.gz 
exe/
exe/foo.exe
txt/
txt/hoge.txt

"v"もつけると、ls -l のようにファイルのサイズや更新日時なども出力されます。

# tar ztf hoge.tar.gz
drwxr-xr-x root/root     0 2009-01-17 06:56 exe/
-rw-r--r-- root/root 11357 2009-01-19 07:12 exe/foo.exe
drwxr-xr-x root/root     0 2009-01-17 06:56 txt/
-rw-r--r-- root/root   334 2009-01-30 11:41 txt/hoge.txt

中身を取り出すには"x"を使います。じつはファイルを指定する以外は普通のファイルの展開と同じです。exe/foo.exe を取り出してみます。

# tar zxvf hoge.tar.gz exe/foo.exe
exe/foo.exe

テキストファイルなどの場合は取り出さずに、中身を見ることもできます。"x"と"O (オー)"を使います。

# tar zxOf hoge.tar.gz txt/hoge.txt
hogehoge
hogehoge
hogehoge

gzipやbzip2などで圧縮されている場合は使えませんが、単なるtarファイルの場合は、"r"でファイルを追加できます。--delete で削除もできます。(以下は追加の例です)

# tar rf hoge.tar abcd.txt 
# tar tf hoge.tar 
exe/
exe/foo.exe
txt/
txt/hoge.txt
abcd.txt

グループへのユーザの追加@Linux

グループへユーザを追加する方法。

# gpasswd -a user group

削除の場合

# gpasswd -d user group

グループ操作ってあまりやらないから、すぐに忘れてしまいます。

NICに複数のIPを付与する方法@Linux

1つのNICに複数のIPをつける方法の覚え書き。eth0にもう一つIP(192.168.0.2)をつける場合。

# route add -host 192.168.0.2 dev eth0:0

サーバのクラスタリング(Act-Standby)でよく使用されるので、仮想IPと呼ばれることが多いです。

システム上のユーザ一覧情報の取得

NISやLDAPなどを使用していると、きちんとと設定されているのか、誰が認証できるのかなどを知りたい時があります。こういうときは "getent" コマンドを使用します。

# getent 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
…
mazn:x:555:

このようにユーザ一覧などの情報が取得できます。これ以外にも"group" や"hosts"、"services"なども調べることができます。詳しくはmanを参照してください。

パスワードの有効期限と、アカウント有効期限@RHEL5

パスワードのデフォルト有効期限は "/etc/login.defs"で設定できます。他にも、パスワードの長さやメールスプールディレクトリなども設定できます。

ユーザのアカウント有効期限は"chage"コマンドで設定できます。

# chage -E 2008-03-15 mazn

ちなみに -Eで"1970-01-01"を指定するとロック、"1969-12-30"を指定すると解除になります。

Ctrl-Sの端末ロックを無効にする

bashではCtrl-Sを入力してしまうと端末がロックされた状態になり何も受け付けなくなります。Ctrl-Qで解除できるが、普段ロックすることないしいらいらするから、無効にする方法を調べてみた。

方法はいたって簡単で

# stty stop undef

でOK。常に有効にしたい場合は.bashrcなどにどーぞ。

Ctrl-Rはreverse-i-searchでコマンド入力履歴をさかのぼって検索できますが、たまに行き過ぎて戻りたくなることがあります。上記の設定でCtrl-Sのロックを無効にすることでi-searchができるようになり、戻ることができます。

ちなみに、Ctrl-Cで実行中のプログラムを止めるのもこのsttyで無効にできます。どのような機能が定義されているかは"stty -a"コマンドでわかります。

$ stty -a
speed 38400 baud; rows 50; columns 127; line = 0;
intr = ^C; quit = ^\; erase = ^H; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q;
stop = <undef>; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt -echoctl -echoke

各単語の意味は以下の通り。

intr   割り込み (interrupt) シグナルを送る。
quit   終了 (quit) シグナルを送る。
erase  最後にタイプされた文字を消去する。
kill   現在の行を消去する。
eof    ファイル終了 (end of file) を知らせる (入力を終了する)。
eol    行末 (end of the line)。
eol2 (np)
       行末を表す別の文字
swtch (np)
       別のシェル層 (shell layer) にスイッチする。
start  停止している出力を再開する。
stop   出力を停止する。
susp   端末に停止 (stop) シグナルを送る。
dsusp (np)
       入力をフラッシュしてから端末に停止 (stop) シグナルを送る。
rprnt (np)
       現在の行を再表示する。
werase (np)
       最後にタイプされた単語 (word) を消去する。
lnext (np)
       次にタイプされる文字を (特殊文字であっても) そのままの文字として受け取る。

2009/11/2 追記

上記設定が原因のようで、上記サーバに対して、scpコマンドでファイルをコピーすると標準入力が不正という旨のエラーが発生しました。

LinuxでWindowsのように休止状態を使用する@Debian etch

etchからは正常に休止(hibernate s4)が使用できるようです。

# atp-get install hibernate
# vi /etc/initramfs-tools/conf.d/resume

このファイルに以下のようにSWAPパーティションを記述します。

RESUME=/dev/hda3

あと、カーネルオプションも必要かもしれません。

# vi /boot/grub/menu.list
~省略~
kernel          /boot/vmlinuz-2.6.18-4-686 root=/dev/hda4 ro resume=/dev/hda3
~省略~

休止状態を実行

# hibernate-disk

以下のディレクトリに参考のドキュメントがあります。 usr/share/doc/hibernate/*

電源ボタンで休止状態に移行

電源ボタンを押したときのイベントで休止状態に移行する方法です。

# vi /etc/acpi/events/powerbtn

以下の2行のコメントアウトをはずす

event=button[ /]power
action=/etc/acpi/powerbtn.sh

デフォルトでは、電源ボタンを押すと、シャットダウンされてしまうので、以下のように ファイルを編集

# vi /etc/acpi/powerbtn.sh

既存の行をすべてコメントアウトし、hibernate-diskを実行するようにする

#if pidof powersaved; then
#    exit 0
#fi
#
#if ps -Af | grep -q '[k]desktop' && test -f /usr/bin/dcop
#then
#    dcop --all-sessions --all-users ksmserver ksmserver logout 0 2 0 && exit 0
#else
#    /sbin/shutdown -h now "Power button pressed"
#fi

/usr/sbin/hibernate-disk

coreファイルの扱いについて

coreを吐かせるにはulimitで制限されていない必要がある

# ulimit -c unlimited

強制的にプロセスにcoreを吐かせる方法

# kill -SIGSEGV PID番号

coreファイルが上書きされないようにcoreのファイル名にPIDをつける方法

# echo "1" > /proc/sys/kernel/core_uses_pid

coreの吐き出し先はカレントディレクトリで、以下のようにして知ることができる

# ls -l /proc/{PID}/cwd
このブログについて
プライバシーポリシー・お問い合わせ等
購読する(RSS)
記事検索
アーカイブ
カテゴリー
  • ライブドアブログ