トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

Linux メモ

一部の情報は非常に古いもの(20年以上前〜)ですので、利用する際はご注意ください(Java 1.4 とか .NET 1.0 とか、Windows 2000 とか)
お問い合せは wiki@shise.net まで。Gmail に転送されるので、スパムは全部カットされます。


 


スクリプト

ファイルサイズが0のファイルを消す

/var/log/hoge/ 以下にあるファイルでファイルサイズがゼロの空っぽのファイルを削除する。

/bin/sh -c 'cd /var/log/hoge/; for f in `ls`; do if [ ! -s "$f" ]; then rm -rf "$f"; fi;  done;'


ディストリビュージョン

 CentOS

http://www.centos.org/
Download のとこからバージョンを指定して落とす

日本語OK、UTF-8っぽい、CD 4枚、RedHatと兄弟的な感じ。
アプリのインストールとかは yum

 VineLinux

http://www.vinelinux.org/

日本語OK、EUCっぽい、CD 1枚
アプリのインストールは apt-get

 Ubuntu

http://www.ubuntulinux.jp/
ダウンロードは、Bittrentを使って落としたほうがよさげ。

日本語OK、UTF-8?、CD 1枚
アプリのインストールは apt-get
一般ユーザーで遊んでると、管理者権限で実行する sudo コマンドを連発する必要性が出てくる。

apache

 ファイル一覧のカスタマイズ

詳細はこちら
http://smdn.invisiblefulmoon.net/index.php?cmd=read&page=Linux%2FFedora%20Core%2FApache

ReadmeName /footer.html
HeaderHame /header.html

Apache 1.3系でやってみた。
SuppressHTMLPreamble は、IndexOptions の所で、一番左に書いたほうが良い?
この項目は、IfModule mod_autoindex.c の中に、既に書き込んであった。
vi で開いてるときに /ReadmeName って入力すれば検索できるはず。

その他

 libXm.so.3

openmotif-2.2.3-10.RHEL4.5.i386.rpm

http://linuxsoft.cern.ch/cern/slc44/i386/SL/RPMS/

Ubuntu Server で、キーボードマッピングが変

Ubuntu Server を VMware 上に入れたが、なんかキーボードマッピングが変なので、調べたら以下のコマンドが出てきたので、メモ

sudo aptitude install console-data

>Select keymap from arch list
>qwerty
>Japanese
>PC110 or Standard


Ubuntu Server で root のパスワードが分からない

どうやら、設定されて無い?らしい。
以下のコマンドで、root の設定をする。
> sudo passwd root

password ではなく passwd なので注意



VMware 上に Ubuntu server を入れて、VMware Tools を入れたときのメモ。

なお、XAMPP を利用する予定なので、LAMPは入れない。
とりあえず、Linux に関しては、初心者同様なので、詳しいことは分かっていない。

ubuntu の CD をマウントしておく。

mount /dev/cdrom /media/cdrom

apt-get install make
apt-get install gcc
apt-get install linux-headers

ここで、適切なものを選ぶ。
自分は、ubuntu server を入れたので、server のヘッダを選んだ。

umount /media/cdrom

VMware Tools のインストールを開始する。

mount /dev/cdrom /media/cdrom
mkdir /tmp/vmware
tar zxvf VMwareTools-3.0.1-23039.tar.gz -C /tmp/vmware
/tmp/vmware/vmware-tools-distrib/vmware-install.pl

なんか、いろいろ聞かれるが、適当に答える。

linux header のパスは、俺の場合、ubuntu server を入れたので、

/usr/src/linux-headers-2.6.20-15-server

と、入力した。


/usr/bin/vmware-config-tools.pl

はいはい、わろすわろす、って答えとけば、インストール完了。

RPM の依存関係を、まとめてコピー?


必要最低限の RPM を集めるために、楽をしようと思って書いた Perl スクリプト。
まだ、テスト段階で実践では使ってないけど、一応メモ。

#!/usr/bin/perl

# RPM のありか
$rpmin = "/media/cdrom/RedHat/RPMS/";

# チェック&コピー先。ここに依存関係を調べたい RPM を投げ込む
$rpmout = "/tmp/RedHat/";

# 依存関係データベースのディレクトリ
$dbpath = "/tmp/testdb/";


if (!-d $dbpath){
    system("mkdir -p $dbpath");
    system("rpm --initdb --dbpath $dbpath");
    print "init db\n";
}
if (!-d $rpmout){
    system("mkdir -p $rpmout");
    print "init rpm out\n";
}

print "test start\n\n";

do
{
    # 依存関係を調査
    open(IN, "rpm --test --dbpath $dbpath -Uvh $rpmout*.rpm 2>&1 |");
    
    $reso = 0;
    
    while (<IN>)
    {
        # コピーコマンドを叩く
        if($reso == 1)
        {
            $t = trim($_);
            $f = "cp $rpmin$t $rpmout";
            system($f);
            print "copy $t \n";
        }
        
        # 依存関係パッケージが列挙されはじめたら1
        if($_ =~ /Suggested/)
        {
            print "------\n";
            $reso = 1;
        }
    }

}while($reso == 1);

close(IN);

print "------\n";

# どんだけの容量になったか表示
system("du -hs $rpmout");
print "\n";



# どっかからコピって来たトリム関数
sub trim
{
    my @out = @_;
    for (@out){
        s/^\s+//;
        s/\s+$//;
    }
    return wantarray ? @out : $out[0];
}

カーネル再構築のアレ


http://pooh.gr.jp/item-2250.html

ここからコピーした。

毎回、「あれー?ファイル名なんだっけー」とか、i386 i686 に書き換え忘れたりしないようにメモ。

yum -y install gcc rpm-build redhat-rpm-config ncurses-devel
wget http://mirrors.kernel.org/centos/4.6/updates/SRPMS/kernel-2.6.9-67.0.7.EL.src.rpm
mkdir -p /usr/src/redhat/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
rpm -i kernel-2.6.9-67.0.7.EL.src.rpm
cd /usr/src/redhat/SPECS/
rpmbuild -bp --target=i686 kernel-2.6.spec

cd ../BUILD/kernel-2.6.9/linux-2.6.9/

	vi include/asm-i386/param.h
	vi include/asm-x86_64/param.h

	+# define HZ            100

	vi Makefile

	+EXTRAVERSION = -67.0.7.EL.vm

	+export INSTALL_PATH=/boot

make mrproper
cp configs/kernel-2.6.9-i686.config .config
make oldconfig
make
make modules_install
installkernel 2.6.9-67.0.7.EL.vm arch/i686/boot/bzImage System.map

vi /etc/grub.conf
	+default=0

VMware 上でやってる場合は、以下のコマンドをたたいておくと、幸せになれるかも。

vmware-config-tools.pl

カーネル再構築を自動化したい…

#!/bin/sh


url=http://mirrors.kernel.org/centos/4.6/updates/SRPMS/

echo get url ...
rpm=`wget $url -O - -q | grep 'kernel-' | sed -e 's/<a.*>\(.*\)<\/a>.*/\1/g' | tail -n 1`
echo $url$rpm


echo get rpm ...
wget $url$rpm -q


echo make dir
mkdir -p /usr/src/redhat/{BUILD,RPMS,SOURCES,SPECS,SRPMS}


echo install rpm
rpm -i $rpm


cd /usr/src/redhat/SPECS/
rpmbuild -bp --target=i686 kernel-2.6.spec
cd ../BUILD/kernel-2.6.9/linux-2.6.9/

まだ途中。
あとでやる。


と、思ったが、

VMware Server 2.0 からは、時計がずれなくなったみたい。
やっほい!

RDesktop のコンパイルとか。

CentOS で、新しい環境を作るたびに、
何のパッケージいるんだっけ?
となるので、メモ。

yum -y install gcc xorg-x11-devel openssl-devel
tar zxvf rdesktop-N.N.N.tar.gz
cd rdesktop*
./configure
make
make install

indent

こぴぺ

indent -br -ce -npcs -ut -i8 tmp.c -o tmp2.c

解像度こぴぺ

http://www.redoubt.com/TZICT/cookbook/solaris-vmware-install.html
あれ?ソラリス?

Fix screen resolution 
In the following, substitute your native monitor resolution for 1440x900 in the italicized parts, and set the values which follow to then next even mutiple of 100 (don't know why this works but it seems to).

backup /etc/X11/xorg.conf 
edit /etc/X11/xorg.conf 
in Section "Monitor" Identifier "vmware", add: 
ModeLine "1440x900" 100 1440 1500 1600 1700 900 1000 1100 1200
in Section Screen, add 1440x900 "Display" Subsections (depth 24), and remove all other "Display" Subsections except VGA 
after boot, screen may be wrong; right-click, choose correct setting 

SSHキーとか、いい感じにコピペするスクリプト

#! /bin/sh


### help
if [ -z "$1" ]; then
        echo "usage: $0 <ip_address>"
        exit
fi


### key gen
if [ ! -r ~/.ssh/id_rsa ];then
        mkdir -p ~/.ssh/ > /dev/null 2>&1
        touch ~/.ssh/authorized_keys > /dev/null 2>&1
        chmod -R 700 ~/.ssh/ > /dev/null 2>&1
        echo 'n' | ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa > /dev/null 2>&1
fi

### put key
cat ~/.ssh/id_rsa.pub | ssh $1 '
if [ ! -r ~/.ssh/id_rsa ];then
        mkdir -p ~/.ssh/ > /dev/null 2>&1
        touch ~/.ssh/authorized_keys > /dev/null 2>&1
        chmod -R 700 ~/.ssh/ > /dev/null 2>&1
        echo "n" | ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa > /dev/null 2>&1
fi

cat >> ~/.ssh/authorized_keys
cat ~/.ssh/id_rsa.pub

KEYS=`cat ~/.ssh/authorized_keys | sort | uniq`
echo "$KEYS" > ~/.ssh/authorized_keys
' >> ~/.ssh/authorized_keys

### sort key
KEYS=`cat ~/.ssh/authorized_keys | sort | uniq`
echo "$KEYS" > ~/.ssh/authorized_keys

### get my ip
CLIENTIP=`ssh $1 "echo \\\${SSH_CLIENT} | awk -F: '{print \\\$4};' | awk -F\\\\  '{print \\\$1};'"`
HOSTNAME=`hostname`

### put hostkey
cat /etc/ssh/ssh_host_rsa_key.pub | ssh $1 "
HOSTKEY=\`cat\`
if [ ! -r ~/.ssh/known_hosts ]; then
        touch ~/.ssh/known_hosts
fi
if [ -z \"\`grep \"$CLIENTIP \$HOSTKEY\" ~/.ssh/known_hosts\`\" ]; then
        echo \"$CLIENTIP \$HOSTKEY\" >> ~/.ssh/known_hosts
fi
if [ -z \"\`grep \"$HOSTNAME \$HOSTKEY\" ~/.ssh/known_hosts\`\" ]; then
        echo \"$HOSTNAME \$HOSTKEY\" >> ~/.ssh/known_hosts
fi
#if [ -z \"\`grep \"$CLIENTIP	$HOSTNAME\" /etc/hosts\`\" ]; then
#        echo \"$CLIENTIP	$HOSTNAME\" >> /etc/hosts
#fi
"

echo "finish"

使い方は、

./ssh-copy.sh 192.168.199.10

みたいな具合に、SSHのキーをコピーしたい相手のIPを指定するだけ。
初回は、相手のパスワードが聞かれる。

一時的なメモ

ポート転送

iptables -t nat -A PREROUTING -p tcp --dport 443 -i eth0 -j DNAT --to 192.168.3.23:443
iptables -A FORWARD -d 192.168.3.23 -p tcp --doprt 443 -j ACCEPT

root の crontab で Postgres の VACUUM 実行

* * * * * /bin/su - postgres -c "PGPASSWORD=drupal psql -U drupal -c 'VACUUM;'" > /dev/null
* * * * * /bin/su - postgres -c "PGPASSWORD=drupal psql -U drupal -c 'VACUUM FULL ANALYZE;'" > /dev/null

バックアップすりぷと

諸事情により、このスクリプトは・・・動作しません。

#!/bin/sh

# setting
PREFIX="prefix"
PATH="/filepath/"
COUNT=30

FILE=$PREFIX"_`/bin/date '+%F_%H-%M-%S'`.tar"


#
pushd $PATH
/bin/tar cvf $FILE html --exclude '*.log' > /dev/null 2>&1

NEW_MD5=`/usr/bin/md5sum $FILE  | /bin/awk -F' ' '{print \$1}'`
OLD_MD5=`/bin/cat hash.log 2> /dev/null`

echo "NEW $NEW_MD5"
echo "OLD $OLD_MD5"

if [ "$NEW_MD5" != "$OLD_MD5" ]; then
        echo "$NEW_MD5" > hash.log
else
        echo "NOT MODIFY"
        /bin/rm -f "$FILE"
fi

if [ `/bin/ls -l $PREFIX*tar 2> /dev/null | /usr/bin/wc -l` -gt $COUNT ]; then
        RMFILE="`/bin/ls $PREFIX*tar | /bin/sort | /usr/bin/head -n 1`"
        echo "DELETE OLD  $RMFILE"
        /bin/rm -f $RMFILE
fi

popd


とりあえずホスト名変更


かなり適当すぎるホスト名変更スクリプト

#!/bin/sh

NEWNAME="$1"
if [ -z "$NEWNAME" ]; then
	echo "Usage $0 <new hostname>"
	exit;
fi

NEWHOSTNAME=`cat /etc/sysconfig/network | sed "s/HOSTNAME=.*/HOSTNAME=$NEWNAME/"`
echo "$NEWHOSTNAME" > /etc/sysconfig/network_new
mv --backup=simple -f /etc/sysconfig/network{_new,}

NEWHOSTS=`cat /etc/hosts | sed "s/127\.0\.0\.1\t*\($NEWNAME\)* */127.0.0.1		$NEWNAME /"`
echo "$NEWHOSTS" > /etc/hosts_new
mv --backup=simple -f /etc/hosts{_new,}

ver 2

#!/bin/sh


# get new name
NEWFULLNAME="$1"
if [ -z "$NEWFULLNAME" ]; then
    echo "Usage $0 <new_hostname.new_domainname>"
    exit;
fi
NEWNAME=`echo $NEWFULLNAME | sed 's/\..*//g'`

if [ "$NEWFULLNAME" = "$NEWNAME" ]; then
    NEWFULLNAME="$NEWNAME.localdomain"
fi


# get name
FULLNAME=`hostname`
NAME=`hostname | sed 's/\..*//g'`


# replace hostname
NEWHOSTNAME=`cat /etc/sysconfig/network | sed "s/HOSTNAME=.*/HOSTNAME=$NEWFULLNAME/"`
echo "$NEWHOSTNAME" > /etc/sysconfig/network_new
echo "/etc/sysconfig/network"
cat /etc/sysconfig/network_new
mv --backup=simple -f /etc/sysconfig/network{_new,}


# replace hosts
if [ "$NAME" = "localhost" ]; then
    NEWHOSTS="`cat /etc/hosts`"
    NEWHOSTS="`echo \"$NEWHOSTS\" | sed \"s/127\.0\.0\.1\t*/127.0.0.1       $NEWFULLNAME $NEWNAME /\"`"
else
    NEWHOSTS="`cat /etc/hosts`"
    NEWHOSTS="`echo \"$NEWHOSTS\" | sed \"s/$FULLNAME/$NEWFULLNAME/\"`"
    NEWHOSTS="`echo \"$NEWHOSTS\" | sed \"s/$NAME/$NEWNAME/\"`"
fi
echo "$NEWHOSTS" > /etc/hosts_new
echo "/etc/hosts"
cat /etc/hosts_new
mv --backup=simple -f /etc/hosts{_new,}


# end
echo "Please restart network."

CentOS 5.2 を入れて yum を叩いたらエラー


CentOS 5.2 を入れて、

yum -y update

と入力すると・・・

[Errno -1] Metadata file does not match checksum
Trying other mirror.

というエラーが大量に出て、結局アップデート出来なかった。

 

原因不明で、ググッたけど良く分からず。
yum のオプションを見てみると、clear というオプションが使えるらしい。
そこで

yum clear all

とすると、あら不思議。
yum でアップデートが出来るようになった。


何故かは分からないが、無事解決。

ファイル名をmd5ハッシュに変更

md5mv(){ EXT=${1##*.}; NN=`md5sum $1 | awk -F' ' '{print $1}'`; mv $1 $NN.$EXT; }
for n in *.bmp; do md5mv $n; done



いつもやる CentOS の設定


メモリ256くらい
NIC2枚
ホストオンリー
NAT

OpenOffice とか外す
GUI とかもイラネ
ベースのみでインストール

yum -y update
reboot

vim 入れる
.bashrc に alias で vi=vim
source .bashrc

vi /etc/sysconfig/network-script/ifcfg-eth1 (NAT側)
boot=no

/etc/ssh/sshd_config
で、Dns なんちゃらを no に

キーを .ssh/authorized_keys に登録
chmod 600 .ssh -R


うっさい Beep を止める
vi /etc/inputrc
set bell-style none


[VMware Tools]
mkdir /media/cdrom
mount /dev/cdrom /media/cdrom

rpm -ivh VMWar....rpm
vmware-config-tools.pl
okok

 クローン後、ホスト名変更


vi /etc/hosts
127.0.0.1 hogehoge localhost

vi /etc/sysconfig/network
hostname=hogehoge


reboot


  履歴をたくさん残す設定

vi .bashrc

以下を追記

HISTSIZE=100000
HISTFILESIZE=100000
HISTTIMEFORMAT='%F %T '
HISTIGNORE='ls:pwd:ll:history'

今すぐ適用するには以下のコマンド

source .bashrc

 コマンドの履歴を消す

コンソール上で以下のコマンドをたたくと、履歴が全部消える

export HISTSIZE=0

パスワードなんかの文字列を非表示で入力してもらうシェルスクリプト


echo -n "Root Password : "
stty -echo
read PASS
stty echo
echo

これで、画面上には表示されないパスワード入力が出来る。

LVM でディスクの追加


ディスクを追加したあと、マシンを起動すると認識される。

fdisk -l
df -h
fdisk -l
fdisk /dev/sdc
	Command (m for help): n
	Command action p
	Partition number (1-4): 1
	First cylinder (1-79780, default 1):
	Last cylinder or +size or +sizeM or +sizeK (1-79780, default 79780):
	Command (m for help): t
	Hex code (type L to list codes): 8e
	Command (m for help): p
	Command (m for help): w
	
vgdisplay -v
ll /dev/sdc*
pvcreate /dev/sdc1
pvscan
vgextend VolGroup00 /dev/sdc1
vgdisplay -v
lvextend -L+15G /dev/VolGroup00/LogVol00
resize2fs /dev/VolGroup00/LogVol00
pvscan
df -h

Windows のフォルダをマウント


昔は smbmount とかでマウントした気がしたんだけど、
最近の CentOS では見かけないのでいろいろ調べたら mount -t cifs というのを使うらしい。
ちゃんとマウントできたのでメモ。

# CentOS 5.6 -> Windows XP SP3
mount -t cifs //192.168.XX.XX/data /mnt/data -o username=guest,password=,uid=root,gid=root,codepage=cp932,iocharset=utf8

コードページと IO Charset を指定しないと、日本語が文字化けしまくった。


ISO ファイルのマウント


ISO ファイルをマウント

mkdir /mnt/iso
mount -t iso9660 -o loop /root/hoge.iso /mnt/iso