Memo/Linux

http://dexlab.net/pukiwiki/index.php?Memo/Linux
 

Linux


swapを使っているプロセスを探す

  • CentOS 6.x
  • swapを使っているプロセスの上位10件
    1. getent passwd postfix
    2. postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    3.  
    4. # HOMEの取得
    5. getent passwd postfix | cut -f6 -d:
    6. /var/spool/postfix
    7.  
    8. # SHELLの取得
    9. getent passwd postfix | cut -f7 -d:
    10. /sbin/nologin

パッケージ更新後に再起動が必要なプロセスを探す


sudo時の補完を有効にする

  1. # 有効化
  2. shopt -s dotglob
  3.  
  4. # 無効化
  5. shopt -u dotglob

/etc/passwdからユーザ情報(HOME/SHELL等)の取得

  • getentを使う
    1. ps -eo comm,user:32,rss h | grep -P "postmaster\s+postgres\s+" | awk '{sum+=$3} END {print sum}'
    2. 15832 # KB
  • user, groupは「id」コマンドが便利

ドットから始まるファイルをコピー/移動

通常「cp src/* dest/」としても、ドットから始まるファイル/ディレクトリは対象外になる

  • ドットから始まるファイル/ディレクトリを含める
    1. pgrep -U postgres postmaster | xargs -i sudo grep -i pss /proc/{}/smaps | awk '{sum+=$2}  END {print sum}'
    2. 5483 # kB

プロセス毎のUSS,PSS,RSSを確認

  • プロセス毎のメモリ
    • VSS(VSZ): 仮想メモリの使用量
    • RSS: 物理メモリの使用量(共有メモリの使用量を含める) 多数のプロセスで共有メモリをシェアしている場合、RSSの合計は物理メモリを超えてしまう。
    • PSS: 物理メモリの使用量(共有メモリの使用量をプロセス間で等分する)
    • USS: 物理メモリの使用量(共有メモリの使用量を除く)
  • 例:psコマンドでのpostgresqlのRSSの合計値
    1. pmap --version
    2. pmap (procps version 3.2.8)
    3.  
    4. sudo pmap -x 13025
    5.  
    6. 13025:   /usr/bin/postmaster -p 5432 -D /var/lib/pgsql/data
    7. Address           Kbytes     RSS   Dirty Mode   Mapping
    8. 0000000000400000    4492     816       0 r-x--  postgres
    9. ...
    10. ----------------  ------  ------  ------
    11. total kB          220728    6688    3300
  • /proc/ファイルからPSSを合計
    1. sudo yum install smem --enablerepo=epel
    2.  
    3. sudo smem -P postmaster -U postgres -t
    4.   PID User     Command                         Swap      USS      PSS      RSS
    5. 13031 postgres postgres: logger process           0      140      309     1548 
    6. 13036 postgres postgres: wal writer proces        0      152      338     1732 
    7. 13038 postgres postgres: stats collector p        0      184      377     1780 
    8. 13035 postgres postgres: writer process           0      172      474     2004 
    9. 13037 postgres postgres: autovacuum launch        0      276      519     2080 
    10. 13025 postgres /usr/bin/postmaster -p 5432        0     2804     3483     6688 
    11. -------------------------------------------------------------------------------
    12.     6 1                                           0     3728     5500    15832
  • pmap: 3.2.8ではPSSは表示されなかった
    1. less /usr/share/doc/initscripts-9.03.31/sysvinitfiles
  • smem memory reporting tool
    • 単位: KB
    • 合計: -t
    • ヘッダ行無し: -H
      1. LANG=C ll /usr/share/doc/ | grep zabbix
      2. drwxr-xr-x  2 root root 4096 Dec  9 18:09 zabbix-agent-3.0.5
      3. drwxr-xr-x  2 root root 4096 Dec  9 18:09 zabbix-get-3.0.5
      4. drwxr-xr-x  2 root root 4096 Dec  9 18:10 zabbix-sender-3.0.5
      5. drwxr-xr-x  2 root root 4096 Dec  9 18:09 zabbix-server-mysql-3.0.5
      6. drwxr-xr-x  2 root root 4096 Dec  9 18:09 zabbix-web-3.0.5

プロセスのデーモン化

  • RedHat?/CentOS
    • /etc/init.d/functions に定義している関数「daemon」「killproc」「status」が肝心
    • CentOS6: ドキュメント
      1. cd /usr/share/doc/zabbix-*-mysql*
      2.  
      3. pwd
      4. /usr/share/doc/zabbix-server-mysql-3.0.5

GNU parallel コマンドの並列実行


ディレクトリ移動時にワイルドカードを使う

  • 以下のようなディレクトリ構成
    1. mkdir -p ~/.Trash
    2. echo "alias rm='find ~/.Trash/* -type f -mtime +30 -delete -o -empty -type d -delete;mv -f --backup=numbered --target-directory ~/.Trash/'" >> ~/.bashrc
    3. source ~/.bashrc
  • zabbix-server-mysql-3.0.5 に移動したいが、プログラム中にはバージョン番号を入れたくない場合、ワイルドカードが使える
    1. cp --parents /etc/hosts /tmp/
    2.  
    3. tree /tmp/etc/
    4. /tmp/etc/
    5. └── hosts

HDD廃棄時のデータ削除

HDDを廃棄する時に安全に削除を行うツール


rmコマンドでゴミ箱に入れる

"rm -rf /" や "rm .*" 等の事故を防ぎたい。

  • ファイル/ディレクトリを直接削除するのではなく一度ごみ箱「~/.Trash/」に入れるようにする
  • ゴミ箱中の同名ファイル/ディレクトリはファイル名末尾に「.~1~」のように番号が付く
  • 30日より前のファイルは削除
  • aliasではないrmを実行したい場合は「\rm」のようにする
    • CentOS 6.x:
      1. sudo sshd -T | sort

NetworkManager?

/etc/resolv.confの自動書き換え停止するために、NetworkManager?を止めていたが割と便利そう


ディレクトリ構造を維持してコピー

  1. sudo sshd -T -f ./sshd_config

sshdの設定を確認する

  • 現在の設定を確認
    1. cat file1
    2. aaa
    3. bbb
    4.  
    5. cat file2
    6. bbb
    7. ccc
    8.  
    9. grep -x -i -f file1 file2
    10. bbb
  • 任意の設定ファイルを指定してテスト
    1. rpm -q nss-softokn
    2. nss-softokn-3.14.3-23.el6_7.x86_64

2つのテキストファイルの共通行だけ抽出

  1. sync; echo 2 > /proc/sys/vm/drop_caches

vuls: CVE脆弱性チェックツール


slabメモリ使用量が肥大しメモリ不足になる

curl(libcurl)で定期的にhttps://リクエストを発行するようなサーバでメモリ不足になる。
topでみても怪しげなプロセスは無い。
「slabtop」で見るとdentryが異常にメモリを使っている。

  • 環境
    • CentOS 6.x 64bit
  • 対策
    • slabキャッシュ解放
      1. export NSS_SDB_USE_CACHE=yes
      2. # または
      3. export TMPDIR=/dev/shm
    • curl, nssの更新
      1. # curl実行後 dentunusd が大きく増えている事を確認
      2. sar -v 1
      3. 105021秒 dentunusd   file-nr  inode-nr    pty-nr
      4. 105022秒     42860       768     27417        10
      5. 105023秒     42860       768     27417        10
      6. ...
      7.  
      8. strace -fc -e trace=access curl -s 'https://www.google.com' > /dev/null
      9. % time     seconds  usecs/call     calls    errors syscall
      10. ------ ----------- ----------- --------- --------- ----------------
      11. 100.00    0.000056           0      4505      4503 access
      12. ------ ----------- ----------- --------- --------- ----------------
      13. 100.00    0.000056                  4505      4503 total
    • curlを実行するスクリプトに追加。2択
      1. export NSS_SDB_USE_CACHE=yes
      2. strace -fc -e trace=access curl -s 'https://www.google.com' > /dev/null
      3. % time     seconds  usecs/call     calls    errors syscall
      4. ------ ----------- ----------- --------- --------- ----------------
      5.   0.00    0.000000           0        23        21 access
      6. ------ ----------- ----------- --------- --------- ----------------
      7. 100.00    0.000000                    23        21 total
  • 対策前:
    1. for srv in abrtd abrt-ccpp abrt-oops abrt-dbus;do sudo service $srv stop;sudo chkconfig $srv off; done
    2.  
    3. sudo chkconfig --list | grep abrt
    4. abrt-ccpp       0:off   1:off   2:off   3:off   4:off   5:off   6:off
    5. abrt-oops       0:off   1:off   2:off   3:off   4:off   5:off   6:off
    6. abrtd           0:off   1:off   2:off   3:off   4:off   5:off   6:off
  • 対策後:
    1. echo -e "1:foo\n2:var" >> tmp.txt
    2. sed -i -e "1i 1:hoge" tmp.txt
    3. cat tmp.txt
    4. 1:hoge
    5. 1:foo
    6. 2:var

abrtd:コアダンプした時にiowaitが高くなる/コアダンプファイルが消える

CentOS6/7だと abrtd が起動しており、設定によってはコアダンプした後にすぐ消すようだ。
コアダンプ対象のプロセスのメモリ使用量が大きいと、数GBのファイルを作った後に消すという無駄な処理のため、iowaitが高くなる場合がある。

  • 不要な場合は停止
    1. rename .htm .html *.htm

先頭行/任意の行に追加

  • "1i" で1行目を指定して追加する。
    1. sudo blkid
    2. /dev/sda1: UUID="b599d616-e521-449f-89a0-7f838614bc56" TYPE="ext2"
    3. /dev/sda5: UUID="HOiXD0-6j1h-Q3up-Et62-fvHk-mPIr-Ynglet" TYPE="LVM2_member"
    4. /dev/mapper/mediacenter-root: UUID="e0aeadc6-742f-42b4-b0e4-de4ecd6f5abd" TYPE="ext4"
    5. /dev/mapper/mediacenter-swap_1: UUID="9874055b-0ddc-4910-a319-fc3c1e20ab81" TYPE="swap"
    6.  
    7. # デバイスを指定して調べる
    8. sudo blkid /dev/sda1
    9. /dev/sda1: UUID="b599d616-e521-449f-89a0-7f838614bc56" TYPE="ext2"

rename: ファイル名の一括変更

  • 「*.htm」のファイルを「.htm」から「.html」に名前を変更する
    1. proc            /proc           proc    nodev,noexec,nosuid 0       0
    2. UUID=e0aeadc6-742f-42b4-b0e4-de4ecd6f5abd /               ext4    errors=remount-ro 0       1
    3. UUID=b599d616-e521-449f-89a0-7f838614bc56 /boot           ext2    defaults        0       2
    4. UUID=9874055b-0ddc-4910-a319-fc3c1e20ab81 none            swap    sw              0       0

デバイスのUUIDを調べる

HDD入れ替え等でfstabを書く際に、デバイスの接続順が変わっても、明示的にドライブを指定できる。

  • blkidを使う
    1. sudo usermod -G wheel user01
    2. # または
    3. sudo gpasswd -a user01 wheel
    4.  
    5. id user01
    6. uid=501(user01) gid=501(user01) groups=501(user01),10(wheel)
  • 例:/etc/fstab (Ubuntu 12.04 LTS)
    1. sudo gpasswd -d user01 wheel

ユーザをサブグループに追加

  • user01をwheelグループへ追加。usermod の場合、'a'が無いとプライマリグループの変更になる。
    1. sudo mount -fav
  • 「/etc/group-」は1世代前のバックアップなので間違ってusermod -Gした場合は復元できる。
  • user01をwheelグループから削除
    1. nc -zv www.example.com 80;echo $?
    2. Connection to www.example.com 80 port [tcp/http] succeeded!
    3. 0

/etc/fstabの構文チェック

  1. wget -O peco_linux_amd64.tar.gz https://github.com/peco/peco/releases/download/v0.3.2/peco_linux_amd64.tar.gz
  2. sudo tar xvfz peco_linux_amd64.tar.gz
  3. sudo mv peco_linux_amd64/peco /usr/local/bin/
  4. sudo chmod 755 /usr/local/bin/peco

Linuxコマンドの色付け


ポート解放確認

  • ncを使う
    • CentOS 6.x: 「-w 3」で3秒でタイムアウト
      1. ls | peco
    • CentOS 7: ncがncatのエイリアスに変わったため、「-z」オプションが使えなくなった
      1. chage -l <username>
  • サーバ側のListenも可能: 例:tcp/10080
    1. sudo chage -M 90 <username>

プロセス監視と自動再起動

  • cron等で一定時間の監視を行い、落ちていたら再起動するスクリプト

ネットワーク帯域制限


peco : 標準入力からの行をインクリメンタルサーチ

標準入力の行をCUIでインクリメンタルサーチし、選択した行を標準出力に返すコマンド

  • ターミナルの改行コードをCR+LFにする必要があった。Poderosa+改行コードLFだと、Enter押しても選択されない
  • CentOS6.x
    1. sudo chage -I -1 -m 0 -M 99999 -E -1 <username>
  • 例: lsの中から選択
    1. sudo -u zabbixsrv env | grep HOME
    2. HOME=/root

パスワード有効期限の設定

  • 現在の設定を確認
    1. sudo -u zabbixsrv env | grep HOME
    2. HOME=/var/lib/zabbixsrv
  • 90日にしたい場合
    1. sudo visudo
    2. ----
    3. Defaults    always_set_home
    4. ----
  • 有効期限設定の解除
    1. sudo yum install colordiff --enablerepo=epel
    2.  
    3. vi ~/.bash_profile
    4. ----
    5. if $(type colordiff > /dev/null 2>&1);then
    6.   alias diff='colordiff -u'
    7. else
    8.   alias diff='diff -u'
    9. fi
    10. ----
    11. source ~/.bash_profile

sudoした時に環境変数が変わらない場合

sudo -u した場合、OSのバージョンによってユーザの環境変数が変わらない部分がある

  • CentOS 5.8の場合
    1. sudo aptitude install colordiff
  • CentOS 6.3の場合
    1. ulimit -a | grep core
    2. core file size          (blocks, -c) 0
  • CentOS5でもユーザのHOMEになるように修正
    1. sudo cat /proc/$(pidof mysqld)/limits

diffに色付け

  • colordiffを使う
  • CentOS6
    1. # 1GB
    2. ulimit -c 1000000
    3. # 無制限
    4. ulimit -c unlimited
  • Ubuntu 12.04 LTS
    1. cat /proc/sys/kernel/core_pattern
    2. core
    3.  
    4. # 例:/tmp/core
    5. echo /tmp/core > /proc/sys/kernel/core_pattern
    6.  
    7. # 例:/tmp/core.<%e:実行ファイル名>.<%p:PID>.<%u:UID>
    8. echo /tmp/core.%e.%p.%u > /proc/sys/kernel/core_pattern

core dump コアダンプを出力

  • CentOS6.xの場合デフォルトではcoreファイルは出力されない
    1. vim /etc/security/limits.conf
    2. ----
    3. *               soft    core            unlimited
    4. ----
    5.  
    6. echo -e "kernel.core_pattern = /tmp/core.%e.%p.%u\nfs.suid_dumpable = 2" >> /etc/sysctl.conf
    7. echo "DAEMON_COREFILE_LIMIT=unlimited" >> /etc/sysconfig/init
    8.  
    9. sysctl -p
    10.  
    11. # daemonの再起動またはホストの再起動
    12. service <daemon> restart
  • プロセス毎のlimitsを確認
    1. cp /usr/share/doc/bash-3.2/scripts/timeout /usr/local/bin/
    2. chmod 755 /usr/local/bin/timeout    
  • 一時的に有効にする場合。ユーザ/セッション毎なのでログアウトしたら元に戻る
    1. sudo timeout 3 tail -f /var/log/messages
  • coreファイルの出力場所。デフォルトでは /core
    1. timeout 1 sleep 5;echo $?
    2. 124
  • デーモン含め、恒久的に有効にする場合
    1. wget http://swiftsignal.com/packages/centos/6/$(uname -i)/the-silver-searcher-0.14-1.el6.x86_64.rpm
    2. sudo yum localinstall the-silver-searcher-0.14-1.el6.x86_64.rpm

nscd: DNSキャッシュ

  • nscdが動作している場合、/etc/nsswitch.conf を変更しても設定が変わらない。その場合、nscdを再起動してみる。

timeout: コマンドを指定秒数でタイムアウトさせる

  • 指定秒数でタイムアウトさせたいが、コマンド自体にはオプションが無い場合に使える
  • CentOS6のcoreutils-8.4-19.el6.x86_64にはデフォルトで入っている
  • CentOS5のcoreutils-5.97-34.el5_8.1には入っていないので、bashスクリプトで代用
    1. sudo apt-add-repository ppa:mizuno-as/silversearcher-ag
    2. sudo aptitude update
    3. sudo aptitude install silversearcher-ag
  • tailコマンドを3秒間実行
    1. sudo aptitude install -y automake pkg-config libpcre3-dev zlib1g-dev liblzma-dev
    2. git clone  https://github.com/ggreer/the_silver_searcher.git
    3. cd the_silver_searcher
    4. ./build.sh
    5. sudo make install
  • timeoutする場合、exit code:124を返す
    1. ack hoge

diff:スペースやタブの違いを無視して比較

  1. ack -a hoge
  • ディレクトリを比較
    1. ag -l "^hoge" | xargs -i perl -p -i -e "s/^hoge/hoge2/g" {}

ホスト名の変更

  • CentOS6.x で検証
    • /etc/hosts に書く場合、FQDNを先に書く必要がある。そうしないとhostname -fでFQDNが取得できない
  • 例:web01.example.com に変えたい場合
    • /etc/resolv.conf: 自動生成されるので変更不要
      1. ag 'hoge' -G '\.yml$'
    • /etc/sysconfig/network
      1. diff -uBbwE old new
  • /etc/hosts : <FQDN> <HOSTNAME> の順に書く
    1. diff -r dir1 dir2
    • hostname
      1. search example.com localdomain
      2. nameserver 192.168.61.2
  • /etc/hosts: <hostname> <FQDN>の順に書くと hostname -f でFQDNが取得できない
    1. NETWORKING=yes
    2. HOSTNAME=web01.example.com
    • hostname
      1. 127.0.0.1   web01.example.com web01 localhost localhost.localdomain localhost4 localhost4.localdomain4

タイムゾーンの変更

  • CentOS6.x, UTC => JSTに変更する場合
    • crondの再起動が必要
    • /etc/localtimeを更新するコマンドがあるので使う
      • CentOS6は tzdata-update コマンド
      • CentOS7は tzdata-update コマンド
        1. hostname -f
        2. web01.example.com
        3.  
        4. hostname -s
        5. web01
        6.  
        7. hostname
        8. web01.example.com

HDDの修復


巨大なダミーファイルを作成する

  • バイナリ: 100MBのファイルを作成
    1. 127.0.0.1   web01 web01.example.com localhost localhost.localdomain localhost4 localhost4.localdomain4

ログインシェルなしのユーザで、コマンドを実行

  1. hostname -f
  2. web01
  3.  
  4. hostname -s
  5. web01
  6.  
  7. hostname
  8. web01.example.com

16進数ダンプ

  • odを使う
    1. sudo vi /etc/sysconfig/clock
    2. ----
    3. ZONE="Asia/Tokyo"
    4. UTC=false
    5. ----
    6.  
    7. # CentOS7
    8. sudo timedatectl set-timezone Asia/Tokyo
    9.  
    10. # CentOS6
    11. sudo /usr/sbin/tzdata-update
    12.  
    13. # crond再起動
    14. sudo service crond restart

pkill:名前を指定してプロセスをkill

pgrepで探したプロセスをkillするのに使える

  • 例:mysql用のトンネルsshを削除。「13306:」を含んだプロセスをkill
    1. head -c 100m /dev/urandom > 100m.dummy

md5deepでファイルのベリファイ

ファイルのmd5ハッシュをとってリスト化し、比較してくれるツール

  • ハッシュの作成には、SATA接続HDDの1.1TBのデータに対して、約13時間かかった
  • ハッシュリスト作成時エラー。標準出力に出る
    • No such file or directory
  • UTF-8のファイルを比較した時、いくつかmd5が事なる場合があった。しかし、異なった結果になったファイルを「md5sum filename」で比較すると同じだった。
  • CentOS5.x, 6.x
    1. less /etc/passwd | grep apache
    2. apache:x:48:48:Apache:/var/www:/sbin/nologin
    3.  
    4. sudo su - apache --shell=/bin/bash --command="pwd"
    5. /var/www
  • Ubuntu 12.04 LTS
    1. echo Hello | od -tx1c
    2.  
    3. 0000000  48  65  6c  6c  6f  0a
    4.           H   e   l   l   o  \n
  • コピー元のハッシュリスト作成
    1. ssh -fNg -L 13306:mysql.example.com:3306 gw.example.com
    2.  
    3. pgrep -u $USER -l -f 13306
    4. 2225 ssh -fNg -L 13306:127.0.0.1:3306 127.0.0.1
    5.  
    6. pkill -u $USER -f 13306:
    7.  
    8. # シグナルを指定: -15 (SIGKILL)、-9 (SIGTERM) -9はDBやLDAP等のデータストアに対して通常は実行しない。データが失われる可能性がある
    9. pkill -9 -f <process name>
  • ハッシュリストとコピ−先を比較。差が無ければ何も出力されない。
    1. sudo yum install md5deep --enablerepo=epel

ext3/4でフォーマットする時に5%がroot用に予約される

特にオプションをつけずにmkfs.ext3/4等でフォーマットすると 5%がroot向けに予約されるようだ。(2TBなら100GB、3TBなら150GB)
データ用ドライブなら不要だと思う。
また大きいファイルだけを扱うならば、「-T largefile」とするとi-nodeが少なくなり、フォーマットの時間が短くなる。

  • ext4でフォーマット, 予約領域:0%, 大きいファイルだけ扱う場合
    1. sudo aptitude install md5deep

iowaitの高いプロセスを調べる

  • どのドライブの使用率が高いのかがわかる
    • r/s: 秒間の読み込み回数
    • w/s: 秒間の書き込み回数
    • avgrq-sz: 平均 I/O サイズ
    • avgqu-sz: 平均待ち行列長
    • await: レスポンスタイム。I/O を実施していない待ち時間を含む
    • svctm: サービスタイム。1回のI/Oに要する時間(ミリ秒)
    • %util: 使用率(ビジー率)
      1. nohup md5deep -r /mnt/disk1/SRC-DIR > SRC-DIR.$(date +%Y%m%d).list &
  • iotopを使う
    1. md5deep -X SRC-DIR.list -r /mnt/disk2/DEST-DIR
  • dstatを使う(kernel 2.6.20以上)
    1. sudo mkfs.ext4 /dev/sdb1 -m 0 -T largefile

プロセスの起動/経過時間の取得

  • pgrepを使う: ユーザやプロセス名を指定しできる
    1. iostat -x 5
    2.  
    3. # iowaitが44%と高く、sdbの%utilが異常に高い
    4. avg-cpu:  %user   %nice %system %iowait  %steal   %idle
    5.            1.00    0.00    3.50   44.36    0.00   51.15
    6.  
    7. Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
    8. sda               0.00    80.40    0.20   47.60     0.80   512.00    21.46     0.11    2.27   12.00    2.23   0.50   2.40
    9. dm-0              0.00     0.00    0.20  128.00     0.80   512.00     8.00     1.03    8.01   13.00    8.00   0.19   2.44
    10. dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
    11. sdb              39.40     0.00   48.80    0.00  6364.80     0.00   260.85     1.48   29.23   29.23    0.00  18.31  89.36
  • psコマンドを使う
    • lstart: プロセスの起動時間
    • etime: プロセス起動からの経過時間。[[dd-]hh:]mm:ss
      1. sudo yum install iotop
      2. iotop -d 5
  • etimeを秒に変換。例: crond
    1. sudo yum install dstat
    2. sudo dstat --time --top-io

CentOS6.xでIPv6の無効化

  1. pgrep -u nginx | xargs -i ps -o lstart h {}
  2. Fri Mar  3 12:34:25 2017

PowerTOP: 省電力化


serf: クラスタ作ってイベント送受信して色々やる


curlでSSLが失敗する場合

curlが参照している中間証明書(CA)が古い場合にも起きる。
php等でlibcurlを使っている場合も同様。

  • CentOS6.x
    1. ps -eo pid,ppid,lstart,etime,cmd h
    2. ...
    3.  1303     1 Thu May 29 09:52:18 2014    06:04:05 /sbin/rsyslogd -i /var/run/syslogd.pid -c 5
    4.  1339     1 Thu May 29 09:52:20 2014    06:04:03 /usr/sbin/sshd
    5. ...

gawkでグループマッチ

  • 0/10の0の部分だけを取り出す
    1. # psの結果
    2. ps -eo comm,user:32,etime,args h | grep -P "^crond\s+root"
    3. crond           root                                01:50:19 crond
    4.  
    5. # 秒に変換
    6. ps -eo comm,user:32,etime,args h | grep -P "^crond\s+root" | perl -ane '@t=reverse split(/[:-]/,$F[2]); $s=$t[0]+$t[1]*60+$t[2]*3600+$t0; print "$s"'
    7. 6619

logwatchメールの停止

  • CentOS5.x
    1. echo "NETWORKING_IPV6=no" >> /etc/sysconfig/network
    2. echo "options ipv6 disable=1" >> /etc/modprobe.d/disable-ipv6.conf
    3. service ip6tables stop
    4. chkconfig ip6tables off
    5.  
    6. vim /etc/hosts
    7. ----
    8. #::1         localhost
    9. ----
    10.  
    11. service network restart

シンボリックリンク先が同じかのチェック

  • test -ef を使う
    1. mv /etc/pki/tls/certs/ca-bundle.crt /etc/pki/tls/certs/ca-bundle.crt.$(date +%Y%m%d)
    2. wget http://curl.haxx.se/ca/cacert.pem -O /etc/pki/tls/certs/ca-bundle.crt

mv: inter-device move failed:

  • 異なるデバイス間でmvした時に発生する時がある
  • cp -r してから、rm -rf すれば良い

ゾンビプロセスの数

  • ps, topの例。psの方が早い
    1. echo "2014-01-02 20:11:22 [INFO] There are 0/10 players online:" | gawk 'match($6, /([0-9]+)\/[0-9]+/, m) { print m[1] }'

CentOS6.xでmkpasswdを使う

  1. chmod -x /etc/cron.daily/0logwatch

操作ログをファイルに保存する

  • scriptでCUI操作ログをとる 来栖川電算
    • そのままではscpで接続できない&scriptプロセスが残り続ける問題があるため改良
      1. ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
      2. test /usr/share/zoneinfo/Asia/Tokyo -ef /etc/localtime
      3. echo $? # 0

ネットワークスループットの測定

  • Iperf - The TCP/UDP Bandwidth Measurement Tool
    • サーバ側
      1. ps aux | awk 'BEGIN {c=0} {if ($8 ~ /Z/) c+=1} END {print c}'
      2. 1
      3.  
      4. top -b -d1 -n1 | awk 'BEGIN {c=0} {if ($8 ~ /Z/) c+=1} END {print c}'
      5. 1
      6.  
      7. # ゾンビプロセスだけ表示
      8. ps aux | awk '{if($8 ~ /Z/) print}'
    • クライアント側
      1. yum install expect

OS判別

  1. vim /etc/profile.d/user-logging.sh
  2. ----
  3. LOG_DIR=/tmp
  4. if [ -n "$SSH_CLIENT" ]; then
  5. TOPPROCESS_JUDGE_TOKEN='sshd:'
  6. else
  7. TOPPROCESS_JUDGE_TOKEN='login'
  8. fi
  9.  
  10. if [ ! -z "$(ps -eo 'pid,args,tty' | awk -v pid=$PPID -v args=$TOPPROCESS_JUDGE_TOKEN '{if ($1 == pid && $2 == args && $3 ~ /@pts/) print $1,$2,$3}')" ]; then
  11. SCRIPTLOGFILE="${LOG_DIR}/$(whoami)_$(date +%Y%m%d%H%M)_$$.log"
  12. touch $SCRIPTLOGFILE
  13. chmod 600 $SCRIPTLOGFILE
  14. script $SCRIPTLOGFILE
  15. exit
  16. fi
  17. ----

リモートシャットダウン用ユーザ

  • リモートシャットダウン等がしたい時に。

Windows Server 2003 R2

  1. Administrative Tools > Active Directory Users and Computers > Users
  2. New > User
    • First name: shutdown
    • User logon name: shutdown
    • Password never expires: checked
  3. Administrative Tools > Default Domain Controller Security Settings
  4. Local Policies > User Rights Assignment
  5. Allow log on locally
    • Add User or Group : EXAMPLE\shutdown
  6. Shutdown the system
    • Add User or Group : EXAMPLE\shutdown
  7. Force shutdown from a remote system
    • Add User or Group : EXAMPLE\shutdown
  8. open command prompt(cmd.exe)
    • gpupdate /force
  • netコマンド
    • CentOS6.x
      1. yum install iperf
      2. iperf -s
    • Raspbian
      1. yum install iperf
      2. iperf -c server.hostname
  • Linuxからテスト
    1. cat /etc/issue | cut -d ' ' -f 1 | head -1 | tr "[:upper:]" "[:lower:]"
    2. centos
    3. ubuntu
    4. raspbian

CentOS6.x

  • リモートからsudoコマンドを使えるように
    1. sudo yum install samba
  • シャットダウン用ユーザを作成し、パスワードを設定(CentOS6.xには既に存在したので不要)
    1. sudo aptitude install samba-common-bin
  • スクリプトを配置して、ログインシェルに指定(/etc/passwordのログインシェルに引数を設定できなかったため)
    1. net rpc shutdown -f -t '30' -C 'shutdown by remote user' -I '192.168.1.100' -U 'shutdown%password'
  • テスト(実際にシャットダウンするので注意)
    1. visudo
    2. ----
    3. Defaults    !requiretty
    4. ----

指定範囲の行を取得

  • 1 〜 10までの行を作成
    1. useradd -g root -M shutdown
    2. passwd shutdown
  • sedを使う
    1. echo -e '#!/bin/sh\n/usr/bin/sudo /sbin/shutdown -h now' > /usr/local/sbin/shutdown.sh
    2. chmod 750 /usr/local/sbin/shutdown.sh
    3.  
    4. vipw
    5. ----
    6. #shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    7. shutdown:x:6:0:shutdown:/sbin:/usr/local/sbin/shutdown.sh
    8. ----
    9.  
    10. visudo
    11. ----
    12. shutdown ALL=NOPASSWD: /sbin/shutdown, /sbin/halt, /sbin/poweroff, /sbin/reboot
    13. ----
  • headとtailを使う
    1. su - shutdown

flockでファイルロック

  • CentOS5以上なら使える
  • -n : non-block。ロックできない場合は即終了。終了ステータスは1
  • ロックファイルlocktestを作る。ターミナル2つ開いて、実行してみる
    1. seq 10 > seq.txt

psで特定のカラムだけ表示と集計

  • comm は15文字を超えるとカットされる。「comm:20」にしても拡張できなかった
  • user は 8文字を超えると uid で表示される。「uid:20」と最大文字数を指定すれば表示される
  • ユーザ、コマンド、%CPUだけ表示。ヘッダ行なし
    1. sed -n '2,4p' seq.txt
  • apacheユーザ、httpdプロセスの%CPUだけ合計(※デュアルコア以上だと値が変)
    1. START=2;END=4;head -n $END seq.txt  | tail -n $(($END - $START + 1))
  • apacheユーザ、httpdプロセスのRSS(物理メモリ使用量)だけ合計
    1. flock -n locktest sleep 10
    2. echo $?

pidstatでプロセス毎の統計情報の取得

  • sysstat-8.0以上に含まれている
  • CentOS6.xのsysstatパッケージにpidstatが含まれているが、CentOS5.xには入っていない
  • マルチコアの場合、%CPU等の値が100を超えるなど変
  • CentOS6.3(sysstat-9.0.4-20.el6.x86_64 にはpidstat含まれている)
    1. ps -eo user,pcpu,comm h
    2. root      0.0 bash
    3. apache    0.0 httpd
    4. ...
  • CentOS5.8(sysstat-7.0.2-12.el5 にはpidstat含まれない) srpmからインストール
    1. ps -eo user,comm,pcpu h | grep -P "apache\s+httpd" | awk '{sum+=$3} END {print sum}'
    2. 1.1

共同作業用ディレクトリの作成

  • 共有ディレクトリ:/var/www/example.com
  • 共有グループ:share
    1.  ps -eo user,comm,rss h | grep -P "apache\s+httpd\s+" | awk '{sum+=$3} END {print sum}'
    2. 134712
    • 同じshareグループのユーザが新規ファイル作成すると0644、新規ディレクトリ作成すると2775になる
  • SGIDの削除
    1. yum install sysstat
    2.  
    3. # 一覧表示
    4. pidstat                                                                                                                                          
    5. Linux 2.6.18-308.1.1.el5 (hostname)       07/09/13        _x86_64_        (2 CPU)
    6.  
    7. 17:49:10      UID       PID    %usr %system  %guest    %CPU   CPU  Command
    8. 17:49:10        0         1    0.00    0.00    0.00    0.00     0  init
    9. 17:49:10        0         3    0.00    0.00    0.00    0.00     0  ksoftirqd/0
    10. ...
    11.  
    12. # PIDを指定
    13. pgrep -u apache httpd
    14. ...
    15. 30222
    16.  
    17.  
    18. # 1秒おきに、2回取得
    19. pidstat -p 30222 1 2                                                                                                                               
    20. Linux 2.6.18-308.1.1.el5 (hostname)       07/09/13        _x86_64_        (2 CPU)
    21.  
    22. 17:51:42      UID       PID    %usr %system  %guest    %CPU   CPU  Command
    23. 17:51:43       48     30222    0.00    0.00    0.00    0.00     1  httpd
    24. 17:51:44       48     30222    0.00    0.00    0.00    0.00     1  httpd
    25. Average:       48     30222    0.00    0.00    0.00    0.00     -  httpd

Hadoop

  • http://ja.wikipedia.org/wiki/Hadoop
    • Apache Hadoopは大規模データの分散処理を支えるJavaソフトウェアフレームワークであり、フリーソフトウェアとして配布されている。[1]Hadoopはアプリケーションが数千ノードおよびペタバイト級のデータを処理することを可能としている。HadoopはGoogleのMapReduce?およびGoogle File System(GFS)論文に触発されたものである。
  • CentOS 6.3 x86_64 にhadoop-1.1.2安定版をインストールする
    1. cd /usr/src/redhat/
    2. wget http://pagesperso-orange.fr/sebastien.godard/sysstat-10.1.6-1.src.rpm
    3. rpm -ivh --nomd5 sysstat-10.1.6-1.src.rpm
    4. rpmbuild -ba SPECS/sysstat-10.1.6.spec
    5. rpm -Uvh RPMS/x86_64/sysstat-10.1.6-1.x86_64.rpm

障害調査


psで省略されてしまうプロセスの長い引数を表示

デフォルトでは長い引数は省略されてしまう。"w"か"ww"を付ける

  • wwを付ける
    1. sudo groupadd share
    2. sudo mkdir -p /var/www/example.com
    3. sudo chown :share /var/www/example.com
    4. sudo chmod 775 /var/www/example.com
    5. sudo chmod g+s /var/www/example.com

curlオプション

  • プロキシ経由でアクセス
    1. sudo chmod g-s /var/www/example.com
  • --retry-max-time <seconds> : リトライを指定時間以内に終わらせる。
  • --retry <num> : 再試行回数。--max-timeには影響されず、--retry-max-timeを指定する必要がある
  • -m/--max-time <seconds> : コマンド実行を指定時間以内に終わらせる。ただし、--retryには影響しない
  • --connect-timeout <seconds> : 接続するまでのタイムアウト。接続した後に時間がかかる場合には向かない
  • -w/--write-out <format> : 出力を加工
    1. yum install jdk.x86_64
    2. wget http://ftp.riken.jp/net/apache/hadoop/common/hadoop-1.1.2/hadoop-1.1.2-1.x86_64.rpm
    3. rpm -Uvh hadoop-1.1.2-1.x86_64.rpm
  • -s/--silent プログレスメータやエラーメッセージを表示しない
  • -S -sと併用するとエラーメッセージだけ表示する
  • -H/--header <line> : httpヘッダ等を付与できる
  • -T/--upload-file <file> : PUTメソッドでファイルを送信
  • -X POST 等のメソッドを指定。デフォルトはGET
  • -d "key=value" でデータを送信できる。-X POST -d "key1=value1" -d "key2=value2"
  • -o filename 出力をファイルに保存
  • -O アクセスしたファイルがindex.htmlなら同じ名前で保存
  • -i http headerも出力
  • -I http headerのみ表示。HEAD メソッドと同じ
  • -A ユーザエージェントを指定
  • -L リダイレクトされていても取得
  • --insecure SSL証明書を無視

ログの集計

  • grep -Pでperl互換の正規表現が使えるので便利
  • ログインに失敗したユーザ数を降順で表示
    1. ps uxww

UID/GIDを変更する

  • login name: user1 / UID:1000 / GID:1000 を UID:2000 / GID:2000 に変更する場合
    1. curl -x proxy.example.com:8080 -L https://www.google.com

添付ファイル付きメール送信

  • Gmailでも表示できるスクリプト
    1. # http status
    2. curl -s -w "%{http_code}" "http://www.google.co.jp" -o /dev/null 2>&1
    3. 200 #結果
    4.  
    5. # download spees (byte)
    6. curl -s -w "%{speed_download}" "http://www.google.co.jp" -o /dev/null 2>&1
    7. 242079.000
  • FROMヘッダの指定。環境変数に書くか、~/.muttrc に追加
    1. zgrep -o -P 'Failed password for [\w\-\_]+' /var/log/secure | sort | uniq -c | sort -nr
    2.    1098 Failed password for root
    3.     489 Failed password for invalid
    4.      11 Failed password for bin
    5.       1 Failed password for ftp

GNU Partedでパーティションリサイズ他

  • GNU Parted
    • 2TB以上のHDDを扱える
    • fdisk, resize2fs の作業を一度に行える

圧縮されたテキストファイルを解凍せずに見る

  • gzip(.gz), compress(.Z), pack(.z),
    1. usermod -u 1000 user1
    2. groupmod -g 1000 user1
    3. find /home/user1 -gid 2000 -exec chown user1. {} \;
  • その他コマンド
    1. sudo yum install mutt sharutils
    2.  
    3. cat > gmail.sh << 'EOS'
    4. #!/bin/bash
    5. # encoding: utf-8
    6.  
    7. readonly CUR_DIR=$(cd $(dirname $0);pwd)
    8. mail_to='bar@example.com'
    9. mail_from='foo <foo@example.com>'
    10. subject='メール件名'
    11. body='メール本文
    12. テスト'
    13. attachment_file=$CUR_DIR/`basename $0`
    14.  
    15. export EMAIL=$mail_from
    16. export LANG=ja_JP.UTF-8
    17. echo "${body}" | mutt -n -s "${subject}" "${mail_to}" -a "${attachment_file}"
    18.  
    19. # vim: ts=4:sw=4
    20. EOS

プロセス一覧の取得

  • ps + grep ではgrepプロセスも表示されるため工夫が必要
    1. export EMAIL="foo <foo@example.com>"
    2.  
    3. vi ~/.muttrc
    4. ----
    5. set envelope_from=yes
    6. set from="from@address"
    7. ----
  • pgrep を使う
    1. zmore /var/log/maillog.1.gz
    2.  
    3. zless /var/log/maillog.1.gz
    4.  
    5. zcat /var/log/maillog.1.gz
    • pidだけ取得
      1. zcat        zdiff       zegrep      zforce      zic         zipcloak    zipgrep     zipnote     zless       znew
      2. zcmp        zdump       zfgrep      zgrep       zip         zipdetails  zipinfo     zipsplit    zmore       zsoelim
  • pstree でツリー状に取得
    1. ps aux | grep httpd
    2. root      1975  0.0  0.9 247992  9828 ?        Ss   12:27   0:00 /usr/sbin/httpd
    3. apache    1992  0.0  0.6 247992  6164 ?        S    12:27   0:00 /usr/sbin/httpd
    4. ...
    5. hoge      3386  0.0  0.0 107444   964 pts/1    S+   18:00   0:00 grep httpd
    6.  
    7. # httpdプロセスだけ表示
    8. ps aux | grep '[h]ttpd'
  • pidファイルを見る。親プロセスのpidだけ記録されている
    1. pgrep -lf httpd
    2. 1975 /usr/sbin/httpd
    3. 1992 /usr/sbin/httpd
    4. ...

umountでdevice is busy エラー

  • umountでエラーが出る場合、なにかのプロセスが使っているためプロセスを調べて終了させる
    1. pgrep -u apache -f /usr/sbin/httpd
    2. 1975
    3. 1992
    4. ...

seq 規則的な数値を得る

  • 数値の連番(FIRST LAST)
    1. $ pstree
    2. init─┬─acpid
    3.      ├─atd
    4.      ├─automount───5*[{automount}]
    5. ...
  • 10から、-2つづ、5まで(FIRST INCREMENT LAST)
    1. cat /var/run/httpd.pid
    2. 30607
  • -f: printfスタイルフォーマットを指定して表示
    1. umount -f /mnt
    2.  
    3. fuser -muv /mnt
  • -s: 区切り文字を指定
    1. seq 0 3
    2. 0
    3. 1
    4. 2
    5. 3
  • -w: 0で桁埋めして表示
    1. seq 10 -2 5
    2. 10
    3. 8
    4. 6

crontabでログ処理

  • bash,zshで標準出力、標準エラーまとめてリダイレクト
    1. seq -f "%04.2f" 1 0.1 1.5
    2. 1.00
    3. 1.10
    4. 1.20
    5. 1.30
    6. 1.40
    7. 1.50
  • syslogに記録(/var/log/messages)
    1. seq -w 0 10 100
    2. 000
    3. 010
    4. 020
    5. 030
    6. 040
    7. 050
    8. 060
    9. 070
    10. 080
    11. 090
    12. 100

仮想コンソールの数を減らしてメモリ節約

メモリ節約のためクラウド環境(AWS EC2等)なら仮想コンソールは1つで良い。デフォルト6つ

  • CentOS6.x
    1. command >& /dev/null
  • CentOS5.x
    1. * * * * * cronlog /path/to/command

フリーズした時の対処

  • 端末、ターミナル
    • CTRL+Q:間違えてターミナルロック CTRL+S を押してしまった場合の解除
    • CTRL+D:標準入力待ちの終了。bash プロンプト上だとlogoutする
    • CTRL+C:シグナルSIGINTを受け付けてくれるアプリは終了してくれる
    • CTRL+\:終了
    • CTRL+Z:アプリの一時停止。fgで元に戻る。jobsで番号を確認できるので kill %1できる
    • ALT+F2〜F6:仮想コンソールへ切り替え
  • Xターミナル
    • ALT+CTRL+F2:
    • ALT+F7:Xに戻る(ttyの個数+1)
  • ssh,telnetを試す
  • kill -HUP, kill -INT, kill -QUIT, kill -KILL の順でプロセスをkillしてみる
  • CTRL+ALT+DELで再起動できるかを試す
  • alt-SysRq?-s, alt-SysRq?-u, alt-SysRq?-o:ソフトウェアリセットが効かないときに試す
  • Alt + SysRq? + b:再起動
  • 電源スイッチを切る
  • 電源ケーブルを抜く

extundeleteで削除ファイル復元

  • http://extundelete.sourceforge.net/
    • ext3, ext4対応。lvm2でも復元できた
    • rm -rf したディレクトリを削除した場合でも、パスも含めて復元
    • システムドライブ上のファイルを削除した場合は、別ドライブをマウントしてそこに復元で対処できた
  • 例:/dev/sdb1 のファイルを削除してしまった場合
    • /dev/sdb1で余計な書き込みはせず、別パーティションで extundelete のビルドを行う
  • ext3/ext4等、パーティションフォーマット確認。
    1. * * * * * /path/to/command 2>&1 | logger -t mycommand -p local0.info
  • ファイルを削除したコマンドの時間をメモ
    1. perl -p -i -e 's#ACTIVE_CONSOLES=/dev/tty\[1-6\]#ACTIVE_CONSOLES=/dev/tty[1-1]#' /etc/sysconfig/init
    2. reboot
  • 対象パーティションを読み取り専用でマウント
    1. perl -p -i -e 's/^2:2345/#2:2345/' /etc/inittab
    2. perl -p -i -e 's/^3:2345/#3:2345/' /etc/inittab
    3. perl -p -i -e 's/^4:2345/#4:2345/' /etc/inittab
    4. perl -p -i -e 's/^5:2345/#5:2345/' /etc/inittab
    5. perl -p -i -e 's/^6:2345/#6:2345/' /etc/inittab
    6. reboot
  • extundelete のインストール
    • CentOS6:
      1. df -T
    • CentOS5:
      1. HISTTIMEFORMAT="%F %T " history
  • 復元
    1. mount -o remount,ro /dev/sdb1
  • 対象パーティションを再マウント
    1. sudo yum install extundelete --enablerepo=epel

シンボリックリンク先のパスを取得

  • readlink を使う。-fで常に絶対パスを取得
    1. yum -y install make gcc gcc-c++ e2fsprogs-devel
    2. mkdir /tmp/0
    3. cd /tmp/0
    4. wget --trust-server-names "http://downloads.sourceforge.net/project/extundelete/extundelete/0.2.4/extundelete-0.2.4.tar.bz2"
    5. tar xvfj extundelete-0.2.4.tar.bz2
    6. cd extundelete-0.2.4
    7. ./configure --prefix=/usr/local
    8. make
    9. sudo make install
    10. extundelete --help

trコマンドで置換

  1. cd /tmp
  2.  
  3. # 復元したいファイルパスが分かっている場合
  4. sudo extundelete --restore-file /home/user01/README.md /dev/sdb1
  5.  
  6. # 1時間以内に削除したファイルを復元
  7. sudo extundelete --restore-all --after $(date +%s -d '1 hour ago') /dev/sdb1
  8.  
  9. # RECOVERED_FILES ディレクトリ以下に復元されたか確認。安全な場所にコピー

rootパスワードを忘れてしまった場合

物理サーバが手元にある場合、またクラウドでもさくらのVPSのように「コンソール」が提供されkernel選択画面が使える場合は、シングルモードに入りrootユーザのパスワードを変更できる。

CPUコア数を調べる

  • CentOS6.x
  • CPUコア数を調べる(Intel HTなら物理CPUより増える)
    1. mount -o remount,rw /dev/sdb1
  • 物理CPU。"physical id"が異なれば違うCPU。同じならIntel HTなど。
    1. ls -l /usr/java/
    2. 合計 4
    3. lrwxrwxrwx. 1 root root    6  9月  5 11:15 2012 default -> latest
    4. drwxr-xr-x. 2 root root 4096  9月  5 11:07 2012 jdk-1.7.0
    5. lrwxrwxrwx. 1 root root    9  9月  5 11:15 2012 latest -> jdk-1.7.0
    6.  
    7. readlink /usr/java/default                                                                        
    8. latest
    9.  
    10. readlink -f /usr/java/default
    11. /usr/java/jdk-1.7.0

crontabで%はエスケープが必要

crontab -eで編集する際、パラメータ等に「%」が含まれていると正常に実行されないので「\%」とエスケープが必要


atime,ctime,mtimeの取得取得

  • statコマンドを使う
    1. # file内の文字'e'を'x'に変換する。
    2. tr e x < file
    3.  
    4. # file内の小文字を大文字に変換する。
    5. tr '[a-z]' '[A-Z]' < file
    6.  
    7. # file内のスペースをすべてタブに変換する。
    8. tr ' ' '\11' < file
    9.  
    10. # file内の複数スペースをすべて1つのタブに変換する。
    11. tr -s ' ' '\11' < file
    12.  
    13. # file内のスペースをすべて削除する。
    14. tr -d ' ' < file
  • mtimeだけの取得
    1. cat /proc/cpuinfo | grep "processor" | wc -l
    2. 2
    3.  
    4. egrep -c "^processor[[:space:]]+:[[:space:]]+[0-9]+$" /proc/cpuinfo
    5. 2
    6.  
    7. # coreutils にある
    8. nproc
    9. 2
    10.  
    11. # util-linux-ng にある
    12. LANG=C lscpu                                                                          
    13. Architecture:          x86_64
    14. CPU op-mode(s):        32-bit, 64-bit
    15. Byte Order:            Little Endian
    16. CPU(s):                2
    17. ...
    18.  
    19. # glibc-common にある
    20. getconf _NPROCESSORS_ONLN
    21. 2

cutでデリミタの無い行を無視する

デリミタの無い行の場合"-f1", "-f2"でもすべて同じ値になる。
そのような行を無視したい場合は"-s"を付けると良い。

  1. cat /proc/cpuinfo | grep "physical id"
  2. physical id     : 0
  3. physical id     : 1

chkconfig対応スクリプトの作成

  • ひな形
    • fileexample.chkconfig
      1. touch test
      2. stat test
      3.   File: `test'
      4.   Size: 0               Blocks: 0          IO Block: 4096   通常の空ファイル
      5. Device: fd00h/64768d    Inode: 16825       Links: 1
      6. Access: (0664/-rw-rw-r--)  Uid: (  501/moriyama)   Gid: (  501/user01)
      7. Access: 2017-01-04 13:07:45.113462561 +0900
      8. Modify: 2017-01-04 13:07:45.113462561 +0900
      9. Change: 2017-01-04 13:07:45.113462561 +0900
  • /etc/rc.d/init.d/functions か肝心なので軽く読んでみると良い
    1. touch test
    2. stat --print=%y test | cut -d ' ' -f 1
    3. 2017-01-04
    1. echo -e "var1" | cut -f1
    2. var1
    3.  
    4. echo -e "var1" | cut -f2
    5. var1
    6.  
    7. echo -e "var1" | cut -s -f1
    8.  
    9. echo -e "var1\tvar2" | cut -s -f2                                                                         
    10. var2

新規ユーザ追加時の処理

  • /etc/skel/ ファイルやディレクトリを置くと useradd 時に自動的にコピーされる

ユーザID(名前)、グループID(名前)の取得

  1. mv example /etc/rc.d/init.d/
  2. chmod 755 /etc/rc.d/init.d/example
  3. chown root:root /etc/rc.d/init.d/example
  4. chkconfig --add example
  5. chkconfig example on
  6. service example restart

alternativesで複数ソフトを共存

MTAやJAVAなど複数ソフト、バージョンを切り替えて使える

  • 例:MTAの切り替え(sendmail, postfix)
    1. . /etc/rc.d/init.d/functions
  • javaの例
    1. cat > test.sh << 'EOS'
    2. #!/bin/bash
    3.  
    4. . /etc/rc.d/init.d/functions
    5.  
    6. echo "success" && echo_success
    7. echo "failure" && echo_failure
    8. echo "passed" && echo_passed
    9. echo "warning" && echo_warning
    10. EOS
    11.  
    12. LANG=C bash test.sh
    13. success                                                    [  OK  ]
    14. failure                                                    [FAILED]
    15. passed                                                     [PASSED]
    16. warning                                                    [WARNING]

高速に空ファイルを生成

  • 10GBの空ファイル。seekがポイント
    1. id hoge
    2. uid=500(hoge) gid=500(hoge) 所属グループ=500(hoge)
    3.  
    4. id -u
    5. 500
    6.  
    7. id -u -n
    8. hoge
    9.  
    10. id -g
    11. 10
    12.  
    13. id -g -n
    14. wheel

セキュリティ


CentOS6.x


複数のサーバリソースを見る「dstat」

  • dstat
    • python製
    • cpu,memory,network,disk,mysql等々

ログアウト後もコマンドを実行したままにする

通常、ssh等でログインした場合、ログアウトした時点で実行したプロセスは停止する。
時間がかかる処理やデーモン化させたい処理がある場合。

  • 新規コマンドを指定する場合。実行中の標準出力は"nohup.out"に保存される
    1. # 手動選択
    2. alternatives --config mta
    3.  
    4. # 自動選択
    5. alternatives --set mta /usr/sbin/sendmail.postfix
    6.  
    7. # 自動選択。番号がわかっていれば上と同様
    8. echo 2 | alternatives --config mta
  • 既存プロセスを指定する場合
    1. # 追加。複数ファイルで構成されている場合は--slaveオプションも付ける
    2. # --install [シンボリックリンク名] [グループ名] [バイナリ本体] [優先度] \
    3. #   --slave [シンボリックリンク名] [グループ名] [バイナリ本体]
    4. # ※優先度は大きいほど高い
    5. alternatives --install /usr/bin/java java /usr/java/jdk1.6.0_31/bin/java 16031 \
    6.   --slave /usr/bin/jar java-jar /usr/java/jdk1.6.0_31/bin/jar \
    7.   --slave /usr/bin/javac java-javac /usr/java/jdk1.6.0_31/bin/javac \
    8.   --slave /usr/bin/javadoc java-javadoc /usr/java/jdk1.6.0_31/bin/javadoc \
    9.   --slave /usr/bin/javaws java-javaws /usr/java/jdk1.6.0_31/bin/javaws \
    10.   --slave /usr/bin/jcontrol java-jcontrol /usr/java/jdk1.6.0_31/bin/jcontrol
    11.  
    12. # 手動選択
    13. alternatives --config java
    14. # 自動選択
    15. alternatives --set java /usr/java/jdk1.6.0_31/bin/java
    16.  
    17. # 削除
    18. # --remove [グループ名] [削除したいバイナリ本体]
    19. alternatives --remove java /usr/java/jdk1.6.0_31/bin/java
    20.  
    21. # 現在の設定
    22. alternatives --display java
    23. java - ステータスは手動です。
    24. リンクは現在 /usr/java/jdk1.6.0_31/bin/java を指しています。
    25. /usr/java/jdk1.6.0_31/bin/java - 優先項目 30
    26. 現在の「最適」バージョンは /usr/java/jdk1.6.0_31/bin/java です。
    27.  
    28. # 設定情報
    29. ls -l /etc/alternatives/

ソフトウェアRAID

  • CentOS5.xの初期設定
  1. 1TB x2台でソフトウェアRAIDを構成する
  2. カスタムレイアウトを選択。CentOS5のネットワークインストール中にソフトウェアRAIDを構築しよう 2
  3. GURBを/dev/md0上にインストール を選択
  4. grubはsdaにしかインストールされてないので、sdbにもインストールしてやる
    1. dd if=/dev/zero of=/tmp/dummy count=1 bs=1 seek=10G
  5. RAID監視デーモンのメール送信先を変更 RAIDをモニタモードで監視するには − @IT
    1. nohup hoge.sh &

ファイル共有してメールで送信

宅ふぁいる便のようなサービスのオープンソース版


ログイン失敗したlinuxアカウントをロックする

  1. disown job番号

特定のポートを使用しているプロセスを調べる


迷惑/スパムメール対策

ログの削除

  1. vi /etc/mdadm.conf
  2. ----
  3. MAILADDR hoge@example.com
  4. ----
  5. service mdmonitor restar

複数ユーザの一括作成

  • cloudpackブログ - cloudpack(クラウドパック)Amazon EC2などクラウドの導入設計、運用・保守サービス: Linuxで複数のユーザを一括作成
    1. vi /etc/pam.d/password-auth
    2. ----
    3. auth required pam_env.so
    4. # 6回以上の失敗アクセスがあった場合、システム管理者がリセットするまで無効
    5. auth required pam_tally2.so deny=6
    6. auth sufficient pam_unix.so try_first_pass nullok
    7. auth required pam_deny.so
    8.  
    9. account required pam_unix.so
    10.  
    11. password requisite pam_cracklib.so try_first_pass retry=3 type=
    12. # 過去4回のパスワードを回転使用できないように
    13. password sufficient pam_unix.so try_first_pass use_authtok nullok sha512 shadow remember=4
    14. password required pam_deny.so
    15.  
    16. session optional pam_keyinit.so revoke
    17. session required pam_limits.so
    18. session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
    19. session required pam_unix.so
    20. ----

日付と時刻

  • ISO 8601形式
    1. 22番を使用しているプロセスを探す
    2. sudo /usr/sbin/lsof -i:22
    3.  
    4. ftpプロセスを探す
    5. lsof -i:20,21
    6.  
    7. プロセス名を指定
    8. lsof -c ssh
  • GMTからJST, UTCへ変換
    1. # 公開鍵の消去
    2. echo "" > /root/.ssh/authorized_keys
    3.  
    4. # ログの消去
    5. # /var/log/cron.1 や cron.1.gz も削除
    6. find /var/log/* -regextype posix-egrep \( -regex ".+\.[0-9]+$" -or -regex ".+\.[0-9]+\.gz$" \) -type f -delete
    7. echo "" > /var/log/boot.log
    8. echo "" > /var/log/btmp
    9. echo "" > /var/log/cron
    10. echo "" > /var/log/dmesg
    11. echo "" > /var/log/dmesg.old
    12. echo "" > /var/log/lastlog
    13. echo "" > /var/log/maillog
    14. echo "" > /var/log/messages
    15. echo "" > /var/log/secure
    16. echo "" > /var/log/spooler
    17. echo "" > /var/log/tallylog
    18. echo "" > /var/log/wtmp
    19. echo "" > /var/log/yum.log
    20. echo "" > /var/log/audit/audit.log
    21.  
    22. if [ -d /var/log/httpd ]; then
    23. for file in `ls /var/log/httpd/*_log`; do
    24. echo "" > $file
    25. done
    26. fi
    27.  
    28. if [ -f /var/log/mysqld.log ]; then
    29. for file in `ls /var/log/mysql*.log`; do
    30. echo "" > $file
    31. done
    32. fi
    33.  
    34. if [ -f /var/log/postgresql.log ]; then
    35. for file in `ls /var/log/postgresql*.log`; do
    36. echo "" > $file
    37. done
    38. fi
    39.  
    40. # コマンドヒストリーのクリア
    41. history -c
  • 昨日の日付の取得
    1. groupadd -g 2001 hoge
    2.  
    3. cat >> user.txt << EOS
    4. test1:test1:2001:2001::/home/test1:/bin/bash
    5. test2:test2:2002:2001::/home/test2:/bin/bash
    6. EOS
    7.  
    8. newusers user.txt
  • 日付文字列から秒へ
    1. date --iso-8601
    2. 2016-03-01
    3.  
    4. date --iso-8601=hours
    5. 2016-03-01T13+0900
    6.  
    7. date --iso-8601=minutes
    8. 2016-03-01T13:08+0900
    9.  
    10. date --iso-8601=seconds
    11. 2016-03-01T13:08:22+0900
    12.  
    13. # UTC
    14. date --iso-8601=seconds -u
    15. 2016-03-01T04:09:01+0000
  • 秒から日付文字列へ。UTC時刻が欲しければ「-u」オプションを付与
    1. # local time: JST
    2. date -d 'Oct  4 03:54:51 2016 GMT' '+%Y-%m-%d %H:%M:%S %Z'
    3. 2016-10-04 12:54:51 JST
    4.  
    5. # UTC
    6. date -d 'Oct  4 03:54:51 2016 GMT' -u '+%Y-%m-%d %H:%M:%S %Z'
    7. 2016-10-04 03:54:51 UTC
  • 日付の比較
    1. date -d '1 day ago' '+%Y-%m-%d'
    2. date -d '-1 day' '+%Y-%m-%d'

swapを追加

  • 例:swapが無い場合に追加する場合。/etc/rc.local 等に追加
    1. date -d "2011-01-01 01:02:03" '+%s'
    2. 1293811323
    3.  
    4. ruby -e 'require "time";t="2011-01-01 01:02:03";puts Time.parse(t).to_i'
    5. 1293811323

DNSの引っ越し


DNSの確認

  • 通常
    1. date -d "@1293811323" '+%Y-%m-%d %H:%M:%S'
    2. 2011-01-01 01:02:03
  • メールサーバ
    1. #/bin/bash
    2. # 日付文字列を 1970-01-01 00:00:00 からの経過秒に変換
    3. DATE_1=`date -d "$1" '+%s'`
    4. DATE_2=`date -d "$2" '+%s'`
    5. if [ $DATE_1 -eq $DATE_2 ]; then
    6.     echo "$1 == $2"
    7. elif [ $DATE_1 -gt $DATE_2 ]; then
    8.     echo "$1 > $2"
    9. elif [ $DATE_1 -lt $DATE_2 ]; then
    10.     echo "$1 < $2"
    11. fi
  • dnsサーバを指定する場合
    1. local SWAPFILE=/swap.1
    2. cat /etc/fstab | grep -i "swap" > /dev/null 2>&1
    3. if [ $? == 1 -a ! -f $SWAPFILE ]; then
    4.     # swap=512MB
    5.     dd if=/dev/zero of=$SWAPFILE bs=1M count=512
    6.     mkswap $SWAPFILE
    7.     swapon $SWAPFILE
    8.     echo "$SWAPFILE    swap      swap    defaults,nofail 0 0" >> /etc/fstab
    9.     swapon -s
    10. fi

ディレクトリ内のファイル数カウント

  • lsよりfindの方が数倍早い
    1. $ dig ドメイン名
  • ディレクトリ毎のファイル数
    1. $ dig mx ドメイン名

複数ファイル内容の文字コードを変換

  • *.shをutf-8に変更
    1. $ dig @DNSサーバ ドメイン名

数値を規則的に増加/減少させるseqコマンド


httpingでHTTPポーリング

pingライクにhttpチェックができる


sed


grepで正規表現にマッチした部分だけを抽出

  • grep v2.5以上の「-o」オプションでマッチした部分だけを抽出
    1. time find /tmp -type f | wc -l
  • grep v2.5以上の「-P」オプションでPerl互換の正規表現
    1. for d in $(find /home/ -maxdepth 1 -type d); do echo $d,$(sudo find "$d" -type f | wc -l); done
  • egrepも同様
    1. find -name '*.sh' | xargs nkf --overwrite -w

ファイルシステムのパラメータを調整 tune2fs

  • 状態の表示
    1. LANG=C ifconfig | grep -o -e "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+" | sed -n "1p"
  • ボリュームラベル変更
    1. LANG=C ifconfig | grep -o -P "\d+\.\d+\.\d+\.\d+" | sed -n "1p"
  • 倉庫として使う場合、root用予約領域を0%に変更。
    1. LANG=C ifconfig | egrep -o "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" | sed -n "1p"
    • 2TB HDDの場合5%程root用として確保されていた。
    • 「tune2fs -l」では「Reserved block count:」として表示される

バックアップ、リストア


サーバ設定、自動化Capistrano, Chef, cloudinit


ImageMagick?

  • 本当は速いImageMagick: サムネイル画像生成を10倍速くする方法 - 床のトルストイ、ゲイとするとのこと
    • 6.5以上なら、「define jpeg:size=」を付ける。それ以下なら「-size」オプションを付ける
      1. cat >> /etc/hosts.allow << EOS
      2. sshd : 192.168.1.
      3. EOS
      4.  
      5. yum install denyhosts --enablerepo=rpmforge -y
      6.  
      7. vi /etc/denyhosts/denyhosts.cfg
      8. ----
      9. # 監視するログファイルの指定(デフォルト)
      10. SECURE_LOG = /var/log/secure
      11.  
      12. # 拒否アドレスの記述場所(デフォルト)
      13. HOSTS_DENY = /etc/hosts.deny
      14.  
      15. # 拒否する期間(1日)
      16. PURGE_DENY = 1d ※永久的に拒否する場合は空欄にすること
      17.  
      18. # ブロック対象のサービス(デフォルト)
      19. BLOCK_SERVICE = sshd
      20.  
      21. # 存在しないユーザログインを拒否するまでの回数
      22. DENY_THRESHOLD_INVALID = 3
      23.  
      24. # 存在するユーザログインを拒否するまでの回数
      25. DENY_THRESHOLD_VALID = 5
      26.  
      27. # rootログインを拒否するまでの回数(デフォルト)
      28. DENY_THRESHOLD_ROOT = 1
      29.  
      30. # メール送信先
      31. ADMIN_EMAIL = notify@example.com
      32.  
      33. # メール送信元
      34. SMTP_FROM = DenyHosts <nobody@example.com>
      35. ----
      36.  
      37. vim /var/lib/denyhosts/allowed-hosts
      38. ----
      39. # 許可したいIPを追加
      40. 127.0.0.1
      41. 192.168.0.*
      42. ----
      43.  
      44. service denyhosts restart
      45. chkconfig denyhosts on

ユーザ毎のcronファイル

  • 以下にユーザ毎にファイルができる
    1. tune2fs -l /dev/sda1

ディスク使用量の多いディレクトリを表示

  • 1階層だけ表示。MBで表示。逆順で表示
    1. tune2fs -L eraid0 /dev/sda1
  • MB単位で表示。.svnディレクトリを除外
    1. tune2fs -m 0 /dev/sda1

ファイルディスクリプタが足りなくなった時

  • /var/log/kern.log
    1. convert -define jpeg:size=180x120 -resize 180x120 src.jpg dst.jpg
  • 設定されている値の確認
    1. /var/spool/cron/USERNAME
  • /etc/rc.d/init.d/functions か肝心なので軽く読んでみると良い
    1. du -m --max-depth=1 /home/hoge | sort -nr
    1. du -S -m --exclude=.svn | sort -n
  • 動的に設定
    1. kernel: VFS: file-max limit 8192 reached
  • 設定ファイルに指定
  • /etc/sysctl.conf
    1. cat /proc/sys/fs/file-attachref(example.chkconfig);
    2. #geshi(bash){{
    3. mv example.chkconfig /etc/rc.d/init.d/example
    4. chmod 755 example
    5. chown root:root example
    6. chkconfig --add example
    7. chkconfig example on
    8. service example restart

小技


ddコマンド中の進捗を見る

  • Pipe Viewer を使う。CentOS5.xの場合rpm, yum RPMforgeが使えた
    1. some_very_long_and_complex_command # label

sudo: sorry, you must have a tty to run sudo

CentOS5.5で、crontab内や/etc/cron.daily/内でsudoを使おうとするとこのエラーが出る。

  • 対策。rootユーザのみtty接続でなくともsudoを許可
    1. echo 1 2 3
    2. 1 2 3
    3.  
    4. !:-
    5. echo 1 2
    6. 1 2
  • もしくはssh -tオプションで実行しろと書いてある
    1. mv filename.{old,new}

テキスト操作


sudoでリダイレクトを含むコマンド

以下の例では「sh -c "..."」を付けないと、「>」の部分が現在のユーザで実行されてしまい、ファイルが作成できない

  1. kill -SIGUSR1 [PID]

lsで日付の昇順にソート

  1. yum install pv --enablerepo=rpmforge
  2.  
  3. #または
  4.  
  5. wget http://pipeviewer.googlecode.com/files/pv-1.1.4-1.i386.rpm
  6. sudo rpm -ivh pv-1.1.4-1.i386.rpm
  7.  
  8. # 実行例
  9. dd if=/dev/zero count=1024 bs=1M | pv -s 1g > output.log
  10.  
  11. 024+0 records in67.4MB/s] [===============================================================================>  ] 98% ETA 0:00:00
  12. 1024+0 records out
  13.    1GB 0:00:11 [91.3MB/s] [=================================================================================>] 100%           
  14. 1073741824 bytes (1.1 GB) copied, 10.751 seconds, 99.9 MB/s

肥大化したメールの削除

  1. sudo /usr/sbin/visudo
  2. ----
  3. Defaults:root !requiretty
  4. ----

kernel: ACPI: Unable to turn cooling device

  • /var/log/messagesに延々以下のメッセージが出る場合
    kernel: ACPI: Unable to turn cooling device [ddc8b748] 'on'
  • acpi=offを追加して、再起動
    1. ssh -t hostname sudo <cmd>

IDE/SATA HDDの情報を見る

  • sata
    1. sudo sh -c "cat > /etc/php.d/json.ini << 'EOS'
    2. extension=json.so
    3. EOS"
  • ide
    1. ls -ltr

echoで改行したい時

  • 通常。\も表示される
    1. cat /dev/null > /var/spool/mail/root
  • 改行したい時。-eオプション
    1. sudo yum install source-highlight --enablerepo=rpmforge -y
    2. export LESS='-R'
    3. export LESSOPEN='| /usr/bin/src-hilite-lesspipe.sh %s'
  • 一時的に改行したい時。$'\n'
    1. vi /boot/grub/grub.conf
    2. ----
    3. kernel /vmlinuz-2.6.18-194.3.1.el5 ro root=/dev/VolGroup00/LogVol00 acpi=off
    4. ----
    5.  
    6. service acpid stop
    7. chkconfig acpid off

lsyncd+rsyncdでリアルタイムミラー

yum install lsyncd -y --enablerepo=rpmforge

ファイル名の文字コードを変換する

  • インストール
    yum -y install convmv
  • 文字コード
    • euc-jp
    • sjis
    • utf8
  • テスト
    convmv -r -f sjis -t utf8 *
  • 実行 sjis -> utf-8へ
    convmv -r -f sjis -t utf8 * --notest

WARNING: UNPROTECTED PRIVATE KEY FILE!

  • 以下のエラーが出る場合。秘密鍵のパーミッションが間違っている。644だとエラー
    $ ssh -i .ssh/id_rsa 192.168.1.2
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    @         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    
  • 600にパーミッションを修正。
    $ chmod 600 .ssh/id_rsa

ログイン時にメッセージを表示する

  1. $ cat /proc/scsi/scsi
  2.  
  3. Attached devices:
  4. Host: scsi0 Channel: 00 Id: 00 Lun: 00
  5.   Vendor: WDC WD10 Model:    -WCAV50611046 Rev:    
  6.   Type:   Direct-Access                    ANSI SCSI revision: 02
  7. Host: scsi0 Channel: 00 Id: 00 Lun: 01
  8.   Vendor: WDC WD50 Model:    -WCAPW1876244 Rev:    
  9.   Type:   Direct-Access                    ANSI SCSI revision: setup (hd1)
  10.  grub 02

ヒアドキュメント

  1. $ cat /proc/ide/hda/model
  2.  
  3. HITACHI_DK23DA-30
  • 変数展開したくない場合、シングルクォーテーションで括る
    1. $ echo 'a\nb'
    2. a\nb

bonnie++ディスクベンチマーク

  • 測定した処理時間が短過ぎた場合には、測定結果の表示が「+++++」「+++」となってしまうため、ソース修正。
    1. $ echo -e 'a\nb'
    2. a
    3. b
  • rpmでのインストールもできるが、上記項目が修正されていない。
    1. echo $'\n''\n'
    2.  
    3. \n
    • 結果のカンマ区切り列をbon_csv2html, bon_csv2txtコマンドに与えると、html,txtとして出力される
      bon_csv2html < input.csv > output.html
  • デフォルトでは、バッファキャッシュによる測定誤差を小さくするため、実メモリサイズの2倍の一時ファイルが測定時に作成される。測定対象のパーティションの空き容量に注意が必要。

topコマンド

  • 1秒毎に更新
    top -d 1
キー説明
1cpuコア毎の使用率を表示
Mメモリ使用量でソート
NPIDでソート
PCPU使用率でソート
TTIME+でソート
  • その他  man top

アーキテクチャの判別

  1. # vi /etc/motd
  2. ----
  3.          __|  __|_  )  Fedora 8
  4.          _|  (     /    32-bit
  5.         ___|\___|___|
  6.  
  7.  Welcome to an EC2 Public Image
  8.                        :-)
  9.  
  10.     Base
  11.  
  12.  --[ see /etc/ec2/release-notes ]--
  13. ----

32bit/64bitかどうか判定

  1. cat >> hoge.txt << EOS
  2. a
  3. b
  4. c
  5. EOS

tcpflowでパケットキャプチャ

  • tcpflow
    • Man page of TCPDUMP tcpdumpと同じ書式のフィルタが使える
    • 管理者必見! ネットワーク・コマンド集 - tcpdumpコマンド:ITpro
    • yumの場合
      1. cat >> hoge.txt << 'EOS'
      2. VAR=hoge
      3. echo $hoge
      4. EOS
    • rpmをダウンロードする場合
      1. cd /tmp
      2. wget http://www.coker.com.au/bonnie++/experimental/bonnie++-1.96.tgz
      3. tar xvfz bonnie++-1.96.tgz
      4. cd bonnie++-1.96
      5.  
      6. 必要ならインストール
      7. # yum groupinstall
      8. ./configure
      9. vi bonnie.h
      10. ----
      11. #define MinTime (0.01)
      12. ----
      13. make
      14.  
      15. ./bonnie++ -d /tmp -u root
      16.  
      17. cd ..
      18. rm -rf bonnie++*
    • 実行
      yum install bonnie++ --enablerepo=rpmforge
      bonnie++ -u ユーザ -d /tmp
    • -c: コンソールのみに出力
    • -s: 表示できない文字を"."に変えて出力
    • -i: eth0 等のNICを指定

cpanインストール時にデフォルトでyesに設定する

perl -MCPAN -e shell
cpan> o conf prerequisites_policy follow
cpan> o conf commit
cpan> quit

プロセス毎のメモリ使用量

  • メモリ多い順にソート。単位KB
    ps alx |  awk '{printf ("%d\t%s\n", $8,$13)}' | sort -n -r
  • 特定プロセスだけ表示。単位KB。例mysql
    ps alx | grep mysql | awk '{printf ("%d\t%s\n", $8,$13)}'

unixbenchで結果が0.0( no measured results)

  • /usr/bin/timeが必須
    1. uname -i
    2.  
    3. i386
    4. x86_64
  • 5.1.3の場合
    1. getconf LONG_BIT
    2.  
    3. 32 // 32bit
    4. 64 // 64bit
  • 4.1.0の場合
    1. yum install tcpflow --enablerepo=rpmforge

ソースからドキュメントを生成 doxygen

  • centos5.3
    yum install doxygen
  • Graphviz dot記法のテキストからグラフを作成できる
    yum install graphviz graphviz-gd

CentOS5.3でWebDAV環境作成

  • httpd-devel
    # yum -y install httpd-devel
  • インストール
    # wget ftp://ftp.aconus.com/fc5/modhttp://www.itmedia.co.jp/help/tips/linux/l0458.html]]
    # tar xvfz mod_encoding-2.2.0-1.src.tar.gz
    # rpm -ivh iconv_hook-1.0.0-1.src.rpm mod_encoding-2.2.0-1.src.rpm
     
    ビルドエラー「インストール済み(ただし未伸張)ファイルが見つかりました」が出るので、以下を先頭に追加
    # vi SPECS/iconv_hook.spec
    ----
    %define __check_files %{nil}
    ----
    # rpmbuild -ba SPECS/iconv_hook.spec
    # rpm -ivh RPMS/i3861p*.log/iconv_hook-1.0.0-1.i386.rpm
    
    ビルドエラー「インストール済み(ただし未伸張)ファイルが見つかりました」が出るので、以下を先頭に追加
    # vi SPECS/mod_encoding.spec
    ----
    %define __check_files %{nil}
    ----
    # rpmbuild -ba SPECS/mod_encoding.spec
    # rpm -ivh RPMS/i386/mod_encoding-2.2.0-1.i386.rpm 
  • 設定
    # vi /etc/httpd/conf.d/mod_encoding.conf
    ----
    LoadModule encoding_module modules/mod_encoding.so
    <IfModule mod_encoding.c>
    	EncodingEngine on
    	NormalizeUsername on
    	SetServerEncoding UTF-8
    	DefaultClientEncoding UTF-8 CP932 EUCJP-MS
    	AddClientEncoding "Microsoft .* DAV 1.1" ASCII CP932 UTF-8
    	AddClientEncoding "Microsoft .* DAV" UTF-8 CP932
    	AddClientEncoding "(Microsoft .* DAV $)" UTF-8 CP932
    	AddClientEncoding "(Microsoft .* DAV 1.1)" CP932 UTF-8
    	AddClientEncoding "Microsoft-WebDAV*" UTF-8 CP932
    	AddClientEncoding "RMA/*" CP932
    	AddClientEncoding "xdwin9x/" CP932
    	AddClientEncoding "cadaver/" UTF-8 EUCJP-MS
    	AddClientEncoding "Mozilla/" EUCJP-MS
    </IfModule>
    ----
    # service httpd restart
  • webdav設定
    # vi /etc/httpd/conf.d/dav.example.com.conf
    ----
    <VirtualHost *:80>
        ServerAdmin webmaster@dav.example.com
        ServerName dav.example.com
        ServerAlias www.dav.example.com
        DocumentRoot /var/www/vhost/dav.example.com/public_html
        ErrorLog logs/dav.example.com-error_log
        CustomLog logs/dav.example.com-access_log combined env=!no_log
        <Directory />
            Options -Indexes FollowSymLinks
            AllowOverride All
        </Directory>
    
        <Location />
            DAV On
            #SSLRequireSSL
            AuthType Basic
            AuthUserFile /var/www/vhost/dav.example.com/.htpasswd
            AuthName "password"
            Require valid-user
        </Location>
    </VirtualHost>
    ----
    # chown -R apache. /var/www/vhost/dav.example.com/public_html
    # service httpd graceful
    

libiconvのインストール

  • libiconv
    # cd /usr/local/src/
    # wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.9.2.tar.gz
    # tar xvfz libiconv-1.9.2.tar.gz
    # cd libiconv-1.9.2
    # ./configure
    # make
    # make install
    # vi /etc/ld.so.conf
    ----
    /usr/local/lib
    ----
    # ldconfig
    

sudoを使えるように

  • UNIXの慣習としてsudoできるのはwheelグループ。コメントを外す
    1. sudo yum install libpcap http://pkgs.repoforge.org/tcpflow/tcpflow-0.21-1.2.el6.rf.$(uname -i).rpm
  • visudoより /etc/sudoers.d/ にファイルを作る方がデプロイが楽
    • CentOS6.x
      1. # HTTP:80をパケットキャプチャしてコンソールに出力。-cを省略するとファイルに出力
      2. sudo tcpflow -cs port 80 -i eth0
      3. CTRL+Cで停止
      4.  
      5. # 送受信が[IP Address]かつポート80のパケットのみキャプチャ(HTTPリクエスト/レスポンス)
      6. tcpflow -cs -i eth0 host [IP Address] and port 80
      7.  
      8. # 送信元が[IP Address]かつポート80のパケットのみキャプチャ(HTTPリクエストのみ表示)
      9. tcpflow -cs -i eth0 src host [IP Address] and port 80
      10.  
      11. # 送信先が[IP Address]かつポート80のパケットのみキャプチャ(HTTPレスポンスのみ表示)
      12. tcpflow -cs -i eth0 dst host [IP Address] and port 80
    • もし ディレクトリが無かったり、設定が必要ならば設定する。(CentOS6.xでは不要だった)。「#includedir」の行頭#はコメントではない
      1. sudo yum install time
  • hogeユーザでsudoを使えるように
    1. sudo yum install time make gcc perl perl-Time-HiRes
    2. wget http://byte-unixbench.googlecode.com/files/UnixBench5.1.3.tgz
    3. tar xvfz UnixBench5.1.3.tgz
    4. cd UnixBench
    5. make
    6. ./Run -i 1 index
  • sudoユーザがrootになりたい時
    1. sudo yum install time
    2. wget http://www.tux.org/pub/tux/benchmarks/System/unixbench/unixbench-4.1.0.tgz
    3. tar zxvf unixbench-4.1.0.tgz
    4. cd unixbench-4.1.0
    5. make
    6. ./Run -1 index

ディレクトリ単位でディスク使用量を表示

ls | xargs du -ks  | sort -n -r

graphvizで日本語を使う

dotファイルをUTF-8で記述し、以下の方法で、nodeとlabelが日本語になった。
「-G」でgraph環境変数も追加できる。

  • CentOS5.3
  • インストール
    yum install graphviz graphviz-gd
  • フォント
    $ locate .ttf
    /usr/share/fonts/ja/TrueType/kochi-gothic-subst.ttf
    /usr/share/fonts/ja/TrueType/kochi-mincho-subst.ttf
    /usr/share/fonts/japanese/TrueType/sazanami-gothic.ttf
    /usr/share/fonts/japanese/TrueType/sazanami-mincho.ttf
  • コマンドでフォントを指定
    dot -T png -Nfontname=kochi-gothic-subst -Efontname=kochi-gothic-subst < trac.dot > trac.png
  • dotファイル内でフォント指定。dotファイルはUTF-8で記述する
    digraph G {
    node [fontname="kochi-gothic-subst"]
    edge [fontname="kochi-gothic-subst"]
    ...
    }
    

CentOS5.3のネットワークインストールで、メモリ256MBでエラー

メモリが256MBしかないPCに、CentOS5.3をネットワークインストールしようとすると、rootパスワード入力後、パッケージ選択前に以下のエラーが発生する。
メモリ512MBあれば問題なくインストールできる。

centos5.3_netinstall_error.jpg


BitTorrent?クライアント

Linuxで無線LANを使う

  • Thinkpad X31 + Intel PRO Wireless LAN 2100 3B Mini にCentOS5.2を入れてみる
    • dmesgを確認すると、firmwareの認識に失敗していた
      # dmeshttp://www.itmedia.co.jp/enterprise/0309/05/epn05.html]]
  • [[エンタープライズ:特集:第3回 tarボールからRPMパッケージを作るコツ (1/3)g | grep ipw2100
    ipw2100: Intel(R) PRO/Wireless 2100 Network Driver, git-1.2.2
    ipw2100: Copyright(c) 2003-2006 Intel Corporation
    ipw2100: Detected Intel PRO/Wireless 2100 Network Connection
    ipw2100: eth0: Firmware 'ipw2100-1.3.fw' not available or load failed.
    ipw2100: eth0: ipw2100_get_firmware failed: -2
    ipw2100: eth0: Failed to power on the adapter.
    ipw2100: eth0: Failed to start the firmware.
    ipw2100Error calling register_netdev.
    ipw2100: probe of 0000:01:04.0 failed with error -5
    • firmwareを最新に更新。ATrpms
      $ wget http://dl.atrpms.net/all/ipw2100-firmware-1.3-6.0.1.noarch.rpm
      $ rpm -ivh ipw2100-firmware-1.3-6.0.1.noarch.rpm
      $ rmmod ipw2100
      $ modprobe ipw2100
      $ iwconfig
    • これで認識した。あとは@ITの記事参照
    • WPAとdhcpを起動するように
      # wpa_supplicant on
      # chkconfig dhcdbd on

ポートフォワーディング

  • ローカルPCからポートフォワーディングを行う方法
  • http://サーバA:10080/ へアクセスした時に、www.google.co.jpを表示する場合。
    サーバAへsshでログインして、ssh_10080_www.google.co.jp_80.sh を実行している間だけ使用可能となる。
    自分以外も接続可能なので、使用後は切断すること。
    • ポートを開放する
      # vi /etc/sysconfig/iptables
      ----
      -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 10080 -j ACCEPT
      ----
      # service iptables restart
    • スクリプトを用意(-gオプションはローカル以外からの接続を許可)
      $ vi ssh_10080_www.google.co.jp_80.sh
      ----
      #!/bin/bash
      
      ssh -g -L 10080:www.google.co.jp:80 user@localhost
      ----
      $ chmod 700 ssh_10080_www.google.co.jp_80.sh
      

ソースコード検索

  • 再帰、大文字小文字無視、色つき
    grep -r -i --color=auto "検索文字列" /tmp/*
  • ack だと、svnやcvsの管理ファイルは無視してくれて、色も付いて色々便利
    • インストール
      cpan -i App::Ack

ロケールShift_JISを追加する

# localedef -f SHIFT_JIS -i ja_JP ja_JP.SJIS
# export LANG=ja_JP.sjis

リアルタイムログ監視


Unix/Linuxコマンドリファレンス

ファイル分割

root宛のメールを転送する

  • postfixを使っている場合
    # sed -i '/^root:/d' /etc/postfix/aliases
    # echo "root: hoge@example.com" >> /etc/postfix/aliases
    # postalias /etc/postfix/aliases
    # echo test|mail root
    • postaliasでエラーが出る場合、/etc/postfix/main.cf の"myhostname"の値を設定してあるか確認。
  • sendmailを使っている場合
    # sed -i '/^root:/d' /etc/aliases
    # echo "root: hoge@example.com" >> /etc/aliases
    # newaliases
    # echo test|mail root

ファイル中のCRLFをLFに置換

  • perl ワンライナー
    perl -pe 's/\x0D\x0A|\x0D|\x0A/\n/g' inputfile > outputfile

強制コピー

rootでcp -fしても、「yes/no」と訪ねられる。yesコマンドの出力を食わせてやればよい。

$ yes | cp -f ...

sshポートフォワーディング

  • 以下3台のLinuxサーバがあり、remotehost2への接続はremotehost1経由でしか行えないとする。
    • localhost
    • remotehost1
    • remotehost2
  • 安全に localhost -> remotehost2へファイルをコピーしたい場合
    • localhostで新しい接続を開き、ポートフォワーディングする(ポートは適当)。remotehost1に接続した状態のまま。
      ssh -g -L 30022:remotehost2:22 username@remotehost1
    • localhost scpでポート指定し、/home/foo/にファイルをコピーする
      scp -P 30022 filename username@localhost:/home/foo/
  • hostA上でremotehost1のsvnからチェックアウト
    • hostA
      ssh -g -L 30443:localhost:443 username@remotehost1
    • hostAの新しいssh接続を開いて
      svn co https://localhost:30443/svn/SandBox/trunk/src SandBox

shift_jisのディレクトリの一覧

  • 一覧
    ls | nkf --sjis --euc
  • 移動
    cd `printf "あいうえお" | nkf -s`

ソースコード検索ack

"grep -r"の代わりに使える。
デフォルトで CVS, RCS, .svn, blib といったバージョン管理ディレクトリを無視、-i, -v といった grep 由来のコマンドラインや、 --perl で perl ソースコードだけ検索。カラーリングにも対応。

  • インストール
    # perl -MCPAN -e shell
    cpan> install App::Ack
    • 1.6系でエラーとなる場合
      cpan> install P/PE/PETDANCE/ack-1.58.tar.gz
  • 使い方
    ack [options] PATTERN [FILE...]
    ack -f [options] [DIRECTORY...]

manで文字化けする場合

  • 日本語判別が強化されている lv を使う
  • 以下のようなファイルを作り、source ファイル名 で読み込む
    • euc-jpで表示
      #!/bin/bash
      export LANG="ja_JP.eucjp"
      export PAGER="/usr/bin/less -isr"
    • utf-8で表示
      #!/bin/bash
      export LANG="ja_JP.utf8"
      export PAGER="/usr/bin/iconv -f euc-jp -t utf-8 | /usr/bin/less -isr"

usb機器一覧の表示

Redhat系ならば、lsusbがある。
あとはlshwとか。

  • Fedoraならば
    # yum install usbutils
    # lsusb
  • USBのwebカメラが認識しなくなった
    usb 5-2: USB disconnect, address 36
    usb 5-2: new full speed USB device using uhci_hcd and address 40
    usb 5-2: configuration #1 chosen from 1 choice
    pwc: Unknown parameter `index'
  • /etc/modprobe.conf の options pwc index=1.を削除すればよいらしい。
  • 編集後
    Dec 18 15:52:26 tech-fsv last message repeated 2 times
    Dec 18 15:54:16 tech-fsv kernel: usb 5-2: USB disconnect, address 40
    Dec 18 15:54:19 tech-fsv kernel: usb 5-2: new full speed USB device using uhci_hcd and address 41
    Dec 18 15:54:20 tech-fsv kernel: usb 5-2: configuration #1 chosen from 1 choice
    Dec 18 15:54:20 tech-fsv kernel: pwc Philips webcam module version 9.0.2-unofficial loaded.
    Dec 18 15:54:20 tech-fsv kernel: pwc Supports Philips PCA645/646, PCVC675/680/690, PCVC720[40]/730/740/750 & PCVC830/840.
    Dec 18 15:54:20 tech-fsv kernel: pwc Also supports the Askey VC010, various Logitech Quickcams, Samsung MPC-C10 and MPC-C30,

updatedb の自動更新を有効にする。

locateコマンドでファイルを高速に検索可能だが、RedHat?やFedoraだと、インストール時にはupdatedbの自動更新が無効になっている。
有効にするには以下のファイルを編集し「yes」に変更する。

# vi /etc/updatedb.conf
-----------------------------
DAILY_UPDATE=yes
-----------------------------

毎日午後4時に実行されるが、負荷が高すぎて問題が出る場合は、PRUNEPATHSでディレクトリを除外しておく。キャッシュやテンポラリファイルが膨大にあるディレクトリを指定すると良さそう。

tailの出力結果をファイルに保存する

tailの出力結果をgrepで絞り込んで、それをファイルに出力しようとしても、以下の方法では何も出力されません。

  • CTRL+Cでは、パイプ全体が死ぬため出力されない
    # tail -f /var/log/httpd/access_log | grep 絞りこみ文字列 > ファイル名
  • tailだけ殺してやる
    # tail -f /var/log/httpd/access_log | grep 絞りこみ文字列 > ファイル名&
    # killall tail

HDD増設

  1. 接続されているドライブ確認
    # fdisk -l
    Disk /dev/hda: 122.9 GB, 122942324736 bytes
    ...
    Disk /dev/hdb: 300.0 GB, 300090728448 bytes
    ...
    Disk /dev/hdd: 61.4 GB, 61492838400 bytes
    ...
  2. fdiskで領域確保
    # fdisk /dev/hdd
    m - help
    p - 現在の領域設定表示
    n - 新規に領域作成
    w - 書き込み
  3. フォーマット(-c オプション付けると不良セクタを検査する)
    # mkfs.ext3 /dev/hdd1
  4. マウント
    # mkdir /mnt/hdd1
    # mount -t ext3 /dev/hdd1 /mnt/hdd1
  5. 自動マウント設定 (fstab)
    # vi /etc/fstab
    # LABEL=/dev/hdd1 /mnt/hdd1 ext3 defaults 1 2

DynamicDNSの自動IPアドレス更新

スクリプトによる自動ユーザ追加

スクリプト等で一括登録する方法。useradd -p コマンドではあらかじめcrypt()したパスワードを渡す必要があります。passwdコマンドにパイプ経由でパスワードを渡してみます。

# useradd hoge
# echo 'hogehoge' | passwd --stdin hoge

世代/差分バックアップ(rdiff-backup)

デバック用コードを有効にする

デバック時にのみ有効にしたいコードが有る場合、Makefile, gcc, cc時にオプションで「-DDEBUG」を付ける事により、ソース中に「#define DEBUG」記述するのと同じ効果を持たせる事ができる。

Makefile
---------------------------------
CFLAGS = -g -O2 -DDEBUG
---------------------------------
test.c
---------------------------------
#ifdef DEBUG
printf("DEBUG:...");
#endif
---------------------------------

JPEG2000形式のファイルを他形式に変換する

Windowsでもbmp -> jpeg2000は可能だが、逆がほとんどない。
複数ファイルの一括変換ができなくて面倒。

  • jasper
  • 対応形式
    ValueDescription
    bmpWindows BMP
    jp2JPEG-2000 JP2
    jpcJPEG-2000 Code Stream
    jpgJPEG
    pgxPGX
    pnmPNM/PGM/PPM
    mifMy Image Format
    rasSun Rasterfile
  • JPEG2000形式(j2k, jp2)をbmpに変換する例
    jasper -f 入力ファイル名.jp2 -F 出力ファイル名.bmp -T bmp

Shift_JISでコマンドラインを使う

  1. Shift_jisを追加
    # localedef -f SHIFT_JIS -i ja_JP ja_JP.sjis
  2. 確認
    # locale -a | grep ja
    ja_JP
    ja_JP.eucjp
    ja_JP.sjis
    ja_JP.ujis
    ja_JP.utf8
    japanese
    japanese.euc
  3. 設定
    # export LANG=ja_JP.SJIS

whichコマンドの代わりは?

  • コマンドを探す which がFedora core 3では無い。
    代わりにwhereisコマンドを使う
    $ whereis perl
    perl: /usr/bin/perl /usr/share/man/man1/perl.1.gz

メール送信ができない時は

  • 以下のエラーの場合は
    WARNING: RunAsUser for MSP ignored, check group ids (egid=500, want=51)
    can not chdir(/var/spool/clientmqueue/): Permission denied
    Program mode requires special privileges, e.g., root or TrustedUser.
  • postdrop warningの時は
    以下のエラーの際は、postfix が起動していないため発生するようです。
    postdrop: warning: unable to look up public/pickup: No such file or directory
    • 解決方法
      プロセスの確認。masterが存在すれば起動済み
      # ps -aux | grep postfix
      root     26348  0.2  0.1  5220 1632 ?        S    17:02   0:00 /usr/libexec/postfix/master
      起動していない場合は、起動させる。
      # service postfix start
      # chkconfig postfix on
      ためしにメールを送ってみる。
      # echo "hogehoge" | mail メールアドレス

majordomo(メーリングリスト)

以下のように「majordomo@ドメイン名」宛にコマンドを送ると結果が返される。

宛先:majordomo@ドメイン名
件名:(何でも構いません)
本文:
     コマンド
     コマンド
     ・・・
     コマンド
     end (or "-")
  • コマンド
    コマンド名説明
    help説明ページの入手
    lists公開されたメーリングリスト一覧
    lists 自分のメールアドレス自分に配信されるメーリングリスト一覧

パッチを当てる

  • 差分作成
    1. sudo visudo
    2. ----
    3. %wheel   ALL=(ALL)  NOPASSWD: ALL
    4. ----
    5.  
    6. # user01をwheelグループに追加
    7. usermod -G wheel user01
  • パッチ検証
    1. echo 'hoge ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers.d/hoge
    2. chmod 440 /etc/sudoers.d/hoge
    3.  
    4. # groupの場合、%を付ける
    5. echo '%hogegroup ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers.d/hogegroup
    6. chmod 440 /etc/sudoers.d/hogegroup
  • パッチ当て
    1. mkdir /etc/sudoers.d
    2. chmod 750 /etc/sudoers.d
    3.  
    4. vim /etc/sudoers
    5. --
    6. #includedir /etc/sudoers.d
    7. --
  • 参考URL
    http://www.itmedia.co.jp/help/tips/linux/l0566.html

ハードウェア情報を一括表示する

  • lshwを利用する
    htmlやxml形式でハードウェア一覧を出力できる。
  • DOWNLOAD http://sourceforge.net/project/showfiles.php?group_id=32683
  • インストール
    $ wget http://jaist.dl.sourceforge.net/sourceforge/ezix/lshw-B.02.03.tar.gz
    $ tar vxzf lshw-B.02.03.tar.gz
    $ cd lshw-B.02.03/src/
    $ make
    $ su
    # make install
  • 実行
    # lshw -html > abc.html
    # lshw -xml > efg.xml

grepの使い方

  • デフォルトオプションを付与。~/.bash_profile あたりに追加すれば次回ログインから有効
    1. visudo
    2. ----
    3. # パスワードを要求する
    4. hoge ALL=(ALL) ALL
    5. # パスワードを要求しない
    6. hoge ALL=(ALL) NOPASSWD: ALL
    7. ----
  • 例えば /tmp 以下にあるたくさんのファイルの中から "Linux" という文字を含むファイルを見つけ出したいとき
    grep "Linux" /tmp/*
    これで結果がずらずらと出てきます。
    でもこれだと"linux"を含む文字列全てが対象となってしまいます。
  • 単語の完全一致で検索したいときは
    grep -w "Linux" /tmp/*
  • 大文字と小文字の区別をなくしたいときは
    grep -i "Linux" /tmp/*
  • サブディレクトリ以下も再帰的に検索したい場合
    grep -r "Linux" /tmp/*
  • マッチした1行前も表示
    1. sudo su -
  • マッチした1行後も表示
    1. diff -Naur hello.c patch/hello.c >hello.patch
  • 指定した文字を含まないファイルを表示
    1. patch -p0 --dry-run < hello.patch

hosts.allowで制限できる範囲

inetd経由のデーモンのみ制御可能。
よって、apache等はその範囲ではない。
ただし、最近はlibwrapを取り込んでいるらしく、inetd経由でなくとも有効になるものがある。
lddコマンドでリンクしてるライブラ^processorリをみてlibwrap.soとかリンクしてれば制限かかるらしい。


rootkit検出ツールによる検査

ハッキングに利用されるrootkitを検出するツール。
http://www.chkrootkit.org/

  1. インストール
    $ wget ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz
    $ tar xvzf chkrootkit.tar.gz
    $ cd chkrootkit-0.44
    $ make sense
    $ su
    # cp -p chkrootkit /usr/local/bin/
  1. 実行
    # ./chkrootkit
  2. 日に1回実行させ、異常があればメールで知らせる
    # su -
    # cd /etc/cron.daily/
    # vi chkrootkit
    
    #!/bin/sh
    #
    /usr/local/bin/chkrootkit > /var/log/chkrootkit_log
    grep "INFECTED" /var/log/chkrootkit_log
    chmod 600 /var/log/chkrootkit_log 
    
    # chmod 751 chkrootkit
  3. 実験
    # /etc/cron.daily/chkrootkit

lftpで除外設定

  • mirrorコマンドの`-x`オプションで除外したいファイル/ディレクトリを指定する
    1. patch -p0 < hello.patch

lftpでバッチ実行

  • lftp -c "コマンド" で接続から取得まで一括実行可能。
    以下の例では、centos用のphpモジュールを一括取得している
    1. export GREP_OPTIONS="--color=auto"

lftpでミラーリング

lftpコマンドを利用する。
「-e」オプションを付けると、コピー元にないファイルを削除する。

サーバー -> クライアントへダウンロード

cd  <コピー元のサーバ側ディレクトリ>
lcd <コピー先のクライアント側ディレクトリ>
mirror

クライアント -> サーバーへアップロード

cd  <コピー先のサーバ側ディレクトリ>
lcd <コピー元のクライアント側ディレクトリ>
mirror -R

ftpでコマンド入力すると応答がなくなる

iptablesの設定を確認。
passiveモードでログインできない場合も同様。

# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# service iptables save
# service iptables restart

インストール後、再起動前にモジュールを追加したい場合

kernel等アップデートができる。
通常のインストール後に、「rebootしますか?」とダイアログが出るが、 そのときに、ALT+F2でコンソール画面に移動できる。

rpm -ivh rpmパッケージ名

元に戻るにはALT+F1。

FTP経由インストール時にエラーが出た場合

FTPサーバーがPASSIVEモードに対応しているか確認する。
どうやら、強制的にPASSIVEモードでアクセスするようなので、失敗する場合がある。

RedHat? Linux9 のPHPを更新する

apache2.0用にインストールする場合、オプションの変更が必要なので、 SRPMからコンパイルし、インストールする。

4.3.3をインストールする場合

  1. 古いバージョンのPHPを削除しておく
    http://blogs.yahoo.co.jp/airmikan/31578937.html]]
  • [[rpmの調べ物:初めてのrpmパッケージ作り-SPECファイル - 美味しいもの - Yahoo!ブログrpm -qa | grep php
    rpm -e 古いパッケージ名
  1. 新しいsrpmをどこかからDLし、インストールする。
    rpm -ivh php-4.3.3-4.1.src.rpm
  2. php.specの編集
    cd /usr/src/redhat/SPECS/
    /usr/src/redhat/SPECS/php.specに以下の行を追加
    #build --with-apxs=%{_sbindir}/apxs
    build --with-apxs2filter=%{_sbindir}/apxs
    コンパイル時に、libphp4
    	EncodingEngine on
    	NormalizeUsername on
    	SetServerEncoding UTF-8
    	DefaultClientEncoding UTF-8 CP932 EUCJP-MS
    	AddClientEncoding .soが存在すると言って怒られるので無効にする。
    # vihttp://blogs.yahoo.co.jp/airmikan/31578937.html]]
  • [[rpmの調べ物:初めてのrpmパッケージ作り-SPECファイル - 美味しいもの - Yahoo!ブログhttp://blogs.yahoo.co.jp/airmikan/31578937.html]]
  • [[rpmの調べ物:初めてのrpmパッケージ作り-SPECファイル - 美味しいもの - Yahoo!ブログ /etc/rpm/macros.specspo
    %_unpackaged_files_terminate_build 0
  1. コンパイル&インストール
    # rpmbuild -bb --clean php.spec
    # cd /usr/src/redhat/RPMS/
    # rpm -ivh php-4.3.3-4.1.i386.rpm
    # rpm -ivh php-debuginfo-4.3.3-4.1.i386.rpm
    # rpm -ivh php-devel-4.3.3-4.1.i386.rpm
    # rpm -ivh php-domxml-4.3.3-4.1.i386.rpm
    # rpm -ivh php-imap-4.3.3-4.1.i386.rpm
    # rpm -ivh php-ldap-4.3.3-4.1.i386.rpm
    # rpm -ivh php-manual-4.3.3-4.1.i386.rpm
    # rpm -ivh php-mysql-4.3.3-4.1.i386.rpm
    # rpm -ivh php-odbc-4.3.3-4.1.i386.rpm
    # rpm -ivh php-pgsql-4.3.3-4.1.i386.rpm
    # rpm -ivh php-snmp-4.3.3-4.1.i386.rpm
  2. できあがったlibphp4.soへのリンクを張る
    # ln -s /usr/lib/apache/libphp4.so /etc/httpd/modules/libphp4.so
  3. サービスの再起動
    # service httpd restart
  4. 確認
    phpinfo.php等のファイルを作り確認する。
    <?
    phpinfo();
    ?>

オープン可能なファイル数の上限を確認する

ファイルをオープンできる上限に達する現象は、 非常に負荷の高いWEBサーバーなどでみられる


ディスクの使用量が多いユーザーを調べる

  • MBで降順ソートして表示
    du -sm /home/* | sort -nr

SELinuxを無効にする

パーミッションを許可しているのにエラーとなる場合は、これを疑う。

  • SELinuxの状態確認。disableになっていれば良い
    1. grep -B 1 hoge
  • 無効化: CentOS6
    1. grep -A 1 hoge
    • Enforcing状態から、Disabledには変わらない。Permissive(SELinuxは有効だが、ポリシーは無視)になる。ホスト再起動後にDisabledに変わる

grepやwcが遅い場合

マルチランゲージ対応版だと遅くなるようだ。日本語検索してなくてよいなら、 以下のように、LANG=Cにすることで数十倍早く実行できる。

export LANG=C

パスワード付きzipファイルを作成する

  • 作成パスワード問い合わせをする
    1. grep -L hoge /tmp/*.txt
  • 作成時にパスワード問い合わせしない。ヒストリーにパスワードが残るのであまり良くない
    1. > mirror -x "\\.svn" .
  • 展開時にパスワード問い合わせする
    1. lftp -c "open ftp.riken.jp && user anonymous password && cd /Linux/centos/4.1/centosplus/i386/RPMS/ && mget php*5.0.4-2*"
  • 展開時にパスワード問い合わせしない。ヒストリーにパスワードが残るのであまり良くない
    1. sestatus
    2. SELinux status:                 disabled

MD5を簡単に求める

md5sumを使う

md5sum ファイル名
echo -n "文字列" | md5sum

※オプション "-n" を付けないと、phpのmd5()関数との結果が違ってしまうので注意。


日付の新しい順でリスト表示

  • 日付の新しい順でリスト表示
    # ls -tl --full-time
    合計 96
    -rw-r--r--  1 root root   395 2006-11-24 16:38:46.000000000 +0900 id_rsa.pub
    -rw-------  1 root root  5310 2006-07-20 20:09:17.000000000 +0900 mbox

LAN内のネットワークは見えるが、外側のネットワークが見えない時は

内側だけに、pingが飛ぶ、外側には飛ばない場合は、
/etc/sysconfig/network にゲートウェイの設定がされていない事を疑う。

[root@bs1 root]# more /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=bs1
GATEWAY=192.168.254.1
[root@bs1 root]# service network restart

IP制限をかける

特定のIPからのアクセスを制限するには、/etc/hosts.allow と /etc/hosts.denyで行う。
例えば、ローカルLANのみ許可する場合は
/etc/hosts.allow

ALL: 192.168.1.0/255.255.255.0   # Local Network

/etc/hosts.deny

ALL:    ALL

sshポートしか空いていない場合にファイルをやりとりするには

scpコマンドを使う。
sshポートが空いていれば、ftpデーモンが起動していなくとも、使用できる。

hogeアカウントで、xxx.hoge.co.jpの*.txtをカレントに転送する場合。
再起は-rオプション

scp hoge@xxx.hoge.co.jp:\*.txt ./ 

グラフィカルログインとコンソールログインを切り替える

/etc/inittab を開き、「5」の部分を「3」にする。

#id:5:initdefault:
id:3:initdefault:

開いているポートを調べるには

nmapコマンドを使います。

# nmap IPアドレス

ディストリビューションのバージョンを確認するには

  • RedHat?/CentOSの場合は/etc/redhat-release, /etc/issueファイルにある
    1. setenforce 0
    2. perl -p -i -e 's#SELINUX=enforcing#SELINUX=disabled#' "/etc/sysconfig/selinux"
    3. perl -p -i -e 's#SELINUX=enforcing#SELINUX=disabled#' "/etc/selinux/config"
  • その他
    1. zip -qr9 -e output.zip target
  • バージョンチェック(bash)
    1. zip -qr9 -P <password> output.zip target

カーネルのバージョン等を確認するには

unameコマンドを使う。バージョン情報のみは -r。全ては --all。

# uname --all
Linux bs1 2.4.22-1.2115.nptl #1 Wed Oct 29 15:20:17 EST 2003 i686 i686 i386 GNU/Linux
  • ハードウェア
    # uname -m
    i686

Redhat Linux でパッケージ管理システム apt を使う

aptというのはDebianでのパッケージ管理システムでしたが、最近はredhat等のrpmベースのディストリビューションにも移植されています。

rpmとの違いは依存性のある関連パッケージも同時にダウンロードしてインストールしてくれるます。
rpmのようにインストールしようとすると依存するrpmが不足していていちいちダウンロードしてインストールする必要がありません。

インストール

http://apt.freshrpms.net/からDLする。

RedHat? Linux 9なら

# rpm -ivh http://ftp.freshrpms.net/pub/freshrpms/redhat/9/apt/apt-0.5.5cnc6-fr1.i386.rpm

パッケージ情報の更新

# apt-get update

依存性に問題ないかチェック

# apt-get check

phpをインストールしたい時は

# apt-get install php

主なコマンド

説明コマンド
パッケージデータベースの更新apt-get update
パッケージのインストールapt-get install パッケージ名
パッケージのアップグレード(インストール済みパッケージを最新にします)apt-get upgrade
ディストリビューションごとアップグレードされますapt-get dist-upgrade
パッケージのアンインストールapt-get remove パッケージ名
パッケージの検索apt-cache search 検索文字列
パッケージの依存関係表示apt-cache depends パッケージ名

添付ファイル: filesyslog_caller.golang.zip 68件 [詳細] fileexample.chkconfig 570件 [詳細] filecheckconfig.x86_64.patch 484件 [詳細] fileautorestart.sh 1354件 [詳細] fileexclude.list 997件 [詳細] fileDiCE 1138件 [詳細] filechangeseq.py 610件 [詳細] filecentos5.3_netinstall_error.jpg 906件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-08-17 (金) 16:38:15 (4d)