Memo/Linux

https://dexlab.net:443/pukiwiki/index.php?Memo/Linux
 

Linux


sleepは1秒以下の値も指定できる

  • CentOS 7.x
    • sleep 8.22 (coreutils-8.22-18.el7.x86_6)
  • 0.1, 0.01, 0.001も指定可能
    time sleep 0.1
    
    real    0m0.106s
    ...
    
    time sleep 0.01
    
    real    0m0.013s
    ...
    
    time sleep 0.001
    
    real    0m0.003s
    ...

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

  • CentOS 6.x
  • swapを使っているプロセスの上位10件
    grep VmSwap /proc/*/status | sort -k 2 -r | head -n 10
    
    /proc/1337/status:VmSwap:            848 kB
    /proc/1357/status:VmSwap:            840 kB
    /proc/1035/status:VmSwap:            676 kB
    ...
    
    # pidからコマンドや引数名を得る
    grep VmSwap /proc/*/status | sort -k 2 -r | head -n 10 | cut -d/ -f 3 | xargs -i ps -o pid,comm,args h {}
     1337 master          /usr/libexec/postfix/master
     1357 qmgr            qmgr -l -t fifo -u
     1035 rsyslogd        /sbin/rsyslogd -i /var/run/syslogd.pid -c 5
    ...

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


sudo時の補完を有効にする

echo "complete -cf sudo" >> ~/.bashrc

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

  • getentを使う
    getent passwd postfix
    postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    
    # HOMEの取得
    getent passwd postfix | cut -f6 -d:
    /var/spool/postfix
    
    # SHELLの取得
    getent passwd postfix | cut -f7 -d:
    /sbin/nologin
  • user, groupは「id」コマンドが便利

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

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

  • ドットから始まるファイル/ディレクトリを含める
    # 有効化
    shopt -s dotglob
    
    # 無効化
    shopt -u dotglob

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

  • プロセス毎のメモリ
    • VSS(VSZ): 仮想メモリの使用量
    • RSS: 物理メモリの使用量(共有メモリの使用量を含める) 多数のプロセスで共有メモリをシェアしている場合、RSSの合計は物理メモリを超えてしまう。
    • PSS: 物理メモリの使用量(共有メモリの使用量をプロセス間で等分する)
    • USS: 物理メモリの使用量(共有メモリの使用量を除く)
  • 例:psコマンドでのpostgresqlのRSSの合計値
    ps -eo comm,user:32,rss h | grep -P "postmaster\s+postgres\s+" | awk '{sum+=$3} END {print sum}'
    15832 # KB
  • /proc/ファイルからPSSを合計
    pgrep -U postgres postmaster | xargs -i sudo grep -i pss /proc/{}/smaps | awk '{sum+=$2}  END {print sum}'
    5483 # kB
  • pmap: 3.2.8ではPSSは表示されなかった
    pmap --version
    pmap (procps version 3.2.8)
    
    sudo pmap -x 13025
    
    13025:   /usr/bin/postmaster -p 5432 -D /var/lib/pgsql/data
    Address           Kbytes     RSS   Dirty Mode   Mapping
    0000000000400000    4492     816       0 r-x--  postgres
    ...
    ----------------  ------  ------  ------
    total kB          220728    6688    3300
  • smem memory reporting tool
    • 単位: KB
    • 合計: -t
    • ヘッダ行無し: -H
      sudo yum install smem --enablerepo=epel
      
      sudo smem -P postmaster -U postgres -t
        PID User     Command                         Swap      USS      PSS      RSS 
      13031 postgres postgres: logger process           0      140      309     1548 
      13036 postgres postgres: wal writer proces        0      152      338     1732 
      13038 postgres postgres: stats collector p        0      184      377     1780 
      13035 postgres postgres: writer process           0      172      474     2004 
      13037 postgres postgres: autovacuum launch        0      276      519     2080 
      13025 postgres /usr/bin/postmaster -p 5432        0     2804     3483     6688 
      -------------------------------------------------------------------------------
          6 1                                           0     3728     5500    15832

プロセスのデーモン化

  • RedHat?/CentOS
    • /etc/init.d/functions に定義している関数「daemon」「killproc」「status」が肝心
    • CentOS6: ドキュメント
      less /usr/share/doc/initscripts-9.03.31/sysvinitfiles

GNU parallel コマンドの並列実行


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

  • 以下のようなディレクトリ構成
    LANG=C ll /usr/share/doc/ | grep zabbix
    drwxr-xr-x  2 root root 4096 Dec  9 18:09 zabbix-agent-3.0.5
    drwxr-xr-x  2 root root 4096 Dec  9 18:09 zabbix-get-3.0.5
    drwxr-xr-x  2 root root 4096 Dec  9 18:10 zabbix-sender-3.0.5
    drwxr-xr-x  2 root root 4096 Dec  9 18:09 zabbix-server-mysql-3.0.5
    drwxr-xr-x  2 root root 4096 Dec  9 18:09 zabbix-web-3.0.5
  • zabbix-server-mysql-3.0.5 に移動したいが、プログラム中にはバージョン番号を入れたくない場合、ワイルドカードが使える
    cd /usr/share/doc/zabbix-*-mysql*
    
    pwd
    /usr/share/doc/zabbix-server-mysql-3.0.5

HDD廃棄時のデータ削除/消去/フォーマット

HDDを廃棄する時に安全に削除を行うツール
SSDは「Secure Erase」が安全。


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

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

  • ファイル/ディレクトリを直接削除するのではなく一度ごみ箱「~/.Trash/」に入れるようにする
  • ゴミ箱中の同名ファイル/ディレクトリはファイル名末尾に「.~1~」のように番号が付く
  • 30日より前のファイルは削除
  • aliasではないrmを実行したい場合は「\rm」のようにする
    • CentOS 6.x:
      mkdir -p ~/.Trash
      echo "alias rm='find ~/.Trash/ -mtime +30 -a \( -type f -o -type l \) -delete -o -empty -type d -delete;mv -f --backup=numbered --target-directory ~/.Trash/'" >> ~/.bashrc
      source ~/.bashrc

NetworkManager?

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


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

cp --parents /etc/hosts /tmp/

tree /tmp/etc/
/tmp/etc/
└── hosts

sshdの設定を確認する

  • 現在の設定を確認
    sudo sshd -T | sort
  • 任意の設定ファイルを指定してテスト
    sudo sshd -T -f ./sshd_config

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


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

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

  • 環境
    • CentOS 6.x 64bit
  • 対策
    • slabキャッシュ解放
      sync; echo 2 > /proc/sys/vm/drop_caches
    • curl, nssの更新
      sudo yum update curl nss-softokn
    • curlを実行するスクリプトに追加。2択
      export NSS_SDB_USE_CACHE=yes
      # または
      export TMPDIR=/dev/shm
  • 対策前:
    # curl実行後 dentunusd が大きく増えている事を確認
    sar -v 1
    105021秒 dentunusd   file-nr  inode-nr    pty-nr
    10502242860       768     27417        10
    10502342860       768     27417        10
    ...
    
    strace -fc -e trace=access curl -s 'https://www.google.com' > /dev/null
    % time     seconds  usecs/call     calls    errors syscall
    ------ ----------- ----------- --------- --------- ----------------
    100.00    0.000056           0      4505      4503 access
    ------ ----------- ----------- --------- --------- ----------------
    100.00    0.000056                  4505      4503 total
  • 対策後:
    export NSS_SDB_USE_CACHE=yes
    strace -fc -e trace=access curl -s 'https://www.google.com' > /dev/null
    % time     seconds  usecs/call     calls    errors syscall
    ------ ----------- ----------- --------- --------- ----------------
      0.00    0.000000           0        23        21 access
    ------ ----------- ----------- --------- --------- ----------------
    100.00    0.000000                    23        21 total

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

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

  • 不要な場合は停止
    for srv in abrtd abrt-ccpp abrt-oops abrt-pstoreoops abrt-vmcore abrt-xorg abrt-dbus;do sudo service $srv stop;sudo chkconfig $srv off; done

先頭行/任意の行に追加

  • "1i" で1行目を指定して追加する。
    echo -e "1:foo\n2:var" >> tmp.txt
    sed -i -e "1i 1:hoge" tmp.txt
    cat tmp.txt 
    1:hoge
    1:foo
    2:var

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

  • 「*.htm」のファイルを「.htm」から「.html」に名前を変更する
    rename .htm .html *.htm

デバイスのUUIDを調べる

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

  • blkidを使う
    sudo blkid
    /dev/sda1: UUID="b599d616-e521-449f-89a0-7f838614bc56" TYPE="ext2"
    /dev/sda5: UUID="HOiXD0-6j1h-Q3up-Et62-fvHk-mPIr-Ynglet" TYPE="LVM2_member"
    /dev/mapper/mediacenter-root: UUID="e0aeadc6-742f-42b4-b0e4-de4ecd6f5abd" TYPE="ext4"
    /dev/mapper/mediacenter-swap_1: UUID="9874055b-0ddc-4910-a319-fc3c1e20ab81" TYPE="swap"
    
    # デバイスを指定して調べる
    sudo blkid /dev/sda1
    /dev/sda1: UUID="b599d616-e521-449f-89a0-7f838614bc56" TYPE="ext2"
  • 例:/etc/fstab (Ubuntu 12.04 LTS)
    proc            /proc           proc    nodev,noexec,nosuid 0       0
    UUID=e0aeadc6-742f-42b4-b0e4-de4ecd6f5abd /               ext4    errors=remount-ro 0       1
    UUID=b599d616-e521-449f-89a0-7f838614bc56 /boot           ext2    defaults        0       2
    UUID=9874055b-0ddc-4910-a319-fc3c1e20ab81 none            swap    sw              0       0

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

  • user01をwheelグループへ追加。usermod の場合、'a'が無いとプライマリグループの変更になる。
    sudo gpasswd -a user01 wheel
    # または
    sudo usermod -aG wheel user01
    
    id user01
    uid=501(user01) gid=501(user01) groups=501(user01),10(wheel)
  • 「/etc/group-」は1世代前のバックアップなので間違ってusermod -Gした場合は復元できる。
  • user01をwheelグループから削除
    sudo gpasswd -d user01 wheel

/etc/fstabの構文チェック

sudo mount -fav

Linuxコマンドの色付け


ポート解放確認

  • ncを使う
    • CentOS 6.x: 「-w 3」で3秒でタイムアウト
      nc -zv -w 3 www.example.com 80;echo $?
      Connection to www.example.com 80 port [tcp/http] succeeded!
      0
    • CentOS 7: ncがncatのエイリアスに変わったため、「-z」オプションが使えなくなった
      nc -v -i 1 -w 3 www.example.com 80;echo $?
      Ncat: Version 6.40 ( http://nmap.org/ncat )
      Ncat: Connected to 93.184.216.34:80.
      Ncat: Idle timeout expired (1000 ms).
      1
      # または
      timeout 1 bash -c 'cat < /dev/null > /dev/tcp/www.example.com/80';echo $?
      # 正常の場合:0 / 異常(timeout)の場合:124
  • サーバ側のListenも可能: 例:tcp/10080
    # 1回リクエストがあると終了する
    nc -l 10080
    
    # -k: 接続を継続する
    nc -l 10080 -k

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

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

ネットワーク帯域制限


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

  • 現在の設定を確認
    chage -l <username>
  • 90日にしたい場合
    sudo chage -M 90 <username>
  • 有効期限設定の解除
    sudo chage -I -1 -m 0 -M 99999 -E -1 <username>

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

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

  • CentOS 5.8の場合
    sudo -u zabbixsrv env | grep HOME
    HOME=/root
  • CentOS 6.3の場合
    sudo -u zabbixsrv env | grep HOME
    HOME=/var/lib/zabbixsrv
  • CentOS5でもユーザのHOMEになるように修正
    sudo visudo
    ----
    Defaults    always_set_home
    ----

core dump コアダンプを出力

  • CentOS6.xの場合デフォルトではcoreファイルは出力されない
    ulimit -a | grep core
    core file size          (blocks, -c) 0
  • プロセス毎のlimitsを確認
    sudo cat /proc/$(pidof mysqld)/limits
  • 一時的に有効にする場合。ユーザ/セッション毎なのでログアウトしたら元に戻る
    # 1GB
    ulimit -c 1000000
    # 無制限
    ulimit -c unlimited
  • coreファイルの出力場所。デフォルトでは /core
    cat /proc/sys/kernel/core_pattern
    core
    
    # 例:/tmp/core
    echo /tmp/core > /proc/sys/kernel/core_pattern
    
    # 例:/tmp/core.<%e:実行ファイル名>.<%p:PID>.<%u:UID>
    echo /tmp/core.%e.%p.%u > /proc/sys/kernel/core_pattern
  • デーモン含め、恒久的に有効にする場合
    vim /etc/security/limits.conf
    ----
    *               soft    core            unlimited
    ----
    
    echo -e "kernel.core_pattern = /tmp/core.%e.%p.%u\nfs.suid_dumpable = 2" >> /etc/sysctl.conf
    echo "DAEMON_COREFILE_LIMIT=unlimited" >> /etc/sysconfig/init
    
    sysctl -p
    
    # daemonの再起動またはホストの再起動
    service <daemon> restart

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スクリプトで代用
    cp /usr/share/doc/bash-3.2/scripts/timeout /usr/local/bin/
    chmod 755 /usr/local/bin/timeout
  • tailコマンドを3秒間実行
    sudo timeout 3 tail -f /var/log/messages
  • timeoutする場合、exit code:124を返す
    timeout 1 sleep 5;echo $?
    124

ホスト名の変更

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

タイムゾーンの変更

  • CentOS6.x, UTC => JSTに変更する場合
    • crondの再起動が必要
    • /etc/localtimeを更新するコマンドがあるので使う
      • CentOS6は tzdata-update コマンド
      • CentOS7は tzdata-update コマンド
        sudo vi /etc/sysconfig/clock
        ----
        ZONE="Asia/Tokyo"
        UTC=false
        ----
        
        # CentOS7
        sudo timedatectl set-timezone Asia/Tokyo
        
        # CentOS6
        sudo /usr/sbin/tzdata-update
        
        # crond再起動
        sudo service crond restart

HDDの修復


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

  • バイナリ: 100MBのファイルを作成
    head -c 100m /dev/urandom > 100m.dummy

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

less /etc/passwd | grep apache
apache:x:48:48:Apache:/var/www:/sbin/nologin

sudo su - apache --shell=/bin/bash --command="pwd"
/var/www

16進数ダンプ

  • odを使う
    echo Hello | od -tx1c
    
    0000000  48  65  6c  6c  6f  0a
              H   e   l   l   o  \n

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

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

  • 例:mysql用のトンネルsshを削除。「13306:」を含んだプロセスをkill
    ssh -fNg -L 13306:mysql.example.com:3306 gw.example.com
    
    pgrep -u $USER -l -f 13306
    2225 ssh -fNg -L 13306:127.0.0.1:3306 127.0.0.1
    
    pkill -u $USER -f 13306:
    
    # シグナルを指定: -15 (SIGKILL)、-9 (SIGTERM) -9はDBやLDAP等のデータストアに対して通常は実行しない。データが失われる可能性がある
    pkill -9 -f <process name>

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

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

  • ハッシュの作成には、SATA接続HDDの1.1TBのデータに対して、約13時間かかった
  • ハッシュリスト作成時エラー。標準出力に出る
    • No such file or directory
  • UTF-8のファイルを比較した時、いくつかmd5が事なる場合があった。しかし、異なった結果になったファイルを「md5sum filename」で比較すると同じだった。
  • CentOS5.x, 6.x
    sudo yum install md5deep --enablerepo=epel
  • Ubuntu 12.04 LTS
    sudo aptitude install md5deep
  • コピー元のハッシュリスト作成
    nohup md5deep -r /mnt/disk1/SRC-DIR > SRC-DIR.$(date +%Y%m%d).list &
  • ハッシュリストとコピ−先を比較。差が無ければ何も出力されない。
    md5deep -X SRC-DIR.list -r /mnt/disk2/DEST-DIR

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

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

  • ext4でフォーマット, 予約領域:0%, 大きいファイルだけ扱う場合
    sudo mkfs.ext4 /dev/sdb1 -m 0 -T largefile

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

  • どのドライブの使用率が高いのかがわかる
    • r/s: 秒間の読み込み回数
    • w/s: 秒間の書き込み回数
    • avgrq-sz: 平均 I/O サイズ
    • avgqu-sz: 平均待ち行列長
    • await: レスポンスタイム。I/O を実施していない待ち時間を含む
    • svctm: サービスタイム。1回のI/Oに要する時間(ミリ秒)
    • %util: 使用率(ビジー率)
      iostat -x 5
      
      # iowaitが44%と高く、sdbの%utilが異常に高い
      avg-cpu:  %user   %nice %system %iowait  %steal   %idle
                 1.00    0.00    3.50   44.36    0.00   51.15
      
      Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
      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
      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
      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
      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
  • iotopを使う
    sudo yum install iotop
    iotop -d 5
  • dstatを使う(kernel 2.6.20以上)
    sudo yum install dstat
    sudo dstat --time --top-io

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

  • pgrepを使う: ユーザやプロセス名を指定しできる
    pgrep -u nginx | xargs -i ps -o lstart h {}
    Fri Mar  3 12:34:25 2017
  • psコマンドを使う
    • lstart: プロセスの起動時間
    • etime: プロセス起動からの経過時間。[[dd-]hh:]mm:ss
      ps -eo pid,ppid,lstart,etime,cmd h
      ...
       1303     1 Thu May 29 09:52:18 2014    06:04:05 /sbin/rsyslogd -i /var/run/syslogd.pid -c 5
       1339     1 Thu May 29 09:52:20 2014    06:04:03 /usr/sbin/sshd
      ...
  • etimeを秒に変換。例: crond
    # psの結果
    ps -eo comm,user:32,etime,args h | grep -P "^crond\s+root"
    crond           root                                01:50:19 crond
    
    # 秒に変換
    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"'
    6619

CentOS6.xでIPv6の無効化

echo "NETWORKING_IPV6=no" >> /etc/sysconfig/network
echo "options ipv6 disable=1" >> /etc/modprobe.d/disable-ipv6.conf
service ip6tables stop
chkconfig ip6tables off

vim /etc/hosts
----
#::1         localhost
----

service network restart

PowerTOP: 省電力化


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


curlでSSLが失敗する場合

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

  • CentOS6.x
    mv /etc/pki/tls/certs/ca-bundle.crt /etc/pki/tls/certs/ca-bundle.crt.$(date +%Y%m%d)
    wget http://curl.haxx.se/ca/cacert.pem -O /etc/pki/tls/certs/ca-bundle.crt

gawkでグループマッチ

  • 0/10の0の部分だけを取り出す
    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] }'

logwatchメールの停止

  • CentOS5.x
    chmod -x /etc/cron.daily/0logwatch

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

  • test -ef を使う
    ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
    test /usr/share/zoneinfo/Asia/Tokyo -ef /etc/localtime
    echo $? # 0

mv: inter-device move failed:

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

ゾンビプロセスの数

  • ps, topの例。psの方が早い
    ps aux | awk 'BEGIN {c=0} {if ($8 ~ /Z/) c+=1} END {print c}'
    1
    
    top -b -d1 -n1 | awk 'BEGIN {c=0} {if ($8 ~ /Z/) c+=1} END {print c}'
    1
    
    # ゾンビプロセスだけ表示
    ps aux | awk '{if($8 ~ /Z/) print}'

CentOS6.xでmkpasswdを使う

yum install expect

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

  • scriptでCUI操作ログをとる 来栖川電算
    • そのままではscpで接続できない&scriptプロセスが残り続ける問題があるため改良
      vim /etc/profile.d/user-logging.sh
      ----
      LOG_DIR=/tmp
      if [ -n "$SSH_CLIENT" ]; then
      	TOPPROCESS_JUDGE_TOKEN='sshd:'
      else
      	TOPPROCESS_JUDGE_TOKEN='login'
      fi
      
      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
      	SCRIPTLOGFILE="${LOG_DIR}/$(whoami)_$(date +%Y%m%d%H%M)_$$.log"
      	touch $SCRIPTLOGFILE
      	chmod 600 $SCRIPTLOGFILE
      	script $SCRIPTLOGFILE
      	exit
      fi
      ----

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


OS判別

cat /etc/issue | cut -d ' ' -f 1 | head -1 | tr "[:upper:]" "[:lower:]"
centos
ubuntu
raspbian

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

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

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
      sudo yum install samba
    • Raspbian
      sudo aptitude install samba-common-bin
  • Linuxからテスト
    net rpc shutdown -f -t '30' -C 'shutdown by remote user' -I '192.168.1.100' -U 'shutdown%password'

CentOS6.x

  • リモートからsudoコマンドを使えるように
    visudo
    ----
    Defaults    !requiretty
    ----
  • シャットダウン用ユーザを作成し、パスワードを設定(CentOS6.xには既に存在したので不要)
    useradd -g root -M shutdown
    passwd shutdown
  • スクリプトを配置して、ログインシェルに指定(/etc/passwordのログインシェルに引数を設定できなかったため)
    echo -e '#!/bin/sh\n/usr/bin/sudo /sbin/shutdown -h now' > /usr/local/sbin/shutdown.sh
    chmod 750 /usr/local/sbin/shutdown.sh
    
    vipw
    ----
    #shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    shutdown:x:6:0:shutdown:/sbin:/usr/local/sbin/shutdown.sh
    ----
    
    visudo
    ----
    shutdown ALL=NOPASSWD: /sbin/shutdown, /sbin/halt, /sbin/poweroff, /sbin/reboot
    ----
  • テスト(実際にシャットダウンするので注意)
    su - shutdown

指定範囲の行を取得

  • 1 〜 10までの行を作成
    seq 10 > seq.txt
  • sedを使う
    sed -n '2,4p' seq.txt
  • headとtailを使う
    START=2;END=4;head -n $END seq.txt  | tail -n $(($END - $START + 1))

flockでファイルロック

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

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

  • comm は15文字を超えるとカットされる。「comm:20」にしても拡張できなかった
  • user は 8文字を超えると uid で表示される。「uid:20」と最大文字数を指定すれば表示される
  • ユーザ、コマンド、%CPUだけ表示。ヘッダ行なし
    ps -eo user,pcpu,comm h
    root      0.0 bash
    apache    0.0 httpd
    ...
  • apacheユーザ、httpdプロセスの%CPUだけ合計(※デュアルコア以上だと値が変)
    ps -eo user,comm,pcpu h | grep -P "apache\s+httpd" | awk '{sum+=$3} END {print sum}'
    1.1
  • apacheユーザ、httpdプロセスのRSS(物理メモリ使用量)だけ合計
     ps -eo user,comm,rss h | grep -P "apache\s+httpd\s+" | awk '{sum+=$3} END {print sum}'
    134712

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

  • sysstat-8.0以上に含まれている
  • CentOS6.xのsysstatパッケージにpidstatが含まれているが、CentOS5.xには入っていない
  • マルチコアの場合、%CPU等の値が100を超えるなど変
  • CentOS6.3(sysstat-9.0.4-20.el6.x86_64 にはpidstat含まれている)
    yum install sysstat
    
    # 一覧表示
    pidstat                                                                                                                                           
    Linux 2.6.18-308.1.1.el5 (hostname)       07/09/13        _x86_64_        (2 CPU)
    
    17:49:10      UID       PID    %usr %system  %guest    %CPU   CPU  Command
    17:49:10        0         1    0.00    0.00    0.00    0.00     0  init
    17:49:10        0         3    0.00    0.00    0.00    0.00     0  ksoftirqd/0
    ...
    
    # PIDを指定
    pgrep -u apache httpd
    ...
    30222
    
    
    # 1秒おきに、2回取得
    pidstat -p 30222 1 2                                                                                                                               
    Linux 2.6.18-308.1.1.el5 (hostname)       07/09/13        _x86_64_        (2 CPU)
    
    17:51:42      UID       PID    %usr %system  %guest    %CPU   CPU  Command
    17:51:43       48     30222    0.00    0.00    0.00    0.00     1  httpd
    17:51:44       48     30222    0.00    0.00    0.00    0.00     1  httpd
    Average:       48     30222    0.00    0.00    0.00    0.00     -  httpd
  • CentOS5.8(sysstat-7.0.2-12.el5 にはpidstat含まれない) srpmからインストール
    cd /usr/src/redhat/
    wget http://pagesperso-orange.fr/sebastien.godard/sysstat-10.1.6-1.src.rpm
    rpm -ivh --nomd5 sysstat-10.1.6-1.src.rpm
    rpmbuild -ba SPECS/sysstat-10.1.6.spec
    rpm -Uvh RPMS/x86_64/sysstat-10.1.6-1.x86_64.rpm

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

  • 共有ディレクトリ:/var/www/example.com
  • 共有グループ:share
    sudo groupadd share
    sudo mkdir -p /var/www/example.com
    sudo chown :share /var/www/example.com
    sudo chmod 775 /var/www/example.com
    sudo chmod g+s /var/www/example.com
    • 同じshareグループのユーザが新規ファイル作成すると0644、新規ディレクトリ作成すると2775になる
  • SGIDの削除
    sudo chmod g-s /var/www/example.com

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安定版をインストールする
    yum install jdk.x86_64
    wget http://ftp.riken.jp/net/apache/hadoop/common/hadoop-1.1.2/hadoop-1.1.2-1.x86_64.rpm
    rpm -Uvh hadoop-1.1.2-1.x86_64.rpm

障害調査


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

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

  • wwを付ける
    ps uxww

curlオプション

  • プロキシ経由でアクセス
    curl -x proxy.example.com:8080 -L https://www.google.com
  • --retry-max-time <seconds> : リトライを指定時間以内に終わらせる。
  • --retry <num> : 再試行回数。--max-timeには影響されず、--retry-max-timeを指定する必要がある
  • -m/--max-time <seconds> : コマンド実行を指定時間以内に終わらせる。ただし、--retryには影響しない
  • --connect-timeout <seconds> : 接続するまでのタイムアウト。接続した後に時間がかかる場合には向かない
  • -w/--write-out <format> : 出力を加工
    # http status
    curl -s -w "%{http_code}" "http://www.google.co.jp" -o /dev/null 2>&1
    200 #結果
    
    # download spees (byte)
    curl -s -w "%{speed_download}" "http://www.google.co.jp" -o /dev/null 2>&1
    242079.000
  • -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互換の正規表現が使えるので便利
  • ログインに失敗したユーザ数を降順で表示
    zgrep -o -P 'Failed password for [\w\-\_]+' /var/log/secure | sort | uniq -c | sort -nr
       1098 Failed password for root
        489 Failed password for invalid
         11 Failed password for bin
          1 Failed password for ftp

UID/GIDを変更する

  • login name: user1 / UID:1000 / GID:1000 を UID:2000 / GID:2000 に変更する場合
    usermod -u 1000 user1
    groupmod -g 1000 user1
    find /home/user1 -gid 2000 -exec chown user1. {} \;

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

  • Gmailでも表示できるスクリプト
    sudo yum install mutt sharutils
    
    cat > gmail.sh << 'EOS'
    #!/bin/bash
    # encoding: utf-8
    
    readonly CUR_DIR=$(cd $(dirname $0);pwd)
    mail_to='bar@example.com'
    mail_from='foo <foo@example.com>'
    subject='メール件名'
    body='メール本文
    テスト'
    attachment_file=$CUR_DIR/`basename $0`
    
    export EMAIL=$mail_from
    export LANG=ja_JP.UTF-8
    echo "${body}" | mutt -n -s "${subject}" "${mail_to}" -a "${attachment_file}"
    
    # vim: ts=4:sw=4
    EOS
  • FROMヘッダの指定。環境変数に書くか、~/.muttrc に追加
    export EMAIL="foo <foo@example.com>"
    
    vi ~/.muttrc
    ----
    set envelope_from=yes
    set from="from@address"
    ----

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

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

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

  • gzip(.gz), compress(.Z), pack(.z),
    zmore /var/log/maillog.1.gz
    
    zless /var/log/maillog.1.gz
    
    zcat /var/log/maillog.1.gz
  • その他コマンド
    zcat        zdiff       zegrep      zforce      zic         zipcloak    zipgrep     zipnote     zless       znew
    zcmp        zdump       zfgrep      zgrep       zip         zipdetails  zipinfo     zipsplit    zmore       zsoelim

プロセス一覧の取得

  • ps + grep ではgrepプロセスも表示されるため工夫が必要
    ps aux | grep httpd
    root      1975  0.0  0.9 247992  9828 ?        Ss   12:27   0:00 /usr/sbin/httpd
    apache    1992  0.0  0.6 247992  6164 ?        S    12:27   0:00 /usr/sbin/httpd
    ...
    hoge      3386  0.0  0.0 107444   964 pts/1    S+   18:00   0:00 grep httpd
    
    # httpdプロセスだけ表示
    ps aux | grep '[h]ttpd'
  • pgrep を使う
    pgrep -lf httpd
    1975 /usr/sbin/httpd
    1992 /usr/sbin/httpd
    ...
    • pidだけ取得
      pgrep -u apache -f /usr/sbin/httpd
      1975
      1992
      ...
  • pstree でツリー状に取得
    $ pstree
    init─┬─acpid
         ├─atd
         ├─automount───5*[{automount}]
    ...
  • pidファイルを見る。親プロセスのpidだけ記録されている
    cat /var/run/httpd.pid 
    30607

umountでdevice is busy エラー

  • umountでエラーが出る場合、なにかのプロセスが使っているためプロセスを調べて終了させる
    umount -f /mnt
    
    fuser -muv /mnt

seq 規則的な数値を得る

  • 数値の連番(FIRST LAST)
    seq 0 3
    0
    1
    2
    3
  • 10から、-2つづ、5まで(FIRST INCREMENT LAST)
    seq 10 -2 5
    10
    8
    6
  • -f: printfスタイルフォーマットを指定して表示
    seq -f "%04.2f" 1 0.1 1.5
    1.00
    1.10
    1.20
    1.30
    1.40
    1.50
  • -s: 区切り文字を指定
    seq -s , 0 3
    0,1,2,3
  • -w: 0で桁埋めして表示
    seq -w 0 10 100
    000
    010
    020
    030
    040
    050
    060
    070
    080
    090
    100

crontabでログ処理

  • bash,zshで標準出力、標準エラーまとめてリダイレクト
    command >& /dev/null
  • syslogに記録(/var/log/messages)
    * * * * * /path/to/command 2>&1 | logger -t mycommand -p local0.info

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

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

  • CentOS6.x
    perl -p -i -e 's#ACTIVE_CONSOLES=/dev/tty\[1-6\]#ACTIVE_CONSOLES=/dev/tty[1-1]#' /etc/sysconfig/init
    reboot
  • CentOS5.x
    perl -p -i -e 's/^2:2345/#2:2345/' /etc/inittab
    perl -p -i -e 's/^3:2345/#3:2345/' /etc/inittab
    perl -p -i -e 's/^4:2345/#4:2345/' /etc/inittab
    perl -p -i -e 's/^5:2345/#5:2345/' /etc/inittab
    perl -p -i -e 's/^6:2345/#6:2345/' /etc/inittab
    reboot

フリーズした時の対処

  • 端末、ターミナル
    • 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等、パーティションフォーマット確認。
    df -T
  • ファイルを削除したコマンドの時間をメモ
    HISTTIMEFORMAT="%F %T " history
  • 対象パーティションを読み取り専用でマウント
    mount -o remount,ro /dev/sdb1
  • extundelete のインストール
    • CentOS6:
      sudo yum install extundelete --enablerepo=epel
    • CentOS5:
      yum -y install make gcc gcc-c++ e2fsprogs-devel
      mkdir /tmp/0
      cd /tmp/0
      wget --trust-server-names "http://downloads.sourceforge.net/project/extundelete/extundelete/0.2.4/extundelete-0.2.4.tar.bz2"
      tar xvfj extundelete-0.2.4.tar.bz2
      cd extundelete-0.2.4
      ./configure --prefix=/usr/local
      make
      sudo make install
      extundelete --help
  • 復元
    cd /tmp
    
    # 復元したいファイルパスが分かっている場合
    sudo extundelete --restore-file /home/user01/README.md /dev/sdb1
    
    # 1時間以内に削除したファイルを復元
    sudo extundelete --restore-all --after $(date +%s -d '1 hour ago') /dev/sdb1
    
    # RECOVERED_FILES ディレクトリ以下に復元されたか確認。安全な場所にコピー
  • 対象パーティションを再マウント
    mount -o remount,rw /dev/sdb1

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

  • readlink を使う。-fで常に絶対パスを取得
    ls -l /usr/java/
    合計 4
    lrwxrwxrwx. 1 root root    6  95 11:15 2012 default -> latest
    drwxr-xr-x. 2 root root 4096  95 11:07 2012 jdk-1.7.0
    lrwxrwxrwx. 1 root root    9  95 11:15 2012 latest -> jdk-1.7.0
    
    readlink /usr/java/default                                                                         
    latest
    
    readlink -f /usr/java/default
    /usr/java/jdk-1.7.0

trコマンドで置換

# file内の文字'e'を'x'に変換する。
tr e x < file

# file内の小文字を大文字に変換する。
tr '[a-z]' '[A-Z]' < file

# file内のスペースをすべてタブに変換する。
tr ' ' '\11' < file

# file内の複数スペースをすべて1つのタブに変換する。
tr -s ' ' '\11' < file

# file内のスペースをすべて削除する。
tr -d ' ' < file

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

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

CPUコア数を調べる

  • CentOS6.x
  • CPUコア数を調べる(Intel HTなら物理CPUより増える)
    cat /proc/cpuinfo | grep "processor" | wc -l
    2
    
    egrep -c "^processor[[:space:]]+:[[:space:]]+[0-9]+$" /proc/cpuinfo
    2
    
    # coreutils にある
    nproc
    2
    
    # util-linux-ng にある
    LANG=C lscpu                                                                           
    Architecture:          x86_64
    CPU op-mode(s):        32-bit, 64-bit
    Byte Order:            Little Endian
    CPU(s):                2
    ...
    
    # glibc-common にある
    getconf _NPROCESSORS_ONLN
    2
  • 物理CPU。"physical id"が異なれば違うCPU。同じならIntel HTなど。
    cat /proc/cpuinfo | grep "physical id"
    physical id     : 0
    physical id     : 1

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

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


atime,ctime,mtimeの取得取得

  • statコマンドを使う
    touch test
    stat test
      File: `test'
      Size: 0               Blocks: 0          IO Block: 4096   通常の空ファイル
    Device: fd00h/64768d    Inode: 16825       Links: 1
    Access: (0664/-rw-rw-r--)  Uid: (  501/user01)   Gid: (  501/user01)
    Access: 2017-01-04 13:07:45.113462561 +0900
    Modify: 2017-01-04 13:07:45.113462561 +0900
    Change: 2017-01-04 13:07:45.113462561 +0900
  • mtimeだけの取得
    touch test
    stat --print=%y test | cut -d ' ' -f 1
    2017-01-04

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

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

echo -e "var1" | cut -f1
var1

echo -e "var1" | cut -f2
var1

echo -e "var1" | cut -s -f1

echo -e "var1\tvar2" | cut -s -f2                                                                         
var2

chkconfig対応スクリプトの作成

  • ひな形
    • fileexample.chkconfig
      mv example /etc/rc.d/init.d/
      chmod 755 /etc/rc.d/init.d/example
      chown root:root /etc/rc.d/init.d/example
      chkconfig --add example
      chkconfig example on
      service example restart
  • /etc/rc.d/init.d/functions か肝心なので軽く読んでみると良い
    . /etc/rc.d/init.d/functions
  • cat > test.sh << 'EOS'
    #!/bin/bash
    
    . /etc/rc.d/init.d/functions
    
    echo "success" && echo_success
    echo "failure" && echo_failure
    echo "passed" && echo_passed
    echo "warning" && echo_warning
    EOS
    
    LANG=C bash test.sh
    success                                                    [  OK  ]
    failure                                                    [FAILED]
    passed                                                     [PASSED]
    warning                                                    [WARNING]

新規ユーザ追加時の処理

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

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

id hoge
uid=500(hoge) gid=500(hoge) 所属グループ=500(hoge)

id -u
500

id -u -n
hoge

id -g
10

id -g -n
wheel

alternativesで複数ソフトを共存

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

  • 例:MTAの切り替え(sendmail, postfix)
    # 手動選択
    alternatives --config mta
    
    # 自動選択
    alternatives --set mta /usr/sbin/sendmail.postfix
    
    # 自動選択。番号がわかっていれば上と同様
    echo 2 | alternatives --config mta
  • javaの例
    # 追加。複数ファイルで構成されている場合は--slaveオプションも付ける
    # --install [シンボリックリンク名] [グループ名] [バイナリ本体] [優先度] \
    #   --slave [シンボリックリンク名] [グループ名] [バイナリ本体]
    # ※優先度は大きいほど高い
    alternatives --install /usr/bin/java java /usr/java/jdk1.6.0_31/bin/java 16031 \
      --slave /usr/bin/jar java-jar /usr/java/jdk1.6.0_31/bin/jar \
      --slave /usr/bin/javac java-javac /usr/java/jdk1.6.0_31/bin/javac \
      --slave /usr/bin/javadoc java-javadoc /usr/java/jdk1.6.0_31/bin/javadoc \
      --slave /usr/bin/javaws java-javaws /usr/java/jdk1.6.0_31/bin/javaws \
      --slave /usr/bin/jcontrol java-jcontrol /usr/java/jdk1.6.0_31/bin/jcontrol
    
    # 手動選択
    alternatives --config java
    # 自動選択
    alternatives --set java /usr/java/jdk1.6.0_31/bin/java
    
    # 削除
    # --remove [グループ名] [削除したいバイナリ本体]
    alternatives --remove java /usr/java/jdk1.6.0_31/bin/java
    
    # 現在の設定
    alternatives --display java
    java - ステータスは手動です。
    リンクは現在 /usr/java/jdk1.6.0_31/bin/java を指しています。
    /usr/java/jdk1.6.0_31/bin/java - 優先項目 30
    現在の「最適」バージョンは /usr/java/jdk1.6.0_31/bin/java です。
    
    # 設定情報
    ls -l /etc/alternatives/

高速に空ファイルを生成

  • 10GBの空ファイル。seekがポイント
    dd if=/dev/zero of=/tmp/dummy count=1 bs=1 seek=10G

セキュリティ


CentOS6.x


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

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

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

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

  • 新規コマンドを指定する場合。実行中の標準出力は"nohup.out"に保存される
    nohup hoge.sh &
  • 既存プロセスを指定する場合
    disown job番号

ソフトウェアRAID

  • CentOS5.xの初期設定
  1. 1TB x2台でソフトウェアRAIDを構成する
  2. カスタムレイアウトを選択。CentOS5のネットワークインストール中にソフトウェアRAIDを構築しよう 2
  3. GURBを/dev/md0上にインストール を選択
  4. grubはsdaにしかインストールされてないので、sdbにもインストールしてやる
    # more /boot/grub/device.map 
    # this device map was generated by anaconda
    (hd0)     /dev/sda
    (hd1)     /dev/sdb
    
    [root@linux ~]# grub
     grub> root (hd0,0)
     grub> setup (hd0)
     grub> root (hd1,0)
     grub> setup (hd1)
     grub> quit
  5. RAID監視デーモンのメール送信先を変更 RAIDをモニタモードで監視するには − @IT
    vi /etc/mdadm.conf
    ----
    MAILADDR hoge@example.com
    ----
    service mdmonitor restar

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

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


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

vi /etc/pam.d/password-auth
----
auth required pam_env.so
# 6回以上の失敗アクセスがあった場合、システム管理者がリセットするまで無効
auth required pam_tally2.so deny=6
auth sufficient pam_unix.so try_first_pass nullok
auth required pam_deny.so

account required pam_unix.so

password requisite pam_cracklib.so try_first_pass retry=3 type=
# 過去4回のパスワードを回転使用できないように
password sufficient pam_unix.so try_first_pass use_authtok nullok sha512 shadow remember=4
password required pam_deny.so

session optional pam_keyinit.so revoke
session required pam_limits.so
session [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session required pam_unix.so
----

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


迷惑/スパムメール対策

ログの削除

# 公開鍵の消去
echo "" > /root/.ssh/authorized_keys

# ログの消去
# /var/log/cron.1 や cron.1.gz も削除
find /var/log/* -regextype posix-egrep \( -regex ".+\.[0-9]+$" -or -regex ".+\.[0-9]+\.gz$" \) -type f -delete
echo "" > /var/log/boot.log
echo "" > /var/log/btmp
echo "" > /var/log/cron
echo "" > /var/log/dmesg
echo "" > /var/log/dmesg.old
echo "" > /var/log/lastlog
echo "" > /var/log/maillog
echo "" > /var/log/messages
echo "" > /var/log/secure
echo "" > /var/log/spooler
echo "" > /var/log/tallylog
echo "" > /var/log/wtmp
echo "" > /var/log/yum.log
echo "" > /var/log/audit/audit.log

if [ -d /var/log/httpd ]; then
	for file in `ls /var/log/httpd/*_log`; do
		echo "" > $file
	done
fi

if [ -f /var/log/mysqld.log ]; then
	for file in `ls /var/log/mysql*.log`; do
		echo "" > $file
	done
fi

if [ -f /var/log/postgresql.log ]; then
	for file in `ls /var/log/postgresql*.log`; do
		echo "" > $file
	done
fi

# コマンドヒストリーのクリア
history -c

複数ユーザの一括作成


日付と時刻

  • ISO 8601形式
    date --iso-8601
    2016-03-01
    
    date --iso-8601=hours
    2016-03-01T13+0900
    
    date --iso-8601=minutes
    2016-03-01T13:08+0900
    
    date --iso-8601=seconds
    2016-03-01T13:08:22+0900
    
    # UTC
    date --iso-8601=seconds -u
    2016-03-01T04:09:01+0000
  • GMTからJST, UTCへ変換
    # local time: JST
    date -d 'Oct  4 03:54:51 2016 GMT' '+%Y-%m-%d %H:%M:%S %Z'
    2016-10-04 12:54:51 JST
    
    # UTC
    date -d 'Oct  4 03:54:51 2016 GMT' -u '+%Y-%m-%d %H:%M:%S %Z'
    2016-10-04 03:54:51 UTC
  • 昨日の日付の取得
    date -d '1 day ago' '+%Y-%m-%d'
    date -d '-1 day' '+%Y-%m-%d'
  • 日付文字列から秒へ
    date -d "2011-01-01 01:02:03" '+%s'
    1293811323
    
    ruby -e 'require "time";t="2011-01-01 01:02:03";puts Time.parse(t).to_i'
    1293811323
  • 秒から日付文字列へ。UTC時刻が欲しければ「-u」オプションを付与
    date -d "@1293811323" '+%Y-%m-%d %H:%M:%S'
    2011-01-01 01:02:03
  • 日付の比較
    #/bin/bash
    # 日付文字列を 1970-01-01 00:00:00 からの経過秒に変換
    DATE_1=`date -d "$1" '+%s'`
    DATE_2=`date -d "$2" '+%s'`
    if [ $DATE_1 -eq $DATE_2 ]; then
        echo "$1 == $2"
    elif [ $DATE_1 -gt $DATE_2 ]; then
        echo "$1 > $2"
    elif [ $DATE_1 -lt $DATE_2 ]; then
        echo "$1 < $2"
    fi

swapを追加

  • 例:swapが無い場合に追加する場合。/etc/rc.local 等に追加
    local SWAPFILE=/swap.1
    cat /etc/fstab | grep -i "swap" > /dev/null 2>&1
    if [ $? == 1 -a ! -f $SWAPFILE ]; then
        # swap=512MB
        dd if=/dev/zero of=$SWAPFILE bs=1M count=512
        mkswap $SWAPFILE
        swapon $SWAPFILE
        echo "$SWAPFILE    swap      swap    defaults,nofail 0 0" >> /etc/fstab
        swapon -s
    fi

DNSの引っ越し


DNSの確認

  • 通常
    $ dig ドメイン名
  • メールサーバ
    $ dig mx ドメイン名
  • dnsサーバを指定する場合
    $ dig @DNSサーバ ドメイン名

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

  • lsよりfindの方が数倍早い
    time find /tmp -type f | wc -l
  • ディレクトリ毎のファイル数
    for d in $(find /home/ -maxdepth 1 -type d); do echo $d,$(sudo find "$d" -type f | wc -l); done

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

  • *.shをutf-8に変更
    find -name '*.sh' | xargs nkf --overwrite -w

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


httpingでHTTPポーリング

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


sed


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

  • 状態の表示
    tune2fs -l /dev/sda1
  • ボリュームラベル変更
    tune2fs -L eraid0 /dev/sda1
  • 倉庫として使う場合、root用予約領域を0%に変更。
    tune2fs -m 0 /dev/sda1
    • 2TB HDDの場合5%程root用として確保されていた。
    • 「tune2fs -l」では「Reserved block count:」として表示される

バックアップ、リストア


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


ユーザ毎のcronファイル

  • 以下にユーザ毎にファイルができる
    /var/spool/cron/USERNAME

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

  • 1階層だけ表示。MBで表示。逆順で表示
    du -m --max-depth=1 /home/hoge | sort -nr
  • MB単位で表示。.svnディレクトリを除外
    du -S -m --exclude=.svn | sort -n

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

  • /var/log/kern.log
    kernel: VFS: file-max limit 8192 reached
  • 設定されている値の確認
    cat /proc/sys/fs/file-attachref(example.chkconfig);
    #geshi(bash){{
    mv example.chkconfig /etc/rc.d/init.d/example
    chmod 755 example
    chown root:root example
    chkconfig --add example
    chkconfig example on
    service example restart
  • /etc/rc.d/init.d/functions か肝心なので軽く読んでみると良い
    . /etc/rc.d/init.d/functions
  • cat max
    
    # CentOS5.4の場合のデフォルト
    102274
  • 動的に設定
    echo 102274 > /proc/sys/fs/file-max
  • 設定ファイルに指定
  • /etc/sysctl.conf
    fs.file-max=102274

小技


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

  • Pipe Viewer を使う。CentOS5.xの場合rpm, yum RPMforgeが使えた
    yum install pv --enablerepo=rpmforge
    
    #または
    
    wget http://pipeviewer.googlecode.com/files/pv-1.1.4-1.i386.rpm
    sudo rpm -ivh pv-1.1.4-1.i386.rpm
    
    # 実行例
    dd if=/dev/zero count=1024 bs=1M | pv -s 1g > output.log
    
    024+0 records in67.4MB/s] [===============================================================================>  ] 98% ETA 0:00:00
    1024+0 records out
       1GB 0:00:11 [91.3MB/s] [=================================================================================>] 100%            
    1073741824 bytes (1.1 GB) copied, 10.751 seconds, 99.9 MB/s

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

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

  • 対策。rootユーザのみtty接続でなくともsudoを許可
    sudo /usr/sbin/visudo
    ----
    Defaults:root !requiretty
    ----
  • もしくはssh -tオプションで実行しろと書いてある
    ssh -t hostname sudo <cmd>

テキスト操作


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

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

sudo sh -c "cat > /etc/php.d/json.ini << 'EOS'
extension=json.so
EOS"

lsで日付の昇順にソート

ls -ltr

肥大化したメールの削除

cat /dev/null > /var/spool/mail/root

kernel: ACPI: Unable to turn cooling device

  • /var/log/messagesに延々以下のメッセージが出る場合
    kernel: ACPI: Unable to turn cooling device [ddc8b748] 'on'
  • acpi=offを追加して、再起動
    vi /boot/grub/grub.conf
    ----
    kernel /vmlinuz-2.6.18-194.3.1.el5 ro root=/dev/VolGroup00/LogVol00 acpi=off
    ----
    
    service acpid stop
    chkconfig acpid off

IDE/SATA HDDの情報を見る

  • sata
    $ cat /proc/scsi/scsi
    
    Attached devices:
    Host: scsi0 Channel: 00 Id: 00 Lun: 00
      Vendor: WDC WD10 Model:    -WCAV50611046 Rev:     
      Type:   Direct-Access                    ANSI SCSI revision: 02
    Host: scsi0 Channel: 00 Id: 00 Lun: 01
      Vendor: WDC WD50 Model:    -WCAPW1876244 Rev:     
      Type:   Direct-Access                    ANSI SCSI revision: setup (hd1)
     grub 02
  • ide
    $ cat /proc/ide/hda/model 
    
    HITACHI_DK23DA-30

echoで改行したい時

  • 通常。\も表示される
    $ echo 'a\nb'
    a\nb
  • 改行したい時。-eオプション
    $ echo -e 'a\nb'
    a
    b
  • 一時的に改行したい時。$'\n'
    echo $'\n''\n'
    
    \n

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

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

# vi /etc/motd
----
         __|  __|_  )  Fedora 8
         _|  (     /    32-bit
        ___|\___|___|

 Welcome to an EC2 Public Image
                       :-)

    Base

 --[ see /etc/ec2/release-notes ]--
----

ヒアドキュメント

cat >> hoge.txt << EOS
a
b
c
EOS
  • 変数展開したくない場合、シングルクォーテーションで括る
    cat >> hoge.txt << 'EOS'
    VAR=hoge
    echo $hoge
    EOS

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

  • 測定した処理時間が短過ぎた場合には、測定結果の表示が「+++++」「+++」となってしまうため、ソース修正。
    cd /tmp
    wget http://www.coker.com.au/bonnie++/experimental/bonnie++-1.96.tgz
    tar xvfz bonnie++-1.96.tgz
    cd bonnie++-1.96
    
    必要ならインストール
    # yum groupinstall 
    ./configure
    vi bonnie.h
    ----
    #define MinTime (0.01)
    ----
    make
    
    ./bonnie++ -d /tmp -u root
    
    cd ..
    rm -rf bonnie++*
  • rpmでのインストールもできるが、上記項目が修正されていない。
    yum install bonnie++ --enablerepo=rpmforge
    bonnie++ -u ユーザ -d /tmp
    • 結果のカンマ区切り列を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

アーキテクチャの判別

uname -i

i386
x86_64

32bit/64bitかどうか判定

getconf LONG_BIT

32 // 32bit
64 // 64bit

tcpflowでパケットキャプチャ

  • tcpflow
    • Man page of TCPDUMP tcpdumpと同じ書式のフィルタが使える
    • 管理者必見! ネットワーク・コマンド集 - tcpdumpコマンド:ITpro
    • yumの場合
      yum install tcpflow --enablerepo=rpmforge
    • rpmをダウンロードする場合
      sudo yum install libpcap http://pkgs.repoforge.org/tcpflow/tcpflow-0.21-1.2.el6.rf.$(uname -i).rpm
    • 実行
      # HTTP:80をパケットキャプチャしてコンソールに出力。-cを省略するとファイルに出力
      sudo tcpflow -cs port 80 -i eth0
      CTRL+Cで停止
      
      # 送受信が[IP Address]かつポート80のパケットのみキャプチャ(HTTPリクエスト/レスポンス)
      tcpflow -cs -i eth0 host [IP Address] and port 80
      
      # 送信元が[IP Address]かつポート80のパケットのみキャプチャ(HTTPリクエストのみ表示)
      tcpflow -cs -i eth0 src host [IP Address] and port 80
      
      # 送信先が[IP Address]かつポート80のパケットのみキャプチャ(HTTPレスポンスのみ表示)
      tcpflow -cs -i eth0 dst host [IP Address] and port 80
    • -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が必須
    sudo yum install time
  • 5.1.3の場合
    sudo yum install time make gcc perl perl-Time-HiRes
    wget http://byte-unixbench.googlecode.com/files/UnixBench5.1.3.tgz
    tar xvfz UnixBench5.1.3.tgz
    cd UnixBench
    make
    ./Run -i 1 index
  • 4.1.0の場合
    sudo yum install time
    wget http://www.tux.org/pub/tux/benchmarks/System/unixbench/unixbench-4.1.0.tgz
    tar zxvf unixbench-4.1.0.tgz
    cd unixbench-4.1.0
    make
    ./Run -1 index

ソースからドキュメントを生成 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グループ。コメントを外す
    sudo visudo
    ----
    %wheel   ALL=(ALL)  NOPASSWD: ALL
    ----
    
    # user01をwheelグループに追加
    usermod -G wheel user01
  • visudoより /etc/sudoers.d/ にファイルを作る方がデプロイが楽
    • CentOS6.x
      echo 'hoge ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers.d/hoge
      chmod 440 /etc/sudoers.d/hoge
      
      # groupの場合、%を付ける
      echo '%hogegroup ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers.d/hogegroup
      chmod 440 /etc/sudoers.d/hogegroup
    • もし ディレクトリが無かったり、設定が必要ならば設定する。(CentOS6.xでは不要だった)。「#includedir」の行頭#はコメントではない
      mkdir /etc/sudoers.d
      chmod 750 /etc/sudoers.d
      
      vim /etc/sudoers
      --
      #includedir /etc/sudoers.d
      --
  • hogeユーザでsudoを使えるように
    visudo
    ----
    # パスワードを要求する
    hoge ALL=(ALL) ALL
    # パスワードを要求しない
    hoge ALL=(ALL) NOPASSWD: ALL
    ----
  • sudoユーザがrootになりたい時
    sudo su -

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

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]]
      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 自分のメールアドレス自分に配信されるメーリングリスト一覧

パッチを当てる

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

  • 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

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

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 -e 古いパッケージ名
  2. 新しいsrpmをどこかからDLし、インストールする。
    rpm -ivh php-4.3.3-4.1.src.rpm
  3. 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になっていれば良い
    getenforce
    Disabled
    
    sestatus
    SELinux status:                 disabled
  • 無効化: CentOS6
    sudo setenforce 0
    sudo perl -p -i -e 's#^SELINUX=.+#SELINUX=disabled#' /etc/selinux/config
    • Enforcing状態から、Disabledには変わらない。Permissive(SELinuxは有効だが、ポリシーは無視)になる。ホスト再起動後にDisabledに変わる

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

  • 作成パスワード問い合わせをする
    zip -qr9 -e output.zip target
  • 作成時にパスワード問い合わせしない。ヒストリーにパスワードが残るのであまり良くない
    zip -qr9 -P <password> output.zip target
  • 展開時にパスワード問い合わせする
    unzip output.zip
  • 展開時にパスワード問い合わせしない。ヒストリーにパスワードが残るのであまり良くない
    unzip -P <password> output.zip

md5sum/sha1sum: チェックサム作成/検証

md5sum, sha1sum 等を使って、ファイルの破損等検証を行う。

  • 他に sha224sum sha256sum sha384sum sha512sum とあるが、ビット数が大きいほど計算が遅い
  • ファイルのチェックサム作成
    sha1sum *.tar.gz > checksum.sha1sum
  • 検証
    sha1sum -c checksum.sha1sum
  • 標準入力から
    echo -n "文字列" | md5sum

※"echo -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ファイルにある
    more /etc/redhat-release
    Fedora Core release 1 (Yarrow)
  • その他
    Red Hat Enterprise Linux Server release 6.3 (Santiago)
    Red Hat Enterprise Linux Server release 6.2 (Santiago)
    Red Hat Enterprise Linux Server release 5.4 (Tikanga)
    Red Hat Enterprise Linux Server release 5.3 (Tikanga)
    CentOS release 6.3 (Final)
    CentOS release 6.2 (Final)
    CentOS release 6.1 (Final)
    CentOS Linux release 6.0 (Final)
    CentOS release 5.8 (Final)
    CentOS release 5.7 (Final)
    CentOS release 5.5 (Final)
    CentOS release 4.6 (Final)
    Fedora Core release 4 (Stentz)
    Debian GNU/Linux 4.0
    Turbolinux Server 6.5 (Jupiter)
    SUSE Linux Enterprise Server 9 (ia64)
  • バージョンチェック(bash)
    readonly TARGET_OS="CentOS .*release [5-6]|Red Hat Enterprise Linux .* [5-6]"
    # OSチェック
    CHK=`egrep "$TARGET_OS" /etc/redhat-release`
    if [ "$CHK" == "" ]; then
        echo "Not support OS. Target $TARGET_OS"
        exit 1
    fi
    echo "OK"

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

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 82件 [詳細] fileexample.chkconfig 583件 [詳細] filecheckconfig.x86_64.patch 493件 [詳細] fileautorestart.sh 1367件 [詳細] fileexclude.list 1006件 [詳細] fileDiCE 1147件 [詳細] filechangeseq.py 621件 [詳細] filecentos5.3_netinstall_error.jpg 917件 [詳細]

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